sync code with last improvements from OpenBSD
This commit is contained in:
parent
708141b7a2
commit
085b88af82
18 changed files with 307 additions and 35 deletions
|
@ -1,4 +1,4 @@
|
|||
/* $OpenBSD: if_umb.c,v 1.52 2023/08/26 11:33:46 dlg Exp $ */
|
||||
/* $OpenBSD: if_umb.c,v 1.54 2023/08/29 23:28:38 dlg Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2016 genua mbH
|
||||
|
@ -23,13 +23,16 @@
|
|||
* Compliance testing guide
|
||||
* https://www.usb.org/sites/default/files/MBIM-Compliance-1.0.pdf
|
||||
*/
|
||||
|
||||
#include "bpfilter.h"
|
||||
#include "kstat.h"
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/mbuf.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/syslog.h>
|
||||
#include <sys/kstat.h>
|
||||
|
||||
#if NBPFILTER > 0
|
||||
#include <net/bpf.h>
|
||||
|
@ -203,6 +206,17 @@ void umb_decode_qmi(struct umb_softc *, uint8_t *, int);
|
|||
|
||||
void umb_intr(struct usbd_xfer *, void *, usbd_status);
|
||||
|
||||
#if NKSTAT > 0
|
||||
void umb_kstat_attach(struct umb_softc *);
|
||||
void umb_kstat_detach(struct umb_softc *);
|
||||
|
||||
struct umb_kstat_signal {
|
||||
struct kstat_kv rssi;
|
||||
struct kstat_kv error_rate;
|
||||
struct kstat_kv reports;
|
||||
};
|
||||
#endif
|
||||
|
||||
int umb_xfer_tout = USBD_DEFAULT_TIMEOUT;
|
||||
|
||||
uint8_t umb_uuid_basic_connect[] = MBIM_UUID_BASIC_CONNECT;
|
||||
|
@ -618,6 +632,11 @@ umb_attach(struct device *parent, struct device *self, void *aux)
|
|||
#if NBPFILTER > 0
|
||||
bpfattach(&ifp->if_bpf, ifp, DLT_LOOP, sizeof(uint32_t));
|
||||
#endif
|
||||
|
||||
#if NKSTAT > 0
|
||||
umb_kstat_attach(sc);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Open the device now so that we are able to query device information.
|
||||
* XXX maybe close when done?
|
||||
|
@ -645,6 +664,10 @@ umb_detach(struct device *self, int flags)
|
|||
umb_down(sc, 1);
|
||||
umb_close(sc);
|
||||
|
||||
#if NKSTAT > 0
|
||||
umb_kstat_detach(sc);
|
||||
#endif
|
||||
|
||||
usb_rem_wait_task(sc->sc_udev, &sc->sc_get_response_task);
|
||||
if (timeout_initialized(&sc->sc_statechg_timer))
|
||||
timeout_del(&sc->sc_statechg_timer);
|
||||
|
@ -1670,6 +1693,9 @@ umb_decode_signal_state(struct umb_softc *sc, void *data, int len)
|
|||
struct mbim_cid_signal_state *ss = data;
|
||||
struct ifnet *ifp = GET_IFP(sc);
|
||||
int rssi;
|
||||
#if NKSTAT > 0
|
||||
struct kstat *ks;
|
||||
#endif
|
||||
|
||||
if (len < sizeof (*ss))
|
||||
return 0;
|
||||
|
@ -1684,8 +1710,37 @@ umb_decode_signal_state(struct umb_softc *sc, void *data, int len)
|
|||
}
|
||||
sc->sc_info.rssi = rssi;
|
||||
sc->sc_info.ber = letoh32(ss->err_rate);
|
||||
if (sc->sc_info.ber == -99)
|
||||
if (sc->sc_info.ber == 99)
|
||||
sc->sc_info.ber = UMB_VALUE_UNKNOWN;
|
||||
|
||||
#if NKSTAT > 0
|
||||
ks = sc->sc_kstat_signal;
|
||||
if (ks != NULL) {
|
||||
struct umb_kstat_signal *uks = ks->ks_data;
|
||||
|
||||
rw_enter_write(&sc->sc_kstat_lock);
|
||||
kstat_kv_u64(&uks->reports)++;
|
||||
|
||||
if (sc->sc_info.rssi == UMB_VALUE_UNKNOWN)
|
||||
uks->rssi.kv_type = KSTAT_KV_T_NULL;
|
||||
else {
|
||||
uks->rssi.kv_type = KSTAT_KV_T_INT32;
|
||||
kstat_kv_s32(&uks->rssi) = sc->sc_info.rssi;
|
||||
}
|
||||
|
||||
if (sc->sc_info.ber == UMB_VALUE_UNKNOWN)
|
||||
uks->error_rate.kv_type = KSTAT_KV_T_NULL;
|
||||
else {
|
||||
uks->error_rate.kv_type = KSTAT_KV_T_INT32;
|
||||
kstat_kv_s32(&uks->error_rate) = sc->sc_info.ber;
|
||||
}
|
||||
|
||||
ks->ks_interval.tv_sec = letoh32(ss->ss_intvl);
|
||||
getnanouptime(&ks->ks_updated);
|
||||
rw_exit_write(&sc->sc_kstat_lock);
|
||||
}
|
||||
#endif
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -3146,3 +3201,51 @@ umb_dump(void *buf, int len)
|
|||
addlog("\n");
|
||||
}
|
||||
#endif /* UMB_DEBUG */
|
||||
|
||||
#if NKSTAT > 0
|
||||
|
||||
void
|
||||
umb_kstat_attach(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;
|
||||
|
||||
uks = malloc(sizeof(*uks), M_DEVBUF, M_WAITOK|M_ZERO);
|
||||
kstat_kv_init(&uks->rssi, "rssi", KSTAT_KV_T_NULL);
|
||||
kstat_kv_init(&uks->error_rate, "error rate", KSTAT_KV_T_NULL);
|
||||
kstat_kv_init(&uks->reports, "reports", KSTAT_KV_T_COUNTER64);
|
||||
|
||||
kstat_set_rlock(ks, &sc->sc_kstat_lock);
|
||||
ks->ks_data = uks;
|
||||
ks->ks_datalen = sizeof(*uks);
|
||||
ks->ks_read = kstat_read_nop;
|
||||
|
||||
ks->ks_softc = sc;
|
||||
sc->sc_kstat_signal = ks;
|
||||
kstat_install(ks);
|
||||
}
|
||||
|
||||
void
|
||||
umb_kstat_detach(struct umb_softc *sc)
|
||||
{
|
||||
struct kstat *ks = sc->sc_kstat_signal;
|
||||
struct umb_kstat_signal *uks;
|
||||
|
||||
if (ks == NULL)
|
||||
return;
|
||||
|
||||
kstat_remove(ks);
|
||||
sc->sc_kstat_signal = NULL;
|
||||
|
||||
uks = ks->ks_data;
|
||||
free(uks, M_DEVBUF, sizeof(*uks));
|
||||
|
||||
kstat_destroy(ks);
|
||||
}
|
||||
#endif /* NKSTAT > 0 */
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $OpenBSD: if_umb.h,v 1.10 2021/07/04 19:22:32 sthen Exp $ */
|
||||
/* $OpenBSD: if_umb.h,v 1.11 2023/08/29 23:26:40 dlg Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2016 genua mbH
|
||||
|
@ -388,5 +388,8 @@ struct umb_softc {
|
|||
#define sc_state sc_info.state
|
||||
#define sc_roaming sc_info.enable_roaming
|
||||
struct umb_info sc_info;
|
||||
|
||||
struct rwlock sc_kstat_lock;
|
||||
struct kstat *sc_kstat_signal;
|
||||
};
|
||||
#endif /* _KERNEL */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue