RDMA/nes: Fix for incorrect MSS when TSO is on
authorTatyana Nikolova <Tatyana.E.Nikolova@intel.com>
Thu, 20 Sep 2012 19:34:20 +0000 (19:34 +0000)
committerRoland Dreier <roland@purestorage.com>
Mon, 1 Oct 2012 03:34:52 +0000 (20:34 -0700)
In TSO handling code, skb_shared_info() is used to get the MSS
instead of the bool function skb_is_gso() (which always returns 1).

Signed-off-by: Tatyana Nikolova <Tatyana.E.Nikolova@intel.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
drivers/infiniband/hw/nes/nes_nic.c

index f3a3ecf..1c02ba7 100644 (file)
@@ -390,10 +390,10 @@ static int nes_nic_send(struct sk_buff *skb, struct net_device *netdev)
                tcph = tcp_hdr(skb);
                if (1) {
                        if (skb_is_gso(skb)) {
-                               /* nes_debug(NES_DBG_NIC_TX, "%s: TSO request... seg size = %u\n",
-                                               netdev->name, skb_is_gso(skb)); */
+                               /* nes_debug(NES_DBG_NIC_TX, "%s: TSO request... is_gso = %u seg size = %u\n",
+                                               netdev->name, skb_is_gso(skb), skb_shinfo(skb)->gso_size); */
                                wqe_misc |= NES_NIC_SQ_WQE_LSO_ENABLE |
-                                               NES_NIC_SQ_WQE_COMPLETION | (u16)skb_is_gso(skb);
+                                               NES_NIC_SQ_WQE_COMPLETION | (u16)skb_shinfo(skb)->gso_size;
                                set_wqe_32bit_value(nic_sqe->wqe_words, NES_NIC_SQ_WQE_LSO_INFO_IDX,
                                                ((u32)tcph->doff) |
                                                (((u32)(((unsigned char *)tcph) - skb->data)) << 4));
@@ -597,10 +597,10 @@ tso_sq_no_longer_full:
                                        nes_debug(NES_DBG_NIC_TX, "ERROR: SKB header too big, headlen=%u, FIRST_FRAG_SIZE=%u\n",
                                                        original_first_length, NES_FIRST_FRAG_SIZE);
                                        nes_debug(NES_DBG_NIC_TX, "%s Request to tx NIC packet length %u, headlen %u,"
-                                                       " (%u frags), tso_size=%u\n",
+                                                       " (%u frags), is_gso = %u tso_size=%u\n",
                                                        netdev->name,
                                                        skb->len, skb_headlen(skb),
-                                                       skb_shinfo(skb)->nr_frags, skb_is_gso(skb));
+                                                       skb_shinfo(skb)->nr_frags, skb_is_gso(skb), skb_shinfo(skb)->gso_size);
                                }
                                memcpy(&nesnic->first_frag_vbase[nesnic->sq_head].buffer,
                                                skb->data, min(((unsigned int)NES_FIRST_FRAG_SIZE),
@@ -652,8 +652,8 @@ tso_sq_no_longer_full:
                                } else {
                                        nesnic->tx_skb[nesnic->sq_head] = NULL;
                                }
-                               wqe_misc |= NES_NIC_SQ_WQE_COMPLETION | (u16)skb_is_gso(skb);
-                               if ((tso_wqe_length + original_first_length) > skb_is_gso(skb)) {
+                               wqe_misc |= NES_NIC_SQ_WQE_COMPLETION | (u16)skb_shinfo(skb)->gso_size;
+                               if ((tso_wqe_length + original_first_length) > skb_shinfo(skb)->gso_size) {
                                        wqe_misc |= NES_NIC_SQ_WQE_LSO_ENABLE;
                                } else {
                                        iph->tot_len = htons(tso_wqe_length + original_first_length - nhoffset);