Commit 4997bf53 authored by Scott Feldman's avatar Scott Feldman Committed by Jeff Garzik

[PATCH] full stop/start on ethtool set speed/duplex/autoneg

* Cleanup ethtool/mii_ioctl sets of speed/duplex/autoneg by
  stop/set/start driver to ensure sets stick.  Must hold
  xmit_lock around stop/start.
parent 3b9fb4e8
...@@ -1010,7 +1010,11 @@ e100_open(struct net_device *dev) ...@@ -1010,7 +1010,11 @@ e100_open(struct net_device *dev)
mod_timer(&(bdp->watchdog_timer), jiffies + (2 * HZ)); mod_timer(&(bdp->watchdog_timer), jiffies + (2 * HZ));
netif_start_queue(dev); if (dev->flags & IFF_UP)
/* Otherwise process may sleep forever */
netif_wake_queue(dev);
else
netif_start_queue(dev);
e100_start_ru(bdp); e100_start_ru(bdp);
if ((rc = request_irq(dev->irq, &e100intr, SA_SHIRQ, if ((rc = request_irq(dev->irq, &e100intr, SA_SHIRQ,
...@@ -1072,7 +1076,8 @@ e100_xmit_frame(struct sk_buff *skb, struct net_device *dev) ...@@ -1072,7 +1076,8 @@ e100_xmit_frame(struct sk_buff *skb, struct net_device *dev)
goto exit2; goto exit2;
} }
if (!TCBS_AVAIL(bdp->tcb_pool) || /* tcb list may be empty temporarily during releasing resources */
if (!TCBS_AVAIL(bdp->tcb_pool) || (bdp->tcb_phys == 0) ||
(bdp->non_tx_command_state != E100_NON_TX_IDLE)) { (bdp->non_tx_command_state != E100_NON_TX_IDLE)) {
notify_stop = true; notify_stop = true;
rc = 1; rc = 1;
...@@ -3430,7 +3435,13 @@ e100_ethtool_set_settings(struct net_device *dev, struct ifreq *ifr) ...@@ -3430,7 +3435,13 @@ e100_ethtool_set_settings(struct net_device *dev, struct ifreq *ifr)
if ((ecmd.autoneg == AUTONEG_ENABLE) if ((ecmd.autoneg == AUTONEG_ENABLE)
&& (bdp->speed_duplex_caps & SUPPORTED_Autoneg)) { && (bdp->speed_duplex_caps & SUPPORTED_Autoneg)) {
bdp->params.e100_speed_duplex = E100_AUTONEG; bdp->params.e100_speed_duplex = E100_AUTONEG;
e100_set_speed_duplex(bdp); if (netif_running(dev)) {
spin_lock_bh(&dev->xmit_lock);
e100_close(dev);
spin_unlock_bh(&dev->xmit_lock);
e100_hw_init(bdp);
e100_open(dev);
}
} else { } else {
if (ecmd.speed == SPEED_10) { if (ecmd.speed == SPEED_10) {
if (ecmd.duplex == DUPLEX_HALF) { if (ecmd.duplex == DUPLEX_HALF) {
...@@ -3461,7 +3472,13 @@ e100_ethtool_set_settings(struct net_device *dev, struct ifreq *ifr) ...@@ -3461,7 +3472,13 @@ e100_ethtool_set_settings(struct net_device *dev, struct ifreq *ifr)
if (bdp->speed_duplex_caps & ethtool_new_speed_duplex) { if (bdp->speed_duplex_caps & ethtool_new_speed_duplex) {
bdp->params.e100_speed_duplex = bdp->params.e100_speed_duplex =
e100_new_speed_duplex; e100_new_speed_duplex;
e100_set_speed_duplex(bdp); if (netif_running(dev)) {
spin_lock_bh(&dev->xmit_lock);
e100_close(dev);
spin_unlock_bh(&dev->xmit_lock);
e100_hw_init(bdp);
e100_open(dev);
}
} else { } else {
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
...@@ -3563,7 +3580,13 @@ e100_ethtool_nway_rst(struct net_device *dev, struct ifreq *ifr) ...@@ -3563,7 +3580,13 @@ e100_ethtool_nway_rst(struct net_device *dev, struct ifreq *ifr)
if ((bdp->speed_duplex_caps & SUPPORTED_Autoneg) && if ((bdp->speed_duplex_caps & SUPPORTED_Autoneg) &&
(bdp->params.e100_speed_duplex == E100_AUTONEG)) { (bdp->params.e100_speed_duplex == E100_AUTONEG)) {
e100_set_speed_duplex(bdp); if (netif_running(dev)) {
spin_lock_bh(&dev->xmit_lock);
e100_close(dev);
spin_unlock_bh(&dev->xmit_lock);
e100_hw_init(bdp);
e100_open(dev);
}
} else { } else {
return -EFAULT; return -EFAULT;
} }
...@@ -4016,7 +4039,13 @@ e100_mii_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) ...@@ -4016,7 +4039,13 @@ e100_mii_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
bdp->params.e100_speed_duplex = E100_SPEED_10_FULL; bdp->params.e100_speed_duplex = E100_SPEED_10_FULL;
else else
bdp->params.e100_speed_duplex = E100_SPEED_10_HALF; bdp->params.e100_speed_duplex = E100_SPEED_10_HALF;
e100_set_speed_duplex(bdp); if (netif_running(dev)) {
spin_lock_bh(&dev->xmit_lock);
e100_close(dev);
spin_unlock_bh(&dev->xmit_lock);
e100_hw_init(bdp);
e100_open(dev);
}
} }
else else
/* Only allows changing speed/duplex */ /* Only allows changing speed/duplex */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment