|
@@ -1844,6 +1844,8 @@ netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
|
|
struct cmd_desc_type0 *hwdesc, *first_desc;
|
|
struct cmd_desc_type0 *hwdesc, *first_desc;
|
|
struct pci_dev *pdev;
|
|
struct pci_dev *pdev;
|
|
int i, k;
|
|
int i, k;
|
|
|
|
+ int delta = 0;
|
|
|
|
+ struct skb_frag_struct *frag;
|
|
|
|
|
|
u32 producer;
|
|
u32 producer;
|
|
int frag_count, no_of_desc;
|
|
int frag_count, no_of_desc;
|
|
@@ -1851,6 +1853,21 @@ netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
|
|
|
|
|
|
frag_count = skb_shinfo(skb)->nr_frags + 1;
|
|
frag_count = skb_shinfo(skb)->nr_frags + 1;
|
|
|
|
|
|
|
|
+ /* 14 frags supported for normal packet and
|
|
|
|
+ * 32 frags supported for TSO packet
|
|
|
|
+ */
|
|
|
|
+ if (!skb_is_gso(skb) && frag_count > NETXEN_MAX_FRAGS_PER_TX) {
|
|
|
|
+
|
|
|
|
+ for (i = 0; i < (frag_count - NETXEN_MAX_FRAGS_PER_TX); i++) {
|
|
|
|
+ frag = &skb_shinfo(skb)->frags[i];
|
|
|
|
+ delta += frag->size;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (!__pskb_pull_tail(skb, delta))
|
|
|
|
+ goto drop_packet;
|
|
|
|
+
|
|
|
|
+ frag_count = 1 + skb_shinfo(skb)->nr_frags;
|
|
|
|
+ }
|
|
/* 4 fragments per cmd des */
|
|
/* 4 fragments per cmd des */
|
|
no_of_desc = (frag_count + 3) >> 2;
|
|
no_of_desc = (frag_count + 3) >> 2;
|
|
|
|
|