@@ -183,73 +183,109 @@ static struct fc_function_template mptfc_transport_functions = {
183183};
184184
185185static int
186- mptfc_block_error_handler (struct scsi_cmnd * SCpnt ,
187- int (* func )(struct scsi_cmnd * SCpnt ),
188- const char * caller )
186+ mptfc_block_error_handler (struct fc_rport * rport )
189187{
190188 MPT_SCSI_HOST * hd ;
191- struct scsi_device * sdev = SCpnt -> device ;
192- struct Scsi_Host * shost = sdev -> host ;
193- struct fc_rport * rport = starget_to_rport (scsi_target (sdev ));
189+ struct Scsi_Host * shost = rport_to_shost (rport );
194190 unsigned long flags ;
195191 int ready ;
196- MPT_ADAPTER * ioc ;
192+ MPT_ADAPTER * ioc ;
197193 int loops = 40 ; /* seconds */
198194
199- hd = shost_priv (SCpnt -> device -> host );
195+ hd = shost_priv (shost );
200196 ioc = hd -> ioc ;
201197 spin_lock_irqsave (shost -> host_lock , flags );
202198 while ((ready = fc_remote_port_chkready (rport ) >> 16 ) == DID_IMM_RETRY
203199 || (loops > 0 && ioc -> active == 0 )) {
204200 spin_unlock_irqrestore (shost -> host_lock , flags );
205201 dfcprintk (ioc , printk (MYIOC_s_DEBUG_FMT
206- "mptfc_block_error_handler.%d: %d:%llu , port status is "
207- "%x, active flag %d, deferring %s recovery.\n" ,
202+ "mptfc_block_error_handler.%d: %s , port status is "
203+ "%x, active flag %d, deferring recovery.\n" ,
208204 ioc -> name , ioc -> sh -> host_no ,
209- SCpnt -> device -> id , SCpnt -> device -> lun ,
210- ready , ioc -> active , caller ));
205+ dev_name (& rport -> dev ), ready , ioc -> active ));
211206 msleep (1000 );
212207 spin_lock_irqsave (shost -> host_lock , flags );
213208 loops -- ;
214209 }
215210 spin_unlock_irqrestore (shost -> host_lock , flags );
216211
217- if (ready == DID_NO_CONNECT || !SCpnt -> device -> hostdata
218- || ioc -> active == 0 ) {
212+ if (ready == DID_NO_CONNECT || ioc -> active == 0 ) {
219213 dfcprintk (ioc , printk (MYIOC_s_DEBUG_FMT
220- "%s .%d: %d:%llu , failing recovery, "
221- "port state %x, active %d, vdevice %p .\n" , caller ,
214+ "mpt_block_error_handler .%d: %s , failing recovery, "
215+ "port state %x, active %d.\n" ,
222216 ioc -> name , ioc -> sh -> host_no ,
223- SCpnt -> device -> id , SCpnt -> device -> lun , ready ,
224- ioc -> active , SCpnt -> device -> hostdata ));
217+ dev_name (& rport -> dev ), ready , ioc -> active ));
225218 return FAILED ;
226219 }
227- dfcprintk (ioc , printk (MYIOC_s_DEBUG_FMT
228- "%s.%d: %d:%llu, executing recovery.\n" , caller ,
229- ioc -> name , ioc -> sh -> host_no ,
230- SCpnt -> device -> id , SCpnt -> device -> lun ));
231- return (* func )(SCpnt );
220+ return SUCCESS ;
232221}
233222
234223static int
235224mptfc_abort (struct scsi_cmnd * SCpnt )
236225{
237- return
238- mptfc_block_error_handler (SCpnt , mptscsih_abort , __func__ );
226+ struct Scsi_Host * shost = SCpnt -> device -> host ;
227+ struct fc_rport * rport = starget_to_rport (scsi_target (SCpnt -> device ));
228+ MPT_SCSI_HOST __maybe_unused * hd = shost_priv (shost );
229+ int rtn ;
230+
231+ rtn = mptfc_block_error_handler (rport );
232+ if (rtn == SUCCESS ) {
233+ dfcprintk (hd -> ioc , printk (MYIOC_s_DEBUG_FMT
234+ "%s.%d: %d:%llu, executing recovery.\n" , __func__ ,
235+ hd -> ioc -> name , shost -> host_no ,
236+ SCpnt -> device -> id , SCpnt -> device -> lun ));
237+ rtn = mptscsih_abort (SCpnt );
238+ }
239+ return rtn ;
239240}
240241
241242static int
242243mptfc_dev_reset (struct scsi_cmnd * SCpnt )
243244{
244- return
245- mptfc_block_error_handler (SCpnt , mptscsih_dev_reset , __func__ );
245+ struct Scsi_Host * shost = SCpnt -> device -> host ;
246+ struct fc_rport * rport = starget_to_rport (scsi_target (SCpnt -> device ));
247+ MPT_SCSI_HOST __maybe_unused * hd = shost_priv (shost );
248+ int rtn ;
249+
250+ rtn = mptfc_block_error_handler (rport );
251+ if (rtn == SUCCESS ) {
252+ dfcprintk (hd -> ioc , printk (MYIOC_s_DEBUG_FMT
253+ "%s.%d: %d:%llu, executing recovery.\n" , __func__ ,
254+ hd -> ioc -> name , shost -> host_no ,
255+ SCpnt -> device -> id , SCpnt -> device -> lun ));
256+ rtn = mptscsih_dev_reset (SCpnt );
257+ }
258+ return rtn ;
246259}
247260
248261static int
249262mptfc_bus_reset (struct scsi_cmnd * SCpnt )
250263{
251- return
252- mptfc_block_error_handler (SCpnt , mptscsih_bus_reset , __func__ );
264+ struct Scsi_Host * shost = SCpnt -> device -> host ;
265+ MPT_SCSI_HOST __maybe_unused * hd = shost_priv (shost );
266+ int channel = SCpnt -> device -> channel ;
267+ struct mptfc_rport_info * ri ;
268+ int rtn ;
269+
270+ list_for_each_entry (ri , & hd -> ioc -> fc_rports , list ) {
271+ if (ri -> flags & MPT_RPORT_INFO_FLAGS_REGISTERED ) {
272+ VirtTarget * vtarget = ri -> starget -> hostdata ;
273+
274+ if (!vtarget || vtarget -> channel != channel )
275+ continue ;
276+ rtn = fc_block_rport (ri -> rport );
277+ if (rtn != 0 )
278+ break ;
279+ }
280+ }
281+ if (rtn == 0 ) {
282+ dfcprintk (hd -> ioc , printk (MYIOC_s_DEBUG_FMT
283+ "%s.%d: %d:%llu, executing recovery.\n" , __func__ ,
284+ hd -> ioc -> name , shost -> host_no ,
285+ SCpnt -> device -> id , SCpnt -> device -> lun ));
286+ rtn = mptscsih_bus_reset (SCpnt );
287+ }
288+ return rtn ;
253289}
254290
255291static void
0 commit comments