diff options
| author | Grygorii Strashko <grygorii.strashko@ti.com> | 2021-08-06 17:59:03 +0300 |
|---|---|---|
| committer | Vignesh Raghavendra <vigneshr@ti.com> | 2021-08-15 12:47:24 +0530 |
| commit | 6bf9e41a41c3f72c05c8db020dedf9fe51a8712d (patch) | |
| tree | 28517e210fa5e5b583dd112676c8eb4e24368bf6 | |
| parent | ae3420c958620db2ea986d801ed976fed94f8240 (diff) | |
net: ethernet: ti: j721e-cpsw-virt-mac: protect RX IRQ enable/disable by flag
Add rx_irq_disabled flag to protect RX IRQ enable/disable and avoid
'Unbalanced enable' issues.
Need to support properly gro_flush_timeout.
Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>
Signed-off-by: Vignesh Raghavendra <vigneshr@ti.com>
| -rw-r--r-- | drivers/net/ethernet/ti/j721e-cpsw-virt-mac.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/drivers/net/ethernet/ti/j721e-cpsw-virt-mac.c b/drivers/net/ethernet/ti/j721e-cpsw-virt-mac.c index b66b769a87ba..26bac4798755 100644 --- a/drivers/net/ethernet/ti/j721e-cpsw-virt-mac.c +++ b/drivers/net/ethernet/ti/j721e-cpsw-virt-mac.c @@ -74,6 +74,7 @@ struct virt_cpsw_common { atomic_t tdown_cnt; struct virt_cpsw_rx_chn rx_chns; struct napi_struct napi_rx; + bool rx_irq_disabled; const char *rdev_name; struct rpmsg_remotedev *rdev; @@ -199,6 +200,10 @@ static int virt_cpsw_nuss_common_open(struct virt_cpsw_common *common, napi_enable(&common->napi_tx); napi_enable(&common->napi_rx); + if (common->rx_irq_disabled) { + common->rx_irq_disabled = false; + enable_irq(common->rx_chns.irq); + } return 0; } @@ -454,8 +459,12 @@ static int virt_cpsw_nuss_rx_poll(struct napi_struct *napi_rx, int budget) dev_dbg(common->dev, "%s num_rx:%d %d\n", __func__, num_rx, budget); - if (num_rx < budget && napi_complete_done(napi_rx, num_rx)) - enable_irq(common->rx_chns.irq); + if (num_rx < budget && napi_complete_done(napi_rx, num_rx)) { + if (common->rx_irq_disabled) { + common->rx_irq_disabled = false; + enable_irq(common->rx_chns.irq); + } + } return num_rx; } @@ -605,6 +614,7 @@ static irqreturn_t virt_cpsw_nuss_rx_irq(int irq, void *dev_id) { struct virt_cpsw_common *common = dev_id; + common->rx_irq_disabled = true; disable_irq_nosync(irq); napi_schedule(&common->napi_rx); |
