summaryrefslogtreecommitdiff
path: root/drivers/net/eepro100.c
diff options
context:
space:
mode:
authorMarek Vasut <marek.vasut+renesas@gmail.com>2020-05-23 16:20:25 +0200
committerMarek Vasut <marek.vasut+renesas@gmail.com>2020-06-18 19:34:40 +0200
commit66fed7300d250197c24fb54cad7f6cae7df95fe1 (patch)
treec63d19ee39af6511c057340e3cc0d58d0a53b880 /drivers/net/eepro100.c
parent6c7d3f6b3fb5860f55d1c7733d2b5929e0721e99 (diff)
net: eepro100: Factor out MII registration
Pull the MII registration code into a separate function. Moreover, properly free memory in case any of the registration or allocation functions fail, so this fixes an existing memleak. Signed-off-by: Marek Vasut <marek.vasut+renesas@gmail.com>
Diffstat (limited to 'drivers/net/eepro100.c')
-rw-r--r--drivers/net/eepro100.c56
1 files changed, 39 insertions, 17 deletions
diff --git a/drivers/net/eepro100.c b/drivers/net/eepro100.c
index 8fa665743a..861d39cf9f 100644
--- a/drivers/net/eepro100.c
+++ b/drivers/net/eepro100.c
@@ -464,6 +464,36 @@ static int read_eeprom(struct eth_device *dev, int location, int addr_len)
return retval;
}
+#if defined(CONFIG_MII) || defined(CONFIG_CMD_MII)
+static int eepro100_initialize_mii(struct eth_device *dev)
+{
+ /* register mii command access routines */
+ struct mii_dev *mdiodev;
+ int ret;
+
+ mdiodev = mdio_alloc();
+ if (!mdiodev)
+ return -ENOMEM;
+
+ strncpy(mdiodev->name, dev->name, MDIO_NAME_LEN);
+ mdiodev->read = eepro100_miiphy_read;
+ mdiodev->write = eepro100_miiphy_write;
+
+ ret = mdio_register(mdiodev);
+ if (ret < 0) {
+ mdio_free(mdiodev);
+ return ret;
+ }
+
+ return 0;
+}
+#else
+static int eepro100_initialize_mii(struct eth_device *dev)
+{
+ return 0;
+}
+#endif
+
static struct pci_device_id supported[] = {
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82557) },
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82559) },
@@ -713,11 +743,12 @@ done:
int eepro100_initialize(bd_t *bis)
{
- pci_dev_t devno;
- int card_number = 0;
struct eth_device *dev;
+ int card_number = 0;
u32 iobase, status;
+ pci_dev_t devno;
int idx = 0;
+ int ret;
while (1) {
/* Find PCI device */
@@ -762,21 +793,12 @@ int eepro100_initialize(bd_t *bis)
eth_register(dev);
-#if defined(CONFIG_MII) || defined(CONFIG_CMD_MII)
- /* register mii command access routines */
- int retval;
- struct mii_dev *mdiodev = mdio_alloc();
-
- if (!mdiodev)
- return -ENOMEM;
- strncpy(mdiodev->name, dev->name, MDIO_NAME_LEN);
- mdiodev->read = eepro100_miiphy_read;
- mdiodev->write = eepro100_miiphy_write;
-
- retval = mdio_register(mdiodev);
- if (retval < 0)
- return retval;
-#endif
+ ret = eepro100_initialize_mii(dev);
+ if (ret) {
+ eth_unregister(dev);
+ free(dev);
+ return ret;
+ }
card_number++;