diff options
| author | Linus Torvalds <torvalds@g5.osdl.org> | 2006-06-30 18:40:17 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-06-30 18:40:17 -0400 |
| commit | e37a72de84d27ee8bc0e7dbb5c2f1774ed306dbb (patch) | |
| tree | f9da35cbd79b52a5bd08d4a0f960bde6af741da0 | |
| parent | 93fdf10d4c28edaa1b9f80e7f9c3002359186d00 (diff) | |
| parent | f83ef8c0b58dac17211a4c0b6df0e2b1bd6637b1 (diff) | |
Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6:
[IPV6]: Added GSO support for TCPv6
[NET]: Generalise TSO-specific bits from skb_setup_caps
[IPV6]: Added GSO support for TCPv6
[IPV6]: Remove redundant length check on input
[NETFILTER]: SCTP conntrack: fix crash triggered by packet without chunks
[TG3]: Update version and reldate
[TG3]: Add TSO workaround using GSO
[TG3]: Turn on hw fix for ASF problems
[TG3]: Add rx BD workaround
[TG3]: Add tg3_netif_stop() in vlan functions
[TCP]: Reset gso_segs if packet is dodgy
| -rw-r--r-- | drivers/net/s2io.c | 15 | ||||
| -rw-r--r-- | drivers/net/tg3.c | 107 | ||||
| -rw-r--r-- | drivers/net/tg3.h | 5 | ||||
| -rw-r--r-- | include/linux/netdevice.h | 17 | ||||
| -rw-r--r-- | include/linux/skbuff.h | 6 | ||||
| -rw-r--r-- | include/net/ip6_route.h | 2 | ||||
| -rw-r--r-- | include/net/protocol.h | 6 | ||||
| -rw-r--r-- | include/net/sock.h | 13 | ||||
| -rw-r--r-- | include/net/tcp.h | 2 | ||||
| -rw-r--r-- | include/net/tcp_ecn.h | 4 | ||||
| -rw-r--r-- | net/ipv4/ip_output.c | 4 | ||||
| -rw-r--r-- | net/ipv4/netfilter/ip_conntrack_proto_sctp.c | 2 | ||||
| -rw-r--r-- | net/ipv4/tcp.c | 17 | ||||
| -rw-r--r-- | net/ipv4/tcp_ipv4.c | 2 | ||||
| -rw-r--r-- | net/ipv4/tcp_output.c | 9 | ||||
| -rw-r--r-- | net/ipv6/af_inet6.c | 2 | ||||
| -rw-r--r-- | net/ipv6/exthdrs.c | 4 | ||||
| -rw-r--r-- | net/ipv6/inet6_connection_sock.c | 2 | ||||
| -rw-r--r-- | net/ipv6/ip6_input.c | 7 | ||||
| -rw-r--r-- | net/ipv6/ip6_output.c | 4 | ||||
| -rw-r--r-- | net/ipv6/ipv6_sockglue.c | 62 | ||||
| -rw-r--r-- | net/ipv6/tcp_ipv6.c | 7 | ||||
| -rw-r--r-- | net/netfilter/nf_conntrack_proto_sctp.c | 2 |
23 files changed, 236 insertions, 65 deletions
diff --git a/drivers/net/s2io.c b/drivers/net/s2io.c index 25d289eaaa20..001344c0763e 100644 --- a/drivers/net/s2io.c +++ b/drivers/net/s2io.c | |||
| @@ -3959,7 +3959,7 @@ static int s2io_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 3959 | txdp->Control_2 = 0; | 3959 | txdp->Control_2 = 0; |
| 3960 | #ifdef NETIF_F_TSO | 3960 | #ifdef NETIF_F_TSO |
| 3961 | mss = skb_shinfo(skb)->gso_size; | 3961 | mss = skb_shinfo(skb)->gso_size; |
| 3962 | if (skb_shinfo(skb)->gso_type == SKB_GSO_TCPV4) { | 3962 | if (skb_shinfo(skb)->gso_type & (SKB_GSO_TCPV4 | SKB_GSO_TCPV6)) { |
| 3963 | txdp->Control_1 |= TXD_TCP_LSO_EN; | 3963 | txdp->Control_1 |= TXD_TCP_LSO_EN; |
| 3964 | txdp->Control_1 |= TXD_TCP_LSO_MSS(mss); | 3964 | txdp->Control_1 |= TXD_TCP_LSO_MSS(mss); |
| 3965 | } | 3965 | } |
| @@ -3979,7 +3979,7 @@ static int s2io_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 3979 | } | 3979 | } |
| 3980 | 3980 | ||
| 3981 | frg_len = skb->len - skb->data_len; | 3981 | frg_len = skb->len - skb->data_len; |
| 3982 | if (skb_shinfo(skb)->gso_type == SKB_GSO_UDPV4) { | 3982 | if (skb_shinfo(skb)->gso_type == SKB_GSO_UDP) { |
| 3983 | int ufo_size; | 3983 | int ufo_size; |
| 3984 | 3984 | ||
| 3985 | ufo_size = skb_shinfo(skb)->gso_size; | 3985 | ufo_size = skb_shinfo(skb)->gso_size; |
| @@ -4008,7 +4008,7 @@ static int s2io_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 4008 | txdp->Host_Control = (unsigned long) skb; | 4008 | txdp->Host_Control = (unsigned long) skb; |
| 4009 | txdp->Control_1 |= TXD_BUFFER0_SIZE(frg_len); | 4009 | txdp->Control_1 |= TXD_BUFFER0_SIZE(frg_len); |
| 4010 | 4010 | ||
| 4011 | if (skb_shinfo(skb)->gso_type == SKB_GSO_UDPV4) | 4011 | if (skb_shinfo(skb)->gso_type == SKB_GSO_UDP) |
| 4012 | txdp->Control_1 |= TXD_UFO_EN; | 4012 | txdp->Control_1 |= TXD_UFO_EN; |
| 4013 | 4013 | ||
| 4014 | frg_cnt = skb_shinfo(skb)->nr_frags; | 4014 | frg_cnt = skb_shinfo(skb)->nr_frags; |
| @@ -4023,12 +4023,12 @@ static int s2io_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 4023 | (sp->pdev, frag->page, frag->page_offset, | 4023 | (sp->pdev, frag->page, frag->page_offset, |
| 4024 | frag->size, PCI_DMA_TODEVICE); | 4024 | frag->size, PCI_DMA_TODEVICE); |
| 4025 | txdp->Control_1 = TXD_BUFFER0_SIZE(frag->size); | 4025 | txdp->Control_1 = TXD_BUFFER0_SIZE(frag->size); |
| 4026 | if (skb_shinfo(skb)->gso_type == SKB_GSO_UDPV4) | 4026 | if (skb_shinfo(skb)->gso_type == SKB_GSO_UDP) |
| 4027 | txdp->Control_1 |= TXD_UFO_EN; | 4027 | txdp->Control_1 |= TXD_UFO_EN; |
| 4028 | } | 4028 | } |
| 4029 | txdp->Control_1 |= TXD_GATHER_CODE_LAST; | 4029 | txdp->Control_1 |= TXD_GATHER_CODE_LAST; |
| 4030 | 4030 | ||
| 4031 | if (skb_shinfo(skb)->gso_type == SKB_GSO_UDPV4) | 4031 | if (skb_shinfo(skb)->gso_type == SKB_GSO_UDP) |
| 4032 | frg_cnt++; /* as Txd0 was used for inband header */ | 4032 | frg_cnt++; /* as Txd0 was used for inband header */ |
| 4033 | 4033 | ||
| 4034 | tx_fifo = mac_control->tx_FIFO_start[queue]; | 4034 | tx_fifo = mac_control->tx_FIFO_start[queue]; |
| @@ -4042,7 +4042,7 @@ static int s2io_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 4042 | if (mss) | 4042 | if (mss) |
| 4043 | val64 |= TX_FIFO_SPECIAL_FUNC; | 4043 | val64 |= TX_FIFO_SPECIAL_FUNC; |
| 4044 | #endif | 4044 | #endif |
| 4045 | if (skb_shinfo(skb)->gso_type == SKB_GSO_UDPV4) | 4045 | if (skb_shinfo(skb)->gso_type == SKB_GSO_UDP) |
| 4046 | val64 |= TX_FIFO_SPECIAL_FUNC; | 4046 | val64 |= TX_FIFO_SPECIAL_FUNC; |
| 4047 | writeq(val64, &tx_fifo->List_Control); | 4047 | writeq(val64, &tx_fifo->List_Control); |
| 4048 | 4048 | ||
| @@ -7020,6 +7020,9 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre) | |||
| 7020 | #ifdef NETIF_F_TSO | 7020 | #ifdef NETIF_F_TSO |
| 7021 | dev->features |= NETIF_F_TSO; | 7021 | dev->features |= NETIF_F_TSO; |
| 7022 | #endif | 7022 | #endif |
| 7023 | #ifdef NETIF_F_TSO6 | ||
| 7024 | dev->features |= NETIF_F_TSO6; | ||
| 7025 | #endif | ||
| 7023 | if (sp->device_type & XFRAME_II_DEVICE) { | 7026 | if (sp->device_type & XFRAME_II_DEVICE) { |
| 7024 | dev->features |= NETIF_F_UFO; | 7027 | dev->features |= NETIF_F_UFO; |
| 7025 | dev->features |= NETIF_F_HW_CSUM; | 7028 | dev->features |= NETIF_F_HW_CSUM; |
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index 6bea2b89a915..953255e92633 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c | |||
| @@ -68,8 +68,8 @@ | |||
| 68 | 68 | ||
| 69 | #define DRV_MODULE_NAME "tg3" | 69 | #define DRV_MODULE_NAME "tg3" |
| 70 | #define PFX DRV_MODULE_NAME ": " | 70 | #define PFX DRV_MODULE_NAME ": " |
| 71 | #define DRV_MODULE_VERSION "3.60" | 71 | #define DRV_MODULE_VERSION "3.61" |
| 72 | #define DRV_MODULE_RELDATE "June 17, 2006" | 72 | #define DRV_MODULE_RELDATE "June 29, 2006" |
| 73 | 73 | ||
| 74 | #define TG3_DEF_MAC_MODE 0 | 74 | #define TG3_DEF_MAC_MODE 0 |
| 75 | #define TG3_DEF_RX_MODE 0 | 75 | #define TG3_DEF_RX_MODE 0 |
| @@ -3194,7 +3194,7 @@ static int tg3_vlan_rx(struct tg3 *tp, struct sk_buff *skb, u16 vlan_tag) | |||
| 3194 | */ | 3194 | */ |
| 3195 | static int tg3_rx(struct tg3 *tp, int budget) | 3195 | static int tg3_rx(struct tg3 *tp, int budget) |
| 3196 | { | 3196 | { |
| 3197 | u32 work_mask; | 3197 | u32 work_mask, rx_std_posted = 0; |
| 3198 | u32 sw_idx = tp->rx_rcb_ptr; | 3198 | u32 sw_idx = tp->rx_rcb_ptr; |
| 3199 | u16 hw_idx; | 3199 | u16 hw_idx; |
| 3200 | int received; | 3200 | int received; |
| @@ -3221,6 +3221,7 @@ static int tg3_rx(struct tg3 *tp, int budget) | |||
| 3221 | mapping); | 3221 | mapping); |
| 3222 | skb = tp->rx_std_buffers[desc_idx].skb; | 3222 | skb = tp->rx_std_buffers[desc_idx].skb; |
| 3223 | post_ptr = &tp->rx_std_ptr; | 3223 | post_ptr = &tp->rx_std_ptr; |
| 3224 | rx_std_posted++; | ||
| 3224 | } else if (opaque_key == RXD_OPAQUE_RING_JUMBO) { | 3225 | } else if (opaque_key == RXD_OPAQUE_RING_JUMBO) { |
| 3225 | dma_addr = pci_unmap_addr(&tp->rx_jumbo_buffers[desc_idx], | 3226 | dma_addr = pci_unmap_addr(&tp->rx_jumbo_buffers[desc_idx], |
| 3226 | mapping); | 3227 | mapping); |
| @@ -3308,6 +3309,15 @@ static int tg3_rx(struct tg3 *tp, int budget) | |||
| 3308 | 3309 | ||
| 3309 | next_pkt: | 3310 | next_pkt: |
| 3310 | (*post_ptr)++; | 3311 | (*post_ptr)++; |
| 3312 | |||
| 3313 | if (unlikely(rx_std_posted >= tp->rx_std_max_post)) { | ||
| 3314 | u32 idx = *post_ptr % TG3_RX_RING_SIZE; | ||
| 3315 | |||
| 3316 | tw32_rx_mbox(MAILBOX_RCV_STD_PROD_IDX + | ||
| 3317 | TG3_64BIT_REG_LOW, idx); | ||
| 3318 | work_mask &= ~RXD_OPAQUE_RING_STD; | ||
| 3319 | rx_std_posted = 0; | ||
| 3320 | } | ||
| 3311 | next_pkt_nopost: | 3321 | next_pkt_nopost: |
| 3312 | sw_idx++; | 3322 | sw_idx++; |
| 3313 | sw_idx %= TG3_RX_RCB_RING_SIZE(tp); | 3323 | sw_idx %= TG3_RX_RCB_RING_SIZE(tp); |
| @@ -3869,6 +3879,40 @@ out_unlock: | |||
| 3869 | return NETDEV_TX_OK; | 3879 | return NETDEV_TX_OK; |
| 3870 | } | 3880 | } |
| 3871 | 3881 | ||
| 3882 | #if TG3_TSO_SUPPORT != 0 | ||
| 3883 | static int tg3_start_xmit_dma_bug(struct sk_buff *, struct net_device *); | ||
| 3884 | |||
| 3885 | /* Use GSO to workaround a rare TSO bug that may be triggered when the | ||
| 3886 | * TSO header is greater than 80 bytes. | ||
| 3887 | */ | ||
| 3888 | static int tg3_tso_bug(struct tg3 *tp, struct sk_buff *skb) | ||
| 3889 | { | ||
| 3890 | struct sk_buff *segs, *nskb; | ||
| 3891 | |||
| 3892 | /* Estimate the number of fragments in the worst case */ | ||
| 3893 | if (unlikely(TX_BUFFS_AVAIL(tp) <= (skb_shinfo(skb)->gso_segs * 3))) { | ||
| 3894 | netif_stop_queue(tp->dev); | ||
| 3895 | return NETDEV_TX_BUSY; | ||
| 3896 | } | ||
| 3897 | |||
| 3898 | segs = skb_gso_segment(skb, tp->dev->features & ~NETIF_F_TSO); | ||
| 3899 | if (unlikely(IS_ERR(segs))) | ||
| 3900 | goto tg3_tso_bug_end; | ||
| 3901 | |||
| 3902 | do { | ||
