summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Grzeschik <m.grzeschik@pengutronix.de>2020-05-04 09:50:22 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2020-05-05 12:22:11 +0200
commit25583ed994b5d4f4c0c9ff798552a3d43d51bca4 (patch)
tree1285bc2f12f9d0206a215a2ee972575d36cdb9b6
parentda4d82546a231c6384ffb3f5074dd7aeace32428 (diff)
downloadbarebox-25583ed994b5d4f4c0c9ff798552a3d43d51bca4.tar.gz
barebox-25583ed994b5d4f4c0c9ff798552a3d43d51bca4.tar.xz
net: cpsw: make cpsw_send directional
For dual_emac mode, the driver needs to send on the individual ports. We set the directional bits on each packet so the controller knows where to send its. From TI am335x Reference Manual: 14.3.2.10.2 Dual Mac Mode - Packets from the host (port 0) to ports 1 and 2 should be directed. Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r--drivers/net/cpsw.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/drivers/net/cpsw.c b/drivers/net/cpsw.c
index e5c0316193..b01e7ac7a8 100644
--- a/drivers/net/cpsw.c
+++ b/drivers/net/cpsw.c
@@ -52,6 +52,7 @@
#define CPDMA_DESC_EOP BIT(30)
#define CPDMA_DESC_OWNER BIT(29)
#define CPDMA_DESC_EOQ BIT(28)
+#define CPDMA_DESC_TO_PORT_EN BIT(20)
#define CPDMA_FROM_TO_PORT_SHIFT 16
#define CPDMA_RX_SOURCE_PORT(__status__) \
(((__status__) >> CPDMA_FROM_TO_PORT_SHIFT) & 0x7)
@@ -796,7 +797,7 @@ static void cpdma_desc_free(struct cpsw_priv *priv, struct cpdma_desc *desc)
}
static int cpdma_submit(struct cpsw_priv *priv, struct cpdma_chan *chan,
- void *buffer, int len)
+ void *buffer, int len, int port)
{
struct cpdma_desc *desc, *prev;
u32 mode;
@@ -810,6 +811,10 @@ static int cpdma_submit(struct cpsw_priv *priv, struct cpdma_chan *chan,
mode = CPDMA_DESC_OWNER | CPDMA_DESC_SOP | CPDMA_DESC_EOP;
+ if (port)
+ mode |= CPDMA_DESC_TO_PORT_EN |
+ (port << CPDMA_FROM_TO_PORT_SHIFT);
+
writel(0, &desc->hw_next);
writel((u32)buffer, &desc->hw_buffer);
writel(len, &desc->hw_len);
@@ -971,7 +976,7 @@ static int cpsw_setup(struct device_d *dev)
/* submit rx descs */
for (i = 0; i < PKTBUFSRX - 2; i++) {
ret = cpdma_submit(priv, &priv->rx_chan, NetRxPackets[i],
- PKTSIZE);
+ PKTSIZE, 0);
if (ret < 0) {
dev_err(dev, "error %d submitting rx desc\n", ret);
break;
@@ -1013,7 +1018,8 @@ static int cpsw_send(struct eth_device *edev, void *packet, int length)
dev_dbg(&slave->dev, "%s: %i bytes @ 0x%p\n", __func__, length, packet);
dma_sync_single_for_device((unsigned long)packet, length, DMA_TO_DEVICE);
- ret = cpdma_submit(priv, &priv->tx_chan, packet, length);
+ ret = cpdma_submit(priv, &priv->tx_chan, packet,
+ length, BIT(slave->slave_num));
dma_sync_single_for_cpu((unsigned long)packet, length, DMA_TO_DEVICE);
return ret;
@@ -1032,7 +1038,7 @@ static int cpsw_recv(struct eth_device *edev)
net_receive(edev, buffer, len);
dma_sync_single_for_device((unsigned long)buffer, len,
DMA_FROM_DEVICE);
- cpdma_submit(priv, &priv->rx_chan, buffer, PKTSIZE);
+ cpdma_submit(priv, &priv->rx_chan, buffer, PKTSIZE, 0);
}
return 0;