On Mon, Oct 19, 2020 at 08:11:04PM -0700, Bryan Vyhmeister wrote: > On Fri, Oct 02, 2020 at 12:33:15PM -0700, Bryan Vyhmeister wrote: > > On Wed, Sep 30, 2020 at 04:05:51PM -0700, Bryan Vyhmeister wrote: > > > Gerhard Roth provided a patch to me to get the Qualcomm Snapdragon X20 > > > umb(4) interface in my Dell Latitude 7300 working. It is also known as a > > > Dell DW5821e interface. I have been using this patch for months now with > > > AT&T Wireless in the US and it works great just as I have been used to > > > on my ThinkPad X270 with the older umb(4) interface. This is how it > > > shows up now in my dmesg: > > > > > > umb0 at uhub0 port 16 "Dell Inc. DW5821e Snapdragon X20 LTE" rev > > > 3.10/3.18 addr 2 > > > > > > I would love to get this committed at some point so I no longer have to > > > keep compiling a new kernel for every snapshot to have umb(4) working. > > > > Thanks to jmc@ for suggesting a man page diff as well. Both the diff for > > if_umb.c and umb.4 are below. > > Ping.
Any further comments on this patch? I would love to see this fixed so umb(4) on my laptop will work fine without a custom kernel. Thank you. Bryan 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 2 Oct 2020 19:30:53 -0000 @@ -44,6 +44,7 @@ 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 Medion Mobile S4222 (MediaTek OEM) Index: sys/dev/usb/if_umb.c =================================================================== RCS file: /cvs/src/sys/dev/usb/if_umb.c,v retrieving revision 1.36 diff -u -p -r1.36 if_umb.c --- sys/dev/usb/if_umb.c 22 Jul 2020 02:16:02 -0000 1.36 +++ sys/dev/usb/if_umb.c 2 Oct 2020 19:30:53 -0000 @@ -1,4 +1,4 @@ -/* $OpenBSD: if_umb.c,v 1.36 2020/07/22 02:16:02 dlg Exp $ */ +/* $OpenBSD: if_umb.c,v 1.34 2020/05/04 14:41:03 gerhard Exp $ */ /* * Copyright (c) 2016 genua mbH @@ -225,6 +225,26 @@ 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. + * + * OTOH, some devices identifiy themself als 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, 0x81d7 }, 2 }, /* XXX FIXME */ +}; + +#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 +283,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 +337,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->bNumInterface; + 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 +441,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); } }