提交 ae54496f 编写于 作者: E Emil Tantilov 提交者: Jeff Kirsher

ixgb: Don't check for vlan group on transmit

Based on a patch from Jesse Gross.

Enable vlan tag insertion even when vlan group is not configured.

For ixgb HW both CTRL0.VME and VLE bit in the Tx descriptor need to be set
in order to enable HW acceleration.

Introduced separate functions for enabling/disabling of vlan tag stripping
similar to ixgbe.

CC: Jesse Gross <jesse@nicira.com>
Signed-off-by: NEmil Tantilov <emil.s.tantilov@intel.com>
Tested-by: NJeff Pieper <jeffrey.e.pieper@intel.com>
Signed-off-by: NJeff Kirsher <jeffrey.t.kirsher@intel.com>
上级 66744500
...@@ -98,6 +98,8 @@ static void ixgb_alloc_rx_buffers(struct ixgb_adapter *, int); ...@@ -98,6 +98,8 @@ static void ixgb_alloc_rx_buffers(struct ixgb_adapter *, int);
static void ixgb_tx_timeout(struct net_device *dev); static void ixgb_tx_timeout(struct net_device *dev);
static void ixgb_tx_timeout_task(struct work_struct *work); static void ixgb_tx_timeout_task(struct work_struct *work);
static void ixgb_vlan_strip_enable(struct ixgb_adapter *adapter);
static void ixgb_vlan_strip_disable(struct ixgb_adapter *adapter);
static void ixgb_vlan_rx_register(struct net_device *netdev, static void ixgb_vlan_rx_register(struct net_device *netdev,
struct vlan_group *grp); struct vlan_group *grp);
static void ixgb_vlan_rx_add_vid(struct net_device *netdev, u16 vid); static void ixgb_vlan_rx_add_vid(struct net_device *netdev, u16 vid);
...@@ -1076,6 +1078,8 @@ ixgb_set_multi(struct net_device *netdev) ...@@ -1076,6 +1078,8 @@ ixgb_set_multi(struct net_device *netdev)
if (netdev->flags & IFF_PROMISC) { if (netdev->flags & IFF_PROMISC) {
rctl |= (IXGB_RCTL_UPE | IXGB_RCTL_MPE); rctl |= (IXGB_RCTL_UPE | IXGB_RCTL_MPE);
/* disable VLAN filtering */
rctl &= ~IXGB_RCTL_CFIEN;
rctl &= ~IXGB_RCTL_VFE; rctl &= ~IXGB_RCTL_VFE;
} else { } else {
if (netdev->flags & IFF_ALLMULTI) { if (netdev->flags & IFF_ALLMULTI) {
...@@ -1084,7 +1088,9 @@ ixgb_set_multi(struct net_device *netdev) ...@@ -1084,7 +1088,9 @@ ixgb_set_multi(struct net_device *netdev)
} else { } else {
rctl &= ~(IXGB_RCTL_UPE | IXGB_RCTL_MPE); rctl &= ~(IXGB_RCTL_UPE | IXGB_RCTL_MPE);
} }
/* enable VLAN filtering */
rctl |= IXGB_RCTL_VFE; rctl |= IXGB_RCTL_VFE;
rctl &= ~IXGB_RCTL_CFIEN;
} }
if (netdev_mc_count(netdev) > IXGB_MAX_NUM_MULTICAST_ADDRESSES) { if (netdev_mc_count(netdev) > IXGB_MAX_NUM_MULTICAST_ADDRESSES) {
...@@ -1103,6 +1109,12 @@ ixgb_set_multi(struct net_device *netdev) ...@@ -1103,6 +1109,12 @@ ixgb_set_multi(struct net_device *netdev)
ixgb_mc_addr_list_update(hw, mta, netdev_mc_count(netdev), 0); ixgb_mc_addr_list_update(hw, mta, netdev_mc_count(netdev), 0);
} }
if (netdev->features & NETIF_F_HW_VLAN_RX)
ixgb_vlan_strip_enable(adapter);
else
ixgb_vlan_strip_disable(adapter);
} }
/** /**
...@@ -2150,33 +2162,30 @@ static void ...@@ -2150,33 +2162,30 @@ static void
ixgb_vlan_rx_register(struct net_device *netdev, struct vlan_group *grp) ixgb_vlan_rx_register(struct net_device *netdev, struct vlan_group *grp)
{ {
struct ixgb_adapter *adapter = netdev_priv(netdev); struct ixgb_adapter *adapter = netdev_priv(netdev);
u32 ctrl, rctl;
ixgb_irq_disable(adapter);
adapter->vlgrp = grp; adapter->vlgrp = grp;
}
if (grp) { static void
/* enable VLAN tag insert/strip */ ixgb_vlan_strip_enable(struct ixgb_adapter *adapter)
ctrl = IXGB_READ_REG(&adapter->hw, CTRL0); {
ctrl |= IXGB_CTRL0_VME; u32 ctrl;
IXGB_WRITE_REG(&adapter->hw, CTRL0, ctrl);
/* enable VLAN receive filtering */
rctl = IXGB_READ_REG(&adapter->hw, RCTL); /* enable VLAN tag insert/strip */
rctl &= ~IXGB_RCTL_CFIEN; ctrl = IXGB_READ_REG(&adapter->hw, CTRL0);
IXGB_WRITE_REG(&adapter->hw, RCTL, rctl); ctrl |= IXGB_CTRL0_VME;
} else { IXGB_WRITE_REG(&adapter->hw, CTRL0, ctrl);
/* disable VLAN tag insert/strip */ }
ctrl = IXGB_READ_REG(&adapter->hw, CTRL0); static void
ctrl &= ~IXGB_CTRL0_VME; ixgb_vlan_strip_disable(struct ixgb_adapter *adapter)
IXGB_WRITE_REG(&adapter->hw, CTRL0, ctrl); {
} u32 ctrl;
/* don't enable interrupts unless we are UP */ /* disable VLAN tag insert/strip */
if (adapter->netdev->flags & IFF_UP) ctrl = IXGB_READ_REG(&adapter->hw, CTRL0);
ixgb_irq_enable(adapter); ctrl &= ~IXGB_CTRL0_VME;
IXGB_WRITE_REG(&adapter->hw, CTRL0, ctrl);
} }
static void static void
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册