if (!priv->mib_stats)
return -ENOMEM;
- mutex_init(&priv->mib_lock);
- INIT_DELAYED_WORK(&priv->mib_work, ar8xxx_mib_work_func);
-
return 0;
}
}
static void
-ar8xxx_mib_cleanup(struct ar8216_priv *priv)
+ar8xxx_mib_stop(struct ar8216_priv *priv)
{
if (!ar8xxx_has_mib_counters(priv))
return;
cancel_delayed_work(&priv->mib_work);
+}
+
+static struct ar8216_priv *
+ar8xxx_create(void)
+{
+ struct ar8216_priv *priv;
+
+ priv = kzalloc(sizeof(struct ar8216_priv), GFP_KERNEL);
+ if (priv == NULL)
+ return NULL;
+
+ mutex_init(&priv->reg_mutex);
+ mutex_init(&priv->mib_lock);
+ INIT_DELAYED_WORK(&priv->mib_work, ar8xxx_mib_work_func);
+
+ return priv;
+}
+
+static void
+ar8xxx_free(struct ar8216_priv *priv)
+{
kfree(priv->mib_stats);
+ kfree(priv);
+}
+
+static struct ar8216_priv *
+ar8xxx_create_mii(struct mii_bus *bus)
+{
+ struct ar8216_priv *priv;
+
+ priv = ar8xxx_create();
+ if (priv) {
+ priv->mii_bus = bus;
+ priv->read = ar8216_mii_read;
+ priv->write = ar8216_mii_write;
+ }
+
+ return priv;
+}
+
+static int
+ar8xxx_probe_switch(struct ar8216_priv *priv)
+{
+ struct switch_dev *swdev;
+ int ret;
+
+ ret = ar8216_id_chip(priv);
+ if (ret)
+ return ret;
+
+ swdev = &priv->dev;
+ swdev->cpu_port = AR8216_PORT_CPU;
+ swdev->ops = &ar8216_sw_ops;
+
+ if (chip_is_ar8316(priv)) {
+ swdev->name = "Atheros AR8316";
+ swdev->vlans = AR8X16_MAX_VLANS;
+ swdev->ports = AR8216_NUM_PORTS;
+ } else if (chip_is_ar8236(priv)) {
+ swdev->name = "Atheros AR8236";
+ swdev->vlans = AR8216_NUM_VLANS;
+ swdev->ports = AR8216_NUM_PORTS;
+ } else if (chip_is_ar8327(priv)) {
+ swdev->name = "Atheros AR8327";
+ swdev->vlans = AR8X16_MAX_VLANS;
+ swdev->ports = AR8327_NUM_PORTS;
+ } else {
+ swdev->name = "Atheros AR8216";
+ swdev->vlans = AR8216_NUM_VLANS;
+ swdev->ports = AR8216_NUM_PORTS;
+ }
+
+ ret = ar8xxx_mib_init(priv);
+ if (ret)
+ return ret;
+
+ return 0;
}
static int
int ret;
if (!priv) {
- priv = kzalloc(sizeof(struct ar8216_priv), GFP_KERNEL);
+ priv = ar8xxx_create_mii(pdev->bus);
if (priv == NULL)
return -ENOMEM;
- priv->mii_bus = pdev->bus;
- priv->read = ar8216_mii_read;
- priv->write = ar8216_mii_write;
-
- ret = ar8216_id_chip(priv);
+ ret = ar8xxx_probe_switch(priv);
if (ret)
goto err_free_priv;
}
/* check if we're attaching to the switch twice */
pdev = pdev->bus->phy_map[0];
if (!pdev) {
- kfree(priv);
+ ar8xxx_free(priv);
return 0;
}
/* switch device has not been initialized, reuse priv */
if (!pdev->priv) {
priv->port4_phy = true;
+ priv->dev.ports = (AR8216_NUM_PORTS - 1);
pdev->priv = priv;
return 0;
}
- kfree(priv);
+ ar8xxx_free(priv);
/* switch device has been initialized, reinit */
priv = pdev->priv;
return 0;
}
- kfree(priv);
+ ar8xxx_free(priv);
return 0;
}
- mutex_init(&priv->reg_mutex);
-
pdev->priv = priv;
swdev = &priv->dev;
- swdev->cpu_port = AR8216_PORT_CPU;
- swdev->ops = &ar8216_sw_ops;
- swdev->ports = AR8216_NUM_PORTS;
-
- if (chip_is_ar8316(priv)) {
- swdev->name = "Atheros AR8316";
- swdev->vlans = AR8X16_MAX_VLANS;
-
- if (priv->port4_phy) {
- /* port 5 connected to the other mac, therefore unusable */
- swdev->ports = (AR8216_NUM_PORTS - 1);
- }
- } else if (chip_is_ar8236(priv)) {
- swdev->name = "Atheros AR8236";
- swdev->vlans = AR8216_NUM_VLANS;
- swdev->ports = AR8216_NUM_PORTS;
- } else if (chip_is_ar8327(priv)) {
- swdev->name = "Atheros AR8327";
- swdev->vlans = AR8X16_MAX_VLANS;
- swdev->ports = AR8327_NUM_PORTS;
- } else {
- swdev->name = "Atheros AR8216";
- swdev->vlans = AR8216_NUM_VLANS;
- }
-
- ret = ar8xxx_mib_init(priv);
- if (ret)
- goto err_free_priv;
-
ret = register_switch(swdev, pdev->attached_dev);
if (ret)
- goto err_cleanup_mib;
+ goto err_free_priv;
printk(KERN_INFO "%s: %s switch driver attached.\n",
pdev->attached_dev->name, swdev->name);
err_unregister_switch:
unregister_switch(&priv->dev);
-err_cleanup_mib:
- ar8xxx_mib_cleanup(priv);
err_free_priv:
- kfree(priv);
+ ar8xxx_free(priv);
pdev->priv = NULL;
return ret;
}
if (!ar8xxx_is_possible(pdev->bus))
return -ENODEV;
- priv = kzalloc(sizeof(struct ar8216_priv), GFP_KERNEL);
+ priv = ar8xxx_create_mii(pdev->bus);
if (priv == NULL)
return -ENOMEM;
- priv->mii_bus = pdev->bus;
- priv->read = ar8216_mii_read;
- priv->write = ar8216_mii_write;
priv->phy = pdev;
- ret = ar8216_id_chip(priv);
- kfree(priv);
+ ret = ar8xxx_probe_switch(priv);
+ ar8xxx_free(priv);
return ret;
}
if (pdev->addr == 0)
unregister_switch(&priv->dev);
- ar8xxx_mib_cleanup(priv);
- kfree(priv);
+ ar8xxx_mib_stop(priv);
+ ar8xxx_free(priv);
}
static struct phy_driver ar8216_driver = {