@@ -142,7 +142,8 @@ MODULE_DEVICE_TABLE(acpi, hns_enet_acpi_match);
142
142
143
143
static void fill_desc (struct hnae_ring * ring , void * priv ,
144
144
int size , dma_addr_t dma , int frag_end ,
145
- int buf_num , enum hns_desc_type type , int mtu )
145
+ int buf_num , enum hns_desc_type type , int mtu ,
146
+ bool is_gso )
146
147
{
147
148
struct hnae_desc * desc = & ring -> desc [ring -> next_to_use ];
148
149
struct hnae_desc_cb * desc_cb = & ring -> desc_cb [ring -> next_to_use ];
@@ -275,6 +276,15 @@ static int hns_nic_maybe_stop_tso(
275
276
return 0 ;
276
277
}
277
278
279
+ static int hns_nic_maybe_stop_tx_v2 (struct sk_buff * * out_skb , int * bnum ,
280
+ struct hnae_ring * ring )
281
+ {
282
+ if (skb_is_gso (* out_skb ))
283
+ return hns_nic_maybe_stop_tso (out_skb , bnum , ring );
284
+ else
285
+ return hns_nic_maybe_stop_tx (out_skb , bnum , ring );
286
+ }
287
+
278
288
static void fill_tso_desc (struct hnae_ring * ring , void * priv ,
279
289
int size , dma_addr_t dma , int frag_end ,
280
290
int buf_num , enum hns_desc_type type , int mtu )
@@ -300,6 +310,19 @@ static void fill_tso_desc(struct hnae_ring *ring, void *priv,
300
310
mtu );
301
311
}
302
312
313
+ static void fill_desc_v2 (struct hnae_ring * ring , void * priv ,
314
+ int size , dma_addr_t dma , int frag_end ,
315
+ int buf_num , enum hns_desc_type type , int mtu ,
316
+ bool is_gso )
317
+ {
318
+ if (is_gso )
319
+ fill_tso_desc (ring , priv , size , dma , frag_end , buf_num , type ,
320
+ mtu );
321
+ else
322
+ fill_v2_desc (ring , priv , size , dma , frag_end , buf_num , type ,
323
+ mtu );
324
+ }
325
+
303
326
netdev_tx_t hns_nic_net_xmit_hw (struct net_device * ndev ,
304
327
struct sk_buff * skb ,
305
328
struct hns_nic_ring_data * ring_data )
@@ -313,6 +336,7 @@ netdev_tx_t hns_nic_net_xmit_hw(struct net_device *ndev,
313
336
int seg_num ;
314
337
dma_addr_t dma ;
315
338
int size , next_to_use ;
339
+ bool is_gso ;
316
340
int i ;
317
341
318
342
switch (priv -> ops .maybe_stop_tx (& skb , & buf_num , ring )) {
@@ -339,8 +363,9 @@ netdev_tx_t hns_nic_net_xmit_hw(struct net_device *ndev,
339
363
ring -> stats .sw_err_cnt ++ ;
340
364
goto out_err_tx_ok ;
341
365
}
366
+ is_gso = skb_is_gso (skb );
342
367
priv -> ops .fill_desc (ring , skb , size , dma , seg_num == 1 ? 1 : 0 ,
343
- buf_num , DESC_TYPE_SKB , ndev -> mtu );
368
+ buf_num , DESC_TYPE_SKB , ndev -> mtu , is_gso );
344
369
345
370
/* fill the fragments */
346
371
for (i = 1 ; i < seg_num ; i ++ ) {
@@ -354,7 +379,7 @@ netdev_tx_t hns_nic_net_xmit_hw(struct net_device *ndev,
354
379
}
355
380
priv -> ops .fill_desc (ring , skb_frag_page (frag ), size , dma ,
356
381
seg_num - 1 == i ? 1 : 0 , buf_num ,
357
- DESC_TYPE_PAGE , ndev -> mtu );
382
+ DESC_TYPE_PAGE , ndev -> mtu , is_gso );
358
383
}
359
384
360
385
/*complete translate all packets*/
@@ -1776,15 +1801,6 @@ static int hns_nic_set_features(struct net_device *netdev,
1776
1801
netdev_info (netdev , "enet v1 do not support tso!\n" );
1777
1802
break ;
1778
1803
default :
1779
- if (features & (NETIF_F_TSO | NETIF_F_TSO6 )) {
1780
- priv -> ops .fill_desc = fill_tso_desc ;
1781
- priv -> ops .maybe_stop_tx = hns_nic_maybe_stop_tso ;
1782
- /* The chip only support 7*4096 */
1783
- netif_set_tso_max_size (netdev , 7 * 4096 );
1784
- } else {
1785
- priv -> ops .fill_desc = fill_v2_desc ;
1786
- priv -> ops .maybe_stop_tx = hns_nic_maybe_stop_tx ;
1787
- }
1788
1804
break ;
1789
1805
}
1790
1806
netdev -> features = features ;
@@ -2159,16 +2175,9 @@ static void hns_nic_set_priv_ops(struct net_device *netdev)
2159
2175
priv -> ops .maybe_stop_tx = hns_nic_maybe_stop_tx ;
2160
2176
} else {
2161
2177
priv -> ops .get_rxd_bnum = get_v2rx_desc_bnum ;
2162
- if ((netdev -> features & NETIF_F_TSO ) ||
2163
- (netdev -> features & NETIF_F_TSO6 )) {
2164
- priv -> ops .fill_desc = fill_tso_desc ;
2165
- priv -> ops .maybe_stop_tx = hns_nic_maybe_stop_tso ;
2166
- /* This chip only support 7*4096 */
2167
- netif_set_tso_max_size (netdev , 7 * 4096 );
2168
- } else {
2169
- priv -> ops .fill_desc = fill_v2_desc ;
2170
- priv -> ops .maybe_stop_tx = hns_nic_maybe_stop_tx ;
2171
- }
2178
+ priv -> ops .fill_desc = fill_desc_v2 ;
2179
+ priv -> ops .maybe_stop_tx = hns_nic_maybe_stop_tx_v2 ;
2180
+ netif_set_tso_max_size (netdev , 7 * 4096 );
2172
2181
/* enable tso when init
2173
2182
* control tso on/off through TSE bit in bd
2174
2183
*/
0 commit comments