Commit a98c1517 authored by Ilias Apalodimas's avatar Ilias Apalodimas Committed by Greg Kroah-Hartman

net: netsec: initialize tx ring on ndo_open

[ Upstream commit 39e3622e ]

Since we changed the Tx ring handling and now depends on bit31 to figure
out the owner of the descriptor, we should initialize this every time
the device goes down-up instead of doing it once on driver init. If the
value is not correctly initialized the device won't have any available
descriptors

Changes since v1:
- Typo fixes

Fixes: 35e07d23 ("net: socionext: remove mmio reads on Tx")
Signed-off-by: default avatarIlias Apalodimas <ilias.apalodimas@linaro.org>
Acked-by: default avatarArd Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 3c795a8e
...@@ -1029,7 +1029,6 @@ static void netsec_free_dring(struct netsec_priv *priv, int id) ...@@ -1029,7 +1029,6 @@ static void netsec_free_dring(struct netsec_priv *priv, int id)
static int netsec_alloc_dring(struct netsec_priv *priv, enum ring_id id) static int netsec_alloc_dring(struct netsec_priv *priv, enum ring_id id)
{ {
struct netsec_desc_ring *dring = &priv->desc_ring[id]; struct netsec_desc_ring *dring = &priv->desc_ring[id];
int i;
dring->vaddr = dma_alloc_coherent(priv->dev, DESC_SZ * DESC_NUM, dring->vaddr = dma_alloc_coherent(priv->dev, DESC_SZ * DESC_NUM,
&dring->desc_dma, GFP_KERNEL); &dring->desc_dma, GFP_KERNEL);
...@@ -1040,19 +1039,6 @@ static int netsec_alloc_dring(struct netsec_priv *priv, enum ring_id id) ...@@ -1040,19 +1039,6 @@ static int netsec_alloc_dring(struct netsec_priv *priv, enum ring_id id)
if (!dring->desc) if (!dring->desc)
goto err; goto err;
if (id == NETSEC_RING_TX) {
for (i = 0; i < DESC_NUM; i++) {
struct netsec_de *de;
de = dring->vaddr + (DESC_SZ * i);
/* de->attr is not going to be accessed by the NIC
* until netsec_set_tx_de() is called.
* No need for a dma_wmb() here
*/
de->attr = 1U << NETSEC_TX_SHIFT_OWN_FIELD;
}
}
return 0; return 0;
err: err:
netsec_free_dring(priv, id); netsec_free_dring(priv, id);
...@@ -1060,6 +1046,23 @@ static int netsec_alloc_dring(struct netsec_priv *priv, enum ring_id id) ...@@ -1060,6 +1046,23 @@ static int netsec_alloc_dring(struct netsec_priv *priv, enum ring_id id)
return -ENOMEM; return -ENOMEM;
} }
static void netsec_setup_tx_dring(struct netsec_priv *priv)
{
struct netsec_desc_ring *dring = &priv->desc_ring[NETSEC_RING_TX];
int i;
for (i = 0; i < DESC_NUM; i++) {
struct netsec_de *de;
de = dring->vaddr + (DESC_SZ * i);
/* de->attr is not going to be accessed by the NIC
* until netsec_set_tx_de() is called.
* No need for a dma_wmb() here
*/
de->attr = 1U << NETSEC_TX_SHIFT_OWN_FIELD;
}
}
static int netsec_setup_rx_dring(struct netsec_priv *priv) static int netsec_setup_rx_dring(struct netsec_priv *priv)
{ {
struct netsec_desc_ring *dring = &priv->desc_ring[NETSEC_RING_RX]; struct netsec_desc_ring *dring = &priv->desc_ring[NETSEC_RING_RX];
...@@ -1361,6 +1364,7 @@ static int netsec_netdev_open(struct net_device *ndev) ...@@ -1361,6 +1364,7 @@ static int netsec_netdev_open(struct net_device *ndev)
pm_runtime_get_sync(priv->dev); pm_runtime_get_sync(priv->dev);
netsec_setup_tx_dring(priv);
ret = netsec_setup_rx_dring(priv); ret = netsec_setup_rx_dring(priv);
if (ret) { if (ret) {
netif_err(priv, probe, priv->ndev, netif_err(priv, probe, priv->ndev,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment