aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--target/linux/mcs814x/files-3.3/arch/arm/boot/dts/mcs8140.dtsi3
-rw-r--r--target/linux/mcs814x/files-3.3/arch/arm/boot/dts/rbt-832.dts3
-rw-r--r--target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/common.c77
-rw-r--r--target/linux/mcs814x/files-3.3/drivers/net/ethernet/mcs8140/nuport_mac.c31
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) {