diff options
author | Olof Johansson <olof@lixom.net> | 2007-11-28 20:58:25 -0600 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-01-28 15:04:27 -0800 |
commit | b0cd2f9016f75eb8a9fdc45d32f9b41fb16d48c9 (patch) | |
tree | 16d46e44b7509b239ac3f3000e1b14c4dbebb6b8 /drivers/net | |
parent | 8304b633c5e8c9ba34d3cc7f24f52434d3a3b93b (diff) |
pasemi_mac: Don't enable RX/TX without a link (if possible)
pasemi_mac: Don't enable RX/TX without a link (if possible)
Don't enable RX/TX of packets until we have a link, since there's a chance
we'll just get RX frame errors, etc.
The case where we don't have a PHY we can't do much about: Just enable
it and deal with errors as they come in.
Signed-off-by: Olof Johansson <olof@lixom.net>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/pasemi_mac.c | 41 |
1 files changed, 33 insertions, 8 deletions
diff --git a/drivers/net/pasemi_mac.c b/drivers/net/pasemi_mac.c index 7345a81bb2c6..bb88a41b7591 100644 --- a/drivers/net/pasemi_mac.c +++ b/drivers/net/pasemi_mac.c @@ -874,6 +874,24 @@ static irqreturn_t pasemi_mac_tx_intr(int irq, void *data) return IRQ_HANDLED; } +static void pasemi_mac_intf_disable(struct pasemi_mac *mac) +{ + unsigned int flags; + + flags = read_mac_reg(mac, PAS_MAC_CFG_PCFG); + flags &= ~PAS_MAC_CFG_PCFG_PE; + write_mac_reg(mac, PAS_MAC_CFG_PCFG, flags); +} + +static void pasemi_mac_intf_enable(struct pasemi_mac *mac) +{ + unsigned int flags; + + flags = read_mac_reg(mac, PAS_MAC_CFG_PCFG); + flags |= PAS_MAC_CFG_PCFG_PE; + write_mac_reg(mac, PAS_MAC_CFG_PCFG, flags); +} + static void pasemi_adjust_link(struct net_device *dev) { struct pasemi_mac *mac = netdev_priv(dev); @@ -889,11 +907,14 @@ static void pasemi_adjust_link(struct net_device *dev) printk(KERN_INFO "%s: Link is down.\n", dev->name); netif_carrier_off(dev); + pasemi_mac_intf_disable(mac); mac->link = 0; return; - } else + } else { + pasemi_mac_intf_enable(mac); netif_carrier_on(dev); + } flags = read_mac_reg(mac, PAS_MAC_CFG_PCFG); new_flags = flags & ~(PAS_MAC_CFG_PCFG_HD | PAS_MAC_CFG_PCFG_SPD_M | @@ -1052,8 +1073,7 @@ static int pasemi_mac_open(struct net_device *dev) pasemi_mac_restart_rx_intr(mac); pasemi_mac_restart_tx_intr(mac); - flags = PAS_MAC_CFG_PCFG_S1 | PAS_MAC_CFG_PCFG_PE | - PAS_MAC_CFG_PCFG_PR | PAS_MAC_CFG_PCFG_CE; + flags = PAS_MAC_CFG_PCFG_S1 | PAS_MAC_CFG_PCFG_PR | PAS_MAC_CFG_PCFG_CE; if (mac->type == MAC_TYPE_GMAC) flags |= PAS_MAC_CFG_PCFG_TSR_1G | PAS_MAC_CFG_PCFG_SPD_1G; @@ -1064,11 +1084,16 @@ static int pasemi_mac_open(struct net_device *dev) write_mac_reg(mac, PAS_MAC_CFG_PCFG, flags); ret = pasemi_mac_phy_init(dev); - /* Warn for missing PHY on SGMII (1Gig) ports. - */ - if (ret && mac->type == MAC_TYPE_GMAC) { - dev_warn(&mac->pdev->dev, "PHY init failed: %d.\n", ret); - dev_warn(&mac->pdev->dev, "Defaulting to 1Gbit full duplex\n"); + if (ret) { + /* Since we won't get link notification, just enable RX */ + pasemi_mac_intf_enable(mac); + if (mac->type == MAC_TYPE_GMAC) { + /* Warn for missing PHY on SGMII (1Gig) ports */ + dev_warn(&mac->pdev->dev, + "PHY init failed: %d.\n", ret); + dev_warn(&mac->pdev->dev, + "Defaulting to 1Gbit full duplex\n"); + } } netif_start_queue(dev); |