Index: if_umb.c =================================================================== RCS file: /cvs/src/sys/dev/usb/if_umb.c,v diff -u -p -r1.59 if_umb.c --- if_umb.c 8 Aug 2024 05:10:00 -0000 1.59 +++ if_umb.c 20 Sep 2024 04:07:53 -0000 @@ -211,6 +211,12 @@ struct umb_kstat_signal { struct kstat_kv error_rate; struct kstat_kv reports; }; + +struct umb_kstat_service { + struct kstat_kv uplink_speed; + struct kstat_kv downlink_speed; + struct kstat_kv reports; +}; #endif int umb_xfer_tout = USBD_DEFAULT_TIMEOUT; @@ -259,12 +265,6 @@ const struct umb_quirk umb_quirks[] = { UMATCH_VENDOR_PRODUCT }, - { { USB_VENDOR_SIERRA, USB_PRODUCT_SIERRA_EM7455 }, - UMBFLG_FCC_AUTH_REQUIRED, - 0, - 0 - }, - { { USB_VENDOR_SIMCOM, USB_PRODUCT_SIMCOM_SIM7600 }, 0, 1, @@ -1633,6 +1633,9 @@ umb_decode_packet_service(struct umb_sof int state, highestclass; uint64_t up_speed, down_speed; struct ifnet *ifp = GET_IFP(sc); +#if NKSTAT > 0 + struct kstat *ks; +#endif if (len < sizeof (*psi)) return 0; @@ -1686,6 +1689,23 @@ umb_decode_packet_service(struct umb_sof umb_newstate(sc, UMB_S_SIMREADY, UMB_NS_DONT_RAISE); break; } + +#if NKSTAT > 0 + ks = sc->sc_kstat_service; + if (ks != NULL) { + struct umb_kstat_service *uks = ks->ks_data; + + rw_enter_write(&sc->sc_kstat_lock); + kstat_kv_u64(&uks->reports)++; + + kstat_kv_u64(&uks->uplink_speed) = up_speed; + kstat_kv_u64(&uks->downlink_speed) = down_speed; + + getnanouptime(&ks->ks_updated); + rw_exit_write(&sc->sc_kstat_lock); + } +#endif + return 1; } @@ -3214,14 +3234,12 @@ umb_dump(void *buf, int len) #if NKSTAT > 0 -void -umb_kstat_attach(struct umb_softc *sc) +static void +umb_kstat_attach_signal(struct umb_softc *sc) { struct kstat *ks; struct umb_kstat_signal *uks; - rw_init(&sc->sc_kstat_lock, "umbkstat"); - ks = kstat_create(DEVNAM(sc), 0, "mbim-signal", 0, KSTAT_T_KV, 0); if (ks == NULL) return; @@ -3239,23 +3257,69 @@ umb_kstat_attach(struct umb_softc *sc) ks->ks_softc = sc; sc->sc_kstat_signal = ks; kstat_install(ks); + } void -umb_kstat_detach(struct umb_softc *sc) +umb_kstat_attach_service(struct umb_softc *sc) { - struct kstat *ks = sc->sc_kstat_signal; - struct umb_kstat_signal *uks; + struct kstat *ks; + struct umb_kstat_service *uks; + ks = kstat_create(DEVNAM(sc), 0, "mbim-service", 0, KSTAT_T_KV, 0); if (ks == NULL) return; - kstat_remove(ks); - sc->sc_kstat_signal = NULL; + uks = malloc(sizeof(*uks), M_DEVBUF, M_WAITOK|M_ZERO); +#ifdef KSTAT_KV_U_BIT_S + kstat_kv_unit_init(&uks->uplink_speed, "uplink", + KSTAT_KV_T_UINT64, KSTAT_KV_U_BIT_S); + kstat_kv_unit_init(&uks->downlink_speed, "downlink", + KSTAT_KV_T_UINT64, KSTAT_KV_U_BIT_S); +#else + kstat_kv_init(&uks->uplink_speed, "uplink", KSTAT_KV_T_UINT64); + kstat_kv_init(&uks->downlink_speed, "downlink", KSTAT_KV_T_UINT64); +#endif + kstat_kv_init(&uks->reports, "reports", KSTAT_KV_T_COUNTER64); - uks = ks->ks_data; - free(uks, M_DEVBUF, sizeof(*uks)); + kstat_set_rlock(ks, &sc->sc_kstat_lock); + ks->ks_data = uks; + ks->ks_datalen = sizeof(*uks); + ks->ks_read = kstat_read_nop; - kstat_destroy(ks); + ks->ks_softc = sc; + sc->sc_kstat_service = ks; + kstat_install(ks); +} + +void +umb_kstat_attach(struct umb_softc *sc) +{ + rw_init(&sc->sc_kstat_lock, "umbkstat"); + + umb_kstat_attach_signal(sc); + umb_kstat_attach_service(sc); +} + +void +umb_kstat_detach(struct umb_softc *sc) +{ + struct kstat *ks = sc->sc_kstat_signal; + + ks = sc->sc_kstat_signal; + if (ks != NULL) { + sc->sc_kstat_signal = NULL; + kstat_remove(ks); + free(ks->ks_data, M_DEVBUF, ks->ks_datalen); + kstat_destroy(ks); + } + + ks = sc->sc_kstat_service; + if (ks != NULL) { + sc->sc_kstat_service = NULL; + kstat_remove(ks); + free(ks->ks_data, M_DEVBUF, ks->ks_datalen); + kstat_destroy(ks); + } } #endif /* NKSTAT > 0 */ Index: if_umb.h =================================================================== RCS file: /cvs/src/sys/dev/usb/if_umb.h,v diff -u -p -r1.11 if_umb.h --- if_umb.h 29 Aug 2023 23:26:40 -0000 1.11 +++ if_umb.h 20 Sep 2024 04:07:53 -0000 @@ -391,5 +391,6 @@ struct umb_softc { struct rwlock sc_kstat_lock; struct kstat *sc_kstat_signal; + struct kstat *sc_kstat_service; }; #endif /* _KERNEL */ Index: umsm.c =================================================================== RCS file: /cvs/src/sys/dev/usb/umsm.c,v diff -u -p -r1.127 umsm.c --- umsm.c 23 May 2024 08:06:22 -0000 1.127 +++ umsm.c 20 Sep 2024 04:07:53 -0000 @@ -99,6 +99,7 @@ struct umsm_type { #define DEV_NORMAL 0x0000 #define DEV_HUAWEI 0x0001 #define DEV_TRUINSTALL 0x0002 +#define DEV_SIERRA 0x0004 #define DEV_UMASS1 0x0010 #define DEV_UMASS2 0x0020 #define DEV_UMASS3 0x0040 @@ -269,7 +270,13 @@ static const struct umsm_type umsm_devs[ {{ USB_VENDOR_SIERRA, USB_PRODUCT_SIERRA_MC8355}, 0}, {{ USB_VENDOR_SIERRA, USB_PRODUCT_SIERRA_AIRCARD_340U}, 0}, {{ USB_VENDOR_SIERRA, USB_PRODUCT_SIERRA_AIRCARD_770S}, 0}, - {{ USB_VENDOR_SIERRA, USB_PRODUCT_SIERRA_MC7455}, 0}, + {{ USB_VENDOR_SIERRA, USB_PRODUCT_SIERRA_MC74XX_0 }, DEV_SIERRA}, + {{ USB_VENDOR_SIERRA, USB_PRODUCT_SIERRA_MC74XX_1 }, DEV_SIERRA}, + {{ USB_VENDOR_SIERRA, USB_PRODUCT_SIERRA_EM74XX_8 }, DEV_SIERRA}, + {{ USB_VENDOR_SIERRA, USB_PRODUCT_SIERRA_EM74XX_9 }, DEV_SIERRA}, + {{ USB_VENDOR_SIERRA, USB_PRODUCT_SIERRA_EM74XX_A }, DEV_SIERRA}, + {{ USB_VENDOR_SIERRA, USB_PRODUCT_SIERRA_EM74XX_B }, DEV_SIERRA}, + {{ USB_VENDOR_SIERRA, USB_PRODUCT_SIERRA_MC7700}, DEV_SIERRA}, {{ USB_VENDOR_SIMCOM, USB_PRODUCT_SIMCOM_SIM5320}, 0}, {{ USB_VENDOR_SIMCOM, USB_PRODUCT_SIMCOM_SIM7600E}, 0}, @@ -362,6 +369,17 @@ umsm_match(struct device *parent, void * /* Interface 4 can be used as a network device */ if (uaa->ifaceno >= 4) return UMATCH_NONE; + } else if (flag & DEV_SIERRA) { + /* Sierra Wireless layout */ + switch (uaa->ifaceno) { + case 0: + case 2: + case 3: + /* Only umsm on specific interfaces */ + break; + default: + return UMATCH_NONE; + } } return UMATCH_VENDOR_IFACESUBCLASS; Index: usbdevs =================================================================== RCS file: /cvs/src/sys/dev/usb/usbdevs,v diff -u -p -r1.768 usbdevs --- usbdevs 27 Aug 2024 12:31:18 -0000 1.768 +++ usbdevs 20 Sep 2024 04:07:53 -0000 @@ -4086,8 +4086,12 @@ product SIERRA MC7304 0x68c0 MC7304 product SIERRA MC8355 0x9013 MC8355 product SIERRA AIRCARD_340U 0x9051 Aircard 340U product SIERRA AIRCARD_770S 0x9053 Aircard 770S -product SIERRA MC7455 0x9071 MC7455 -product SIERRA EM7455 0x9079 EM7455 +product SIERRA MC74XX_0 0x9070 MC74xx +product SIERRA MC74XX_1 0x9071 MC74xx +product SIERRA EM74XX_8 0x9078 EM74xx +product SIERRA EM74XX_9 0x9079 EM74xx +product SIERRA EM74XX_A 0x907a EM74xx +product SIERRA EM74XX_B 0x907b EM74xx /* Sigmatel products */ product SIGMATEL IRDA 0x4200 IrDA Index: usbdevs.h =================================================================== RCS file: /cvs/src/sys/dev/usb/usbdevs.h,v diff -u -p -r1.780 usbdevs.h --- usbdevs.h 27 Aug 2024 12:31:43 -0000 1.780 +++ usbdevs.h 20 Sep 2024 04:07:53 -0000 @@ -1,4 +1,4 @@ -/* $OpenBSD: usbdevs.h,v 1.780 2024/08/27 12:31:43 sthen Exp $ */ +/* $OpenBSD$ */ /* * THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT. @@ -4093,8 +4093,12 @@ #define USB_PRODUCT_SIERRA_MC8355 0x9013 /* MC8355 */ #define USB_PRODUCT_SIERRA_AIRCARD_340U 0x9051 /* Aircard 340U */ #define USB_PRODUCT_SIERRA_AIRCARD_770S 0x9053 /* Aircard 770S */ -#define USB_PRODUCT_SIERRA_MC7455 0x9071 /* MC7455 */ -#define USB_PRODUCT_SIERRA_EM7455 0x9079 /* EM7455 */ +#define USB_PRODUCT_SIERRA_MC74XX_0 0x9070 /* MC74xx */ +#define USB_PRODUCT_SIERRA_MC74XX_1 0x9071 /* MC74xx */ +#define USB_PRODUCT_SIERRA_EM74XX_8 0x9078 /* EM74xx */ +#define USB_PRODUCT_SIERRA_EM74XX_9 0x9079 /* EM74xx */ +#define USB_PRODUCT_SIERRA_EM74XX_A 0x907a /* EM74xx */ +#define USB_PRODUCT_SIERRA_EM74XX_B 0x907b /* EM74xx */ /* Sigmatel products */ #define USB_PRODUCT_SIGMATEL_IRDA 0x4200 /* IrDA */ Index: usbdevs_data.h =================================================================== RCS file: /cvs/src/sys/dev/usb/usbdevs_data.h,v diff -u -p -r1.774 usbdevs_data.h --- usbdevs_data.h 27 Aug 2024 12:31:43 -0000 1.774 +++ usbdevs_data.h 20 Sep 2024 04:07:53 -0000 @@ -1,4 +1,4 @@ -/* $OpenBSD: usbdevs_data.h,v 1.774 2024/08/27 12:31:43 sthen Exp $ */ +/* $OpenBSD$ */ /* * THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT. @@ -10382,12 +10382,28 @@ const struct usb_known_product usb_known "Aircard 770S", }, { - USB_VENDOR_SIERRA, USB_PRODUCT_SIERRA_MC7455, - "MC7455", + USB_VENDOR_SIERRA, USB_PRODUCT_SIERRA_MC74XX_0, + "MC74xx", }, { - USB_VENDOR_SIERRA, USB_PRODUCT_SIERRA_EM7455, - "EM7455", + USB_VENDOR_SIERRA, USB_PRODUCT_SIERRA_MC74XX_1, + "MC74xx", + }, + { + USB_VENDOR_SIERRA, USB_PRODUCT_SIERRA_EM74XX_8, + "EM74xx", + }, + { + USB_VENDOR_SIERRA, USB_PRODUCT_SIERRA_EM74XX_9, + "EM74xx", + }, + { + USB_VENDOR_SIERRA, USB_PRODUCT_SIERRA_EM74XX_A, + "EM74xx", + }, + { + USB_VENDOR_SIERRA, USB_PRODUCT_SIERRA_EM74XX_B, + "EM74xx", }, { USB_VENDOR_SIGMATEL, USB_PRODUCT_SIGMATEL_IRDA,