diff options
author | Seokmann Ju <seokmann.ju@qlogic.com> | 2009-03-24 12:08:18 -0400 |
---|---|---|
committer | James Bottomley <James.Bottomley@HansenPartnership.com> | 2009-04-03 10:22:53 -0400 |
commit | b9b12f73dff15915914f51bbff7620f5dd49b3de (patch) | |
tree | 870f134a8d3c2bfe35dc112be6f1d43b2e32d8e6 /drivers/scsi/qla2xxx/qla_os.c | |
parent | 6749ce362d38b47bd4669ccc0cafcc0014bff6e9 (diff) |
[SCSI] qla2xxx: Correct several PCI-EEH issues.
In addition to checking for potentially unnecessary iomem
readX()/writeX() operations, a pci_channel_io_perm_failure should
not trigger a full internal removal. Found during additional
testing with pSeries blade systems.
Signed-off-by: Seokmann Ju <seokmann.ju@qlogic.com>
Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Diffstat (limited to 'drivers/scsi/qla2xxx/qla_os.c')
-rw-r--r-- | drivers/scsi/qla2xxx/qla_os.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index 7e038e4107a5..efe29924e058 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c | |||
@@ -407,7 +407,10 @@ qla2xxx_queuecommand(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *)) | |||
407 | int rval; | 407 | int rval; |
408 | 408 | ||
409 | if (unlikely(pci_channel_offline(ha->pdev))) { | 409 | if (unlikely(pci_channel_offline(ha->pdev))) { |
410 | cmd->result = DID_REQUEUE << 16; | 410 | if (ha->pdev->error_state == pci_channel_io_frozen) |
411 | cmd->result = DID_REQUEUE << 16; | ||
412 | else | ||
413 | cmd->result = DID_NO_CONNECT << 16; | ||
411 | goto qc24_fail_command; | 414 | goto qc24_fail_command; |
412 | } | 415 | } |
413 | 416 | ||
@@ -2990,6 +2993,8 @@ qla2x00_release_firmware(void) | |||
2990 | static pci_ers_result_t | 2993 | static pci_ers_result_t |
2991 | qla2xxx_pci_error_detected(struct pci_dev *pdev, pci_channel_state_t state) | 2994 | qla2xxx_pci_error_detected(struct pci_dev *pdev, pci_channel_state_t state) |
2992 | { | 2995 | { |
2996 | scsi_qla_host_t *base_vha = pci_get_drvdata(pdev); | ||
2997 | |||
2993 | switch (state) { | 2998 | switch (state) { |
2994 | case pci_channel_io_normal: | 2999 | case pci_channel_io_normal: |
2995 | return PCI_ERS_RESULT_CAN_RECOVER; | 3000 | return PCI_ERS_RESULT_CAN_RECOVER; |
@@ -2997,7 +3002,7 @@ qla2xxx_pci_error_detected(struct pci_dev *pdev, pci_channel_state_t state) | |||
2997 | pci_disable_device(pdev); | 3002 | pci_disable_device(pdev); |
2998 | return PCI_ERS_RESULT_NEED_RESET; | 3003 | return PCI_ERS_RESULT_NEED_RESET; |
2999 | case pci_channel_io_perm_failure: | 3004 | case pci_channel_io_perm_failure: |
3000 | qla2x00_remove_one(pdev); | 3005 | qla2x00_abort_all_cmds(base_vha, DID_NO_CONNECT << 16); |
3001 | return PCI_ERS_RESULT_DISCONNECT; | 3006 | return PCI_ERS_RESULT_DISCONNECT; |
3002 | } | 3007 | } |
3003 | return PCI_ERS_RESULT_NEED_RESET; | 3008 | return PCI_ERS_RESULT_NEED_RESET; |