3
3
4
4
#include "enetc.h"
5
5
#include <linux/bpf_trace.h>
6
+ #include <linux/clk.h>
6
7
#include <linux/tcp.h>
7
8
#include <linux/udp.h>
8
9
#include <linux/vmalloc.h>
@@ -21,7 +22,7 @@ void enetc_port_mac_wr(struct enetc_si *si, u32 reg, u32 val)
21
22
{
22
23
enetc_port_wr (& si -> hw , reg , val );
23
24
if (si -> hw_features & ENETC_SI_F_QBU )
24
- enetc_port_wr (& si -> hw , reg + ENETC_PMAC_OFFSET , val );
25
+ enetc_port_wr (& si -> hw , reg + si -> drvdata -> pmac_offset , val );
25
26
}
26
27
EXPORT_SYMBOL_GPL (enetc_port_mac_wr );
27
28
@@ -700,8 +701,9 @@ static void enetc_rx_dim_work(struct work_struct *w)
700
701
net_dim_get_rx_moderation (dim -> mode , dim -> profile_ix );
701
702
struct enetc_int_vector * v =
702
703
container_of (dim , struct enetc_int_vector , rx_dim );
704
+ struct enetc_ndev_priv * priv = netdev_priv (v -> rx_ring .ndev );
703
705
704
- v -> rx_ictt = enetc_usecs_to_cycles (moder .usec );
706
+ v -> rx_ictt = enetc_usecs_to_cycles (moder .usec , priv -> sysclk_freq );
705
707
dim -> state = DIM_START_MEASURE ;
706
708
}
707
709
@@ -1736,9 +1738,15 @@ void enetc_get_si_caps(struct enetc_si *si)
1736
1738
si -> num_rx_rings = (val >> 16 ) & 0xff ;
1737
1739
si -> num_tx_rings = val & 0xff ;
1738
1740
1739
- val = enetc_rd (hw , ENETC_SIRFSCAPR );
1740
- si -> num_fs_entries = ENETC_SIRFSCAPR_GET_NUM_RFS (val );
1741
- si -> num_fs_entries = min (si -> num_fs_entries , ENETC_MAX_RFS_SIZE );
1741
+ val = enetc_rd (hw , ENETC_SIPCAPR0 );
1742
+ if (val & ENETC_SIPCAPR0_RFS ) {
1743
+ val = enetc_rd (hw , ENETC_SIRFSCAPR );
1744
+ si -> num_fs_entries = ENETC_SIRFSCAPR_GET_NUM_RFS (val );
1745
+ si -> num_fs_entries = min (si -> num_fs_entries , ENETC_MAX_RFS_SIZE );
1746
+ } else {
1747
+ /* ENETC which not supports RFS */
1748
+ si -> num_fs_entries = 0 ;
1749
+ }
1742
1750
1743
1751
si -> num_rss = 0 ;
1744
1752
val = enetc_rd (hw , ENETC_SIPCAPR0 );
@@ -2066,7 +2074,10 @@ int enetc_configure_si(struct enetc_ndev_priv *priv)
2066
2074
/* enable SI */
2067
2075
enetc_wr (hw , ENETC_SIMR , ENETC_SIMR_EN );
2068
2076
2069
- if (si -> num_rss ) {
2077
+ /* TODO: RSS support for i.MX95 will be supported later, and the
2078
+ * is_enetc_rev1() condition will be removed
2079
+ */
2080
+ if (si -> num_rss && is_enetc_rev1 (si )) {
2070
2081
err = enetc_setup_default_rss_table (si , priv -> num_rx_rings );
2071
2082
if (err )
2072
2083
return err ;
@@ -2090,9 +2101,9 @@ void enetc_init_si_rings_params(struct enetc_ndev_priv *priv)
2090
2101
*/
2091
2102
priv -> num_rx_rings = min_t (int , cpus , si -> num_rx_rings );
2092
2103
priv -> num_tx_rings = si -> num_tx_rings ;
2093
- priv -> bdr_int_num = cpus ;
2104
+ priv -> bdr_int_num = priv -> num_rx_rings ;
2094
2105
priv -> ic_mode = ENETC_IC_RX_ADAPTIVE | ENETC_IC_TX_MANUAL ;
2095
- priv -> tx_ictt = ENETC_TXIC_TIMETHR ;
2106
+ priv -> tx_ictt = enetc_usecs_to_cycles ( 600 , priv -> sysclk_freq ) ;
2096
2107
}
2097
2108
EXPORT_SYMBOL_GPL (enetc_init_si_rings_params );
2098
2109
@@ -2501,10 +2512,14 @@ int enetc_open(struct net_device *ndev)
2501
2512
2502
2513
extended = !!(priv -> active_offloads & ENETC_F_RX_TSTAMP );
2503
2514
2504
- err = enetc_setup_irqs (priv );
2515
+ err = clk_prepare_enable (priv -> ref_clk );
2505
2516
if (err )
2506
2517
return err ;
2507
2518
2519
+ err = enetc_setup_irqs (priv );
2520
+ if (err )
2521
+ goto err_setup_irqs ;
2522
+
2508
2523
err = enetc_phylink_connect (ndev );
2509
2524
if (err )
2510
2525
goto err_phy_connect ;
@@ -2536,6 +2551,8 @@ int enetc_open(struct net_device *ndev)
2536
2551
phylink_disconnect_phy (priv -> phylink );
2537
2552
err_phy_connect :
2538
2553
enetc_free_irqs (priv );
2554
+ err_setup_irqs :
2555
+ clk_disable_unprepare (priv -> ref_clk );
2539
2556
2540
2557
return err ;
2541
2558
}
@@ -2589,6 +2606,7 @@ int enetc_close(struct net_device *ndev)
2589
2606
enetc_assign_tx_resources (priv , NULL );
2590
2607
2591
2608
enetc_free_irqs (priv );
2609
+ clk_disable_unprepare (priv -> ref_clk );
2592
2610
2593
2611
return 0 ;
2594
2612
}
@@ -3254,5 +3272,55 @@ void enetc_pci_remove(struct pci_dev *pdev)
3254
3272
}
3255
3273
EXPORT_SYMBOL_GPL (enetc_pci_remove );
3256
3274
3275
+ static const struct enetc_drvdata enetc_pf_data = {
3276
+ .sysclk_freq = ENETC_CLK_400M ,
3277
+ .pmac_offset = ENETC_PMAC_OFFSET ,
3278
+ .eth_ops = & enetc_pf_ethtool_ops ,
3279
+ };
3280
+
3281
+ static const struct enetc_drvdata enetc4_pf_data = {
3282
+ .sysclk_freq = ENETC_CLK_333M ,
3283
+ .pmac_offset = ENETC4_PMAC_OFFSET ,
3284
+ .eth_ops = & enetc4_pf_ethtool_ops ,
3285
+ };
3286
+
3287
+ static const struct enetc_drvdata enetc_vf_data = {
3288
+ .sysclk_freq = ENETC_CLK_400M ,
3289
+ .eth_ops = & enetc_vf_ethtool_ops ,
3290
+ };
3291
+
3292
+ static const struct enetc_platform_info enetc_info [] = {
3293
+ { .revision = ENETC_REV_1_0 ,
3294
+ .dev_id = ENETC_DEV_ID_PF ,
3295
+ .data = & enetc_pf_data ,
3296
+ },
3297
+ { .revision = ENETC_REV_4_1 ,
3298
+ .dev_id = NXP_ENETC_PF_DEV_ID ,
3299
+ .data = & enetc4_pf_data ,
3300
+ },
3301
+ { .revision = ENETC_REV_1_0 ,
3302
+ .dev_id = ENETC_DEV_ID_VF ,
3303
+ .data = & enetc_vf_data ,
3304
+ },
3305
+ };
3306
+
3307
+ int enetc_get_driver_data (struct enetc_si * si )
3308
+ {
3309
+ u16 dev_id = si -> pdev -> device ;
3310
+ int i ;
3311
+
3312
+ for (i = 0 ; i < ARRAY_SIZE (enetc_info ); i ++ ) {
3313
+ if (si -> revision == enetc_info [i ].revision &&
3314
+ dev_id == enetc_info [i ].dev_id ) {
3315
+ si -> drvdata = enetc_info [i ].data ;
3316
+
3317
+ return 0 ;
3318
+ }
3319
+ }
3320
+
3321
+ return - ERANGE ;
3322
+ }
3323
+ EXPORT_SYMBOL_GPL (enetc_get_driver_data );
3324
+
3257
3325
MODULE_DESCRIPTION ("NXP ENETC Ethernet driver" );
3258
3326
MODULE_LICENSE ("Dual BSD/GPL" );
0 commit comments