Skip to content

Commit

Permalink
USB: asix: Detect internal PHY and enable/use accordingly
Browse files Browse the repository at this point in the history
Different AX88772 dongles use different PHYs; the chip is capable of using
both a primary and secondary PHY, and supports an internal and external PHY.

It appears that some DUB-E100 devices use the internal PHY, so trying to use
an external one will not work (note that this is different across revisions,
as well; the "A" and "B" revs of the DUB-E100 use different PHYs!).  The data
sheet for the AX88772 chip specifies that the internal PHY id will be 0x10,
so if that's read from the EEPROM, we should use that rather than attempting
to use an external PHY.

Thanks to Mitch Bradley for pointing this out!

Signed-off-by: Andres Salomon <dilinger@debian.org>
Cc: David Hollis <dhollis@davehollis.com>
Cc: Chris Ball <cjb@laptop.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
  • Loading branch information
Andres Salomon authored and Greg Kroah-Hartman committed Jan 22, 2007
1 parent c9d8c2b commit d0ffff8
Showing 1 changed file with 13 additions and 5 deletions.
18 changes: 13 additions & 5 deletions drivers/usb/net/asix.c
Original file line number Diff line number Diff line change
Expand Up @@ -898,7 +898,7 @@ static int ax88772_link_reset(struct usbnet *dev)

static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf)
{
int ret;
int ret, embd_phy;
void *buf;
u16 rx_ctl;
struct asix_data *data = (struct asix_data *)&dev->data;
Expand All @@ -919,22 +919,30 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf)
AX_GPIO_RSE | AX_GPIO_GPO_2 | AX_GPIO_GPO2EN, 5)) < 0)
goto out2;

/* 0x10 is the phy id of the embedded 10/100 ethernet phy */
embd_phy = ((asix_get_phy_addr(dev) & 0x1f) == 0x10 ? 1 : 0);
if ((ret = asix_write_cmd(dev, AX_CMD_SW_PHY_SELECT,
1, 0, 0, buf)) < 0) {
embd_phy, 0, 0, buf)) < 0) {
dbg("Select PHY #1 failed: %d", ret);
goto out2;
}

if ((ret = asix_sw_reset(dev, AX_SWRESET_IPPD)) < 0)
if ((ret = asix_sw_reset(dev, AX_SWRESET_IPPD | AX_SWRESET_PRL)) < 0)
goto out2;

msleep(150);
if ((ret = asix_sw_reset(dev, AX_SWRESET_CLEAR)) < 0)
goto out2;

msleep(150);
if ((ret = asix_sw_reset(dev, AX_SWRESET_IPRL | AX_SWRESET_PRL)) < 0)
goto out2;
if (embd_phy) {
if ((ret = asix_sw_reset(dev, AX_SWRESET_IPRL)) < 0)
goto out2;
}
else {
if ((ret = asix_sw_reset(dev, AX_SWRESET_PRTE)) < 0)
goto out2;
}

msleep(150);
rx_ctl = asix_read_rx_ctl(dev);
Expand Down

0 comments on commit d0ffff8

Please sign in to comment.