[PATCH net-next V2 07/16] net: fec: set cbd_sc without relying on previous value
From: Troy Kisky <hidden>
Date: 2016-03-04 16:08:07
Also in:
netdev
On 3/4/2016 2:29 AM, Fugang Duan wrote:
From: Troy Kisky <redacted> Sent: Thursday, February 25, 2016 8:37 AMquoted
To: netdev at vger.kernel.org; davem at davemloft.net; b38611 at freescale.com Cc: fabio.estevam at freescale.com; l.stach at pengutronix.de; andrew at lunn.ch; tremyfr at gmail.com; linux at arm.linux.org.uk; linux-arm- kernel at lists.infradead.org; laci at boundarydevices.com; shawnguo at kernel.org; johannes at sipsolutions.net; stillcompiling at gmail.com; sergei.shtylyov at cogentembedded.com; arnd at arndb.de; Troy Kisky [off-list ref] Subject: [PATCH net-next V2 07/16] net: fec: set cbd_sc without relying on previous value Relying on the wrap bit to stay valid once initialized when the controller also writes to this byte seems undesirable since we can easily know what the value should be. Signed-off-by: Troy Kisky <redacted> --- drivers/net/ethernet/freescale/fec_main.c | 38 +++++++++---------------------- 1 file changed, 11 insertions(+), 27 deletions(-)diff --git a/drivers/net/ethernet/freescale/fec_main.cb/drivers/net/ethernet/freescale/fec_main.c index 791f385..6ceb5f9 100644--- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c@@ -340,9 +340,8 @@ fec_enet_txq_submit_frag_skb(structfec_enet_priv_tx_q *txq, bdp = fec_enet_get_nextdesc(bdp, &txq->bd); ebdp = (struct bufdesc_ex *)bdp; - status = fec16_to_cpu(bdp->cbd_sc); - status &= ~BD_ENET_TX_STATS; - status |= (BD_ENET_TX_TC | BD_ENET_TX_READY); + status = BD_ENET_TX_TC | BD_ENET_TX_READY | + ((bdp == txq->bd.last) ? BD_SC_WRAP : 0); frag_len = skb_shinfo(skb)->frags[frag].size; /* Handle the last BD specially */@@ -436,8 +435,6 @@ static int fec_enet_txq_submit_skb(structfec_enet_priv_tx_q *txq, /* Fill in a Tx ring entry */ bdp = txq->bd.cur; last_bdp = bdp; - status = fec16_to_cpu(bdp->cbd_sc); - status &= ~BD_ENET_TX_STATS; /* Set buffer length and buffer pointer */ bufaddr = skb->data;@@ -462,6 +459,8 @@ static int fec_enet_txq_submit_skb(structfec_enet_priv_tx_q *txq, return NETDEV_TX_OK; } + status = BD_ENET_TX_TC | BD_ENET_TX_READY | + ((bdp == txq->bd.last) ? BD_SC_WRAP : 0); if (nr_frags) { last_bdp = fec_enet_txq_submit_frag_skb(txq, skb, ndev); if (IS_ERR(last_bdp)) {@@ -512,7 +511,6 @@ static int fec_enet_txq_submit_skb(structfec_enet_priv_tx_q *txq, /* Send it on its way. Tell FEC it's ready, interrupt when done, * it's the last BD of the frame, and to put the CRC on the end. */ - status |= (BD_ENET_TX_READY | BD_ENET_TX_TC);This is completely error. We have to prepare all BDs for frag skb, and then enable "READY" and "TC" bit for the first BD, otherwise uDMA copy un-correct data to fifo.
I don't follow. Please read patch again. Thanks Troy