15e111ed8SAndrew Rybchenko /* SPDX-License-Identifier: BSD-3-Clause
25e111ed8SAndrew Rybchenko *
3*672386c1SAndrew Rybchenko * Copyright(c) 2019-2021 Xilinx, Inc.
45e111ed8SAndrew Rybchenko * Copyright(c) 2009-2019 Solarflare Communications Inc.
55e111ed8SAndrew Rybchenko */
65e111ed8SAndrew Rybchenko
75e111ed8SAndrew Rybchenko #include "efx.h"
85e111ed8SAndrew Rybchenko #include "efx_impl.h"
95e111ed8SAndrew Rybchenko #include "mcdi_mon.h"
105e111ed8SAndrew Rybchenko
115e111ed8SAndrew Rybchenko #if EFSYS_OPT_MON_MCDI
125e111ed8SAndrew Rybchenko
135e111ed8SAndrew Rybchenko #if EFSYS_OPT_MON_STATS
145e111ed8SAndrew Rybchenko
155e111ed8SAndrew Rybchenko /* Get port mask from one-based MCDI port number */
165e111ed8SAndrew Rybchenko #define MCDI_MON_PORT_MASK(_emip) (1U << ((_emip)->emi_port - 1))
175e111ed8SAndrew Rybchenko
185e111ed8SAndrew Rybchenko #define MCDI_STATIC_SENSOR_ASSERT(_field) \
195e111ed8SAndrew Rybchenko EFX_STATIC_ASSERT(MC_CMD_SENSOR_STATE_ ## _field \
205e111ed8SAndrew Rybchenko == EFX_MON_STAT_STATE_ ## _field)
215e111ed8SAndrew Rybchenko
225e111ed8SAndrew Rybchenko static void
mcdi_mon_decode_stats(__in efx_nic_t * enp,__in_bcount (sensor_mask_size)uint32_t * sensor_mask,__in size_t sensor_mask_size,__in_opt efsys_mem_t * esmp,__out_bcount_opt (sensor_mask_size)uint32_t * stat_maskp,__inout_ecount_opt (EFX_MON_NSTATS)efx_mon_stat_value_t * stat)235e111ed8SAndrew Rybchenko mcdi_mon_decode_stats(
245e111ed8SAndrew Rybchenko __in efx_nic_t *enp,
255e111ed8SAndrew Rybchenko __in_bcount(sensor_mask_size) uint32_t *sensor_mask,
265e111ed8SAndrew Rybchenko __in size_t sensor_mask_size,
275e111ed8SAndrew Rybchenko __in_opt efsys_mem_t *esmp,
285e111ed8SAndrew Rybchenko __out_bcount_opt(sensor_mask_size) uint32_t *stat_maskp,
295e111ed8SAndrew Rybchenko __inout_ecount_opt(EFX_MON_NSTATS) efx_mon_stat_value_t *stat)
305e111ed8SAndrew Rybchenko {
315e111ed8SAndrew Rybchenko efx_mcdi_iface_t *emip = &(enp->en_mcdi.em_emip);
325e111ed8SAndrew Rybchenko efx_mon_stat_portmask_t port_mask;
335e111ed8SAndrew Rybchenko uint16_t sensor;
345e111ed8SAndrew Rybchenko size_t sensor_max;
355e111ed8SAndrew Rybchenko uint32_t stat_mask[(EFX_MON_NSTATS + 31) / 32];
365e111ed8SAndrew Rybchenko uint32_t idx = 0;
375e111ed8SAndrew Rybchenko uint32_t page = 0;
385e111ed8SAndrew Rybchenko
395e111ed8SAndrew Rybchenko /* Assert the MC_CMD_SENSOR and EFX_MON_STATE namespaces agree */
405e111ed8SAndrew Rybchenko MCDI_STATIC_SENSOR_ASSERT(OK);
415e111ed8SAndrew Rybchenko MCDI_STATIC_SENSOR_ASSERT(WARNING);
425e111ed8SAndrew Rybchenko MCDI_STATIC_SENSOR_ASSERT(FATAL);
435e111ed8SAndrew Rybchenko MCDI_STATIC_SENSOR_ASSERT(BROKEN);
445e111ed8SAndrew Rybchenko MCDI_STATIC_SENSOR_ASSERT(NO_READING);
455e111ed8SAndrew Rybchenko
465e111ed8SAndrew Rybchenko sensor_max = 8 * sensor_mask_size;
475e111ed8SAndrew Rybchenko
485e111ed8SAndrew Rybchenko EFSYS_ASSERT(emip->emi_port > 0); /* MCDI port number is one-based */
495e111ed8SAndrew Rybchenko port_mask = (efx_mon_stat_portmask_t)MCDI_MON_PORT_MASK(emip);
505e111ed8SAndrew Rybchenko
515e111ed8SAndrew Rybchenko memset(stat_mask, 0, sizeof (stat_mask));
525e111ed8SAndrew Rybchenko
535e111ed8SAndrew Rybchenko /*
545e111ed8SAndrew Rybchenko * The MCDI sensor readings in the DMA buffer are a packed array of
555e111ed8SAndrew Rybchenko * MC_CMD_SENSOR_VALUE_ENTRY structures, which only includes entries for
565e111ed8SAndrew Rybchenko * supported sensors (bit set in sensor_mask). The sensor_mask and
575e111ed8SAndrew Rybchenko * sensor readings do not include entries for the per-page NEXT_PAGE
585e111ed8SAndrew Rybchenko * flag.
595e111ed8SAndrew Rybchenko *
605e111ed8SAndrew Rybchenko * sensor_mask may legitimately contain MCDI sensors that the driver
615e111ed8SAndrew Rybchenko * does not understand.
625e111ed8SAndrew Rybchenko */
635e111ed8SAndrew Rybchenko for (sensor = 0; sensor < sensor_max; ++sensor) {
645e111ed8SAndrew Rybchenko efx_mon_stat_t id;
655e111ed8SAndrew Rybchenko efx_mon_stat_portmask_t stat_portmask = 0;
665e111ed8SAndrew Rybchenko efx_mon_stat_unit_t stat_unit;
675e111ed8SAndrew Rybchenko
685e111ed8SAndrew Rybchenko if ((sensor % (MC_CMD_SENSOR_PAGE0_NEXT + 1)) ==
695e111ed8SAndrew Rybchenko MC_CMD_SENSOR_PAGE0_NEXT) {
705e111ed8SAndrew Rybchenko /* This sensor is one of the page boundary bits. */
715e111ed8SAndrew Rybchenko page++;
725e111ed8SAndrew Rybchenko continue;
735e111ed8SAndrew Rybchenko }
745e111ed8SAndrew Rybchenko
755e111ed8SAndrew Rybchenko if (~(sensor_mask[page]) &
765e111ed8SAndrew Rybchenko (1U << (sensor % (sizeof (sensor_mask[page]) * 8)))) {
775e111ed8SAndrew Rybchenko /* This sensor is not supported. */
785e111ed8SAndrew Rybchenko continue;
795e111ed8SAndrew Rybchenko }
805e111ed8SAndrew Rybchenko
815e111ed8SAndrew Rybchenko /* Supported sensor, so it is present in the DMA buffer. */
825e111ed8SAndrew Rybchenko idx++;
835e111ed8SAndrew Rybchenko
845e111ed8SAndrew Rybchenko if ((efx_mon_mcdi_to_efx_stat(sensor, &id) != B_TRUE) ||
855e111ed8SAndrew Rybchenko (efx_mon_get_stat_portmap(id, &stat_portmask) != B_TRUE)) {
865e111ed8SAndrew Rybchenko /* The sensor is not known to the driver. */
875e111ed8SAndrew Rybchenko continue;
885e111ed8SAndrew Rybchenko }
895e111ed8SAndrew Rybchenko
905e111ed8SAndrew Rybchenko if ((stat_portmask & port_mask) == 0) {
915e111ed8SAndrew Rybchenko /* The sensor is not for this port. */
925e111ed8SAndrew Rybchenko continue;
935e111ed8SAndrew Rybchenko }
945e111ed8SAndrew Rybchenko
955e111ed8SAndrew Rybchenko EFSYS_ASSERT(id < EFX_MON_NSTATS);
965e111ed8SAndrew Rybchenko
975e111ed8SAndrew Rybchenko /*
985e111ed8SAndrew Rybchenko * stat_mask is a bitmask indexed by EFX_MON_* monitor statistic
995e111ed8SAndrew Rybchenko * identifiers from efx_mon_stat_t (without NEXT_PAGE bits).
1005e111ed8SAndrew Rybchenko *
1015e111ed8SAndrew Rybchenko * If there is an entry in the MCDI sensor to monitor statistic
1025e111ed8SAndrew Rybchenko * map then the sensor reading is used for the value of the
1035e111ed8SAndrew Rybchenko * monitor statistic.
1045e111ed8SAndrew Rybchenko */
1055e111ed8SAndrew Rybchenko stat_mask[id / EFX_MON_MASK_ELEMENT_SIZE] |=
1065e111ed8SAndrew Rybchenko (1U << (id % EFX_MON_MASK_ELEMENT_SIZE));
1075e111ed8SAndrew Rybchenko
1085e111ed8SAndrew Rybchenko if (stat != NULL && esmp != NULL && !EFSYS_MEM_IS_NULL(esmp)) {
1095e111ed8SAndrew Rybchenko efx_dword_t dword;
1105e111ed8SAndrew Rybchenko
1115e111ed8SAndrew Rybchenko /* Get MCDI sensor reading from DMA buffer */
1125e111ed8SAndrew Rybchenko EFSYS_MEM_READD(esmp, 4 * (idx - 1), &dword);
1135e111ed8SAndrew Rybchenko
1145e111ed8SAndrew Rybchenko /* Update EFX monitor stat from MCDI sensor reading */
1155e111ed8SAndrew Rybchenko stat[id].emsv_value = (uint16_t)EFX_DWORD_FIELD(dword,
1165e111ed8SAndrew Rybchenko MC_CMD_SENSOR_VALUE_ENTRY_TYPEDEF_VALUE);
1175e111ed8SAndrew Rybchenko
1185e111ed8SAndrew Rybchenko stat[id].emsv_state = (uint16_t)EFX_DWORD_FIELD(dword,
1195e111ed8SAndrew Rybchenko MC_CMD_SENSOR_VALUE_ENTRY_TYPEDEF_STATE);
1205e111ed8SAndrew Rybchenko
1215e111ed8SAndrew Rybchenko stat[id].emsv_unit =
1225e111ed8SAndrew Rybchenko efx_mon_get_stat_unit(id, &stat_unit) ?
1235e111ed8SAndrew Rybchenko stat_unit : EFX_MON_STAT_UNIT_UNKNOWN;
1245e111ed8SAndrew Rybchenko }
1255e111ed8SAndrew Rybchenko }
1265e111ed8SAndrew Rybchenko
1275e111ed8SAndrew Rybchenko if (stat_maskp != NULL) {
1285e111ed8SAndrew Rybchenko memcpy(stat_maskp, stat_mask, sizeof (stat_mask));
1295e111ed8SAndrew Rybchenko }
1305e111ed8SAndrew Rybchenko }
1315e111ed8SAndrew Rybchenko
1325e111ed8SAndrew Rybchenko __checkReturn efx_rc_t
mcdi_mon_ev(__in efx_nic_t * enp,__in efx_qword_t * eqp,__out efx_mon_stat_t * idp,__out efx_mon_stat_value_t * valuep)1335e111ed8SAndrew Rybchenko mcdi_mon_ev(
1345e111ed8SAndrew Rybchenko __in efx_nic_t *enp,
1355e111ed8SAndrew Rybchenko __in efx_qword_t *eqp,
1365e111ed8SAndrew Rybchenko __out efx_mon_stat_t *idp,
1375e111ed8SAndrew Rybchenko __out efx_mon_stat_value_t *valuep)
1385e111ed8SAndrew Rybchenko {
1395e111ed8SAndrew Rybchenko efx_mcdi_iface_t *emip = &(enp->en_mcdi.em_emip);
1405e111ed8SAndrew Rybchenko efx_mon_stat_portmask_t port_mask, sensor_port_mask;
1415e111ed8SAndrew Rybchenko uint16_t sensor;
1425e111ed8SAndrew Rybchenko uint16_t state;
1435e111ed8SAndrew Rybchenko uint16_t value;
1445e111ed8SAndrew Rybchenko efx_mon_stat_t id;
1455e111ed8SAndrew Rybchenko efx_rc_t rc;
1465e111ed8SAndrew Rybchenko
1475e111ed8SAndrew Rybchenko EFSYS_ASSERT(emip->emi_port > 0); /* MCDI port number is one-based */
1485e111ed8SAndrew Rybchenko port_mask = MCDI_MON_PORT_MASK(emip);
1495e111ed8SAndrew Rybchenko
1505e111ed8SAndrew Rybchenko sensor = (uint16_t)MCDI_EV_FIELD(eqp, SENSOREVT_MONITOR);
1515e111ed8SAndrew Rybchenko state = (uint16_t)MCDI_EV_FIELD(eqp, SENSOREVT_STATE);
1525e111ed8SAndrew Rybchenko value = (uint16_t)MCDI_EV_FIELD(eqp, SENSOREVT_VALUE);
1535e111ed8SAndrew Rybchenko
1545e111ed8SAndrew Rybchenko /* Hardware must support this MCDI sensor */
1555e111ed8SAndrew Rybchenko EFSYS_ASSERT3U(sensor, <,
1565e111ed8SAndrew Rybchenko (8 * enp->en_nic_cfg.enc_mcdi_sensor_mask_size));
1575e111ed8SAndrew Rybchenko EFSYS_ASSERT((sensor % (MC_CMD_SENSOR_PAGE0_NEXT + 1)) !=
1585e111ed8SAndrew Rybchenko MC_CMD_SENSOR_PAGE0_NEXT);
1595e111ed8SAndrew Rybchenko EFSYS_ASSERT(enp->en_nic_cfg.enc_mcdi_sensor_maskp != NULL);
1605e111ed8SAndrew Rybchenko EFSYS_ASSERT((enp->en_nic_cfg.enc_mcdi_sensor_maskp[
1615e111ed8SAndrew Rybchenko sensor / (MC_CMD_SENSOR_PAGE0_NEXT + 1)] &
1625e111ed8SAndrew Rybchenko (1U << (sensor % (MC_CMD_SENSOR_PAGE0_NEXT + 1)))) != 0);
1635e111ed8SAndrew Rybchenko
1645e111ed8SAndrew Rybchenko /* And we need to understand it, to get port-map */
1655e111ed8SAndrew Rybchenko if (!efx_mon_mcdi_to_efx_stat(sensor, &id)) {
1665e111ed8SAndrew Rybchenko rc = ENOTSUP;
1675e111ed8SAndrew Rybchenko goto fail1;
1685e111ed8SAndrew Rybchenko }
1695e111ed8SAndrew Rybchenko if (!(efx_mon_get_stat_portmap(id, &sensor_port_mask) &&
1705e111ed8SAndrew Rybchenko (port_mask && sensor_port_mask))) {
1715e111ed8SAndrew Rybchenko return (ENODEV);
1725e111ed8SAndrew Rybchenko }
1735e111ed8SAndrew Rybchenko EFSYS_ASSERT(id < EFX_MON_NSTATS);
1745e111ed8SAndrew Rybchenko
1755e111ed8SAndrew Rybchenko *idp = id;
1765e111ed8SAndrew Rybchenko valuep->emsv_value = value;
1775e111ed8SAndrew Rybchenko valuep->emsv_state = state;
1785e111ed8SAndrew Rybchenko
1795e111ed8SAndrew Rybchenko return (0);
1805e111ed8SAndrew Rybchenko
1815e111ed8SAndrew Rybchenko fail1:
1825e111ed8SAndrew Rybchenko EFSYS_PROBE1(fail1, efx_rc_t, rc);
1835e111ed8SAndrew Rybchenko
1845e111ed8SAndrew Rybchenko return (rc);
1855e111ed8SAndrew Rybchenko }
1865e111ed8SAndrew Rybchenko
1875e111ed8SAndrew Rybchenko
1885e111ed8SAndrew Rybchenko static __checkReturn efx_rc_t
efx_mcdi_read_sensors(__in efx_nic_t * enp,__in efsys_mem_t * esmp,__in uint32_t size)1895e111ed8SAndrew Rybchenko efx_mcdi_read_sensors(
1905e111ed8SAndrew Rybchenko __in efx_nic_t *enp,
1915e111ed8SAndrew Rybchenko __in efsys_mem_t *esmp,
1925e111ed8SAndrew Rybchenko __in uint32_t size)
1935e111ed8SAndrew Rybchenko {
1945e111ed8SAndrew Rybchenko efx_mcdi_req_t req;
1955e111ed8SAndrew Rybchenko EFX_MCDI_DECLARE_BUF(payload, MC_CMD_READ_SENSORS_EXT_IN_LEN,
1965e111ed8SAndrew Rybchenko MC_CMD_READ_SENSORS_EXT_OUT_LEN);
1975e111ed8SAndrew Rybchenko uint32_t addr_lo, addr_hi;
1985e111ed8SAndrew Rybchenko efx_rc_t rc;
1995e111ed8SAndrew Rybchenko
2005e111ed8SAndrew Rybchenko if (EFSYS_MEM_SIZE(esmp) < size) {
2015e111ed8SAndrew Rybchenko rc = EINVAL;
2025e111ed8SAndrew Rybchenko goto fail1;
2035e111ed8SAndrew Rybchenko }
2045e111ed8SAndrew Rybchenko
2055e111ed8SAndrew Rybchenko req.emr_cmd = MC_CMD_READ_SENSORS;
2065e111ed8SAndrew Rybchenko req.emr_in_buf = payload;
2075e111ed8SAndrew Rybchenko req.emr_in_length = MC_CMD_READ_SENSORS_EXT_IN_LEN;
2085e111ed8SAndrew Rybchenko req.emr_out_buf = payload;
2095e111ed8SAndrew Rybchenko req.emr_out_length = MC_CMD_READ_SENSORS_EXT_OUT_LEN;
2105e111ed8SAndrew Rybchenko
2115e111ed8SAndrew Rybchenko addr_lo = (uint32_t)(EFSYS_MEM_ADDR(esmp) & 0xffffffff);
2125e111ed8SAndrew Rybchenko addr_hi = (uint32_t)(EFSYS_MEM_ADDR(esmp) >> 32);
2135e111ed8SAndrew Rybchenko
2145e111ed8SAndrew Rybchenko MCDI_IN_SET_DWORD(req, READ_SENSORS_EXT_IN_DMA_ADDR_LO, addr_lo);
2155e111ed8SAndrew Rybchenko MCDI_IN_SET_DWORD(req, READ_SENSORS_EXT_IN_DMA_ADDR_HI, addr_hi);
2165e111ed8SAndrew Rybchenko MCDI_IN_SET_DWORD(req, READ_SENSORS_EXT_IN_LENGTH, size);
2175e111ed8SAndrew Rybchenko
2185e111ed8SAndrew Rybchenko efx_mcdi_execute(enp, &req);
2195e111ed8SAndrew Rybchenko
2205e111ed8SAndrew Rybchenko return (req.emr_rc);
2215e111ed8SAndrew Rybchenko
2225e111ed8SAndrew Rybchenko fail1:
2235e111ed8SAndrew Rybchenko EFSYS_PROBE1(fail1, efx_rc_t, rc);
2245e111ed8SAndrew Rybchenko
2255e111ed8SAndrew Rybchenko return (rc);
2265e111ed8SAndrew Rybchenko }
2275e111ed8SAndrew Rybchenko
2285e111ed8SAndrew Rybchenko static __checkReturn efx_rc_t
efx_mcdi_sensor_info_npages(__in efx_nic_t * enp,__out uint32_t * npagesp)2295e111ed8SAndrew Rybchenko efx_mcdi_sensor_info_npages(
2305e111ed8SAndrew Rybchenko __in efx_nic_t *enp,
2315e111ed8SAndrew Rybchenko __out uint32_t *npagesp)
2325e111ed8SAndrew Rybchenko {
2335e111ed8SAndrew Rybchenko efx_mcdi_req_t req;
2345e111ed8SAndrew Rybchenko EFX_MCDI_DECLARE_BUF(payload, MC_CMD_SENSOR_INFO_EXT_IN_LEN,
2355e111ed8SAndrew Rybchenko MC_CMD_SENSOR_INFO_OUT_LENMAX);
2365e111ed8SAndrew Rybchenko int page;
2375e111ed8SAndrew Rybchenko efx_rc_t rc;
2385e111ed8SAndrew Rybchenko
2395e111ed8SAndrew Rybchenko EFSYS_ASSERT(npagesp != NULL);
2405e111ed8SAndrew Rybchenko
2415e111ed8SAndrew Rybchenko page = 0;
2425e111ed8SAndrew Rybchenko do {
2435e111ed8SAndrew Rybchenko (void) memset(payload, 0, sizeof (payload));
2445e111ed8SAndrew Rybchenko req.emr_cmd = MC_CMD_SENSOR_INFO;
2455e111ed8SAndrew Rybchenko req.emr_in_buf = payload;
2465e111ed8SAndrew Rybchenko req.emr_in_length = MC_CMD_SENSOR_INFO_EXT_IN_LEN;
2475e111ed8SAndrew Rybchenko req.emr_out_buf = payload;
2485e111ed8SAndrew Rybchenko req.emr_out_length = MC_CMD_SENSOR_INFO_OUT_LENMAX;
2495e111ed8SAndrew Rybchenko
2505e111ed8SAndrew Rybchenko MCDI_IN_SET_DWORD(req, SENSOR_INFO_EXT_IN_PAGE, page++);
2515e111ed8SAndrew Rybchenko
2525e111ed8SAndrew Rybchenko efx_mcdi_execute_quiet(enp, &req);
2535e111ed8SAndrew Rybchenko
2545e111ed8SAndrew Rybchenko if (req.emr_rc != 0) {
2555e111ed8SAndrew Rybchenko rc = req.emr_rc;
2565e111ed8SAndrew Rybchenko goto fail1;
2575e111ed8SAndrew Rybchenko }
2585e111ed8SAndrew Rybchenko } while (MCDI_OUT_DWORD(req, SENSOR_INFO_OUT_MASK) &
2595e111ed8SAndrew Rybchenko (1U << MC_CMD_SENSOR_PAGE0_NEXT));
2605e111ed8SAndrew Rybchenko
2615e111ed8SAndrew Rybchenko *npagesp = page;
2625e111ed8SAndrew Rybchenko
2635e111ed8SAndrew Rybchenko return (0);
2645e111ed8SAndrew Rybchenko
2655e111ed8SAndrew Rybchenko fail1:
2665e111ed8SAndrew Rybchenko EFSYS_PROBE1(fail1, efx_rc_t, rc);
2675e111ed8SAndrew Rybchenko
2685e111ed8SAndrew Rybchenko return (rc);
2695e111ed8SAndrew Rybchenko }
2705e111ed8SAndrew Rybchenko
2715e111ed8SAndrew Rybchenko static __checkReturn efx_rc_t
efx_mcdi_sensor_info(__in efx_nic_t * enp,__out_ecount (npages)uint32_t * sensor_maskp,__in size_t npages)2725e111ed8SAndrew Rybchenko efx_mcdi_sensor_info(
2735e111ed8SAndrew Rybchenko __in efx_nic_t *enp,
2745e111ed8SAndrew Rybchenko __out_ecount(npages) uint32_t *sensor_maskp,
2755e111ed8SAndrew Rybchenko __in size_t npages)
2765e111ed8SAndrew Rybchenko {
2775e111ed8SAndrew Rybchenko efx_mcdi_req_t req;
2785e111ed8SAndrew Rybchenko EFX_MCDI_DECLARE_BUF(payload, MC_CMD_SENSOR_INFO_EXT_IN_LEN,
2795e111ed8SAndrew Rybchenko MC_CMD_SENSOR_INFO_OUT_LENMAX);
2805e111ed8SAndrew Rybchenko uint32_t page;
2815e111ed8SAndrew Rybchenko efx_rc_t rc;
2825e111ed8SAndrew Rybchenko
2835e111ed8SAndrew Rybchenko EFSYS_ASSERT(sensor_maskp != NULL);
2845e111ed8SAndrew Rybchenko
2855e111ed8SAndrew Rybchenko if (npages < 1) {
2865e111ed8SAndrew Rybchenko rc = EINVAL;
2875e111ed8SAndrew Rybchenko goto fail1;
2885e111ed8SAndrew Rybchenko }
2895e111ed8SAndrew Rybchenko
2905e111ed8SAndrew Rybchenko for (page = 0; page < npages; page++) {
2915e111ed8SAndrew Rybchenko uint32_t mask;
2925e111ed8SAndrew Rybchenko
2935e111ed8SAndrew Rybchenko (void) memset(payload, 0, sizeof (payload));
2945e111ed8SAndrew Rybchenko req.emr_cmd = MC_CMD_SENSOR_INFO;
2955e111ed8SAndrew Rybchenko req.emr_in_buf = payload;
2965e111ed8SAndrew Rybchenko req.emr_in_length = MC_CMD_SENSOR_INFO_EXT_IN_LEN;
2975e111ed8SAndrew Rybchenko req.emr_out_buf = payload;
2985e111ed8SAndrew Rybchenko req.emr_out_length = MC_CMD_SENSOR_INFO_OUT_LENMAX;
2995e111ed8SAndrew Rybchenko
3005e111ed8SAndrew Rybchenko MCDI_IN_SET_DWORD(req, SENSOR_INFO_EXT_IN_PAGE, page);
3015e111ed8SAndrew Rybchenko
3025e111ed8SAndrew Rybchenko efx_mcdi_execute(enp, &req);
3035e111ed8SAndrew Rybchenko
3045e111ed8SAndrew Rybchenko if (req.emr_rc != 0) {
3055e111ed8SAndrew Rybchenko rc = req.emr_rc;
3065e111ed8SAndrew Rybchenko goto fail2;
3075e111ed8SAndrew Rybchenko }
3085e111ed8SAndrew Rybchenko
3095e111ed8SAndrew Rybchenko mask = MCDI_OUT_DWORD(req, SENSOR_INFO_OUT_MASK);
3105e111ed8SAndrew Rybchenko
3115e111ed8SAndrew Rybchenko if ((page != (npages - 1)) &&
3125e111ed8SAndrew Rybchenko ((mask & (1U << MC_CMD_SENSOR_PAGE0_NEXT)) == 0)) {
3135e111ed8SAndrew Rybchenko rc = EINVAL;
3145e111ed8SAndrew Rybchenko goto fail3;
3155e111ed8SAndrew Rybchenko }
3165e111ed8SAndrew Rybchenko sensor_maskp[page] = mask;
3175e111ed8SAndrew Rybchenko }
3185e111ed8SAndrew Rybchenko
3195e111ed8SAndrew Rybchenko if (sensor_maskp[npages - 1] & (1U << MC_CMD_SENSOR_PAGE0_NEXT)) {
3205e111ed8SAndrew Rybchenko rc = EINVAL;
3215e111ed8SAndrew Rybchenko goto fail4;
3225e111ed8SAndrew Rybchenko }
3235e111ed8SAndrew Rybchenko
3245e111ed8SAndrew Rybchenko return (0);
3255e111ed8SAndrew Rybchenko
3265e111ed8SAndrew Rybchenko fail4:
3275e111ed8SAndrew Rybchenko EFSYS_PROBE(fail4);
3285e111ed8SAndrew Rybchenko fail3:
3295e111ed8SAndrew Rybchenko EFSYS_PROBE(fail3);
3305e111ed8SAndrew Rybchenko fail2:
3315e111ed8SAndrew Rybchenko EFSYS_PROBE(fail2);
3325e111ed8SAndrew Rybchenko fail1:
3335e111ed8SAndrew Rybchenko EFSYS_PROBE1(fail1, efx_rc_t, rc);
3345e111ed8SAndrew Rybchenko
3355e111ed8SAndrew Rybchenko return (rc);
3365e111ed8SAndrew Rybchenko }
3375e111ed8SAndrew Rybchenko
3385e111ed8SAndrew Rybchenko static __checkReturn efx_rc_t
3395e111ed8SAndrew Rybchenko efx_mcdi_sensor_info_page(
3405e111ed8SAndrew Rybchenko __in efx_nic_t *enp,
3415e111ed8SAndrew Rybchenko __in uint32_t page,
3425e111ed8SAndrew Rybchenko __out uint32_t *mask_part,
3435e111ed8SAndrew Rybchenko __out_ecount((sizeof (*mask_part) * 8) - 1)
3445e111ed8SAndrew Rybchenko efx_mon_stat_limits_t *limits)
3455e111ed8SAndrew Rybchenko {
3465e111ed8SAndrew Rybchenko efx_mcdi_req_t req;
3475e111ed8SAndrew Rybchenko EFX_MCDI_DECLARE_BUF(payload, MC_CMD_SENSOR_INFO_EXT_IN_LEN,
3485e111ed8SAndrew Rybchenko MC_CMD_SENSOR_INFO_OUT_LENMAX);
3495e111ed8SAndrew Rybchenko efx_rc_t rc;
3505e111ed8SAndrew Rybchenko uint32_t mask_copy;
3515e111ed8SAndrew Rybchenko efx_dword_t *maskp;
3525e111ed8SAndrew Rybchenko efx_qword_t *limit_info;
3535e111ed8SAndrew Rybchenko
3545e111ed8SAndrew Rybchenko EFSYS_ASSERT(mask_part != NULL);
3555e111ed8SAndrew Rybchenko EFSYS_ASSERT(limits != NULL);
3565e111ed8SAndrew Rybchenko
3575e111ed8SAndrew Rybchenko memset(limits, 0,
3585e111ed8SAndrew Rybchenko ((sizeof (*mask_part) * 8) - 1) * sizeof (efx_mon_stat_limits_t));
3595e111ed8SAndrew Rybchenko
3605e111ed8SAndrew Rybchenko req.emr_cmd = MC_CMD_SENSOR_INFO;
3615e111ed8SAndrew Rybchenko req.emr_in_buf = payload;
3625e111ed8SAndrew Rybchenko req.emr_in_length = MC_CMD_SENSOR_INFO_EXT_IN_LEN;
3635e111ed8SAndrew Rybchenko req.emr_out_buf = payload;
3645e111ed8SAndrew Rybchenko req.emr_out_length = MC_CMD_SENSOR_INFO_OUT_LENMAX;
3655e111ed8SAndrew Rybchenko
3665e111ed8SAndrew Rybchenko MCDI_IN_SET_DWORD(req, SENSOR_INFO_EXT_IN_PAGE, page);
3675e111ed8SAndrew Rybchenko
3685e111ed8SAndrew Rybchenko efx_mcdi_execute(enp, &req);
3695e111ed8SAndrew Rybchenko
3705e111ed8SAndrew Rybchenko rc = req.emr_rc;
3715e111ed8SAndrew Rybchenko
3725e111ed8SAndrew Rybchenko if (rc != 0)
3735e111ed8SAndrew Rybchenko goto fail1;
3745e111ed8SAndrew Rybchenko
3755e111ed8SAndrew Rybchenko EFSYS_ASSERT(sizeof (*limit_info) ==
3765e111ed8SAndrew Rybchenko MC_CMD_SENSOR_INFO_ENTRY_TYPEDEF_LEN);
3775e111ed8SAndrew Rybchenko maskp = MCDI_OUT2(req, efx_dword_t, SENSOR_INFO_OUT_MASK);
3785e111ed8SAndrew Rybchenko limit_info = (efx_qword_t *)(maskp + 1);
3795e111ed8SAndrew Rybchenko
3805e111ed8SAndrew Rybchenko *mask_part = maskp->ed_u32[0];
3815e111ed8SAndrew Rybchenko mask_copy = *mask_part;
3825e111ed8SAndrew Rybchenko
3835e111ed8SAndrew Rybchenko /* Copy an entry for all but the highest bit set. */
3845e111ed8SAndrew Rybchenko while (mask_copy) {
3855e111ed8SAndrew Rybchenko
3865e111ed8SAndrew Rybchenko if (mask_copy == (1U << MC_CMD_SENSOR_PAGE0_NEXT)) {
3875e111ed8SAndrew Rybchenko /* Only next page bit set. */
3885e111ed8SAndrew Rybchenko mask_copy = 0;
3895e111ed8SAndrew Rybchenko } else {
3905e111ed8SAndrew Rybchenko /* Clear lowest bit */
3915e111ed8SAndrew Rybchenko mask_copy = mask_copy & ~(mask_copy ^ (mask_copy - 1));
3925e111ed8SAndrew Rybchenko /* And copy out limit entry into buffer */
3935e111ed8SAndrew Rybchenko limits->emlv_warning_min = EFX_QWORD_FIELD(*limit_info,
3945e111ed8SAndrew Rybchenko MC_CMD_SENSOR_INFO_ENTRY_TYPEDEF_MIN1);
3955e111ed8SAndrew Rybchenko
3965e111ed8SAndrew Rybchenko limits->emlv_warning_max = EFX_QWORD_FIELD(*limit_info,
3975e111ed8SAndrew Rybchenko MC_CMD_SENSOR_INFO_ENTRY_TYPEDEF_MAX1);
3985e111ed8SAndrew Rybchenko
3995e111ed8SAndrew Rybchenko limits->emlv_fatal_min = EFX_QWORD_FIELD(*limit_info,
4005e111ed8SAndrew Rybchenko MC_CMD_SENSOR_INFO_ENTRY_TYPEDEF_MIN2);
4015e111ed8SAndrew Rybchenko
4025e111ed8SAndrew Rybchenko limits->emlv_fatal_max = EFX_QWORD_FIELD(*limit_info,
4035e111ed8SAndrew Rybchenko MC_CMD_SENSOR_INFO_ENTRY_TYPEDEF_MAX2);
4045e111ed8SAndrew Rybchenko
4055e111ed8SAndrew Rybchenko limits++;
4065e111ed8SAndrew Rybchenko limit_info++;
4075e111ed8SAndrew Rybchenko }
4085e111ed8SAndrew Rybchenko }
4095e111ed8SAndrew Rybchenko
4105e111ed8SAndrew Rybchenko return (rc);
4115e111ed8SAndrew Rybchenko
4125e111ed8SAndrew Rybchenko fail1:
4135e111ed8SAndrew Rybchenko EFSYS_PROBE1(fail1, efx_rc_t, rc);
4145e111ed8SAndrew Rybchenko
4155e111ed8SAndrew Rybchenko return (rc);
4165e111ed8SAndrew Rybchenko }
4175e111ed8SAndrew Rybchenko
4185e111ed8SAndrew Rybchenko __checkReturn efx_rc_t
mcdi_mon_stats_update(__in efx_nic_t * enp,__in efsys_mem_t * esmp,__inout_ecount (EFX_MON_NSTATS)efx_mon_stat_value_t * values)4195e111ed8SAndrew Rybchenko mcdi_mon_stats_update(
4205e111ed8SAndrew Rybchenko __in efx_nic_t *enp,
4215e111ed8SAndrew Rybchenko __in efsys_mem_t *esmp,
4225e111ed8SAndrew Rybchenko __inout_ecount(EFX_MON_NSTATS) efx_mon_stat_value_t *values)
4235e111ed8SAndrew Rybchenko {
4245e111ed8SAndrew Rybchenko efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
4255e111ed8SAndrew Rybchenko uint32_t size = encp->enc_mon_stat_dma_buf_size;
4265e111ed8SAndrew Rybchenko efx_rc_t rc;
4275e111ed8SAndrew Rybchenko
4285e111ed8SAndrew Rybchenko if ((rc = efx_mcdi_read_sensors(enp, esmp, size)) != 0)
4295e111ed8SAndrew Rybchenko goto fail1;
4305e111ed8SAndrew Rybchenko
4315e111ed8SAndrew Rybchenko EFSYS_DMA_SYNC_FOR_KERNEL(esmp, 0, size);
4325e111ed8SAndrew Rybchenko
4335e111ed8SAndrew Rybchenko mcdi_mon_decode_stats(enp,
4345e111ed8SAndrew Rybchenko encp->enc_mcdi_sensor_maskp,
4355e111ed8SAndrew Rybchenko encp->enc_mcdi_sensor_mask_size,
4365e111ed8SAndrew Rybchenko esmp, NULL, values);
4375e111ed8SAndrew Rybchenko
4385e111ed8SAndrew Rybchenko return (0);
4395e111ed8SAndrew Rybchenko
4405e111ed8SAndrew Rybchenko fail1:
4415e111ed8SAndrew Rybchenko EFSYS_PROBE1(fail1, efx_rc_t, rc);
4425e111ed8SAndrew Rybchenko
4435e111ed8SAndrew Rybchenko return (rc);
4445e111ed8SAndrew Rybchenko }
4455e111ed8SAndrew Rybchenko
4465e111ed8SAndrew Rybchenko static void
lowest_set_bit(__in uint32_t input_mask,__out uint32_t * lowest_bit_mask,__out uint32_t * lowest_bit_num)4475e111ed8SAndrew Rybchenko lowest_set_bit(
4485e111ed8SAndrew Rybchenko __in uint32_t input_mask,
4495e111ed8SAndrew Rybchenko __out uint32_t *lowest_bit_mask,
4505e111ed8SAndrew Rybchenko __out uint32_t *lowest_bit_num
4515e111ed8SAndrew Rybchenko )
4525e111ed8SAndrew Rybchenko {
4535e111ed8SAndrew Rybchenko uint32_t x;
4545e111ed8SAndrew Rybchenko uint32_t set_bit, bit_index;
4555e111ed8SAndrew Rybchenko
4565e111ed8SAndrew Rybchenko x = (input_mask ^ (input_mask - 1));
4575e111ed8SAndrew Rybchenko set_bit = (x + 1) >> 1;
4585e111ed8SAndrew Rybchenko if (!set_bit)
4595e111ed8SAndrew Rybchenko set_bit = (1U << 31U);
4605e111ed8SAndrew Rybchenko
4615e111ed8SAndrew Rybchenko bit_index = 0;
4625e111ed8SAndrew Rybchenko if (set_bit & 0xFFFF0000)
4635e111ed8SAndrew Rybchenko bit_index += 16;
4645e111ed8SAndrew Rybchenko if (set_bit & 0xFF00FF00)
4655e111ed8SAndrew Rybchenko bit_index += 8;
4665e111ed8SAndrew Rybchenko if (set_bit & 0xF0F0F0F0)
4675e111ed8SAndrew Rybchenko bit_index += 4;
4685e111ed8SAndrew Rybchenko if (set_bit & 0xCCCCCCCC)
4695e111ed8SAndrew Rybchenko bit_index += 2;
4705e111ed8SAndrew Rybchenko if (set_bit & 0xAAAAAAAA)
4715e111ed8SAndrew Rybchenko bit_index += 1;
4725e111ed8SAndrew Rybchenko
4735e111ed8SAndrew Rybchenko *lowest_bit_mask = set_bit;
4745e111ed8SAndrew Rybchenko *lowest_bit_num = bit_index;
4755e111ed8SAndrew Rybchenko }
4765e111ed8SAndrew Rybchenko
4775e111ed8SAndrew Rybchenko __checkReturn efx_rc_t
mcdi_mon_limits_update(__in efx_nic_t * enp,__inout_ecount (EFX_MON_NSTATS)efx_mon_stat_limits_t * values)4785e111ed8SAndrew Rybchenko mcdi_mon_limits_update(
4795e111ed8SAndrew Rybchenko __in efx_nic_t *enp,
4805e111ed8SAndrew Rybchenko __inout_ecount(EFX_MON_NSTATS) efx_mon_stat_limits_t *values)
4815e111ed8SAndrew Rybchenko {
4825e111ed8SAndrew Rybchenko efx_rc_t rc;
4835e111ed8SAndrew Rybchenko uint32_t page;
4845e111ed8SAndrew Rybchenko uint32_t page_mask;
4855e111ed8SAndrew Rybchenko uint32_t limit_index;
4865e111ed8SAndrew Rybchenko efx_mon_stat_limits_t limits[sizeof (page_mask) * 8];
4875e111ed8SAndrew Rybchenko efx_mon_stat_t stat;
4885e111ed8SAndrew Rybchenko
4895e111ed8SAndrew Rybchenko page = 0;
4905e111ed8SAndrew Rybchenko page--;
4915e111ed8SAndrew Rybchenko do {
4925e111ed8SAndrew Rybchenko page++;
4935e111ed8SAndrew Rybchenko
4945e111ed8SAndrew Rybchenko rc = efx_mcdi_sensor_info_page(enp, page, &page_mask, limits);
4955e111ed8SAndrew Rybchenko if (rc != 0)
4965e111ed8SAndrew Rybchenko goto fail1;
4975e111ed8SAndrew Rybchenko
4985e111ed8SAndrew Rybchenko limit_index = 0;
4995e111ed8SAndrew Rybchenko while (page_mask) {
5005e111ed8SAndrew Rybchenko uint32_t set_bit;
5015e111ed8SAndrew Rybchenko uint32_t page_index;
5025e111ed8SAndrew Rybchenko uint32_t mcdi_index;
5035e111ed8SAndrew Rybchenko
5045e111ed8SAndrew Rybchenko if (page_mask == (1U << MC_CMD_SENSOR_PAGE0_NEXT))
5055e111ed8SAndrew Rybchenko break;
5065e111ed8SAndrew Rybchenko
5075e111ed8SAndrew Rybchenko lowest_set_bit(page_mask, &set_bit, &page_index);
5085e111ed8SAndrew Rybchenko page_mask = page_mask & ~set_bit;
5095e111ed8SAndrew Rybchenko
5105e111ed8SAndrew Rybchenko mcdi_index =
5115e111ed8SAndrew Rybchenko page_index + (sizeof (page_mask) * 8 * page);
5125e111ed8SAndrew Rybchenko
5135e111ed8SAndrew Rybchenko /*
5145e111ed8SAndrew Rybchenko * This can fail if MCDI reports newer stats than the
5155e111ed8SAndrew Rybchenko * drivers understand, or the bit is the next page bit.
5165e111ed8SAndrew Rybchenko *
5175e111ed8SAndrew Rybchenko * Driver needs to be tolerant of this.
5185e111ed8SAndrew Rybchenko */
5195e111ed8SAndrew Rybchenko if (!efx_mon_mcdi_to_efx_stat(mcdi_index, &stat))
5205e111ed8SAndrew Rybchenko continue;
5215e111ed8SAndrew Rybchenko
5225e111ed8SAndrew Rybchenko values[stat] = limits[limit_index];
5235e111ed8SAndrew Rybchenko limit_index++;
5245e111ed8SAndrew Rybchenko }
5255e111ed8SAndrew Rybchenko
5265e111ed8SAndrew Rybchenko } while (page_mask & (1U << MC_CMD_SENSOR_PAGE0_NEXT));
5275e111ed8SAndrew Rybchenko
5285e111ed8SAndrew Rybchenko return (rc);
5295e111ed8SAndrew Rybchenko
5305e111ed8SAndrew Rybchenko fail1:
5315e111ed8SAndrew Rybchenko EFSYS_PROBE1(fail1, efx_rc_t, rc);
5325e111ed8SAndrew Rybchenko
5335e111ed8SAndrew Rybchenko return (rc);
5345e111ed8SAndrew Rybchenko }
5355e111ed8SAndrew Rybchenko
5365e111ed8SAndrew Rybchenko __checkReturn efx_rc_t
mcdi_mon_cfg_build(__in efx_nic_t * enp)5375e111ed8SAndrew Rybchenko mcdi_mon_cfg_build(
5385e111ed8SAndrew Rybchenko __in efx_nic_t *enp)
5395e111ed8SAndrew Rybchenko {
5405e111ed8SAndrew Rybchenko efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
5415e111ed8SAndrew Rybchenko uint32_t npages;
5425e111ed8SAndrew Rybchenko efx_rc_t rc;
5435e111ed8SAndrew Rybchenko
5445e111ed8SAndrew Rybchenko switch (enp->en_family) {
5455e111ed8SAndrew Rybchenko #if EFSYS_OPT_SIENA
5465e111ed8SAndrew Rybchenko case EFX_FAMILY_SIENA:
5475e111ed8SAndrew Rybchenko encp->enc_mon_type = EFX_MON_SFC90X0;
5485e111ed8SAndrew Rybchenko break;
5495e111ed8SAndrew Rybchenko #endif
5505e111ed8SAndrew Rybchenko #if EFSYS_OPT_HUNTINGTON
5515e111ed8SAndrew Rybchenko case EFX_FAMILY_HUNTINGTON:
5525e111ed8SAndrew Rybchenko encp->enc_mon_type = EFX_MON_SFC91X0;
5535e111ed8SAndrew Rybchenko break;
5545e111ed8SAndrew Rybchenko #endif
5555e111ed8SAndrew Rybchenko #if EFSYS_OPT_MEDFORD
5565e111ed8SAndrew Rybchenko case EFX_FAMILY_MEDFORD:
5575e111ed8SAndrew Rybchenko encp->enc_mon_type = EFX_MON_SFC92X0;
5585e111ed8SAndrew Rybchenko break;
5595e111ed8SAndrew Rybchenko #endif
5605e111ed8SAndrew Rybchenko #if EFSYS_OPT_MEDFORD2
5615e111ed8SAndrew Rybchenko case EFX_FAMILY_MEDFORD2:
5625e111ed8SAndrew Rybchenko encp->enc_mon_type = EFX_MON_SFC92X0;
5635e111ed8SAndrew Rybchenko break;
5645e111ed8SAndrew Rybchenko #endif
5655e111ed8SAndrew Rybchenko default:
5665e111ed8SAndrew Rybchenko rc = EINVAL;
5675e111ed8SAndrew Rybchenko goto fail1;
5685e111ed8SAndrew Rybchenko }
5695e111ed8SAndrew Rybchenko
5705e111ed8SAndrew Rybchenko /* Get mc sensor mask size */
5715e111ed8SAndrew Rybchenko npages = 0;
5725e111ed8SAndrew Rybchenko if ((rc = efx_mcdi_sensor_info_npages(enp, &npages)) != 0)
5735e111ed8SAndrew Rybchenko goto fail2;
5745e111ed8SAndrew Rybchenko
5755e111ed8SAndrew Rybchenko encp->enc_mon_stat_dma_buf_size = npages * EFX_MON_STATS_PAGE_SIZE;
5765e111ed8SAndrew Rybchenko encp->enc_mcdi_sensor_mask_size = npages * sizeof (uint32_t);
5775e111ed8SAndrew Rybchenko
5785e111ed8SAndrew Rybchenko /* Allocate mc sensor mask */
5795e111ed8SAndrew Rybchenko EFSYS_KMEM_ALLOC(enp->en_esip,
5805e111ed8SAndrew Rybchenko encp->enc_mcdi_sensor_mask_size,
5815e111ed8SAndrew Rybchenko encp->enc_mcdi_sensor_maskp);
5825e111ed8SAndrew Rybchenko
5835e111ed8SAndrew Rybchenko if (encp->enc_mcdi_sensor_maskp == NULL) {
5845e111ed8SAndrew Rybchenko rc = ENOMEM;
5855e111ed8SAndrew Rybchenko goto fail3;
5865e111ed8SAndrew Rybchenko }
5875e111ed8SAndrew Rybchenko
5885e111ed8SAndrew Rybchenko /* Read mc sensor mask */
5895e111ed8SAndrew Rybchenko if ((rc = efx_mcdi_sensor_info(enp,
5905e111ed8SAndrew Rybchenko encp->enc_mcdi_sensor_maskp,
5915e111ed8SAndrew Rybchenko npages)) != 0)
5925e111ed8SAndrew Rybchenko goto fail4;
5935e111ed8SAndrew Rybchenko
5945e111ed8SAndrew Rybchenko /* Build monitor statistics mask */
5955e111ed8SAndrew Rybchenko mcdi_mon_decode_stats(enp,
5965e111ed8SAndrew Rybchenko encp->enc_mcdi_sensor_maskp,
5975e111ed8SAndrew Rybchenko encp->enc_mcdi_sensor_mask_size,
5985e111ed8SAndrew Rybchenko NULL, encp->enc_mon_stat_mask, NULL);
5995e111ed8SAndrew Rybchenko
6005e111ed8SAndrew Rybchenko return (0);
6015e111ed8SAndrew Rybchenko
6025e111ed8SAndrew Rybchenko fail4:
6035e111ed8SAndrew Rybchenko EFSYS_PROBE(fail4);
6045e111ed8SAndrew Rybchenko EFSYS_KMEM_FREE(enp->en_esip,
6055e111ed8SAndrew Rybchenko encp->enc_mcdi_sensor_mask_size,
6065e111ed8SAndrew Rybchenko encp->enc_mcdi_sensor_maskp);
6075e111ed8SAndrew Rybchenko
6085e111ed8SAndrew Rybchenko fail3:
6095e111ed8SAndrew Rybchenko EFSYS_PROBE(fail3);
6105e111ed8SAndrew Rybchenko
6115e111ed8SAndrew Rybchenko fail2:
6125e111ed8SAndrew Rybchenko EFSYS_PROBE(fail2);
6135e111ed8SAndrew Rybchenko
6145e111ed8SAndrew Rybchenko fail1:
6155e111ed8SAndrew Rybchenko EFSYS_PROBE1(fail1, efx_rc_t, rc);
6165e111ed8SAndrew Rybchenko
6175e111ed8SAndrew Rybchenko return (rc);
6185e111ed8SAndrew Rybchenko }
6195e111ed8SAndrew Rybchenko
6205e111ed8SAndrew Rybchenko void
mcdi_mon_cfg_free(__in efx_nic_t * enp)6215e111ed8SAndrew Rybchenko mcdi_mon_cfg_free(
6225e111ed8SAndrew Rybchenko __in efx_nic_t *enp)
6235e111ed8SAndrew Rybchenko {
6245e111ed8SAndrew Rybchenko efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
6255e111ed8SAndrew Rybchenko
6265e111ed8SAndrew Rybchenko if (encp->enc_mcdi_sensor_maskp != NULL) {
6275e111ed8SAndrew Rybchenko EFSYS_KMEM_FREE(enp->en_esip,
6285e111ed8SAndrew Rybchenko encp->enc_mcdi_sensor_mask_size,
6295e111ed8SAndrew Rybchenko encp->enc_mcdi_sensor_maskp);
6305e111ed8SAndrew Rybchenko }
6315e111ed8SAndrew Rybchenko }
6325e111ed8SAndrew Rybchenko
6335e111ed8SAndrew Rybchenko
6345e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MON_STATS */
6355e111ed8SAndrew Rybchenko
6365e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MON_MCDI */
637