* [PATCH v1 1/6] sdio: Add syntactic sugar to store a pointer in sdio_driver_id
2026-04-17 13:10 [PATCH v1 0/6] sdio: About pointers in sdio_device_id::driver_data Uwe Kleine-König (The Capable Hub)
@ 2026-04-17 13:10 ` Uwe Kleine-König (The Capable Hub)
2026-04-17 13:10 ` [PATCH v1 4/6] wifi: rtw88: Benefit from sdio_device_id::driver_data_ptr Uwe Kleine-König (The Capable Hub)
` (2 subsequent siblings)
3 siblings, 0 replies; 6+ messages in thread
From: Uwe Kleine-König (The Capable Hub) @ 2026-04-17 13:10 UTC (permalink / raw)
To: Ulf Hansson
Cc: Christian A. Ehrhardt, linux-mmc, Greg Kroah-Hartman,
Wolfram Sang, linux-kernel, Marcel Holtmann,
Luiz Augusto von Dentz, linux-bluetooth, Matthias Brugger,
AngeloGioacchino Del Regno, linux-mediatek, Ping-Ke Shih,
linux-wireless, Felix Fietkau, Lorenzo Bianconi, Ryder Lee,
Shayne Chen, Sean Wang, Brian Norris, Francesco Dolcini,
Andy Shevchenko
On all current Linux architectures sizeof(long) == sizeof(void *) and
this is used a lot through the kernel. For example it enables the usual
practice to store pointers in sdio_driver_id's .driver_data member.
This works fine, but involves casting and thus isn't type-safe.
Additionally with the CHERI architecture extension there are machines
with sizeof(void *) > sizeof(long) for with the traditional approach of
storing a pointer in .driver_data doesn't work.
By replacing the plain unsigned long .driver_data by an anonymous union,
most of the casting can be dropped and it yields a working solution for
CHERI.
All users of struct sdio_driver_id are initialized in a way that is
compatible with the new definition, so no adaptions are needed there.
Signed-off-by: Uwe Kleine-König (The Capable Hub) <u.kleine-koenig@baylibre.com>
---
include/linux/mod_devicetable.h | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/include/linux/mod_devicetable.h b/include/linux/mod_devicetable.h
index 5b1725fe9707..0eb5d196f5b5 100644
--- a/include/linux/mod_devicetable.h
+++ b/include/linux/mod_devicetable.h
@@ -414,7 +414,10 @@ struct sdio_device_id {
__u8 class; /* Standard interface or SDIO_ANY_ID */
__u16 vendor; /* Vendor or SDIO_ANY_ID */
__u16 device; /* Device ID or SDIO_ANY_ID */
- kernel_ulong_t driver_data; /* Data private to the driver */
+ union { /* Data private to the driver */
+ kernel_ulong_t driver_data;
+ const void *driver_data_ptr;
+ };
};
/* SSB core, see drivers/ssb/ */
--
2.47.3
^ permalink raw reply related [flat|nested] 6+ messages in thread* [PATCH v1 4/6] wifi: rtw88: Benefit from sdio_device_id::driver_data_ptr
2026-04-17 13:10 [PATCH v1 0/6] sdio: About pointers in sdio_device_id::driver_data Uwe Kleine-König (The Capable Hub)
2026-04-17 13:10 ` [PATCH v1 1/6] sdio: Add syntactic sugar to store a pointer in sdio_driver_id Uwe Kleine-König (The Capable Hub)
@ 2026-04-17 13:10 ` Uwe Kleine-König (The Capable Hub)
2026-04-17 13:10 ` [PATCH v1 5/6] wifi: mt76: mt7921-sdio: Make use of driver data pointer in sdio_device_id Uwe Kleine-König (The Capable Hub)
2026-04-17 13:10 ` [PATCH v1 6/6] wifi: mwifiex: " Uwe Kleine-König (The Capable Hub)
3 siblings, 0 replies; 6+ messages in thread
From: Uwe Kleine-König (The Capable Hub) @ 2026-04-17 13:10 UTC (permalink / raw)
To: Ping-Ke Shih; +Cc: Christian A. Ehrhardt, linux-wireless, linux-kernel
Recently struct sdio_device_id gained a new member to store a pointer to
driver data. Make use of that to get rid of a bunch of casts.
Signed-off-by: Uwe Kleine-König (The Capable Hub) <u.kleine-koenig@baylibre.com>
---
drivers/net/wireless/realtek/rtw88/rtw8723cs.c | 2 +-
drivers/net/wireless/realtek/rtw88/rtw8723ds.c | 4 ++--
drivers/net/wireless/realtek/rtw88/rtw8821cs.c | 2 +-
drivers/net/wireless/realtek/rtw88/rtw8822bs.c | 2 +-
drivers/net/wireless/realtek/rtw88/rtw8822cs.c | 2 +-
drivers/net/wireless/realtek/rtw88/sdio.c | 2 +-
6 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8723cs.c b/drivers/net/wireless/realtek/rtw88/rtw8723cs.c
index 2018c9d76dd1..dbe2ba989160 100644
--- a/drivers/net/wireless/realtek/rtw88/rtw8723cs.c
+++ b/drivers/net/wireless/realtek/rtw88/rtw8723cs.c
@@ -12,7 +12,7 @@ static const struct sdio_device_id rtw_8723cs_id_table[] = {
{
SDIO_DEVICE(SDIO_VENDOR_ID_REALTEK,
SDIO_DEVICE_ID_REALTEK_RTW8723CS),
- .driver_data = (kernel_ulong_t)&rtw8703b_hw_spec,
+ .driver_data_ptr = &rtw8703b_hw_spec,
},
{}
};
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8723ds.c b/drivers/net/wireless/realtek/rtw88/rtw8723ds.c
index e38c90b769a2..2d1872c97e30 100644
--- a/drivers/net/wireless/realtek/rtw88/rtw8723ds.c
+++ b/drivers/net/wireless/realtek/rtw88/rtw8723ds.c
@@ -13,12 +13,12 @@ static const struct sdio_device_id rtw_8723ds_id_table[] = {
{
SDIO_DEVICE(SDIO_VENDOR_ID_REALTEK,
SDIO_DEVICE_ID_REALTEK_RTW8723DS_1ANT),
- .driver_data = (kernel_ulong_t)&rtw8723d_hw_spec,
+ .driver_data_ptr = &rtw8723d_hw_spec,
},
{
SDIO_DEVICE(SDIO_VENDOR_ID_REALTEK,
SDIO_DEVICE_ID_REALTEK_RTW8723DS_2ANT),
- .driver_data = (kernel_ulong_t)&rtw8723d_hw_spec,
+ .driver_data_ptr = &rtw8723d_hw_spec,
},
{}
};
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821cs.c b/drivers/net/wireless/realtek/rtw88/rtw8821cs.c
index 58e0ef219cdc..7fb2d892e52d 100644
--- a/drivers/net/wireless/realtek/rtw88/rtw8821cs.c
+++ b/drivers/net/wireless/realtek/rtw88/rtw8821cs.c
@@ -13,7 +13,7 @@ static const struct sdio_device_id rtw_8821cs_id_table[] = {
{
SDIO_DEVICE(SDIO_VENDOR_ID_REALTEK,
SDIO_DEVICE_ID_REALTEK_RTW8821CS),
- .driver_data = (kernel_ulong_t)&rtw8821c_hw_spec,
+ .driver_data_ptr = &rtw8821c_hw_spec,
},
{}
};
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822bs.c b/drivers/net/wireless/realtek/rtw88/rtw8822bs.c
index 2de9b11540c5..08ae86e7ccbc 100644
--- a/drivers/net/wireless/realtek/rtw88/rtw8822bs.c
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822bs.c
@@ -13,7 +13,7 @@ static const struct sdio_device_id rtw_8822bs_id_table[] = {
{
SDIO_DEVICE(SDIO_VENDOR_ID_REALTEK,
SDIO_DEVICE_ID_REALTEK_RTW8822BS),
- .driver_data = (kernel_ulong_t)&rtw8822b_hw_spec,
+ .driver_data_ptr = &rtw8822b_hw_spec,
},
{}
};
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822cs.c b/drivers/net/wireless/realtek/rtw88/rtw8822cs.c
index b00ef4173962..9a6124ea2afc 100644
--- a/drivers/net/wireless/realtek/rtw88/rtw8822cs.c
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822cs.c
@@ -13,7 +13,7 @@ static const struct sdio_device_id rtw_8822cs_id_table[] = {
{
SDIO_DEVICE(SDIO_VENDOR_ID_REALTEK,
SDIO_DEVICE_ID_REALTEK_RTW8822CS),
- .driver_data = (kernel_ulong_t)&rtw8822c_hw_spec,
+ .driver_data_ptr = &rtw8822c_hw_spec,
},
{}
};
diff --git a/drivers/net/wireless/realtek/rtw88/sdio.c b/drivers/net/wireless/realtek/rtw88/sdio.c
index 1318e94f8524..f444a8f5902d 100644
--- a/drivers/net/wireless/realtek/rtw88/sdio.c
+++ b/drivers/net/wireless/realtek/rtw88/sdio.c
@@ -1334,7 +1334,7 @@ int rtw_sdio_probe(struct sdio_func *sdio_func,
rtwdev = hw->priv;
rtwdev->hw = hw;
rtwdev->dev = &sdio_func->dev;
- rtwdev->chip = (struct rtw_chip_info *)id->driver_data;
+ rtwdev->chip = id->driver_data_ptr;
rtwdev->hci.ops = &rtw_sdio_ops;
rtwdev->hci.type = RTW_HCI_TYPE_SDIO;
--
2.47.3
^ permalink raw reply related [flat|nested] 6+ messages in thread* [PATCH v1 5/6] wifi: mt76: mt7921-sdio: Make use of driver data pointer in sdio_device_id
2026-04-17 13:10 [PATCH v1 0/6] sdio: About pointers in sdio_device_id::driver_data Uwe Kleine-König (The Capable Hub)
2026-04-17 13:10 ` [PATCH v1 1/6] sdio: Add syntactic sugar to store a pointer in sdio_driver_id Uwe Kleine-König (The Capable Hub)
2026-04-17 13:10 ` [PATCH v1 4/6] wifi: rtw88: Benefit from sdio_device_id::driver_data_ptr Uwe Kleine-König (The Capable Hub)
@ 2026-04-17 13:10 ` Uwe Kleine-König (The Capable Hub)
2026-04-17 13:10 ` [PATCH v1 6/6] wifi: mwifiex: " Uwe Kleine-König (The Capable Hub)
3 siblings, 0 replies; 6+ messages in thread
From: Uwe Kleine-König (The Capable Hub) @ 2026-04-17 13:10 UTC (permalink / raw)
To: Felix Fietkau, Lorenzo Bianconi, Ryder Lee, Matthias Brugger,
AngeloGioacchino Del Regno
Cc: Christian A. Ehrhardt, Shayne Chen, Sean Wang, linux-wireless,
linux-kernel, linux-mediatek
Recently struct sdio_device_id gained a new member to store a pointer to
driver data. Make use of that to get rid of a bunch of casts.
The pointer is declared as const, which requires the addition of another
const for mt792x_get_mac80211_ops() to make the compiler happy which is
a nice side effect.
Signed-off-by: Uwe Kleine-König (The Capable Hub) <u.kleine-koenig@baylibre.com>
---
drivers/net/wireless/mediatek/mt76/mt7921/sdio.c | 4 ++--
drivers/net/wireless/mediatek/mt76/mt792x.h | 2 +-
drivers/net/wireless/mediatek/mt76/mt792x_core.c | 2 +-
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/sdio.c b/drivers/net/wireless/mediatek/mt76/mt7921/sdio.c
index 3421e53dc948..284529fe6282 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7921/sdio.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7921/sdio.c
@@ -18,7 +18,7 @@
static const struct sdio_device_id mt7921s_table[] = {
{ SDIO_DEVICE(SDIO_VENDOR_ID_MEDIATEK, 0x7901),
- .driver_data = (kernel_ulong_t)MT7921_FIRMWARE_WM },
+ .driver_data_ptr = MT7921_FIRMWARE_WM },
{ } /* Terminating entry */
};
@@ -129,7 +129,7 @@ static int mt7921s_probe(struct sdio_func *func,
int ret;
ops = mt792x_get_mac80211_ops(&func->dev, &mt7921_ops,
- (void *)id->driver_data, &features);
+ id->driver_data_ptr, &features);
if (!ops)
return -ENOMEM;
diff --git a/drivers/net/wireless/mediatek/mt76/mt792x.h b/drivers/net/wireless/mediatek/mt76/mt792x.h
index 8388638ed550..51c36ef4084e 100644
--- a/drivers/net/wireless/mediatek/mt76/mt792x.h
+++ b/drivers/net/wireless/mediatek/mt76/mt792x.h
@@ -436,7 +436,7 @@ int mt792x_init_wiphy(struct ieee80211_hw *hw);
struct ieee80211_ops *
mt792x_get_mac80211_ops(struct device *dev,
const struct ieee80211_ops *mac80211_ops,
- void *drv_data, u8 *fw_features);
+ const void *drv_data, u8 *fw_features);
int mt792x_init_wcid(struct mt792x_dev *dev);
int mt792x_mcu_drv_pmctrl(struct mt792x_dev *dev);
int mt792x_mcu_fw_pmctrl(struct mt792x_dev *dev);
diff --git a/drivers/net/wireless/mediatek/mt76/mt792x_core.c b/drivers/net/wireless/mediatek/mt76/mt792x_core.c
index f2ed16feb6c1..b92bae3f2151 100644
--- a/drivers/net/wireless/mediatek/mt76/mt792x_core.c
+++ b/drivers/net/wireless/mediatek/mt76/mt792x_core.c
@@ -763,7 +763,7 @@ mt792x_get_offload_capability(struct device *dev, const char *fw_wm)
struct ieee80211_ops *
mt792x_get_mac80211_ops(struct device *dev,
const struct ieee80211_ops *mac80211_ops,
- void *drv_data, u8 *fw_features)
+ const void *drv_data, u8 *fw_features)
{
struct ieee80211_ops *ops;
--
2.47.3
^ permalink raw reply related [flat|nested] 6+ messages in thread* [PATCH v1 6/6] wifi: mwifiex: Make use of driver data pointer in sdio_device_id
2026-04-17 13:10 [PATCH v1 0/6] sdio: About pointers in sdio_device_id::driver_data Uwe Kleine-König (The Capable Hub)
` (2 preceding siblings ...)
2026-04-17 13:10 ` [PATCH v1 5/6] wifi: mt76: mt7921-sdio: Make use of driver data pointer in sdio_device_id Uwe Kleine-König (The Capable Hub)
@ 2026-04-17 13:10 ` Uwe Kleine-König (The Capable Hub)
2026-04-17 23:40 ` Brian Norris
3 siblings, 1 reply; 6+ messages in thread
From: Uwe Kleine-König (The Capable Hub) @ 2026-04-17 13:10 UTC (permalink / raw)
To: Brian Norris
Cc: Christian A. Ehrhardt, Francesco Dolcini, linux-wireless,
linux-kernel
Recently struct sdio_device_id gained a new member to store a pointer to
driver data. Make use of that to get rid of a bunch of casts.
Signed-off-by: Uwe Kleine-König (The Capable Hub) <u.kleine-koenig@baylibre.com>
---
drivers/net/wireless/marvell/mwifiex/sdio.c | 24 ++++++++++-----------
1 file changed, 12 insertions(+), 12 deletions(-)
diff --git a/drivers/net/wireless/marvell/mwifiex/sdio.c b/drivers/net/wireless/marvell/mwifiex/sdio.c
index f039d6f19183..ea227f7685b8 100644
--- a/drivers/net/wireless/marvell/mwifiex/sdio.c
+++ b/drivers/net/wireless/marvell/mwifiex/sdio.c
@@ -566,8 +566,8 @@ mwifiex_sdio_probe(struct sdio_func *func, const struct sdio_device_id *id)
func->card->quirks |= MMC_QUIRK_BLKSZ_FOR_BYTE_MODE;
- if (id->driver_data) {
- struct mwifiex_sdio_device *data = (void *)id->driver_data;
+ if (id->driver_data_ptr) {
+ const struct mwifiex_sdio_device *data = id->driver_data_ptr;
card->firmware = data->firmware;
card->firmware_sdiouart = data->firmware_sdiouart;
@@ -955,25 +955,25 @@ static void mwifiex_sdio_coredump(struct device *dev)
/* WLAN IDs */
static const struct sdio_device_id mwifiex_ids[] = {
{SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8786_WLAN),
- .driver_data = (unsigned long) &mwifiex_sdio_sd8786},
+ .driver_data_ptr = &mwifiex_sdio_sd8786},
{SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8787_WLAN),
- .driver_data = (unsigned long) &mwifiex_sdio_sd8787},
+ .driver_data_ptr = &mwifiex_sdio_sd8787},
{SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8797_WLAN),
- .driver_data = (unsigned long) &mwifiex_sdio_sd8797},
+ .driver_data_ptr = &mwifiex_sdio_sd8797},
{SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8897_WLAN),
- .driver_data = (unsigned long) &mwifiex_sdio_sd8897},
+ .driver_data_ptr = &mwifiex_sdio_sd8897},
{SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8887_WLAN),
- .driver_data = (unsigned long)&mwifiex_sdio_sd8887},
+ .driver_data_ptr = &mwifiex_sdio_sd8887},
{SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8801_WLAN),
- .driver_data = (unsigned long)&mwifiex_sdio_sd8801},
+ .driver_data_ptr = &mwifiex_sdio_sd8801},
{SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8977_WLAN),
- .driver_data = (unsigned long)&mwifiex_sdio_sd8977},
+ .driver_data_ptr = &mwifiex_sdio_sd8977},
{SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8978_WLAN),
- .driver_data = (unsigned long)&mwifiex_sdio_sd8978},
+ .driver_data_ptr = &mwifiex_sdio_sd8978},
{SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8987_WLAN),
- .driver_data = (unsigned long)&mwifiex_sdio_sd8987},
+ .driver_data_ptr = &mwifiex_sdio_sd8987},
{SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8997_WLAN),
- .driver_data = (unsigned long)&mwifiex_sdio_sd8997},
+ .driver_data_ptr = &mwifiex_sdio_sd8997},
{},
};
--
2.47.3
^ permalink raw reply related [flat|nested] 6+ messages in thread* Re: [PATCH v1 6/6] wifi: mwifiex: Make use of driver data pointer in sdio_device_id
2026-04-17 13:10 ` [PATCH v1 6/6] wifi: mwifiex: " Uwe Kleine-König (The Capable Hub)
@ 2026-04-17 23:40 ` Brian Norris
0 siblings, 0 replies; 6+ messages in thread
From: Brian Norris @ 2026-04-17 23:40 UTC (permalink / raw)
To: Uwe Kleine-König (The Capable Hub)
Cc: Christian A. Ehrhardt, Francesco Dolcini, linux-wireless,
linux-kernel
On Fri, Apr 17, 2026 at 03:10:52PM +0200, Uwe Kleine-König (The Capable Hub) wrote:
> Recently struct sdio_device_id gained a new member to store a pointer to
> driver data. Make use of that to get rid of a bunch of casts.
>
> Signed-off-by: Uwe Kleine-König (The Capable Hub) <u.kleine-koenig@baylibre.com>
> ---
> drivers/net/wireless/marvell/mwifiex/sdio.c | 24 ++++++++++-----------
> 1 file changed, 12 insertions(+), 12 deletions(-)
Acked-by: Brian Norris <briannorris@chromium.org>
^ permalink raw reply [flat|nested] 6+ messages in thread