diff options
-rw-r--r-- | drivers/net/ethernet/ti/cpsw.c | 84 | ||||
-rw-r--r-- | drivers/net/ethernet/ti/cpsw.h | 23 | ||||
-rw-r--r-- | drivers/net/ethernet/ti/cpsw_ale.c | 109 | ||||
-rw-r--r-- | drivers/net/ethernet/ti/cpsw_ale.h | 1 | ||||
-rw-r--r-- | drivers/net/ethernet/ti/netcp_ethss.c | 6 |
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 | ||
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 | struct cpsw_slave { | 377 | struct 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 | ||
366 | static inline u32 slave_read(struct cpsw_slave *slave, u32 offset) | 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 | static inline void slave_write(struct cpsw_slave *slave, u32 val, u32 offset) | 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 | struct cpsw_vector { | 398 | struct cpsw_vector { |
@@ -660,8 +682,8 @@ static void cpsw_ndo_set_rx_mode(struct net_device *ndev) | |||
660 | 682 | ||
661 | static void cpsw_intr_enable(struct cpsw_common *cpsw) | 683 | static 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 | ||
670 | static void cpsw_intr_disable(struct cpsw_common *cpsw) | 692 | static 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 | |||
964 | static void cpsw_set_slave_mac(struct cpsw_slave *slave, | 982 | static 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 | ||
1707 | static int cpsw_hwtstamp_set(struct net_device *dev, struct ifreq *ifr) | 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 | static int cpsw_update_channels_res(struct cpsw_priv *priv, int ch_num, int rx) | 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 | 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 | ||
3163 | clean_unregister_netdev_ret: | 3178 | clean_unregister_netdev_ret: |
3164 | unregister_netdev(ndev); | 3179 | unregister_netdev(ndev); |
3165 | clean_ale_ret: | ||
3166 | cpsw_ale_destroy(cpsw->ale); | ||
3167 | clean_dma_ret: | 3180 | clean_dma_ret: |
3168 | cpdma_ctlr_destroy(cpsw->dma); | 3181 | cpdma_ctlr_destroy(cpsw->dma); |
3169 | clean_dt_ret: | 3182 | clean_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 | ||
20 | struct 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 | |||
28 | struct 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 | ||
41 | void cpsw_phy_sel(struct device *dev, phy_interface_t phy_mode, int slave); | 24 | void cpsw_phy_sel(struct device *dev, phy_interface_t phy_mode, int slave); |
42 | int ti_cm_get_macid(struct device *dev, int slave, u8 *mac_addr); | 25 | int 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 | } |
766 | EXPORT_SYMBOL_GPL(cpsw_ale_control_get); | 766 | EXPORT_SYMBOL_GPL(cpsw_ale_control_get); |
@@ -779,9 +779,37 @@ static void cpsw_ale_timer(struct timer_list *t) | |||
779 | 779 | ||
780 | void cpsw_ale_start(struct cpsw_ale *ale) | 780 | void 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 | } | ||
791 | EXPORT_SYMBOL_GPL(cpsw_ale_start); | ||
792 | |||
793 | void 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 | } | ||
798 | EXPORT_SYMBOL_GPL(cpsw_ale_stop); | ||
799 | |||
800 | struct 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 | } | ||
868 | EXPORT_SYMBOL_GPL(cpsw_ale_start); | ||
869 | |||
870 | void cpsw_ale_stop(struct cpsw_ale *ale) | ||
871 | { | ||
872 | del_timer_sync(&ale->timer); | ||
873 | } | ||
874 | EXPORT_SYMBOL_GPL(cpsw_ale_stop); | ||
875 | |||
876 | struct 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 | } |
889 | EXPORT_SYMBOL_GPL(cpsw_ale_create); | 882 | EXPORT_SYMBOL_GPL(cpsw_ale_create); |
890 | 883 | ||
891 | int 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 | } | ||
899 | EXPORT_SYMBOL_GPL(cpsw_ale_destroy); | ||
900 | |||
901 | void cpsw_ale_dump(struct cpsw_ale *ale, u32 *data) | 884 | void 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 | ||
102 | struct cpsw_ale *cpsw_ale_create(struct cpsw_ale_params *params); | 102 | struct cpsw_ale *cpsw_ale_create(struct cpsw_ale_params *params); |
103 | int cpsw_ale_destroy(struct cpsw_ale *ale); | ||
104 | 103 | ||
105 | void cpsw_ale_start(struct cpsw_ale *ale); | 104 | void cpsw_ale_start(struct cpsw_ale *ale); |
106 | void cpsw_ale_stop(struct cpsw_ale *ale); | 105 | void 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 | |||
2054 | static void gbe_set_slave_mac(struct gbe_slave *slave, | 2051 | static 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 | ||