@@ -763,50 +763,86 @@ static void fdls_send_fabric_abts(struct fnic_iport_s *iport)
763
763
iport -> fabric .timer_pending = 1 ;
764
764
}
765
765
766
- static void fdls_send_fdmi_abts (struct fnic_iport_s * iport )
766
+ static uint8_t * fdls_alloc_init_fdmi_abts_frame (struct fnic_iport_s * iport ,
767
+ uint16_t oxid )
767
768
{
768
- uint8_t * frame ;
769
+ struct fc_frame_header * pfdmi_abts ;
769
770
uint8_t d_id [3 ];
771
+ uint8_t * frame ;
770
772
struct fnic * fnic = iport -> fnic ;
771
- struct fc_frame_header * pfabric_abts ;
772
- unsigned long fdmi_tov ;
773
- uint16_t oxid ;
774
- uint16_t frame_size = FNIC_ETH_FCOE_HDRS_OFFSET +
775
- sizeof (struct fc_frame_header );
776
773
777
774
frame = fdls_alloc_frame (iport );
778
775
if (frame == NULL ) {
779
776
FNIC_FCS_DBG (KERN_ERR , fnic -> host , fnic -> fnic_num ,
780
777
"Failed to allocate frame to send FDMI ABTS" );
781
- return ;
778
+ return NULL ;
782
779
}
783
780
784
- pfabric_abts = (struct fc_frame_header * ) (frame + FNIC_ETH_FCOE_HDRS_OFFSET );
781
+ pfdmi_abts = (struct fc_frame_header * ) (frame + FNIC_ETH_FCOE_HDRS_OFFSET );
785
782
fdls_init_fabric_abts_frame (frame , iport );
786
783
787
784
hton24 (d_id , FC_FID_MGMT_SERV );
788
- FNIC_STD_SET_D_ID (* pfabric_abts , d_id );
785
+ FNIC_STD_SET_D_ID (* pfdmi_abts , d_id );
786
+ FNIC_STD_SET_OX_ID (* pfdmi_abts , oxid );
787
+
788
+ return frame ;
789
+ }
790
+
791
+ static void fdls_send_fdmi_abts (struct fnic_iport_s * iport )
792
+ {
793
+ uint8_t * frame ;
794
+ struct fnic * fnic = iport -> fnic ;
795
+ unsigned long fdmi_tov ;
796
+ uint16_t frame_size = FNIC_ETH_FCOE_HDRS_OFFSET +
797
+ sizeof (struct fc_frame_header );
789
798
790
799
if (iport -> fabric .fdmi_pending & FDLS_FDMI_PLOGI_PENDING ) {
791
- oxid = iport -> active_oxid_fdmi_plogi ;
792
- FNIC_STD_SET_OX_ID (* pfabric_abts , oxid );
800
+ frame = fdls_alloc_init_fdmi_abts_frame (iport ,
801
+ iport -> active_oxid_fdmi_plogi );
802
+ if (frame == NULL )
803
+ return ;
804
+
805
+ FNIC_FCS_DBG (KERN_INFO , fnic -> host , fnic -> fnic_num ,
806
+ "0x%x: FDLS send FDMI PLOGI abts. iport->fabric.state: %d oxid: 0x%x" ,
807
+ iport -> fcid , iport -> fabric .state , iport -> active_oxid_fdmi_plogi );
793
808
fnic_send_fcoe_frame (iport , frame , frame_size );
794
809
} else {
795
810
if (iport -> fabric .fdmi_pending & FDLS_FDMI_REG_HBA_PENDING ) {
796
- oxid = iport -> active_oxid_fdmi_rhba ;
797
- FNIC_STD_SET_OX_ID (* pfabric_abts , oxid );
811
+ frame = fdls_alloc_init_fdmi_abts_frame (iport ,
812
+ iport -> active_oxid_fdmi_rhba );
813
+ if (frame == NULL )
814
+ return ;
815
+
816
+ FNIC_FCS_DBG (KERN_INFO , fnic -> host , fnic -> fnic_num ,
817
+ "0x%x: FDLS send FDMI RHBA abts. iport->fabric.state: %d oxid: 0x%x" ,
818
+ iport -> fcid , iport -> fabric .state , iport -> active_oxid_fdmi_rhba );
798
819
fnic_send_fcoe_frame (iport , frame , frame_size );
799
820
}
800
821
if (iport -> fabric .fdmi_pending & FDLS_FDMI_RPA_PENDING ) {
801
- oxid = iport -> active_oxid_fdmi_rpa ;
802
- FNIC_STD_SET_OX_ID (* pfabric_abts , oxid );
822
+ frame = fdls_alloc_init_fdmi_abts_frame (iport ,
823
+ iport -> active_oxid_fdmi_rpa );
824
+ if (frame == NULL ) {
825
+ if (iport -> fabric .fdmi_pending & FDLS_FDMI_REG_HBA_PENDING )
826
+ goto arm_timer ;
827
+ else
828
+ return ;
829
+ }
830
+
831
+ FNIC_FCS_DBG (KERN_INFO , fnic -> host , fnic -> fnic_num ,
832
+ "0x%x: FDLS send FDMI RPA abts. iport->fabric.state: %d oxid: 0x%x" ,
833
+ iport -> fcid , iport -> fabric .state , iport -> active_oxid_fdmi_rpa );
803
834
fnic_send_fcoe_frame (iport , frame , frame_size );
804
835
}
805
836
}
806
837
838
+ arm_timer :
807
839
fdmi_tov = jiffies + msecs_to_jiffies (2 * iport -> e_d_tov );
808
840
mod_timer (& iport -> fabric .fdmi_timer , round_jiffies (fdmi_tov ));
809
841
iport -> fabric .fdmi_pending |= FDLS_FDMI_ABORT_PENDING ;
842
+
843
+ FNIC_FCS_DBG (KERN_INFO , fnic -> host , fnic -> fnic_num ,
844
+ "0x%x: iport->fabric.fdmi_pending: 0x%x" ,
845
+ iport -> fcid , iport -> fabric .fdmi_pending );
810
846
}
811
847
812
848
static void fdls_send_fabric_flogi (struct fnic_iport_s * iport )
@@ -2245,6 +2281,21 @@ void fdls_fabric_timer_callback(struct timer_list *t)
2245
2281
spin_unlock_irqrestore (& fnic -> fnic_lock , flags );
2246
2282
}
2247
2283
2284
+ void fdls_fdmi_retry_plogi (struct fnic_iport_s * iport )
2285
+ {
2286
+ struct fnic * fnic = iport -> fnic ;
2287
+
2288
+ iport -> fabric .fdmi_pending = 0 ;
2289
+ /* If max retries not exhausted, start over from fdmi plogi */
2290
+ if (iport -> fabric .fdmi_retry < FDLS_FDMI_MAX_RETRY ) {
2291
+ iport -> fabric .fdmi_retry ++ ;
2292
+ FNIC_FCS_DBG (KERN_INFO , fnic -> host , fnic -> fnic_num ,
2293
+ "Retry FDMI PLOGI. FDMI retry: %d" ,
2294
+ iport -> fabric .fdmi_retry );
2295
+ fdls_send_fdmi_plogi (iport );
2296
+ }
2297
+ }
2298
+
2248
2299
void fdls_fdmi_timer_callback (struct timer_list * t )
2249
2300
{
2250
2301
struct fnic_fdls_fabric_s * fabric = timer_container_of (fabric , t ,
@@ -2257,15 +2308,15 @@ void fdls_fdmi_timer_callback(struct timer_list *t)
2257
2308
spin_lock_irqsave (& fnic -> fnic_lock , flags );
2258
2309
2259
2310
FNIC_FCS_DBG (KERN_INFO , fnic -> host , fnic -> fnic_num ,
2260
- "fdmi timer callback : 0x%x\n" , iport -> fabric .fdmi_pending );
2311
+ "iport->fabric.fdmi_pending : 0x%x\n" , iport -> fabric .fdmi_pending );
2261
2312
2262
2313
if (!iport -> fabric .fdmi_pending ) {
2263
2314
/* timer expired after fdmi responses received. */
2264
2315
spin_unlock_irqrestore (& fnic -> fnic_lock , flags );
2265
2316
return ;
2266
2317
}
2267
2318
FNIC_FCS_DBG (KERN_INFO , fnic -> host , fnic -> fnic_num ,
2268
- "fdmi timer callback : 0x%x\n" , iport -> fabric .fdmi_pending );
2319
+ "iport->fabric.fdmi_pending : 0x%x\n" , iport -> fabric .fdmi_pending );
2269
2320
2270
2321
/* if not abort pending, send an abort */
2271
2322
if (!(iport -> fabric .fdmi_pending & FDLS_FDMI_ABORT_PENDING )) {
@@ -2274,33 +2325,37 @@ void fdls_fdmi_timer_callback(struct timer_list *t)
2274
2325
return ;
2275
2326
}
2276
2327
FNIC_FCS_DBG (KERN_INFO , fnic -> host , fnic -> fnic_num ,
2277
- "fdmi timer callback : 0x%x\n" , iport -> fabric .fdmi_pending );
2328
+ "iport->fabric.fdmi_pending : 0x%x\n" , iport -> fabric .fdmi_pending );
2278
2329
2279
2330
/* ABTS pending for an active fdmi request that is pending.
2280
2331
* That means FDMI ABTS timed out
2281
2332
* Schedule to free the OXID after 2*r_a_tov and proceed
2282
2333
*/
2283
2334
if (iport -> fabric .fdmi_pending & FDLS_FDMI_PLOGI_PENDING ) {
2335
+ FNIC_FCS_DBG (KERN_INFO , fnic -> host , fnic -> fnic_num ,
2336
+ "FDMI PLOGI ABTS timed out. Schedule oxid free: 0x%x\n" ,
2337
+ iport -> active_oxid_fdmi_plogi );
2284
2338
fdls_schedule_oxid_free (iport , & iport -> active_oxid_fdmi_plogi );
2285
2339
} else {
2286
- if (iport -> fabric .fdmi_pending & FDLS_FDMI_REG_HBA_PENDING )
2340
+ if (iport -> fabric .fdmi_pending & FDLS_FDMI_REG_HBA_PENDING ) {
2341
+ FNIC_FCS_DBG (KERN_INFO , fnic -> host , fnic -> fnic_num ,
2342
+ "FDMI RHBA ABTS timed out. Schedule oxid free: 0x%x\n" ,
2343
+ iport -> active_oxid_fdmi_rhba );
2287
2344
fdls_schedule_oxid_free (iport , & iport -> active_oxid_fdmi_rhba );
2288
- if (iport -> fabric .fdmi_pending & FDLS_FDMI_RPA_PENDING )
2345
+ }
2346
+ if (iport -> fabric .fdmi_pending & FDLS_FDMI_RPA_PENDING ) {
2347
+ FNIC_FCS_DBG (KERN_INFO , fnic -> host , fnic -> fnic_num ,
2348
+ "FDMI RPA ABTS timed out. Schedule oxid free: 0x%x\n" ,
2349
+ iport -> active_oxid_fdmi_rpa );
2289
2350
fdls_schedule_oxid_free (iport , & iport -> active_oxid_fdmi_rpa );
2351
+ }
2290
2352
}
2291
2353
FNIC_FCS_DBG (KERN_INFO , fnic -> host , fnic -> fnic_num ,
2292
- "fdmi timer callback : 0x%x\n" , iport -> fabric .fdmi_pending );
2354
+ "iport->fabric.fdmi_pending : 0x%x\n" , iport -> fabric .fdmi_pending );
2293
2355
2294
- iport -> fabric .fdmi_pending = 0 ;
2295
- /* If max retries not exhaused, start over from fdmi plogi */
2296
- if (iport -> fabric .fdmi_retry < FDLS_FDMI_MAX_RETRY ) {
2297
- iport -> fabric .fdmi_retry ++ ;
2298
- FNIC_FCS_DBG (KERN_INFO , fnic -> host , fnic -> fnic_num ,
2299
- "retry fdmi timer %d" , iport -> fabric .fdmi_retry );
2300
- fdls_send_fdmi_plogi (iport );
2301
- }
2356
+ fdls_fdmi_retry_plogi (iport );
2302
2357
FNIC_FCS_DBG (KERN_INFO , fnic -> host , fnic -> fnic_num ,
2303
- "fdmi timer callback : 0x%x\n" , iport -> fabric .fdmi_pending );
2358
+ "iport->fabric.fdmi_pending : 0x%x\n" , iport -> fabric .fdmi_pending );
2304
2359
spin_unlock_irqrestore (& fnic -> fnic_lock , flags );
2305
2360
}
2306
2361
@@ -3715,13 +3770,60 @@ static void fdls_process_fdmi_abts_rsp(struct fnic_iport_s *iport,
3715
3770
3716
3771
switch (FNIC_FRAME_TYPE (oxid )) {
3717
3772
case FNIC_FRAME_TYPE_FDMI_PLOGI :
3773
+ FNIC_FCS_DBG (KERN_INFO , fnic -> host , fnic -> fnic_num ,
3774
+ "Received FDMI PLOGI ABTS rsp with oxid: 0x%x" , oxid );
3775
+ FNIC_FCS_DBG (KERN_INFO , fnic -> host , fnic -> fnic_num ,
3776
+ "0x%x: iport->fabric.fdmi_pending: 0x%x" ,
3777
+ iport -> fcid , iport -> fabric .fdmi_pending );
3718
3778
fdls_free_oxid (iport , oxid , & iport -> active_oxid_fdmi_plogi );
3779
+
3780
+ iport -> fabric .fdmi_pending &= ~FDLS_FDMI_PLOGI_PENDING ;
3781
+ iport -> fabric .fdmi_pending &= ~FDLS_FDMI_ABORT_PENDING ;
3782
+ FNIC_FCS_DBG (KERN_INFO , fnic -> host , fnic -> fnic_num ,
3783
+ "0x%x: iport->fabric.fdmi_pending: 0x%x" ,
3784
+ iport -> fcid , iport -> fabric .fdmi_pending );
3719
3785
break ;
3720
3786
case FNIC_FRAME_TYPE_FDMI_RHBA :
3787
+ FNIC_FCS_DBG (KERN_INFO , fnic -> host , fnic -> fnic_num ,
3788
+ "Received FDMI RHBA ABTS rsp with oxid: 0x%x" , oxid );
3789
+ FNIC_FCS_DBG (KERN_INFO , fnic -> host , fnic -> fnic_num ,
3790
+ "0x%x: iport->fabric.fdmi_pending: 0x%x" ,
3791
+ iport -> fcid , iport -> fabric .fdmi_pending );
3792
+
3793
+ iport -> fabric .fdmi_pending &= ~FDLS_FDMI_REG_HBA_PENDING ;
3794
+
3795
+ /* If RPA is still pending, don't turn off ABORT PENDING.
3796
+ * We count on the timer to detect the ABTS timeout and take
3797
+ * corrective action.
3798
+ */
3799
+ if (!(iport -> fabric .fdmi_pending & FDLS_FDMI_RPA_PENDING ))
3800
+ iport -> fabric .fdmi_pending &= ~FDLS_FDMI_ABORT_PENDING ;
3801
+
3721
3802
fdls_free_oxid (iport , oxid , & iport -> active_oxid_fdmi_rhba );
3803
+ FNIC_FCS_DBG (KERN_INFO , fnic -> host , fnic -> fnic_num ,
3804
+ "0x%x: iport->fabric.fdmi_pending: 0x%x" ,
3805
+ iport -> fcid , iport -> fabric .fdmi_pending );
3722
3806
break ;
3723
3807
case FNIC_FRAME_TYPE_FDMI_RPA :
3808
+ FNIC_FCS_DBG (KERN_INFO , fnic -> host , fnic -> fnic_num ,
3809
+ "Received FDMI RPA ABTS rsp with oxid: 0x%x" , oxid );
3810
+ FNIC_FCS_DBG (KERN_INFO , fnic -> host , fnic -> fnic_num ,
3811
+ "0x%x: iport->fabric.fdmi_pending: 0x%x" ,
3812
+ iport -> fcid , iport -> fabric .fdmi_pending );
3813
+
3814
+ iport -> fabric .fdmi_pending &= ~FDLS_FDMI_RPA_PENDING ;
3815
+
3816
+ /* If RHBA is still pending, don't turn off ABORT PENDING.
3817
+ * We count on the timer to detect the ABTS timeout and take
3818
+ * corrective action.
3819
+ */
3820
+ if (!(iport -> fabric .fdmi_pending & FDLS_FDMI_REG_HBA_PENDING ))
3821
+ iport -> fabric .fdmi_pending &= ~FDLS_FDMI_ABORT_PENDING ;
3822
+
3724
3823
fdls_free_oxid (iport , oxid , & iport -> active_oxid_fdmi_rpa );
3824
+ FNIC_FCS_DBG (KERN_INFO , fnic -> host , fnic -> fnic_num ,
3825
+ "0x%x: iport->fabric.fdmi_pending: 0x%x" ,
3826
+ iport -> fcid , iport -> fabric .fdmi_pending );
3725
3827
break ;
3726
3828
default :
3727
3829
FNIC_FCS_DBG (KERN_INFO , fnic -> host , fnic -> fnic_num ,
@@ -3730,10 +3832,16 @@ static void fdls_process_fdmi_abts_rsp(struct fnic_iport_s *iport,
3730
3832
break ;
3731
3833
}
3732
3834
3733
- timer_delete_sync (& iport -> fabric .fdmi_timer );
3734
- iport -> fabric .fdmi_pending &= ~FDLS_FDMI_ABORT_PENDING ;
3735
-
3736
- fdls_send_fdmi_plogi (iport );
3835
+ /*
3836
+ * Only if ABORT PENDING is off, delete the timer, and if no other
3837
+ * operations are pending, retry FDMI.
3838
+ * Otherwise, let the timer pop and take the appropriate action.
3839
+ */
3840
+ if (!(iport -> fabric .fdmi_pending & FDLS_FDMI_ABORT_PENDING )) {
3841
+ timer_delete_sync (& iport -> fabric .fdmi_timer );
3842
+ if (!iport -> fabric .fdmi_pending )
3843
+ fdls_fdmi_retry_plogi (iport );
3844
+ }
3737
3845
}
3738
3846
3739
3847
static void
@@ -4972,9 +5080,12 @@ void fnic_fdls_link_down(struct fnic_iport_s *iport)
4972
5080
fdls_delete_tport (iport , tport );
4973
5081
}
4974
5082
4975
- if ((fnic_fdmi_support == 1 ) && (iport -> fabric .fdmi_pending > 0 )) {
4976
- timer_delete_sync (& iport -> fabric .fdmi_timer );
4977
- iport -> fabric .fdmi_pending = 0 ;
5083
+ if (fnic_fdmi_support == 1 ) {
5084
+ if (iport -> fabric .fdmi_pending > 0 ) {
5085
+ timer_delete_sync (& iport -> fabric .fdmi_timer );
5086
+ iport -> fabric .fdmi_pending = 0 ;
5087
+ }
5088
+ iport -> flags &= ~FNIC_FDMI_ACTIVE ;
4978
5089
}
4979
5090
4980
5091
FNIC_FCS_DBG (KERN_INFO , fnic -> host , fnic -> fnic_num ,
0 commit comments