aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaricheri, Muralidharan <m-karicheri2@ti.com>2015-03-20 16:11:21 -0400
committerDavid S. Miller <davem@davemloft.net>2015-03-20 22:03:09 -0400
commite170f409924235478317bd6f2062d3a0c874ff9a (patch)
tree534e9472e1c38acdd4a919e8cdd5d57c685b5acf
parent89c69d3ce5ff0d1d73c19ff0b53268e3325cb3ef (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.h5
-rw-r--r--drivers/net/ethernet/ti/netcp_core.c23
-rw-r--r--drivers/net/ethernet/ti/netcp_ethss.c14
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