@@ -4739,6 +4739,69 @@ static int stmmac_hw_init(struct stmmac_priv *priv)
4739
4739
return 0 ;
4740
4740
}
4741
4741
4742
+ static void stmmac_napi_add (struct net_device * dev )
4743
+ {
4744
+ struct stmmac_priv * priv = netdev_priv (dev );
4745
+ u32 queue , maxq ;
4746
+
4747
+ maxq = max (priv -> plat -> rx_queues_to_use , priv -> plat -> tx_queues_to_use );
4748
+
4749
+ for (queue = 0 ; queue < maxq ; queue ++ ) {
4750
+ struct stmmac_channel * ch = & priv -> channel [queue ];
4751
+
4752
+ ch -> priv_data = priv ;
4753
+ ch -> index = queue ;
4754
+
4755
+ if (queue < priv -> plat -> rx_queues_to_use ) {
4756
+ netif_napi_add (dev , & ch -> rx_napi , stmmac_napi_poll_rx ,
4757
+ NAPI_POLL_WEIGHT );
4758
+ }
4759
+ if (queue < priv -> plat -> tx_queues_to_use ) {
4760
+ netif_tx_napi_add (dev , & ch -> tx_napi ,
4761
+ stmmac_napi_poll_tx ,
4762
+ NAPI_POLL_WEIGHT );
4763
+ }
4764
+ }
4765
+ }
4766
+
4767
+ static void stmmac_napi_del (struct net_device * dev )
4768
+ {
4769
+ struct stmmac_priv * priv = netdev_priv (dev );
4770
+ u32 queue , maxq ;
4771
+
4772
+ maxq = max (priv -> plat -> rx_queues_to_use , priv -> plat -> tx_queues_to_use );
4773
+
4774
+ for (queue = 0 ; queue < maxq ; queue ++ ) {
4775
+ struct stmmac_channel * ch = & priv -> channel [queue ];
4776
+
4777
+ if (queue < priv -> plat -> rx_queues_to_use )
4778
+ netif_napi_del (& ch -> rx_napi );
4779
+ if (queue < priv -> plat -> tx_queues_to_use )
4780
+ netif_napi_del (& ch -> tx_napi );
4781
+ }
4782
+ }
4783
+
4784
+ int stmmac_reinit_queues (struct net_device * dev , u32 rx_cnt , u32 tx_cnt )
4785
+ {
4786
+ struct stmmac_priv * priv = netdev_priv (dev );
4787
+ int ret = 0 ;
4788
+
4789
+ if (netif_running (dev ))
4790
+ stmmac_release (dev );
4791
+
4792
+ stmmac_napi_del (dev );
4793
+
4794
+ priv -> plat -> rx_queues_to_use = rx_cnt ;
4795
+ priv -> plat -> tx_queues_to_use = tx_cnt ;
4796
+
4797
+ stmmac_napi_add (dev );
4798
+
4799
+ if (netif_running (dev ))
4800
+ ret = stmmac_open (dev );
4801
+
4802
+ return ret ;
4803
+ }
4804
+
4742
4805
/**
4743
4806
* stmmac_dvr_probe
4744
4807
* @device: device pointer
@@ -4755,7 +4818,7 @@ int stmmac_dvr_probe(struct device *device,
4755
4818
{
4756
4819
struct net_device * ndev = NULL ;
4757
4820
struct stmmac_priv * priv ;
4758
- u32 queue , rxq , maxq ;
4821
+ u32 rxq ;
4759
4822
int i , ret = 0 ;
4760
4823
4761
4824
ndev = devm_alloc_etherdev_mqs (device , sizeof (struct stmmac_priv ),
@@ -4920,25 +4983,7 @@ int stmmac_dvr_probe(struct device *device,
4920
4983
priv -> flow_ctrl = FLOW_AUTO ; /* RX/TX pause on */
4921
4984
4922
4985
/* Setup channels NAPI */
4923
- maxq = max (priv -> plat -> rx_queues_to_use , priv -> plat -> tx_queues_to_use );
4924
-
4925
- for (queue = 0 ; queue < maxq ; queue ++ ) {
4926
- struct stmmac_channel * ch = & priv -> channel [queue ];
4927
-
4928
- spin_lock_init (& ch -> lock );
4929
- ch -> priv_data = priv ;
4930
- ch -> index = queue ;
4931
-
4932
- if (queue < priv -> plat -> rx_queues_to_use ) {
4933
- netif_napi_add (ndev , & ch -> rx_napi , stmmac_napi_poll_rx ,
4934
- NAPI_POLL_WEIGHT );
4935
- }
4936
- if (queue < priv -> plat -> tx_queues_to_use ) {
4937
- netif_tx_napi_add (ndev , & ch -> tx_napi ,
4938
- stmmac_napi_poll_tx ,
4939
- NAPI_POLL_WEIGHT );
4940
- }
4941
- }
4986
+ stmmac_napi_add (ndev );
4942
4987
4943
4988
mutex_init (& priv -> lock );
4944
4989
@@ -5003,14 +5048,7 @@ int stmmac_dvr_probe(struct device *device,
5003
5048
priv -> hw -> pcs != STMMAC_PCS_RTBI )
5004
5049
stmmac_mdio_unregister (ndev );
5005
5050
error_mdio_register :
5006
- for (queue = 0 ; queue < maxq ; queue ++ ) {
5007
- struct stmmac_channel * ch = & priv -> channel [queue ];
5008
-
5009
- if (queue < priv -> plat -> rx_queues_to_use )
5010
- netif_napi_del (& ch -> rx_napi );
5011
- if (queue < priv -> plat -> tx_queues_to_use )
5012
- netif_napi_del (& ch -> tx_napi );
5013
- }
5051
+ stmmac_napi_del (ndev );
5014
5052
error_hw_init :
5015
5053
destroy_workqueue (priv -> wq );
5016
5054
0 commit comments