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>
This commit is contained in:
Olof Johansson 2007-11-28 20:58:25 -06:00 committed by David S. Miller
parent 8304b633c5
commit b0cd2f9016

View file

@ -874,6 +874,24 @@ static irqreturn_t pasemi_mac_tx_intr(int irq, void *data)
return IRQ_HANDLED; 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) static void pasemi_adjust_link(struct net_device *dev)
{ {
struct pasemi_mac *mac = netdev_priv(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); printk(KERN_INFO "%s: Link is down.\n", dev->name);
netif_carrier_off(dev); netif_carrier_off(dev);
pasemi_mac_intf_disable(mac);
mac->link = 0; mac->link = 0;
return; return;
} else } else {
pasemi_mac_intf_enable(mac);
netif_carrier_on(dev); netif_carrier_on(dev);
}
flags = read_mac_reg(mac, PAS_MAC_CFG_PCFG); flags = read_mac_reg(mac, PAS_MAC_CFG_PCFG);
new_flags = flags & ~(PAS_MAC_CFG_PCFG_HD | PAS_MAC_CFG_PCFG_SPD_M | 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_rx_intr(mac);
pasemi_mac_restart_tx_intr(mac); pasemi_mac_restart_tx_intr(mac);
flags = PAS_MAC_CFG_PCFG_S1 | PAS_MAC_CFG_PCFG_PE | flags = PAS_MAC_CFG_PCFG_S1 | PAS_MAC_CFG_PCFG_PR | PAS_MAC_CFG_PCFG_CE;
PAS_MAC_CFG_PCFG_PR | PAS_MAC_CFG_PCFG_CE;
if (mac->type == MAC_TYPE_GMAC) if (mac->type == MAC_TYPE_GMAC)
flags |= PAS_MAC_CFG_PCFG_TSR_1G | PAS_MAC_CFG_PCFG_SPD_1G; 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); write_mac_reg(mac, PAS_MAC_CFG_PCFG, flags);
ret = pasemi_mac_phy_init(dev); ret = pasemi_mac_phy_init(dev);
/* Warn for missing PHY on SGMII (1Gig) ports. if (ret) {
*/ /* Since we won't get link notification, just enable RX */
if (ret && mac->type == MAC_TYPE_GMAC) { pasemi_mac_intf_enable(mac);
dev_warn(&mac->pdev->dev, "PHY init failed: %d.\n", ret); if (mac->type == MAC_TYPE_GMAC) {
dev_warn(&mac->pdev->dev, "Defaulting to 1Gbit full duplex\n"); /* 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); netif_start_queue(dev);