]> git.karo-electronics.de Git - karo-tx-linux.git/blob - drivers/scsi/be2iscsi/be_main.c
Merge branch 'for-davem' of git://git.kernel.org/pub/scm/linux/kernel/git/linville...
[karo-tx-linux.git] / drivers / scsi / be2iscsi / be_main.c
1 /**
2  * Copyright (C) 2005 - 2011 Emulex
3  * All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License version 2
7  * as published by the Free Software Foundation.  The full GNU General
8  * Public License is included in this distribution in the file called COPYING.
9  *
10  * Written by: Jayamohan Kallickal (jayamohan.kallickal@emulex.com)
11  *
12  * Contact Information:
13  * linux-drivers@emulex.com
14  *
15  * Emulex
16  * 3333 Susan Street
17  * Costa Mesa, CA 92626
18  */
19
20 #include <linux/reboot.h>
21 #include <linux/delay.h>
22 #include <linux/slab.h>
23 #include <linux/interrupt.h>
24 #include <linux/blkdev.h>
25 #include <linux/pci.h>
26 #include <linux/string.h>
27 #include <linux/kernel.h>
28 #include <linux/semaphore.h>
29 #include <linux/iscsi_boot_sysfs.h>
30 #include <linux/module.h>
31
32 #include <scsi/libiscsi.h>
33 #include <scsi/scsi_transport_iscsi.h>
34 #include <scsi/scsi_transport.h>
35 #include <scsi/scsi_cmnd.h>
36 #include <scsi/scsi_device.h>
37 #include <scsi/scsi_host.h>
38 #include <scsi/scsi.h>
39 #include "be_main.h"
40 #include "be_iscsi.h"
41 #include "be_mgmt.h"
42
43 static unsigned int be_iopoll_budget = 10;
44 static unsigned int be_max_phys_size = 64;
45 static unsigned int enable_msix = 1;
46 static unsigned int gcrashmode = 0;
47 static unsigned int num_hba = 0;
48
49 MODULE_DEVICE_TABLE(pci, beiscsi_pci_id_table);
50 MODULE_DESCRIPTION(DRV_DESC " " BUILD_STR);
51 MODULE_AUTHOR("ServerEngines Corporation");
52 MODULE_LICENSE("GPL");
53 module_param(be_iopoll_budget, int, 0);
54 module_param(enable_msix, int, 0);
55 module_param(be_max_phys_size, uint, S_IRUGO);
56 MODULE_PARM_DESC(be_max_phys_size, "Maximum Size (In Kilobytes) of physically"
57                                    "contiguous memory that can be allocated."
58                                    "Range is 16 - 128");
59
60 static int beiscsi_slave_configure(struct scsi_device *sdev)
61 {
62         blk_queue_max_segment_size(sdev->request_queue, 65536);
63         return 0;
64 }
65
66 static int beiscsi_eh_abort(struct scsi_cmnd *sc)
67 {
68         struct iscsi_cls_session *cls_session;
69         struct iscsi_task *aborted_task = (struct iscsi_task *)sc->SCp.ptr;
70         struct beiscsi_io_task *aborted_io_task;
71         struct iscsi_conn *conn;
72         struct beiscsi_conn *beiscsi_conn;
73         struct beiscsi_hba *phba;
74         struct iscsi_session *session;
75         struct invalidate_command_table *inv_tbl;
76         struct be_dma_mem nonemb_cmd;
77         unsigned int cid, tag, num_invalidate;
78
79         cls_session = starget_to_session(scsi_target(sc->device));
80         session = cls_session->dd_data;
81
82         spin_lock_bh(&session->lock);
83         if (!aborted_task || !aborted_task->sc) {
84                 /* we raced */
85                 spin_unlock_bh(&session->lock);
86                 return SUCCESS;
87         }
88
89         aborted_io_task = aborted_task->dd_data;
90         if (!aborted_io_task->scsi_cmnd) {
91                 /* raced or invalid command */
92                 spin_unlock_bh(&session->lock);
93                 return SUCCESS;
94         }
95         spin_unlock_bh(&session->lock);
96         conn = aborted_task->conn;
97         beiscsi_conn = conn->dd_data;
98         phba = beiscsi_conn->phba;
99
100         /* invalidate iocb */
101         cid = beiscsi_conn->beiscsi_conn_cid;
102         inv_tbl = phba->inv_tbl;
103         memset(inv_tbl, 0x0, sizeof(*inv_tbl));
104         inv_tbl->cid = cid;
105         inv_tbl->icd = aborted_io_task->psgl_handle->sgl_index;
106         num_invalidate = 1;
107         nonemb_cmd.va = pci_alloc_consistent(phba->ctrl.pdev,
108                                 sizeof(struct invalidate_commands_params_in),
109                                 &nonemb_cmd.dma);
110         if (nonemb_cmd.va == NULL) {
111                 SE_DEBUG(DBG_LVL_1,
112                          "Failed to allocate memory for"
113                          "mgmt_invalidate_icds\n");
114                 return FAILED;
115         }
116         nonemb_cmd.size = sizeof(struct invalidate_commands_params_in);
117
118         tag = mgmt_invalidate_icds(phba, inv_tbl, num_invalidate,
119                                    cid, &nonemb_cmd);
120         if (!tag) {
121                 shost_printk(KERN_WARNING, phba->shost,
122                              "mgmt_invalidate_icds could not be"
123                              " submitted\n");
124                 pci_free_consistent(phba->ctrl.pdev, nonemb_cmd.size,
125                                     nonemb_cmd.va, nonemb_cmd.dma);
126
127                 return FAILED;
128         } else {
129                 wait_event_interruptible(phba->ctrl.mcc_wait[tag],
130                                          phba->ctrl.mcc_numtag[tag]);
131                 free_mcc_tag(&phba->ctrl, tag);
132         }
133         pci_free_consistent(phba->ctrl.pdev, nonemb_cmd.size,
134                             nonemb_cmd.va, nonemb_cmd.dma);
135         return iscsi_eh_abort(sc);
136 }
137
138 static int beiscsi_eh_device_reset(struct scsi_cmnd *sc)
139 {
140         struct iscsi_task *abrt_task;
141         struct beiscsi_io_task *abrt_io_task;
142         struct iscsi_conn *conn;
143         struct beiscsi_conn *beiscsi_conn;
144         struct beiscsi_hba *phba;
145         struct iscsi_session *session;
146         struct iscsi_cls_session *cls_session;
147         struct invalidate_command_table *inv_tbl;
148         struct be_dma_mem nonemb_cmd;
149         unsigned int cid, tag, i, num_invalidate;
150         int rc = FAILED;
151
152         /* invalidate iocbs */
153         cls_session = starget_to_session(scsi_target(sc->device));
154         session = cls_session->dd_data;
155         spin_lock_bh(&session->lock);
156         if (!session->leadconn || session->state != ISCSI_STATE_LOGGED_IN)
157                 goto unlock;
158
159         conn = session->leadconn;
160         beiscsi_conn = conn->dd_data;
161         phba = beiscsi_conn->phba;
162         cid = beiscsi_conn->beiscsi_conn_cid;
163         inv_tbl = phba->inv_tbl;
164         memset(inv_tbl, 0x0, sizeof(*inv_tbl) * BE2_CMDS_PER_CXN);
165         num_invalidate = 0;
166         for (i = 0; i < conn->session->cmds_max; i++) {
167                 abrt_task = conn->session->cmds[i];
168                 abrt_io_task = abrt_task->dd_data;
169                 if (!abrt_task->sc || abrt_task->state == ISCSI_TASK_FREE)
170                         continue;
171
172                 if (abrt_task->sc->device->lun != abrt_task->sc->device->lun)
173                         continue;
174
175                 inv_tbl->cid = cid;
176                 inv_tbl->icd = abrt_io_task->psgl_handle->sgl_index;
177                 num_invalidate++;
178                 inv_tbl++;
179         }
180         spin_unlock_bh(&session->lock);
181         inv_tbl = phba->inv_tbl;
182
183         nonemb_cmd.va = pci_alloc_consistent(phba->ctrl.pdev,
184                                 sizeof(struct invalidate_commands_params_in),
185                                 &nonemb_cmd.dma);
186         if (nonemb_cmd.va == NULL) {
187                 SE_DEBUG(DBG_LVL_1,
188                          "Failed to allocate memory for"
189                          "mgmt_invalidate_icds\n");
190                 return FAILED;
191         }
192         nonemb_cmd.size = sizeof(struct invalidate_commands_params_in);
193         memset(nonemb_cmd.va, 0, nonemb_cmd.size);
194         tag = mgmt_invalidate_icds(phba, inv_tbl, num_invalidate,
195                                    cid, &nonemb_cmd);
196         if (!tag) {
197                 shost_printk(KERN_WARNING, phba->shost,
198                              "mgmt_invalidate_icds could not be"
199                              " submitted\n");
200                 pci_free_consistent(phba->ctrl.pdev, nonemb_cmd.size,
201                                     nonemb_cmd.va, nonemb_cmd.dma);
202                 return FAILED;
203         } else {
204                 wait_event_interruptible(phba->ctrl.mcc_wait[tag],
205                                          phba->ctrl.mcc_numtag[tag]);
206                 free_mcc_tag(&phba->ctrl, tag);
207         }
208         pci_free_consistent(phba->ctrl.pdev, nonemb_cmd.size,
209                             nonemb_cmd.va, nonemb_cmd.dma);
210         return iscsi_eh_device_reset(sc);
211 unlock:
212         spin_unlock_bh(&session->lock);
213         return rc;
214 }
215
216 static ssize_t beiscsi_show_boot_tgt_info(void *data, int type, char *buf)
217 {
218         struct beiscsi_hba *phba = data;
219         struct mgmt_session_info *boot_sess = &phba->boot_sess;
220         struct mgmt_conn_info *boot_conn = &boot_sess->conn_list[0];
221         char *str = buf;
222         int rc;
223
224         switch (type) {
225         case ISCSI_BOOT_TGT_NAME:
226                 rc = sprintf(buf, "%.*s\n",
227                             (int)strlen(boot_sess->target_name),
228                             (char *)&boot_sess->target_name);
229                 break;
230         case ISCSI_BOOT_TGT_IP_ADDR:
231                 if (boot_conn->dest_ipaddr.ip_type == 0x1)
232                         rc = sprintf(buf, "%pI4\n",
233                                 (char *)&boot_conn->dest_ipaddr.ip_address);
234                 else
235                         rc = sprintf(str, "%pI6\n",
236                                 (char *)&boot_conn->dest_ipaddr.ip_address);
237                 break;
238         case ISCSI_BOOT_TGT_PORT:
239                 rc = sprintf(str, "%d\n", boot_conn->dest_port);
240                 break;
241
242         case ISCSI_BOOT_TGT_CHAP_NAME:
243                 rc = sprintf(str,  "%.*s\n",
244                              boot_conn->negotiated_login_options.auth_data.chap.
245                              target_chap_name_length,
246                              (char *)&boot_conn->negotiated_login_options.
247                              auth_data.chap.target_chap_name);
248                 break;
249         case ISCSI_BOOT_TGT_CHAP_SECRET:
250                 rc = sprintf(str,  "%.*s\n",
251                              boot_conn->negotiated_login_options.auth_data.chap.
252                              target_secret_length,
253                              (char *)&boot_conn->negotiated_login_options.
254                              auth_data.chap.target_secret);
255                 break;
256         case ISCSI_BOOT_TGT_REV_CHAP_NAME:
257                 rc = sprintf(str,  "%.*s\n",
258                              boot_conn->negotiated_login_options.auth_data.chap.
259                              intr_chap_name_length,
260                              (char *)&boot_conn->negotiated_login_options.
261                              auth_data.chap.intr_chap_name);
262                 break;
263         case ISCSI_BOOT_TGT_REV_CHAP_SECRET:
264                 rc = sprintf(str,  "%.*s\n",
265                              boot_conn->negotiated_login_options.auth_data.chap.
266                              intr_secret_length,
267                              (char *)&boot_conn->negotiated_login_options.
268                              auth_data.chap.intr_secret);
269                 break;
270         case ISCSI_BOOT_TGT_FLAGS:
271                 rc = sprintf(str, "2\n");
272                 break;
273         case ISCSI_BOOT_TGT_NIC_ASSOC:
274                 rc = sprintf(str, "0\n");
275                 break;
276         default:
277                 rc = -ENOSYS;
278                 break;
279         }
280         return rc;
281 }
282
283 static ssize_t beiscsi_show_boot_ini_info(void *data, int type, char *buf)
284 {
285         struct beiscsi_hba *phba = data;
286         char *str = buf;
287         int rc;
288
289         switch (type) {
290         case ISCSI_BOOT_INI_INITIATOR_NAME:
291                 rc = sprintf(str, "%s\n", phba->boot_sess.initiator_iscsiname);
292                 break;
293         default:
294                 rc = -ENOSYS;
295                 break;
296         }
297         return rc;
298 }
299
300 static ssize_t beiscsi_show_boot_eth_info(void *data, int type, char *buf)
301 {
302         struct beiscsi_hba *phba = data;
303         char *str = buf;
304         int rc;
305
306         switch (type) {
307         case ISCSI_BOOT_ETH_FLAGS:
308                 rc = sprintf(str, "2\n");
309                 break;
310         case ISCSI_BOOT_ETH_INDEX:
311                 rc = sprintf(str, "0\n");
312                 break;
313         case ISCSI_BOOT_ETH_MAC:
314                 rc  = beiscsi_get_macaddr(buf, phba);
315                 if (rc < 0) {
316                         SE_DEBUG(DBG_LVL_1, "beiscsi_get_macaddr Failed\n");
317                         return rc;
318                 }
319         break;
320         default:
321                 rc = -ENOSYS;
322                 break;
323         }
324         return rc;
325 }
326
327
328 static mode_t beiscsi_tgt_get_attr_visibility(void *data, int type)
329 {
330         int rc;
331
332         switch (type) {
333         case ISCSI_BOOT_TGT_NAME:
334         case ISCSI_BOOT_TGT_IP_ADDR:
335         case ISCSI_BOOT_TGT_PORT:
336         case ISCSI_BOOT_TGT_CHAP_NAME:
337         case ISCSI_BOOT_TGT_CHAP_SECRET:
338         case ISCSI_BOOT_TGT_REV_CHAP_NAME:
339         case ISCSI_BOOT_TGT_REV_CHAP_SECRET:
340         case ISCSI_BOOT_TGT_NIC_ASSOC:
341         case ISCSI_BOOT_TGT_FLAGS:
342                 rc = S_IRUGO;
343                 break;
344         default:
345                 rc = 0;
346                 break;
347         }
348         return rc;
349 }
350
351 static mode_t beiscsi_ini_get_attr_visibility(void *data, int type)
352 {
353         int rc;
354
355         switch (type) {
356         case ISCSI_BOOT_INI_INITIATOR_NAME:
357                 rc = S_IRUGO;
358                 break;
359         default:
360                 rc = 0;
361                 break;
362         }
363         return rc;
364 }
365
366
367 static mode_t beiscsi_eth_get_attr_visibility(void *data, int type)
368 {
369         int rc;
370
371         switch (type) {
372         case ISCSI_BOOT_ETH_FLAGS:
373         case ISCSI_BOOT_ETH_MAC:
374         case ISCSI_BOOT_ETH_INDEX:
375                 rc = S_IRUGO;
376                 break;
377         default:
378                 rc = 0;
379                 break;
380         }
381         return rc;
382 }
383
384 /*------------------- PCI Driver operations and data ----------------- */
385 static DEFINE_PCI_DEVICE_TABLE(beiscsi_pci_id_table) = {
386         { PCI_DEVICE(BE_VENDOR_ID, BE_DEVICE_ID1) },
387         { PCI_DEVICE(BE_VENDOR_ID, BE_DEVICE_ID2) },
388         { PCI_DEVICE(BE_VENDOR_ID, OC_DEVICE_ID1) },
389         { PCI_DEVICE(BE_VENDOR_ID, OC_DEVICE_ID2) },
390         { PCI_DEVICE(BE_VENDOR_ID, OC_DEVICE_ID3) },
391         { 0 }
392 };
393 MODULE_DEVICE_TABLE(pci, beiscsi_pci_id_table);
394
395 static struct scsi_host_template beiscsi_sht = {
396         .module = THIS_MODULE,
397         .name = "ServerEngines 10Gbe open-iscsi Initiator Driver",
398         .proc_name = DRV_NAME,
399         .queuecommand = iscsi_queuecommand,
400         .change_queue_depth = iscsi_change_queue_depth,
401         .slave_configure = beiscsi_slave_configure,
402         .target_alloc = iscsi_target_alloc,
403         .eh_abort_handler = beiscsi_eh_abort,
404         .eh_device_reset_handler = beiscsi_eh_device_reset,
405         .eh_target_reset_handler = iscsi_eh_session_reset,
406         .sg_tablesize = BEISCSI_SGLIST_ELEMENTS,
407         .can_queue = BE2_IO_DEPTH,
408         .this_id = -1,
409         .max_sectors = BEISCSI_MAX_SECTORS,
410         .cmd_per_lun = BEISCSI_CMD_PER_LUN,
411         .use_clustering = ENABLE_CLUSTERING,
412 };
413
414 static struct scsi_transport_template *beiscsi_scsi_transport;
415
416 static struct beiscsi_hba *beiscsi_hba_alloc(struct pci_dev *pcidev)
417 {
418         struct beiscsi_hba *phba;
419         struct Scsi_Host *shost;
420
421         shost = iscsi_host_alloc(&beiscsi_sht, sizeof(*phba), 0);
422         if (!shost) {
423                 dev_err(&pcidev->dev, "beiscsi_hba_alloc -"
424                         "iscsi_host_alloc failed\n");
425                 return NULL;
426         }
427         shost->dma_boundary = pcidev->dma_mask;
428         shost->max_id = BE2_MAX_SESSIONS;
429         shost->max_channel = 0;
430         shost->max_cmd_len = BEISCSI_MAX_CMD_LEN;
431         shost->max_lun = BEISCSI_NUM_MAX_LUN;
432         shost->transportt = beiscsi_scsi_transport;
433         phba = iscsi_host_priv(shost);
434         memset(phba, 0, sizeof(*phba));
435         phba->shost = shost;
436         phba->pcidev = pci_dev_get(pcidev);
437         pci_set_drvdata(pcidev, phba);
438
439         if (iscsi_host_add(shost, &phba->pcidev->dev))
440                 goto free_devices;
441
442         return phba;
443
444 free_devices:
445         pci_dev_put(phba->pcidev);
446         iscsi_host_free(phba->shost);
447         return NULL;
448 }
449
450 static void beiscsi_unmap_pci_function(struct beiscsi_hba *phba)
451 {
452         if (phba->csr_va) {
453                 iounmap(phba->csr_va);
454                 phba->csr_va = NULL;
455         }
456         if (phba->db_va) {
457                 iounmap(phba->db_va);
458                 phba->db_va = NULL;
459         }
460         if (phba->pci_va) {
461                 iounmap(phba->pci_va);
462                 phba->pci_va = NULL;
463         }
464 }
465
466 static int beiscsi_map_pci_bars(struct beiscsi_hba *phba,
467                                 struct pci_dev *pcidev)
468 {
469         u8 __iomem *addr;
470         int pcicfg_reg;
471
472         addr = ioremap_nocache(pci_resource_start(pcidev, 2),
473                                pci_resource_len(pcidev, 2));
474         if (addr == NULL)
475                 return -ENOMEM;
476         phba->ctrl.csr = addr;
477         phba->csr_va = addr;
478         phba->csr_pa.u.a64.address = pci_resource_start(pcidev, 2);
479
480         addr = ioremap_nocache(pci_resource_start(pcidev, 4), 128 * 1024);
481         if (addr == NULL)
482                 goto pci_map_err;
483         phba->ctrl.db = addr;
484         phba->db_va = addr;
485         phba->db_pa.u.a64.address =  pci_resource_start(pcidev, 4);
486
487         if (phba->generation == BE_GEN2)
488                 pcicfg_reg = 1;
489         else
490                 pcicfg_reg = 0;
491
492         addr = ioremap_nocache(pci_resource_start(pcidev, pcicfg_reg),
493                                pci_resource_len(pcidev, pcicfg_reg));
494
495         if (addr == NULL)
496                 goto pci_map_err;
497         phba->ctrl.pcicfg = addr;
498         phba->pci_va = addr;
499         phba->pci_pa.u.a64.address = pci_resource_start(pcidev, pcicfg_reg);
500         return 0;
501
502 pci_map_err:
503         beiscsi_unmap_pci_function(phba);
504         return -ENOMEM;
505 }
506
507 static int beiscsi_enable_pci(struct pci_dev *pcidev)
508 {
509         int ret;
510
511         ret = pci_enable_device(pcidev);
512         if (ret) {
513                 dev_err(&pcidev->dev, "beiscsi_enable_pci - enable device "
514                         "failed. Returning -ENODEV\n");
515                 return ret;
516         }
517
518         pci_set_master(pcidev);
519         if (pci_set_consistent_dma_mask(pcidev, DMA_BIT_MASK(64))) {
520                 ret = pci_set_consistent_dma_mask(pcidev, DMA_BIT_MASK(32));
521                 if (ret) {
522                         dev_err(&pcidev->dev, "Could not set PCI DMA Mask\n");
523                         pci_disable_device(pcidev);
524                         return ret;
525                 }
526         }
527         return 0;
528 }
529
530 static int be_ctrl_init(struct beiscsi_hba *phba, struct pci_dev *pdev)
531 {
532         struct be_ctrl_info *ctrl = &phba->ctrl;
533         struct be_dma_mem *mbox_mem_alloc = &ctrl->mbox_mem_alloced;
534         struct be_dma_mem *mbox_mem_align = &ctrl->mbox_mem;
535         int status = 0;
536
537         ctrl->pdev = pdev;
538         status = beiscsi_map_pci_bars(phba, pdev);
539         if (status)
540                 return status;
541         mbox_mem_alloc->size = sizeof(struct be_mcc_mailbox) + 16;
542         mbox_mem_alloc->va = pci_alloc_consistent(pdev,
543                                                   mbox_mem_alloc->size,
544                                                   &mbox_mem_alloc->dma);
545         if (!mbox_mem_alloc->va) {
546                 beiscsi_unmap_pci_function(phba);
547                 status = -ENOMEM;
548                 return status;
549         }
550
551         mbox_mem_align->size = sizeof(struct be_mcc_mailbox);
552         mbox_mem_align->va = PTR_ALIGN(mbox_mem_alloc->va, 16);
553         mbox_mem_align->dma = PTR_ALIGN(mbox_mem_alloc->dma, 16);
554         memset(mbox_mem_align->va, 0, sizeof(struct be_mcc_mailbox));
555         spin_lock_init(&ctrl->mbox_lock);
556         spin_lock_init(&phba->ctrl.mcc_lock);
557         spin_lock_init(&phba->ctrl.mcc_cq_lock);
558
559         return status;
560 }
561
562 static void beiscsi_get_params(struct beiscsi_hba *phba)
563 {
564         phba->params.ios_per_ctrl = (phba->fw_config.iscsi_icd_count
565                                     - (phba->fw_config.iscsi_cid_count
566                                     + BE2_TMFS
567                                     + BE2_NOPOUT_REQ));
568         phba->params.cxns_per_ctrl = phba->fw_config.iscsi_cid_count;
569         phba->params.asyncpdus_per_ctrl = phba->fw_config.iscsi_cid_count * 2;
570         phba->params.icds_per_ctrl = phba->fw_config.iscsi_icd_count;
571         phba->params.num_sge_per_io = BE2_SGE;
572         phba->params.defpdu_hdr_sz = BE2_DEFPDU_HDR_SZ;
573         phba->params.defpdu_data_sz = BE2_DEFPDU_DATA_SZ;
574         phba->params.eq_timer = 64;
575         phba->params.num_eq_entries =
576             (((BE2_CMDS_PER_CXN * 2 + phba->fw_config.iscsi_cid_count * 2
577                                     + BE2_TMFS) / 512) + 1) * 512;
578         phba->params.num_eq_entries = (phba->params.num_eq_entries < 1024)
579                                 ? 1024 : phba->params.num_eq_entries;
580         SE_DEBUG(DBG_LVL_8, "phba->params.num_eq_entries=%d\n",
581                              phba->params.num_eq_entries);
582         phba->params.num_cq_entries =
583             (((BE2_CMDS_PER_CXN * 2 +  phba->fw_config.iscsi_cid_count * 2
584                                     + BE2_TMFS) / 512) + 1) * 512;
585         phba->params.wrbs_per_cxn = 256;
586 }
587
588 static void hwi_ring_eq_db(struct beiscsi_hba *phba,
589                            unsigned int id, unsigned int clr_interrupt,
590                            unsigned int num_processed,
591                            unsigned char rearm, unsigned char event)
592 {
593         u32 val = 0;
594         val |= id & DB_EQ_RING_ID_MASK;
595         if (rearm)
596                 val |= 1 << DB_EQ_REARM_SHIFT;
597         if (clr_interrupt)
598                 val |= 1 << DB_EQ_CLR_SHIFT;
599         if (event)
600                 val |= 1 << DB_EQ_EVNT_SHIFT;
601         val |= num_processed << DB_EQ_NUM_POPPED_SHIFT;
602         iowrite32(val, phba->db_va + DB_EQ_OFFSET);
603 }
604
605 /**
606  * be_isr_mcc - The isr routine of the driver.
607  * @irq: Not used
608  * @dev_id: Pointer to host adapter structure
609  */
610 static irqreturn_t be_isr_mcc(int irq, void *dev_id)
611 {
612         struct beiscsi_hba *phba;
613         struct be_eq_entry *eqe = NULL;
614         struct be_queue_info *eq;
615         struct be_queue_info *mcc;
616         unsigned int num_eq_processed;
617         struct be_eq_obj *pbe_eq;
618         unsigned long flags;
619
620         pbe_eq = dev_id;
621         eq = &pbe_eq->q;
622         phba =  pbe_eq->phba;
623         mcc = &phba->ctrl.mcc_obj.cq;
624         eqe = queue_tail_node(eq);
625         if (!eqe)
626                 SE_DEBUG(DBG_LVL_1, "eqe is NULL\n");
627
628         num_eq_processed = 0;
629
630         while (eqe->dw[offsetof(struct amap_eq_entry, valid) / 32]
631                                 & EQE_VALID_MASK) {
632                 if (((eqe->dw[offsetof(struct amap_eq_entry,
633                      resource_id) / 32] &
634                      EQE_RESID_MASK) >> 16) == mcc->id) {
635                         spin_lock_irqsave(&phba->isr_lock, flags);
636                         phba->todo_mcc_cq = 1;
637                         spin_unlock_irqrestore(&phba->isr_lock, flags);
638                 }
639                 AMAP_SET_BITS(struct amap_eq_entry, valid, eqe, 0);
640                 queue_tail_inc(eq);
641                 eqe = queue_tail_node(eq);
642                 num_eq_processed++;
643         }
644         if (phba->todo_mcc_cq)
645                 queue_work(phba->wq, &phba->work_cqs);
646         if (num_eq_processed)
647                 hwi_ring_eq_db(phba, eq->id, 1, num_eq_processed, 1, 1);
648
649         return IRQ_HANDLED;
650 }
651
652 /**
653  * be_isr_msix - The isr routine of the driver.
654  * @irq: Not used
655  * @dev_id: Pointer to host adapter structure
656  */
657 static irqreturn_t be_isr_msix(int irq, void *dev_id)
658 {
659         struct beiscsi_hba *phba;
660         struct be_eq_entry *eqe = NULL;
661         struct be_queue_info *eq;
662         struct be_queue_info *cq;
663         unsigned int num_eq_processed;
664         struct be_eq_obj *pbe_eq;
665         unsigned long flags;
666
667         pbe_eq = dev_id;
668         eq = &pbe_eq->q;
669         cq = pbe_eq->cq;
670         eqe = queue_tail_node(eq);
671         if (!eqe)
672                 SE_DEBUG(DBG_LVL_1, "eqe is NULL\n");
673
674         phba = pbe_eq->phba;
675         num_eq_processed = 0;
676         if (blk_iopoll_enabled) {
677                 while (eqe->dw[offsetof(struct amap_eq_entry, valid) / 32]
678                                         & EQE_VALID_MASK) {
679                         if (!blk_iopoll_sched_prep(&pbe_eq->iopoll))
680                                 blk_iopoll_sched(&pbe_eq->iopoll);
681
682                         AMAP_SET_BITS(struct amap_eq_entry, valid, eqe, 0);
683                         queue_tail_inc(eq);
684                         eqe = queue_tail_node(eq);
685                         num_eq_processed++;
686                 }
687                 if (num_eq_processed)
688                         hwi_ring_eq_db(phba, eq->id, 1, num_eq_processed, 0, 1);
689
690                 return IRQ_HANDLED;
691         } else {
692                 while (eqe->dw[offsetof(struct amap_eq_entry, valid) / 32]
693                                                 & EQE_VALID_MASK) {
694                         spin_lock_irqsave(&phba->isr_lock, flags);
695                         phba->todo_cq = 1;
696                         spin_unlock_irqrestore(&phba->isr_lock, flags);
697                         AMAP_SET_BITS(struct amap_eq_entry, valid, eqe, 0);
698                         queue_tail_inc(eq);
699                         eqe = queue_tail_node(eq);
700                         num_eq_processed++;
701                 }
702                 if (phba->todo_cq)
703                         queue_work(phba->wq, &phba->work_cqs);
704
705                 if (num_eq_processed)
706                         hwi_ring_eq_db(phba, eq->id, 1, num_eq_processed, 1, 1);
707
708                 return IRQ_HANDLED;
709         }
710 }
711
712 /**
713  * be_isr - The isr routine of the driver.
714  * @irq: Not used
715  * @dev_id: Pointer to host adapter structure
716  */
717 static irqreturn_t be_isr(int irq, void *dev_id)
718 {
719         struct beiscsi_hba *phba;
720         struct hwi_controller *phwi_ctrlr;
721         struct hwi_context_memory *phwi_context;
722         struct be_eq_entry *eqe = NULL;
723         struct be_queue_info *eq;
724         struct be_queue_info *cq;
725         struct be_queue_info *mcc;
726         unsigned long flags, index;
727         unsigned int num_mcceq_processed, num_ioeq_processed;
728         struct be_ctrl_info *ctrl;
729         struct be_eq_obj *pbe_eq;
730         int isr;
731
732         phba = dev_id;
733         ctrl = &phba->ctrl;
734         isr = ioread32(ctrl->csr + CEV_ISR0_OFFSET +
735                        (PCI_FUNC(ctrl->pdev->devfn) * CEV_ISR_SIZE));
736         if (!isr)
737                 return IRQ_NONE;
738
739         phwi_ctrlr = phba->phwi_ctrlr;
740         phwi_context = phwi_ctrlr->phwi_ctxt;
741         pbe_eq = &phwi_context->be_eq[0];
742
743         eq = &phwi_context->be_eq[0].q;
744         mcc = &phba->ctrl.mcc_obj.cq;
745         index = 0;
746         eqe = queue_tail_node(eq);
747         if (!eqe)
748                 SE_DEBUG(DBG_LVL_1, "eqe is NULL\n");
749
750         num_ioeq_processed = 0;
751         num_mcceq_processed = 0;
752         if (blk_iopoll_enabled) {
753                 while (eqe->dw[offsetof(struct amap_eq_entry, valid) / 32]
754                                         & EQE_VALID_MASK) {
755                         if (((eqe->dw[offsetof(struct amap_eq_entry,
756                              resource_id) / 32] &
757                              EQE_RESID_MASK) >> 16) == mcc->id) {
758                                 spin_lock_irqsave(&phba->isr_lock, flags);
759                                 phba->todo_mcc_cq = 1;
760                                 spin_unlock_irqrestore(&phba->isr_lock, flags);
761                                 num_mcceq_processed++;
762                         } else {
763                                 if (!blk_iopoll_sched_prep(&pbe_eq->iopoll))
764                                         blk_iopoll_sched(&pbe_eq->iopoll);
765                                 num_ioeq_processed++;
766                         }
767                         AMAP_SET_BITS(struct amap_eq_entry, valid, eqe, 0);
768                         queue_tail_inc(eq);
769                         eqe = queue_tail_node(eq);
770                 }
771                 if (num_ioeq_processed || num_mcceq_processed) {
772                         if (phba->todo_mcc_cq)
773                                 queue_work(phba->wq, &phba->work_cqs);
774
775                         if ((num_mcceq_processed) && (!num_ioeq_processed))
776                                 hwi_ring_eq_db(phba, eq->id, 0,
777                                               (num_ioeq_processed +
778                                                num_mcceq_processed) , 1, 1);
779                         else
780                                 hwi_ring_eq_db(phba, eq->id, 0,
781                                                (num_ioeq_processed +
782                                                 num_mcceq_processed), 0, 1);
783
784                         return IRQ_HANDLED;
785                 } else
786                         return IRQ_NONE;
787         } else {
788                 cq = &phwi_context->be_cq[0];
789                 while (eqe->dw[offsetof(struct amap_eq_entry, valid) / 32]
790                                                 & EQE_VALID_MASK) {
791
792                         if (((eqe->dw[offsetof(struct amap_eq_entry,
793                              resource_id) / 32] &
794                              EQE_RESID_MASK) >> 16) != cq->id) {
795                                 spin_lock_irqsave(&phba->isr_lock, flags);
796                                 phba->todo_mcc_cq = 1;
797                                 spin_unlock_irqrestore(&phba->isr_lock, flags);
798                         } else {
799                                 spin_lock_irqsave(&phba->isr_lock, flags);
800                                 phba->todo_cq = 1;
801                                 spin_unlock_irqrestore(&phba->isr_lock, flags);
802                         }
803                         AMAP_SET_BITS(struct amap_eq_entry, valid, eqe, 0);
804                         queue_tail_inc(eq);
805                         eqe = queue_tail_node(eq);
806                         num_ioeq_processed++;
807                 }
808                 if (phba->todo_cq || phba->todo_mcc_cq)
809                         queue_work(phba->wq, &phba->work_cqs);
810
811                 if (num_ioeq_processed) {
812                         hwi_ring_eq_db(phba, eq->id, 0,
813                                        num_ioeq_processed, 1, 1);
814                         return IRQ_HANDLED;
815                 } else
816                         return IRQ_NONE;
817         }
818 }
819
820 static int beiscsi_init_irqs(struct beiscsi_hba *phba)
821 {
822         struct pci_dev *pcidev = phba->pcidev;
823         struct hwi_controller *phwi_ctrlr;
824         struct hwi_context_memory *phwi_context;
825         int ret, msix_vec, i, j;
826
827         phwi_ctrlr = phba->phwi_ctrlr;
828         phwi_context = phwi_ctrlr->phwi_ctxt;
829
830         if (phba->msix_enabled) {
831                 for (i = 0; i < phba->num_cpus; i++) {
832                         phba->msi_name[i] = kzalloc(BEISCSI_MSI_NAME,
833                                                     GFP_KERNEL);
834                         if (!phba->msi_name[i]) {
835                                 ret = -ENOMEM;
836                                 goto free_msix_irqs;
837                         }
838
839                         sprintf(phba->msi_name[i], "beiscsi_%02x_%02x",
840                                 phba->shost->host_no, i);
841                         msix_vec = phba->msix_entries[i].vector;
842                         ret = request_irq(msix_vec, be_isr_msix, 0,
843                                           phba->msi_name[i],
844                                           &phwi_context->be_eq[i]);
845                         if (ret) {
846                                 shost_printk(KERN_ERR, phba->shost,
847                                              "beiscsi_init_irqs-Failed to"
848                                              "register msix for i = %d\n", i);
849                                 kfree(phba->msi_name[i]);
850                                 goto free_msix_irqs;
851                         }
852                 }
853                 phba->msi_name[i] = kzalloc(BEISCSI_MSI_NAME, GFP_KERNEL);
854                 if (!phba->msi_name[i]) {
855                         ret = -ENOMEM;
856                         goto free_msix_irqs;
857                 }
858                 sprintf(phba->msi_name[i], "beiscsi_mcc_%02x",
859                         phba->shost->host_no);
860                 msix_vec = phba->msix_entries[i].vector;
861                 ret = request_irq(msix_vec, be_isr_mcc, 0, phba->msi_name[i],
862                                   &phwi_context->be_eq[i]);
863                 if (ret) {
864                         shost_printk(KERN_ERR, phba->shost, "beiscsi_init_irqs-"
865                                      "Failed to register beiscsi_msix_mcc\n");
866                         kfree(phba->msi_name[i]);
867                         goto free_msix_irqs;
868                 }
869
870         } else {
871                 ret = request_irq(pcidev->irq, be_isr, IRQF_SHARED,
872                                   "beiscsi", phba);
873                 if (ret) {
874                         shost_printk(KERN_ERR, phba->shost, "beiscsi_init_irqs-"
875                                      "Failed to register irq\\n");
876                         return ret;
877                 }
878         }
879         return 0;
880 free_msix_irqs:
881         for (j = i - 1; j >= 0; j--) {
882                 kfree(phba->msi_name[j]);
883                 msix_vec = phba->msix_entries[j].vector;
884                 free_irq(msix_vec, &phwi_context->be_eq[j]);
885         }
886         return ret;
887 }
888
889 static void hwi_ring_cq_db(struct beiscsi_hba *phba,
890                            unsigned int id, unsigned int num_processed,
891                            unsigned char rearm, unsigned char event)
892 {
893         u32 val = 0;
894         val |= id & DB_CQ_RING_ID_MASK;
895         if (rearm)
896                 val |= 1 << DB_CQ_REARM_SHIFT;
897         val |= num_processed << DB_CQ_NUM_POPPED_SHIFT;
898         iowrite32(val, phba->db_va + DB_CQ_OFFSET);
899 }
900
901 static unsigned int
902 beiscsi_process_async_pdu(struct beiscsi_conn *beiscsi_conn,
903                           struct beiscsi_hba *phba,
904                           unsigned short cid,
905                           struct pdu_base *ppdu,
906                           unsigned long pdu_len,
907                           void *pbuffer, unsigned long buf_len)
908 {
909         struct iscsi_conn *conn = beiscsi_conn->conn;
910         struct iscsi_session *session = conn->session;
911         struct iscsi_task *task;
912         struct beiscsi_io_task *io_task;
913         struct iscsi_hdr *login_hdr;
914
915         switch (ppdu->dw[offsetof(struct amap_pdu_base, opcode) / 32] &
916                                                 PDUBASE_OPCODE_MASK) {
917         case ISCSI_OP_NOOP_IN:
918                 pbuffer = NULL;
919                 buf_len = 0;
920                 break;
921         case ISCSI_OP_ASYNC_EVENT:
922                 break;
923         case ISCSI_OP_REJECT:
924                 WARN_ON(!pbuffer);
925                 WARN_ON(!(buf_len == 48));
926                 SE_DEBUG(DBG_LVL_1, "In ISCSI_OP_REJECT\n");
927                 break;
928         case ISCSI_OP_LOGIN_RSP:
929         case ISCSI_OP_TEXT_RSP:
930                 task = conn->login_task;
931                 io_task = task->dd_data;
932                 login_hdr = (struct iscsi_hdr *)ppdu;
933                 login_hdr->itt = io_task->libiscsi_itt;
934                 break;
935         default:
936                 shost_printk(KERN_WARNING, phba->shost,
937                              "Unrecognized opcode 0x%x in async msg\n",
938                              (ppdu->
939                              dw[offsetof(struct amap_pdu_base, opcode) / 32]
940                                                 & PDUBASE_OPCODE_MASK));
941                 return 1;
942         }
943
944         spin_lock_bh(&session->lock);
945         __iscsi_complete_pdu(conn, (struct iscsi_hdr *)ppdu, pbuffer, buf_len);
946         spin_unlock_bh(&session->lock);
947         return 0;
948 }
949
950 static struct sgl_handle *alloc_io_sgl_handle(struct beiscsi_hba *phba)
951 {
952         struct sgl_handle *psgl_handle;
953
954         if (phba->io_sgl_hndl_avbl) {
955                 SE_DEBUG(DBG_LVL_8,
956                          "In alloc_io_sgl_handle,io_sgl_alloc_index=%d\n",
957                          phba->io_sgl_alloc_index);
958                 psgl_handle = phba->io_sgl_hndl_base[phba->
959                                                 io_sgl_alloc_index];
960                 phba->io_sgl_hndl_base[phba->io_sgl_alloc_index] = NULL;
961                 phba->io_sgl_hndl_avbl--;
962                 if (phba->io_sgl_alloc_index == (phba->params.
963                                                  ios_per_ctrl - 1))
964                         phba->io_sgl_alloc_index = 0;
965                 else
966                         phba->io_sgl_alloc_index++;
967         } else
968                 psgl_handle = NULL;
969         return psgl_handle;
970 }
971
972 static void
973 free_io_sgl_handle(struct beiscsi_hba *phba, struct sgl_handle *psgl_handle)
974 {
975         SE_DEBUG(DBG_LVL_8, "In free_,io_sgl_free_index=%d\n",
976                  phba->io_sgl_free_index);
977         if (phba->io_sgl_hndl_base[phba->io_sgl_free_index]) {
978                 /*
979                  * this can happen if clean_task is called on a task that
980                  * failed in xmit_task or alloc_pdu.
981                  */
982                  SE_DEBUG(DBG_LVL_8,
983                          "Double Free in IO SGL io_sgl_free_index=%d,"
984                          "value there=%p\n", phba->io_sgl_free_index,
985                          phba->io_sgl_hndl_base[phba->io_sgl_free_index]);
986                 return;
987         }
988         phba->io_sgl_hndl_base[phba->io_sgl_free_index] = psgl_handle;
989         phba->io_sgl_hndl_avbl++;
990         if (phba->io_sgl_free_index == (phba->params.ios_per_ctrl - 1))
991                 phba->io_sgl_free_index = 0;
992         else
993                 phba->io_sgl_free_index++;
994 }
995
996 /**
997  * alloc_wrb_handle - To allocate a wrb handle
998  * @phba: The hba pointer
999  * @cid: The cid to use for allocation
1000  *
1001  * This happens under session_lock until submission to chip
1002  */
1003 struct wrb_handle *alloc_wrb_handle(struct beiscsi_hba *phba, unsigned int cid)
1004 {
1005         struct hwi_wrb_context *pwrb_context;
1006         struct hwi_controller *phwi_ctrlr;
1007         struct wrb_handle *pwrb_handle, *pwrb_handle_tmp;
1008
1009         phwi_ctrlr = phba->phwi_ctrlr;
1010         pwrb_context = &phwi_ctrlr->wrb_context[cid];
1011         if (pwrb_context->wrb_handles_available >= 2) {
1012                 pwrb_handle = pwrb_context->pwrb_handle_base[
1013                                             pwrb_context->alloc_index];
1014                 pwrb_context->wrb_handles_available--;
1015                 if (pwrb_context->alloc_index ==
1016                                                 (phba->params.wrbs_per_cxn - 1))
1017                         pwrb_context->alloc_index = 0;
1018                 else
1019                         pwrb_context->alloc_index++;
1020                 pwrb_handle_tmp = pwrb_context->pwrb_handle_base[
1021                                                 pwrb_context->alloc_index];
1022                 pwrb_handle->nxt_wrb_index = pwrb_handle_tmp->wrb_index;
1023         } else
1024                 pwrb_handle = NULL;
1025         return pwrb_handle;
1026 }
1027
1028 /**
1029  * free_wrb_handle - To free the wrb handle back to pool
1030  * @phba: The hba pointer
1031  * @pwrb_context: The context to free from
1032  * @pwrb_handle: The wrb_handle to free
1033  *
1034  * This happens under session_lock until submission to chip
1035  */
1036 static void
1037 free_wrb_handle(struct beiscsi_hba *phba, struct hwi_wrb_context *pwrb_context,
1038                 struct wrb_handle *pwrb_handle)
1039 {
1040         pwrb_context->pwrb_handle_base[pwrb_context->free_index] = pwrb_handle;
1041         pwrb_context->wrb_handles_available++;
1042         if (pwrb_context->free_index == (phba->params.wrbs_per_cxn - 1))
1043                 pwrb_context->free_index = 0;
1044         else
1045                 pwrb_context->free_index++;
1046
1047         SE_DEBUG(DBG_LVL_8,
1048                  "FREE WRB: pwrb_handle=%p free_index=0x%x"
1049                  "wrb_handles_available=%d\n",
1050                  pwrb_handle, pwrb_context->free_index,
1051                  pwrb_context->wrb_handles_available);
1052 }
1053
1054 static struct sgl_handle *alloc_mgmt_sgl_handle(struct beiscsi_hba *phba)
1055 {
1056         struct sgl_handle *psgl_handle;
1057
1058         if (phba->eh_sgl_hndl_avbl) {
1059                 psgl_handle = phba->eh_sgl_hndl_base[phba->eh_sgl_alloc_index];
1060                 phba->eh_sgl_hndl_base[phba->eh_sgl_alloc_index] = NULL;
1061                 SE_DEBUG(DBG_LVL_8, "mgmt_sgl_alloc_index=%d=0x%x\n",
1062                          phba->eh_sgl_alloc_index, phba->eh_sgl_alloc_index);
1063                 phba->eh_sgl_hndl_avbl--;
1064                 if (phba->eh_sgl_alloc_index ==
1065                     (phba->params.icds_per_ctrl - phba->params.ios_per_ctrl -
1066                      1))
1067                         phba->eh_sgl_alloc_index = 0;
1068                 else
1069                         phba->eh_sgl_alloc_index++;
1070         } else
1071                 psgl_handle = NULL;
1072         return psgl_handle;
1073 }
1074
1075 void
1076 free_mgmt_sgl_handle(struct beiscsi_hba *phba, struct sgl_handle *psgl_handle)
1077 {
1078
1079         SE_DEBUG(DBG_LVL_8, "In  free_mgmt_sgl_handle,eh_sgl_free_index=%d\n",
1080                              phba->eh_sgl_free_index);
1081         if (phba->eh_sgl_hndl_base[phba->eh_sgl_free_index]) {
1082                 /*
1083                  * this can happen if clean_task is called on a task that
1084                  * failed in xmit_task or alloc_pdu.
1085                  */
1086                 SE_DEBUG(DBG_LVL_8,
1087                          "Double Free in eh SGL ,eh_sgl_free_index=%d\n",
1088                          phba->eh_sgl_free_index);
1089                 return;
1090         }
1091         phba->eh_sgl_hndl_base[phba->eh_sgl_free_index] = psgl_handle;
1092         phba->eh_sgl_hndl_avbl++;
1093         if (phba->eh_sgl_free_index ==
1094             (phba->params.icds_per_ctrl - phba->params.ios_per_ctrl - 1))
1095                 phba->eh_sgl_free_index = 0;
1096         else
1097                 phba->eh_sgl_free_index++;
1098 }
1099
1100 static void
1101 be_complete_io(struct beiscsi_conn *beiscsi_conn,
1102                struct iscsi_task *task, struct sol_cqe *psol)
1103 {
1104         struct beiscsi_io_task *io_task = task->dd_data;
1105         struct be_status_bhs *sts_bhs =
1106                                 (struct be_status_bhs *)io_task->cmd_bhs;
1107         struct iscsi_conn *conn = beiscsi_conn->conn;
1108         unsigned int sense_len;
1109         unsigned char *sense;
1110         u32 resid = 0, exp_cmdsn, max_cmdsn;
1111         u8 rsp, status, flags;
1112
1113         exp_cmdsn = (psol->
1114                         dw[offsetof(struct amap_sol_cqe, i_exp_cmd_sn) / 32]
1115                         & SOL_EXP_CMD_SN_MASK);
1116         max_cmdsn = ((psol->
1117                         dw[offsetof(struct amap_sol_cqe, i_exp_cmd_sn) / 32]
1118                         & SOL_EXP_CMD_SN_MASK) +
1119                         ((psol->dw[offsetof(struct amap_sol_cqe, i_cmd_wnd)
1120                                 / 32] & SOL_CMD_WND_MASK) >> 24) - 1);
1121         rsp = ((psol->dw[offsetof(struct amap_sol_cqe, i_resp) / 32]
1122                                                 & SOL_RESP_MASK) >> 16);
1123         status = ((psol->dw[offsetof(struct amap_sol_cqe, i_sts) / 32]
1124                                                 & SOL_STS_MASK) >> 8);
1125         flags = ((psol->dw[offsetof(struct amap_sol_cqe, i_flags) / 32]
1126                                         & SOL_FLAGS_MASK) >> 24) | 0x80;
1127         if (!task->sc) {
1128                 if (io_task->scsi_cmnd)
1129                         scsi_dma_unmap(io_task->scsi_cmnd);
1130
1131                 return;
1132         }
1133         task->sc->result = (DID_OK << 16) | status;
1134         if (rsp != ISCSI_STATUS_CMD_COMPLETED) {
1135                 task->sc->result = DID_ERROR << 16;
1136                 goto unmap;
1137         }
1138
1139         /* bidi not initially supported */
1140         if (flags & (ISCSI_FLAG_CMD_UNDERFLOW | ISCSI_FLAG_CMD_OVERFLOW)) {
1141                 resid = (psol->dw[offsetof(struct amap_sol_cqe, i_res_cnt) /
1142                                 32] & SOL_RES_CNT_MASK);
1143
1144                 if (!status && (flags & ISCSI_FLAG_CMD_OVERFLOW))
1145                         task->sc->result = DID_ERROR << 16;
1146
1147                 if (flags & ISCSI_FLAG_CMD_UNDERFLOW) {
1148                         scsi_set_resid(task->sc, resid);
1149                         if (!status && (scsi_bufflen(task->sc) - resid <
1150                             task->sc->underflow))
1151                                 task->sc->result = DID_ERROR << 16;
1152                 }
1153         }
1154
1155         if (status == SAM_STAT_CHECK_CONDITION) {
1156                 unsigned short *slen = (unsigned short *)sts_bhs->sense_info;
1157                 sense = sts_bhs->sense_info + sizeof(unsigned short);
1158                 sense_len =  cpu_to_be16(*slen);
1159                 memcpy(task->sc->sense_buffer, sense,
1160                        min_t(u16, sense_len, SCSI_SENSE_BUFFERSIZE));
1161         }
1162
1163         if (io_task->cmd_bhs->iscsi_hdr.flags & ISCSI_FLAG_CMD_READ) {
1164                 if (psol->dw[offsetof(struct amap_sol_cqe, i_res_cnt) / 32]
1165                                                         & SOL_RES_CNT_MASK)
1166                          conn->rxdata_octets += (psol->
1167                              dw[offsetof(struct amap_sol_cqe, i_res_cnt) / 32]
1168                              & SOL_RES_CNT_MASK);
1169         }
1170 unmap:
1171         scsi_dma_unmap(io_task->scsi_cmnd);
1172         iscsi_complete_scsi_task(task, exp_cmdsn, max_cmdsn);
1173 }
1174
1175 static void
1176 be_complete_logout(struct beiscsi_conn *beiscsi_conn,
1177                    struct iscsi_task *task, struct sol_cqe *psol)
1178 {
1179         struct iscsi_logout_rsp *hdr;
1180         struct beiscsi_io_task *io_task = task->dd_data;
1181         struct iscsi_conn *conn = beiscsi_conn->conn;
1182
1183         hdr = (struct iscsi_logout_rsp *)task->hdr;
1184         hdr->opcode = ISCSI_OP_LOGOUT_RSP;
1185         hdr->t2wait = 5;
1186         hdr->t2retain = 0;
1187         hdr->flags = ((psol->dw[offsetof(struct amap_sol_cqe, i_flags) / 32]
1188                                         & SOL_FLAGS_MASK) >> 24) | 0x80;
1189         hdr->response = (psol->dw[offsetof(struct amap_sol_cqe, i_resp) /
1190                                         32] & SOL_RESP_MASK);
1191         hdr->exp_cmdsn = cpu_to_be32(psol->
1192                         dw[offsetof(struct amap_sol_cqe, i_exp_cmd_sn) / 32]
1193                                         & SOL_EXP_CMD_SN_MASK);
1194         hdr->max_cmdsn = be32_to_cpu((psol->
1195                          dw[offsetof(struct amap_sol_cqe, i_exp_cmd_sn) / 32]
1196                                         & SOL_EXP_CMD_SN_MASK) +
1197                         ((psol->dw[offsetof(struct amap_sol_cqe, i_cmd_wnd)
1198                                         / 32] & SOL_CMD_WND_MASK) >> 24) - 1);
1199         hdr->dlength[0] = 0;
1200         hdr->dlength[1] = 0;
1201         hdr->dlength[2] = 0;
1202         hdr->hlength = 0;
1203         hdr->itt = io_task->libiscsi_itt;
1204         __iscsi_complete_pdu(conn, (struct iscsi_hdr *)hdr, NULL, 0);
1205 }
1206
1207 static void
1208 be_complete_tmf(struct beiscsi_conn *beiscsi_conn,
1209                 struct iscsi_task *task, struct sol_cqe *psol)
1210 {
1211         struct iscsi_tm_rsp *hdr;
1212         struct iscsi_conn *conn = beiscsi_conn->conn;
1213         struct beiscsi_io_task *io_task = task->dd_data;
1214
1215         hdr = (struct iscsi_tm_rsp *)task->hdr;
1216         hdr->opcode = ISCSI_OP_SCSI_TMFUNC_RSP;
1217         hdr->flags = ((psol->dw[offsetof(struct amap_sol_cqe, i_flags) / 32]
1218                                         & SOL_FLAGS_MASK) >> 24) | 0x80;
1219         hdr->response = (psol->dw[offsetof(struct amap_sol_cqe, i_resp) /
1220                                         32] & SOL_RESP_MASK);
1221         hdr->exp_cmdsn = cpu_to_be32(psol->dw[offsetof(struct amap_sol_cqe,
1222                                     i_exp_cmd_sn) / 32] & SOL_EXP_CMD_SN_MASK);
1223         hdr->max_cmdsn = be32_to_cpu((psol->dw[offsetof(struct amap_sol_cqe,
1224                         i_exp_cmd_sn) / 32] & SOL_EXP_CMD_SN_MASK) +
1225                         ((psol->dw[offsetof(struct amap_sol_cqe, i_cmd_wnd)
1226                         / 32] & SOL_CMD_WND_MASK) >> 24) - 1);
1227         hdr->itt = io_task->libiscsi_itt;
1228         __iscsi_complete_pdu(conn, (struct iscsi_hdr *)hdr, NULL, 0);
1229 }
1230
1231 static void
1232 hwi_complete_drvr_msgs(struct beiscsi_conn *beiscsi_conn,
1233                        struct beiscsi_hba *phba, struct sol_cqe *psol)
1234 {
1235         struct hwi_wrb_context *pwrb_context;
1236         struct wrb_handle *pwrb_handle = NULL;
1237         struct hwi_controller *phwi_ctrlr;
1238         struct iscsi_task *task;
1239         struct beiscsi_io_task *io_task;
1240         struct iscsi_conn *conn = beiscsi_conn->conn;
1241         struct iscsi_session *session = conn->session;
1242
1243         phwi_ctrlr = phba->phwi_ctrlr;
1244         pwrb_context = &phwi_ctrlr->wrb_context[((psol->
1245                                 dw[offsetof(struct amap_sol_cqe, cid) / 32] &
1246                                 SOL_CID_MASK) >> 6) -
1247                                 phba->fw_config.iscsi_cid_start];
1248         pwrb_handle = pwrb_context->pwrb_handle_basestd[((psol->
1249                                 dw[offsetof(struct amap_sol_cqe, wrb_index) /
1250                                 32] & SOL_WRB_INDEX_MASK) >> 16)];
1251         task = pwrb_handle->pio_handle;
1252
1253         io_task = task->dd_data;
1254         spin_lock(&phba->mgmt_sgl_lock);
1255         free_mgmt_sgl_handle(phba, io_task->psgl_handle);
1256         spin_unlock(&phba->mgmt_sgl_lock);
1257         spin_lock_bh(&session->lock);
1258         free_wrb_handle(phba, pwrb_context, pwrb_handle);
1259         spin_unlock_bh(&session->lock);
1260 }
1261
1262 static void
1263 be_complete_nopin_resp(struct beiscsi_conn *beiscsi_conn,
1264                        struct iscsi_task *task, struct sol_cqe *psol)
1265 {
1266         struct iscsi_nopin *hdr;
1267         struct iscsi_conn *conn = beiscsi_conn->conn;
1268         struct beiscsi_io_task *io_task = task->dd_data;
1269
1270         hdr = (struct iscsi_nopin *)task->hdr;
1271         hdr->flags = ((psol->dw[offsetof(struct amap_sol_cqe, i_flags) / 32]
1272                         & SOL_FLAGS_MASK) >> 24) | 0x80;
1273         hdr->exp_cmdsn = cpu_to_be32(psol->dw[offsetof(struct amap_sol_cqe,
1274                                      i_exp_cmd_sn) / 32] & SOL_EXP_CMD_SN_MASK);
1275         hdr->max_cmdsn = be32_to_cpu((psol->dw[offsetof(struct amap_sol_cqe,
1276                         i_exp_cmd_sn) / 32] & SOL_EXP_CMD_SN_MASK) +
1277                         ((psol->dw[offsetof(struct amap_sol_cqe, i_cmd_wnd)
1278                         / 32] & SOL_CMD_WND_MASK) >> 24) - 1);
1279         hdr->opcode = ISCSI_OP_NOOP_IN;
1280         hdr->itt = io_task->libiscsi_itt;
1281         __iscsi_complete_pdu(conn, (struct iscsi_hdr *)hdr, NULL, 0);
1282 }
1283
1284 static void hwi_complete_cmd(struct beiscsi_conn *beiscsi_conn,
1285                              struct beiscsi_hba *phba, struct sol_cqe *psol)
1286 {
1287         struct hwi_wrb_context *pwrb_context;
1288         struct wrb_handle *pwrb_handle;
1289         struct iscsi_wrb *pwrb = NULL;
1290         struct hwi_controller *phwi_ctrlr;
1291         struct iscsi_task *task;
1292         unsigned int type;
1293         struct iscsi_conn *conn = beiscsi_conn->conn;
1294         struct iscsi_session *session = conn->session;
1295
1296         phwi_ctrlr = phba->phwi_ctrlr;
1297         pwrb_context = &phwi_ctrlr->wrb_context[((psol->dw[offsetof
1298                                 (struct amap_sol_cqe, cid) / 32]
1299                                 & SOL_CID_MASK) >> 6) -
1300                                 phba->fw_config.iscsi_cid_start];
1301         pwrb_handle = pwrb_context->pwrb_handle_basestd[((psol->
1302                                 dw[offsetof(struct amap_sol_cqe, wrb_index) /
1303                                 32] & SOL_WRB_INDEX_MASK) >> 16)];
1304         task = pwrb_handle->pio_handle;
1305         pwrb = pwrb_handle->pwrb;
1306         type = (pwrb->dw[offsetof(struct amap_iscsi_wrb, type) / 32] &
1307                                  WRB_TYPE_MASK) >> 28;
1308
1309         spin_lock_bh(&session->lock);
1310         switch (type) {
1311         case HWH_TYPE_IO:
1312         case HWH_TYPE_IO_RD:
1313                 if ((task->hdr->opcode & ISCSI_OPCODE_MASK) ==
1314                      ISCSI_OP_NOOP_OUT)
1315                         be_complete_nopin_resp(beiscsi_conn, task, psol);
1316                 else
1317                         be_complete_io(beiscsi_conn, task, psol);
1318                 break;
1319
1320         case HWH_TYPE_LOGOUT:
1321                 if ((task->hdr->opcode & ISCSI_OPCODE_MASK) == ISCSI_OP_LOGOUT)
1322                         be_complete_logout(beiscsi_conn, task, psol);
1323                 else
1324                         be_complete_tmf(beiscsi_conn, task, psol);
1325
1326                 break;
1327
1328         case HWH_TYPE_LOGIN:
1329                 SE_DEBUG(DBG_LVL_1,
1330                          "\t\t No HWH_TYPE_LOGIN Expected in hwi_complete_cmd"
1331                          "- Solicited path\n");
1332                 break;
1333
1334         case HWH_TYPE_NOP:
1335                 be_complete_nopin_resp(beiscsi_conn, task, psol);
1336                 break;
1337
1338         default:
1339                 shost_printk(KERN_WARNING, phba->shost,
1340                                 "In hwi_complete_cmd, unknown type = %d"
1341                                 "wrb_index 0x%x CID 0x%x\n", type,
1342                                 ((psol->dw[offsetof(struct amap_iscsi_wrb,
1343                                 type) / 32] & SOL_WRB_INDEX_MASK) >> 16),
1344                                 ((psol->dw[offsetof(struct amap_sol_cqe,
1345                                 cid) / 32] & SOL_CID_MASK) >> 6));
1346                 break;
1347         }
1348
1349         spin_unlock_bh(&session->lock);
1350 }
1351
1352 static struct list_head *hwi_get_async_busy_list(struct hwi_async_pdu_context
1353                                           *pasync_ctx, unsigned int is_header,
1354                                           unsigned int host_write_ptr)
1355 {
1356         if (is_header)
1357                 return &pasync_ctx->async_entry[host_write_ptr].
1358                     header_busy_list;
1359         else
1360                 return &pasync_ctx->async_entry[host_write_ptr].data_busy_list;
1361 }
1362
1363 static struct async_pdu_handle *
1364 hwi_get_async_handle(struct beiscsi_hba *phba,
1365                      struct beiscsi_conn *beiscsi_conn,
1366                      struct hwi_async_pdu_context *pasync_ctx,
1367                      struct i_t_dpdu_cqe *pdpdu_cqe, unsigned int *pcq_index)
1368 {
1369         struct be_bus_address phys_addr;
1370         struct list_head *pbusy_list;
1371         struct async_pdu_handle *pasync_handle = NULL;
1372         int buffer_len = 0;
1373         unsigned char buffer_index = -1;
1374         unsigned char is_header = 0;
1375
1376         phys_addr.u.a32.address_lo =
1377             pdpdu_cqe->dw[offsetof(struct amap_i_t_dpdu_cqe, db_addr_lo) / 32] -
1378             ((pdpdu_cqe->dw[offsetof(struct amap_i_t_dpdu_cqe, dpl) / 32]
1379                                                 & PDUCQE_DPL_MASK) >> 16);
1380         phys_addr.u.a32.address_hi =
1381             pdpdu_cqe->dw[offsetof(struct amap_i_t_dpdu_cqe, db_addr_hi) / 32];
1382
1383         phys_addr.u.a64.address =
1384                         *((unsigned long long *)(&phys_addr.u.a64.address));
1385
1386         switch (pdpdu_cqe->dw[offsetof(struct amap_i_t_dpdu_cqe, code) / 32]
1387                         & PDUCQE_CODE_MASK) {
1388         case UNSOL_HDR_NOTIFY:
1389                 is_header = 1;
1390
1391                 pbusy_list = hwi_get_async_busy_list(pasync_ctx, 1,
1392                         (pdpdu_cqe->dw[offsetof(struct amap_i_t_dpdu_cqe,
1393                         index) / 32] & PDUCQE_INDEX_MASK));
1394
1395                 buffer_len = (unsigned int)(phys_addr.u.a64.address -
1396                                 pasync_ctx->async_header.pa_base.u.a64.address);
1397
1398                 buffer_index = buffer_len /
1399                                 pasync_ctx->async_header.buffer_size;
1400
1401                 break;
1402         case UNSOL_DATA_NOTIFY:
1403                 pbusy_list = hwi_get_async_busy_list(pasync_ctx, 0, (pdpdu_cqe->
1404                                         dw[offsetof(struct amap_i_t_dpdu_cqe,
1405                                         index) / 32] & PDUCQE_INDEX_MASK));
1406                 buffer_len = (unsigned long)(phys_addr.u.a64.address -
1407                                         pasync_ctx->async_data.pa_base.u.
1408                                         a64.address);
1409                 buffer_index = buffer_len / pasync_ctx->async_data.buffer_size;
1410                 break;
1411         default:
1412                 pbusy_list = NULL;
1413                 shost_printk(KERN_WARNING, phba->shost,
1414                         "Unexpected code=%d\n",
1415                          pdpdu_cqe->dw[offsetof(struct amap_i_t_dpdu_cqe,
1416                                         code) / 32] & PDUCQE_CODE_MASK);
1417                 return NULL;
1418         }
1419
1420         WARN_ON(!(buffer_index <= pasync_ctx->async_data.num_entries));
1421         WARN_ON(list_empty(pbusy_list));
1422         list_for_each_entry(pasync_handle, pbusy_list, link) {
1423                 WARN_ON(pasync_handle->consumed);
1424                 if (pasync_handle->index == buffer_index)
1425                         break;
1426         }
1427
1428         WARN_ON(!pasync_handle);
1429
1430         pasync_handle->cri = (unsigned short)beiscsi_conn->beiscsi_conn_cid -
1431                                              phba->fw_config.iscsi_cid_start;
1432         pasync_handle->is_header = is_header;
1433         pasync_handle->buffer_len = ((pdpdu_cqe->
1434                         dw[offsetof(struct amap_i_t_dpdu_cqe, dpl) / 32]
1435                         & PDUCQE_DPL_MASK) >> 16);
1436
1437         *pcq_index = (pdpdu_cqe->dw[offsetof(struct amap_i_t_dpdu_cqe,
1438                         index) / 32] & PDUCQE_INDEX_MASK);
1439         return pasync_handle;
1440 }
1441
1442 static unsigned int
1443 hwi_update_async_writables(struct hwi_async_pdu_context *pasync_ctx,
1444                            unsigned int is_header, unsigned int cq_index)
1445 {
1446         struct list_head *pbusy_list;
1447         struct async_pdu_handle *pasync_handle;
1448         unsigned int num_entries, writables = 0;
1449         unsigned int *pep_read_ptr, *pwritables;
1450
1451
1452         if (is_header) {
1453                 pep_read_ptr = &pasync_ctx->async_header.ep_read_ptr;
1454                 pwritables = &pasync_ctx->async_header.writables;
1455                 num_entries = pasync_ctx->async_header.num_entries;
1456         } else {
1457                 pep_read_ptr = &pasync_ctx->async_data.ep_read_ptr;
1458                 pwritables = &pasync_ctx->async_data.writables;
1459                 num_entries = pasync_ctx->async_data.num_entries;
1460         }
1461
1462         while ((*pep_read_ptr) != cq_index) {
1463                 (*pep_read_ptr)++;
1464                 *pep_read_ptr = (*pep_read_ptr) % num_entries;
1465
1466                 pbusy_list = hwi_get_async_busy_list(pasync_ctx, is_header,
1467                                                      *pep_read_ptr);
1468                 if (writables == 0)
1469                         WARN_ON(list_empty(pbusy_list));
1470
1471                 if (!list_empty(pbusy_list)) {
1472                         pasync_handle = list_entry(pbusy_list->next,
1473                                                    struct async_pdu_handle,
1474                                                    link);
1475                         WARN_ON(!pasync_handle);
1476                         pasync_handle->consumed = 1;
1477                 }
1478
1479                 writables++;
1480         }
1481
1482         if (!writables) {
1483                 SE_DEBUG(DBG_LVL_1,
1484                          "Duplicate notification received - index 0x%x!!\n",
1485                          cq_index);
1486                 WARN_ON(1);
1487         }
1488
1489         *pwritables = *pwritables + writables;
1490         return 0;
1491 }
1492
1493 static unsigned int hwi_free_async_msg(struct beiscsi_hba *phba,
1494                                        unsigned int cri)
1495 {
1496         struct hwi_controller *phwi_ctrlr;
1497         struct hwi_async_pdu_context *pasync_ctx;
1498         struct async_pdu_handle *pasync_handle, *tmp_handle;
1499         struct list_head *plist;
1500         unsigned int i = 0;
1501
1502         phwi_ctrlr = phba->phwi_ctrlr;
1503         pasync_ctx = HWI_GET_ASYNC_PDU_CTX(phwi_ctrlr);
1504
1505         plist  = &pasync_ctx->async_entry[cri].wait_queue.list;
1506
1507         list_for_each_entry_safe(pasync_handle, tmp_handle, plist, link) {
1508                 list_del(&pasync_handle->link);
1509
1510                 if (i == 0) {
1511                         list_add_tail(&pasync_handle->link,
1512                                       &pasync_ctx->async_header.free_list);
1513                         pasync_ctx->async_header.free_entries++;
1514                         i++;
1515                 } else {
1516                         list_add_tail(&pasync_handle->link,
1517                                       &pasync_ctx->async_data.free_list);
1518                         pasync_ctx->async_data.free_entries++;
1519                         i++;
1520                 }
1521         }
1522
1523         INIT_LIST_HEAD(&pasync_ctx->async_entry[cri].wait_queue.list);
1524         pasync_ctx->async_entry[cri].wait_queue.hdr_received = 0;
1525         pasync_ctx->async_entry[cri].wait_queue.bytes_received = 0;
1526         return 0;
1527 }
1528
1529 static struct phys_addr *
1530 hwi_get_ring_address(struct hwi_async_pdu_context *pasync_ctx,
1531                      unsigned int is_header, unsigned int host_write_ptr)
1532 {
1533         struct phys_addr *pasync_sge = NULL;
1534
1535         if (is_header)
1536                 pasync_sge = pasync_ctx->async_header.ring_base;
1537         else
1538                 pasync_sge = pasync_ctx->async_data.ring_base;
1539
1540         return pasync_sge + host_write_ptr;
1541 }
1542
1543 static void hwi_post_async_buffers(struct beiscsi_hba *phba,
1544                                    unsigned int is_header)
1545 {
1546         struct hwi_controller *phwi_ctrlr;
1547         struct hwi_async_pdu_context *pasync_ctx;
1548         struct async_pdu_handle *pasync_handle;
1549         struct list_head *pfree_link, *pbusy_list;
1550         struct phys_addr *pasync_sge;
1551         unsigned int ring_id, num_entries;
1552         unsigned int host_write_num;
1553         unsigned int writables;
1554         unsigned int i = 0;
1555         u32 doorbell = 0;
1556
1557         phwi_ctrlr = phba->phwi_ctrlr;
1558         pasync_ctx = HWI_GET_ASYNC_PDU_CTX(phwi_ctrlr);
1559
1560         if (is_header) {
1561                 num_entries = pasync_ctx->async_header.num_entries;
1562                 writables = min(pasync_ctx->async_header.writables,
1563                                 pasync_ctx->async_header.free_entries);
1564                 pfree_link = pasync_ctx->async_header.free_list.next;
1565                 host_write_num = pasync_ctx->async_header.host_write_ptr;
1566                 ring_id = phwi_ctrlr->default_pdu_hdr.id;
1567         } else {
1568                 num_entries = pasync_ctx->async_data.num_entries;
1569                 writables = min(pasync_ctx->async_data.writables,
1570                                 pasync_ctx->async_data.free_entries);
1571                 pfree_link = pasync_ctx->async_data.free_list.next;
1572                 host_write_num = pasync_ctx->async_data.host_write_ptr;
1573                 ring_id = phwi_ctrlr->default_pdu_data.id;
1574         }
1575
1576         writables = (writables / 8) * 8;
1577         if (writables) {
1578                 for (i = 0; i < writables; i++) {
1579                         pbusy_list =
1580                             hwi_get_async_busy_list(pasync_ctx, is_header,
1581                                                     host_write_num);
1582                         pasync_handle =
1583                             list_entry(pfree_link, struct async_pdu_handle,
1584                                                                 link);
1585                         WARN_ON(!pasync_handle);
1586                         pasync_handle->consumed = 0;
1587
1588                         pfree_link = pfree_link->next;
1589
1590                         pasync_sge = hwi_get_ring_address(pasync_ctx,
1591                                                 is_header, host_write_num);
1592
1593                         pasync_sge->hi = pasync_handle->pa.u.a32.address_lo;
1594                         pasync_sge->lo = pasync_handle->pa.u.a32.address_hi;
1595
1596                         list_move(&pasync_handle->link, pbusy_list);
1597
1598                         host_write_num++;
1599                         host_write_num = host_write_num % num_entries;
1600                 }
1601
1602                 if (is_header) {
1603                         pasync_ctx->async_header.host_write_ptr =
1604                                                         host_write_num;
1605                         pasync_ctx->async_header.free_entries -= writables;
1606                         pasync_ctx->async_header.writables -= writables;
1607                         pasync_ctx->async_header.busy_entries += writables;
1608                 } else {
1609                         pasync_ctx->async_data.host_write_ptr = host_write_num;
1610                         pasync_ctx->async_data.free_entries -= writables;
1611                         pasync_ctx->async_data.writables -= writables;
1612                         pasync_ctx->async_data.busy_entries += writables;
1613                 }
1614
1615                 doorbell |= ring_id & DB_DEF_PDU_RING_ID_MASK;
1616                 doorbell |= 1 << DB_DEF_PDU_REARM_SHIFT;
1617                 doorbell |= 0 << DB_DEF_PDU_EVENT_SHIFT;
1618                 doorbell |= (writables & DB_DEF_PDU_CQPROC_MASK)
1619                                         << DB_DEF_PDU_CQPROC_SHIFT;
1620
1621                 iowrite32(doorbell, phba->db_va + DB_RXULP0_OFFSET);
1622         }
1623 }
1624
1625 static void hwi_flush_default_pdu_buffer(struct beiscsi_hba *phba,
1626                                          struct beiscsi_conn *beiscsi_conn,
1627                                          struct i_t_dpdu_cqe *pdpdu_cqe)
1628 {
1629         struct hwi_controller *phwi_ctrlr;
1630         struct hwi_async_pdu_context *pasync_ctx;
1631         struct async_pdu_handle *pasync_handle = NULL;
1632         unsigned int cq_index = -1;
1633
1634         phwi_ctrlr = phba->phwi_ctrlr;
1635         pasync_ctx = HWI_GET_ASYNC_PDU_CTX(phwi_ctrlr);
1636
1637         pasync_handle = hwi_get_async_handle(phba, beiscsi_conn, pasync_ctx,
1638                                              pdpdu_cqe, &cq_index);
1639         BUG_ON(pasync_handle->is_header != 0);
1640         if (pasync_handle->consumed == 0)
1641                 hwi_update_async_writables(pasync_ctx, pasync_handle->is_header,
1642                                            cq_index);
1643
1644         hwi_free_async_msg(phba, pasync_handle->cri);
1645         hwi_post_async_buffers(phba, pasync_handle->is_header);
1646 }
1647
1648 static unsigned int
1649 hwi_fwd_async_msg(struct beiscsi_conn *beiscsi_conn,
1650                   struct beiscsi_hba *phba,
1651                   struct hwi_async_pdu_context *pasync_ctx, unsigned short cri)
1652 {
1653         struct list_head *plist;
1654         struct async_pdu_handle *pasync_handle;
1655         void *phdr = NULL;
1656         unsigned int hdr_len = 0, buf_len = 0;
1657         unsigned int status, index = 0, offset = 0;
1658         void *pfirst_buffer = NULL;
1659         unsigned int num_buf = 0;
1660
1661         plist = &pasync_ctx->async_entry[cri].wait_queue.list;
1662
1663         list_for_each_entry(pasync_handle, plist, link) {
1664                 if (index == 0) {
1665                         phdr = pasync_handle->pbuffer;
1666                         hdr_len = pasync_handle->buffer_len;
1667                 } else {
1668                         buf_len = pasync_handle->buffer_len;
1669                         if (!num_buf) {
1670                                 pfirst_buffer = pasync_handle->pbuffer;
1671                                 num_buf++;
1672                         }
1673                         memcpy(pfirst_buffer + offset,
1674                                pasync_handle->pbuffer, buf_len);
1675                         offset = buf_len;
1676                 }
1677                 index++;
1678         }
1679
1680         status = beiscsi_process_async_pdu(beiscsi_conn, phba,
1681                                            (beiscsi_conn->beiscsi_conn_cid -
1682                                             phba->fw_config.iscsi_cid_start),
1683                                             phdr, hdr_len, pfirst_buffer,
1684                                             buf_len);
1685
1686         if (status == 0)
1687                 hwi_free_async_msg(phba, cri);
1688         return 0;
1689 }
1690
1691 static unsigned int
1692 hwi_gather_async_pdu(struct beiscsi_conn *beiscsi_conn,
1693                      struct beiscsi_hba *phba,
1694                      struct async_pdu_handle *pasync_handle)
1695 {
1696         struct hwi_async_pdu_context *pasync_ctx;
1697         struct hwi_controller *phwi_ctrlr;
1698         unsigned int bytes_needed = 0, status = 0;
1699         unsigned short cri = pasync_handle->cri;
1700         struct pdu_base *ppdu;
1701
1702         phwi_ctrlr = phba->phwi_ctrlr;
1703         pasync_ctx = HWI_GET_ASYNC_PDU_CTX(phwi_ctrlr);
1704
1705         list_del(&pasync_handle->link);
1706         if (pasync_handle->is_header) {
1707                 pasync_ctx->async_header.busy_entries--;
1708                 if (pasync_ctx->async_entry[cri].wait_queue.hdr_received) {
1709                         hwi_free_async_msg(phba, cri);
1710                         BUG();
1711                 }
1712
1713                 pasync_ctx->async_entry[cri].wait_queue.bytes_received = 0;
1714                 pasync_ctx->async_entry[cri].wait_queue.hdr_received = 1;
1715                 pasync_ctx->async_entry[cri].wait_queue.hdr_len =
1716                                 (unsigned short)pasync_handle->buffer_len;
1717                 list_add_tail(&pasync_handle->link,
1718                               &pasync_ctx->async_entry[cri].wait_queue.list);
1719
1720                 ppdu = pasync_handle->pbuffer;
1721                 bytes_needed = ((((ppdu->dw[offsetof(struct amap_pdu_base,
1722                         data_len_hi) / 32] & PDUBASE_DATALENHI_MASK) << 8) &
1723                         0xFFFF0000) | ((be16_to_cpu((ppdu->
1724                         dw[offsetof(struct amap_pdu_base, data_len_lo) / 32]
1725                         & PDUBASE_DATALENLO_MASK) >> 16)) & 0x0000FFFF));
1726
1727                 if (status == 0) {
1728                         pasync_ctx->async_entry[cri].wait_queue.bytes_needed =
1729                             bytes_needed;
1730
1731                         if (bytes_needed == 0)
1732                                 status = hwi_fwd_async_msg(beiscsi_conn, phba,
1733                                                            pasync_ctx, cri);
1734                 }
1735         } else {
1736                 pasync_ctx->async_data.busy_entries--;
1737                 if (pasync_ctx->async_entry[cri].wait_queue.hdr_received) {
1738                         list_add_tail(&pasync_handle->link,
1739                                       &pasync_ctx->async_entry[cri].wait_queue.
1740                                       list);
1741                         pasync_ctx->async_entry[cri].wait_queue.
1742                                 bytes_received +=
1743                                 (unsigned short)pasync_handle->buffer_len;
1744
1745                         if (pasync_ctx->async_entry[cri].wait_queue.
1746                             bytes_received >=
1747                             pasync_ctx->async_entry[cri].wait_queue.
1748                             bytes_needed)
1749                                 status = hwi_fwd_async_msg(beiscsi_conn, phba,
1750                                                            pasync_ctx, cri);
1751                 }
1752         }
1753         return status;
1754 }
1755
1756 static void hwi_process_default_pdu_ring(struct beiscsi_conn *beiscsi_conn,
1757                                          struct beiscsi_hba *phba,
1758                                          struct i_t_dpdu_cqe *pdpdu_cqe)
1759 {
1760         struct hwi_controller *phwi_ctrlr;
1761         struct hwi_async_pdu_context *pasync_ctx;
1762         struct async_pdu_handle *pasync_handle = NULL;
1763         unsigned int cq_index = -1;
1764
1765         phwi_ctrlr = phba->phwi_ctrlr;
1766         pasync_ctx = HWI_GET_ASYNC_PDU_CTX(phwi_ctrlr);
1767         pasync_handle = hwi_get_async_handle(phba, beiscsi_conn, pasync_ctx,
1768                                              pdpdu_cqe, &cq_index);
1769
1770         if (pasync_handle->consumed == 0)
1771                 hwi_update_async_writables(pasync_ctx, pasync_handle->is_header,
1772                                            cq_index);
1773         hwi_gather_async_pdu(beiscsi_conn, phba, pasync_handle);
1774         hwi_post_async_buffers(phba, pasync_handle->is_header);
1775 }
1776
1777 static void  beiscsi_process_mcc_isr(struct beiscsi_hba *phba)
1778 {
1779         struct be_queue_info *mcc_cq;
1780         struct  be_mcc_compl *mcc_compl;
1781         unsigned int num_processed = 0;
1782
1783         mcc_cq = &phba->ctrl.mcc_obj.cq;
1784         mcc_compl = queue_tail_node(mcc_cq);
1785         mcc_compl->flags = le32_to_cpu(mcc_compl->flags);
1786         while (mcc_compl->flags & CQE_FLAGS_VALID_MASK) {
1787
1788                 if (num_processed >= 32) {
1789                         hwi_ring_cq_db(phba, mcc_cq->id,
1790                                         num_processed, 0, 0);
1791                         num_processed = 0;
1792                 }
1793                 if (mcc_compl->flags & CQE_FLAGS_ASYNC_MASK) {
1794                         /* Interpret flags as an async trailer */
1795                         if (is_link_state_evt(mcc_compl->flags))
1796                                 /* Interpret compl as a async link evt */
1797                                 beiscsi_async_link_state_process(phba,
1798                                 (struct be_async_event_link_state *) mcc_compl);
1799                         else
1800                                 SE_DEBUG(DBG_LVL_1,
1801                                         " Unsupported Async Event, flags"
1802                                         " = 0x%08x\n", mcc_compl->flags);
1803                 } else if (mcc_compl->flags & CQE_FLAGS_COMPLETED_MASK) {
1804                         be_mcc_compl_process_isr(&phba->ctrl, mcc_compl);
1805                         atomic_dec(&phba->ctrl.mcc_obj.q.used);
1806                 }
1807
1808                 mcc_compl->flags = 0;
1809                 queue_tail_inc(mcc_cq);
1810                 mcc_compl = queue_tail_node(mcc_cq);
1811                 mcc_compl->flags = le32_to_cpu(mcc_compl->flags);
1812                 num_processed++;
1813         }
1814
1815         if (num_processed > 0)
1816                 hwi_ring_cq_db(phba, mcc_cq->id, num_processed, 1, 0);
1817
1818 }
1819
1820 static unsigned int beiscsi_process_cq(struct be_eq_obj *pbe_eq)
1821 {
1822         struct be_queue_info *cq;
1823         struct sol_cqe *sol;
1824         struct dmsg_cqe *dmsg;
1825         unsigned int num_processed = 0;
1826         unsigned int tot_nump = 0;
1827         struct beiscsi_conn *beiscsi_conn;
1828         struct beiscsi_endpoint *beiscsi_ep;
1829         struct iscsi_endpoint *ep;
1830         struct beiscsi_hba *phba;
1831
1832         cq = pbe_eq->cq;
1833         sol = queue_tail_node(cq);
1834         phba = pbe_eq->phba;
1835
1836         while (sol->dw[offsetof(struct amap_sol_cqe, valid) / 32] &
1837                CQE_VALID_MASK) {
1838                 be_dws_le_to_cpu(sol, sizeof(struct sol_cqe));
1839
1840                 ep = phba->ep_array[(u32) ((sol->
1841                                    dw[offsetof(struct amap_sol_cqe, cid) / 32] &
1842                                    SOL_CID_MASK) >> 6) -
1843                                    phba->fw_config.iscsi_cid_start];
1844
1845                 beiscsi_ep = ep->dd_data;
1846                 beiscsi_conn = beiscsi_ep->conn;
1847
1848                 if (num_processed >= 32) {
1849                         hwi_ring_cq_db(phba, cq->id,
1850                                         num_processed, 0, 0);
1851                         tot_nump += num_processed;
1852                         num_processed = 0;
1853                 }
1854
1855                 switch ((u32) sol->dw[offsetof(struct amap_sol_cqe, code) /
1856                         32] & CQE_CODE_MASK) {
1857                 case SOL_CMD_COMPLETE:
1858                         hwi_complete_cmd(beiscsi_conn, phba, sol);
1859                         break;
1860                 case DRIVERMSG_NOTIFY:
1861                         SE_DEBUG(DBG_LVL_8, "Received DRIVERMSG_NOTIFY\n");
1862                         dmsg = (struct dmsg_cqe *)sol;
1863                         hwi_complete_drvr_msgs(beiscsi_conn, phba, sol);
1864                         break;
1865                 case UNSOL_HDR_NOTIFY:
1866                         SE_DEBUG(DBG_LVL_8, "Received UNSOL_HDR_ NOTIFY\n");
1867                         hwi_process_default_pdu_ring(beiscsi_conn, phba,
1868                                              (struct i_t_dpdu_cqe *)sol);
1869                         break;
1870                 case UNSOL_DATA_NOTIFY:
1871                         SE_DEBUG(DBG_LVL_8, "Received UNSOL_DATA_NOTIFY\n");
1872                         hwi_process_default_pdu_ring(beiscsi_conn, phba,
1873                                              (struct i_t_dpdu_cqe *)sol);
1874                         break;
1875                 case CXN_INVALIDATE_INDEX_NOTIFY:
1876                 case CMD_INVALIDATED_NOTIFY:
1877                 case CXN_INVALIDATE_NOTIFY:
1878                         SE_DEBUG(DBG_LVL_1,
1879                                  "Ignoring CQ Error notification for cmd/cxn"
1880                                  "invalidate\n");
1881                         break;
1882                 case SOL_CMD_KILLED_DATA_DIGEST_ERR:
1883                 case CMD_KILLED_INVALID_STATSN_RCVD:
1884                 case CMD_KILLED_INVALID_R2T_RCVD:
1885                 case CMD_CXN_KILLED_LUN_INVALID:
1886                 case CMD_CXN_KILLED_ICD_INVALID:
1887                 case CMD_CXN_KILLED_ITT_INVALID:
1888                 case CMD_CXN_KILLED_SEQ_OUTOFORDER:
1889                 case CMD_CXN_KILLED_INVALID_DATASN_RCVD:
1890                         SE_DEBUG(DBG_LVL_1,
1891                                  "CQ Error notification for cmd.. "
1892                                  "code %d cid 0x%x\n",
1893                                  sol->dw[offsetof(struct amap_sol_cqe, code) /
1894                                  32] & CQE_CODE_MASK,
1895                                  (sol->dw[offsetof(struct amap_sol_cqe, cid) /
1896                                  32] & SOL_CID_MASK));
1897                         break;
1898                 case UNSOL_DATA_DIGEST_ERROR_NOTIFY:
1899                         SE_DEBUG(DBG_LVL_1,
1900                                  "Digest error on def pdu ring, dropping..\n");
1901                         hwi_flush_default_pdu_buffer(phba, beiscsi_conn,
1902                                              (struct i_t_dpdu_cqe *) sol);
1903                         break;
1904                 case CXN_KILLED_PDU_SIZE_EXCEEDS_DSL:
1905                 case CXN_KILLED_BURST_LEN_MISMATCH:
1906                 case CXN_KILLED_AHS_RCVD:
1907                 case CXN_KILLED_HDR_DIGEST_ERR:
1908                 case CXN_KILLED_UNKNOWN_HDR:
1909                 case CXN_KILLED_STALE_ITT_TTT_RCVD:
1910                 case CXN_KILLED_INVALID_ITT_TTT_RCVD:
1911                 case CXN_KILLED_TIMED_OUT:
1912                 case CXN_KILLED_FIN_RCVD:
1913                 case CXN_KILLED_BAD_UNSOL_PDU_RCVD:
1914                 case CXN_KILLED_BAD_WRB_INDEX_ERROR:
1915                 case CXN_KILLED_OVER_RUN_RESIDUAL:
1916                 case CXN_KILLED_UNDER_RUN_RESIDUAL:
1917                 case CXN_KILLED_CMND_DATA_NOT_ON_SAME_CONN:
1918                         SE_DEBUG(DBG_LVL_1, "CQ Error %d, reset CID "
1919                                  "0x%x...\n",
1920                                  sol->dw[offsetof(struct amap_sol_cqe, code) /
1921                                  32] & CQE_CODE_MASK,
1922                                  (sol->dw[offsetof(struct amap_sol_cqe, cid) /
1923                                  32] & CQE_CID_MASK));
1924                         iscsi_conn_failure(beiscsi_conn->conn,
1925                                            ISCSI_ERR_CONN_FAILED);
1926                         break;
1927                 case CXN_KILLED_RST_SENT:
1928                 case CXN_KILLED_RST_RCVD:
1929                         SE_DEBUG(DBG_LVL_1, "CQ Error %d, reset"
1930                                 "received/sent on CID 0x%x...\n",
1931                                  sol->dw[offsetof(struct amap_sol_cqe, code) /
1932                                  32] & CQE_CODE_MASK,
1933                                  (sol->dw[offsetof(struct amap_sol_cqe, cid) /
1934                                  32] & CQE_CID_MASK));
1935                         iscsi_conn_failure(beiscsi_conn->conn,
1936                                            ISCSI_ERR_CONN_FAILED);
1937                         break;
1938                 default:
1939                         SE_DEBUG(DBG_LVL_1, "CQ Error Invalid code= %d "
1940                                  "received on CID 0x%x...\n",
1941                                  sol->dw[offsetof(struct amap_sol_cqe, code) /
1942                                  32] & CQE_CODE_MASK,
1943                                  (sol->dw[offsetof(struct amap_sol_cqe, cid) /
1944                                  32] & CQE_CID_MASK));
1945                         break;
1946                 }
1947
1948                 AMAP_SET_BITS(struct amap_sol_cqe, valid, sol, 0);
1949                 queue_tail_inc(cq);
1950                 sol = queue_tail_node(cq);
1951                 num_processed++;
1952         }
1953
1954         if (num_processed > 0) {
1955                 tot_nump += num_processed;
1956                 hwi_ring_cq_db(phba, cq->id, num_processed, 1, 0);
1957         }
1958         return tot_nump;
1959 }
1960
1961 void beiscsi_process_all_cqs(struct work_struct *work)
1962 {
1963         unsigned long flags;
1964         struct hwi_controller *phwi_ctrlr;
1965         struct hwi_context_memory *phwi_context;
1966         struct be_eq_obj *pbe_eq;
1967         struct beiscsi_hba *phba =
1968             container_of(work, struct beiscsi_hba, work_cqs);
1969
1970         phwi_ctrlr = phba->phwi_ctrlr;
1971         phwi_context = phwi_ctrlr->phwi_ctxt;
1972         if (phba->msix_enabled)
1973                 pbe_eq = &phwi_context->be_eq[phba->num_cpus];
1974         else
1975                 pbe_eq = &phwi_context->be_eq[0];
1976
1977         if (phba->todo_mcc_cq) {
1978                 spin_lock_irqsave(&phba->isr_lock, flags);
1979                 phba->todo_mcc_cq = 0;
1980                 spin_unlock_irqrestore(&phba->isr_lock, flags);
1981                 beiscsi_process_mcc_isr(phba);
1982         }
1983
1984         if (phba->todo_cq) {
1985                 spin_lock_irqsave(&phba->isr_lock, flags);
1986                 phba->todo_cq = 0;
1987                 spin_unlock_irqrestore(&phba->isr_lock, flags);
1988                 beiscsi_process_cq(pbe_eq);
1989         }
1990 }
1991
1992 static int be_iopoll(struct blk_iopoll *iop, int budget)
1993 {
1994         static unsigned int ret;
1995         struct beiscsi_hba *phba;
1996         struct be_eq_obj *pbe_eq;
1997
1998         pbe_eq = container_of(iop, struct be_eq_obj, iopoll);
1999         ret = beiscsi_process_cq(pbe_eq);
2000         if (ret < budget) {
2001                 phba = pbe_eq->phba;
2002                 blk_iopoll_complete(iop);
2003                 SE_DEBUG(DBG_LVL_8, "rearm pbe_eq->q.id =%d\n", pbe_eq->q.id);
2004                 hwi_ring_eq_db(phba, pbe_eq->q.id, 0, 0, 1, 1);
2005         }
2006         return ret;
2007 }
2008
2009 static void
2010 hwi_write_sgl(struct iscsi_wrb *pwrb, struct scatterlist *sg,
2011               unsigned int num_sg, struct beiscsi_io_task *io_task)
2012 {
2013         struct iscsi_sge *psgl;
2014         unsigned int sg_len, index;
2015         unsigned int sge_len = 0;
2016         unsigned long long addr;
2017         struct scatterlist *l_sg;
2018         unsigned int offset;
2019
2020         AMAP_SET_BITS(struct amap_iscsi_wrb, iscsi_bhs_addr_lo, pwrb,
2021                                       io_task->bhs_pa.u.a32.address_lo);
2022         AMAP_SET_BITS(struct amap_iscsi_wrb, iscsi_bhs_addr_hi, pwrb,
2023                                       io_task->bhs_pa.u.a32.address_hi);
2024
2025         l_sg = sg;
2026         for (index = 0; (index < num_sg) && (index < 2); index++,
2027                                                          sg = sg_next(sg)) {
2028                 if (index == 0) {
2029                         sg_len = sg_dma_len(sg);
2030                         addr = (u64) sg_dma_address(sg);
2031                         AMAP_SET_BITS(struct amap_iscsi_wrb, sge0_addr_lo, pwrb,
2032                                                 ((u32)(addr & 0xFFFFFFFF)));
2033                         AMAP_SET_BITS(struct amap_iscsi_wrb, sge0_addr_hi, pwrb,
2034                                                         ((u32)(addr >> 32)));
2035                         AMAP_SET_BITS(struct amap_iscsi_wrb, sge0_len, pwrb,
2036                                                         sg_len);
2037                         sge_len = sg_len;
2038                 } else {
2039                         AMAP_SET_BITS(struct amap_iscsi_wrb, sge1_r2t_offset,
2040                                                         pwrb, sge_len);
2041                         sg_len = sg_dma_len(sg);
2042                         addr = (u64) sg_dma_address(sg);
2043                         AMAP_SET_BITS(struct amap_iscsi_wrb, sge1_addr_lo, pwrb,
2044                                                 ((u32)(addr & 0xFFFFFFFF)));
2045                         AMAP_SET_BITS(struct amap_iscsi_wrb, sge1_addr_hi, pwrb,
2046                                                         ((u32)(addr >> 32)));
2047                         AMAP_SET_BITS(struct amap_iscsi_wrb, sge1_len, pwrb,
2048                                                         sg_len);
2049                 }
2050         }
2051         psgl = (struct iscsi_sge *)io_task->psgl_handle->pfrag;
2052         memset(psgl, 0, sizeof(*psgl) * BE2_SGE);
2053
2054         AMAP_SET_BITS(struct amap_iscsi_sge, len, psgl, io_task->bhs_len - 2);
2055
2056         AMAP_SET_BITS(struct amap_iscsi_sge, addr_hi, psgl,
2057                         io_task->bhs_pa.u.a32.address_hi);
2058         AMAP_SET_BITS(struct amap_iscsi_sge, addr_lo, psgl,
2059                         io_task->bhs_pa.u.a32.address_lo);
2060
2061         if (num_sg == 1) {
2062                 AMAP_SET_BITS(struct amap_iscsi_wrb, sge0_last, pwrb,
2063                                                                 1);
2064                 AMAP_SET_BITS(struct amap_iscsi_wrb, sge1_last, pwrb,
2065                                                                 0);
2066         } else if (num_sg == 2) {
2067                 AMAP_SET_BITS(struct amap_iscsi_wrb, sge0_last, pwrb,
2068                                                                 0);
2069                 AMAP_SET_BITS(struct amap_iscsi_wrb, sge1_last, pwrb,
2070                                                                 1);
2071         } else {
2072                 AMAP_SET_BITS(struct amap_iscsi_wrb, sge0_last, pwrb,
2073                                                                 0);
2074                 AMAP_SET_BITS(struct amap_iscsi_wrb, sge1_last, pwrb,
2075                                                                 0);
2076         }
2077         sg = l_sg;
2078         psgl++;
2079         psgl++;
2080         offset = 0;
2081         for (index = 0; index < num_sg; index++, sg = sg_next(sg), psgl++) {
2082                 sg_len = sg_dma_len(sg);
2083                 addr = (u64) sg_dma_address(sg);
2084                 AMAP_SET_BITS(struct amap_iscsi_sge, addr_lo, psgl,
2085                                                 (addr & 0xFFFFFFFF));
2086                 AMAP_SET_BITS(struct amap_iscsi_sge, addr_hi, psgl,
2087                                                 (addr >> 32));
2088                 AMAP_SET_BITS(struct amap_iscsi_sge, len, psgl, sg_len);
2089                 AMAP_SET_BITS(struct amap_iscsi_sge, sge_offset, psgl, offset);
2090                 AMAP_SET_BITS(struct amap_iscsi_sge, last_sge, psgl, 0);
2091                 offset += sg_len;
2092         }
2093         psgl--;
2094         AMAP_SET_BITS(struct amap_iscsi_sge, last_sge, psgl, 1);
2095 }
2096
2097 static void hwi_write_buffer(struct iscsi_wrb *pwrb, struct iscsi_task *task)
2098 {
2099         struct iscsi_sge *psgl;
2100         unsigned long long addr;
2101         struct beiscsi_io_task *io_task = task->dd_data;
2102         struct beiscsi_conn *beiscsi_conn = io_task->conn;
2103         struct beiscsi_hba *phba = beiscsi_conn->phba;
2104
2105         io_task->bhs_len = sizeof(struct be_nonio_bhs) - 2;
2106         AMAP_SET_BITS(struct amap_iscsi_wrb, iscsi_bhs_addr_lo, pwrb,
2107                                 io_task->bhs_pa.u.a32.address_lo);
2108         AMAP_SET_BITS(struct amap_iscsi_wrb, iscsi_bhs_addr_hi, pwrb,
2109                                 io_task->bhs_pa.u.a32.address_hi);
2110
2111         if (task->data) {
2112                 if (task->data_count) {
2113                         AMAP_SET_BITS(struct amap_iscsi_wrb, dsp, pwrb, 1);
2114                         addr = (u64) pci_map_single(phba->pcidev,
2115                                                     task->data,
2116                                                     task->data_count, 1);
2117                 } else {
2118                         AMAP_SET_BITS(struct amap_iscsi_wrb, dsp, pwrb, 0);
2119                         addr = 0;
2120                 }
2121                 AMAP_SET_BITS(struct amap_iscsi_wrb, sge0_addr_lo, pwrb,
2122                                                 ((u32)(addr & 0xFFFFFFFF)));
2123                 AMAP_SET_BITS(struct amap_iscsi_wrb, sge0_addr_hi, pwrb,
2124                                                 ((u32)(addr >> 32)));
2125                 AMAP_SET_BITS(struct amap_iscsi_wrb, sge0_len, pwrb,
2126                                                 task->data_count);
2127
2128                 AMAP_SET_BITS(struct amap_iscsi_wrb, sge0_last, pwrb, 1);
2129         } else {
2130                 AMAP_SET_BITS(struct amap_iscsi_wrb, dsp, pwrb, 0);
2131                 addr = 0;
2132         }
2133
2134         psgl = (struct iscsi_sge *)io_task->psgl_handle->pfrag;
2135
2136         AMAP_SET_BITS(struct amap_iscsi_sge, len, psgl, io_task->bhs_len);
2137
2138         AMAP_SET_BITS(struct amap_iscsi_sge, addr_hi, psgl,
2139                       io_task->bhs_pa.u.a32.address_hi);
2140         AMAP_SET_BITS(struct amap_iscsi_sge, addr_lo, psgl,
2141                       io_task->bhs_pa.u.a32.address_lo);
2142         if (task->data) {
2143                 psgl++;
2144                 AMAP_SET_BITS(struct amap_iscsi_sge, addr_hi, psgl, 0);
2145                 AMAP_SET_BITS(struct amap_iscsi_sge, addr_lo, psgl, 0);
2146                 AMAP_SET_BITS(struct amap_iscsi_sge, len, psgl, 0);
2147                 AMAP_SET_BITS(struct amap_iscsi_sge, sge_offset, psgl, 0);
2148                 AMAP_SET_BITS(struct amap_iscsi_sge, rsvd0, psgl, 0);
2149                 AMAP_SET_BITS(struct amap_iscsi_sge, last_sge, psgl, 0);
2150
2151                 psgl++;
2152                 if (task->data) {
2153                         AMAP_SET_BITS(struct amap_iscsi_sge, addr_lo, psgl,
2154                                                 ((u32)(addr & 0xFFFFFFFF)));
2155                         AMAP_SET_BITS(struct amap_iscsi_sge, addr_hi, psgl,
2156                                                 ((u32)(addr >> 32)));
2157                 }
2158                 AMAP_SET_BITS(struct amap_iscsi_sge, len, psgl, 0x106);
2159         }
2160         AMAP_SET_BITS(struct amap_iscsi_sge, last_sge, psgl, 1);
2161 }
2162
2163 static void beiscsi_find_mem_req(struct beiscsi_hba *phba)
2164 {
2165         unsigned int num_cq_pages, num_async_pdu_buf_pages;
2166         unsigned int num_async_pdu_data_pages, wrb_sz_per_cxn;
2167         unsigned int num_async_pdu_buf_sgl_pages, num_async_pdu_data_sgl_pages;
2168
2169         num_cq_pages = PAGES_REQUIRED(phba->params.num_cq_entries * \
2170                                       sizeof(struct sol_cqe));
2171         num_async_pdu_buf_pages =
2172                         PAGES_REQUIRED(phba->params.asyncpdus_per_ctrl * \
2173                                        phba->params.defpdu_hdr_sz);
2174         num_async_pdu_buf_sgl_pages =
2175                         PAGES_REQUIRED(phba->params.asyncpdus_per_ctrl * \
2176                                        sizeof(struct phys_addr));
2177         num_async_pdu_data_pages =
2178                         PAGES_REQUIRED(phba->params.asyncpdus_per_ctrl * \
2179                                        phba->params.defpdu_data_sz);
2180         num_async_pdu_data_sgl_pages =
2181                         PAGES_REQUIRED(phba->params.asyncpdus_per_ctrl * \
2182                                        sizeof(struct phys_addr));
2183
2184         phba->params.hwi_ws_sz = sizeof(struct hwi_controller);
2185
2186         phba->mem_req[ISCSI_MEM_GLOBAL_HEADER] = 2 *
2187                                                  BE_ISCSI_PDU_HEADER_SIZE;
2188         phba->mem_req[HWI_MEM_ADDN_CONTEXT] =
2189                                             sizeof(struct hwi_context_memory);
2190
2191
2192         phba->mem_req[HWI_MEM_WRB] = sizeof(struct iscsi_wrb)
2193             * (phba->params.wrbs_per_cxn)
2194             * phba->params.cxns_per_ctrl;
2195         wrb_sz_per_cxn =  sizeof(struct wrb_handle) *
2196                                  (phba->params.wrbs_per_cxn);
2197         phba->mem_req[HWI_MEM_WRBH] = roundup_pow_of_two((wrb_sz_per_cxn) *
2198                                 phba->params.cxns_per_ctrl);
2199
2200         phba->mem_req[HWI_MEM_SGLH] = sizeof(struct sgl_handle) *
2201                 phba->params.icds_per_ctrl;
2202         phba->mem_req[HWI_MEM_SGE] = sizeof(struct iscsi_sge) *
2203                 phba->params.num_sge_per_io * phba->params.icds_per_ctrl;
2204
2205         phba->mem_req[HWI_MEM_ASYNC_HEADER_BUF] =
2206                 num_async_pdu_buf_pages * PAGE_SIZE;
2207         phba->mem_req[HWI_MEM_ASYNC_DATA_BUF] =
2208                 num_async_pdu_data_pages * PAGE_SIZE;
2209         phba->mem_req[HWI_MEM_ASYNC_HEADER_RING] =
2210                 num_async_pdu_buf_sgl_pages * PAGE_SIZE;
2211         phba->mem_req[HWI_MEM_ASYNC_DATA_RING] =
2212                 num_async_pdu_data_sgl_pages * PAGE_SIZE;
2213         phba->mem_req[HWI_MEM_ASYNC_HEADER_HANDLE] =
2214                 phba->params.asyncpdus_per_ctrl *
2215                 sizeof(struct async_pdu_handle);
2216         phba->mem_req[HWI_MEM_ASYNC_DATA_HANDLE] =
2217                 phba->params.asyncpdus_per_ctrl *
2218                 sizeof(struct async_pdu_handle);
2219         phba->mem_req[HWI_MEM_ASYNC_PDU_CONTEXT] =
2220                 sizeof(struct hwi_async_pdu_context) +
2221                 (phba->params.cxns_per_ctrl * sizeof(struct hwi_async_entry));
2222 }
2223
2224 static int beiscsi_alloc_mem(struct beiscsi_hba *phba)
2225 {
2226         struct be_mem_descriptor *mem_descr;
2227         dma_addr_t bus_add;
2228         struct mem_array *mem_arr, *mem_arr_orig;
2229         unsigned int i, j, alloc_size, curr_alloc_size;
2230
2231         phba->phwi_ctrlr = kmalloc(phba->params.hwi_ws_sz, GFP_KERNEL);
2232         if (!phba->phwi_ctrlr)
2233                 return -ENOMEM;
2234
2235         phba->init_mem = kcalloc(SE_MEM_MAX, sizeof(*mem_descr),
2236                                  GFP_KERNEL);
2237         if (!phba->init_mem) {
2238                 kfree(phba->phwi_ctrlr);
2239                 return -ENOMEM;
2240         }
2241
2242         mem_arr_orig = kmalloc(sizeof(*mem_arr_orig) * BEISCSI_MAX_FRAGS_INIT,
2243                                GFP_KERNEL);
2244         if (!mem_arr_orig) {
2245                 kfree(phba->init_mem);
2246                 kfree(phba->phwi_ctrlr);
2247                 return -ENOMEM;
2248         }
2249
2250         mem_descr = phba->init_mem;
2251         for (i = 0; i < SE_MEM_MAX; i++) {
2252                 j = 0;
2253                 mem_arr = mem_arr_orig;
2254                 alloc_size = phba->mem_req[i];
2255                 memset(mem_arr, 0, sizeof(struct mem_array) *
2256                        BEISCSI_MAX_FRAGS_INIT);
2257                 curr_alloc_size = min(be_max_phys_size * 1024, alloc_size);
2258                 do {
2259                         mem_arr->virtual_address = pci_alloc_consistent(
2260                                                         phba->pcidev,
2261                                                         curr_alloc_size,
2262                                                         &bus_add);
2263                         if (!mem_arr->virtual_address) {
2264                                 if (curr_alloc_size <= BE_MIN_MEM_SIZE)
2265                                         goto free_mem;
2266                                 if (curr_alloc_size -
2267                                         rounddown_pow_of_two(curr_alloc_size))
2268                                         curr_alloc_size = rounddown_pow_of_two
2269                                                              (curr_alloc_size);
2270                                 else
2271                                         curr_alloc_size = curr_alloc_size / 2;
2272                         } else {
2273                                 mem_arr->bus_address.u.
2274                                     a64.address = (__u64) bus_add;
2275                                 mem_arr->size = curr_alloc_size;
2276                                 alloc_size -= curr_alloc_size;
2277                                 curr_alloc_size = min(be_max_phys_size *
2278                                                       1024, alloc_size);
2279                                 j++;
2280                                 mem_arr++;
2281                         }
2282                 } while (alloc_size);
2283                 mem_descr->num_elements = j;
2284                 mem_descr->size_in_bytes = phba->mem_req[i];
2285                 mem_descr->mem_array = kmalloc(sizeof(*mem_arr) * j,
2286                                                GFP_KERNEL);
2287                 if (!mem_descr->mem_array)
2288                         goto free_mem;
2289
2290                 memcpy(mem_descr->mem_array, mem_arr_orig,
2291                        sizeof(struct mem_array) * j);
2292                 mem_descr++;
2293         }
2294         kfree(mem_arr_orig);
2295         return 0;
2296 free_mem:
2297         mem_descr->num_elements = j;
2298         while ((i) || (j)) {
2299                 for (j = mem_descr->num_elements; j > 0; j--) {
2300                         pci_free_consistent(phba->pcidev,
2301                                             mem_descr->mem_array[j - 1].size,
2302                                             mem_descr->mem_array[j - 1].
2303                                             virtual_address,
2304                                             (unsigned long)mem_descr->
2305                                             mem_array[j - 1].
2306                                             bus_address.u.a64.address);
2307                 }
2308                 if (i) {
2309                         i--;
2310                         kfree(mem_descr->mem_array);
2311                         mem_descr--;
2312                 }
2313         }
2314         kfree(mem_arr_orig);
2315         kfree(phba->init_mem);
2316         kfree(phba->phwi_ctrlr);
2317         return -ENOMEM;
2318 }
2319
2320 static int beiscsi_get_memory(struct beiscsi_hba *phba)
2321 {
2322         beiscsi_find_mem_req(phba);
2323         return beiscsi_alloc_mem(phba);
2324 }
2325
2326 static void iscsi_init_global_templates(struct beiscsi_hba *phba)
2327 {
2328         struct pdu_data_out *pdata_out;
2329         struct pdu_nop_out *pnop_out;
2330         struct be_mem_descriptor *mem_descr;
2331
2332         mem_descr = phba->init_mem;
2333         mem_descr += ISCSI_MEM_GLOBAL_HEADER;
2334         pdata_out =
2335             (struct pdu_data_out *)mem_descr->mem_array[0].virtual_address;
2336         memset(pdata_out, 0, BE_ISCSI_PDU_HEADER_SIZE);
2337
2338         AMAP_SET_BITS(struct amap_pdu_data_out, opcode, pdata_out,
2339                       IIOC_SCSI_DATA);
2340
2341         pnop_out =
2342             (struct pdu_nop_out *)((unsigned char *)mem_descr->mem_array[0].
2343                                    virtual_address + BE_ISCSI_PDU_HEADER_SIZE);
2344
2345         memset(pnop_out, 0, BE_ISCSI_PDU_HEADER_SIZE);
2346         AMAP_SET_BITS(struct amap_pdu_nop_out, ttt, pnop_out, 0xFFFFFFFF);
2347         AMAP_SET_BITS(struct amap_pdu_nop_out, f_bit, pnop_out, 1);
2348         AMAP_SET_BITS(struct amap_pdu_nop_out, i_bit, pnop_out, 0);
2349 }
2350
2351 static void beiscsi_init_wrb_handle(struct beiscsi_hba *phba)
2352 {
2353         struct be_mem_descriptor *mem_descr_wrbh, *mem_descr_wrb;
2354         struct wrb_handle *pwrb_handle;
2355         struct hwi_controller *phwi_ctrlr;
2356         struct hwi_wrb_context *pwrb_context;
2357         struct iscsi_wrb *pwrb;
2358         unsigned int num_cxn_wrbh;
2359         unsigned int num_cxn_wrb, j, idx, index;
2360
2361         mem_descr_wrbh = phba->init_mem;
2362         mem_descr_wrbh += HWI_MEM_WRBH;
2363
2364         mem_descr_wrb = phba->init_mem;
2365         mem_descr_wrb += HWI_MEM_WRB;
2366
2367         idx = 0;
2368         pwrb_handle = mem_descr_wrbh->mem_array[idx].virtual_address;
2369         num_cxn_wrbh = ((mem_descr_wrbh->mem_array[idx].size) /
2370                         ((sizeof(struct wrb_handle)) *
2371                          phba->params.wrbs_per_cxn));
2372         phwi_ctrlr = phba->phwi_ctrlr;
2373
2374         for (index = 0; index < phba->params.cxns_per_ctrl * 2; index += 2) {
2375                 pwrb_context = &phwi_ctrlr->wrb_context[index];
2376                 pwrb_context->pwrb_handle_base =
2377                                 kzalloc(sizeof(struct wrb_handle *) *
2378                                         phba->params.wrbs_per_cxn, GFP_KERNEL);
2379                 pwrb_context->pwrb_handle_basestd =
2380                                 kzalloc(sizeof(struct wrb_handle *) *
2381                                         phba->params.wrbs_per_cxn, GFP_KERNEL);
2382                 if (num_cxn_wrbh) {
2383                         pwrb_context->alloc_index = 0;
2384                         pwrb_context->wrb_handles_available = 0;
2385                         for (j = 0; j < phba->params.wrbs_per_cxn; j++) {
2386                                 pwrb_context->pwrb_handle_base[j] = pwrb_handle;
2387                                 pwrb_context->pwrb_handle_basestd[j] =
2388                                                                 pwrb_handle;
2389                                 pwrb_context->wrb_handles_available++;
2390                                 pwrb_handle->wrb_index = j;
2391                                 pwrb_handle++;
2392                         }
2393                         pwrb_context->free_index = 0;
2394                         num_cxn_wrbh--;
2395                 } else {
2396                         idx++;
2397                         pwrb_handle =
2398                             mem_descr_wrbh->mem_array[idx].virtual_address;
2399                         num_cxn_wrbh =
2400                             ((mem_descr_wrbh->mem_array[idx].size) /
2401                              ((sizeof(struct wrb_handle)) *
2402                               phba->params.wrbs_per_cxn));
2403                         pwrb_context->alloc_index = 0;
2404                         for (j = 0; j < phba->params.wrbs_per_cxn; j++) {
2405                                 pwrb_context->pwrb_handle_base[j] = pwrb_handle;
2406                                 pwrb_context->pwrb_handle_basestd[j] =
2407                                     pwrb_handle;
2408                                 pwrb_context->wrb_handles_available++;
2409                                 pwrb_handle->wrb_index = j;
2410                                 pwrb_handle++;
2411                         }
2412                         pwrb_context->free_index = 0;
2413                         num_cxn_wrbh--;
2414                 }
2415         }
2416         idx = 0;
2417         pwrb = mem_descr_wrb->mem_array[idx].virtual_address;
2418         num_cxn_wrb = (mem_descr_wrb->mem_array[idx].size) /
2419                       ((sizeof(struct iscsi_wrb) *
2420                         phba->params.wrbs_per_cxn));
2421         for (index = 0; index < phba->params.cxns_per_ctrl * 2; index += 2) {
2422                 pwrb_context = &phwi_ctrlr->wrb_context[index];
2423                 if (num_cxn_wrb) {
2424                         for (j = 0; j < phba->params.wrbs_per_cxn; j++) {
2425                                 pwrb_handle = pwrb_context->pwrb_handle_base[j];
2426                                 pwrb_handle->pwrb = pwrb;
2427                                 pwrb++;
2428                         }
2429                         num_cxn_wrb--;
2430                 } else {
2431                         idx++;
2432                         pwrb = mem_descr_wrb->mem_array[idx].virtual_address;
2433                         num_cxn_wrb = (mem_descr_wrb->mem_array[idx].size) /
2434                                       ((sizeof(struct iscsi_wrb) *
2435                                         phba->params.wrbs_per_cxn));
2436                         for (j = 0; j < phba->params.wrbs_per_cxn; j++) {
2437                                 pwrb_handle = pwrb_context->pwrb_handle_base[j];
2438                                 pwrb_handle->pwrb = pwrb;
2439                                 pwrb++;
2440                         }
2441                         num_cxn_wrb--;
2442                 }
2443         }
2444 }
2445
2446 static void hwi_init_async_pdu_ctx(struct beiscsi_hba *phba)
2447 {
2448         struct hwi_controller *phwi_ctrlr;
2449         struct hba_parameters *p = &phba->params;
2450         struct hwi_async_pdu_context *pasync_ctx;
2451         struct async_pdu_handle *pasync_header_h, *pasync_data_h;
2452         unsigned int index;
2453         struct be_mem_descriptor *mem_descr;
2454
2455         mem_descr = (struct be_mem_descriptor *)phba->init_mem;
2456         mem_descr += HWI_MEM_ASYNC_PDU_CONTEXT;
2457
2458         phwi_ctrlr = phba->phwi_ctrlr;
2459         phwi_ctrlr->phwi_ctxt->pasync_ctx = (struct hwi_async_pdu_context *)
2460                                 mem_descr->mem_array[0].virtual_address;
2461         pasync_ctx = phwi_ctrlr->phwi_ctxt->pasync_ctx;
2462         memset(pasync_ctx, 0, sizeof(*pasync_ctx));
2463
2464         pasync_ctx->async_header.num_entries = p->asyncpdus_per_ctrl;
2465         pasync_ctx->async_header.buffer_size = p->defpdu_hdr_sz;
2466         pasync_ctx->async_data.buffer_size = p->defpdu_data_sz;
2467         pasync_ctx->async_data.num_entries = p->asyncpdus_per_ctrl;
2468
2469         mem_descr = (struct be_mem_descriptor *)phba->init_mem;
2470         mem_descr += HWI_MEM_ASYNC_HEADER_BUF;
2471         if (mem_descr->mem_array[0].virtual_address) {
2472                 SE_DEBUG(DBG_LVL_8,
2473                          "hwi_init_async_pdu_ctx HWI_MEM_ASYNC_HEADER_BUF"
2474                          "va=%p\n", mem_descr->mem_array[0].virtual_address);
2475         } else
2476                 shost_printk(KERN_WARNING, phba->shost,
2477                              "No Virtual address\n");
2478
2479         pasync_ctx->async_header.va_base =
2480                         mem_descr->mem_array[0].virtual_address;
2481
2482         pasync_ctx->async_header.pa_base.u.a64.address =
2483                         mem_descr->mem_array[0].bus_address.u.a64.address;
2484
2485         mem_descr = (struct be_mem_descriptor *)phba->init_mem;
2486         mem_descr += HWI_MEM_ASYNC_HEADER_RING;
2487         if (mem_descr->mem_array[0].virtual_address) {
2488                 SE_DEBUG(DBG_LVL_8,
2489                          "hwi_init_async_pdu_ctx HWI_MEM_ASYNC_HEADER_RING"
2490                          "va=%p\n", mem_descr->mem_array[0].virtual_address);
2491         } else
2492                 shost_printk(KERN_WARNING, phba->shost,
2493                             "No Virtual address\n");
2494         pasync_ctx->async_header.ring_base =
2495                         mem_descr->mem_array[0].virtual_address;
2496
2497         mem_descr = (struct be_mem_descriptor *)phba->init_mem;
2498         mem_descr += HWI_MEM_ASYNC_HEADER_HANDLE;
2499         if (mem_descr->mem_array[0].virtual_address) {
2500                 SE_DEBUG(DBG_LVL_8,
2501                          "hwi_init_async_pdu_ctx HWI_MEM_ASYNC_HEADER_HANDLE"
2502                          "va=%p\n", mem_descr->mem_array[0].virtual_address);
2503         } else
2504                 shost_printk(KERN_WARNING, phba->shost,
2505                             "No Virtual address\n");
2506
2507         pasync_ctx->async_header.handle_base =
2508                         mem_descr->mem_array[0].virtual_address;
2509         pasync_ctx->async_header.writables = 0;
2510         INIT_LIST_HEAD(&pasync_ctx->async_header.free_list);
2511
2512         mem_descr = (struct be_mem_descriptor *)phba->init_mem;
2513         mem_descr += HWI_MEM_ASYNC_DATA_BUF;
2514         if (mem_descr->mem_array[0].virtual_address) {
2515                 SE_DEBUG(DBG_LVL_8,
2516                          "hwi_init_async_pdu_ctx HWI_MEM_ASYNC_DATA_BUF"
2517                          "va=%p\n", mem_descr->mem_array[0].virtual_address);
2518         } else
2519                 shost_printk(KERN_WARNING, phba->shost,
2520                             "No Virtual address\n");
2521         pasync_ctx->async_data.va_base =
2522                         mem_descr->mem_array[0].virtual_address;
2523         pasync_ctx->async_data.pa_base.u.a64.address =
2524                         mem_descr->mem_array[0].bus_address.u.a64.address;
2525
2526         mem_descr = (struct be_mem_descriptor *)phba->init_mem;
2527         mem_descr += HWI_MEM_ASYNC_DATA_RING;
2528         if (mem_descr->mem_array[0].virtual_address) {
2529                 SE_DEBUG(DBG_LVL_8,
2530                          "hwi_init_async_pdu_ctx HWI_MEM_ASYNC_DATA_RING"
2531                          "va=%p\n", mem_descr->mem_array[0].virtual_address);
2532         } else
2533                 shost_printk(KERN_WARNING, phba->shost,
2534                              "No Virtual address\n");
2535
2536         pasync_ctx->async_data.ring_base =
2537                         mem_descr->mem_array[0].virtual_address;
2538
2539         mem_descr = (struct be_mem_descriptor *)phba->init_mem;
2540         mem_descr += HWI_MEM_ASYNC_DATA_HANDLE;
2541         if (!mem_descr->mem_array[0].virtual_address)
2542                 shost_printk(KERN_WARNING, phba->shost,
2543                             "No Virtual address\n");
2544
2545         pasync_ctx->async_data.handle_base =
2546                         mem_descr->mem_array[0].virtual_address;
2547         pasync_ctx->async_data.writables = 0;
2548         INIT_LIST_HEAD(&pasync_ctx->async_data.free_list);
2549
2550         pasync_header_h =
2551                 (struct async_pdu_handle *)pasync_ctx->async_header.handle_base;
2552         pasync_data_h =
2553                 (struct async_pdu_handle *)pasync_ctx->async_data.handle_base;
2554
2555         for (index = 0; index < p->asyncpdus_per_ctrl; index++) {
2556                 pasync_header_h->cri = -1;
2557                 pasync_header_h->index = (char)index;
2558                 INIT_LIST_HEAD(&pasync_header_h->link);
2559                 pasync_header_h->pbuffer =
2560                         (void *)((unsigned long)
2561                         (pasync_ctx->async_header.va_base) +
2562                         (p->defpdu_hdr_sz * index));
2563
2564                 pasync_header_h->pa.u.a64.address =
2565                         pasync_ctx->async_header.pa_base.u.a64.address +
2566                         (p->defpdu_hdr_sz * index);
2567
2568                 list_add_tail(&pasync_header_h->link,
2569                                 &pasync_ctx->async_header.free_list);
2570                 pasync_header_h++;
2571                 pasync_ctx->async_header.free_entries++;
2572                 pasync_ctx->async_header.writables++;
2573
2574                 INIT_LIST_HEAD(&pasync_ctx->async_entry[index].wait_queue.list);
2575                 INIT_LIST_HEAD(&pasync_ctx->async_entry[index].
2576                                header_busy_list);
2577                 pasync_data_h->cri = -1;
2578                 pasync_data_h->index = (char)index;
2579                 INIT_LIST_HEAD(&pasync_data_h->link);
2580                 pasync_data_h->pbuffer =
2581                         (void *)((unsigned long)
2582                         (pasync_ctx->async_data.va_base) +
2583                         (p->defpdu_data_sz * index));
2584
2585                 pasync_data_h->pa.u.a64.address =
2586                     pasync_ctx->async_data.pa_base.u.a64.address +
2587                     (p->defpdu_data_sz * index);
2588
2589                 list_add_tail(&pasync_data_h->link,
2590                               &pasync_ctx->async_data.free_list);
2591                 pasync_data_h++;
2592                 pasync_ctx->async_data.free_entries++;
2593                 pasync_ctx->async_data.writables++;
2594
2595                 INIT_LIST_HEAD(&pasync_ctx->async_entry[index].data_busy_list);
2596         }
2597
2598         pasync_ctx->async_header.host_write_ptr = 0;
2599         pasync_ctx->async_header.ep_read_ptr = -1;
2600         pasync_ctx->async_data.host_write_ptr = 0;
2601         pasync_ctx->async_data.ep_read_ptr = -1;
2602 }
2603
2604 static int
2605 be_sgl_create_contiguous(void *virtual_address,
2606                          u64 physical_address, u32 length,
2607                          struct be_dma_mem *sgl)
2608 {
2609         WARN_ON(!virtual_address);
2610         WARN_ON(!physical_address);
2611         WARN_ON(!length > 0);
2612         WARN_ON(!sgl);
2613
2614         sgl->va = virtual_address;
2615         sgl->dma = (unsigned long)physical_address;
2616         sgl->size = length;
2617
2618         return 0;
2619 }
2620
2621 static void be_sgl_destroy_contiguous(struct be_dma_mem *sgl)
2622 {
2623         memset(sgl, 0, sizeof(*sgl));
2624 }
2625
2626 static void
2627 hwi_build_be_sgl_arr(struct beiscsi_hba *phba,
2628                      struct mem_array *pmem, struct be_dma_mem *sgl)
2629 {
2630         if (sgl->va)
2631                 be_sgl_destroy_contiguous(sgl);
2632
2633         be_sgl_create_contiguous(pmem->virtual_address,
2634                                  pmem->bus_address.u.a64.address,
2635                                  pmem->size, sgl);
2636 }
2637
2638 static void
2639 hwi_build_be_sgl_by_offset(struct beiscsi_hba *phba,
2640                            struct mem_array *pmem, struct be_dma_mem *sgl)
2641 {
2642         if (sgl->va)
2643                 be_sgl_destroy_contiguous(sgl);
2644
2645         be_sgl_create_contiguous((unsigned char *)pmem->virtual_address,
2646                                  pmem->bus_address.u.a64.address,
2647                                  pmem->size, sgl);
2648 }
2649
2650 static int be_fill_queue(struct be_queue_info *q,
2651                 u16 len, u16 entry_size, void *vaddress)
2652 {
2653         struct be_dma_mem *mem = &q->dma_mem;
2654
2655         memset(q, 0, sizeof(*q));
2656         q->len = len;
2657         q->entry_size = entry_size;
2658         mem->size = len * entry_size;
2659         mem->va = vaddress;
2660         if (!mem->va)
2661                 return -ENOMEM;
2662         memset(mem->va, 0, mem->size);
2663         return 0;
2664 }
2665
2666 static int beiscsi_create_eqs(struct beiscsi_hba *phba,
2667                              struct hwi_context_memory *phwi_context)
2668 {
2669         unsigned int i, num_eq_pages;
2670         int ret, eq_for_mcc;
2671         struct be_queue_info *eq;
2672         struct be_dma_mem *mem;
2673         void *eq_vaddress;
2674         dma_addr_t paddr;
2675
2676         num_eq_pages = PAGES_REQUIRED(phba->params.num_eq_entries * \
2677                                       sizeof(struct be_eq_entry));
2678
2679         if (phba->msix_enabled)
2680                 eq_for_mcc = 1;
2681         else
2682                 eq_for_mcc = 0;
2683         for (i = 0; i < (phba->num_cpus + eq_for_mcc); i++) {
2684                 eq = &phwi_context->be_eq[i].q;
2685                 mem = &eq->dma_mem;
2686                 phwi_context->be_eq[i].phba = phba;
2687                 eq_vaddress = pci_alloc_consistent(phba->pcidev,
2688                                                      num_eq_pages * PAGE_SIZE,
2689                                                      &paddr);
2690                 if (!eq_vaddress)
2691                         goto create_eq_error;
2692
2693                 mem->va = eq_vaddress;
2694                 ret = be_fill_queue(eq, phba->params.num_eq_entries,
2695                                     sizeof(struct be_eq_entry), eq_vaddress);
2696                 if (ret) {
2697                         shost_printk(KERN_ERR, phba->shost,
2698                                      "be_fill_queue Failed for EQ\n");
2699                         goto create_eq_error;
2700                 }
2701
2702                 mem->dma = paddr;
2703                 ret = beiscsi_cmd_eq_create(&phba->ctrl, eq,
2704                                             phwi_context->cur_eqd);
2705                 if (ret) {
2706                         shost_printk(KERN_ERR, phba->shost,
2707                                      "beiscsi_cmd_eq_create"
2708                                      "Failedfor EQ\n");
2709                         goto create_eq_error;
2710                 }
2711                 SE_DEBUG(DBG_LVL_8, "eqid = %d\n", phwi_context->be_eq[i].q.id);
2712         }
2713         return 0;
2714 create_eq_error:
2715         for (i = 0; i < (phba->num_cpus + 1); i++) {
2716                 eq = &phwi_context->be_eq[i].q;
2717                 mem = &eq->dma_mem;
2718                 if (mem->va)
2719                         pci_free_consistent(phba->pcidev, num_eq_pages
2720                                             * PAGE_SIZE,
2721                                             mem->va, mem->dma);
2722         }
2723         return ret;
2724 }
2725
2726 static int beiscsi_create_cqs(struct beiscsi_hba *phba,
2727                              struct hwi_context_memory *phwi_context)
2728 {
2729         unsigned int i, num_cq_pages;
2730         int ret;
2731         struct be_queue_info *cq, *eq;
2732         struct be_dma_mem *mem;
2733         struct be_eq_obj *pbe_eq;
2734         void *cq_vaddress;
2735         dma_addr_t paddr;
2736
2737         num_cq_pages = PAGES_REQUIRED(phba->params.num_cq_entries * \
2738                                       sizeof(struct sol_cqe));
2739
2740         for (i = 0; i < phba->num_cpus; i++) {
2741                 cq = &phwi_context->be_cq[i];
2742                 eq = &phwi_context->be_eq[i].q;
2743                 pbe_eq = &phwi_context->be_eq[i];
2744                 pbe_eq->cq = cq;
2745                 pbe_eq->phba = phba;
2746                 mem = &cq->dma_mem;
2747                 cq_vaddress = pci_alloc_consistent(phba->pcidev,
2748                                                      num_cq_pages * PAGE_SIZE,
2749                                                      &paddr);
2750                 if (!cq_vaddress)
2751                         goto create_cq_error;
2752                 ret = be_fill_queue(cq, phba->params.num_cq_entries,
2753                                     sizeof(struct sol_cqe), cq_vaddress);
2754                 if (ret) {
2755                         shost_printk(KERN_ERR, phba->shost,
2756                                      "be_fill_queue Failed for ISCSI CQ\n");
2757                         goto create_cq_error;
2758                 }
2759
2760                 mem->dma = paddr;
2761                 ret = beiscsi_cmd_cq_create(&phba->ctrl, cq, eq, false,
2762                                             false, 0);
2763                 if (ret) {
2764                         shost_printk(KERN_ERR, phba->shost,
2765                                      "beiscsi_cmd_eq_create"
2766                                      "Failed for ISCSI CQ\n");
2767                         goto create_cq_error;
2768                 }
2769                 SE_DEBUG(DBG_LVL_8, "iscsi cq_id is %d for eq_id %d\n",
2770                                                  cq->id, eq->id);
2771                 SE_DEBUG(DBG_LVL_8, "ISCSI CQ CREATED\n");
2772         }
2773         return 0;
2774
2775 create_cq_error:
2776         for (i = 0; i < phba->num_cpus; i++) {
2777                 cq = &phwi_context->be_cq[i];
2778                 mem = &cq->dma_mem;
2779                 if (mem->va)
2780                         pci_free_consistent(phba->pcidev, num_cq_pages
2781                                             * PAGE_SIZE,
2782                                             mem->va, mem->dma);
2783         }
2784         return ret;
2785
2786 }
2787
2788 static int
2789 beiscsi_create_def_hdr(struct beiscsi_hba *phba,
2790                        struct hwi_context_memory *phwi_context,
2791                        struct hwi_controller *phwi_ctrlr,
2792                        unsigned int def_pdu_ring_sz)
2793 {
2794         unsigned int idx;
2795         int ret;
2796         struct be_queue_info *dq, *cq;
2797         struct be_dma_mem *mem;
2798         struct be_mem_descriptor *mem_descr;
2799         void *dq_vaddress;
2800
2801         idx = 0;
2802         dq = &phwi_context->be_def_hdrq;
2803         cq = &phwi_context->be_cq[0];
2804         mem = &dq->dma_mem;
2805         mem_descr = phba->init_mem;
2806         mem_descr += HWI_MEM_ASYNC_HEADER_RING;
2807         dq_vaddress = mem_descr->mem_array[idx].virtual_address;
2808         ret = be_fill_queue(dq, mem_descr->mem_array[0].size /
2809                             sizeof(struct phys_addr),
2810                             sizeof(struct phys_addr), dq_vaddress);
2811         if (ret) {
2812                 shost_printk(KERN_ERR, phba->shost,
2813                              "be_fill_queue Failed for DEF PDU HDR\n");
2814                 return ret;
2815         }
2816         mem->dma = (unsigned long)mem_descr->mem_array[idx].
2817                                   bus_address.u.a64.address;
2818         ret = be_cmd_create_default_pdu_queue(&phba->ctrl, cq, dq,
2819                                               def_pdu_ring_sz,
2820                                               phba->params.defpdu_hdr_sz);
2821         if (ret) {
2822                 shost_printk(KERN_ERR, phba->shost,
2823                              "be_cmd_create_default_pdu_queue Failed DEFHDR\n");
2824                 return ret;
2825         }
2826         phwi_ctrlr->default_pdu_hdr.id = phwi_context->be_def_hdrq.id;
2827         SE_DEBUG(DBG_LVL_8, "iscsi def pdu id is %d\n",
2828                  phwi_context->be_def_hdrq.id);
2829         hwi_post_async_buffers(phba, 1);
2830         return 0;
2831 }
2832
2833 static int
2834 beiscsi_create_def_data(struct beiscsi_hba *phba,
2835                         struct hwi_context_memory *phwi_context,
2836                         struct hwi_controller *phwi_ctrlr,
2837                         unsigned int def_pdu_ring_sz)
2838 {
2839         unsigned int idx;
2840         int ret;
2841         struct be_queue_info *dataq, *cq;
2842         struct be_dma_mem *mem;
2843         struct be_mem_descriptor *mem_descr;
2844         void *dq_vaddress;
2845
2846         idx = 0;
2847         dataq = &phwi_context->be_def_dataq;
2848         cq = &phwi_context->be_cq[0];
2849         mem = &dataq->dma_mem;
2850         mem_descr = phba->init_mem;
2851         mem_descr += HWI_MEM_ASYNC_DATA_RING;
2852         dq_vaddress = mem_descr->mem_array[idx].virtual_address;
2853         ret = be_fill_queue(dataq, mem_descr->mem_array[0].size /
2854                             sizeof(struct phys_addr),
2855                             sizeof(struct phys_addr), dq_vaddress);
2856         if (ret) {
2857                 shost_printk(KERN_ERR, phba->shost,
2858                              "be_fill_queue Failed for DEF PDU DATA\n");
2859                 return ret;
2860         }
2861         mem->dma = (unsigned long)mem_descr->mem_array[idx].
2862                                   bus_address.u.a64.address;
2863         ret = be_cmd_create_default_pdu_queue(&phba->ctrl, cq, dataq,
2864                                               def_pdu_ring_sz,
2865                                               phba->params.defpdu_data_sz);
2866         if (ret) {
2867                 shost_printk(KERN_ERR, phba->shost,
2868                              "be_cmd_create_default_pdu_queue Failed"
2869                              " for DEF PDU DATA\n");
2870                 return ret;
2871         }
2872         phwi_ctrlr->default_pdu_data.id = phwi_context->be_def_dataq.id;
2873         SE_DEBUG(DBG_LVL_8, "iscsi def data id is %d\n",
2874                  phwi_context->be_def_dataq.id);
2875         hwi_post_async_buffers(phba, 0);
2876         SE_DEBUG(DBG_LVL_8, "DEFAULT PDU DATA RING CREATED\n");
2877         return 0;
2878 }
2879
2880 static int
2881 beiscsi_post_pages(struct beiscsi_hba *phba)
2882 {
2883         struct be_mem_descriptor *mem_descr;
2884         struct mem_array *pm_arr;
2885         unsigned int page_offset, i;
2886         struct be_dma_mem sgl;
2887         int status;
2888
2889         mem_descr = phba->init_mem;
2890         mem_descr += HWI_MEM_SGE;
2891         pm_arr = mem_descr->mem_array;
2892
2893         page_offset = (sizeof(struct iscsi_sge) * phba->params.num_sge_per_io *
2894                         phba->fw_config.iscsi_icd_start) / PAGE_SIZE;
2895         for (i = 0; i < mem_descr->num_elements; i++) {
2896                 hwi_build_be_sgl_arr(phba, pm_arr, &sgl);
2897                 status = be_cmd_iscsi_post_sgl_pages(&phba->ctrl, &sgl,
2898                                                 page_offset,
2899                                                 (pm_arr->size / PAGE_SIZE));
2900                 page_offset += pm_arr->size / PAGE_SIZE;
2901                 if (status != 0) {
2902                         shost_printk(KERN_ERR, phba->shost,
2903                                      "post sgl failed.\n");
2904                         return status;
2905                 }
2906                 pm_arr++;
2907         }
2908         SE_DEBUG(DBG_LVL_8, "POSTED PAGES\n");
2909         return 0;
2910 }
2911
2912 static void be_queue_free(struct beiscsi_hba *phba, struct be_queue_info *q)
2913 {
2914         struct be_dma_mem *mem = &q->dma_mem;
2915         if (mem->va)
2916                 pci_free_consistent(phba->pcidev, mem->size,
2917                         mem->va, mem->dma);
2918 }
2919
2920 static int be_queue_alloc(struct beiscsi_hba *phba, struct be_queue_info *q,
2921                 u16 len, u16 entry_size)
2922 {
2923         struct be_dma_mem *mem = &q->dma_mem;
2924
2925         memset(q, 0, sizeof(*q));
2926         q->len = len;
2927         q->entry_size = entry_size;
2928         mem->size = len * entry_size;
2929         mem->va = pci_alloc_consistent(phba->pcidev, mem->size, &mem->dma);
2930         if (!mem->va)
2931                 return -ENOMEM;
2932         memset(mem->va, 0, mem->size);
2933         return 0;
2934 }
2935
2936 static int
2937 beiscsi_create_wrb_rings(struct beiscsi_hba *phba,
2938                          struct hwi_context_memory *phwi_context,
2939                          struct hwi_controller *phwi_ctrlr)
2940 {
2941         unsigned int wrb_mem_index, offset, size, num_wrb_rings;
2942         u64 pa_addr_lo;
2943         unsigned int idx, num, i;
2944         struct mem_array *pwrb_arr;
2945         void *wrb_vaddr;
2946         struct be_dma_mem sgl;
2947         struct be_mem_descriptor *mem_descr;
2948         int status;
2949
2950         idx = 0;
2951         mem_descr = phba->init_mem;
2952         mem_descr += HWI_MEM_WRB;
2953         pwrb_arr = kmalloc(sizeof(*pwrb_arr) * phba->params.cxns_per_ctrl,
2954                            GFP_KERNEL);
2955         if (!pwrb_arr) {
2956                 shost_printk(KERN_ERR, phba->shost,
2957                              "Memory alloc failed in create wrb ring.\n");
2958                 return -ENOMEM;
2959         }
2960         wrb_vaddr = mem_descr->mem_array[idx].virtual_address;
2961         pa_addr_lo = mem_descr->mem_array[idx].bus_address.u.a64.address;
2962         num_wrb_rings = mem_descr->mem_array[idx].size /
2963                 (phba->params.wrbs_per_cxn * sizeof(struct iscsi_wrb));
2964
2965         for (num = 0; num < phba->params.cxns_per_ctrl; num++) {
2966                 if (num_wrb_rings) {
2967                         pwrb_arr[num].virtual_address = wrb_vaddr;
2968                         pwrb_arr[num].bus_address.u.a64.address = pa_addr_lo;
2969                         pwrb_arr[num].size = phba->params.wrbs_per_cxn *
2970                                             sizeof(struct iscsi_wrb);
2971                         wrb_vaddr += pwrb_arr[num].size;
2972                         pa_addr_lo += pwrb_arr[num].size;
2973                         num_wrb_rings--;
2974                 } else {
2975                         idx++;
2976                         wrb_vaddr = mem_descr->mem_array[idx].virtual_address;
2977                         pa_addr_lo = mem_descr->mem_array[idx].\
2978                                         bus_address.u.a64.address;
2979                         num_wrb_rings = mem_descr->mem_array[idx].size /
2980                                         (phba->params.wrbs_per_cxn *
2981                                         sizeof(struct iscsi_wrb));
2982                         pwrb_arr[num].virtual_address = wrb_vaddr;
2983                         pwrb_arr[num].bus_address.u.a64.address\
2984                                                 = pa_addr_lo;
2985                         pwrb_arr[num].size = phba->params.wrbs_per_cxn *
2986                                                  sizeof(struct iscsi_wrb);
2987                         wrb_vaddr += pwrb_arr[num].size;
2988                         pa_addr_lo   += pwrb_arr[num].size;
2989                         num_wrb_rings--;
2990                 }
2991         }
2992         for (i = 0; i < phba->params.cxns_per_ctrl; i++) {
2993                 wrb_mem_index = 0;
2994                 offset = 0;
2995                 size = 0;
2996
2997                 hwi_build_be_sgl_by_offset(phba, &pwrb_arr[i], &sgl);
2998                 status = be_cmd_wrbq_create(&phba->ctrl, &sgl,
2999                                             &phwi_context->be_wrbq[i]);
3000                 if (status != 0) {
3001                         shost_printk(KERN_ERR, phba->shost,
3002                                      "wrbq create failed.");
3003                         kfree(pwrb_arr);
3004                         return status;
3005                 }
3006                 phwi_ctrlr->wrb_context[i * 2].cid = phwi_context->be_wrbq[i].
3007                                                                    id;
3008         }
3009         kfree(pwrb_arr);
3010         return 0;
3011 }
3012
3013 static void free_wrb_handles(struct beiscsi_hba *phba)
3014 {
3015         unsigned int index;
3016         struct hwi_controller *phwi_ctrlr;
3017         struct hwi_wrb_context *pwrb_context;
3018
3019         phwi_ctrlr = phba->phwi_ctrlr;
3020         for (index = 0; index < phba->params.cxns_per_ctrl * 2; index += 2) {
3021                 pwrb_context = &phwi_ctrlr->wrb_context[index];
3022                 kfree(pwrb_context->pwrb_handle_base);
3023                 kfree(pwrb_context->pwrb_handle_basestd);
3024         }
3025 }
3026
3027 static void be_mcc_queues_destroy(struct beiscsi_hba *phba)
3028 {
3029         struct be_queue_info *q;
3030         struct be_ctrl_info *ctrl = &phba->ctrl;
3031
3032         q = &phba->ctrl.mcc_obj.q;
3033         if (q->created)
3034                 beiscsi_cmd_q_destroy(ctrl, q, QTYPE_MCCQ);
3035         be_queue_free(phba, q);
3036
3037         q = &phba->ctrl.mcc_obj.cq;
3038         if (q->created)
3039                 beiscsi_cmd_q_destroy(ctrl, q, QTYPE_CQ);
3040         be_queue_free(phba, q);
3041 }
3042
3043 static void hwi_cleanup(struct beiscsi_hba *phba)
3044 {
3045         struct be_queue_info *q;
3046         struct be_ctrl_info *ctrl = &phba->ctrl;
3047         struct hwi_controller *phwi_ctrlr;
3048         struct hwi_context_memory *phwi_context;
3049         int i, eq_num;
3050
3051         phwi_ctrlr = phba->phwi_ctrlr;
3052         phwi_context = phwi_ctrlr->phwi_ctxt;
3053         for (i = 0; i < phba->params.cxns_per_ctrl; i++) {
3054                 q = &phwi_context->be_wrbq[i];
3055                 if (q->created)
3056                         beiscsi_cmd_q_destroy(ctrl, q, QTYPE_WRBQ);
3057         }
3058         free_wrb_handles(phba);
3059
3060         q = &phwi_context->be_def_hdrq;
3061         if (q->created)
3062                 beiscsi_cmd_q_destroy(ctrl, q, QTYPE_DPDUQ);
3063
3064         q = &phwi_context->be_def_dataq;
3065         if (q->created)
3066                 beiscsi_cmd_q_destroy(ctrl, q, QTYPE_DPDUQ);
3067
3068         beiscsi_cmd_q_destroy(ctrl, NULL, QTYPE_SGL);
3069
3070         for (i = 0; i < (phba->num_cpus); i++) {
3071                 q = &phwi_context->be_cq[i];
3072                 if (q->created)
3073                         beiscsi_cmd_q_destroy(ctrl, q, QTYPE_CQ);
3074         }
3075         if (phba->msix_enabled)
3076                 eq_num = 1;
3077         else
3078                 eq_num = 0;
3079         for (i = 0; i < (phba->num_cpus + eq_num); i++) {
3080                 q = &phwi_context->be_eq[i].q;
3081                 if (q->created)
3082                         beiscsi_cmd_q_destroy(ctrl, q, QTYPE_EQ);
3083         }
3084         be_mcc_queues_destroy(phba);
3085 }
3086
3087 static int be_mcc_queues_create(struct beiscsi_hba *phba,
3088                                 struct hwi_context_memory *phwi_context)
3089 {
3090         struct be_queue_info *q, *cq;
3091         struct be_ctrl_info *ctrl = &phba->ctrl;
3092
3093         /* Alloc MCC compl queue */
3094         cq = &phba->ctrl.mcc_obj.cq;
3095         if (be_queue_alloc(phba, cq, MCC_CQ_LEN,
3096                         sizeof(struct be_mcc_compl)))
3097                 goto err;
3098         /* Ask BE to create MCC compl queue; */
3099         if (phba->msix_enabled) {
3100                 if (beiscsi_cmd_cq_create(ctrl, cq, &phwi_context->be_eq
3101                                          [phba->num_cpus].q, false, true, 0))
3102                 goto mcc_cq_free;
3103         } else {
3104                 if (beiscsi_cmd_cq_create(ctrl, cq, &phwi_context->be_eq[0].q,
3105                                           false, true, 0))
3106                 goto mcc_cq_free;
3107         }
3108
3109         /* Alloc MCC queue */
3110         q = &phba->ctrl.mcc_obj.q;
3111         if (be_queue_alloc(phba, q, MCC_Q_LEN, sizeof(struct be_mcc_wrb)))
3112                 goto mcc_cq_destroy;
3113
3114         /* Ask BE to create MCC queue */
3115         if (beiscsi_cmd_mccq_create(phba, q, cq))
3116                 goto mcc_q_free;
3117
3118         return 0;
3119
3120 mcc_q_free:
3121         be_queue_free(phba, q);
3122 mcc_cq_destroy:
3123         beiscsi_cmd_q_destroy(ctrl, cq, QTYPE_CQ);
3124 mcc_cq_free:
3125         be_queue_free(phba, cq);
3126 err:
3127         return -ENOMEM;
3128 }
3129
3130 static int find_num_cpus(void)
3131 {
3132         int  num_cpus = 0;
3133
3134         num_cpus = num_online_cpus();
3135         if (num_cpus >= MAX_CPUS)
3136                 num_cpus = MAX_CPUS - 1;
3137
3138         SE_DEBUG(DBG_LVL_8, "num_cpus = %d\n", num_cpus);
3139         return num_cpus;
3140 }
3141
3142 static int hwi_init_port(struct beiscsi_hba *phba)
3143 {
3144         struct hwi_controller *phwi_ctrlr;
3145         struct hwi_context_memory *phwi_context;
3146         unsigned int def_pdu_ring_sz;
3147         struct be_ctrl_info *ctrl = &phba->ctrl;
3148         int status;
3149
3150         def_pdu_ring_sz =
3151                 phba->params.asyncpdus_per_ctrl * sizeof(struct phys_addr);
3152         phwi_ctrlr = phba->phwi_ctrlr;
3153         phwi_context = phwi_ctrlr->phwi_ctxt;
3154         phwi_context->max_eqd = 0;
3155         phwi_context->min_eqd = 0;
3156         phwi_context->cur_eqd = 64;
3157         be_cmd_fw_initialize(&phba->ctrl);
3158
3159         status = beiscsi_create_eqs(phba, phwi_context);
3160         if (status != 0) {
3161                 shost_printk(KERN_ERR, phba->shost, "EQ not created\n");
3162                 goto error;
3163         }
3164
3165         status = be_mcc_queues_create(phba, phwi_context);
3166         if (status != 0)
3167                 goto error;
3168
3169         status = mgmt_check_supported_fw(ctrl, phba);
3170         if (status != 0) {
3171                 shost_printk(KERN_ERR, phba->shost,
3172                              "Unsupported fw version\n");
3173                 goto error;
3174         }
3175
3176         status = beiscsi_create_cqs(phba, phwi_context);
3177         if (status != 0) {
3178                 shost_printk(KERN_ERR, phba->shost, "CQ not created\n");
3179                 goto error;
3180         }
3181
3182         status = beiscsi_create_def_hdr(phba, phwi_context, phwi_ctrlr,
3183                                         def_pdu_ring_sz);
3184         if (status != 0) {
3185                 shost_printk(KERN_ERR, phba->shost,
3186                              "Default Header not created\n");
3187                 goto error;
3188         }
3189
3190         status = beiscsi_create_def_data(phba, phwi_context,
3191                                          phwi_ctrlr, def_pdu_ring_sz);
3192         if (status != 0) {
3193                 shost_printk(KERN_ERR, phba->shost,
3194                              "Default Data not created\n");
3195                 goto error;
3196         }
3197
3198         status = beiscsi_post_pages(phba);
3199         if (status != 0) {
3200                 shost_printk(KERN_ERR, phba->shost, "Post SGL Pages Failed\n");
3201                 goto error;
3202         }
3203
3204         status = beiscsi_create_wrb_rings(phba, phwi_context, phwi_ctrlr);
3205         if (status != 0) {
3206                 shost_printk(KERN_ERR, phba->shost,
3207                              "WRB Rings not created\n");
3208                 goto error;
3209         }
3210
3211         SE_DEBUG(DBG_LVL_8, "hwi_init_port success\n");
3212         return 0;
3213
3214 error:
3215         shost_printk(KERN_ERR, phba->shost, "hwi_init_port failed");
3216         hwi_cleanup(phba);
3217         return -ENOMEM;
3218 }
3219
3220 static int hwi_init_controller(struct beiscsi_hba *phba)
3221 {
3222         struct hwi_controller *phwi_ctrlr;
3223
3224         phwi_ctrlr = phba->phwi_ctrlr;
3225         if (1 == phba->init_mem[HWI_MEM_ADDN_CONTEXT].num_elements) {
3226                 phwi_ctrlr->phwi_ctxt = (struct hwi_context_memory *)phba->
3227                     init_mem[HWI_MEM_ADDN_CONTEXT].mem_array[0].virtual_address;
3228                 SE_DEBUG(DBG_LVL_8, " phwi_ctrlr->phwi_ctxt=%p\n",
3229                          phwi_ctrlr->phwi_ctxt);
3230         } else {
3231                 shost_printk(KERN_ERR, phba->shost,
3232                              "HWI_MEM_ADDN_CONTEXT is more than one element."
3233                              "Failing to load\n");
3234                 return -ENOMEM;
3235         }
3236
3237         iscsi_init_global_templates(phba);
3238         beiscsi_init_wrb_handle(phba);
3239         hwi_init_async_pdu_ctx(phba);
3240         if (hwi_init_port(phba) != 0) {
3241                 shost_printk(KERN_ERR, phba->shost,
3242                              "hwi_init_controller failed\n");
3243                 return -ENOMEM;
3244         }
3245         return 0;
3246 }
3247
3248 static void beiscsi_free_mem(struct beiscsi_hba *phba)
3249 {
3250         struct be_mem_descriptor *mem_descr;
3251         int i, j;
3252
3253         mem_descr = phba->init_mem;
3254         i = 0;
3255         j = 0;
3256         for (i = 0; i < SE_MEM_MAX; i++) {
3257                 for (j = mem_descr->num_elements; j > 0; j--) {
3258                         pci_free_consistent(phba->pcidev,
3259                           mem_descr->mem_array[j - 1].size,
3260                           mem_descr->mem_array[j - 1].virtual_address,
3261                           (unsigned long)mem_descr->mem_array[j - 1].
3262                           bus_address.u.a64.address);
3263                 }
3264                 kfree(mem_descr->mem_array);
3265                 mem_descr++;
3266         }
3267         kfree(phba->init_mem);
3268         kfree(phba->phwi_ctrlr);
3269 }
3270
3271 static int beiscsi_init_controller(struct beiscsi_hba *phba)
3272 {
3273         int ret = -ENOMEM;
3274
3275         ret = beiscsi_get_memory(phba);
3276         if (ret < 0) {
3277                 shost_printk(KERN_ERR, phba->shost, "beiscsi_dev_probe -"
3278                              "Failed in beiscsi_alloc_memory\n");
3279                 return ret;
3280         }
3281
3282         ret = hwi_init_controller(phba);
3283         if (ret)
3284                 goto free_init;
3285         SE_DEBUG(DBG_LVL_8, "Return success from beiscsi_init_controller");
3286         return 0;
3287
3288 free_init:
3289         beiscsi_free_mem(phba);
3290         return -ENOMEM;
3291 }
3292
3293 static int beiscsi_init_sgl_handle(struct beiscsi_hba *phba)
3294 {
3295         struct be_mem_descriptor *mem_descr_sglh, *mem_descr_sg;
3296         struct sgl_handle *psgl_handle;
3297         struct iscsi_sge *pfrag;
3298         unsigned int arr_index, i, idx;
3299
3300         phba->io_sgl_hndl_avbl = 0;
3301         phba->eh_sgl_hndl_avbl = 0;
3302
3303         mem_descr_sglh = phba->init_mem;
3304         mem_descr_sglh += HWI_MEM_SGLH;
3305         if (1 == mem_descr_sglh->num_elements) {
3306                 phba->io_sgl_hndl_base = kzalloc(sizeof(struct sgl_handle *) *
3307                                                  phba->params.ios_per_ctrl,
3308                                                  GFP_KERNEL);
3309                 if (!phba->io_sgl_hndl_base) {
3310                         shost_printk(KERN_ERR, phba->shost,
3311                                      "Mem Alloc Failed. Failing to load\n");
3312                         return -ENOMEM;
3313                 }
3314                 phba->eh_sgl_hndl_base = kzalloc(sizeof(struct sgl_handle *) *
3315                                                  (phba->params.icds_per_ctrl -
3316                                                  phba->params.ios_per_ctrl),
3317                                                  GFP_KERNEL);
3318                 if (!phba->eh_sgl_hndl_base) {
3319                         kfree(phba->io_sgl_hndl_base);
3320                         shost_printk(KERN_ERR, phba->shost,
3321                                      "Mem Alloc Failed. Failing to load\n");
3322                         return -ENOMEM;
3323                 }
3324         } else {
3325                 shost_printk(KERN_ERR, phba->shost,
3326                              "HWI_MEM_SGLH is more than one element."
3327                              "Failing to load\n");
3328                 return -ENOMEM;
3329         }
3330
3331         arr_index = 0;
3332         idx = 0;
3333         while (idx < mem_descr_sglh->num_elements) {
3334                 psgl_handle = mem_descr_sglh->mem_array[idx].virtual_address;
3335
3336                 for (i = 0; i < (mem_descr_sglh->mem_array[idx].size /
3337                       sizeof(struct sgl_handle)); i++) {
3338                         if (arr_index < phba->params.ios_per_ctrl) {
3339                                 phba->io_sgl_hndl_base[arr_index] = psgl_handle;
3340                                 phba->io_sgl_hndl_avbl++;
3341                                 arr_index++;
3342                         } else {
3343                                 phba->eh_sgl_hndl_base[arr_index -
3344                                         phba->params.ios_per_ctrl] =
3345                                                                 psgl_handle;
3346                                 arr_index++;
3347                                 phba->eh_sgl_hndl_avbl++;
3348                         }
3349                         psgl_handle++;
3350                 }
3351                 idx++;
3352         }
3353         SE_DEBUG(DBG_LVL_8,
3354                  "phba->io_sgl_hndl_avbl=%d"
3355                  "phba->eh_sgl_hndl_avbl=%d\n",
3356                  phba->io_sgl_hndl_avbl,
3357                  phba->eh_sgl_hndl_avbl);
3358         mem_descr_sg = phba->init_mem;
3359         mem_descr_sg += HWI_MEM_SGE;
3360         SE_DEBUG(DBG_LVL_8, "\n mem_descr_sg->num_elements=%d\n",
3361                  mem_descr_sg->num_elements);
3362         arr_index = 0;
3363         idx = 0;
3364         while (idx < mem_descr_sg->num_elements) {
3365                 pfrag = mem_descr_sg->mem_array[idx].virtual_address;
3366
3367                 for (i = 0;
3368                      i < (mem_descr_sg->mem_array[idx].size) /
3369                      (sizeof(struct iscsi_sge) * phba->params.num_sge_per_io);
3370                      i++) {
3371                         if (arr_index < phba->params.ios_per_ctrl)
3372                                 psgl_handle = phba->io_sgl_hndl_base[arr_index];
3373                         else
3374                                 psgl_handle = phba->eh_sgl_hndl_base[arr_index -
3375                                                 phba->params.ios_per_ctrl];
3376                         psgl_handle->pfrag = pfrag;
3377                         AMAP_SET_BITS(struct amap_iscsi_sge, addr_hi, pfrag, 0);
3378                         AMAP_SET_BITS(struct amap_iscsi_sge, addr_lo, pfrag, 0);
3379                         pfrag += phba->params.num_sge_per_io;
3380                         psgl_handle->sgl_index =
3381                                 phba->fw_config.iscsi_icd_start + arr_index++;
3382                 }
3383                 idx++;
3384         }
3385         phba->io_sgl_free_index = 0;
3386         phba->io_sgl_alloc_index = 0;
3387         phba->eh_sgl_free_index = 0;
3388         phba->eh_sgl_alloc_index = 0;
3389         return 0;
3390 }
3391
3392 static int hba_setup_cid_tbls(struct beiscsi_hba *phba)
3393 {
3394         int i, new_cid;
3395
3396         phba->cid_array = kzalloc(sizeof(void *) * phba->params.cxns_per_ctrl,
3397                                   GFP_KERNEL);
3398         if (!phba->cid_array) {
3399                 shost_printk(KERN_ERR, phba->shost,
3400                              "Failed to allocate memory in "
3401                              "hba_setup_cid_tbls\n");
3402                 return -ENOMEM;
3403         }
3404         phba->ep_array = kzalloc(sizeof(struct iscsi_endpoint *) *
3405                                  phba->params.cxns_per_ctrl * 2, GFP_KERNEL);
3406         if (!phba->ep_array) {
3407                 shost_printk(KERN_ERR, phba->shost,
3408                              "Failed to allocate memory in "
3409                              "hba_setup_cid_tbls\n");
3410                 kfree(phba->cid_array);
3411                 return -ENOMEM;
3412         }
3413         new_cid = phba->fw_config.iscsi_cid_start;
3414         for (i = 0; i < phba->params.cxns_per_ctrl; i++) {
3415                 phba->cid_array[i] = new_cid;
3416                 new_cid += 2;
3417         }
3418         phba->avlbl_cids = phba->params.cxns_per_ctrl;
3419         return 0;
3420 }
3421
3422 static void hwi_enable_intr(struct beiscsi_hba *phba)
3423 {
3424         struct be_ctrl_info *ctrl = &phba->ctrl;
3425         struct hwi_controller *phwi_ctrlr;
3426         struct hwi_context_memory *phwi_context;
3427         struct be_queue_info *eq;
3428         u8 __iomem *addr;
3429         u32 reg, i;
3430         u32 enabled;
3431
3432         phwi_ctrlr = phba->phwi_ctrlr;
3433         phwi_context = phwi_ctrlr->phwi_ctxt;
3434
3435         addr = (u8 __iomem *) ((u8 __iomem *) ctrl->pcicfg +
3436                         PCICFG_MEMBAR_CTRL_INT_CTRL_OFFSET);
3437         reg = ioread32(addr);
3438
3439         enabled = reg & MEMBAR_CTRL_INT_CTRL_HOSTINTR_MASK;
3440         if (!enabled) {
3441                 reg |= MEMBAR_CTRL_INT_CTRL_HOSTINTR_MASK;
3442                 SE_DEBUG(DBG_LVL_8, "reg =x%08x addr=%p\n", reg, addr);
3443                 iowrite32(reg, addr);
3444         }
3445
3446         if (!phba->msix_enabled) {
3447                 eq = &phwi_context->be_eq[0].q;
3448                 SE_DEBUG(DBG_LVL_8, "eq->id=%d\n", eq->id);
3449                 hwi_ring_eq_db(phba, eq->id, 0, 0, 1, 1);
3450         } else {
3451                 for (i = 0; i <= phba->num_cpus; i++) {
3452                         eq = &phwi_context->be_eq[i].q;
3453                         SE_DEBUG(DBG_LVL_8, "eq->id=%d\n", eq->id);
3454                         hwi_ring_eq_db(phba, eq->id, 0, 0, 1, 1);
3455                 }
3456         }
3457 }
3458
3459 static void hwi_disable_intr(struct beiscsi_hba *phba)
3460 {
3461         struct be_ctrl_info *ctrl = &phba->ctrl;
3462
3463         u8 __iomem *addr = ctrl->pcicfg + PCICFG_MEMBAR_CTRL_INT_CTRL_OFFSET;
3464         u32 reg = ioread32(addr);
3465
3466         u32 enabled = reg & MEMBAR_CTRL_INT_CTRL_HOSTINTR_MASK;
3467         if (enabled) {
3468                 reg &= ~MEMBAR_CTRL_INT_CTRL_HOSTINTR_MASK;
3469                 iowrite32(reg, addr);
3470         } else
3471                 shost_printk(KERN_WARNING, phba->shost,
3472                              "In hwi_disable_intr, Already Disabled\n");
3473 }
3474
3475 static int beiscsi_get_boot_info(struct beiscsi_hba *phba)
3476 {
3477         struct be_cmd_resp_get_boot_target *boot_resp;
3478         struct be_cmd_resp_get_session *session_resp;
3479         struct be_mcc_wrb *wrb;
3480         struct be_dma_mem nonemb_cmd;
3481         unsigned int tag, wrb_num;
3482         unsigned short status, extd_status;
3483         struct be_queue_info *mccq = &phba->ctrl.mcc_obj.q;
3484         int ret = -ENOMEM;
3485
3486         tag = beiscsi_get_boot_target(phba);
3487         if (!tag) {
3488                 SE_DEBUG(DBG_LVL_1, "be_cmd_get_mac_addr Failed\n");
3489                 return -EAGAIN;
3490         } else
3491                 wait_event_interruptible(phba->ctrl.mcc_wait[tag],
3492                                          phba->ctrl.mcc_numtag[tag]);
3493
3494         wrb_num = (phba->ctrl.mcc_numtag[tag] & 0x00FF0000) >> 16;
3495         extd_status = (phba->ctrl.mcc_numtag[tag] & 0x0000FF00) >> 8;
3496         status = phba->ctrl.mcc_numtag[tag] & 0x000000FF;
3497         if (status || extd_status) {
3498                 SE_DEBUG(DBG_LVL_1, "be_cmd_get_mac_addr Failed"
3499                                     " status = %d extd_status = %d\n",
3500                                     status, extd_status);
3501                 free_mcc_tag(&phba->ctrl, tag);
3502                 return -EBUSY;
3503         }
3504         wrb = queue_get_wrb(mccq, wrb_num);
3505         free_mcc_tag(&phba->ctrl, tag);
3506         boot_resp = embedded_payload(wrb);
3507
3508         if (boot_resp->boot_session_handle < 0) {
3509                 shost_printk(KERN_INFO, phba->shost, "No Boot Session.\n");
3510                 return -ENXIO;
3511         }
3512
3513         nonemb_cmd.va = pci_alloc_consistent(phba->ctrl.pdev,
3514                                 sizeof(*session_resp),
3515                                 &nonemb_cmd.dma);
3516         if (nonemb_cmd.va == NULL) {
3517                 SE_DEBUG(DBG_LVL_1,
3518                          "Failed to allocate memory for"
3519                          "beiscsi_get_session_info\n");
3520                 return -ENOMEM;
3521         }
3522
3523         memset(nonemb_cmd.va, 0, sizeof(*session_resp));
3524         tag = beiscsi_get_session_info(phba,
3525                 boot_resp->boot_session_handle, &nonemb_cmd);
3526         if (!tag) {
3527                 SE_DEBUG(DBG_LVL_1, "beiscsi_get_session_info"
3528                         " Failed\n");
3529                 goto boot_freemem;
3530         } else
3531                 wait_event_interruptible(phba->ctrl.mcc_wait[tag],
3532                                          phba->ctrl.mcc_numtag[tag]);
3533
3534         wrb_num = (phba->ctrl.mcc_numtag[tag] & 0x00FF0000) >> 16;
3535         extd_status = (phba->ctrl.mcc_numtag[tag] & 0x0000FF00) >> 8;
3536         status = phba->ctrl.mcc_numtag[tag] & 0x000000FF;
3537         if (status || extd_status) {
3538                 SE_DEBUG(DBG_LVL_1, "beiscsi_get_session_info Failed"
3539                                     " status = %d extd_status = %d\n",
3540                                     status, extd_status);
3541                 free_mcc_tag(&phba->ctrl, tag);
3542                 goto boot_freemem;
3543         }
3544         wrb = queue_get_wrb(mccq, wrb_num);
3545         free_mcc_tag(&phba->ctrl, tag);
3546         session_resp = nonemb_cmd.va ;
3547
3548         memcpy(&phba->boot_sess, &session_resp->session_info,
3549                sizeof(struct mgmt_session_info));
3550         ret = 0;
3551
3552 boot_freemem:
3553         pci_free_consistent(phba->ctrl.pdev, nonemb_cmd.size,
3554                     nonemb_cmd.va, nonemb_cmd.dma);
3555         return ret;
3556 }
3557
3558 static void beiscsi_boot_release(void *data)
3559 {
3560         struct beiscsi_hba *phba = data;
3561
3562         scsi_host_put(phba->shost);
3563 }
3564
3565 static int beiscsi_setup_boot_info(struct beiscsi_hba *phba)
3566 {
3567         struct iscsi_boot_kobj *boot_kobj;
3568
3569         /* get boot info using mgmt cmd */
3570         if (beiscsi_get_boot_info(phba))
3571                 /* Try to see if we can carry on without this */
3572                 return 0;
3573
3574         phba->boot_kset = iscsi_boot_create_host_kset(phba->shost->host_no);
3575         if (!phba->boot_kset)
3576                 return -ENOMEM;
3577
3578         /* get a ref because the show function will ref the phba */
3579         if (!scsi_host_get(phba->shost))
3580                 goto free_kset;
3581         boot_kobj = iscsi_boot_create_target(phba->boot_kset, 0, phba,
3582                                              beiscsi_show_boot_tgt_info,
3583                                              beiscsi_tgt_get_attr_visibility,
3584                                              beiscsi_boot_release);
3585         if (!boot_kobj)
3586                 goto put_shost;
3587
3588         if (!scsi_host_get(phba->shost))
3589                 goto free_kset;
3590         boot_kobj = iscsi_boot_create_initiator(phba->boot_kset, 0, phba,
3591                                                 beiscsi_show_boot_ini_info,
3592                                                 beiscsi_ini_get_attr_visibility,
3593                                                 beiscsi_boot_release);
3594         if (!boot_kobj)
3595                 goto put_shost;
3596
3597         if (!scsi_host_get(phba->shost))
3598                 goto free_kset;
3599         boot_kobj = iscsi_boot_create_ethernet(phba->boot_kset, 0, phba,
3600                                                beiscsi_show_boot_eth_info,
3601                                                beiscsi_eth_get_attr_visibility,
3602                                                beiscsi_boot_release);
3603         if (!boot_kobj)
3604                 goto put_shost;
3605         return 0;
3606
3607 put_shost:
3608         scsi_host_put(phba->shost);
3609 free_kset:
3610         iscsi_boot_destroy_kset(phba->boot_kset);
3611         return -ENOMEM;
3612 }
3613
3614 static int beiscsi_init_port(struct beiscsi_hba *phba)
3615 {
3616         int ret;
3617
3618         ret = beiscsi_init_controller(phba);
3619         if (ret < 0) {
3620                 shost_printk(KERN_ERR, phba->shost,
3621                              "beiscsi_dev_probe - Failed in"
3622                              "beiscsi_init_controller\n");
3623                 return ret;
3624         }
3625         ret = beiscsi_init_sgl_handle(phba);
3626         if (ret < 0) {
3627                 shost_printk(KERN_ERR, phba->shost,
3628                              "beiscsi_dev_probe - Failed in"
3629                              "beiscsi_init_sgl_handle\n");
3630                 goto do_cleanup_ctrlr;
3631         }
3632
3633         if (hba_setup_cid_tbls(phba)) {
3634                 shost_printk(KERN_ERR, phba->shost,
3635                              "Failed in hba_setup_cid_tbls\n");
3636                 kfree(phba->io_sgl_hndl_base);
3637                 kfree(phba->eh_sgl_hndl_base);
3638                 goto do_cleanup_ctrlr;
3639         }
3640
3641         return ret;
3642
3643 do_cleanup_ctrlr:
3644         hwi_cleanup(phba);
3645         return ret;
3646 }
3647
3648 static void hwi_purge_eq(struct beiscsi_hba *phba)
3649 {
3650         struct hwi_controller *phwi_ctrlr;
3651         struct hwi_context_memory *phwi_context;
3652         struct be_queue_info *eq;
3653         struct be_eq_entry *eqe = NULL;
3654         int i, eq_msix;
3655         unsigned int num_processed;
3656
3657         phwi_ctrlr = phba->phwi_ctrlr;
3658         phwi_context = phwi_ctrlr->phwi_ctxt;
3659         if (phba->msix_enabled)
3660                 eq_msix = 1;
3661         else
3662                 eq_msix = 0;
3663
3664         for (i = 0; i < (phba->num_cpus + eq_msix); i++) {
3665                 eq = &phwi_context->be_eq[i].q;
3666                 eqe = queue_tail_node(eq);
3667                 num_processed = 0;
3668                 while (eqe->dw[offsetof(struct amap_eq_entry, valid) / 32]
3669                                         & EQE_VALID_MASK) {
3670                         AMAP_SET_BITS(struct amap_eq_entry, valid, eqe, 0);
3671                         queue_tail_inc(eq);
3672                         eqe = queue_tail_node(eq);
3673                         num_processed++;
3674                 }
3675
3676                 if (num_processed)
3677                         hwi_ring_eq_db(phba, eq->id, 1, num_processed, 1, 1);
3678         }
3679 }
3680
3681 static void beiscsi_clean_port(struct beiscsi_hba *phba)
3682 {
3683         int mgmt_status;
3684
3685         mgmt_status = mgmt_epfw_cleanup(phba, CMD_CONNECTION_CHUTE_0);
3686         if (mgmt_status)
3687                 shost_printk(KERN_WARNING, phba->shost,
3688                              "mgmt_epfw_cleanup FAILED\n");
3689
3690         hwi_purge_eq(phba);
3691         hwi_cleanup(phba);
3692         kfree(phba->io_sgl_hndl_base);
3693         kfree(phba->eh_sgl_hndl_base);
3694         kfree(phba->cid_array);
3695         kfree(phba->ep_array);
3696 }
3697
3698 void
3699 beiscsi_offload_connection(struct beiscsi_conn *beiscsi_conn,
3700                            struct beiscsi_offload_params *params)
3701 {
3702         struct wrb_handle *pwrb_handle;
3703         struct iscsi_target_context_update_wrb *pwrb = NULL;
3704         struct be_mem_descriptor *mem_descr;
3705         struct beiscsi_hba *phba = beiscsi_conn->phba;
3706         u32 doorbell = 0;
3707
3708         /*
3709          * We can always use 0 here because it is reserved by libiscsi for
3710          * login/startup related tasks.
3711          */
3712         pwrb_handle = alloc_wrb_handle(phba, (beiscsi_conn->beiscsi_conn_cid -
3713                                        phba->fw_config.iscsi_cid_start));
3714         pwrb = (struct iscsi_target_context_update_wrb *)pwrb_handle->pwrb;
3715         memset(pwrb, 0, sizeof(*pwrb));
3716         AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb,
3717                       max_burst_length, pwrb, params->dw[offsetof
3718                       (struct amap_beiscsi_offload_params,
3719                       max_burst_length) / 32]);
3720         AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb,
3721                       max_send_data_segment_length, pwrb,
3722                       params->dw[offsetof(struct amap_beiscsi_offload_params,
3723                       max_send_data_segment_length) / 32]);
3724         AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb,
3725                       first_burst_length,
3726                       pwrb,
3727                       params->dw[offsetof(struct amap_beiscsi_offload_params,
3728                       first_burst_length) / 32]);
3729
3730         AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, erl, pwrb,
3731                       (params->dw[offsetof(struct amap_beiscsi_offload_params,
3732                       erl) / 32] & OFFLD_PARAMS_ERL));
3733         AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, dde, pwrb,
3734                       (params->dw[offsetof(struct amap_beiscsi_offload_params,
3735                       dde) / 32] & OFFLD_PARAMS_DDE) >> 2);
3736         AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, hde, pwrb,
3737                       (params->dw[offsetof(struct amap_beiscsi_offload_params,
3738                       hde) / 32] & OFFLD_PARAMS_HDE) >> 3);
3739         AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, ir2t, pwrb,
3740                       (params->dw[offsetof(struct amap_beiscsi_offload_params,
3741                       ir2t) / 32] & OFFLD_PARAMS_IR2T) >> 4);
3742         AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, imd, pwrb,
3743                       (params->dw[offsetof(struct amap_beiscsi_offload_params,
3744                        imd) / 32] & OFFLD_PARAMS_IMD) >> 5);
3745         AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, stat_sn,
3746                       pwrb,
3747                       (params->dw[offsetof(struct amap_beiscsi_offload_params,
3748                       exp_statsn) / 32] + 1));
3749         AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, type, pwrb,
3750                       0x7);
3751         AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, wrb_idx,
3752                       pwrb, pwrb_handle->wrb_index);
3753         AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, ptr2nextwrb,
3754                       pwrb, pwrb_handle->nxt_wrb_index);
3755         AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb,
3756                         session_state, pwrb, 0);
3757         AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, compltonack,
3758                       pwrb, 1);
3759         AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, notpredblq,
3760                       pwrb, 0);
3761         AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, mode, pwrb,
3762                       0);
3763
3764         mem_descr = phba->init_mem;
3765         mem_descr += ISCSI_MEM_GLOBAL_HEADER;
3766
3767         AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb,
3768                         pad_buffer_addr_hi, pwrb,
3769                       mem_descr->mem_array[0].bus_address.u.a32.address_hi);
3770         AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb,
3771                         pad_buffer_addr_lo, pwrb,
3772                       mem_descr->mem_array[0].bus_address.u.a32.address_lo);
3773
3774         be_dws_le_to_cpu(pwrb, sizeof(struct iscsi_target_context_update_wrb));
3775
3776         doorbell |= beiscsi_conn->beiscsi_conn_cid & DB_WRB_POST_CID_MASK;
3777         doorbell |= (pwrb_handle->wrb_index & DB_DEF_PDU_WRB_INDEX_MASK)
3778                              << DB_DEF_PDU_WRB_INDEX_SHIFT;
3779         doorbell |= 1 << DB_DEF_PDU_NUM_POSTED_SHIFT;
3780
3781         iowrite32(doorbell, phba->db_va + DB_TXULP0_OFFSET);
3782 }
3783
3784 static void beiscsi_parse_pdu(struct iscsi_conn *conn, itt_t itt,
3785                               int *index, int *age)
3786 {
3787         *index = (int)itt;
3788         if (age)
3789                 *age = conn->session->age;
3790 }
3791
3792 /**
3793  * beiscsi_alloc_pdu - allocates pdu and related resources
3794  * @task: libiscsi task
3795  * @opcode: opcode of pdu for task
3796  *
3797  * This is called with the session lock held. It will allocate
3798  * the wrb and sgl if needed for the command. And it will prep
3799  * the pdu's itt. beiscsi_parse_pdu will later translate
3800  * the pdu itt to the libiscsi task itt.
3801  */
3802 static int beiscsi_alloc_pdu(struct iscsi_task *task, uint8_t opcode)
3803 {
3804         struct beiscsi_io_task *io_task = task->dd_data;
3805         struct iscsi_conn *conn = task->conn;
3806         struct beiscsi_conn *beiscsi_conn = conn->dd_data;
3807         struct beiscsi_hba *phba = beiscsi_conn->phba;
3808         struct hwi_wrb_context *pwrb_context;
3809         struct hwi_controller *phwi_ctrlr;
3810         itt_t itt;
3811         struct beiscsi_session *beiscsi_sess = beiscsi_conn->beiscsi_sess;
3812         dma_addr_t paddr;
3813
3814         io_task->cmd_bhs = pci_pool_alloc(beiscsi_sess->bhs_pool,
3815                                           GFP_ATOMIC, &paddr);
3816         if (!io_task->cmd_bhs)
3817                 return -ENOMEM;
3818         io_task->bhs_pa.u.a64.address = paddr;
3819         io_task->libiscsi_itt = (itt_t)task->itt;
3820         io_task->conn = beiscsi_conn;
3821
3822         task->hdr = (struct iscsi_hdr *)&io_task->cmd_bhs->iscsi_hdr;
3823         task->hdr_max = sizeof(struct be_cmd_bhs);
3824         io_task->psgl_handle = NULL;
3825         io_task->psgl_handle = NULL;
3826
3827         if (task->sc) {
3828                 spin_lock(&phba->io_sgl_lock);
3829                 io_task->psgl_handle = alloc_io_sgl_handle(phba);
3830                 spin_unlock(&phba->io_sgl_lock);
3831                 if (!io_task->psgl_handle)
3832                         goto free_hndls;
3833                 io_task->pwrb_handle = alloc_wrb_handle(phba,
3834                                         beiscsi_conn->beiscsi_conn_cid -
3835                                         phba->fw_config.iscsi_cid_start);
3836                 if (!io_task->pwrb_handle)
3837                         goto free_io_hndls;
3838         } else {
3839                 io_task->scsi_cmnd = NULL;
3840                 if ((opcode & ISCSI_OPCODE_MASK) == ISCSI_OP_LOGIN) {
3841                         if (!beiscsi_conn->login_in_progress) {
3842                                 spin_lock(&phba->mgmt_sgl_lock);
3843                                 io_task->psgl_handle = (struct sgl_handle *)
3844                                                 alloc_mgmt_sgl_handle(phba);
3845                                 spin_unlock(&phba->mgmt_sgl_lock);
3846                                 if (!io_task->psgl_handle)
3847                                         goto free_hndls;
3848
3849                                 beiscsi_conn->login_in_progress = 1;
3850                                 beiscsi_conn->plogin_sgl_handle =
3851                                                         io_task->psgl_handle;
3852                                 io_task->pwrb_handle =
3853                                         alloc_wrb_handle(phba,
3854                                         beiscsi_conn->beiscsi_conn_cid -
3855                                         phba->fw_config.iscsi_cid_start);
3856                                 if (!io_task->pwrb_handle)
3857                                         goto free_io_hndls;
3858                                 beiscsi_conn->plogin_wrb_handle =
3859                                                         io_task->pwrb_handle;
3860
3861                         } else {
3862                                 io_task->psgl_handle =
3863                                                 beiscsi_conn->plogin_sgl_handle;
3864                                 io_task->pwrb_handle =
3865                                                 beiscsi_conn->plogin_wrb_handle;
3866                         }
3867                 } else {
3868                         spin_lock(&phba->mgmt_sgl_lock);
3869                         io_task->psgl_handle = alloc_mgmt_sgl_handle(phba);
3870                         spin_unlock(&phba->mgmt_sgl_lock);
3871                         if (!io_task->psgl_handle)
3872                                 goto free_hndls;
3873                         io_task->pwrb_handle =
3874                                         alloc_wrb_handle(phba,
3875                                         beiscsi_conn->beiscsi_conn_cid -
3876                                         phba->fw_config.iscsi_cid_start);
3877                         if (!io_task->pwrb_handle)
3878                                 goto free_mgmt_hndls;
3879
3880                 }
3881         }
3882         itt = (itt_t) cpu_to_be32(((unsigned int)io_task->pwrb_handle->
3883                                  wrb_index << 16) | (unsigned int)
3884                                 (io_task->psgl_handle->sgl_index));
3885         io_task->pwrb_handle->pio_handle = task;
3886
3887         io_task->cmd_bhs->iscsi_hdr.itt = itt;
3888         return 0;
3889
3890 free_io_hndls:
3891         spin_lock(&phba->io_sgl_lock);
3892         free_io_sgl_handle(phba, io_task->psgl_handle);
3893         spin_unlock(&phba->io_sgl_lock);
3894         goto free_hndls;
3895 free_mgmt_hndls:
3896         spin_lock(&phba->mgmt_sgl_lock);
3897         free_mgmt_sgl_handle(phba, io_task->psgl_handle);
3898         spin_unlock(&phba->mgmt_sgl_lock);
3899 free_hndls:
3900         phwi_ctrlr = phba->phwi_ctrlr;
3901         pwrb_context = &phwi_ctrlr->wrb_context[
3902                         beiscsi_conn->beiscsi_conn_cid -
3903                         phba->fw_config.iscsi_cid_start];
3904         if (io_task->pwrb_handle)
3905                 free_wrb_handle(phba, pwrb_context, io_task->pwrb_handle);
3906         io_task->pwrb_handle = NULL;
3907         pci_pool_free(beiscsi_sess->bhs_pool, io_task->cmd_bhs,
3908                       io_task->bhs_pa.u.a64.address);
3909         SE_DEBUG(DBG_LVL_1, "Alloc of SGL_ICD Failed\n");
3910         return -ENOMEM;
3911 }
3912
3913 static void beiscsi_cleanup_task(struct iscsi_task *task)
3914 {
3915         struct beiscsi_io_task *io_task = task->dd_data;
3916         struct iscsi_conn *conn = task->conn;
3917         struct beiscsi_conn *beiscsi_conn = conn->dd_data;
3918         struct beiscsi_hba *phba = beiscsi_conn->phba;
3919         struct beiscsi_session *beiscsi_sess = beiscsi_conn->beiscsi_sess;
3920         struct hwi_wrb_context *pwrb_context;
3921         struct hwi_controller *phwi_ctrlr;
3922
3923         phwi_ctrlr = phba->phwi_ctrlr;
3924         pwrb_context = &phwi_ctrlr->wrb_context[beiscsi_conn->beiscsi_conn_cid
3925                         - phba->fw_config.iscsi_cid_start];
3926         if (io_task->pwrb_handle) {
3927                 free_wrb_handle(phba, pwrb_context, io_task->pwrb_handle);
3928                 io_task->pwrb_handle = NULL;
3929         }
3930
3931         if (io_task->cmd_bhs) {
3932                 pci_pool_free(beiscsi_sess->bhs_pool, io_task->cmd_bhs,
3933                               io_task->bhs_pa.u.a64.address);
3934         }
3935
3936         if (task->sc) {
3937                 if (io_task->psgl_handle) {
3938                         spin_lock(&phba->io_sgl_lock);
3939                         free_io_sgl_handle(phba, io_task->psgl_handle);
3940                         spin_unlock(&phba->io_sgl_lock);
3941                         io_task->psgl_handle = NULL;
3942                 }
3943         } else {
3944                 if (task->hdr &&
3945                    ((task->hdr->opcode & ISCSI_OPCODE_MASK) == ISCSI_OP_LOGIN))
3946                         return;
3947                 if (io_task->psgl_handle) {
3948                         spin_lock(&phba->mgmt_sgl_lock);
3949                         free_mgmt_sgl_handle(phba, io_task->psgl_handle);
3950                         spin_unlock(&phba->mgmt_sgl_lock);
3951                         io_task->psgl_handle = NULL;
3952                 }
3953         }
3954 }
3955
3956 static int beiscsi_iotask(struct iscsi_task *task, struct scatterlist *sg,
3957                           unsigned int num_sg, unsigned int xferlen,
3958                           unsigned int writedir)
3959 {
3960
3961         struct beiscsi_io_task *io_task = task->dd_data;
3962         struct iscsi_conn *conn = task->conn;
3963         struct beiscsi_conn *beiscsi_conn = conn->dd_data;
3964         struct beiscsi_hba *phba = beiscsi_conn->phba;
3965         struct iscsi_wrb *pwrb = NULL;
3966         unsigned int doorbell = 0;
3967
3968         pwrb = io_task->pwrb_handle->pwrb;
3969         io_task->cmd_bhs->iscsi_hdr.exp_statsn = 0;
3970         io_task->bhs_len = sizeof(struct be_cmd_bhs);
3971
3972         if (writedir) {
3973                 memset(&io_task->cmd_bhs->iscsi_data_pdu, 0, 48);
3974                 AMAP_SET_BITS(struct amap_pdu_data_out, itt,
3975                               &io_task->cmd_bhs->iscsi_data_pdu,
3976                               (unsigned int)io_task->cmd_bhs->iscsi_hdr.itt);
3977                 AMAP_SET_BITS(struct amap_pdu_data_out, opcode,
3978                               &io_task->cmd_bhs->iscsi_data_pdu,
3979                               ISCSI_OPCODE_SCSI_DATA_OUT);
3980                 AMAP_SET_BITS(struct amap_pdu_data_out, final_bit,
3981                               &io_task->cmd_bhs->iscsi_data_pdu, 1);
3982                 AMAP_SET_BITS(struct amap_iscsi_wrb, type, pwrb,
3983                               INI_WR_CMD);
3984                 AMAP_SET_BITS(struct amap_iscsi_wrb, dsp, pwrb, 1);
3985         } else {
3986                 AMAP_SET_BITS(struct amap_iscsi_wrb, type, pwrb,
3987                               INI_RD_CMD);
3988                 AMAP_SET_BITS(struct amap_iscsi_wrb, dsp, pwrb, 0);
3989         }
3990         memcpy(&io_task->cmd_bhs->iscsi_data_pdu.
3991                dw[offsetof(struct amap_pdu_data_out, lun) / 32],
3992                &io_task->cmd_bhs->iscsi_hdr.lun, sizeof(struct scsi_lun));
3993
3994         AMAP_SET_BITS(struct amap_iscsi_wrb, lun, pwrb,
3995                       cpu_to_be16(*(unsigned short *)&io_task->cmd_bhs->iscsi_hdr.lun));
3996         AMAP_SET_BITS(struct amap_iscsi_wrb, r2t_exp_dtl, pwrb, xferlen);
3997         AMAP_SET_BITS(struct amap_iscsi_wrb, wrb_idx, pwrb,
3998                       io_task->pwrb_handle->wrb_index);
3999         AMAP_SET_BITS(struct amap_iscsi_wrb, cmdsn_itt, pwrb,
4000                       be32_to_cpu(task->cmdsn));
4001         AMAP_SET_BITS(struct amap_iscsi_wrb, sgl_icd_idx, pwrb,
4002                       io_task->psgl_handle->sgl_index);
4003
4004         hwi_write_sgl(pwrb, sg, num_sg, io_task);
4005
4006         AMAP_SET_BITS(struct amap_iscsi_wrb, ptr2nextwrb, pwrb,
4007                       io_task->pwrb_handle->nxt_wrb_index);
4008         be_dws_le_to_cpu(pwrb, sizeof(struct iscsi_wrb));
4009
4010         doorbell |= beiscsi_conn->beiscsi_conn_cid & DB_WRB_POST_CID_MASK;
4011         doorbell |= (io_task->pwrb_handle->wrb_index &
4012                      DB_DEF_PDU_WRB_INDEX_MASK) << DB_DEF_PDU_WRB_INDEX_SHIFT;
4013         doorbell |= 1 << DB_DEF_PDU_NUM_POSTED_SHIFT;
4014
4015         iowrite32(doorbell, phba->db_va + DB_TXULP0_OFFSET);
4016         return 0;
4017 }
4018
4019 static int beiscsi_mtask(struct iscsi_task *task)
4020 {
4021         struct beiscsi_io_task *io_task = task->dd_data;
4022         struct iscsi_conn *conn = task->conn;
4023         struct beiscsi_conn *beiscsi_conn = conn->dd_data;
4024         struct beiscsi_hba *phba = beiscsi_conn->phba;
4025         struct iscsi_wrb *pwrb = NULL;
4026         unsigned int doorbell = 0;
4027         unsigned int cid;
4028
4029         cid = beiscsi_conn->beiscsi_conn_cid;
4030         pwrb = io_task->pwrb_handle->pwrb;
4031         memset(pwrb, 0, sizeof(*pwrb));
4032         AMAP_SET_BITS(struct amap_iscsi_wrb, cmdsn_itt, pwrb,
4033                       be32_to_cpu(task->cmdsn));
4034         AMAP_SET_BITS(struct amap_iscsi_wrb, wrb_idx, pwrb,
4035                       io_task->pwrb_handle->wrb_index);
4036         AMAP_SET_BITS(struct amap_iscsi_wrb, sgl_icd_idx, pwrb,
4037                       io_task->psgl_handle->sgl_index);
4038
4039         switch (task->hdr->opcode & ISCSI_OPCODE_MASK) {
4040         case ISCSI_OP_LOGIN:
4041                 AMAP_SET_BITS(struct amap_iscsi_wrb, type, pwrb,
4042                               TGT_DM_CMD);
4043                 AMAP_SET_BITS(struct amap_iscsi_wrb, dmsg, pwrb, 0);
4044                 AMAP_SET_BITS(struct amap_iscsi_wrb, cmdsn_itt, pwrb, 1);
4045                 hwi_write_buffer(pwrb, task);
4046                 break;
4047         case ISCSI_OP_NOOP_OUT:
4048                 if (task->hdr->ttt != ISCSI_RESERVED_TAG) {
4049                         AMAP_SET_BITS(struct amap_iscsi_wrb, type, pwrb,
4050                                       TGT_DM_CMD);
4051                         AMAP_SET_BITS(struct amap_iscsi_wrb, cmdsn_itt,
4052                                       pwrb, 0);
4053                         AMAP_SET_BITS(struct amap_iscsi_wrb, dmsg, pwrb, 1);
4054                 } else {
4055                         AMAP_SET_BITS(struct amap_iscsi_wrb, type, pwrb,
4056                                       INI_RD_CMD);
4057                         AMAP_SET_BITS(struct amap_iscsi_wrb, dmsg, pwrb, 0);
4058                 }
4059                 hwi_write_buffer(pwrb, task);
4060                 break;
4061         case ISCSI_OP_TEXT:
4062                 AMAP_SET_BITS(struct amap_iscsi_wrb, type, pwrb,
4063                               TGT_DM_CMD);
4064                 AMAP_SET_BITS(struct amap_iscsi_wrb, dmsg, pwrb, 0);
4065                 hwi_write_buffer(pwrb, task);
4066                 break;
4067         case ISCSI_OP_SCSI_TMFUNC:
4068                 AMAP_SET_BITS(struct amap_iscsi_wrb, type, pwrb,
4069                               INI_TMF_CMD);
4070                 AMAP_SET_BITS(struct amap_iscsi_wrb, dmsg, pwrb, 0);
4071                 hwi_write_buffer(pwrb, task);
4072                 break;
4073         case ISCSI_OP_LOGOUT:
4074                 AMAP_SET_BITS(struct amap_iscsi_wrb, dmsg, pwrb, 0);
4075                 AMAP_SET_BITS(struct amap_iscsi_wrb, type, pwrb,
4076                               HWH_TYPE_LOGOUT);
4077                 hwi_write_buffer(pwrb, task);
4078                 break;
4079
4080         default:
4081                 SE_DEBUG(DBG_LVL_1, "opcode =%d Not supported\n",
4082                          task->hdr->opcode & ISCSI_OPCODE_MASK);
4083                 return -EINVAL;
4084         }
4085
4086         AMAP_SET_BITS(struct amap_iscsi_wrb, r2t_exp_dtl, pwrb,
4087                       task->data_count);
4088         AMAP_SET_BITS(struct amap_iscsi_wrb, ptr2nextwrb, pwrb,
4089                       io_task->pwrb_handle->nxt_wrb_index);
4090         be_dws_le_to_cpu(pwrb, sizeof(struct iscsi_wrb));
4091
4092         doorbell |= cid & DB_WRB_POST_CID_MASK;
4093         doorbell |= (io_task->pwrb_handle->wrb_index &
4094                      DB_DEF_PDU_WRB_INDEX_MASK) << DB_DEF_PDU_WRB_INDEX_SHIFT;
4095         doorbell |= 1 << DB_DEF_PDU_NUM_POSTED_SHIFT;
4096         iowrite32(doorbell, phba->db_va + DB_TXULP0_OFFSET);
4097         return 0;
4098 }
4099
4100 static int beiscsi_task_xmit(struct iscsi_task *task)
4101 {
4102         struct beiscsi_io_task *io_task = task->dd_data;
4103         struct scsi_cmnd *sc = task->sc;
4104         struct scatterlist *sg;
4105         int num_sg;
4106         unsigned int  writedir = 0, xferlen = 0;
4107
4108         if (!sc)
4109                 return beiscsi_mtask(task);
4110
4111         io_task->scsi_cmnd = sc;
4112         num_sg = scsi_dma_map(sc);
4113         if (num_sg < 0) {
4114                 SE_DEBUG(DBG_LVL_1, " scsi_dma_map Failed\n")
4115                 return num_sg;
4116         }
4117         xferlen = scsi_bufflen(sc);
4118         sg = scsi_sglist(sc);
4119         if (sc->sc_data_direction == DMA_TO_DEVICE) {
4120                 writedir = 1;
4121                 SE_DEBUG(DBG_LVL_4, "task->imm_count=0x%08x\n",
4122                          task->imm_count);
4123         } else
4124                 writedir = 0;
4125         return beiscsi_iotask(task, sg, num_sg, xferlen, writedir);
4126 }
4127
4128 static void beiscsi_quiesce(struct beiscsi_hba *phba)
4129 {
4130         struct hwi_controller *phwi_ctrlr;
4131         struct hwi_context_memory *phwi_context;
4132         struct be_eq_obj *pbe_eq;
4133         unsigned int i, msix_vec;
4134         u8 *real_offset = 0;
4135         u32 value = 0;
4136
4137         phwi_ctrlr = phba->phwi_ctrlr;
4138         phwi_context = phwi_ctrlr->phwi_ctxt;
4139         hwi_disable_intr(phba);
4140         if (phba->msix_enabled) {
4141                 for (i = 0; i <= phba->num_cpus; i++) {
4142                         msix_vec = phba->msix_entries[i].vector;
4143                         free_irq(msix_vec, &phwi_context->be_eq[i]);
4144                         kfree(phba->msi_name[i]);
4145                 }
4146         } else
4147                 if (phba->pcidev->irq)
4148                         free_irq(phba->pcidev->irq, phba);
4149         pci_disable_msix(phba->pcidev);
4150         destroy_workqueue(phba->wq);
4151         if (blk_iopoll_enabled)
4152                 for (i = 0; i < phba->num_cpus; i++) {
4153                         pbe_eq = &phwi_context->be_eq[i];
4154                         blk_iopoll_disable(&pbe_eq->iopoll);
4155                 }
4156
4157         beiscsi_clean_port(phba);
4158         beiscsi_free_mem(phba);
4159         real_offset = (u8 *)phba->csr_va + MPU_EP_SEMAPHORE;
4160
4161         value = readl((void *)real_offset);
4162
4163         if (value & 0x00010000) {
4164                 value &= 0xfffeffff;
4165                 writel(value, (void *)real_offset);
4166         }
4167         beiscsi_unmap_pci_function(phba);
4168         pci_free_consistent(phba->pcidev,
4169                             phba->ctrl.mbox_mem_alloced.size,
4170                             phba->ctrl.mbox_mem_alloced.va,
4171                             phba->ctrl.mbox_mem_alloced.dma);
4172 }
4173
4174 static void beiscsi_remove(struct pci_dev *pcidev)
4175 {
4176
4177         struct beiscsi_hba *phba = NULL;
4178
4179         phba = pci_get_drvdata(pcidev);
4180         if (!phba) {
4181                 dev_err(&pcidev->dev, "beiscsi_remove called with no phba\n");
4182                 return;
4183         }
4184
4185         beiscsi_quiesce(phba);
4186         iscsi_boot_destroy_kset(phba->boot_kset);
4187         iscsi_host_remove(phba->shost);
4188         pci_dev_put(phba->pcidev);
4189         iscsi_host_free(phba->shost);
4190         pci_disable_device(pcidev);
4191 }
4192
4193 static void beiscsi_shutdown(struct pci_dev *pcidev)
4194 {
4195
4196         struct beiscsi_hba *phba = NULL;
4197
4198         phba = (struct beiscsi_hba *)pci_get_drvdata(pcidev);
4199         if (!phba) {
4200                 dev_err(&pcidev->dev, "beiscsi_shutdown called with no phba\n");
4201                 return;
4202         }
4203
4204         beiscsi_quiesce(phba);
4205         pci_disable_device(pcidev);
4206 }
4207
4208 static void beiscsi_msix_enable(struct beiscsi_hba *phba)
4209 {
4210         int i, status;
4211
4212         for (i = 0; i <= phba->num_cpus; i++)
4213                 phba->msix_entries[i].entry = i;
4214
4215         status = pci_enable_msix(phba->pcidev, phba->msix_entries,
4216                                  (phba->num_cpus + 1));
4217         if (!status)
4218                 phba->msix_enabled = true;
4219
4220         return;
4221 }
4222
4223 static int __devinit beiscsi_dev_probe(struct pci_dev *pcidev,
4224                                 const struct pci_device_id *id)
4225 {
4226         struct beiscsi_hba *phba = NULL;
4227         struct hwi_controller *phwi_ctrlr;
4228         struct hwi_context_memory *phwi_context;
4229         struct be_eq_obj *pbe_eq;
4230         int ret, num_cpus, i;
4231         u8 *real_offset = 0;
4232         u32 value = 0;
4233
4234         ret = beiscsi_enable_pci(pcidev);
4235         if (ret < 0) {
4236                 dev_err(&pcidev->dev, "beiscsi_dev_probe-"
4237                         " Failed to enable pci device\n");
4238                 return ret;
4239         }
4240
4241         phba = beiscsi_hba_alloc(pcidev);
4242         if (!phba) {
4243                 dev_err(&pcidev->dev, "beiscsi_dev_probe-"
4244                         " Failed in beiscsi_hba_alloc\n");
4245                 goto disable_pci;
4246         }
4247
4248         switch (pcidev->device) {
4249         case BE_DEVICE_ID1:
4250         case OC_DEVICE_ID1:
4251         case OC_DEVICE_ID2:
4252                 phba->generation = BE_GEN2;
4253                 break;
4254         case BE_DEVICE_ID2:
4255         case OC_DEVICE_ID3:
4256                 phba->generation = BE_GEN3;
4257                 break;
4258         default:
4259                 phba->generation = 0;
4260         }
4261
4262         if (enable_msix)
4263                 num_cpus = find_num_cpus();
4264         else
4265                 num_cpus = 1;
4266         phba->num_cpus = num_cpus;
4267         SE_DEBUG(DBG_LVL_8, "num_cpus = %d\n", phba->num_cpus);
4268
4269         if (enable_msix)
4270                 beiscsi_msix_enable(phba);
4271         ret = be_ctrl_init(phba, pcidev);
4272         if (ret) {
4273                 shost_printk(KERN_ERR, phba->shost, "beiscsi_dev_probe-"
4274                                 "Failed in be_ctrl_init\n");
4275                 goto hba_free;
4276         }
4277
4278         if (!num_hba) {
4279                 real_offset = (u8 *)phba->csr_va + MPU_EP_SEMAPHORE;
4280                 value = readl((void *)real_offset);
4281                 if (value & 0x00010000) {
4282                         gcrashmode++;
4283                         shost_printk(KERN_ERR, phba->shost,
4284                                 "Loading Driver in crashdump mode\n");
4285                         ret = beiscsi_cmd_reset_function(phba);
4286                         if (ret) {
4287                                 shost_printk(KERN_ERR, phba->shost,
4288                                         "Reset Failed. Aborting Crashdump\n");
4289                                 goto hba_free;
4290                         }
4291                         ret = be_chk_reset_complete(phba);
4292                         if (ret) {
4293                                 shost_printk(KERN_ERR, phba->shost,
4294                                         "Failed to get out of reset."
4295                                         "Aborting Crashdump\n");
4296                                 goto hba_free;
4297                         }
4298                 } else {
4299                         value |= 0x00010000;
4300                         writel(value, (void *)real_offset);
4301                         num_hba++;
4302                 }
4303         }
4304
4305         spin_lock_init(&phba->io_sgl_lock);
4306         spin_lock_init(&phba->mgmt_sgl_lock);
4307         spin_lock_init(&phba->isr_lock);
4308         ret = mgmt_get_fw_config(&phba->ctrl, phba);
4309         if (ret != 0) {
4310                 shost_printk(KERN_ERR, phba->shost,
4311                              "Error getting fw config\n");
4312                 goto free_port;
4313         }
4314         phba->shost->max_id = phba->fw_config.iscsi_cid_count;
4315         beiscsi_get_params(phba);
4316         phba->shost->can_queue = phba->params.ios_per_ctrl;
4317         ret = beiscsi_init_port(phba);
4318         if (ret < 0) {
4319                 shost_printk(KERN_ERR, phba->shost, "beiscsi_dev_probe-"
4320                              "Failed in beiscsi_init_port\n");
4321                 goto free_port;
4322         }
4323
4324         for (i = 0; i < MAX_MCC_CMD ; i++) {
4325                 init_waitqueue_head(&phba->ctrl.mcc_wait[i + 1]);
4326                 phba->ctrl.mcc_tag[i] = i + 1;
4327                 phba->ctrl.mcc_numtag[i + 1] = 0;
4328                 phba->ctrl.mcc_tag_available++;
4329         }
4330
4331         phba->ctrl.mcc_alloc_index = phba->ctrl.mcc_free_index = 0;
4332
4333         snprintf(phba->wq_name, sizeof(phba->wq_name), "beiscsi_q_irq%u",
4334                  phba->shost->host_no);
4335         phba->wq = alloc_workqueue(phba->wq_name, WQ_MEM_RECLAIM, 1);
4336         if (!phba->wq) {
4337                 shost_printk(KERN_ERR, phba->shost, "beiscsi_dev_probe-"
4338                                 "Failed to allocate work queue\n");
4339                 goto free_twq;
4340         }
4341
4342         INIT_WORK(&phba->work_cqs, beiscsi_process_all_cqs);
4343
4344         phwi_ctrlr = phba->phwi_ctrlr;
4345         phwi_context = phwi_ctrlr->phwi_ctxt;
4346         if (blk_iopoll_enabled) {
4347                 for (i = 0; i < phba->num_cpus; i++) {
4348                         pbe_eq = &phwi_context->be_eq[i];
4349                         blk_iopoll_init(&pbe_eq->iopoll, be_iopoll_budget,
4350                                         be_iopoll);
4351                         blk_iopoll_enable(&pbe_eq->iopoll);
4352                 }
4353         }
4354         ret = beiscsi_init_irqs(phba);
4355         if (ret < 0) {
4356                 shost_printk(KERN_ERR, phba->shost, "beiscsi_dev_probe-"
4357                              "Failed to beiscsi_init_irqs\n");
4358                 goto free_blkenbld;
4359         }
4360         hwi_enable_intr(phba);
4361
4362         if (beiscsi_setup_boot_info(phba))
4363                 /*
4364                  * log error but continue, because we may not be using
4365                  * iscsi boot.
4366                  */
4367                 shost_printk(KERN_ERR, phba->shost, "Could not set up "
4368                              "iSCSI boot info.");
4369
4370         SE_DEBUG(DBG_LVL_8, "\n\n\n SUCCESS - DRIVER LOADED\n\n\n");
4371         return 0;
4372
4373 free_blkenbld:
4374         destroy_workqueue(phba->wq);
4375         if (blk_iopoll_enabled)
4376                 for (i = 0; i < phba->num_cpus; i++) {
4377                         pbe_eq = &phwi_context->be_eq[i];
4378                         blk_iopoll_disable(&pbe_eq->iopoll);
4379                 }
4380 free_twq:
4381         beiscsi_clean_port(phba);
4382         beiscsi_free_mem(phba);
4383 free_port:
4384         real_offset = (u8 *)phba->csr_va + MPU_EP_SEMAPHORE;
4385
4386         value = readl((void *)real_offset);
4387
4388         if (value & 0x00010000) {
4389                 value &= 0xfffeffff;
4390                 writel(value, (void *)real_offset);
4391         }
4392
4393         pci_free_consistent(phba->pcidev,
4394                             phba->ctrl.mbox_mem_alloced.size,
4395                             phba->ctrl.mbox_mem_alloced.va,
4396                            phba->ctrl.mbox_mem_alloced.dma);
4397         beiscsi_unmap_pci_function(phba);
4398 hba_free:
4399         if (phba->msix_enabled)
4400                 pci_disable_msix(phba->pcidev);
4401         iscsi_host_remove(phba->shost);
4402         pci_dev_put(phba->pcidev);
4403         iscsi_host_free(phba->shost);
4404 disable_pci:
4405         pci_disable_device(pcidev);
4406         return ret;
4407 }
4408
4409 struct iscsi_transport beiscsi_iscsi_transport = {
4410         .owner = THIS_MODULE,
4411         .name = DRV_NAME,
4412         .caps = CAP_RECOVERY_L0 | CAP_HDRDGST | CAP_TEXT_NEGO |
4413                 CAP_MULTI_R2T | CAP_DATADGST | CAP_DATA_PATH_OFFLOAD,
4414         .create_session = beiscsi_session_create,
4415         .destroy_session = beiscsi_session_destroy,
4416         .create_conn = beiscsi_conn_create,
4417         .bind_conn = beiscsi_conn_bind,
4418         .destroy_conn = iscsi_conn_teardown,
4419         .attr_is_visible = be2iscsi_attr_is_visible,
4420         .set_param = beiscsi_set_param,
4421         .get_conn_param = iscsi_conn_get_param,
4422         .get_session_param = iscsi_session_get_param,
4423         .get_host_param = beiscsi_get_host_param,
4424         .start_conn = beiscsi_conn_start,
4425         .stop_conn = iscsi_conn_stop,
4426         .send_pdu = iscsi_conn_send_pdu,
4427         .xmit_task = beiscsi_task_xmit,
4428         .cleanup_task = beiscsi_cleanup_task,
4429         .alloc_pdu = beiscsi_alloc_pdu,
4430         .parse_pdu_itt = beiscsi_parse_pdu,
4431         .get_stats = beiscsi_conn_get_stats,
4432         .get_ep_param = beiscsi_ep_get_param,
4433         .ep_connect = beiscsi_ep_connect,
4434         .ep_poll = beiscsi_ep_poll,
4435         .ep_disconnect = beiscsi_ep_disconnect,
4436         .session_recovery_timedout = iscsi_session_recovery_timedout,
4437 };
4438
4439 static struct pci_driver beiscsi_pci_driver = {
4440         .name = DRV_NAME,
4441         .probe = beiscsi_dev_probe,
4442         .remove = beiscsi_remove,
4443         .shutdown = beiscsi_shutdown,
4444         .id_table = beiscsi_pci_id_table
4445 };
4446
4447
4448 static int __init beiscsi_module_init(void)
4449 {
4450         int ret;
4451
4452         beiscsi_scsi_transport =
4453                         iscsi_register_transport(&beiscsi_iscsi_transport);
4454         if (!beiscsi_scsi_transport) {
4455                 SE_DEBUG(DBG_LVL_1,
4456                          "beiscsi_module_init - Unable to  register beiscsi"
4457                          "transport.\n");
4458                 return -ENOMEM;
4459         }
4460         SE_DEBUG(DBG_LVL_8, "In beiscsi_module_init, tt=%p\n",
4461                  &beiscsi_iscsi_transport);
4462
4463         ret = pci_register_driver(&beiscsi_pci_driver);
4464         if (ret) {
4465                 SE_DEBUG(DBG_LVL_1,
4466                          "beiscsi_module_init - Unable to  register"
4467                          "beiscsi pci driver.\n");
4468                 goto unregister_iscsi_transport;
4469         }
4470         return 0;
4471
4472 unregister_iscsi_transport:
4473         iscsi_unregister_transport(&beiscsi_iscsi_transport);
4474         return ret;
4475 }
4476
4477 static void __exit beiscsi_module_exit(void)
4478 {
4479         pci_unregister_driver(&beiscsi_pci_driver);
4480         iscsi_unregister_transport(&beiscsi_iscsi_transport);
4481 }
4482
4483 module_init(beiscsi_module_init);
4484 module_exit(beiscsi_module_exit);