sky2: force early transmit interrupts

Avoid premature transmit ring full conditions.
Force a transmit status interrupt if transmit ring gets nearly full
and after a TSO send.

Allow more entries in transmit ring to be used if dma_addr is 32 bits

Signed-off-by: Stephen Hemminger <shemminger@osdl.org>

authored by Stephen Hemminger and committed by Francois Romieu b19666d9 28a31860

+9 -4
+9 -4
drivers/net/sky2.c
··· 74 #define TX_RING_SIZE 512 75 #define TX_DEF_PENDING (TX_RING_SIZE - 1) 76 #define TX_MIN_PENDING 64 77 - #define MAX_SKB_TX_LE (4 + 2*MAX_SKB_FRAGS) 78 79 #define STATUS_RING_SIZE 2048 /* 2 ports * (TX + 2*RX) */ 80 #define STATUS_LE_BYTES (STATUS_RING_SIZE*sizeof(struct sky2_status_le)) ··· 1145 struct sky2_tx_le *le = NULL; 1146 struct tx_ring_info *re; 1147 unsigned i, len; 1148 dma_addr_t mapping; 1149 u32 addr64; 1150 u16 mss; ··· 1288 re->idx = sky2->tx_prod; 1289 le->ctrl |= EOP; 1290 1291 sky2_put_idx(hw, txqaddr[sky2->port], sky2->tx_prod, 1292 &sky2->tx_last_put, TX_RING_SIZE); 1293 - 1294 - if (tx_avail(sky2) <= MAX_SKB_TX_LE) 1295 - netif_stop_queue(dev); 1296 1297 out_unlock: 1298 spin_unlock(&sky2->tx_lock);
··· 74 #define TX_RING_SIZE 512 75 #define TX_DEF_PENDING (TX_RING_SIZE - 1) 76 #define TX_MIN_PENDING 64 77 + #define MAX_SKB_TX_LE (4 + (sizeof(dma_addr_t)/sizeof(u32))*MAX_SKB_FRAGS) 78 79 #define STATUS_RING_SIZE 2048 /* 2 ports * (TX + 2*RX) */ 80 #define STATUS_LE_BYTES (STATUS_RING_SIZE*sizeof(struct sky2_status_le)) ··· 1145 struct sky2_tx_le *le = NULL; 1146 struct tx_ring_info *re; 1147 unsigned i, len; 1148 + int avail; 1149 dma_addr_t mapping; 1150 u32 addr64; 1151 u16 mss; ··· 1287 re->idx = sky2->tx_prod; 1288 le->ctrl |= EOP; 1289 1290 + avail = tx_avail(sky2); 1291 + if (mss != 0 || avail < TX_MIN_PENDING) { 1292 + le->ctrl |= FRC_STAT; 1293 + if (avail <= MAX_SKB_TX_LE) 1294 + netif_stop_queue(dev); 1295 + } 1296 + 1297 sky2_put_idx(hw, txqaddr[sky2->port], sky2->tx_prod, 1298 &sky2->tx_last_put, TX_RING_SIZE); 1299 1300 out_unlock: 1301 spin_unlock(&sky2->tx_lock);