diff options
Diffstat (limited to 'drivers/net/netxen/netxen_nic_main.c')
-rw-r--r-- | drivers/net/netxen/netxen_nic_main.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c index 201b944bd46..b644383017f 100644 --- a/drivers/net/netxen/netxen_nic_main.c +++ b/drivers/net/netxen/netxen_nic_main.c | |||
@@ -1877,6 +1877,8 @@ netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
1877 | struct cmd_desc_type0 *hwdesc, *first_desc; | 1877 | struct cmd_desc_type0 *hwdesc, *first_desc; |
1878 | struct pci_dev *pdev; | 1878 | struct pci_dev *pdev; |
1879 | int i, k; | 1879 | int i, k; |
1880 | int delta = 0; | ||
1881 | struct skb_frag_struct *frag; | ||
1880 | 1882 | ||
1881 | u32 producer; | 1883 | u32 producer; |
1882 | int frag_count, no_of_desc; | 1884 | int frag_count, no_of_desc; |
@@ -1884,6 +1886,21 @@ netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
1884 | 1886 | ||
1885 | frag_count = skb_shinfo(skb)->nr_frags + 1; | 1887 | frag_count = skb_shinfo(skb)->nr_frags + 1; |
1886 | 1888 | ||
1889 | /* 14 frags supported for normal packet and | ||
1890 | * 32 frags supported for TSO packet | ||
1891 | */ | ||
1892 | if (!skb_is_gso(skb) && frag_count > NETXEN_MAX_FRAGS_PER_TX) { | ||
1893 | |||
1894 | for (i = 0; i < (frag_count - NETXEN_MAX_FRAGS_PER_TX); i++) { | ||
1895 | frag = &skb_shinfo(skb)->frags[i]; | ||
1896 | delta += frag->size; | ||
1897 | } | ||
1898 | |||
1899 | if (!__pskb_pull_tail(skb, delta)) | ||
1900 | goto drop_packet; | ||
1901 | |||
1902 | frag_count = 1 + skb_shinfo(skb)->nr_frags; | ||
1903 | } | ||
1887 | /* 4 fragments per cmd des */ | 1904 | /* 4 fragments per cmd des */ |
1888 | no_of_desc = (frag_count + 3) >> 2; | 1905 | no_of_desc = (frag_count + 3) >> 2; |
1889 | 1906 | ||