88
88
#define CPSW_VERSION_4 0x190112
89
89
90
90
#define HOST_PORT_NUM 0
91
+ #define CPSW_ALE_PORTS_NUM 3
91
92
#define SLIVER_SIZE 0x40
92
93
93
94
#define CPSW1_HOST_PORT_OFFSET 0x028
@@ -352,6 +353,27 @@ struct cpsw_hw_stats {
352
353
u32 rxdmaoverruns ;
353
354
};
354
355
356
+ struct cpsw_slave_data {
357
+ struct device_node * phy_node ;
358
+ char phy_id [MII_BUS_ID_SIZE ];
359
+ int phy_if ;
360
+ u8 mac_addr [ETH_ALEN ];
361
+ u16 dual_emac_res_vlan ; /* Reserved VLAN for DualEMAC */
362
+ };
363
+
364
+ struct cpsw_platform_data {
365
+ struct cpsw_slave_data * slave_data ;
366
+ u32 ss_reg_ofs ; /* Subsystem control register offset */
367
+ u32 channels ; /* number of cpdma channels (symmetric) */
368
+ u32 slaves ; /* number of slave cpgmac ports */
369
+ u32 active_slave ; /* time stamping, ethtool and SIOCGMIIPHY slave */
370
+ u32 ale_entries ; /* ale table size */
371
+ u32 bd_ram_size ; /*buffer descriptor ram size */
372
+ u32 mac_control ; /* Mac control register */
373
+ u16 default_vlan ; /* Def VLAN for ALE lookup in VLAN aware mode*/
374
+ bool dual_emac ; /* Enable Dual EMAC mode */
375
+ };
376
+
355
377
struct cpsw_slave {
356
378
void __iomem * regs ;
357
379
struct cpsw_sliver_regs __iomem * sliver ;
@@ -365,12 +387,12 @@ struct cpsw_slave {
365
387
366
388
static inline u32 slave_read (struct cpsw_slave * slave , u32 offset )
367
389
{
368
- return __raw_readl (slave -> regs + offset );
390
+ return readl_relaxed (slave -> regs + offset );
369
391
}
370
392
371
393
static inline void slave_write (struct cpsw_slave * slave , u32 val , u32 offset )
372
394
{
373
- __raw_writel (val , slave -> regs + offset );
395
+ writel_relaxed (val , slave -> regs + offset );
374
396
}
375
397
376
398
struct cpsw_vector {
@@ -660,17 +682,17 @@ static void cpsw_ndo_set_rx_mode(struct net_device *ndev)
660
682
661
683
static void cpsw_intr_enable (struct cpsw_common * cpsw )
662
684
{
663
- __raw_writel (0xFF , & cpsw -> wr_regs -> tx_en );
664
- __raw_writel (0xFF , & cpsw -> wr_regs -> rx_en );
685
+ writel_relaxed (0xFF , & cpsw -> wr_regs -> tx_en );
686
+ writel_relaxed (0xFF , & cpsw -> wr_regs -> rx_en );
665
687
666
688
cpdma_ctlr_int_ctrl (cpsw -> dma , true);
667
689
return ;
668
690
}
669
691
670
692
static void cpsw_intr_disable (struct cpsw_common * cpsw )
671
693
{
672
- __raw_writel (0 , & cpsw -> wr_regs -> tx_en );
673
- __raw_writel (0 , & cpsw -> wr_regs -> rx_en );
694
+ writel_relaxed (0 , & cpsw -> wr_regs -> tx_en );
695
+ writel_relaxed (0 , & cpsw -> wr_regs -> rx_en );
674
696
675
697
cpdma_ctlr_int_ctrl (cpsw -> dma , false);
676
698
return ;
@@ -949,18 +971,14 @@ static inline void soft_reset(const char *module, void __iomem *reg)
949
971
{
950
972
unsigned long timeout = jiffies + HZ ;
951
973
952
- __raw_writel (1 , reg );
974
+ writel_relaxed (1 , reg );
953
975
do {
954
976
cpu_relax ();
955
- } while ((__raw_readl (reg ) & 1 ) && time_after (timeout , jiffies ));
977
+ } while ((readl_relaxed (reg ) & 1 ) && time_after (timeout , jiffies ));
956
978
957
- WARN (__raw_readl (reg ) & 1 , "failed to soft-reset %s\n" , module );
979
+ WARN (readl_relaxed (reg ) & 1 , "failed to soft-reset %s\n" , module );
958
980
}
959
981
960
- #define mac_hi (mac ) (((mac)[0] << 0) | ((mac)[1] << 8) | \
961
- ((mac)[2] << 16) | ((mac)[3] << 24))
962
- #define mac_lo (mac ) (((mac)[4] << 0) | ((mac)[5] << 8))
963
-
964
982
static void cpsw_set_slave_mac (struct cpsw_slave * slave ,
965
983
struct cpsw_priv * priv )
966
984
{
@@ -1015,7 +1033,7 @@ static void _cpsw_adjust_link(struct cpsw_slave *slave,
1015
1033
1016
1034
if (mac_control != slave -> mac_control ) {
1017
1035
phy_print_status (phy );
1018
- __raw_writel (mac_control , & slave -> sliver -> mac_control );
1036
+ writel_relaxed (mac_control , & slave -> sliver -> mac_control );
1019
1037
}
1020
1038
1021
1039
slave -> mac_control = mac_control ;
@@ -1278,7 +1296,7 @@ static void cpsw_slave_open(struct cpsw_slave *slave, struct cpsw_priv *priv)
1278
1296
soft_reset_slave (slave );
1279
1297
1280
1298
/* setup priority mapping */
1281
- __raw_writel (RX_PRIORITY_MAPPING , & slave -> sliver -> rx_pri_map );
1299
+ writel_relaxed (RX_PRIORITY_MAPPING , & slave -> sliver -> rx_pri_map );
1282
1300
1283
1301
switch (cpsw -> version ) {
1284
1302
case CPSW_VERSION_1 :
@@ -1304,7 +1322,7 @@ static void cpsw_slave_open(struct cpsw_slave *slave, struct cpsw_priv *priv)
1304
1322
}
1305
1323
1306
1324
/* setup max packet size, and mac address */
1307
- __raw_writel (cpsw -> rx_packet_max , & slave -> sliver -> rx_maxlen );
1325
+ writel_relaxed (cpsw -> rx_packet_max , & slave -> sliver -> rx_maxlen );
1308
1326
cpsw_set_slave_mac (slave , priv );
1309
1327
1310
1328
slave -> mac_control = 0 ; /* no link yet */
@@ -1395,9 +1413,9 @@ static void cpsw_init_host_port(struct cpsw_priv *priv)
1395
1413
writel (fifo_mode , & cpsw -> host_port_regs -> tx_in_ctl );
1396
1414
1397
1415
/* setup host port priority mapping */
1398
- __raw_writel (CPDMA_TX_PRIORITY_MAP ,
1399
- & cpsw -> host_port_regs -> cpdma_tx_pri_map );
1400
- __raw_writel (0 , & cpsw -> host_port_regs -> cpdma_rx_chan_map );
1416
+ writel_relaxed (CPDMA_TX_PRIORITY_MAP ,
1417
+ & cpsw -> host_port_regs -> cpdma_tx_pri_map );
1418
+ writel_relaxed (0 , & cpsw -> host_port_regs -> cpdma_rx_chan_map );
1401
1419
1402
1420
cpsw_ale_control_set (cpsw -> ale , HOST_PORT_NUM ,
1403
1421
ALE_PORT_STATE , ALE_PORT_STATE_FORWARD );
@@ -1514,10 +1532,10 @@ static int cpsw_ndo_open(struct net_device *ndev)
1514
1532
/* initialize shared resources for every ndev */
1515
1533
if (!cpsw -> usage_count ) {
1516
1534
/* disable priority elevation */
1517
- __raw_writel (0 , & cpsw -> regs -> ptype );
1535
+ writel_relaxed (0 , & cpsw -> regs -> ptype );
1518
1536
1519
1537
/* enable statistics collection only on all ports */
1520
- __raw_writel (0x7 , & cpsw -> regs -> stat_port_en );
1538
+ writel_relaxed (0x7 , & cpsw -> regs -> stat_port_en );
1521
1539
1522
1540
/* Enable internal fifo flow control */
1523
1541
writel (0x7 , & cpsw -> regs -> flow_control );
@@ -1701,7 +1719,7 @@ static void cpsw_hwtstamp_v2(struct cpsw_priv *priv)
1701
1719
1702
1720
slave_write (slave , mtype , CPSW2_TS_SEQ_MTYPE );
1703
1721
slave_write (slave , ctrl , CPSW2_CONTROL );
1704
- __raw_writel (ETH_P_1588 , & cpsw -> regs -> ts_ltype );
1722
+ writel_relaxed (ETH_P_1588 , & cpsw -> regs -> ts_ltype );
1705
1723
}
1706
1724
1707
1725
static int cpsw_hwtstamp_set (struct net_device * dev , struct ifreq * ifr )
@@ -2298,7 +2316,6 @@ static int cpsw_check_ch_settings(struct cpsw_common *cpsw,
2298
2316
2299
2317
static int cpsw_update_channels_res (struct cpsw_priv * priv , int ch_num , int rx )
2300
2318
{
2301
- int (* poll )(struct napi_struct * , int );
2302
2319
struct cpsw_common * cpsw = priv -> cpsw ;
2303
2320
void (* handler )(void * , int , int );
2304
2321
struct netdev_queue * queue ;
@@ -2309,12 +2326,10 @@ static int cpsw_update_channels_res(struct cpsw_priv *priv, int ch_num, int rx)
2309
2326
ch = & cpsw -> rx_ch_num ;
2310
2327
vec = cpsw -> rxv ;
2311
2328
handler = cpsw_rx_handler ;
2312
- poll = cpsw_rx_poll ;
2313
2329
} else {
2314
2330
ch = & cpsw -> tx_ch_num ;
2315
2331
vec = cpsw -> txv ;
2316
2332
handler = cpsw_tx_handler ;
2317
- poll = cpsw_tx_poll ;
2318
2333
}
2319
2334
2320
2335
while (* ch < ch_num ) {
@@ -3060,7 +3075,7 @@ static int cpsw_probe(struct platform_device *pdev)
3060
3075
ale_params .dev = & pdev -> dev ;
3061
3076
ale_params .ale_ageout = ale_ageout ;
3062
3077
ale_params .ale_entries = data -> ale_entries ;
3063
- ale_params .ale_ports = data -> slaves ;
3078
+ ale_params .ale_ports = CPSW_ALE_PORTS_NUM ;
3064
3079
3065
3080
cpsw -> ale = cpsw_ale_create (& ale_params );
3066
3081
if (!cpsw -> ale ) {
@@ -3072,14 +3087,14 @@ static int cpsw_probe(struct platform_device *pdev)
3072
3087
cpsw -> cpts = cpts_create (cpsw -> dev , cpts_regs , cpsw -> dev -> of_node );
3073
3088
if (IS_ERR (cpsw -> cpts )) {
3074
3089
ret = PTR_ERR (cpsw -> cpts );
3075
- goto clean_ale_ret ;
3090
+ goto clean_dma_ret ;
3076
3091
}
3077
3092
3078
3093
ndev -> irq = platform_get_irq (pdev , 1 );
3079
3094
if (ndev -> irq < 0 ) {
3080
3095
dev_err (priv -> dev , "error getting irq resource\n" );
3081
3096
ret = ndev -> irq ;
3082
- goto clean_ale_ret ;
3097
+ goto clean_dma_ret ;
3083
3098
}
3084
3099
3085
3100
of_id = of_match_device (cpsw_of_mtable , & pdev -> dev );
@@ -3103,7 +3118,7 @@ static int cpsw_probe(struct platform_device *pdev)
3103
3118
if (ret ) {
3104
3119
dev_err (priv -> dev , "error registering net device\n" );
3105
3120
ret = - ENODEV ;
3106
- goto clean_ale_ret ;
3121
+ goto clean_dma_ret ;
3107
3122
}
3108
3123
3109
3124
if (cpsw -> data .dual_emac ) {
@@ -3126,30 +3141,30 @@ static int cpsw_probe(struct platform_device *pdev)
3126
3141
irq = platform_get_irq (pdev , 1 );
3127
3142
if (irq < 0 ) {
3128
3143
ret = irq ;
3129
- goto clean_ale_ret ;
3144
+ goto clean_dma_ret ;
3130
3145
}
3131
3146
3132
3147
cpsw -> irqs_table [0 ] = irq ;
3133
3148
ret = devm_request_irq (& pdev -> dev , irq , cpsw_rx_interrupt ,
3134
3149
0 , dev_name (& pdev -> dev ), cpsw );
3135
3150
if (ret < 0 ) {
3136
3151
dev_err (priv -> dev , "error attaching irq (%d)\n" , ret );
3137
- goto clean_ale_ret ;
3152
+ goto clean_dma_ret ;
3138
3153
}
3139
3154
3140
3155
/* TX IRQ */
3141
3156
irq = platform_get_irq (pdev , 2 );
3142
3157
if (irq < 0 ) {
3143
3158
ret = irq ;
3144
- goto clean_ale_ret ;
3159
+ goto clean_dma_ret ;
3145
3160
}
3146
3161
3147
3162
cpsw -> irqs_table [1 ] = irq ;
3148
3163
ret = devm_request_irq (& pdev -> dev , irq , cpsw_tx_interrupt ,
3149
3164
0 , dev_name (& pdev -> dev ), cpsw );
3150
3165
if (ret < 0 ) {
3151
3166
dev_err (priv -> dev , "error attaching irq (%d)\n" , ret );
3152
- goto clean_ale_ret ;
3167
+ goto clean_dma_ret ;
3153
3168
}
3154
3169
3155
3170
cpsw_notice (priv , probe ,
@@ -3162,8 +3177,6 @@ static int cpsw_probe(struct platform_device *pdev)
3162
3177
3163
3178
clean_unregister_netdev_ret :
3164
3179
unregister_netdev (ndev );
3165
- clean_ale_ret :
3166
- cpsw_ale_destroy (cpsw -> ale );
3167
3180
clean_dma_ret :
3168
3181
cpdma_ctlr_destroy (cpsw -> dma );
3169
3182
clean_dt_ret :
@@ -3193,7 +3206,6 @@ static int cpsw_remove(struct platform_device *pdev)
3193
3206
unregister_netdev (ndev );
3194
3207
3195
3208
cpts_release (cpsw -> cpts );
3196
- cpsw_ale_destroy (cpsw -> ale );
3197
3209
cpdma_ctlr_destroy (cpsw -> dma );
3198
3210
cpsw_remove_dt (pdev );
3199
3211
pm_runtime_put_sync (& pdev -> dev );
0 commit comments