mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 03:15:31 +09:00
ethernet: stmmac: dwmac-rk-tool: Fix dma unmap for tx buffer
It is possible that there is no correct unmap for txbuffer, which may cause some unknown problems. Signed-off-by: David Wu <david.wu@rock-chips.com> Change-Id: Ibbbe4d541c6bdd695c862a51a66b9ab511a74c0a
This commit is contained in:
@@ -574,15 +574,15 @@ static inline int dwmac_rk_rx_fill(struct stmmac_priv *priv,
|
||||
static void dwmac_rk_rx_clean(struct stmmac_priv *priv,
|
||||
struct dwmac_rk_lb_priv *lb_priv)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
|
||||
skb = lb_priv->rx_skbuff;
|
||||
|
||||
if (likely(lb_priv->rx_skbuff)) {
|
||||
if (likely(lb_priv->rx_skbuff_dma)) {
|
||||
dma_unmap_single(priv->device,
|
||||
lb_priv->rx_skbuff_dma,
|
||||
lb_priv->dma_buf_sz, DMA_FROM_DEVICE);
|
||||
dev_kfree_skb(skb);
|
||||
lb_priv->rx_skbuff_dma = 0;
|
||||
}
|
||||
|
||||
if (likely(lb_priv->rx_skbuff)) {
|
||||
dev_consume_skb_any(lb_priv->rx_skbuff);
|
||||
lb_priv->rx_skbuff = NULL;
|
||||
}
|
||||
}
|
||||
@@ -594,7 +594,6 @@ static int dwmac_rk_rx_validate(struct stmmac_priv *priv,
|
||||
struct sk_buff *skb;
|
||||
int coe = priv->hw->rx_csum;
|
||||
unsigned int frame_len;
|
||||
int ret;
|
||||
|
||||
p = lb_priv->dma_rx;
|
||||
skb = lb_priv->rx_skbuff;
|
||||
@@ -619,11 +618,7 @@ static int dwmac_rk_rx_validate(struct stmmac_priv *priv,
|
||||
lb_priv->dma_buf_sz,
|
||||
DMA_FROM_DEVICE);
|
||||
|
||||
ret = dwmac_rk_loopback_validate(priv, lb_priv, skb);
|
||||
dwmac_rk_rx_clean(priv, lb_priv);
|
||||
dwmac_rk_rx_fill(priv, lb_priv);
|
||||
|
||||
return ret;
|
||||
return dwmac_rk_loopback_validate(priv, lb_priv, skb);
|
||||
}
|
||||
|
||||
static int dwmac_rk_get_desc_status(struct stmmac_priv *priv,
|
||||
@@ -655,10 +650,9 @@ static int dwmac_rk_get_desc_status(struct stmmac_priv *priv,
|
||||
static void dwmac_rk_tx_clean(struct stmmac_priv *priv,
|
||||
struct dwmac_rk_lb_priv *lb_priv)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
struct sk_buff *skb = lb_priv->tx_skbuff;
|
||||
struct dma_desc *p;
|
||||
|
||||
skb = lb_priv->tx_skbuff;
|
||||
p = lb_priv->dma_tx;
|
||||
|
||||
if (likely(lb_priv->tx_skbuff_dma)) {
|
||||
@@ -670,7 +664,7 @@ static void dwmac_rk_tx_clean(struct stmmac_priv *priv,
|
||||
}
|
||||
|
||||
if (likely(skb)) {
|
||||
dev_kfree_skb(skb);
|
||||
dev_consume_skb_any(skb);
|
||||
lb_priv->tx_skbuff = NULL;
|
||||
}
|
||||
|
||||
@@ -694,9 +688,10 @@ static int dwmac_rk_xmit(struct sk_buff *skb, struct net_device *dev,
|
||||
lb_priv->tx_skbuff = skb;
|
||||
|
||||
des = dma_map_single(priv->device, skb->data,
|
||||
nopaged_len, DMA_TO_DEVICE);
|
||||
nopaged_len, DMA_TO_DEVICE);
|
||||
if (dma_mapping_error(priv->device, des))
|
||||
goto dma_map_err;
|
||||
lb_priv->tx_skbuff_dma = des;
|
||||
|
||||
stmmac_set_desc_addr(priv, desc, des);
|
||||
lb_priv->tx_skbuff_dma_len = nopaged_len;
|
||||
|
||||
Reference in New Issue
Block a user