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

Reply via email to