1 From ca09589a72a0aa17389754fb75a5cd1a5d46818f Mon Sep 17 00:00:00 2001
2 From: Hayes Wang <hayeswang@realtek.com>
3 Date: Fri, 16 Apr 2021 16:04:36 +0800
4 Subject: [PATCH] r8152: support PHY firmware for RTL8156 series
6 commit 4a51b0e8a0143b0e83d51d9c58c6416c3818a9f2 upstream.
8 Support new firmware type and method for RTL8156 series.
10 Signed-off-by: Hayes Wang <hayeswang@realtek.com>
11 Signed-off-by: David S. Miller <davem@davemloft.net>
13 drivers/net/usb/r8152.c | 563 +++++++++++++++++++++++++++++++++++++++-
14 1 file changed, 561 insertions(+), 2 deletions(-)
16 --- a/drivers/net/usb/r8152.c
17 +++ b/drivers/net/usb/r8152.c
18 @@ -974,8 +974,60 @@ enum rtl8152_fw_flags {
30 +enum rtl8152_fw_fixup_cmd {
42 +struct fw_phy_speed_up {
43 + struct fw_block blk_hdr;
52 + struct fw_block blk_hdr;
53 + struct fw_phy_set ver;
57 +struct fw_phy_fixup {
58 + struct fw_block blk_hdr;
59 + struct fw_phy_set setting;
64 +struct fw_phy_union {
65 + struct fw_block blk_hdr;
68 + struct fw_phy_set pre_set[2];
69 + struct fw_phy_set bp[8];
70 + struct fw_phy_set bp_en;
77 * struct fw_mac - a firmware block used by RTL_FW_PLA and RTL_FW_USB.
78 * The layout of the firmware block is:
79 @@ -1080,6 +1132,15 @@ enum rtl_fw_type {
84 + RTL_FW_PHY_UNION_NC,
85 + RTL_FW_PHY_UNION_NC1,
86 + RTL_FW_PHY_UNION_NC2,
87 + RTL_FW_PHY_UNION_UC2,
88 + RTL_FW_PHY_UNION_UC,
89 + RTL_FW_PHY_UNION_MISC,
90 + RTL_FW_PHY_SPEED_UP,
95 @@ -3999,6 +4060,162 @@ static int rtl_post_ram_code(struct r815
99 +static bool rtl8152_is_fw_phy_speed_up_ok(struct r8152 *tp, struct fw_phy_speed_up *phy)
105 + switch (tp->version) {
126 + fw_offset = __le16_to_cpu(phy->fw_offset);
127 + length = __le32_to_cpu(phy->blk_hdr.length);
128 + if (fw_offset < sizeof(*phy) || length <= fw_offset) {
129 + dev_err(&tp->intf->dev, "invalid fw_offset\n");
133 + length -= fw_offset;
135 + dev_err(&tp->intf->dev, "invalid block length\n");
139 + if (__le16_to_cpu(phy->fw_reg) != 0x9A00) {
140 + dev_err(&tp->intf->dev, "invalid register to load firmware\n");
149 +static bool rtl8152_is_fw_phy_ver_ok(struct r8152 *tp, struct fw_phy_ver *ver)
153 + switch (tp->version) {
164 + if (__le32_to_cpu(ver->blk_hdr.length) != sizeof(*ver)) {
165 + dev_err(&tp->intf->dev, "invalid block length\n");
169 + if (__le16_to_cpu(ver->ver.addr) != SRAM_GPHY_FW_VER) {
170 + dev_err(&tp->intf->dev, "invalid phy ver addr\n");
179 +static bool rtl8152_is_fw_phy_fixup_ok(struct r8152 *tp, struct fw_phy_fixup *fix)
183 + switch (tp->version) {
194 + if (__le32_to_cpu(fix->blk_hdr.length) != sizeof(*fix)) {
195 + dev_err(&tp->intf->dev, "invalid block length\n");
199 + if (__le16_to_cpu(fix->setting.addr) != OCP_PHY_PATCH_CMD ||
200 + __le16_to_cpu(fix->setting.data) != BIT(7)) {
201 + dev_err(&tp->intf->dev, "invalid phy fixup\n");
210 +static bool rtl8152_is_fw_phy_union_ok(struct r8152 *tp, struct fw_phy_union *phy)
216 + switch (tp->version) {
227 + fw_offset = __le16_to_cpu(phy->fw_offset);
228 + length = __le32_to_cpu(phy->blk_hdr.length);
229 + if (fw_offset < sizeof(*phy) || length <= fw_offset) {
230 + dev_err(&tp->intf->dev, "invalid fw_offset\n");
234 + length -= fw_offset;
236 + dev_err(&tp->intf->dev, "invalid block length\n");
240 + if (phy->pre_num > 2) {
241 + dev_err(&tp->intf->dev, "invalid pre_num %d\n", phy->pre_num);
245 + if (phy->bp_num > 8) {
246 + dev_err(&tp->intf->dev, "invalid bp_num %d\n", phy->bp_num);
255 static bool rtl8152_is_fw_phy_nc_ok(struct r8152 *tp, struct fw_phy_nc *phy)
258 @@ -4319,6 +4536,10 @@ static long rtl8152_check_firmware(struc
259 case RTL_FW_PHY_START:
260 if (test_bit(FW_FLAGS_START, &fw_flags) ||
261 test_bit(FW_FLAGS_NC, &fw_flags) ||
262 + test_bit(FW_FLAGS_NC1, &fw_flags) ||
263 + test_bit(FW_FLAGS_NC2, &fw_flags) ||
264 + test_bit(FW_FLAGS_UC2, &fw_flags) ||
265 + test_bit(FW_FLAGS_UC, &fw_flags) ||
266 test_bit(FW_FLAGS_STOP, &fw_flags)) {
267 dev_err(&tp->intf->dev,
268 "check PHY_START fail\n");
269 @@ -4367,7 +4588,153 @@ static long rtl8152_check_firmware(struc
272 __set_bit(FW_FLAGS_NC, &fw_flags);
274 + case RTL_FW_PHY_UNION_NC:
275 + if (!test_bit(FW_FLAGS_START, &fw_flags) ||
276 + test_bit(FW_FLAGS_NC1, &fw_flags) ||
277 + test_bit(FW_FLAGS_NC2, &fw_flags) ||
278 + test_bit(FW_FLAGS_UC2, &fw_flags) ||
279 + test_bit(FW_FLAGS_UC, &fw_flags) ||
280 + test_bit(FW_FLAGS_STOP, &fw_flags)) {
281 + dev_err(&tp->intf->dev, "PHY_UNION_NC out of order\n");
285 + if (test_bit(FW_FLAGS_NC, &fw_flags)) {
286 + dev_err(&tp->intf->dev, "multiple PHY_UNION_NC encountered\n");
290 + if (!rtl8152_is_fw_phy_union_ok(tp, (struct fw_phy_union *)block)) {
291 + dev_err(&tp->intf->dev, "check PHY_UNION_NC failed\n");
294 + __set_bit(FW_FLAGS_NC, &fw_flags);
296 + case RTL_FW_PHY_UNION_NC1:
297 + if (!test_bit(FW_FLAGS_START, &fw_flags) ||
298 + test_bit(FW_FLAGS_NC2, &fw_flags) ||
299 + test_bit(FW_FLAGS_UC2, &fw_flags) ||
300 + test_bit(FW_FLAGS_UC, &fw_flags) ||
301 + test_bit(FW_FLAGS_STOP, &fw_flags)) {
302 + dev_err(&tp->intf->dev, "PHY_UNION_NC1 out of order\n");
306 + if (test_bit(FW_FLAGS_NC1, &fw_flags)) {
307 + dev_err(&tp->intf->dev, "multiple PHY NC1 encountered\n");
311 + if (!rtl8152_is_fw_phy_union_ok(tp, (struct fw_phy_union *)block)) {
312 + dev_err(&tp->intf->dev, "check PHY_UNION_NC1 failed\n");
315 + __set_bit(FW_FLAGS_NC1, &fw_flags);
317 + case RTL_FW_PHY_UNION_NC2:
318 + if (!test_bit(FW_FLAGS_START, &fw_flags) ||
319 + test_bit(FW_FLAGS_UC2, &fw_flags) ||
320 + test_bit(FW_FLAGS_UC, &fw_flags) ||
321 + test_bit(FW_FLAGS_STOP, &fw_flags)) {
322 + dev_err(&tp->intf->dev, "PHY_UNION_NC2 out of order\n");
326 + if (test_bit(FW_FLAGS_NC2, &fw_flags)) {
327 + dev_err(&tp->intf->dev, "multiple PHY NC2 encountered\n");
331 + if (!rtl8152_is_fw_phy_union_ok(tp, (struct fw_phy_union *)block)) {
332 + dev_err(&tp->intf->dev, "check PHY_UNION_NC2 failed\n");
335 + __set_bit(FW_FLAGS_NC2, &fw_flags);
337 + case RTL_FW_PHY_UNION_UC2:
338 + if (!test_bit(FW_FLAGS_START, &fw_flags) ||
339 + test_bit(FW_FLAGS_UC, &fw_flags) ||
340 + test_bit(FW_FLAGS_STOP, &fw_flags)) {
341 + dev_err(&tp->intf->dev, "PHY_UNION_UC2 out of order\n");
345 + if (test_bit(FW_FLAGS_UC2, &fw_flags)) {
346 + dev_err(&tp->intf->dev, "multiple PHY UC2 encountered\n");
350 + if (!rtl8152_is_fw_phy_union_ok(tp, (struct fw_phy_union *)block)) {
351 + dev_err(&tp->intf->dev, "check PHY_UNION_UC2 failed\n");
354 + __set_bit(FW_FLAGS_UC2, &fw_flags);
356 + case RTL_FW_PHY_UNION_UC:
357 + if (!test_bit(FW_FLAGS_START, &fw_flags) ||
358 + test_bit(FW_FLAGS_STOP, &fw_flags)) {
359 + dev_err(&tp->intf->dev, "PHY_UNION_UC out of order\n");
363 + if (test_bit(FW_FLAGS_UC, &fw_flags)) {
364 + dev_err(&tp->intf->dev, "multiple PHY UC encountered\n");
368 + if (!rtl8152_is_fw_phy_union_ok(tp, (struct fw_phy_union *)block)) {
369 + dev_err(&tp->intf->dev, "check PHY_UNION_UC failed\n");
372 + __set_bit(FW_FLAGS_UC, &fw_flags);
374 + case RTL_FW_PHY_UNION_MISC:
375 + if (!rtl8152_is_fw_phy_union_ok(tp, (struct fw_phy_union *)block)) {
376 + dev_err(&tp->intf->dev, "check RTL_FW_PHY_UNION_MISC failed\n");
380 + case RTL_FW_PHY_FIXUP:
381 + if (!rtl8152_is_fw_phy_fixup_ok(tp, (struct fw_phy_fixup *)block)) {
382 + dev_err(&tp->intf->dev, "check PHY fixup failed\n");
386 + case RTL_FW_PHY_SPEED_UP:
387 + if (test_bit(FW_FLAGS_SPEED_UP, &fw_flags)) {
388 + dev_err(&tp->intf->dev, "multiple PHY firmware encountered");
392 + if (!rtl8152_is_fw_phy_speed_up_ok(tp, (struct fw_phy_speed_up *)block)) {
393 + dev_err(&tp->intf->dev, "check PHY speed up failed\n");
396 + __set_bit(FW_FLAGS_SPEED_UP, &fw_flags);
398 + case RTL_FW_PHY_VER:
399 + if (test_bit(FW_FLAGS_START, &fw_flags) ||
400 + test_bit(FW_FLAGS_NC, &fw_flags) ||
401 + test_bit(FW_FLAGS_NC1, &fw_flags) ||
402 + test_bit(FW_FLAGS_NC2, &fw_flags) ||
403 + test_bit(FW_FLAGS_UC2, &fw_flags) ||
404 + test_bit(FW_FLAGS_UC, &fw_flags) ||
405 + test_bit(FW_FLAGS_STOP, &fw_flags)) {
406 + dev_err(&tp->intf->dev, "Invalid order to set PHY version\n");
410 + if (test_bit(FW_FLAGS_VER, &fw_flags)) {
411 + dev_err(&tp->intf->dev, "multiple PHY version encountered");
415 + if (!rtl8152_is_fw_phy_ver_ok(tp, (struct fw_phy_ver *)block)) {
416 + dev_err(&tp->intf->dev, "check PHY version failed\n");
419 + __set_bit(FW_FLAGS_VER, &fw_flags);
422 dev_warn(&tp->intf->dev, "Unknown type %u is found\n",
423 @@ -4390,6 +4757,143 @@ fail:
427 +static void rtl_ram_code_speed_up(struct r8152 *tp, struct fw_phy_speed_up *phy, bool wait)
432 + if (sram_read(tp, SRAM_GPHY_FW_VER) >= __le16_to_cpu(phy->version)) {
433 + dev_dbg(&tp->intf->dev, "PHY firmware has been the newest\n");
437 + len = __le32_to_cpu(phy->blk_hdr.length);
438 + len -= __le16_to_cpu(phy->fw_offset);
439 + data = (u8 *)phy + __le16_to_cpu(phy->fw_offset);
441 + if (rtl_phy_patch_request(tp, true, wait))
445 + u32 ocp_data, size;
453 + ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_GPHY_CTRL);
454 + ocp_data |= GPHY_PATCH_DONE | BACKUP_RESTRORE;
455 + ocp_write_word(tp, MCU_TYPE_USB, USB_GPHY_CTRL, ocp_data);
457 + generic_ocp_write(tp, __le16_to_cpu(phy->fw_reg), 0xff, size, data, MCU_TYPE_USB);
462 + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_POL_GPIO_CTRL);
463 + ocp_data |= POL_GPHY_PATCH;
464 + ocp_write_word(tp, MCU_TYPE_PLA, PLA_POL_GPIO_CTRL, ocp_data);
466 + for (i = 0; i < 1000; i++) {
467 + if (!(ocp_read_word(tp, MCU_TYPE_PLA, PLA_POL_GPIO_CTRL) & POL_GPHY_PATCH))
472 + dev_err(&tp->intf->dev, "ram code speedup mode timeout\n");
477 + ocp_write_word(tp, MCU_TYPE_PLA, PLA_OCP_GPHY_BASE, tp->ocp_base);
478 + rtl_phy_patch_request(tp, false, wait);
480 + if (sram_read(tp, SRAM_GPHY_FW_VER) == __le16_to_cpu(phy->version))
481 + dev_dbg(&tp->intf->dev, "successfully applied %s\n", phy->info);
483 + dev_err(&tp->intf->dev, "ram code speedup mode fail\n");
486 +static int rtl8152_fw_phy_ver(struct r8152 *tp, struct fw_phy_ver *phy_ver)
490 + ver_addr = __le16_to_cpu(phy_ver->ver.addr);
491 + ver = __le16_to_cpu(phy_ver->ver.data);
493 + if (sram_read(tp, ver_addr) >= ver) {
494 + dev_dbg(&tp->intf->dev, "PHY firmware has been the newest\n");
498 + sram_write(tp, ver_addr, ver);
500 + dev_dbg(&tp->intf->dev, "PHY firmware version %x\n", ver);
505 +static void rtl8152_fw_phy_fixup(struct r8152 *tp, struct fw_phy_fixup *fix)
509 + addr = __le16_to_cpu(fix->setting.addr);
510 + data = ocp_reg_read(tp, addr);
512 + switch (__le16_to_cpu(fix->bit_cmd)) {
514 + data &= __le16_to_cpu(fix->setting.data);
517 + data |= __le16_to_cpu(fix->setting.data);
520 + data &= ~__le16_to_cpu(fix->setting.data);
523 + data ^= __le16_to_cpu(fix->setting.data);
529 + ocp_reg_write(tp, addr, data);
531 + dev_dbg(&tp->intf->dev, "applied ocp %x %x\n", addr, data);
534 +static void rtl8152_fw_phy_union_apply(struct r8152 *tp, struct fw_phy_union *phy)
540 + num = phy->pre_num;
541 + for (i = 0; i < num; i++)
542 + sram_write(tp, __le16_to_cpu(phy->pre_set[i].addr),
543 + __le16_to_cpu(phy->pre_set[i].data));
545 + length = __le32_to_cpu(phy->blk_hdr.length);
546 + length -= __le16_to_cpu(phy->fw_offset);
548 + data = (__le16 *)((u8 *)phy + __le16_to_cpu(phy->fw_offset));
550 + ocp_reg_write(tp, OCP_SRAM_ADDR, __le16_to_cpu(phy->fw_reg));
551 + for (i = 0; i < num; i++)
552 + ocp_reg_write(tp, OCP_SRAM_DATA, __le16_to_cpu(data[i]));
555 + for (i = 0; i < num; i++)
556 + sram_write(tp, __le16_to_cpu(phy->bp[i].addr), __le16_to_cpu(phy->bp[i].data));
558 + if (phy->bp_num && phy->bp_en.addr)
559 + sram_write(tp, __le16_to_cpu(phy->bp_en.addr), __le16_to_cpu(phy->bp_en.data));
561 + dev_dbg(&tp->intf->dev, "successfully applied %s\n", phy->info);
564 static void rtl8152_fw_phy_nc_apply(struct r8152 *tp, struct fw_phy_nc *phy)
566 u16 mode_reg, bp_index;
567 @@ -4443,6 +4947,12 @@ static void rtl8152_fw_mac_apply(struct
571 + fw_ver_reg = __le16_to_cpu(mac->fw_ver_reg);
572 + if (fw_ver_reg && ocp_read_byte(tp, MCU_TYPE_USB, fw_ver_reg) >= mac->fw_ver_data) {
573 + dev_dbg(&tp->intf->dev, "%s firmware has been the newest\n", type ? "PLA" : "USB");
577 rtl_clear_bp(tp, type);
579 /* Enable backup/restore of MACDBG. This is required after clearing PLA
580 @@ -4478,7 +4988,6 @@ static void rtl8152_fw_mac_apply(struct
581 ocp_write_word(tp, type, bp_en_addr,
582 __le16_to_cpu(mac->bp_en_value));
584 - fw_ver_reg = __le16_to_cpu(mac->fw_ver_reg);
586 ocp_write_byte(tp, MCU_TYPE_USB, fw_ver_reg,
588 @@ -4493,7 +5002,7 @@ static void rtl8152_apply_firmware(struc
589 struct fw_header *fw_hdr;
590 struct fw_phy_patch_key *key;
593 + int i, patch_phy = 1;
595 if (IS_ERR_OR_NULL(rtl_fw->fw))
597 @@ -4515,17 +5024,40 @@ static void rtl8152_apply_firmware(struc
598 rtl8152_fw_mac_apply(tp, (struct fw_mac *)block);
600 case RTL_FW_PHY_START:
603 key = (struct fw_phy_patch_key *)block;
604 key_addr = __le16_to_cpu(key->key_reg);
605 rtl_pre_ram_code(tp, key_addr, __le16_to_cpu(key->key_data), !power_cut);
607 case RTL_FW_PHY_STOP:
611 rtl_post_ram_code(tp, key_addr, !power_cut);
614 rtl8152_fw_phy_nc_apply(tp, (struct fw_phy_nc *)block);
616 + case RTL_FW_PHY_VER:
617 + patch_phy = rtl8152_fw_phy_ver(tp, (struct fw_phy_ver *)block);
619 + case RTL_FW_PHY_UNION_NC:
620 + case RTL_FW_PHY_UNION_NC1:
621 + case RTL_FW_PHY_UNION_NC2:
622 + case RTL_FW_PHY_UNION_UC2:
623 + case RTL_FW_PHY_UNION_UC:
624 + case RTL_FW_PHY_UNION_MISC:
626 + rtl8152_fw_phy_union_apply(tp, (struct fw_phy_union *)block);
628 + case RTL_FW_PHY_FIXUP:
630 + rtl8152_fw_phy_fixup(tp, (struct fw_phy_fixup *)block);
632 + case RTL_FW_PHY_SPEED_UP:
633 + rtl_ram_code_speed_up(tp, (struct fw_phy_speed_up *)block, !power_cut);
638 @@ -5033,6 +5565,21 @@ static int r8153c_post_firmware_1(struct
642 +static int r8156a_post_firmware_1(struct r8152 *tp)
646 + ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_FW_FIX_EN1);
647 + ocp_data |= FW_IP_RESET_EN;
648 + ocp_write_word(tp, MCU_TYPE_USB, USB_FW_FIX_EN1, ocp_data);
650 + /* Modify U3PHY parameter for compatibility issue */
651 + ocp_write_dword(tp, MCU_TYPE_USB, USB_UPHY3_MDCMDIO, 0x4026840e);
652 + ocp_write_dword(tp, MCU_TYPE_USB, USB_UPHY3_MDCMDIO, 0x4001acc9);
657 static void r8153_aldps_en(struct r8152 *tp, bool enable)
660 @@ -8651,12 +9198,16 @@ static int rtl_ops_init(struct r8152 *tp
661 #define FIRMWARE_8153A_4 "rtl_nic/rtl8153a-4.fw"
662 #define FIRMWARE_8153B_2 "rtl_nic/rtl8153b-2.fw"
663 #define FIRMWARE_8153C_1 "rtl_nic/rtl8153c-1.fw"
664 +#define FIRMWARE_8156A_2 "rtl_nic/rtl8156a-2.fw"
665 +#define FIRMWARE_8156B_2 "rtl_nic/rtl8156b-2.fw"
667 MODULE_FIRMWARE(FIRMWARE_8153A_2);
668 MODULE_FIRMWARE(FIRMWARE_8153A_3);
669 MODULE_FIRMWARE(FIRMWARE_8153A_4);
670 MODULE_FIRMWARE(FIRMWARE_8153B_2);
671 MODULE_FIRMWARE(FIRMWARE_8153C_1);
672 +MODULE_FIRMWARE(FIRMWARE_8156A_2);
673 +MODULE_FIRMWARE(FIRMWARE_8156B_2);
675 static int rtl_fw_init(struct r8152 *tp)
677 @@ -8682,6 +9233,14 @@ static int rtl_fw_init(struct r8152 *tp)
678 rtl_fw->pre_fw = r8153b_pre_firmware_1;
679 rtl_fw->post_fw = r8153b_post_firmware_1;
682 + rtl_fw->fw_name = FIRMWARE_8156A_2;
683 + rtl_fw->post_fw = r8156a_post_firmware_1;
687 + rtl_fw->fw_name = FIRMWARE_8156B_2;
690 rtl_fw->fw_name = FIRMWARE_8153C_1;
691 rtl_fw->pre_fw = r8153b_pre_firmware_1;