dlg@ikkaku ~$ kstat myx*::: myx0:0:myx-fw-specs:0 0: 4d 41 43 3d 30 30 3a 36 30 3a 64 64 3a 34 34 3a |MAC=00:60:dd:44:| 16: 35 63 3a 33 32 00 53 4e 3d 34 35 38 32 30 39 00 |5c:32_SN=458209_| 32: 50 57 52 3d 31 30 30 00 50 43 3d 31 30 47 2d 50 |PWR=100_PC=10G-P| 48: 43 49 45 32 2d 38 42 32 2d 32 53 00 50 4e 3d 30 |CIE2-8B2-2S_PN=0| 64: 39 2d 30 34 32 34 34 00 4d 45 4d 4d 41 50 3d 2d |9-04244_MEMMAP=-| 80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 00 |---------------_| 96: 50 53 45 52 44 45 53 3d 30 00 54 41 47 3d 7a 65 |PSERDES=0_TAG=ze| 112: 5f 74 6f 6f 6c 73 2d 31 5f 34 5f 35 33 61 00 00 |_tools-1_4_53a__| 128: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |~~~~~~~~~~~~~~~~| 144: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |~~~~~~~~~~~~~~~~| 160: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |~~~~~~~~~~~~~~~~| 176: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |~~~~~~~~~~~~~~~~| 192: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |~~~~~~~~~~~~~~~~| 208: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |~~~~~~~~~~~~~~~~| 224: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |~~~~~~~~~~~~~~~~| 240: ff ff ff ff ff ff ff ff ff ff ff ff ff ff 00 00 |~~~~~~~~~~~~~~__| myx0:0:myx-stats:0 pause drops: 0 packets ucast filtered: 0 packets bad crc32: 0 packets bad phy: 0 packets mcast filtered: 152 packets tx done: 474 packets rx discards: 0 packets rx errors: 0 packets rx undersize: 0 packets rx oversize: 0 packets small discards: 0 packets large discards: 0 packets rdma tags free: 15 myx0:0:rxq:0 packets: 545 packets bytes: 115531 bytes qdrops: 0 packets errors: 0 packets qlen: 0 packets myx0:0:txq:0 packets: 474 packets bytes: 124027 bytes qdrops: 0 packets errors: 0 packets qlen: 0 packets maxqlen: 1023 packets oactive: false myx1:0:myx-fw-specs:0 0: 4d 41 43 3d 30 30 3a 36 30 3a 64 64 3a 34 34 3a |MAC=00:60:dd:44:| 16: 35 63 3a 33 33 00 53 4e 3d 34 35 38 32 30 39 00 |5c:33_SN=458209_| 32: 50 57 52 3d 31 30 30 00 50 43 3d 31 30 47 2d 50 |PWR=100_PC=10G-P| 48: 43 49 45 32 2d 38 42 32 2d 32 53 00 50 4e 3d 30 |CIE2-8B2-2S_PN=0| 64: 39 2d 30 34 32 34 34 00 4d 45 4d 4d 41 50 3d 2d |9-04244_MEMMAP=-| 80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 00 |---------------_| 96: 50 53 45 52 44 45 53 3d 30 00 54 41 47 3d 7a 65 |PSERDES=0_TAG=ze| 112: 5f 74 6f 6f 6c 73 2d 31 5f 34 5f 35 33 61 00 00 |_tools-1_4_53a__| 128: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |~~~~~~~~~~~~~~~~| 144: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |~~~~~~~~~~~~~~~~| 160: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |~~~~~~~~~~~~~~~~| 176: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |~~~~~~~~~~~~~~~~| 192: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |~~~~~~~~~~~~~~~~| 208: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |~~~~~~~~~~~~~~~~| 224: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |~~~~~~~~~~~~~~~~| 240: ff ff ff ff ff ff ff ff ff ff ff ff ff ff 00 00 |~~~~~~~~~~~~~~__| myx1:0:myx-stats:0 pause drops: 0 packets ucast filtered: 0 packets bad crc32: 0 packets bad phy: 0 packets mcast filtered: 84 packets tx done: 130 packets rx discards: 0 packets rx errors: 0 packets rx undersize: 0 packets rx oversize: 0 packets small discards: 0 packets large discards: 0 packets rdma tags free: 15 myx1:0:rxq:0 packets: 201 packets bytes: 29537 bytes qdrops: 0 packets errors: 0 packets qlen: 0 packets myx1:0:txq:0 packets: 130 packets bytes: 76277 bytes qdrops: 0 packets errors: 0 packets qlen: 0 packets maxqlen: 1023 packets oactive: false Index: if_myx.c =================================================================== RCS file: /cvs/src/sys/dev/pci/if_myx.c,v retrieving revision 1.115 diff -u -p -r1.115 if_myx.c --- if_myx.c 8 Feb 2021 08:18:45 -0000 1.115 +++ if_myx.c 17 Jan 2022 05:06:15 -0000 @@ -162,10 +162,14 @@ struct myx_softc { struct rwlock sc_sff_lock; + uint8_t sc_fw_specs[MYX_STRING_SPECS_SIZE]; + uint32_t sc_fw_specs_len; + #if NKSTAT > 0 struct mutex sc_kstat_mtx; struct timeout sc_kstat_tmo; struct kstat *sc_kstat; + struct kstat *sc_kstat_fw_specs; #endif }; @@ -376,8 +380,8 @@ myx_query(struct myx_softc *sc, char *pa { struct myx_gen_hdr hdr; u_int32_t offset; - u_int8_t strings[MYX_STRING_SPECS_SIZE]; u_int i, len, maxlen; + uint8_t *strings = sc->sc_fw_specs; myx_read(sc, MYX_HEADER_POS, &offset, sizeof(offset)); offset = betoh32(offset); @@ -388,9 +392,11 @@ myx_query(struct myx_softc *sc, char *pa myx_read(sc, offset, &hdr, sizeof(hdr)); offset = betoh32(hdr.fw_specs); - len = min(betoh32(hdr.fw_specs_len), sizeof(strings)); + len = min(betoh32(hdr.fw_specs_len), sizeof(sc->sc_fw_specs)); - bus_space_read_region_1(sc->sc_memt, sc->sc_memh, offset, strings, len); + bus_space_read_region_1(sc->sc_memt, sc->sc_memh, offset, + sc->sc_fw_specs, len); + sc->sc_fw_specs_len = len; for (i = 0; i < len; i++) { maxlen = len - i; @@ -2236,6 +2242,12 @@ myx_kstat_stop(struct myx_softc *sc) mtx_leave(&sc->sc_kstat_mtx); } +static int +myx_kstat_read_nop(struct kstat *ks) +{ + return (0); +} + void myx_kstat_attach(struct myx_softc *sc) { @@ -2272,6 +2284,19 @@ myx_kstat_attach(struct myx_softc *sc) ks->ks_softc = sc; sc->sc_kstat = ks; + kstat_install(ks); + + ks = kstat_create(DEVNAME(sc), 0, "myx-fw-specs", 0, KSTAT_T_RAW, 0); + if (ks == NULL) + return; + + ks->ks_data = sc->sc_fw_specs; + ks->ks_datalen = sc->sc_fw_specs_len; + getnanouptime(&ks->ks_updated); + ks->ks_read = myx_kstat_read_nop; + + ks->ks_softc = ks; + sc->sc_kstat_fw_specs = ks; kstat_install(ks); } #endif /* NKSTAT > 0 */