[mcs814x] remove platform specific initialization from ethernet driver
authorFlorian Fainelli <florian@openwrt.org>
Sat, 23 Jun 2012 11:03:35 +0000 (11:03 +0000)
committerFlorian Fainelli <florian@openwrt.org>
Sat, 23 Jun 2012 11:03:35 +0000 (11:03 +0000)
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

target/linux/mcs814x/files-3.3/arch/arm/boot/dts/mcs8140.dtsi
target/linux/mcs814x/files-3.3/arch/arm/boot/dts/rbt-832.dts
target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/common.c
target/linux/mcs814x/files-3.3/drivers/net/ethernet/mcs8140/nuport_mac.c

index 67727ef..c68f3ce 100644 (file)
                        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 {
index a3d815c..cc7fab8 100644 (file)
@@ -19,6 +19,9 @@
 
        ahb {
                vci {
+                       eth0: ethernet@40084000 {
+                               nuport-mac,link-activity = <0x01>;
+                       };
 
                        adc {
                                sdram: memory@0,0 {
index a408e69..c593561 100644 (file)
@@ -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)
index cef67b8..655749d 100644 (file)
@@ -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) {