aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2017-12-01 16:36:33 -0500
committerDavid S. Miller <davem@davemloft.net>2017-12-01 16:36:33 -0500
commitc5f66a85899705835f61d687a38f62d5a1ec4eb9 (patch)
tree2555c38a3494c7cd68ba9ad764ba38d4e73f140d
parent80274abafc606f611c4ca8d5cebdcec8933835a9 (diff)
parent97193601bb09e18265823f50dd6418d4be2122ce (diff)
Merge branch 'cpsw-ale-cleanups'
Grygorii Strashko says: ==================== net: ethernet: ti: cpsw/ale clean up and optimization This is set of non critical clean ups and optimizations for TI CPSW and ALE drivers. Rebased on top on net-next. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/ti/cpsw.c84
-rw-r--r--drivers/net/ethernet/ti/cpsw.h23
-rw-r--r--drivers/net/ethernet/ti/cpsw_ale.c109
-rw-r--r--drivers/net/ethernet/ti/cpsw_ale.h1
-rw-r--r--drivers/net/ethernet/ti/netcp_ethss.c6
5 files changed, 98 insertions, 125 deletions
diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c
index a73600dceb8b..a60a378b8b29 100644
--- a/drivers/net/ethernet/ti/cpsw.c
+++ b/drivers/net/ethernet/ti/cpsw.c
@@ -88,6 +88,7 @@ do { \
88#define CPSW_VERSION_4 0x190112 88#define CPSW_VERSION_4 0x190112
89 89
90#define HOST_PORT_NUM 0 90#define HOST_PORT_NUM 0
91#define CPSW_ALE_PORTS_NUM 3
91#define SLIVER_SIZE 0x40 92#define SLIVER_SIZE 0x40
92 93
93#define CPSW1_HOST_PORT_OFFSET 0x028 94#define CPSW1_HOST_PORT_OFFSET 0x028
@@ -352,6 +353,27 @@ struct cpsw_hw_stats {
352 u32 rxdmaoverruns; 353 u32 rxdmaoverruns;
353}; 354};
354 355
356struct 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
364struct 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
355struct cpsw_slave { 377struct cpsw_slave {
356 void __iomem *regs; 378 void __iomem *regs;
357 struct cpsw_sliver_regs __iomem *sliver; 379 struct cpsw_sliver_regs __iomem *sliver;
@@ -365,12 +387,12 @@ struct cpsw_slave {
365 387
366static inline u32 slave_read(struct cpsw_slave *slave, u32 offset) 388static 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
371static inline void slave_write(struct cpsw_slave *slave, u32 val, u32 offset) 393static 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
376struct cpsw_vector { 398struct cpsw_vector {
@@ -660,8 +682,8 @@ static void cpsw_ndo_set_rx_mode(struct net_device *ndev)
660 682
661static void cpsw_intr_enable(struct cpsw_common *cpsw) 683static void cpsw_intr_enable(struct cpsw_common *cpsw)
662{ 684{
663 __raw_writel(0xFF, &cpsw->wr_regs->tx_en); 685 writel_relaxed(0xFF, &cpsw->wr_regs->tx_en);
664 __raw_writel(0xFF, &cpsw->wr_regs->rx_en); 686 writel_relaxed(0xFF, &cpsw->wr_regs->rx_en);
665 687
666 cpdma_ctlr_int_ctrl(cpsw->dma, true); 688 cpdma_ctlr_int_ctrl(cpsw->dma, true);
667 return; 689 return;
@@ -669,8 +691,8 @@ static void cpsw_intr_enable(struct cpsw_common *cpsw)
669 691
670static void cpsw_intr_disable(struct cpsw_common *cpsw) 692static void cpsw_intr_disable(struct cpsw_common *cpsw)
671{ 693{
672 __raw_writel(0, &cpsw->wr_regs->tx_en); 694 writel_relaxed(0, &cpsw->wr_regs->tx_en);
673 __raw_writel(0, &cpsw->wr_regs->rx_en); 695 writel_relaxed(0, &cpsw->wr_regs->rx_en);
674 696
675 cpdma_ctlr_int_ctrl(cpsw->dma, false); 697 cpdma_ctlr_int_ctrl(cpsw->dma, false);
676 return; 698 return;
@@ -949,18 +971,14 @@ static inline void soft_reset(const char *module, void __iomem *reg)
949{ 971{
950 unsigned long timeout = jiffies + HZ; 972 unsigned long timeout = jiffies + HZ;
951 973
952 __raw_writel(1, reg); 974 writel_relaxed(1, reg);
953 do { 975 do {
954 cpu_relax(); 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
964static void cpsw_set_slave_mac(struct cpsw_slave *slave, 982static void cpsw_set_slave_mac(struct cpsw_slave *slave,
965 struct cpsw_priv *priv) 983 struct cpsw_priv *priv)
966{ 984{
@@ -1015,7 +1033,7 @@ static void _cpsw_adjust_link(struct cpsw_slave *slave,
1015 1033
1016 if (mac_control != slave->mac_control) { 1034 if (mac_control != slave->mac_control) {
1017 phy_print_status(phy); 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 slave->mac_control = mac_control; 1039 slave->mac_control = mac_control;
@@ -1278,7 +1296,7 @@ static void cpsw_slave_open(struct cpsw_slave *slave, struct cpsw_priv *priv)
1278 soft_reset_slave(slave); 1296 soft_reset_slave(slave);
1279 1297
1280 /* setup priority mapping */ 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 switch (cpsw->version) { 1301 switch (cpsw->version) {
1284 case CPSW_VERSION_1: 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 /* setup max packet size, and mac address */ 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 cpsw_set_slave_mac(slave, priv); 1326 cpsw_set_slave_mac(slave, priv);
1309 1327
1310 slave->mac_control = 0; /* no link yet */ 1328 slave->mac_control = 0; /* no link yet */
@@ -1395,9 +1413,9 @@ static void cpsw_init_host_port(struct cpsw_priv *priv)
1395 writel(fifo_mode, &cpsw->host_port_regs->tx_in_ctl); 1413 writel(fifo_mode, &cpsw->host_port_regs->tx_in_ctl);
1396 1414
1397 /* setup host port priority mapping */ 1415 /* setup host port priority mapping */
1398 __raw_writel(CPDMA_TX_PRIORITY_MAP, 1416 writel_relaxed(CPDMA_TX_PRIORITY_MAP,
1399 &cpsw->host_port_regs->cpdma_tx_pri_map); 1417 &cpsw->host_port_regs->cpdma_tx_pri_map);
1400 __raw_writel(0, &cpsw->host_port_regs->cpdma_rx_chan_map); 1418 writel_relaxed(0, &cpsw->host_port_regs->cpdma_rx_chan_map);
1401 1419
1402 cpsw_ale_control_set(cpsw->ale, HOST_PORT_NUM, 1420 cpsw_ale_control_set(cpsw->ale, HOST_PORT_NUM,
1403 ALE_PORT_STATE, ALE_PORT_STATE_FORWARD); 1421 ALE_PORT_STATE, ALE_PORT_STATE_FORWARD);
@@ -1514,10 +1532,10 @@ static int cpsw_ndo_open(struct net_device *ndev)
1514 /* initialize shared resources for every ndev */ 1532 /* initialize shared resources for every ndev */
1515 if (!cpsw->usage_count) { 1533 if (!cpsw->usage_count) {
1516 /* disable priority elevation */ 1534 /* disable priority elevation */
1517 __raw_writel(0, &cpsw->regs->ptype); 1535 writel_relaxed(0, &cpsw->regs->ptype);
1518 1536
1519 /* enable statistics collection only on all ports */ 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 /* Enable internal fifo flow control */ 1540 /* Enable internal fifo flow control */
1523 writel(0x7, &cpsw->regs->flow_control); 1541 writel(0x7, &cpsw->regs->flow_control);
@@ -1701,7 +1719,7 @@ static void cpsw_hwtstamp_v2(struct cpsw_priv *priv)
1701 1719
1702 slave_write(slave, mtype, CPSW2_TS_SEQ_MTYPE); 1720 slave_write(slave, mtype, CPSW2_TS_SEQ_MTYPE);
1703 slave_write(slave, ctrl, CPSW2_CONTROL); 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
1707static int cpsw_hwtstamp_set(struct net_device *dev, struct ifreq *ifr) 1725static 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
2299static int cpsw_update_channels_res(struct cpsw_priv *priv, int ch_num, int rx) 2317static int cpsw_update_channels_res(struct cpsw_priv *priv, int ch_num, int rx)
2300{ 2318{
2301 int (*poll)(struct napi_struct *, int);
2302 struct cpsw_common *cpsw = priv->cpsw; 2319 struct cpsw_common *cpsw = priv->cpsw;
2303 void (*handler)(void *, int, int); 2320 void (*handler)(void *, int, int);
2304 struct netdev_queue *queue; 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 ch = &cpsw->rx_ch_num; 2326 ch = &cpsw->rx_ch_num;
2310 vec = cpsw->rxv; 2327 vec = cpsw->rxv;
2311 handler = cpsw_rx_handler; 2328 handler = cpsw_rx_handler;
2312 poll = cpsw_rx_poll;
2313 } else { 2329 } else {
2314 ch = &cpsw->tx_ch_num; 2330 ch = &cpsw->tx_ch_num;
2315 vec = cpsw->txv; 2331 vec = cpsw->txv;
2316 handler = cpsw_tx_handler; 2332 handler = cpsw_tx_handler;
2317 poll = cpsw_tx_poll;
2318 } 2333 }
2319 2334
2320 while (*ch < ch_num) { 2335 while (*ch < ch_num) {
@@ -3060,7 +3075,7 @@ static int cpsw_probe(struct platform_device *pdev)
3060 ale_params.dev = &pdev->dev; 3075 ale_params.dev = &pdev->dev;
3061 ale_params.ale_ageout = ale_ageout; 3076 ale_params.ale_ageout = ale_ageout;
3062 ale_params.ale_entries = data->ale_entries; 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 cpsw->ale = cpsw_ale_create(&ale_params); 3080 cpsw->ale = cpsw_ale_create(&ale_params);
3066 if (!cpsw->ale) { 3081 if (!cpsw->ale) {
@@ -3072,14 +3087,14 @@ static int cpsw_probe(struct platform_device *pdev)
3072 cpsw->cpts = cpts_create(cpsw->dev, cpts_regs, cpsw->dev->of_node); 3087 cpsw->cpts = cpts_create(cpsw->dev, cpts_regs, cpsw->dev->of_node);
3073 if (IS_ERR(cpsw->cpts)) { 3088 if (IS_ERR(cpsw->cpts)) {
3074 ret = PTR_ERR(cpsw->cpts); 3089 ret = PTR_ERR(cpsw->cpts);
3075 goto clean_ale_ret; 3090 goto clean_dma_ret;
3076 } 3091 }
3077 3092
3078 ndev->irq = platform_get_irq(pdev, 1); 3093 ndev->irq = platform_get_irq(pdev, 1);
3079 if (ndev->irq < 0) { 3094 if (ndev->irq < 0) {
3080 dev_err(priv->dev, "error getting irq resource\n"); 3095 dev_err(priv->dev, "error getting irq resource\n");
3081 ret = ndev->irq; 3096 ret = ndev->irq;
3082 goto clean_ale_ret; 3097 goto clean_dma_ret;
3083 } 3098 }
3084 3099
3085 of_id = of_match_device(cpsw_of_mtable, &pdev->dev); 3100 of_id = of_match_device(cpsw_of_mtable, &pdev->dev);
@@ -3103,7 +3118,7 @@ static int cpsw_probe(struct platform_device *pdev)
3103 if (ret) { 3118 if (ret) {
3104 dev_err(priv->dev, "error registering net device\n"); 3119 dev_err(priv->dev, "error registering net device\n");
3105 ret = -ENODEV; 3120 ret = -ENODEV;
3106 goto clean_ale_ret; 3121 goto clean_dma_ret;
3107 } 3122 }
3108 3123
3109 if (cpsw->data.dual_emac) { 3124 if (cpsw->data.dual_emac) {
@@ -3126,7 +3141,7 @@ static int cpsw_probe(struct platform_device *pdev)
3126 irq = platform_get_irq(pdev, 1); 3141 irq = platform_get_irq(pdev, 1);
3127 if (irq < 0) { 3142 if (irq < 0) {
3128 ret = irq; 3143 ret = irq;
3129 goto clean_ale_ret; 3144 goto clean_dma_ret;
3130 } 3145 }
3131 3146
3132 cpsw->irqs_table[0] = irq; 3147 cpsw->irqs_table[0] = irq;
@@ -3134,14 +3149,14 @@ static int cpsw_probe(struct platform_device *pdev)
3134 0, dev_name(&pdev->dev), cpsw); 3149 0, dev_name(&pdev->dev), cpsw);
3135 if (ret < 0) { 3150 if (ret < 0) {
3136 dev_err(priv->dev, "error attaching irq (%d)\n", ret); 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 /* TX IRQ */ 3155 /* TX IRQ */
3141 irq = platform_get_irq(pdev, 2); 3156 irq = platform_get_irq(pdev, 2);
3142 if (irq < 0) { 3157 if (irq < 0) {
3143 ret = irq; 3158 ret = irq;
3144 goto clean_ale_ret; 3159 goto clean_dma_ret;
3145 } 3160 }
3146 3161
3147 cpsw->irqs_table[1] = irq; 3162 cpsw->irqs_table[1] = irq;
@@ -3149,7 +3164,7 @@ static int cpsw_probe(struct platform_device *pdev)
3149 0, dev_name(&pdev->dev), cpsw); 3164 0, dev_name(&pdev->dev), cpsw);
3150 if (ret < 0) { 3165 if (ret < 0) {
3151 dev_err(priv->dev, "error attaching irq (%d)\n", ret); 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 cpsw_notice(priv, probe, 3170 cpsw_notice(priv, probe,
@@ -3162,8 +3177,6 @@ static int cpsw_probe(struct platform_device *pdev)
3162 3177
3163clean_unregister_netdev_ret: 3178clean_unregister_netdev_ret:
3164 unregister_netdev(ndev); 3179 unregister_netdev(ndev);
3165clean_ale_ret:
3166 cpsw_ale_destroy(cpsw->ale);
3167clean_dma_ret: 3180clean_dma_ret:
3168 cpdma_ctlr_destroy(cpsw->dma); 3181 cpdma_ctlr_destroy(cpsw->dma);
3169clean_dt_ret: 3182clean_dt_ret:
@@ -3193,7 +3206,6 @@ static int cpsw_remove(struct platform_device *pdev)
3193 unregister_netdev(ndev); 3206 unregister_netdev(ndev);
3194 3207
3195 cpts_release(cpsw->cpts); 3208 cpts_release(cpsw->cpts);
3196 cpsw_ale_destroy(cpsw->ale);
3197 cpdma_ctlr_destroy(cpsw->dma); 3209 cpdma_ctlr_destroy(cpsw->dma);
3198 cpsw_remove_dt(pdev); 3210 cpsw_remove_dt(pdev);
3199 pm_runtime_put_sync(&pdev->dev); 3211 pm_runtime_put_sync(&pdev->dev);
diff --git a/drivers/net/ethernet/ti/cpsw.h b/drivers/net/ethernet/ti/cpsw.h
index 6c3037aa2cd3..cf111db3dc27 100644
--- a/drivers/net/ethernet/ti/cpsw.h
+++ b/drivers/net/ethernet/ti/cpsw.h
@@ -17,26 +17,9 @@
17#include <linux/if_ether.h> 17#include <linux/if_ether.h>
18#include <linux/phy.h> 18#include <linux/phy.h>
19 19
20struct cpsw_slave_data { 20#define mac_hi(mac) (((mac)[0] << 0) | ((mac)[1] << 8) | \
21 struct device_node *phy_node; 21 ((mac)[2] << 16) | ((mac)[3] << 24))
22 char phy_id[MII_BUS_ID_SIZE]; 22#define mac_lo(mac) (((mac)[4] << 0) | ((mac)[5] << 8))
23 int phy_if;
24 u8 mac_addr[ETH_ALEN];
25 u16 dual_emac_res_vlan; /* Reserved VLAN for DualEMAC */
26};
27
28struct cpsw_platform_data {
29 struct cpsw_slave_data *slave_data;
30 u32 ss_reg_ofs; /* Subsystem control register offset */
31 u32 channels; /* number of cpdma channels (symmetric) */
32 u32 slaves; /* number of slave cpgmac ports */
33 u32 active_slave; /* time stamping, ethtool and SIOCGMIIPHY slave */
34 u32 ale_entries; /* ale table size */
35 u32 bd_ram_size; /*buffer descriptor ram size */
36 u32 mac_control; /* Mac control register */
37 u16 default_vlan; /* Def VLAN for ALE lookup in VLAN aware mode*/
38 bool dual_emac; /* Enable Dual EMAC mode */
39};
40 23
41void cpsw_phy_sel(struct device *dev, phy_interface_t phy_mode, int slave); 24void cpsw_phy_sel(struct device *dev, phy_interface_t phy_mode, int slave);
42int ti_cm_get_macid(struct device *dev, int slave, u8 *mac_addr); 25int ti_cm_get_macid(struct device *dev, int slave, u8 *mac_addr);
diff --git a/drivers/net/ethernet/ti/cpsw_ale.c b/drivers/net/ethernet/ti/cpsw_ale.c
index b432a75fb874..93dc05c194d3 100644
--- a/drivers/net/ethernet/ti/cpsw_ale.c
+++ b/drivers/net/ethernet/ti/cpsw_ale.c
@@ -150,11 +150,11 @@ static int cpsw_ale_read(struct cpsw_ale *ale, int idx, u32 *ale_entry)
150 150
151 WARN_ON(idx > ale->params.ale_entries); 151 WARN_ON(idx > ale->params.ale_entries);
152 152
153 __raw_writel(idx, ale->params.ale_regs + ALE_TABLE_CONTROL); 153 writel_relaxed(idx, ale->params.ale_regs + ALE_TABLE_CONTROL);
154 154
155 for (i = 0; i < ALE_ENTRY_WORDS; i++) 155 for (i = 0; i < ALE_ENTRY_WORDS; i++)
156 ale_entry[i] = __raw_readl(ale->params.ale_regs + 156 ale_entry[i] = readl_relaxed(ale->params.ale_regs +
157 ALE_TABLE + 4 * i); 157 ALE_TABLE + 4 * i);
158 158
159 return idx; 159 return idx;
160} 160}
@@ -166,11 +166,11 @@ static int cpsw_ale_write(struct cpsw_ale *ale, int idx, u32 *ale_entry)
166 WARN_ON(idx > ale->params.ale_entries); 166 WARN_ON(idx > ale->params.ale_entries);
167 167
168 for (i = 0; i < ALE_ENTRY_WORDS; i++) 168 for (i = 0; i < ALE_ENTRY_WORDS; i++)
169 __raw_writel(ale_entry[i], ale->params.ale_regs + 169 writel_relaxed(ale_entry[i], ale->params.ale_regs +
170 ALE_TABLE + 4 * i); 170 ALE_TABLE + 4 * i);
171 171
172 __raw_writel(idx | ALE_TABLE_WRITE, ale->params.ale_regs + 172 writel_relaxed(idx | ALE_TABLE_WRITE, ale->params.ale_regs +
173 ALE_TABLE_CONTROL); 173 ALE_TABLE_CONTROL);
174 174
175 return idx; 175 return idx;
176} 176}
@@ -723,7 +723,7 @@ int cpsw_ale_control_set(struct cpsw_ale *ale, int port, int control,
723 if (info->port_offset == 0 && info->port_shift == 0) 723 if (info->port_offset == 0 && info->port_shift == 0)
724 port = 0; /* global, port is a dont care */ 724 port = 0; /* global, port is a dont care */
725 725
726 if (port < 0 || port > ale->params.ale_ports) 726 if (port < 0 || port >= ale->params.ale_ports)
727 return -EINVAL; 727 return -EINVAL;
728 728
729 mask = BITMASK(info->bits); 729 mask = BITMASK(info->bits);
@@ -733,9 +733,9 @@ int cpsw_ale_control_set(struct cpsw_ale *ale, int port, int control,
733 offset = info->offset + (port * info->port_offset); 733 offset = info->offset + (port * info->port_offset);
734 shift = info->shift + (port * info->port_shift); 734 shift = info->shift + (port * info->port_shift);
735 735
736 tmp = __raw_readl(ale->params.ale_regs + offset); 736 tmp = readl_relaxed(ale->params.ale_regs + offset);
737 tmp = (tmp & ~(mask << shift)) | (value << shift); 737 tmp = (tmp & ~(mask << shift)) | (value << shift);
738 __raw_writel(tmp, ale->params.ale_regs + offset); 738 writel_relaxed(tmp, ale->params.ale_regs + offset);
739 739
740 return 0; 740 return 0;
741} 741}
@@ -754,13 +754,13 @@ int cpsw_ale_control_get(struct cpsw_ale *ale, int port, int control)
754 if (info->port_offset == 0 && info->port_shift == 0) 754 if (info->port_offset == 0 && info->port_shift == 0)
755 port = 0; /* global, port is a dont care */ 755 port = 0; /* global, port is a dont care */
756 756
757 if (port < 0 || port > ale->params.ale_ports) 757 if (port < 0 || port >= ale->params.ale_ports)
758 return -EINVAL; 758 return -EINVAL;
759 759
760 offset = info->offset + (port * info->port_offset); 760 offset = info->offset + (port * info->port_offset);
761 shift = info->shift + (port * info->port_shift); 761 shift = info->shift + (port * info->port_shift);
762 762
763 tmp = __raw_readl(ale->params.ale_regs + offset) >> shift; 763 tmp = readl_relaxed(ale->params.ale_regs + offset) >> shift;
764 return tmp & BITMASK(info->bits); 764 return tmp & BITMASK(info->bits);
765} 765}
766EXPORT_SYMBOL_GPL(cpsw_ale_control_get); 766EXPORT_SYMBOL_GPL(cpsw_ale_control_get);
@@ -779,9 +779,37 @@ static void cpsw_ale_timer(struct timer_list *t)
779 779
780void cpsw_ale_start(struct cpsw_ale *ale) 780void cpsw_ale_start(struct cpsw_ale *ale)
781{ 781{
782 cpsw_ale_control_set(ale, 0, ALE_ENABLE, 1);
783 cpsw_ale_control_set(ale, 0, ALE_CLEAR, 1);
784
785 timer_setup(&ale->timer, cpsw_ale_timer, 0);
786 if (ale->ageout) {
787 ale->timer.expires = jiffies + ale->ageout;
788 add_timer(&ale->timer);
789 }
790}
791EXPORT_SYMBOL_GPL(cpsw_ale_start);
792
793void cpsw_ale_stop(struct cpsw_ale *ale)
794{
795 del_timer_sync(&ale->timer);
796 cpsw_ale_control_set(ale, 0, ALE_ENABLE, 0);
797}
798EXPORT_SYMBOL_GPL(cpsw_ale_stop);
799
800struct cpsw_ale *cpsw_ale_create(struct cpsw_ale_params *params)
801{
802 struct cpsw_ale *ale;
782 u32 rev, ale_entries; 803 u32 rev, ale_entries;
783 804
784 rev = __raw_readl(ale->params.ale_regs + ALE_IDVER); 805 ale = devm_kzalloc(params->dev, sizeof(*ale), GFP_KERNEL);
806 if (!ale)
807 return NULL;
808
809 ale->params = *params;
810 ale->ageout = ale->params.ale_ageout * HZ;
811
812 rev = readl_relaxed(ale->params.ale_regs + ALE_IDVER);
785 if (!ale->params.major_ver_mask) 813 if (!ale->params.major_ver_mask)
786 ale->params.major_ver_mask = 0xff; 814 ale->params.major_ver_mask = 0xff;
787 ale->version = 815 ale->version =
@@ -793,8 +821,8 @@ void cpsw_ale_start(struct cpsw_ale *ale)
793 821
794 if (!ale->params.ale_entries) { 822 if (!ale->params.ale_entries) {
795 ale_entries = 823 ale_entries =
796 __raw_readl(ale->params.ale_regs + ALE_STATUS) & 824 readl_relaxed(ale->params.ale_regs + ALE_STATUS) &
797 ALE_STATUS_SIZE_MASK; 825 ALE_STATUS_SIZE_MASK;
798 /* ALE available on newer NetCP switches has introduced 826 /* ALE available on newer NetCP switches has introduced
799 * a register, ALE_STATUS, to indicate the size of ALE 827 * a register, ALE_STATUS, to indicate the size of ALE
800 * table which shows the size as a multiple of 1024 entries. 828 * table which shows the size as a multiple of 1024 entries.
@@ -816,9 +844,9 @@ void cpsw_ale_start(struct cpsw_ale *ale)
816 "ALE Table size %ld\n", ale->params.ale_entries); 844 "ALE Table size %ld\n", ale->params.ale_entries);
817 845
818 /* set default bits for existing h/w */ 846 /* set default bits for existing h/w */
819 ale->port_mask_bits = 3; 847 ale->port_mask_bits = ale->params.ale_ports;
820 ale->port_num_bits = 2; 848 ale->port_num_bits = order_base_2(ale->params.ale_ports);
821 ale->vlan_field_bits = 3; 849 ale->vlan_field_bits = ale->params.ale_ports;
822 850
823 /* Set defaults override for ALE on NetCP NU switch and for version 851 /* Set defaults override for ALE on NetCP NU switch and for version
824 * 1R3 852 * 1R3
@@ -847,57 +875,12 @@ void cpsw_ale_start(struct cpsw_ale *ale)
847 ale_controls[ALE_PORT_UNTAGGED_EGRESS].shift = 0; 875 ale_controls[ALE_PORT_UNTAGGED_EGRESS].shift = 0;
848 ale_controls[ALE_PORT_UNTAGGED_EGRESS].offset = 876 ale_controls[ALE_PORT_UNTAGGED_EGRESS].offset =
849 ALE_UNKNOWNVLAN_FORCE_UNTAG_EGRESS; 877 ALE_UNKNOWNVLAN_FORCE_UNTAG_EGRESS;
850 ale->port_mask_bits = ale->params.ale_ports;
851 ale->port_num_bits = ale->params.ale_ports - 1;
852 ale->vlan_field_bits = ale->params.ale_ports;
853 } else if (ale->version == ALE_VERSION_1R3) {
854 ale->port_mask_bits = ale->params.ale_ports;
855 ale->port_num_bits = 3;
856 ale->vlan_field_bits = ale->params.ale_ports;
857 } 878 }
858 879
859 cpsw_ale_control_set(ale, 0, ALE_ENABLE, 1);
860 cpsw_ale_control_set(ale, 0, ALE_CLEAR, 1);
861
862 timer_setup(&ale->timer, cpsw_ale_timer, 0);
863 if (ale->ageout) {
864 ale->timer.expires = jiffies + ale->ageout;
865 add_timer(&ale->timer);
866 }
867}
868EXPORT_SYMBOL_GPL(cpsw_ale_start);
869
870void cpsw_ale_stop(struct cpsw_ale *ale)
871{
872 del_timer_sync(&ale->timer);
873}
874EXPORT_SYMBOL_GPL(cpsw_ale_stop);
875
876struct cpsw_ale *cpsw_ale_create(struct cpsw_ale_params *params)
877{
878 struct cpsw_ale *ale;
879
880 ale = kzalloc(sizeof(*ale), GFP_KERNEL);
881 if (!ale)
882 return NULL;
883
884 ale->params = *params;
885 ale->ageout = ale->params.ale_ageout * HZ;
886
887 return ale; 880 return ale;
888} 881}
889EXPORT_SYMBOL_GPL(cpsw_ale_create); 882EXPORT_SYMBOL_GPL(cpsw_ale_create);
890 883
891int cpsw_ale_destroy(struct cpsw_ale *ale)
892{
893 if (!ale)
894 return -EINVAL;
895 cpsw_ale_control_set(ale, 0, ALE_ENABLE, 0);
896 kfree(ale);
897 return 0;
898}
899EXPORT_SYMBOL_GPL(cpsw_ale_destroy);
900
901void cpsw_ale_dump(struct cpsw_ale *ale, u32 *data) 884void cpsw_ale_dump(struct cpsw_ale *ale, u32 *data)
902{ 885{
903 int i; 886 int i;
diff --git a/drivers/net/ethernet/ti/cpsw_ale.h b/drivers/net/ethernet/ti/cpsw_ale.h
index 25d24e8d0904..d4fe9016429b 100644
--- a/drivers/net/ethernet/ti/cpsw_ale.h
+++ b/drivers/net/ethernet/ti/cpsw_ale.h
@@ -100,7 +100,6 @@ enum cpsw_ale_port_state {
100#define ALE_ENTRY_WORDS DIV_ROUND_UP(ALE_ENTRY_BITS, 32) 100#define ALE_ENTRY_WORDS DIV_ROUND_UP(ALE_ENTRY_BITS, 32)
101 101
102struct cpsw_ale *cpsw_ale_create(struct cpsw_ale_params *params); 102struct cpsw_ale *cpsw_ale_create(struct cpsw_ale_params *params);
103int cpsw_ale_destroy(struct cpsw_ale *ale);
104 103
105void cpsw_ale_start(struct cpsw_ale *ale); 104void cpsw_ale_start(struct cpsw_ale *ale);
106void cpsw_ale_stop(struct cpsw_ale *ale); 105void cpsw_ale_stop(struct cpsw_ale *ale);
diff --git a/drivers/net/ethernet/ti/netcp_ethss.c b/drivers/net/ethernet/ti/netcp_ethss.c
index e831c49713ee..56dbc0b9fedc 100644
--- a/drivers/net/ethernet/ti/netcp_ethss.c
+++ b/drivers/net/ethernet/ti/netcp_ethss.c
@@ -27,6 +27,7 @@
27#include <linux/net_tstamp.h> 27#include <linux/net_tstamp.h>
28#include <linux/ethtool.h> 28#include <linux/ethtool.h>
29 29
30#include "cpsw.h"
30#include "cpsw_ale.h" 31#include "cpsw_ale.h"
31#include "netcp.h" 32#include "netcp.h"
32#include "cpts.h" 33#include "cpts.h"
@@ -2047,10 +2048,6 @@ static const struct ethtool_ops keystone_ethtool_ops = {
2047 .get_ts_info = keystone_get_ts_info, 2048 .get_ts_info = keystone_get_ts_info,
2048}; 2049};
2049 2050
2050#define mac_hi(mac) (((mac)[0] << 0) | ((mac)[1] << 8) | \
2051 ((mac)[2] << 16) | ((mac)[3] << 24))
2052#define mac_lo(mac) (((mac)[4] << 0) | ((mac)[5] << 8))
2053
2054static void gbe_set_slave_mac(struct gbe_slave *slave, 2051static void gbe_set_slave_mac(struct gbe_slave *slave,
2055 struct gbe_intf *gbe_intf) 2052 struct gbe_intf *gbe_intf)
2056{ 2053{
@@ -3692,7 +3689,6 @@ static int gbe_remove(struct netcp_device *netcp_device, void *inst_priv)
3692 del_timer_sync(&gbe_dev->timer); 3689 del_timer_sync(&gbe_dev->timer);
3693 cpts_release(gbe_dev->cpts); 3690 cpts_release(gbe_dev->cpts);
3694 cpsw_ale_stop(gbe_dev->ale); 3691 cpsw_ale_stop(gbe_dev->ale);
3695 cpsw_ale_destroy(gbe_dev->ale);
3696 netcp_txpipe_close(&gbe_dev->tx_pipe); 3692 netcp_txpipe_close(&gbe_dev->tx_pipe);
3697 free_secondary_ports(gbe_dev); 3693 free_secondary_ports(gbe_dev);
3698 3694