@@ -2020,17 +2020,19 @@ static void qla2x00_tmf_sp_done(srb_t *sp, int res)
2020
2020
complete (& tmf -> u .tmf .comp );
2021
2021
}
2022
2022
2023
- int
2024
- qla2x00_async_tm_cmd (fc_port_t * fcport , uint32_t flags , uint32_t lun ,
2025
- uint32_t tag )
2023
+ static int
2024
+ __qla2x00_async_tm_cmd (struct tmf_arg * arg )
2026
2025
{
2027
- struct scsi_qla_host * vha = fcport -> vha ;
2026
+ struct scsi_qla_host * vha = arg -> vha ;
2028
2027
struct srb_iocb * tm_iocb ;
2029
2028
srb_t * sp ;
2029
+ unsigned long flags ;
2030
2030
int rval = QLA_FUNCTION_FAILED ;
2031
2031
2032
+ fc_port_t * fcport = arg -> fcport ;
2033
+
2032
2034
/* ref: INIT */
2033
- sp = qla2x00_get_sp (vha , fcport , GFP_KERNEL );
2035
+ sp = qla2xxx_get_qpair_sp (vha , arg -> qpair , fcport , GFP_KERNEL );
2034
2036
if (!sp )
2035
2037
goto done ;
2036
2038
@@ -2043,15 +2045,15 @@ qla2x00_async_tm_cmd(fc_port_t *fcport, uint32_t flags, uint32_t lun,
2043
2045
2044
2046
tm_iocb = & sp -> u .iocb_cmd ;
2045
2047
init_completion (& tm_iocb -> u .tmf .comp );
2046
- tm_iocb -> u .tmf .flags = flags ;
2047
- tm_iocb -> u .tmf .lun = lun ;
2048
+ tm_iocb -> u .tmf .flags = arg -> flags ;
2049
+ tm_iocb -> u .tmf .lun = arg -> lun ;
2048
2050
2051
+ rval = qla2x00_start_sp (sp );
2049
2052
ql_dbg (ql_dbg_taskm , vha , 0x802f ,
2050
- "Async-tmf hdl=%x loop-id=%x portid=%02x%02x%02x.\n" ,
2053
+ "Async-tmf hdl=%x loop-id=%x portid=%02x%02x%02x ctrl=%x .\n" ,
2051
2054
sp -> handle , fcport -> loop_id , fcport -> d_id .b .domain ,
2052
- fcport -> d_id .b .area , fcport -> d_id .b .al_pa );
2055
+ fcport -> d_id .b .area , fcport -> d_id .b .al_pa , arg -> flags );
2053
2056
2054
- rval = qla2x00_start_sp (sp );
2055
2057
if (rval != QLA_SUCCESS )
2056
2058
goto done_free_sp ;
2057
2059
wait_for_completion (& tm_iocb -> u .tmf .comp );
@@ -2065,12 +2067,14 @@ qla2x00_async_tm_cmd(fc_port_t *fcport, uint32_t flags, uint32_t lun,
2065
2067
2066
2068
if (!test_bit (UNLOADING , & vha -> dpc_flags ) && !IS_QLAFX00 (vha -> hw )) {
2067
2069
flags = tm_iocb -> u .tmf .flags ;
2068
- lun = (uint16_t )tm_iocb -> u .tmf .lun ;
2070
+ if (flags & (TCF_LUN_RESET |TCF_ABORT_TASK_SET |
2071
+ TCF_CLEAR_TASK_SET |TCF_CLEAR_ACA ))
2072
+ flags = MK_SYNC_ID_LUN ;
2073
+ else
2074
+ flags = MK_SYNC_ID ;
2069
2075
2070
- /* Issue Marker IOCB */
2071
- qla2x00_marker (vha , vha -> hw -> base_qpair ,
2072
- fcport -> loop_id , lun ,
2073
- flags == TCF_LUN_RESET ? MK_SYNC_ID_LUN : MK_SYNC_ID );
2076
+ qla2x00_marker (vha , sp -> qpair ,
2077
+ sp -> fcport -> loop_id , arg -> lun , flags );
2074
2078
}
2075
2079
2076
2080
done_free_sp :
@@ -2080,6 +2084,41 @@ qla2x00_async_tm_cmd(fc_port_t *fcport, uint32_t flags, uint32_t lun,
2080
2084
return rval ;
2081
2085
}
2082
2086
2087
+ int
2088
+ qla2x00_async_tm_cmd (fc_port_t * fcport , uint32_t flags , uint64_t lun ,
2089
+ uint32_t tag )
2090
+ {
2091
+ struct scsi_qla_host * vha = fcport -> vha ;
2092
+ struct qla_qpair * qpair ;
2093
+ struct tmf_arg a ;
2094
+ struct completion comp ;
2095
+ int i , rval ;
2096
+
2097
+ init_completion (& comp );
2098
+ a .vha = fcport -> vha ;
2099
+ a .fcport = fcport ;
2100
+ a .lun = lun ;
2101
+
2102
+ if (vha -> hw -> mqenable ) {
2103
+ for (i = 0 ; i < vha -> hw -> num_qpairs ; i ++ ) {
2104
+ qpair = vha -> hw -> queue_pair_map [i ];
2105
+ if (!qpair )
2106
+ continue ;
2107
+ a .qpair = qpair ;
2108
+ a .flags = flags |TCF_NOTMCMD_TO_TARGET ;
2109
+ rval = __qla2x00_async_tm_cmd (& a );
2110
+ if (rval )
2111
+ break ;
2112
+ }
2113
+ }
2114
+
2115
+ a .qpair = vha -> hw -> base_qpair ;
2116
+ a .flags = flags ;
2117
+ rval = __qla2x00_async_tm_cmd (& a );
2118
+
2119
+ return rval ;
2120
+ }
2121
+
2083
2122
int
2084
2123
qla24xx_async_abort_command (srb_t * sp )
2085
2124
{
0 commit comments