@@ -371,6 +371,7 @@ static int dpaa_setup_tc(struct net_device *net_dev, enum tc_setup_type type,
371
371
void * type_data )
372
372
{
373
373
struct dpaa_priv * priv = netdev_priv (net_dev );
374
+ int num_txqs_per_tc = dpaa_num_txqs_per_tc ();
374
375
struct tc_mqprio_qopt * mqprio = type_data ;
375
376
u8 num_tc ;
376
377
int i ;
@@ -398,12 +399,12 @@ static int dpaa_setup_tc(struct net_device *net_dev, enum tc_setup_type type,
398
399
netdev_set_num_tc (net_dev , num_tc );
399
400
400
401
for (i = 0 ; i < num_tc ; i ++ )
401
- netdev_set_tc_queue (net_dev , i , DPAA_TC_TXQ_NUM ,
402
- i * DPAA_TC_TXQ_NUM );
402
+ netdev_set_tc_queue (net_dev , i , num_txqs_per_tc ,
403
+ i * num_txqs_per_tc );
403
404
404
405
out :
405
406
priv -> num_tc = num_tc ? : 1 ;
406
- netif_set_real_num_tx_queues (net_dev , priv -> num_tc * DPAA_TC_TXQ_NUM );
407
+ netif_set_real_num_tx_queues (net_dev , priv -> num_tc * num_txqs_per_tc );
407
408
return 0 ;
408
409
}
409
410
@@ -649,7 +650,7 @@ static inline void dpaa_assign_wq(struct dpaa_fq *fq, int idx)
649
650
fq -> wq = 6 ;
650
651
break ;
651
652
case FQ_TYPE_TX :
652
- switch (idx / DPAA_TC_TXQ_NUM ) {
653
+ switch (idx / dpaa_num_txqs_per_tc () ) {
653
654
case 0 :
654
655
/* Low priority (best effort) */
655
656
fq -> wq = 6 ;
@@ -667,8 +668,8 @@ static inline void dpaa_assign_wq(struct dpaa_fq *fq, int idx)
667
668
fq -> wq = 0 ;
668
669
break ;
669
670
default :
670
- WARN (1 , "Too many TX FQs: more than %d !\n" ,
671
- DPAA_ETH_TXQ_NUM );
671
+ WARN (1 , "Too many TX FQs: more than %zu !\n" ,
672
+ dpaa_max_num_txqs () );
672
673
}
673
674
break ;
674
675
default :
@@ -740,7 +741,8 @@ static int dpaa_alloc_all_fqs(struct device *dev, struct list_head *list,
740
741
741
742
port_fqs -> rx_pcdq = & dpaa_fq [0 ];
742
743
743
- if (!dpaa_fq_alloc (dev , 0 , DPAA_ETH_TXQ_NUM , list , FQ_TYPE_TX_CONF_MQ ))
744
+ if (!dpaa_fq_alloc (dev , 0 , dpaa_max_num_txqs (), list ,
745
+ FQ_TYPE_TX_CONF_MQ ))
744
746
goto fq_alloc_failed ;
745
747
746
748
dpaa_fq = dpaa_fq_alloc (dev , 0 , 1 , list , FQ_TYPE_TX_ERROR );
@@ -755,7 +757,7 @@ static int dpaa_alloc_all_fqs(struct device *dev, struct list_head *list,
755
757
756
758
port_fqs -> tx_defq = & dpaa_fq [0 ];
757
759
758
- if (!dpaa_fq_alloc (dev , 0 , DPAA_ETH_TXQ_NUM , list , FQ_TYPE_TX ))
760
+ if (!dpaa_fq_alloc (dev , 0 , dpaa_max_num_txqs () , list , FQ_TYPE_TX ))
759
761
goto fq_alloc_failed ;
760
762
761
763
return 0 ;
@@ -931,14 +933,18 @@ static inline void dpaa_setup_egress(const struct dpaa_priv *priv,
931
933
}
932
934
}
933
935
934
- static void dpaa_fq_setup (struct dpaa_priv * priv ,
935
- const struct dpaa_fq_cbs * fq_cbs ,
936
- struct fman_port * tx_port )
936
+ static int dpaa_fq_setup (struct dpaa_priv * priv ,
937
+ const struct dpaa_fq_cbs * fq_cbs ,
938
+ struct fman_port * tx_port )
937
939
{
938
940
int egress_cnt = 0 , conf_cnt = 0 , num_portals = 0 , portal_cnt = 0 , cpu ;
939
941
const cpumask_t * affine_cpus = qman_affine_cpus ();
940
- u16 channels [NR_CPUS ];
941
942
struct dpaa_fq * fq ;
943
+ u16 * channels ;
944
+
945
+ channels = kcalloc (num_possible_cpus (), sizeof (u16 ), GFP_KERNEL );
946
+ if (!channels )
947
+ return - ENOMEM ;
942
948
943
949
for_each_cpu_and (cpu , affine_cpus , cpu_online_mask )
944
950
channels [num_portals ++ ] = qman_affine_channel (cpu );
@@ -965,11 +971,7 @@ static void dpaa_fq_setup(struct dpaa_priv *priv,
965
971
case FQ_TYPE_TX :
966
972
dpaa_setup_egress (priv , fq , tx_port ,
967
973
& fq_cbs -> egress_ern );
968
- /* If we have more Tx queues than the number of cores,
969
- * just ignore the extra ones.
970
- */
971
- if (egress_cnt < DPAA_ETH_TXQ_NUM )
972
- priv -> egress_fqs [egress_cnt ++ ] = & fq -> fq_base ;
974
+ priv -> egress_fqs [egress_cnt ++ ] = & fq -> fq_base ;
973
975
break ;
974
976
case FQ_TYPE_TX_CONF_MQ :
975
977
priv -> conf_fqs [conf_cnt ++ ] = & fq -> fq_base ;
@@ -987,24 +989,17 @@ static void dpaa_fq_setup(struct dpaa_priv *priv,
987
989
}
988
990
}
989
991
990
- /* Make sure all CPUs receive a corresponding Tx queue. */
991
- while (egress_cnt < DPAA_ETH_TXQ_NUM ) {
992
- list_for_each_entry (fq , & priv -> dpaa_fq_list , list ) {
993
- if (fq -> fq_type != FQ_TYPE_TX )
994
- continue ;
995
- priv -> egress_fqs [egress_cnt ++ ] = & fq -> fq_base ;
996
- if (egress_cnt == DPAA_ETH_TXQ_NUM )
997
- break ;
998
- }
999
- }
992
+ kfree (channels );
993
+
994
+ return 0 ;
1000
995
}
1001
996
1002
997
static inline int dpaa_tx_fq_to_id (const struct dpaa_priv * priv ,
1003
998
struct qman_fq * tx_fq )
1004
999
{
1005
1000
int i ;
1006
1001
1007
- for (i = 0 ; i < DPAA_ETH_TXQ_NUM ; i ++ )
1002
+ for (i = 0 ; i < dpaa_max_num_txqs () ; i ++ )
1008
1003
if (priv -> egress_fqs [i ] == tx_fq )
1009
1004
return i ;
1010
1005
@@ -3324,7 +3319,7 @@ static int dpaa_eth_probe(struct platform_device *pdev)
3324
3319
/* Allocate this early, so we can store relevant information in
3325
3320
* the private area
3326
3321
*/
3327
- net_dev = alloc_etherdev_mq (sizeof (* priv ), DPAA_ETH_TXQ_NUM );
3322
+ net_dev = alloc_etherdev_mq (sizeof (* priv ), dpaa_max_num_txqs () );
3328
3323
if (!net_dev ) {
3329
3324
dev_err (dev , "alloc_etherdev_mq() failed\n" );
3330
3325
return - ENOMEM ;
@@ -3339,6 +3334,22 @@ static int dpaa_eth_probe(struct platform_device *pdev)
3339
3334
3340
3335
priv -> msg_enable = netif_msg_init (debug , DPAA_MSG_DEFAULT );
3341
3336
3337
+ priv -> egress_fqs = devm_kcalloc (dev , dpaa_max_num_txqs (),
3338
+ sizeof (* priv -> egress_fqs ),
3339
+ GFP_KERNEL );
3340
+ if (!priv -> egress_fqs ) {
3341
+ err = - ENOMEM ;
3342
+ goto free_netdev ;
3343
+ }
3344
+
3345
+ priv -> conf_fqs = devm_kcalloc (dev , dpaa_max_num_txqs (),
3346
+ sizeof (* priv -> conf_fqs ),
3347
+ GFP_KERNEL );
3348
+ if (!priv -> conf_fqs ) {
3349
+ err = - ENOMEM ;
3350
+ goto free_netdev ;
3351
+ }
3352
+
3342
3353
mac_dev = dpaa_mac_dev_get (pdev );
3343
3354
if (IS_ERR (mac_dev )) {
3344
3355
netdev_err (net_dev , "dpaa_mac_dev_get() failed\n" );
@@ -3416,7 +3427,9 @@ static int dpaa_eth_probe(struct platform_device *pdev)
3416
3427
*/
3417
3428
dpaa_eth_add_channel (priv -> channel , & pdev -> dev );
3418
3429
3419
- dpaa_fq_setup (priv , & dpaa_fq_cbs , priv -> mac_dev -> port [TX ]);
3430
+ err = dpaa_fq_setup (priv , & dpaa_fq_cbs , priv -> mac_dev -> port [TX ]);
3431
+ if (err )
3432
+ goto free_dpaa_bps ;
3420
3433
3421
3434
/* Create a congestion group for this netdev, with
3422
3435
* dynamically-allocated CGR ID.
@@ -3462,7 +3475,8 @@ static int dpaa_eth_probe(struct platform_device *pdev)
3462
3475
}
3463
3476
3464
3477
priv -> num_tc = 1 ;
3465
- netif_set_real_num_tx_queues (net_dev , priv -> num_tc * DPAA_TC_TXQ_NUM );
3478
+ netif_set_real_num_tx_queues (net_dev ,
3479
+ priv -> num_tc * dpaa_num_txqs_per_tc ());
3466
3480
3467
3481
/* Initialize NAPI */
3468
3482
err = dpaa_napi_add (net_dev );
0 commit comments