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