From nobody Sat Sep 26 13:47:20 2026 Received: from mail-pg1-f182.google.com (mail-pg1-f182.google.com [209.85.215.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EAB7939CCEA for ; Mon, 31 Aug 2026 21:22:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788211365; cv=none; b=UI3hDmvpeDDo7O/+8QX8VTDjnHcENWqgAHMIF8dV7CytyNkrvuinmDDsHUj+D14aMyVL6Gg7OqLu5jz1v950YF1HTPWlRYI1IG3SuwXvxLevefLNnLOCop4xq/PHjE4+xit+9doNO65Q2eVpT3tLqstZJaC2eHByPZdL+6Is6gE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788211365; c=relaxed/simple; bh=Vi3BmT7ZDkiqyokg+wo6JFBFy7A29xrg2kuZJqXCm60=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=YmP3MHikRe2P5jqJziqX7fpRTQlEWSUn1OJ36rvyQ9pcu5AfrHK9uz7eXPEgQpgRLCW0BPkFhB0SDGK9g7wpNBjkIJTuoT/VT/d3AeNt+QvNnC5yoc7KHzf1oQvhr5YkkjYwD6oWLiR8JUb3VRLWV78KJq5XcyfC4p6d8I5MfXA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=cg0VjcUA; arc=none smtp.client-ip=209.85.215.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="cg0VjcUA" Received: by mail-pg1-f182.google.com with SMTP id 41be03b00d2f7-cc11a905ba5so209426a12.2 for ; Mon, 31 Aug 2026 14:22:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788211361; x=1788816161; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=sfnOswr7eo1XQosDaF0vBD6HXJXxp8BEfMaGl2218a4=; b=cg0VjcUA3pLPu9JrlwsAekoYNmHvnS0VVpBiV1/xrFmBYrEcnPOHo03hjd5HelaJ0S o9FZJo3zHuyFJXGLfOXLgpmA5mSV7ShPfsuCkrXX4lRkUoMTlBGxw1z/bPlBcRW7Oyao HhG8hN/6G8FI0vfjq2cdykgX/lxyLR+fELXxiztq6breemxMQRZ60Qk0WKLcjhZQle4Q nsW/XgmVuDXdLgFhG3tOEp6vkEC8+ig5sWCd0xSw3r2y6ZrZ2Bw60rv/rFKZhx2QEFzB N25fRIYj6gNYEOs4S1gEpb7yf2tnZydx0Zr73z3SRKKjz0nicu4DmJhCGC/6Cr6mPGnV +oJA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788211361; x=1788816161; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=sfnOswr7eo1XQosDaF0vBD6HXJXxp8BEfMaGl2218a4=; b=OtluUv/dzzC+BeYE8gsa862CxORCgdDcHSLWdsHquPTtLnnVb6U+QOkjQlCNJU8ZzL 6Ecv2VkMuKsT175Q1ws2klk/BGT8iER0HNx24GfWT8cDVzxPFMAdg88Hhf/qbnH0YCsc 6PCq7EutRxzhnK0Pyuxm3yMnZYc2TWIX4cfNzlMva+THZ0KVwQgoG800WOt/usFZi7lD Ig/wzTm+LWO3tE6YWmuRBmQgEk2U/jP1bWY/bKOMzXt7WfDRAQpzQQ08ypHGJmEBBfXx LGuZ23LjvPTFbp7ud6XfbQYr6gLPtEj84HBEF4KksIuYjaryYFW27NZtPxw5YMVoBijy rvBQ== X-Forwarded-Encrypted: i=1; AHgh+RoOiu+6laCiVDOB3EeHzSjmXYGjj/7sebi7QdLkMEOaJsIXM2ZVQu7zPhWgf1k5Eg3F9indj6gvCn+fbQs=@vger.kernel.org X-Gm-Message-State: AFuF++kRU+Dul/T+/tqvG+ah1oe870GZYPuYXd2uu04N16k9129csxE9 HNYymPWslPh9S9972e+yYoqWaj5yorVcyimZuDulHUPMre26vUfJBtDB X-Gm-Gg: AR+sD10csR5RTbfoz47Lo1FlUUaeR1kpBtstk+u3ap/TqvzW94ldSU7m4hWdJBeXgso FSI9kC+VVcgE1TLq2iE4hWiYoIfcCWGHDWT7zpPaWOWQA3XJMCBMs5W9DmpYROYJnXOymLuY8Xq 4hGnbhrZiY9aIVoHeLRD8wEyZelMpWTdM8dZZBaG84KFVV1Q1jD4VtVsrvS3X+jqPL2Lx1YZmsB p0CVgLu2AUl9s+XIdCqRJTW3tcAXrUYJzAwjlk7b1ARnWvCReeeJBDwPWp9M/eL2kYvjxnpAoRu VENMHxLlOLxYzpAct/oU7Iy1ScpwQH2xoSXkZu7uKIu98YvkOG9QfmlRHM0iw90dSYHwbSWIGuM oIGSoBfprvIN3FTdTmAVVLgh0X2OgfPpSIUAci6UJGKCrCrmP33l+TXLjPWkCDkB8RqZ8rUSTNQ l0AQBAh/qxJYzitvFbPA3l097YCnTQtAGbDog98yKZ1zcr1HQfNGxsoxWEzUOYoOjlD9IZSRvfK MGJCQ== X-Received: by 2002:a05:6a21:8901:b0:3d3:adbf:777c with SMTP id adf61e73a8af0-3d3adbf8147mr26713171637.24.1788211361126; Mon, 31 Aug 2026 14:22:41 -0700 (PDT) Received: from localhost ([2620:10d:c090:500::6:bac7]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-3286f9e2a95sm31080594eec.23.2026.08.31.14.22.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 31 Aug 2026 14:22:40 -0700 (PDT) From: Zinc Lim To: alexanderduyck@fb.com, kuba@kernel.org, andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com, pabeni@redhat.com, linux@roeck-us.net, horms@kernel.org, mohsin.bashr@gmail.com Cc: kernel-team@meta.com, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-hwmon@vger.kernel.org, zinclim@meta.com, limzhineng2@gmail.com Subject: [PATCH net-next v2 1/6] eth: fbnic: move sensor read logic out of fbnic_mac Date: Mon, 31 Aug 2026 14:22:29 -0700 Message-ID: <20260831212234.1212971-2-limzhineng2@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260831212234.1212971-1-limzhineng2@gmail.com> References: <20260831212234.1212971-1-limzhineng2@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The sensor read lived behind the fbnic_mac get_sensor op, but it is only ever used by the hwmon subsystem. Move the read into fbnic_hwmon.c and call it directly there, closer to where it is used, and drop the now-unused get_sensor op from struct fbnic_mac. No functional change. Signed-off-by: Zinc Lim --- drivers/net/ethernet/meta/fbnic/fbnic_hwmon.c | 56 ++++++++++++++++++- drivers/net/ethernet/meta/fbnic/fbnic_mac.c | 55 ------------------ drivers/net/ethernet/meta/fbnic/fbnic_mac.h | 2 - 3 files changed, 54 insertions(+), 59 deletions(-) diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_hwmon.c b/drivers/net/et= hernet/meta/fbnic/fbnic_hwmon.c index def8598aceec..6c8c66ab86c1 100644 --- a/drivers/net/ethernet/meta/fbnic/fbnic_hwmon.c +++ b/drivers/net/ethernet/meta/fbnic/fbnic_hwmon.c @@ -28,15 +28,67 @@ static umode_t fbnic_hwmon_is_visible(const void *drvda= ta, return 0; } =20 +static int fbnic_hwmon_sensor_read(struct fbnic_dev *fbd, int id, long *va= l) +{ + struct fbnic_fw_completion *fw_cmpl; + int err =3D 0; + s32 *sensor; + + fw_cmpl =3D fbnic_fw_alloc_cmpl(FBNIC_TLV_MSG_ID_TSENE_READ_RESP); + if (!fw_cmpl) + return -ENOMEM; + + switch (id) { + case FBNIC_SENSOR_TEMP: + sensor =3D &fw_cmpl->u.tsene.millidegrees; + break; + case FBNIC_SENSOR_VOLTAGE: + sensor =3D &fw_cmpl->u.tsene.millivolts; + break; + default: + err =3D -EINVAL; + goto exit_free; + } + + err =3D fbnic_fw_xmit_tsene_read_msg(fbd, fw_cmpl); + if (err) { + dev_err(fbd->dev, + "Failed to transmit TSENE read msg, err %d\n", + err); + goto exit_free; + } + + if (!wait_for_completion_timeout(&fw_cmpl->done, 10 * HZ)) { + dev_err(fbd->dev, "Timed out waiting for TSENE read\n"); + err =3D -ETIMEDOUT; + goto exit_cleanup; + } + + /* Handle error returned by firmware */ + if (fw_cmpl->result) { + err =3D fw_cmpl->result; + dev_err(fbd->dev, "%s: Firmware returned error %d\n", + __func__, err); + goto exit_cleanup; + } + + *val =3D *sensor; +exit_cleanup: + fbnic_mbx_clear_cmpl(fbd, fw_cmpl); +exit_free: + fbnic_fw_put_cmpl(fw_cmpl); + + return err; +} + static int fbnic_hwmon_read(struct device *dev, enum hwmon_sensor_types ty= pe, u32 attr, int channel, long *val) { struct fbnic_dev *fbd =3D dev_get_drvdata(dev); - const struct fbnic_mac *mac =3D fbd->mac; int id; =20 id =3D fbnic_hwmon_sensor_id(type); - return id < 0 ? id : mac->get_sensor(fbd, id, val); + return id < 0 ? id : fbnic_hwmon_sensor_read(fbd, id, val); } =20 static const struct hwmon_ops fbnic_hwmon_ops =3D { diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_mac.c b/drivers/net/ethe= rnet/meta/fbnic/fbnic_mac.c index 53b7a938b4c2..fba2e2efaeb8 100644 --- a/drivers/net/ethernet/meta/fbnic/fbnic_mac.c +++ b/drivers/net/ethernet/meta/fbnic/fbnic_mac.c @@ -899,60 +899,6 @@ fbnic_mac_get_rmon_stats(struct fbnic_dev *fbd, bool r= eset, TMI_STAT_TX_PACKET_9217_MAX_BYTES); } =20 -static int fbnic_mac_get_sensor_asic(struct fbnic_dev *fbd, int id, - long *val) -{ - struct fbnic_fw_completion *fw_cmpl; - int err =3D 0; - s32 *sensor; - - fw_cmpl =3D fbnic_fw_alloc_cmpl(FBNIC_TLV_MSG_ID_TSENE_READ_RESP); - if (!fw_cmpl) - return -ENOMEM; - - switch (id) { - case FBNIC_SENSOR_TEMP: - sensor =3D &fw_cmpl->u.tsene.millidegrees; - break; - case FBNIC_SENSOR_VOLTAGE: - sensor =3D &fw_cmpl->u.tsene.millivolts; - break; - default: - err =3D -EINVAL; - goto exit_free; - } - - err =3D fbnic_fw_xmit_tsene_read_msg(fbd, fw_cmpl); - if (err) { - dev_err(fbd->dev, - "Failed to transmit TSENE read msg, err %d\n", - err); - goto exit_free; - } - - if (!wait_for_completion_timeout(&fw_cmpl->done, 10 * HZ)) { - dev_err(fbd->dev, "Timed out waiting for TSENE read\n"); - err =3D -ETIMEDOUT; - goto exit_cleanup; - } - - /* Handle error returned by firmware */ - if (fw_cmpl->result) { - err =3D fw_cmpl->result; - dev_err(fbd->dev, "%s: Firmware returned error %d\n", - __func__, err); - goto exit_cleanup; - } - - *val =3D *sensor; -exit_cleanup: - fbnic_mbx_clear_cmpl(fbd, fw_cmpl); -exit_free: - fbnic_fw_put_cmpl(fw_cmpl); - - return err; -} - static const struct fbnic_mac fbnic_mac_asic =3D { .init_regs =3D fbnic_mac_init_regs, .get_link =3D fbnic_mac_get_link, @@ -966,7 +912,6 @@ static const struct fbnic_mac fbnic_mac_asic =3D { .get_rmon_stats =3D fbnic_mac_get_rmon_stats, .link_down =3D fbnic_mac_link_down_asic, .link_up =3D fbnic_mac_link_up_asic, - .get_sensor =3D fbnic_mac_get_sensor_asic, }; =20 /** diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_mac.h b/drivers/net/ethe= rnet/meta/fbnic/fbnic_mac.h index 10f30e0e8f69..bde2daa65645 100644 --- a/drivers/net/ethernet/meta/fbnic/fbnic_mac.h +++ b/drivers/net/ethernet/meta/fbnic/fbnic_mac.h @@ -137,8 +137,6 @@ struct fbnic_mac { =20 void (*link_down)(struct fbnic_dev *fbd); void (*link_up)(struct fbnic_dev *fbd, bool tx_pause, bool rx_pause); - - int (*get_sensor)(struct fbnic_dev *fbd, int id, long *val); }; =20 int fbnic_mac_init(struct fbnic_dev *fbd); --=20 2.53.0-Meta From nobody Sat Sep 26 13:47:20 2026 Received: from mail-pl1-f175.google.com (mail-pl1-f175.google.com [209.85.214.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1FF6A39CD1F for ; Mon, 31 Aug 2026 21:22:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788211366; cv=none; b=ikXW/AOAmhNH3Wl9iAQhbREEMLDyDVTqn8UZof28v05PWV7JqJ0w8QBv/zEBfNql4pMMRiyFuWbxyeUI5+r9eWE1oGmygfvRWQlm3LVY7agYSQKelMqO5KDnudTn719Xv5HFiMrn1QCjXWi+69gfFHtZ3UNAQO4RoVT7f2FLMV8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788211366; c=relaxed/simple; bh=VylVE97urOnGo1fKhA1IwM8dNjVc6rVPycHxhapEvGA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=lCKcqOvNW8YvI/xHlrEVtwtt/jje+qN98fcU8zLF0Bu6bDzfrNrSR8El8vXbRSy2G+j81MbR0QZ7Dy9soKuvODkP7pRH9rtQR7CQjkbXxqlIrKVWtmZVAIUnzRKANPlVxsG1pTF/utIGCL4xb4nMoCCTuosdyfOfhbYdz12+gD4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=EYcIZQnG; arc=none smtp.client-ip=209.85.214.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="EYcIZQnG" Received: by mail-pl1-f175.google.com with SMTP id d9443c01a7336-2ceab75934dso47160425ad.2 for ; Mon, 31 Aug 2026 14:22:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788211363; x=1788816163; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=5mP6wFrKPhYjd/5KHULwyWUdonzv0xy3jN9195/5g2U=; b=EYcIZQnGJtMS0MpMPLpanWN2p3GAJtGW8WuCGaFlnXiaZ37hQ1f1fXqmzs/9rZRWgK VS6LHbR6bn9cQmeqdN4NJMMpLuyXqoOy50/VnxLCFf6aXUx5ZrSeEPhnnZabfKdjMOnW i0lgC2tMmAWG8a1qRJHziRpln6r43p9yQARde09Qn838yznOS/Us+1EErZtdhcd68ZvC nmie1m/RPlCTxiXIy9faJ48rvXujXK2wbhIGum6yBwG54jyEQBsrS9ALo1RZJ33aDzZa L1PuLY/SDkoW1gqs2QC7cO0SJr6tAF/WCllorAh951QKaBpgdLHMcflkQ9DswjkqZg8F PMwA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788211363; x=1788816163; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=5mP6wFrKPhYjd/5KHULwyWUdonzv0xy3jN9195/5g2U=; b=RVidqo6t/GvkXGIjV8Cho7Ct9M9kS8JvTuHXkaMkiWCO6J27fLhkhoR8gbHyUIkcpf OCpRq/7+4bszs0KnIMhKoGEpjpNtrifBNNYQoBPXZbMSIDbWNb5qdc5lU4CirbedhW6p u6NIKZNxl954WmDWkSOvsgm9bgcSBS8sSVFtMqAxEEPNsXjDE+1lQAywCK+7R2DoMoLU 0qEQTFs1HU0prCnC1vTfKz5jxTCp257TDbOqsxPmhQ4ITXJczBBiYz3lPMj1c0o5ShJR tBRTc3cLS5r+1S0dcE3XVEGzS8NltxKAC/zYsxzM0hXDOlifM/Cz7RruCRNvwM4/HI3l voCA== X-Forwarded-Encrypted: i=1; AKwUvBw1ZSNC6SkS36dKLhXvV9wxSW/daO2VFA3xSzcIQ5afLHNViCt3DtSa8zw/7HUuP7qxhUz/3ivvfJpQRK4=@vger.kernel.org X-Gm-Message-State: AFuF++kgXwKZys9oXo64AQeFtX4OLOmSzqLghhWtVhWK4ej7qe0QFO8+ dl3Nui0Ha5TNBcs4qFAB7pmU2kEe4gJCwt2sM2p44vDs7haY2gSau1Vi X-Gm-Gg: AYBFou3nVsf/tKJBfrmfULaK9EmPaIqju/sYulJZecN4/LA5OVDNpMmcY4EOQtuSDWO 2LK2fwKSCV84/UB6JgkPsn7w/PEioGl6uDK6jqQUTFlCG3ASmRGsOnU+/++B/GSkp2Ogt1cx/AN 1NnNI1MQjK8hsiiTTxXN892ASrM6bZvYGA/hU7HytmI8pv6WwJhQAvbMFGbuPnFr39+4JxE6EZ/ Pv1Kpz0AmkrJlzDObSySE4HYrMwJs4U7g8G0blY5M1WFt06kUr4G11TXOcfl7ZxM8hx3IG41HtK vzov5XkNr2h3o+8yUD59gaZ5pJ7SdO0n2AEysZRVAR6LGPAGp9V89PSAzwheOQeMWd4uPqbOOAM 1+uOJMtOFVieqb06iLPhXb7oVmija5eDfcgTZUiqS+oEU6Dw8eRGtJq/QuI5/DTfYFTLfdMSMuH ifab4bvTWCMb3Pdu9QG7mRH88nt+p1tbQPP9852d1IYSwEsZ5yuJfdl4BdO03yYP0VjQU= X-Received: by 2002:a17:903:196b:b0:2d5:ccb7:12c3 with SMTP id d9443c01a7336-2d74dc2b30amr430405185ad.2.1788211363412; Mon, 31 Aug 2026 14:22:43 -0700 (PDT) Received: from localhost ([2620:10d:c090:500::6:bac7]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-3286f9595bbsm37102538eec.14.2026.08.31.14.22.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 31 Aug 2026 14:22:42 -0700 (PDT) From: Zinc Lim To: alexanderduyck@fb.com, kuba@kernel.org, andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com, pabeni@redhat.com, linux@roeck-us.net, horms@kernel.org, mohsin.bashr@gmail.com Cc: kernel-team@meta.com, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-hwmon@vger.kernel.org, zinclim@meta.com, limzhineng2@gmail.com Subject: [PATCH net-next v2 2/6] eth: fbnic: expose all hwmon attributes unconditionally as read-only Date: Mon, 31 Aug 2026 14:22:30 -0700 Message-ID: <20260831212234.1212971-3-limzhineng2@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260831212234.1212971-1-limzhineng2@gmail.com> References: <20260831212234.1212971-1-limzhineng2@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" All fbnic hwmon attributes are read-only and always present, so fbnic_hwmon_is_visible() can simply return 0444 for everything instead of matching on the sensor type and attribute. This also prepares for the threshold and alarm attributes added in the following patches: they are exposed unconditionally and reads return attribute values. Signed-off-by: Zinc Lim --- drivers/net/ethernet/meta/fbnic/fbnic_hwmon.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_hwmon.c b/drivers/net/et= hernet/meta/fbnic/fbnic_hwmon.c index 6c8c66ab86c1..38bb26cb8e6c 100644 --- a/drivers/net/ethernet/meta/fbnic/fbnic_hwmon.c +++ b/drivers/net/ethernet/meta/fbnic/fbnic_hwmon.c @@ -20,12 +20,7 @@ static umode_t fbnic_hwmon_is_visible(const void *drvdat= a, enum hwmon_sensor_types type, u32 attr, int channel) { - if (type =3D=3D hwmon_temp && attr =3D=3D hwmon_temp_input) - return 0444; - if (type =3D=3D hwmon_in && attr =3D=3D hwmon_in_input) - return 0444; - - return 0; + return 0444; } =20 static int fbnic_hwmon_sensor_read(struct fbnic_dev *fbd, int id, long *va= l) --=20 2.53.0-Meta From nobody Sat Sep 26 13:47:20 2026 Received: from mail-pg1-f179.google.com (mail-pg1-f179.google.com [209.85.215.179]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7BB3C39DBD3 for ; Mon, 31 Aug 2026 21:22:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788211368; cv=none; b=OGR7g0e6alxZLi4tV97iVisHQ3Oaj29aOt9fYsR4FrWKKVcHwh7etjtHrBwkzKFYfjmDlX8nm1g4cbj1jtESdeSriVK9rm3n1HPEOj5fozdhWeTw48rkcgXOC9Ez1hCJWYxsimAaQt304MEGjXLufjwoJjfhrD6Ye4GQUWCGiKg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788211368; c=relaxed/simple; bh=F4Vn7w9he8XvFaQgePxC49jos8Ircb4h09eWzonsEE8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=S2HzfnXgMiHBmLB6Gk041MsKPcah301eQ4rY1nWGA4YaZUNF90cLEgdBtmm+9oOmN3mCtOlxTfPJZg3Ewp5utaoonKouTYOdtdt56D6VSt5YBAvvW0crgelrOxvmOdeID0JUPVDvq2NUu+DOEe/Ad5gohgCDYAg7Ka7U96op/Gc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=PCsKBYDa; arc=none smtp.client-ip=209.85.215.179 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="PCsKBYDa" Received: by mail-pg1-f179.google.com with SMTP id 41be03b00d2f7-cc11a905ba5so209498a12.2 for ; Mon, 31 Aug 2026 14:22:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788211365; x=1788816165; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=Q4WjCM0YGYpG6uGbEGVqjVtxdg84mLbv5nOzooF+Ac4=; b=PCsKBYDaoMFq2uumxlEqSpdmVyzS5arP5/5Co6EJUnXoQE9/mfW46nH286ghl4Gi2/ uFl8ccJ4yM+EjfwrODLVVRIU43x2CC4JyyZU4ge5n76/KCAqZolQXuKWGnM6TH7tfK3s RfxTWx3lzu5lPSKBVz2ieAFCJ2ggEujraTU8gx4nTZ0gGI4Gn/j7rWwdDBdxkib0sptT 9/AUwKLC6dzIWEAP+5BOFbmKt4zgA0eBiAnsIpSFa69t0MwtbOVrZdECV4xPAEVR/qym QU1UsunaFblktiDNvvcb5CHdPQz+AbEpEzCytYVJ4aEshGtlKL8WgOTOTLm1vap5KDlh 3tiw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788211365; x=1788816165; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=Q4WjCM0YGYpG6uGbEGVqjVtxdg84mLbv5nOzooF+Ac4=; b=P9y0wYFz+0VkkFhvk+PPyN0UuFCnUc5ZsPJmXtiBYiN8ocBJjOFkmmNaq3ECRXEdQA heW7OfaB7PgWGs+F2jksvg2x1uuSAX3s9kp9EM1iEBfKmY0L4cJN/xUZBvYSGFU5sdUP PtpjIw4sVVjH7GnICnsS9YFmNvlf8KGHop+kUtdpP6YRNoz7uLnIdpxUbcQXp00aODTk jAOj96gx46EzoOb3mzE+c3DRnh2onZ+5y8GXApKd/7J5RrISTI7enjRCUfolxs+eiHP8 KuWH2sHcuViJUCQpkTSjl/tE9rslUToqTtQ5Vr88AAuAr+0xxS+FsR/CWQq+tTE9OU5l Q0lA== X-Forwarded-Encrypted: i=1; AHgh+RrVNNMK98k0tFqyJvolBjCbgQ28BahGVAu3pFY3vTv/r0Zg150sDtN1C/fxQaOM7HeNKkS7qdb25w+13P4=@vger.kernel.org X-Gm-Message-State: AFuF++kIVKAetYIo9R0RF2+pl2pe1G18pSaWzA+r7BDKT59NxTEMLtSX h+3dSPWY5OkU2eY1pninzvUIn/HmAZE3YGs1M/TWAcQjuh4DTZ+H8qZa X-Gm-Gg: AR+sD11tIzYYm8H9vT2acc0Ck4gQQ1r56PhVjeNQ7NLAaVnHSXWEAYgdykV5johp3lx 1qugXMRtLX7vY40bYMh1pX4gwqF8YyGLOZo3gWq2NTy1OQfKKC6klaQ9U+T5OQl5bybczMBZKzt DPb2kdgtuoAI/cAND6JosiN+khVsiyqREN70VfPXCsiIFBTJn002ZC5lzYAb/zWS8f8w8iAUOrD EBk9xKA7wBPAnlfFFnk9hCHX4qyj2qPV6j5ar8v5fo1X6haohyiV1Coi7iZ0EnR+aQvxwKlHiwB GZlb5Em3yXzS/5gsi6Us+EqzwHIIr+AehDEfxAwjNd3wNvf6kk4tzdCtEGwvVRSPCAw2hk+89hD PafBDF0ymR1QesA6vw6tjTOYptAv7lNtqtkw2SM7W9+v9cMOhjS8TJO/ZMTlp0KTUrcDBD63+L5 0WSd80Q/8+2wPA1VYiepQTOm4VpH05Z52Og/EPSoe5JraTwDwoXJ2u7iqTHKHooDl2V8s= X-Received: by 2002:a05:6a21:6444:b0:3d4:52bd:b89d with SMTP id adf61e73a8af0-3d452ccfb07mr24454870637.23.1788211365243; Mon, 31 Aug 2026 14:22:45 -0700 (PDT) Received: from localhost ([2620:10d:c090:500::6:bac7]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-32b26fd7edbsm21385431eec.5.2026.08.31.14.22.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 31 Aug 2026 14:22:44 -0700 (PDT) From: Zinc Lim To: alexanderduyck@fb.com, kuba@kernel.org, andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com, pabeni@redhat.com, linux@roeck-us.net, horms@kernel.org, mohsin.bashr@gmail.com Cc: kernel-team@meta.com, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-hwmon@vger.kernel.org, zinclim@meta.com, limzhineng2@gmail.com Subject: [PATCH net-next v2 3/6] eth: fbnic: cache hwmon sensor readings Date: Mon, 31 Aug 2026 14:22:31 -0700 Message-ID: <20260831212234.1212971-4-limzhineng2@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260831212234.1212971-1-limzhineng2@gmail.com> References: <20260831212234.1212971-1-limzhineng2@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Each hwmon attribute access triggers its own TSENE firmware mailbox round-trip, so reading the full set of attributes or polling them at a high rate floods the firmware mailbox with quick, successive IPC messages for data that barely changes between ticks. Cache the last temperature and voltage reading and serve reads from it for the remainder of the current jiffy. A single TSENE response carries both readings, so one transaction on a miss refreshes both and satisfies a whole batch of reads. The cache is seeded with the FBNIC_SENSOR_NO_DATA sentinel at registration so the first read always refreshes, and concurrent reads are serialized by the hwmon core so no additional locking is required. Signed-off-by: Zinc Lim --- drivers/net/ethernet/meta/fbnic/fbnic.h | 7 ++++ drivers/net/ethernet/meta/fbnic/fbnic_fw.h | 7 ++++ drivers/net/ethernet/meta/fbnic/fbnic_hwmon.c | 36 +++++++++++++------ 3 files changed, 40 insertions(+), 10 deletions(-) diff --git a/drivers/net/ethernet/meta/fbnic/fbnic.h b/drivers/net/ethernet= /meta/fbnic/fbnic.h index d0715695c43e..f647ef07704b 100644 --- a/drivers/net/ethernet/meta/fbnic/fbnic.h +++ b/drivers/net/ethernet/meta/fbnic/fbnic.h @@ -22,11 +22,18 @@ struct fbnic_napi_vector; #define FBNIC_MAX_NAPI_VECTORS 128u #define FBNIC_MBX_CMPL_SLOTS 4 =20 +struct fbnic_hwmon_cache { + unsigned long last_read; + s32 temp_mdeg; + s32 volt_mv; +}; + struct fbnic_dev { struct device *dev; struct net_device *netdev; struct dentry *dbg_fbd; struct device *hwmon; + struct fbnic_hwmon_cache hwmon_cache; struct devlink_health_reporter *fw_reporter; struct devlink_health_reporter *otp_reporter; =20 diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_fw.h b/drivers/net/ether= net/meta/fbnic/fbnic_fw.h index d84723e4cfa3..42a5f83ddb45 100644 --- a/drivers/net/ethernet/meta/fbnic/fbnic_fw.h +++ b/drivers/net/ethernet/meta/fbnic/fbnic_fw.h @@ -6,6 +6,7 @@ =20 #include #include +#include #include =20 struct fbnic_dev; @@ -44,6 +45,12 @@ struct fbnic_fw_ver { char commit[FBNIC_FW_CAP_RESP_COMMIT_MAX_SIZE]; }; =20 +/* Sentinel for a sensor value the driver does not have: a threshold the + * firmware never populated (older firmware) or a cache entry not yet + * refreshed. + */ +#define FBNIC_SENSOR_NO_DATA S32_MIN + struct fbnic_fw_cap { struct { struct fbnic_fw_ver mgmt, bootloader; diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_hwmon.c b/drivers/net/et= hernet/meta/fbnic/fbnic_hwmon.c index 38bb26cb8e6c..f35cb0065093 100644 --- a/drivers/net/ethernet/meta/fbnic/fbnic_hwmon.c +++ b/drivers/net/ethernet/meta/fbnic/fbnic_hwmon.c @@ -2,6 +2,7 @@ /* Copyright (c) Meta Platforms, Inc. and affiliates. */ =20 #include +#include =20 #include "fbnic.h" #include "fbnic_mac.h" @@ -25,26 +26,32 @@ static umode_t fbnic_hwmon_is_visible(const void *drvda= ta, =20 static int fbnic_hwmon_sensor_read(struct fbnic_dev *fbd, int id, long *va= l) { + struct fbnic_hwmon_cache *cache =3D &fbd->hwmon_cache; struct fbnic_fw_completion *fw_cmpl; int err =3D 0; - s32 *sensor; - - fw_cmpl =3D fbnic_fw_alloc_cmpl(FBNIC_TLV_MSG_ID_TSENE_READ_RESP); - if (!fw_cmpl) - return -ENOMEM; + s32 *cached; =20 switch (id) { case FBNIC_SENSOR_TEMP: - sensor =3D &fw_cmpl->u.tsene.millidegrees; + cached =3D &cache->temp_mdeg; break; case FBNIC_SENSOR_VOLTAGE: - sensor =3D &fw_cmpl->u.tsene.millivolts; + cached =3D &cache->volt_mv; break; default: - err =3D -EINVAL; - goto exit_free; + return -EINVAL; + } + + if (*cached !=3D FBNIC_SENSOR_NO_DATA && + time_is_after_eq_jiffies(cache->last_read)) { + *val =3D *cached; + return 0; } =20 + fw_cmpl =3D fbnic_fw_alloc_cmpl(FBNIC_TLV_MSG_ID_TSENE_READ_RESP); + if (!fw_cmpl) + return -ENOMEM; + err =3D fbnic_fw_xmit_tsene_read_msg(fbd, fw_cmpl); if (err) { dev_err(fbd->dev, @@ -67,7 +74,12 @@ static int fbnic_hwmon_sensor_read(struct fbnic_dev *fbd= , int id, long *val) goto exit_cleanup; } =20 - *val =3D *sensor; + /* FW returns both readings in one response, cache both. */ + cache->temp_mdeg =3D fw_cmpl->u.tsene.millidegrees; + cache->volt_mv =3D fw_cmpl->u.tsene.millivolts; + cache->last_read =3D jiffies; + + *val =3D *cached; exit_cleanup: fbnic_mbx_clear_cmpl(fbd, fw_cmpl); exit_free: @@ -107,6 +119,10 @@ void fbnic_hwmon_register(struct fbnic_dev *fbd) if (!IS_REACHABLE(CONFIG_HWMON)) return; =20 + /* Seed cache with sentinel so the first read always refreshes. */ + fbd->hwmon_cache.temp_mdeg =3D FBNIC_SENSOR_NO_DATA; + fbd->hwmon_cache.volt_mv =3D FBNIC_SENSOR_NO_DATA; + fbd->hwmon =3D hwmon_device_register_with_info(fbd->dev, "fbnic", fbd, &fbnic_chip_info, NULL); --=20 2.53.0-Meta From nobody Sat Sep 26 13:47:20 2026 Received: from mail-pf1-f175.google.com (mail-pf1-f175.google.com [209.85.210.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1950039CD05 for ; Mon, 31 Aug 2026 21:22:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788211370; cv=none; b=pOwFe9mmBCsdOb4KOycNjr9QlX0xRFmaxMibMcCBif+Rbo6PESkLRh6Ow8Pe0/LZnDEMD0R/+3cq5s+VwcY8k7o4/4AqaaORAvJkBmVar4L3hi24bssXCTT8xeYxQugNwyT0OL+yCUBQ2nkhyLha6sWRbdup5/2edZ0IdVYRNxk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788211370; c=relaxed/simple; bh=7ryBp4J/qEyf2/01p+hdf/8QZoypRA4clk5o6hi7rC0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=gVi6oUyIECOgY944nj1KHUqPpDaovKjV7uvLBCdjkcowA15K6FTALbifn5Tlq4gySddh9+mz/QrvCjSa2YFI/iPRRa7leYrNVavNTaQaF3nEo8QfYZBzA5hS0O2rp2AT9yPMAHgs2bfNtMTeHhEpxaDH8PtE7scc+qDA5E8KLTk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=q12Bf5r7; arc=none smtp.client-ip=209.85.210.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="q12Bf5r7" Received: by mail-pf1-f175.google.com with SMTP id d2e1a72fcca58-855d2bfae95so371598b3a.1 for ; Mon, 31 Aug 2026 14:22:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788211367; x=1788816167; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=VGnbInnCX26l95VXtFdZ6NsvhwlhpXxdn0FnqPhv8qQ=; b=q12Bf5r7sKohjI04oZLLDJ6a4MJC4epZAHYaKAqhFKImSrCGeSpDTfmx0aZqvMOtga xk1e1EhnuXvS8Kf/GKFGuYS7hVrgv5B00Zl6PzbQQZ3D5FEsg69JMfvTplRBTArq94SR JyYBueDae1PezWvxvoOG6zQUNq/Kt0FQ8FcE/FNjvSTkyjypFCBkVED0eOWxxmlVp7PC LYAj93CEM8s5yIOnRcVKAPz3HIpu57nEazWC+WkiGCb6BPDd0BaxLmHpP+ZTpP9KutUw sZLeEo61CbbxzX731xW8bVUO7OUlde41qnZsajV7k1rSHPPZ4uJzWslI6l4VfJgWuZwD KueA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788211367; x=1788816167; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=VGnbInnCX26l95VXtFdZ6NsvhwlhpXxdn0FnqPhv8qQ=; b=ejftZT3uTofBNIGjsIfamI8EqwtnIm86ehPH7AgBbRRtlCjtBQlqYOYrPmvZ2NLBp8 2VG0Ez0Mrvx+1F7rmLelQ3tSLcoXPk70xiMqmLfzWRuVsnovGTk8zKusl+cKtQ6IsDcH C1+gL0DJkRV55H++zaeVfa094QBsXjprqLdfk2D5na3e/VnuH28vrJE3GAuwNBZuMsE0 QbPC3OSEHYLK/dB8SCGgPVhLrvEpK1KgKhN8rRZJMSVrreI83Y+7MQq+auKnTblFC2Gy m/brB6Ue3rmrBjLAquq++Wp0wL86rBAViw2PyRVlEJJo10EO7h2u4bEKRvuLkBSFcz4h YRuQ== X-Forwarded-Encrypted: i=1; AHgh+RofffLDRuM6MiSH0AHoBBH85GopJKUHy+fowEo23HcuOr5Uzi9DlWYzM3CTWjqB1XsrAuA8QD+mPVbo4Ow=@vger.kernel.org X-Gm-Message-State: AFuF++nSZfwoRxg8/gV1fadrCdIpANb1qwS4aZWPscjn8INjA9j52p20 m/ukQ4iZR0A6q/Cf5CxSM6XRmubqZarBF/eZcvt/+oHAeysscbUtn/hr X-Gm-Gg: AR+sD12lZV3ovyPXXhAlXq5bJ8Xwj4gcSHGXZ3N7u6zS2IN59EsRsHasQD1S/yiltub SRcZcvH5DbDfbqTynr7QGjHGJnWq9ddm4Yq1O+EA8XLkTrr8eZxSDN+28/ce9Pd93tFnQD+loVT KJa4Zd6mQTj/tUcxDWdn2OuKZZJpFyHWZjZo1RGxTyYNpfr0gVabYo1sie4F3+kshKfwSnMDJUH AaEc0J+p8UOeMLXKhIhh3w3ZrPSwKuq/wjLvDY7Vdl7gSHc8zrMuXvwwQSEv8h0nXzZN5bnu5IA nFEFnJuu3cZEHmJxgZ/SSbRe3WTlyL3pf5s2x8wXYm7Y66iKO4aHMFF3F8+8R2JoKps21ZbXGw3 LI4mB5pFfapG3o+OLzKUtVeZmNqSUh7tLuX0fhXZ2zWx3YlfwV/TZ9RErw5g6MUJGNUcWRnf1o9 mHC67bzux60wOQLk6YiyRdUBI6HXlMCdx7zI9WSEtf1bNFz0ELrk6Bxg7LoA+sZpCECmwEvpJdj bS6Uw== X-Received: by 2002:a05:6a21:e344:b0:3cc:f9a0:3ada with SMTP id adf61e73a8af0-3d818ab8a23mr799208637.16.1788211367000; Mon, 31 Aug 2026 14:22:47 -0700 (PDT) Received: from localhost ([2620:10d:c090:500::6:bac7]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-3286f8094dasm34373765eec.13.2026.08.31.14.22.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 31 Aug 2026 14:22:46 -0700 (PDT) From: Zinc Lim To: alexanderduyck@fb.com, kuba@kernel.org, andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com, pabeni@redhat.com, linux@roeck-us.net, horms@kernel.org, mohsin.bashr@gmail.com Cc: kernel-team@meta.com, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-hwmon@vger.kernel.org, zinclim@meta.com, limzhineng2@gmail.com Subject: [PATCH net-next v2 4/6] eth: fbnic: report temperature and voltage thresholds via hwmon Date: Mon, 31 Aug 2026 14:22:32 -0700 Message-ID: <20260831212234.1212971-5-limzhineng2@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260831212234.1212971-1-limzhineng2@gmail.com> References: <20260831212234.1212971-1-limzhineng2@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The firmware capability response carries per-board temperature (min/max/crit) and voltage (min/max) thresholds. Parse and store them in fbnic_fw_cap, and expose them through the hwmon interface as temp1_{min,max,crit} and in0_{min,max}. The thresholds are always exposed. Values the firmware did not report are stored as the FBNIC_SENSOR_NO_DATA sentinel in the capability response parser, and a read of such an attribute returns -ENODATA. Signed-off-by: Zinc Lim --- drivers/net/ethernet/meta/fbnic/fbnic_fw.c | 21 ++++++ drivers/net/ethernet/meta/fbnic/fbnic_fw.h | 14 ++++ drivers/net/ethernet/meta/fbnic/fbnic_hwmon.c | 67 ++++++++++++++----- 3 files changed, 87 insertions(+), 15 deletions(-) diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_fw.c b/drivers/net/ether= net/meta/fbnic/fbnic_fw.c index 283d25fae79e..d814bd4041a0 100644 --- a/drivers/net/ethernet/meta/fbnic/fbnic_fw.c +++ b/drivers/net/ethernet/meta/fbnic/fbnic_fw.c @@ -575,6 +575,11 @@ static const struct fbnic_tlv_index fbnic_fw_cap_resp_= index[] =3D { FBNIC_TLV_ATTR_STRING(FBNIC_FW_CAP_RESP_UEFI_COMMIT_STR, FBNIC_FW_CAP_RESP_COMMIT_MAX_SIZE), FBNIC_TLV_ATTR_U32(FBNIC_FW_CAP_RESP_ANTI_ROLLBACK_VERSION), + FBNIC_TLV_ATTR_S32(FBNIC_FW_CAP_RESP_TEMP_MIN), + FBNIC_TLV_ATTR_S32(FBNIC_FW_CAP_RESP_TEMP_MAX), + FBNIC_TLV_ATTR_S32(FBNIC_FW_CAP_RESP_TEMP_CRIT), + FBNIC_TLV_ATTR_S32(FBNIC_FW_CAP_RESP_VOLT_MIN), + FBNIC_TLV_ATTR_S32(FBNIC_FW_CAP_RESP_VOLT_MAX), FBNIC_TLV_ATTR_LAST }; =20 @@ -702,6 +707,22 @@ static int fbnic_fw_parse_cap_resp(void *opaque, struc= t fbnic_tlv_msg **results) /* Always assume we need a BMC reinit */ fbd->fw_cap.need_bmc_tcam_reinit =3D true; =20 + fbd->fw_cap.temp.min =3D + fbnic_tlv_attr_get_signed(results[FBNIC_FW_CAP_RESP_TEMP_MIN], + FBNIC_SENSOR_NO_DATA); + fbd->fw_cap.temp.max =3D + fbnic_tlv_attr_get_signed(results[FBNIC_FW_CAP_RESP_TEMP_MAX], + FBNIC_SENSOR_NO_DATA); + fbd->fw_cap.temp.crit =3D + fbnic_tlv_attr_get_signed(results[FBNIC_FW_CAP_RESP_TEMP_CRIT], + FBNIC_SENSOR_NO_DATA); + fbd->fw_cap.volt.min =3D + fbnic_tlv_attr_get_signed(results[FBNIC_FW_CAP_RESP_VOLT_MIN], + FBNIC_SENSOR_NO_DATA); + fbd->fw_cap.volt.max =3D + fbnic_tlv_attr_get_signed(results[FBNIC_FW_CAP_RESP_VOLT_MAX], + FBNIC_SENSOR_NO_DATA); + return 0; } =20 diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_fw.h b/drivers/net/ether= net/meta/fbnic/fbnic_fw.h index 42a5f83ddb45..68ffd49e0cdd 100644 --- a/drivers/net/ethernet/meta/fbnic/fbnic_fw.h +++ b/drivers/net/ethernet/meta/fbnic/fbnic_fw.h @@ -51,6 +51,12 @@ struct fbnic_fw_ver { */ #define FBNIC_SENSOR_NO_DATA S32_MIN =20 +struct fbnic_threshold { + s32 min; + s32 max; + s32 crit; +}; + struct fbnic_fw_cap { struct { struct fbnic_fw_ver mgmt, bootloader; @@ -67,6 +73,8 @@ struct fbnic_fw_cap { u8 link_speed; u8 link_fec; u32 anti_rollback_version; + struct fbnic_threshold temp; + struct fbnic_threshold volt; }; =20 struct fbnic_fw_completion { @@ -249,6 +257,12 @@ enum { FBNIC_FW_CAP_RESP_UEFI_VERSION =3D 0x11, FBNIC_FW_CAP_RESP_UEFI_COMMIT_STR =3D 0x12, FBNIC_FW_CAP_RESP_ANTI_ROLLBACK_VERSION =3D 0x15, + /* 0x16 and 0x17 are reserved for future use */ + FBNIC_FW_CAP_RESP_TEMP_MIN =3D 0x18, + FBNIC_FW_CAP_RESP_TEMP_MAX =3D 0x19, + FBNIC_FW_CAP_RESP_TEMP_CRIT =3D 0x1a, + FBNIC_FW_CAP_RESP_VOLT_MIN =3D 0x1b, + FBNIC_FW_CAP_RESP_VOLT_MAX =3D 0x1c, FBNIC_FW_CAP_RESP_MSG_MAX }; =20 diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_hwmon.c b/drivers/net/et= hernet/meta/fbnic/fbnic_hwmon.c index f35cb0065093..4938f7b39140 100644 --- a/drivers/net/ethernet/meta/fbnic/fbnic_hwmon.c +++ b/drivers/net/ethernet/meta/fbnic/fbnic_hwmon.c @@ -7,16 +7,6 @@ #include "fbnic.h" #include "fbnic_mac.h" =20 -static int fbnic_hwmon_sensor_id(enum hwmon_sensor_types type) -{ - if (type =3D=3D hwmon_temp) - return FBNIC_SENSOR_TEMP; - if (type =3D=3D hwmon_in) - return FBNIC_SENSOR_VOLTAGE; - - return -EOPNOTSUPP; -} - static umode_t fbnic_hwmon_is_visible(const void *drvdata, enum hwmon_sensor_types type, u32 attr, int channel) @@ -88,14 +78,58 @@ static int fbnic_hwmon_sensor_read(struct fbnic_dev *fb= d, int id, long *val) return err; } =20 +static int fbnic_hwmon_read_threshold(long thr, long *val) +{ + if (thr =3D=3D FBNIC_SENSOR_NO_DATA) + return -ENODATA; + + *val =3D thr; + return 0; +} + +static int fbnic_hwmon_temp_read(struct fbnic_dev *fbd, u32 attr, long *va= l) +{ + switch (attr) { + case hwmon_temp_input: + return fbnic_hwmon_sensor_read(fbd, FBNIC_SENSOR_TEMP, val); + case hwmon_temp_min: + return fbnic_hwmon_read_threshold(fbd->fw_cap.temp.min, val); + case hwmon_temp_max: + return fbnic_hwmon_read_threshold(fbd->fw_cap.temp.max, val); + case hwmon_temp_crit: + return fbnic_hwmon_read_threshold(fbd->fw_cap.temp.crit, val); + default: + return -EOPNOTSUPP; + } +} + +static int fbnic_hwmon_in_read(struct fbnic_dev *fbd, u32 attr, long *val) +{ + switch (attr) { + case hwmon_in_input: + return fbnic_hwmon_sensor_read(fbd, FBNIC_SENSOR_VOLTAGE, val); + case hwmon_in_min: + return fbnic_hwmon_read_threshold(fbd->fw_cap.volt.min, val); + case hwmon_in_max: + return fbnic_hwmon_read_threshold(fbd->fw_cap.volt.max, val); + default: + return -EOPNOTSUPP; + } +} + static int fbnic_hwmon_read(struct device *dev, enum hwmon_sensor_types ty= pe, u32 attr, int channel, long *val) { struct fbnic_dev *fbd =3D dev_get_drvdata(dev); - int id; =20 - id =3D fbnic_hwmon_sensor_id(type); - return id < 0 ? id : fbnic_hwmon_sensor_read(fbd, id, val); + switch (type) { + case hwmon_temp: + return fbnic_hwmon_temp_read(fbd, attr, val); + case hwmon_in: + return fbnic_hwmon_in_read(fbd, attr, val); + default: + return -EOPNOTSUPP; + } } =20 static const struct hwmon_ops fbnic_hwmon_ops =3D { @@ -104,8 +138,11 @@ static const struct hwmon_ops fbnic_hwmon_ops =3D { }; =20 static const struct hwmon_channel_info *fbnic_hwmon_info[] =3D { - HWMON_CHANNEL_INFO(temp, HWMON_T_INPUT), - HWMON_CHANNEL_INFO(in, HWMON_I_INPUT), + HWMON_CHANNEL_INFO(temp, + HWMON_T_INPUT | HWMON_T_MIN | HWMON_T_MAX | + HWMON_T_CRIT), + HWMON_CHANNEL_INFO(in, + HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX), NULL }; =20 --=20 2.53.0-Meta From nobody Sat Sep 26 13:47:20 2026 Received: from mail-pj1-f43.google.com (mail-pj1-f43.google.com [209.85.216.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3FCE83A4F3B for ; Mon, 31 Aug 2026 21:22:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788211371; cv=none; b=Cjl3zLrX6PcNz8sGVhODG2XiGbOu+fiPjHBcwoR3NLWzKy02cVyWdPO2zhac1sXr3aZQDzgP28vxlWCTgTHDKv86bCnposM/Ie8vX0BKkpry1j3hlCSSkJOrCBnrtZjipFtswrsd5uN4q7jQVr+5ifUs8S2bp2U5jA567Jaiiv8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788211371; c=relaxed/simple; bh=QK8aNSzL7ND4hoq7Mvy7TvP92pxHrFlqyV4BOQPaCNA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=oQUjADRghXxxlmzpwO8L0Upsh8j3Z/bAq5w3RRdV8/e8yy5gF7WgnYWMYaPH1I/BJs6+HW97iOiuYMqnEGqF/6TyPuO2j7poM94taC9lyhTM/7iGivYCRH/wbibmdSSYy8kdBVORv1yyEWlOQNuIUTBeNbKzUCkvgPUMuhT+jek= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=XO0GHDn7; arc=none smtp.client-ip=209.85.216.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="XO0GHDn7" Received: by mail-pj1-f43.google.com with SMTP id 98e67ed59e1d1-38a0c7e841fso378753a91.2 for ; Mon, 31 Aug 2026 14:22:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788211368; x=1788816168; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=uEYLADmFkDVF9LXmlc95J2Vic5BUF75td03Fx2o+E0U=; b=XO0GHDn7GpzT5k+cdUnSrhHqYKwLHiNcEqjlQDZawpG0UHdJN1hXwK+WnSQqBq6uSn h/5HwOwKQmXQ1AJ+8ZIFFJ4dTeFrDo9nWn6p1Wb21nvKi2yVDV0ir8/YA4iiebpb2uz2 BlbUzIxADY/qBd/CqvwaKtpyDqO3U77kPDh5N2acL5SPiG3Kg9zI55251DuuyIb7BRvE 8WNr7znVi8FxO9BzVlmBnmd4zgfzB6VwCeqg5baRUybeWuvSn2TEQOslMTVNWf2Lpo1Y pL8RL2/hRHzanvMdNqypzpLIrsKgzI6z923F0/ycWocH0gSGvAlaa3M8zUSLlg7VwdtA EFnw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788211368; x=1788816168; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=uEYLADmFkDVF9LXmlc95J2Vic5BUF75td03Fx2o+E0U=; b=E1O9yN00E/WBxJFPyuntIQYtb9Z5176EL/plMY1u/4DziWHxgsRY7x63p15I5lzrfi 98d3nsyslqGMQ+h1FN1ng78lzpDrjJ8t8WS1ybE/xQRuNF+lrXRCo6BTinAPFBGgilV3 RFoIkkTq6Oqmze/0jdWWJpvRTJglAwIJU2su6o9Y/unLElqyD92xW0JUDskUt/qaHFHX oCCVOYuN9G30buWXOrZQCFaPMzvZ+PVvtQxlNlzmPaf2n1YlHlduowKXaK2/f4oEBWR1 oV6ail3VEnNVvh/0GlUDQo7z4kuNw8pTCpfMaC0Ao5By54jt04IlFS/rh92baitsAvzu mzuA== X-Forwarded-Encrypted: i=1; AKwUvByUL201mFY5iaZLq1OM6juT/R3jf92jPwx+8iRkX/P2+jCdUbZ/Z61wYd6ITsQEZXqlxLxrnbbKQdZ8LLQ=@vger.kernel.org X-Gm-Message-State: AFuF++m7o+kcm0ODlLuTu9/Al3qDtFXrrjpHQ8uDv9XM0b5lUwoIjUy0 j9cXjpw9+nVM6HTwYGQJj4010AC60yvzzG1n+rj27uP6+PlYW1KoXD20 X-Gm-Gg: AYBFou2Ape+gECdmaBatwX3HvxHAnLX3TG0K4BZxT7sV4N6Hoa8Irh2U4b7X+9xyptH uFmQoPrQvE6WVQFCPtxhV8+lUVzbjv4trdGGcV0Vj8kyBOiLuWZ/g3HcsqbTPE2ci5/+C2xXRvy E8fIbbKJ+L9Asa/nAibONiRMW/JXgHFyi1G3UctYS6bd6Nev+DBklp2au64jpCVmqYv+dE/GSM7 LFIxtQ4xQl7dGoISIkkdzLpy2RMsTXU2XUfzio6sZodkdtgBkjUFebz+bUYmp6MLYOkB/SAR44W bJLVWR88pWMOa+E4cFvVzefNtmFE4T8RHCwPSfzgG8aIpK1DN+JeTy103BoIk+fI+dyEKtYFi+E IViAxv5WoGeSB0X3/+VNi1ggklUJ5Y2RiQVyuSWE1lSrCcWY2snIKOygUzvjtUne9r+7/oGUCMM iiJIsy64iPf+vr4/tQmXQj7PHKwagXgONHeofzPU0g5txNqtzzyCHdKl9PrDmhO72ql/Q= X-Received: by 2002:a17:90a:e7cb:b0:398:bbe9:73af with SMTP id 98e67ed59e1d1-398bbe97548mr18505107a91.7.1788211368378; Mon, 31 Aug 2026 14:22:48 -0700 (PDT) Received: from localhost ([2620:10d:c090:500::6:bac7]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-142e0d2e465sm47179945c88.4.2026.08.31.14.22.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 31 Aug 2026 14:22:48 -0700 (PDT) From: Zinc Lim To: alexanderduyck@fb.com, kuba@kernel.org, andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com, pabeni@redhat.com, linux@roeck-us.net, horms@kernel.org, mohsin.bashr@gmail.com Cc: kernel-team@meta.com, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-hwmon@vger.kernel.org, zinclim@meta.com, limzhineng2@gmail.com Subject: [PATCH net-next v2 5/6] eth: fbnic: report temperature and voltage alarms via hwmon Date: Mon, 31 Aug 2026 14:22:33 -0700 Message-ID: <20260831212234.1212971-6-limzhineng2@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260831212234.1212971-1-limzhineng2@gmail.com> References: <20260831212234.1212971-1-limzhineng2@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Building on the temperature and voltage thresholds stored in fbnic_fw_cap, expose alarm attributes through the hwmon interface: temp1_{min,max,crit}_alarm and in0_{min,max}_alarm. Each alarm is computed by taking a live sensor reading and comparing it against the corresponding stored threshold. The static thresholds (min/max/crit) are returned first straight from fbnic_fw_cap without a firmware round-trip, and unsupported attributes are rejected up front, so only attributes that actually need a live value fall through to a single sensor read that then feeds input and every alarm. A threshold the firmware did not populate reports -ENODATA for both the threshold attribute and its alarm. Signed-off-by: Zinc Lim --- drivers/net/ethernet/meta/fbnic/fbnic_hwmon.c | 68 +++++++++++++++++-- 1 file changed, 61 insertions(+), 7 deletions(-) diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_hwmon.c b/drivers/net/et= hernet/meta/fbnic/fbnic_hwmon.c index 4938f7b39140..c5cddd9cef12 100644 --- a/drivers/net/ethernet/meta/fbnic/fbnic_hwmon.c +++ b/drivers/net/ethernet/meta/fbnic/fbnic_hwmon.c @@ -87,34 +87,84 @@ static int fbnic_hwmon_read_threshold(long thr, long *v= al) return 0; } =20 +static int fbnic_hwmon_read_alarm(long a, long b, long *val) +{ + if (a =3D=3D FBNIC_SENSOR_NO_DATA || b =3D=3D FBNIC_SENSOR_NO_DATA) + return -ENODATA; + + *val =3D a >=3D b; + return 0; +} + static int fbnic_hwmon_temp_read(struct fbnic_dev *fbd, u32 attr, long *va= l) { + int err; + switch (attr) { - case hwmon_temp_input: - return fbnic_hwmon_sensor_read(fbd, FBNIC_SENSOR_TEMP, val); case hwmon_temp_min: return fbnic_hwmon_read_threshold(fbd->fw_cap.temp.min, val); case hwmon_temp_max: return fbnic_hwmon_read_threshold(fbd->fw_cap.temp.max, val); case hwmon_temp_crit: return fbnic_hwmon_read_threshold(fbd->fw_cap.temp.crit, val); + case hwmon_temp_input: + case hwmon_temp_min_alarm: + case hwmon_temp_max_alarm: + case hwmon_temp_crit_alarm: + break; default: return -EOPNOTSUPP; } + + err =3D fbnic_hwmon_sensor_read(fbd, FBNIC_SENSOR_TEMP, val); + if (err) + return err; + + switch (attr) { + case hwmon_temp_input: + return 0; + case hwmon_temp_min_alarm: + return fbnic_hwmon_read_alarm(fbd->fw_cap.temp.min, *val, val); + case hwmon_temp_max_alarm: + return fbnic_hwmon_read_alarm(*val, fbd->fw_cap.temp.max, val); + case hwmon_temp_crit_alarm: + return fbnic_hwmon_read_alarm(*val, fbd->fw_cap.temp.crit, val); + } + + return -EOPNOTSUPP; } =20 static int fbnic_hwmon_in_read(struct fbnic_dev *fbd, u32 attr, long *val) { + int err; + switch (attr) { - case hwmon_in_input: - return fbnic_hwmon_sensor_read(fbd, FBNIC_SENSOR_VOLTAGE, val); case hwmon_in_min: return fbnic_hwmon_read_threshold(fbd->fw_cap.volt.min, val); case hwmon_in_max: return fbnic_hwmon_read_threshold(fbd->fw_cap.volt.max, val); + case hwmon_in_input: + case hwmon_in_min_alarm: + case hwmon_in_max_alarm: + break; default: return -EOPNOTSUPP; } + + err =3D fbnic_hwmon_sensor_read(fbd, FBNIC_SENSOR_VOLTAGE, val); + if (err) + return err; + + switch (attr) { + case hwmon_in_input: + return 0; + case hwmon_in_min_alarm: + return fbnic_hwmon_read_alarm(fbd->fw_cap.volt.min, *val, val); + case hwmon_in_max_alarm: + return fbnic_hwmon_read_alarm(*val, fbd->fw_cap.volt.max, val); + } + + return -EOPNOTSUPP; } =20 static int fbnic_hwmon_read(struct device *dev, enum hwmon_sensor_types ty= pe, @@ -139,10 +189,14 @@ static const struct hwmon_ops fbnic_hwmon_ops =3D { =20 static const struct hwmon_channel_info *fbnic_hwmon_info[] =3D { HWMON_CHANNEL_INFO(temp, - HWMON_T_INPUT | HWMON_T_MIN | HWMON_T_MAX | - HWMON_T_CRIT), + HWMON_T_INPUT | + HWMON_T_MIN | HWMON_T_MIN_ALARM | + HWMON_T_MAX | HWMON_T_MAX_ALARM | + HWMON_T_CRIT | HWMON_T_CRIT_ALARM), HWMON_CHANNEL_INFO(in, - HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX), + HWMON_I_INPUT | + HWMON_I_MIN | HWMON_I_MIN_ALARM | + HWMON_I_MAX | HWMON_I_MAX_ALARM), NULL }; =20 --=20 2.53.0-Meta From nobody Sat Sep 26 13:47:20 2026 Received: from mail-pf1-f175.google.com (mail-pf1-f175.google.com [209.85.210.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 369DB39CD10 for ; Mon, 31 Aug 2026 21:22:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788211373; cv=none; b=hrmSf12WoDVCY6cywClxVReDngmk+iUjrpMgx6OLqCUL7/4JNn0XdDkd4+vRBShQY4YBfE7BoauXjVjH6suZS8oRcRpI1G38hkIfa0E6DgJH1aA+xf+iV5LbJ2AWFs4IgOPw8b2HIPHUCEfqtz81ibhs15TSBd4NIWuaXHi0cwo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788211373; c=relaxed/simple; bh=DAi+XZ+iVzK9opH5tLj0PVy/X0Xxq2muFO+ODlSkT0c=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=HT2eMPhmR4UvszE1RJQ6CMMcfbvquza42vnTpOAbta5xOXz95F4LLnrBZOfFa/Hh1wuNTnW/TxtWPJ0XQB3QklaMHJsWiyDtB662aMIeV6fcumJmz62YQ5PQSlFGM+BvsLZKFNTiQhneTNw/l/5mNWaEZQhdFXoXzTza/bPCkfk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=bm24eAGg; arc=none smtp.client-ip=209.85.210.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="bm24eAGg" Received: by mail-pf1-f175.google.com with SMTP id d2e1a72fcca58-84eb992a881so165829b3a.2 for ; Mon, 31 Aug 2026 14:22:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788211370; x=1788816170; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=WjbJ4Pa6PEowkjvqP5cAHHCjr9IGaKnqwljufVDEqTA=; b=bm24eAGguVErCJYTJsrulyi7eiLjkyxRsyRxuykGjWduN6q5g8mXktsCipgXHC5sMN O6pzqqsgy/7/Calfrt0sSVXMUJiDvlfmjzaNqsJJhiB6IRigO5Di1g+c7MJM1xzvB3g7 kmttBvZbnBRzAuDAOlXjmYoC9yEy/bkrjK/MrpQc+G7yfcrotDfsd3LRCgjA7VdvbcAk L6FIxO0BxK3h7WDWpF+JQfpb3Rm/1tk4iaGDn8eSCYU/lbD3snQWxU2DpfNzLCOqOMkE 0iNUCUTkkqHeVxxqltVu3oaUA5y04Yn2uaYiMbaf80PR8eMujENiw+CZpby+4Pv671LS pJOQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788211370; x=1788816170; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=WjbJ4Pa6PEowkjvqP5cAHHCjr9IGaKnqwljufVDEqTA=; b=f6gi4BED/HuHuuhIGGgXZF6X6eUTnRK+0TV6ek8zRMsFkXUKI6IqgGFVlbIFCo93gK 0OBTgRpPOCmwymCEPmfj5hDV6FVtfP2z8zG0aAUA/qS0c4B++kOauSLsSoat641uZYio H/S6OJPfD1S+Wt8Dw1zI3VG+JrQx0NQfxGicZKTWvEGNzpbhjqbRA0LXDEbfSC1TJnn4 z1GP57WRnSQdL5APVBS3g3Im7PXreAmMBM9v7eGCFFp97Pb5DHjmB26fGa/ZmaLHhy5F 7QR37AgskBXfLUEXWSrZqAEi9d9QJr4wMYJxRN6rT//E9tU98rRmwgbNfQO5d5tltV8W C7pg== X-Forwarded-Encrypted: i=1; AHgh+RpIJBlDzj7VG8S4IdKK7kDhmsPFmVMKeFQ81Q+HIrGwnY+ogeu1qGfZi+gqEnx/a1z/2UfLAQht4cjf3qk=@vger.kernel.org X-Gm-Message-State: AFuF++lu157v61Qhja8k4a4JTccueHWVm+NSP0SUa44p9zuwgVNJpX5I trlrTCj/yr1BIDLOrO0YpRwk3KHMEZhOx3Y3I5amDDezcGdMO3gF3d/M X-Gm-Gg: AR+sD13P7zFMJtROeQDoluPg03lqVckLMIfyaXYdRAMDZehwYZm2OiiVDX5I5lnI2g+ ioDHWk1J8XNFfp3L8AVmnkqrAf9EHoVPfVCFWBVjHwG0Mp8L3W1N0AJxMfRkcUwRsW8iMhql3FJ L0JQr3nwz0A9rlJCyrkMQ/Z15V9PXA4ZbiGee18PrSvTmhiXN3xbxjggUDsrzC7eYHUyCeQmAFU kHn80PUEW2z2hxoV4d0G+DkrP7DmGz0POlDnmtCxpi6k2gGI8J+8f1tcOXAAuq/pnTth8T0H8E8 4k5DFjM7xtrmLmo7VR1K7yWo4UDXsJ02MIvgFuEG7Mpqo5b8rHRCixWJDmiAif54rvYgFe/exEc EzWIN2KZNV6SWMq4obfLGOPnXQrLR2VQGdWnIN7Hv16j+QY66nmITyF7IeYFfN3FcGAtuZsVhUr oKlKjZU71dQ9mndRaMR94uTAhE56C723YG8YeO0c+LjVUwVcCccXzGgn0IKa6yT0/yKxA= X-Received: by 2002:a05:6a21:6b87:b0:3d1:39e9:b267 with SMTP id adf61e73a8af0-3d266582d7bmr49695837637.3.1788211369851; Mon, 31 Aug 2026 14:22:49 -0700 (PDT) Received: from localhost ([2620:10d:c090:500::6:bac7]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-32b49c867f5sm18516298eec.2.2026.08.31.14.22.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 31 Aug 2026 14:22:49 -0700 (PDT) From: Zinc Lim To: alexanderduyck@fb.com, kuba@kernel.org, andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com, pabeni@redhat.com, linux@roeck-us.net, horms@kernel.org, mohsin.bashr@gmail.com Cc: kernel-team@meta.com, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-hwmon@vger.kernel.org, zinclim@meta.com, limzhineng2@gmail.com Subject: [PATCH net-next v2 6/6] eth: fbnic: firmware notifies hwmon on sensor threshold events Date: Mon, 31 Aug 2026 14:22:34 -0700 Message-ID: <20260831212234.1212971-7-limzhineng2@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260831212234.1212971-1-limzhineng2@gmail.com> References: <20260831212234.1212971-1-limzhineng2@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The firmware sends an unsolicited message via the new FBNIC_TLV_MSG_ID_SENSOR_THRESHOLD_EXCEEDED_RESP IPC message when a temperature or voltage sensor crosses one of its thresholds. Parse this message and translate it into the corresponding hwmon alarm (temp1_{min,max,crit}_alarm or in0_{min,max}_alarm) via hwmon_notify_event(), so userspace listeners are woken on the relevant sysfs attribute. fbnic_hwmon_notify_event() is driven from the FW mailbox IRQ path, so it can run concurrently with hwmon registration and teardown. Guard the publish/teardown of fbd->hwmon: register publishes it with WRITE_ONCE() only after a successful registration (and leaves it NULL on failure), unregister clears it with WRITE_ONCE(NULL) and then synchronize_irq(fbd->fw_msix_vector) to drain any in-flight mailbox IRQ before unregistering, and notify_event reads it once with READ_ONCE() and skips the notification when it is NULL. Signed-off-by: Zinc Lim --- drivers/net/ethernet/meta/fbnic/fbnic.h | 1 + drivers/net/ethernet/meta/fbnic/fbnic_fw.c | 54 ++++++++++++++ drivers/net/ethernet/meta/fbnic/fbnic_fw.h | 9 +++ drivers/net/ethernet/meta/fbnic/fbnic_hwmon.c | 71 ++++++++++++++++--- 4 files changed, 127 insertions(+), 8 deletions(-) diff --git a/drivers/net/ethernet/meta/fbnic/fbnic.h b/drivers/net/ethernet= /meta/fbnic/fbnic.h index f647ef07704b..4a49c20e4a01 100644 --- a/drivers/net/ethernet/meta/fbnic/fbnic.h +++ b/drivers/net/ethernet/meta/fbnic/fbnic.h @@ -192,6 +192,7 @@ void fbnic_fw_free_mbx(struct fbnic_dev *fbd); =20 void fbnic_hwmon_register(struct fbnic_dev *fbd); void fbnic_hwmon_unregister(struct fbnic_dev *fbd); +void fbnic_hwmon_notify_event(struct fbnic_dev *fbd, int id, long val); =20 int fbnic_mac_request_irq(struct fbnic_dev *fbd); void fbnic_mac_free_irq(struct fbnic_dev *fbd); diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_fw.c b/drivers/net/ether= net/meta/fbnic/fbnic_fw.c index d814bd4041a0..6dca38076d7b 100644 --- a/drivers/net/ethernet/meta/fbnic/fbnic_fw.c +++ b/drivers/net/ethernet/meta/fbnic/fbnic_fw.c @@ -1639,6 +1639,57 @@ fbnic_fw_parser_test(void *opaque, struct fbnic_tlv_= msg **results) return err; } =20 +static const struct fbnic_tlv_index fbnic_threshold_exceeded_resp_index[] = =3D { + FBNIC_TLV_ATTR_S32(FBNIC_FW_TSENE_THERM_EXCEEDED_FLAG), + FBNIC_TLV_ATTR_S32(FBNIC_FW_TSENE_VOLT_EXCEEDED_FLAG), + FBNIC_TLV_ATTR_S32(FBNIC_FW_TSENE_THERMAL), + FBNIC_TLV_ATTR_S32(FBNIC_FW_TSENE_VOLTAGE), + FBNIC_TLV_ATTR_LAST +}; + +static int fbnic_fw_parse_threshold_exceeded_resp(void *opaque, + struct fbnic_tlv_msg **results) +{ + bool therm_exceeded, volt_exceeded; + struct fbnic_dev *fbd =3D opaque; + s32 value; + + therm_exceeded =3D + fta_get_sint(results, FBNIC_FW_TSENE_THERM_EXCEEDED_FLAG); + volt_exceeded =3D + fta_get_sint(results, FBNIC_FW_TSENE_VOLT_EXCEEDED_FLAG); + + if (!therm_exceeded && !volt_exceeded) { + dev_err(fbd->dev, + "Threshold exceeded message with no flag set\n"); + return -EINVAL; + } + + if (therm_exceeded) { + if (!results[FBNIC_FW_TSENE_THERMAL]) { + dev_err(fbd->dev, + "Thermal threshold exceeded but no value received\n"); + return -EINVAL; + } + value =3D fta_get_sint(results, FBNIC_FW_TSENE_THERMAL); + dev_err(fbd->dev, "Thermal threshold exceeded: %d mC\n", value); + fbnic_hwmon_notify_event(fbd, FBNIC_SENSOR_TEMP, value); + } + + if (volt_exceeded) { + if (!results[FBNIC_FW_TSENE_VOLTAGE]) { + dev_err(fbd->dev, + "Voltage threshold exceeded but no value received\n"); + return -EINVAL; + } + value =3D fta_get_sint(results, FBNIC_FW_TSENE_VOLTAGE); + dev_err(fbd->dev, "Voltage threshold exceeded: %d mV\n", value); + fbnic_hwmon_notify_event(fbd, FBNIC_SENSOR_VOLTAGE, value); + } + + return 0; +} + static const struct fbnic_tlv_parser fbnic_fw_tlv_parser[] =3D { FBNIC_TLV_PARSER(TEST, fbnic_tlv_test_index, fbnic_fw_parser_test), FBNIC_TLV_PARSER(FW_CAP_RESP, fbnic_fw_cap_resp_index, @@ -1667,6 +1718,9 @@ static const struct fbnic_tlv_parser fbnic_fw_tlv_par= ser[] =3D { FBNIC_TLV_PARSER(TSENE_READ_RESP, fbnic_tsene_read_resp_index, fbnic_fw_parse_tsene_read_resp), + FBNIC_TLV_PARSER(SENSOR_THRESHOLD_EXCEEDED_RESP, + fbnic_threshold_exceeded_resp_index, + fbnic_fw_parse_threshold_exceeded_resp), FBNIC_TLV_PARSER(LOG_MSG_REQ, fbnic_fw_log_req_index, fbnic_fw_parse_log_req), diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_fw.h b/drivers/net/ether= net/meta/fbnic/fbnic_fw.h index 68ffd49e0cdd..87301e608255 100644 --- a/drivers/net/ethernet/meta/fbnic/fbnic_fw.h +++ b/drivers/net/ethernet/meta/fbnic/fbnic_fw.h @@ -227,6 +227,7 @@ enum { FBNIC_TLV_MSG_ID_QSFP_READ_RESP =3D 0x39, FBNIC_TLV_MSG_ID_TSENE_READ_REQ =3D 0x3C, FBNIC_TLV_MSG_ID_TSENE_READ_RESP =3D 0x3D, + FBNIC_TLV_MSG_ID_SENSOR_THRESHOLD_EXCEEDED_RESP =3D 0x40, FBNIC_TLV_MSG_ID_LOG_SEND_LOGS_REQ =3D 0x43, FBNIC_TLV_MSG_ID_LOG_MSG_REQ =3D 0x44, FBNIC_TLV_MSG_ID_LOG_MSG_RESP =3D 0x45, @@ -296,6 +297,14 @@ enum { FBNIC_FW_TSENE_MSG_MAX }; =20 +enum { + FBNIC_FW_TSENE_THERM_EXCEEDED_FLAG =3D 0x0, + FBNIC_FW_TSENE_VOLT_EXCEEDED_FLAG =3D 0x1, + FBNIC_FW_TSENE_THERMAL =3D 0x2, + FBNIC_FW_TSENE_VOLTAGE =3D 0x3, + FBNIC_FW_TSENE_EXCEEDED_MSG_MAX, +}; + enum { FBNIC_FW_OWNERSHIP_FLAG =3D 0x0, FBNIC_FW_OWNERSHIP_TIME =3D 0x1, diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_hwmon.c b/drivers/net/et= hernet/meta/fbnic/fbnic_hwmon.c index c5cddd9cef12..3f33522fcfd2 100644 --- a/drivers/net/ethernet/meta/fbnic/fbnic_hwmon.c +++ b/drivers/net/ethernet/meta/fbnic/fbnic_hwmon.c @@ -207,6 +207,8 @@ static const struct hwmon_chip_info fbnic_chip_info =3D= { =20 void fbnic_hwmon_register(struct fbnic_dev *fbd) { + struct device *hwmon; + if (!IS_REACHABLE(CONFIG_HWMON)) return; =20 @@ -214,22 +216,75 @@ void fbnic_hwmon_register(struct fbnic_dev *fbd) fbd->hwmon_cache.temp_mdeg =3D FBNIC_SENSOR_NO_DATA; fbd->hwmon_cache.volt_mv =3D FBNIC_SENSOR_NO_DATA; =20 - fbd->hwmon =3D hwmon_device_register_with_info(fbd->dev, "fbnic", - fbd, &fbnic_chip_info, - NULL); - if (IS_ERR(fbd->hwmon)) { + hwmon =3D hwmon_device_register_with_info(fbd->dev, "fbnic", fbd, + &fbnic_chip_info, NULL); + if (IS_ERR(hwmon)) { dev_notice(fbd->dev, "Failed to register hwmon device %pe\n", - fbd->hwmon); - fbd->hwmon =3D NULL; + hwmon); + return; } + + WRITE_ONCE(fbd->hwmon, hwmon); } =20 void fbnic_hwmon_unregister(struct fbnic_dev *fbd) { + struct device *hwmon; + if (!IS_REACHABLE(CONFIG_HWMON) || !fbd->hwmon) return; =20 - hwmon_device_unregister(fbd->hwmon); - fbd->hwmon =3D NULL; + hwmon =3D fbd->hwmon; + /* Pair with READ_ONCE() in fbnic_hwmon_notify_event(). Publish NULL + * and wait for any in-flight FW mailbox IRQ handler to finish so it + * cannot dereference the hwmon device after we unregister it. + */ + WRITE_ONCE(fbd->hwmon, NULL); + synchronize_irq(fbd->fw_msix_vector); + + hwmon_device_unregister(hwmon); +} + +void fbnic_hwmon_notify_event(struct fbnic_dev *fbd, int id, long val) +{ + enum hwmon_sensor_types type; + struct device *hwmon; + s32 attr =3D -1; + + if (!IS_REACHABLE(CONFIG_HWMON)) + return; + + switch (id) { + case FBNIC_SENSOR_TEMP: + type =3D hwmon_temp; + + if (val <=3D fbd->fw_cap.temp.min) + attr =3D hwmon_temp_min_alarm; + else if (val >=3D fbd->fw_cap.temp.crit) + attr =3D hwmon_temp_crit_alarm; + else if (val >=3D fbd->fw_cap.temp.max) + attr =3D hwmon_temp_max_alarm; + + break; + case FBNIC_SENSOR_VOLTAGE: + type =3D hwmon_in; + + if (val <=3D fbd->fw_cap.volt.min) + attr =3D hwmon_in_min_alarm; + else if (val >=3D fbd->fw_cap.volt.max) + attr =3D hwmon_in_max_alarm; + + break; + default: + return; + } + + /* Pair with WRITE_ONCE() in fbnic_hwmon_unregister(). Skip the + * notification if hwmon failed to register or has already been torn + * down. + */ + hwmon =3D READ_ONCE(fbd->hwmon); + if (attr >=3D 0 && hwmon) + hwmon_notify_event(hwmon, type, attr, 0); } --=20 2.53.0-Meta