@@ -119,6 +119,35 @@ int aq_nic_cfg_start(struct aq_nic_s *self)
119
119
return 0 ;
120
120
}
121
121
122
+ static int aq_nic_update_link_status (struct aq_nic_s * self )
123
+ {
124
+ int err = self -> aq_hw_ops .hw_get_link_status (self -> aq_hw );
125
+
126
+ if (err )
127
+ return err ;
128
+
129
+ if (self -> link_status .mbps != self -> aq_hw -> aq_link_status .mbps )
130
+ pr_info ("%s: link change old %d new %d\n" ,
131
+ AQ_CFG_DRV_NAME , self -> link_status .mbps ,
132
+ self -> aq_hw -> aq_link_status .mbps );
133
+
134
+ self -> link_status = self -> aq_hw -> aq_link_status ;
135
+ if (!netif_carrier_ok (self -> ndev ) && self -> link_status .mbps ) {
136
+ aq_utils_obj_set (& self -> header .flags ,
137
+ AQ_NIC_FLAG_STARTED );
138
+ aq_utils_obj_clear (& self -> header .flags ,
139
+ AQ_NIC_LINK_DOWN );
140
+ netif_carrier_on (self -> ndev );
141
+ netif_tx_wake_all_queues (self -> ndev );
142
+ }
143
+ if (netif_carrier_ok (self -> ndev ) && !self -> link_status .mbps ) {
144
+ netif_carrier_off (self -> ndev );
145
+ netif_tx_disable (self -> ndev );
146
+ aq_utils_obj_set (& self -> header .flags , AQ_NIC_LINK_DOWN );
147
+ }
148
+ return 0 ;
149
+ }
150
+
122
151
static void aq_nic_service_timer_cb (unsigned long param )
123
152
{
124
153
struct aq_nic_s * self = (struct aq_nic_s * )param ;
@@ -131,26 +160,13 @@ static void aq_nic_service_timer_cb(unsigned long param)
131
160
if (aq_utils_obj_test (& self -> header .flags , AQ_NIC_FLAGS_IS_NOT_READY ))
132
161
goto err_exit ;
133
162
134
- err = self -> aq_hw_ops . hw_get_link_status (self -> aq_hw );
135
- if (err < 0 )
163
+ err = aq_nic_update_link_status (self );
164
+ if (err )
136
165
goto err_exit ;
137
166
138
- self -> link_status = self -> aq_hw -> aq_link_status ;
139
-
140
167
self -> aq_hw_ops .hw_interrupt_moderation_set (self -> aq_hw ,
141
168
self -> aq_nic_cfg .is_interrupt_moderation );
142
169
143
- if (self -> link_status .mbps ) {
144
- aq_utils_obj_set (& self -> header .flags ,
145
- AQ_NIC_FLAG_STARTED );
146
- aq_utils_obj_clear (& self -> header .flags ,
147
- AQ_NIC_LINK_DOWN );
148
- netif_carrier_on (self -> ndev );
149
- } else {
150
- netif_carrier_off (self -> ndev );
151
- aq_utils_obj_set (& self -> header .flags , AQ_NIC_LINK_DOWN );
152
- }
153
-
154
170
memset (& stats_rx , 0U , sizeof (struct aq_ring_stats_rx_s ));
155
171
memset (& stats_tx , 0U , sizeof (struct aq_ring_stats_tx_s ));
156
172
for (i = AQ_DIMOF (self -> aq_vec ); i -- ;) {
@@ -240,7 +256,6 @@ struct aq_nic_s *aq_nic_alloc_cold(const struct net_device_ops *ndev_ops,
240
256
int aq_nic_ndev_register (struct aq_nic_s * self )
241
257
{
242
258
int err = 0 ;
243
- unsigned int i = 0U ;
244
259
245
260
if (!self -> ndev ) {
246
261
err = - EINVAL ;
@@ -262,8 +277,7 @@ int aq_nic_ndev_register(struct aq_nic_s *self)
262
277
263
278
netif_carrier_off (self -> ndev );
264
279
265
- for (i = AQ_CFG_VECS_MAX ; i -- ;)
266
- aq_nic_ndev_queue_stop (self , i );
280
+ netif_tx_disable (self -> ndev );
267
281
268
282
err = register_netdev (self -> ndev );
269
283
if (err < 0 )
@@ -318,12 +332,8 @@ struct aq_nic_s *aq_nic_alloc_hot(struct net_device *ndev)
318
332
err = - EINVAL ;
319
333
goto err_exit ;
320
334
}
321
- if (netif_running (ndev )) {
322
- unsigned int i ;
323
-
324
- for (i = AQ_CFG_VECS_MAX ; i -- ;)
325
- netif_stop_subqueue (ndev , i );
326
- }
335
+ if (netif_running (ndev ))
336
+ netif_tx_disable (ndev );
327
337
328
338
for (self -> aq_vecs = 0 ; self -> aq_vecs < self -> aq_nic_cfg .vecs ;
329
339
self -> aq_vecs ++ ) {
@@ -383,16 +393,6 @@ int aq_nic_init(struct aq_nic_s *self)
383
393
return err ;
384
394
}
385
395
386
- void aq_nic_ndev_queue_start (struct aq_nic_s * self , unsigned int idx )
387
- {
388
- netif_start_subqueue (self -> ndev , idx );
389
- }
390
-
391
- void aq_nic_ndev_queue_stop (struct aq_nic_s * self , unsigned int idx )
392
- {
393
- netif_stop_subqueue (self -> ndev , idx );
394
- }
395
-
396
396
int aq_nic_start (struct aq_nic_s * self )
397
397
{
398
398
struct aq_vec_s * aq_vec = NULL ;
@@ -451,10 +451,6 @@ int aq_nic_start(struct aq_nic_s *self)
451
451
goto err_exit ;
452
452
}
453
453
454
- for (i = 0U , aq_vec = self -> aq_vec [0 ];
455
- self -> aq_vecs > i ; ++ i , aq_vec = self -> aq_vec [i ])
456
- aq_nic_ndev_queue_start (self , i );
457
-
458
454
err = netif_set_real_num_tx_queues (self -> ndev , self -> aq_vecs );
459
455
if (err < 0 )
460
456
goto err_exit ;
@@ -463,6 +459,8 @@ int aq_nic_start(struct aq_nic_s *self)
463
459
if (err < 0 )
464
460
goto err_exit ;
465
461
462
+ netif_tx_start_all_queues (self -> ndev );
463
+
466
464
err_exit :
467
465
return err ;
468
466
}
@@ -602,7 +600,6 @@ int aq_nic_xmit(struct aq_nic_s *self, struct sk_buff *skb)
602
600
unsigned int vec = skb -> queue_mapping % self -> aq_nic_cfg .vecs ;
603
601
unsigned int tc = 0U ;
604
602
int err = NETDEV_TX_OK ;
605
- bool is_nic_in_bad_state ;
606
603
607
604
frags = skb_shinfo (skb )-> nr_frags + 1 ;
608
605
@@ -613,13 +610,10 @@ int aq_nic_xmit(struct aq_nic_s *self, struct sk_buff *skb)
613
610
goto err_exit ;
614
611
}
615
612
616
- is_nic_in_bad_state = aq_utils_obj_test (& self -> header .flags ,
617
- AQ_NIC_FLAGS_IS_NOT_TX_READY ) ||
618
- (aq_ring_avail_dx (ring ) <
619
- AQ_CFG_SKB_FRAGS_MAX );
613
+ aq_ring_update_queue_state (ring );
620
614
621
- if ( is_nic_in_bad_state ) {
622
- aq_nic_ndev_queue_stop ( self , ring -> idx );
615
+ /* Above status update may stop the queue. Check this. */
616
+ if ( __netif_subqueue_stopped ( self -> ndev , ring -> idx )) {
623
617
err = NETDEV_TX_BUSY ;
624
618
goto err_exit ;
625
619
}
@@ -631,9 +625,6 @@ int aq_nic_xmit(struct aq_nic_s *self, struct sk_buff *skb)
631
625
ring ,
632
626
frags );
633
627
if (err >= 0 ) {
634
- if (aq_ring_avail_dx (ring ) < AQ_CFG_SKB_FRAGS_MAX + 1 )
635
- aq_nic_ndev_queue_stop (self , ring -> idx );
636
-
637
628
++ ring -> stats .tx .packets ;
638
629
ring -> stats .tx .bytes += skb -> len ;
639
630
}
@@ -898,9 +889,7 @@ int aq_nic_stop(struct aq_nic_s *self)
898
889
struct aq_vec_s * aq_vec = NULL ;
899
890
unsigned int i = 0U ;
900
891
901
- for (i = 0U , aq_vec = self -> aq_vec [0 ];
902
- self -> aq_vecs > i ; ++ i , aq_vec = self -> aq_vec [i ])
903
- aq_nic_ndev_queue_stop (self , i );
892
+ netif_tx_disable (self -> ndev );
904
893
905
894
del_timer_sync (& self -> service_timer );
906
895
0 commit comments