From ed5a9714deade00baa412527ad38d067022420e3 Mon Sep 17 00:00:00 2001 From: hwg Date: Thu, 27 Sep 2012 20:32:05 +0800 Subject: [PATCH] wmac: add 10m support and solve multicast problem --- arch/arm/mach-rk29/board-rk29-ddr3sdk.c | 12 ++++++++++++ arch/arm/mach-rk30/board-rk30-sdk-vmac.c | 12 ++++++++++++ arch/arm/plat-rk/include/plat/board.h | 1 + drivers/net/rk29_vmac.c | 8 ++++++-- 4 files changed, 31 insertions(+), 2 deletions(-) mode change 100644 => 100755 arch/arm/mach-rk30/board-rk30-sdk-vmac.c diff --git a/arch/arm/mach-rk29/board-rk29-ddr3sdk.c b/arch/arm/mach-rk29/board-rk29-ddr3sdk.c index 91fc6b5301cd..6bc4f213bd3e 100755 --- a/arch/arm/mach-rk29/board-rk29-ddr3sdk.c +++ b/arch/arm/mach-rk29/board-rk29-ddr3sdk.c @@ -2948,6 +2948,18 @@ static struct platform_device *devices[] __initdata = { * spi devices * author: cmc@rock-chips.com *****************************************************************************************/ + +#define BIT_EMAC_SPEED (1 << 10) +static int rk29_vmac_speed_switch(int speed) +{ + printk("%s--speed=%d\n", __FUNCTION__, speed); + if (10 == speed) { + writel(readl(RK29_GRF_BASE + 0xbc) & (~BIT_EMAC_SPEED), RK29_GRF_BASE + 0xbc); + } else { + writel(readl(RK29_GRF_BASE + 0xbc) | BIT_EMAC_SPEED, RK29_GRF_BASE + 0xbc); + } +} + static int rk29_vmac_register_set(void) { //config rk29 vmac as rmii, 100MHz diff --git a/arch/arm/mach-rk30/board-rk30-sdk-vmac.c b/arch/arm/mach-rk30/board-rk30-sdk-vmac.c old mode 100644 new mode 100755 index 5ec8866c0766..35d45119d3cc --- a/arch/arm/mach-rk30/board-rk30-sdk-vmac.c +++ b/arch/arm/mach-rk30/board-rk30-sdk-vmac.c @@ -72,9 +72,21 @@ static int rk30_rmii_power_control(int enable) return 0; } +#define BIT_EMAC_SPEED (1 << 1) +static int rk29_vmac_speed_switch(int speed) +{ + printk("%s--speed=%d\n", __FUNCTION__, speed); + if (10 == speed) { + writel_relaxed(readl_relaxed(RK30_GRF_BASE + GRF_SOC_CON1) & (~BIT_EMAC_SPEED), RK30_GRF_BASE + GRF_SOC_CON1); + } else { + writel_relaxed(readl_relaxed(RK30_GRF_BASE + GRF_SOC_CON1) | ( BIT_EMAC_SPEED), RK30_GRF_BASE + GRF_SOC_CON1); + } +} + struct rk29_vmac_platform_data board_vmac_data = { .vmac_register_set = rk30_vmac_register_set, .rmii_io_init = rk30_rmii_io_init, .rmii_io_deinit = rk30_rmii_io_deinit, .rmii_power_control = rk30_rmii_power_control, + .rmii_speed_switch = rk29_vmac_speed_switch, }; diff --git a/arch/arm/plat-rk/include/plat/board.h b/arch/arm/plat-rk/include/plat/board.h index 4a9c3ce47852..68cb8fdc9c35 100644 --- a/arch/arm/plat-rk/include/plat/board.h +++ b/arch/arm/plat-rk/include/plat/board.h @@ -193,6 +193,7 @@ struct rk29_vmac_platform_data { int (*rmii_io_init)(void); int (*rmii_io_deinit)(void); int (*rmii_power_control)(int enable); + int(*rmii_speed_switch)(int speed); }; #define BOOT_MODE_NORMAL 0 diff --git a/drivers/net/rk29_vmac.c b/drivers/net/rk29_vmac.c index 95e79e45e274..f64bb4e8a5f2 100755 --- a/drivers/net/rk29_vmac.c +++ b/drivers/net/rk29_vmac.c @@ -136,6 +136,7 @@ static void vmac_handle_link_change(struct net_device *dev) struct phy_device *phydev = ap->phy_dev; unsigned long flags; int report_change = 0; + struct rk29_vmac_platform_data *pdata = ap->pdev->dev.platform_data; spin_lock_irqsave(&ap->lock, flags); @@ -160,6 +161,9 @@ static void vmac_handle_link_change(struct net_device *dev) report_change = 1; } + if (pdata && pdata->rmii_speed_switch) + pdata->rmii_speed_switch(phydev->speed); + if (phydev->link != ap->link) { ap->link = phydev->link; report_change = 1; @@ -1432,10 +1436,10 @@ static void vmac_set_multicast_list(struct net_device *dev) spin_lock_irqsave(&ap->lock, flags); promisc = !!(dev->flags & IFF_PROMISC); - reg = vmac_readl(ap, ENABLE); + reg = vmac_readl(ap, CONTROL); if (promisc != !!(reg & PROM_MASK)) { reg ^= PROM_MASK; - vmac_writel(ap, reg, ENABLE); + vmac_writel(ap, reg, CONTROL); } if (dev->flags & IFF_ALLMULTI) -- 2.34.1