1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * ASIX AX8817X based USB 2.0 Ethernet Devices
4 * Copyright (C) 2003-2006 David Hollis <dhollis@davehollis.com>
5 * Copyright (C) 2005 Phil Chang <pchang23@sbcglobal.net>
6 * Copyright (C) 2006 James Painter <jamie.painter@iname.com>
7 * Copyright (c) 2002-2003 TiVo Inc.
12 #define PHY_MODE_MARVELL 0x0000
13 #define MII_MARVELL_LED_CTRL 0x0018
14 #define MII_MARVELL_STATUS 0x001b
15 #define MII_MARVELL_CTRL 0x0014
17 #define MARVELL_LED_MANUAL 0x0019
19 #define MARVELL_STATUS_HWCFG 0x0004
21 #define MARVELL_CTRL_TXDELAY 0x0002
22 #define MARVELL_CTRL_RXDELAY 0x0080
24 #define PHY_MODE_RTL8211CL 0x000C
26 #define AX88772A_PHY14H 0x14
27 #define AX88772A_PHY14H_DEFAULT 0x442C
29 #define AX88772A_PHY15H 0x15
30 #define AX88772A_PHY15H_DEFAULT 0x03C8
32 #define AX88772A_PHY16H 0x16
33 #define AX88772A_PHY16H_DEFAULT 0x4044
35 struct ax88172_int_data
{
43 static void asix_status(struct usbnet
*dev
, struct urb
*urb
)
45 struct ax88172_int_data
*event
;
48 if (urb
->actual_length
< 8)
51 event
= urb
->transfer_buffer
;
52 link
= event
->link
& 0x01;
53 if (netif_carrier_ok(dev
->net
) != link
) {
54 usbnet_link_change(dev
, link
, 1);
55 netdev_dbg(dev
->net
, "Link Status is: %d\n", link
);
59 static void asix_set_netdev_dev_addr(struct usbnet
*dev
, u8
*addr
)
61 if (is_valid_ether_addr(addr
)) {
62 eth_hw_addr_set(dev
->net
, addr
);
64 netdev_info(dev
->net
, "invalid hw address, using random\n");
65 eth_hw_addr_random(dev
->net
);
69 /* Get the PHY Identifier from the PHYSID1 & PHYSID2 MII registers */
70 static u32
asix_get_phyid(struct usbnet
*dev
)
76 /* Poll for the rare case the FW or phy isn't ready yet. */
77 for (i
= 0; i
< 100; i
++) {
78 phy_reg
= asix_mdio_read(dev
->net
, dev
->mii
.phy_id
, MII_PHYSID1
);
81 if (phy_reg
!= 0 && phy_reg
!= 0xFFFF)
86 if (phy_reg
<= 0 || phy_reg
== 0xFFFF)
89 phy_id
= (phy_reg
& 0xffff) << 16;
91 phy_reg
= asix_mdio_read(dev
->net
, dev
->mii
.phy_id
, MII_PHYSID2
);
95 phy_id
|= (phy_reg
& 0xffff);
100 static u32
asix_get_link(struct net_device
*net
)
102 struct usbnet
*dev
= netdev_priv(net
);
104 return mii_link_ok(&dev
->mii
);
107 static int asix_ioctl (struct net_device
*net
, struct ifreq
*rq
, int cmd
)
109 struct usbnet
*dev
= netdev_priv(net
);
111 return generic_mii_ioctl(&dev
->mii
, if_mii(rq
), cmd
, NULL
);
114 /* We need to override some ethtool_ops so we require our
115 own structure so we don't interfere with other usbnet
116 devices that may be connected at the same time. */
117 static const struct ethtool_ops ax88172_ethtool_ops
= {
118 .get_drvinfo
= asix_get_drvinfo
,
119 .get_link
= asix_get_link
,
120 .get_msglevel
= usbnet_get_msglevel
,
121 .set_msglevel
= usbnet_set_msglevel
,
122 .get_wol
= asix_get_wol
,
123 .set_wol
= asix_set_wol
,
124 .get_eeprom_len
= asix_get_eeprom_len
,
125 .get_eeprom
= asix_get_eeprom
,
126 .set_eeprom
= asix_set_eeprom
,
127 .nway_reset
= usbnet_nway_reset
,
128 .get_link_ksettings
= usbnet_get_link_ksettings_mii
,
129 .set_link_ksettings
= usbnet_set_link_ksettings_mii
,
132 static void ax88172_set_multicast(struct net_device
*net
)
134 struct usbnet
*dev
= netdev_priv(net
);
135 struct asix_data
*data
= (struct asix_data
*)&dev
->data
;
138 if (net
->flags
& IFF_PROMISC
) {
140 } else if (net
->flags
& IFF_ALLMULTI
||
141 netdev_mc_count(net
) > AX_MAX_MCAST
) {
143 } else if (netdev_mc_empty(net
)) {
144 /* just broadcast and directed */
146 /* We use the 20 byte dev->data
147 * for our 8 byte filter buffer
148 * to avoid allocating memory that
149 * is tricky to free later */
150 struct netdev_hw_addr
*ha
;
153 memset(data
->multi_filter
, 0, AX_MCAST_FILTER_SIZE
);
155 /* Build the multicast hash filter. */
156 netdev_for_each_mc_addr(ha
, net
) {
157 crc_bits
= ether_crc(ETH_ALEN
, ha
->addr
) >> 26;
158 data
->multi_filter
[crc_bits
>> 3] |=
162 asix_write_cmd_async(dev
, AX_CMD_WRITE_MULTI_FILTER
, 0, 0,
163 AX_MCAST_FILTER_SIZE
, data
->multi_filter
);
168 asix_write_cmd_async(dev
, AX_CMD_WRITE_RX_CTL
, rx_ctl
, 0, 0, NULL
);
171 static int ax88172_link_reset(struct usbnet
*dev
)
174 struct ethtool_cmd ecmd
= { .cmd
= ETHTOOL_GSET
};
176 mii_check_media(&dev
->mii
, 1, 1);
177 mii_ethtool_gset(&dev
->mii
, &ecmd
);
178 mode
= AX88172_MEDIUM_DEFAULT
;
180 if (ecmd
.duplex
!= DUPLEX_FULL
)
181 mode
|= ~AX88172_MEDIUM_FD
;
183 netdev_dbg(dev
->net
, "ax88172_link_reset() speed: %u duplex: %d setting mode to 0x%04x\n",
184 ethtool_cmd_speed(&ecmd
), ecmd
.duplex
, mode
);
186 asix_write_medium_mode(dev
, mode
, 0);
191 static const struct net_device_ops ax88172_netdev_ops
= {
192 .ndo_open
= usbnet_open
,
193 .ndo_stop
= usbnet_stop
,
194 .ndo_start_xmit
= usbnet_start_xmit
,
195 .ndo_tx_timeout
= usbnet_tx_timeout
,
196 .ndo_change_mtu
= usbnet_change_mtu
,
197 .ndo_get_stats64
= dev_get_tstats64
,
198 .ndo_set_mac_address
= eth_mac_addr
,
199 .ndo_validate_addr
= eth_validate_addr
,
200 .ndo_eth_ioctl
= asix_ioctl
,
201 .ndo_set_rx_mode
= ax88172_set_multicast
,
204 static void asix_phy_reset(struct usbnet
*dev
, unsigned int reset_bits
)
206 unsigned int timeout
= 5000;
208 asix_mdio_write(dev
->net
, dev
->mii
.phy_id
, MII_BMCR
, reset_bits
);
210 /* give phy_id a chance to process reset */
213 /* See IEEE 802.3 "22.2.4.1.1 Reset": 500ms max */
215 if (asix_mdio_read(dev
->net
, dev
->mii
.phy_id
, MII_BMCR
)
222 netdev_err(dev
->net
, "BMCR_RESET timeout on phy_id %d\n",
226 static int ax88172_bind(struct usbnet
*dev
, struct usb_interface
*intf
)
229 u8 buf
[ETH_ALEN
] = {0};
231 unsigned long gpio_bits
= dev
->driver_info
->data
;
233 usbnet_get_endpoints(dev
,intf
);
235 /* Toggle the GPIOs in a manufacturer/model specific way */
236 for (i
= 2; i
>= 0; i
--) {
237 ret
= asix_write_cmd(dev
, AX_CMD_WRITE_GPIOS
,
238 (gpio_bits
>> (i
* 8)) & 0xff, 0, 0, NULL
, 0);
244 ret
= asix_write_rx_ctl(dev
, 0x80, 0);
248 /* Get the MAC address */
249 ret
= asix_read_cmd(dev
, AX88172_CMD_READ_NODE_ID
,
250 0, 0, ETH_ALEN
, buf
, 0);
252 netdev_dbg(dev
->net
, "read AX_CMD_READ_NODE_ID failed: %d\n",
257 asix_set_netdev_dev_addr(dev
, buf
);
259 /* Initialize MII structure */
260 dev
->mii
.dev
= dev
->net
;
261 dev
->mii
.mdio_read
= asix_mdio_read
;
262 dev
->mii
.mdio_write
= asix_mdio_write
;
263 dev
->mii
.phy_id_mask
= 0x3f;
264 dev
->mii
.reg_num_mask
= 0x1f;
266 dev
->mii
.phy_id
= asix_read_phy_addr(dev
, true);
267 if (dev
->mii
.phy_id
< 0)
268 return dev
->mii
.phy_id
;
270 dev
->net
->netdev_ops
= &ax88172_netdev_ops
;
271 dev
->net
->ethtool_ops
= &ax88172_ethtool_ops
;
272 dev
->net
->needed_headroom
= 4; /* cf asix_tx_fixup() */
273 dev
->net
->needed_tailroom
= 4; /* cf asix_tx_fixup() */
275 asix_phy_reset(dev
, BMCR_RESET
);
276 asix_mdio_write(dev
->net
, dev
->mii
.phy_id
, MII_ADVERTISE
,
277 ADVERTISE_ALL
| ADVERTISE_CSMA
| ADVERTISE_PAUSE_CAP
);
278 mii_nway_restart(&dev
->mii
);
286 static void ax88772_ethtool_get_strings(struct net_device
*netdev
, u32 sset
,
291 net_selftest_get_strings(data
);
296 static int ax88772_ethtool_get_sset_count(struct net_device
*ndev
, int sset
)
300 return net_selftest_get_count();
306 static void ax88772_ethtool_get_pauseparam(struct net_device
*ndev
,
307 struct ethtool_pauseparam
*pause
)
309 struct usbnet
*dev
= netdev_priv(ndev
);
310 struct asix_common_private
*priv
= dev
->driver_priv
;
312 phylink_ethtool_get_pauseparam(priv
->phylink
, pause
);
315 static int ax88772_ethtool_set_pauseparam(struct net_device
*ndev
,
316 struct ethtool_pauseparam
*pause
)
318 struct usbnet
*dev
= netdev_priv(ndev
);
319 struct asix_common_private
*priv
= dev
->driver_priv
;
321 return phylink_ethtool_set_pauseparam(priv
->phylink
, pause
);
324 static const struct ethtool_ops ax88772_ethtool_ops
= {
325 .get_drvinfo
= asix_get_drvinfo
,
326 .get_link
= usbnet_get_link
,
327 .get_msglevel
= usbnet_get_msglevel
,
328 .set_msglevel
= usbnet_set_msglevel
,
329 .get_wol
= asix_get_wol
,
330 .set_wol
= asix_set_wol
,
331 .get_eeprom_len
= asix_get_eeprom_len
,
332 .get_eeprom
= asix_get_eeprom
,
333 .set_eeprom
= asix_set_eeprom
,
334 .nway_reset
= phy_ethtool_nway_reset
,
335 .get_link_ksettings
= phy_ethtool_get_link_ksettings
,
336 .set_link_ksettings
= phy_ethtool_set_link_ksettings
,
337 .self_test
= net_selftest
,
338 .get_strings
= ax88772_ethtool_get_strings
,
339 .get_sset_count
= ax88772_ethtool_get_sset_count
,
340 .get_pauseparam
= ax88772_ethtool_get_pauseparam
,
341 .set_pauseparam
= ax88772_ethtool_set_pauseparam
,
344 static int ax88772_reset(struct usbnet
*dev
)
346 struct asix_data
*data
= (struct asix_data
*)&dev
->data
;
347 struct asix_common_private
*priv
= dev
->driver_priv
;
350 /* Rewrite MAC address */
351 ether_addr_copy(data
->mac_addr
, dev
->net
->dev_addr
);
352 ret
= asix_write_cmd(dev
, AX_CMD_WRITE_NODE_ID
, 0, 0,
353 ETH_ALEN
, data
->mac_addr
, 0);
357 /* Set RX_CTL to default values with 2k buffer, and enable cactus */
358 ret
= asix_write_rx_ctl(dev
, AX_DEFAULT_RX_CTL
, 0);
362 ret
= asix_write_medium_mode(dev
, AX88772_MEDIUM_DEFAULT
, 0);
366 phylink_start(priv
->phylink
);
374 static int ax88772_hw_reset(struct usbnet
*dev
, int in_pm
)
376 struct asix_data
*data
= (struct asix_data
*)&dev
->data
;
377 struct asix_common_private
*priv
= dev
->driver_priv
;
381 ret
= asix_write_gpio(dev
, AX_GPIO_RSE
| AX_GPIO_GPO_2
|
382 AX_GPIO_GPO2EN
, 5, in_pm
);
386 ret
= asix_write_cmd(dev
, AX_CMD_SW_PHY_SELECT
, priv
->embd_phy
,
389 netdev_dbg(dev
->net
, "Select PHY #1 failed: %d\n", ret
);
393 if (priv
->embd_phy
) {
394 ret
= asix_sw_reset(dev
, AX_SWRESET_IPPD
, in_pm
);
398 usleep_range(10000, 11000);
400 ret
= asix_sw_reset(dev
, AX_SWRESET_CLEAR
, in_pm
);
406 ret
= asix_sw_reset(dev
, AX_SWRESET_IPRL
| AX_SWRESET_PRL
,
411 ret
= asix_sw_reset(dev
, AX_SWRESET_IPPD
| AX_SWRESET_PRL
,
419 if (in_pm
&& (!asix_mdio_read_nopm(dev
->net
, dev
->mii
.phy_id
,
425 ret
= asix_write_rx_ctl(dev
, AX_DEFAULT_RX_CTL
, in_pm
);
429 ret
= asix_write_medium_mode(dev
, AX88772_MEDIUM_DEFAULT
, in_pm
);
433 ret
= asix_write_cmd(dev
, AX_CMD_WRITE_IPG0
,
434 AX88772_IPG0_DEFAULT
| AX88772_IPG1_DEFAULT
,
435 AX88772_IPG2_DEFAULT
, 0, NULL
, in_pm
);
437 netdev_dbg(dev
->net
, "Write IPG,IPG1,IPG2 failed: %d\n", ret
);
441 /* Rewrite MAC address */
442 ether_addr_copy(data
->mac_addr
, dev
->net
->dev_addr
);
443 ret
= asix_write_cmd(dev
, AX_CMD_WRITE_NODE_ID
, 0, 0,
444 ETH_ALEN
, data
->mac_addr
, in_pm
);
448 /* Set RX_CTL to default values with 2k buffer, and enable cactus */
449 ret
= asix_write_rx_ctl(dev
, AX_DEFAULT_RX_CTL
, in_pm
);
453 rx_ctl
= asix_read_rx_ctl(dev
, in_pm
);
454 netdev_dbg(dev
->net
, "RX_CTL is 0x%04x after all initializations\n",
457 rx_ctl
= asix_read_medium_status(dev
, in_pm
);
459 "Medium Status is 0x%04x after all initializations\n",
468 static int ax88772a_hw_reset(struct usbnet
*dev
, int in_pm
)
470 struct asix_data
*data
= (struct asix_data
*)&dev
->data
;
471 struct asix_common_private
*priv
= dev
->driver_priv
;
472 u16 rx_ctl
, phy14h
, phy15h
, phy16h
;
475 ret
= asix_write_gpio(dev
, AX_GPIO_RSE
, 5, in_pm
);
479 ret
= asix_write_cmd(dev
, AX_CMD_SW_PHY_SELECT
, priv
->embd_phy
|
480 AX_PHYSEL_SSEN
, 0, 0, NULL
, in_pm
);
482 netdev_dbg(dev
->net
, "Select PHY #1 failed: %d\n", ret
);
485 usleep_range(10000, 11000);
487 ret
= asix_sw_reset(dev
, AX_SWRESET_IPPD
| AX_SWRESET_IPRL
, in_pm
);
491 usleep_range(10000, 11000);
493 ret
= asix_sw_reset(dev
, AX_SWRESET_IPRL
, in_pm
);
499 ret
= asix_sw_reset(dev
, AX_SWRESET_CLEAR
, in_pm
);
503 ret
= asix_sw_reset(dev
, AX_SWRESET_IPRL
, in_pm
);
509 if (in_pm
&& (!asix_mdio_read_nopm(dev
->net
, dev
->mii
.phy_id
,
515 if (priv
->chipcode
== AX_AX88772B_CHIPCODE
) {
516 ret
= asix_write_cmd(dev
, AX_QCTCTRL
, 0x8000, 0x8001,
519 netdev_dbg(dev
->net
, "Write BQ setting failed: %d\n",
523 } else if (priv
->chipcode
== AX_AX88772A_CHIPCODE
) {
524 /* Check if the PHY registers have default settings */
525 phy14h
= asix_mdio_read_nopm(dev
->net
, dev
->mii
.phy_id
,
527 phy15h
= asix_mdio_read_nopm(dev
->net
, dev
->mii
.phy_id
,
529 phy16h
= asix_mdio_read_nopm(dev
->net
, dev
->mii
.phy_id
,
533 "772a_hw_reset: MR20=0x%x MR21=0x%x MR22=0x%x\n",
534 phy14h
, phy15h
, phy16h
);
536 /* Restore PHY registers default setting if not */
537 if (phy14h
!= AX88772A_PHY14H_DEFAULT
)
538 asix_mdio_write_nopm(dev
->net
, dev
->mii
.phy_id
,
540 AX88772A_PHY14H_DEFAULT
);
541 if (phy15h
!= AX88772A_PHY15H_DEFAULT
)
542 asix_mdio_write_nopm(dev
->net
, dev
->mii
.phy_id
,
544 AX88772A_PHY15H_DEFAULT
);
545 if (phy16h
!= AX88772A_PHY16H_DEFAULT
)
546 asix_mdio_write_nopm(dev
->net
, dev
->mii
.phy_id
,
548 AX88772A_PHY16H_DEFAULT
);
551 ret
= asix_write_cmd(dev
, AX_CMD_WRITE_IPG0
,
552 AX88772_IPG0_DEFAULT
| AX88772_IPG1_DEFAULT
,
553 AX88772_IPG2_DEFAULT
, 0, NULL
, in_pm
);
555 netdev_dbg(dev
->net
, "Write IPG,IPG1,IPG2 failed: %d\n", ret
);
559 /* Rewrite MAC address */
560 memcpy(data
->mac_addr
, dev
->net
->dev_addr
, ETH_ALEN
);
561 ret
= asix_write_cmd(dev
, AX_CMD_WRITE_NODE_ID
, 0, 0, ETH_ALEN
,
562 data
->mac_addr
, in_pm
);
566 /* Set RX_CTL to default values with 2k buffer, and enable cactus */
567 ret
= asix_write_rx_ctl(dev
, AX_DEFAULT_RX_CTL
, in_pm
);
571 ret
= asix_write_medium_mode(dev
, AX88772_MEDIUM_DEFAULT
, in_pm
);
575 /* Set RX_CTL to default values with 2k buffer, and enable cactus */
576 ret
= asix_write_rx_ctl(dev
, AX_DEFAULT_RX_CTL
, in_pm
);
580 rx_ctl
= asix_read_rx_ctl(dev
, in_pm
);
581 netdev_dbg(dev
->net
, "RX_CTL is 0x%04x after all initializations\n",
584 rx_ctl
= asix_read_medium_status(dev
, in_pm
);
586 "Medium Status is 0x%04x after all initializations\n",
595 static const struct net_device_ops ax88772_netdev_ops
= {
596 .ndo_open
= usbnet_open
,
597 .ndo_stop
= usbnet_stop
,
598 .ndo_start_xmit
= usbnet_start_xmit
,
599 .ndo_tx_timeout
= usbnet_tx_timeout
,
600 .ndo_change_mtu
= usbnet_change_mtu
,
601 .ndo_get_stats64
= dev_get_tstats64
,
602 .ndo_set_mac_address
= asix_set_mac_address
,
603 .ndo_validate_addr
= eth_validate_addr
,
604 .ndo_eth_ioctl
= phy_do_ioctl_running
,
605 .ndo_set_rx_mode
= asix_set_multicast
,
608 static void ax88772_suspend(struct usbnet
*dev
)
610 struct asix_common_private
*priv
= dev
->driver_priv
;
613 if (netif_running(dev
->net
)) {
615 phylink_suspend(priv
->phylink
, false);
619 /* Stop MAC operation */
620 medium
= asix_read_medium_status(dev
, 1);
621 medium
&= ~AX_MEDIUM_RE
;
622 asix_write_medium_mode(dev
, medium
, 1);
624 netdev_dbg(dev
->net
, "ax88772_suspend: medium=0x%04x\n",
625 asix_read_medium_status(dev
, 1));
628 static int asix_suspend(struct usb_interface
*intf
, pm_message_t message
)
630 struct usbnet
*dev
= usb_get_intfdata(intf
);
631 struct asix_common_private
*priv
= dev
->driver_priv
;
633 if (priv
&& priv
->suspend
)
636 return usbnet_suspend(intf
, message
);
639 static void ax88772_resume(struct usbnet
*dev
)
641 struct asix_common_private
*priv
= dev
->driver_priv
;
644 for (i
= 0; i
< 3; i
++)
645 if (!priv
->reset(dev
, 1))
648 if (netif_running(dev
->net
)) {
650 phylink_resume(priv
->phylink
);
655 static int asix_resume(struct usb_interface
*intf
)
657 struct usbnet
*dev
= usb_get_intfdata(intf
);
658 struct asix_common_private
*priv
= dev
->driver_priv
;
660 if (priv
&& priv
->resume
)
663 return usbnet_resume(intf
);
666 static int ax88772_init_mdio(struct usbnet
*dev
)
668 struct asix_common_private
*priv
= dev
->driver_priv
;
671 priv
->mdio
= mdiobus_alloc();
675 priv
->mdio
->priv
= dev
;
676 priv
->mdio
->read
= &asix_mdio_bus_read
;
677 priv
->mdio
->write
= &asix_mdio_bus_write
;
678 priv
->mdio
->name
= "Asix MDIO Bus";
679 /* mii bus name is usb-<usb bus number>-<usb device number> */
680 snprintf(priv
->mdio
->id
, MII_BUS_ID_SIZE
, "usb-%03d:%03d",
681 dev
->udev
->bus
->busnum
, dev
->udev
->devnum
);
683 ret
= mdiobus_register(priv
->mdio
);
685 netdev_err(dev
->net
, "Could not register MDIO bus (err %d)\n", ret
);
686 mdiobus_free(priv
->mdio
);
693 static void ax88772_mdio_unregister(struct asix_common_private
*priv
)
695 mdiobus_unregister(priv
->mdio
);
696 mdiobus_free(priv
->mdio
);
699 static int ax88772_init_phy(struct usbnet
*dev
)
701 struct asix_common_private
*priv
= dev
->driver_priv
;
704 priv
->phydev
= mdiobus_get_phy(priv
->mdio
, priv
->phy_addr
);
706 netdev_err(dev
->net
, "Could not find PHY\n");
710 ret
= phylink_connect_phy(priv
->phylink
, priv
->phydev
);
712 netdev_err(dev
->net
, "Could not connect PHY\n");
716 phy_suspend(priv
->phydev
);
717 priv
->phydev
->mac_managed_pm
= true;
719 phy_attached_info(priv
->phydev
);
724 /* In case main PHY is not the embedded PHY and MAC is RMII clock
725 * provider, we need to suspend embedded PHY by keeping PLL enabled
726 * (AX_SWRESET_IPPD == 0).
728 priv
->phydev_int
= mdiobus_get_phy(priv
->mdio
, AX_EMBD_PHY_ADDR
);
729 if (!priv
->phydev_int
) {
731 phylink_disconnect_phy(priv
->phylink
);
733 netdev_err(dev
->net
, "Could not find internal PHY\n");
737 priv
->phydev_int
->mac_managed_pm
= true;
738 phy_suspend(priv
->phydev_int
);
743 static void ax88772_mac_config(struct phylink_config
*config
, unsigned int mode
,
744 const struct phylink_link_state
*state
)
749 static void ax88772_mac_link_down(struct phylink_config
*config
,
750 unsigned int mode
, phy_interface_t interface
)
752 struct usbnet
*dev
= netdev_priv(to_net_dev(config
->dev
));
754 asix_write_medium_mode(dev
, 0, 0);
755 usbnet_link_change(dev
, false, false);
758 static void ax88772_mac_link_up(struct phylink_config
*config
,
759 struct phy_device
*phy
,
760 unsigned int mode
, phy_interface_t interface
,
761 int speed
, int duplex
,
762 bool tx_pause
, bool rx_pause
)
764 struct usbnet
*dev
= netdev_priv(to_net_dev(config
->dev
));
765 u16 m
= AX_MEDIUM_AC
| AX_MEDIUM_RE
;
767 m
|= duplex
? AX_MEDIUM_FD
: 0;
785 asix_write_medium_mode(dev
, m
, 0);
786 usbnet_link_change(dev
, true, false);
789 static const struct phylink_mac_ops ax88772_phylink_mac_ops
= {
790 .mac_config
= ax88772_mac_config
,
791 .mac_link_down
= ax88772_mac_link_down
,
792 .mac_link_up
= ax88772_mac_link_up
,
795 static int ax88772_phylink_setup(struct usbnet
*dev
)
797 struct asix_common_private
*priv
= dev
->driver_priv
;
798 phy_interface_t phy_if_mode
;
799 struct phylink
*phylink
;
801 priv
->phylink_config
.dev
= &dev
->net
->dev
;
802 priv
->phylink_config
.type
= PHYLINK_NETDEV
;
803 priv
->phylink_config
.mac_capabilities
= MAC_SYM_PAUSE
| MAC_ASYM_PAUSE
|
806 __set_bit(PHY_INTERFACE_MODE_INTERNAL
,
807 priv
->phylink_config
.supported_interfaces
);
808 __set_bit(PHY_INTERFACE_MODE_RMII
,
809 priv
->phylink_config
.supported_interfaces
);
812 phy_if_mode
= PHY_INTERFACE_MODE_INTERNAL
;
814 phy_if_mode
= PHY_INTERFACE_MODE_RMII
;
816 phylink
= phylink_create(&priv
->phylink_config
, dev
->net
->dev
.fwnode
,
817 phy_if_mode
, &ax88772_phylink_mac_ops
);
819 return PTR_ERR(phylink
);
821 priv
->phylink
= phylink
;
825 static int ax88772_bind(struct usbnet
*dev
, struct usb_interface
*intf
)
827 struct asix_common_private
*priv
;
828 u8 buf
[ETH_ALEN
] = {0};
831 priv
= devm_kzalloc(&dev
->udev
->dev
, sizeof(*priv
), GFP_KERNEL
);
835 dev
->driver_priv
= priv
;
837 usbnet_get_endpoints(dev
, intf
);
839 /* Maybe the boot loader passed the MAC address via device tree */
840 if (!eth_platform_get_mac_address(&dev
->udev
->dev
, buf
)) {
841 netif_dbg(dev
, ifup
, dev
->net
,
842 "MAC address read from device tree");
844 /* Try getting the MAC address from EEPROM */
845 if (dev
->driver_info
->data
& FLAG_EEPROM_MAC
) {
846 for (i
= 0; i
< (ETH_ALEN
>> 1); i
++) {
847 ret
= asix_read_cmd(dev
, AX_CMD_READ_EEPROM
,
848 0x04 + i
, 0, 2, buf
+ i
* 2,
854 ret
= asix_read_cmd(dev
, AX_CMD_READ_NODE_ID
,
855 0, 0, ETH_ALEN
, buf
, 0);
859 netdev_dbg(dev
->net
, "Failed to read MAC address: %d\n",
865 asix_set_netdev_dev_addr(dev
, buf
);
867 dev
->net
->netdev_ops
= &ax88772_netdev_ops
;
868 dev
->net
->ethtool_ops
= &ax88772_ethtool_ops
;
869 dev
->net
->needed_headroom
= 4; /* cf asix_tx_fixup() */
870 dev
->net
->needed_tailroom
= 4; /* cf asix_tx_fixup() */
872 ret
= asix_read_phy_addr(dev
, true);
876 priv
->phy_addr
= ret
;
877 priv
->embd_phy
= ((priv
->phy_addr
& 0x1f) == AX_EMBD_PHY_ADDR
);
879 ret
= asix_read_cmd(dev
, AX_CMD_STATMNGSTS_REG
, 0, 0, 1,
882 netdev_dbg(dev
->net
, "Failed to read STATMNGSTS_REG: %d\n", ret
);
886 priv
->chipcode
&= AX_CHIPCODE_MASK
;
888 priv
->resume
= ax88772_resume
;
889 priv
->suspend
= ax88772_suspend
;
890 if (priv
->chipcode
== AX_AX88772_CHIPCODE
)
891 priv
->reset
= ax88772_hw_reset
;
893 priv
->reset
= ax88772a_hw_reset
;
895 ret
= priv
->reset(dev
, 0);
897 netdev_dbg(dev
->net
, "Failed to reset AX88772: %d\n", ret
);
901 /* Asix framing packs multiple eth frames into a 2K usb bulk transfer */
902 if (dev
->driver_info
->flags
& FLAG_FRAMING_AX
) {
903 /* hard_mtu is still the default - the device does not support
905 dev
->rx_urb_size
= 2048;
908 priv
->presvd_phy_bmcr
= 0;
909 priv
->presvd_phy_advertise
= 0;
911 ret
= ax88772_init_mdio(dev
);
915 ret
= ax88772_phylink_setup(dev
);
919 ret
= ax88772_init_phy(dev
);
926 phylink_destroy(priv
->phylink
);
928 ax88772_mdio_unregister(priv
);
933 static int ax88772_stop(struct usbnet
*dev
)
935 struct asix_common_private
*priv
= dev
->driver_priv
;
937 phylink_stop(priv
->phylink
);
942 static void ax88772_unbind(struct usbnet
*dev
, struct usb_interface
*intf
)
944 struct asix_common_private
*priv
= dev
->driver_priv
;
947 phylink_disconnect_phy(priv
->phylink
);
949 phylink_destroy(priv
->phylink
);
950 ax88772_mdio_unregister(priv
);
951 asix_rx_fixup_common_free(dev
->driver_priv
);
954 static void ax88178_unbind(struct usbnet
*dev
, struct usb_interface
*intf
)
956 asix_rx_fixup_common_free(dev
->driver_priv
);
957 kfree(dev
->driver_priv
);
960 static const struct ethtool_ops ax88178_ethtool_ops
= {
961 .get_drvinfo
= asix_get_drvinfo
,
962 .get_link
= asix_get_link
,
963 .get_msglevel
= usbnet_get_msglevel
,
964 .set_msglevel
= usbnet_set_msglevel
,
965 .get_wol
= asix_get_wol
,
966 .set_wol
= asix_set_wol
,
967 .get_eeprom_len
= asix_get_eeprom_len
,
968 .get_eeprom
= asix_get_eeprom
,
969 .set_eeprom
= asix_set_eeprom
,
970 .nway_reset
= usbnet_nway_reset
,
971 .get_link_ksettings
= usbnet_get_link_ksettings_mii
,
972 .set_link_ksettings
= usbnet_set_link_ksettings_mii
,
975 static int marvell_phy_init(struct usbnet
*dev
)
977 struct asix_data
*data
= (struct asix_data
*)&dev
->data
;
980 netdev_dbg(dev
->net
, "marvell_phy_init()\n");
982 reg
= asix_mdio_read(dev
->net
, dev
->mii
.phy_id
, MII_MARVELL_STATUS
);
983 netdev_dbg(dev
->net
, "MII_MARVELL_STATUS = 0x%04x\n", reg
);
985 asix_mdio_write(dev
->net
, dev
->mii
.phy_id
, MII_MARVELL_CTRL
,
986 MARVELL_CTRL_RXDELAY
| MARVELL_CTRL_TXDELAY
);
989 reg
= asix_mdio_read(dev
->net
, dev
->mii
.phy_id
,
990 MII_MARVELL_LED_CTRL
);
991 netdev_dbg(dev
->net
, "MII_MARVELL_LED_CTRL (1) = 0x%04x\n", reg
);
995 asix_mdio_write(dev
->net
, dev
->mii
.phy_id
,
996 MII_MARVELL_LED_CTRL
, reg
);
998 reg
= asix_mdio_read(dev
->net
, dev
->mii
.phy_id
,
999 MII_MARVELL_LED_CTRL
);
1000 netdev_dbg(dev
->net
, "MII_MARVELL_LED_CTRL (2) = 0x%04x\n", reg
);
1006 static int rtl8211cl_phy_init(struct usbnet
*dev
)
1008 struct asix_data
*data
= (struct asix_data
*)&dev
->data
;
1010 netdev_dbg(dev
->net
, "rtl8211cl_phy_init()\n");
1012 asix_mdio_write (dev
->net
, dev
->mii
.phy_id
, 0x1f, 0x0005);
1013 asix_mdio_write (dev
->net
, dev
->mii
.phy_id
, 0x0c, 0);
1014 asix_mdio_write (dev
->net
, dev
->mii
.phy_id
, 0x01,
1015 asix_mdio_read (dev
->net
, dev
->mii
.phy_id
, 0x01) | 0x0080);
1016 asix_mdio_write (dev
->net
, dev
->mii
.phy_id
, 0x1f, 0);
1018 if (data
->ledmode
== 12) {
1019 asix_mdio_write (dev
->net
, dev
->mii
.phy_id
, 0x1f, 0x0002);
1020 asix_mdio_write (dev
->net
, dev
->mii
.phy_id
, 0x1a, 0x00cb);
1021 asix_mdio_write (dev
->net
, dev
->mii
.phy_id
, 0x1f, 0);
1027 static int marvell_led_status(struct usbnet
*dev
, u16 speed
)
1029 u16 reg
= asix_mdio_read(dev
->net
, dev
->mii
.phy_id
, MARVELL_LED_MANUAL
);
1031 netdev_dbg(dev
->net
, "marvell_led_status() read 0x%04x\n", reg
);
1033 /* Clear out the center LED bits - 0x03F0 */
1047 netdev_dbg(dev
->net
, "marvell_led_status() writing 0x%04x\n", reg
);
1048 asix_mdio_write(dev
->net
, dev
->mii
.phy_id
, MARVELL_LED_MANUAL
, reg
);
1053 static int ax88178_reset(struct usbnet
*dev
)
1055 struct asix_data
*data
= (struct asix_data
*)&dev
->data
;
1062 ret
= asix_read_cmd(dev
, AX_CMD_READ_GPIOS
, 0, 0, 1, &status
, 0);
1064 netdev_dbg(dev
->net
, "Failed to read GPIOS: %d\n", ret
);
1068 netdev_dbg(dev
->net
, "GPIO Status: 0x%04x\n", status
);
1070 asix_write_cmd(dev
, AX_CMD_WRITE_ENABLE
, 0, 0, 0, NULL
, 0);
1071 ret
= asix_read_cmd(dev
, AX_CMD_READ_EEPROM
, 0x0017, 0, 2, &eeprom
, 0);
1073 netdev_dbg(dev
->net
, "Failed to read EEPROM: %d\n", ret
);
1077 asix_write_cmd(dev
, AX_CMD_WRITE_DISABLE
, 0, 0, 0, NULL
, 0);
1079 netdev_dbg(dev
->net
, "EEPROM index 0x17 is 0x%04x\n", eeprom
);
1081 if (eeprom
== cpu_to_le16(0xffff)) {
1082 data
->phymode
= PHY_MODE_MARVELL
;
1086 data
->phymode
= le16_to_cpu(eeprom
) & 0x7F;
1087 data
->ledmode
= le16_to_cpu(eeprom
) >> 8;
1088 gpio0
= (le16_to_cpu(eeprom
) & 0x80) ? 0 : 1;
1090 netdev_dbg(dev
->net
, "GPIO0: %d, PhyMode: %d\n", gpio0
, data
->phymode
);
1092 /* Power up external GigaPHY through AX88178 GPIO pin */
1093 asix_write_gpio(dev
, AX_GPIO_RSE
| AX_GPIO_GPO_1
|
1094 AX_GPIO_GPO1EN
, 40, 0);
1095 if ((le16_to_cpu(eeprom
) >> 8) != 1) {
1096 asix_write_gpio(dev
, 0x003c, 30, 0);
1097 asix_write_gpio(dev
, 0x001c, 300, 0);
1098 asix_write_gpio(dev
, 0x003c, 30, 0);
1100 netdev_dbg(dev
->net
, "gpio phymode == 1 path\n");
1101 asix_write_gpio(dev
, AX_GPIO_GPO1EN
, 30, 0);
1102 asix_write_gpio(dev
, AX_GPIO_GPO1EN
| AX_GPIO_GPO_1
, 30, 0);
1105 /* Read PHYID register *AFTER* powering up PHY */
1106 phyid
= asix_get_phyid(dev
);
1107 netdev_dbg(dev
->net
, "PHYID=0x%08x\n", phyid
);
1109 /* Set AX88178 to enable MII/GMII/RGMII interface for external PHY */
1110 asix_write_cmd(dev
, AX_CMD_SW_PHY_SELECT
, 0, 0, 0, NULL
, 0);
1112 asix_sw_reset(dev
, 0, 0);
1115 asix_sw_reset(dev
, AX_SWRESET_PRL
| AX_SWRESET_IPPD
, 0);
1118 asix_write_rx_ctl(dev
, 0, 0);
1120 if (data
->phymode
== PHY_MODE_MARVELL
) {
1121 marvell_phy_init(dev
);
1123 } else if (data
->phymode
== PHY_MODE_RTL8211CL
)
1124 rtl8211cl_phy_init(dev
);
1126 asix_phy_reset(dev
, BMCR_RESET
| BMCR_ANENABLE
);
1127 asix_mdio_write(dev
->net
, dev
->mii
.phy_id
, MII_ADVERTISE
,
1128 ADVERTISE_ALL
| ADVERTISE_CSMA
| ADVERTISE_PAUSE_CAP
);
1129 asix_mdio_write(dev
->net
, dev
->mii
.phy_id
, MII_CTRL1000
,
1130 ADVERTISE_1000FULL
);
1132 asix_write_medium_mode(dev
, AX88178_MEDIUM_DEFAULT
, 0);
1133 mii_nway_restart(&dev
->mii
);
1135 /* Rewrite MAC address */
1136 memcpy(data
->mac_addr
, dev
->net
->dev_addr
, ETH_ALEN
);
1137 ret
= asix_write_cmd(dev
, AX_CMD_WRITE_NODE_ID
, 0, 0, ETH_ALEN
,
1142 ret
= asix_write_rx_ctl(dev
, AX_DEFAULT_RX_CTL
, 0);
1149 static int ax88178_link_reset(struct usbnet
*dev
)
1152 struct ethtool_cmd ecmd
= { .cmd
= ETHTOOL_GSET
};
1153 struct asix_data
*data
= (struct asix_data
*)&dev
->data
;
1156 netdev_dbg(dev
->net
, "ax88178_link_reset()\n");
1158 mii_check_media(&dev
->mii
, 1, 1);
1159 mii_ethtool_gset(&dev
->mii
, &ecmd
);
1160 mode
= AX88178_MEDIUM_DEFAULT
;
1161 speed
= ethtool_cmd_speed(&ecmd
);
1163 if (speed
== SPEED_1000
)
1164 mode
|= AX_MEDIUM_GM
;
1165 else if (speed
== SPEED_100
)
1166 mode
|= AX_MEDIUM_PS
;
1168 mode
&= ~(AX_MEDIUM_PS
| AX_MEDIUM_GM
);
1170 mode
|= AX_MEDIUM_ENCK
;
1172 if (ecmd
.duplex
== DUPLEX_FULL
)
1173 mode
|= AX_MEDIUM_FD
;
1175 mode
&= ~AX_MEDIUM_FD
;
1177 netdev_dbg(dev
->net
, "ax88178_link_reset() speed: %u duplex: %d setting mode to 0x%04x\n",
1178 speed
, ecmd
.duplex
, mode
);
1180 asix_write_medium_mode(dev
, mode
, 0);
1182 if (data
->phymode
== PHY_MODE_MARVELL
&& data
->ledmode
)
1183 marvell_led_status(dev
, speed
);
1188 static void ax88178_set_mfb(struct usbnet
*dev
)
1190 u16 mfb
= AX_RX_CTL_MFB_16384
;
1193 int old_rx_urb_size
= dev
->rx_urb_size
;
1195 if (dev
->hard_mtu
< 2048) {
1196 dev
->rx_urb_size
= 2048;
1197 mfb
= AX_RX_CTL_MFB_2048
;
1198 } else if (dev
->hard_mtu
< 4096) {
1199 dev
->rx_urb_size
= 4096;
1200 mfb
= AX_RX_CTL_MFB_4096
;
1201 } else if (dev
->hard_mtu
< 8192) {
1202 dev
->rx_urb_size
= 8192;
1203 mfb
= AX_RX_CTL_MFB_8192
;
1204 } else if (dev
->hard_mtu
< 16384) {
1205 dev
->rx_urb_size
= 16384;
1206 mfb
= AX_RX_CTL_MFB_16384
;
1209 rxctl
= asix_read_rx_ctl(dev
, 0);
1210 asix_write_rx_ctl(dev
, (rxctl
& ~AX_RX_CTL_MFB_16384
) | mfb
, 0);
1212 medium
= asix_read_medium_status(dev
, 0);
1213 if (dev
->net
->mtu
> 1500)
1214 medium
|= AX_MEDIUM_JFE
;
1216 medium
&= ~AX_MEDIUM_JFE
;
1217 asix_write_medium_mode(dev
, medium
, 0);
1219 if (dev
->rx_urb_size
> old_rx_urb_size
)
1220 usbnet_unlink_rx_urbs(dev
);
1223 static int ax88178_change_mtu(struct net_device
*net
, int new_mtu
)
1225 struct usbnet
*dev
= netdev_priv(net
);
1226 int ll_mtu
= new_mtu
+ net
->hard_header_len
+ 4;
1228 netdev_dbg(dev
->net
, "ax88178_change_mtu() new_mtu=%d\n", new_mtu
);
1230 if ((ll_mtu
% dev
->maxpacket
) == 0)
1233 WRITE_ONCE(net
->mtu
, new_mtu
);
1234 dev
->hard_mtu
= net
->mtu
+ net
->hard_header_len
;
1235 ax88178_set_mfb(dev
);
1237 /* max qlen depend on hard_mtu and rx_urb_size */
1238 usbnet_update_max_qlen(dev
);
1243 static const struct net_device_ops ax88178_netdev_ops
= {
1244 .ndo_open
= usbnet_open
,
1245 .ndo_stop
= usbnet_stop
,
1246 .ndo_start_xmit
= usbnet_start_xmit
,
1247 .ndo_tx_timeout
= usbnet_tx_timeout
,
1248 .ndo_get_stats64
= dev_get_tstats64
,
1249 .ndo_set_mac_address
= asix_set_mac_address
,
1250 .ndo_validate_addr
= eth_validate_addr
,
1251 .ndo_set_rx_mode
= asix_set_multicast
,
1252 .ndo_eth_ioctl
= asix_ioctl
,
1253 .ndo_change_mtu
= ax88178_change_mtu
,
1256 static int ax88178_bind(struct usbnet
*dev
, struct usb_interface
*intf
)
1259 u8 buf
[ETH_ALEN
] = {0};
1261 usbnet_get_endpoints(dev
,intf
);
1263 /* Get the MAC address */
1264 ret
= asix_read_cmd(dev
, AX_CMD_READ_NODE_ID
, 0, 0, ETH_ALEN
, buf
, 0);
1266 netdev_dbg(dev
->net
, "Failed to read MAC address: %d\n", ret
);
1270 asix_set_netdev_dev_addr(dev
, buf
);
1272 /* Initialize MII structure */
1273 dev
->mii
.dev
= dev
->net
;
1274 dev
->mii
.mdio_read
= asix_mdio_read
;
1275 dev
->mii
.mdio_write
= asix_mdio_write
;
1276 dev
->mii
.phy_id_mask
= 0x1f;
1277 dev
->mii
.reg_num_mask
= 0xff;
1278 dev
->mii
.supports_gmii
= 1;
1280 dev
->mii
.phy_id
= asix_read_phy_addr(dev
, true);
1281 if (dev
->mii
.phy_id
< 0)
1282 return dev
->mii
.phy_id
;
1284 dev
->net
->netdev_ops
= &ax88178_netdev_ops
;
1285 dev
->net
->ethtool_ops
= &ax88178_ethtool_ops
;
1286 dev
->net
->max_mtu
= 16384 - (dev
->net
->hard_header_len
+ 4);
1288 /* Blink LEDS so users know driver saw dongle */
1289 asix_sw_reset(dev
, 0, 0);
1292 asix_sw_reset(dev
, AX_SWRESET_PRL
| AX_SWRESET_IPPD
, 0);
1295 /* Asix framing packs multiple eth frames into a 2K usb bulk transfer */
1296 if (dev
->driver_info
->flags
& FLAG_FRAMING_AX
) {
1297 /* hard_mtu is still the default - the device does not support
1299 dev
->rx_urb_size
= 2048;
1302 dev
->driver_priv
= kzalloc(sizeof(struct asix_common_private
), GFP_KERNEL
);
1303 if (!dev
->driver_priv
)
1309 static const struct driver_info ax8817x_info
= {
1310 .description
= "ASIX AX8817x USB 2.0 Ethernet",
1311 .bind
= ax88172_bind
,
1312 .status
= asix_status
,
1313 .link_reset
= ax88172_link_reset
,
1314 .reset
= ax88172_link_reset
,
1315 .flags
= FLAG_ETHER
| FLAG_LINK_INTR
,
1319 static const struct driver_info dlink_dub_e100_info
= {
1320 .description
= "DLink DUB-E100 USB Ethernet",
1321 .bind
= ax88172_bind
,
1322 .status
= asix_status
,
1323 .link_reset
= ax88172_link_reset
,
1324 .reset
= ax88172_link_reset
,
1325 .flags
= FLAG_ETHER
| FLAG_LINK_INTR
,
1329 static const struct driver_info netgear_fa120_info
= {
1330 .description
= "Netgear FA-120 USB Ethernet",
1331 .bind
= ax88172_bind
,
1332 .status
= asix_status
,
1333 .link_reset
= ax88172_link_reset
,
1334 .reset
= ax88172_link_reset
,
1335 .flags
= FLAG_ETHER
| FLAG_LINK_INTR
,
1339 static const struct driver_info hawking_uf200_info
= {
1340 .description
= "Hawking UF200 USB Ethernet",
1341 .bind
= ax88172_bind
,
1342 .status
= asix_status
,
1343 .link_reset
= ax88172_link_reset
,
1344 .reset
= ax88172_link_reset
,
1345 .flags
= FLAG_ETHER
| FLAG_LINK_INTR
,
1349 static const struct driver_info ax88772_info
= {
1350 .description
= "ASIX AX88772 USB 2.0 Ethernet",
1351 .bind
= ax88772_bind
,
1352 .unbind
= ax88772_unbind
,
1353 .status
= asix_status
,
1354 .reset
= ax88772_reset
,
1355 .stop
= ax88772_stop
,
1356 .flags
= FLAG_ETHER
| FLAG_FRAMING_AX
| FLAG_LINK_INTR
| FLAG_MULTI_PACKET
,
1357 .rx_fixup
= asix_rx_fixup_common
,
1358 .tx_fixup
= asix_tx_fixup
,
1361 static const struct driver_info ax88772b_info
= {
1362 .description
= "ASIX AX88772B USB 2.0 Ethernet",
1363 .bind
= ax88772_bind
,
1364 .unbind
= ax88772_unbind
,
1365 .status
= asix_status
,
1366 .reset
= ax88772_reset
,
1367 .stop
= ax88772_stop
,
1368 .flags
= FLAG_ETHER
| FLAG_FRAMING_AX
| FLAG_LINK_INTR
|
1370 .rx_fixup
= asix_rx_fixup_common
,
1371 .tx_fixup
= asix_tx_fixup
,
1372 .data
= FLAG_EEPROM_MAC
,
1375 static const struct driver_info lxausb_t1l_info
= {
1376 .description
= "Linux Automation GmbH USB 10Base-T1L",
1377 .bind
= ax88772_bind
,
1378 .unbind
= ax88772_unbind
,
1379 .status
= asix_status
,
1380 .reset
= ax88772_reset
,
1381 .stop
= ax88772_stop
,
1382 .flags
= FLAG_ETHER
| FLAG_FRAMING_AX
| FLAG_LINK_INTR
|
1384 .rx_fixup
= asix_rx_fixup_common
,
1385 .tx_fixup
= asix_tx_fixup
,
1386 .data
= FLAG_EEPROM_MAC
,
1389 static const struct driver_info ax88178_info
= {
1390 .description
= "ASIX AX88178 USB 2.0 Ethernet",
1391 .bind
= ax88178_bind
,
1392 .unbind
= ax88178_unbind
,
1393 .status
= asix_status
,
1394 .link_reset
= ax88178_link_reset
,
1395 .reset
= ax88178_reset
,
1396 .flags
= FLAG_ETHER
| FLAG_FRAMING_AX
| FLAG_LINK_INTR
|
1398 .rx_fixup
= asix_rx_fixup_common
,
1399 .tx_fixup
= asix_tx_fixup
,
1403 * USBLINK 20F9 "USB 2.0 LAN" USB ethernet adapter, typically found in
1404 * no-name packaging.
1405 * USB device strings are:
1406 * 1: Manufacturer: USBLINK
1407 * 2: Product: HG20F9 USB2.0
1409 * Appears to be compatible with Asix 88772B.
1411 static const struct driver_info hg20f9_info
= {
1412 .description
= "HG20F9 USB 2.0 Ethernet",
1413 .bind
= ax88772_bind
,
1414 .unbind
= ax88772_unbind
,
1415 .status
= asix_status
,
1416 .reset
= ax88772_reset
,
1417 .flags
= FLAG_ETHER
| FLAG_FRAMING_AX
| FLAG_LINK_INTR
|
1419 .rx_fixup
= asix_rx_fixup_common
,
1420 .tx_fixup
= asix_tx_fixup
,
1421 .data
= FLAG_EEPROM_MAC
,
1424 static const struct usb_device_id products
[] = {
1427 USB_DEVICE (0x077b, 0x2226),
1428 .driver_info
= (unsigned long) &ax8817x_info
,
1431 USB_DEVICE (0x0846, 0x1040),
1432 .driver_info
= (unsigned long) &netgear_fa120_info
,
1435 USB_DEVICE (0x2001, 0x1a00),
1436 .driver_info
= (unsigned long) &dlink_dub_e100_info
,
1438 // Intellinet, ST Lab USB Ethernet
1439 USB_DEVICE (0x0b95, 0x1720),
1440 .driver_info
= (unsigned long) &ax8817x_info
,
1442 // Hawking UF200, TrendNet TU2-ET100
1443 USB_DEVICE (0x07b8, 0x420a),
1444 .driver_info
= (unsigned long) &hawking_uf200_info
,
1446 // Billionton Systems, USB2AR
1447 USB_DEVICE (0x08dd, 0x90ff),
1448 .driver_info
= (unsigned long) &ax8817x_info
,
1450 // Billionton Systems, GUSB2AM-1G-B
1451 USB_DEVICE(0x08dd, 0x0114),
1452 .driver_info
= (unsigned long) &ax88178_info
,
1455 USB_DEVICE (0x0557, 0x2009),
1456 .driver_info
= (unsigned long) &ax8817x_info
,
1458 // Buffalo LUA-U2-KTX
1459 USB_DEVICE (0x0411, 0x003d),
1460 .driver_info
= (unsigned long) &ax8817x_info
,
1462 // Buffalo LUA-U2-GT 10/100/1000
1463 USB_DEVICE (0x0411, 0x006e),
1464 .driver_info
= (unsigned long) &ax88178_info
,
1466 // Sitecom LN-029 "USB 2.0 10/100 Ethernet adapter"
1467 USB_DEVICE (0x6189, 0x182d),
1468 .driver_info
= (unsigned long) &ax8817x_info
,
1470 // Sitecom LN-031 "USB 2.0 10/100/1000 Ethernet adapter"
1471 USB_DEVICE (0x0df6, 0x0056),
1472 .driver_info
= (unsigned long) &ax88178_info
,
1474 // Sitecom LN-028 "USB 2.0 10/100/1000 Ethernet adapter"
1475 USB_DEVICE (0x0df6, 0x061c),
1476 .driver_info
= (unsigned long) &ax88178_info
,
1478 // corega FEther USB2-TX
1479 USB_DEVICE (0x07aa, 0x0017),
1480 .driver_info
= (unsigned long) &ax8817x_info
,
1482 // Surecom EP-1427X-2
1483 USB_DEVICE (0x1189, 0x0893),
1484 .driver_info
= (unsigned long) &ax8817x_info
,
1486 // goodway corp usb gwusb2e
1487 USB_DEVICE (0x1631, 0x6200),
1488 .driver_info
= (unsigned long) &ax8817x_info
,
1490 // JVC MP-PRX1 Port Replicator
1491 USB_DEVICE (0x04f1, 0x3008),
1492 .driver_info
= (unsigned long) &ax8817x_info
,
1494 // Lenovo U2L100P 10/100
1495 USB_DEVICE (0x17ef, 0x7203),
1496 .driver_info
= (unsigned long)&ax88772b_info
,
1498 // ASIX AX88772B 10/100
1499 USB_DEVICE (0x0b95, 0x772b),
1500 .driver_info
= (unsigned long) &ax88772b_info
,
1502 // ASIX AX88772 10/100
1503 USB_DEVICE (0x0b95, 0x7720),
1504 .driver_info
= (unsigned long) &ax88772_info
,
1506 // ASIX AX88178 10/100/1000
1507 USB_DEVICE (0x0b95, 0x1780),
1508 .driver_info
= (unsigned long) &ax88178_info
,
1510 // Logitec LAN-GTJ/U2A
1511 USB_DEVICE (0x0789, 0x0160),
1512 .driver_info
= (unsigned long) &ax88178_info
,
1514 // Linksys USB200M Rev 2
1515 USB_DEVICE (0x13b1, 0x0018),
1516 .driver_info
= (unsigned long) &ax88772_info
,
1518 // 0Q0 cable ethernet
1519 USB_DEVICE (0x1557, 0x7720),
1520 .driver_info
= (unsigned long) &ax88772_info
,
1522 // DLink DUB-E100 H/W Ver B1
1523 USB_DEVICE (0x07d1, 0x3c05),
1524 .driver_info
= (unsigned long) &ax88772_info
,
1526 // DLink DUB-E100 H/W Ver B1 Alternate
1527 USB_DEVICE (0x2001, 0x3c05),
1528 .driver_info
= (unsigned long) &ax88772_info
,
1530 // DLink DUB-E100 H/W Ver C1
1531 USB_DEVICE (0x2001, 0x1a02),
1532 .driver_info
= (unsigned long) &ax88772_info
,
1535 USB_DEVICE (0x1737, 0x0039),
1536 .driver_info
= (unsigned long) &ax88178_info
,
1539 USB_DEVICE (0x04bb, 0x0930),
1540 .driver_info
= (unsigned long) &ax88178_info
,
1543 USB_DEVICE(0x050d, 0x5055),
1544 .driver_info
= (unsigned long) &ax88178_info
,
1546 // Apple USB Ethernet Adapter
1547 USB_DEVICE(0x05ac, 0x1402),
1548 .driver_info
= (unsigned long) &ax88772_info
,
1550 // Cables-to-Go USB Ethernet Adapter
1551 USB_DEVICE(0x0b95, 0x772a),
1552 .driver_info
= (unsigned long) &ax88772_info
,
1555 USB_DEVICE(0x14ea, 0xab11),
1556 .driver_info
= (unsigned long) &ax88178_info
,
1559 USB_DEVICE(0x0db0, 0xa877),
1560 .driver_info
= (unsigned long) &ax88772_info
,
1562 // Asus USB Ethernet Adapter
1563 USB_DEVICE (0x0b95, 0x7e2b),
1564 .driver_info
= (unsigned long)&ax88772b_info
,
1566 /* ASIX 88172a demo board */
1567 USB_DEVICE(0x0b95, 0x172a),
1568 .driver_info
= (unsigned long) &ax88172a_info
,
1571 * USBLINK HG20F9 "USB 2.0 LAN"
1572 * Appears to have gazumped Linksys's manufacturer ID but
1573 * doesn't (yet) conflict with any known Linksys product.
1575 USB_DEVICE(0x066b, 0x20f9),
1576 .driver_info
= (unsigned long) &hg20f9_info
,
1578 // Linux Automation GmbH USB 10Base-T1L
1579 USB_DEVICE(0x33f7, 0x0004),
1580 .driver_info
= (unsigned long) &lxausb_t1l_info
,
1584 MODULE_DEVICE_TABLE(usb
, products
);
1586 static struct usb_driver asix_driver
= {
1587 .name
= DRIVER_NAME
,
1588 .id_table
= products
,
1589 .probe
= usbnet_probe
,
1590 .suspend
= asix_suspend
,
1591 .resume
= asix_resume
,
1592 .reset_resume
= asix_resume
,
1593 .disconnect
= usbnet_disconnect
,
1594 .supports_autosuspend
= 1,
1595 .disable_hub_initiated_lpm
= 1,
1598 module_usb_driver(asix_driver
);
1600 MODULE_AUTHOR("David Hollis");
1601 MODULE_VERSION(DRIVER_VERSION
);
1602 MODULE_DESCRIPTION("ASIX AX8817X based USB 2.0 Ethernet Devices");
1603 MODULE_LICENSE("GPL");