diff options
author | Giridhar Malavali <giridhar.malavali@qlogic.com> | 2010-07-23 06:28:35 -0400 |
---|---|---|
committer | James Bottomley <James.Bottomley@suse.de> | 2010-07-28 10:06:15 -0400 |
commit | 4d78c973ef2d21e90ff55f97489d663a0959a93f (patch) | |
tree | 5d82916649e2578d1baad596a7d20bf951a5ed6f /drivers/scsi/qla2xxx | |
parent | 3711333dfbeec1905c2d3521d1ed2ddcdbdbac04 (diff) |
[SCSI] qla2xxx: Rearranged and cleaned up the code for processing the pending commands.
Signed-off-by: Giridhar Malavali <giridhar.malavali@qlogic.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'drivers/scsi/qla2xxx')
-rw-r--r-- | drivers/scsi/qla2xxx/qla_def.h | 10 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_gbl.h | 5 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_init.c | 9 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_os.c | 41 |
4 files changed, 25 insertions, 40 deletions
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h index 7e11ccf0fe81..84e9c6b48ca3 100644 --- a/drivers/scsi/qla2xxx/qla_def.h +++ b/drivers/scsi/qla2xxx/qla_def.h | |||
@@ -2981,9 +2981,15 @@ typedef struct scsi_qla_host { | |||
2981 | 2981 | ||
2982 | #define QLA_DSDS_PER_IOCB 37 | 2982 | #define QLA_DSDS_PER_IOCB 37 |
2983 | 2983 | ||
2984 | #define CMD_SP(Cmnd) ((Cmnd)->SCp.ptr) | ||
2985 | |||
2986 | enum nexus_wait_type { | ||
2987 | WAIT_HOST = 0, | ||
2988 | WAIT_TARGET, | ||
2989 | WAIT_LUN, | ||
2990 | }; | ||
2991 | |||
2984 | #include "qla_gbl.h" | 2992 | #include "qla_gbl.h" |
2985 | #include "qla_dbg.h" | 2993 | #include "qla_dbg.h" |
2986 | #include "qla_inline.h" | 2994 | #include "qla_inline.h" |
2987 | |||
2988 | #define CMD_SP(Cmnd) ((Cmnd)->SCp.ptr) | ||
2989 | #endif | 2995 | #endif |
diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h index 8b0a8ca95086..4688ad2a559e 100644 --- a/drivers/scsi/qla2xxx/qla_gbl.h +++ b/drivers/scsi/qla2xxx/qla_gbl.h | |||
@@ -292,7 +292,9 @@ extern int | |||
292 | qla24xx_abort_target(struct fc_port *, unsigned int, int); | 292 | qla24xx_abort_target(struct fc_port *, unsigned int, int); |
293 | extern int | 293 | extern int |
294 | qla24xx_lun_reset(struct fc_port *, unsigned int, int); | 294 | qla24xx_lun_reset(struct fc_port *, unsigned int, int); |
295 | 295 | extern int | |
296 | qla2x00_eh_wait_for_pending_commands(scsi_qla_host_t *, unsigned int, | ||
297 | unsigned int, enum nexus_wait_type); | ||
296 | extern int | 298 | extern int |
297 | qla2x00_system_error(scsi_qla_host_t *); | 299 | qla2x00_system_error(scsi_qla_host_t *); |
298 | 300 | ||
@@ -569,7 +571,6 @@ extern int qla82xx_mbx_intr_enable(scsi_qla_host_t *); | |||
569 | extern int qla82xx_mbx_intr_disable(scsi_qla_host_t *); | 571 | extern int qla82xx_mbx_intr_disable(scsi_qla_host_t *); |
570 | extern void qla82xx_start_iocbs(srb_t *); | 572 | extern void qla82xx_start_iocbs(srb_t *); |
571 | extern int qla82xx_fcoe_ctx_reset(scsi_qla_host_t *); | 573 | extern int qla82xx_fcoe_ctx_reset(scsi_qla_host_t *); |
572 | extern void qla82xx_wait_for_pending_commands(scsi_qla_host_t *); | ||
573 | 574 | ||
574 | /* BSG related functions */ | 575 | /* BSG related functions */ |
575 | extern int qla24xx_bsg_request(struct fc_bsg_job *); | 576 | extern int qla24xx_bsg_request(struct fc_bsg_job *); |
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index f6b1052a3834..9b58a79c4ae5 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c | |||
@@ -3833,8 +3833,13 @@ qla2x00_abort_isp_cleanup(scsi_qla_host_t *vha) | |||
3833 | } | 3833 | } |
3834 | 3834 | ||
3835 | /* Make sure for ISP 82XX IO DMA is complete */ | 3835 | /* Make sure for ISP 82XX IO DMA is complete */ |
3836 | if (IS_QLA82XX(ha)) | 3836 | if (IS_QLA82XX(ha)) { |
3837 | qla82xx_wait_for_pending_commands(vha); | 3837 | if (qla2x00_eh_wait_for_pending_commands(vha, 0, 0, |
3838 | WAIT_HOST) == QLA_SUCCESS) { | ||
3839 | DEBUG2(qla_printk(KERN_INFO, ha, | ||
3840 | "Done wait for pending commands\n")); | ||
3841 | } | ||
3842 | } | ||
3838 | 3843 | ||
3839 | /* Requeue all commands in outstanding command list. */ | 3844 | /* Requeue all commands in outstanding command list. */ |
3840 | qla2x00_abort_all_cmds(vha, DID_RESET << 16); | 3845 | qla2x00_abort_all_cmds(vha, DID_RESET << 16); |
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index fcdbf7a0be55..86d352ab9c58 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c | |||
@@ -903,24 +903,17 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd) | |||
903 | return ret; | 903 | return ret; |
904 | } | 904 | } |
905 | 905 | ||
906 | enum nexus_wait_type { | 906 | int |
907 | WAIT_HOST = 0, | ||
908 | WAIT_TARGET, | ||
909 | WAIT_LUN, | ||
910 | }; | ||
911 | |||
912 | static int | ||
913 | qla2x00_eh_wait_for_pending_commands(scsi_qla_host_t *vha, unsigned int t, | 907 | qla2x00_eh_wait_for_pending_commands(scsi_qla_host_t *vha, unsigned int t, |
914 | unsigned int l, srb_t *sp, enum nexus_wait_type type) | 908 | unsigned int l, enum nexus_wait_type type) |
915 | { | 909 | { |
916 | int cnt, match, status; | 910 | int cnt, match, status; |
917 | unsigned long flags; | 911 | unsigned long flags; |
918 | struct qla_hw_data *ha = vha->hw; | 912 | struct qla_hw_data *ha = vha->hw; |
919 | struct req_que *req; | 913 | struct req_que *req; |
914 | srb_t *sp; | ||
920 | 915 | ||
921 | status = QLA_SUCCESS; | 916 | status = QLA_SUCCESS; |
922 | if (!sp) | ||
923 | return status; | ||
924 | 917 | ||
925 | spin_lock_irqsave(&ha->hardware_lock, flags); | 918 | spin_lock_irqsave(&ha->hardware_lock, flags); |
926 | req = vha->req; | 919 | req = vha->req; |
@@ -958,24 +951,6 @@ qla2x00_eh_wait_for_pending_commands(scsi_qla_host_t *vha, unsigned int t, | |||
958 | return status; | 951 | return status; |
959 | } | 952 | } |
960 | 953 | ||
961 | void qla82xx_wait_for_pending_commands(scsi_qla_host_t *vha) | ||
962 | { | ||
963 | int cnt; | ||
964 | srb_t *sp; | ||
965 | struct req_que *req = vha->req; | ||
966 | |||
967 | DEBUG2(qla_printk(KERN_INFO, vha->hw, | ||
968 | "Waiting for pending commands\n")); | ||
969 | for (cnt = 1; cnt < MAX_OUTSTANDING_COMMANDS; cnt++) { | ||
970 | sp = req->outstanding_cmds[cnt]; | ||
971 | if (qla2x00_eh_wait_for_pending_commands(vha, 0, 0, | ||
972 | sp, WAIT_HOST) == QLA_SUCCESS) { | ||
973 | DEBUG2(qla_printk(KERN_INFO, vha->hw, | ||
974 | "Done wait for pending commands\n")); | ||
975 | } | ||
976 | } | ||
977 | } | ||
978 | |||
979 | static char *reset_errors[] = { | 954 | static char *reset_errors[] = { |
980 | "HBA not online", | 955 | "HBA not online", |
981 | "HBA not ready", | 956 | "HBA not ready", |
@@ -1011,7 +986,7 @@ __qla2xxx_eh_generic_reset(char *name, enum nexus_wait_type type, | |||
1011 | goto eh_reset_failed; | 986 | goto eh_reset_failed; |
1012 | err = 3; | 987 | err = 3; |
1013 | if (qla2x00_eh_wait_for_pending_commands(vha, cmd->device->id, | 988 | if (qla2x00_eh_wait_for_pending_commands(vha, cmd->device->id, |
1014 | cmd->device->lun, (srb_t *) CMD_SP(cmd), type) != QLA_SUCCESS) | 989 | cmd->device->lun, type) != QLA_SUCCESS) |
1015 | goto eh_reset_failed; | 990 | goto eh_reset_failed; |
1016 | 991 | ||
1017 | qla_printk(KERN_INFO, vha->hw, "scsi(%ld:%d:%d): %s RESET SUCCEEDED.\n", | 992 | qla_printk(KERN_INFO, vha->hw, "scsi(%ld:%d:%d): %s RESET SUCCEEDED.\n", |
@@ -1019,7 +994,7 @@ __qla2xxx_eh_generic_reset(char *name, enum nexus_wait_type type, | |||
1019 | 994 | ||
1020 | return SUCCESS; | 995 | return SUCCESS; |
1021 | 996 | ||
1022 | eh_reset_failed: | 997 | eh_reset_failed: |
1023 | qla_printk(KERN_INFO, vha->hw, "scsi(%ld:%d:%d): %s RESET FAILED: %s.\n" | 998 | qla_printk(KERN_INFO, vha->hw, "scsi(%ld:%d:%d): %s RESET FAILED: %s.\n" |
1024 | , vha->host_no, cmd->device->id, cmd->device->lun, name, | 999 | , vha->host_no, cmd->device->id, cmd->device->lun, name, |
1025 | reset_errors[err]); | 1000 | reset_errors[err]); |
@@ -1069,7 +1044,6 @@ qla2xxx_eh_bus_reset(struct scsi_cmnd *cmd) | |||
1069 | int ret = FAILED; | 1044 | int ret = FAILED; |
1070 | unsigned int id, lun; | 1045 | unsigned int id, lun; |
1071 | unsigned long serial; | 1046 | unsigned long serial; |
1072 | srb_t *sp = (srb_t *) CMD_SP(cmd); | ||
1073 | 1047 | ||
1074 | fc_block_scsi_eh(cmd); | 1048 | fc_block_scsi_eh(cmd); |
1075 | 1049 | ||
@@ -1096,7 +1070,7 @@ qla2xxx_eh_bus_reset(struct scsi_cmnd *cmd) | |||
1096 | goto eh_bus_reset_done; | 1070 | goto eh_bus_reset_done; |
1097 | 1071 | ||
1098 | /* Flush outstanding commands. */ | 1072 | /* Flush outstanding commands. */ |
1099 | if (qla2x00_eh_wait_for_pending_commands(vha, 0, 0, sp, WAIT_HOST) != | 1073 | if (qla2x00_eh_wait_for_pending_commands(vha, 0, 0, WAIT_HOST) != |
1100 | QLA_SUCCESS) | 1074 | QLA_SUCCESS) |
1101 | ret = FAILED; | 1075 | ret = FAILED; |
1102 | 1076 | ||
@@ -1131,7 +1105,6 @@ qla2xxx_eh_host_reset(struct scsi_cmnd *cmd) | |||
1131 | int ret = FAILED; | 1105 | int ret = FAILED; |
1132 | unsigned int id, lun; | 1106 | unsigned int id, lun; |
1133 | unsigned long serial; | 1107 | unsigned long serial; |
1134 | srb_t *sp = (srb_t *) CMD_SP(cmd); | ||
1135 | scsi_qla_host_t *base_vha = pci_get_drvdata(ha->pdev); | 1108 | scsi_qla_host_t *base_vha = pci_get_drvdata(ha->pdev); |
1136 | 1109 | ||
1137 | fc_block_scsi_eh(cmd); | 1110 | fc_block_scsi_eh(cmd); |
@@ -1186,7 +1159,7 @@ qla2xxx_eh_host_reset(struct scsi_cmnd *cmd) | |||
1186 | } | 1159 | } |
1187 | 1160 | ||
1188 | /* Waiting for command to be returned to OS.*/ | 1161 | /* Waiting for command to be returned to OS.*/ |
1189 | if (qla2x00_eh_wait_for_pending_commands(vha, 0, 0, sp, WAIT_HOST) == | 1162 | if (qla2x00_eh_wait_for_pending_commands(vha, 0, 0, WAIT_HOST) == |
1190 | QLA_SUCCESS) | 1163 | QLA_SUCCESS) |
1191 | ret = SUCCESS; | 1164 | ret = SUCCESS; |
1192 | 1165 | ||