Merge branch 'stmmac-barrier-fixes-and-cleanup'
Niklas Cassel says: ==================== stmmac barrier fixes and cleanup ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
51846bfef6
|
@ -389,6 +389,8 @@ static void dwmac4_rd_prepare_tso_tx_desc(struct dma_desc *p, int is_fs,
|
|||
|
||||
static void dwmac4_release_tx_desc(struct dma_desc *p, int mode)
|
||||
{
|
||||
p->des0 = 0;
|
||||
p->des1 = 0;
|
||||
p->des2 = 0;
|
||||
p->des3 = 0;
|
||||
}
|
||||
|
|
|
@ -1844,6 +1844,11 @@ static void stmmac_tx_clean(struct stmmac_priv *priv, u32 queue)
|
|||
if (unlikely(status & tx_dma_own))
|
||||
break;
|
||||
|
||||
/* Make sure descriptor fields are read after reading
|
||||
* the own bit.
|
||||
*/
|
||||
dma_rmb();
|
||||
|
||||
/* Just consider the last segment and ...*/
|
||||
if (likely(!(status & tx_not_ls))) {
|
||||
/* ... verify the status error condition */
|
||||
|
@ -2983,14 +2988,21 @@ static netdev_tx_t stmmac_tso_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
tcp_hdrlen(skb) / 4, (skb->len - proto_hdr_len));
|
||||
|
||||
/* If context desc is used to change MSS */
|
||||
if (mss_desc)
|
||||
if (mss_desc) {
|
||||
/* Make sure that first descriptor has been completely
|
||||
* written, including its own bit. This is because MSS is
|
||||
* actually before first descriptor, so we need to make
|
||||
* sure that MSS's own bit is the last thing written.
|
||||
*/
|
||||
dma_wmb();
|
||||
priv->hw->desc->set_tx_owner(mss_desc);
|
||||
}
|
||||
|
||||
/* The own bit must be the latest setting done when prepare the
|
||||
* descriptor and then barrier is needed to make sure that
|
||||
* all is coherent before granting the DMA engine.
|
||||
*/
|
||||
dma_wmb();
|
||||
wmb();
|
||||
|
||||
if (netif_msg_pktdata(priv)) {
|
||||
pr_info("%s: curr=%d dirty=%d f=%d, e=%d, f_p=%p, nfrags %d\n",
|
||||
|
@ -3214,7 +3226,7 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
* descriptor and then barrier is needed to make sure that
|
||||
* all is coherent before granting the DMA engine.
|
||||
*/
|
||||
dma_wmb();
|
||||
wmb();
|
||||
}
|
||||
|
||||
netdev_tx_sent_queue(netdev_get_tx_queue(dev, queue), skb->len);
|
||||
|
|
Loading…
Reference in New Issue