On Fri, Mar 31, 2023 at 06:28:14PM +1000, David Gwynne wrote: > > i got a quectel ec25 to play with recently, and got side tracked > thinking the usb controller was not talking to the modem correctly > because when it attached it looked like this: > > umb0 at uhub2 port 1 "Android Android" rev 2.00/3.18 addr > umb0: missing MBIM descriptor > > and the usb descriptors looked weird. i thought clocking or power > or something was wrong. turns out that the host controller is fine, > but the devices are complicated because they're based on the qualcomm > qmi stuff, and in a lot of cases openbsd could do a better job of > talking to them.
When I added support for ec25, I had already set it to mbim mode on Linux. Because I didn't want to use any other mode (ppp & qmi, ecm), I didn't notice the error message that would appear if it was in qmi mode. It wasn't until dlg@ brought up this issue that I became aware of its existence. > fortunately quectel seem to do a better job than a lot of other vendors > usign the qmi stuff and try to make all their products support a common > set of features. their linux driver guide is also very good, and is very > clear about what to expect on these devices. basically, these modems > are supposed to present a bunch of umsm interfaces, and at least > one network interface. the usb network interface type can be changed by > talking to the umsm interfaces, and could be qmi, ecm, or mbim. > > openbsd is currently hardcoded to attach umb(4) to these devices, and it > will attach only umb at the device level. this means that the usms > interfaces are hidden, and if the device is not in mbim mode then umb > complains that the descriptors dont look right. which is fair. > > this diff tweaks the umsm and umb matches to follow the quectel doco. > this allos umsm to attach to the correct interfaces, but leaves the > network interface alone. this allows umb to attach to the network > interface if the modem is configured in mbim mode based on class, > otherwise ugen gets to attach to it. if we ever get qmi or ecm drivers, > this will allow them to attach instead of ugen. > > eg, with these diffs and when the modem is in qmi mode: > > umsm0 at uhub2 port 1 configuration 1 interface 0 "Android Android" rev > 2.00/3.18 addr 2 > ucom0 at umsm0 > umsm1 at uhub2 port 1 configuration 1 interface 1 "Android Android" rev > 2.00/3.18 addr 2 > ucom1 at umsm1 > umsm2 at uhub2 port 1 configuration 1 interface 2 "Android Android" rev > 2.00/3.18 addr 2 > ucom2 at umsm2 > umsm3 at uhub2 port 1 configuration 1 interface 3 "Android Android" rev > 2.00/3.18 addr 2 > ucom3 at umsm3 > ugen0 at uhub2 port 1 configuration 1 "Android Android" rev 2.00/3.18 addr 2 > > now that umsm is exposed i can tell it to expose mbim instead. next time > it attaches i see this: > > umsm0 at uhub2 port 1 configuration 1 interface 0 "Android Android" rev > 2.00/3.18 addr 2 > ucom0 at umsm0 > umsm1 at uhub2 port 1 configuration 1 interface 1 "Android Android" rev > 2.00/3.18 addr 2 > ucom1 at umsm1 > umsm2 at uhub2 port 1 configuration 1 interface 2 "Android Android" rev > 2.00/3.18 addr 2 > ucom2 at umsm2 > umsm3 at uhub2 port 1 configuration 1 interface 3 "Android Android" rev > 2.00/3.18 addr 2 > ucom3 at umsm3 > umb0 at uhub2 port 1 configuration 1 interface 4 "Android Android" rev > 2.00/3.18 addr 2 > > and umb0 shows up in ifconfig and lets me configure an apn and stuff. > > thanks to kevlo for helping me out and testing. > > a follow up diff could (should) add the rest of the quectel usbids > listed in their doco. > > the umsm chunk looks big because i made it return early if there's no > umsm_lookup value, which lets me reduce the indentation of most of the > code. > > ok? With this patch, I'm able to send AT commands to ec25 modem without the umsm attachments. ok kevlo@, thanks! > Index: if_umb.c > =================================================================== > RCS file: /cvs/src/sys/dev/usb/if_umb.c,v > retrieving revision 1.49 > diff -u -p -r1.49 if_umb.c > --- if_umb.c 11 Jan 2022 10:34:13 -0000 1.49 > +++ if_umb.c 31 Mar 2023 08:27:04 -0000 > @@ -238,13 +238,6 @@ const struct umb_quirk umb_quirks[] = { > UMATCH_VENDOR_PRODUCT > }, > > - { { USB_VENDOR_QUECTEL, USB_PRODUCT_QUECTEL_EC25 }, > - 0, > - 1, > - UMATCH_VENDOR_PRODUCT > - }, > - > - > { { USB_VENDOR_HUAWEI, USB_PRODUCT_HUAWEI_ME906S }, > UMBFLG_NDP_AT_END, > 3, > Index: umsm.c > =================================================================== > RCS file: /cvs/src/sys/dev/usb/umsm.c,v > retrieving revision 1.122 > diff -u -p -r1.122 umsm.c > --- umsm.c 23 Aug 2022 08:12:30 -0000 1.122 > +++ umsm.c 31 Mar 2023 08:27:04 -0000 > @@ -293,53 +293,66 @@ int > umsm_match(struct device *parent, void *match, void *aux) > { > struct usb_attach_arg *uaa = aux; > + const struct umsm_type *umsmt; > usb_interface_descriptor_t *id; > uint16_t flag; > > if (uaa->iface == NULL) > return UMATCH_NONE; > > + umsmt = umsm_lookup(uaa->vendor, uaa->product); > + if (umsmt == NULL) > + return UMATCH_NONE; > + > /* > * Some devices (eg Huawei E220) have multiple interfaces and some > * of them are of class umass. Don't claim ownership in such case. > */ > - if (umsm_lookup(uaa->vendor, uaa->product) != NULL) { > - id = usbd_get_interface_descriptor(uaa->iface); > - flag = umsm_lookup(uaa->vendor, uaa->product)->umsm_flag; > - > - if (id == NULL || id->bInterfaceClass == UICLASS_MASS) { > - /* > - * Some high-speed modems require special care. > - */ > - if (flag & DEV_HUAWEI) { > - if (uaa->ifaceno != 2) > - return UMATCH_VENDOR_IFACESUBCLASS; > - else > - return UMATCH_NONE; > - } else if (flag & DEV_UMASS) { > - return UMATCH_VENDOR_IFACESUBCLASS; > - } else if (flag & DEV_TRUINSTALL) { > - return UMATCH_VENDOR_IFACESUBCLASS; > - } else > - return UMATCH_NONE; > + > + id = usbd_get_interface_descriptor(uaa->iface); > + flag = umsmt->umsm_flag; > + > + if (id == NULL || id->bInterfaceClass == UICLASS_MASS) { > /* > - * Some devices have interfaces which fail to attach but in > - * addition seem to make the remaining interfaces unusable. Only > - * attach whitelisted interfaces in this case. > + * Some high-speed modems require special care. > */ > - } else if ((uaa->vendor == USB_VENDOR_MEDIATEK && > - uaa->product == USB_PRODUCT_MEDIATEK_DC_4COM) && > - !(id->bInterfaceClass == UICLASS_VENDOR && > - ((id->bInterfaceSubClass == 0x02 && > - id->bInterfaceProtocol == 0x01) || > - (id->bInterfaceSubClass == 0x00 && > - id->bInterfaceProtocol == 0x00)))) { > - return UMATCH_NONE; > - } else > + if (flag & DEV_HUAWEI) { > + if (uaa->ifaceno != 2) > + return UMATCH_VENDOR_IFACESUBCLASS; > + else > + return UMATCH_NONE; > + } else if (flag & DEV_UMASS) { > return UMATCH_VENDOR_IFACESUBCLASS; > + } else if (flag & DEV_TRUINSTALL) { > + return UMATCH_VENDOR_IFACESUBCLASS; > + } else > + return UMATCH_NONE; > + /* > + * Some devices have interfaces which fail to attach but in > + * addition seem to make the remaining interfaces unusable. Only > + * attach whitelisted interfaces in this case. > + */ > + } else if ((uaa->vendor == USB_VENDOR_MEDIATEK && > + uaa->product == USB_PRODUCT_MEDIATEK_DC_4COM) && > + !(id->bInterfaceClass == UICLASS_VENDOR && > + ((id->bInterfaceSubClass == 0x02 && > + id->bInterfaceProtocol == 0x01) || > + (id->bInterfaceSubClass == 0x00 && > + id->bInterfaceProtocol == 0x00)))) { > + return UMATCH_NONE; > + > + /* See the Quectel LTE&5G Linux USB Driver User Guide */ > + } else if (uaa->vendor == USB_VENDOR_QUECTEL) { > + /* Some interfaces can be used as network devices */ > + if (id->bInterfaceClass != UICLASS_VENDOR) > + return UMATCH_NONE; > + > + /* Interface 4 can be used as a network device */ > + if (uaa->ifaceno >= 4) > + return UMATCH_NONE; > } > > - return UMATCH_NONE; > + return UMATCH_VENDOR_IFACESUBCLASS; > } > > void >