diff options
| author | H. Peter Anvin <hpa@zytor.com> | 2008-08-26 01:45:37 -0400 |
|---|---|---|
| committer | H. Peter Anvin <hpa@zytor.com> | 2008-08-26 01:45:37 -0400 |
| commit | 94d4ac2f4a58c6e37876827c6688c61cef21290c (patch) | |
| tree | 732f4e4794f3c116041242f69754637f75c0dd57 /drivers/net/bnx2.c | |
| parent | ed21763e7b0b3fb50e4efd9d4bc17ef5b035d304 (diff) | |
| parent | 08970fc4e0385790a7b093adfaa4165a189f9eb0 (diff) | |
Merge branch 'x86/urgent' into x86/cleanups
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; |
