r8169_firmware.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /* r8169_firmware.c: RealTek 8169/8168/8101 ethernet driver.
  3. *
  4. * Copyright (c) 2002 ShuChen <shuchen@realtek.com.tw>
  5. * Copyright (c) 2003 - 2007 Francois Romieu <romieu@fr.zoreil.com>
  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. switch (opcode) {
  128. case PHY_READ:
  129. predata = fw_read(tp, regno);
  130. count++;
  131. break;
  132. case PHY_DATA_OR:
  133. predata |= data;
  134. break;
  135. case PHY_DATA_AND:
  136. predata &= data;
  137. break;
  138. case PHY_BJMPN:
  139. index -= (regno + 1);
  140. break;
  141. case PHY_MDIO_CHG:
  142. if (data) {
  143. fw_write = rtl_fw->mac_mcu_write;
  144. fw_read = rtl_fw->mac_mcu_read;
  145. } else {
  146. fw_write = rtl_fw->phy_write;
  147. fw_read = rtl_fw->phy_read;
  148. }
  149. break;
  150. case PHY_CLEAR_READCOUNT:
  151. count = 0;
  152. break;
  153. case PHY_WRITE:
  154. fw_write(tp, regno, data);
  155. break;
  156. case PHY_READCOUNT_EQ_SKIP:
  157. if (count == data)
  158. index++;
  159. break;
  160. case PHY_COMP_EQ_SKIPN:
  161. if (predata == data)
  162. index += regno;
  163. break;
  164. case PHY_COMP_NEQ_SKIPN:
  165. if (predata != data)
  166. index += regno;
  167. break;
  168. case PHY_WRITE_PREVIOUS:
  169. fw_write(tp, regno, predata);
  170. break;
  171. case PHY_SKIPN:
  172. index += regno;
  173. break;
  174. case PHY_DELAY_MS:
  175. msleep(data);
  176. break;
  177. }
  178. }
  179. }
  180. void rtl_fw_release_firmware(struct rtl_fw *rtl_fw)
  181. {
  182. release_firmware(rtl_fw->fw);
  183. }
  184. int rtl_fw_request_firmware(struct rtl_fw *rtl_fw)
  185. {
  186. int rc;
  187. rc = request_firmware(&rtl_fw->fw, rtl_fw->fw_name, rtl_fw->dev);
  188. if (rc < 0)
  189. goto out;
  190. if (!rtl_fw_format_ok(rtl_fw) || !rtl_fw_data_ok(rtl_fw)) {
  191. release_firmware(rtl_fw->fw);
  192. rc = -EINVAL;
  193. goto out;
  194. }
  195. return 0;
  196. out:
  197. dev_err(rtl_fw->dev, "Unable to load firmware %s (%d)\n",
  198. rtl_fw->fw_name, rc);
  199. return rc;
  200. }