diff options
Diffstat (limited to 'drivers/net/qlcnic/qlcnic_main.c')
-rw-r--r-- | drivers/net/qlcnic/qlcnic_main.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/drivers/net/qlcnic/qlcnic_main.c b/drivers/net/qlcnic/qlcnic_main.c index cd88c7e1bfa9..cb1a1ef36c0a 100644 --- a/drivers/net/qlcnic/qlcnic_main.c +++ b/drivers/net/qlcnic/qlcnic_main.c | |||
@@ -2099,6 +2099,7 @@ qlcnic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
2099 | struct cmd_desc_type0 *hwdesc, *first_desc; | 2099 | struct cmd_desc_type0 *hwdesc, *first_desc; |
2100 | struct pci_dev *pdev; | 2100 | struct pci_dev *pdev; |
2101 | struct ethhdr *phdr; | 2101 | struct ethhdr *phdr; |
2102 | int delta = 0; | ||
2102 | int i, k; | 2103 | int i, k; |
2103 | 2104 | ||
2104 | u32 producer; | 2105 | u32 producer; |
@@ -2118,6 +2119,19 @@ qlcnic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
2118 | } | 2119 | } |
2119 | 2120 | ||
2120 | frag_count = skb_shinfo(skb)->nr_frags + 1; | 2121 | frag_count = skb_shinfo(skb)->nr_frags + 1; |
2122 | /* 14 frags supported for normal packet and | ||
2123 | * 32 frags supported for TSO packet | ||
2124 | */ | ||
2125 | if (!skb_is_gso(skb) && frag_count > QLCNIC_MAX_FRAGS_PER_TX) { | ||
2126 | |||
2127 | for (i = 0; i < (frag_count - QLCNIC_MAX_FRAGS_PER_TX); i++) | ||
2128 | delta += skb_shinfo(skb)->frags[i].size; | ||
2129 | |||
2130 | if (!__pskb_pull_tail(skb, delta)) | ||
2131 | goto drop_packet; | ||
2132 | |||
2133 | frag_count = 1 + skb_shinfo(skb)->nr_frags; | ||
2134 | } | ||
2121 | 2135 | ||
2122 | /* 4 fragments per cmd des */ | 2136 | /* 4 fragments per cmd des */ |
2123 | no_of_desc = (frag_count + 3) >> 2; | 2137 | no_of_desc = (frag_count + 3) >> 2; |