u16 id;
int i;
+ priv->chip = UNKNOWN;
+
val = ar8216_mii_read(priv, AR8216_REG_CTRL);
if (val == ~0)
- return UNKNOWN;
+ return -ENODEV;
id = val & (AR8216_CTRL_REVISION | AR8216_CTRL_VERSION);
for (i = 0; i < AR8X16_PROBE_RETRIES; i++) {
val = ar8216_mii_read(priv, AR8216_REG_CTRL);
if (val == ~0)
- return UNKNOWN;
+ return -ENODEV;
t = val & (AR8216_CTRL_REVISION | AR8216_CTRL_VERSION);
if (t != id)
- return UNKNOWN;
+ return -ENODEV;
}
switch (id) {
case 0x0101:
- return AR8216;
+ priv->chip = AR8216;
+ break;
case 0x0301:
- return AR8236;
+ priv->chip = AR8236;
+ break;
case 0x1000:
case 0x1001:
- return AR8316;
+ priv->chip = AR8316;
+ break;
default:
printk(KERN_DEBUG
"ar8216: Unknown Atheros device [ver=%d, rev=%d, phy_id=%04x%04x]\n",
mdiobus_read(priv->phy->bus, priv->phy->addr, 2),
mdiobus_read(priv->phy->bus, priv->phy->addr, 3));
- return UNKNOWN;
+ return -ENODEV;
}
+
+ return 0;
}
static void
}
static int
+ar8216_hw_init(struct ar8216_priv *priv)
+{
+ /* XXX: undocumented magic from atheros, required! */
+ priv->write(priv, 0x38, 0xc000050e);
+
+ ar8216_rmw(priv, AR8216_REG_GLOBAL_CTRL,
+ AR8216_GCTRL_MTU, 1518 + 8 + 2);
+ return 0;
+}
+
+static int
ar8236_hw_init(struct ar8216_priv *priv) {
static int initialized;
int i;
}
msleep(1000);
+ /* enable jumbo frames */
+ ar8216_rmw(priv, AR8216_REG_GLOBAL_CTRL,
+ AR8316_GCTRL_MTU, 9018 + 8 + 2);
+
initialized = true;
return 0;
}
msleep(1000);
}
+ /* enable jumbo frames */
+ ar8216_rmw(priv, AR8216_REG_GLOBAL_CTRL,
+ AR8316_GCTRL_MTU, 9018 + 8 + 2);
+
+ /* enable cpu port to receive multicast and broadcast frames */
+ priv->write(priv, AR8216_REG_FLOOD_MASK, 0x003f003f);
+
out:
priv->initialized = true;
return 0;
for (i = 0; i < AR8216_NUM_PORTS; i++)
ar8216_init_port(priv, i);
- /* XXX: undocumented magic from atheros, required! */
- priv->write(priv, 0x38, 0xc000050e);
-
- if (priv->chip == AR8216) {
- ar8216_rmw(priv, AR8216_REG_GLOBAL_CTRL,
- AR8216_GCTRL_MTU, 1518 + 8 + 2);
- } else if (priv->chip == AR8316 ||
- priv->chip == AR8236) {
- /* enable jumbo frames */
- ar8216_rmw(priv, AR8216_REG_GLOBAL_CTRL,
- AR8316_GCTRL_MTU, 9018 + 8 + 2);
- }
-
- if (priv->chip == AR8316) {
- /* enable cpu port to receive multicast and broadcast frames */
- priv->write(priv, AR8216_REG_FLOOD_MASK, 0x003f003f);
- }
mutex_unlock(&priv->reg_mutex);
return ar8216_hw_apply(dev);
}
priv->phy = pdev;
- priv->chip = ar8216_id_chip(priv);
+ ret = ar8216_id_chip(priv);
+ if (ret)
+ goto err_free_priv;
if (pdev->addr != 0) {
if (priv->chip == AR8316) {
swdev->vlans = AR8216_NUM_VLANS;
}
- if ((ret = register_switch(&priv->dev, pdev->attached_dev)) < 0) {
- kfree(priv);
- goto done;
- }
+ ret = register_switch(&priv->dev, pdev->attached_dev);
+ if (ret)
+ goto err_free_priv;
priv->init = true;
- if (priv->chip == AR8316) {
+ ret = 0;
+ if (priv->chip == AR8216)
+ ret = ar8216_hw_init(priv);
+ else if (priv->chip == AR8236)
+ ret = ar8236_hw_init(priv);
+ else if (priv->chip == AR8316)
ret = ar8316_hw_init(priv);
- if (ret) {
- kfree(priv);
- goto done;
- }
- }
- if (priv->chip == AR8236) {
- ret = ar8236_hw_init(priv);
- if (ret) {
- kfree(priv);
- goto done;
- }
- }
+ if (ret)
+ goto err_free_priv;
ret = ar8216_reset_switch(&priv->dev);
- if (ret) {
- kfree(priv);
- goto done;
- }
+ if (ret)
+ goto err_free_priv;
dev->phy_ptr = priv;
priv->init = false;
-done:
+ return 0;
+
+err_free_priv:
+ kfree(priv);
return ret;
}
ar8216_probe(struct phy_device *pdev)
{
struct ar8216_priv priv;
- u16 chip;
priv.phy = pdev;
- chip = ar8216_id_chip(&priv);
- if (chip == UNKNOWN)
- return -ENODEV;
-
- return 0;
+ return ar8216_id_chip(&priv);
}
static void