703-net-qualcomm-ipqess-release-IRQ-s-on-network-device-.patch 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. From 5f15f7f170c76220dfd36cb9037d7848d1fc4aaf Mon Sep 17 00:00:00 2001
  2. From: Robert Marko <[email protected]>
  3. Date: Tue, 15 Aug 2023 14:30:50 +0200
  4. Subject: [PATCH] net: qualcomm: ipqess: release IRQ-s on network device stop
  5. Currently, IPQESS driver is obtaining the IRQ-s during ndo_open, but they
  6. are never freed as they are device managed.
  7. However, it is not enough for them to be released when device is removed
  8. as the same network device can be stopped and started multiple times which
  9. on the second start would lead to IRQ request to fail with -EBUSY as they
  10. have already been requested before and are not of the shared type with:
  11. [ 34.480769] ipqess-edma c080000.ethernet eth0: Link is Down
  12. [ 34.488070] ipqess-edma c080000.ethernet eth0: ipqess_open
  13. [ 34.488131] genirq: Flags mismatch irq 37. 00000001 (c080000.ethernet:txq0) vs. 00000001 (c080000.ethernet:txq0)
  14. [ 34.494527] ipqess-edma c080000.ethernet eth0: ipqess_open
  15. [ 34.502892] genirq: Flags mismatch irq 37. 00000001 (c080000.ethernet:txq0) vs. 00000001 (c080000.ethernet:txq0)
  16. [ 34.508137] qca8k-ipq4019 c000000.switch lan1: failed to open master eth0
  17. [ 34.518966] br-lan: port 1(lan1) entered blocking state
  18. [ 34.525165] br-lan: port 1(lan1) entered disabled state
  19. [ 34.530633] device lan1 entered promiscuous mode
  20. [ 34.548598] ipqess-edma c080000.ethernet eth0: ipqess_open
  21. [ 34.548660] genirq: Flags mismatch irq 37. 00000001 (c080000.ethernet:txq0) vs. 00000001 (c080000.ethernet:txq0)
  22. [ 34.553111] qca8k-ipq4019 c000000.switch lan2: failed to open master eth0
  23. [ 34.563841] br-lan: port 2(lan2) entered blocking state
  24. [ 34.570083] br-lan: port 2(lan2) entered disabled state
  25. [ 34.575530] device lan2 entered promiscuous mode
  26. [ 34.587067] ipqess-edma c080000.ethernet eth0: ipqess_open
  27. [ 34.587132] genirq: Flags mismatch irq 37. 00000001 (c080000.ethernet:txq0) vs. 00000001 (c080000.ethernet:txq0)
  28. [ 34.591579] qca8k-ipq4019 c000000.switch lan3: failed to open master eth0
  29. [ 34.602451] br-lan: port 3(lan3) entered blocking state
  30. [ 34.608496] br-lan: port 3(lan3) entered disabled state
  31. [ 34.614084] device lan3 entered promiscuous mode
  32. [ 34.626405] ipqess-edma c080000.ethernet eth0: ipqess_open
  33. [ 34.626468] genirq: Flags mismatch irq 37. 00000001 (c080000.ethernet:txq0) vs. 00000001 (c080000.ethernet:txq0)
  34. [ 34.630871] qca8k-ipq4019 c000000.switch lan4: failed to open master eth0
  35. [ 34.641689] br-lan: port 4(lan4) entered blocking state
  36. [ 34.647834] br-lan: port 4(lan4) entered disabled state
  37. [ 34.653455] device lan4 entered promiscuous mode
  38. [ 34.667282] ipqess-edma c080000.ethernet eth0: ipqess_open
  39. [ 34.667364] genirq: Flags mismatch irq 37. 00000001 (c080000.ethernet:txq0) vs. 00000001 (c080000.ethernet:txq0)
  40. [ 34.671830] qca8k-ipq4019 c000000.switch wan: failed to open master eth0
  41. So, lets free the IRQ-s on ndo_stop after stopping NAPI and HW IRQ-s.
  42. Signed-off-by: Robert Marko <[email protected]>
  43. ---
  44. drivers/net/ethernet/qualcomm/ipqess/ipqess.c | 13 +++++++++++++
  45. 1 file changed, 13 insertions(+)
  46. --- a/drivers/net/ethernet/qualcomm/ipqess/ipqess.c
  47. +++ b/drivers/net/ethernet/qualcomm/ipqess/ipqess.c
  48. @@ -636,9 +636,22 @@ static int ipqess_stop(struct net_device
  49. netif_tx_stop_all_queues(netdev);
  50. phylink_stop(ess->phylink);
  51. ipqess_irq_disable(ess);
  52. +
  53. for (i = 0; i < IPQESS_NETDEV_QUEUES; i++) {
  54. + int qid;
  55. +
  56. napi_disable(&ess->tx_ring[i].napi_tx);
  57. napi_disable(&ess->rx_ring[i].napi_rx);
  58. +
  59. + qid = ess->tx_ring[i].idx;
  60. + devm_free_irq(&netdev->dev,
  61. + ess->tx_irq[qid],
  62. + &ess->tx_ring[i]);
  63. +
  64. + qid = ess->rx_ring[i].idx;
  65. + devm_free_irq(&netdev->dev,
  66. + ess->rx_irq[qid],
  67. + &ess->rx_ring[i]);
  68. }
  69. return 0;