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: Ken Kawasaki <ken_kawasaki@spring.nifty.jp> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
f249fb7830
commit
e445bb4ed6
@@ -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)
|
|||||||
/* 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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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);
|
||||||
|
Reference in New Issue
Block a user