@@ -2013,6 +2013,80 @@ qla2x00_tmf_iocb_timeout(void *data)
20132013 }
20142014}
20152015
2016+ static void qla_marker_sp_done (srb_t * sp , int res )
2017+ {
2018+ struct srb_iocb * tmf = & sp -> u .iocb_cmd ;
2019+
2020+ if (res != QLA_SUCCESS )
2021+ ql_dbg (ql_dbg_taskm , sp -> vha , 0x8004 ,
2022+ "Async-marker fail hdl=%x portid=%06x ctrl=%x lun=%lld qp=%d.\n" ,
2023+ sp -> handle , sp -> fcport -> d_id .b24 , sp -> u .iocb_cmd .u .tmf .flags ,
2024+ sp -> u .iocb_cmd .u .tmf .lun , sp -> qpair -> id );
2025+
2026+ complete (& tmf -> u .tmf .comp );
2027+ }
2028+
2029+ #define START_SP_W_RETRIES (_sp , _rval ) \
2030+ {\
2031+ int cnt = 5; \
2032+ do { \
2033+ _rval = qla2x00_start_sp(_sp); \
2034+ if (_rval == EAGAIN) \
2035+ msleep(1); \
2036+ else \
2037+ break; \
2038+ cnt--; \
2039+ } while (cnt); \
2040+ }
2041+
2042+ static int
2043+ qla26xx_marker (struct tmf_arg * arg )
2044+ {
2045+ struct scsi_qla_host * vha = arg -> vha ;
2046+ struct srb_iocb * tm_iocb ;
2047+ srb_t * sp ;
2048+ int rval = QLA_FUNCTION_FAILED ;
2049+ fc_port_t * fcport = arg -> fcport ;
2050+
2051+ /* ref: INIT */
2052+ sp = qla2xxx_get_qpair_sp (vha , arg -> qpair , fcport , GFP_KERNEL );
2053+ if (!sp )
2054+ goto done ;
2055+
2056+ sp -> type = SRB_MARKER ;
2057+ sp -> name = "marker" ;
2058+ qla2x00_init_async_sp (sp , qla2x00_get_async_timeout (vha ), qla_marker_sp_done );
2059+ sp -> u .iocb_cmd .timeout = qla2x00_tmf_iocb_timeout ;
2060+
2061+ tm_iocb = & sp -> u .iocb_cmd ;
2062+ init_completion (& tm_iocb -> u .tmf .comp );
2063+ tm_iocb -> u .tmf .modifier = arg -> modifier ;
2064+ tm_iocb -> u .tmf .lun = arg -> lun ;
2065+ tm_iocb -> u .tmf .loop_id = fcport -> loop_id ;
2066+ tm_iocb -> u .tmf .vp_index = vha -> vp_idx ;
2067+
2068+ START_SP_W_RETRIES (sp , rval );
2069+
2070+ ql_dbg (ql_dbg_taskm , vha , 0x8006 ,
2071+ "Async-marker hdl=%x loop-id=%x portid=%06x modifier=%x lun=%lld qp=%d rval %d.\n" ,
2072+ sp -> handle , fcport -> loop_id , fcport -> d_id .b24 ,
2073+ arg -> modifier , arg -> lun , sp -> qpair -> id , rval );
2074+
2075+ if (rval != QLA_SUCCESS ) {
2076+ ql_log (ql_log_warn , vha , 0x8031 ,
2077+ "Marker IOCB failed (%x).\n" , rval );
2078+ goto done_free_sp ;
2079+ }
2080+
2081+ wait_for_completion (& tm_iocb -> u .tmf .comp );
2082+
2083+ done_free_sp :
2084+ /* ref: INIT */
2085+ kref_put (& sp -> cmd_kref , qla2x00_sp_release );
2086+ done :
2087+ return rval ;
2088+ }
2089+
20162090static void qla2x00_tmf_sp_done (srb_t * sp , int res )
20172091{
20182092 struct srb_iocb * tmf = & sp -> u .iocb_cmd ;
@@ -2026,7 +2100,6 @@ __qla2x00_async_tm_cmd(struct tmf_arg *arg)
20262100 struct scsi_qla_host * vha = arg -> vha ;
20272101 struct srb_iocb * tm_iocb ;
20282102 srb_t * sp ;
2029- unsigned long flags ;
20302103 int rval = QLA_FUNCTION_FAILED ;
20312104
20322105 fc_port_t * fcport = arg -> fcport ;
@@ -2048,11 +2121,12 @@ __qla2x00_async_tm_cmd(struct tmf_arg *arg)
20482121 tm_iocb -> u .tmf .flags = arg -> flags ;
20492122 tm_iocb -> u .tmf .lun = arg -> lun ;
20502123
2051- rval = qla2x00_start_sp (sp );
2124+ START_SP_W_RETRIES (sp , rval );
2125+
20522126 ql_dbg (ql_dbg_taskm , vha , 0x802f ,
2053- "Async-tmf hdl=%x loop-id=%x portid=%02x%02x%02x ctrl =%x.\n" ,
2054- sp -> handle , fcport -> loop_id , fcport -> d_id .b . domain ,
2055- fcport -> d_id . b . area , fcport -> d_id . b . al_pa , arg -> flags );
2127+ "Async-tmf hdl=%x loop-id=%x portid=%06x ctrl=%x lun=%lld qp=%d rval =%x.\n" ,
2128+ sp -> handle , fcport -> loop_id , fcport -> d_id .b24 ,
2129+ arg -> flags , arg -> lun , sp -> qpair -> id , rval );
20562130
20572131 if (rval != QLA_SUCCESS )
20582132 goto done_free_sp ;
@@ -2065,17 +2139,8 @@ __qla2x00_async_tm_cmd(struct tmf_arg *arg)
20652139 "TM IOCB failed (%x).\n" , rval );
20662140 }
20672141
2068- if (!test_bit (UNLOADING , & vha -> dpc_flags ) && !IS_QLAFX00 (vha -> hw )) {
2069- flags = tm_iocb -> u .tmf .flags ;
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 ;
2075-
2076- qla2x00_marker (vha , sp -> qpair ,
2077- sp -> fcport -> loop_id , arg -> lun , flags );
2078- }
2142+ if (!test_bit (UNLOADING , & vha -> dpc_flags ) && !IS_QLAFX00 (vha -> hw ))
2143+ rval = qla26xx_marker (arg );
20792144
20802145done_free_sp :
20812146 /* ref: INIT */
@@ -2099,6 +2164,11 @@ qla2x00_async_tm_cmd(fc_port_t *fcport, uint32_t flags, uint64_t lun,
20992164 a .fcport = fcport ;
21002165 a .lun = lun ;
21012166
2167+ if (flags & (TCF_LUN_RESET |TCF_ABORT_TASK_SET |TCF_CLEAR_TASK_SET |TCF_CLEAR_ACA ))
2168+ a .modifier = MK_SYNC_ID_LUN ;
2169+ else
2170+ a .modifier = MK_SYNC_ID ;
2171+
21022172 if (vha -> hw -> mqenable ) {
21032173 for (i = 0 ; i < vha -> hw -> num_qpairs ; i ++ ) {
21042174 qpair = vha -> hw -> queue_pair_map [i ];
0 commit comments