@@ -489,23 +489,7 @@ fec_enet_create_page_pool(struct fec_enet_private *fep,
489489 return err ;
490490 }
491491
492- err = xdp_rxq_info_reg (& rxq -> xdp_rxq , fep -> netdev , rxq -> id , 0 );
493- if (err < 0 )
494- goto err_free_pp ;
495-
496- err = xdp_rxq_info_reg_mem_model (& rxq -> xdp_rxq , MEM_TYPE_PAGE_POOL ,
497- rxq -> page_pool );
498- if (err )
499- goto err_unregister_rxq ;
500-
501492 return 0 ;
502-
503- err_unregister_rxq :
504- xdp_rxq_info_unreg (& rxq -> xdp_rxq );
505- err_free_pp :
506- page_pool_destroy (rxq -> page_pool );
507- rxq -> page_pool = NULL ;
508- return err ;
509493}
510494
511495static void fec_txq_trigger_xmit (struct fec_enet_private * fep ,
@@ -3420,6 +3404,38 @@ static const struct ethtool_ops fec_enet_ethtool_ops = {
34203404 .self_test = net_selftest ,
34213405};
34223406
3407+ static int fec_xdp_rxq_info_reg (struct fec_enet_private * fep ,
3408+ struct fec_enet_priv_rx_q * rxq )
3409+ {
3410+ struct net_device * ndev = fep -> netdev ;
3411+ int err ;
3412+
3413+ err = xdp_rxq_info_reg (& rxq -> xdp_rxq , ndev , rxq -> id , 0 );
3414+ if (err ) {
3415+ netdev_err (ndev , "Failed to register xdp rxq info\n" );
3416+ return err ;
3417+ }
3418+
3419+ err = xdp_rxq_info_reg_mem_model (& rxq -> xdp_rxq , MEM_TYPE_PAGE_POOL ,
3420+ rxq -> page_pool );
3421+ if (err ) {
3422+ netdev_err (ndev , "Failed to register XDP mem model\n" );
3423+ xdp_rxq_info_unreg (& rxq -> xdp_rxq );
3424+
3425+ return err ;
3426+ }
3427+
3428+ return 0 ;
3429+ }
3430+
3431+ static void fec_xdp_rxq_info_unreg (struct fec_enet_priv_rx_q * rxq )
3432+ {
3433+ if (xdp_rxq_info_is_reg (& rxq -> xdp_rxq )) {
3434+ xdp_rxq_info_unreg_mem_model (& rxq -> xdp_rxq );
3435+ xdp_rxq_info_unreg (& rxq -> xdp_rxq );
3436+ }
3437+ }
3438+
34233439static void fec_enet_free_buffers (struct net_device * ndev )
34243440{
34253441 struct fec_enet_private * fep = netdev_priv (ndev );
@@ -3431,15 +3447,16 @@ static void fec_enet_free_buffers(struct net_device *ndev)
34313447
34323448 for (q = 0 ; q < fep -> num_rx_queues ; q ++ ) {
34333449 rxq = fep -> rx_queue [q ];
3450+
3451+ fec_xdp_rxq_info_unreg (rxq );
3452+
34343453 for (i = 0 ; i < rxq -> bd .ring_size ; i ++ )
34353454 page_pool_put_full_page (rxq -> page_pool , rxq -> rx_buf [i ],
34363455 false);
34373456
34383457 for (i = 0 ; i < XDP_STATS_TOTAL ; i ++ )
34393458 rxq -> stats [i ] = 0 ;
34403459
3441- if (xdp_rxq_info_is_reg (& rxq -> xdp_rxq ))
3442- xdp_rxq_info_unreg (& rxq -> xdp_rxq );
34433460 page_pool_destroy (rxq -> page_pool );
34443461 rxq -> page_pool = NULL ;
34453462 }
@@ -3594,6 +3611,11 @@ fec_enet_alloc_rxq_buffers(struct net_device *ndev, unsigned int queue)
35943611 /* Set the last buffer to wrap. */
35953612 bdp = fec_enet_get_prevdesc (bdp , & rxq -> bd );
35963613 bdp -> cbd_sc |= cpu_to_fec16 (BD_ENET_RX_WRAP );
3614+
3615+ err = fec_xdp_rxq_info_reg (fep , rxq );
3616+ if (err )
3617+ goto err_alloc ;
3618+
35973619 return 0 ;
35983620
35993621 err_alloc :
0 commit comments