diff options
author | Richard Cochran <richardcochran@gmail.com> | 2012-10-29 04:45:15 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-11-01 12:21:30 -0400 |
commit | 9750a3ade7b635a18f04371b4fddad0de0b4e6d8 (patch) | |
tree | db501bf296eb2012b2124f2fc6ebb91e8d39a9fb /drivers/net/ethernet/ti | |
parent | e90cfac6c281da3c8b89dba0eb783c23872705b1 (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.c | 106 |
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 | ||
163 | struct 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 | ||
176 | struct cpsw_host_regs { | 232 | struct cpsw_host_regs { |
177 | u32 max_blks; | 233 | u32 max_blks; |
@@ -197,7 +253,7 @@ struct cpsw_sliver_regs { | |||
197 | }; | 253 | }; |
198 | 254 | ||
199 | struct cpsw_slave { | 255 | struct 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 | ||
264 | static inline u32 slave_read(struct cpsw_slave *slave, u32 offset) | ||
265 | { | ||
266 | return __raw_readl(slave->regs + offset); | ||
267 | } | ||
268 | |||
269 | static inline void slave_write(struct cpsw_slave *slave, u32 val, u32 offset) | ||
270 | { | ||
271 | __raw_writel(val, slave->regs + offset); | ||
272 | } | ||
273 | |||
208 | struct cpsw_priv { | 274 | struct 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) | |||
396 | static void cpsw_set_slave_mac(struct cpsw_slave *slave, | 462 | static 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 | ||
403 | static void _cpsw_adjust_link(struct cpsw_slave *slave, | 469 | static 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); |