From eb3d24a86c84183cae35373fcbaa08167f6a956d Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Wed, 12 Jun 2024 20:52:38 +0200 Subject: [PATCH] 5.4-stable patches added patches: arm64-dts-hi3798cv200-fix-the-size-of-gicr.patch fbdev-savage-handle-err-return-when-savagefb_check_var-failed.patch media-mc-mark-the-media-devnode-as-registered-from-the-start.patch media-mxl5xx-move-xpt-structures-off-stack.patch media-v4l2-core-hold-videodev_lock-until-dev-reg-finishes.patch wifi-rtl8xxxu-fix-the-tx-power-of-rtl8192cu-rtl8723au.patch --- ...dts-hi3798cv200-fix-the-size-of-gicr.patch | 43 +++++++ ...eturn-when-savagefb_check_var-failed.patch | 37 ++++++ ...devnode-as-registered-from-the-start.patch | 48 ++++++++ ...mxl5xx-move-xpt-structures-off-stack.patch | 115 ++++++++++++++++++ ...videodev_lock-until-dev-reg-finishes.patch | 50 ++++++++ queue-5.4/series | 6 + ...-the-tx-power-of-rtl8192cu-rtl8723au.patch | 98 +++++++++++++++ 7 files changed, 397 insertions(+) create mode 100644 queue-5.4/arm64-dts-hi3798cv200-fix-the-size-of-gicr.patch create mode 100644 queue-5.4/fbdev-savage-handle-err-return-when-savagefb_check_var-failed.patch create mode 100644 queue-5.4/media-mc-mark-the-media-devnode-as-registered-from-the-start.patch create mode 100644 queue-5.4/media-mxl5xx-move-xpt-structures-off-stack.patch create mode 100644 queue-5.4/media-v4l2-core-hold-videodev_lock-until-dev-reg-finishes.patch create mode 100644 queue-5.4/wifi-rtl8xxxu-fix-the-tx-power-of-rtl8192cu-rtl8723au.patch diff --git a/queue-5.4/arm64-dts-hi3798cv200-fix-the-size-of-gicr.patch b/queue-5.4/arm64-dts-hi3798cv200-fix-the-size-of-gicr.patch new file mode 100644 index 00000000000..298c790a579 --- /dev/null +++ b/queue-5.4/arm64-dts-hi3798cv200-fix-the-size-of-gicr.patch @@ -0,0 +1,43 @@ +From 428a575dc9038846ad259466d5ba109858c0a023 Mon Sep 17 00:00:00 2001 +From: Yang Xiwen +Date: Mon, 19 Feb 2024 23:05:26 +0800 +Subject: arm64: dts: hi3798cv200: fix the size of GICR + +From: Yang Xiwen + +commit 428a575dc9038846ad259466d5ba109858c0a023 upstream. + +During boot, Linux kernel complains: + +[ 0.000000] GIC: GICv2 detected, but range too small and irqchip.gicv2_force_probe not set + +This SoC is using a regular GIC-400 and the GICR space size should be +8KB rather than 256B. + +With this patch: + +[ 0.000000] GIC: Using split EOI/Deactivate mode + +So this should be the correct fix. + +Fixes: 2f20182ed670 ("arm64: dts: hisilicon: add dts files for hi3798cv200-poplar board") +Signed-off-by: Yang Xiwen +Cc: stable@vger.kernel.org +Link: https://lore.kernel.org/r/20240219-cache-v3-1-a33c57534ae9@outlook.com +Signed-off-by: Krzysztof Kozlowski +Signed-off-by: Greg Kroah-Hartman +--- + arch/arm64/boot/dts/hisilicon/hi3798cv200.dtsi | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/arch/arm64/boot/dts/hisilicon/hi3798cv200.dtsi ++++ b/arch/arm64/boot/dts/hisilicon/hi3798cv200.dtsi +@@ -58,7 +58,7 @@ + gic: interrupt-controller@f1001000 { + compatible = "arm,gic-400"; + reg = <0x0 0xf1001000 0x0 0x1000>, /* GICD */ +- <0x0 0xf1002000 0x0 0x100>; /* GICC */ ++ <0x0 0xf1002000 0x0 0x2000>; /* GICC */ + #address-cells = <0>; + #interrupt-cells = <3>; + interrupt-controller; diff --git a/queue-5.4/fbdev-savage-handle-err-return-when-savagefb_check_var-failed.patch b/queue-5.4/fbdev-savage-handle-err-return-when-savagefb_check_var-failed.patch new file mode 100644 index 00000000000..0c7ec24f611 --- /dev/null +++ b/queue-5.4/fbdev-savage-handle-err-return-when-savagefb_check_var-failed.patch @@ -0,0 +1,37 @@ +From 6ad959b6703e2c4c5d7af03b4cfd5ff608036339 Mon Sep 17 00:00:00 2001 +From: Cai Xinchen +Date: Tue, 16 Apr 2024 06:51:37 +0000 +Subject: fbdev: savage: Handle err return when savagefb_check_var failed + +From: Cai Xinchen + +commit 6ad959b6703e2c4c5d7af03b4cfd5ff608036339 upstream. + +The commit 04e5eac8f3ab("fbdev: savage: Error out if pixclock equals zero") +checks the value of pixclock to avoid divide-by-zero error. However +the function savagefb_probe doesn't handle the error return of +savagefb_check_var. When pixclock is 0, it will cause divide-by-zero error. + +Fixes: 04e5eac8f3ab ("fbdev: savage: Error out if pixclock equals zero") +Signed-off-by: Cai Xinchen +Cc: stable@vger.kernel.org +Signed-off-by: Helge Deller +Signed-off-by: Greg Kroah-Hartman +--- + drivers/video/fbdev/savage/savagefb_driver.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +--- a/drivers/video/fbdev/savage/savagefb_driver.c ++++ b/drivers/video/fbdev/savage/savagefb_driver.c +@@ -2273,7 +2273,10 @@ static int savagefb_probe(struct pci_dev + if (info->var.xres_virtual > 0x1000) + info->var.xres_virtual = 0x1000; + #endif +- savagefb_check_var(&info->var, info); ++ err = savagefb_check_var(&info->var, info); ++ if (err) ++ goto failed; ++ + savagefb_set_fix(info); + + /* diff --git a/queue-5.4/media-mc-mark-the-media-devnode-as-registered-from-the-start.patch b/queue-5.4/media-mc-mark-the-media-devnode-as-registered-from-the-start.patch new file mode 100644 index 00000000000..189e373677c --- /dev/null +++ b/queue-5.4/media-mc-mark-the-media-devnode-as-registered-from-the-start.patch @@ -0,0 +1,48 @@ +From 4bc60736154bc9e0e39d3b88918f5d3762ebe5e0 Mon Sep 17 00:00:00 2001 +From: Hans Verkuil +Date: Fri, 23 Feb 2024 09:46:19 +0100 +Subject: media: mc: mark the media devnode as registered from the, start + +From: Hans Verkuil + +commit 4bc60736154bc9e0e39d3b88918f5d3762ebe5e0 upstream. + +First the media device node was created, and if successful it was +marked as 'registered'. This leaves a small race condition where +an application can open the device node and get an error back +because the 'registered' flag was not yet set. + +Change the order: first set the 'registered' flag, then actually +register the media device node. If that fails, then clear the flag. + +Signed-off-by: Hans Verkuil +Acked-by: Sakari Ailus +Reviewed-by: Laurent Pinchart +Fixes: cf4b9211b568 ("[media] media: Media device node support") +Cc: stable@vger.kernel.org +Signed-off-by: Sakari Ailus +Signed-off-by: Greg Kroah-Hartman +--- + drivers/media/mc/mc-devnode.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +--- a/drivers/media/mc/mc-devnode.c ++++ b/drivers/media/mc/mc-devnode.c +@@ -246,15 +246,14 @@ int __must_check media_devnode_register( + kobject_set_name(&devnode->cdev.kobj, "media%d", devnode->minor); + + /* Part 3: Add the media and char device */ ++ set_bit(MEDIA_FLAG_REGISTERED, &devnode->flags); + ret = cdev_device_add(&devnode->cdev, &devnode->dev); + if (ret < 0) { ++ clear_bit(MEDIA_FLAG_REGISTERED, &devnode->flags); + pr_err("%s: cdev_device_add failed\n", __func__); + goto cdev_add_error; + } + +- /* Part 4: Activate this minor. The char device can now be used. */ +- set_bit(MEDIA_FLAG_REGISTERED, &devnode->flags); +- + return 0; + + cdev_add_error: diff --git a/queue-5.4/media-mxl5xx-move-xpt-structures-off-stack.patch b/queue-5.4/media-mxl5xx-move-xpt-structures-off-stack.patch new file mode 100644 index 00000000000..3fb8642d95b --- /dev/null +++ b/queue-5.4/media-mxl5xx-move-xpt-structures-off-stack.patch @@ -0,0 +1,115 @@ +From 526f4527545b2d4ce0733733929fac7b6da09ac6 Mon Sep 17 00:00:00 2001 +From: Nathan Chancellor +Date: Fri, 12 Jan 2024 00:40:36 +0000 +Subject: media: mxl5xx: Move xpt structures off stack + +From: Nathan Chancellor + +commit 526f4527545b2d4ce0733733929fac7b6da09ac6 upstream. + +When building for LoongArch with clang 18.0.0, the stack usage of +probe() is larger than the allowed 2048 bytes: + + drivers/media/dvb-frontends/mxl5xx.c:1698:12: warning: stack frame size (2368) exceeds limit (2048) in 'probe' [-Wframe-larger-than] + 1698 | static int probe(struct mxl *state, struct mxl5xx_cfg *cfg) + | ^ + 1 warning generated. + +This is the result of the linked LLVM commit, which changes how the +arrays of structures in config_ts() get handled with +CONFIG_INIT_STACK_ZERO and CONFIG_INIT_STACK_PATTERN, which causes the +above warning in combination with inlining, as config_ts() gets inlined +into probe(). + +This warning can be easily fixed by moving the array of structures off +of the stackvia 'static const', which is a better location for these +variables anyways because they are static data that is only ever read +from, never modified, so allocating the stack space is wasteful. + +This drops the stack usage from 2368 bytes to 256 bytes with the same +compiler and configuration. + +Link: https://lore.kernel.org/linux-media/20240111-dvb-mxl5xx-move-structs-off-stack-v1-1-ca4230e67c11@kernel.org +Cc: stable@vger.kernel.org +Closes: https://github.com/ClangBuiltLinux/linux/issues/1977 +Link: https://github.com/llvm/llvm-project/commit/afe8b93ffdfef5d8879e1894b9d7dda40dee2b8d +Signed-off-by: Nathan Chancellor +Reviewed-by: Miguel Ojeda +Tested-by: Miguel Ojeda +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Greg Kroah-Hartman +--- + drivers/media/dvb-frontends/mxl5xx.c | 22 +++++++++++----------- + 1 file changed, 11 insertions(+), 11 deletions(-) + +--- a/drivers/media/dvb-frontends/mxl5xx.c ++++ b/drivers/media/dvb-frontends/mxl5xx.c +@@ -1391,57 +1391,57 @@ static int config_ts(struct mxl *state, + u32 nco_count_min = 0; + u32 clk_type = 0; + +- struct MXL_REG_FIELD_T xpt_sync_polarity[MXL_HYDRA_DEMOD_MAX] = { ++ static const struct MXL_REG_FIELD_T xpt_sync_polarity[MXL_HYDRA_DEMOD_MAX] = { + {0x90700010, 8, 1}, {0x90700010, 9, 1}, + {0x90700010, 10, 1}, {0x90700010, 11, 1}, + {0x90700010, 12, 1}, {0x90700010, 13, 1}, + {0x90700010, 14, 1}, {0x90700010, 15, 1} }; +- struct MXL_REG_FIELD_T xpt_clock_polarity[MXL_HYDRA_DEMOD_MAX] = { ++ static const struct MXL_REG_FIELD_T xpt_clock_polarity[MXL_HYDRA_DEMOD_MAX] = { + {0x90700010, 16, 1}, {0x90700010, 17, 1}, + {0x90700010, 18, 1}, {0x90700010, 19, 1}, + {0x90700010, 20, 1}, {0x90700010, 21, 1}, + {0x90700010, 22, 1}, {0x90700010, 23, 1} }; +- struct MXL_REG_FIELD_T xpt_valid_polarity[MXL_HYDRA_DEMOD_MAX] = { ++ static const struct MXL_REG_FIELD_T xpt_valid_polarity[MXL_HYDRA_DEMOD_MAX] = { + {0x90700014, 0, 1}, {0x90700014, 1, 1}, + {0x90700014, 2, 1}, {0x90700014, 3, 1}, + {0x90700014, 4, 1}, {0x90700014, 5, 1}, + {0x90700014, 6, 1}, {0x90700014, 7, 1} }; +- struct MXL_REG_FIELD_T xpt_ts_clock_phase[MXL_HYDRA_DEMOD_MAX] = { ++ static const struct MXL_REG_FIELD_T xpt_ts_clock_phase[MXL_HYDRA_DEMOD_MAX] = { + {0x90700018, 0, 3}, {0x90700018, 4, 3}, + {0x90700018, 8, 3}, {0x90700018, 12, 3}, + {0x90700018, 16, 3}, {0x90700018, 20, 3}, + {0x90700018, 24, 3}, {0x90700018, 28, 3} }; +- struct MXL_REG_FIELD_T xpt_lsb_first[MXL_HYDRA_DEMOD_MAX] = { ++ static const struct MXL_REG_FIELD_T xpt_lsb_first[MXL_HYDRA_DEMOD_MAX] = { + {0x9070000C, 16, 1}, {0x9070000C, 17, 1}, + {0x9070000C, 18, 1}, {0x9070000C, 19, 1}, + {0x9070000C, 20, 1}, {0x9070000C, 21, 1}, + {0x9070000C, 22, 1}, {0x9070000C, 23, 1} }; +- struct MXL_REG_FIELD_T xpt_sync_byte[MXL_HYDRA_DEMOD_MAX] = { ++ static const struct MXL_REG_FIELD_T xpt_sync_byte[MXL_HYDRA_DEMOD_MAX] = { + {0x90700010, 0, 1}, {0x90700010, 1, 1}, + {0x90700010, 2, 1}, {0x90700010, 3, 1}, + {0x90700010, 4, 1}, {0x90700010, 5, 1}, + {0x90700010, 6, 1}, {0x90700010, 7, 1} }; +- struct MXL_REG_FIELD_T xpt_enable_output[MXL_HYDRA_DEMOD_MAX] = { ++ static const struct MXL_REG_FIELD_T xpt_enable_output[MXL_HYDRA_DEMOD_MAX] = { + {0x9070000C, 0, 1}, {0x9070000C, 1, 1}, + {0x9070000C, 2, 1}, {0x9070000C, 3, 1}, + {0x9070000C, 4, 1}, {0x9070000C, 5, 1}, + {0x9070000C, 6, 1}, {0x9070000C, 7, 1} }; +- struct MXL_REG_FIELD_T xpt_err_replace_sync[MXL_HYDRA_DEMOD_MAX] = { ++ static const struct MXL_REG_FIELD_T xpt_err_replace_sync[MXL_HYDRA_DEMOD_MAX] = { + {0x9070000C, 24, 1}, {0x9070000C, 25, 1}, + {0x9070000C, 26, 1}, {0x9070000C, 27, 1}, + {0x9070000C, 28, 1}, {0x9070000C, 29, 1}, + {0x9070000C, 30, 1}, {0x9070000C, 31, 1} }; +- struct MXL_REG_FIELD_T xpt_err_replace_valid[MXL_HYDRA_DEMOD_MAX] = { ++ static const struct MXL_REG_FIELD_T xpt_err_replace_valid[MXL_HYDRA_DEMOD_MAX] = { + {0x90700014, 8, 1}, {0x90700014, 9, 1}, + {0x90700014, 10, 1}, {0x90700014, 11, 1}, + {0x90700014, 12, 1}, {0x90700014, 13, 1}, + {0x90700014, 14, 1}, {0x90700014, 15, 1} }; +- struct MXL_REG_FIELD_T xpt_continuous_clock[MXL_HYDRA_DEMOD_MAX] = { ++ static const struct MXL_REG_FIELD_T xpt_continuous_clock[MXL_HYDRA_DEMOD_MAX] = { + {0x907001D4, 0, 1}, {0x907001D4, 1, 1}, + {0x907001D4, 2, 1}, {0x907001D4, 3, 1}, + {0x907001D4, 4, 1}, {0x907001D4, 5, 1}, + {0x907001D4, 6, 1}, {0x907001D4, 7, 1} }; +- struct MXL_REG_FIELD_T xpt_nco_clock_rate[MXL_HYDRA_DEMOD_MAX] = { ++ static const struct MXL_REG_FIELD_T xpt_nco_clock_rate[MXL_HYDRA_DEMOD_MAX] = { + {0x90700044, 16, 80}, {0x90700044, 16, 81}, + {0x90700044, 16, 82}, {0x90700044, 16, 83}, + {0x90700044, 16, 84}, {0x90700044, 16, 85}, diff --git a/queue-5.4/media-v4l2-core-hold-videodev_lock-until-dev-reg-finishes.patch b/queue-5.4/media-v4l2-core-hold-videodev_lock-until-dev-reg-finishes.patch new file mode 100644 index 00000000000..7682909798c --- /dev/null +++ b/queue-5.4/media-v4l2-core-hold-videodev_lock-until-dev-reg-finishes.patch @@ -0,0 +1,50 @@ +From 1ed4477f2ea4743e7c5e1f9f3722152d14e6eeb1 Mon Sep 17 00:00:00 2001 +From: Hans Verkuil +Date: Fri, 23 Feb 2024 09:45:36 +0100 +Subject: media: v4l2-core: hold videodev_lock until dev reg, finishes + +From: Hans Verkuil + +commit 1ed4477f2ea4743e7c5e1f9f3722152d14e6eeb1 upstream. + +After the new V4L2 device node was registered, some additional +initialization was done before the device node was marked as +'registered'. During the time between creating the device node +and marking it as 'registered' it was possible to open the +device node, which would return -ENODEV since the 'registered' +flag was not yet set. + +Hold the videodev_lock mutex from just before the device node +is registered until the 'registered' flag is set. Since v4l2_open +will take the same lock, it will wait until this registration +process is finished. This resolves this race condition. + +Signed-off-by: Hans Verkuil +Reviewed-by: Sakari Ailus +Cc: # for vi4.18 and up +Signed-off-by: Greg Kroah-Hartman +--- + drivers/media/v4l2-core/v4l2-dev.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/drivers/media/v4l2-core/v4l2-dev.c ++++ b/drivers/media/v4l2-core/v4l2-dev.c +@@ -1011,8 +1011,10 @@ int __video_register_device(struct video + vdev->dev.devt = MKDEV(VIDEO_MAJOR, vdev->minor); + vdev->dev.parent = vdev->dev_parent; + dev_set_name(&vdev->dev, "%s%d", name_base, vdev->num); ++ mutex_lock(&videodev_lock); + ret = device_register(&vdev->dev); + if (ret < 0) { ++ mutex_unlock(&videodev_lock); + pr_err("%s: device_register failed\n", __func__); + goto cleanup; + } +@@ -1032,6 +1034,7 @@ int __video_register_device(struct video + + /* Part 6: Activate this minor. The char device can now be used. */ + set_bit(V4L2_FL_REGISTERED, &vdev->flags); ++ mutex_unlock(&videodev_lock); + + return 0; + diff --git a/queue-5.4/series b/queue-5.4/series index 22ee1e48b4a..68e7189ea85 100644 --- a/queue-5.4/series +++ b/queue-5.4/series @@ -176,3 +176,9 @@ ata-pata_legacy-make-legacy_exit-work-again.patch acpi-resource-do-irq-override-on-tongfang-gxxhrxx-and-gmxhgxx.patch arm64-tegra-correct-tegra132-i2c-alias.patch md-raid5-fix-deadlock-that-raid5d-wait-for-itself-to-clear-md_sb_change_pending.patch +wifi-rtl8xxxu-fix-the-tx-power-of-rtl8192cu-rtl8723au.patch +arm64-dts-hi3798cv200-fix-the-size-of-gicr.patch +media-mc-mark-the-media-devnode-as-registered-from-the-start.patch +media-mxl5xx-move-xpt-structures-off-stack.patch +media-v4l2-core-hold-videodev_lock-until-dev-reg-finishes.patch +fbdev-savage-handle-err-return-when-savagefb_check_var-failed.patch diff --git a/queue-5.4/wifi-rtl8xxxu-fix-the-tx-power-of-rtl8192cu-rtl8723au.patch b/queue-5.4/wifi-rtl8xxxu-fix-the-tx-power-of-rtl8192cu-rtl8723au.patch new file mode 100644 index 00000000000..0b613c77cf5 --- /dev/null +++ b/queue-5.4/wifi-rtl8xxxu-fix-the-tx-power-of-rtl8192cu-rtl8723au.patch @@ -0,0 +1,98 @@ +From 08b5d052d17a89bb8706b2888277d0b682dc1610 Mon Sep 17 00:00:00 2001 +From: Bitterblue Smith +Date: Mon, 15 Apr 2024 23:59:05 +0300 +Subject: wifi: rtl8xxxu: Fix the TX power of RTL8192CU, RTL8723AU + +From: Bitterblue Smith + +commit 08b5d052d17a89bb8706b2888277d0b682dc1610 upstream. + +Don't subtract 1 from the power index. This was added in commit +2fc0b8e5a17d ("rtl8xxxu: Add TX power base values for gen1 parts") +for unknown reasons. The vendor drivers don't do this. + +Also correct the calculations of values written to +REG_OFDM0_X{C,D}_TX_IQ_IMBALANCE. According to the vendor driver, +these are used for TX power training. + +With these changes rtl8xxxu sets the TX power of RTL8192CU the same +as the vendor driver. + +None of this appears to have any effect on my RTL8192CU device. + +Cc: stable@vger.kernel.org +Signed-off-by: Bitterblue Smith +Reviewed-by: Ping-Ke Shih +Signed-off-by: Ping-Ke Shih +Link: https://msgid.link/6ae5945b-644e-45e4-a78f-4c7d9c987910@gmail.com +Signed-off-by: Greg Kroah-Hartman +--- + drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 26 +++++++----------- + 1 file changed, 11 insertions(+), 15 deletions(-) + +--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c ++++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c +@@ -28,6 +28,7 @@ + #include + #include + #include ++#include + #include + #include "rtl8xxxu.h" + #include "rtl8xxxu_regs.h" +@@ -1390,13 +1391,13 @@ rtl8xxxu_gen1_set_tx_power(struct rtl8xx + u8 cck[RTL8723A_MAX_RF_PATHS], ofdm[RTL8723A_MAX_RF_PATHS]; + u8 ofdmbase[RTL8723A_MAX_RF_PATHS], mcsbase[RTL8723A_MAX_RF_PATHS]; + u32 val32, ofdm_a, ofdm_b, mcs_a, mcs_b; +- u8 val8; ++ u8 val8, base; + int group, i; + + group = rtl8xxxu_gen1_channel_to_group(channel); + +- cck[0] = priv->cck_tx_power_index_A[group] - 1; +- cck[1] = priv->cck_tx_power_index_B[group] - 1; ++ cck[0] = priv->cck_tx_power_index_A[group]; ++ cck[1] = priv->cck_tx_power_index_B[group]; + + if (priv->hi_pa) { + if (cck[0] > 0x20) +@@ -1407,10 +1408,6 @@ rtl8xxxu_gen1_set_tx_power(struct rtl8xx + + ofdm[0] = priv->ht40_1s_tx_power_index_A[group]; + ofdm[1] = priv->ht40_1s_tx_power_index_B[group]; +- if (ofdm[0]) +- ofdm[0] -= 1; +- if (ofdm[1]) +- ofdm[1] -= 1; + + ofdmbase[0] = ofdm[0] + priv->ofdm_tx_power_index_diff[group].a; + ofdmbase[1] = ofdm[1] + priv->ofdm_tx_power_index_diff[group].b; +@@ -1499,20 +1496,19 @@ rtl8xxxu_gen1_set_tx_power(struct rtl8xx + + rtl8xxxu_write32(priv, REG_TX_AGC_A_MCS15_MCS12, + mcs_a + power_base->reg_0e1c); ++ val8 = u32_get_bits(mcs_a + power_base->reg_0e1c, 0xff000000); + for (i = 0; i < 3; i++) { +- if (i != 2) +- val8 = (mcsbase[0] > 8) ? (mcsbase[0] - 8) : 0; +- else +- val8 = (mcsbase[0] > 6) ? (mcsbase[0] - 6) : 0; ++ base = i != 2 ? 8 : 6; ++ val8 = max_t(int, val8 - base, 0); + rtl8xxxu_write8(priv, REG_OFDM0_XC_TX_IQ_IMBALANCE + i, val8); + } ++ + rtl8xxxu_write32(priv, REG_TX_AGC_B_MCS15_MCS12, + mcs_b + power_base->reg_0868); ++ val8 = u32_get_bits(mcs_b + power_base->reg_0868, 0xff000000); + for (i = 0; i < 3; i++) { +- if (i != 2) +- val8 = (mcsbase[1] > 8) ? (mcsbase[1] - 8) : 0; +- else +- val8 = (mcsbase[1] > 6) ? (mcsbase[1] - 6) : 0; ++ base = i != 2 ? 8 : 6; ++ val8 = max_t(int, val8 - base, 0); + rtl8xxxu_write8(priv, REG_OFDM0_XD_TX_IQ_IMBALANCE + i, val8); + } + } -- 2.47.3