/* ---------------------------------------------------------------- */ static int do_mdio(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { char op[2]; int addrlo, addrhi, reglo, reghi, devadlo, devadhi; unsigned short data; int pos = argc - 1; struct mii_dev *bus; struct phy_device *phydev = NULL; int extended = 0; if (argc < 2) return CMD_RET_USAGE; /* * We use the last specified parameters, unless new ones are * entered. */ op[0] = argv[1][0]; addrlo = last_addr_lo; addrhi = last_addr_hi; devadlo = last_devad_lo; devadhi = last_devad_hi; reglo = last_reg_lo; reghi = last_reg_hi; data = last_data; bus = mdio_get_current_dev(); if (flag & CMD_FLAG_REPEAT) op[0] = last_op[0]; if (strlen(argv[1]) > 1) { op[1] = argv[1][1]; if (op[1] == 'x') { phydev = mdio_phydev_for_ethname(argv[2]); if (phydev) { addrlo = phydev->addr; addrhi = addrlo; bus = phydev->bus; extended = 1; } else { return CMD_RET_FAILURE; } if (!phydev->drv || (!phydev->drv->writeext && (op[0] == 'w')) || (!phydev->drv->readext && (op[0] == 'r'))) { puts("PHY does not have extended functions\n"); return CMD_RET_FAILURE; } } } switch (op[0]) { case 'w': if (pos > 1) data = simple_strtoul(argv[pos--], NULL, 16); case 'r': if (pos > 1) if (extract_reg_range(argv[pos--], &devadlo, &devadhi, ®lo, ®hi)) return CMD_RET_FAILURE; default: if (pos > 1) if (extract_phy_range(&argv[2], pos - 1, &bus, &phydev, &addrlo, &addrhi)) return CMD_RET_FAILURE; break; } if (op[0] == 'l') { mdio_list_devices(); return 0; } /* Save the chosen bus */ miiphy_set_current_dev(bus->name); switch (op[0]) { case 'w': mdio_write_ranges(bus, addrlo, addrhi, devadlo, devadhi, reglo, reghi, data, extended); break; case 'r': mdio_read_ranges(bus, addrlo, addrhi, devadlo, devadhi, reglo, reghi, extended); break; } /* * Save the parameters for repeats. */ last_op[0] = op[0]; last_addr_lo = addrlo; last_addr_hi = addrhi; last_devad_lo = devadlo; last_devad_hi = devadhi; last_reg_lo = reglo; last_reg_hi = reghi; last_data = data; return 0; }
static void sgmii_configure_repeater(int serdes_port) { struct mii_dev *bus; uint8_t a = 0xf; int i, j, ret; int dpmac_id = 0, dpmac, mii_bus = 0; unsigned short value; char dev[2][20] = {"LS2080A_QDS_MDIO0", "LS2080A_QDS_MDIO3"}; uint8_t i2c_addr[] = {0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5f, 0x60}; uint8_t ch_a_eq[] = {0x1, 0x2, 0x3, 0x7}; uint8_t ch_a_ctl2[] = {0x81, 0x82, 0x83, 0x84}; uint8_t ch_b_eq[] = {0x1, 0x2, 0x3, 0x7}; uint8_t ch_b_ctl2[] = {0x81, 0x82, 0x83, 0x84}; int *riser_phy_addr = &xqsgii_riser_phy_addr[0]; /* Set I2c to Slot 1 */ i2c_write(0x77, 0, 0, &a, 1); for (dpmac = 0; dpmac < 8; dpmac++) { /* Check the PHY status */ switch (serdes_port) { case 1: mii_bus = 0; dpmac_id = dpmac + 1; break; case 2: mii_bus = 1; dpmac_id = dpmac + 9; a = 0xb; i2c_write(0x76, 0, 0, &a, 1); break; } ret = miiphy_set_current_dev(dev[mii_bus]); if (ret > 0) goto error; bus = mdio_get_current_dev(); debug("Reading from bus %s\n", bus->name); ret = miiphy_write(dev[mii_bus], riser_phy_addr[dpmac], 0x1f, 3); if (ret > 0) goto error; mdelay(10); ret = miiphy_read(dev[mii_bus], riser_phy_addr[dpmac], 0x11, &value); if (ret > 0) goto error; mdelay(10); if ((value & 0xfff) == 0x40f) { printf("DPMAC %d:PHY is ..... Configured\n", dpmac_id); continue; } for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { a = 0x18; i2c_write(i2c_addr[dpmac], 6, 1, &a, 1); a = 0x38; i2c_write(i2c_addr[dpmac], 4, 1, &a, 1); a = 0x4; i2c_write(i2c_addr[dpmac], 8, 1, &a, 1); i2c_write(i2c_addr[dpmac], 0xf, 1, &ch_a_eq[i], 1); i2c_write(i2c_addr[dpmac], 0x11, 1, &ch_a_ctl2[j], 1); i2c_write(i2c_addr[dpmac], 0x16, 1, &ch_b_eq[i], 1); i2c_write(i2c_addr[dpmac], 0x18, 1, &ch_b_ctl2[j], 1); a = 0x14; i2c_write(i2c_addr[dpmac], 0x23, 1, &a, 1); a = 0xb5; i2c_write(i2c_addr[dpmac], 0x2d, 1, &a, 1); a = 0x20; i2c_write(i2c_addr[dpmac], 4, 1, &a, 1); mdelay(100); ret = miiphy_read(dev[mii_bus], riser_phy_addr[dpmac], 0x11, &value); if (ret > 0) goto error; mdelay(1); ret = miiphy_read(dev[mii_bus], riser_phy_addr[dpmac], 0x11, &value); if (ret > 0) goto error; mdelay(10); if ((value & 0xfff) == 0x40f) { printf("DPMAC %d :PHY is configured ", dpmac_id); printf("after setting repeater 0x%x\n", value); i = 5; j = 5; } else printf("DPMAC %d :PHY is failed to ", dpmac_id); printf("configure the repeater 0x%x\n", value); } } } error: if (ret) printf("DPMAC %d ..... FAILED to configure PHY\n", dpmac_id); return; }