From nobody Mon Sep 28 08:01:31 2026 Received: from mail-pf1-f180.google.com (mail-pf1-f180.google.com [209.85.210.180]) (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 900323803DB for ; Mon, 24 Aug 2026 17:51:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787593867; cv=none; b=E0mV7/PTwpp7mU/DQiEZK/H2s2s4KMQnVBEmOpsWBFFlZRAcCXj/gxVbLtQfynRTDX0e7MMV8ijRf622IGPtkx6pvZ1fz6oi57vl7FQ+AdgYEH32G5eJwX0G0F3RHZFMlnyhFweRiaf4RrCYZvjXkSFQyXUYuA0xwGUxuVFT8Pc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787593867; c=relaxed/simple; bh=Vi3BmT7ZDkiqyokg+wo6JFBFy7A29xrg2kuZJqXCm60=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VxNqx5W5LAxy1OqNXHVPkFF5X38qF27fqzZyGnw0jmD4bpNsO0SaW6XYLxohLoSmW/qs3weLIicj20Cr5KLur1Vpsz2SigNi1R1Wv6nUP4NMxqGOEjJmewoofq0BVFNe85ty8N9rJXVGN/eEqPNiwvTZqac3B488NUnoIOvyfHU= 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=LiupDtPl; arc=none smtp.client-ip=209.85.210.180 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="LiupDtPl" Received: by mail-pf1-f180.google.com with SMTP id d2e1a72fcca58-84fa3b14ee1so2977638b3a.0 for ; Mon, 24 Aug 2026 10:51:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787593865; x=1788198665; 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=LiupDtPlmaE69qlJIwKRyViHHcNI0rXof9dDweopa0kvNjbRV/tzMqMbFSV80tmCiV dxHC15G8jy4c1xHX17ZY1IYT4F+6zWGAlkYTKj2LFPirTEVgwUV+QeymbDwuZiZ5Fa30 ZHCBKAPxgMB4Kwm9qy6A7Rp4IF11p/s3h3rUBpNsoND6zm5udB1wKCLUOGRe+2LFqjPx wgw8eOSIQNdmbWRyJ/lMQwWqonTZ1BeYYHTCx6Jb8IjhDYLrrOPl8vPBuZAG5CfbXH5B GTo/373URFUGVrVG4p+N7M+SkOQYv1qiT7Qr5tFpwSwcc2unX3CNB4JIr32zvrqKPUQV k2AQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787593865; x=1788198665; 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=F5+QjtxxeB8haYGdsINDqRwsGbfEjnhFh87/bEmODoOashTZq76wGMIRcoBZI4nkai ebfRsjP/Ih+qEkS0lUoI8Dbhs/Ql7KYlIWQ5jMxxvhNPbJea9wnf/xqzcK7Xiff4QBYZ nxh28rTPTJx/eQ/ypfQFfYeXon0glgP0SOSAFS4PcZnvMaxvvyT9wQoSviluwzQHh/Wm U/3NNG0TgTd32rETqcDRbPtuRGo+4sH+7T/eSMAHyUu8cL6G1c5qZ3mUgOcmoq9x+k2w eiw0pfhCvj2jyGPSnhHcRaMskL5dEndQf2T6ku20mw+KhY/7klB+1SG3otn0Fayb0yq8 7UOg== X-Forwarded-Encrypted: i=1; AHgh+RqIMiaF3L9xG0sjLJOnyoUm8Huu975x1/Op3BuyOBAWoZCL0n/6NK/OoUtn0RWbYtadUWPiw0uXvAxUS1g=@vger.kernel.org X-Gm-Message-State: AFuF++mEXeEBSm2VAyQJMlDwn5crpFnhrmrij24zAssb8Vm1Wlx3FxZF 8/t9Nn85ErDgGwf3sgdW8UuJIem7X7StaBX7bu/Ki+QtMXw+HX6kYOmXBODKMg== X-Gm-Gg: AR+sD13xvFcU16l1N+1ZXsxc/lDMwm0gyER4a3zyTIy/QwZOSzaAM5rglLlzMG2Iee8 jNzeET1DDH7opEW9jrO5pNlTjVS+pXi8hoj2N1O45hwZLc5zOUHvMcbFVjrm/QBgfK0VpLeKu83 FCG/qV0m8JHmP286MC9nbiFu+/JCtMJOGRL8A0CtcV3CHvL/Zcc+c9SyRyZ04wXZl9j8FNNjVmV /kUvxvpoCAdbRiye1lshWTfK9oUxrqQN2ep3lz4YmyD9c+tmwfGpSWWueDbb9DXW0VSIAl0J+/G PAMLxikqoe9Qj803uuHYxwilMr6t0LMQB7htyhek8ww6tfY4/8Ryc8ZMdUEkZSnCKTeAIBrO3fS tD0UJVpItfE8XPsQKtzwuTRtIbogEFagfH0OCozT3aV0utdPtvbuq9ilbsAo17ZI2ZXTWRMLV5c KgakJ+mrBu0N0a2CCqdN9VstU2pYjhrGOStVyQ7Fpb04uDV38K/cHMyKTfNSFSc2x/eKs= X-Received: by 2002:a05:6a20:d529:b0:3bf:b182:94e with SMTP id adf61e73a8af0-3cd2fe47253mr59858710637.5.1787593864596; Mon, 24 Aug 2026 10:51:04 -0700 (PDT) Received: from localhost ([2620:10d:c090:500::4:ddd2]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-14186183c0esm41854731c88.12.2026.08.24.10.51.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Aug 2026 10:51:04 -0700 (PDT) From: Zinc Lim To: Alexander Duyck , Jakub Kicinski , Andrew Lunn , "David S . Miller" , Eric Dumazet , Paolo Abeni , Guenter Roeck , Simon Horman , Mohsin Bashir Cc: kernel-team@meta.com, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-hwmon@vger.kernel.org, zinclim@meta.com, Zinc Lim Subject: [PATCH net-next v2 1/6] eth: fbnic: move sensor read logic out of fbnic_mac Date: Mon, 24 Aug 2026 10:50:54 -0700 Message-ID: <20260824175059.2485048-2-limzhineng2@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260824175059.2485048-1-limzhineng2@gmail.com> References: <20260824175059.2485048-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 Mon Sep 28 08:01:31 2026 Received: from mail-pj1-f46.google.com (mail-pj1-f46.google.com [209.85.216.46]) (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 C385A3803E1 for ; Mon, 24 Aug 2026 17:51:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787593870; cv=none; b=Em6jBASId3VMahWiA3rBjfzgufa1P8tR5f42sscY3zbDYd2ffsjh7WWh2P6cC1yXOIlDJE0co+4OfbJYvA+i/XfSoYhpzzhDj5TTR9I6v/nHI95zs7/H3WVlmbYYN/prb4MvJp36a1BKFGx+jweaOubCjRireXwFKIJPxH/QU90= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787593870; c=relaxed/simple; bh=VylVE97urOnGo1fKhA1IwM8dNjVc6rVPycHxhapEvGA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=pC+khD0a8sBvxepIRkbtsLfE0ZDJtOmXYrMs8Tje8kHqCn1dk5nlBNeoCEEXki9AakJojdgN8R0c55ECW/4jGK4Bdq7NA87G41BuTP+7KY+kaVDye+mv5sT4HwTQ/U4gTyRKyhhn4mS1Yeprjf1w/k8DqECqgcuKKnyvneBkwmo= 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=VZNEHqdq; arc=none smtp.client-ip=209.85.216.46 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="VZNEHqdq" Received: by mail-pj1-f46.google.com with SMTP id 98e67ed59e1d1-395ea741d07so1665598a91.1 for ; Mon, 24 Aug 2026 10:51:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787593867; x=1788198667; 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=VZNEHqdqh73dRJ90JBI/k7ctacPrY2CRjheyuT18bHhSF8WwaPi/E9UAMg63NnjK+h R10VcO/NvmDIaFafquDJQJcC21crhJG12B2+r6F3iKESkA1Tvo1v4ykiswng+vkvMUJF hXJpZr075UN0KQGDyEkgu9qhtl4UlBfxno5PO08Rk5TZUuGPqyhh2MB2700umXN+/iDZ qEJ48N+qzCOW7/Lc+DPpOmK8zutSee9Q+m5Rl1K8hdSr3Re2BbQqdfiNS/rx7RmEb4S9 zczrXZKg4sjyolnfL7nGkVt1d5aFlFVVMkO/xPFKnkdPZ/da7bAhhQlNctP40DKsGiko VM9g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787593867; x=1788198667; 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=R71/m9Q6VoX6J2w9oHXE45gNb/fUwmMSjst+3mWgNJsNYtk3DrJCwsH2S6RXhgWmqP QRBWNPpUZdAZ0RwVXoa8tO085kyWmjK4Eq3Uhsdrc4+wHP4hCayoWGOPi7/XOgPdbSur /u0+PTL2p7KfP195aas3rOtNjGy4CemMsf2AIKArDkpXuxsQxI+05ig4A4zKe2NAj5ZT nqp7RVckR/qwmSqiT42fOzrqyis5JrgbbWf/O0KVoT00BSR/o3xkJfSo6xVIxcjq8U8F oBbpCzlQqwJkFnuph/M5imaavg7AgrdTu6nqOZSAj4pqhUlkfU87tp9+saNYZ97aywWY 1o2Q== X-Forwarded-Encrypted: i=1; AHgh+RquwITbWounUka4k4pxrLedjqYbyVZ4k9AAecEeBtuQXucQJZiV97s+YrbmH01Fju2yltJeeWX9t04eQAc=@vger.kernel.org X-Gm-Message-State: AFuF++lZNo6Ydn6gOU1JcpTGTbqsqz26uX0t2oRMN7EaRODZvD1XkvOn VZg/LdWwCYhazexiPNo5wP+pqmZhIPKkq5qsGR1GUTzZT4X4YS++Ed/H X-Gm-Gg: AR+sD13BLg+tfQA/ItOFd36s1ggc/jel+rCVunk+LkUg7w9dgWZMhDLCBQ+QKHwFLiU 1iKqz6glihOn2LdzklnGe8DMFD1ruB0GHLBkZUXYK0VP0F+BNXefX10wxaMEn5ETYNH3wG7dFwf VsJ1JRsoqQnQMna2sjwFOm4cj+phBYRLUJ9kyMJd5aw4QIOFOC/lGrHbBh/hMsn29ZzMkvYY+pN IdeMihHFf8nzfQyuzz8OU7fAK2eXUH9jYuvgY2+lq1xiBWvkGnOHaNS5tZNC3jisJT4nFXLO0Qp 5yigKTUml5T+lp73VsuVuHUFjN84JWrLxYOyP+VlYWFAAgEgWVhhOxh+0c7v1FwO9QPRk+iHIVA ZIlOQ+Ik5EcaC8dKhn5v+IQgWvEOpUnzGrAmQ4hLSL1ZGPR//iTgjfqOPdsnnaWc7IpzRaVxrfm Qcj79VTaE5YjusiT9+uTp+9tv1EeOIE2aZp7imHicTRx4pYOkOwpp8h/ZGcIoax6d5zTA= X-Received: by 2002:a17:90b:4986:b0:38e:e9b:ffa4 with SMTP id 98e67ed59e1d1-395c33cf295mr51309257a91.6.1787593867050; Mon, 24 Aug 2026 10:51:07 -0700 (PDT) Received: from localhost ([2620:10d:c090:500::4:ddd2]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-141861732f8sm26815132c88.10.2026.08.24.10.51.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Aug 2026 10:51:06 -0700 (PDT) From: Zinc Lim To: Alexander Duyck , Jakub Kicinski , Andrew Lunn , "David S . Miller" , Eric Dumazet , Paolo Abeni , Guenter Roeck , Simon Horman , Mohsin Bashir Cc: kernel-team@meta.com, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-hwmon@vger.kernel.org, zinclim@meta.com, Zinc Lim Subject: [PATCH net-next v2 2/6] eth: fbnic: expose all hwmon attributes unconditionally as read-only Date: Mon, 24 Aug 2026 10:50:55 -0700 Message-ID: <20260824175059.2485048-3-limzhineng2@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260824175059.2485048-1-limzhineng2@gmail.com> References: <20260824175059.2485048-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 Mon Sep 28 08:01:31 2026 Received: from mail-pj1-f49.google.com (mail-pj1-f49.google.com [209.85.216.49]) (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 574C73806D0 for ; Mon, 24 Aug 2026 17:51:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787593873; cv=none; b=eTttYwhUJCscHW97fMuZE+um7AeSJg/1xOr2BC4/2+hErmzrnlVrfDPrr1N+db736/awIUY1RM5mpcfYgT3CwBLgAwT1ChE4/oqgy4qs5dRQmtdnt5iVHUeHuyEbVJW7PvFe+oAmrf/OmIbj5LF/AG83t7AUfGcs/JXkmOoWi3U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787593873; c=relaxed/simple; bh=F4Vn7w9he8XvFaQgePxC49jos8Ircb4h09eWzonsEE8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Jh+bey6/+n7JrDFtUNQwUGnVVAaK/ryTtGT4QqlU+Mf7VnieravSL7IQlIzlDkXHJ7SD6blwasN8ceklQcDTvu2npfHjQBk0PS7jPd8J68C/S+lnVdgSe9h+z950/5IOwNALoCKMzWd7bm6G0GIFS+SupNSO+FSufAeqNzmdcMU= 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=fDVpcOgt; arc=none smtp.client-ip=209.85.216.49 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="fDVpcOgt" Received: by mail-pj1-f49.google.com with SMTP id 98e67ed59e1d1-38fdeaed181so5342958a91.1 for ; Mon, 24 Aug 2026 10:51:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787593869; x=1788198669; 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=fDVpcOgt5XZbnEKR0ZvR2QLm2c2Dr/bbUcaEsBnGtjqmfP/9+AyEbp5VpuHqumPv/v 6o46WDwiKPj2HZVMlmi0PTSLnecbQubO+nhonvO6SHd4u0MjfqvB7oWJtoQ6o14WK97o 6AU1FAAb0joNT+npr/oiiRaeqTbOzHC4RLM75RwwlfKooRzre0TlQcSsTA3+T5/EbEtX OYrxV+UyA0sGhYv/Agqtz1hb+RPqilwSrZfCdCymu2Nk56mKdmI0dzV5af9xcVe3u8gH hL5FvMZqRKuEqF5U/SL3uhiWAoR8kUpDaxGzuPbFVyB6M/+hi9Kzr/O4yspTi3pR9fLL QKyQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787593869; x=1788198669; 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=ZocXWBWgHVk3LN9OTeNXOSFTJlxdcbPCUX3wrTPaai2HyWvdmVn33+6I6A2r7hg5i0 kvBSXpNi5QLBj89KoJUoCdzP+sM7BdNOuMbDU5PruoWz7R0qQARl+3FRaeV6Yy8JlG9H FodjACBbtpPhojmH8ZSYDTeI4Qp4JqGNQbw9ZUkwmNzWeXBoj1eamzBlRlOHJp+o+Q1O ApRHodc9yvH3wsN46LxCrenXHIIjNUYt6eLrXRlUKNKm4wzIPdwmXpu40f3cGLHkq2YL yO3IiOyuwPXDyvSBi0VNUrp73zXSljEypgS5zN2xcU66veJ9f6aMl7WTVQpHSd+3aDbT DGZQ== X-Forwarded-Encrypted: i=1; AHgh+RrSgHmGiiBxPxpJUzVWYwP3vGbVPdUokWEWEZbnlg40X9p6by4RaepHkDgUFYGw8JJv3N6PCNAm20/hwZI=@vger.kernel.org X-Gm-Message-State: AFuF++nWT/xDB1Fy8wxCxeMjgMvWantFTLTFQomfxejC+wSpnmYWQguV FM/DKIAu0Y9sXjKV1mcMCYxdu2RYGAO0KfU48z/eqGWH9PrEgEZKRAQ7 X-Gm-Gg: AR+sD12QuHvTFarQVMqXnhkcNDEut3OPR5a1mD1Qkkniz29kSiMnkHyZO/orQ+DsX8P B6MS+pOYPLp3C67qJrXoydjggjYYx+WheAre+QMXqvIk6Fw/1vjANSVGehy397VVPsfTrK1crXV s6n4dPSVxakh5N5qb9e2I7gx14/mziE1eBcfNQn5W1Ij6hZuE8nGw1cL8QEEtB2iIlUj+2hdAZj 7SHh5+py6Q6yEPL3iDueRqf/4T0ZyORRO99PgOfQR60+t75uX+0h0qpHhSx9c/pmsGDP+FUSvGd 6Quop9htO4Us2ZKlRIc8yF7Q9/pOGIPSoQMgCcD2KcKG4aPOmzRz5xewB5aREACZAoKUBZOfLWp 6a4GlRIRpKqar04bTdV3/HfFJJyJja6d4hQ3Y59Wzf+PHMdbsJq8aqFA2SH8vu/QdC+N64rFgIW tXardaOgCAAnZt3bfz2nx9hbTCtlp13EYGOzkZyAUZccPDxsqMoETU9UiApHcDE/xs1wU= X-Received: by 2002:a17:90a:d64e:b0:38e:1497:af5b with SMTP id 98e67ed59e1d1-395c33dd84dmr53348731a91.1.1787593868662; Mon, 24 Aug 2026 10:51:08 -0700 (PDT) Received: from localhost ([2620:10d:c090:500::4:ddd2]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-141861732f8sm26815372c88.10.2026.08.24.10.51.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Aug 2026 10:51:08 -0700 (PDT) From: Zinc Lim To: Alexander Duyck , Jakub Kicinski , Andrew Lunn , "David S . Miller" , Eric Dumazet , Paolo Abeni , Guenter Roeck , Simon Horman , Mohsin Bashir Cc: kernel-team@meta.com, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-hwmon@vger.kernel.org, zinclim@meta.com, Zinc Lim Subject: [PATCH net-next v2 3/6] eth: fbnic: cache hwmon sensor readings Date: Mon, 24 Aug 2026 10:50:56 -0700 Message-ID: <20260824175059.2485048-4-limzhineng2@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260824175059.2485048-1-limzhineng2@gmail.com> References: <20260824175059.2485048-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 Mon Sep 28 08:01:31 2026 Received: from mail-pj1-f41.google.com (mail-pj1-f41.google.com [209.85.216.41]) (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 2EAA83803E1 for ; Mon, 24 Aug 2026 17:51:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787593881; cv=none; b=PD9BfIkt1Yotf/uiNp3WaOu9ls1BuZWzqIfhpBPHEXfHF58xZn1fB9g+IMlyo/VOQOqd0JaM/dVQJMg4vjXbzSK7eAfmjp0aES1Unv8JjPX+qrNMjAcoykVXEuTIBnnuRnm0iJtu/RYw1S7RH22VWBciXsYIoZgy9bYVPaJ26C0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787593881; c=relaxed/simple; bh=7ryBp4J/qEyf2/01p+hdf/8QZoypRA4clk5o6hi7rC0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=cp7WLbH2Ct0fMDYnuoIFkS/uXGCK+d3E1GcZ1r2qKtHwIWXS7SZuMLQrEzZVoCIvdjEytaIZ9/mS1ckdFiC/hO3N4BJv+BDr29x4WzmNPlxUN8oW3oIApgjFcmjrtWd63ES/196asO5cuZM5kUsindePbUYz6VriQXfbqZrYUBk= 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=n3WUE3Hq; arc=none smtp.client-ip=209.85.216.41 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="n3WUE3Hq" Received: by mail-pj1-f41.google.com with SMTP id 98e67ed59e1d1-38e7109321dso2698269a91.3 for ; Mon, 24 Aug 2026 10:51:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787593871; x=1788198671; 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=n3WUE3HqyfSf4QGrYJ9npwF05sPEA0GOeey0JkGqVdX/F3Oy6ILZ5iSgWb7v0KWYc+ 08NQVNvysFZQOgHGDe+QFB2XMd97C8HHXg7e5jyHoAe23seirJtNXeA0/2U/79t7DK57 r462fqwz2ou8fSby+3wFHr13eNunT0vdcuiAiQt6skpbzOkGWu6ap0p8eoIPYFf/X9PW UPOMnRSlTHWhKCpWFcsqOpUiBJV3FPS/MbaVebhIXnwmH5LMw3uC0e1f/1zSV0nVRvdP 7M6XEKa0KuZY3o4VHCeHJQLGjW+/Ir5tTMolMtpflUq8w7rBINIJ0lbEaURUkGkJvfvi y72w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787593871; x=1788198671; 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=D5KfLlUnLCbHlDG54p3pU6doQlsTANSv8t4TGwgGoeBZSeFBDcwwj5+k0cXz/zChr6 v+/dnQcpo+WZg4dRd72KlDmg1IWFXp76IdUPqefneI9Q0Ib3PwEPXSOz0osEno3qEtTm 05V1nKEBJHyv06fQAGGK29tvELpwp9kaq59gLefHslAWs8a9KGqExZTmleXLi/SIlTLC GyEjSCvLMdAUcUTtzc9ZWix5Boug5jBvnggyLa2IyjNwxTSNJKjZk4Bs5tmiFNWPS7RY yGes8/FW2B8jWKwt0IOJJGChsBc9MjAs4CwGZ/fweUNZ6HKBbMUtS81ePFX9EGSsel03 nQbA== X-Forwarded-Encrypted: i=1; AHgh+RqGAGEL3/lRNKu5tCYe6u7b3Kwhv0crZ44fj38x834MvCaP2061WmBBRQeeoxZkKmHpoUCIBblhfkUFZHc=@vger.kernel.org X-Gm-Message-State: AFuF++nCbohFq66NgnIgmyhA07dLZm8vbnMddUyP5TVfQOyNaWcKWu5a dL2UkUMMgRkMuZfo15u2h0L4ts6rTkDjjlEc5X8KLIfHwmuwYKNUjmfN X-Gm-Gg: AR+sD11M74RSc+BL4NbDUWePHxfGCOl+CHJmrL62kYKNSNFVpt10uc3R5EQ2u4hLJR1 9MuzV07l9qy+kDLJnmlgZPDhUt0h2Vqw9VrMV9+3srut91HMez1mB8XdiglZbH38ocMNAHQV8wM DH2WF2DpfForMOJWI6n/8mCrNzbT+DoMPIR13Iu0Py8esBxiTKT4VHWlPREBCoILbK9K/TAwTKW lmq/RGQiEH5PdLmsjUJjYGBYCZsX2Q3mS9cKGhfgxfqL+/OgwAKc1DyoXwmZD2mASy2qE3mZBwA J8OnBoQg7/6Xy6sg3u4J53yBm2AVFPYQorKyFRj8hdC7iOKVZgphP/+wBT9dz9ISTmgzBWFzqyC 6x8Wona4m1270K7VTtPwhycsv8M05DC7LTlZhnVtVERICTFozAWrPxqpB1nUHXiTn35hJOVufrU OlMOXCV+hMgAZYxHtSOKXuVP/Zt8CGP6/lOA0xMKtXBqGyXuK6WS0tr2oUJYL3ZZd0fug= X-Received: by 2002:a17:90b:53c7:b0:38e:5c6:4db9 with SMTP id 98e67ed59e1d1-396464a15f2mr1063732a91.11.1787593871092; Mon, 24 Aug 2026 10:51:11 -0700 (PDT) Received: from localhost ([2620:10d:c090:500::4:ddd2]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-141860c6989sm26462410c88.2.2026.08.24.10.51.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Aug 2026 10:51:10 -0700 (PDT) From: Zinc Lim To: Alexander Duyck , Jakub Kicinski , Andrew Lunn , "David S . Miller" , Eric Dumazet , Paolo Abeni , Guenter Roeck , Simon Horman , Mohsin Bashir Cc: kernel-team@meta.com, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-hwmon@vger.kernel.org, zinclim@meta.com, Zinc Lim Subject: [PATCH net-next v2 4/6] eth: fbnic: report temperature and voltage thresholds via hwmon Date: Mon, 24 Aug 2026 10:50:57 -0700 Message-ID: <20260824175059.2485048-5-limzhineng2@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260824175059.2485048-1-limzhineng2@gmail.com> References: <20260824175059.2485048-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 Mon Sep 28 08:01:31 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 567A237F741 for ; Mon, 24 Aug 2026 17:51:13 +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=1787593876; cv=none; b=bCg8ijgMQvdYX43KPJDYIGC+qX+XGwQ/McIxK4D+Db1l/FWqTncvJl33y8MHstfQmUNqJYePxcAPDRkUjBQMOY/8kPUwYqpxSc12XRIGBX0B27am9Wy7zWZNrAfCrcWRr8T6S673dAeuIBv4nn6dADyUrcs7kbvsVYCKP2NM8us= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787593876; c=relaxed/simple; bh=QK8aNSzL7ND4hoq7Mvy7TvP92pxHrFlqyV4BOQPaCNA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=lESaAqy8tQcAY0aUGwWoWrH/7e3vVZPgrGI51c0czs3iSys5zKmZE4bdCn4t38UWzIK8o3eUcJblTbXjCJAgrdEXJtTQnyWcbX/Y4LtG7GWuy3IQZPHJNSvqoDWSbMQkeD54aE6/AcALTMQsgS09TdHcw3mmQfllKUj3IC3gaHA= 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=AzsZ6A3F; 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="AzsZ6A3F" Received: by mail-pl1-f175.google.com with SMTP id d9443c01a7336-2cf52d15d88so32930685ad.2 for ; Mon, 24 Aug 2026 10:51:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787593872; x=1788198672; 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=AzsZ6A3F0/ybYAE6nTxi77LwT5HH0epSZBs6TmmkRBw6Y66eFaS5uWfJ9r/6AqpSs2 Fkf6MJsNN+P1FeOeg/6oCn0aAsBzmOKVlApye4M9F3+qbf+ixkZpBBetzZaYwTSQyLSZ PqmD1fK0FGehDrCKZ1K9qYTxZ+R+Y05Xox5C4D8mSdcOcIY6LaRx2ivUkOqP6kOpBLvC MntIxeD0M1aSyxCzLzVt1h4fF9RDkzi268djjdoQjIDhHbvWdCoZHQrA5UoIVzD3aaXa dAJeQEywY9tXuhmjNy+my4RgRwZYQzGfTExbnM/NlwWXA3PPjXem5wq4KHoNISyxdHSe /NWQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787593872; x=1788198672; 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=Bvb3+kgSTydmGFHgqCvYFdSh9Stiltn3miRDmGcHco+opHkVDtsN8OcR3ARx2mGzGq EsVmkWQ2IKiZ5h2LewdUDlFgHcMNgFxA4fL6LmYQr9dKax1ICVJuklifw2ITHdm3wzgg kwitMv2V9Bf0OSLUcXqSsK0iu5WRAAXpMjvqjWiwGBzpkko0TiMxh3xlvtUAhe6qyy89 tbIkaM6wL6LSwi6xIifmaN1FrJ1Xsxu7b4X38sAto+3OQmCPn6oQLWXFPDkNaWI6oXj6 fPwMurewr7agXZXeUiRXT63nsgBH8EhnJK9YrQp5O4Tut5yWIzyEAYtY1Mtn83x8MMBu iQkg== X-Forwarded-Encrypted: i=1; AHgh+RoCNj2STriRLRBtWcczUbuplMb6oCgQ3IHsrsj1+CzyB3R19cfQYt14ZLFG41CXdbYh3UDXuH7WBg4NB1w=@vger.kernel.org X-Gm-Message-State: AFuF++kfddzR7Pzr6MuFnAS1rE75wJ84hALthC/ZaFkWh3pOFkt6B9Ed jib6DObJoFfVMmYeY1Dd187h/jGFcJznJeWWLUILSSbR1YtCWvUdvhgw X-Gm-Gg: AR+sD122I047pzWCmOfkYfEDzncezzr8etNoHc1Q7hm8eHymSGp5iMO/pLfg0cCGwpq A2UgAY2jJtIqKcxX5nCepsrxHl9WwN6NGHsC5Mm2rjKTQ2sc7adFCI/D4s0dbFJZBwFYCT2BcaD J9Iq5Iub6mmfPL7dKJOtMS7Myto7Odd8Qsvcc/32zwLFtGIAbGWh8OoJKUeHvNh4W/iOIIs8W6w BFVvKWD1TLSPFhWx4NHVulZJwJS+hkHt4h8W8GnQ46pwdpZP5g/qcQujvRkSY3reVIPETlXhAIB rhpgEM/gPzNfFe+xuCWsKAfJls+TnDpDAn43+P6NN/5N9FLIbZctVJY9deBpC+mwjVynUQtkC+j oSFvqbeIQ4juXEOkqKkkRk/zQrLrrCdyfCzHPDLQFdXcKocFCMKFdPnbnmBhG2hJ6PcxU2EeGld UpbZYOz+cJK9oFAB+6txXXm+smHhVCHKtw7MUQvW8NsIZW8+MJXR4ZKm94hTE7wfcBKIE= X-Received: by 2002:a17:902:e74b:b0:2ca:2079:91cc with SMTP id d9443c01a7336-2d6dcaad3fdmr14430375ad.5.1787593872430; Mon, 24 Aug 2026 10:51:12 -0700 (PDT) Received: from localhost ([2620:10d:c090:500::4:ddd2]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-327f90cb8e3sm42038477eec.12.2026.08.24.10.51.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Aug 2026 10:51:12 -0700 (PDT) From: Zinc Lim To: Alexander Duyck , Jakub Kicinski , Andrew Lunn , "David S . Miller" , Eric Dumazet , Paolo Abeni , Guenter Roeck , Simon Horman , Mohsin Bashir Cc: kernel-team@meta.com, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-hwmon@vger.kernel.org, zinclim@meta.com, Zinc Lim Subject: [PATCH net-next v2 5/6] eth: fbnic: report temperature and voltage alarms via hwmon Date: Mon, 24 Aug 2026 10:50:58 -0700 Message-ID: <20260824175059.2485048-6-limzhineng2@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260824175059.2485048-1-limzhineng2@gmail.com> References: <20260824175059.2485048-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 Mon Sep 28 08:01:31 2026 Received: from mail-pl1-f173.google.com (mail-pl1-f173.google.com [209.85.214.173]) (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 711C137FF6A for ; Mon, 24 Aug 2026 17:51:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787593877; cv=none; b=Ru2HQSas3rOiHtpIEo9Cb/fzx9NvZKgM5vchoIXJGrUxv/atK9gIx17UTxx21huRiflHyD8GBk5y0oAm/HGmp79CJtDGZcOoFEDNSLooWKkfiKJfNFtfaRSpPemkehbY5En+YESl//xTKdsTnQD6q4AOhkbyGcPSvkwJiuY1r+A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787593877; c=relaxed/simple; bh=DAi+XZ+iVzK9opH5tLj0PVy/X0Xxq2muFO+ODlSkT0c=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Dl+Y5VvBtUfVHv94SNEjouHjxzEj/Yzmz0HEMjGZByqAb7l1BRW+JpuCQ7a9UMAlpL6QN5uDtgC5mPgP3uCmAoEqpEYyKVjiEELLVVi//tlMGXjMqApM2uozzsPIn+BQNLy1zCVRJiQUKQ2lhWHAJRRJG71QG1hiH+K5j17JLPU= 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=TtPZuA7c; arc=none smtp.client-ip=209.85.214.173 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="TtPZuA7c" Received: by mail-pl1-f173.google.com with SMTP id d9443c01a7336-2cacf197759so49417325ad.2 for ; Mon, 24 Aug 2026 10:51:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787593875; x=1788198675; 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=TtPZuA7cXtbhbi58MgYXqotecSNJH7OYhbTB0YUWp6MdRbHv7V8OmMLPggIqCXiUmk ErV01dqfDI2PmbXKSIedYLvM/gZcjL6UHYTtRDRSydCZDzwoLP4MNvDV8eP5cHGvhTZC hoRJa3ggVkVx81k+djbnNgNnA8v3jbwfVYjXGdOburwsRNlbRuqybnm9+gd6TdTh/bYp EtdtRV62UaVwQT1CC2gemeaYULlnt5ADgRP6Decwdy3X0371qE9TH6jhj2HILBHhzMH5 l0zVuj4bY4lOq3zAuauG2OLjcRjMqXyrJtrow6/ET6gvW/Don89xIhfizBQxytaEnzBw 8+JQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787593875; x=1788198675; 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=DMDAh9EZxjksS4YeA1vys8QJMJxyKis61ctH8co3jXRbTMjimETRvxhWcrH1Y3Glw0 RO0QDybV8/PkD/WepuusnIgIllGBvJ6nAaCMGfTjM6wnZdwIHmnCH02xMrNVo5J7IXHT 6o3SwBsyNVwZ7Afjo1ulraOYEDseDYH8Fq6m91jk8qZWPa+RviP4wlfgCdGGxjQNwd4X VhhMyaRTe8RBRqRsPMq+jqUEJ8+sgcpUA8E1eEkWwIzO+SDST5Yo4EpkyWBN2pfjo0aD +CrSbE/f4VNbedqTSxdY6uc8tt60YGpkpUdAbDXrzwP3jc8GUyTjk9nNeMstEqwL3DU6 KNYA== X-Forwarded-Encrypted: i=1; AHgh+RrZgZb196ZyGj4VmRpc2AMrHjVTFvbqo8EprpSNzoxT/9Q5EmXMjHvhKD76L5LX1Pf0uRJ+r5W3yimDOjw=@vger.kernel.org X-Gm-Message-State: AFuF++n+VoTaNV0bimCNkZsImdThciYYvblLRTqmAge9orUTOW5n/fH9 FCSxFAvT7uq/9tZItJfjXcd7MSE+hEGUHkQKJmExhyaG+2axYZ0Bw3eQ X-Gm-Gg: AR+sD137Ramhb4oNOncZnzLyXiUb1rAZZRrqNJl8asfXl1TBv+sSD13ip02vhq8rs45 RIj9WcPiD9Qncsyy67pSyGTgI4PYUFiw1+3sP5MhcIHQKuUyvImQ357NbVp3sR5gCctYDguJp+Y SZVPZ1w64vV4pHlh7lnqZyV1H/A0HkzsBRWOT4cJ9ZDjxAA8maeQFLPk2jXEougzAFfKU+EaE5W w0pz8QSCpewEoUn423trTzc/SfYm0RhubNB0+0JZJU/xbXIOJfGbSMUY2DPA0khM5QqJq9bxJiZ mC6ChLn2pNQpTQ8u+ok/hQjL6c80BI0VS9y0CsfeTJtPd69KD1mvtKiadil23yuLO5eA0ZIBE8d hFsNAY+Hds+wMMOtmKIkmJabM0VSGpRLTf03rCKdisttGofpTu5/MXx+lgUeliAMVHEMxUTtBvN rQsA2JW9taBYAfIxWWyBJZLlWxNochCzLgRAs6QPY4oCQGCQrEU9sUJ3L8Waog0QI4XlI= X-Received: by 2002:a17:90b:588c:b0:38d:ef48:b04 with SMTP id 98e67ed59e1d1-396464bf465mr1085197a91.10.1787593874845; Mon, 24 Aug 2026 10:51:14 -0700 (PDT) Received: from localhost ([2620:10d:c090:500::4:ddd2]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-327f90e22f8sm25350961eec.13.2026.08.24.10.51.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Aug 2026 10:51:14 -0700 (PDT) From: Zinc Lim To: Alexander Duyck , Jakub Kicinski , Andrew Lunn , "David S . Miller" , Eric Dumazet , Paolo Abeni , Guenter Roeck , Simon Horman , Mohsin Bashir Cc: kernel-team@meta.com, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-hwmon@vger.kernel.org, zinclim@meta.com, Zinc Lim Subject: [PATCH net-next v2 6/6] eth: fbnic: firmware notifies hwmon on sensor threshold events Date: Mon, 24 Aug 2026 10:50:59 -0700 Message-ID: <20260824175059.2485048-7-limzhineng2@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260824175059.2485048-1-limzhineng2@gmail.com> References: <20260824175059.2485048-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