diff mbox series

wifi: rtw89: fix clang-specific -Wvoid-pointer-to-enum-cast

Message ID 20231019093805.66324-1-dmantipov@yandex.ru (mailing list archive)
State Changes Requested
Delegated to: Kalle Valo
Headers show
Series wifi: rtw89: fix clang-specific -Wvoid-pointer-to-enum-cast | expand

Commit Message

Dmitry Antipov Oct. 19, 2023, 9:38 a.m. UTC
When compiling with clang-18, I've noticed the following:

drivers/net/wireless/realtek/rtw89/fw.c:389:28: warning: cast to smaller
integer type 'enum rtw89_fw_type' from 'const void *' [-Wvoid-pointer-to-enum-cast]
  389 |         enum rtw89_fw_type type = (enum rtw89_fw_type)data;
      |                                   ^~~~~~~~~~~~~~~~~~~~~~~~
drivers/net/wireless/realtek/rtw89/fw.c:569:13: warning: cast to smaller
integer type 'enum rtw89_rf_path' from 'const void *' [-Wvoid-pointer-to-enum-cast]
  569 |                 rf_path = (enum rtw89_rf_path)data;
      |                           ^~~~~~~~~~~~~~~~~~~~~~~~

So avoid brutal everything-to-const-void-and-back casts, introduce
'union rtw89_fw_element_data' to pass parameters to element handler
callbacks, and adjust all of the related bits accordingly. Compile
tested only.

Signed-off-by: Dmitry Antipov <dmantipov@yandex.ru>
---
 drivers/net/wireless/realtek/rtw89/fw.c | 81 +++++++++++++++----------
 1 file changed, 50 insertions(+), 31 deletions(-)

Comments

Ping-Ke Shih Oct. 20, 2023, 3:15 a.m. UTC | #1
> -----Original Message-----
> From: Dmitry Antipov <dmantipov@yandex.ru>
> Sent: Thursday, October 19, 2023 5:38 PM
> To: Ping-Ke Shih <pkshih@realtek.com>
> Cc: Tom Rix <trix@redhat.com>; Kalle Valo <kvalo@kernel.org>; linux-wireless@vger.kernel.org; Dmitry
> Antipov <dmantipov@yandex.ru>
> Subject: [PATCH] wifi: rtw89: fix clang-specific -Wvoid-pointer-to-enum-cast

Please point out "fw_element" in subject, so it would be clear to know what
we are dealing with. 

> 
> When compiling with clang-18, I've noticed the following:
> 
> drivers/net/wireless/realtek/rtw89/fw.c:389:28: warning: cast to smaller
> integer type 'enum rtw89_fw_type' from 'const void *' [-Wvoid-pointer-to-enum-cast]
>   389 |         enum rtw89_fw_type type = (enum rtw89_fw_type)data;
>       |                                   ^~~~~~~~~~~~~~~~~~~~~~~~
> drivers/net/wireless/realtek/rtw89/fw.c:569:13: warning: cast to smaller
> integer type 'enum rtw89_rf_path' from 'const void *' [-Wvoid-pointer-to-enum-cast]
>   569 |                 rf_path = (enum rtw89_rf_path)data;
>       |                           ^~~~~~~~~~~~~~~~~~~~~~~~
> 
> So avoid brutal everything-to-const-void-and-back casts, introduce
> 'union rtw89_fw_element_data' to pass parameters to element handler
> callbacks, and adjust all of the related bits accordingly. Compile
> tested only.
> 
> Signed-off-by: Dmitry Antipov <dmantipov@yandex.ru>
> ---
>  drivers/net/wireless/realtek/rtw89/fw.c | 81 +++++++++++++++----------
>  1 file changed, 50 insertions(+), 31 deletions(-)
> 
> diff --git a/drivers/net/wireless/realtek/rtw89/fw.c b/drivers/net/wireless/realtek/rtw89/fw.c
> index 7cfcf536d6fe..13a98c44d304 100644
> --- a/drivers/net/wireless/realtek/rtw89/fw.c
> +++ b/drivers/net/wireless/realtek/rtw89/fw.c
> @@ -13,6 +13,20 @@
>  #include "reg.h"
>  #include "util.h"
> 
> +union rtw89_fw_element_data {

"fw_element_data" could be confusing, because it looks like data from firmware file.
Prefer "fw_element_arg" or "fw_element_var", because the certain handler can handle
various cases of fw_element_id. 

Then, third argument of handler becomes 'const union rtw89_fw_element_arg arg'.

> +       size_t offset;
> +       enum rtw89_rf_path path;
> +       enum rtw89_fw_type type;

'rf_path' and 'fw_type' would be clearer. 

> +};
> +
> +struct rtw89_fw_element_handler {
> +       int (*fn)(struct rtw89_dev *rtwdev,
> +                 const struct rtw89_fw_element_hdr *elm,
> +                 const union rtw89_fw_element_data data);
> +       const union rtw89_fw_element_data data;
> +       const char *name;
> +};
> +
>  static void rtw89_fw_c2h_cmd_handle(struct rtw89_dev *rtwdev,
>                                     struct sk_buff *skb);
>  static int rtw89_h2c_tx_and_wait(struct rtw89_dev *rtwdev, struct sk_buff *skb,
> @@ -384,9 +398,9 @@ int __rtw89_fw_recognize(struct rtw89_dev *rtwdev, enum rtw89_fw_type type,
>  static
>  int __rtw89_fw_recognize_from_elm(struct rtw89_dev *rtwdev,
>                                   const struct rtw89_fw_element_hdr *elm,
> -                                 const void *data)
> +                                 const union rtw89_fw_element_data data)
>  {
> -       enum rtw89_fw_type type = (enum rtw89_fw_type)data;
> +       enum rtw89_fw_type type = data.type;
>         struct rtw89_fw_suit *fw_suit;
> 
>         fw_suit = rtw89_fw_suit_get(rtwdev, type);
> @@ -542,7 +556,7 @@ int rtw89_fw_recognize(struct rtw89_dev *rtwdev)
>  static
>  int rtw89_build_phy_tbl_from_elm(struct rtw89_dev *rtwdev,
>                                  const struct rtw89_fw_element_hdr *elm,
> -                                const void *data)
> +                                const union rtw89_fw_element_data data)
>  {
>         struct rtw89_fw_elm_info *elm_info = &rtwdev->fw.elm_info;
>         struct rtw89_phy_table *tbl;
> @@ -566,7 +580,7 @@ int rtw89_build_phy_tbl_from_elm(struct rtw89_dev *rtwdev,
>         case RTW89_FW_ELEMENT_ID_RADIO_B:
>         case RTW89_FW_ELEMENT_ID_RADIO_C:
>         case RTW89_FW_ELEMENT_ID_RADIO_D:
> -               rf_path = (enum rtw89_rf_path)data;
> +               rf_path = data.path;
>                 idx = elm->u.reg2.idx;
> 
>                 elm_info->rf_radio[idx] = tbl;
> @@ -604,10 +618,10 @@ int rtw89_build_phy_tbl_from_elm(struct rtw89_dev *rtwdev,
>  static
>  int rtw89_fw_recognize_txpwr_from_elm(struct rtw89_dev *rtwdev,
>                                       const struct rtw89_fw_element_hdr *elm,
> -                                     const void *data)
> +                                     union rtw89_fw_element_data data)

const union rtw89_fw_element_data data

miss 'const' here.

>  {
>         const struct __rtw89_fw_txpwr_element *txpwr_elm = &elm->u.txpwr;
> -       const unsigned long offset = (const unsigned long)data;
> +       const unsigned long offset = data.offset;
>         struct rtw89_efuse *efuse = &rtwdev->efuse;
>         struct rtw89_txpwr_conf *conf;
> 
> @@ -644,64 +658,69 @@ int rtw89_fw_recognize_txpwr_from_elm(struct rtw89_dev *rtwdev,
>         return 0;
>  }
> 
> -struct rtw89_fw_element_handler {
> -       int (*fn)(struct rtw89_dev *rtwdev,
> -                 const struct rtw89_fw_element_hdr *elm, const void *data);
> -       const void *data;
> -       const char *name;
> -};
> -
>  static const struct rtw89_fw_element_handler __fw_element_handlers[] = {
>         [RTW89_FW_ELEMENT_ID_BBMCU0] = {__rtw89_fw_recognize_from_elm,
> -                                       (const void *)RTW89_FW_BBMCU0, NULL},
> +                                       { .type = RTW89_FW_BBMCU0 }, NULL},
>         [RTW89_FW_ELEMENT_ID_BBMCU1] = {__rtw89_fw_recognize_from_elm,
> -                                       (const void *)RTW89_FW_BBMCU1, NULL},
> -       [RTW89_FW_ELEMENT_ID_BB_REG] = {rtw89_build_phy_tbl_from_elm, NULL, "BB"},
> -       [RTW89_FW_ELEMENT_ID_BB_GAIN] = {rtw89_build_phy_tbl_from_elm, NULL, NULL},
> +                                       { .type = RTW89_FW_BBMCU1 }, NULL},
> +       [RTW89_FW_ELEMENT_ID_BB_REG] = {rtw89_build_phy_tbl_from_elm,
> +                                       { 0 }, "BB"},

Can we just '{}' instead? And, straighten it to single one line as before, like

[RTW89_FW_ELEMENT_ID_BB_REG] = {rtw89_build_phy_tbl_from_elm, {], "BB"},

> +       [RTW89_FW_ELEMENT_ID_BB_GAIN] = {rtw89_build_phy_tbl_from_elm,
> +                                        { 0 }, NULL},
>         [RTW89_FW_ELEMENT_ID_RADIO_A] = {rtw89_build_phy_tbl_from_elm,
> -                                        (const void *)RF_PATH_A, "radio A"},
> +                                        { .path = RF_PATH_A }, "radio A"},
>         [RTW89_FW_ELEMENT_ID_RADIO_B] = {rtw89_build_phy_tbl_from_elm,
> -                                        (const void *)RF_PATH_B, NULL},
> +                                        { .path = RF_PATH_B }, NULL},
>         [RTW89_FW_ELEMENT_ID_RADIO_C] = {rtw89_build_phy_tbl_from_elm,
> -                                        (const void *)RF_PATH_C, NULL},
> +                                        { .path = RF_PATH_C }, NULL},
>         [RTW89_FW_ELEMENT_ID_RADIO_D] = {rtw89_build_phy_tbl_from_elm,
> -                                        (const void *)RF_PATH_D, NULL},
> -       [RTW89_FW_ELEMENT_ID_RF_NCTL] = {rtw89_build_phy_tbl_from_elm, NULL, "NCTL"},
> +                                        { .path = RF_PATH_D }, NULL},
> +       [RTW89_FW_ELEMENT_ID_RF_NCTL] = {rtw89_build_phy_tbl_from_elm,
> +                                        { 0 }, "NCTL"},
>         [RTW89_FW_ELEMENT_ID_TXPWR_BYRATE] = {
>                 rtw89_fw_recognize_txpwr_from_elm,
> -               (const void *)offsetof(struct rtw89_rfe_data, byrate.conf), "TXPWR",
> +               { .offset = offsetof(struct rtw89_rfe_data, byrate.conf) },
> +               "TXPWR",

Prefer keeping original single-one-line style.

>         },
>         [RTW89_FW_ELEMENT_ID_TXPWR_LMT_2GHZ] = {
>                 rtw89_fw_recognize_txpwr_from_elm,
> -               (const void *)offsetof(struct rtw89_rfe_data, lmt_2ghz.conf), NULL,
> +               { .offset = offsetof(struct rtw89_rfe_data, lmt_2ghz.conf) },
> +               NULL,
>         },
>         [RTW89_FW_ELEMENT_ID_TXPWR_LMT_5GHZ] = {
>                 rtw89_fw_recognize_txpwr_from_elm,
> -               (const void *)offsetof(struct rtw89_rfe_data, lmt_5ghz.conf), NULL,
> +               { .offset = offsetof(struct rtw89_rfe_data, lmt_5ghz.conf) },
> +               NULL,
>         },
>         [RTW89_FW_ELEMENT_ID_TXPWR_LMT_6GHZ] = {
>                 rtw89_fw_recognize_txpwr_from_elm,
> -               (const void *)offsetof(struct rtw89_rfe_data, lmt_6ghz.conf), NULL,
> +               { .offset = offsetof(struct rtw89_rfe_data, lmt_6ghz.conf) },
> +               NULL,
>         },
>         [RTW89_FW_ELEMENT_ID_TXPWR_LMT_RU_2GHZ] = {
>                 rtw89_fw_recognize_txpwr_from_elm,
> -               (const void *)offsetof(struct rtw89_rfe_data, lmt_ru_2ghz.conf), NULL,
> +               { .offset = offsetof(struct rtw89_rfe_data, lmt_ru_2ghz.conf) },
> +               NULL,
>         },
>         [RTW89_FW_ELEMENT_ID_TXPWR_LMT_RU_5GHZ] = {
>                 rtw89_fw_recognize_txpwr_from_elm,
> -               (const void *)offsetof(struct rtw89_rfe_data, lmt_ru_5ghz.conf), NULL,
> +               { .offset = offsetof(struct rtw89_rfe_data, lmt_ru_5ghz.conf) },
> +               NULL,
>         },
>         [RTW89_FW_ELEMENT_ID_TXPWR_LMT_RU_6GHZ] = {
>                 rtw89_fw_recognize_txpwr_from_elm,
> -               (const void *)offsetof(struct rtw89_rfe_data, lmt_ru_6ghz.conf), NULL,
> +               { .offset = offsetof(struct rtw89_rfe_data, lmt_ru_6ghz.conf) },
> +               NULL,
>         },
>         [RTW89_FW_ELEMENT_ID_TX_SHAPE_LMT] = {
>                 rtw89_fw_recognize_txpwr_from_elm,
> -               (const void *)offsetof(struct rtw89_rfe_data, tx_shape_lmt.conf), NULL,
> +               { .offset = offsetof(struct rtw89_rfe_data, tx_shape_lmt.conf) },
> +               NULL,
>         },
>         [RTW89_FW_ELEMENT_ID_TX_SHAPE_LMT_RU] = {
>                 rtw89_fw_recognize_txpwr_from_elm,
> -               (const void *)offsetof(struct rtw89_rfe_data, tx_shape_lmt_ru.conf), NULL,
> +               { .offset = offsetof(struct rtw89_rfe_data, tx_shape_lmt_ru.conf) },
> +               NULL,
>         },
>  };
> 
> --
> 2.41.0
diff mbox series

Patch

diff --git a/drivers/net/wireless/realtek/rtw89/fw.c b/drivers/net/wireless/realtek/rtw89/fw.c
index 7cfcf536d6fe..13a98c44d304 100644
--- a/drivers/net/wireless/realtek/rtw89/fw.c
+++ b/drivers/net/wireless/realtek/rtw89/fw.c
@@ -13,6 +13,20 @@ 
 #include "reg.h"
 #include "util.h"
 
+union rtw89_fw_element_data {
+	size_t offset;
+	enum rtw89_rf_path path;
+	enum rtw89_fw_type type;
+};
+
+struct rtw89_fw_element_handler {
+	int (*fn)(struct rtw89_dev *rtwdev,
+		  const struct rtw89_fw_element_hdr *elm,
+		  const union rtw89_fw_element_data data);
+	const union rtw89_fw_element_data data;
+	const char *name;
+};
+
 static void rtw89_fw_c2h_cmd_handle(struct rtw89_dev *rtwdev,
 				    struct sk_buff *skb);
 static int rtw89_h2c_tx_and_wait(struct rtw89_dev *rtwdev, struct sk_buff *skb,
@@ -384,9 +398,9 @@  int __rtw89_fw_recognize(struct rtw89_dev *rtwdev, enum rtw89_fw_type type,
 static
 int __rtw89_fw_recognize_from_elm(struct rtw89_dev *rtwdev,
 				  const struct rtw89_fw_element_hdr *elm,
-				  const void *data)
+				  const union rtw89_fw_element_data data)
 {
-	enum rtw89_fw_type type = (enum rtw89_fw_type)data;
+	enum rtw89_fw_type type = data.type;
 	struct rtw89_fw_suit *fw_suit;
 
 	fw_suit = rtw89_fw_suit_get(rtwdev, type);
@@ -542,7 +556,7 @@  int rtw89_fw_recognize(struct rtw89_dev *rtwdev)
 static
 int rtw89_build_phy_tbl_from_elm(struct rtw89_dev *rtwdev,
 				 const struct rtw89_fw_element_hdr *elm,
-				 const void *data)
+				 const union rtw89_fw_element_data data)
 {
 	struct rtw89_fw_elm_info *elm_info = &rtwdev->fw.elm_info;
 	struct rtw89_phy_table *tbl;
@@ -566,7 +580,7 @@  int rtw89_build_phy_tbl_from_elm(struct rtw89_dev *rtwdev,
 	case RTW89_FW_ELEMENT_ID_RADIO_B:
 	case RTW89_FW_ELEMENT_ID_RADIO_C:
 	case RTW89_FW_ELEMENT_ID_RADIO_D:
-		rf_path = (enum rtw89_rf_path)data;
+		rf_path = data.path;
 		idx = elm->u.reg2.idx;
 
 		elm_info->rf_radio[idx] = tbl;
@@ -604,10 +618,10 @@  int rtw89_build_phy_tbl_from_elm(struct rtw89_dev *rtwdev,
 static
 int rtw89_fw_recognize_txpwr_from_elm(struct rtw89_dev *rtwdev,
 				      const struct rtw89_fw_element_hdr *elm,
-				      const void *data)
+				      union rtw89_fw_element_data data)
 {
 	const struct __rtw89_fw_txpwr_element *txpwr_elm = &elm->u.txpwr;
-	const unsigned long offset = (const unsigned long)data;
+	const unsigned long offset = data.offset;
 	struct rtw89_efuse *efuse = &rtwdev->efuse;
 	struct rtw89_txpwr_conf *conf;
 
@@ -644,64 +658,69 @@  int rtw89_fw_recognize_txpwr_from_elm(struct rtw89_dev *rtwdev,
 	return 0;
 }
 
-struct rtw89_fw_element_handler {
-	int (*fn)(struct rtw89_dev *rtwdev,
-		  const struct rtw89_fw_element_hdr *elm, const void *data);
-	const void *data;
-	const char *name;
-};
-
 static const struct rtw89_fw_element_handler __fw_element_handlers[] = {
 	[RTW89_FW_ELEMENT_ID_BBMCU0] = {__rtw89_fw_recognize_from_elm,
-					(const void *)RTW89_FW_BBMCU0, NULL},
+					{ .type = RTW89_FW_BBMCU0 }, NULL},
 	[RTW89_FW_ELEMENT_ID_BBMCU1] = {__rtw89_fw_recognize_from_elm,
-					(const void *)RTW89_FW_BBMCU1, NULL},
-	[RTW89_FW_ELEMENT_ID_BB_REG] = {rtw89_build_phy_tbl_from_elm, NULL, "BB"},
-	[RTW89_FW_ELEMENT_ID_BB_GAIN] = {rtw89_build_phy_tbl_from_elm, NULL, NULL},
+					{ .type = RTW89_FW_BBMCU1 }, NULL},
+	[RTW89_FW_ELEMENT_ID_BB_REG] = {rtw89_build_phy_tbl_from_elm,
+					{ 0 }, "BB"},
+	[RTW89_FW_ELEMENT_ID_BB_GAIN] = {rtw89_build_phy_tbl_from_elm,
+					 { 0 }, NULL},
 	[RTW89_FW_ELEMENT_ID_RADIO_A] = {rtw89_build_phy_tbl_from_elm,
-					 (const void *)RF_PATH_A, "radio A"},
+					 { .path = RF_PATH_A }, "radio A"},
 	[RTW89_FW_ELEMENT_ID_RADIO_B] = {rtw89_build_phy_tbl_from_elm,
-					 (const void *)RF_PATH_B, NULL},
+					 { .path = RF_PATH_B }, NULL},
 	[RTW89_FW_ELEMENT_ID_RADIO_C] = {rtw89_build_phy_tbl_from_elm,
-					 (const void *)RF_PATH_C, NULL},
+					 { .path = RF_PATH_C }, NULL},
 	[RTW89_FW_ELEMENT_ID_RADIO_D] = {rtw89_build_phy_tbl_from_elm,
-					 (const void *)RF_PATH_D, NULL},
-	[RTW89_FW_ELEMENT_ID_RF_NCTL] = {rtw89_build_phy_tbl_from_elm, NULL, "NCTL"},
+					 { .path = RF_PATH_D }, NULL},
+	[RTW89_FW_ELEMENT_ID_RF_NCTL] = {rtw89_build_phy_tbl_from_elm,
+					 { 0 }, "NCTL"},
 	[RTW89_FW_ELEMENT_ID_TXPWR_BYRATE] = {
 		rtw89_fw_recognize_txpwr_from_elm,
-		(const void *)offsetof(struct rtw89_rfe_data, byrate.conf), "TXPWR",
+		{ .offset = offsetof(struct rtw89_rfe_data, byrate.conf) },
+		"TXPWR",
 	},
 	[RTW89_FW_ELEMENT_ID_TXPWR_LMT_2GHZ] = {
 		rtw89_fw_recognize_txpwr_from_elm,
-		(const void *)offsetof(struct rtw89_rfe_data, lmt_2ghz.conf), NULL,
+		{ .offset = offsetof(struct rtw89_rfe_data, lmt_2ghz.conf) },
+		NULL,
 	},
 	[RTW89_FW_ELEMENT_ID_TXPWR_LMT_5GHZ] = {
 		rtw89_fw_recognize_txpwr_from_elm,
-		(const void *)offsetof(struct rtw89_rfe_data, lmt_5ghz.conf), NULL,
+		{ .offset = offsetof(struct rtw89_rfe_data, lmt_5ghz.conf) },
+		NULL,
 	},
 	[RTW89_FW_ELEMENT_ID_TXPWR_LMT_6GHZ] = {
 		rtw89_fw_recognize_txpwr_from_elm,
-		(const void *)offsetof(struct rtw89_rfe_data, lmt_6ghz.conf), NULL,
+		{ .offset = offsetof(struct rtw89_rfe_data, lmt_6ghz.conf) },
+		NULL,
 	},
 	[RTW89_FW_ELEMENT_ID_TXPWR_LMT_RU_2GHZ] = {
 		rtw89_fw_recognize_txpwr_from_elm,
-		(const void *)offsetof(struct rtw89_rfe_data, lmt_ru_2ghz.conf), NULL,
+		{ .offset = offsetof(struct rtw89_rfe_data, lmt_ru_2ghz.conf) },
+		NULL,
 	},
 	[RTW89_FW_ELEMENT_ID_TXPWR_LMT_RU_5GHZ] = {
 		rtw89_fw_recognize_txpwr_from_elm,
-		(const void *)offsetof(struct rtw89_rfe_data, lmt_ru_5ghz.conf), NULL,
+		{ .offset = offsetof(struct rtw89_rfe_data, lmt_ru_5ghz.conf) },
+		NULL,
 	},
 	[RTW89_FW_ELEMENT_ID_TXPWR_LMT_RU_6GHZ] = {
 		rtw89_fw_recognize_txpwr_from_elm,
-		(const void *)offsetof(struct rtw89_rfe_data, lmt_ru_6ghz.conf), NULL,
+		{ .offset = offsetof(struct rtw89_rfe_data, lmt_ru_6ghz.conf) },
+		NULL,
 	},
 	[RTW89_FW_ELEMENT_ID_TX_SHAPE_LMT] = {
 		rtw89_fw_recognize_txpwr_from_elm,
-		(const void *)offsetof(struct rtw89_rfe_data, tx_shape_lmt.conf), NULL,
+		{ .offset = offsetof(struct rtw89_rfe_data, tx_shape_lmt.conf) },
+		NULL,
 	},
 	[RTW89_FW_ELEMENT_ID_TX_SHAPE_LMT_RU] = {
 		rtw89_fw_recognize_txpwr_from_elm,
-		(const void *)offsetof(struct rtw89_rfe_data, tx_shape_lmt_ru.conf), NULL,
+		{ .offset = offsetof(struct rtw89_rfe_data, tx_shape_lmt_ru.conf) },
+		NULL,
 	},
 };