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?

> 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