--- /dev/null
+From 2bcbd3d8a7b4525cdb741fe82330edb6f5452c7f Mon Sep 17 00:00:00 2001
+From: Justin Chen <justinpopo6@gmail.com>
+Date: Wed, 20 Jul 2022 17:28:15 -0700
+Subject: net: usb: ax88179_178a: move priv to driver_priv
+
+From: Justin Chen <justinpopo6@gmail.com>
+
+commit 2bcbd3d8a7b4525cdb741fe82330edb6f5452c7f upstream.
+
+We need more space to save WoL context. So lets allocate memory
+for ax88179_data instead of using struct usbnet data field which
+only supports 5 words. We continue to use the struct usbnet data
+field for multicast filters. However since we no longer have the
+private data stored there, we can shift it to the beginning.
+
+Signed-off-by: Justin Chen <justinpopo6@gmail.com>
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Cc: Jeffery Miller <jefferymiller@google.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/net/usb/ax88179_178a.c | 32 +++++++++++++++++++-------------
+ 1 file changed, 19 insertions(+), 13 deletions(-)
+
+--- a/drivers/net/usb/ax88179_178a.c
++++ b/drivers/net/usb/ax88179_178a.c
+@@ -170,7 +170,6 @@ struct ax88179_data {
+ u8 eee_enabled;
+ u8 eee_active;
+ u16 rxctl;
+- u16 reserved;
+ u8 in_pm;
+ u32 wol_supported;
+ u32 wolopts;
+@@ -193,14 +192,14 @@ static const struct {
+
+ static void ax88179_set_pm_mode(struct usbnet *dev, bool pm_mode)
+ {
+- struct ax88179_data *ax179_data = (struct ax88179_data *)dev->data;
++ struct ax88179_data *ax179_data = dev->driver_priv;
+
+ ax179_data->in_pm = pm_mode;
+ }
+
+ static int ax88179_in_pm(struct usbnet *dev)
+ {
+- struct ax88179_data *ax179_data = (struct ax88179_data *)dev->data;
++ struct ax88179_data *ax179_data = dev->driver_priv;
+
+ return ax179_data->in_pm;
+ }
+@@ -733,7 +732,7 @@ ax88179_ethtool_set_eee(struct usbnet *d
+ static int ax88179_chk_eee(struct usbnet *dev)
+ {
+ struct ethtool_cmd ecmd = { .cmd = ETHTOOL_GSET };
+- struct ax88179_data *priv = (struct ax88179_data *)dev->data;
++ struct ax88179_data *priv = dev->driver_priv;
+
+ mii_ethtool_gset(&dev->mii, &ecmd);
+
+@@ -836,7 +835,7 @@ static void ax88179_enable_eee(struct us
+ static int ax88179_get_eee(struct net_device *net, struct ethtool_eee *edata)
+ {
+ struct usbnet *dev = netdev_priv(net);
+- struct ax88179_data *priv = (struct ax88179_data *)dev->data;
++ struct ax88179_data *priv = dev->driver_priv;
+
+ edata->eee_enabled = priv->eee_enabled;
+ edata->eee_active = priv->eee_active;
+@@ -847,7 +846,7 @@ static int ax88179_get_eee(struct net_de
+ static int ax88179_set_eee(struct net_device *net, struct ethtool_eee *edata)
+ {
+ struct usbnet *dev = netdev_priv(net);
+- struct ax88179_data *priv = (struct ax88179_data *)dev->data;
++ struct ax88179_data *priv = dev->driver_priv;
+ int ret;
+
+ priv->eee_enabled = edata->eee_enabled;
+@@ -898,8 +897,8 @@ static const struct ethtool_ops ax88179_
+ static void ax88179_set_multicast(struct net_device *net)
+ {
+ struct usbnet *dev = netdev_priv(net);
+- struct ax88179_data *data = (struct ax88179_data *)dev->data;
+- u8 *m_filter = ((u8 *)dev->data) + 12;
++ struct ax88179_data *data = dev->driver_priv;
++ u8 *m_filter = ((u8 *)dev->data);
+
+ data->rxctl = (AX_RX_CTL_START | AX_RX_CTL_AB | AX_RX_CTL_IPE);
+
+@@ -911,7 +910,7 @@ static void ax88179_set_multicast(struct
+ } else if (netdev_mc_empty(net)) {
+ /* just broadcast and directed */
+ } else {
+- /* We use the 20 byte dev->data for our 8 byte filter buffer
++ /* We use dev->data for our 8 byte filter buffer
+ * to avoid allocating memory that is tricky to free later
+ */
+ u32 crc_bits;
+@@ -1310,11 +1309,15 @@ static void ax88179_get_mac_addr(struct
+
+ static int ax88179_bind(struct usbnet *dev, struct usb_interface *intf)
+ {
+- struct ax88179_data *ax179_data = (struct ax88179_data *)dev->data;
++ struct ax88179_data *ax179_data;
+
+ usbnet_get_endpoints(dev, intf);
+
+- memset(ax179_data, 0, sizeof(*ax179_data));
++ ax179_data = kzalloc(sizeof(*ax179_data), GFP_KERNEL);
++ if (!ax179_data)
++ return -ENOMEM;
++
++ dev->driver_priv = ax179_data;
+
+ dev->net->netdev_ops = &ax88179_netdev_ops;
+ dev->net->ethtool_ops = &ax88179_ethtool_ops;
+@@ -1343,6 +1346,7 @@ static int ax88179_bind(struct usbnet *d
+
+ static void ax88179_unbind(struct usbnet *dev, struct usb_interface *intf)
+ {
++ struct ax88179_data *ax179_data = dev->driver_priv;
+ u16 tmp16;
+
+ /* Configure RX control register => stop operation */
+@@ -1355,6 +1359,8 @@ static void ax88179_unbind(struct usbnet
+ /* Power down ethernet PHY */
+ tmp16 = 0;
+ ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_PHYPWR_RSTCTL, 2, 2, &tmp16);
++
++ kfree(ax179_data);
+ }
+
+ static void
+@@ -1527,7 +1533,7 @@ ax88179_tx_fixup(struct usbnet *dev, str
+
+ static int ax88179_link_reset(struct usbnet *dev)
+ {
+- struct ax88179_data *ax179_data = (struct ax88179_data *)dev->data;
++ struct ax88179_data *ax179_data = dev->driver_priv;
+ u8 tmp[5], link_sts;
+ u16 mode, tmp16, delay = HZ / 10;
+ u32 tmp32 = 0x40000000;
+@@ -1602,7 +1608,7 @@ static int ax88179_reset(struct usbnet *
+ u8 buf[5];
+ u16 *tmp16;
+ u8 *tmp;
+- struct ax88179_data *ax179_data = (struct ax88179_data *)dev->data;
++ struct ax88179_data *ax179_data = dev->driver_priv;
+ struct ethtool_eee eee_data;
+
+ tmp16 = (u16 *)buf;
--- /dev/null
+From 9718f9ce5b86e2f4e6364762018980f0222c2e5e Mon Sep 17 00:00:00 2001
+From: Justin Chen <justinpopo6@gmail.com>
+Date: Wed, 20 Jul 2022 17:28:12 -0700
+Subject: net: usb: ax88179_178a: remove redundant init code
+
+From: Justin Chen <justinpopo6@gmail.com>
+
+commit 9718f9ce5b86e2f4e6364762018980f0222c2e5e upstream.
+
+Bind and reset are basically doing the same thing. Remove the duplicate
+code and have bind call into reset.
+
+Signed-off-by: Justin Chen <justinpopo6@gmail.com>
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Cc: Jeffery Miller <jefferymiller@google.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/net/usb/ax88179_178a.c | 85 +----------------------------------------
+ 1 file changed, 4 insertions(+), 81 deletions(-)
+
+--- a/drivers/net/usb/ax88179_178a.c
++++ b/drivers/net/usb/ax88179_178a.c
+@@ -164,6 +164,8 @@
+ #define GMII_PHY_PGSEL_PAGE3 0x0003
+ #define GMII_PHY_PGSEL_PAGE5 0x0005
+
++static int ax88179_reset(struct usbnet *dev);
++
+ struct ax88179_data {
+ u8 eee_enabled;
+ u8 eee_active;
+@@ -1308,47 +1310,12 @@ static void ax88179_get_mac_addr(struct
+
+ static int ax88179_bind(struct usbnet *dev, struct usb_interface *intf)
+ {
+- u8 buf[5];
+- u16 *tmp16;
+- u8 *tmp;
+ struct ax88179_data *ax179_data = (struct ax88179_data *)dev->data;
+- struct ethtool_eee eee_data;
+
+ usbnet_get_endpoints(dev, intf);
+
+- tmp16 = (u16 *)buf;
+- tmp = (u8 *)buf;
+-
+ memset(ax179_data, 0, sizeof(*ax179_data));
+
+- /* Power up ethernet PHY */
+- *tmp16 = 0;
+- ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_PHYPWR_RSTCTL, 2, 2, tmp16);
+- *tmp16 = AX_PHYPWR_RSTCTL_IPRL;
+- ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_PHYPWR_RSTCTL, 2, 2, tmp16);
+- msleep(200);
+-
+- *tmp = AX_CLK_SELECT_ACS | AX_CLK_SELECT_BCS;
+- ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_CLK_SELECT, 1, 1, tmp);
+- msleep(100);
+-
+- /* Read MAC address from DTB or asix chip */
+- ax88179_get_mac_addr(dev);
+- memcpy(dev->net->perm_addr, dev->net->dev_addr, ETH_ALEN);
+-
+- /* RX bulk configuration */
+- memcpy(tmp, &AX88179_BULKIN_SIZE[0], 5);
+- ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_RX_BULKIN_QCTRL, 5, 5, tmp);
+-
+- dev->rx_urb_size = 1024 * 20;
+-
+- *tmp = 0x34;
+- ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_PAUSE_WATERLVL_LOW, 1, 1, tmp);
+-
+- *tmp = 0x52;
+- ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_PAUSE_WATERLVL_HIGH,
+- 1, 1, tmp);
+-
+ dev->net->netdev_ops = &ax88179_netdev_ops;
+ dev->net->ethtool_ops = &ax88179_ethtool_ops;
+ dev->net->needed_headroom = 8;
+@@ -1369,46 +1336,7 @@ static int ax88179_bind(struct usbnet *d
+ dev->net->hw_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
+ NETIF_F_RXCSUM;
+
+- /* Enable checksum offload */
+- *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);
+-
+- *tmp = AX_TXCOE_IP | AX_TXCOE_TCP | AX_TXCOE_UDP |
+- AX_TXCOE_TCPV6 | AX_TXCOE_UDPV6;
+- ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_TXCOE_CTL, 1, 1, tmp);
+-
+- /* Configure RX control register => start operation */
+- *tmp16 = AX_RX_CTL_DROPCRCERR | AX_RX_CTL_IPE | AX_RX_CTL_START |
+- AX_RX_CTL_AP | AX_RX_CTL_AMALL | AX_RX_CTL_AB;
+- ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_RX_CTL, 2, 2, tmp16);
+-
+- *tmp = AX_MONITOR_MODE_PMETYPE | AX_MONITOR_MODE_PMEPOL |
+- AX_MONITOR_MODE_RWMP;
+- ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_MONITOR_MOD, 1, 1, tmp);
+-
+- /* Configure default medium type => giga */
+- *tmp16 = AX_MEDIUM_RECEIVE_EN | AX_MEDIUM_TXFLOW_CTRLEN |
+- AX_MEDIUM_RXFLOW_CTRLEN | AX_MEDIUM_FULL_DUPLEX |
+- AX_MEDIUM_GIGAMODE;
+- ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_MEDIUM_STATUS_MODE,
+- 2, 2, tmp16);
+-
+- ax88179_led_setting(dev);
+-
+- ax179_data->eee_enabled = 0;
+- ax179_data->eee_active = 0;
+-
+- ax88179_disable_eee(dev);
+-
+- ax88179_ethtool_get_eee(dev, &eee_data);
+- eee_data.advertised = 0;
+- ax88179_ethtool_set_eee(dev, &eee_data);
+-
+- /* Restart autoneg */
+- mii_nway_restart(&dev->mii);
+-
+- usbnet_link_change(dev, 0, 0);
++ ax88179_reset(dev);
+
+ return 0;
+ }
+@@ -1697,6 +1625,7 @@ static int ax88179_reset(struct usbnet *
+
+ /* Read MAC address from DTB or asix chip */
+ ax88179_get_mac_addr(dev);
++ memcpy(dev->net->perm_addr, dev->net->dev_addr, ETH_ALEN);
+
+ /* RX bulk configuration */
+ memcpy(tmp, &AX88179_BULKIN_SIZE[0], 5);
+@@ -1711,12 +1640,6 @@ static int ax88179_reset(struct usbnet *
+ ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_PAUSE_WATERLVL_HIGH,
+ 1, 1, tmp);
+
+- dev->net->features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
+- NETIF_F_RXCSUM;
+-
+- dev->net->hw_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
+- NETIF_F_RXCSUM;
+-
+ /* Enable checksum offload */
+ *tmp = AX_RXCOE_IP | AX_RXCOE_TCP | AX_RXCOE_UDP |
+ AX_RXCOE_TCPV6 | AX_RXCOE_UDPV6;