diff options
| -rw-r--r-- | drivers/net/pcmcia/3c589_cs.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/drivers/net/pcmcia/3c589_cs.c b/drivers/net/pcmcia/3c589_cs.c index ec7cf5ac4f05..690b9c76d34e 100644 --- a/drivers/net/pcmcia/3c589_cs.c +++ b/drivers/net/pcmcia/3c589_cs.c | |||
| @@ -156,6 +156,7 @@ static struct net_device_stats *el3_get_stats(struct net_device *dev); | |||
| 156 | static int el3_rx(struct net_device *dev); | 156 | static int el3_rx(struct net_device *dev); |
| 157 | static int el3_close(struct net_device *dev); | 157 | static int el3_close(struct net_device *dev); |
| 158 | static void el3_tx_timeout(struct net_device *dev); | 158 | static void el3_tx_timeout(struct net_device *dev); |
| 159 | static void set_rx_mode(struct net_device *dev); | ||
| 159 | static void set_multicast_list(struct net_device *dev); | 160 | static void set_multicast_list(struct net_device *dev); |
| 160 | static const struct ethtool_ops netdev_ethtool_ops; | 161 | static const struct ethtool_ops netdev_ethtool_ops; |
| 161 | 162 | ||
| @@ -488,8 +489,7 @@ static void tc589_reset(struct net_device *dev) | |||
| 488 | /* Switch to register set 1 for normal use. */ | 489 | /* Switch to register set 1 for normal use. */ |
| 489 | EL3WINDOW(1); | 490 | EL3WINDOW(1); |
| 490 | 491 | ||
| 491 | /* Accept b-cast and phys addr only. */ | 492 | set_rx_mode(dev); |
| 492 | outw(SetRxFilter | RxStation | RxBroadcast, ioaddr + EL3_CMD); | ||
| 493 | outw(StatsEnable, ioaddr + EL3_CMD); /* Turn on statistics. */ | 493 | outw(StatsEnable, ioaddr + EL3_CMD); /* Turn on statistics. */ |
| 494 | outw(RxEnable, ioaddr + EL3_CMD); /* Enable the receiver. */ | 494 | outw(RxEnable, ioaddr + EL3_CMD); /* Enable the receiver. */ |
| 495 | outw(TxEnable, ioaddr + EL3_CMD); /* Enable transmitter. */ | 495 | outw(TxEnable, ioaddr + EL3_CMD); /* Enable transmitter. */ |
| @@ -700,7 +700,7 @@ static irqreturn_t el3_interrupt(int irq, void *dev_id) | |||
| 700 | if (fifo_diag & 0x2000) { | 700 | if (fifo_diag & 0x2000) { |
| 701 | /* Rx underrun */ | 701 | /* Rx underrun */ |
| 702 | tc589_wait_for_completion(dev, RxReset); | 702 | tc589_wait_for_completion(dev, RxReset); |
| 703 | set_multicast_list(dev); | 703 | set_rx_mode(dev); |
| 704 | outw(RxEnable, ioaddr + EL3_CMD); | 704 | outw(RxEnable, ioaddr + EL3_CMD); |
| 705 | } | 705 | } |
| 706 | outw(AckIntr | AdapterFailure, ioaddr + EL3_CMD); | 706 | outw(AckIntr | AdapterFailure, ioaddr + EL3_CMD); |
| @@ -905,14 +905,11 @@ static int el3_rx(struct net_device *dev) | |||
| 905 | return 0; | 905 | return 0; |
| 906 | } | 906 | } |
| 907 | 907 | ||
| 908 | static void set_multicast_list(struct net_device *dev) | 908 | static void set_rx_mode(struct net_device *dev) |
| 909 | { | 909 | { |
| 910 | struct el3_private *lp = netdev_priv(dev); | ||
| 911 | struct pcmcia_device *link = lp->p_dev; | ||
| 912 | unsigned int ioaddr = dev->base_addr; | 910 | unsigned int ioaddr = dev->base_addr; |
| 913 | u16 opts = SetRxFilter | RxStation | RxBroadcast; | 911 | u16 opts = SetRxFilter | RxStation | RxBroadcast; |
| 914 | 912 | ||
| 915 | if (!pcmcia_dev_present(link)) return; | ||
| 916 | if (dev->flags & IFF_PROMISC) | 913 | if (dev->flags & IFF_PROMISC) |
| 917 | opts |= RxMulticast | RxProm; | 914 | opts |= RxMulticast | RxProm; |
| 918 | else if (dev->mc_count || (dev->flags & IFF_ALLMULTI)) | 915 | else if (dev->mc_count || (dev->flags & IFF_ALLMULTI)) |
| @@ -920,6 +917,16 @@ static void set_multicast_list(struct net_device *dev) | |||
| 920 | outw(opts, ioaddr + EL3_CMD); | 917 | outw(opts, ioaddr + EL3_CMD); |
| 921 | } | 918 | } |
| 922 | 919 | ||
| 920 | static void set_multicast_list(struct net_device *dev) | ||
| 921 | { | ||
| 922 | struct el3_private *priv = netdev_priv(dev); | ||
| 923 | unsigned long flags; | ||
| 924 | |||
| 925 | spin_lock_irqsave(&priv->lock, flags); | ||
| 926 | set_rx_mode(dev); | ||
| 927 | spin_unlock_irqrestore(&priv->lock, flags); | ||
| 928 | } | ||
| 929 | |||
| 923 | static int el3_close(struct net_device *dev) | 930 | static int el3_close(struct net_device *dev) |
| 924 | { | 931 | { |
| 925 | struct el3_private *lp = netdev_priv(dev); | 932 | struct el3_private *lp = netdev_priv(dev); |
