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
> >
>