From 7c984552ed2d9d4fdd91bd48d08ac416958c1fd7 Mon Sep 17 00:00:00 2001 From: Florian Fainelli Date: Sat, 23 Jun 2012 11:03:35 +0000 Subject: [PATCH] remove platform specific initialization from ethernet driver Hardware filtering must always be enabled as long as there is an Ethernet device registered, and use device tree for setting the link activity and buffer shifting enable/disable bit. SVN-Revision: 32486 --- .../files-3.3/arch/arm/boot/dts/mcs8140.dtsi | 3 +- .../files-3.3/arch/arm/boot/dts/rbt-832.dts | 3 + .../files-3.3/arch/arm/mach-mcs814x/common.c | 77 ++++++++++++++++++- .../drivers/net/ethernet/mcs8140/nuport_mac.c | 31 +++----- 4 files changed, 90 insertions(+), 24 deletions(-) diff --git a/target/linux/mcs814x/files-3.3/arch/arm/boot/dts/mcs8140.dtsi b/target/linux/mcs814x/files-3.3/arch/arm/boot/dts/mcs8140.dtsi index 67727efe9c5..c68f3ce7da7 100644 --- a/target/linux/mcs814x/files-3.3/arch/arm/boot/dts/mcs8140.dtsi +++ b/target/linux/mcs814x/files-3.3/arch/arm/boot/dts/mcs8140.dtsi @@ -37,11 +37,12 @@ ranges; eth0: ethernet@40084000 { - //compatible = "moschip,mcs814x-eth"; compatible = "moschip,nuport-mac"; reg = <0x40084000 0xd8 // mac 0x40080000 0x58>; // dma channels interrupts = <4 5 29>; /* tx, rx, link */ + nuport-mac,buffer-shifting; + nuport-mac,link-activity = <0>; }; tso@40088000 { diff --git a/target/linux/mcs814x/files-3.3/arch/arm/boot/dts/rbt-832.dts b/target/linux/mcs814x/files-3.3/arch/arm/boot/dts/rbt-832.dts index a3d815c07b5..cc7fab8ed1d 100644 --- a/target/linux/mcs814x/files-3.3/arch/arm/boot/dts/rbt-832.dts +++ b/target/linux/mcs814x/files-3.3/arch/arm/boot/dts/rbt-832.dts @@ -19,6 +19,9 @@ ahb { vci { + eth0: ethernet@40084000 { + nuport-mac,link-activity = <0x01>; + }; adc { sdram: memory@0,0 { diff --git a/target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/common.c b/target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/common.c index a408e692876..c593561e24d 100644 --- a/target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/common.c +++ b/target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/common.c @@ -12,6 +12,8 @@ #include #include #include +#include +#include #include #include @@ -30,9 +32,12 @@ static struct map_desc mcs814x_io_desc[] __initdata = { }, }; -#define SYSDBG_BS2 0x04 -#define CPU_MODE_SHIFT 23 -#define CPU_MODE_MASK 0x03 +#define SYSDBG_BS2 0x04 +#define LED_CFG_MASK 0x03 +#define CPU_MODE_SHIFT 23 +#define CPU_MODE_MASK 0x03 + +#define SYSDBG_SYSCTL_MAC 0x1d struct cpu_mode { const char *name; @@ -63,6 +68,70 @@ static const struct cpu_mode cpu_modes[] = { }, }; +static void mcs814x_eth_hardware_filter_set(u8 value) +{ + u32 reg; + + reg = __raw_readl(_CONFADDR_DBGLED); + if (value) + reg |= 0x80; + else + reg &= ~0x80; + __raw_writel(reg, _CONFADDR_DBGLED); +} + +static void mcs814x_eth_led_cfg_set(u8 cfg) +{ + u32 reg; + + reg = __raw_readl(_CONFADDR_SYSDBG + SYSDBG_BS2); + reg &= ~LED_CFG_MASK; + reg |= cfg; + __raw_writel(reg, _CONFADDR_SYSDBG + SYSDBG_BS2); +} + +static void mcs814x_eth_buffer_shifting_set(u8 value) +{ + u8 reg; + + reg = __raw_readb(_CONFADDR_SYSDBG + SYSDBG_SYSCTL_MAC); + if (value) + reg |= 0x01; + else + reg &= ~0x01; + __raw_writeb(reg, _CONFADDR_SYSDBG + SYSDBG_SYSCTL_MAC); +} + +static struct of_device_id mcs814x_eth_ids[] __initdata = { + { .compatible = "moschip,nuport-mac", }, + { /* sentinel */ }, +}; + +/* Configure platform specific knobs based on ethernet device node + * properties */ +static void mcs814x_eth_init(void) +{ + struct device_node *np; + const unsigned int *intspec; + + np = of_find_matching_node(NULL, mcs814x_eth_ids); + if (!np) + return; + + /* hardware filter must always be enabled */ + mcs814x_eth_hardware_filter_set(1); + + intspec = of_get_property(np, "nuport-mac,buffer-shifting", NULL); + if (!intspec) + mcs814x_eth_buffer_shifting_set(0); + else + mcs814x_eth_buffer_shifting_set(1); + + intspec = of_get_property(np, "nuport-mac,link-activity", NULL); + if (intspec) + mcs814x_eth_led_cfg_set(be32_to_cpup(intspec)); +} + void __init mcs814x_init_machine(void) { u32 bs2, cpu_mode; @@ -79,6 +148,8 @@ void __init mcs814x_init_machine(void) if (gpio != -1) gpio_request(gpio, cpu_modes[cpu_mode].name); } + + mcs814x_eth_init(); } void __init mcs814x_map_io(void) diff --git a/target/linux/mcs814x/files-3.3/drivers/net/ethernet/mcs8140/nuport_mac.c b/target/linux/mcs814x/files-3.3/drivers/net/ethernet/mcs8140/nuport_mac.c index cef67b8dec2..655749dc4bc 100644 --- a/target/linux/mcs814x/files-3.3/drivers/net/ethernet/mcs8140/nuport_mac.c +++ b/target/linux/mcs814x/files-3.3/drivers/net/ethernet/mcs8140/nuport_mac.c @@ -27,7 +27,6 @@ #include #include -#include /* Hardware registers */ #define MAC_BASE_ADDR ((priv->mac_base)) @@ -140,6 +139,7 @@ struct nuport_mac_priv { int old_link; int old_duplex; u32 msg_level; + unsigned int buffer_shifting_len; }; static inline int nuport_mac_mii_busy_wait(struct nuport_mac_priv *priv) @@ -515,8 +515,8 @@ static int nuport_mac_rx(struct net_device *dev, int limit) len = priv->pkt_len[priv->cur_rx]; /* Remove 2 bytes added by RX buffer shifting */ - len = len - 2; - skb->data = skb->data + 2; + len = len - priv->buffer_shifting_len; + skb->data = skb->data + priv->buffer_shifting_len; /* Get packet status */ status = get_unaligned((u32 *) (skb->data + len)); @@ -691,18 +691,6 @@ static int nuport_mac_open(struct net_device *dev) int ret; struct nuport_mac_priv *priv = netdev_priv(dev); unsigned long flags; - u32 reg; - u8 tmp; - - /* Enable hardware filters */ - reg = nuport_mac_readl((void __iomem *)_CONFADDR_DBGLED); - reg |= 0x80; - nuport_mac_writel(reg, (void __iomem *)_CONFADDR_DBGLED); - - /* Set LEDs to Link act and RX/TX mode */ - reg = nuport_mac_readl((void __iomem *)(_CONFADDR_SYSDBG + 0x04)); - reg |= 0x01; - nuport_mac_writel(reg, (void __iomem *)(_CONFADDR_SYSDBG + 0x04)); ret = clk_enable(priv->emac_clk); if (ret) { @@ -747,11 +735,6 @@ static int nuport_mac_open(struct net_device *dev) goto out_tx_irq; } - /* Enable buffer shifting in RX */ - tmp = nuport_mac_readb((void __iomem *)(_CONFADDR_SYSDBG + 0x1D)); - tmp |= 0x01; - nuport_mac_writeb(tmp, (void __iomem *)(_CONFADDR_SYSDBG + 0x1D)); - netif_start_queue(dev); nuport_mac_init_tx_ring(priv); @@ -947,6 +930,7 @@ static int __init nuport_mac_probe(struct platform_device *pdev) int ret = 0; int rx_irq, tx_irq, link_irq; int i; + const unsigned int *intspec; dev = alloc_etherdev(sizeof(struct nuport_mac_priv)); if (!dev) { @@ -977,6 +961,13 @@ static int __init nuport_mac_probe(struct platform_device *pdev) priv->dev = dev; spin_lock_init(&priv->lock); + intspec = of_get_property(pdev->dev.of_node, + "nuport-mac,buffer-shifting", NULL); + if (!intspec) + priv->buffer_shifting_len = 0; + else + priv->buffer_shifting_len = 2; + priv->mac_base = devm_ioremap(&pdev->dev, regs->start, resource_size(regs)); if (!priv->mac_base) { -- 2.30.2