summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGrygorii Strashko <grygorii.strashko@ti.com>2021-08-06 17:59:03 +0300
committerVignesh Raghavendra <vigneshr@ti.com>2021-08-15 12:47:24 +0530
commit6bf9e41a41c3f72c05c8db020dedf9fe51a8712d (patch)
tree28517e210fa5e5b583dd112676c8eb4e24368bf6
parentae3420c958620db2ea986d801ed976fed94f8240 (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.c14
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);