ChangeSet 1.1521.1.53, 2005/01/24 17:40:28-08:00, [EMAIL PROTECTED]

        [TG3]: Fix TSO for 5750
        
        - Fix TSO for 5750 chips by setting tcp checksum field to 0 for TSO 
packets
        - Add TG3_FLG2_HW_TSO flag for 5750 and newer chips that use the same 
TSO
          scheme
        
        Signed-off-by: Michael Chan <[EMAIL PROTECTED]>
        Signed-off-by: David S. Miller <[EMAIL PROTECTED]>



 tg3.c |   35 ++++++++++++++++++++++++-----------
 tg3.h |    1 +
 2 files changed, 25 insertions(+), 11 deletions(-)


diff -Nru a/drivers/net/tg3.c b/drivers/net/tg3.c
--- a/drivers/net/tg3.c 2005-02-01 16:03:47 -08:00
+++ b/drivers/net/tg3.c 2005-02-01 16:03:47 -08:00
@@ -3089,11 +3089,19 @@
 
                skb->nh.iph->check = 0;
                skb->nh.iph->tot_len = ntohs(mss + ip_tcp_len + tcp_opt_len);
-               skb->h.th->check = ~csum_tcpudp_magic(skb->nh.iph->saddr,
-                                                     skb->nh.iph->daddr,
-                                                     0, IPPROTO_TCP, 0);
+               if (tp->tg3_flags2 & TG3_FLG2_HW_TSO) {
+                       skb->h.th->check = 0;
+                       base_flags &= ~TXD_FLAG_TCPUDP_CSUM;
+               }
+               else {
+                       skb->h.th->check =
+                               ~csum_tcpudp_magic(skb->nh.iph->saddr,
+                                                  skb->nh.iph->daddr,
+                                                  0, IPPROTO_TCP, 0);
+               }
 
-               if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) {
+               if ((tp->tg3_flags2 & TG3_FLG2_HW_TSO) ||
+                   (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705)) {
                        if (tcp_opt_len || skb->nh.iph->ihl > 5) {
                                int tsflags;
 
@@ -3160,7 +3168,7 @@
                                would_hit_hwbug = entry + 1;
                        }
 
-                       if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750)
+                       if (tp->tg3_flags2 & TG3_FLG2_HW_TSO)
                                tg3_set_txd(tp, entry, mapping, len,
                                            base_flags, (i == last)|(mss << 1));
                        else
@@ -4751,7 +4759,7 @@
        unsigned long cpu_base, cpu_scratch_base, cpu_scratch_size;
        int err, i;
 
-       if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750)
+       if (tp->tg3_flags2 & TG3_FLG2_HW_TSO)
                return 0;
 
        if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) {
@@ -5185,7 +5193,7 @@
        }
 
 #if TG3_TSO_SUPPORT != 0
-       if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750)
+       if (tp->tg3_flags2 & TG3_FLG2_HW_TSO)
                rdmac_mode |= (1 << 27);
 #endif
 
@@ -5335,7 +5343,7 @@
        tw32(RCVDBDI_MODE, RCVDBDI_MODE_ENABLE | RCVDBDI_MODE_INV_RING_SZ);
        tw32(SNDDATAI_MODE, SNDDATAI_MODE_ENABLE);
 #if TG3_TSO_SUPPORT != 0
-       if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750)
+       if (tp->tg3_flags2 & TG3_FLG2_HW_TSO)
                tw32(SNDDATAI_MODE, SNDDATAI_MODE_ENABLE | 0x8);
 #endif
        tw32(SNDBDI_MODE, SNDBDI_MODE_ENABLE | SNDBDI_MODE_ATTN_ENABLE);
@@ -7842,6 +7850,9 @@
        tp->pci_hdr_type     = (cacheline_sz_reg >> 16) & 0xff;
        tp->pci_bist         = (cacheline_sz_reg >> 24) & 0xff;
 
+       if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750)
+               tp->tg3_flags2 |= TG3_FLG2_HW_TSO;
+
        if (pci_find_capability(tp->pdev, PCI_CAP_ID_EXP) != 0)
                tp->tg3_flags2 |= TG3_FLG2_PCI_EXPRESS;
 
@@ -8730,11 +8741,13 @@
        }
 
 #if TG3_TSO_SUPPORT != 0
-       if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
+       if (tp->tg3_flags2 & TG3_FLG2_HW_TSO) {
+               tp->tg3_flags2 |= TG3_FLG2_TSO_CAPABLE;
+       }
+       else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
            GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701 ||
            tp->pci_chip_rev_id == CHIPREV_ID_5705_A0 ||
-           ((tp->tg3_flags & TG3_FLAG_ENABLE_ASF) != 0 &&
-            GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5750)) {
+           (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) != 0) {
                tp->tg3_flags2 &= ~TG3_FLG2_TSO_CAPABLE;
        } else {
                tp->tg3_flags2 |= TG3_FLG2_TSO_CAPABLE;
diff -Nru a/drivers/net/tg3.h b/drivers/net/tg3.h
--- a/drivers/net/tg3.h 2005-02-01 16:03:47 -08:00
+++ b/drivers/net/tg3.h 2005-02-01 16:03:47 -08:00
@@ -2105,6 +2105,7 @@
 #define TG3_FLG2_PHY_SERDES            0x00002000
 #define TG3_FLG2_CAPACITIVE_COUPLING   0x00004000
 #define TG3_FLG2_FLASH                 0x00008000
+#define TG3_FLG2_HW_TSO                        0x00010000
 
        u32                             split_mode_max_reqs;
 #define SPLIT_MODE_5704_MAX_REQ                3
-
To unsubscribe from this list: send the line "unsubscribe bk-commits-24" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to