/* Configure and enable MV88E1118 PHY on the piggy*/ void reset_phy(void) { unsigned int oui; unsigned char model, rev; char *name = "egiga0"; if (miiphy_set_current_dev(name)) return; /* reset the phy */ miiphy_reset(name, CONFIG_PHY_BASE_ADR); /* get PHY model */ if (miiphy_info(name, CONFIG_PHY_BASE_ADR, &oui, &model, &rev)) return; /* check for Marvell 88E1118R Gigabit PHY (PIGGY3) */ if ((oui == PHY_MARVELL_OUI) && (model == PHY_MARVELL_88E1118R_MODEL)) { /* set page register to 3 */ if (miiphy_write(name, CONFIG_PHY_BASE_ADR, PHY_MARVELL_PAGE_REG, PHY_MARVELL_88E1118R_LED_CTRL_PAGE)) printf("Error writing PHY page reg\n"); /* * leds setup as printed on PCB: * LED2 (Link): 0x0 (On Link, Off No Link) * LED1 (Activity): 0x3 (On Activity, Off No Activity) * LED0 (Speed): 0x7 (On 1000 MBits, Off Else) */ if (miiphy_write(name, CONFIG_PHY_BASE_ADR, PHY_MARVELL_88E1118R_LED_CTRL_REG, PHY_MARVELL_88E1118R_LED_CTRL_RESERVED | PHY_MARVELL_88E1118R_LED_CTRL_LED0_1000MB | PHY_MARVELL_88E1118R_LED_CTRL_LED1_ACT | PHY_MARVELL_88E1118R_LED_CTRL_LED2_LINK)) printf("Error writing PHY LED reg\n"); /* set page register back to 0 */ if (miiphy_write(name, CONFIG_PHY_BASE_ADR, PHY_MARVELL_PAGE_REG, PHY_MARVELL_DEFAULT_PAGE)) printf("Error writing PHY page reg\n"); } }
/* * MII device/info/read/write * * Syntax: * mii device {devname} * mii info {addr} * mii read {addr} {reg} * mii write {addr} {reg} {data} */ int do_mii (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) { char op; unsigned char addr, reg; unsigned short data; int rcode = 0; char *devname; if (argc < 2) { printf ("Usage:\n%s\n", cmdtp->usage); return 1; } #if defined(CONFIG_8xx) || defined(CONFIG_MCF52x2) mii_init (); #endif /* * We use the last specified parameters, unless new ones are * entered. */ op = last_op; addr = last_addr; data = last_data; reg = last_reg; if ((flag & CMD_FLAG_REPEAT) == 0) { op = argv[1][0]; if (argc >= 3) addr = simple_strtoul (argv[2], NULL, 16); if (argc >= 4) reg = simple_strtoul (argv[3], NULL, 16); if (argc >= 5) data = simple_strtoul (argv[4], NULL, 16); } /* use current device */ devname = miiphy_get_current_dev(); /* * check device/read/write/list. */ if (op == 'i') { unsigned char j, start, end; unsigned int oui; unsigned char model; unsigned char rev; /* * Look for any and all PHYs. Valid addresses are 0..31. */ if (argc >= 3) { start = addr; end = addr + 1; } else { start = 0; end = 31; } for (j = start; j < end; j++) { if (miiphy_info (devname, j, &oui, &model, &rev) == 0) { printf ("PHY 0x%02X: " "OUI = 0x%04X, " "Model = 0x%02X, " "Rev = 0x%02X, " "%3dbase%s, %s\n", j, oui, model, rev, miiphy_speed (devname, j), miiphy_is_1000base_x (devname, j) ? "X" : "T", (miiphy_duplex (devname, j) == FULL) ? "FDX" : "HDX"); } } } else if (op == 'r') { if (miiphy_read (devname, addr, reg, &data) != 0) { puts ("Error reading from the PHY\n"); rcode = 1; } else { printf ("%04X\n", data & 0x0000FFFF); } } else if (op == 'w') { if (miiphy_write (devname, addr, reg, data) != 0) { puts ("Error writing to the PHY\n"); rcode = 1; } } else if (op == 'd') { if (argc == 2) miiphy_listdev (); else miiphy_set_current_dev (argv[2]); } else { printf ("Usage:\n%s\n", cmdtp->usage); return 1; } /* * Save the parameters for repeats. */ last_op = op; last_addr = addr; last_data = data; last_reg = reg; return rcode; }