|
@@ -310,55 +310,60 @@ static int mii_nway_restart(struct ueth_data *dev)
|
|
|
return r;
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
- * Asix callbacks
|
|
|
- */
|
|
|
-static int asix_init(struct eth_device *eth, bd_t *bd)
|
|
|
+static int asix_basic_reset(struct ueth_data *dev)
|
|
|
{
|
|
|
int embd_phy;
|
|
|
- ALLOC_CACHE_ALIGN_BUFFER(unsigned char, buf, ETH_ALEN);
|
|
|
u16 rx_ctl;
|
|
|
- struct ueth_data *dev = (struct ueth_data *)eth->priv;
|
|
|
- int timeout = 0;
|
|
|
-#define TIMEOUT_RESOLUTION 50 /* ms */
|
|
|
- int link_detected;
|
|
|
-
|
|
|
- debug("** %s()\n", __func__);
|
|
|
|
|
|
if (asix_write_gpio(dev,
|
|
|
AX_GPIO_RSE | AX_GPIO_GPO_2 | AX_GPIO_GPO2EN, 5) < 0)
|
|
|
- goto out_err;
|
|
|
+ return -1;
|
|
|
|
|
|
/* 0x10 is the phy id of the embedded 10/100 ethernet phy */
|
|
|
embd_phy = ((asix_get_phy_addr(dev) & 0x1f) == 0x10 ? 1 : 0);
|
|
|
if (asix_write_cmd(dev, AX_CMD_SW_PHY_SELECT,
|
|
|
embd_phy, 0, 0, NULL) < 0) {
|
|
|
debug("Select PHY #1 failed\n");
|
|
|
- goto out_err;
|
|
|
+ return -1;
|
|
|
}
|
|
|
|
|
|
if (asix_sw_reset(dev, AX_SWRESET_IPPD | AX_SWRESET_PRL) < 0)
|
|
|
- goto out_err;
|
|
|
+ return -1;
|
|
|
|
|
|
if (asix_sw_reset(dev, AX_SWRESET_CLEAR) < 0)
|
|
|
- goto out_err;
|
|
|
+ return -1;
|
|
|
|
|
|
if (embd_phy) {
|
|
|
if (asix_sw_reset(dev, AX_SWRESET_IPRL) < 0)
|
|
|
- goto out_err;
|
|
|
+ return -1;
|
|
|
} else {
|
|
|
if (asix_sw_reset(dev, AX_SWRESET_PRTE) < 0)
|
|
|
- goto out_err;
|
|
|
+ return -1;
|
|
|
}
|
|
|
|
|
|
rx_ctl = asix_read_rx_ctl(dev);
|
|
|
debug("RX_CTL is 0x%04x after software reset\n", rx_ctl);
|
|
|
if (asix_write_rx_ctl(dev, 0x0000) < 0)
|
|
|
- goto out_err;
|
|
|
+ return -1;
|
|
|
|
|
|
rx_ctl = asix_read_rx_ctl(dev);
|
|
|
debug("RX_CTL is 0x%04x setting to 0x0000\n", rx_ctl);
|
|
|
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * Asix callbacks
|
|
|
+ */
|
|
|
+static int asix_init(struct eth_device *eth, bd_t *bd)
|
|
|
+{
|
|
|
+ struct ueth_data *dev = (struct ueth_data *)eth->priv;
|
|
|
+ int timeout = 0;
|
|
|
+#define TIMEOUT_RESOLUTION 50 /* ms */
|
|
|
+ int link_detected;
|
|
|
+
|
|
|
+ debug("** %s()\n", __func__);
|
|
|
+
|
|
|
/* Get the MAC address */
|
|
|
if (asix_read_cmd(dev, AX_CMD_READ_NODE_ID,
|
|
|
0, 0, ETH_ALEN, buf) < 0) {
|
|
@@ -635,5 +640,8 @@ int asix_eth_get_info(struct usb_device *dev, struct ueth_data *ss,
|
|
|
eth->halt = asix_halt;
|
|
|
eth->priv = ss;
|
|
|
|
|
|
+ if (asix_basic_reset(ss))
|
|
|
+ return 0;
|
|
|
+
|
|
|
return 1;
|
|
|
}
|