@@ -828,21 +828,30 @@ static void am65_cpsw_nuss_xmit_free(struct am65_cpsw_tx_chn *tx_chn,
828
828
static void am65_cpsw_nuss_tx_cleanup (void * data , dma_addr_t desc_dma )
829
829
{
830
830
struct am65_cpsw_tx_chn * tx_chn = data ;
831
+ enum am65_cpsw_tx_buf_type buf_type ;
831
832
struct cppi5_host_desc_t * desc_tx ;
833
+ struct xdp_frame * xdpf ;
832
834
struct sk_buff * skb ;
833
835
void * * swdata ;
834
836
835
837
desc_tx = k3_cppi_desc_pool_dma2virt (tx_chn -> desc_pool , desc_dma );
836
838
swdata = cppi5_hdesc_get_swdata (desc_tx );
837
- skb = * (swdata );
838
- am65_cpsw_nuss_xmit_free (tx_chn , desc_tx );
839
+ buf_type = am65_cpsw_nuss_buf_type (tx_chn , desc_dma );
840
+ if (buf_type == AM65_CPSW_TX_BUF_TYPE_SKB ) {
841
+ skb = * (swdata );
842
+ dev_kfree_skb_any (skb );
843
+ } else {
844
+ xdpf = * (swdata );
845
+ xdp_return_frame (xdpf );
846
+ }
839
847
840
- dev_kfree_skb_any ( skb );
848
+ am65_cpsw_nuss_xmit_free ( tx_chn , desc_tx );
841
849
}
842
850
843
851
static struct sk_buff * am65_cpsw_build_skb (void * page_addr ,
844
852
struct net_device * ndev ,
845
- unsigned int len )
853
+ unsigned int len ,
854
+ unsigned int headroom )
846
855
{
847
856
struct sk_buff * skb ;
848
857
@@ -852,7 +861,7 @@ static struct sk_buff *am65_cpsw_build_skb(void *page_addr,
852
861
if (unlikely (!skb ))
853
862
return NULL ;
854
863
855
- skb_reserve (skb , AM65_CPSW_HEADROOM );
864
+ skb_reserve (skb , headroom );
856
865
skb -> dev = ndev ;
857
866
858
867
return skb ;
@@ -1169,9 +1178,11 @@ static int am65_cpsw_run_xdp(struct am65_cpsw_rx_flow *flow,
1169
1178
struct xdp_frame * xdpf ;
1170
1179
struct bpf_prog * prog ;
1171
1180
struct page * page ;
1181
+ int pkt_len ;
1172
1182
u32 act ;
1173
1183
int err ;
1174
1184
1185
+ pkt_len = * len ;
1175
1186
prog = READ_ONCE (port -> xdp_prog );
1176
1187
if (!prog )
1177
1188
return AM65_CPSW_XDP_PASS ;
@@ -1189,8 +1200,10 @@ static int am65_cpsw_run_xdp(struct am65_cpsw_rx_flow *flow,
1189
1200
netif_txq = netdev_get_tx_queue (ndev , tx_chn -> id );
1190
1201
1191
1202
xdpf = xdp_convert_buff_to_frame (xdp );
1192
- if (unlikely (!xdpf ))
1203
+ if (unlikely (!xdpf )) {
1204
+ ndev -> stats .tx_dropped ++ ;
1193
1205
goto drop ;
1206
+ }
1194
1207
1195
1208
__netif_tx_lock (netif_txq , cpu );
1196
1209
err = am65_cpsw_xdp_tx_frame (ndev , tx_chn , xdpf ,
@@ -1199,14 +1212,14 @@ static int am65_cpsw_run_xdp(struct am65_cpsw_rx_flow *flow,
1199
1212
if (err )
1200
1213
goto drop ;
1201
1214
1202
- dev_sw_netstats_tx_add (ndev , 1 , * len );
1215
+ dev_sw_netstats_rx_add (ndev , pkt_len );
1203
1216
ret = AM65_CPSW_XDP_CONSUMED ;
1204
1217
goto out ;
1205
1218
case XDP_REDIRECT :
1206
1219
if (unlikely (xdp_do_redirect (ndev , xdp , prog )))
1207
1220
goto drop ;
1208
1221
1209
- dev_sw_netstats_rx_add (ndev , * len );
1222
+ dev_sw_netstats_rx_add (ndev , pkt_len );
1210
1223
ret = AM65_CPSW_XDP_REDIRECT ;
1211
1224
goto out ;
1212
1225
default :
@@ -1315,16 +1328,8 @@ static int am65_cpsw_nuss_rx_packets(struct am65_cpsw_rx_flow *flow,
1315
1328
dev_dbg (dev , "%s rx csum_info:%#x\n" , __func__ , csum_info );
1316
1329
1317
1330
dma_unmap_single (rx_chn -> dma_dev , buf_dma , buf_dma_len , DMA_FROM_DEVICE );
1318
-
1319
1331
k3_cppi_desc_pool_free (rx_chn -> desc_pool , desc_rx );
1320
1332
1321
- skb = am65_cpsw_build_skb (page_addr , ndev ,
1322
- AM65_CPSW_MAX_PACKET_SIZE );
1323
- if (unlikely (!skb )) {
1324
- new_page = page ;
1325
- goto requeue ;
1326
- }
1327
-
1328
1333
if (port -> xdp_prog ) {
1329
1334
xdp_init_buff (& xdp , PAGE_SIZE , & port -> xdp_rxq [flow -> id ]);
1330
1335
xdp_prepare_buff (& xdp , page_addr , AM65_CPSW_HEADROOM ,
@@ -1334,9 +1339,16 @@ static int am65_cpsw_nuss_rx_packets(struct am65_cpsw_rx_flow *flow,
1334
1339
if (* xdp_state != AM65_CPSW_XDP_PASS )
1335
1340
goto allocate ;
1336
1341
1337
- /* Compute additional headroom to be reserved */
1338
- headroom = (xdp .data - xdp .data_hard_start ) - skb_headroom (skb );
1339
- skb_reserve (skb , headroom );
1342
+ headroom = xdp .data - xdp .data_hard_start ;
1343
+ } else {
1344
+ headroom = AM65_CPSW_HEADROOM ;
1345
+ }
1346
+
1347
+ skb = am65_cpsw_build_skb (page_addr , ndev ,
1348
+ AM65_CPSW_MAX_PACKET_SIZE , headroom );
1349
+ if (unlikely (!skb )) {
1350
+ new_page = page ;
1351
+ goto requeue ;
1340
1352
}
1341
1353
1342
1354
ndev_priv = netdev_priv (ndev );
0 commit comments