From: Luca Coelho <luciano.coe...@intel.com>

[ Upstream commit 5a6842455c113920001df83cffa28accceeb0927 ]

The value we receive from ACPI is a long long unsigned integer but the
values should be treated as signed char.  When comparing the received
value with ACPI_PPAG_MIN_LB/HB, we were doing an unsigned comparison,
so the negative value would actually be treated as a very high number.

To solve this issue, assign the value to our table of s8's before
making the comparison, so the value is already converted when we do
so.

Signed-off-by: Luca Coelho <luciano.coe...@intel.com>
Link: 
https://lore.kernel.org/r/iwlwifi.20210210135352.b0ec69f312bc.If77fd9c61a96aa7ef2ac96d935b7efd7df502399@changeid
Signed-off-by: Luca Coelho <luciano.coe...@intel.com>
Signed-off-by: Sasha Levin <sas...@kernel.org>
---
 drivers/net/wireless/intel/iwlwifi/mvm/fw.c | 19 +++++++++++++------
 1 file changed, 13 insertions(+), 6 deletions(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c 
b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c
index 9e150c01f7b37..522d547f35d58 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c
@@ -962,16 +962,23 @@ read_table:
                        union acpi_object *ent;
 
                        ent = &wifi_pkg->package.elements[idx++];
-                       if (ent->type != ACPI_TYPE_INTEGER ||
-                           (j == 0 && ent->integer.value > ACPI_PPAG_MAX_LB) ||
-                           (j == 0 && ent->integer.value < ACPI_PPAG_MIN_LB) ||
-                           (j != 0 && ent->integer.value > ACPI_PPAG_MAX_HB) ||
-                           (j != 0 && ent->integer.value < ACPI_PPAG_MIN_HB)) {
-                               ppag_table.v1.enabled = cpu_to_le32(0);
+                       if (ent->type != ACPI_TYPE_INTEGER) {
                                ret = -EINVAL;
                                goto out_free;
                        }
+
                        gain[i * num_sub_bands + j] = ent->integer.value;
+
+                       if ((j == 0 &&
+                            (gain[i * num_sub_bands + j] > ACPI_PPAG_MAX_LB ||
+                             gain[i * num_sub_bands + j] < ACPI_PPAG_MIN_LB)) 
||
+                           (j != 0 &&
+                            (gain[i * num_sub_bands + j] > ACPI_PPAG_MAX_HB ||
+                             gain[i * num_sub_bands + j] < ACPI_PPAG_MIN_HB))) 
{
+                               ppag_table.v1.enabled = cpu_to_le32(0);
+                               ret = -EINVAL;
+                               goto out_free;
+                       }
                }
        }
        ret = 0;
-- 
2.27.0



Reply via email to