735-v5.14-04-net-dsa-qca8k-handle-qca8k_set_page-errors.patch 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. From ba5707ec58cfb6853dff41c2aae72deb6a03d389 Mon Sep 17 00:00:00 2001
  2. From: Ansuel Smith <[email protected]>
  3. Date: Fri, 14 May 2021 22:59:54 +0200
  4. Subject: [PATCH] net: dsa: qca8k: handle qca8k_set_page errors
  5. With a remote possibility, the set_page function can fail. Since this is
  6. a critical part of the write/read qca8k regs, propagate the error and
  7. terminate any read/write operation.
  8. Signed-off-by: Ansuel Smith <[email protected]>
  9. Reviewed-by: Andrew Lunn <[email protected]>
  10. Signed-off-by: David S. Miller <[email protected]>
  11. ---
  12. drivers/net/dsa/qca8k.c | 33 ++++++++++++++++++++++++++-------
  13. 1 file changed, 26 insertions(+), 7 deletions(-)
  14. --- a/drivers/net/dsa/qca8k.c
  15. +++ b/drivers/net/dsa/qca8k.c
  16. @@ -127,16 +127,23 @@ qca8k_mii_write32(struct mii_bus *bus, i
  17. "failed to write qca8k 32bit register\n");
  18. }
  19. -static void
  20. +static int
  21. qca8k_set_page(struct mii_bus *bus, u16 page)
  22. {
  23. + int ret;
  24. +
  25. if (page == qca8k_current_page)
  26. - return;
  27. + return 0;
  28. - if (bus->write(bus, 0x18, 0, page) < 0)
  29. + ret = bus->write(bus, 0x18, 0, page);
  30. + if (ret < 0) {
  31. dev_err_ratelimited(&bus->dev,
  32. "failed to set qca8k page\n");
  33. + return ret;
  34. + }
  35. +
  36. qca8k_current_page = page;
  37. + return 0;
  38. }
  39. static u32
  40. @@ -150,11 +157,14 @@ qca8k_read(struct qca8k_priv *priv, u32
  41. mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED);
  42. - qca8k_set_page(bus, page);
  43. + val = qca8k_set_page(bus, page);
  44. + if (val < 0)
  45. + goto exit;
  46. +
  47. val = qca8k_mii_read32(bus, 0x10 | r2, r1);
  48. +exit:
  49. mutex_unlock(&bus->mdio_lock);
  50. -
  51. return val;
  52. }
  53. @@ -163,14 +173,19 @@ qca8k_write(struct qca8k_priv *priv, u32
  54. {
  55. struct mii_bus *bus = priv->bus;
  56. u16 r1, r2, page;
  57. + int ret;
  58. qca8k_split_addr(reg, &r1, &r2, &page);
  59. mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED);
  60. - qca8k_set_page(bus, page);
  61. + ret = qca8k_set_page(bus, page);
  62. + if (ret < 0)
  63. + goto exit;
  64. +
  65. qca8k_mii_write32(bus, 0x10 | r2, r1, val);
  66. +exit:
  67. mutex_unlock(&bus->mdio_lock);
  68. }
  69. @@ -185,12 +200,16 @@ qca8k_rmw(struct qca8k_priv *priv, u32 r
  70. mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED);
  71. - qca8k_set_page(bus, page);
  72. + ret = qca8k_set_page(bus, page);
  73. + if (ret < 0)
  74. + goto exit;
  75. +
  76. ret = qca8k_mii_read32(bus, 0x10 | r2, r1);
  77. ret &= ~mask;
  78. ret |= val;
  79. qca8k_mii_write32(bus, 0x10 | r2, r1, ret);
  80. +exit:
  81. mutex_unlock(&bus->mdio_lock);
  82. return ret;