* [PATCH v1 0/6] sdio: About pointers in sdio_device_id::driver_data
@ 2026-04-17 13:10 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)
` (5 more replies)
0 siblings, 6 replies; 13+ 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
<linux/mod_devicetable.h> contains several device_id structs for various
device types.
Most of them have one of:
- kernel_ulong_t driver_data (sometimes called "driver_info")
- unsigned long driver_data
- const void *data (sometimes called "driver_data" or "context", sometimes not const)
Taking sdio_device_id as an arbitrary[1] example (which has
kernel_ulong_t driver_data), there are drivers that store integer values
in it (e.g. drivers/media/mmc/siano/smssdio.c) and others use pointers
(e.g. drivers/net/wireless/realtek/rtw88/rtw8723ds.c). The latter
involves explicit casting, both for initialisation and for usage.
In the past I tried to address this using i2c as discussion case[2].
Back then the motivation was just to get rid of the ugly casts. Today
I'm working on CHERI which is an architecture extension (currently for
arm and riscv) that uses 128 bit pointers to store additional
information, implementing e.g. read-only pointers and preventing out of
bounds access on the hardware level.
The complication here is that a kernel_ulong_t (which is still 64 bit with
CHERI) cannot store a pointer.
The obvious way to fix that is to replace the kernel_ulong_t by an anonymous
union that contains the original unsigned long and a pointer. This doesn't
change the size (or layout) of the device id struct for archs where
sizeof(long) >= sizeof(void *) [3] and gets rid of the casting. On CHERI archs
this is an ABI change, but as a new architecture changing ABI isn't an
issue there.
I was surprised that changing struct sdio_device_id didn't require
preparation in the various drivers as they all already use named
initializers.
So the first patch expands struct sdio_device_id and the 5 following
patches implement cleanups that can be done then.
Patches 2 to 6 all depend on the first patch (only). This is not urgent
and thus merge window material. I guess merging of this series has to
happen in 3 steps:
1) patch #1 via mmc
2) patches #2 and #3 via bluetooth
3) patches #4 - #6 via wireless
(where 2) and 3) are independent).
The series was build tested on arm64.
[1] well, one that isn't used as much as spi_device_id or i2c_device_id to have get a manageable POC.
[2] https://lore.kernel.org/lkml/20240426213832.915485-2-u.kleine-koenig@pengutronix.de
[3] As of now this is true on all architectures running Linux even with s/>=/==/
Uwe Kleine-König (The Capable Hub) (6):
sdio: Add syntactic sugar to store a pointer in sdio_driver_id
Bluetooth: btmrvl_sdio: Make use of driver data pointer in
sdio_device_id
Bluetooth: btmtksdio: Make use of driver data pointer in
sdio_device_id
wifi: rtw88: Benefit from sdio_device_id::driver_data_ptr
wifi: mt76: mt7921-sdio: Make use of driver data pointer in
sdio_device_id
wifi: mwifiex: Make use of driver data pointer in sdio_device_id
drivers/bluetooth/btmrvl_sdio.c | 22 ++++++++---------
drivers/bluetooth/btmtksdio.c | 8 +++----
drivers/net/wireless/marvell/mwifiex/sdio.c | 24 +++++++++----------
.../net/wireless/mediatek/mt76/mt7921/sdio.c | 4 ++--
drivers/net/wireless/mediatek/mt76/mt792x.h | 2 +-
.../net/wireless/mediatek/mt76/mt792x_core.c | 2 +-
.../net/wireless/realtek/rtw88/rtw8723cs.c | 2 +-
.../net/wireless/realtek/rtw88/rtw8723ds.c | 4 ++--
.../net/wireless/realtek/rtw88/rtw8821cs.c | 2 +-
.../net/wireless/realtek/rtw88/rtw8822bs.c | 2 +-
.../net/wireless/realtek/rtw88/rtw8822cs.c | 2 +-
drivers/net/wireless/realtek/rtw88/sdio.c | 2 +-
include/linux/mod_devicetable.h | 5 +++-
13 files changed, 42 insertions(+), 39 deletions(-)
base-commit: 028ef9c96e96197026887c0f092424679298aae8
--
2.47.3
^ permalink raw reply [flat|nested] 13+ messages in thread
* [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-20 20:31 ` Uwe Kleine-König (The Capable Hub)
2026-04-17 13:10 ` [PATCH v1 2/6] Bluetooth: btmrvl_sdio: Make use of driver data pointer in sdio_device_id Uwe Kleine-König (The Capable Hub)
` (4 subsequent siblings)
5 siblings, 1 reply; 13+ 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] 13+ messages in thread
* [PATCH v1 2/6] Bluetooth: btmrvl_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 ` Uwe Kleine-König (The Capable Hub)
2026-04-17 13:10 ` [PATCH v1 3/6] Bluetooth: btmtksdio: " Uwe Kleine-König (The Capable Hub)
` (3 subsequent siblings)
5 siblings, 0 replies; 13+ messages in thread
From: Uwe Kleine-König (The Capable Hub) @ 2026-04-17 13:10 UTC (permalink / raw)
To: Marcel Holtmann, Luiz Augusto von Dentz
Cc: Christian A. Ehrhardt, linux-bluetooth, 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/bluetooth/btmrvl_sdio.c | 22 +++++++++++-----------
1 file changed, 11 insertions(+), 11 deletions(-)
diff --git a/drivers/bluetooth/btmrvl_sdio.c b/drivers/bluetooth/btmrvl_sdio.c
index 93932a0d8625..ad28bee56961 100644
--- a/drivers/bluetooth/btmrvl_sdio.c
+++ b/drivers/bluetooth/btmrvl_sdio.c
@@ -301,31 +301,31 @@ static const struct btmrvl_sdio_device btmrvl_sdio_sd8997 = {
static const struct sdio_device_id btmrvl_sdio_ids[] = {
/* Marvell SD8688 Bluetooth device */
{ SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8688_BT),
- .driver_data = (unsigned long)&btmrvl_sdio_sd8688 },
+ .driver_data_ptr = &btmrvl_sdio_sd8688 },
/* Marvell SD8787 Bluetooth device */
{ SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8787_BT),
- .driver_data = (unsigned long)&btmrvl_sdio_sd8787 },
+ .driver_data_ptr = &btmrvl_sdio_sd8787 },
/* Marvell SD8787 Bluetooth AMP device */
{ SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8787_BT_AMP),
- .driver_data = (unsigned long)&btmrvl_sdio_sd8787 },
+ .driver_data_ptr = &btmrvl_sdio_sd8787 },
/* Marvell SD8797 Bluetooth device */
{ SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8797_BT),
- .driver_data = (unsigned long)&btmrvl_sdio_sd8797 },
+ .driver_data_ptr = &btmrvl_sdio_sd8797 },
/* Marvell SD8887 Bluetooth device */
{ SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8887_BT),
- .driver_data = (unsigned long)&btmrvl_sdio_sd8887 },
+ .driver_data_ptr = &btmrvl_sdio_sd8887 },
/* Marvell SD8897 Bluetooth device */
{ SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8897_BT),
- .driver_data = (unsigned long)&btmrvl_sdio_sd8897 },
+ .driver_data_ptr = &btmrvl_sdio_sd8897 },
/* Marvell SD8977 Bluetooth device */
{ SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8977_BT),
- .driver_data = (unsigned long)&btmrvl_sdio_sd8977 },
+ .driver_data_ptr = &btmrvl_sdio_sd8977 },
/* Marvell SD8987 Bluetooth device */
{ SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8987_BT),
- .driver_data = (unsigned long)&btmrvl_sdio_sd8987 },
+ .driver_data_ptr = &btmrvl_sdio_sd8987 },
/* Marvell SD8997 Bluetooth device */
{ SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8997_BT),
- .driver_data = (unsigned long)&btmrvl_sdio_sd8997 },
+ .driver_data_ptr = &btmrvl_sdio_sd8997 },
{ } /* Terminating entry */
};
@@ -1523,8 +1523,8 @@ static int btmrvl_sdio_probe(struct sdio_func *func,
card->func = func;
- if (id->driver_data) {
- struct btmrvl_sdio_device *data = (void *) id->driver_data;
+ if (id->driver_data_ptr) {
+ const struct btmrvl_sdio_device *data = id->driver_data_ptr;
card->helper = data->helper;
card->firmware = data->firmware;
card->reg = data->reg;
--
2.47.3
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v1 3/6] Bluetooth: btmtksdio: 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 2/6] Bluetooth: btmrvl_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 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)
5 siblings, 0 replies; 13+ messages in thread
From: Uwe Kleine-König (The Capable Hub) @ 2026-04-17 13:10 UTC (permalink / raw)
To: Marcel Holtmann, Luiz Augusto von Dentz, Matthias Brugger,
AngeloGioacchino Del Regno
Cc: Christian A. Ehrhardt, linux-bluetooth, 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.
Signed-off-by: Uwe Kleine-König (The Capable Hub) <u.kleine-koenig@baylibre.com>
---
drivers/bluetooth/btmtksdio.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/drivers/bluetooth/btmtksdio.c b/drivers/bluetooth/btmtksdio.c
index e986e5af51ae..ee886dcada63 100644
--- a/drivers/bluetooth/btmtksdio.c
+++ b/drivers/bluetooth/btmtksdio.c
@@ -64,11 +64,11 @@ static const struct btmtksdio_data mt7921_data = {
static const struct sdio_device_id btmtksdio_table[] = {
{SDIO_DEVICE(SDIO_VENDOR_ID_MEDIATEK, SDIO_DEVICE_ID_MEDIATEK_MT7663),
- .driver_data = (kernel_ulong_t)&mt7663_data },
+ .driver_data_ptr = &mt7663_data },
{SDIO_DEVICE(SDIO_VENDOR_ID_MEDIATEK, SDIO_DEVICE_ID_MEDIATEK_MT7668),
- .driver_data = (kernel_ulong_t)&mt7668_data },
+ .driver_data_ptr = &mt7668_data },
{SDIO_DEVICE(SDIO_VENDOR_ID_MEDIATEK, SDIO_DEVICE_ID_MEDIATEK_MT7961),
- .driver_data = (kernel_ulong_t)&mt7921_data },
+ .driver_data_ptr = &mt7921_data },
{ } /* Terminating entry */
};
MODULE_DEVICE_TABLE(sdio, btmtksdio_table);
@@ -1352,7 +1352,7 @@ static int btmtksdio_probe(struct sdio_func *func,
if (!bdev)
return -ENOMEM;
- bdev->data = (void *)id->driver_data;
+ bdev->data = id->driver_data_ptr;
if (!bdev->data)
return -ENODEV;
--
2.47.3
^ permalink raw reply related [flat|nested] 13+ 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)
` (2 preceding siblings ...)
2026-04-17 13:10 ` [PATCH v1 3/6] Bluetooth: btmtksdio: " Uwe Kleine-König (The Capable Hub)
@ 2026-04-17 13:10 ` Uwe Kleine-König (The Capable Hub)
2026-04-20 1:29 ` Ping-Ke Shih
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)
5 siblings, 1 reply; 13+ 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] 13+ 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)
` (3 preceding siblings ...)
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)
5 siblings, 0 replies; 13+ 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] 13+ 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)
` (4 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
5 siblings, 1 reply; 13+ 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] 13+ 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; 13+ 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] 13+ messages in thread
* RE: [PATCH v1 4/6] wifi: rtw88: Benefit from sdio_device_id::driver_data_ptr
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-20 1:29 ` Ping-Ke Shih
0 siblings, 0 replies; 13+ messages in thread
From: Ping-Ke Shih @ 2026-04-20 1:29 UTC (permalink / raw)
To: Uwe Kleine-König (The Capable Hub)
Cc: Christian A. Ehrhardt, linux-wireless@vger.kernel.org,
linux-kernel@vger.kernel.org
Uwe Kleine-König (The Capable Hub) <u.kleine-koenig@baylibre.com> 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>
Acked-by: Ping-Ke Shih <pkshih@realtek.com>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v1 1/6] sdio: Add syntactic sugar to store a pointer in sdio_driver_id
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-20 20:31 ` Uwe Kleine-König (The Capable Hub)
2026-04-20 20:46 ` Luiz Augusto von Dentz
0 siblings, 1 reply; 13+ messages in thread
From: Uwe Kleine-König (The Capable Hub) @ 2026-04-20 20:31 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
[-- Attachment #1: Type: text/plain, Size: 1155 bytes --]
Hello,
On Fri, Apr 17, 2026 at 03:10:47PM +0200, Uwe Kleine-König (The Capable Hub) wrote:
> 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.
sashiko.dev found s/sdio_driver_id/sdio_device_id/ twice in the commit
log and once in the short log. If you consider applying this patch
please adapt the commit message accordingly.
Many thanks to those who created sashiko.dev!
Best regards
Uwe
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v1 1/6] sdio: Add syntactic sugar to store a pointer in sdio_driver_id
2026-04-20 20:31 ` Uwe Kleine-König (The Capable Hub)
@ 2026-04-20 20:46 ` Luiz Augusto von Dentz
2026-04-21 8:12 ` Uwe Kleine-König (The Capable Hub)
0 siblings, 1 reply; 13+ messages in thread
From: Luiz Augusto von Dentz @ 2026-04-20 20:46 UTC (permalink / raw)
To: Uwe Kleine-König (The Capable Hub)
Cc: Ulf Hansson, Christian A. Ehrhardt, linux-mmc, Greg Kroah-Hartman,
Wolfram Sang, linux-kernel, Marcel Holtmann, 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
Hi Uwe,
On Mon, Apr 20, 2026 at 4:31 PM Uwe Kleine-König (The Capable Hub)
<u.kleine-koenig@baylibre.com> wrote:
>
> Hello,
>
> On Fri, Apr 17, 2026 at 03:10:47PM +0200, Uwe Kleine-König (The Capable Hub) wrote:
> > 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.
>
> sashiko.dev found s/sdio_driver_id/sdio_device_id/ twice in the commit
> log and once in the short log. If you consider applying this patch
> please adapt the commit message accordingly.
No problem I can fix them up once applying.
> Many thanks to those who created sashiko.dev!
>
> Best regards
> Uwe
We only received 1-3 of the 6:
https://patchwork.kernel.org/project/bluetooth/list/?series=1082520
Or is this on purpose, and we should consider the set complete?
--
Luiz Augusto von Dentz
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v1 1/6] sdio: Add syntactic sugar to store a pointer in sdio_driver_id
2026-04-20 20:46 ` Luiz Augusto von Dentz
@ 2026-04-21 8:12 ` Uwe Kleine-König (The Capable Hub)
2026-04-21 8:59 ` Johannes Berg
0 siblings, 1 reply; 13+ messages in thread
From: Uwe Kleine-König (The Capable Hub) @ 2026-04-21 8:12 UTC (permalink / raw)
To: Luiz Augusto von Dentz
Cc: Ulf Hansson, Christian A. Ehrhardt, linux-mmc, Greg Kroah-Hartman,
Wolfram Sang, linux-kernel, Marcel Holtmann, 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
[-- Attachment #1: Type: text/plain, Size: 2552 bytes --]
Hello Luiz,
On Mon, Apr 20, 2026 at 04:46:56PM -0400, Luiz Augusto von Dentz wrote:
> On Mon, Apr 20, 2026 at 4:31 PM Uwe Kleine-König (The Capable Hub)
> <u.kleine-koenig@baylibre.com> wrote:
> > On Fri, Apr 17, 2026 at 03:10:47PM +0200, Uwe Kleine-König (The Capable Hub) wrote:
> > > 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.
To be honest, with the involved void* this isn't really type-safe
either, but at least the data keeps being a pointer which is really
helpful on CHERI. FTR: The alternative would be to use uintptr_t instead
of unsigned long, which also has proponents in the CHERI community and
which is used in the current vendor patch stack.
> > > 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.
> >
> > sashiko.dev found s/sdio_driver_id/sdio_device_id/ twice in the commit
> > log and once in the short log. If you consider applying this patch
> > please adapt the commit message accordingly.
>
> No problem I can fix them up once applying.
Thanks! If a new revision should be needed, of course I'll fix that,
too.
> > Many thanks to those who created sashiko.dev!
> >
> > Best regards
> > Uwe
>
> We only received 1-3 of the 6:
>
> https://patchwork.kernel.org/project/bluetooth/list/?series=1082520
>
> Or is this on purpose, and we should consider the set complete?
The remaining patches are for wifi. My expectation was that they go in
via wifi+netdev once the first patch is in their base. But of course I'm
open for maintainer coordination to let the series go in in less steps
than I expected. If that helps I can also create an immutable branch,
but I have no urge here, so if only the first patch goes in during the
next merge window, I won't have problems to keep track of the remaining
bits.
Best regards
Uwe
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v1 1/6] sdio: Add syntactic sugar to store a pointer in sdio_driver_id
2026-04-21 8:12 ` Uwe Kleine-König (The Capable Hub)
@ 2026-04-21 8:59 ` Johannes Berg
0 siblings, 0 replies; 13+ messages in thread
From: Johannes Berg @ 2026-04-21 8:59 UTC (permalink / raw)
To: Uwe Kleine-König (The Capable Hub), Luiz Augusto von Dentz
Cc: Ulf Hansson, Christian A. Ehrhardt, linux-mmc, Greg Kroah-Hartman,
Wolfram Sang, linux-kernel, Marcel Holtmann, 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 Tue, 2026-04-21 at 10:12 +0200, Uwe Kleine-König (The Capable Hub)
wrote:
> >
> > We only received 1-3 of the 6:
> >
> > https://patchwork.kernel.org/project/bluetooth/list/?series=1082520
> >
> > Or is this on purpose, and we should consider the set complete?
>
> The remaining patches are for wifi. My expectation was that they go in
> via wifi+netdev once the first patch is in their base. But of course I'm
> open for maintainer coordination to let the series go in in less steps
> than I expected. If that helps I can also create an immutable branch,
> but I have no urge here, so if only the first patch goes in during the
> next merge window, I won't have problems to keep track of the remaining
> bits.
It's probably better for everything all around, including the various
automations that test patch series, if you just flip a coin, send these
to either BT or WiFi, and then resend the others later :)
All assuming we get an ACK from whoever is responsible for patch 1 to
merge it through some other tree :)
johannes
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2026-04-21 8:59 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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-20 20:31 ` Uwe Kleine-König (The Capable Hub)
2026-04-20 20:46 ` Luiz Augusto von Dentz
2026-04-21 8:12 ` Uwe Kleine-König (The Capable Hub)
2026-04-21 8:59 ` Johannes Berg
2026-04-17 13:10 ` [PATCH v1 2/6] Bluetooth: btmrvl_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 3/6] Bluetooth: btmtksdio: " 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-20 1:29 ` Ping-Ke Shih
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)
2026-04-17 23:40 ` Brian Norris
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox