@@ -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 -- ;) {
@@ -214,7 +230,6 @@ struct aq_nic_s *aq_nic_alloc_cold(const struct net_device_ops *ndev_ops,
214
230
SET_NETDEV_DEV (ndev , dev );
215
231
216
232
ndev -> if_port = port ;
217
- ndev -> min_mtu = ETH_MIN_MTU ;
218
233
self -> ndev = ndev ;
219
234
220
235
self -> aq_pci_func = aq_pci_func ;
@@ -241,7 +256,6 @@ struct aq_nic_s *aq_nic_alloc_cold(const struct net_device_ops *ndev_ops,
241
256
int aq_nic_ndev_register (struct aq_nic_s * self )
242
257
{
243
258
int err = 0 ;
244
- unsigned int i = 0U ;
245
259
246
260
if (!self -> ndev ) {
247
261
err = - EINVAL ;
@@ -263,8 +277,7 @@ int aq_nic_ndev_register(struct aq_nic_s *self)
263
277
264
278
netif_carrier_off (self -> ndev );
265
279
266
- for (i = AQ_CFG_VECS_MAX ; i -- ;)
267
- aq_nic_ndev_queue_stop (self , i );
280
+ netif_tx_disable (self -> ndev );
268
281
269
282
err = register_netdev (self -> ndev );
270
283
if (err < 0 )
@@ -283,6 +296,7 @@ int aq_nic_ndev_init(struct aq_nic_s *self)
283
296
self -> ndev -> features = aq_hw_caps -> hw_features ;
284
297
self -> ndev -> priv_flags = aq_hw_caps -> hw_priv_flags ;
285
298
self -> ndev -> mtu = aq_nic_cfg -> mtu - ETH_HLEN ;
299
+ self -> ndev -> max_mtu = self -> aq_hw_caps .mtu - ETH_FCS_LEN - ETH_HLEN ;
286
300
287
301
return 0 ;
288
302
}
@@ -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
}
@@ -475,6 +473,7 @@ static unsigned int aq_nic_map_skb(struct aq_nic_s *self,
475
473
unsigned int nr_frags = skb_shinfo (skb )-> nr_frags ;
476
474
unsigned int frag_count = 0U ;
477
475
unsigned int dx = ring -> sw_tail ;
476
+ struct aq_ring_buff_s * first = NULL ;
478
477
struct aq_ring_buff_s * dx_buff = & ring -> buff_ring [dx ];
479
478
480
479
if (unlikely (skb_is_gso (skb ))) {
@@ -485,6 +484,7 @@ static unsigned int aq_nic_map_skb(struct aq_nic_s *self,
485
484
dx_buff -> len_l4 = tcp_hdrlen (skb );
486
485
dx_buff -> mss = skb_shinfo (skb )-> gso_size ;
487
486
dx_buff -> is_txc = 1U ;
487
+ dx_buff -> eop_index = 0xffffU ;
488
488
489
489
dx_buff -> is_ipv6 =
490
490
(ip_hdr (skb )-> version == 6 ) ? 1U : 0U ;
@@ -504,6 +504,7 @@ static unsigned int aq_nic_map_skb(struct aq_nic_s *self,
504
504
if (unlikely (dma_mapping_error (aq_nic_get_dev (self ), dx_buff -> pa )))
505
505
goto exit ;
506
506
507
+ first = dx_buff ;
507
508
dx_buff -> len_pkt = skb -> len ;
508
509
dx_buff -> is_sop = 1U ;
509
510
dx_buff -> is_mapped = 1U ;
@@ -532,40 +533,46 @@ static unsigned int aq_nic_map_skb(struct aq_nic_s *self,
532
533
533
534
for (; nr_frags -- ; ++ frag_count ) {
534
535
unsigned int frag_len = 0U ;
536
+ unsigned int buff_offset = 0U ;
537
+ unsigned int buff_size = 0U ;
535
538
dma_addr_t frag_pa ;
536
539
skb_frag_t * frag = & skb_shinfo (skb )-> frags [frag_count ];
537
540
538
541
frag_len = skb_frag_size (frag );
539
- frag_pa = skb_frag_dma_map (aq_nic_get_dev (self ), frag , 0 ,
540
- frag_len , DMA_TO_DEVICE );
541
542
542
- if (unlikely (dma_mapping_error (aq_nic_get_dev (self ), frag_pa )))
543
- goto mapping_error ;
543
+ while (frag_len ) {
544
+ if (frag_len > AQ_CFG_TX_FRAME_MAX )
545
+ buff_size = AQ_CFG_TX_FRAME_MAX ;
546
+ else
547
+ buff_size = frag_len ;
548
+
549
+ frag_pa = skb_frag_dma_map (aq_nic_get_dev (self ),
550
+ frag ,
551
+ buff_offset ,
552
+ buff_size ,
553
+ DMA_TO_DEVICE );
554
+
555
+ if (unlikely (dma_mapping_error (aq_nic_get_dev (self ),
556
+ frag_pa )))
557
+ goto mapping_error ;
544
558
545
- while (frag_len > AQ_CFG_TX_FRAME_MAX ) {
546
559
dx = aq_ring_next_dx (ring , dx );
547
560
dx_buff = & ring -> buff_ring [dx ];
548
561
549
562
dx_buff -> flags = 0U ;
550
- dx_buff -> len = AQ_CFG_TX_FRAME_MAX ;
563
+ dx_buff -> len = buff_size ;
551
564
dx_buff -> pa = frag_pa ;
552
565
dx_buff -> is_mapped = 1U ;
566
+ dx_buff -> eop_index = 0xffffU ;
567
+
568
+ frag_len -= buff_size ;
569
+ buff_offset += buff_size ;
553
570
554
- frag_len -= AQ_CFG_TX_FRAME_MAX ;
555
- frag_pa += AQ_CFG_TX_FRAME_MAX ;
556
571
++ ret ;
557
572
}
558
-
559
- dx = aq_ring_next_dx (ring , dx );
560
- dx_buff = & ring -> buff_ring [dx ];
561
-
562
- dx_buff -> flags = 0U ;
563
- dx_buff -> len = frag_len ;
564
- dx_buff -> pa = frag_pa ;
565
- dx_buff -> is_mapped = 1U ;
566
- ++ ret ;
567
573
}
568
574
575
+ first -> eop_index = dx ;
569
576
dx_buff -> is_eop = 1U ;
570
577
dx_buff -> skb = skb ;
571
578
goto exit ;
@@ -602,7 +609,6 @@ int aq_nic_xmit(struct aq_nic_s *self, struct sk_buff *skb)
602
609
unsigned int vec = skb -> queue_mapping % self -> aq_nic_cfg .vecs ;
603
610
unsigned int tc = 0U ;
604
611
int err = NETDEV_TX_OK ;
605
- bool is_nic_in_bad_state ;
606
612
607
613
frags = skb_shinfo (skb )-> nr_frags + 1 ;
608
614
@@ -613,13 +619,10 @@ int aq_nic_xmit(struct aq_nic_s *self, struct sk_buff *skb)
613
619
goto err_exit ;
614
620
}
615
621
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 );
622
+ aq_ring_update_queue_state (ring );
620
623
621
- if ( is_nic_in_bad_state ) {
622
- aq_nic_ndev_queue_stop ( self , ring -> idx );
624
+ /* Above status update may stop the queue. Check this. */
625
+ if ( __netif_subqueue_stopped ( self -> ndev , ring -> idx )) {
623
626
err = NETDEV_TX_BUSY ;
624
627
goto err_exit ;
625
628
}
@@ -631,9 +634,6 @@ int aq_nic_xmit(struct aq_nic_s *self, struct sk_buff *skb)
631
634
ring ,
632
635
frags );
633
636
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
637
++ ring -> stats .tx .packets ;
638
638
ring -> stats .tx .bytes += skb -> len ;
639
639
}
@@ -693,16 +693,9 @@ int aq_nic_set_multicast_list(struct aq_nic_s *self, struct net_device *ndev)
693
693
694
694
int aq_nic_set_mtu (struct aq_nic_s * self , int new_mtu )
695
695
{
696
- int err = 0 ;
697
-
698
- if (new_mtu > self -> aq_hw_caps .mtu ) {
699
- err = - EINVAL ;
700
- goto err_exit ;
701
- }
702
696
self -> aq_nic_cfg .mtu = new_mtu ;
703
697
704
- err_exit :
705
- return err ;
698
+ return 0 ;
706
699
}
707
700
708
701
int aq_nic_set_mac (struct aq_nic_s * self , struct net_device * ndev )
@@ -905,9 +898,7 @@ int aq_nic_stop(struct aq_nic_s *self)
905
898
struct aq_vec_s * aq_vec = NULL ;
906
899
unsigned int i = 0U ;
907
900
908
- for (i = 0U , aq_vec = self -> aq_vec [0 ];
909
- self -> aq_vecs > i ; ++ i , aq_vec = self -> aq_vec [i ])
910
- aq_nic_ndev_queue_stop (self , i );
901
+ netif_tx_disable (self -> ndev );
911
902
912
903
del_timer_sync (& self -> service_timer );
913
904
0 commit comments