From 7b332244a63dc1f408fd2ebb2636d58ac69a4916 Mon Sep 17 00:00:00 2001 From: Stephen Hemminger Date: Fri, 1 Jun 2007 09:43:59 -0700 Subject: 8139cp: fix VLAN unregistration The 8139cp driver did VLAN unregistration incorrectly. It disables VLAN completely when the first VID is unregistered. It should instead disable VLAN when the group is unregistered by calling cp_vlan_rx_register with a NULL grp. Signed-off-by: Stephen Hemminger Signed-off-by: Jeff Garzik --- drivers/net/8139cp.c | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) (limited to 'drivers') diff --git a/drivers/net/8139cp.c b/drivers/net/8139cp.c index e8c9f27817b..a804965e654 100644 --- a/drivers/net/8139cp.c +++ b/drivers/net/8139cp.c @@ -435,20 +435,12 @@ static void cp_vlan_rx_register(struct net_device *dev, struct vlan_group *grp) spin_lock_irqsave(&cp->lock, flags); cp->vlgrp = grp; - cp->cpcmd |= RxVlanOn; - cpw16(CpCmd, cp->cpcmd); - spin_unlock_irqrestore(&cp->lock, flags); -} - -static void cp_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) -{ - struct cp_private *cp = netdev_priv(dev); - unsigned long flags; + if (grp) + cp->cpcmd |= RxVlanOn; + else + cp->cpcmd &= ~RxVlanOn; - spin_lock_irqsave(&cp->lock, flags); - cp->cpcmd &= ~RxVlanOn; cpw16(CpCmd, cp->cpcmd); - vlan_group_set_device(cp->vlgrp, vid, NULL); spin_unlock_irqrestore(&cp->lock, flags); } #endif /* CP_VLAN_TAG_USED */ @@ -1944,7 +1936,6 @@ static int cp_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) #if CP_VLAN_TAG_USED dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; dev->vlan_rx_register = cp_vlan_rx_register; - dev->vlan_rx_kill_vid = cp_vlan_rx_kill_vid; #endif if (pci_using_dac) -- cgit v1.2.3