|
@@ -2983,8 +2983,15 @@ static netdev_tx_t stmmac_tso_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
tcp_hdrlen(skb) / 4, (skb->len - proto_hdr_len));
|
|
tcp_hdrlen(skb) / 4, (skb->len - proto_hdr_len));
|
|
|
|
|
|
/* If context desc is used to change MSS */
|
|
/* 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);
|
|
priv->hw->desc->set_tx_owner(mss_desc);
|
|
|
|
+ }
|
|
|
|
|
|
/* The own bit must be the latest setting done when prepare the
|
|
/* The own bit must be the latest setting done when prepare the
|
|
* descriptor and then barrier is needed to make sure that
|
|
* descriptor and then barrier is needed to make sure that
|