diff options
author | Jiri Pirko <jpirko@redhat.com> | 2011-07-20 00:54:06 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-07-21 16:47:53 -0400 |
commit | 7033c4ad87c3cf1050eb8190c93f94f5c8b9fae9 (patch) | |
tree | 52a27177b7184fdc2b84ac02f9a31f8c7941e6f7 | |
parent | cec9c133631039f82e4a5ff3bf47b3eba14ff1aa (diff) |
nes: do vlan cleanup
- unify vlan and nonvlan rx path
- kill nesvnic->vlan_grp and nes_netdev_vlan_rx_register
- allow to turn on/off rx/tx vlan accel via ethtool (set_features)
Signed-off-by: Jiri Pirko <jpirko@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/infiniband/hw/nes/nes_hw.c | 19 | ||||
-rw-r--r-- | drivers/infiniband/hw/nes/nes_hw.h | 4 | ||||
-rw-r--r-- | drivers/infiniband/hw/nes/nes_nic.c | 50 |
3 files changed, 45 insertions, 28 deletions
diff --git a/drivers/infiniband/hw/nes/nes_hw.c b/drivers/infiniband/hw/nes/nes_hw.c index 96fa9a4cafdf..be36cbeae630 100644 --- a/drivers/infiniband/hw/nes/nes_hw.c +++ b/drivers/infiniband/hw/nes/nes_hw.c | |||
@@ -2917,24 +2917,19 @@ void nes_nic_ce_handler(struct nes_device *nesdev, struct nes_hw_nic_cq *cq) | |||
2917 | goto skip_rx_indicate0; | 2917 | goto skip_rx_indicate0; |
2918 | 2918 | ||
2919 | 2919 | ||
2920 | if ((cqe_misc & NES_NIC_CQE_TAG_VALID) && | 2920 | if (cqe_misc & NES_NIC_CQE_TAG_VALID) { |
2921 | (nesvnic->vlan_grp != NULL)) { | ||
2922 | vlan_tag = (u16)(le32_to_cpu( | 2921 | vlan_tag = (u16)(le32_to_cpu( |
2923 | cq->cq_vbase[head].cqe_words[NES_NIC_CQE_TAG_PKT_TYPE_IDX]) | 2922 | cq->cq_vbase[head].cqe_words[NES_NIC_CQE_TAG_PKT_TYPE_IDX]) |
2924 | >> 16); | 2923 | >> 16); |
2925 | nes_debug(NES_DBG_CQ, "%s: Reporting stripped VLAN packet. Tag = 0x%04X\n", | 2924 | nes_debug(NES_DBG_CQ, "%s: Reporting stripped VLAN packet. Tag = 0x%04X\n", |
2926 | nesvnic->netdev->name, vlan_tag); | 2925 | nesvnic->netdev->name, vlan_tag); |
2927 | if (nes_use_lro) | 2926 | |
2928 | lro_vlan_hwaccel_receive_skb(&nesvnic->lro_mgr, rx_skb, | 2927 | __vlan_hwaccel_put_tag(rx_skb, vlan_tag); |
2929 | nesvnic->vlan_grp, vlan_tag, NULL); | ||
2930 | else | ||
2931 | nes_vlan_rx(rx_skb, nesvnic->vlan_grp, vlan_tag); | ||
2932 | } else { | ||
2933 | if (nes_use_lro) | ||
2934 | lro_receive_skb(&nesvnic->lro_mgr, rx_skb, NULL); | ||
2935 | else | ||
2936 | nes_netif_rx(rx_skb); | ||
2937 | } | 2928 | } |
2929 | if (nes_use_lro) | ||
2930 | lro_receive_skb(&nesvnic->lro_mgr, rx_skb, NULL); | ||
2931 | else | ||
2932 | netif_receive_skb(rx_skb); | ||
2938 | 2933 | ||
2939 | skip_rx_indicate0: | 2934 | skip_rx_indicate0: |
2940 | ; | 2935 | ; |
diff --git a/drivers/infiniband/hw/nes/nes_hw.h b/drivers/infiniband/hw/nes/nes_hw.h index 91594116f947..c3241479ec0e 100644 --- a/drivers/infiniband/hw/nes/nes_hw.h +++ b/drivers/infiniband/hw/nes/nes_hw.h | |||
@@ -1211,7 +1211,6 @@ struct nes_vnic { | |||
1211 | /* void *mem; */ | 1211 | /* void *mem; */ |
1212 | struct nes_device *nesdev; | 1212 | struct nes_device *nesdev; |
1213 | struct net_device *netdev; | 1213 | struct net_device *netdev; |
1214 | struct vlan_group *vlan_grp; | ||
1215 | atomic_t rx_skbs_needed; | 1214 | atomic_t rx_skbs_needed; |
1216 | atomic_t rx_skb_timer_running; | 1215 | atomic_t rx_skb_timer_running; |
1217 | int budget; | 1216 | int budget; |
@@ -1357,7 +1356,4 @@ struct nes_terminate_hdr { | |||
1357 | #define NES_LINK_RECHECK_DELAY msecs_to_jiffies(50) | 1356 | #define NES_LINK_RECHECK_DELAY msecs_to_jiffies(50) |
1358 | #define NES_LINK_RECHECK_MAX 60 | 1357 | #define NES_LINK_RECHECK_MAX 60 |
1359 | 1358 | ||
1360 | #define nes_vlan_rx vlan_hwaccel_receive_skb | ||
1361 | #define nes_netif_rx netif_receive_skb | ||
1362 | |||
1363 | #endif /* __NES_HW_H */ | 1359 | #endif /* __NES_HW_H */ |
diff --git a/drivers/infiniband/hw/nes/nes_nic.c b/drivers/infiniband/hw/nes/nes_nic.c index d3a1c41cfd27..9d7ffebff213 100644 --- a/drivers/infiniband/hw/nes/nes_nic.c +++ b/drivers/infiniband/hw/nes/nes_nic.c | |||
@@ -1584,23 +1584,19 @@ static const struct ethtool_ops nes_ethtool_ops = { | |||
1584 | .set_pauseparam = nes_netdev_set_pauseparam, | 1584 | .set_pauseparam = nes_netdev_set_pauseparam, |
1585 | }; | 1585 | }; |
1586 | 1586 | ||
1587 | 1587 | static void nes_vlan_mode(struct net_device *netdev, struct nes_device *nesdev, u32 features) | |
1588 | static void nes_netdev_vlan_rx_register(struct net_device *netdev, struct vlan_group *grp) | ||
1589 | { | 1588 | { |
1590 | struct nes_vnic *nesvnic = netdev_priv(netdev); | ||
1591 | struct nes_device *nesdev = nesvnic->nesdev; | ||
1592 | struct nes_adapter *nesadapter = nesdev->nesadapter; | 1589 | struct nes_adapter *nesadapter = nesdev->nesadapter; |
1593 | u32 u32temp; | 1590 | u32 u32temp; |
1594 | unsigned long flags; | 1591 | unsigned long flags; |
1595 | 1592 | ||
1596 | spin_lock_irqsave(&nesadapter->phy_lock, flags); | 1593 | spin_lock_irqsave(&nesadapter->phy_lock, flags); |
1597 | nesvnic->vlan_grp = grp; | ||
1598 | 1594 | ||
1599 | nes_debug(NES_DBG_NETDEV, "%s: %s\n", __func__, netdev->name); | 1595 | nes_debug(NES_DBG_NETDEV, "%s: %s\n", __func__, netdev->name); |
1600 | 1596 | ||
1601 | /* Enable/Disable VLAN Stripping */ | 1597 | /* Enable/Disable VLAN Stripping */ |
1602 | u32temp = nes_read_indexed(nesdev, NES_IDX_PCIX_DIAG); | 1598 | u32temp = nes_read_indexed(nesdev, NES_IDX_PCIX_DIAG); |
1603 | if (grp) | 1599 | if (features & NETIF_F_HW_VLAN_RX) |
1604 | u32temp &= 0xfdffffff; | 1600 | u32temp &= 0xfdffffff; |
1605 | else | 1601 | else |
1606 | u32temp |= 0x02000000; | 1602 | u32temp |= 0x02000000; |
@@ -1609,17 +1605,44 @@ static void nes_netdev_vlan_rx_register(struct net_device *netdev, struct vlan_g | |||
1609 | spin_unlock_irqrestore(&nesadapter->phy_lock, flags); | 1605 | spin_unlock_irqrestore(&nesadapter->phy_lock, flags); |
1610 | } | 1606 | } |
1611 | 1607 | ||
1608 | static u32 nes_fix_features(struct net_device *netdev, u32 features) | ||
1609 | { | ||
1610 | /* | ||
1611 | * Since there is no support for separate rx/tx vlan accel | ||
1612 | * enable/disable make sure tx flag is always in same state as rx. | ||
1613 | */ | ||
1614 | if (features & NETIF_F_HW_VLAN_RX) | ||
1615 | features |= NETIF_F_HW_VLAN_TX; | ||
1616 | else | ||
1617 | features &= ~NETIF_F_HW_VLAN_TX; | ||
1618 | |||
1619 | return features; | ||
1620 | } | ||
1621 | |||
1622 | static int nes_set_features(struct net_device *netdev, u32 features) | ||
1623 | { | ||
1624 | struct nes_vnic *nesvnic = netdev_priv(netdev); | ||
1625 | struct nes_device *nesdev = nesvnic->nesdev; | ||
1626 | u32 changed = netdev->features ^ features; | ||
1627 | |||
1628 | if (changed & NETIF_F_HW_VLAN_RX) | ||
1629 | nes_vlan_mode(netdev, nesdev, features); | ||
1630 | |||
1631 | return 0; | ||
1632 | } | ||
1633 | |||
1612 | static const struct net_device_ops nes_netdev_ops = { | 1634 | static const struct net_device_ops nes_netdev_ops = { |
1613 | .ndo_open = nes_netdev_open, | 1635 | .ndo_open = nes_netdev_open, |
1614 | .ndo_stop = nes_netdev_stop, | 1636 | .ndo_stop = nes_netdev_stop, |
1615 | .ndo_start_xmit = nes_netdev_start_xmit, | 1637 | .ndo_start_xmit = nes_netdev_start_xmit, |
1616 | .ndo_get_stats = nes_netdev_get_stats, | 1638 | .ndo_get_stats = nes_netdev_get_stats, |
1617 | .ndo_tx_timeout = nes_netdev_tx_timeout, | 1639 | .ndo_tx_timeout = nes_netdev_tx_timeout, |
1618 | .ndo_set_mac_address = nes_netdev_set_mac_address, | 1640 | .ndo_set_mac_address = nes_netdev_set_mac_address, |
1619 | .ndo_set_multicast_list = nes_netdev_set_multicast_list, | 1641 | .ndo_set_multicast_list = nes_netdev_set_multicast_list, |
1620 | .ndo_change_mtu = nes_netdev_change_mtu, | 1642 | .ndo_change_mtu = nes_netdev_change_mtu, |
1621 | .ndo_validate_addr = eth_validate_addr, | 1643 | .ndo_validate_addr = eth_validate_addr, |
1622 | .ndo_vlan_rx_register = nes_netdev_vlan_rx_register, | 1644 | .ndo_fix_features = nes_fix_features, |
1645 | .ndo_set_features = nes_set_features, | ||
1623 | }; | 1646 | }; |
1624 | 1647 | ||
1625 | /** | 1648 | /** |
@@ -1656,7 +1679,7 @@ struct net_device *nes_netdev_init(struct nes_device *nesdev, | |||
1656 | netdev->ethtool_ops = &nes_ethtool_ops; | 1679 | netdev->ethtool_ops = &nes_ethtool_ops; |
1657 | netif_napi_add(netdev, &nesvnic->napi, nes_netdev_poll, 128); | 1680 | netif_napi_add(netdev, &nesvnic->napi, nes_netdev_poll, 128); |
1658 | nes_debug(NES_DBG_INIT, "Enabling VLAN Insert/Delete.\n"); | 1681 | nes_debug(NES_DBG_INIT, "Enabling VLAN Insert/Delete.\n"); |
1659 | netdev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; | 1682 | netdev->features |= NETIF_F_HW_VLAN_TX; |
1660 | 1683 | ||
1661 | /* Fill in the port structure */ | 1684 | /* Fill in the port structure */ |
1662 | nesvnic->netdev = netdev; | 1685 | nesvnic->netdev = netdev; |
@@ -1683,7 +1706,8 @@ struct net_device *nes_netdev_init(struct nes_device *nesdev, | |||
1683 | netdev->dev_addr[5] = (u8)u64temp; | 1706 | netdev->dev_addr[5] = (u8)u64temp; |
1684 | memcpy(netdev->perm_addr, netdev->dev_addr, 6); | 1707 | memcpy(netdev->perm_addr, netdev->dev_addr, 6); |
1685 | 1708 | ||
1686 | netdev->hw_features = NETIF_F_RXCSUM | NETIF_F_SG | NETIF_F_IP_CSUM; | 1709 | netdev->hw_features = NETIF_F_RXCSUM | NETIF_F_SG | NETIF_F_IP_CSUM | |
1710 | NETIF_F_HW_VLAN_RX; | ||
1687 | if ((nesvnic->logical_port < 2) || (nesdev->nesadapter->hw_rev != NE020_REV)) | 1711 | if ((nesvnic->logical_port < 2) || (nesdev->nesadapter->hw_rev != NE020_REV)) |
1688 | netdev->hw_features |= NETIF_F_TSO; | 1712 | netdev->hw_features |= NETIF_F_TSO; |
1689 | netdev->features |= netdev->hw_features; | 1713 | netdev->features |= netdev->hw_features; |
@@ -1815,6 +1839,8 @@ struct net_device *nes_netdev_init(struct nes_device *nesdev, | |||
1815 | nes_init_phy(nesdev); | 1839 | nes_init_phy(nesdev); |
1816 | } | 1840 | } |
1817 | 1841 | ||
1842 | nes_vlan_mode(netdev, nesdev, netdev->features); | ||
1843 | |||
1818 | return netdev; | 1844 | return netdev; |
1819 | } | 1845 | } |
1820 | 1846 | ||