summaryrefslogtreecommitdiff
path: root/target/linux/ramips/files/drivers/net/ramips_esw.c
diff options
context:
space:
mode:
authorGabor Juhos <juhosg@openwrt.org>2012-02-21 09:26:43 +0000
committerGabor Juhos <juhosg@openwrt.org>2012-02-21 09:26:43 +0000
commit3ba0f4e1ca40c276117e1cacb27514d171f57812 (patch)
tree543ef67ed29ad86f38d987bb1ee73cb9426bcac0 /target/linux/ramips/files/drivers/net/ramips_esw.c
parenta6d904b1d61b0985a3d4e2c323f8565382714330 (diff)
downloadmtk-20170518-3ba0f4e1ca40c276117e1cacb27514d171f57812.zip
mtk-20170518-3ba0f4e1ca40c276117e1cacb27514d171f57812.tar.gz
mtk-20170518-3ba0f4e1ca40c276117e1cacb27514d171f57812.tar.bz2
ramips: move the ethernet driver into a separate directory
Also clean up the Kconfig symbols. SVN-Revision: 30670
Diffstat (limited to 'target/linux/ramips/files/drivers/net/ramips_esw.c')
-rw-r--r--target/linux/ramips/files/drivers/net/ramips_esw.c401
1 files changed, 0 insertions, 401 deletions
diff --git a/target/linux/ramips/files/drivers/net/ramips_esw.c b/target/linux/ramips/files/drivers/net/ramips_esw.c
deleted file mode 100644
index a2fa579..0000000
--- a/target/linux/ramips/files/drivers/net/ramips_esw.c
+++ /dev/null
@@ -1,401 +0,0 @@
-#include <linux/ioport.h>
-
-#include <rt305x_regs.h>
-#include <rt305x_esw_platform.h>
-
-#define RT305X_ESW_REG_FCT0 0x08
-#define RT305X_ESW_REG_PFC1 0x14
-#define RT305X_ESW_REG_PVIDC(_n) (0x40 + 4 * (_n))
-#define RT305X_ESW_REG_VLANI(_n) (0x50 + 4 * (_n))
-#define RT305X_ESW_REG_VMSC(_n) (0x70 + 4 * (_n))
-#define RT305X_ESW_REG_FPA 0x84
-#define RT305X_ESW_REG_SOCPC 0x8c
-#define RT305X_ESW_REG_POC1 0x90
-#define RT305X_ESW_REG_POC2 0x94
-#define RT305X_ESW_REG_POC3 0x98
-#define RT305X_ESW_REG_SGC 0x9c
-#define RT305X_ESW_REG_PCR0 0xc0
-#define RT305X_ESW_REG_PCR1 0xc4
-#define RT305X_ESW_REG_FPA2 0xc8
-#define RT305X_ESW_REG_FCT2 0xcc
-#define RT305X_ESW_REG_SGC2 0xe4
-#define RT305X_ESW_REG_P0LED 0xa4
-#define RT305X_ESW_REG_P1LED 0xa8
-#define RT305X_ESW_REG_P2LED 0xac
-#define RT305X_ESW_REG_P3LED 0xb0
-#define RT305X_ESW_REG_P4LED 0xb4
-
-#define RT305X_ESW_PCR0_WT_NWAY_DATA_S 16
-#define RT305X_ESW_PCR0_WT_PHY_CMD BIT(13)
-#define RT305X_ESW_PCR0_CPU_PHY_REG_S 8
-
-#define RT305X_ESW_PCR1_WT_DONE BIT(0)
-
-#define RT305X_ESW_PHY_TIMEOUT (5 * HZ)
-
-#define RT305X_ESW_PVIDC_PVID_M 0xfff
-#define RT305X_ESW_PVIDC_PVID_S 12
-
-#define RT305X_ESW_VLANI_VID_M 0xfff
-#define RT305X_ESW_VLANI_VID_S 12
-
-#define RT305X_ESW_VMSC_MSC_M 0xff
-#define RT305X_ESW_VMSC_MSC_S 8
-
-#define RT305X_ESW_SOCPC_DISUN2CPU_S 0
-#define RT305X_ESW_SOCPC_DISMC2CPU_S 8
-#define RT305X_ESW_SOCPC_DISBC2CPU_S 16
-#define RT305X_ESW_SOCPC_CRC_PADDING BIT(25)
-
-#define RT305X_ESW_POC1_EN_BP_S 0
-#define RT305X_ESW_POC1_EN_FC_S 8
-#define RT305X_ESW_POC1_DIS_RMC2CPU_S 16
-#define RT305X_ESW_POC1_DIS_PORT_S 23
-
-#define RT305X_ESW_POC3_UNTAG_EN_S 0
-#define RT305X_ESW_POC3_ENAGING_S 8
-#define RT305X_ESW_POC3_DIS_UC_PAUSE_S 16
-
-#define RT305X_ESW_PORT0 0
-#define RT305X_ESW_PORT1 1
-#define RT305X_ESW_PORT2 2
-#define RT305X_ESW_PORT3 3
-#define RT305X_ESW_PORT4 4
-#define RT305X_ESW_PORT5 5
-#define RT305X_ESW_PORT6 6
-
-#define RT305X_ESW_PORTS_INTERNAL \
- (BIT(RT305X_ESW_PORT0) | BIT(RT305X_ESW_PORT1) | \
- BIT(RT305X_ESW_PORT2) | BIT(RT305X_ESW_PORT3) | \
- BIT(RT305X_ESW_PORT4))
-
-#define RT305X_ESW_PORTS_NOCPU \
- (RT305X_ESW_PORTS_INTERNAL | BIT(RT305X_ESW_PORT5))
-
-#define RT305X_ESW_PORTS_CPU BIT(RT305X_ESW_PORT6)
-
-#define RT305X_ESW_PORTS_ALL \
- (RT305X_ESW_PORTS_NOCPU | RT305X_ESW_PORTS_CPU)
-
-#define RT305X_ESW_NUM_VLANS 16
-#define RT305X_ESW_NUM_PORTS 7
-
-struct rt305x_esw {
- void __iomem *base;
- struct rt305x_esw_platform_data *pdata;
- spinlock_t reg_rw_lock;
-};
-
-static inline void
-rt305x_esw_wr(struct rt305x_esw *esw, u32 val, unsigned reg)
-{
- __raw_writel(val, esw->base + reg);
-}
-
-static inline u32
-rt305x_esw_rr(struct rt305x_esw *esw, unsigned reg)
-{
- return __raw_readl(esw->base + reg);
-}
-
-static inline void
-rt305x_esw_rmw_raw(struct rt305x_esw *esw, unsigned reg, unsigned long mask,
- unsigned long val)
-{
- unsigned long t;
-
- t = __raw_readl(esw->base + reg) & ~mask;
- __raw_writel(t | val, esw->base + reg);
-}
-
-static void
-rt305x_esw_rmw(struct rt305x_esw *esw, unsigned reg, unsigned long mask,
- unsigned long val)
-{
- unsigned long flags;
-
- spin_lock_irqsave(&esw->reg_rw_lock, flags);
- rt305x_esw_rmw_raw(esw, reg, mask, val);
- spin_unlock_irqrestore(&esw->reg_rw_lock, flags);
-}
-
-static u32
-rt305x_mii_write(struct rt305x_esw *esw, u32 phy_addr, u32 phy_register,
- u32 write_data)
-{
- unsigned long t_start = jiffies;
- int ret = 0;
-
- while (1) {
- if (!(rt305x_esw_rr(esw, RT305X_ESW_REG_PCR1) &
- RT305X_ESW_PCR1_WT_DONE))
- break;
- if (time_after(jiffies, t_start + RT305X_ESW_PHY_TIMEOUT)) {
- ret = 1;
- goto out;
- }
- }
-
- write_data &= 0xffff;
- rt305x_esw_wr(esw,
- (write_data << RT305X_ESW_PCR0_WT_NWAY_DATA_S) |
- (phy_register << RT305X_ESW_PCR0_CPU_PHY_REG_S) |
- (phy_addr) | RT305X_ESW_PCR0_WT_PHY_CMD,
- RT305X_ESW_REG_PCR0);
-
- t_start = jiffies;
- while (1) {
- if (rt305x_esw_rr(esw, RT305X_ESW_REG_PCR1) &
- RT305X_ESW_PCR1_WT_DONE)
- break;
-
- if (time_after(jiffies, t_start + RT305X_ESW_PHY_TIMEOUT)) {
- ret = 1;
- break;
- }
- }
-out:
- if (ret)
- printk(KERN_ERR "ramips_eth: MDIO timeout\n");
- return ret;
-}
-
-static void
-rt305x_esw_set_vlan_id(struct rt305x_esw *esw, unsigned vlan, unsigned vid)
-{
- unsigned s;
-
- s = RT305X_ESW_VLANI_VID_S * (vlan % 2);
- rt305x_esw_rmw(esw,
- RT305X_ESW_REG_VLANI(vlan / 2),
- RT305X_ESW_VLANI_VID_M << s,
- (vid & RT305X_ESW_VLANI_VID_M) << s);
-}
-
-static void
-rt305x_esw_set_pvid(struct rt305x_esw *esw, unsigned port, unsigned pvid)
-{
- unsigned s;
-
- s = RT305X_ESW_PVIDC_PVID_S * (port % 2);
- rt305x_esw_rmw(esw,
- RT305X_ESW_REG_PVIDC(port / 2),
- RT305X_ESW_PVIDC_PVID_M << s,
- (pvid & RT305X_ESW_PVIDC_PVID_M) << s);
-}
-
-static void
-rt305x_esw_set_vmsc(struct rt305x_esw *esw, unsigned vlan, unsigned msc)
-{
- unsigned s;
-
- s = RT305X_ESW_VMSC_MSC_S * (vlan % 4);
- rt305x_esw_rmw(esw,
- RT305X_ESW_REG_VMSC(vlan / 4),
- RT305X_ESW_VMSC_MSC_M << s,
- (msc & RT305X_ESW_VMSC_MSC_M) << s);
-}
-
-static void
-rt305x_esw_hw_init(struct rt305x_esw *esw)
-{
- int i;
-
- /* vodoo from original driver */
- rt305x_esw_wr(esw, 0xC8A07850, RT305X_ESW_REG_FCT0);
- rt305x_esw_wr(esw, 0x00000000, RT305X_ESW_REG_SGC2);
- rt305x_esw_wr(esw, 0x00405555, RT305X_ESW_REG_PFC1);
-
- /* Enable Back Pressure, and Flow Control */
- rt305x_esw_wr(esw,
- ((RT305X_ESW_PORTS_ALL << RT305X_ESW_POC1_EN_BP_S) |
- (RT305X_ESW_PORTS_ALL << RT305X_ESW_POC1_EN_FC_S)),
- RT305X_ESW_REG_POC1);
-
- /* Enable Aging, and VLAN TAG removal */
- rt305x_esw_wr(esw,
- ((RT305X_ESW_PORTS_ALL << RT305X_ESW_POC3_ENAGING_S) |
- (RT305X_ESW_PORTS_NOCPU << RT305X_ESW_POC3_UNTAG_EN_S)),
- RT305X_ESW_REG_POC3);
-
- rt305x_esw_wr(esw, esw->pdata->reg_initval_fct2, RT305X_ESW_REG_FCT2);
- rt305x_esw_wr(esw, 0x0008a301, RT305X_ESW_REG_SGC);
-
- /* Setup SoC Port control register */
- rt305x_esw_wr(esw,
- (RT305X_ESW_SOCPC_CRC_PADDING |
- (RT305X_ESW_PORTS_CPU << RT305X_ESW_SOCPC_DISUN2CPU_S) |
- (RT305X_ESW_PORTS_CPU << RT305X_ESW_SOCPC_DISMC2CPU_S) |
- (RT305X_ESW_PORTS_CPU << RT305X_ESW_SOCPC_DISBC2CPU_S)),
- RT305X_ESW_REG_SOCPC);
-
- rt305x_esw_wr(esw, esw->pdata->reg_initval_fpa2, RT305X_ESW_REG_FPA2);
- rt305x_esw_wr(esw, 0x00000000, RT305X_ESW_REG_FPA);
-
- /* Force Link/Activity on ports */
- rt305x_esw_wr(esw, 0x00000005, RT305X_ESW_REG_P0LED);
- rt305x_esw_wr(esw, 0x00000005, RT305X_ESW_REG_P1LED);
- rt305x_esw_wr(esw, 0x00000005, RT305X_ESW_REG_P2LED);
- rt305x_esw_wr(esw, 0x00000005, RT305X_ESW_REG_P3LED);
- rt305x_esw_wr(esw, 0x00000005, RT305X_ESW_REG_P4LED);
-
- rt305x_mii_write(esw, 0, 31, 0x8000);
- for (i = 0; i < 5; i++) {
- /* TX10 waveform coefficient */
- rt305x_mii_write(esw, i, 0, 0x3100);
- /* TX10 waveform coefficient */
- rt305x_mii_write(esw, i, 26, 0x1601);
- /* TX100/TX10 AD/DA current bias */
- rt305x_mii_write(esw, i, 29, 0x7058);
- /* TX100 slew rate control */
- rt305x_mii_write(esw, i, 30, 0x0018);
- }
-
- /* PHY IOT */
- /* select global register */
- rt305x_mii_write(esw, 0, 31, 0x0);
- /* tune TP_IDL tail and head waveform */
- rt305x_mii_write(esw, 0, 22, 0x052f);
- /* set TX10 signal amplitude threshold to minimum */
- rt305x_mii_write(esw, 0, 17, 0x0fe0);
- /* set squelch amplitude to higher threshold */
- rt305x_mii_write(esw, 0, 18, 0x40ba);
- /* longer TP_IDL tail length */
- rt305x_mii_write(esw, 0, 14, 0x65);
- /* select local register */
- rt305x_mii_write(esw, 0, 31, 0x8000);
-
- for (i = 0; i < RT305X_ESW_NUM_VLANS; i++) {
- rt305x_esw_set_vlan_id(esw, i, 0);
- rt305x_esw_set_vmsc(esw, i, 0);
- }
-
- for (i = 0; i < RT305X_ESW_NUM_PORTS; i++)
- rt305x_esw_set_pvid(esw, i, 1);
-
- switch (esw->pdata->vlan_config) {
- case RT305X_ESW_VLAN_CONFIG_NONE:
- break;
-
- case RT305X_ESW_VLAN_CONFIG_BYPASS:
- /* Pass all vlan tags to all ports */
- for (i = 0; i < RT305X_ESW_NUM_VLANS; i++) {
- rt305x_esw_set_vlan_id(esw, i, i+1);
- rt305x_esw_set_vmsc(esw, i, RT305X_ESW_PORTS_ALL);
- }
- /* Disable VLAN TAG removal, keep aging on. */
- rt305x_esw_wr(esw,
- RT305X_ESW_PORTS_ALL << RT305X_ESW_POC3_ENAGING_S,
- RT305X_ESW_REG_POC3);
- break;
-
- case RT305X_ESW_VLAN_CONFIG_LLLLW:
- rt305x_esw_set_vlan_id(esw, 0, 1);
- rt305x_esw_set_vlan_id(esw, 1, 2);
- rt305x_esw_set_pvid(esw, RT305X_ESW_PORT4, 2);
-
- rt305x_esw_set_vmsc(esw, 0,
- BIT(RT305X_ESW_PORT0) | BIT(RT305X_ESW_PORT1) |
- BIT(RT305X_ESW_PORT2) | BIT(RT305X_ESW_PORT3) |
- BIT(RT305X_ESW_PORT6));
- rt305x_esw_set_vmsc(esw, 1,
- BIT(RT305X_ESW_PORT4) | BIT(RT305X_ESW_PORT6));
- break;
-
- case RT305X_ESW_VLAN_CONFIG_WLLLL:
- rt305x_esw_set_vlan_id(esw, 0, 1);
- rt305x_esw_set_vlan_id(esw, 1, 2);
- rt305x_esw_set_pvid(esw, RT305X_ESW_PORT0, 2);
-
- rt305x_esw_set_vmsc(esw, 0,
- BIT(RT305X_ESW_PORT1) | BIT(RT305X_ESW_PORT2) |
- BIT(RT305X_ESW_PORT3) | BIT(RT305X_ESW_PORT4) |
- BIT(RT305X_ESW_PORT6));
- rt305x_esw_set_vmsc(esw, 1,
- BIT(RT305X_ESW_PORT0) | BIT(RT305X_ESW_PORT6));
- break;
-
- default:
- BUG();
- }
-}
-
-static int
-rt305x_esw_probe(struct platform_device *pdev)
-{
- struct rt305x_esw_platform_data *pdata;
- struct rt305x_esw *esw;
- struct resource *res;
- int err;
-
- pdata = pdev->dev.platform_data;
- if (!pdata)
- return -EINVAL;
-
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
- if (!res) {
- dev_err(&pdev->dev, "no memory resource found\n");
- return -ENOMEM;
- }
-
- esw = kzalloc(sizeof(struct rt305x_esw), GFP_KERNEL);
- if (!esw) {
- dev_err(&pdev->dev, "no memory for private data\n");
- return -ENOMEM;
- }
-
- esw->base = ioremap(res->start, resource_size(res));
- if (!esw->base) {
- dev_err(&pdev->dev, "ioremap failed\n");
- err = -ENOMEM;
- goto free_esw;
- }
-
- platform_set_drvdata(pdev, esw);
-
- esw->pdata = pdata;
- spin_lock_init(&esw->reg_rw_lock);
- rt305x_esw_hw_init(esw);
-
- return 0;
-
-free_esw:
- kfree(esw);
- return err;
-}
-
-static int
-rt305x_esw_remove(struct platform_device *pdev)
-{
- struct rt305x_esw *esw;
-
- esw = platform_get_drvdata(pdev);
- if (esw) {
- platform_set_drvdata(pdev, NULL);
- iounmap(esw->base);
- kfree(esw);
- }
-
- return 0;
-}
-
-static struct platform_driver rt305x_esw_driver = {
- .probe = rt305x_esw_probe,
- .remove = rt305x_esw_remove,
- .driver = {
- .name = "rt305x-esw",
- .owner = THIS_MODULE,
- },
-};
-
-static int __init
-rt305x_esw_init(void)
-{
- return platform_driver_register(&rt305x_esw_driver);
-}
-
-static void
-rt305x_esw_exit(void)
-{
- platform_driver_unregister(&rt305x_esw_driver);
-}