static char *mv88e6123_61_65_probe(struct device *host_dev, int sw_addr) { struct mii_bus *bus = dsa_host_dev_to_mii_bus(host_dev); int ret; if (bus == NULL) return NULL; ret = __mv88e6xxx_reg_read(bus, sw_addr, REG_PORT(0), PORT_SWITCH_ID); if (ret >= 0) { if (ret == PORT_SWITCH_ID_6123_A1) return "Marvell 88E6123 (A1)"; if (ret == PORT_SWITCH_ID_6123_A2) return "Marvell 88E6123 (A2)"; if ((ret & 0xfff0) == PORT_SWITCH_ID_6123) return "Marvell 88E6123"; if (ret == PORT_SWITCH_ID_6161_A1) return "Marvell 88E6161 (A1)"; if (ret == PORT_SWITCH_ID_6161_A2) return "Marvell 88E6161 (A2)"; if ((ret & 0xfff0) == PORT_SWITCH_ID_6161) return "Marvell 88E6161"; if (ret == PORT_SWITCH_ID_6165_A1) return "Marvell 88E6165 (A1)"; if (ret == PORT_SWITCH_ID_6165_A2) return "Marvell 88e6165 (A2)"; if ((ret & 0xfff0) == PORT_SWITCH_ID_6165) return "Marvell 88E6165"; } return NULL; }
static int reg_write(struct dsa_switch *ds, int addr, int reg, u16 val) { struct mii_bus *bus = dsa_host_dev_to_mii_bus(ds->master_dev); if (bus == NULL) return -EINVAL; return mdiobus_write(bus, ds->pd->sw_addr + addr, reg, val); }
static char *mv88e6063_probe(struct mii_bus *bus, int sw_addr) { #else static char *mv88e6063_probe(struct device *host_dev, int sw_addr) { struct mii_bus *bus = dsa_host_dev_to_mii_bus(host_dev); #endif int ret; ret = mdiobus_read(bus, REG_PORT(0), 0x03); if (ret >= 0) { ret &= 0xfff0; if (ret == 0x1530) return "Marvell 88E6063"; } return NULL; } static int mv88e6063_switch_reset(struct dsa_switch *ds) { int i; int ret; /* * Set all ports to the disabled state. */ for (i = 0; i < NUM_PORTS; i++) { ret = REG_READ(REG_PORT(i), 0x04); REG_WRITE(REG_PORT(i), 0x04, ret & 0xfffc); } /* * Wait for transmit queues to drain. */ msleep(2); /* * Reset the switch. */ REG_WRITE(REG_GLOBAL, 0x0a, 0xa130); /* * Wait up to one second for reset to complete. */ for (i = 0; i < 1000; i++) { ret = REG_READ(REG_GLOBAL, 0x00); if ((ret & 0x8000) == 0x0000) break; msleep(1); } if (i == 1000) return -ETIMEDOUT; return 0; }
static int reg_write(struct dsa_switch *ds, int addr, int reg, u16 val) { #if LINUX_VERSION_CODE < KERNEL_VERSION(3,15,0) return mdiobus_write(ds->master_mii_bus, addr, reg, val); #else struct mii_bus *bus = dsa_host_dev_to_mii_bus(ds->master_dev); return mdiobus_write(bus, addr, reg, val); #endif }
/* Must be called with SMI mutex held */ static int _mv88e6xxx_reg_write(struct dsa_switch *ds, int addr, int reg, u16 val) { struct mii_bus *bus = dsa_host_dev_to_mii_bus(ds->master_dev); if (bus == NULL) return -EINVAL; dev_dbg(ds->master_dev, "-> addr: 0x%.2x reg: 0x%.2x val: 0x%.4x\n", addr, reg, val); return __mv88e6xxx_reg_write(bus, ds->pd->sw_addr, addr, reg, val); }
int mv88e6xxx_reg_read(struct dsa_switch *ds, int addr, int reg) { struct mv88e6xxx_priv_state *ps = ds_to_priv(ds); struct mii_bus *bus = dsa_host_dev_to_mii_bus(ds->master_dev); int ret; if (bus == NULL) return -EINVAL; mutex_lock(&ps->smi_mutex); ret = __mv88e6xxx_reg_read(bus, ds->pd->sw_addr, addr, reg); mutex_unlock(&ps->smi_mutex); return ret; }
static char *mv88e6060_probe(struct device *host_dev, int sw_addr) { struct mii_bus *bus = dsa_host_dev_to_mii_bus(host_dev); int ret; if (bus == NULL) return NULL; ret = mdiobus_read(bus, sw_addr + REG_PORT(0), 0x03); if (ret >= 0) { ret &= 0xfff0; if (ret == 0x0600) return "Marvell 88E6060"; } return NULL; }
/* Must be called with SMI mutex held */ static int _mv88e6xxx_reg_read(struct dsa_switch *ds, int addr, int reg) { struct mii_bus *bus = dsa_host_dev_to_mii_bus(ds->master_dev); int ret; if (bus == NULL) return -EINVAL; ret = __mv88e6xxx_reg_read(bus, ds->pd->sw_addr, addr, reg); if (ret < 0) return ret; dev_dbg(ds->master_dev, "<- addr: 0x%.2x reg: 0x%.2x val: 0x%.4x\n", addr, reg, ret); return ret; }
static const char *mv88e6060_drv_probe(struct device *dsa_dev, struct device *host_dev, int sw_addr, void **_priv) { struct mii_bus *bus = dsa_host_dev_to_mii_bus(host_dev); struct mv88e6060_priv *priv; const char *name; name = mv88e6060_get_name(bus, sw_addr); if (name) { priv = devm_kzalloc(dsa_dev, sizeof(*priv), GFP_KERNEL); if (!priv) return NULL; *_priv = priv; priv->bus = bus; priv->sw_addr = sw_addr; } return name; }
static char *mv88e6131_probe(struct device *host_dev, int sw_addr) { struct mii_bus *bus = dsa_host_dev_to_mii_bus(host_dev); int ret; if (bus == NULL) return NULL; ret = __mv88e6xxx_reg_read(bus, sw_addr, REG_PORT(0), 0x03); if (ret >= 0) { ret &= 0xfff0; if (ret == ID_6085) return "Marvell 88E6085"; if (ret == ID_6095) return "Marvell 88E6095/88E6095F"; if (ret == ID_6131) return "Marvell 88E6131"; } return NULL; }
static char *mv88e6171_probe(struct device *host_dev, int sw_addr) { struct mii_bus *bus = dsa_host_dev_to_mii_bus(host_dev); int ret; if (bus == NULL) return NULL; ret = __mv88e6xxx_reg_read(bus, sw_addr, REG_PORT(0), PORT_SWITCH_ID); if (ret >= 0) { if ((ret & 0xfff0) == PORT_SWITCH_ID_6171) return "Marvell 88E6171"; if ((ret & 0xfff0) == PORT_SWITCH_ID_6175) return "Marvell 88E6175"; if ((ret & 0xfff0) == PORT_SWITCH_ID_6350) return "Marvell 88E6350"; if ((ret & 0xfff0) == PORT_SWITCH_ID_6351) return "Marvell 88E6351"; } return NULL; }
static char *mv88e6352_probe(struct device *host_dev, int sw_addr) { struct mii_bus *bus = dsa_host_dev_to_mii_bus(host_dev); int ret; if (bus == NULL) return NULL; ret = __mv88e6xxx_reg_read(bus, sw_addr, REG_PORT(0), PORT_SWITCH_ID); if (ret >= 0) { if ((ret & 0xfff0) == PORT_SWITCH_ID_6172) return "Marvell 88E6172"; if ((ret & 0xfff0) == PORT_SWITCH_ID_6176) return "Marvell 88E6176"; if (ret == PORT_SWITCH_ID_6320_A1) return "Marvell 88E6320 (A1)"; if (ret == PORT_SWITCH_ID_6320_A2) return "Marvell 88e6320 (A2)"; if ((ret & 0xfff0) == PORT_SWITCH_ID_6320) return "Marvell 88E6320"; if (ret == PORT_SWITCH_ID_6321_A1) return "Marvell 88E6321 (A1)"; if (ret == PORT_SWITCH_ID_6321_A2) return "Marvell 88e6321 (A2)"; if ((ret & 0xfff0) == PORT_SWITCH_ID_6321) return "Marvell 88E6321"; if (ret == PORT_SWITCH_ID_6352_A0) return "Marvell 88E6352 (A0)"; if (ret == PORT_SWITCH_ID_6352_A1) return "Marvell 88E6352 (A1)"; if ((ret & 0xfff0) == PORT_SWITCH_ID_6352) return "Marvell 88E6352"; } return NULL; }