diff options
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 67727efe9c..c68f3ce7da 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 a3d815c07b..cc7fab8ed1 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 a408e69287..c593561e24 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 <linux/init.h> #include <linux/io.h> #include <linux/gpio.h> +#include <linux/of.h> +#include <linux/of_address.h> #include <asm/setup.h> #include <asm/mach-types.h> @@ -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 cef67b8dec..655749dc4b 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 <asm/unaligned.h> #include <asm/sizes.h> -#include <mach/hardware.h> /* 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) { |