diff options
Diffstat (limited to 'drivers/scsi/bnx2i')
-rw-r--r-- | drivers/scsi/bnx2i/bnx2i.h | 4 | ||||
-rw-r--r-- | drivers/scsi/bnx2i/bnx2i_hwi.c | 52 | ||||
-rw-r--r-- | drivers/scsi/bnx2i/bnx2i_init.c | 29 | ||||
-rw-r--r-- | drivers/scsi/bnx2i/bnx2i_iscsi.c | 35 |
4 files changed, 85 insertions, 35 deletions
diff --git a/drivers/scsi/bnx2i/bnx2i.h b/drivers/scsi/bnx2i/bnx2i.h index 5edde1a8c04d..6b624e767d3b 100644 --- a/drivers/scsi/bnx2i/bnx2i.h +++ b/drivers/scsi/bnx2i/bnx2i.h | |||
@@ -232,7 +232,6 @@ struct bnx2i_conn { | |||
232 | struct iscsi_cls_conn *cls_conn; | 232 | struct iscsi_cls_conn *cls_conn; |
233 | struct bnx2i_hba *hba; | 233 | struct bnx2i_hba *hba; |
234 | struct completion cmd_cleanup_cmpl; | 234 | struct completion cmd_cleanup_cmpl; |
235 | int is_bound; | ||
236 | 235 | ||
237 | u32 iscsi_conn_cid; | 236 | u32 iscsi_conn_cid; |
238 | #define BNX2I_CID_RESERVED 0x5AFF | 237 | #define BNX2I_CID_RESERVED 0x5AFF |
@@ -363,6 +362,7 @@ struct bnx2i_hba { | |||
363 | u32 num_ccell; | 362 | u32 num_ccell; |
364 | 363 | ||
365 | int ofld_conns_active; | 364 | int ofld_conns_active; |
365 | wait_queue_head_t eh_wait; | ||
366 | 366 | ||
367 | int max_active_conns; | 367 | int max_active_conns; |
368 | struct iscsi_cid_queue cid_que; | 368 | struct iscsi_cid_queue cid_que; |
@@ -382,6 +382,7 @@ struct bnx2i_hba { | |||
382 | spinlock_t lock; /* protects hba structure access */ | 382 | spinlock_t lock; /* protects hba structure access */ |
383 | struct mutex net_dev_lock;/* sync net device access */ | 383 | struct mutex net_dev_lock;/* sync net device access */ |
384 | 384 | ||
385 | int hba_shutdown_tmo; | ||
385 | /* | 386 | /* |
386 | * PCI related info. | 387 | * PCI related info. |
387 | */ | 388 | */ |
@@ -685,6 +686,7 @@ extern unsigned int error_mask1, error_mask2; | |||
685 | extern u64 iscsi_error_mask; | 686 | extern u64 iscsi_error_mask; |
686 | extern unsigned int en_tcp_dack; | 687 | extern unsigned int en_tcp_dack; |
687 | extern unsigned int event_coal_div; | 688 | extern unsigned int event_coal_div; |
689 | extern unsigned int event_coal_min; | ||
688 | 690 | ||
689 | extern struct scsi_transport_template *bnx2i_scsi_xport_template; | 691 | extern struct scsi_transport_template *bnx2i_scsi_xport_template; |
690 | extern struct iscsi_transport bnx2i_iscsi_transport; | 692 | extern struct iscsi_transport bnx2i_iscsi_transport; |
diff --git a/drivers/scsi/bnx2i/bnx2i_hwi.c b/drivers/scsi/bnx2i/bnx2i_hwi.c index 5c8d7630c13e..18352ff82101 100644 --- a/drivers/scsi/bnx2i/bnx2i_hwi.c +++ b/drivers/scsi/bnx2i/bnx2i_hwi.c | |||
@@ -11,6 +11,7 @@ | |||
11 | * Written by: Anil Veerabhadrappa (anilgv@broadcom.com) | 11 | * Written by: Anil Veerabhadrappa (anilgv@broadcom.com) |
12 | */ | 12 | */ |
13 | 13 | ||
14 | #include <linux/gfp.h> | ||
14 | #include <scsi/scsi_tcq.h> | 15 | #include <scsi/scsi_tcq.h> |
15 | #include <scsi/libiscsi.h> | 16 | #include <scsi/libiscsi.h> |
16 | #include "bnx2i.h" | 17 | #include "bnx2i.h" |
@@ -133,20 +134,38 @@ void bnx2i_arm_cq_event_coalescing(struct bnx2i_endpoint *ep, u8 action) | |||
133 | { | 134 | { |
134 | struct bnx2i_5771x_cq_db *cq_db; | 135 | struct bnx2i_5771x_cq_db *cq_db; |
135 | u16 cq_index; | 136 | u16 cq_index; |
137 | u16 next_index; | ||
138 | u32 num_active_cmds; | ||
136 | 139 | ||
140 | |||
141 | /* Coalesce CQ entries only on 10G devices */ | ||
137 | if (!test_bit(BNX2I_NX2_DEV_57710, &ep->hba->cnic_dev_type)) | 142 | if (!test_bit(BNX2I_NX2_DEV_57710, &ep->hba->cnic_dev_type)) |
138 | return; | 143 | return; |
139 | 144 | ||
145 | /* Do not update CQ DB multiple times before firmware writes | ||
146 | * '0xFFFF' to CQDB->SQN field. Deviation may cause spurious | ||
147 | * interrupts and other unwanted results | ||
148 | */ | ||
149 | cq_db = (struct bnx2i_5771x_cq_db *) ep->qp.cq_pgtbl_virt; | ||
150 | if (cq_db->sqn[0] && cq_db->sqn[0] != 0xFFFF) | ||
151 | return; | ||
152 | |||
140 | if (action == CNIC_ARM_CQE) { | 153 | if (action == CNIC_ARM_CQE) { |
141 | cq_index = ep->qp.cqe_exp_seq_sn + | 154 | num_active_cmds = ep->num_active_cmds; |
142 | ep->num_active_cmds / event_coal_div; | 155 | if (num_active_cmds <= event_coal_min) |
143 | cq_index %= (ep->qp.cqe_size * 2 + 1); | 156 | next_index = 1; |
144 | if (!cq_index) { | 157 | else |
158 | next_index = event_coal_min + | ||
159 | (num_active_cmds - event_coal_min) / event_coal_div; | ||
160 | if (!next_index) | ||
161 | next_index = 1; | ||
162 | cq_index = ep->qp.cqe_exp_seq_sn + next_index - 1; | ||
163 | if (cq_index > ep->qp.cqe_size * 2) | ||
164 | cq_index -= ep->qp.cqe_size * 2; | ||
165 | if (!cq_index) | ||
145 | cq_index = 1; | 166 | cq_index = 1; |
146 | cq_db = (struct bnx2i_5771x_cq_db *) | 167 | |
147 | ep->qp.cq_pgtbl_virt; | 168 | cq_db->sqn[0] = cq_index; |
148 | cq_db->sqn[0] = cq_index; | ||
149 | } | ||
150 | } | 169 | } |
151 | } | 170 | } |
152 | 171 | ||
@@ -366,6 +385,7 @@ int bnx2i_send_iscsi_tmf(struct bnx2i_conn *bnx2i_conn, | |||
366 | struct bnx2i_cmd *bnx2i_cmd; | 385 | struct bnx2i_cmd *bnx2i_cmd; |
367 | struct bnx2i_tmf_request *tmfabort_wqe; | 386 | struct bnx2i_tmf_request *tmfabort_wqe; |
368 | u32 dword; | 387 | u32 dword; |
388 | u32 scsi_lun[2]; | ||
369 | 389 | ||
370 | bnx2i_cmd = (struct bnx2i_cmd *)mtask->dd_data; | 390 | bnx2i_cmd = (struct bnx2i_cmd *)mtask->dd_data; |
371 | tmfabort_hdr = (struct iscsi_tm *)mtask->hdr; | 391 | tmfabort_hdr = (struct iscsi_tm *)mtask->hdr; |
@@ -376,27 +396,35 @@ int bnx2i_send_iscsi_tmf(struct bnx2i_conn *bnx2i_conn, | |||
376 | tmfabort_wqe->op_attr = 0; | 396 | tmfabort_wqe->op_attr = 0; |
377 | tmfabort_wqe->op_attr = | 397 | tmfabort_wqe->op_attr = |
378 | ISCSI_TMF_REQUEST_ALWAYS_ONE | ISCSI_TM_FUNC_ABORT_TASK; | 398 | ISCSI_TMF_REQUEST_ALWAYS_ONE | ISCSI_TM_FUNC_ABORT_TASK; |
379 | tmfabort_wqe->lun[0] = be32_to_cpu(tmfabort_hdr->lun[0]); | ||
380 | tmfabort_wqe->lun[1] = be32_to_cpu(tmfabort_hdr->lun[1]); | ||
381 | 399 | ||
382 | tmfabort_wqe->itt = (mtask->itt | (ISCSI_TASK_TYPE_MPATH << 14)); | 400 | tmfabort_wqe->itt = (mtask->itt | (ISCSI_TASK_TYPE_MPATH << 14)); |
383 | tmfabort_wqe->reserved2 = 0; | 401 | tmfabort_wqe->reserved2 = 0; |
384 | tmfabort_wqe->cmd_sn = be32_to_cpu(tmfabort_hdr->cmdsn); | 402 | tmfabort_wqe->cmd_sn = be32_to_cpu(tmfabort_hdr->cmdsn); |
385 | 403 | ||
386 | ctask = iscsi_itt_to_task(conn, tmfabort_hdr->rtt); | 404 | ctask = iscsi_itt_to_task(conn, tmfabort_hdr->rtt); |
387 | if (!ctask || ctask->sc) | 405 | if (!ctask || !ctask->sc) |
388 | /* | 406 | /* |
389 | * the iscsi layer must have completed the cmd while this | 407 | * the iscsi layer must have completed the cmd while this |
390 | * was starting up. | 408 | * was starting up. |
409 | * | ||
410 | * Note: In the case of a SCSI cmd timeout, the task's sc | ||
411 | * is still active; hence ctask->sc != 0 | ||
412 | * In this case, the task must be aborted | ||
391 | */ | 413 | */ |
392 | return 0; | 414 | return 0; |
415 | |||
393 | ref_sc = ctask->sc; | 416 | ref_sc = ctask->sc; |
394 | 417 | ||
418 | /* Retrieve LUN directly from the ref_sc */ | ||
419 | int_to_scsilun(ref_sc->device->lun, (struct scsi_lun *) scsi_lun); | ||
420 | tmfabort_wqe->lun[0] = be32_to_cpu(scsi_lun[0]); | ||
421 | tmfabort_wqe->lun[1] = be32_to_cpu(scsi_lun[1]); | ||
422 | |||
395 | if (ref_sc->sc_data_direction == DMA_TO_DEVICE) | 423 | if (ref_sc->sc_data_direction == DMA_TO_DEVICE) |
396 | dword = (ISCSI_TASK_TYPE_WRITE << ISCSI_CMD_REQUEST_TYPE_SHIFT); | 424 | dword = (ISCSI_TASK_TYPE_WRITE << ISCSI_CMD_REQUEST_TYPE_SHIFT); |
397 | else | 425 | else |
398 | dword = (ISCSI_TASK_TYPE_READ << ISCSI_CMD_REQUEST_TYPE_SHIFT); | 426 | dword = (ISCSI_TASK_TYPE_READ << ISCSI_CMD_REQUEST_TYPE_SHIFT); |
399 | tmfabort_wqe->ref_itt = (dword | tmfabort_hdr->rtt); | 427 | tmfabort_wqe->ref_itt = (dword | (tmfabort_hdr->rtt & ISCSI_ITT_MASK)); |
400 | tmfabort_wqe->ref_cmd_sn = be32_to_cpu(tmfabort_hdr->refcmdsn); | 428 | tmfabort_wqe->ref_cmd_sn = be32_to_cpu(tmfabort_hdr->refcmdsn); |
401 | 429 | ||
402 | tmfabort_wqe->bd_list_addr_lo = (u32) bnx2i_conn->hba->mp_bd_dma; | 430 | tmfabort_wqe->bd_list_addr_lo = (u32) bnx2i_conn->hba->mp_bd_dma; |
diff --git a/drivers/scsi/bnx2i/bnx2i_init.c b/drivers/scsi/bnx2i/bnx2i_init.c index 0c4210d48ee8..5d9296c599f6 100644 --- a/drivers/scsi/bnx2i/bnx2i_init.c +++ b/drivers/scsi/bnx2i/bnx2i_init.c | |||
@@ -17,8 +17,8 @@ static struct list_head adapter_list = LIST_HEAD_INIT(adapter_list); | |||
17 | static u32 adapter_count; | 17 | static u32 adapter_count; |
18 | 18 | ||
19 | #define DRV_MODULE_NAME "bnx2i" | 19 | #define DRV_MODULE_NAME "bnx2i" |
20 | #define DRV_MODULE_VERSION "2.0.1e" | 20 | #define DRV_MODULE_VERSION "2.1.0" |
21 | #define DRV_MODULE_RELDATE "June 22, 2009" | 21 | #define DRV_MODULE_RELDATE "Dec 06, 2009" |
22 | 22 | ||
23 | static char version[] __devinitdata = | 23 | static char version[] __devinitdata = |
24 | "Broadcom NetXtreme II iSCSI Driver " DRV_MODULE_NAME \ | 24 | "Broadcom NetXtreme II iSCSI Driver " DRV_MODULE_NAME \ |
@@ -32,6 +32,10 @@ MODULE_VERSION(DRV_MODULE_VERSION); | |||
32 | 32 | ||
33 | static DEFINE_MUTEX(bnx2i_dev_lock); | 33 | static DEFINE_MUTEX(bnx2i_dev_lock); |
34 | 34 | ||
35 | unsigned int event_coal_min = 24; | ||
36 | module_param(event_coal_min, int, 0664); | ||
37 | MODULE_PARM_DESC(event_coal_min, "Event Coalescing Minimum Commands"); | ||
38 | |||
35 | unsigned int event_coal_div = 1; | 39 | unsigned int event_coal_div = 1; |
36 | module_param(event_coal_div, int, 0664); | 40 | module_param(event_coal_div, int, 0664); |
37 | MODULE_PARM_DESC(event_coal_div, "Event Coalescing Divide Factor"); | 41 | MODULE_PARM_DESC(event_coal_div, "Event Coalescing Divide Factor"); |
@@ -83,8 +87,12 @@ void bnx2i_identify_device(struct bnx2i_hba *hba) | |||
83 | set_bit(BNX2I_NX2_DEV_5709, &hba->cnic_dev_type); | 87 | set_bit(BNX2I_NX2_DEV_5709, &hba->cnic_dev_type); |
84 | hba->mail_queue_access = BNX2I_MQ_BIN_MODE; | 88 | hba->mail_queue_access = BNX2I_MQ_BIN_MODE; |
85 | } else if (hba->pci_did == PCI_DEVICE_ID_NX2_57710 || | 89 | } else if (hba->pci_did == PCI_DEVICE_ID_NX2_57710 || |
86 | hba->pci_did == PCI_DEVICE_ID_NX2_57711) | 90 | hba->pci_did == PCI_DEVICE_ID_NX2_57711 || |
91 | hba->pci_did == PCI_DEVICE_ID_NX2_57711E) | ||
87 | set_bit(BNX2I_NX2_DEV_57710, &hba->cnic_dev_type); | 92 | set_bit(BNX2I_NX2_DEV_57710, &hba->cnic_dev_type); |
93 | else | ||
94 | printk(KERN_ALERT "bnx2i: unknown device, 0x%x\n", | ||
95 | hba->pci_did); | ||
88 | } | 96 | } |
89 | 97 | ||
90 | 98 | ||
@@ -169,11 +177,22 @@ void bnx2i_stop(void *handle) | |||
169 | struct bnx2i_hba *hba = handle; | 177 | struct bnx2i_hba *hba = handle; |
170 | 178 | ||
171 | /* check if cleanup happened in GOING_DOWN context */ | 179 | /* check if cleanup happened in GOING_DOWN context */ |
172 | clear_bit(ADAPTER_STATE_UP, &hba->adapter_state); | ||
173 | if (!test_and_clear_bit(ADAPTER_STATE_GOING_DOWN, | 180 | if (!test_and_clear_bit(ADAPTER_STATE_GOING_DOWN, |
174 | &hba->adapter_state)) | 181 | &hba->adapter_state)) |
175 | iscsi_host_for_each_session(hba->shost, | 182 | iscsi_host_for_each_session(hba->shost, |
176 | bnx2i_drop_session); | 183 | bnx2i_drop_session); |
184 | |||
185 | /* Wait for all endpoints to be torn down, Chip will be reset once | ||
186 | * control returns to network driver. So it is required to cleanup and | ||
187 | * release all connection resources before returning from this routine. | ||
188 | */ | ||
189 | wait_event_interruptible_timeout(hba->eh_wait, | ||
190 | (hba->ofld_conns_active == 0), | ||
191 | hba->hba_shutdown_tmo); | ||
192 | /* This flag should be cleared last so that ep_disconnect() gracefully | ||
193 | * cleans up connection context | ||
194 | */ | ||
195 | clear_bit(ADAPTER_STATE_UP, &hba->adapter_state); | ||
177 | } | 196 | } |
178 | 197 | ||
179 | /** | 198 | /** |
@@ -363,7 +382,7 @@ static int __init bnx2i_mod_init(void) | |||
363 | 382 | ||
364 | printk(KERN_INFO "%s", version); | 383 | printk(KERN_INFO "%s", version); |
365 | 384 | ||
366 | if (!is_power_of_2(sq_size)) | 385 | if (sq_size && !is_power_of_2(sq_size)) |
367 | sq_size = roundup_pow_of_two(sq_size); | 386 | sq_size = roundup_pow_of_two(sq_size); |
368 | 387 | ||
369 | mutex_init(&bnx2i_dev_lock); | 388 | mutex_init(&bnx2i_dev_lock); |
diff --git a/drivers/scsi/bnx2i/bnx2i_iscsi.c b/drivers/scsi/bnx2i/bnx2i_iscsi.c index cafb888c2376..fa68ab34b998 100644 --- a/drivers/scsi/bnx2i/bnx2i_iscsi.c +++ b/drivers/scsi/bnx2i/bnx2i_iscsi.c | |||
@@ -12,6 +12,7 @@ | |||
12 | * Written by: Anil Veerabhadrappa (anilgv@broadcom.com) | 12 | * Written by: Anil Veerabhadrappa (anilgv@broadcom.com) |
13 | */ | 13 | */ |
14 | 14 | ||
15 | #include <linux/slab.h> | ||
15 | #include <scsi/scsi_tcq.h> | 16 | #include <scsi/scsi_tcq.h> |
16 | #include <scsi/libiscsi.h> | 17 | #include <scsi/libiscsi.h> |
17 | #include "bnx2i.h" | 18 | #include "bnx2i.h" |
@@ -485,7 +486,6 @@ static int bnx2i_setup_cmd_pool(struct bnx2i_hba *hba, | |||
485 | struct iscsi_task *task = session->cmds[i]; | 486 | struct iscsi_task *task = session->cmds[i]; |
486 | struct bnx2i_cmd *cmd = task->dd_data; | 487 | struct bnx2i_cmd *cmd = task->dd_data; |
487 | 488 | ||
488 | /* Anil */ | ||
489 | task->hdr = &cmd->hdr; | 489 | task->hdr = &cmd->hdr; |
490 | task->hdr_max = sizeof(struct iscsi_hdr); | 490 | task->hdr_max = sizeof(struct iscsi_hdr); |
491 | 491 | ||
@@ -765,7 +765,6 @@ struct bnx2i_hba *bnx2i_alloc_hba(struct cnic_dev *cnic) | |||
765 | hba->pci_svid = hba->pcidev->subsystem_vendor; | 765 | hba->pci_svid = hba->pcidev->subsystem_vendor; |
766 | hba->pci_func = PCI_FUNC(hba->pcidev->devfn); | 766 | hba->pci_func = PCI_FUNC(hba->pcidev->devfn); |
767 | hba->pci_devno = PCI_SLOT(hba->pcidev->devfn); | 767 | hba->pci_devno = PCI_SLOT(hba->pcidev->devfn); |
768 | bnx2i_identify_device(hba); | ||
769 | 768 | ||
770 | bnx2i_identify_device(hba); | 769 | bnx2i_identify_device(hba); |
771 | bnx2i_setup_host_queue_size(hba, shost); | 770 | bnx2i_setup_host_queue_size(hba, shost); |
@@ -821,6 +820,11 @@ struct bnx2i_hba *bnx2i_alloc_hba(struct cnic_dev *cnic) | |||
821 | 820 | ||
822 | spin_lock_init(&hba->lock); | 821 | spin_lock_init(&hba->lock); |
823 | mutex_init(&hba->net_dev_lock); | 822 | mutex_init(&hba->net_dev_lock); |
823 | init_waitqueue_head(&hba->eh_wait); | ||
824 | if (test_bit(BNX2I_NX2_DEV_57710, &hba->cnic_dev_type)) | ||
825 | hba->hba_shutdown_tmo = 240 * HZ; | ||
826 | else /* 5706/5708/5709 */ | ||
827 | hba->hba_shutdown_tmo = 30 * HZ; | ||
824 | 828 | ||
825 | if (iscsi_host_add(shost, &hba->pcidev->dev)) | 829 | if (iscsi_host_add(shost, &hba->pcidev->dev)) |
826 | goto free_dump_mem; | 830 | goto free_dump_mem; |
@@ -1161,9 +1165,6 @@ static int bnx2i_task_xmit(struct iscsi_task *task) | |||
1161 | struct bnx2i_cmd *cmd = task->dd_data; | 1165 | struct bnx2i_cmd *cmd = task->dd_data; |
1162 | struct iscsi_cmd *hdr = (struct iscsi_cmd *) task->hdr; | 1166 | struct iscsi_cmd *hdr = (struct iscsi_cmd *) task->hdr; |
1163 | 1167 | ||
1164 | if (!bnx2i_conn->is_bound) | ||
1165 | return -ENOTCONN; | ||
1166 | |||
1167 | /* | 1168 | /* |
1168 | * If there is no scsi_cmnd this must be a mgmt task | 1169 | * If there is no scsi_cmnd this must be a mgmt task |
1169 | */ | 1170 | */ |
@@ -1371,7 +1372,6 @@ static int bnx2i_conn_bind(struct iscsi_cls_session *cls_session, | |||
1371 | bnx2i_conn->ep = bnx2i_ep; | 1372 | bnx2i_conn->ep = bnx2i_ep; |
1372 | bnx2i_conn->iscsi_conn_cid = bnx2i_ep->ep_iscsi_cid; | 1373 | bnx2i_conn->iscsi_conn_cid = bnx2i_ep->ep_iscsi_cid; |
1373 | bnx2i_conn->fw_cid = bnx2i_ep->ep_cid; | 1374 | bnx2i_conn->fw_cid = bnx2i_ep->ep_cid; |
1374 | bnx2i_conn->is_bound = 1; | ||
1375 | 1375 | ||
1376 | ret_code = bnx2i_bind_conn_to_iscsi_cid(hba, bnx2i_conn, | 1376 | ret_code = bnx2i_bind_conn_to_iscsi_cid(hba, bnx2i_conn, |
1377 | bnx2i_ep->ep_iscsi_cid); | 1377 | bnx2i_ep->ep_iscsi_cid); |
@@ -1432,8 +1432,8 @@ static int bnx2i_conn_get_param(struct iscsi_cls_conn *cls_conn, | |||
1432 | break; | 1432 | break; |
1433 | case ISCSI_PARAM_CONN_ADDRESS: | 1433 | case ISCSI_PARAM_CONN_ADDRESS: |
1434 | if (bnx2i_conn->ep) | 1434 | if (bnx2i_conn->ep) |
1435 | len = sprintf(buf, NIPQUAD_FMT "\n", | 1435 | len = sprintf(buf, "%pI4\n", |
1436 | NIPQUAD(bnx2i_conn->ep->cm_sk->dst_ip)); | 1436 | &bnx2i_conn->ep->cm_sk->dst_ip); |
1437 | break; | 1437 | break; |
1438 | default: | 1438 | default: |
1439 | return iscsi_conn_get_param(cls_conn, param, buf); | 1439 | return iscsi_conn_get_param(cls_conn, param, buf); |
@@ -1663,8 +1663,8 @@ static struct iscsi_endpoint *bnx2i_ep_connect(struct Scsi_Host *shost, | |||
1663 | */ | 1663 | */ |
1664 | hba = bnx2i_check_route(dst_addr); | 1664 | hba = bnx2i_check_route(dst_addr); |
1665 | 1665 | ||
1666 | if (!hba) { | 1666 | if (!hba || test_bit(ADAPTER_STATE_GOING_DOWN, &hba->adapter_state)) { |
1667 | rc = -ENOMEM; | 1667 | rc = -EINVAL; |
1668 | goto check_busy; | 1668 | goto check_busy; |
1669 | } | 1669 | } |
1670 | 1670 | ||
@@ -1809,7 +1809,7 @@ static int bnx2i_ep_poll(struct iscsi_endpoint *ep, int timeout_ms) | |||
1809 | (bnx2i_ep->state == | 1809 | (bnx2i_ep->state == |
1810 | EP_STATE_CONNECT_COMPL)), | 1810 | EP_STATE_CONNECT_COMPL)), |
1811 | msecs_to_jiffies(timeout_ms)); | 1811 | msecs_to_jiffies(timeout_ms)); |
1812 | if (!rc || (bnx2i_ep->state == EP_STATE_OFLD_FAILED)) | 1812 | if (bnx2i_ep->state == EP_STATE_OFLD_FAILED) |
1813 | rc = -1; | 1813 | rc = -1; |
1814 | 1814 | ||
1815 | if (rc > 0) | 1815 | if (rc > 0) |
@@ -1883,7 +1883,7 @@ static void bnx2i_ep_disconnect(struct iscsi_endpoint *ep) | |||
1883 | 1883 | ||
1884 | bnx2i_ep = ep->dd_data; | 1884 | bnx2i_ep = ep->dd_data; |
1885 | 1885 | ||
1886 | /* driver should not attempt connection cleanup untill TCP_CONNECT | 1886 | /* driver should not attempt connection cleanup until TCP_CONNECT |
1887 | * completes either successfully or fails. Timeout is 9-secs, so | 1887 | * completes either successfully or fails. Timeout is 9-secs, so |
1888 | * wait for it to complete | 1888 | * wait for it to complete |
1889 | */ | 1889 | */ |
@@ -1896,9 +1896,7 @@ static void bnx2i_ep_disconnect(struct iscsi_endpoint *ep) | |||
1896 | conn = bnx2i_conn->cls_conn->dd_data; | 1896 | conn = bnx2i_conn->cls_conn->dd_data; |
1897 | session = conn->session; | 1897 | session = conn->session; |
1898 | 1898 | ||
1899 | spin_lock_bh(&session->lock); | 1899 | iscsi_suspend_queue(conn); |
1900 | bnx2i_conn->is_bound = 0; | ||
1901 | spin_unlock_bh(&session->lock); | ||
1902 | } | 1900 | } |
1903 | 1901 | ||
1904 | hba = bnx2i_ep->hba; | 1902 | hba = bnx2i_ep->hba; |
@@ -1964,6 +1962,8 @@ return_bnx2i_ep: | |||
1964 | 1962 | ||
1965 | if (!hba->ofld_conns_active) | 1963 | if (!hba->ofld_conns_active) |
1966 | bnx2i_unreg_dev_all(); | 1964 | bnx2i_unreg_dev_all(); |
1965 | |||
1966 | wake_up_interruptible(&hba->eh_wait); | ||
1967 | } | 1967 | } |
1968 | 1968 | ||
1969 | 1969 | ||
@@ -1997,7 +1997,8 @@ static struct scsi_host_template bnx2i_host_template = { | |||
1997 | .queuecommand = iscsi_queuecommand, | 1997 | .queuecommand = iscsi_queuecommand, |
1998 | .eh_abort_handler = iscsi_eh_abort, | 1998 | .eh_abort_handler = iscsi_eh_abort, |
1999 | .eh_device_reset_handler = iscsi_eh_device_reset, | 1999 | .eh_device_reset_handler = iscsi_eh_device_reset, |
2000 | .eh_target_reset_handler = iscsi_eh_target_reset, | 2000 | .eh_target_reset_handler = iscsi_eh_recover_target, |
2001 | .change_queue_depth = iscsi_change_queue_depth, | ||
2001 | .can_queue = 1024, | 2002 | .can_queue = 1024, |
2002 | .max_sectors = 127, | 2003 | .max_sectors = 127, |
2003 | .cmd_per_lun = 32, | 2004 | .cmd_per_lun = 32, |
@@ -2034,7 +2035,7 @@ struct iscsi_transport bnx2i_iscsi_transport = { | |||
2034 | ISCSI_USERNAME | ISCSI_PASSWORD | | 2035 | ISCSI_USERNAME | ISCSI_PASSWORD | |
2035 | ISCSI_USERNAME_IN | ISCSI_PASSWORD_IN | | 2036 | ISCSI_USERNAME_IN | ISCSI_PASSWORD_IN | |
2036 | ISCSI_FAST_ABORT | ISCSI_ABORT_TMO | | 2037 | ISCSI_FAST_ABORT | ISCSI_ABORT_TMO | |
2037 | ISCSI_LU_RESET_TMO | | 2038 | ISCSI_LU_RESET_TMO | ISCSI_TGT_RESET_TMO | |
2038 | ISCSI_PING_TMO | ISCSI_RECV_TMO | | 2039 | ISCSI_PING_TMO | ISCSI_RECV_TMO | |
2039 | ISCSI_IFACE_NAME | ISCSI_INITIATOR_NAME, | 2040 | ISCSI_IFACE_NAME | ISCSI_INITIATOR_NAME, |
2040 | .host_param_mask = ISCSI_HOST_HWADDRESS | ISCSI_HOST_NETDEV_NAME, | 2041 | .host_param_mask = ISCSI_HOST_HWADDRESS | ISCSI_HOST_NETDEV_NAME, |