@@ -318,11 +318,18 @@ static struct fc_seq *qedf_elsct_send(struct fc_lport *lport, u32 did,
318
318
*/
319
319
if (resp == fc_lport_flogi_resp ) {
320
320
qedf -> flogi_cnt ++ ;
321
+ qedf -> flogi_pending ++ ;
322
+
323
+ if (test_bit (QEDF_UNLOADING , & qedf -> flags )) {
324
+ QEDF_ERR (& qedf -> dbg_ctx , "Driver unloading\n" );
325
+ qedf -> flogi_pending = 0 ;
326
+ }
327
+
321
328
if (qedf -> flogi_pending >= QEDF_FLOGI_RETRY_CNT ) {
322
329
schedule_delayed_work (& qedf -> stag_work , 2 );
323
330
return NULL ;
324
331
}
325
- qedf -> flogi_pending ++ ;
332
+
326
333
return fc_elsct_send (lport , did , fp , op , qedf_flogi_resp ,
327
334
arg , timeout );
328
335
}
@@ -912,13 +919,14 @@ void qedf_ctx_soft_reset(struct fc_lport *lport)
912
919
struct qedf_ctx * qedf ;
913
920
struct qed_link_output if_link ;
914
921
922
+ qedf = lport_priv (lport );
923
+
915
924
if (lport -> vport ) {
925
+ clear_bit (QEDF_STAG_IN_PROGRESS , & qedf -> flags );
916
926
printk_ratelimited ("Cannot issue host reset on NPIV port.\n" );
917
927
return ;
918
928
}
919
929
920
- qedf = lport_priv (lport );
921
-
922
930
qedf -> flogi_pending = 0 ;
923
931
/* For host reset, essentially do a soft link up/down */
924
932
atomic_set (& qedf -> link_state , QEDF_LINK_DOWN );
@@ -938,6 +946,7 @@ void qedf_ctx_soft_reset(struct fc_lport *lport)
938
946
if (!if_link .link_up ) {
939
947
QEDF_INFO (& qedf -> dbg_ctx , QEDF_LOG_DISC ,
940
948
"Physical link is not up.\n" );
949
+ clear_bit (QEDF_STAG_IN_PROGRESS , & qedf -> flags );
941
950
return ;
942
951
}
943
952
/* Flush and wait to make sure link down is processed */
@@ -950,6 +959,7 @@ void qedf_ctx_soft_reset(struct fc_lport *lport)
950
959
"Queue link up work.\n" );
951
960
queue_delayed_work (qedf -> link_update_wq , & qedf -> link_update ,
952
961
0 );
962
+ clear_bit (QEDF_STAG_IN_PROGRESS , & qedf -> flags );
953
963
}
954
964
955
965
/* Reset the host by gracefully logging out and then logging back in */
@@ -3721,6 +3731,7 @@ static void __qedf_remove(struct pci_dev *pdev, int mode)
3721
3731
{
3722
3732
struct qedf_ctx * qedf ;
3723
3733
int rc ;
3734
+ int cnt = 0 ;
3724
3735
3725
3736
if (!pdev ) {
3726
3737
QEDF_ERR (NULL , "pdev is NULL.\n" );
@@ -3738,6 +3749,17 @@ static void __qedf_remove(struct pci_dev *pdev, int mode)
3738
3749
return ;
3739
3750
}
3740
3751
3752
+ stag_in_prog :
3753
+ if (test_bit (QEDF_STAG_IN_PROGRESS , & qedf -> flags )) {
3754
+ QEDF_ERR (& qedf -> dbg_ctx , "Stag in progress, cnt=%d.\n" , cnt );
3755
+ cnt ++ ;
3756
+
3757
+ if (cnt < 5 ) {
3758
+ msleep (500 );
3759
+ goto stag_in_prog ;
3760
+ }
3761
+ }
3762
+
3741
3763
if (mode != QEDF_MODE_RECOVERY )
3742
3764
set_bit (QEDF_UNLOADING , & qedf -> flags );
3743
3765
@@ -4013,6 +4035,8 @@ void qedf_stag_change_work(struct work_struct *work)
4013
4035
return ;
4014
4036
}
4015
4037
4038
+ set_bit (QEDF_STAG_IN_PROGRESS , & qedf -> flags );
4039
+
4016
4040
printk_ratelimited ("[%s]:[%s:%d]:%d: Performing software context reset." ,
4017
4041
dev_name (& qedf -> pdev -> dev ), __func__ , __LINE__ ,
4018
4042
qedf -> dbg_ctx .host_no );
0 commit comments