gianfar: Fix reported number of sent bytes to BQL
[openwrt.git] / target / linux / mpc85xx / patches-3.10 / 220-fix_gianfar_reported_number_of_sent_bytes_to_BQL.patch
1 --- a/drivers/net/ethernet/freescale/gianfar.c
2 +++ b/drivers/net/ethernet/freescale/gianfar.c
3 @@ -2064,7 +2064,7 @@ static int gfar_start_xmit(struct sk_buf
4         int i, rq = 0, do_tstamp = 0;
5         u32 bufaddr;
6         unsigned long flags;
7 -       unsigned int nr_frags, nr_txbds, length, fcb_length = GMAC_FCB_LEN;
8 +       unsigned int nr_frags, nr_txbds, bytes_sent, fcb_length = GMAC_FCB_LEN;
9  
10         /* TOE=1 frames larger than 2500 bytes may see excess delays
11          * before start of transmission.
12 @@ -2130,7 +2130,10 @@ static int gfar_start_xmit(struct sk_buf
13         }
14  
15         /* Update transmit stats */
16 -       tx_queue->stats.tx_bytes += skb->len;
17 +       bytes_sent = skb->len;
18 +       tx_queue->stats.tx_bytes += bytes_sent;
19 +       /* keep Tx bytes on wire for BQL accounting */
20 +       GFAR_CB(skb)->bytes_sent = bytes_sent;
21         tx_queue->stats.tx_packets++;
22  
23         txbdp = txbdp_start = tx_queue->cur_tx;
24 @@ -2150,12 +2153,13 @@ static int gfar_start_xmit(struct sk_buf
25         } else {
26                 /* Place the fragment addresses and lengths into the TxBDs */
27                 for (i = 0; i < nr_frags; i++) {
28 +                       unsigned int frag_len;
29                         /* Point at the next BD, wrapping as needed */
30                         txbdp = next_txbd(txbdp, base, tx_queue->tx_ring_size);
31  
32 -                       length = skb_shinfo(skb)->frags[i].size;
33 +                       frag_len = skb_shinfo(skb)->frags[i].size;
34  
35 -                       lstatus = txbdp->lstatus | length |
36 +                       lstatus = txbdp->lstatus | frag_len |
37                                   BD_LFLAG(TXBD_READY);
38  
39                         /* Handle the last BD specially */
40 @@ -2165,7 +2169,7 @@ static int gfar_start_xmit(struct sk_buf
41                         bufaddr = skb_frag_dma_map(priv->dev,
42                                                    &skb_shinfo(skb)->frags[i],
43                                                    0,
44 -                                                  length,
45 +                                                  frag_len,
46                                                    DMA_TO_DEVICE);
47  
48                         /* set the TxBD length and buffer pointer */
49 @@ -2231,7 +2235,7 @@ static int gfar_start_xmit(struct sk_buf
50                 lstatus |= BD_LFLAG(TXBD_CRC | TXBD_READY) | skb_headlen(skb);
51         }
52  
53 -       netdev_tx_sent_queue(txq, skb->len);
54 +       netdev_tx_sent_queue(txq, bytes_sent);
55  
56         /* We can work in parallel with gfar_clean_tx_ring(), except
57          * when modifying num_txbdfree. Note that we didn't grab the lock
58 @@ -2551,7 +2555,7 @@ static void gfar_clean_tx_ring(struct gf
59                         bdp = next_txbd(bdp, base, tx_ring_size);
60                 }
61  
62 -               bytes_sent += skb->len;
63 +               bytes_sent += GFAR_CB(skb)->bytes_sent;
64  
65                 dev_kfree_skb_any(skb);
66  
67 --- a/drivers/net/ethernet/freescale/gianfar.h
68 +++ b/drivers/net/ethernet/freescale/gianfar.h
69 @@ -571,7 +571,7 @@ struct rxfcb {
70  };
71  
72  struct gianfar_skb_cb {
73 -       int alignamount;
74 +       unsigned int bytes_sent; /* bytes-on-wire (i.e. no FCB) */
75  };
76  
77  #define GFAR_CB(skb) ((struct gianfar_skb_cb *)((skb)->cb))