net: pcnet: fix I/O primitives for memory access
[oweals/u-boot.git] / cmd / mdio.c
index efe8c9ef09540d91b628cefb5bec7316e55a8372..22c8fbe856f37f482eb87f823f7baa03db22aaff 100644 (file)
@@ -54,7 +54,10 @@ static int mdio_write_ranges(struct mii_dev *bus,
 
                for (devad = devadlo; devad <= devadhi; devad++) {
                        for (reg = reglo; reg <= reghi; reg++) {
-                               if (!extended)
+                               if (!phydev)
+                                       err = bus->write(bus, addr, devad,
+                                                        reg, data);
+                               else if (!extended)
                                        err = phy_write_mmd(phydev, devad,
                                                            reg, data);
                                else
@@ -88,7 +91,9 @@ static int mdio_read_ranges(struct mii_dev *bus,
                        for (reg = reglo; reg <= reghi; reg++) {
                                int val;
 
-                               if (!extended)
+                               if (!phydev)
+                                       val = bus->read(bus, addr, devad, reg);
+                               else if (!extended)
                                        val = phy_read_mmd(phydev, devad, reg);
                                else
                                        val = phydev->drv->readext(phydev, addr,
@@ -198,6 +203,11 @@ static int do_mdio(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        if (argc < 2)
                return CMD_RET_USAGE;
 
+#ifdef CONFIG_DM_MDIO
+       /* probe DM MII device before any operation so they are all accesible */
+       dm_mdio_probe_devices();
+#endif
+
        /*
         * We use the last specified parameters, unless new ones are
         * entered.
@@ -243,12 +253,13 @@ static int do_mdio(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        case 'w':
                if (pos > 1)
                        data = simple_strtoul(argv[pos--], NULL, 16);
+               /* Intentional fall-through - Get reg for read and write */
        case 'r':
                if (pos > 1)
                        if (extract_reg_range(argv[pos--], &devadlo, &devadhi,
                                              &reglo, &reghi))
                                return CMD_RET_FAILURE;
-
+               /* Intentional fall-through - Get phy for all commands */
        default:
                if (pos > 1)
                        if (extract_phy_range(&argv[2], pos - 1, &bus,
@@ -258,6 +269,11 @@ static int do_mdio(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                break;
        }
 
+       if (!bus) {
+               puts("No MDIO bus found\n");
+               return CMD_RET_FAILURE;
+       }
+
        if (op[0] == 'l') {
                mdio_list_devices();