From nobody Fri Sep 25 20:02:37 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 A30BF3E3166 for ; Tue, 8 Sep 2026 22:57:42 +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=1788908264; cv=none; b=lmk61/BwgOVEnV4oyOK9N+8SgfAfMryVu8kLAEGg/2nO3mpH1bZqGqsr+ZTDItfXdv4ggY/x0zL4oo+7nX/9iqnBMdesP6sbhQpKgoINXFRqfbN5pm61CV28UxnmQUi6NgikfZPlasic5bhn+zpAZhMO4es22hUFuCUfFzDGvDQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788908264; c=relaxed/simple; bh=Vi3BmT7ZDkiqyokg+wo6JFBFy7A29xrg2kuZJqXCm60=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=NtxDI6y/nr+KUhGJYNGT8yP1VBCkpaY4wapp6lyy5ca5G4LsNTR4BANarzfm8Vt+5Ttl4oTQHlccvglJIlHy5CB/r8tPTdAChY/tFl4djCWO2LujSZNcXI87+Amixwl89VEYgcmmaS1NXkP7wvJhAkRgEXVmpx4q8l/S+Z6xK/s= 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=NovJKql0; 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="NovJKql0" Received: by mail-pj1-f43.google.com with SMTP id 98e67ed59e1d1-398d2b28acfso3885952a91.1 for ; Tue, 08 Sep 2026 15:57:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788908262; x=1789513062; 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=NovJKql00yphvqYTYk+iBhd0giPXHuSlsfwsN0tLS1X0BbjQ95nIlOwU9ABoTfCxia Ml+BjY8y6jrRbF53fHP0ST7jkXc7mWgVCWAwbZe/VQymBEsq0MeHQWOQAhrhhRG8UtTO c1pdLvJEW3MgaNK5U4sxYf8QQt8RgcB5dcddD1D7/OOIHFBTZrdVk35M0v9uOfWaBR7z mTfuH9dgwsolA3w1rfiVJm5gzinUTrc7gjaBQc+2NXNJ/H7rmFXPUbc3acVWaH3UtyAJ WO1NywkZQYMzOKolNnA5/+Oc+LhiTsJjDPwwHqfWYGEpr+vmY0PQF5zuW7SZdve7o9+K ELLA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788908262; x=1789513062; 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=EULnA7B9byjcT8VjyB1QgHKTNycPZtQZKs0TkEy0gU43MsmawXfQAzjCMswULqxSYb EyPRok9GTZ52sbp39pf7aHtfcjv4dQ5vhOUzgtZ2M6aiUn66QrYsfrtUkX6qfo4OaXkm 1qPnEmPkglnGNdxrInJjndaY9b1FRbyrNnHMkzzpUXd2R95km+Y/8YgA/tp7+B9bg/Xx IL31+iwgTcepHBWBGNyFDlW5LYkggJ0wHE5fu7HkyOIAd9hKyBF3KW/VrwrVqUADr9Wk u4+7OlEy6/WNfsmelVlXhrNtAbiBkIpG1HZXuxQiFjCyaS4cn1enx2/ssdovhueWas+G qMSQ== X-Forwarded-Encrypted: i=1; AKwUvBwMvP4dD7CEP8mbO/3ObGRUb94lBKuEOR3+GX6jzEQ+GqCTcbsdIAXGU/FYYALbjN3Bf4Lvx3kaRWf+Fqs=@vger.kernel.org X-Gm-Message-State: AFuF++mXdtkMQBO6Kamz3CNF0Nr4c/FEhbMRDZRDrtpfQ973rwjGcdL8 nuuRWXVcKvVJv8EEWyz4LnC0WT2VnPRIb4zUp+FQ5JddcNkXIcTLQ/mI X-Gm-Gg: AYBFou2xHGECaOitHvlkgS0QS4KYdb8Uv2I2nO48XDuB2wMYHeIPU+CSSp1MmevgTot FJTSafiqvxmuEvjwOW7T2HziGa7op4mxtMStHG8lAGmtt2extl1/KOE573B437PxXfugdJOhaJ+ ftcaH5b1iULDeLdd1SPNRayn3vUXDMzyOZX04qMBTIq0RR9oFRZy5XePiuZQPFioMQLWY5B17at fkneAyTQSeF3YmMZN8jdScdZD28Aqp4MB8tyLKgRdM1wekGorOdZsamgh1C7PrCngysqx8P6A0H X95wZ/ER+o+Y1Tu5JOCQhfNMkFZQusfKLRBQuzNECZcIqf6xsMeomIZ9eaub8gAmqWmM5WBfk3F ef9Rz1eSPWIs7D8qYMxc+4jtG7ruTKQ1RIgsULBOGt6TFaSYIMrul50rNgbOE1Pq0wjyPNVoY4u clnSzjlKRcQXx/rxrI8UJAeXmsZNizANpl1KbKCulz6Kvrx8ikUZbr+rhONRjzJY6K248= X-Received: by 2002:a17:90b:2b8c:b0:398:9be6:f995 with SMTP id 98e67ed59e1d1-39b262aaf48mr51243967a91.20.1788908261877; Tue, 08 Sep 2026 15:57:41 -0700 (PDT) Received: from localhost ([2620:10d:c090:500::6:91c1]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-143243f780csm35210942c88.13.2026.09.08.15.57.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 08 Sep 2026 15:57:41 -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 v3 1/6] eth: fbnic: move sensor read logic out of fbnic_mac Date: Tue, 8 Sep 2026 15:57:32 -0700 Message-ID: <20260908225737.3034403-2-limzhineng2@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260908225737.3034403-1-limzhineng2@gmail.com> References: <20260908225737.3034403-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 Fri Sep 25 20:02:37 2026 Received: from mail-pl1-f172.google.com (mail-pl1-f172.google.com [209.85.214.172]) (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 B253C59D63F for ; Tue, 8 Sep 2026 22:57:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788908270; cv=none; b=p1C/QgZbbARYZIkQaowV/YpeebJsSjQcKizhMJr5D41U35v6XEB8HdVqwPASva0dDySKGn9lObxNN8jjKNlf2NFrOGm8tapHeYGcqSGFYZpL/ZYmGElZcwloYyZtxdTjP2PT8cK7fFdPvZeQ2xw6elVlSb4O7wZEidZssk80eck= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788908270; c=relaxed/simple; bh=VylVE97urOnGo1fKhA1IwM8dNjVc6rVPycHxhapEvGA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=lVF366ainq3t/5Rjc8Kow8ujb3dvmCVbXT44Kn3P0HYLgJhJEFISKskY39WET16aRv2p1JdiAVkKkmTZd4A1Q6Y1jnQESS/wnPEfBO56K3u8XECpFdAOq9RSmaw+Z7g1zfwmeaV2hbtJezwE6sMaGSxOYwOh0JHXYh5iyTuC0tY= 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=Lj7RsMSE; arc=none smtp.client-ip=209.85.214.172 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="Lj7RsMSE" Received: by mail-pl1-f172.google.com with SMTP id d9443c01a7336-2d94c868ea5so52179545ad.3 for ; Tue, 08 Sep 2026 15:57:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788908264; x=1789513064; 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=Lj7RsMSE6XdDJv7V9VaeMxnHvUyUdiOOUjCzRUFGjQLoRz4eRmlTUwCIjgbTQ3h6Aj aZo1omXRAYcfzR0Z6HVzazpMicUmQfY2E0+w691HH+1WV3qUWe5Vy3bdIsfuLMdBkj4/ vxblWXPjMqszMiTCbMPJ7mnnVb6ClYjRC2S9njzrhxk2mfV/U57HmfNCh+Zi3Zf5drn6 9oQeL+4DAC/A0+sW/HDar6vIeJmjEsszo4D8KYsl3EJ5CcIaRukFbmmpOgJYltMAiY+s pOvVcYkPLI3CKG6jqNEcmAqKjDftKnfMTjzrPFfRHGEXtAkKHvLGr3IsIdIQSy1Z2WDG q3IA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788908264; x=1789513064; 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=P7LdnCu+26p7OrBDDuDz6WGt5f80FWwdh7MF1b/rOF1AD3TN2Kg73lAU2KTbkEOSiX czXUD9Tyd3NKuggMszmJowonSqWWXoteXBFCzTDfF2wYprhDzqDtXSJrKy9dMH4BgVh8 ES14Y0kvrjhglNFJpEOqcumfKQmycroeHpRkNhDOp5AuzUBlgycpxi0suj5V4Kwhpsno I6OYHM9sLvZY8J6/smpxDvaWY/3ap2AZPqKPRZnJK3lZ3wajmYrxXcC3St5M5W3TQYc+ Ewj6mvhi63Ip9nl6I9v4BWo5N8MTF/ge837+4g7WCsiAT5sKsD/j/RABRrIOl/e3NvuL gjJw== X-Forwarded-Encrypted: i=1; AKwUvBwRXk5wBjgLd5wPwbheEwxMCJwC+v28Hv5nGOKyRg1o+MD4TY0QCXn33sR3yvH6ltikeKW42yEjuNPNh5k=@vger.kernel.org X-Gm-Message-State: AFuF++nh+9AEcERlB/3M5oJg+b9Ac4vARjQnQPMMCO4ULhJF94JhSZ5G AeX9LvxN9OQTSdoFFfOMRy29/asTcD1o/o/H2FFrVO9UN85Ew0+bfiBl X-Gm-Gg: AYBFou1IBsXtNF1r2e54jLAnvSTZedBqHl0/PaeUykS0WKk6J6vfavC1Xiyz+jGtQ4q XZ0v3Z6l2o3aUSbUT3Lbt4bO8nNOzZmx4u1Pq5iriRu9iTQTu02seL9YP1THG4/7HyLles6Dqt2 xTq3FiXbZtgZa3CvEQxHoc8z9VaN7lyhFlMURZDSN1CQiA9CMQckSvUY4RyKBpP5QA1BpVoy4sS f3y4fHJphzIDK9bV8u0irEaHaAzCALaMdkkTQQoG33pjWZohMU8IyOZBg/9US+Haq8ury5Eflni aJioPTn5kL+CTXTOGZ1OE1w6xbvIifgpjsIoVWGYq/sQ8yC4VY0l+bkwO+26e2t4a+aMpmlBtOF SKgpIJARhmmgdTnUO8C4AEoIep9u6SzLb/cLIP1rDWhAEaEEDIE9vj+SIFQY2ZO7W/xa3SuX5QA Jf5vJ1vgBW2T7mRh3EgWS7gOfzJl441WghBUb1XOjBqG0LZRs6PxgRkgf5Mmh/5wcjf/M= X-Received: by 2002:a17:90b:5790:b0:398:9bd5:4910 with SMTP id 98e67ed59e1d1-39b2624f0ffmr45595682a91.23.1788908263245; Tue, 08 Sep 2026 15:57:43 -0700 (PDT) Received: from localhost ([2620:10d:c090:500::6:91c1]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-3339a62be87sm32982165eec.6.2026.09.08.15.57.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 08 Sep 2026 15:57: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 v3 2/6] eth: fbnic: expose all hwmon attributes unconditionally as read-only Date: Tue, 8 Sep 2026 15:57:33 -0700 Message-ID: <20260908225737.3034403-3-limzhineng2@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260908225737.3034403-1-limzhineng2@gmail.com> References: <20260908225737.3034403-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 Fri Sep 25 20:02:37 2026 Received: from mail-pl1-f177.google.com (mail-pl1-f177.google.com [209.85.214.177]) (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 8B1B75A514B for ; Tue, 8 Sep 2026 22:57:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788908269; cv=none; b=P4wq6aRwK4YWLa9ysEwksnNQSF/bhJRuK3Uq5gF4aQ4toLxQ3M+/i8osB9k3Cp41x4FuK3cw2b2r7bm+Q6kuZhwwkZWa9erSqqkkytf94SecUyg0dvaxwGqXrE9y3bSTTg9JsgD+J74MqG/8nWrW4VrL54THbNT/Mw3N5N9KnVU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788908269; c=relaxed/simple; bh=DQmWpiiP+cD4WOs/XMACwGLUuwq7F0q+Wq6Ld9uy2Lg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=FpSMqKr1TyrzzysiRVR1dlL1ndIOqRdfEXw48f7rpDnbJ0p9JzAJgKMvoeC6F6wNUuKUdDGRZNq4fSR1aPtdXjXu8j/WbSz01yBL2NWxHVZiBAuXwoqObNI5ntXDSfezquYQIIA6vO7aMOhXe1IcGE1wgeij55lztPfMrvPe54A= 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=mmpF6IUC; arc=none smtp.client-ip=209.85.214.177 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="mmpF6IUC" Received: by mail-pl1-f177.google.com with SMTP id d9443c01a7336-2d715f4a587so72322145ad.2 for ; Tue, 08 Sep 2026 15:57:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788908265; x=1789513065; 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=wumeOXgAu9H0Kp97qaCmHzt/GpEB2ltmfWp7a6Ii+u8=; b=mmpF6IUCM7VAx/+T0HKOxspCt5wTL6l3DBH1qE0kFMamRLzsk1/q1FZ7WazcbNfllG 9ujr5jSZAeclJVXXgd9btNs/9DDa0sDGcnp52koT+04HQAIeYZrFSJDbCV2kZ+NZeh+z 9mMEiXmviEO3YQ/qPCl4/g4ZeFiXvY3f52+NFAnyn4zu+Kojd/Pk/SXoaJp+rYKuLhAO 4WBVveJglt203np0sidV/zQCS9VGqskgNlx5v6/ecoxlGPDoNC+b2HYcZlUoLZyBzFvK 8XyUR9U9biWQrbdQlfyGr9SZnoBBjyDBuDg0UUTjzY6a1IJFrg2GZmyVDgrepMv+JNYM P16A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788908265; x=1789513065; 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=wumeOXgAu9H0Kp97qaCmHzt/GpEB2ltmfWp7a6Ii+u8=; b=CRVAftb5RMJVux74MWoNG/YwslsFm1lLMPKHcKNIUKnzufUDBE+WhmuciB/wURuBwc hF71pdUdm1OELIvI9GpI6MK1Jujfj1Eufd6DP0C9I3KaITOYoWrPw0hG8DoJyBuWdEYf YfBCw4dwx+DOoU3n05Ys7tJZ0WLt9CvTqfMTZtJUVAmfefsV8yRM8FWTYWHg5rBu5Eqo bsfrMsgDfwdyL8WEni+2IjKUJTsjLsDaygKMBFcea7HvYr0Jtr8fvMI9WkJ+LMNDo98h FykR2H7sGnukUUG7yl9zownAdR07yHeogp6jfOvsoxFeko135ER8Be01eEw4G+4rkc8y XY7Q== X-Forwarded-Encrypted: i=1; AKwUvBx/kfC3KvvTnz553fDQv4pj542uceh+sMQkxuj3/QTCaZkYhcnKliTDlteLl4H0lhCuP0zvFb7gW4iRMpI=@vger.kernel.org X-Gm-Message-State: AFuF++kQjiImJbHsrxdw+or6nm7L0ipnRtTXvHmoKtSzy4ZfFkGZY5Ug EGckh2qgW33MBo0qQT8W+ivl26u6KzmWBCTeLK4/CHpFL8LvKywhDQ1u X-Gm-Gg: AYBFou0sANh7lC4RO7XfXQRlN6NbqhOYI8Jq26QrZZlIRUjyYpPNqo6CcO/yB/gLS2P Q9+ojCSGkDslZjuOrV0eLRO65mL2HQt4iPCiOxPmq+edStOGGVpbQk5r+ZPNRDUWUl1MPNewF41 iwZLwTUM3DZEJcsFo9qPP0FipWHDZX2WZvEGK8Bqg3OKdF4YpqOW1ofXAR/lsSldISAQc78okrV hf+pbGy7yfuMAESYb+WdHnZj/e7hN7c331LjG8YJAKpENOJU1waUXtQXD/LmTHN6vjzlURT8tVf GJYm4CvIGf8AZhzx/9nFP4ebb0QUdY8nNBF2r5U86JUE4/XA2eGrwsg9Wmw+VshYFd8ICcAFpFi bgugw949NdBN57SSsae4V1dkexwhOHIV1skL3m7IiSrpL2D3dnQVDdgw04F07BFcw8U7G/usjXS 5WUPiX4UF5JPBpBgC3daAMDcYwC/h+650bto+rp+0mN7WdwvU9b9SQ40pUbFd4NXA7CL88cvbM7 7VAIQ== X-Received: by 2002:a17:90b:274e:b0:398:b1eb:136c with SMTP id 98e67ed59e1d1-39b2610fe62mr47435731a91.9.1788908264615; Tue, 08 Sep 2026 15:57:44 -0700 (PDT) Received: from localhost ([2620:10d:c090:500::6:91c1]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-3339a534df1sm45266746eec.7.2026.09.08.15.57.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 08 Sep 2026 15:57: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 v3 3/6] eth: fbnic: cache hwmon sensor readings Date: Tue, 8 Sep 2026 15:57:34 -0700 Message-ID: <20260908225737.3034403-4-limzhineng2@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260908225737.3034403-1-limzhineng2@gmail.com> References: <20260908225737.3034403-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 | 35 +++++++++++++------ 3 files changed, 39 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 +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; 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 @@ #include #include +#include #include struct fbnic_dev; @@ -44,6 +45,12 @@ struct fbnic_fw_ver { char commit[FBNIC_FW_CAP_RESP_COMMIT_MAX_SIZE]; }; +/* 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..c8e7ff1d36fc 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. */ #include +#include #include "fbnic.h" #include "fbnic_mac.h" @@ -25,26 +26,31 @@ static umode_t fbnic_hwmon_is_visible(const void *drvda= ta, 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; 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 && cache->last_read =3D=3D jiffies)= { + *val =3D *cached; + return 0; } + 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 +73,12 @@ static int fbnic_hwmon_sensor_read(struct fbnic_dev *fbd= , int id, long *val) goto exit_cleanup; } - *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 +118,10 @@ void fbnic_hwmon_register(struct fbnic_dev *fbd) if (!IS_REACHABLE(CONFIG_HWMON)) return; + /* 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); -- 2.53.0-Meta From nobody Fri Sep 25 20:02:37 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 1FB9A4B0496 for ; Tue, 8 Sep 2026 22:57:47 +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=1788908270; cv=none; b=NT0BlgMURmpS6wvzIZ9NCOZt6tkB8cinoyVNaFJ4PLEYSHgKuM4ZVdHm58rfSsGUrkuHphSdzojKX2oGyd5Z/fQOufhNSND8Vbi6064nSPBAT2aidcZDwtbmG8uVxZbsZNwRW/bzkJUA02s3Rd0eJ07lqJCCqYoLS19L4UifS2I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788908270; c=relaxed/simple; bh=8cAkOwgZLh+Oy0k1bQ/t56TdjDf/iePq+1QdF6j4UE4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Q1b5nQENnvHu+hqlV3TS7geo54uswpSSRcCOXI3kssULNOw8fFPi79HUNE5Nupivnc0qnXYmG8oCWL7RfcxkqCHVa4qh7/DR436b57D9JcAXEXPYjZhveeSRZ4Y6s40knXkr2l2n3wnym9RybrK1aK619CmfUSGZ9A444QIxNcE= 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=KUmioN+1; 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="KUmioN+1" Received: by mail-pj1-f49.google.com with SMTP id 98e67ed59e1d1-39682983a0fso5664337a91.3 for ; Tue, 08 Sep 2026 15:57:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788908266; x=1789513066; 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=26WqabfkuJ8OYIP/GyL3+m+5meAcn0wewttg1o1KS5o=; b=KUmioN+17JhydA/66SyV8sG8Lo9LGiERzsmiOcP+CwquOq8EDMC2wGB+x2Jjdkk30r 4zbHCQLx5EIgy6fWTBMBD0mqGcbXURuSSIEzzuHwXRKzMtzzQJN6IFIz/ZFn6FTFRnl+ LQ343OEAXSPULi5dbfmzBUHbs2ZQ1zG4KCGMBvywF17FxqyqZywvN5nxWszLrllornYL inNdbB3ah6G9nxLNuvPblbDWoFAi2C8cfAleCQPU83K5jeYA1+3po+wxz51QhQ2ARm1o kuYaWK3rOoeo6EN+INhdXWMajmUDzp5zBt2HjxysDg5FYYycFuuV4IsWp4TZzkiOXOwj a4MQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788908266; x=1789513066; 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=26WqabfkuJ8OYIP/GyL3+m+5meAcn0wewttg1o1KS5o=; b=jHKxoGPdpHG8r7qw2uAKwX8+IEJu1zGP/4rnSPlrrCD5wQkIaZ7CzTx00JReERk9kQ yOmRwO5MLkG8czYOK/ZJ6Wp6N6iE0cjVDREPQkBq3tZDiEGGfrBenLYYnSebg654vg1j qIOjhAuSPgw5COvP5mDBDjIcz1rNznollFyJBIVA5EtPYP2wmNAx7ShXIb1s+2Gqu60c rCnsijf0Ft8qQOxYpy8slnFdZ1bc0RHrv4+KSMhlQtnnzxXKe7CFuilEQ7a2Jyjh0mf+ r5aEQbQzdazWGI4ywFlEYP4oYTFRJTPRMRpQDxjfxJ6KbIlo20cX0RKigk59s+h3//5m 33wg== X-Forwarded-Encrypted: i=1; AKwUvBxMwGoOq73S0nzxOClNfgCIG8uy50SC/N4wVVuRJy3AbRcO5+wy+3kUvtAbvQGP5UBk312O2mRzXu/6CjE=@vger.kernel.org X-Gm-Message-State: AFuF++kbb0VGVWOHm9xLZFqpcHU3n0OzFlA1uWfwtjiRbWtt8uUW+QgO +UEjSHPdoYjrwzeY0qw49okLCGwMnPeCLoQKN7QkxRejFns5K3zydf26 X-Gm-Gg: AYBFou0mNOqUcExbiMqhy8pJei3c0DSAEy8eNI6PqepDfPUpbtLdoQlnm2fzGAfTmvP RAkfg5fefSwM58HJfDN7Ux/DM5WtuU7NKOjzf+XM+IK0/dLAY0bbDaGZaAl1KGx+A63JnGsDNip hun+iCVPxQDLi/3YaSEcLuEhrIM9ISS4sY0WhwN2lNucVQd1wQdhe2YFKNKxNWX/Q8uQjlu+3BR fZsAYUiR7O3U9AAyX6dk8yDvhzkGPpXhaSe2L/OKCYsgaBPIxuYbIJdhbBygWNbAmkful1xEonw 2VxlTCu+qY1upnfshKhBkGs8eYuTNVEN4b5eWegqALj8fgEc4xorA66X6bOKfWBeLXk40S/twrG ixvwCsVS/OCQCV1yCqag6BE1E4yj3ywKcnwwIRjZmu6aXJATKiq2M/aEInkJ/ZsWPHeeeWzCbbg MAWuaTXARaWSX0KjAfty1+e1OCCoapmvCHQ51RwpbuXInkIRdsT3SYKiksGJ33POOf69irX9HVP iCFpg== X-Received: by 2002:a17:90a:e7d2:b0:381:1c96:829b with SMTP id 98e67ed59e1d1-39b260d296cmr43935572a91.3.1788908265997; Tue, 08 Sep 2026 15:57:45 -0700 (PDT) Received: from localhost ([2620:10d:c090:500::6:91c1]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-333c9db92b1sm39279476eec.9.2026.09.08.15.57.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 08 Sep 2026 15:57:45 -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 v3 4/6] eth: fbnic: report temperature and voltage thresholds via hwmon Date: Tue, 8 Sep 2026 15:57:35 -0700 Message-ID: <20260908225737.3034403-5-limzhineng2@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260908225737.3034403-1-limzhineng2@gmail.com> References: <20260908225737.3034403-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 ff1674eff7ad..e5669dfd9790 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 c8e7ff1d36fc..7dc4d705f566 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) @@ -87,14 +77,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 { @@ -103,8 +137,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 Fri Sep 25 20:02:37 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 2819B2CCB9 for ; Tue, 8 Sep 2026 22:57:48 +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=1788908271; cv=none; b=bzJ9vhyYAc/S5vUnPCWAsdO/Mo9tG6cBUWcaEMX11EmocvX5vG+Opcco4oClEJZhcdfRK1sVt1a8CiC2GJ3qPYdpWXknZKAa42uZTS2jSaLHUWkqjaLudy54ifXuo7ccPUePKwxa6z9btitvEbPH/6pfl7GwxRdQ2Vef8A+1dz4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788908271; c=relaxed/simple; bh=1Apm140TmjwBykNP41BteAIeCrQSM7GPOdDxj4xmsQ0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mWsx47/EoGDQTxBB4UGla9EAER2uagSZYexvu/0jYRsXQ3QaM9G0KogLSIUomkSupo2Ek5J9fx72cY3Q56h/QfLmRfxykRO6X+N+t/jiHR6RxByrR3lAJbIPYMBOEjatboq7Ve8bA79cnkOI+fpPvblSY0/mIHpj//lNa77Z+I0= 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=j/xitQhj; 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="j/xitQhj" Received: by mail-pj1-f43.google.com with SMTP id 98e67ed59e1d1-3856d6fbcb3so4299822a91.2 for ; Tue, 08 Sep 2026 15:57:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788908267; x=1789513067; 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=oHf4Kdg2iAelN0tBevBJGIWkTeGE4acBiDza9UpBpm8=; b=j/xitQhj4SVNUNz7zWVeTpmy277/EjWq1HWLVCPAOuqcBDYBNXAe0aRnSj18rUwAke Ii8F0N5Z5PWiw9XqvLsvGyvSHchB8Dp7XlqTTsbbqwPBG34DVgd+wa8SmvRGHbrnbJJT 9iR4XZCenlQwniSHJG/26Kk2jJXRbk54YdNBXQjT2CzOzQ0+KP1UPSpC9EU1ma+Acm8v fOtKVJUz13rHKgV3D5T+FYYnvWA/HvKQwqm7Em9AnWQEZzF23D9iQqV0LanDTE2EAfQV uVCffVU5PnbedGiqLybe0qhWGA5uA2Ej/4xyj4O7I2h6itzwxgmGwkjDu2PFWYXlVcPq 8YUg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788908267; x=1789513067; 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=oHf4Kdg2iAelN0tBevBJGIWkTeGE4acBiDza9UpBpm8=; b=im/2+h2vHK8egrE/sgx4543S7sZoWpdGQ3cFoFKrOLsatFcNvxfDDljoFDzjU0TXWA Xyn/qifFpH7LVtoXTHXtHfqGIPM7o+IdBz18KNq9rDMGhdZBZ2E3AwIAZD/fxMpJNTqm y/WsjH82b553n1UGeVkvSA/B8kd6XF/EZGwgWoclgu8s8IAORKHUgiCvnzcFtFLrS8eo mb/N8MvvNLpb4mx+znPuOGQAVtGuFhKDkg0Dqluv7B8Zl+yM0QWcHKYbf679xEaOD27A l1inS0kRo14WiT000bvNReRsKy+HAbIW8stjc4DK9PLS0nkcX5l/oSyTlLGqCkqVy0qG 0Aug== X-Forwarded-Encrypted: i=1; AKwUvBx4NAAVdfFyA4oZTgF25Xq3vSu2K8D5MPicI9ZSBX/EXfWSD2c2IYXD+EUv3GiE1ddWUeRzptEQ/eUObK8=@vger.kernel.org X-Gm-Message-State: AFuF++kKoO6Dbs6GIsTlHi1OASDB9hJGZbYis2uhbkz42gkSII+3+feY 2gBDDpmCRbB/fm4spTfMJTJY/VZ7+9rmoHA4JdehcNDOcxSCYr6S2gur42WyAQ== X-Gm-Gg: AYBFou00P6bI9B+qaNWqxr2DsSJipipZ78sA6CfW5pdNpi0DLhbFwqxxVPXK4tU4A6J yEbDXgJ1AFAW2uuP4Tx3RoEE5eQjYyux9zlQmpp2T6ymjvW1dU+1M4jPjFazX8M6XntwCzz42sp W5WbsjrvL9XrKvoub3xdty39Lpo+ExmpVJKrYximhja7ZYlSFTVtNk55Ce+aaqx/Tk4/yCyBVSZ BuFW9Ka/d8ASfwXKF3zE2aSdgj8B1bDvu692XMWg5Z4u3ieQVxrGUyd8QoEF6EBZWBzRzuIIl0y zH9FRjJjyDJSKvw6fVEyT2uW5IAj0JMlnb6FyC1ZJ/Bt/cOnqz2t2a/R4xiROsSaJ6od14BznoS Ymy+5mtJnIZSW5dsPexv7labtaTvQQfWNEJI0q5FjtL5nHQ4oayXPdXrwOSH7bRLN2QJBnPlkRv 2EqelsaCQ89ixlJPtWM8IjqWTk2xsdjVeFqHQhanNupCdIZJ3cLoCFo0olNa7ATpX86sBDAEEAS HmRfYsp X-Received: by 2002:a17:90b:33c1:b0:398:9bd1:3214 with SMTP id 98e67ed59e1d1-39b262dfa81mr43767196a91.21.1788908267472; Tue, 08 Sep 2026 15:57:47 -0700 (PDT) Received: from localhost ([2620:10d:c090:500::6:91c1]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-333959d5f69sm37289140eec.0.2026.09.08.15.57.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 08 Sep 2026 15:57:47 -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 v3 5/6] eth: fbnic: report temperature and voltage alarms via hwmon Date: Tue, 8 Sep 2026 15:57:36 -0700 Message-ID: <20260908225737.3034403-6-limzhineng2@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260908225737.3034403-1-limzhineng2@gmail.com> References: <20260908225737.3034403-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 7dc4d705f566..11fa8aab0f5b 100644 --- a/drivers/net/ethernet/meta/fbnic/fbnic_hwmon.c +++ b/drivers/net/ethernet/meta/fbnic/fbnic_hwmon.c @@ -86,34 +86,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, @@ -138,10 +188,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 Fri Sep 25 20:02:37 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 DBED55AA665 for ; Tue, 8 Sep 2026 22:57:50 +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=1788908273; cv=none; b=o5IGvPhN1v+2QvPDfudCNdeBzI22Qr2jtqMd8LVd3MUFjo86S1NW24IoSbAv4r4LOhuUmAxSFVsHUygQt3Zb2e+WlINZ2nyNNeEH8+J9S1Q3K/uHryHNBhqe/EnTyDJwNfpJ/Wm2E6b/9aQ6qlIAQkhEjYt6tNHgMHvVn2REseM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788908273; c=relaxed/simple; bh=mKwFTFJmIzB+zQkerFT3nlROU1Tu1RpSpyAZQe6Z6J8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=cSeFjMIFoIY3MriFsEOA/PEPQr2nhXpzhQbtUiIH2HAhlC+ayemiC3Gkuo+VZnzA8BaPIdF3jjoXkKP0V957CafXWcJGYuZko+9fHjUzvcfIyYi/qt7GyQNsvGQMAtCZGIISlndQ1sk2BBoJaobIe64sPjiiuN/PWf6r50fekVA= 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=QVSX4PRs; 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="QVSX4PRs" Received: by mail-pj1-f46.google.com with SMTP id 98e67ed59e1d1-398e9698a70so4690517a91.0 for ; Tue, 08 Sep 2026 15:57:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788908269; x=1789513069; 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=yX+NbeQbYOcWAfpr9fgcQwxWkQP1FKrukSohNXOpZZU=; b=QVSX4PRsJETgyLM2uli9GPAE0Vn8CxAM/LCxitC+lIw15PyviT+5vw87j+QG9Otmxe AgUw1u51/ksr1y+xF+SmtBNsojp5LTuUPaLRc6NcNy5rZA/ptPA19oYNKiy4BOBSsv3f 6FFhxqAU6p+qg5IGX7Us3wXe30snuEzyb/FVu2zZRc/RSTjSRgE89lu9GSdeNEOFECK+ IAjCgfDIjWWPVT9w423l/AhMUnO+yZzpaP8ClVQyMNcXUICPaIObABnK982UjEhEumzG dIeF3oIJ5tl7+Zf2WlrcLdSvyOcjp+z7VWTHs8l1lJcIQpkx4PMtTHO9wJv8Nmk6lPoH sLpA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788908269; x=1789513069; 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=yX+NbeQbYOcWAfpr9fgcQwxWkQP1FKrukSohNXOpZZU=; b=LpON/k5nhwr8cQ0YMZNAs3X7iN3nx7G3hnHyAsxCORMJ8ynWOSClu3RgCeN9pZFyb2 78ptRiSuqDtvYl9Pi1ZJzOo3DY4g9MLRErwfCyL2+x/q2RD9eQ6wTGU3n50DV8gmjZ4A 8Lr6MkpH3GxwLsXLa9Mks1QQlLcyc97kL9N5G/MUkmybk1fK8zYEF3ikAmhOaLSE/UH4 I160RcNxi/YB9/It5xwylOUEDyH9c8n2MP3LqkeLsQ/ohnw6IZMBV8kP6SuJhEdVSuKZ y1AIiD2sPbqyGLyS7QT79oyGTJ4g2ghpAqnaxJBuXAqAi2xxPzfv1TJbeCgUwmwxWu/z zNAg== X-Forwarded-Encrypted: i=1; AKwUvBw+iT7x8qsR77qxiXdYGBF88WurWVR0MZ3l/qCW1+V2pbLaY0po22FhoXbYCjiCH/HnlCHU00sH/QqIALI=@vger.kernel.org X-Gm-Message-State: AFuF++nWhamUpCwv98SU8FUED/wKOYjnJrvv3QNVXHeyDHtRUBLLv2wE 580UBtBY6Xtz71+mW4kU1zCLPxVNdwxPutu1DLGKBlxiriEhvJgiv6nC X-Gm-Gg: AYBFou3Wiux5bcoorU+QnB6Is98Wsiib9u9u2ItvwuRppcGs72kUa0v373z7RUvpu2K mXwHFDMkCFJyIfsDOl7scvOR1jJ94bO504G/MGpfbdYhl/eU9PfWn+24gggd4jb10BTaPOhvkG8 OxEpSne8CB8zkBhN4KbU8YoiFg5C5jbdT3WgX5VlKo3nMjvfwKhVBUu1Pa3yVV7nadAssQ5L6yc 6rTEj6FKDG3fUzMA3TGd+V917sEZ0Dwx91p8d+bWiO/6T3+QJkA3lUwVwc7JBBuD+tkC9CW+HPS jx/ck5n3EsLk1FRY8yEVx3K0Brc4cd6MPLKTtkC8RpZvNsbOj4dIA92Wts1hGP/wXL+xUIc8Vd9 GyLXieHrwu6xm30g8dDH1y7zxswSeSfCgkvlNsadU15txNcG31v0oV2nzRenoqyOfFPrNpxeYN9 9WHp4OVACIwRhZS5IoT3EwcFa1gcyQM8l2rerrViyTu0BrxDq+ZIlOhx71yJ49diW9mIM= X-Received: by 2002:a17:90b:4e8f:b0:38e:5c6:4db9 with SMTP id 98e67ed59e1d1-39b261ba63bmr47781512a91.11.1788908269013; Tue, 08 Sep 2026 15:57:49 -0700 (PDT) Received: from localhost ([2620:10d:c090:500::6:91c1]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-339770f0489sm6031591eec.8.2026.09.08.15.57.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 08 Sep 2026 15:57: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 v3 6/6] eth: fbnic: firmware notifies hwmon on sensor threshold events Date: Tue, 8 Sep 2026 15:57:37 -0700 Message-ID: <20260908225737.3034403-7-limzhineng2@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260908225737.3034403-1-limzhineng2@gmail.com> References: <20260908225737.3034403-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 e5669dfd9790..fd96a3962e3f 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 11fa8aab0f5b..2dff59bc0e8b 100644 --- a/drivers/net/ethernet/meta/fbnic/fbnic_hwmon.c +++ b/drivers/net/ethernet/meta/fbnic/fbnic_hwmon.c @@ -206,6 +206,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 @@ -213,22 +215,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