Skip to content

Commit 9a00b69

Browse files
Masahisa KOJIMAdavem330
authored andcommitted
net: socionext: reset hardware in ndo_stop
When the interface is down, head/tail of the descriptor ring address is set to 0 in netsec_netdev_stop(). But netsec hardware still keeps the previous descriptor ring address, so there is inconsistency between driver and hardware after interface is up at a later time. To address this inconsistency, add netsec_reset_hardware() when the interface is down. In addition, to minimize the reset process, add flag to decide whether driver loads the netsec microcode. Even if driver resets the netsec hardware, netsec microcode keeps resident on RAM, so it is ok we only load the microcode at initialization. This patch is critical for installation over network. Signed-off-by: Masahisa KOJIMA <[email protected]> Fixes: 533dd11 ("net: socionext: Add Synquacer NetSec driver") Signed-off-by: Jassi Brar <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent c009f41 commit 9a00b69

File tree

1 file changed

+15
-8
lines changed

1 file changed

+15
-8
lines changed

drivers/net/ethernet/socionext/netsec.c

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1057,7 +1057,8 @@ static int netsec_netdev_load_microcode(struct netsec_priv *priv)
10571057
return 0;
10581058
}
10591059

1060-
static int netsec_reset_hardware(struct netsec_priv *priv)
1060+
static int netsec_reset_hardware(struct netsec_priv *priv,
1061+
bool load_ucode)
10611062
{
10621063
u32 value;
10631064
int err;
@@ -1102,11 +1103,14 @@ static int netsec_reset_hardware(struct netsec_priv *priv)
11021103
netsec_write(priv, NETSEC_REG_NRM_RX_CONFIG,
11031104
1 << NETSEC_REG_DESC_ENDIAN);
11041105

1105-
err = netsec_netdev_load_microcode(priv);
1106-
if (err) {
1107-
netif_err(priv, probe, priv->ndev,
1108-
"%s: failed to load microcode (%d)\n", __func__, err);
1109-
return err;
1106+
if (load_ucode) {
1107+
err = netsec_netdev_load_microcode(priv);
1108+
if (err) {
1109+
netif_err(priv, probe, priv->ndev,
1110+
"%s: failed to load microcode (%d)\n",
1111+
__func__, err);
1112+
return err;
1113+
}
11101114
}
11111115

11121116
/* start DMA engines */
@@ -1328,6 +1332,7 @@ static int netsec_netdev_open(struct net_device *ndev)
13281332

13291333
static int netsec_netdev_stop(struct net_device *ndev)
13301334
{
1335+
int ret;
13311336
struct netsec_priv *priv = netdev_priv(ndev);
13321337

13331338
netif_stop_queue(priv->ndev);
@@ -1343,12 +1348,14 @@ static int netsec_netdev_stop(struct net_device *ndev)
13431348
netsec_uninit_pkt_dring(priv, NETSEC_RING_TX);
13441349
netsec_uninit_pkt_dring(priv, NETSEC_RING_RX);
13451350

1351+
ret = netsec_reset_hardware(priv, false);
1352+
13461353
phy_stop(ndev->phydev);
13471354
phy_disconnect(ndev->phydev);
13481355

13491356
pm_runtime_put_sync(priv->dev);
13501357

1351-
return 0;
1358+
return ret;
13521359
}
13531360

13541361
static int netsec_netdev_init(struct net_device *ndev)
@@ -1364,7 +1371,7 @@ static int netsec_netdev_init(struct net_device *ndev)
13641371
if (ret)
13651372
goto err1;
13661373

1367-
ret = netsec_reset_hardware(priv);
1374+
ret = netsec_reset_hardware(priv, true);
13681375
if (ret)
13691376
goto err2;
13701377

0 commit comments

Comments
 (0)