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 8D7E83E1D1A; Mon, 31 Aug 2026 09:59:12 +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=1788170354; cv=none; b=YV7RP8dYLQZ2rkdR9R0RTSB12NNFXh2887zgxyG4EvZa+/bahZAbt5wOfNWr1FKGWXr0QCU5b8K5xnsNumru6EOivfpCrmIFr3zyY2KnEem2493Fv0ifH5687PZDPE7qrUCP1zyPSoO5nrLKHfNN15HzxypU6bZDgniYwQwMQa8= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788170354; c=relaxed/simple; bh=F+JPFZlr/P3FA54t5sZ25HtW2fES1HdHn1QhwzSKRRY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=fBFQ8YbHwpfkI3N6qyYrmga7qunB6R7ShwIM1xjKs46tJApzkfWpOBFQi7AHmDEZG7jMFpiBSsMa3DQ7185NYt6qKoWP+fbKmTWSN+vCc35SwwNeaRYLjE7Zi4u6tiD00VfGhuKpi8z9bEdFQfm2l+adqAp4FifqpfpKdHBqno4= 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=HNsSnXPO; dkim=pass (2048-bit key) header.d=birger-koblitz.de header.i=@birger-koblitz.de header.b=NCIZIUN7; 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="HNsSnXPO"; dkim=pass (2048-bit key) header.d=birger-koblitz.de header.i=@birger-koblitz.de header.b="NCIZIUN7" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=birger-koblitz.de; s=default; t=1788170350; bh=F+JPFZlr/P3FA54t5sZ25HtW2fES1HdHn1QhwzSKRRY=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=HNsSnXPOg7cHvfa8lNWuzNIyjvPunpnvYtsXis+8FUifQyqBcODiWlK0KB65VP607 NDheQ90GrizjLXOiJP6sYnJcqjKXJs7HqGGknMg+9N20s1Mjy7JeZGVIRTO+wOv8pp Dq2NVB+bW5EDTfkUO2Hl7DuCnXOYa8tg99Sj7y0nQvADIIdEvNBrCR4sA9NFcI9C+d 49yBCiZgB9kBCg0fPBQ6pXwgffS+RFgISsvrhQi7l3kNYAhyWHQ1lvHLhLouOvJzjL 6UxlqrkkVe1+4XQAIyTvbvnGcnuAFI+MerJ2EzOVN7pBjWMCX/t11nDSQW59WERc9B xzDhteG86RVxw== Received: by bkemail.birger-koblitz.de (Postfix, from userid 109) id CEAFE3EC85; Mon, 31 Aug 2026 09:59:10 +0000 (UTC) X-Spam-Level: DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=birger-koblitz.de; s=default; t=1788170340; bh=F+JPFZlr/P3FA54t5sZ25HtW2fES1HdHn1QhwzSKRRY=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=NCIZIUN74tUuiFkc1tTyTjx13K0IrdXDxbvSR2oKXBbHNGaosznppAUrGAxQRXvjl BD2r73Z6kl8wuLYP4ONZrPfrxBXdiBvcJVq+3XHXidEnaLb0LJZbPwglZb92vcQJ// SwngXDD+8WfQvZMzJth3x/wc6A79GPxjJlgeR+gwGf2r22EWUA6K+fletpcyHiFS5Q hmu3T/RC10y0UMnsjlQWZm/lC5HlzlVnELAbcNaFI1ArWadWcNOXJikpCgK4AK6onF 4LrrjiYYrlQBY3U6+vWPiKYdfdA/2XHHYyGIfgPj/6EifSEo5yw3/BHrDrWah7nSys yn5WRjVwTDzjA== Received: from AMDDesktop.lan (unknown [IPv6:2a00:6020:47a3:e800:271c:c6c5:9fde:77cb]) by bkemail.birger-koblitz.de (Postfix) with ESMTPSA id F36443EC6D; Mon, 31 Aug 2026 09:58:59 +0000 (UTC) From: Birger Koblitz Date: Mon, 31 Aug 2026 11:58:58 +0200 Subject: [PATCH net-next v8 09/15] ax88179_178a: Add VLAN offload support for AX88179A 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-9-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-based chips support VLAN offload. Add configuration support in netdev_ops. Features supported are: NETIF_F_HW_VLAN_CTAG_TX, NETIF_F_HW_VLAN_CTAG_RX and NETIF_F_HW_VLAN_CTAG_FILTER. Signed-off-by: Birger Koblitz Reviewed-by: Andrew Lunn --- drivers/net/usb/ax88179_lib.c | 2 + drivers/net/usb/ax88179a_devices.c | 102 +++++++++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+) diff --git a/drivers/net/usb/ax88179_lib.c b/drivers/net/usb/ax88179_lib.c index ea36aef3d3e45ee4f84362a1b87628a12a355bbf..3324069e90fc352048817963f27a49ed3872b348 100644 --- a/drivers/net/usb/ax88179_lib.c +++ b/drivers/net/usb/ax88179_lib.c @@ -346,6 +346,7 @@ int ax88179_set_features(struct net_device *net, netdev_features_t features) { u8 tmp; struct usbnet *dev = netdev_priv(net); + struct ax88179_data *data = dev->driver_priv; netdev_features_t changed = net->features ^ features; if (changed & NETIF_F_IP_CSUM) { @@ -365,6 +366,7 @@ int ax88179_set_features(struct net_device *net, netdev_features_t features) tmp ^= AX_RXCOE_IP | AX_RXCOE_TCP | AX_RXCOE_UDP | AX_RXCOE_TCPV6 | AX_RXCOE_UDPV6; ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_RXCOE_CTL, 1, 1, &tmp); + data->rx_checksum = !!(features & NETIF_F_RXCSUM); } return 0; diff --git a/drivers/net/usb/ax88179a_devices.c b/drivers/net/usb/ax88179a_devices.c index e1c4e5a1e5dc584a471090876bcb7479cd392708..c9c60425082cba18a32f36927687bbd9c207941a 100644 --- a/drivers/net/usb/ax88179a_devices.c +++ b/drivers/net/usb/ax88179a_devices.c @@ -249,6 +249,62 @@ static const struct ethtool_ops ax88179a_ethtool_ops = { .get_ts_info = ethtool_op_get_ts_info, }; +static int ax88179a_vlan_rx_kill_vid(struct net_device *net, __be16 proto, u16 vid) +{ + struct usbnet *dev = netdev_priv(net); + u8 vlan_ctrl; + u16 reg16; + u8 reg8; + + ax88179_read_cmd(dev, AX_ACCESS_MAC, AX88179A_VLAN_ID_CONTROL, 1, 1, ®8); + vlan_ctrl = reg8; + + /* Address */ + reg8 = (vid / 16); + ax88179_write_cmd(dev, AX_ACCESS_MAC, AX88179A_VLAN_ID_ADDRESS, 1, 1, ®8); + + /* Data */ + reg8 = vlan_ctrl | AX_VLAN_CONTROL_RD; + ax88179_write_cmd(dev, AX_ACCESS_MAC, AX88179A_VLAN_ID_CONTROL, 1, 1, ®8); + + ax88179_read_cmd(dev, AX_ACCESS_MAC, AX88179A_VLAN_ID_DATA0, 2, 2, ®16); + reg16 &= ~(1 << (vid % 16)); + ax88179_write_cmd(dev, AX_ACCESS_MAC, AX88179A_VLAN_ID_DATA0, 2, 2, ®16); + + reg8 = vlan_ctrl | AX_VLAN_CONTROL_WE; + ax88179_write_cmd(dev, AX_ACCESS_MAC, AX88179A_VLAN_ID_CONTROL, 1, 1, ®8); + + return 0; +} + +static int ax88179a_vlan_rx_add_vid(struct net_device *net, __be16 proto, u16 vid) +{ + struct usbnet *dev = netdev_priv(net); + u8 vlan_ctrl; + u16 reg16; + u8 reg8; + + ax88179_read_cmd(dev, AX_ACCESS_MAC, AX88179A_VLAN_ID_CONTROL, 1, 1, ®8); + vlan_ctrl = reg8; + + /* Address */ + reg8 = (vid / 16); + ax88179_write_cmd(dev, AX_ACCESS_MAC, AX88179A_VLAN_ID_ADDRESS, 1, 1, ®8); + + /* Data */ + reg8 = vlan_ctrl | AX_VLAN_CONTROL_RD; + ax88179_write_cmd(dev, AX_ACCESS_MAC, AX88179A_VLAN_ID_CONTROL, 1, 1, ®8); + + ax88179_read_cmd(dev, AX_ACCESS_MAC, AX88179A_VLAN_ID_DATA0, 2, 2, ®16); + reg16 |= (1 << (vid % 16)); + ax88179_write_cmd(dev, AX_ACCESS_MAC, AX88179A_VLAN_ID_DATA0, 2, 2, ®16); + + reg8 = vlan_ctrl | AX_VLAN_CONTROL_WE; + ax88179_write_cmd(dev, AX_ACCESS_MAC, AX88179A_VLAN_ID_CONTROL, 1, 1, ®8); + + return 0; +} + static void ax88179a_mdio_unregister(struct ax88179_data *data) { mdiobus_unregister(data->mdio); @@ -509,6 +565,49 @@ static int ax88179a_init_mdio(struct usbnet *dev) return ret; } +static int ax88179a_set_features(struct net_device *net, netdev_features_t features) +{ + struct usbnet *dev = netdev_priv(net); + netdev_features_t changed; + int ret; + u8 tmp; + + changed = net->features ^ features; + + ret = ax88179_set_features(net, features); + if (ret) + return ret; + + if (changed & NETIF_F_HW_VLAN_CTAG_FILTER) { + ax88179_read_cmd(dev, AX_ACCESS_MAC, AX88179A_VLAN_ID_CONTROL, 1, 1, &tmp); + tmp ^= AX_VLAN_CONTROL_VFE; + ax88179_write_cmd(dev, AX_ACCESS_MAC, AX88179A_VLAN_ID_CONTROL, 1, 1, &tmp); + if (features & NETIF_F_HW_VLAN_CTAG_FILTER) { + for (int i = 0; i < 256; i++) { + u16 tmp16 = 0; + /* Address */ + tmp = i; + ax88179_write_cmd(dev, AX_ACCESS_MAC, AX88179A_VLAN_ID_ADDRESS, + 1, 1, &tmp); + /* Data */ + ax88179_write_cmd(dev, AX_ACCESS_MAC, AX88179A_VLAN_ID_DATA0, + 2, 2, &tmp16); + tmp = AX_VLAN_CONTROL_WE; + ax88179_write_cmd(dev, AX_ACCESS_MAC, AX88179A_VLAN_ID_CONTROL, + 1, 1, &tmp); + } + } + } + + if (changed & NETIF_F_HW_VLAN_CTAG_RX) { + ax88179_read_cmd(dev, AX_ACCESS_MAC, AX88179A_VLAN_ID_CONTROL, 1, 1, &tmp); + tmp ^= AX_VLAN_CONTROL_VSO; + ax88179_write_cmd(dev, AX_ACCESS_MAC, AX88179A_VLAN_ID_CONTROL, 1, 1, &tmp); + } + + return 0; +} + static const struct net_device_ops ax88179a_netdev_ops = { .ndo_open = usbnet_open, .ndo_stop = usbnet_stop, @@ -519,6 +618,9 @@ static const struct net_device_ops ax88179a_netdev_ops = { .ndo_set_mac_address = ax88179_set_mac_addr, .ndo_validate_addr = eth_validate_addr, .ndo_eth_ioctl = usbnet_mii_ioctl, + .ndo_set_features = ax88179a_set_features, + .ndo_vlan_rx_add_vid = ax88179a_vlan_rx_add_vid, + .ndo_vlan_rx_kill_vid = ax88179a_vlan_rx_kill_vid, }; static int ax88179a_bind(struct usbnet *dev, struct usb_interface *intf) -- 2.47.3