brcm47xx: b44: This updates the phylib patches to the version send upstream

This uses a fixed phy instead of a dummy one.

Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>

SVN-Revision: 39166
This commit is contained in:
Hauke Mehrtens 2013-12-26 23:27:52 +00:00
parent bc3d934148
commit 961d5b4453
15 changed files with 252 additions and 165 deletions

View file

@ -50,6 +50,7 @@ CONFIG_CPU_SUPPORTS_HIGHMEM=y
CONFIG_CSRC_R4K=y CONFIG_CSRC_R4K=y
CONFIG_DMA_NONCOHERENT=y CONFIG_DMA_NONCOHERENT=y
# CONFIG_EARLY_PRINTK is not set # CONFIG_EARLY_PRINTK is not set
CONFIG_FIXED_PHY=y
CONFIG_GENERIC_ATOMIC64=y CONFIG_GENERIC_ATOMIC64=y
CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CLOCKEVENTS=y
CONFIG_GENERIC_CLOCKEVENTS_BUILD=y CONFIG_GENERIC_CLOCKEVENTS_BUILD=y

View file

@ -1,8 +1,27 @@
From 3fc36ba561bd9a9bdc097d6ace32f1303364268c Mon Sep 17 00:00:00 2001 From d61941952d5e7d062c3884e6d81bd503a37702b4 Mon Sep 17 00:00:00 2001
From: Hauke Mehrtens <hauke@hauke-m.de> From: Hauke Mehrtens <hauke@hauke-m.de>
Date: Tue, 22 Oct 2013 21:05:25 +0200 Date: Fri, 20 Dec 2013 02:16:06 +0100
Subject: [PATCH 2/9] b44: use B44_FLAG_EXTERNAL_PHY Subject: [PATCH 201/208] b44: check register instead of PHY address to detect
external PHY
The Ethernet core supported by b44 supports an internal PHY integrated
into the mac core, which is supported by the b44 driver and an external
PHY to which the mac core is connected. This external PHY could be a
switch connected through MII, which is often the case when this core is
used on home routers. The usage of an external PHY was assumed when the
PHY address 30 was used and an internal PHY was assumed when the PHY
address was different. To verify that b44_phy_reset() was called and
checked if it worked, otherwise PHY address 30 was assumed, an external
PHY. It is better to check the register which says which PHY is
connected to the MAC instead of checking the PHY address.
The interface to an external PHY was only activated when this register
was set.
This also changes B44_FLAG_INTERNAL_PHY to B44_FLAG_EXTERNAL_PHY, it is
easier to check.
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
--- ---
drivers/net/ethernet/broadcom/b44.c | 18 +++++++++--------- drivers/net/ethernet/broadcom/b44.c | 18 +++++++++---------
drivers/net/ethernet/broadcom/b44.h | 2 +- drivers/net/ethernet/broadcom/b44.h | 2 +-

View file

@ -1,7 +1,7 @@
From 888594b4a1f70d02b7f6b05e868b00514b5cf559 Mon Sep 17 00:00:00 2001 From 5ab6329c5224d8135d76da18066edf3395f679f5 Mon Sep 17 00:00:00 2001
From: Hauke Mehrtens <hauke@hauke-m.de> From: Hauke Mehrtens <hauke@hauke-m.de>
Date: Thu, 3 Oct 2013 20:41:29 +0200 Date: Fri, 20 Dec 2013 02:16:07 +0100
Subject: [PATCH 3/9] b44: rename B44_PHY_ADDR_NO_PHY to Subject: [PATCH 202/208] b44: rename B44_PHY_ADDR_NO_PHY to
B44_PHY_ADDR_NO_LOCAL_PHY B44_PHY_ADDR_NO_LOCAL_PHY
The PHY address 30 means there is no local PHY, but there could be an The PHY address 30 means there is no local PHY, but there could be an
@ -9,6 +9,7 @@ external PHY like a switch connected via MII. This is the case on most
embedded home routers where this driver is used. embedded home routers where this driver is used.
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de> Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
--- ---
drivers/net/ethernet/broadcom/b44.c | 2 +- drivers/net/ethernet/broadcom/b44.c | 2 +-
drivers/net/ethernet/broadcom/b44.h | 6 +++--- drivers/net/ethernet/broadcom/b44.h | 6 +++---
@ -21,7 +22,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
/* do a phy reset to test if there is an active phy */ /* do a phy reset to test if there is an active phy */
if (b44_phy_reset(bp) < 0) if (b44_phy_reset(bp) < 0)
- bp->phy_addr = B44_PHY_ADDR_NO_PHY; - bp->phy_addr = B44_PHY_ADDR_NO_PHY;
+ bp->phy_addr = B44_PHY_ADDR_NO_LOACL_PHY; + bp->phy_addr = B44_PHY_ADDR_NO_LOCAL_PHY;
netdev_info(dev, "%s %pM\n", DRV_DESCRIPTION, dev->dev_addr); netdev_info(dev, "%s %pM\n", DRV_DESCRIPTION, dev->dev_addr);
@ -35,7 +36,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
-#define B44_PHY_ADDR_NO_PHY 30 -#define B44_PHY_ADDR_NO_PHY 30
-#define B44_MDC_RATIO 5000000 -#define B44_MDC_RATIO 5000000
+#define B44_MCAST_TABLE_SIZE 32 +#define B44_MCAST_TABLE_SIZE 32
+#define B44_PHY_ADDR_NO_LOACL_PHY 30 /* no local phy regs */ +#define B44_PHY_ADDR_NO_LOCAL_PHY 30 /* no local phy regs */
+#define B44_MDC_RATIO 5000000 +#define B44_MDC_RATIO 5000000
#define B44_STAT_REG_DECLARE \ #define B44_STAT_REG_DECLARE \

View file

@ -1,13 +1,14 @@
From d6668993d793d39e2c9d7699e8079462cae67f7e Mon Sep 17 00:00:00 2001 From 7befa6abe09c84269b8af614a166409090346cf8 Mon Sep 17 00:00:00 2001
From: Hauke Mehrtens <hauke@hauke-m.de> From: Hauke Mehrtens <hauke@hauke-m.de>
Date: Thu, 3 Oct 2013 20:49:10 +0200 Date: Fri, 20 Dec 2013 02:16:08 +0100
Subject: [PATCH 4/9] b44: abort when no PHY is available at all Subject: [PATCH 203/208] b44: abort when no PHY is available at all
When the phy address is 31, this means that there is no PHY connected When the phy address is 31, this means that there is no PHY connected
to this MAC at all, no internal and no external PHY. Reading these PHY to this MAC at all, no internal and no external PHY. Reading these PHY
registers causes a system reset on some routers. registers causes a system reset on some routers.
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de> Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
--- ---
drivers/net/ethernet/broadcom/b44.c | 6 ++++++ drivers/net/ethernet/broadcom/b44.c | 6 ++++++
drivers/net/ethernet/broadcom/b44.h | 1 + drivers/net/ethernet/broadcom/b44.h | 1 +
@ -33,7 +34,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
@@ -282,6 +282,7 @@ struct ring_info { @@ -282,6 +282,7 @@ struct ring_info {
#define B44_MCAST_TABLE_SIZE 32 #define B44_MCAST_TABLE_SIZE 32
#define B44_PHY_ADDR_NO_LOACL_PHY 30 /* no local phy regs */ #define B44_PHY_ADDR_NO_LOCAL_PHY 30 /* no local phy regs */
+#define B44_PHY_ADDR_NO_PHY 31 /* no phy present at all */ +#define B44_PHY_ADDR_NO_PHY 31 /* no phy present at all */
#define B44_MDC_RATIO 5000000 #define B44_MDC_RATIO 5000000

View file

@ -1,14 +1,15 @@
From 16b8dde613e5b59bee13537469f3562081da1a2c Mon Sep 17 00:00:00 2001 From 348baa6c81cf774811040e4da01438d077a08301 Mon Sep 17 00:00:00 2001
From: Hauke Mehrtens <hauke@hauke-m.de> From: Hauke Mehrtens <hauke@hauke-m.de>
Date: Sun, 6 Oct 2013 15:31:04 +0200 Date: Fri, 20 Dec 2013 02:16:09 +0100
Subject: [PATCH 5/9] b44: rename b44_mii_{read,write} to Subject: [PATCH 204/208] b44: rename b44_mii_{read, write} to b44_mdio_{read,
b44_mdio_{read,write}_mii write}_mii
The next patch will add these functions for phylib, and we should The next patch will add these functions for phylib, and we should
rename the old ones before. This now indicates that these functions are rename the old ones before. This now indicates that these functions are
used for the mdio registers and on the mii interface. used for the mdio registers and on the mii interface.
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de> Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
--- ---
drivers/net/ethernet/broadcom/b44.c | 10 +++++----- drivers/net/ethernet/broadcom/b44.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-) 1 file changed, 5 insertions(+), 5 deletions(-)

View file

@ -1,7 +1,7 @@
From 31963d998d2984079dc4f4b36b7df170d85f6d66 Mon Sep 17 00:00:00 2001 From 86f4ea63e696db996f68d1065b55506e75a7d765 Mon Sep 17 00:00:00 2001
From: Hauke Mehrtens <hauke@hauke-m.de> From: Hauke Mehrtens <hauke@hauke-m.de>
Date: Thu, 3 Oct 2013 22:07:11 +0200 Date: Fri, 20 Dec 2013 02:16:10 +0100
Subject: [PATCH 6/9] b44: add phylib support Subject: [PATCH 205/208] b44: add phylib support
Most of the older home routers based on the Broadcom BCM47XX SoC series Most of the older home routers based on the Broadcom BCM47XX SoC series
are using a MAC that is supported by b44. On most of these routers not are using a MAC that is supported by b44. On most of these routers not
@ -13,17 +13,23 @@ Broadcom home networking SoCs which are using different Ethernet MAC
drivers. This was tested with the b53 switch driver which is currently drivers. This was tested with the b53 switch driver which is currently
on its way to mainline. on its way to mainline.
If the internal PHY is not used, b44 will now search on the MDIO bus
for a phy and use the Linux phylib subsystem to register a driver.
Support for the internal PHY must stay here, because there are some
device which are suing the internal phy.
With this patch we scan the mdio bus when the sprom or nvram says that With this patch we scan the mdio bus when the sprom or nvram says that
the PHY address is 30, if a PHY was found at this address b44 uses it. the PHY address is 30, if a PHY was found at this address b44 uses it.
This was tested with a BCM4704, BCM4712 and BCM5354. This was tested with a BCM4704, BCM4712 and BCM5354.
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de> Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
--- ---
drivers/net/ethernet/broadcom/Kconfig | 1 + drivers/net/ethernet/broadcom/Kconfig | 1 +
drivers/net/ethernet/broadcom/b44.c | 181 ++++++++++++++++++++++++++++++++- drivers/net/ethernet/broadcom/b44.c | 190 ++++++++++++++++++++++++++++++++-
drivers/net/ethernet/broadcom/b44.h | 4 + drivers/net/ethernet/broadcom/b44.h | 3 +
3 files changed, 183 insertions(+), 3 deletions(-) 3 files changed, 189 insertions(+), 5 deletions(-)
--- a/drivers/net/ethernet/broadcom/Kconfig --- a/drivers/net/ethernet/broadcom/Kconfig
+++ b/drivers/net/ethernet/broadcom/Kconfig +++ b/drivers/net/ethernet/broadcom/Kconfig
@ -77,7 +83,22 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
static int b44_phy_reset(struct b44 *bp) static int b44_phy_reset(struct b44 *bp)
{ {
u32 val; u32 val;
@@ -1805,6 +1824,11 @@ static int b44_get_settings(struct net_d @@ -523,10 +542,12 @@ static void b44_check_phy(struct b44 *bp
if (bp->flags & B44_FLAG_EXTERNAL_PHY) {
bp->flags |= B44_FLAG_100_BASE_T;
- bp->flags |= B44_FLAG_FULL_DUPLEX;
if (!netif_carrier_ok(bp->dev)) {
u32 val = br32(bp, B44_TX_CTRL);
- val |= TX_CTRL_DUPLEX;
+ if (bp->flags & B44_FLAG_FULL_DUPLEX)
+ val |= TX_CTRL_DUPLEX;
+ else
+ val &= ~TX_CTRL_DUPLEX;
bw32(bp, B44_TX_CTRL, val);
netif_carrier_on(bp->dev);
b44_link_report(bp);
@@ -1805,6 +1826,11 @@ static int b44_get_settings(struct net_d
{ {
struct b44 *bp = netdev_priv(dev); struct b44 *bp = netdev_priv(dev);
@ -89,7 +110,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
cmd->supported = (SUPPORTED_Autoneg); cmd->supported = (SUPPORTED_Autoneg);
cmd->supported |= (SUPPORTED_100baseT_Half | cmd->supported |= (SUPPORTED_100baseT_Half |
SUPPORTED_100baseT_Full | SUPPORTED_100baseT_Full |
@@ -1846,7 +1870,23 @@ static int b44_get_settings(struct net_d @@ -1846,7 +1872,23 @@ static int b44_get_settings(struct net_d
static int b44_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) static int b44_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
{ {
struct b44 *bp = netdev_priv(dev); struct b44 *bp = netdev_priv(dev);
@ -114,7 +135,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
/* We do not support gigabit. */ /* We do not support gigabit. */
if (cmd->autoneg == AUTONEG_ENABLE) { if (cmd->autoneg == AUTONEG_ENABLE) {
@@ -2076,7 +2116,6 @@ static const struct ethtool_ops b44_etht @@ -2076,7 +2118,6 @@ static const struct ethtool_ops b44_etht
static int b44_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) static int b44_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
{ {
@ -122,7 +143,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
struct b44 *bp = netdev_priv(dev); struct b44 *bp = netdev_priv(dev);
int err = -EINVAL; int err = -EINVAL;
@@ -2084,7 +2123,12 @@ static int b44_ioctl(struct net_device * @@ -2084,7 +2125,12 @@ static int b44_ioctl(struct net_device *
goto out; goto out;
spin_lock_irq(&bp->lock); spin_lock_irq(&bp->lock);
@ -136,7 +157,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
spin_unlock_irq(&bp->lock); spin_unlock_irq(&bp->lock);
out: out:
return err; return err;
@@ -2146,6 +2190,124 @@ static const struct net_device_ops b44_n @@ -2146,6 +2192,127 @@ static const struct net_device_ops b44_n
#endif #endif
}; };
@ -154,13 +175,22 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
+ } + }
+ +
+ /* reflect duplex change */ + /* reflect duplex change */
+ if (phydev->link && (bp->old_duplex != phydev->duplex)) { + if (phydev->link) {
+ status_changed = 1; + if ((phydev->duplex == DUPLEX_HALF) &&
+ bp->old_duplex = phydev->duplex; + (bp->flags & B44_FLAG_FULL_DUPLEX)) {
+ status_changed = 1;
+ bp->flags &= ~B44_FLAG_FULL_DUPLEX;
+ } else if ((phydev->duplex == DUPLEX_FULL) &&
+ !(bp->flags & B44_FLAG_FULL_DUPLEX)) {
+ status_changed = 1;
+ bp->flags |= B44_FLAG_FULL_DUPLEX;
+ }
+ } + }
+ +
+ if (status_changed) + if (status_changed) {
+ b44_check_phy(bp);
+ phy_print_status(phydev); + phy_print_status(phydev);
+ }
+} +}
+ +
+static int b44_register_phy_one(struct b44 *bp) +static int b44_register_phy_one(struct b44 *bp)
@ -168,6 +198,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
+ struct mii_bus *mii_bus; + struct mii_bus *mii_bus;
+ struct ssb_device *sdev = bp->sdev; + struct ssb_device *sdev = bp->sdev;
+ struct phy_device *phydev; + struct phy_device *phydev;
+ char bus_id[MII_BUS_ID_SIZE + 3];
+ int err; + int err;
+ +
+ mii_bus = mdiobus_alloc(); + mii_bus = mdiobus_alloc();
@ -201,25 +232,19 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
+ goto err_out_mdiobus_irq; + goto err_out_mdiobus_irq;
+ } + }
+ +
+ phydev = bp->mii_bus->phy_map[bp->phy_addr]; + snprintf(bus_id, sizeof(bus_id), PHY_ID_FMT, mii_bus->id, bp->phy_addr);
+ if (!phydev) {
+ dev_err(sdev->dev, "could not find PHY at %i\n", bp->phy_addr);
+ err = -ENODEV;
+ goto err_out_mdiobus_unregister;
+ }
+ +
+ err = phy_connect_direct(bp->dev, phydev, &b44_adjust_link, + phydev = phy_connect(bp->dev, bus_id, &b44_adjust_link,
+ PHY_INTERFACE_MODE_MII); + PHY_INTERFACE_MODE_MII);
+ if (err < 0) { + if (IS_ERR(phydev)) {
+ dev_err(sdev->dev, "could not attach PHY at %i\n", + dev_err(sdev->dev, "could not attach PHY at %i\n",
+ bp->phy_addr); + bp->phy_addr);
+ err = PTR_ERR(phydev);
+ goto err_out_mdiobus_unregister; + goto err_out_mdiobus_unregister;
+ } + }
+ +
+ /* mask with MAC supported features */ + /* mask with MAC supported features */
+ phydev->supported &= (SUPPORTED_10baseT_Half | + phydev->supported &= (SUPPORTED_100baseT_Half |
+ SUPPORTED_10baseT_Full |
+ SUPPORTED_100baseT_Half |
+ SUPPORTED_100baseT_Full | + SUPPORTED_100baseT_Full |
+ SUPPORTED_Autoneg | + SUPPORTED_Autoneg |
+ SUPPORTED_MII); + SUPPORTED_MII);
@ -227,7 +252,6 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
+ +
+ bp->phydev = phydev; + bp->phydev = phydev;
+ bp->old_link = 0; + bp->old_link = 0;
+ bp->old_duplex = -1;
+ bp->phy_addr = phydev->addr; + bp->phy_addr = phydev->addr;
+ +
+ dev_info(sdev->dev, "attached PHY driver [%s] (mii_bus:phy_addr=%s)\n", + dev_info(sdev->dev, "attached PHY driver [%s] (mii_bus:phy_addr=%s)\n",
@ -261,9 +285,9 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
static int b44_init_one(struct ssb_device *sdev, static int b44_init_one(struct ssb_device *sdev,
const struct ssb_device_id *ent) const struct ssb_device_id *ent)
{ {
@@ -2246,10 +2408,20 @@ static int b44_init_one(struct ssb_devic @@ -2246,10 +2413,20 @@ static int b44_init_one(struct ssb_devic
if (b44_phy_reset(bp) < 0) if (b44_phy_reset(bp) < 0)
bp->phy_addr = B44_PHY_ADDR_NO_LOACL_PHY; bp->phy_addr = B44_PHY_ADDR_NO_LOCAL_PHY;
+ if (bp->flags & B44_FLAG_EXTERNAL_PHY) { + if (bp->flags & B44_FLAG_EXTERNAL_PHY) {
+ err = b44_register_phy_one(bp); + err = b44_register_phy_one(bp);
@ -282,7 +306,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
err_out_powerdown: err_out_powerdown:
ssb_bus_may_powerdown(sdev->bus); ssb_bus_may_powerdown(sdev->bus);
@@ -2263,8 +2435,11 @@ out: @@ -2263,8 +2440,11 @@ out:
static void b44_remove_one(struct ssb_device *sdev) static void b44_remove_one(struct ssb_device *sdev)
{ {
struct net_device *dev = ssb_get_drvdata(sdev); struct net_device *dev = ssb_get_drvdata(sdev);
@ -296,14 +320,13 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
free_netdev(dev); free_netdev(dev);
--- a/drivers/net/ethernet/broadcom/b44.h --- a/drivers/net/ethernet/broadcom/b44.h
+++ b/drivers/net/ethernet/broadcom/b44.h +++ b/drivers/net/ethernet/broadcom/b44.h
@@ -397,6 +397,10 @@ struct b44 { @@ -397,6 +397,9 @@ struct b44 {
u32 tx_pending; u32 tx_pending;
u8 phy_addr; u8 phy_addr;
u8 force_copybreak; u8 force_copybreak;
+ struct phy_device *phydev; + struct phy_device *phydev;
+ struct mii_bus *mii_bus; + struct mii_bus *mii_bus;
+ int old_link; + int old_link;
+ int old_duplex;
struct mii_if_info mii_if; struct mii_if_info mii_if;
}; };

View file

@ -1,20 +1,21 @@
From f6a8d917c3efcfb974097ef4b345e8cda5283bab Mon Sep 17 00:00:00 2001 From bea69c47f5b93b3142f8833f8a34b666d5d7d6a7 Mon Sep 17 00:00:00 2001
From: Hauke Mehrtens <hauke@hauke-m.de> From: Hauke Mehrtens <hauke@hauke-m.de>
Date: Sun, 6 Oct 2013 17:58:24 +0200 Date: Fri, 20 Dec 2013 02:16:11 +0100
Subject: [PATCH 7/9] b44: activate PHY when MAC is off Subject: [PATCH 206/208] b44: activate PHY when MAC is off
Without this patch we can not access the PHY when the MAC is switched Without this patch we can not access the PHY when the MAC is switched
off. This PHY access is needed to configure the switch, which is done off. This PHY access is needed to configure the switch, which is done
through PHY registers. through PHY registers.
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de> Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
--- ---
drivers/net/ethernet/broadcom/b44.c | 5 ++++- drivers/net/ethernet/broadcom/b44.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-) 1 file changed, 4 insertions(+), 1 deletion(-)
--- a/drivers/net/ethernet/broadcom/b44.c --- a/drivers/net/ethernet/broadcom/b44.c
+++ b/drivers/net/ethernet/broadcom/b44.c +++ b/drivers/net/ethernet/broadcom/b44.c
@@ -1358,7 +1358,10 @@ static void b44_halt(struct b44 *bp) @@ -1360,7 +1360,10 @@ static void b44_halt(struct b44 *bp)
bw32(bp, B44_MAC_CTRL, MAC_CTRL_PHY_PDOWN); bw32(bp, B44_MAC_CTRL, MAC_CTRL_PHY_PDOWN);
/* now reset the chip, but without enabling the MAC&PHY /* now reset the chip, but without enabling the MAC&PHY
* part of it. This has to be done _after_ we shut down the PHY */ * part of it. This has to be done _after_ we shut down the PHY */

View file

@ -0,0 +1,32 @@
From 656a7c2b1210deddf76444ecc76e058c0404ce80 Mon Sep 17 00:00:00 2001
From: Hauke Mehrtens <hauke@hauke-m.de>
Date: Fri, 20 Dec 2013 02:16:12 +0100
Subject: [PATCH 207/208] b44: do not set PHY address to 30 for every ext PHY
b44_phy_reset() will fail for an external PHY and only work with the
internal PHY, this was an old workaround when the detection of an
external switch based on the PHY address failed and it is not needed
any more.
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
---
drivers/net/ethernet/broadcom/b44.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
--- a/drivers/net/ethernet/broadcom/b44.c
+++ b/drivers/net/ethernet/broadcom/b44.c
@@ -2413,8 +2413,11 @@ static int b44_init_one(struct ssb_devic
b44_chip_reset(bp, B44_CHIP_RESET_FULL);
/* do a phy reset to test if there is an active phy */
- if (b44_phy_reset(bp) < 0)
- bp->phy_addr = B44_PHY_ADDR_NO_LOCAL_PHY;
+ err = b44_phy_reset(bp);
+ if (err < 0) {
+ dev_err(sdev->dev, "phy reset failed\n");
+ goto err_out_unregister_netdev;
+ }
if (bp->flags & B44_FLAG_EXTERNAL_PHY) {
err = b44_register_phy_one(bp);

View file

@ -1,25 +0,0 @@
From c2ecc401a08f0bda3b2483b93989d9792cadf6b2 Mon Sep 17 00:00:00 2001
From: Hauke Mehrtens <hauke@hauke-m.de>
Date: Mon, 21 Oct 2013 20:30:04 +0200
Subject: [PATCH 8/9] b44: do not set phy addr to 30 for every ext phy
---
drivers/net/ethernet/broadcom/b44.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
--- a/drivers/net/ethernet/broadcom/b44.c
+++ b/drivers/net/ethernet/broadcom/b44.c
@@ -2408,8 +2408,11 @@ static int b44_init_one(struct ssb_devic
b44_chip_reset(bp, B44_CHIP_RESET_FULL);
/* do a phy reset to test if there is an active phy */
- if (b44_phy_reset(bp) < 0)
- bp->phy_addr = B44_PHY_ADDR_NO_LOACL_PHY;
+ err = b44_phy_reset(bp);
+ if (err < 0) {
+ dev_err(sdev->dev, "phy reset failed\n");
+ goto err_out_unregister_netdev;
+ }
if (bp->flags & B44_FLAG_EXTERNAL_PHY) {
err = b44_register_phy_one(bp);

View file

@ -1,43 +0,0 @@
From 1a900b17b34ddca0336c739a2836bcb7f8aad5a8 Mon Sep 17 00:00:00 2001
From: Hauke Mehrtens <hauke@hauke-m.de>
Date: Fri, 25 Oct 2013 00:03:33 +0200
Subject: [PATCH 9/9] b44: add dummy phy device if we do not find any
---
drivers/net/ethernet/broadcom/b44.c | 25 +++++++++++++++++++++----
1 file changed, 21 insertions(+), 4 deletions(-)
--- a/drivers/net/ethernet/broadcom/b44.c
+++ b/drivers/net/ethernet/broadcom/b44.c
@@ -2222,6 +2222,7 @@ static int b44_register_phy_one(struct b
struct ssb_device *sdev = bp->sdev;
struct phy_device *phydev;
int err;
+ struct phy_c45_device_ids c45_ids = {0};
mii_bus = mdiobus_alloc();
if (!mii_bus) {
@@ -2256,9 +2257,20 @@ static int b44_register_phy_one(struct b
phydev = bp->mii_bus->phy_map[bp->phy_addr];
if (!phydev) {
- dev_err(sdev->dev, "could not find PHY at %i\n", bp->phy_addr);
- err = -ENODEV;
- goto err_out_mdiobus_unregister;
+ dev_info(sdev->dev, "could not find PHY at %i, create dummy one\n",
+ bp->phy_addr);
+
+ phydev = phy_device_create(bp->mii_bus, bp->phy_addr, 0x0, false, &c45_ids);
+ if (IS_ERR(phydev)) {
+ err = PTR_ERR(phydev);
+ dev_err(sdev->dev, "Can not create dummy PHY\n");
+ goto err_out_mdiobus_unregister;
+ }
+ err = phy_device_register(phydev);
+ if (err) {
+ dev_err(sdev->dev, "failed to register MII bus\n");
+ goto err_out_mdiobus_unregister;
+ }
}
err = phy_connect_direct(bp->dev, phydev, &b44_adjust_link,

View file

@ -0,0 +1,97 @@
From b04138b335203b79ffe1b14750fa245a4dab7191 Mon Sep 17 00:00:00 2001
From: Hauke Mehrtens <hauke@hauke-m.de>
Date: Fri, 20 Dec 2013 02:16:13 +0100
Subject: [PATCH 208/208] b44: use fixed PHY device if we do not find any
The ADM6996L switch and some Broadcom switches with two MII interfaces
like the BCM5325F connected to two MACs on the SoC, used on some
routers do not return a valid value when reading the PHY id register
and Linux thinks there is no PHY at all, but that is wrong.
This patch registers a fixed phy in the arch code and then searches it
when there is no other phy in the Ethernet driver code.
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
---
arch/mips/bcm47xx/setup.c | 10 ++++++++++
drivers/net/ethernet/broadcom/b44.c | 16 +++++++++++++++-
drivers/net/ethernet/broadcom/b44.h | 3 +++
3 files changed, 28 insertions(+), 1 deletion(-)
--- a/arch/mips/bcm47xx/setup.c
+++ b/arch/mips/bcm47xx/setup.c
@@ -28,6 +28,9 @@
#include <linux/export.h>
#include <linux/types.h>
+#include <linux/ethtool.h>
+#include <linux/phy.h>
+#include <linux/phy_fixed.h>
#include <linux/ssb/ssb.h>
#include <linux/ssb/ssb_embedded.h>
#include <linux/bcma/bcma_soc.h>
@@ -239,6 +242,12 @@ void __init plat_mem_setup(void)
mips_set_machine_name(bcm47xx_board_get_name());
}
+static struct fixed_phy_status bcm47xx_fixed_phy_status __initdata = {
+ .link = 1,
+ .speed = SPEED_100,
+ .duplex = DUPLEX_FULL,
+};
+
static int __init bcm47xx_register_bus_complete(void)
{
switch (bcm47xx_bus_type) {
@@ -253,6 +262,7 @@ static int __init bcm47xx_register_bus_c
break;
#endif
}
+ fixed_phy_add(PHY_POLL, 0, &bcm47xx_fixed_phy_status);
return 0;
}
device_initcall(bcm47xx_register_bus_complete);
--- a/drivers/net/ethernet/broadcom/b44.c
+++ b/drivers/net/ethernet/broadcom/b44.c
@@ -2233,6 +2233,7 @@ static int b44_register_phy_one(struct b
struct ssb_device *sdev = bp->sdev;
struct phy_device *phydev;
char bus_id[MII_BUS_ID_SIZE + 3];
+ struct ssb_sprom *sprom = &sdev->bus->sprom;
int err;
mii_bus = mdiobus_alloc();
@@ -2266,7 +2267,20 @@ static int b44_register_phy_one(struct b
goto err_out_mdiobus_irq;
}
- snprintf(bus_id, sizeof(bus_id), PHY_ID_FMT, mii_bus->id, bp->phy_addr);
+ if (!bp->mii_bus->phy_map[bp->phy_addr] &&
+ (sprom->boardflags_lo & (B44_BOARDFLAG_ROBO | B44_BOARDFLAG_ADM))) {
+
+ dev_info(sdev->dev,
+ "could not find PHY at %i, use fixed one\n",
+ bp->phy_addr);
+
+ bp->phy_addr = 0;
+ snprintf(bus_id, sizeof(bus_id), PHY_ID_FMT, "fixed-0",
+ bp->phy_addr);
+ } else {
+ snprintf(bus_id, sizeof(bus_id), PHY_ID_FMT, mii_bus->id,
+ bp->phy_addr);
+ }
phydev = phy_connect(bp->dev, bus_id, &b44_adjust_link,
PHY_INTERFACE_MODE_MII);
--- a/drivers/net/ethernet/broadcom/b44.h
+++ b/drivers/net/ethernet/broadcom/b44.h
@@ -345,6 +345,9 @@ B44_STAT_REG_DECLARE
struct u64_stats_sync syncp;
};
+#define B44_BOARDFLAG_ROBO 0x0010 /* Board has robo switch */
+#define B44_BOARDFLAG_ADM 0x0080 /* Board has ADMtek switch */
+
struct ssb_device;
struct b44 {

View file

@ -1,12 +1,12 @@
From b52546f8af54b78050f84ab031ad1aaf6507ed95 Mon Sep 17 00:00:00 2001 From b36f694256f41bc71571f467646d015dda128d14 Mon Sep 17 00:00:00 2001
From: Hauke Mehrtens <hauke@hauke-m.de> From: Hauke Mehrtens <hauke@hauke-m.de>
Date: Sat, 9 Nov 2013 17:03:59 +0100 Date: Sat, 9 Nov 2013 17:03:59 +0100
Subject: [PATCH 10/10] b44: register adm switch Subject: [PATCH 210/210] b44: register adm switch
--- ---
drivers/net/ethernet/broadcom/b44.c | 64 ++++++++++++++++++++++++++++++++++- drivers/net/ethernet/broadcom/b44.c | 57 +++++++++++++++++++++++++++++++++++
drivers/net/ethernet/broadcom/b44.h | 3 ++ drivers/net/ethernet/broadcom/b44.h | 3 ++
2 files changed, 66 insertions(+), 1 deletion(-) 2 files changed, 60 insertions(+)
--- a/drivers/net/ethernet/broadcom/b44.c --- a/drivers/net/ethernet/broadcom/b44.c
+++ b/drivers/net/ethernet/broadcom/b44.c +++ b/drivers/net/ethernet/broadcom/b44.c
@ -19,8 +19,8 @@ Subject: [PATCH 10/10] b44: register adm switch
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/io.h> #include <asm/io.h>
@@ -2216,6 +2218,58 @@ static void b44_adjust_link(struct net_d @@ -2227,6 +2229,58 @@ static void b44_adjust_link(struct net_d
phy_print_status(phydev); }
} }
+#ifdef CONFIG_BCM47XX +#ifdef CONFIG_BCM47XX
@ -78,42 +78,21 @@ Subject: [PATCH 10/10] b44: register adm switch
static int b44_register_phy_one(struct b44 *bp) static int b44_register_phy_one(struct b44 *bp)
{ {
struct mii_bus *mii_bus; struct mii_bus *mii_bus;
@@ -2223,6 +2277,7 @@ static int b44_register_phy_one(struct b @@ -2270,6 +2324,9 @@ static int b44_register_phy_one(struct b
struct phy_device *phydev; if (!bp->mii_bus->phy_map[bp->phy_addr] &&
int err; (sprom->boardflags_lo & (B44_BOARDFLAG_ROBO | B44_BOARDFLAG_ADM))) {
struct phy_c45_device_ids c45_ids = {0};
+ struct ssb_sprom *sprom = &sdev->bus->sprom;
mii_bus = mdiobus_alloc();
if (!mii_bus) {
@@ -2256,7 +2311,11 @@ static int b44_register_phy_one(struct b
}
phydev = bp->mii_bus->phy_map[bp->phy_addr];
- if (!phydev) {
+ if (!phydev &&
+ (sprom->boardflags_lo & (B44_BOARDFLAG_ROBO | B44_BOARDFLAG_ADM))) {
+ if (sprom->boardflags_lo & B44_BOARDFLAG_ADM) + if (sprom->boardflags_lo & B44_BOARDFLAG_ADM)
+ b44_register_adm_switch(bp); + b44_register_adm_switch(bp);
+ +
dev_info(sdev->dev, "could not find PHY at %i, create dummy one\n", dev_info(sdev->dev,
"could not find PHY at %i, use fixed one\n",
bp->phy_addr); bp->phy_addr);
--- a/drivers/net/ethernet/broadcom/b44.h --- a/drivers/net/ethernet/broadcom/b44.h
+++ b/drivers/net/ethernet/broadcom/b44.h +++ b/drivers/net/ethernet/broadcom/b44.h
@@ -345,6 +345,9 @@ B44_STAT_REG_DECLARE @@ -404,6 +404,9 @@ struct b44 {
struct u64_stats_sync syncp; struct mii_bus *mii_bus;
};
+#define B44_BOARDFLAG_ROBO 0x0010 /* Board has robo switch or core */
+#define B44_BOARDFLAG_ADM 0x0080 /* Board has ADMtek switch */
+
struct ssb_device;
struct b44 {
@@ -402,6 +405,9 @@ struct b44 {
int old_link; int old_link;
int old_duplex;
struct mii_if_info mii_if; struct mii_if_info mii_if;
+ +
+ /* platform device for associated switch */ + /* platform device for associated switch */

View file

@ -12,14 +12,14 @@
+ +
+ /* Toshiba WRC-1000, Siemens SE505 v1, Askey RT-210W, RT-220W */ + /* Toshiba WRC-1000, Siemens SE505 v1, Askey RT-210W, RT-220W */
+ if (sdev->bus->sprom.board_num == 100) { + if (sdev->bus->sprom.board_num == 100) {
+ bp->phy_addr = B44_PHY_ADDR_NO_LOACL_PHY; + bp->phy_addr = B44_PHY_ADDR_NO_LOCAL_PHY;
+ } else { + } else {
+ /* WL-HDD */ + /* WL-HDD */
+ if (bcm47xx_nvram_getenv("hardware_version", buf, sizeof(buf)) >= 0 && + if (bcm47xx_nvram_getenv("hardware_version", buf, sizeof(buf)) >= 0 &&
+ !strncmp(buf, "WL300-", strlen("WL300-"))) { + !strncmp(buf, "WL300-", strlen("WL300-"))) {
+ if (sdev->bus->sprom.et0phyaddr == 0 && + if (sdev->bus->sprom.et0phyaddr == 0 &&
+ sdev->bus->sprom.et1phyaddr == 1) + sdev->bus->sprom.et1phyaddr == 1)
+ bp->phy_addr = B44_PHY_ADDR_NO_LOACL_PHY; + bp->phy_addr = B44_PHY_ADDR_NO_LOCAL_PHY;
+ } + }
+ } + }
+ return; + return;
@ -43,7 +43,7 @@
if (bp->flags & B44_FLAG_EXTERNAL_PHY) if (bp->flags & B44_FLAG_EXTERNAL_PHY)
return 0; return 0;
@@ -2160,6 +2185,8 @@ static int b44_get_invariants(struct b44 @@ -2162,6 +2187,8 @@ static int b44_get_invariants(struct b44
* valid PHY address. */ * valid PHY address. */
bp->phy_addr &= 0x1F; bp->phy_addr &= 0x1F;

View file

@ -1,6 +1,6 @@
--- a/arch/mips/bcm47xx/setup.c --- a/arch/mips/bcm47xx/setup.c
+++ b/arch/mips/bcm47xx/setup.c +++ b/arch/mips/bcm47xx/setup.c
@@ -31,6 +31,7 @@ @@ -34,6 +34,7 @@
#include <linux/ssb/ssb.h> #include <linux/ssb/ssb.h>
#include <linux/ssb/ssb_embedded.h> #include <linux/ssb/ssb_embedded.h>
#include <linux/bcma/bcma_soc.h> #include <linux/bcma/bcma_soc.h>
@ -8,9 +8,9 @@
#include <asm/bootinfo.h> #include <asm/bootinfo.h>
#include <asm/prom.h> #include <asm/prom.h>
#include <asm/reboot.h> #include <asm/reboot.h>
@@ -239,6 +240,33 @@ void __init plat_mem_setup(void) @@ -248,6 +249,33 @@ static struct fixed_phy_status bcm47xx_f
mips_set_machine_name(bcm47xx_board_get_name()); .duplex = DUPLEX_FULL,
} };
+static struct gpio_wdt_platform_data gpio_wdt_data; +static struct gpio_wdt_platform_data gpio_wdt_data;
+ +
@ -42,10 +42,10 @@
static int __init bcm47xx_register_bus_complete(void) static int __init bcm47xx_register_bus_complete(void)
{ {
switch (bcm47xx_bus_type) { switch (bcm47xx_bus_type) {
@@ -253,6 +281,8 @@ static int __init bcm47xx_register_bus_c @@ -263,6 +291,8 @@ static int __init bcm47xx_register_bus_c
break;
#endif #endif
} }
fixed_phy_add(PHY_POLL, 0, &bcm47xx_fixed_phy_status);
+ bcm47xx_register_gpio_watchdog(); + bcm47xx_register_gpio_watchdog();
+ +
return 0; return 0;

View file

@ -1,6 +1,6 @@
--- a/arch/mips/bcm47xx/setup.c --- a/arch/mips/bcm47xx/setup.c
+++ b/arch/mips/bcm47xx/setup.c +++ b/arch/mips/bcm47xx/setup.c
@@ -122,6 +122,10 @@ static int bcm47xx_get_invariants(struct @@ -125,6 +125,10 @@ static int bcm47xx_get_invariants(struct
if (bcm47xx_nvram_getenv("cardbus", buf, sizeof(buf)) >= 0) if (bcm47xx_nvram_getenv("cardbus", buf, sizeof(buf)) >= 0)
iv->has_cardbus_slot = !!simple_strtoul(buf, NULL, 10); iv->has_cardbus_slot = !!simple_strtoul(buf, NULL, 10);