aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/tg3.c52
-rw-r--r--drivers/net/tg3.h1
2 files changed, 47 insertions, 6 deletions
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c
index b93ba3d2192..c77a39d6cd1 100644
--- a/drivers/net/tg3.c
+++ b/drivers/net/tg3.c
@@ -190,6 +190,7 @@ static inline void _tg3_flag_clear(enum TG3_FLAGS flag, unsigned long *bits)
190 190
191/* minimum number of free TX descriptors required to wake up TX process */ 191/* minimum number of free TX descriptors required to wake up TX process */
192#define TG3_TX_WAKEUP_THRESH(tnapi) ((tnapi)->tx_pending / 4) 192#define TG3_TX_WAKEUP_THRESH(tnapi) ((tnapi)->tx_pending / 4)
193#define TG3_TX_BD_DMA_MAX 4096
193 194
194#define TG3_RAW_IP_ALIGN 2 195#define TG3_RAW_IP_ALIGN 2
195 196
@@ -5940,14 +5941,50 @@ static bool tg3_tx_frag_set(struct tg3_napi *tnapi, u32 *entry, u32 *budget,
5940 if (tg3_40bit_overflow_test(tp, map, len)) 5941 if (tg3_40bit_overflow_test(tp, map, len))
5941 hwbug = 1; 5942 hwbug = 1;
5942 5943
5943 if (*budget) { 5944 if (tg3_flag(tp, 4K_FIFO_LIMIT)) {
5945 u32 tmp_flag = flags & ~TXD_FLAG_END;
5946 while (len > TG3_TX_BD_DMA_MAX) {
5947 u32 frag_len = TG3_TX_BD_DMA_MAX;
5948 len -= TG3_TX_BD_DMA_MAX;
5949
5950 if (len) {
5951 tnapi->tx_buffers[*entry].fragmented = true;
5952 /* Avoid the 8byte DMA problem */
5953 if (len <= 8) {
5954 len += TG3_TX_BD_DMA_MAX / 2;
5955 frag_len = TG3_TX_BD_DMA_MAX / 2;
5956 }
5957 } else
5958 tmp_flag = flags;
5959
5960 if (*budget) {
5961 tg3_tx_set_bd(&tnapi->tx_ring[*entry], map,
5962 frag_len, tmp_flag, mss, vlan);
5963 (*budget)--;
5964 *entry = NEXT_TX(*entry);
5965 } else {
5966 hwbug = 1;
5967 break;
5968 }
5969
5970 map += frag_len;
5971 }
5972
5973 if (len) {
5974 if (*budget) {
5975 tg3_tx_set_bd(&tnapi->tx_ring[*entry], map,
5976 len, flags, mss, vlan);
5977 (*budget)--;
5978 *entry = NEXT_TX(*entry);
5979 } else {
5980 hwbug = 1;
5981 }
5982 }
5983 } else {
5944 tg3_tx_set_bd(&tnapi->tx_ring[*entry], map, 5984 tg3_tx_set_bd(&tnapi->tx_ring[*entry], map,
5945 len, flags, mss, vlan); 5985 len, flags, mss, vlan);
5946 (*budget)--; 5986 *entry = NEXT_TX(*entry);
5947 } else 5987 }
5948 hwbug = 1;
5949
5950 *entry = NEXT_TX(*entry);
5951 5988
5952 return hwbug; 5989 return hwbug;
5953} 5990}
@@ -13899,6 +13936,9 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
13899 if (tg3_flag(tp, 5755_PLUS)) 13936 if (tg3_flag(tp, 5755_PLUS))
13900 tg3_flag_set(tp, SHORT_DMA_BUG); 13937 tg3_flag_set(tp, SHORT_DMA_BUG);
13901 13938
13939 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5719)
13940 tg3_flag_set(tp, 4K_FIFO_LIMIT);
13941
13902 if (tg3_flag(tp, 5717_PLUS)) 13942 if (tg3_flag(tp, 5717_PLUS))
13903 tg3_flag_set(tp, LRG_PROD_RING_CAP); 13943 tg3_flag_set(tp, LRG_PROD_RING_CAP);
13904 13944
diff --git a/drivers/net/tg3.h b/drivers/net/tg3.h
index 466dd7add12..2ea456dd588 100644
--- a/drivers/net/tg3.h
+++ b/drivers/net/tg3.h
@@ -2905,6 +2905,7 @@ enum TG3_FLAGS {
2905 TG3_FLAG_57765_PLUS, 2905 TG3_FLAG_57765_PLUS,
2906 TG3_FLAG_APE_HAS_NCSI, 2906 TG3_FLAG_APE_HAS_NCSI,
2907 TG3_FLAG_5717_PLUS, 2907 TG3_FLAG_5717_PLUS,
2908 TG3_FLAG_4K_FIFO_LIMIT,
2908 2909
2909 /* Add new flags before this comment and TG3_FLAG_NUMBER_OF_FLAGS */ 2910 /* Add new flags before this comment and TG3_FLAG_NUMBER_OF_FLAGS */
2910 TG3_FLAG_NUMBER_OF_FLAGS, /* Last entry in enum TG3_FLAGS */ 2911 TG3_FLAG_NUMBER_OF_FLAGS, /* Last entry in enum TG3_FLAGS */