All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jakub Kicinski <kuba@kernel.org>
To: Tiernan Hubble <thubble@thubble.ca>
Cc: Igor Russkikh <irusskikh@marvell.com>,
	Andrew Lunn <andrew+netdev@lunn.ch>,
	"David S. Miller" <davem@davemloft.net>,
	Eric Dumazet <edumazet@google.com>,
	Paolo Abeni <pabeni@redhat.com>, Lorenz Brun <lorenz@brun.one>,
	Andrew Lunn <andrew@lunn.ch>, Simon Horman <horms@kernel.org>,
	netdev@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH net v2] net: atlantic: fix reading SFP module info on some AQC100 cards
Date: Wed, 18 Feb 2026 17:30:00 -0800	[thread overview]
Message-ID: <20260218173000.01a44c80@kernel.org> (raw)
In-Reply-To: <20260216224913.419470-1-thubble@thubble.ca>

On Mon, 16 Feb 2026 16:49:12 -0600 Tiernan Hubble wrote:
> Commit 853a2944aaf3 ("net: atlantic: support reading SFP module info")
> added support for reading SFP module info on AQC100-based cards. However,
> it only supports reading directly from the controller's hardware
> registers, and this does not seem to be supported on certain cards,
> including my TRENDnet TEG-10GECSFP V3. "ethtool -m" times out when reading
> certain registers, even when I increase the read poll timeout values.
> 
> The DPDK "atlantic" driver reads module info via firmware calls instead of
> directly reading the hardware registers, provided that the NIC's firmware
> version supports it.
> 
> This change adapts the DPDK firmware call code to the kernel driver. It
> preserves the old hardware-based module read code as a fallback when the
> firmware does not support it, to avoid breaking cards that are currently
> working.
> 
> Tested on 2 different TRENDnet TEG-10GECSFP V3 cards, both with firmware
> version 3.1.121 (current at the time of this patch). Both cards correctly
> reported module info for a passive DAC cable and 2 different 10G optical
> transceivers.
> 
> Fixes: 853a2944aaf3 ("net: atlantic: support reading SFP module info")
> Signed-off-by: Tiernan Hubble <thubble@thubble.ca>

Overall looks quite nice, but I don't think it qualifies as a fix.
Fix means something regressed from previous release, crashes, etc
For the adapters in question IIUC ethtool -m has never worked before.
Please drop the Fixes tag and repost next week for net-next.

Some drive by comments below..

> diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_ethtool.c b/drivers/net/ethernet/aquantia/atlantic/aq_ethtool.c
> index a6e1826dd5d7..5be9e9ee7e9f 100644
> --- a/drivers/net/ethernet/aquantia/atlantic/aq_ethtool.c
> +++ b/drivers/net/ethernet/aquantia/atlantic/aq_ethtool.c
> @@ -983,6 +983,36 @@ static int aq_ethtool_set_phy_tunable(struct net_device *ndev,
>  	return err;
>  }
>  
> +static bool aq_ethtool_can_read_module_eeprom(struct aq_nic_s *aq_nic)
> +{
> +	return aq_nic->aq_fw_ops->read_module_eeprom ||
> +		aq_nic->aq_hw_ops->hw_read_module_eeprom;
> +}
> +
> +static int aq_ethtool_read_module_eeprom(struct aq_nic_s *aq_nic, u8 dev_addr,
> +					 u8 reg_start_addr, int len, u8 *data)
> +{
> +	int err = -EOPNOTSUPP;

maybe add a temp variable:

	const struct aq_fw_ops *ops = aq_nic->aq_fw_ops;

> +	if (aq_nic->aq_fw_ops->read_module_eeprom) {
> +		err = aq_nic->aq_fw_ops->read_module_eeprom(aq_nic->aq_hw,

to avoid the long lines and awkward wrapping ?

> +			dev_addr, reg_start_addr, len, data);
> +
> +		/* If the only error is that the firmware version doesn't
> +		 * support reading EEPROM, we can still attempt to read it
> +		 * directly from the hardware if supported.
> +		 */
> +		if (err != -EOPNOTSUPP)
> +			return err;
> +	}
> +
> +	if (aq_nic->aq_hw_ops->hw_read_module_eeprom)
> +		err = aq_nic->aq_hw_ops->hw_read_module_eeprom(aq_nic->aq_hw,

and here

> +			dev_addr, reg_start_addr, len, data);
> +
> +	return err;
> +}

> +static int aq_fw2x_read_module_eeprom(struct aq_hw_s *self, u8 dev_addr,
> +				      u8 reg_start_addr, int len, u8 *data)
> +{
> +	u32 low_status, orig_low_status, low_req = 0;
> +	u32 res_bytes_remain_cnt = len % sizeof(u32);
> +	u32 res_dword_cnt = len / sizeof(u32);
> +	struct smbus_request request = { 0 };
> +	u32 req_dword_cnt;
> +	u32 result = 0;
> +	u32 caps_lo;
> +	u32 offset;
> +	int err;
> +
> +	caps_lo = aq_fw2x_get_link_capabilities(self);
> +	if (!(caps_lo & BIT(CAPS_LO_SMBUS_READ)))
> +		return -EOPNOTSUPP;
> +
> +	request.msg_id = 0;
> +	request.device_id = dev_addr;
> +	request.address = reg_start_addr;
> +	request.length = len;
> +
> +	/* Write SMBUS request to cfg memory */
> +	req_dword_cnt = (sizeof(request) + sizeof(u32) - 1) / sizeof(u32);

DIV_ROUND_UP()

> +	err = hw_atl_write_fwcfg_dwords(self, (void *)&request, req_dword_cnt);
> +	if (err < 0)
> +		return err;
> +
> +	/* Toggle 0x368.CAPS_LO_SMBUS_READ bit */
> +	low_req = aq_hw_read_reg(self, HW_ATL_FW2X_MPI_CONTROL_ADDR);
> +	orig_low_status = low_req & BIT(CAPS_LO_SMBUS_READ);

the mixing of BIT(CAPS_LO_SMBUS_READ)..

> +	low_req ^= HW_ATL_FW2X_CAP_SMBUS_READ;

.. and HW_ATL_FW2X_CAP_SMBUS_READ which is defined to

+#define HW_ATL_FW2X_CAP_SMBUS_READ       BIT(CAPS_LO_SMBUS_READ)

seems unnecessary and confusing?
-- 
pw-bot: cr

      reply	other threads:[~2026-02-19  1:30 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-02-16 22:49 [PATCH net v2] net: atlantic: fix reading SFP module info on some AQC100 cards Tiernan Hubble
2026-02-19  1:30 ` Jakub Kicinski [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260218173000.01a44c80@kernel.org \
    --to=kuba@kernel.org \
    --cc=andrew+netdev@lunn.ch \
    --cc=andrew@lunn.ch \
    --cc=davem@davemloft.net \
    --cc=edumazet@google.com \
    --cc=horms@kernel.org \
    --cc=irusskikh@marvell.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lorenz@brun.one \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=thubble@thubble.ca \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.