Am Sun, Mar 28, 2021 at 10:53:53AM +0100 schrieb Stuart Henderson: > On 2021/03/25 00:14, Stuart Henderson wrote: > > On 2021/03/25 00:30, Patrick Wildt wrote: > > > Without having looked at anything, it might be worth looking at the most > > > recent mail in this thread: > > > > > > 'Re: [PATCH] umb(4) fix for X20 (DW5821e) in Dell Latitude 7300' > > > > > > > oh, usb runs through all drivers looking for a VID/PID match before > > then running through all looking for a class match? I didn't realise > > (thought it would try driver-by-driver with first VID/PID then class) > > but that does make sense. > > > > Updated diff below adding my pid/vid and tweaking some comments. My card > > attaches to umb with this. I've only added it commented-out to the manual > > for now until I see it actually pass traffic. > > > > So this fixes Bryan's, at least improves mine (will look for another > > sim / sim-adapter tomorrow), and seems targetted enough to not risk > > fallout with existing working devices. > > > > I think this makes sense to commit. OK with me if you'd like to commit > > it Gerhard (I think it was your diff originally). > > So this isn't enough for the Huawei yet but it doesn't make things > any worse, and helps for DW5821e. > > If Gerhard isn't around, can I commit this bit so I'm not wrangling > things which should be separate commits? OK?
Yes, please do. ok patrick@ > > I added this product to usbdevs as a short string; the other Huawei > > devices all say "HUAWEI Mobile xyz" rather than just "xyz" in the device > > string which I think should be trimmed as well, probably worth doing > > that on top. > > > > > > Index: share/man/man4/umb.4 > > =================================================================== > > RCS file: /cvs/src/share/man/man4/umb.4,v > > retrieving revision 1.11 > > diff -u -p -r1.11 umb.4 > > --- share/man/man4/umb.4 12 May 2020 13:03:52 -0000 1.11 > > +++ share/man/man4/umb.4 25 Mar 2021 00:03:58 -0000 > > @@ -44,8 +44,10 @@ PIN again even if the system was reboote > > The following devices should work: > > .Pp > > .Bl -tag -width Ds -offset indent -compact > > +.It Dell DW5821e > > .It Ericsson H5321gw and N5321gw > > .It Fibocom L831-EAU > > +.\" .It Huawei ME906s -- attaches but may need more work > > .It Medion Mobile S4222 (MediaTek OEM) > > .It Sierra Wireless EM7345 > > .It Sierra Wireless EM7455 > > Index: sys/dev/usb/if_umb.c > > =================================================================== > > RCS file: /cvs/src/sys/dev/usb/if_umb.c,v > > retrieving revision 1.37 > > diff -u -p -r1.37 if_umb.c > > --- sys/dev/usb/if_umb.c 29 Jan 2021 17:06:19 -0000 1.37 > > +++ sys/dev/usb/if_umb.c 24 Mar 2021 23:52:13 -0000 > > @@ -225,6 +225,28 @@ const struct cfattach umb_ca = { > > int umb_delay = 4000; > > > > /* > > + * Normally, MBIM devices are detected by their interface class and > > subclass. > > + * But for some models that have multiple configurations, it is better to > > + * match by vendor and product id so that we can select the desired > > + * configuration ourselves, e.g. to override a class-based match to another > > + * driver. > > + * > > + * OTOH, some devices identify themselves as an MBIM device but fail to > > speak > > + * the MBIM protocol. > > + */ > > +struct umb_products { > > + struct usb_devno dev; > > + int confno; > > +}; > > +const struct umb_products umb_devs[] = { > > + { { USB_VENDOR_DELL, USB_PRODUCT_DELL_DW5821E }, 2 }, > > + { { USB_VENDOR_HUAWEI, USB_PRODUCT_HUAWEI_ME906S }, 3 }, > > +}; > > + > > +#define umb_lookup(vid, pid) \ > > + ((const struct umb_products *)usb_lookup(umb_devs, vid, pid)) > > + > > +/* > > * These devices require an "FCC Authentication" command. > > */ > > const struct usb_devno umb_fccauth_devs[] = { > > @@ -263,6 +285,8 @@ umb_match(struct device *parent, void *m > > struct usb_attach_arg *uaa = aux; > > usb_interface_descriptor_t *id; > > > > + if (umb_lookup(uaa->vendor, uaa->product) != NULL) > > + return UMATCH_VENDOR_PRODUCT; > > if (!uaa->iface) > > return UMATCH_NONE; > > if ((id = usbd_get_interface_descriptor(uaa->iface)) == NULL) > > @@ -315,6 +339,43 @@ umb_attach(struct device *parent, struct > > sc->sc_ctrl_ifaceno = uaa->ifaceno; > > ml_init(&sc->sc_tx_ml); > > > > + if (uaa->configno < 0) { > > + /* > > + * In case the device was matched by VID/PID instead of > > + * InterfaceClass/InterfaceSubClass, we have to pick the > > + * correct configuration ourself. > > + */ > > + uaa->configno = umb_lookup(uaa->vendor, uaa->product)->confno; > > + DPRINTF("%s: switching to config #%d\n", DEVNAM(sc), > > + uaa->configno); > > + status = usbd_set_config_no(sc->sc_udev, uaa->configno, 1); > > + if (status) { > > + printf("%s: failed to switch to config #%d: %s\n", > > + DEVNAM(sc), uaa->configno, usbd_errstr(status)); > > + goto fail; > > + } > > + usbd_delay_ms(sc->sc_udev, 200); > > + > > + /* > > + * Need to do some manual setups that usbd_probe_and_attach() > > + * would do for us otherwise. > > + */ > > + uaa->nifaces = uaa->device->cdesc->bNumInterfaces; > > + for (i = 0; i < uaa->nifaces; i++) { > > + if (usbd_iface_claimed(sc->sc_udev, i)) > > + continue; > > + id = > > usbd_get_interface_descriptor(&uaa->device->ifaces[i]); > > + if (id != NULL && id->bInterfaceClass == UICLASS_CDC && > > + id->bInterfaceSubClass == > > + UISUBCLASS_MOBILE_BROADBAND_INTERFACE_MODEL) { > > + uaa->iface = &uaa->device->ifaces[i]; > > + uaa->ifaceno = > > uaa->iface->idesc->bInterfaceNumber; > > + sc->sc_ctrl_ifaceno = uaa->ifaceno; > > + break; > > + } > > + } > > + } > > + > > /* > > * Some MBIM hardware does not provide the mandatory CDC Union > > * Descriptor, so we also look at matching Interface > > @@ -382,9 +443,9 @@ umb_attach(struct device *parent, struct > > for (i = 0; i < uaa->nifaces; i++) { > > if (usbd_iface_claimed(sc->sc_udev, i)) > > continue; > > - id = usbd_get_interface_descriptor(uaa->ifaces[i]); > > + id = usbd_get_interface_descriptor(&sc->sc_udev->ifaces[i]); > > if (id != NULL && id->bInterfaceNumber == data_ifaceno) { > > - sc->sc_data_iface = uaa->ifaces[i]; > > + sc->sc_data_iface = &sc->sc_udev->ifaces[i]; > > usbd_claim_iface(sc->sc_udev, i); > > } > > } > > Index: sys/dev/usb/usbdevs > > =================================================================== > > RCS file: /cvs/src/sys/dev/usb/usbdevs,v > > retrieving revision 1.734 > > diff -u -p -r1.734 usbdevs > > --- sys/dev/usb/usbdevs 24 Mar 2021 18:49:25 -0000 1.734 > > +++ sys/dev/usb/usbdevs 24 Mar 2021 23:52:13 -0000 > > @@ -1519,6 +1519,7 @@ product DELL PRISM_GT_2 0x8104 PrismGT > > product DELL W5500 0x8115 W5500 HSDPA > > product DELL U740 0x8135 U740 CDMA > > product DELL EU870D 0x8138 EU870D HSDPA > > +product DELL DW5821E 0x81d7 DW5821e LTE > > product DELL DW700 0x9500 DW700 GPS > > product DELL2 UPS 0xffff UPS > > > > @@ -2302,6 +2303,7 @@ product HUAWEI E392_INIT 0x1505 HUAWEI M > > product HUAWEI K3765_INIT 0x1520 HUAWEI Mobile K3765 Initial > > product HUAWEI K3772_INIT 0x1526 HUAWEI Mobile K3772 Initial > > product HUAWEI MU609 0x1573 HUAWEI Mobile ME906 > > +product HUAWEI ME906S 0x15c1 ME906s LTE > > product HUAWEI E173S 0x1c05 HUAWEI Mobile E173s > > product HUAWEI E173S_INIT 0x1c0b HUAWEI Mobile E173s Initial > > product HUAWEI E303 0x1f01 HUAWEI Mobile E303 > > >