Skip to content

Commit c5f66a8

Browse files
committed
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 <[email protected]>
2 parents 80274ab + 9719360 commit c5f66a8

File tree

5 files changed

+98
-125
lines changed

5 files changed

+98
-125
lines changed

drivers/net/ethernet/ti/cpsw.c

Lines changed: 48 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ do { \
8888
#define CPSW_VERSION_4 0x190112
8989

9090
#define HOST_PORT_NUM 0
91+
#define CPSW_ALE_PORTS_NUM 3
9192
#define SLIVER_SIZE 0x40
9293

9394
#define CPSW1_HOST_PORT_OFFSET 0x028
@@ -352,6 +353,27 @@ struct cpsw_hw_stats {
352353
u32 rxdmaoverruns;
353354
};
354355

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+
355377
struct cpsw_slave {
356378
void __iomem *regs;
357379
struct cpsw_sliver_regs __iomem *sliver;
@@ -365,12 +387,12 @@ struct cpsw_slave {
365387

366388
static inline u32 slave_read(struct cpsw_slave *slave, u32 offset)
367389
{
368-
return __raw_readl(slave->regs + offset);
390+
return readl_relaxed(slave->regs + offset);
369391
}
370392

371393
static inline void slave_write(struct cpsw_slave *slave, u32 val, u32 offset)
372394
{
373-
__raw_writel(val, slave->regs + offset);
395+
writel_relaxed(val, slave->regs + offset);
374396
}
375397

376398
struct cpsw_vector {
@@ -660,17 +682,17 @@ static void cpsw_ndo_set_rx_mode(struct net_device *ndev)
660682

661683
static void cpsw_intr_enable(struct cpsw_common *cpsw)
662684
{
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);
665687

666688
cpdma_ctlr_int_ctrl(cpsw->dma, true);
667689
return;
668690
}
669691

670692
static void cpsw_intr_disable(struct cpsw_common *cpsw)
671693
{
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);
674696

675697
cpdma_ctlr_int_ctrl(cpsw->dma, false);
676698
return;
@@ -949,18 +971,14 @@ static inline void soft_reset(const char *module, void __iomem *reg)
949971
{
950972
unsigned long timeout = jiffies + HZ;
951973

952-
__raw_writel(1, reg);
974+
writel_relaxed(1, reg);
953975
do {
954976
cpu_relax();
955-
} while ((__raw_readl(reg) & 1) && time_after(timeout, jiffies));
977+
} while ((readl_relaxed(reg) & 1) && time_after(timeout, jiffies));
956978

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);
958980
}
959981

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-
964982
static void cpsw_set_slave_mac(struct cpsw_slave *slave,
965983
struct cpsw_priv *priv)
966984
{
@@ -1015,7 +1033,7 @@ static void _cpsw_adjust_link(struct cpsw_slave *slave,
10151033

10161034
if (mac_control != slave->mac_control) {
10171035
phy_print_status(phy);
1018-
__raw_writel(mac_control, &slave->sliver->mac_control);
1036+
writel_relaxed(mac_control, &slave->sliver->mac_control);
10191037
}
10201038

10211039
slave->mac_control = mac_control;
@@ -1278,7 +1296,7 @@ static void cpsw_slave_open(struct cpsw_slave *slave, struct cpsw_priv *priv)
12781296
soft_reset_slave(slave);
12791297

12801298
/* 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);
12821300

12831301
switch (cpsw->version) {
12841302
case CPSW_VERSION_1:
@@ -1304,7 +1322,7 @@ static void cpsw_slave_open(struct cpsw_slave *slave, struct cpsw_priv *priv)
13041322
}
13051323

13061324
/* 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);
13081326
cpsw_set_slave_mac(slave, priv);
13091327

13101328
slave->mac_control = 0; /* no link yet */
@@ -1395,9 +1413,9 @@ static void cpsw_init_host_port(struct cpsw_priv *priv)
13951413
writel(fifo_mode, &cpsw->host_port_regs->tx_in_ctl);
13961414

13971415
/* 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);
14011419

14021420
cpsw_ale_control_set(cpsw->ale, HOST_PORT_NUM,
14031421
ALE_PORT_STATE, ALE_PORT_STATE_FORWARD);
@@ -1514,10 +1532,10 @@ static int cpsw_ndo_open(struct net_device *ndev)
15141532
/* initialize shared resources for every ndev */
15151533
if (!cpsw->usage_count) {
15161534
/* disable priority elevation */
1517-
__raw_writel(0, &cpsw->regs->ptype);
1535+
writel_relaxed(0, &cpsw->regs->ptype);
15181536

15191537
/* 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);
15211539

15221540
/* Enable internal fifo flow control */
15231541
writel(0x7, &cpsw->regs->flow_control);
@@ -1701,7 +1719,7 @@ static void cpsw_hwtstamp_v2(struct cpsw_priv *priv)
17011719

17021720
slave_write(slave, mtype, CPSW2_TS_SEQ_MTYPE);
17031721
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);
17051723
}
17061724

17071725
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,
22982316

22992317
static int cpsw_update_channels_res(struct cpsw_priv *priv, int ch_num, int rx)
23002318
{
2301-
int (*poll)(struct napi_struct *, int);
23022319
struct cpsw_common *cpsw = priv->cpsw;
23032320
void (*handler)(void *, int, int);
23042321
struct netdev_queue *queue;
@@ -2309,12 +2326,10 @@ static int cpsw_update_channels_res(struct cpsw_priv *priv, int ch_num, int rx)
23092326
ch = &cpsw->rx_ch_num;
23102327
vec = cpsw->rxv;
23112328
handler = cpsw_rx_handler;
2312-
poll = cpsw_rx_poll;
23132329
} else {
23142330
ch = &cpsw->tx_ch_num;
23152331
vec = cpsw->txv;
23162332
handler = cpsw_tx_handler;
2317-
poll = cpsw_tx_poll;
23182333
}
23192334

23202335
while (*ch < ch_num) {
@@ -3060,7 +3075,7 @@ static int cpsw_probe(struct platform_device *pdev)
30603075
ale_params.dev = &pdev->dev;
30613076
ale_params.ale_ageout = ale_ageout;
30623077
ale_params.ale_entries = data->ale_entries;
3063-
ale_params.ale_ports = data->slaves;
3078+
ale_params.ale_ports = CPSW_ALE_PORTS_NUM;
30643079

30653080
cpsw->ale = cpsw_ale_create(&ale_params);
30663081
if (!cpsw->ale) {
@@ -3072,14 +3087,14 @@ static int cpsw_probe(struct platform_device *pdev)
30723087
cpsw->cpts = cpts_create(cpsw->dev, cpts_regs, cpsw->dev->of_node);
30733088
if (IS_ERR(cpsw->cpts)) {
30743089
ret = PTR_ERR(cpsw->cpts);
3075-
goto clean_ale_ret;
3090+
goto clean_dma_ret;
30763091
}
30773092

30783093
ndev->irq = platform_get_irq(pdev, 1);
30793094
if (ndev->irq < 0) {
30803095
dev_err(priv->dev, "error getting irq resource\n");
30813096
ret = ndev->irq;
3082-
goto clean_ale_ret;
3097+
goto clean_dma_ret;
30833098
}
30843099

30853100
of_id = of_match_device(cpsw_of_mtable, &pdev->dev);
@@ -3103,7 +3118,7 @@ static int cpsw_probe(struct platform_device *pdev)
31033118
if (ret) {
31043119
dev_err(priv->dev, "error registering net device\n");
31053120
ret = -ENODEV;
3106-
goto clean_ale_ret;
3121+
goto clean_dma_ret;
31073122
}
31083123

31093124
if (cpsw->data.dual_emac) {
@@ -3126,30 +3141,30 @@ static int cpsw_probe(struct platform_device *pdev)
31263141
irq = platform_get_irq(pdev, 1);
31273142
if (irq < 0) {
31283143
ret = irq;
3129-
goto clean_ale_ret;
3144+
goto clean_dma_ret;
31303145
}
31313146

31323147
cpsw->irqs_table[0] = irq;
31333148
ret = devm_request_irq(&pdev->dev, irq, cpsw_rx_interrupt,
31343149
0, dev_name(&pdev->dev), cpsw);
31353150
if (ret < 0) {
31363151
dev_err(priv->dev, "error attaching irq (%d)\n", ret);
3137-
goto clean_ale_ret;
3152+
goto clean_dma_ret;
31383153
}
31393154

31403155
/* TX IRQ */
31413156
irq = platform_get_irq(pdev, 2);
31423157
if (irq < 0) {
31433158
ret = irq;
3144-
goto clean_ale_ret;
3159+
goto clean_dma_ret;
31453160
}
31463161

31473162
cpsw->irqs_table[1] = irq;
31483163
ret = devm_request_irq(&pdev->dev, irq, cpsw_tx_interrupt,
31493164
0, dev_name(&pdev->dev), cpsw);
31503165
if (ret < 0) {
31513166
dev_err(priv->dev, "error attaching irq (%d)\n", ret);
3152-
goto clean_ale_ret;
3167+
goto clean_dma_ret;
31533168
}
31543169

31553170
cpsw_notice(priv, probe,
@@ -3162,8 +3177,6 @@ static int cpsw_probe(struct platform_device *pdev)
31623177

31633178
clean_unregister_netdev_ret:
31643179
unregister_netdev(ndev);
3165-
clean_ale_ret:
3166-
cpsw_ale_destroy(cpsw->ale);
31673180
clean_dma_ret:
31683181
cpdma_ctlr_destroy(cpsw->dma);
31693182
clean_dt_ret:
@@ -3193,7 +3206,6 @@ static int cpsw_remove(struct platform_device *pdev)
31933206
unregister_netdev(ndev);
31943207

31953208
cpts_release(cpsw->cpts);
3196-
cpsw_ale_destroy(cpsw->ale);
31973209
cpdma_ctlr_destroy(cpsw->dma);
31983210
cpsw_remove_dt(pdev);
31993211
pm_runtime_put_sync(&pdev->dev);

drivers/net/ethernet/ti/cpsw.h

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,26 +17,9 @@
1717
#include <linux/if_ether.h>
1818
#include <linux/phy.h>
1919

20-
struct cpsw_slave_data {
21-
struct device_node *phy_node;
22-
char phy_id[MII_BUS_ID_SIZE];
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-
};
20+
#define mac_hi(mac) (((mac)[0] << 0) | ((mac)[1] << 8) | \
21+
((mac)[2] << 16) | ((mac)[3] << 24))
22+
#define mac_lo(mac) (((mac)[4] << 0) | ((mac)[5] << 8))
4023

4124
void cpsw_phy_sel(struct device *dev, phy_interface_t phy_mode, int slave);
4225
int ti_cm_get_macid(struct device *dev, int slave, u8 *mac_addr);

0 commit comments

Comments
 (0)