2021-08-21 08:54:34 +00:00
|
|
|
From f10c9edf47d3fa240d965e151a48c670f5035b73 Mon Sep 17 00:00:00 2001
|
|
|
|
From: Hayes Wang <hayeswang@realtek.com>
|
|
|
|
Date: Fri, 16 Apr 2021 16:04:33 +0800
|
|
|
|
Subject: [PATCH] r8152: adjust rtl8152_check_firmware function
|
|
|
|
|
|
|
|
commit a8a7be178e81a3d4b6972cbeb0ccd091ca2f9f89 upstream.
|
|
|
|
|
|
|
|
Use bits operations to record and check the firmware.
|
|
|
|
|
|
|
|
Signed-off-by: Hayes Wang <hayeswang@realtek.com>
|
|
|
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
|
|
---
|
|
|
|
drivers/net/usb/r8152.c | 51 +++++++++++++++++++++++------------------
|
|
|
|
1 file changed, 29 insertions(+), 22 deletions(-)
|
|
|
|
|
|
|
|
--- a/drivers/net/usb/r8152.c
|
|
|
|
+++ b/drivers/net/usb/r8152.c
|
2021-11-02 21:05:27 +00:00
|
|
|
@@ -875,6 +875,14 @@ struct fw_header {
|
2021-08-21 08:54:34 +00:00
|
|
|
struct fw_block blocks[];
|
|
|
|
} __packed;
|
|
|
|
|
|
|
|
+enum rtl8152_fw_flags {
|
|
|
|
+ FW_FLAGS_USB = 0,
|
|
|
|
+ FW_FLAGS_PLA,
|
|
|
|
+ FW_FLAGS_START,
|
|
|
|
+ FW_FLAGS_STOP,
|
|
|
|
+ FW_FLAGS_NC,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
/**
|
|
|
|
* struct fw_mac - a firmware block used by RTL_FW_PLA and RTL_FW_USB.
|
|
|
|
* The layout of the firmware block is:
|
2021-11-02 21:05:27 +00:00
|
|
|
@@ -3801,10 +3809,7 @@ static long rtl8152_check_firmware(struc
|
2021-08-21 08:54:34 +00:00
|
|
|
{
|
|
|
|
const struct firmware *fw = rtl_fw->fw;
|
|
|
|
struct fw_header *fw_hdr = (struct fw_header *)fw->data;
|
|
|
|
- struct fw_mac *pla = NULL, *usb = NULL;
|
|
|
|
- struct fw_phy_patch_key *start = NULL;
|
|
|
|
- struct fw_phy_nc *phy_nc = NULL;
|
|
|
|
- struct fw_block *stop = NULL;
|
|
|
|
+ unsigned long fw_flags = 0;
|
|
|
|
long ret = -EFAULT;
|
|
|
|
int i;
|
|
|
|
|
2021-11-02 21:05:27 +00:00
|
|
|
@@ -3833,50 +3838,52 @@ static long rtl8152_check_firmware(struc
|
2021-08-21 08:54:34 +00:00
|
|
|
goto fail;
|
|
|
|
goto fw_end;
|
|
|
|
case RTL_FW_PLA:
|
|
|
|
- if (pla) {
|
|
|
|
+ if (test_bit(FW_FLAGS_PLA, &fw_flags)) {
|
|
|
|
dev_err(&tp->intf->dev,
|
|
|
|
"multiple PLA firmware encountered");
|
|
|
|
goto fail;
|
|
|
|
}
|
|
|
|
|
|
|
|
- pla = (struct fw_mac *)block;
|
|
|
|
- if (!rtl8152_is_fw_mac_ok(tp, pla)) {
|
|
|
|
+ if (!rtl8152_is_fw_mac_ok(tp, (struct fw_mac *)block)) {
|
|
|
|
dev_err(&tp->intf->dev,
|
|
|
|
"check PLA firmware failed\n");
|
|
|
|
goto fail;
|
|
|
|
}
|
|
|
|
+ __set_bit(FW_FLAGS_PLA, &fw_flags);
|
|
|
|
break;
|
|
|
|
case RTL_FW_USB:
|
|
|
|
- if (usb) {
|
|
|
|
+ if (test_bit(FW_FLAGS_USB, &fw_flags)) {
|
|
|
|
dev_err(&tp->intf->dev,
|
|
|
|
"multiple USB firmware encountered");
|
|
|
|
goto fail;
|
|
|
|
}
|
|
|
|
|
|
|
|
- usb = (struct fw_mac *)block;
|
|
|
|
- if (!rtl8152_is_fw_mac_ok(tp, usb)) {
|
|
|
|
+ if (!rtl8152_is_fw_mac_ok(tp, (struct fw_mac *)block)) {
|
|
|
|
dev_err(&tp->intf->dev,
|
|
|
|
"check USB firmware failed\n");
|
|
|
|
goto fail;
|
|
|
|
}
|
|
|
|
+ __set_bit(FW_FLAGS_USB, &fw_flags);
|
|
|
|
break;
|
|
|
|
case RTL_FW_PHY_START:
|
|
|
|
- if (start || phy_nc || stop) {
|
|
|
|
+ if (test_bit(FW_FLAGS_START, &fw_flags) ||
|
|
|
|
+ test_bit(FW_FLAGS_NC, &fw_flags) ||
|
|
|
|
+ test_bit(FW_FLAGS_STOP, &fw_flags)) {
|
|
|
|
dev_err(&tp->intf->dev,
|
|
|
|
"check PHY_START fail\n");
|
|
|
|
goto fail;
|
|
|
|
}
|
|
|
|
|
|
|
|
- if (__le32_to_cpu(block->length) != sizeof(*start)) {
|
|
|
|
+ if (__le32_to_cpu(block->length) != sizeof(struct fw_phy_patch_key)) {
|
|
|
|
dev_err(&tp->intf->dev,
|
|
|
|
"Invalid length for PHY_START\n");
|
|
|
|
goto fail;
|
|
|
|
}
|
|
|
|
-
|
|
|
|
- start = (struct fw_phy_patch_key *)block;
|
|
|
|
+ __set_bit(FW_FLAGS_START, &fw_flags);
|
|
|
|
break;
|
|
|
|
case RTL_FW_PHY_STOP:
|
|
|
|
- if (stop || !start) {
|
|
|
|
+ if (test_bit(FW_FLAGS_STOP, &fw_flags) ||
|
|
|
|
+ !test_bit(FW_FLAGS_START, &fw_flags)) {
|
|
|
|
dev_err(&tp->intf->dev,
|
|
|
|
"Check PHY_STOP fail\n");
|
|
|
|
goto fail;
|
2021-11-02 21:05:27 +00:00
|
|
|
@@ -3887,28 +3894,28 @@ static long rtl8152_check_firmware(struc
|
2021-08-21 08:54:34 +00:00
|
|
|
"Invalid length for PHY_STOP\n");
|
|
|
|
goto fail;
|
|
|
|
}
|
|
|
|
-
|
|
|
|
- stop = block;
|
|
|
|
+ __set_bit(FW_FLAGS_STOP, &fw_flags);
|
|
|
|
break;
|
|
|
|
case RTL_FW_PHY_NC:
|
|
|
|
- if (!start || stop) {
|
|
|
|
+ if (!test_bit(FW_FLAGS_START, &fw_flags) ||
|
|
|
|
+ test_bit(FW_FLAGS_STOP, &fw_flags)) {
|
|
|
|
dev_err(&tp->intf->dev,
|
|
|
|
"check PHY_NC fail\n");
|
|
|
|
goto fail;
|
|
|
|
}
|
|
|
|
|
|
|
|
- if (phy_nc) {
|
|
|
|
+ if (test_bit(FW_FLAGS_NC, &fw_flags)) {
|
|
|
|
dev_err(&tp->intf->dev,
|
|
|
|
"multiple PHY NC encountered\n");
|
|
|
|
goto fail;
|
|
|
|
}
|
|
|
|
|
|
|
|
- phy_nc = (struct fw_phy_nc *)block;
|
|
|
|
- if (!rtl8152_is_fw_phy_nc_ok(tp, phy_nc)) {
|
|
|
|
+ if (!rtl8152_is_fw_phy_nc_ok(tp, (struct fw_phy_nc *)block)) {
|
|
|
|
dev_err(&tp->intf->dev,
|
|
|
|
"check PHY NC firmware failed\n");
|
|
|
|
goto fail;
|
|
|
|
}
|
|
|
|
+ __set_bit(FW_FLAGS_NC, &fw_flags);
|
|
|
|
|
|
|
|
break;
|
|
|
|
default:
|
2021-11-02 21:05:27 +00:00
|
|
|
@@ -3922,7 +3929,7 @@ static long rtl8152_check_firmware(struc
|
2021-08-21 08:54:34 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
fw_end:
|
|
|
|
- if ((phy_nc || start) && !stop) {
|
|
|
|
+ if (test_bit(FW_FLAGS_START, &fw_flags) && !test_bit(FW_FLAGS_STOP, &fw_flags)) {
|
|
|
|
dev_err(&tp->intf->dev, "without PHY_STOP\n");
|
|
|
|
goto fail;
|
|
|
|
}
|