diff options
author | Karicheri, Muralidharan <m-karicheri2@ti.com> | 2015-03-20 16:11:21 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-03-20 22:03:09 -0400 |
commit | e170f409924235478317bd6f2062d3a0c874ff9a (patch) | |
tree | 534e9472e1c38acdd4a919e8cdd5d57c685b5acf | |
parent | 89c69d3ce5ff0d1d73c19ff0b53268e3325cb3ef (diff) |
net: netcp: fix forward port number usage for 10G ethss
10G switch requires forward port number in the taginfo field,
where as it should be in packet_info field for necp 1.4 Ethss. So
fill this value correctly in the knav dma descriptor.
Also rename dma_psflags field in struct netcp_tx_pipe to switch_to_port
as it contain no flag, but the switch port number for forwarding the
packet. Add a flag to hold the new flag, SWITCH_TO_PORT_IN_TAGINFO which
will be set for 10G. This can also used in the future for other flags for
the tx_pipe.
Signed-off-by: Murali Karicheri <m-karicheri2@ti.com>
Signed-off-by: WingMan Kwok <w-kwok2@ti.com>
CC: "David S. Miller" <davem@davemloft.net>
CC: Mugunthan V N <mugunthanvnm@ti.com>
CC: "Lad, Prabhakar" <prabhakar.csengg@gmail.com>
CC: Grygorii Strashko <grygorii.strashko@ti.com>
CC: Christoph Jaeger <cj@linux.com>
CC: Lokesh Vutla <lokeshvutla@ti.com>
CC: Markus Pargmann <mpa@pengutronix.de>
CC: Kumar Gala <galak@codeaurora.org>
CC: Ian Campbell <ijc+devicetree@hellion.org.uk>
CC: Mark Rutland <mark.rutland@arm.com>
CC: Pawel Moll <pawel.moll@arm.com>
CC: Rob Herring <robh+dt@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/ti/netcp.h | 5 | ||||
-rw-r--r-- | drivers/net/ethernet/ti/netcp_core.c | 23 | ||||
-rw-r--r-- | drivers/net/ethernet/ti/netcp_ethss.c | 14 |
3 files changed, 29 insertions, 13 deletions
diff --git a/drivers/net/ethernet/ti/netcp.h b/drivers/net/ethernet/ti/netcp.h index 906e9bc412f5..bbacf5cccec2 100644 --- a/drivers/net/ethernet/ti/netcp.h +++ b/drivers/net/ethernet/ti/netcp.h | |||
@@ -41,7 +41,10 @@ struct netcp_tx_pipe { | |||
41 | struct netcp_device *netcp_device; | 41 | struct netcp_device *netcp_device; |
42 | void *dma_queue; | 42 | void *dma_queue; |
43 | unsigned int dma_queue_id; | 43 | unsigned int dma_queue_id; |
44 | u8 dma_psflags; | 44 | /* To port for packet forwarded to switch. Used only by ethss */ |
45 | u8 switch_to_port; | ||
46 | #define SWITCH_TO_PORT_IN_TAGINFO BIT(0) | ||
47 | u8 flags; | ||
45 | void *dma_channel; | 48 | void *dma_channel; |
46 | const char *dma_chan_name; | 49 | const char *dma_chan_name; |
47 | }; | 50 | }; |
diff --git a/drivers/net/ethernet/ti/netcp_core.c b/drivers/net/ethernet/ti/netcp_core.c index 1c4dd8081a57..43efc3a0cda5 100644 --- a/drivers/net/ethernet/ti/netcp_core.c +++ b/drivers/net/ethernet/ti/netcp_core.c | |||
@@ -1098,9 +1098,9 @@ static int netcp_tx_submit_skb(struct netcp_intf *netcp, | |||
1098 | struct netcp_tx_pipe *tx_pipe = NULL; | 1098 | struct netcp_tx_pipe *tx_pipe = NULL; |
1099 | struct netcp_hook_list *tx_hook; | 1099 | struct netcp_hook_list *tx_hook; |
1100 | struct netcp_packet p_info; | 1100 | struct netcp_packet p_info; |
1101 | u32 packet_info = 0; | ||
1102 | unsigned int dma_sz; | 1101 | unsigned int dma_sz; |
1103 | dma_addr_t dma; | 1102 | dma_addr_t dma; |
1103 | u32 tmp = 0; | ||
1104 | int ret = 0; | 1104 | int ret = 0; |
1105 | 1105 | ||
1106 | p_info.netcp = netcp; | 1106 | p_info.netcp = netcp; |
@@ -1140,20 +1140,27 @@ static int netcp_tx_submit_skb(struct netcp_intf *netcp, | |||
1140 | memmove(p_info.psdata, p_info.psdata + p_info.psdata_len, | 1140 | memmove(p_info.psdata, p_info.psdata + p_info.psdata_len, |
1141 | p_info.psdata_len); | 1141 | p_info.psdata_len); |
1142 | set_words(psdata, p_info.psdata_len, psdata); | 1142 | set_words(psdata, p_info.psdata_len, psdata); |
1143 | packet_info |= | 1143 | tmp |= (p_info.psdata_len & KNAV_DMA_DESC_PSLEN_MASK) << |
1144 | (p_info.psdata_len & KNAV_DMA_DESC_PSLEN_MASK) << | ||
1145 | KNAV_DMA_DESC_PSLEN_SHIFT; | 1144 | KNAV_DMA_DESC_PSLEN_SHIFT; |
1146 | } | 1145 | } |
1147 | 1146 | ||
1148 | packet_info |= KNAV_DMA_DESC_HAS_EPIB | | 1147 | tmp |= KNAV_DMA_DESC_HAS_EPIB | |
1149 | ((netcp->tx_compl_qid & KNAV_DMA_DESC_RETQ_MASK) << | 1148 | ((netcp->tx_compl_qid & KNAV_DMA_DESC_RETQ_MASK) << |
1150 | KNAV_DMA_DESC_RETQ_SHIFT) | | 1149 | KNAV_DMA_DESC_RETQ_SHIFT); |
1151 | ((tx_pipe->dma_psflags & KNAV_DMA_DESC_PSFLAG_MASK) << | ||
1152 | KNAV_DMA_DESC_PSFLAG_SHIFT); | ||
1153 | 1150 | ||
1154 | set_words(&packet_info, 1, &desc->packet_info); | 1151 | if (!(tx_pipe->flags & SWITCH_TO_PORT_IN_TAGINFO)) { |
1152 | tmp |= ((tx_pipe->switch_to_port & KNAV_DMA_DESC_PSFLAG_MASK) << | ||
1153 | KNAV_DMA_DESC_PSFLAG_SHIFT); | ||
1154 | } | ||
1155 | |||
1156 | set_words(&tmp, 1, &desc->packet_info); | ||
1155 | set_words((u32 *)&skb, 1, &desc->pad[0]); | 1157 | set_words((u32 *)&skb, 1, &desc->pad[0]); |
1156 | 1158 | ||
1159 | if (tx_pipe->flags & SWITCH_TO_PORT_IN_TAGINFO) { | ||
1160 | tmp = tx_pipe->switch_to_port; | ||
1161 | set_words((u32 *)&tmp, 1, &desc->tag_info); | ||
1162 | } | ||
1163 | |||
1157 | /* submit packet descriptor */ | 1164 | /* submit packet descriptor */ |
1158 | ret = knav_pool_desc_map(netcp->tx_pool, desc, sizeof(*desc), &dma, | 1165 | ret = knav_pool_desc_map(netcp->tx_pool, desc, sizeof(*desc), &dma, |
1159 | &dma_sz); | 1166 | &dma_sz); |
diff --git a/drivers/net/ethernet/ti/netcp_ethss.c b/drivers/net/ethernet/ti/netcp_ethss.c index 84f5ce525750..2be90a57b595 100644 --- a/drivers/net/ethernet/ti/netcp_ethss.c +++ b/drivers/net/ethernet/ti/netcp_ethss.c | |||
@@ -1472,15 +1472,21 @@ static int gbe_open(void *intf_priv, struct net_device *ndev) | |||
1472 | GBE_MAJOR_VERSION(reg), GBE_MINOR_VERSION(reg), | 1472 | GBE_MAJOR_VERSION(reg), GBE_MINOR_VERSION(reg), |
1473 | GBE_RTL_VERSION(reg), GBE_IDENT(reg)); | 1473 | GBE_RTL_VERSION(reg), GBE_IDENT(reg)); |
1474 | 1474 | ||
1475 | /* For 10G use directed to port */ | ||
1476 | if (gbe_dev->ss_version == XGBE_SS_VERSION_10) | ||
1477 | gbe_intf->tx_pipe.flags = SWITCH_TO_PORT_IN_TAGINFO; | ||
1478 | |||
1475 | if (gbe_dev->enable_ale) | 1479 | if (gbe_dev->enable_ale) |
1476 | gbe_intf->tx_pipe.dma_psflags = 0; | 1480 | gbe_intf->tx_pipe.switch_to_port = 0; |
1477 | else | 1481 | else |
1478 | gbe_intf->tx_pipe.dma_psflags = port_num; | 1482 | gbe_intf->tx_pipe.switch_to_port = port_num; |
1479 | 1483 | ||
1480 | dev_dbg(gbe_dev->dev, "opened TX channel %s: %p with psflags %d\n", | 1484 | dev_dbg(gbe_dev->dev, |
1485 | "opened TX channel %s: %p with to port %d, flags %d\n", | ||
1481 | gbe_intf->tx_pipe.dma_chan_name, | 1486 | gbe_intf->tx_pipe.dma_chan_name, |
1482 | gbe_intf->tx_pipe.dma_channel, | 1487 | gbe_intf->tx_pipe.dma_channel, |
1483 | gbe_intf->tx_pipe.dma_psflags); | 1488 | gbe_intf->tx_pipe.switch_to_port, |
1489 | gbe_intf->tx_pipe.flags); | ||
1484 | 1490 | ||
1485 | gbe_slave_stop(gbe_intf); | 1491 | gbe_slave_stop(gbe_intf); |
1486 | 1492 | ||