+++ /dev/null
-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
-@@ -874,6 +874,14 @@ struct fw_header {
- 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:
-@@ -3802,10 +3810,7 @@ static long rtl8152_check_firmware(struc
- {
- 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;
-
-@@ -3834,50 +3839,52 @@ static long rtl8152_check_firmware(struc
- 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;
-@@ -3888,28 +3895,28 @@ static long rtl8152_check_firmware(struc
- "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:
-@@ -3923,7 +3930,7 @@ static long rtl8152_check_firmware(struc
- }
-
- 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;
- }