From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from bkemail.birger-koblitz.de (bkemail.birger-koblitz.de [23.88.97.239]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 715863E009F; Mon, 31 Aug 2026 09:59:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=23.88.97.239 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788170358; cv=none; b=IKzYNhvTKrH26H5fKVM+JJshSLeTL1skUaXf72BomhWttidid71pZ4Iw4Oulv+jI3nU0mW5c6tkO/h29Zt1excVfpPDd+iZTDMRSYKxbK/RYC0sG3V5TCKdbZv5jV4/TrkEJgpxkhAqSl5g1zgG9JkWAJ1o6hXb/rdy8nuOqoxk= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788170358; c=relaxed/simple; bh=5PmPojPmIprqiSl1WornrZICFZnUJDeBRaPXR1C7CQk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=rPVNfl26kvl24dsFyr9FIvCE7GDuKUD/nxH7GY619fLLFql2VWiPhKksh1SRciVVm2/0nQaXbn8LVVvc/qoI/0H16m56rheExacsbheNwWLVuMQ3DT4wUeToTJJa10vTWpm6pFvYXRfRRzM4CvJc45c30HCK+u+Jr9xwGGFEUQM= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=birger-koblitz.de; spf=pass smtp.mailfrom=birger-koblitz.de; dkim=pass (2048-bit key) header.d=birger-koblitz.de header.i=@birger-koblitz.de header.b=aWbHaoZE; dkim=pass (2048-bit key) header.d=birger-koblitz.de header.i=@birger-koblitz.de header.b=UL8DqLQ9; arc=none smtp.client-ip=23.88.97.239 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=birger-koblitz.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=birger-koblitz.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=birger-koblitz.de header.i=@birger-koblitz.de header.b="aWbHaoZE"; dkim=pass (2048-bit key) header.d=birger-koblitz.de header.i=@birger-koblitz.de header.b="UL8DqLQ9" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=birger-koblitz.de; s=default; t=1788170354; bh=5PmPojPmIprqiSl1WornrZICFZnUJDeBRaPXR1C7CQk=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=aWbHaoZEIIGnl1CqcpcFt0k73sjAtuS/NOgp5nOLokvWp4WJHAWjhOEdn8g21sybC jiADXRcDnot5iqfGXetCjEoFTQTi6S1HG8IRt0JgJ5iBFJrZlpiSWZHk1y8aC1EEcS aHEcKzjqpWMF9xaERitUJcwx99gkcLl8EwrZUDdlgUPMkQGfIu4DY8YFWDr8iRQLNC B6BProilQBBCwcRyn8FVde4UtLTRwm7+oMk1kVj4ehVoZfA/BLKOofHrqh6d4Apdp4 wq75rQsOmqFXOLqg4eS7OGyUQA4bdof13EpnpvB8+GkPrKPZkmINgknJ4DOFQ7jeP3 BSGCwM/s89ejA== Received: by bkemail.birger-koblitz.de (Postfix, from userid 109) id AA8943EC8B; Mon, 31 Aug 2026 09:59:14 +0000 (UTC) X-Spam-Level: DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=birger-koblitz.de; s=default; t=1788170342; bh=5PmPojPmIprqiSl1WornrZICFZnUJDeBRaPXR1C7CQk=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=UL8DqLQ9VlnvnTrbNS/HOCblOguya4qjfjU7mH6xy/Ok8e9Y20pR/iLcxxZVelJAq vtZs5kXAUljK6tUZPgJ9/MaZ+fIng6VdCNNpYMrSwSg8MV2ZysP0I/N/fc6gm9aX8w mkN2tEODxbXmzIJGDF1wolk23mV21Trgy4oMKzSfEzIUtOHOSC5hfyK8W5wfcKnzxu AT3pVIilvzLDW5ymB4K8DBXN2DLoDcrsAy27Ts/h7q/nc9PMUHjA2xfX/rkvcdmlEP tp1R87NO8HsBnUiSA0ZTSgzPchNIRc9G8KAIwAUfl8KqjOhWtXWHLfgtWmOw9Ms96i ps6dDKiPo7cUA== Received: from AMDDesktop.lan (unknown [IPv6:2a00:6020:47a3:e800:271c:c6c5:9fde:77cb]) by bkemail.birger-koblitz.de (Postfix) with ESMTPSA id EAB5E3EC62; Mon, 31 Aug 2026 09:59:01 +0000 (UTC) From: Birger Koblitz Date: Mon, 31 Aug 2026 11:59:03 +0200 Subject: [PATCH net-next v8 14/15] ax88179_178a: Add support for AX88179A/772D/279 EEPROM access Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20260831-ax88179a-v8-14-de905f2ee426@birger-koblitz.de> References: <20260831-ax88179a-v8-0-de905f2ee426@birger-koblitz.de> In-Reply-To: <20260831-ax88179a-v8-0-de905f2ee426@birger-koblitz.de> To: Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Russell King , Andrew Lunn , Heiner Kallweit Cc: linux-usb@vger.kernel.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Birger Koblitz , Jianhui Xu X-Mailer: b4 0.14.2 The AX88179A/772D devices have 32 efuses with 20 bytes each, which can be randomly programmed. The AX88279 has 16K FLASH. Provide ethtool read capability for these devices. However, no write access is provided. Signed-off-by: Birger Koblitz Reviewed-by: Andrew Lunn --- drivers/net/usb/ax88179_178a.c | 19 +++++++++++++++ drivers/net/usb/ax88179_lib.c | 54 ++++++++++++++++++++++++++++++++---------- 2 files changed, 61 insertions(+), 12 deletions(-) diff --git a/drivers/net/usb/ax88179_178a.c b/drivers/net/usb/ax88179_178a.c index 6d6ee39b342e9b4e008bb2c1ee276dc27279a2f7..be72ed955b6b8b1700d5f3624c59d7dea1b3d1dd 100644 --- a/drivers/net/usb/ax88179_178a.c +++ b/drivers/net/usb/ax88179_178a.c @@ -687,6 +687,19 @@ static int ax88179_bind(struct usbnet *dev, struct usb_interface *intf) ax179_data->resume = ax88179_resume; ax179_data->suspend = ax88179_suspend; + ret = ax88179_read_cmd(dev, AX_ACCESS_MAC, AX_CHIP_STATUS, + 1, 1, &ax179_data->chip_version); + if (ret < 0) + goto err_nodev; + + ax179_data->chip_version = (ax179_data->chip_version & 0xf0) >> 4; + ax179_data->is_ax88772d = 0; + ax179_data->ip_align = 1; + ax179_data->eeprom_read_cmd = AX_ACCESS_EEPROM; + ax179_data->eeprom_write_cmd = AX_ACCESS_EEPROM; + ax179_data->eeprom_block = 2; + ax179_data->eeprom_wen = 0; + dev->net->netdev_ops = &ax88179_netdev_ops; dev->net->ethtool_ops = &ax88179_ethtool_ops; dev->net->needed_headroom = 8; @@ -711,6 +724,12 @@ static int ax88179_bind(struct usbnet *dev, struct usb_interface *intf) ax88179_reset(dev); return 0; + +err_nodev: + kfree(ax179_data); + ax179_data = NULL; + + return ret; } static void ax88179_unbind(struct usbnet *dev, struct usb_interface *intf) diff --git a/drivers/net/usb/ax88179_lib.c b/drivers/net/usb/ax88179_lib.c index 3b498206c50d5b5d9d5cd489114ef28bf280fe97..db77b7d4539ec52756a93d3c56d46155de5570df 100644 --- a/drivers/net/usb/ax88179_lib.c +++ b/drivers/net/usb/ax88179_lib.c @@ -194,36 +194,61 @@ int ax88179_set_wol(struct net_device *net, struct ethtool_wolinfo *wolinfo) return 0; } +static void +ax88179_eeprom_access_params(struct ax88179_data *ax179_data, int i, u16 *value, u16 *idx) +{ + /* AX88179 has a word-addressable EEPROM + * AX88179A uses EFUSES with 20 bytes length + * AX88279 has an EEPROM addressable in 256 byte blocks + */ + if (ax179_data->chip_version < AX_VERSION_AX88179A) { + *value = i; + *idx = 1; + } else if (ax179_data->chip_version >= AX_VERSION_AX88279) { + *value = (i * ax179_data->eeprom_block) >> 16; + *idx = (i * ax179_data->eeprom_block) & 0xffff; + } else { + *value = i << 4; + *idx = 0; + } +} + int ax88179_get_eeprom(struct net_device *net, struct ethtool_eeprom *eeprom, u8 *data) { struct usbnet *dev = netdev_priv(net); - u16 *eeprom_buff; - int first_word, last_word; - int i, ret; + struct ax88179_data *ax179_data; + int first, last, i, ret; + u8 *eeprom_buff; + + ax179_data = dev->driver_priv; if (eeprom->len == 0) return -EINVAL; eeprom->magic = AX88179_EEPROM_MAGIC; - first_word = eeprom->offset >> 1; - last_word = (eeprom->offset + eeprom->len - 1) >> 1; - eeprom_buff = kmalloc_array(last_word - first_word + 1, sizeof(u16), - GFP_KERNEL); + first = eeprom->offset / ax179_data->eeprom_block; + last = (eeprom->offset + eeprom->len - 1) / ax179_data->eeprom_block; + + eeprom_buff = kzalloc((last - first + 1) * ax179_data->eeprom_block, GFP_KERNEL); if (!eeprom_buff) return -ENOMEM; - /* ax88179/178A returns 2 bytes from eeprom on read */ - for (i = first_word; i <= last_word; i++) { - ret = __ax88179_read_cmd(dev, AX_ACCESS_EEPROM, i, 1, 2, - &eeprom_buff[i - first_word]); + for (i = first; i <= last; i++) { + u16 value, idx; + + ax88179_eeprom_access_params(ax179_data, i, &value, &idx); + ret = __ax88179_read_cmd(dev, ax179_data->eeprom_read_cmd, + value, idx, ax179_data->eeprom_block, + eeprom_buff + (i - first) * ax179_data->eeprom_block); + if (ret < 0) { kfree(eeprom_buff); return -EIO; } } - memcpy(data, (u8 *)eeprom_buff + (eeprom->offset & 1), eeprom->len); + memcpy(data, eeprom_buff + eeprom->offset % ax179_data->eeprom_block, eeprom->len); kfree(eeprom_buff); return 0; } @@ -231,12 +256,17 @@ int ax88179_get_eeprom(struct net_device *net, struct ethtool_eeprom *eeprom, u8 int ax88179_set_eeprom(struct net_device *net, struct ethtool_eeprom *eeprom, u8 *data) { struct usbnet *dev = netdev_priv(net); + struct ax88179_data *ax179_data; u16 *eeprom_buff; int first_word; int last_word; int ret; int i; + ax179_data = dev->driver_priv; + if (ax179_data->chip_version >= AX_VERSION_AX88179A) + return -EOPNOTSUPP; + netdev_dbg(net, "write EEPROM len %d, offset %d, magic 0x%x\n", eeprom->len, eeprom->offset, eeprom->magic); -- 2.47.3