forked from Minki/linux
net: systemport: enable RX interrupts after NAPI
There is currently a small window during which the SYSTEMPORT adapter
enables its RX interrupts without having enabled its NAPI handler, which
can result in packets to be discarded during interface bringup.
A similar but more serious window exists in bcm_sysport_resume() during
which we can have the RDMA engine not fully prepared to receive packets
and yet having RX interrupts enabled.
Fix this my moving the RX interrupt enable down to
bcm_sysport_netif_start() after napi_enable() for the RX path is called,
which fixes both call sites: bcm_sysport_open() and
bcm_sysport_resume().
Fixes: b02e6d9ba7
("net: systemport: add bcm_sysport_netif_{enable,stop}")
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
ebcf34f3d4
commit
8edf0047f4
@ -1397,6 +1397,9 @@ static void bcm_sysport_netif_start(struct net_device *dev)
|
|||||||
/* Enable NAPI */
|
/* Enable NAPI */
|
||||||
napi_enable(&priv->napi);
|
napi_enable(&priv->napi);
|
||||||
|
|
||||||
|
/* Enable RX interrupt and TX ring full interrupt */
|
||||||
|
intrl2_0_mask_clear(priv, INTRL2_0_RDMA_MBDONE | INTRL2_0_TX_RING_FULL);
|
||||||
|
|
||||||
phy_start(priv->phydev);
|
phy_start(priv->phydev);
|
||||||
|
|
||||||
/* Enable TX interrupts for the 32 TXQs */
|
/* Enable TX interrupts for the 32 TXQs */
|
||||||
@ -1499,9 +1502,6 @@ static int bcm_sysport_open(struct net_device *dev)
|
|||||||
if (ret)
|
if (ret)
|
||||||
goto out_free_rx_ring;
|
goto out_free_rx_ring;
|
||||||
|
|
||||||
/* Enable RX interrupt and TX ring full interrupt */
|
|
||||||
intrl2_0_mask_clear(priv, INTRL2_0_RDMA_MBDONE | INTRL2_0_TX_RING_FULL);
|
|
||||||
|
|
||||||
/* Turn on TDMA */
|
/* Turn on TDMA */
|
||||||
ret = tdma_enable_set(priv, 1);
|
ret = tdma_enable_set(priv, 1);
|
||||||
if (ret)
|
if (ret)
|
||||||
@ -1885,9 +1885,6 @@ static int bcm_sysport_resume(struct device *d)
|
|||||||
|
|
||||||
netif_device_attach(dev);
|
netif_device_attach(dev);
|
||||||
|
|
||||||
/* Enable RX interrupt and TX ring full interrupt */
|
|
||||||
intrl2_0_mask_clear(priv, INTRL2_0_RDMA_MBDONE | INTRL2_0_TX_RING_FULL);
|
|
||||||
|
|
||||||
/* RX pipe enable */
|
/* RX pipe enable */
|
||||||
topctrl_writel(priv, 0, RX_FLUSH_CNTL);
|
topctrl_writel(priv, 0, RX_FLUSH_CNTL);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user