mss = 0;
        if ((mss = skb_shinfo(skb)->gso_size) != 0) {
                struct iphdr *iph;
-               int tcp_opt_len, ip_tcp_len, hdr_len;
+               u32 tcp_opt_len, ip_tcp_len, hdr_len;
 
                if (skb_header_cloned(skb) &&
                    pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) {
                                                                 IPPROTO_TCP,
                                                                 0);
 
-               if ((tp->tg3_flags2 & TG3_FLG2_HW_TSO) ||
-                   (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705)) {
+               if (tp->tg3_flags2 & TG3_FLG2_HW_TSO_2)
+                       mss |= hdr_len << 9;
+               else if ((tp->tg3_flags2 & TG3_FLG2_HW_TSO_1) ||
+                        GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) {
                        if (tcp_opt_len || iph->ihl > 5) {
                                int tsflags;
 
 
        would_hit_hwbug = 0;
 
+       if ((tp->tg3_flags3 & TG3_FLG3_SHORT_DMA_BUG) && len <= 8)
+               would_hit_hwbug = 1;
+
        if ((tp->tg3_flags3 & TG3_FLG3_4G_DMA_BNDRY_BUG) &&
            tg3_4g_overflow_test(mapping, len))
                would_hit_hwbug = 1;
 
                        tnapi->tx_buffers[entry].skb = NULL;
 
+                       if ((tp->tg3_flags3 & TG3_FLG3_SHORT_DMA_BUG) &&
+                           len <= 8)
+                               would_hit_hwbug = 1;
+
                        if ((tp->tg3_flags3 & TG3_FLG3_4G_DMA_BNDRY_BUG) &&
                            tg3_4g_overflow_test(mapping, len))
                                would_hit_hwbug = 1;
        }
 
        if (!(tp->tg3_flags3 & TG3_FLG3_5755_PLUS)) {
-               tp->tg3_flags3 |= TG3_FLG3_4G_DMA_BNDRY_BUG;
-               tp->tg3_flags3 |= TG3_FLG3_40BIT_DMA_LIMIT_BUG;
+               if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906)
+                       tp->tg3_flags3 |= TG3_FLG3_SHORT_DMA_BUG;
+               else {
+                       tp->tg3_flags3 |= TG3_FLG3_4G_DMA_BNDRY_BUG;
+                       tp->tg3_flags3 |= TG3_FLG3_40BIT_DMA_LIMIT_BUG;
+               }
        }
 
        if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS) ||
                goto err_out_iounmap;
        }
 
-       if ((tp->tg3_flags3 & TG3_FLG3_5755_PLUS) ||
-           GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906)
+       if (tp->tg3_flags3 & TG3_FLG3_5755_PLUS)
                dev->netdev_ops = &tg3_netdev_ops;
        else
                dev->netdev_ops = &tg3_netdev_ops_dma_bug;