The branch main has been updated by adrian: URL: https://cgit.FreeBSD.org/src/commit/?id=481314f620ac01a5a92c322e8ab4f310035872f9
commit 481314f620ac01a5a92c322e8ab4f310035872f9 Author: Ahmad Khalifa <[email protected]> AuthorDate: 2026-08-23 16:46:58 +0000 Commit: Adrian Chadd <[email protected]> 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)))
