|
@@ -88,6 +88,7 @@ do { \
|
|
|
#define CPSW_VERSION_4 0x190112
|
|
|
|
|
|
#define HOST_PORT_NUM 0
|
|
|
+#define CPSW_ALE_PORTS_NUM 3
|
|
|
#define SLIVER_SIZE 0x40
|
|
|
|
|
|
#define CPSW1_HOST_PORT_OFFSET 0x028
|
|
@@ -352,6 +353,27 @@ struct cpsw_hw_stats {
|
|
|
u32 rxdmaoverruns;
|
|
|
};
|
|
|
|
|
|
+struct cpsw_slave_data {
|
|
|
+ struct device_node *phy_node;
|
|
|
+ char phy_id[MII_BUS_ID_SIZE];
|
|
|
+ int phy_if;
|
|
|
+ u8 mac_addr[ETH_ALEN];
|
|
|
+ u16 dual_emac_res_vlan; /* Reserved VLAN for DualEMAC */
|
|
|
+};
|
|
|
+
|
|
|
+struct cpsw_platform_data {
|
|
|
+ struct cpsw_slave_data *slave_data;
|
|
|
+ u32 ss_reg_ofs; /* Subsystem control register offset */
|
|
|
+ u32 channels; /* number of cpdma channels (symmetric) */
|
|
|
+ u32 slaves; /* number of slave cpgmac ports */
|
|
|
+ u32 active_slave; /* time stamping, ethtool and SIOCGMIIPHY slave */
|
|
|
+ u32 ale_entries; /* ale table size */
|
|
|
+ u32 bd_ram_size; /*buffer descriptor ram size */
|
|
|
+ u32 mac_control; /* Mac control register */
|
|
|
+ u16 default_vlan; /* Def VLAN for ALE lookup in VLAN aware mode*/
|
|
|
+ bool dual_emac; /* Enable Dual EMAC mode */
|
|
|
+};
|
|
|
+
|
|
|
struct cpsw_slave {
|
|
|
void __iomem *regs;
|
|
|
struct cpsw_sliver_regs __iomem *sliver;
|
|
@@ -365,12 +387,12 @@ struct cpsw_slave {
|
|
|
|
|
|
static inline u32 slave_read(struct cpsw_slave *slave, u32 offset)
|
|
|
{
|
|
|
- return __raw_readl(slave->regs + offset);
|
|
|
+ return readl_relaxed(slave->regs + offset);
|
|
|
}
|
|
|
|
|
|
static inline void slave_write(struct cpsw_slave *slave, u32 val, u32 offset)
|
|
|
{
|
|
|
- __raw_writel(val, slave->regs + offset);
|
|
|
+ writel_relaxed(val, slave->regs + offset);
|
|
|
}
|
|
|
|
|
|
struct cpsw_vector {
|
|
@@ -660,8 +682,8 @@ static void cpsw_ndo_set_rx_mode(struct net_device *ndev)
|
|
|
|
|
|
static void cpsw_intr_enable(struct cpsw_common *cpsw)
|
|
|
{
|
|
|
- __raw_writel(0xFF, &cpsw->wr_regs->tx_en);
|
|
|
- __raw_writel(0xFF, &cpsw->wr_regs->rx_en);
|
|
|
+ writel_relaxed(0xFF, &cpsw->wr_regs->tx_en);
|
|
|
+ writel_relaxed(0xFF, &cpsw->wr_regs->rx_en);
|
|
|
|
|
|
cpdma_ctlr_int_ctrl(cpsw->dma, true);
|
|
|
return;
|
|
@@ -669,8 +691,8 @@ static void cpsw_intr_enable(struct cpsw_common *cpsw)
|
|
|
|
|
|
static void cpsw_intr_disable(struct cpsw_common *cpsw)
|
|
|
{
|
|
|
- __raw_writel(0, &cpsw->wr_regs->tx_en);
|
|
|
- __raw_writel(0, &cpsw->wr_regs->rx_en);
|
|
|
+ writel_relaxed(0, &cpsw->wr_regs->tx_en);
|
|
|
+ writel_relaxed(0, &cpsw->wr_regs->rx_en);
|
|
|
|
|
|
cpdma_ctlr_int_ctrl(cpsw->dma, false);
|
|
|
return;
|
|
@@ -949,18 +971,14 @@ static inline void soft_reset(const char *module, void __iomem *reg)
|
|
|
{
|
|
|
unsigned long timeout = jiffies + HZ;
|
|
|
|
|
|
- __raw_writel(1, reg);
|
|
|
+ writel_relaxed(1, reg);
|
|
|
do {
|
|
|
cpu_relax();
|
|
|
- } while ((__raw_readl(reg) & 1) && time_after(timeout, jiffies));
|
|
|
+ } while ((readl_relaxed(reg) & 1) && time_after(timeout, jiffies));
|
|
|
|
|
|
- WARN(__raw_readl(reg) & 1, "failed to soft-reset %s\n", module);
|
|
|
+ WARN(readl_relaxed(reg) & 1, "failed to soft-reset %s\n", module);
|
|
|
}
|
|
|
|
|
|
-#define mac_hi(mac) (((mac)[0] << 0) | ((mac)[1] << 8) | \
|
|
|
- ((mac)[2] << 16) | ((mac)[3] << 24))
|
|
|
-#define mac_lo(mac) (((mac)[4] << 0) | ((mac)[5] << 8))
|
|
|
-
|
|
|
static void cpsw_set_slave_mac(struct cpsw_slave *slave,
|
|
|
struct cpsw_priv *priv)
|
|
|
{
|
|
@@ -1015,7 +1033,7 @@ static void _cpsw_adjust_link(struct cpsw_slave *slave,
|
|
|
|
|
|
if (mac_control != slave->mac_control) {
|
|
|
phy_print_status(phy);
|
|
|
- __raw_writel(mac_control, &slave->sliver->mac_control);
|
|
|
+ writel_relaxed(mac_control, &slave->sliver->mac_control);
|
|
|
}
|
|
|
|
|
|
slave->mac_control = mac_control;
|
|
@@ -1278,7 +1296,7 @@ static void cpsw_slave_open(struct cpsw_slave *slave, struct cpsw_priv *priv)
|
|
|
soft_reset_slave(slave);
|
|
|
|
|
|
/* setup priority mapping */
|
|
|
- __raw_writel(RX_PRIORITY_MAPPING, &slave->sliver->rx_pri_map);
|
|
|
+ writel_relaxed(RX_PRIORITY_MAPPING, &slave->sliver->rx_pri_map);
|
|
|
|
|
|
switch (cpsw->version) {
|
|
|
case CPSW_VERSION_1:
|
|
@@ -1304,7 +1322,7 @@ static void cpsw_slave_open(struct cpsw_slave *slave, struct cpsw_priv *priv)
|
|
|
}
|
|
|
|
|
|
/* setup max packet size, and mac address */
|
|
|
- __raw_writel(cpsw->rx_packet_max, &slave->sliver->rx_maxlen);
|
|
|
+ writel_relaxed(cpsw->rx_packet_max, &slave->sliver->rx_maxlen);
|
|
|
cpsw_set_slave_mac(slave, priv);
|
|
|
|
|
|
slave->mac_control = 0; /* no link yet */
|
|
@@ -1395,9 +1413,9 @@ static void cpsw_init_host_port(struct cpsw_priv *priv)
|
|
|
writel(fifo_mode, &cpsw->host_port_regs->tx_in_ctl);
|
|
|
|
|
|
/* setup host port priority mapping */
|
|
|
- __raw_writel(CPDMA_TX_PRIORITY_MAP,
|
|
|
- &cpsw->host_port_regs->cpdma_tx_pri_map);
|
|
|
- __raw_writel(0, &cpsw->host_port_regs->cpdma_rx_chan_map);
|
|
|
+ writel_relaxed(CPDMA_TX_PRIORITY_MAP,
|
|
|
+ &cpsw->host_port_regs->cpdma_tx_pri_map);
|
|
|
+ writel_relaxed(0, &cpsw->host_port_regs->cpdma_rx_chan_map);
|
|
|
|
|
|
cpsw_ale_control_set(cpsw->ale, HOST_PORT_NUM,
|
|
|
ALE_PORT_STATE, ALE_PORT_STATE_FORWARD);
|
|
@@ -1514,10 +1532,10 @@ static int cpsw_ndo_open(struct net_device *ndev)
|
|
|
/* initialize shared resources for every ndev */
|
|
|
if (!cpsw->usage_count) {
|
|
|
/* disable priority elevation */
|
|
|
- __raw_writel(0, &cpsw->regs->ptype);
|
|
|
+ writel_relaxed(0, &cpsw->regs->ptype);
|
|
|
|
|
|
/* enable statistics collection only on all ports */
|
|
|
- __raw_writel(0x7, &cpsw->regs->stat_port_en);
|
|
|
+ writel_relaxed(0x7, &cpsw->regs->stat_port_en);
|
|
|
|
|
|
/* Enable internal fifo flow control */
|
|
|
writel(0x7, &cpsw->regs->flow_control);
|
|
@@ -1701,7 +1719,7 @@ static void cpsw_hwtstamp_v2(struct cpsw_priv *priv)
|
|
|
|
|
|
slave_write(slave, mtype, CPSW2_TS_SEQ_MTYPE);
|
|
|
slave_write(slave, ctrl, CPSW2_CONTROL);
|
|
|
- __raw_writel(ETH_P_1588, &cpsw->regs->ts_ltype);
|
|
|
+ writel_relaxed(ETH_P_1588, &cpsw->regs->ts_ltype);
|
|
|
}
|
|
|
|
|
|
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,
|
|
|
|
|
|
static int cpsw_update_channels_res(struct cpsw_priv *priv, int ch_num, int rx)
|
|
|
{
|
|
|
- int (*poll)(struct napi_struct *, int);
|
|
|
struct cpsw_common *cpsw = priv->cpsw;
|
|
|
void (*handler)(void *, int, int);
|
|
|
struct netdev_queue *queue;
|
|
@@ -2309,12 +2326,10 @@ static int cpsw_update_channels_res(struct cpsw_priv *priv, int ch_num, int rx)
|
|
|
ch = &cpsw->rx_ch_num;
|
|
|
vec = cpsw->rxv;
|
|
|
handler = cpsw_rx_handler;
|
|
|
- poll = cpsw_rx_poll;
|
|
|
} else {
|
|
|
ch = &cpsw->tx_ch_num;
|
|
|
vec = cpsw->txv;
|
|
|
handler = cpsw_tx_handler;
|
|
|
- poll = cpsw_tx_poll;
|
|
|
}
|
|
|
|
|
|
while (*ch < ch_num) {
|
|
@@ -3060,7 +3075,7 @@ static int cpsw_probe(struct platform_device *pdev)
|
|
|
ale_params.dev = &pdev->dev;
|
|
|
ale_params.ale_ageout = ale_ageout;
|
|
|
ale_params.ale_entries = data->ale_entries;
|
|
|
- ale_params.ale_ports = data->slaves;
|
|
|
+ ale_params.ale_ports = CPSW_ALE_PORTS_NUM;
|
|
|
|
|
|
cpsw->ale = cpsw_ale_create(&ale_params);
|
|
|
if (!cpsw->ale) {
|
|
@@ -3072,14 +3087,14 @@ static int cpsw_probe(struct platform_device *pdev)
|
|
|
cpsw->cpts = cpts_create(cpsw->dev, cpts_regs, cpsw->dev->of_node);
|
|
|
if (IS_ERR(cpsw->cpts)) {
|
|
|
ret = PTR_ERR(cpsw->cpts);
|
|
|
- goto clean_ale_ret;
|
|
|
+ goto clean_dma_ret;
|
|
|
}
|
|
|
|
|
|
ndev->irq = platform_get_irq(pdev, 1);
|
|
|
if (ndev->irq < 0) {
|
|
|
dev_err(priv->dev, "error getting irq resource\n");
|
|
|
ret = ndev->irq;
|
|
|
- goto clean_ale_ret;
|
|
|
+ goto clean_dma_ret;
|
|
|
}
|
|
|
|
|
|
of_id = of_match_device(cpsw_of_mtable, &pdev->dev);
|
|
@@ -3103,7 +3118,7 @@ static int cpsw_probe(struct platform_device *pdev)
|
|
|
if (ret) {
|
|
|
dev_err(priv->dev, "error registering net device\n");
|
|
|
ret = -ENODEV;
|
|
|
- goto clean_ale_ret;
|
|
|
+ goto clean_dma_ret;
|
|
|
}
|
|
|
|
|
|
if (cpsw->data.dual_emac) {
|
|
@@ -3126,7 +3141,7 @@ static int cpsw_probe(struct platform_device *pdev)
|
|
|
irq = platform_get_irq(pdev, 1);
|
|
|
if (irq < 0) {
|
|
|
ret = irq;
|
|
|
- goto clean_ale_ret;
|
|
|
+ goto clean_dma_ret;
|
|
|
}
|
|
|
|
|
|
cpsw->irqs_table[0] = irq;
|
|
@@ -3134,14 +3149,14 @@ static int cpsw_probe(struct platform_device *pdev)
|
|
|
0, dev_name(&pdev->dev), cpsw);
|
|
|
if (ret < 0) {
|
|
|
dev_err(priv->dev, "error attaching irq (%d)\n", ret);
|
|
|
- goto clean_ale_ret;
|
|
|
+ goto clean_dma_ret;
|
|
|
}
|
|
|
|
|
|
/* TX IRQ */
|
|
|
irq = platform_get_irq(pdev, 2);
|
|
|
if (irq < 0) {
|
|
|
ret = irq;
|
|
|
- goto clean_ale_ret;
|
|
|
+ goto clean_dma_ret;
|
|
|
}
|
|
|
|
|
|
cpsw->irqs_table[1] = irq;
|
|
@@ -3149,7 +3164,7 @@ static int cpsw_probe(struct platform_device *pdev)
|
|
|
0, dev_name(&pdev->dev), cpsw);
|
|
|
if (ret < 0) {
|
|
|
dev_err(priv->dev, "error attaching irq (%d)\n", ret);
|
|
|
- goto clean_ale_ret;
|
|
|
+ goto clean_dma_ret;
|
|
|
}
|
|
|
|
|
|
cpsw_notice(priv, probe,
|
|
@@ -3162,8 +3177,6 @@ static int cpsw_probe(struct platform_device *pdev)
|
|
|
|
|
|
clean_unregister_netdev_ret:
|
|
|
unregister_netdev(ndev);
|
|
|
-clean_ale_ret:
|
|
|
- cpsw_ale_destroy(cpsw->ale);
|
|
|
clean_dma_ret:
|
|
|
cpdma_ctlr_destroy(cpsw->dma);
|
|
|
clean_dt_ret:
|
|
@@ -3193,7 +3206,6 @@ static int cpsw_remove(struct platform_device *pdev)
|
|
|
unregister_netdev(ndev);
|
|
|
|
|
|
cpts_release(cpsw->cpts);
|
|
|
- cpsw_ale_destroy(cpsw->ale);
|
|
|
cpdma_ctlr_destroy(cpsw->dma);
|
|
|
cpsw_remove_dt(pdev);
|
|
|
pm_runtime_put_sync(&pdev->dev);
|