atheros[ar231x-eth]: update MAC and PHY reset method
Pass reset_set and reset_clear callback functions pointers via platform_data instead of reset register address. Signed-off-by: Sergey Ryazanov <ryazanov.s.a@gmail.com> SVN-Revision: 41689
This commit is contained in:
parent
4f05d696ad
commit
6be418e3e1
3 changed files with 54 additions and 25 deletions
|
@ -388,7 +388,7 @@
|
||||||
+}
|
+}
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/arch/mips/include/asm/mach-ar231x/ar231x_platform.h
|
+++ b/arch/mips/include/asm/mach-ar231x/ar231x_platform.h
|
||||||
@@ -0,0 +1,83 @@
|
@@ -0,0 +1,84 @@
|
||||||
+#ifndef __AR531X_PLATFORM_H
|
+#ifndef __AR531X_PLATFORM_H
|
||||||
+#define __AR531X_PLATFORM_H
|
+#define __AR531X_PLATFORM_H
|
||||||
+
|
+
|
||||||
|
@ -463,7 +463,8 @@
|
||||||
+ * Platform device information for the Ethernet MAC
|
+ * Platform device information for the Ethernet MAC
|
||||||
+ */
|
+ */
|
||||||
+struct ar231x_eth {
|
+struct ar231x_eth {
|
||||||
+ u32 reset_base;
|
+ void (*reset_set)(u32);
|
||||||
|
+ void (*reset_clear)(u32);
|
||||||
+ u32 reset_mac;
|
+ u32 reset_mac;
|
||||||
+ u32 reset_phy;
|
+ u32 reset_phy;
|
||||||
+ u32 phy_base;
|
+ u32 phy_base;
|
||||||
|
@ -1549,7 +1550,7 @@
|
||||||
+
|
+
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/arch/mips/ar231x/ar5312.c
|
+++ b/arch/mips/ar231x/ar5312.c
|
||||||
@@ -0,0 +1,582 @@
|
@@ -0,0 +1,600 @@
|
||||||
+/*
|
+/*
|
||||||
+ * This file is subject to the terms and conditions of the GNU General Public
|
+ * This file is subject to the terms and conditions of the GNU General Public
|
||||||
+ * License. See the file "COPYING" in the main directory of this archive
|
+ * License. See the file "COPYING" in the main directory of this archive
|
||||||
|
@ -1799,6 +1800,22 @@
|
||||||
+
|
+
|
||||||
+/* end of gpiolib */
|
+/* end of gpiolib */
|
||||||
+
|
+
|
||||||
|
+static void ar5312_device_reset_set(u32 mask)
|
||||||
|
+{
|
||||||
|
+ u32 val;
|
||||||
|
+
|
||||||
|
+ val = ar231x_read_reg(AR531X_RESET);
|
||||||
|
+ ar231x_write_reg(AR531X_RESET, val | mask);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void ar5312_device_reset_clear(u32 mask)
|
||||||
|
+{
|
||||||
|
+ u32 val;
|
||||||
|
+
|
||||||
|
+ val = ar231x_read_reg(AR531X_RESET);
|
||||||
|
+ ar231x_write_reg(AR531X_RESET, val & ~mask);
|
||||||
|
+}
|
||||||
|
+
|
||||||
+static struct physmap_flash_data ar5312_flash_data = {
|
+static struct physmap_flash_data ar5312_flash_data = {
|
||||||
+ .width = 2,
|
+ .width = 2,
|
||||||
+};
|
+};
|
||||||
|
@ -1810,7 +1827,8 @@
|
||||||
+};
|
+};
|
||||||
+
|
+
|
||||||
+static struct ar231x_eth ar5312_eth0_data = {
|
+static struct ar231x_eth ar5312_eth0_data = {
|
||||||
+ .reset_base = AR531X_RESET,
|
+ .reset_set = ar5312_device_reset_set,
|
||||||
|
+ .reset_clear = ar5312_device_reset_clear,
|
||||||
+ .reset_mac = AR531X_RESET_ENET0,
|
+ .reset_mac = AR531X_RESET_ENET0,
|
||||||
+ .reset_phy = AR531X_RESET_EPHY0,
|
+ .reset_phy = AR531X_RESET_EPHY0,
|
||||||
+ .phy_base = KSEG1ADDR(AR531X_ENET0),
|
+ .phy_base = KSEG1ADDR(AR531X_ENET0),
|
||||||
|
@ -1818,7 +1836,8 @@
|
||||||
+};
|
+};
|
||||||
+
|
+
|
||||||
+static struct ar231x_eth ar5312_eth1_data = {
|
+static struct ar231x_eth ar5312_eth1_data = {
|
||||||
+ .reset_base = AR531X_RESET,
|
+ .reset_set = ar5312_device_reset_set,
|
||||||
|
+ .reset_clear = ar5312_device_reset_clear,
|
||||||
+ .reset_mac = AR531X_RESET_ENET1,
|
+ .reset_mac = AR531X_RESET_ENET1,
|
||||||
+ .reset_phy = AR531X_RESET_EPHY1,
|
+ .reset_phy = AR531X_RESET_EPHY1,
|
||||||
+ .phy_base = KSEG1ADDR(AR531X_ENET1),
|
+ .phy_base = KSEG1ADDR(AR531X_ENET1),
|
||||||
|
@ -2134,7 +2153,7 @@
|
||||||
+
|
+
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/arch/mips/ar231x/ar2315.c
|
+++ b/arch/mips/ar231x/ar2315.c
|
||||||
@@ -0,0 +1,639 @@
|
@@ -0,0 +1,655 @@
|
||||||
+/*
|
+/*
|
||||||
+ * This file is subject to the terms and conditions of the GNU General Public
|
+ * This file is subject to the terms and conditions of the GNU General Public
|
||||||
+ * License. See the file "COPYING" in the main directory of this archive
|
+ * License. See the file "COPYING" in the main directory of this archive
|
||||||
|
@ -2493,9 +2512,25 @@
|
||||||
+
|
+
|
||||||
+/* end of gpiolib */
|
+/* end of gpiolib */
|
||||||
+
|
+
|
||||||
|
+static void ar2315_device_reset_set(u32 mask)
|
||||||
|
+{
|
||||||
|
+ u32 val;
|
||||||
|
+
|
||||||
|
+ val = ar231x_read_reg(AR2315_RESET);
|
||||||
|
+ ar231x_write_reg(AR2315_RESET, val | mask);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void ar2315_device_reset_clear(u32 mask)
|
||||||
|
+{
|
||||||
|
+ u32 val;
|
||||||
|
+
|
||||||
|
+ val = ar231x_read_reg(AR2315_RESET);
|
||||||
|
+ ar231x_write_reg(AR2315_RESET, val & ~mask);
|
||||||
|
+}
|
||||||
+
|
+
|
||||||
+static struct ar231x_eth ar2315_eth_data = {
|
+static struct ar231x_eth ar2315_eth_data = {
|
||||||
+ .reset_base = AR2315_RESET,
|
+ .reset_set = ar2315_device_reset_set,
|
||||||
|
+ .reset_clear = ar2315_device_reset_clear,
|
||||||
+ .reset_mac = AR2315_RESET_ENET0,
|
+ .reset_mac = AR2315_RESET_ENET0,
|
||||||
+ .reset_phy = AR2315_RESET_EPHY0,
|
+ .reset_phy = AR2315_RESET_EPHY0,
|
||||||
+ .phy_base = KSEG1ADDR(AR2315_ENET0),
|
+ .phy_base = KSEG1ADDR(AR2315_ENET0),
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
+obj-$(CONFIG_NET_VENDOR_AR231X) += ar231x.o
|
+obj-$(CONFIG_NET_VENDOR_AR231X) += ar231x.o
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/drivers/net/ethernet/ar231x/ar231x.c
|
+++ b/drivers/net/ethernet/ar231x/ar231x.c
|
||||||
@@ -0,0 +1,1254 @@
|
@@ -0,0 +1,1249 @@
|
||||||
+/*
|
+/*
|
||||||
+ * ar231x.c: Linux driver for the Atheros AR231x Ethernet device.
|
+ * ar231x.c: Linux driver for the Atheros AR231x Ethernet device.
|
||||||
+ *
|
+ *
|
||||||
|
@ -289,12 +289,6 @@
|
||||||
+ return -ENXIO;
|
+ return -ENXIO;
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
+ sp->int_regs = ioremap_nocache(virt_to_phys(sp->cfg->reset_base), 4);
|
|
||||||
+ if (!sp->int_regs) {
|
|
||||||
+ printk("Can't remap INTERRUPT registers\n");
|
|
||||||
+ return -ENXIO;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ strncpy(sp->name, "Atheros AR231x", sizeof(sp->name) - 1);
|
+ strncpy(sp->name, "Atheros AR231x", sizeof(sp->name) - 1);
|
||||||
+ sp->name[sizeof(sp->name) - 1] = '\0';
|
+ sp->name[sizeof(sp->name) - 1] = '\0';
|
||||||
+ memcpy(dev->dev_addr, sp->cfg->macaddr, 6);
|
+ memcpy(dev->dev_addr, sp->cfg->macaddr, 6);
|
||||||
|
@ -609,13 +603,13 @@
|
||||||
+ unsigned int ethsal, ethsah;
|
+ unsigned int ethsal, ethsah;
|
||||||
+ unsigned int flags;
|
+ unsigned int flags;
|
||||||
+
|
+
|
||||||
+ *sp->int_regs |= sp->cfg->reset_mac;
|
+ sp->cfg->reset_set(sp->cfg->reset_mac);
|
||||||
+ mdelay(10);
|
+ mdelay(10);
|
||||||
+ *sp->int_regs &= ~sp->cfg->reset_mac;
|
+ sp->cfg->reset_clear(sp->cfg->reset_mac);
|
||||||
+ mdelay(10);
|
+ mdelay(10);
|
||||||
+ *sp->int_regs |= sp->cfg->reset_phy;
|
+ sp->cfg->reset_set(sp->cfg->reset_phy);
|
||||||
+ mdelay(10);
|
+ mdelay(10);
|
||||||
+ *sp->int_regs &= ~sp->cfg->reset_phy;
|
+ sp->cfg->reset_clear(sp->cfg->reset_phy);
|
||||||
+ mdelay(10);
|
+ mdelay(10);
|
||||||
+
|
+
|
||||||
+ sp->dma_regs->bus_mode = (DMA_BUS_MODE_SWR);
|
+ sp->dma_regs->bus_mode = (DMA_BUS_MODE_SWR);
|
||||||
|
@ -1052,7 +1046,8 @@
|
||||||
+ sp->dma_regs->bus_mode = DMA_BUS_MODE_SWR;
|
+ sp->dma_regs->bus_mode = DMA_BUS_MODE_SWR;
|
||||||
+
|
+
|
||||||
+ /* place phy and MAC in reset */
|
+ /* place phy and MAC in reset */
|
||||||
+ *sp->int_regs |= (sp->cfg->reset_mac | sp->cfg->reset_phy);
|
+ sp->cfg->reset_set(sp->cfg->reset_mac);
|
||||||
|
+ sp->cfg->reset_set(sp->cfg->reset_phy);
|
||||||
+
|
+
|
||||||
+ /* free buffers on tx ring */
|
+ /* free buffers on tx ring */
|
||||||
+ for (j = 0; j < AR2313_DESCR_ENTRIES; j++) {
|
+ for (j = 0; j < AR2313_DESCR_ENTRIES; j++) {
|
||||||
|
@ -1076,7 +1071,7 @@
|
||||||
+ * the irq is gone forever ! When bond0 is made 'up' again,
|
+ * the irq is gone forever ! When bond0 is made 'up' again,
|
||||||
+ * the ar231x_open () does not call request_irq (). Worse,
|
+ * the ar231x_open () does not call request_irq (). Worse,
|
||||||
+ * the call to ar231x_halt() generates a WDOG reset due to
|
+ * the call to ar231x_halt() generates a WDOG reset due to
|
||||||
+ * the write to 'sp->int_regs' and the box reboots.
|
+ * the write to reset register and the box reboots.
|
||||||
+ * Commenting this out is good since it allows the
|
+ * Commenting this out is good since it allows the
|
||||||
+ * system to resume when bond0 is made up again.
|
+ * system to resume when bond0 is made up again.
|
||||||
+ */
|
+ */
|
||||||
|
@ -1289,7 +1284,7 @@
|
||||||
+
|
+
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/drivers/net/ethernet/ar231x/ar231x.h
|
+++ b/drivers/net/ethernet/ar231x/ar231x.h
|
||||||
@@ -0,0 +1,288 @@
|
@@ -0,0 +1,287 @@
|
||||||
+/*
|
+/*
|
||||||
+ * ar231x.h: Linux driver for the Atheros AR231x Ethernet device.
|
+ * ar231x.h: Linux driver for the Atheros AR231x Ethernet device.
|
||||||
+ *
|
+ *
|
||||||
|
@ -1515,7 +1510,6 @@
|
||||||
+ volatile ETHERNET_STRUCT *phy_regs;
|
+ volatile ETHERNET_STRUCT *phy_regs;
|
||||||
+ volatile ETHERNET_STRUCT *eth_regs;
|
+ volatile ETHERNET_STRUCT *eth_regs;
|
||||||
+ volatile DMA *dma_regs;
|
+ volatile DMA *dma_regs;
|
||||||
+ volatile u32 *int_regs;
|
|
||||||
+ struct ar231x_eth *cfg;
|
+ struct ar231x_eth *cfg;
|
||||||
+
|
+
|
||||||
+ spinlock_t lock; /* Serialise access to device */
|
+ spinlock_t lock; /* Serialise access to device */
|
||||||
|
|
|
@ -41,7 +41,7 @@
|
||||||
int ar231x_probe(struct platform_device *pdev)
|
int ar231x_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct net_device *dev;
|
struct net_device *dev;
|
||||||
@@ -293,6 +320,23 @@ int ar231x_probe(struct platform_device
|
@@ -287,6 +314,23 @@ int ar231x_probe(struct platform_device
|
||||||
|
|
||||||
mdiobus_register(sp->mii_bus);
|
mdiobus_register(sp->mii_bus);
|
||||||
|
|
||||||
|
@ -65,7 +65,7 @@
|
||||||
if (ar231x_mdiobus_probe(dev) != 0) {
|
if (ar231x_mdiobus_probe(dev) != 0) {
|
||||||
printk(KERN_ERR "%s: mdiobus_probe failed\n", dev->name);
|
printk(KERN_ERR "%s: mdiobus_probe failed\n", dev->name);
|
||||||
rx_tasklet_cleanup(dev);
|
rx_tasklet_cleanup(dev);
|
||||||
@@ -349,8 +393,10 @@ static int ar231x_remove(struct platform
|
@@ -343,8 +387,10 @@ static int ar231x_remove(struct platform
|
||||||
rx_tasklet_cleanup(dev);
|
rx_tasklet_cleanup(dev);
|
||||||
ar231x_init_cleanup(dev);
|
ar231x_init_cleanup(dev);
|
||||||
unregister_netdev(dev);
|
unregister_netdev(dev);
|
||||||
|
@ -78,7 +78,7 @@
|
||||||
kfree(dev);
|
kfree(dev);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -1108,6 +1154,9 @@ static int ar231x_ioctl(struct net_devic
|
@@ -1103,6 +1149,9 @@ static int ar231x_ioctl(struct net_devic
|
||||||
struct ar231x_private *sp = netdev_priv(dev);
|
struct ar231x_private *sp = netdev_priv(dev);
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue