aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/be2iscsi/be_main.c
diff options
context:
space:
mode:
authorJohn Soni Jose <sony.john-n@emulex.com>2012-10-19 19:15:40 -0400
committerJames Bottomley <JBottomley@Parallels.com>2012-11-26 23:59:41 -0500
commite175defea7b2019613765fee63afcca354e0041d (patch)
treecf66278fcceaf328d3e4b34171455aae3398f88e /drivers/scsi/be2iscsi/be_main.c
parent5faf17b4f46c4c066ccd5eb2aa5b4a100ade2702 (diff)
[SCSI] be2iscsi: Fix for MBX timeout issue
The MBX timeout value set to 100 and if adapter doesn;t return response in that time driver will return from waiting for completion with an error to the caller. In the earlier code driver use to wait until MBX response comes from adapter. Signed-off-by: John Soni Jose <sony.john-n@emulex.com> Signed-off-by: Jayamohan Kallickal <jayamohan.kallickal@emulex.com> Reviewed-by: Mike Christie <michaelc@cs.wisc.edu> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Diffstat (limited to 'drivers/scsi/be2iscsi/be_main.c')
-rw-r--r--drivers/scsi/be2iscsi/be_main.c49
1 files changed, 20 insertions, 29 deletions
diff --git a/drivers/scsi/be2iscsi/be_main.c b/drivers/scsi/be2iscsi/be_main.c
index d3632d5cb248..73a29b2c18ba 100644
--- a/drivers/scsi/be2iscsi/be_main.c
+++ b/drivers/scsi/be2iscsi/be_main.c
@@ -267,11 +267,9 @@ static int beiscsi_eh_abort(struct scsi_cmnd *sc)
267 nonemb_cmd.va, nonemb_cmd.dma); 267 nonemb_cmd.va, nonemb_cmd.dma);
268 268
269 return FAILED; 269 return FAILED;
270 } else {
271 wait_event_interruptible(phba->ctrl.mcc_wait[tag],
272 phba->ctrl.mcc_numtag[tag]);
273 free_mcc_tag(&phba->ctrl, tag);
274 } 270 }
271
272 beiscsi_mccq_compl(phba, tag, NULL, nonemb_cmd.va);
275 pci_free_consistent(phba->ctrl.pdev, nonemb_cmd.size, 273 pci_free_consistent(phba->ctrl.pdev, nonemb_cmd.size,
276 nonemb_cmd.va, nonemb_cmd.dma); 274 nonemb_cmd.va, nonemb_cmd.dma);
277 return iscsi_eh_abort(sc); 275 return iscsi_eh_abort(sc);
@@ -342,11 +340,9 @@ static int beiscsi_eh_device_reset(struct scsi_cmnd *sc)
342 pci_free_consistent(phba->ctrl.pdev, nonemb_cmd.size, 340 pci_free_consistent(phba->ctrl.pdev, nonemb_cmd.size,
343 nonemb_cmd.va, nonemb_cmd.dma); 341 nonemb_cmd.va, nonemb_cmd.dma);
344 return FAILED; 342 return FAILED;
345 } else {
346 wait_event_interruptible(phba->ctrl.mcc_wait[tag],
347 phba->ctrl.mcc_numtag[tag]);
348 free_mcc_tag(&phba->ctrl, tag);
349 } 343 }
344
345 beiscsi_mccq_compl(phba, tag, NULL, nonemb_cmd.va);
350 pci_free_consistent(phba->ctrl.pdev, nonemb_cmd.size, 346 pci_free_consistent(phba->ctrl.pdev, nonemb_cmd.size,
351 nonemb_cmd.va, nonemb_cmd.dma); 347 nonemb_cmd.va, nonemb_cmd.dma);
352 return iscsi_eh_device_reset(sc); 348 return iscsi_eh_device_reset(sc);
@@ -3871,12 +3867,9 @@ static void hwi_disable_intr(struct beiscsi_hba *phba)
3871static int beiscsi_get_boot_info(struct beiscsi_hba *phba) 3867static int beiscsi_get_boot_info(struct beiscsi_hba *phba)
3872{ 3868{
3873 struct be_cmd_get_session_resp *session_resp; 3869 struct be_cmd_get_session_resp *session_resp;
3874 struct be_mcc_wrb *wrb;
3875 struct be_dma_mem nonemb_cmd; 3870 struct be_dma_mem nonemb_cmd;
3876 unsigned int tag, wrb_num; 3871 unsigned int tag;
3877 unsigned short status, extd_status;
3878 unsigned int s_handle; 3872 unsigned int s_handle;
3879 struct be_queue_info *mccq = &phba->ctrl.mcc_obj.q;
3880 int ret = -ENOMEM; 3873 int ret = -ENOMEM;
3881 3874
3882 /* Get the session handle of the boot target */ 3875 /* Get the session handle of the boot target */
@@ -3909,25 +3902,16 @@ static int beiscsi_get_boot_info(struct beiscsi_hba *phba)
3909 " Failed\n"); 3902 " Failed\n");
3910 3903
3911 goto boot_freemem; 3904 goto boot_freemem;
3912 } else 3905 }
3913 wait_event_interruptible(phba->ctrl.mcc_wait[tag],
3914 phba->ctrl.mcc_numtag[tag]);
3915 3906
3916 wrb_num = (phba->ctrl.mcc_numtag[tag] & 0x00FF0000) >> 16; 3907 ret = beiscsi_mccq_compl(phba, tag, NULL, nonemb_cmd.va);
3917 extd_status = (phba->ctrl.mcc_numtag[tag] & 0x0000FF00) >> 8; 3908 if (ret) {
3918 status = phba->ctrl.mcc_numtag[tag] & 0x000000FF;
3919 if (status || extd_status) {
3920 beiscsi_log(phba, KERN_ERR, 3909 beiscsi_log(phba, KERN_ERR,
3921 BEISCSI_LOG_INIT | BEISCSI_LOG_CONFIG, 3910 BEISCSI_LOG_INIT | BEISCSI_LOG_CONFIG,
3922 "BM_%d : beiscsi_get_session_info Failed" 3911 "BM_%d : beiscsi_get_session_info Failed");
3923 " status = %d extd_status = %d\n",
3924 status, extd_status);
3925
3926 free_mcc_tag(&phba->ctrl, tag);
3927 goto boot_freemem; 3912 goto boot_freemem;
3928 } 3913 }
3929 wrb = queue_get_wrb(mccq, wrb_num); 3914
3930 free_mcc_tag(&phba->ctrl, tag);
3931 session_resp = nonemb_cmd.va ; 3915 session_resp = nonemb_cmd.va ;
3932 3916
3933 memcpy(&phba->boot_sess, &session_resp->session_info, 3917 memcpy(&phba->boot_sess, &session_resp->session_info,
@@ -4643,9 +4627,13 @@ static int beiscsi_bsg_request(struct bsg_job *job)
4643 pci_free_consistent(phba->ctrl.pdev, nonemb_cmd.size, 4627 pci_free_consistent(phba->ctrl.pdev, nonemb_cmd.size,
4644 nonemb_cmd.va, nonemb_cmd.dma); 4628 nonemb_cmd.va, nonemb_cmd.dma);
4645 return -EAGAIN; 4629 return -EAGAIN;
4646 } else 4630 }
4647 wait_event_interruptible(phba->ctrl.mcc_wait[tag], 4631
4648 phba->ctrl.mcc_numtag[tag]); 4632 rc = wait_event_interruptible_timeout(
4633 phba->ctrl.mcc_wait[tag],
4634 phba->ctrl.mcc_numtag[tag],
4635 msecs_to_jiffies(
4636 BEISCSI_HOST_MBX_TIMEOUT));
4649 extd_status = (phba->ctrl.mcc_numtag[tag] & 0x0000FF00) >> 8; 4637 extd_status = (phba->ctrl.mcc_numtag[tag] & 0x0000FF00) >> 8;
4650 status = phba->ctrl.mcc_numtag[tag] & 0x000000FF; 4638 status = phba->ctrl.mcc_numtag[tag] & 0x000000FF;
4651 free_mcc_tag(&phba->ctrl, tag); 4639 free_mcc_tag(&phba->ctrl, tag);
@@ -4807,6 +4795,9 @@ static int __devinit beiscsi_dev_probe(struct pci_dev *pcidev,
4807 /* Initialize Driver configuration Paramters */ 4795 /* Initialize Driver configuration Paramters */
4808 beiscsi_hba_attrs_init(phba); 4796 beiscsi_hba_attrs_init(phba);
4809 4797
4798 phba->fw_timeout = false;
4799
4800
4810 switch (pcidev->device) { 4801 switch (pcidev->device) {
4811 case BE_DEVICE_ID1: 4802 case BE_DEVICE_ID1:
4812 case OC_DEVICE_ID1: 4803 case OC_DEVICE_ID1: