aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/ti
diff options
context:
space:
mode:
authorRichard Cochran <richardcochran@gmail.com>2012-10-29 04:45:15 -0400
committerDavid S. Miller <davem@davemloft.net>2012-11-01 12:21:30 -0400
commit9750a3ade7b635a18f04371b4fddad0de0b4e6d8 (patch)
treedb501bf296eb2012b2124f2fc6ebb91e8d39a9fb /drivers/net/ethernet/ti
parente90cfac6c281da3c8b89dba0eb783c23872705b1 (diff)
cpsw: support both silicon versions
This patch fixes the cpsw driver to operate correctly with both the dm814x and the am335x versions of the switch hardware. Signed-off-by: Richard Cochran <richardcochran@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/ti')
-rw-r--r--drivers/net/ethernet/ti/cpsw.c106
1 files changed, 90 insertions, 16 deletions
diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c
index 5c427cf1ef87..588f5c340490 100644
--- a/drivers/net/ethernet/ti/cpsw.c
+++ b/drivers/net/ethernet/ti/cpsw.c
@@ -160,18 +160,74 @@ struct cpsw_ss_regs {
160 u32 dlr_ltype; 160 u32 dlr_ltype;
161}; 161};
162 162
163struct cpsw_slave_regs { 163/* CPSW_PORT_V1 */
164 u32 max_blks; 164#define CPSW1_MAX_BLKS 0x00 /* Maximum FIFO Blocks */
165 u32 blk_cnt; 165#define CPSW1_BLK_CNT 0x04 /* FIFO Block Usage Count (Read Only) */
166 u32 flow_thresh; 166#define CPSW1_TX_IN_CTL 0x08 /* Transmit FIFO Control */
167 u32 port_vlan; 167#define CPSW1_PORT_VLAN 0x0c /* VLAN Register */
168 u32 tx_pri_map; 168#define CPSW1_TX_PRI_MAP 0x10 /* Tx Header Priority to Switch Pri Mapping */
169 u32 ts_ctl; 169#define CPSW1_TS_CTL 0x14 /* Time Sync Control */
170 u32 ts_seq_ltype; 170#define CPSW1_TS_SEQ_LTYPE 0x18 /* Time Sync Sequence ID Offset and Msg Type */
171 u32 ts_vlan; 171#define CPSW1_TS_VLAN 0x1c /* Time Sync VLAN1 and VLAN2 */
172 u32 sa_lo; 172
173 u32 sa_hi; 173/* CPSW_PORT_V2 */
174}; 174#define CPSW2_CONTROL 0x00 /* Control Register */
175#define CPSW2_MAX_BLKS 0x08 /* Maximum FIFO Blocks */
176#define CPSW2_BLK_CNT 0x0c /* FIFO Block Usage Count (Read Only) */
177#define CPSW2_TX_IN_CTL 0x10 /* Transmit FIFO Control */
178#define CPSW2_PORT_VLAN 0x14 /* VLAN Register */
179#define CPSW2_TX_PRI_MAP 0x18 /* Tx Header Priority to Switch Pri Mapping */
180#define CPSW2_TS_SEQ_MTYPE 0x1c /* Time Sync Sequence ID Offset and Msg Type */
181
182/* CPSW_PORT_V1 and V2 */
183#define SA_LO 0x20 /* CPGMAC_SL Source Address Low */
184#define SA_HI 0x24 /* CPGMAC_SL Source Address High */
185#define SEND_PERCENT 0x28 /* Transmit Queue Send Percentages */
186
187/* CPSW_PORT_V2 only */
188#define RX_DSCP_PRI_MAP0 0x30 /* Rx DSCP Priority to Rx Packet Mapping */
189#define RX_DSCP_PRI_MAP1 0x34 /* Rx DSCP Priority to Rx Packet Mapping */
190#define RX_DSCP_PRI_MAP2 0x38 /* Rx DSCP Priority to Rx Packet Mapping */
191#define RX_DSCP_PRI_MAP3 0x3c /* Rx DSCP Priority to Rx Packet Mapping */
192#define RX_DSCP_PRI_MAP4 0x40 /* Rx DSCP Priority to Rx Packet Mapping */
193#define RX_DSCP_PRI_MAP5 0x44 /* Rx DSCP Priority to Rx Packet Mapping */
194#define RX_DSCP_PRI_MAP6 0x48 /* Rx DSCP Priority to Rx Packet Mapping */
195#define RX_DSCP_PRI_MAP7 0x4c /* Rx DSCP Priority to Rx Packet Mapping */
196
197/* Bit definitions for the CPSW2_CONTROL register */
198#define PASS_PRI_TAGGED (1<<24) /* Pass Priority Tagged */
199#define VLAN_LTYPE2_EN (1<<21) /* VLAN LTYPE 2 enable */
200#define VLAN_LTYPE1_EN (1<<20) /* VLAN LTYPE 1 enable */
201#define DSCP_PRI_EN (1<<16) /* DSCP Priority Enable */
202#define TS_320 (1<<14) /* Time Sync Dest Port 320 enable */
203#define TS_319 (1<<13) /* Time Sync Dest Port 319 enable */
204#define TS_132 (1<<12) /* Time Sync Dest IP Addr 132 enable */
205#define TS_131 (1<<11) /* Time Sync Dest IP Addr 131 enable */
206#define TS_130 (1<<10) /* Time Sync Dest IP Addr 130 enable */
207#define TS_129 (1<<9) /* Time Sync Dest IP Addr 129 enable */
208#define TS_BIT8 (1<<8) /* ts_ttl_nonzero? */
209#define TS_ANNEX_D_EN (1<<4) /* Time Sync Annex D enable */
210#define TS_LTYPE2_EN (1<<3) /* Time Sync LTYPE 2 enable */
211#define TS_LTYPE1_EN (1<<2) /* Time Sync LTYPE 1 enable */
212#define TS_TX_EN (1<<1) /* Time Sync Transmit Enable */
213#define TS_RX_EN (1<<0) /* Time Sync Receive Enable */
214
215#define CTRL_TS_BITS \
216 (TS_320 | TS_319 | TS_132 | TS_131 | TS_130 | TS_129 | TS_BIT8 | \
217 TS_ANNEX_D_EN | TS_LTYPE1_EN)
218
219#define CTRL_ALL_TS_MASK (CTRL_TS_BITS | TS_TX_EN | TS_RX_EN)
220#define CTRL_TX_TS_BITS (CTRL_TS_BITS | TS_TX_EN)
221#define CTRL_RX_TS_BITS (CTRL_TS_BITS | TS_RX_EN)
222
223/* Bit definitions for the CPSW2_TS_SEQ_MTYPE register */
224#define TS_SEQ_ID_OFFSET_SHIFT (16) /* Time Sync Sequence ID Offset */
225#define TS_SEQ_ID_OFFSET_MASK (0x3f)
226#define TS_MSG_TYPE_EN_SHIFT (0) /* Time Sync Message Type Enable */
227#define TS_MSG_TYPE_EN_MASK (0xffff)
228
229/* The PTP event messages - Sync, Delay_Req, Pdelay_Req, and Pdelay_Resp. */
230#define EVENT_MSG_BITS ((1<<0) | (1<<1) | (1<<2) | (1<<3))
175 231
176struct cpsw_host_regs { 232struct cpsw_host_regs {
177 u32 max_blks; 233 u32 max_blks;
@@ -197,7 +253,7 @@ struct cpsw_sliver_regs {
197}; 253};
198 254
199struct cpsw_slave { 255struct cpsw_slave {
200 struct cpsw_slave_regs __iomem *regs; 256 void __iomem *regs;
201 struct cpsw_sliver_regs __iomem *sliver; 257 struct cpsw_sliver_regs __iomem *sliver;
202 int slave_num; 258 int slave_num;
203 u32 mac_control; 259 u32 mac_control;
@@ -205,6 +261,16 @@ struct cpsw_slave {
205 struct phy_device *phy; 261 struct phy_device *phy;
206}; 262};
207 263
264static inline u32 slave_read(struct cpsw_slave *slave, u32 offset)
265{
266 return __raw_readl(slave->regs + offset);
267}
268
269static inline void slave_write(struct cpsw_slave *slave, u32 val, u32 offset)
270{
271 __raw_writel(val, slave->regs + offset);
272}
273
208struct cpsw_priv { 274struct cpsw_priv {
209 spinlock_t lock; 275 spinlock_t lock;
210 struct platform_device *pdev; 276 struct platform_device *pdev;
@@ -396,8 +462,8 @@ static inline void soft_reset(const char *module, void __iomem *reg)
396static void cpsw_set_slave_mac(struct cpsw_slave *slave, 462static void cpsw_set_slave_mac(struct cpsw_slave *slave,
397 struct cpsw_priv *priv) 463 struct cpsw_priv *priv)
398{ 464{
399 __raw_writel(mac_hi(priv->mac_addr), &slave->regs->sa_hi); 465 slave_write(slave, mac_hi(priv->mac_addr), SA_HI);
400 __raw_writel(mac_lo(priv->mac_addr), &slave->regs->sa_lo); 466 slave_write(slave, mac_lo(priv->mac_addr), SA_LO);
401} 467}
402 468
403static void _cpsw_adjust_link(struct cpsw_slave *slave, 469static void _cpsw_adjust_link(struct cpsw_slave *slave,
@@ -483,7 +549,15 @@ static void cpsw_slave_open(struct cpsw_slave *slave, struct cpsw_priv *priv)
483 549
484 /* setup priority mapping */ 550 /* setup priority mapping */
485 __raw_writel(RX_PRIORITY_MAPPING, &slave->sliver->rx_pri_map); 551 __raw_writel(RX_PRIORITY_MAPPING, &slave->sliver->rx_pri_map);
486 __raw_writel(TX_PRIORITY_MAPPING, &slave->regs->tx_pri_map); 552
553 switch (priv->version) {
554 case CPSW_VERSION_1:
555 slave_write(slave, TX_PRIORITY_MAPPING, CPSW1_TX_PRI_MAP);
556 break;
557 case CPSW_VERSION_2:
558 slave_write(slave, TX_PRIORITY_MAPPING, CPSW2_TX_PRI_MAP);
559 break;
560 }
487 561
488 /* setup max packet size, and mac address */ 562 /* setup max packet size, and mac address */
489 __raw_writel(priv->rx_packet_max, &slave->sliver->rx_maxlen); 563 __raw_writel(priv->rx_packet_max, &slave->sliver->rx_maxlen);