diff options
author | Matt Carlson <mcarlson@broadcom.com> | 2011-02-15 12:51:10 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-02-17 14:11:15 -0800 |
commit | ed199facd070f8e551dc16a2ae1baa01d8d28ed4 (patch) | |
tree | 79b67ec787dadc8fc88b1c8ec9273979b189decd /drivers/net/tg3.c | |
parent | 0d672e9f8ac320c6d1ea9103db6df7f99ea20361 (diff) | |
download | linux-3.10-ed199facd070f8e551dc16a2ae1baa01d8d28ed4.tar.gz linux-3.10-ed199facd070f8e551dc16a2ae1baa01d8d28ed4.tar.bz2 linux-3.10-ed199facd070f8e551dc16a2ae1baa01d8d28ed4.zip |
tg3: Restrict phy ioctl access
If management firmware is present and the device is down, the firmware
will assume control of the phy. If a phy access were allowed from the
host, it will collide with firmware phy accesses, resulting in
unpredictable behavior. This patch fixes the problem by disallowing phy
accesses during the problematic condition.
Signed-off-by: Matt Carlson <mcarlson@broadcom.com>
Reviewed-by: Michael Chan <mchan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/tg3.c')
-rw-r--r-- | drivers/net/tg3.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index 93b32d36661..06c0e503365 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c @@ -11158,7 +11158,9 @@ static int tg3_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) if (tp->phy_flags & TG3_PHYFLG_PHY_SERDES) break; /* We have no PHY */ - if (tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER) + if ((tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER) || + ((tp->tg3_flags & TG3_FLAG_ENABLE_ASF) && + !netif_running(dev))) return -EAGAIN; spin_lock_bh(&tp->lock); @@ -11174,7 +11176,9 @@ static int tg3_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) if (tp->phy_flags & TG3_PHYFLG_PHY_SERDES) break; /* We have no PHY */ - if (tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER) + if ((tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER) || + ((tp->tg3_flags & TG3_FLAG_ENABLE_ASF) && + !netif_running(dev))) return -EAGAIN; spin_lock_bh(&tp->lock); |