2
0

321-v4.16-0002-brcmfmac-separate-firmware-errors-from-i-o-errors.patch 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. From b69c1df47281ad47bd2037a42b98f5c7115b7fd5 Mon Sep 17 00:00:00 2001
  2. From: Arend Van Spriel <[email protected]>
  3. Date: Mon, 22 Jan 2018 21:46:40 +0100
  4. Subject: [PATCH] brcmfmac: separate firmware errors from i/o errors
  5. When using the firmware api it can fail simply because firmware does
  6. not like the request or it fails due to issues in the host interface.
  7. Currently, there is only a single error code which is confusing. So
  8. adding a parameter to pass the firmware error separately and in case
  9. of a firmware error always return -EBADE to user-space.
  10. Reviewed-by: Hante Meuleman <[email protected]>
  11. Reviewed-by: Pieter-Paul Giesberts <[email protected]>
  12. Reviewed-by: Franky Lin <[email protected]>
  13. Signed-off-by: Arend van Spriel <[email protected]>
  14. Signed-off-by: Kalle Valo <[email protected]>
  15. ---
  16. drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c | 11 ++++++-----
  17. drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.c | 16 +++++++++++-----
  18. .../net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c | 10 ++++++----
  19. drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.h | 14 ++++++++------
  20. 4 files changed, 31 insertions(+), 20 deletions(-)
  21. --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c
  22. +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c
  23. @@ -165,7 +165,7 @@ static int brcmf_proto_bcdc_cmplt(struct
  24. static int
  25. brcmf_proto_bcdc_query_dcmd(struct brcmf_pub *drvr, int ifidx, uint cmd,
  26. - void *buf, uint len)
  27. + void *buf, uint len, int *fwerr)
  28. {
  29. struct brcmf_bcdc *bcdc = (struct brcmf_bcdc *)drvr->proto->pd;
  30. struct brcmf_proto_bcdc_dcmd *msg = &bcdc->msg;
  31. @@ -175,6 +175,7 @@ brcmf_proto_bcdc_query_dcmd(struct brcmf
  32. brcmf_dbg(BCDC, "Enter, cmd %d len %d\n", cmd, len);
  33. + *fwerr = 0;
  34. ret = brcmf_proto_bcdc_msg(drvr, ifidx, cmd, buf, len, false);
  35. if (ret < 0) {
  36. brcmf_err("brcmf_proto_bcdc_msg failed w/status %d\n",
  37. @@ -215,15 +216,14 @@ retry:
  38. /* Check the ERROR flag */
  39. if (flags & BCDC_DCMD_ERROR)
  40. - ret = le32_to_cpu(msg->status);
  41. -
  42. + *fwerr = le32_to_cpu(msg->status);
  43. done:
  44. return ret;
  45. }
  46. static int
  47. brcmf_proto_bcdc_set_dcmd(struct brcmf_pub *drvr, int ifidx, uint cmd,
  48. - void *buf, uint len)
  49. + void *buf, uint len, int *fwerr)
  50. {
  51. struct brcmf_bcdc *bcdc = (struct brcmf_bcdc *)drvr->proto->pd;
  52. struct brcmf_proto_bcdc_dcmd *msg = &bcdc->msg;
  53. @@ -232,6 +232,7 @@ brcmf_proto_bcdc_set_dcmd(struct brcmf_p
  54. brcmf_dbg(BCDC, "Enter, cmd %d len %d\n", cmd, len);
  55. + *fwerr = 0;
  56. ret = brcmf_proto_bcdc_msg(drvr, ifidx, cmd, buf, len, true);
  57. if (ret < 0)
  58. goto done;
  59. @@ -255,7 +256,7 @@ brcmf_proto_bcdc_set_dcmd(struct brcmf_p
  60. /* Check the ERROR flag */
  61. if (flags & BCDC_DCMD_ERROR)
  62. - ret = le32_to_cpu(msg->status);
  63. + *fwerr = le32_to_cpu(msg->status);
  64. done:
  65. return ret;
  66. --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.c
  67. +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.c
  68. @@ -107,7 +107,7 @@ static s32
  69. brcmf_fil_cmd_data(struct brcmf_if *ifp, u32 cmd, void *data, u32 len, bool set)
  70. {
  71. struct brcmf_pub *drvr = ifp->drvr;
  72. - s32 err;
  73. + s32 err, fwerr;
  74. if (drvr->bus_if->state != BRCMF_BUS_UP) {
  75. brcmf_err("bus is down. we have nothing to do.\n");
  76. @@ -117,14 +117,20 @@ brcmf_fil_cmd_data(struct brcmf_if *ifp,
  77. if (data != NULL)
  78. len = min_t(uint, len, BRCMF_DCMD_MAXLEN);
  79. if (set)
  80. - err = brcmf_proto_set_dcmd(drvr, ifp->ifidx, cmd, data, len);
  81. + err = brcmf_proto_set_dcmd(drvr, ifp->ifidx, cmd,
  82. + data, len, &fwerr);
  83. else
  84. - err = brcmf_proto_query_dcmd(drvr, ifp->ifidx, cmd, data, len);
  85. + err = brcmf_proto_query_dcmd(drvr, ifp->ifidx, cmd,
  86. + data, len, &fwerr);
  87. - if (err)
  88. + if (err) {
  89. brcmf_dbg(FIL, "Failed: %s (%d)\n",
  90. brcmf_fil_get_errstr((u32)(-err)), err);
  91. -
  92. + } else if (fwerr < 0) {
  93. + brcmf_dbg(FIL, "Firmware error: %s (%d)\n",
  94. + brcmf_fil_get_errstr((u32)(-fwerr)), fwerr);
  95. + err = -EBADE;
  96. + }
  97. return err;
  98. }
  99. --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
  100. +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
  101. @@ -477,7 +477,7 @@ static void brcmf_msgbuf_ioctl_resp_wake
  102. static int brcmf_msgbuf_query_dcmd(struct brcmf_pub *drvr, int ifidx,
  103. - uint cmd, void *buf, uint len)
  104. + uint cmd, void *buf, uint len, int *fwerr)
  105. {
  106. struct brcmf_msgbuf *msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd;
  107. struct sk_buff *skb = NULL;
  108. @@ -485,6 +485,7 @@ static int brcmf_msgbuf_query_dcmd(struc
  109. int err;
  110. brcmf_dbg(MSGBUF, "ifidx=%d, cmd=%d, len=%d\n", ifidx, cmd, len);
  111. + *fwerr = 0;
  112. msgbuf->ctl_completed = false;
  113. err = brcmf_msgbuf_tx_ioctl(drvr, ifidx, cmd, buf, len);
  114. if (err)
  115. @@ -508,14 +509,15 @@ static int brcmf_msgbuf_query_dcmd(struc
  116. }
  117. brcmu_pkt_buf_free_skb(skb);
  118. - return msgbuf->ioctl_resp_status;
  119. + *fwerr = msgbuf->ioctl_resp_status;
  120. + return 0;
  121. }
  122. static int brcmf_msgbuf_set_dcmd(struct brcmf_pub *drvr, int ifidx,
  123. - uint cmd, void *buf, uint len)
  124. + uint cmd, void *buf, uint len, int *fwerr)
  125. {
  126. - return brcmf_msgbuf_query_dcmd(drvr, ifidx, cmd, buf, len);
  127. + return brcmf_msgbuf_query_dcmd(drvr, ifidx, cmd, buf, len, fwerr);
  128. }
  129. --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.h
  130. +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.h
  131. @@ -30,9 +30,9 @@ struct brcmf_proto {
  132. int (*hdrpull)(struct brcmf_pub *drvr, bool do_fws,
  133. struct sk_buff *skb, struct brcmf_if **ifp);
  134. int (*query_dcmd)(struct brcmf_pub *drvr, int ifidx, uint cmd,
  135. - void *buf, uint len);
  136. + void *buf, uint len, int *fwerr);
  137. int (*set_dcmd)(struct brcmf_pub *drvr, int ifidx, uint cmd, void *buf,
  138. - uint len);
  139. + uint len, int *fwerr);
  140. int (*tx_queue_data)(struct brcmf_pub *drvr, int ifidx,
  141. struct sk_buff *skb);
  142. int (*txdata)(struct brcmf_pub *drvr, int ifidx, u8 offset,
  143. @@ -71,14 +71,16 @@ static inline int brcmf_proto_hdrpull(st
  144. return drvr->proto->hdrpull(drvr, do_fws, skb, ifp);
  145. }
  146. static inline int brcmf_proto_query_dcmd(struct brcmf_pub *drvr, int ifidx,
  147. - uint cmd, void *buf, uint len)
  148. + uint cmd, void *buf, uint len,
  149. + int *fwerr)
  150. {
  151. - return drvr->proto->query_dcmd(drvr, ifidx, cmd, buf, len);
  152. + return drvr->proto->query_dcmd(drvr, ifidx, cmd, buf, len,fwerr);
  153. }
  154. static inline int brcmf_proto_set_dcmd(struct brcmf_pub *drvr, int ifidx,
  155. - uint cmd, void *buf, uint len)
  156. + uint cmd, void *buf, uint len,
  157. + int *fwerr)
  158. {
  159. - return drvr->proto->set_dcmd(drvr, ifidx, cmd, buf, len);
  160. + return drvr->proto->set_dcmd(drvr, ifidx, cmd, buf, len, fwerr);
  161. }
  162. static inline int brcmf_proto_tx_queue_data(struct brcmf_pub *drvr, int ifidx,