Commit e445bb4e authored by Ken Kawasaki's avatar Ken Kawasaki Committed by David S. Miller

3c589_cs: re-initialize the multicast in the tc589_reset

3c589_cs:
re-initialize the multicast in the tc589_reset,
and spin_lock the set_multicast_list function.
Signed-off-by: default avatarKen Kawasaki <ken_kawasaki@spring.nifty.jp>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent f249fb78
...@@ -156,6 +156,7 @@ static struct net_device_stats *el3_get_stats(struct net_device *dev); ...@@ -156,6 +156,7 @@ static struct net_device_stats *el3_get_stats(struct net_device *dev);
static int el3_rx(struct net_device *dev); static int el3_rx(struct net_device *dev);
static int el3_close(struct net_device *dev); static int el3_close(struct net_device *dev);
static void el3_tx_timeout(struct net_device *dev); static void el3_tx_timeout(struct net_device *dev);
static void set_rx_mode(struct net_device *dev);
static void set_multicast_list(struct net_device *dev); static void set_multicast_list(struct net_device *dev);
static const struct ethtool_ops netdev_ethtool_ops; static const struct ethtool_ops netdev_ethtool_ops;
...@@ -488,8 +489,7 @@ static void tc589_reset(struct net_device *dev) ...@@ -488,8 +489,7 @@ static void tc589_reset(struct net_device *dev)
/* Switch to register set 1 for normal use. */ /* Switch to register set 1 for normal use. */
EL3WINDOW(1); EL3WINDOW(1);
/* Accept b-cast and phys addr only. */ set_rx_mode(dev);
outw(SetRxFilter | RxStation | RxBroadcast, ioaddr + EL3_CMD);
outw(StatsEnable, ioaddr + EL3_CMD); /* Turn on statistics. */ outw(StatsEnable, ioaddr + EL3_CMD); /* Turn on statistics. */
outw(RxEnable, ioaddr + EL3_CMD); /* Enable the receiver. */ outw(RxEnable, ioaddr + EL3_CMD); /* Enable the receiver. */
outw(TxEnable, ioaddr + EL3_CMD); /* Enable transmitter. */ outw(TxEnable, ioaddr + EL3_CMD); /* Enable transmitter. */
...@@ -700,7 +700,7 @@ static irqreturn_t el3_interrupt(int irq, void *dev_id) ...@@ -700,7 +700,7 @@ static irqreturn_t el3_interrupt(int irq, void *dev_id)
if (fifo_diag & 0x2000) { if (fifo_diag & 0x2000) {
/* Rx underrun */ /* Rx underrun */
tc589_wait_for_completion(dev, RxReset); tc589_wait_for_completion(dev, RxReset);
set_multicast_list(dev); set_rx_mode(dev);
outw(RxEnable, ioaddr + EL3_CMD); outw(RxEnable, ioaddr + EL3_CMD);
} }
outw(AckIntr | AdapterFailure, ioaddr + EL3_CMD); outw(AckIntr | AdapterFailure, ioaddr + EL3_CMD);
...@@ -905,14 +905,11 @@ static int el3_rx(struct net_device *dev) ...@@ -905,14 +905,11 @@ static int el3_rx(struct net_device *dev)
return 0; return 0;
} }
static void set_multicast_list(struct net_device *dev) static void set_rx_mode(struct net_device *dev)
{ {
struct el3_private *lp = netdev_priv(dev);
struct pcmcia_device *link = lp->p_dev;
unsigned int ioaddr = dev->base_addr; unsigned int ioaddr = dev->base_addr;
u16 opts = SetRxFilter | RxStation | RxBroadcast; u16 opts = SetRxFilter | RxStation | RxBroadcast;
if (!pcmcia_dev_present(link)) return;
if (dev->flags & IFF_PROMISC) if (dev->flags & IFF_PROMISC)
opts |= RxMulticast | RxProm; opts |= RxMulticast | RxProm;
else if (dev->mc_count || (dev->flags & IFF_ALLMULTI)) else if (dev->mc_count || (dev->flags & IFF_ALLMULTI))
...@@ -920,6 +917,16 @@ static void set_multicast_list(struct net_device *dev) ...@@ -920,6 +917,16 @@ static void set_multicast_list(struct net_device *dev)
outw(opts, ioaddr + EL3_CMD); outw(opts, ioaddr + EL3_CMD);
} }
static void set_multicast_list(struct net_device *dev)
{
struct el3_private *priv = netdev_priv(dev);
unsigned long flags;
spin_lock_irqsave(&priv->lock, flags);
set_rx_mode(dev);
spin_unlock_irqrestore(&priv->lock, flags);
}
static int el3_close(struct net_device *dev) static int el3_close(struct net_device *dev)
{ {
struct el3_private *lp = netdev_priv(dev); struct el3_private *lp = netdev_priv(dev);
......
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