diff options
Diffstat (limited to 'drivers/net/bnx2.c')
-rw-r--r-- | drivers/net/bnx2.c | 47 |
1 files changed, 34 insertions, 13 deletions
diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c index 5ebde67d4297..2486a656f12d 100644 --- a/drivers/net/bnx2.c +++ b/drivers/net/bnx2.c | |||
@@ -35,8 +35,8 @@ | |||
35 | #include <linux/time.h> | 35 | #include <linux/time.h> |
36 | #include <linux/ethtool.h> | 36 | #include <linux/ethtool.h> |
37 | #include <linux/mii.h> | 37 | #include <linux/mii.h> |
38 | #ifdef NETIF_F_HW_VLAN_TX | ||
39 | #include <linux/if_vlan.h> | 38 | #include <linux/if_vlan.h> |
39 | #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) | ||
40 | #define BCM_VLAN 1 | 40 | #define BCM_VLAN 1 |
41 | #endif | 41 | #endif |
42 | #include <net/ip.h> | 42 | #include <net/ip.h> |
@@ -57,8 +57,8 @@ | |||
57 | 57 | ||
58 | #define DRV_MODULE_NAME "bnx2" | 58 | #define DRV_MODULE_NAME "bnx2" |
59 | #define PFX DRV_MODULE_NAME ": " | 59 | #define PFX DRV_MODULE_NAME ": " |
60 | #define DRV_MODULE_VERSION "1.7.9" | 60 | #define DRV_MODULE_VERSION "1.8.0" |
61 | #define DRV_MODULE_RELDATE "July 18, 2008" | 61 | #define DRV_MODULE_RELDATE "Aug 14, 2008" |
62 | 62 | ||
63 | #define RUN_AT(x) (jiffies + (x)) | 63 | #define RUN_AT(x) (jiffies + (x)) |
64 | 64 | ||
@@ -2876,6 +2876,8 @@ bnx2_rx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget) | |||
2876 | struct sw_bd *rx_buf; | 2876 | struct sw_bd *rx_buf; |
2877 | struct sk_buff *skb; | 2877 | struct sk_buff *skb; |
2878 | dma_addr_t dma_addr; | 2878 | dma_addr_t dma_addr; |
2879 | u16 vtag = 0; | ||
2880 | int hw_vlan __maybe_unused = 0; | ||
2879 | 2881 | ||
2880 | sw_ring_cons = RX_RING_IDX(sw_cons); | 2882 | sw_ring_cons = RX_RING_IDX(sw_cons); |
2881 | sw_ring_prod = RX_RING_IDX(sw_prod); | 2883 | sw_ring_prod = RX_RING_IDX(sw_prod); |
@@ -2919,7 +2921,7 @@ bnx2_rx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget) | |||
2919 | if (len <= bp->rx_copy_thresh) { | 2921 | if (len <= bp->rx_copy_thresh) { |
2920 | struct sk_buff *new_skb; | 2922 | struct sk_buff *new_skb; |
2921 | 2923 | ||
2922 | new_skb = netdev_alloc_skb(bp->dev, len + 2); | 2924 | new_skb = netdev_alloc_skb(bp->dev, len + 6); |
2923 | if (new_skb == NULL) { | 2925 | if (new_skb == NULL) { |
2924 | bnx2_reuse_rx_skb(bp, rxr, skb, sw_ring_cons, | 2926 | bnx2_reuse_rx_skb(bp, rxr, skb, sw_ring_cons, |
2925 | sw_ring_prod); | 2927 | sw_ring_prod); |
@@ -2928,9 +2930,9 @@ bnx2_rx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget) | |||
2928 | 2930 | ||
2929 | /* aligned copy */ | 2931 | /* aligned copy */ |
2930 | skb_copy_from_linear_data_offset(skb, | 2932 | skb_copy_from_linear_data_offset(skb, |
2931 | BNX2_RX_OFFSET - 2, | 2933 | BNX2_RX_OFFSET - 6, |
2932 | new_skb->data, len + 2); | 2934 | new_skb->data, len + 6); |
2933 | skb_reserve(new_skb, 2); | 2935 | skb_reserve(new_skb, 6); |
2934 | skb_put(new_skb, len); | 2936 | skb_put(new_skb, len); |
2935 | 2937 | ||
2936 | bnx2_reuse_rx_skb(bp, rxr, skb, | 2938 | bnx2_reuse_rx_skb(bp, rxr, skb, |
@@ -2941,6 +2943,25 @@ bnx2_rx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget) | |||
2941 | dma_addr, (sw_ring_cons << 16) | sw_ring_prod))) | 2943 | dma_addr, (sw_ring_cons << 16) | sw_ring_prod))) |
2942 | goto next_rx; | 2944 | goto next_rx; |
2943 | 2945 | ||
2946 | if ((status & L2_FHDR_STATUS_L2_VLAN_TAG) && | ||
2947 | !(bp->rx_mode & BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG)) { | ||
2948 | vtag = rx_hdr->l2_fhdr_vlan_tag; | ||
2949 | #ifdef BCM_VLAN | ||
2950 | if (bp->vlgrp) | ||
2951 | hw_vlan = 1; | ||
2952 | else | ||
2953 | #endif | ||
2954 | { | ||
2955 | struct vlan_ethhdr *ve = (struct vlan_ethhdr *) | ||
2956 | __skb_push(skb, 4); | ||
2957 | |||
2958 | memmove(ve, skb->data + 4, ETH_ALEN * 2); | ||
2959 | ve->h_vlan_proto = htons(ETH_P_8021Q); | ||
2960 | ve->h_vlan_TCI = htons(vtag); | ||
2961 | len += 4; | ||
2962 | } | ||
2963 | } | ||
2964 | |||
2944 | skb->protocol = eth_type_trans(skb, bp->dev); | 2965 | skb->protocol = eth_type_trans(skb, bp->dev); |
2945 | 2966 | ||
2946 | if ((len > (bp->dev->mtu + ETH_HLEN)) && | 2967 | if ((len > (bp->dev->mtu + ETH_HLEN)) && |
@@ -2962,10 +2983,8 @@ bnx2_rx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget) | |||
2962 | } | 2983 | } |
2963 | 2984 | ||
2964 | #ifdef BCM_VLAN | 2985 | #ifdef BCM_VLAN |
2965 | if ((status & L2_FHDR_STATUS_L2_VLAN_TAG) && bp->vlgrp) { | 2986 | if (hw_vlan) |
2966 | vlan_hwaccel_receive_skb(skb, bp->vlgrp, | 2987 | vlan_hwaccel_receive_skb(skb, bp->vlgrp, vtag); |
2967 | rx_hdr->l2_fhdr_vlan_tag); | ||
2968 | } | ||
2969 | else | 2988 | else |
2970 | #endif | 2989 | #endif |
2971 | netif_receive_skb(skb); | 2990 | netif_receive_skb(skb); |
@@ -3237,10 +3256,10 @@ bnx2_set_rx_mode(struct net_device *dev) | |||
3237 | BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG); | 3256 | BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG); |
3238 | sort_mode = 1 | BNX2_RPM_SORT_USER0_BC_EN; | 3257 | sort_mode = 1 | BNX2_RPM_SORT_USER0_BC_EN; |
3239 | #ifdef BCM_VLAN | 3258 | #ifdef BCM_VLAN |
3240 | if (!bp->vlgrp && !(bp->flags & BNX2_FLAG_ASF_ENABLE)) | 3259 | if (!bp->vlgrp && (bp->flags & BNX2_FLAG_CAN_KEEP_VLAN)) |
3241 | rx_mode |= BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG; | 3260 | rx_mode |= BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG; |
3242 | #else | 3261 | #else |
3243 | if (!(bp->flags & BNX2_FLAG_ASF_ENABLE)) | 3262 | if (bp->flags & BNX2_FLAG_CAN_KEEP_VLAN) |
3244 | rx_mode |= BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG; | 3263 | rx_mode |= BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG; |
3245 | #endif | 3264 | #endif |
3246 | if (dev->flags & IFF_PROMISC) { | 3265 | if (dev->flags & IFF_PROMISC) { |
@@ -5963,10 +5982,12 @@ bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
5963 | vlan_tag_flags |= TX_BD_FLAGS_TCP_UDP_CKSUM; | 5982 | vlan_tag_flags |= TX_BD_FLAGS_TCP_UDP_CKSUM; |
5964 | } | 5983 | } |
5965 | 5984 | ||
5985 | #ifdef BCM_VLAN | ||
5966 | if (bp->vlgrp && vlan_tx_tag_present(skb)) { | 5986 | if (bp->vlgrp && vlan_tx_tag_present(skb)) { |
5967 | vlan_tag_flags |= | 5987 | vlan_tag_flags |= |
5968 | (TX_BD_FLAGS_VLAN_TAG | (vlan_tx_tag_get(skb) << 16)); | 5988 | (TX_BD_FLAGS_VLAN_TAG | (vlan_tx_tag_get(skb) << 16)); |
5969 | } | 5989 | } |
5990 | #endif | ||
5970 | if ((mss = skb_shinfo(skb)->gso_size)) { | 5991 | if ((mss = skb_shinfo(skb)->gso_size)) { |
5971 | u32 tcp_opt_len, ip_tcp_len; | 5992 | u32 tcp_opt_len, ip_tcp_len; |
5972 | struct iphdr *iph; | 5993 | struct iphdr *iph; |