r8169_firmware.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /* r8169_firmware.c: RealTek 8169/8168/8101 ethernet driver.
  3. *
  4. * Copyright (c) 2002 ShuChen <[email protected]>
  5. * Copyright (c) 2003 - 2007 Francois Romieu <[email protected]>
  6. * Copyright (c) a lot of people too. Please respect their work.
  7. *
  8. * See MAINTAINERS file for support contact information.
  9. */
  10. #include <linux/delay.h>
  11. #include <linux/firmware.h>
  12. #include "r8169_firmware.h"
  13. enum rtl_fw_opcode {
  14. PHY_READ = 0x0,
  15. PHY_DATA_OR = 0x1,
  16. PHY_DATA_AND = 0x2,
  17. PHY_BJMPN = 0x3,
  18. PHY_MDIO_CHG = 0x4,
  19. PHY_CLEAR_READCOUNT = 0x7,
  20. PHY_WRITE = 0x8,
  21. PHY_READCOUNT_EQ_SKIP = 0x9,
  22. PHY_COMP_EQ_SKIPN = 0xa,
  23. PHY_COMP_NEQ_SKIPN = 0xb,
  24. PHY_WRITE_PREVIOUS = 0xc,
  25. PHY_SKIPN = 0xd,
  26. PHY_DELAY_MS = 0xe,
  27. };
  28. struct fw_info {
  29. u32 magic;
  30. char version[RTL_VER_SIZE];
  31. __le32 fw_start;
  32. __le32 fw_len;
  33. u8 chksum;
  34. } __packed;
  35. #define FW_OPCODE_SIZE sizeof_field(struct rtl_fw_phy_action, code[0])
  36. static bool rtl_fw_format_ok(struct rtl_fw *rtl_fw)
  37. {
  38. const struct firmware *fw = rtl_fw->fw;
  39. struct fw_info *fw_info = (struct fw_info *)fw->data;
  40. struct rtl_fw_phy_action *pa = &rtl_fw->phy_action;
  41. if (fw->size < FW_OPCODE_SIZE)
  42. return false;
  43. if (!fw_info->magic) {
  44. size_t i, size, start;
  45. u8 checksum = 0;
  46. if (fw->size < sizeof(*fw_info))
  47. return false;
  48. for (i = 0; i < fw->size; i++)
  49. checksum += fw->data[i];
  50. if (checksum != 0)
  51. return false;
  52. start = le32_to_cpu(fw_info->fw_start);
  53. if (start > fw->size)
  54. return false;
  55. size = le32_to_cpu(fw_info->fw_len);
  56. if (size > (fw->size - start) / FW_OPCODE_SIZE)
  57. return false;
  58. strscpy(rtl_fw->version, fw_info->version, RTL_VER_SIZE);
  59. pa->code = (__le32 *)(fw->data + start);
  60. pa->size = size;
  61. } else {
  62. if (fw->size % FW_OPCODE_SIZE)
  63. return false;
  64. strscpy(rtl_fw->version, rtl_fw->fw_name, RTL_VER_SIZE);
  65. pa->code = (__le32 *)fw->data;
  66. pa->size = fw->size / FW_OPCODE_SIZE;
  67. }
  68. return true;
  69. }
  70. static bool rtl_fw_data_ok(struct rtl_fw *rtl_fw)
  71. {
  72. struct rtl_fw_phy_action *pa = &rtl_fw->phy_action;
  73. size_t index;
  74. for (index = 0; index < pa->size; index++) {
  75. u32 action = le32_to_cpu(pa->code[index]);
  76. u32 val = action & 0x0000ffff;
  77. u32 regno = (action & 0x0fff0000) >> 16;
  78. switch (action >> 28) {
  79. case PHY_READ:
  80. case PHY_DATA_OR:
  81. case PHY_DATA_AND:
  82. case PHY_CLEAR_READCOUNT:
  83. case PHY_WRITE:
  84. case PHY_WRITE_PREVIOUS:
  85. case PHY_DELAY_MS:
  86. break;
  87. case PHY_MDIO_CHG:
  88. if (val > 1)
  89. goto out;
  90. break;
  91. case PHY_BJMPN:
  92. if (regno > index)
  93. goto out;
  94. break;
  95. case PHY_READCOUNT_EQ_SKIP:
  96. if (index + 2 >= pa->size)
  97. goto out;
  98. break;
  99. case PHY_COMP_EQ_SKIPN:
  100. case PHY_COMP_NEQ_SKIPN:
  101. case PHY_SKIPN:
  102. if (index + 1 + regno >= pa->size)
  103. goto out;
  104. break;
  105. default:
  106. dev_err(rtl_fw->dev, "Invalid action 0x%08x\n", action);
  107. return false;
  108. }
  109. }
  110. return true;
  111. out:
  112. dev_err(rtl_fw->dev, "Out of range of firmware\n");
  113. return false;
  114. }
  115. void rtl_fw_write_firmware(struct rtl8169_private *tp, struct rtl_fw *rtl_fw)
  116. {
  117. struct rtl_fw_phy_action *pa = &rtl_fw->phy_action;
  118. rtl_fw_write_t fw_write = rtl_fw->phy_write;
  119. rtl_fw_read_t fw_read = rtl_fw->phy_read;
  120. int predata = 0, count = 0;
  121. size_t index;
  122. for (index = 0; index < pa->size; index++) {
  123. u32 action = le32_to_cpu(pa->code[index]);
  124. u32 data = action & 0x0000ffff;
  125. u32 regno = (action & 0x0fff0000) >> 16;
  126. enum rtl_fw_opcode opcode = action >> 28;
  127. if (!action)
  128. break;
  129. switch (opcode) {
  130. case PHY_READ:
  131. predata = fw_read(tp, regno);
  132. count++;
  133. break;
  134. case PHY_DATA_OR:
  135. predata |= data;
  136. break;
  137. case PHY_DATA_AND:
  138. predata &= data;
  139. break;
  140. case PHY_BJMPN:
  141. index -= (regno + 1);
  142. break;
  143. case PHY_MDIO_CHG:
  144. if (data) {
  145. fw_write = rtl_fw->mac_mcu_write;
  146. fw_read = rtl_fw->mac_mcu_read;
  147. } else {
  148. fw_write = rtl_fw->phy_write;
  149. fw_read = rtl_fw->phy_read;
  150. }
  151. break;
  152. case PHY_CLEAR_READCOUNT:
  153. count = 0;
  154. break;
  155. case PHY_WRITE:
  156. fw_write(tp, regno, data);
  157. break;
  158. case PHY_READCOUNT_EQ_SKIP:
  159. if (count == data)
  160. index++;
  161. break;
  162. case PHY_COMP_EQ_SKIPN:
  163. if (predata == data)
  164. index += regno;
  165. break;
  166. case PHY_COMP_NEQ_SKIPN:
  167. if (predata != data)
  168. index += regno;
  169. break;
  170. case PHY_WRITE_PREVIOUS:
  171. fw_write(tp, regno, predata);
  172. break;
  173. case PHY_SKIPN:
  174. index += regno;
  175. break;
  176. case PHY_DELAY_MS:
  177. msleep(data);
  178. break;
  179. }
  180. }
  181. }
  182. void rtl_fw_release_firmware(struct rtl_fw *rtl_fw)
  183. {
  184. release_firmware(rtl_fw->fw);
  185. }
  186. int rtl_fw_request_firmware(struct rtl_fw *rtl_fw)
  187. {
  188. int rc;
  189. rc = request_firmware(&rtl_fw->fw, rtl_fw->fw_name, rtl_fw->dev);
  190. if (rc < 0)
  191. goto out;
  192. if (!rtl_fw_format_ok(rtl_fw) || !rtl_fw_data_ok(rtl_fw)) {
  193. release_firmware(rtl_fw->fw);
  194. rc = -EINVAL;
  195. goto out;
  196. }
  197. return 0;
  198. out:
  199. dev_err(rtl_fw->dev, "Unable to load firmware %s (%d)\n",
  200. rtl_fw->fw_name, rc);
  201. return rc;
  202. }