git: 481314f620ac - main - rtwn: allow non-zero interface indexes

From: Adrian Chadd <adrian_at_FreeBSD.org>
Date: Sun, 23 Aug 2026 16:49:02 UTC
The branch main has been updated by adrian:

URL: https://cgit.FreeBSD.org/src/commit/?id=481314f620ac01a5a92c322e8ab4f310035872f9

commit 481314f620ac01a5a92c322e8ab4f310035872f9
Author:     Ahmad Khalifa <vexeduxr@FreeBSD.org>
AuthorDate: 2026-08-23 16:46:58 +0000
Commit:     Adrian Chadd <adrian@FreeBSD.org>
CommitDate: 2026-08-23 16:46:58 +0000

    rtwn: allow non-zero interface indexes
    
    The endpoints we want won't always be on interface 0. Instead, allow the
    interface index to be specified in driver_info when probing.
    
    Reviewed by:    adrian
    Differential Revision:  https://reviews.freebsd.org/D59107
---
 sys/dev/rtwn/usb/rtwn_usb_attach.c | 14 +++++++++-----
 sys/dev/rtwn/usb/rtwn_usb_attach.h | 15 ++++++++++-----
 sys/dev/rtwn/usb/rtwn_usb_ep.c     |  3 +--
 sys/dev/rtwn/usb/rtwn_usb_ep.h     |  3 ++-
 sys/dev/rtwn/usb/rtwn_usb_var.h    |  6 ++++--
 5 files changed, 26 insertions(+), 15 deletions(-)

diff --git a/sys/dev/rtwn/usb/rtwn_usb_attach.c b/sys/dev/rtwn/usb/rtwn_usb_attach.c
index 4958939a768a..105c2c36acfd 100644
--- a/sys/dev/rtwn/usb/rtwn_usb_attach.c
+++ b/sys/dev/rtwn/usb/rtwn_usb_attach.c
@@ -89,15 +89,19 @@ static int
 rtwn_usb_match(device_t self)
 {
 	struct usb_attach_arg *uaa = device_get_ivars(self);
+	int error;
 
 	if (uaa->usb_mode != USB_MODE_HOST)
 		return (ENXIO);
 	if (uaa->info.bConfigIndex != RTWN_CONFIG_INDEX)
 		return (ENXIO);
-	if (uaa->info.bIfaceIndex != RTWN_IFACE_INDEX)
-		return (ENXIO);
 
-	return (usbd_lookup_id_by_uaa(rtwn_devs, sizeof(rtwn_devs), uaa));
+	error = usbd_lookup_id_by_uaa(rtwn_devs, sizeof(rtwn_devs), uaa);
+	if (error != 0)
+		return (error);
+
+	return (uaa->info.bIfaceIndex !=
+	    RTWN_USB_DEVINFO_GET_IFACE(uaa) ? ENXIO : 0);
 }
 
 static int
@@ -399,9 +403,9 @@ rtwn_usb_attach(device_t self)
 	mtx_init(&sc->sc_mtx, ic->ic_name, MTX_NETWORK_LOCK, MTX_DEF);
 
 	rtwn_usb_attach_methods(sc);
-	rtwn_usb_attach_private(uc, USB_GET_DRIVER_INFO(uaa));
+	rtwn_usb_attach_private(uc, RTWN_USB_DEVINFO_GET_CHIP(uaa));
 
-	error = rtwn_usb_setup_endpoints(uc);
+	error = rtwn_usb_setup_endpoints(uc, RTWN_USB_DEVINFO_GET_IFACE(uaa));
 	if (error != 0)
 		goto detach;
 
diff --git a/sys/dev/rtwn/usb/rtwn_usb_attach.h b/sys/dev/rtwn/usb/rtwn_usb_attach.h
index ca12480c8f19..a9534dd046fe 100644
--- a/sys/dev/rtwn/usb/rtwn_usb_attach.h
+++ b/sys/dev/rtwn/usb/rtwn_usb_attach.h
@@ -37,7 +37,8 @@ enum {
 static const STRUCT_USB_HOST_ID rtwn_devs[] = {
 	/* RTL8188CE-VAU/RTL8188CUS/RTL8188RU/RTL8192CU */
 #define RTWN_RTL8192CU_DEV(v,p) \
-	{ USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, RTWN_CHIP_RTL8192CU) }
+	{ USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, \
+	  RTWN_USB_DEVINFO(RTWN_CHIP_RTL8192CU, 0)) }
 	RTWN_RTL8192CU_DEV(ABOCOM,		RTL8188CU_1),
 	RTWN_RTL8192CU_DEV(ABOCOM,		RTL8188CU_2),
 	RTWN_RTL8192CU_DEV(ABOCOM,		RTL8192CU),
@@ -104,7 +105,8 @@ static const STRUCT_USB_HOST_ID rtwn_devs[] = {
 
 	/* RTL8192EU */
 #define RTWN_RTL8192EU_DEV(v,p) \
-	{ USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, RTWN_CHIP_RTL8192EU) }
+	{ USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, \
+	  RTWN_USB_DEVINFO(RTWN_CHIP_RTL8192EU, 0)) }
 	RTWN_RTL8192EU_DEV(DLINK,		DWA131E1),
 	RTWN_RTL8192EU_DEV(REALTEK,		RTL8192EU),
 	RTWN_RTL8192EU_DEV(TPLINK,		WN821NV5),
@@ -114,7 +116,8 @@ static const STRUCT_USB_HOST_ID rtwn_devs[] = {
 
 	/* RTL8188EU */
 #define RTWN_RTL8188EU_DEV(v,p) \
-	{ USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, RTWN_CHIP_RTL8188EU) }
+	{ USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, \
+	  RTWN_USB_DEVINFO(RTWN_CHIP_RTL8188EU, 0)) }
 	RTWN_RTL8188EU_DEV(ABOCOM,		RTL8188EU),
 	RTWN_RTL8188EU_DEV(ASUS,		USBN10NANOB1),
 	RTWN_RTL8188EU_DEV(DLINK,		DWA121B1),
@@ -131,7 +134,8 @@ static const STRUCT_USB_HOST_ID rtwn_devs[] = {
 
 	/* RTL8812AU */
 #define RTWN_RTL8812AU_DEV(v,p) \
-	{ USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, RTWN_CHIP_RTL8812AU) }
+	{ USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, \
+	  RTWN_USB_DEVINFO(RTWN_CHIP_RTL8812AU, 0)) }
 	RTWN_RTL8812AU_DEV(ASUS,		USBAC56),
 	RTWN_RTL8812AU_DEV(CISCOLINKSYS,	WUSB6300),
 	RTWN_RTL8812AU_DEV(DLINK,		DWA182C1),
@@ -156,7 +160,8 @@ static const STRUCT_USB_HOST_ID rtwn_devs[] = {
 
 	/* RTL8821AU */
 #define RTWN_RTL8821AU_DEV(v,p) \
-	{ USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, RTWN_CHIP_RTL8821AU) }
+	{ USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, \
+	  RTWN_USB_DEVINFO(RTWN_CHIP_RTL8821AU, 0)) }
 	RTWN_RTL8821AU_DEV(DLINK,		DWA171A1),
 	RTWN_RTL8821AU_DEV(DLINK,		DWA172A1),
 	RTWN_RTL8821AU_DEV(EDIMAX,		EW7811UTC_1),
diff --git a/sys/dev/rtwn/usb/rtwn_usb_ep.c b/sys/dev/rtwn/usb/rtwn_usb_ep.c
index f9b0672324fe..44124d487951 100644
--- a/sys/dev/rtwn/usb/rtwn_usb_ep.c
+++ b/sys/dev/rtwn/usb/rtwn_usb_ep.c
@@ -156,11 +156,10 @@ rtwn_usb_setup_queues(struct rtwn_usb_softc *uc)
 }
 
 int
-rtwn_usb_setup_endpoints(struct rtwn_usb_softc *uc)
+rtwn_usb_setup_endpoints(struct rtwn_usb_softc *uc, const uint8_t iface_index)
 {
 	struct usb_config *rtwn_config;
 	struct rtwn_softc *sc = &uc->uc_sc;
-	const uint8_t iface_index = RTWN_IFACE_INDEX;
 	struct usb_endpoint *ep, *ep_end;
 	uint8_t addr[RTWN_MAX_EPOUT];
 	int error;
diff --git a/sys/dev/rtwn/usb/rtwn_usb_ep.h b/sys/dev/rtwn/usb/rtwn_usb_ep.h
index f0b726a818b3..9dbec2c1f305 100644
--- a/sys/dev/rtwn/usb/rtwn_usb_ep.h
+++ b/sys/dev/rtwn/usb/rtwn_usb_ep.h
@@ -17,7 +17,8 @@
 #ifndef IF_RTWN_EP_H
 #define IF_RTWN_EP_H
 
-int		rtwn_usb_setup_endpoints(struct rtwn_usb_softc *);
+int		rtwn_usb_setup_endpoints(struct rtwn_usb_softc *,
+		    const uint8_t iface_index);
 uint16_t	rtwn_usb_get_qmap(struct rtwn_softc *);
 
 #endif	/* IF_RTWN_EP_H */
diff --git a/sys/dev/rtwn/usb/rtwn_usb_var.h b/sys/dev/rtwn/usb/rtwn_usb_var.h
index 27cd2b4e2762..12e416b8c3c1 100644
--- a/sys/dev/rtwn/usb/rtwn_usb_var.h
+++ b/sys/dev/rtwn/usb/rtwn_usb_var.h
@@ -28,8 +28,6 @@
 #define RTWN_USB_RXBUFSZ_MAX		(64)
 #define RTWN_USB_TXBUFSZ		(16 * 1024)
 
-#define RTWN_IFACE_INDEX		0
-
 #define RTWN_USB_RX_LIST_COUNT		16
 #define RTWN_USB_TX_LIST_COUNT		16
 
@@ -85,6 +83,10 @@ struct rtwn_usb_softc {
 };
 #define RTWN_USB_SOFTC(sc)	((struct rtwn_usb_softc *)(sc))
 
+#define RTWN_USB_DEVINFO(c, i)		((c) | ((i) << 16))
+#define RTWN_USB_DEVINFO_GET_CHIP(did)	((USB_GET_DRIVER_INFO(did)) & 0xffff)
+#define RTWN_USB_DEVINFO_GET_IFACE(did)	((USB_GET_DRIVER_INFO(did)) >> 16)
+
 #define rtwn_usb_align_rx(_uc, _totlen, _len) \
 	(((_uc)->uc_align_rx)((_totlen), (_len)))