diff options
Diffstat (limited to 'drivers/net/gianfar.c')
-rw-r--r-- | drivers/net/gianfar.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/drivers/net/gianfar.c b/drivers/net/gianfar.c index efcbeb6c867..acae2d8cd68 100644 --- a/drivers/net/gianfar.c +++ b/drivers/net/gianfar.c | |||
@@ -351,6 +351,9 @@ static int gfar_probe(struct of_device *ofdev, | |||
351 | /* Reset MAC layer */ | 351 | /* Reset MAC layer */ |
352 | gfar_write(&priv->regs->maccfg1, MACCFG1_SOFT_RESET); | 352 | gfar_write(&priv->regs->maccfg1, MACCFG1_SOFT_RESET); |
353 | 353 | ||
354 | /* We need to delay at least 3 TX clocks */ | ||
355 | udelay(2); | ||
356 | |||
354 | tempval = (MACCFG1_TX_FLOW | MACCFG1_RX_FLOW); | 357 | tempval = (MACCFG1_TX_FLOW | MACCFG1_RX_FLOW); |
355 | gfar_write(&priv->regs->maccfg1, tempval); | 358 | gfar_write(&priv->regs->maccfg1, tempval); |
356 | 359 | ||
@@ -1423,15 +1426,11 @@ static void gfar_vlan_rx_register(struct net_device *dev, | |||
1423 | { | 1426 | { |
1424 | struct gfar_private *priv = netdev_priv(dev); | 1427 | struct gfar_private *priv = netdev_priv(dev); |
1425 | unsigned long flags; | 1428 | unsigned long flags; |
1426 | struct vlan_group *old_grp; | ||
1427 | u32 tempval; | 1429 | u32 tempval; |
1428 | 1430 | ||
1429 | spin_lock_irqsave(&priv->rxlock, flags); | 1431 | spin_lock_irqsave(&priv->rxlock, flags); |
1430 | 1432 | ||
1431 | old_grp = priv->vlgrp; | 1433 | priv->vlgrp = grp; |
1432 | |||
1433 | if (old_grp == grp) | ||
1434 | return; | ||
1435 | 1434 | ||
1436 | if (grp) { | 1435 | if (grp) { |
1437 | /* Enable VLAN tag insertion */ | 1436 | /* Enable VLAN tag insertion */ |
@@ -1622,10 +1621,18 @@ static int gfar_clean_tx_ring(struct net_device *dev) | |||
1622 | static void gfar_schedule_cleanup(struct net_device *dev) | 1621 | static void gfar_schedule_cleanup(struct net_device *dev) |
1623 | { | 1622 | { |
1624 | struct gfar_private *priv = netdev_priv(dev); | 1623 | struct gfar_private *priv = netdev_priv(dev); |
1624 | unsigned long flags; | ||
1625 | |||
1626 | spin_lock_irqsave(&priv->txlock, flags); | ||
1627 | spin_lock(&priv->rxlock); | ||
1628 | |||
1625 | if (netif_rx_schedule_prep(&priv->napi)) { | 1629 | if (netif_rx_schedule_prep(&priv->napi)) { |
1626 | gfar_write(&priv->regs->imask, IMASK_RTX_DISABLED); | 1630 | gfar_write(&priv->regs->imask, IMASK_RTX_DISABLED); |
1627 | __netif_rx_schedule(&priv->napi); | 1631 | __netif_rx_schedule(&priv->napi); |
1628 | } | 1632 | } |
1633 | |||
1634 | spin_unlock(&priv->rxlock); | ||
1635 | spin_unlock_irqrestore(&priv->txlock, flags); | ||
1629 | } | 1636 | } |
1630 | 1637 | ||
1631 | /* Interrupt Handler for Transmit complete */ | 1638 | /* Interrupt Handler for Transmit complete */ |