Lines Matching +full:chip +full:- +full:to +full:- +full:chip
1 // SPDX-License-Identifier: GPL-2.0-only
25 * Multiply register number by 4 to get address offset.
194 /* the built-in PHYs are of type LAN911X */
247 * tries to detect and read an external EEPROM after reset and acts as in lan9303_read()
249 * attempts to access the device as a slave at the same moment. in lan9303_read()
255 if (ret != -EAGAIN) in lan9303_read()
260 return -EIO; in lan9303_read()
263 static int lan9303_read_wait(struct lan9303 *chip, int offset, u32 mask) in lan9303_read_wait() argument
271 ret = lan9303_read(chip->regmap, offset, ®); in lan9303_read_wait()
273 dev_err(chip->dev, "%s failed to read offset %d: %d\n", in lan9303_read_wait()
282 return -ETIMEDOUT; in lan9303_read_wait()
285 static int lan9303_virt_phy_reg_read(struct lan9303 *chip, int regnum) in lan9303_virt_phy_reg_read() argument
291 return -EINVAL; in lan9303_virt_phy_reg_read()
293 ret = lan9303_read(chip->regmap, LAN9303_VIRT_PHY_BASE + regnum, &val); in lan9303_virt_phy_reg_read()
300 static int lan9303_virt_phy_reg_write(struct lan9303 *chip, int regnum, u16 val) in lan9303_virt_phy_reg_write() argument
303 return -EINVAL; in lan9303_virt_phy_reg_write()
305 return regmap_write(chip->regmap, LAN9303_VIRT_PHY_BASE + regnum, val); in lan9303_virt_phy_reg_write()
308 static int lan9303_indirect_phy_wait_for_completion(struct lan9303 *chip) in lan9303_indirect_phy_wait_for_completion() argument
310 return lan9303_read_wait(chip, LAN9303_PMI_ACCESS, in lan9303_indirect_phy_wait_for_completion()
314 static int lan9303_indirect_phy_read(struct lan9303 *chip, int addr, int regnum) in lan9303_indirect_phy_read() argument
322 mutex_lock(&chip->indirect_mutex); in lan9303_indirect_phy_read()
324 ret = lan9303_indirect_phy_wait_for_completion(chip); in lan9303_indirect_phy_read()
329 ret = regmap_write(chip->regmap, LAN9303_PMI_ACCESS, val); in lan9303_indirect_phy_read()
333 ret = lan9303_indirect_phy_wait_for_completion(chip); in lan9303_indirect_phy_read()
338 ret = lan9303_read(chip->regmap, LAN9303_PMI_DATA, &val); in lan9303_indirect_phy_read()
342 mutex_unlock(&chip->indirect_mutex); in lan9303_indirect_phy_read()
347 mutex_unlock(&chip->indirect_mutex); in lan9303_indirect_phy_read()
351 static int lan9303_indirect_phy_write(struct lan9303 *chip, int addr, in lan9303_indirect_phy_write() argument
361 mutex_lock(&chip->indirect_mutex); in lan9303_indirect_phy_write()
363 ret = lan9303_indirect_phy_wait_for_completion(chip); in lan9303_indirect_phy_write()
368 ret = regmap_write(chip->regmap, LAN9303_PMI_DATA, val); in lan9303_indirect_phy_write()
373 ret = regmap_write(chip->regmap, LAN9303_PMI_ACCESS, reg); in lan9303_indirect_phy_write()
376 mutex_unlock(&chip->indirect_mutex); in lan9303_indirect_phy_write()
386 static int lan9303_switch_wait_for_completion(struct lan9303 *chip) in lan9303_switch_wait_for_completion() argument
388 return lan9303_read_wait(chip, LAN9303_SWITCH_CSR_CMD, in lan9303_switch_wait_for_completion()
392 static int lan9303_write_switch_reg(struct lan9303 *chip, u16 regnum, u32 val) in lan9303_write_switch_reg() argument
401 mutex_lock(&chip->indirect_mutex); in lan9303_write_switch_reg()
403 ret = lan9303_switch_wait_for_completion(chip); in lan9303_write_switch_reg()
407 ret = regmap_write(chip->regmap, LAN9303_SWITCH_CSR_DATA, val); in lan9303_write_switch_reg()
409 dev_err(chip->dev, "Failed to write csr data reg: %d\n", ret); in lan9303_write_switch_reg()
414 ret = regmap_write(chip->regmap, LAN9303_SWITCH_CSR_CMD, reg); in lan9303_write_switch_reg()
416 dev_err(chip->dev, "Failed to write csr command reg: %d\n", in lan9303_write_switch_reg()
420 mutex_unlock(&chip->indirect_mutex); in lan9303_write_switch_reg()
424 static int lan9303_read_switch_reg(struct lan9303 *chip, u16 regnum, u32 *val) in lan9303_read_switch_reg() argument
434 mutex_lock(&chip->indirect_mutex); in lan9303_read_switch_reg()
436 ret = lan9303_switch_wait_for_completion(chip); in lan9303_read_switch_reg()
441 ret = regmap_write(chip->regmap, LAN9303_SWITCH_CSR_CMD, reg); in lan9303_read_switch_reg()
443 dev_err(chip->dev, "Failed to write csr command reg: %d\n", in lan9303_read_switch_reg()
448 ret = lan9303_switch_wait_for_completion(chip); in lan9303_read_switch_reg()
452 ret = lan9303_read(chip->regmap, LAN9303_SWITCH_CSR_DATA, val); in lan9303_read_switch_reg()
454 dev_err(chip->dev, "Failed to read csr data reg: %d\n", ret); in lan9303_read_switch_reg()
456 mutex_unlock(&chip->indirect_mutex); in lan9303_read_switch_reg()
460 static int lan9303_write_switch_reg_mask(struct lan9303 *chip, u16 regnum, in lan9303_write_switch_reg_mask() argument
466 ret = lan9303_read_switch_reg(chip, regnum, ®); in lan9303_write_switch_reg_mask()
472 return lan9303_write_switch_reg(chip, regnum, reg); in lan9303_write_switch_reg_mask()
475 static int lan9303_write_switch_port(struct lan9303 *chip, int port, in lan9303_write_switch_port() argument
479 chip, LAN9303_SWITCH_PORT_REG(port, regnum), val); in lan9303_write_switch_port()
482 static int lan9303_read_switch_port(struct lan9303 *chip, int port, in lan9303_read_switch_port() argument
486 chip, LAN9303_SWITCH_PORT_REG(port, regnum), val); in lan9303_read_switch_port()
489 static int lan9303_detect_phy_setup(struct lan9303 *chip) in lan9303_detect_phy_setup() argument
493 /* Calculate chip->phy_addr_base: in lan9303_detect_phy_setup()
495 * using IDs 0-1-2 or IDs 1-2-3. We cannot read back the in lan9303_detect_phy_setup()
499 * and the IDs are 0-1-2, else it contains something different from in lan9303_detect_phy_setup()
500 * 0x0000, which means 'phy_addr_sel_strap' is 1 and the IDs are 1-2-3. in lan9303_detect_phy_setup()
503 reg = chip->ops->phy_read(chip, 3, MII_LAN911X_SPECIAL_MODES); in lan9303_detect_phy_setup()
505 dev_err(chip->dev, "Failed to detect phy config: %d\n", reg); in lan9303_detect_phy_setup()
509 chip->phy_addr_base = reg != 0 && reg != 0xffff; in lan9303_detect_phy_setup()
511 dev_dbg(chip->dev, "Phy setup '%s' detected\n", in lan9303_detect_phy_setup()
512 chip->phy_addr_base ? "1-2-3" : "0-1-2"); in lan9303_detect_phy_setup()
517 /* Map ALR-port bits to port bitmap, and back */
521 /* Return pointer to first free ALR cache entry, return NULL if none */
523 lan9303_alr_cache_find_free(struct lan9303 *chip) in lan9303_alr_cache_find_free() argument
526 struct lan9303_alr_cache_entry *entr = chip->alr_cache; in lan9303_alr_cache_find_free()
529 if (entr->port_map == 0) in lan9303_alr_cache_find_free()
535 /* Return pointer to ALR cache entry matching MAC address */
537 lan9303_alr_cache_find_mac(struct lan9303 *chip, const u8 *mac_addr) in lan9303_alr_cache_find_mac() argument
540 struct lan9303_alr_cache_entry *entr = chip->alr_cache; in lan9303_alr_cache_find_mac()
546 if (ether_addr_equal(entr->mac_addr, mac_addr)) in lan9303_alr_cache_find_mac()
552 static int lan9303_csr_reg_wait(struct lan9303 *chip, int regno, u32 mask) in lan9303_csr_reg_wait() argument
559 lan9303_read_switch_reg(chip, regno, ®); in lan9303_csr_reg_wait()
565 return -ETIMEDOUT; in lan9303_csr_reg_wait()
568 static int lan9303_alr_make_entry_raw(struct lan9303 *chip, u32 dat0, u32 dat1) in lan9303_alr_make_entry_raw() argument
570 lan9303_write_switch_reg(chip, LAN9303_SWE_ALR_WR_DAT_0, dat0); in lan9303_alr_make_entry_raw()
571 lan9303_write_switch_reg(chip, LAN9303_SWE_ALR_WR_DAT_1, dat1); in lan9303_alr_make_entry_raw()
572 lan9303_write_switch_reg(chip, LAN9303_SWE_ALR_CMD, in lan9303_alr_make_entry_raw()
574 lan9303_csr_reg_wait(chip, LAN9303_SWE_ALR_CMD_STS, ALR_STS_MAKE_PEND); in lan9303_alr_make_entry_raw()
575 lan9303_write_switch_reg(chip, LAN9303_SWE_ALR_CMD, 0); in lan9303_alr_make_entry_raw()
580 typedef int alr_loop_cb_t(struct lan9303 *chip, u32 dat0, u32 dat1,
583 static int lan9303_alr_loop(struct lan9303 *chip, alr_loop_cb_t *cb, void *ctx) in lan9303_alr_loop() argument
587 mutex_lock(&chip->alr_mutex); in lan9303_alr_loop()
588 lan9303_write_switch_reg(chip, LAN9303_SWE_ALR_CMD, in lan9303_alr_loop()
590 lan9303_write_switch_reg(chip, LAN9303_SWE_ALR_CMD, 0); in lan9303_alr_loop()
596 lan9303_read_switch_reg(chip, LAN9303_SWE_ALR_RD_DAT_0, &dat0); in lan9303_alr_loop()
597 lan9303_read_switch_reg(chip, LAN9303_SWE_ALR_RD_DAT_1, &dat1); in lan9303_alr_loop()
605 ret = cb(chip, dat0, dat1, portmap, ctx); in lan9303_alr_loop()
609 lan9303_write_switch_reg(chip, LAN9303_SWE_ALR_CMD, in lan9303_alr_loop()
611 lan9303_write_switch_reg(chip, LAN9303_SWE_ALR_CMD, 0); in lan9303_alr_loop()
613 mutex_unlock(&chip->alr_mutex); in lan9303_alr_loop()
632 /* Clear learned (non-static) entry on given port */
633 static int alr_loop_cb_del_port_learned(struct lan9303 *chip, u32 dat0, in alr_loop_cb_del_port_learned() argument
637 int port = del_ctx->port; in alr_loop_cb_del_port_learned()
644 lan9303_alr_make_entry_raw(chip, dat0, dat1); in alr_loop_cb_del_port_learned()
655 static int alr_loop_cb_fdb_port_dump(struct lan9303 *chip, u32 dat0, in alr_loop_cb_fdb_port_dump() argument
662 if ((BIT(dump_ctx->port) & portmap) == 0) in alr_loop_cb_fdb_port_dump()
667 return dump_ctx->cb(mac, 0, is_static, dump_ctx->data); in alr_loop_cb_fdb_port_dump()
671 static void lan9303_alr_set_entry(struct lan9303 *chip, const u8 *mac, in lan9303_alr_set_entry() argument
676 dev_dbg(chip->dev, "%s(%pM, %d)\n", __func__, mac, port_map); in lan9303_alr_set_entry()
697 lan9303_alr_make_entry_raw(chip, dat0, dat1); in lan9303_alr_set_entry()
700 /* Add port to static ALR entry, create new static entry if needed */
701 static int lan9303_alr_add_port(struct lan9303 *chip, const u8 *mac, int port, in lan9303_alr_add_port() argument
706 mutex_lock(&chip->alr_mutex); in lan9303_alr_add_port()
707 entr = lan9303_alr_cache_find_mac(chip, mac); in lan9303_alr_add_port()
709 entr = lan9303_alr_cache_find_free(chip); in lan9303_alr_add_port()
711 mutex_unlock(&chip->alr_mutex); in lan9303_alr_add_port()
712 return -ENOSPC; in lan9303_alr_add_port()
714 ether_addr_copy(entr->mac_addr, mac); in lan9303_alr_add_port()
716 entr->port_map |= BIT(port); in lan9303_alr_add_port()
717 entr->stp_override = stp_override; in lan9303_alr_add_port()
718 lan9303_alr_set_entry(chip, mac, entr->port_map, stp_override); in lan9303_alr_add_port()
719 mutex_unlock(&chip->alr_mutex); in lan9303_alr_add_port()
725 static int lan9303_alr_del_port(struct lan9303 *chip, const u8 *mac, int port) in lan9303_alr_del_port() argument
729 mutex_lock(&chip->alr_mutex); in lan9303_alr_del_port()
730 entr = lan9303_alr_cache_find_mac(chip, mac); in lan9303_alr_del_port()
734 entr->port_map &= ~BIT(port); in lan9303_alr_del_port()
735 if (entr->port_map == 0) /* zero means its free again */ in lan9303_alr_del_port()
736 eth_zero_addr(entr->mac_addr); in lan9303_alr_del_port()
737 lan9303_alr_set_entry(chip, mac, entr->port_map, entr->stp_override); in lan9303_alr_del_port()
740 mutex_unlock(&chip->alr_mutex); in lan9303_alr_del_port()
744 static int lan9303_disable_processing_port(struct lan9303 *chip, in lan9303_disable_processing_port() argument
750 ret = lan9303_write_switch_port(chip, port, LAN9303_MAC_RX_CFG_0, in lan9303_disable_processing_port()
756 return lan9303_write_switch_port(chip, port, LAN9303_MAC_TX_CFG_0, in lan9303_disable_processing_port()
761 static int lan9303_enable_processing_port(struct lan9303 *chip, in lan9303_enable_processing_port() argument
767 ret = lan9303_write_switch_port(chip, port, LAN9303_MAC_RX_CFG_0, in lan9303_enable_processing_port()
774 return lan9303_write_switch_port(chip, port, LAN9303_MAC_TX_CFG_0, in lan9303_enable_processing_port()
780 /* forward special tagged packets from port 0 to port 1 *or* port 2 */
781 static int lan9303_setup_tagging(struct lan9303 *chip) in lan9303_setup_tagging() argument
788 ret = lan9303_write_switch_reg(chip, LAN9303_SWE_INGRESS_PORT_TYPE, in lan9303_setup_tagging()
793 /* tag incoming packets at port 1 and 2 on their way to port 0 to be in lan9303_setup_tagging()
794 * able to discover their source port in lan9303_setup_tagging()
797 return lan9303_write_switch_reg(chip, LAN9303_BM_EGRSS_PORT_TYPE, val); in lan9303_setup_tagging()
801 * - do not forward packets between port 1 and 2
802 * - forward everything from port 1 to port 0
803 * - forward everything from port 2 to port 0
805 static int lan9303_separate_ports(struct lan9303 *chip) in lan9303_separate_ports() argument
809 lan9303_alr_del_port(chip, eth_stp_addr, 0); in lan9303_separate_ports()
810 ret = lan9303_write_switch_reg(chip, LAN9303_SWE_PORT_MIRROR, in lan9303_separate_ports()
820 return lan9303_write_switch_reg(chip, LAN9303_SWE_PORT_STATE, in lan9303_separate_ports()
826 static void lan9303_bridge_ports(struct lan9303 *chip) in lan9303_bridge_ports() argument
829 lan9303_write_switch_reg(chip, LAN9303_SWE_PORT_MIRROR, in lan9303_bridge_ports()
832 lan9303_write_switch_reg(chip, LAN9303_SWE_PORT_STATE, in lan9303_bridge_ports()
833 chip->swe_port_state); in lan9303_bridge_ports()
834 lan9303_alr_add_port(chip, eth_stp_addr, 0, true); in lan9303_bridge_ports()
837 static void lan9303_handle_reset(struct lan9303 *chip) in lan9303_handle_reset() argument
839 if (!chip->reset_gpio) in lan9303_handle_reset()
842 if (chip->reset_duration != 0) in lan9303_handle_reset()
843 msleep(chip->reset_duration); in lan9303_handle_reset()
846 gpiod_set_value_cansleep(chip->reset_gpio, 0); in lan9303_handle_reset()
850 static int lan9303_disable_processing(struct lan9303 *chip) in lan9303_disable_processing() argument
855 int ret = lan9303_disable_processing_port(chip, p); in lan9303_disable_processing()
864 static int lan9303_check_device(struct lan9303 *chip) in lan9303_check_device() argument
869 ret = lan9303_read(chip->regmap, LAN9303_CHIP_REV, ®); in lan9303_check_device()
871 dev_err(chip->dev, "failed to read chip revision register: %d\n", in lan9303_check_device()
878 dev_err(chip->dev, "unexpected device found: LAN%4.4X\n", in lan9303_check_device()
880 return -ENODEV; in lan9303_check_device()
883 /* The default state of the LAN9303 device is to forward packets between in lan9303_check_device()
888 * at all for now until the LAN9303 device is re-programmed accordingly. in lan9303_check_device()
890 ret = lan9303_disable_processing(chip); in lan9303_check_device()
892 dev_warn(chip->dev, "failed to disable switching %d\n", ret); in lan9303_check_device()
894 dev_info(chip->dev, "Found LAN%4.4X rev. %u\n", (reg >> 16), reg & 0xffff); in lan9303_check_device()
896 ret = lan9303_detect_phy_setup(chip); in lan9303_check_device()
898 dev_err(chip->dev, in lan9303_check_device()
899 "failed to discover phy bootstrap setup: %d\n", ret); in lan9303_check_device()
906 /* ---------------------------- DSA -----------------------------------*/
917 struct lan9303 *chip = ds->priv; in lan9303_setup() local
923 dev_err(chip->dev, "port 0 is not the CPU port\n"); in lan9303_setup()
924 return -EINVAL; in lan9303_setup()
928 ret = lan9303_read(chip->regmap, LAN9303_VIRT_SPECIAL_CTRL, ®); in lan9303_setup()
935 regmap_write(chip->regmap, LAN9303_VIRT_SPECIAL_CTRL, reg); in lan9303_setup()
938 ret = lan9303_setup_tagging(chip); in lan9303_setup()
940 dev_err(chip->dev, "failed to setup port tagging %d\n", ret); in lan9303_setup()
942 ret = lan9303_separate_ports(chip); in lan9303_setup()
944 dev_err(chip->dev, "failed to separate ports %d\n", ret); in lan9303_setup()
946 ret = lan9303_enable_processing_port(chip, 0); in lan9303_setup()
948 dev_err(chip->dev, "failed to re-enable switching %d\n", ret); in lan9303_setup()
950 /* Trap IGMP to port 0 */ in lan9303_setup()
951 ret = lan9303_write_switch_reg_mask(chip, LAN9303_SWE_GLB_INGRESS_CFG, in lan9303_setup()
957 dev_err(chip->dev, "failed to setup IGMP trap %d\n", ret); in lan9303_setup()
1024 struct lan9303 *chip = ds->priv; in lan9303_get_ethtool_stats() local
1032 chip, port, lan9303_mib[u].offset, ®); in lan9303_get_ethtool_stats()
1035 dev_warn(chip->dev, "Reading status port %d reg %u failed\n", in lan9303_get_ethtool_stats()
1053 struct lan9303 *chip = ds->priv; in lan9303_phy_read() local
1054 int phy_base = chip->phy_addr_base; in lan9303_phy_read()
1057 return lan9303_virt_phy_reg_read(chip, regnum); in lan9303_phy_read()
1059 return -ENODEV; in lan9303_phy_read()
1061 return chip->ops->phy_read(chip, phy, regnum); in lan9303_phy_read()
1067 struct lan9303 *chip = ds->priv; in lan9303_phy_write() local
1068 int phy_base = chip->phy_addr_base; in lan9303_phy_write()
1071 return lan9303_virt_phy_reg_write(chip, regnum, val); in lan9303_phy_write()
1073 return -ENODEV; in lan9303_phy_write()
1075 return chip->ops->phy_write(chip, phy, regnum, val); in lan9303_phy_write()
1082 struct lan9303 *chip = ds->priv; in lan9303_port_enable() local
1089 return lan9303_enable_processing_port(chip, port); in lan9303_port_enable()
1095 struct lan9303 *chip = ds->priv; in lan9303_port_disable() local
1102 lan9303_disable_processing_port(chip, port); in lan9303_port_disable()
1103 lan9303_phy_write(ds, chip->phy_addr_base + port, MII_BMCR, BMCR_PDOWN); in lan9303_port_disable()
1111 struct lan9303 *chip = ds->priv; in lan9303_port_bridge_join() local
1113 dev_dbg(chip->dev, "%s(port %d)\n", __func__, port); in lan9303_port_bridge_join()
1115 lan9303_bridge_ports(chip); in lan9303_port_bridge_join()
1116 chip->is_bridged = true; /* unleash stp_state_set() */ in lan9303_port_bridge_join()
1125 struct lan9303 *chip = ds->priv; in lan9303_port_bridge_leave() local
1127 dev_dbg(chip->dev, "%s(port %d)\n", __func__, port); in lan9303_port_bridge_leave()
1128 if (chip->is_bridged) { in lan9303_port_bridge_leave()
1129 lan9303_separate_ports(chip); in lan9303_port_bridge_leave()
1130 chip->is_bridged = false; in lan9303_port_bridge_leave()
1138 struct lan9303 *chip = ds->priv; in lan9303_port_stp_state_set() local
1140 dev_dbg(chip->dev, "%s(port %d, state %d)\n", in lan9303_port_stp_state_set()
1159 dev_err(chip->dev, "unknown stp state: port %d, state %d\n", in lan9303_port_stp_state_set()
1166 chip->swe_port_state = (chip->swe_port_state & ~portmask) | portstate; in lan9303_port_stp_state_set()
1168 if (chip->is_bridged) in lan9303_port_stp_state_set()
1169 lan9303_write_switch_reg(chip, LAN9303_SWE_PORT_STATE, in lan9303_port_stp_state_set()
1170 chip->swe_port_state); in lan9303_port_stp_state_set()
1176 struct lan9303 *chip = ds->priv; in lan9303_port_fast_age() local
1181 dev_dbg(chip->dev, "%s(%d)\n", __func__, port); in lan9303_port_fast_age()
1182 lan9303_alr_loop(chip, alr_loop_cb_del_port_learned, &del_ctx); in lan9303_port_fast_age()
1189 struct lan9303 *chip = ds->priv; in lan9303_port_fdb_add() local
1191 dev_dbg(chip->dev, "%s(%d, %pM, %d)\n", __func__, port, addr, vid); in lan9303_port_fdb_add()
1193 return lan9303_alr_add_port(chip, addr, port, false); in lan9303_port_fdb_add()
1200 struct lan9303 *chip = ds->priv; in lan9303_port_fdb_del() local
1202 dev_dbg(chip->dev, "%s(%d, %pM, %d)\n", __func__, port, addr, vid); in lan9303_port_fdb_del()
1203 lan9303_alr_del_port(chip, addr, port); in lan9303_port_fdb_del()
1211 struct lan9303 *chip = ds->priv; in lan9303_port_fdb_dump() local
1218 dev_dbg(chip->dev, "%s(%d)\n", __func__, port); in lan9303_port_fdb_dump()
1219 return lan9303_alr_loop(chip, alr_loop_cb_fdb_port_dump, &dump_ctx); in lan9303_port_fdb_dump()
1225 struct lan9303 *chip = ds->priv; in lan9303_port_mdb_prepare() local
1227 dev_dbg(chip->dev, "%s(%d, %pM, %d)\n", __func__, port, mdb->addr, in lan9303_port_mdb_prepare()
1228 mdb->vid); in lan9303_port_mdb_prepare()
1229 if (mdb->vid) in lan9303_port_mdb_prepare()
1230 return -EOPNOTSUPP; in lan9303_port_mdb_prepare()
1231 if (lan9303_alr_cache_find_mac(chip, mdb->addr)) in lan9303_port_mdb_prepare()
1233 if (!lan9303_alr_cache_find_free(chip)) in lan9303_port_mdb_prepare()
1234 return -ENOSPC; in lan9303_port_mdb_prepare()
1243 struct lan9303 *chip = ds->priv; in lan9303_port_mdb_add() local
1250 dev_dbg(chip->dev, "%s(%d, %pM, %d)\n", __func__, port, mdb->addr, in lan9303_port_mdb_add()
1251 mdb->vid); in lan9303_port_mdb_add()
1252 return lan9303_alr_add_port(chip, mdb->addr, port, false); in lan9303_port_mdb_add()
1259 struct lan9303 *chip = ds->priv; in lan9303_port_mdb_del() local
1261 dev_dbg(chip->dev, "%s(%d, %pM, %d)\n", __func__, port, mdb->addr, in lan9303_port_mdb_del()
1262 mdb->vid); in lan9303_port_mdb_del()
1263 if (mdb->vid) in lan9303_port_mdb_del()
1264 return -EOPNOTSUPP; in lan9303_port_mdb_del()
1265 lan9303_alr_del_port(chip, mdb->addr, port); in lan9303_port_mdb_del()
1273 struct lan9303 *chip = ds->priv; in lan9303_phylink_get_caps() local
1275 dev_dbg(chip->dev, "%s(%d) entered.", __func__, port); in lan9303_phylink_get_caps()
1277 config->mac_capabilities = MAC_10 | MAC_100 | MAC_ASYM_PAUSE | in lan9303_phylink_get_caps()
1282 config->supported_interfaces); in lan9303_phylink_get_caps()
1284 config->supported_interfaces); in lan9303_phylink_get_caps()
1287 config->supported_interfaces); in lan9303_phylink_get_caps()
1289 * phy-mode property is absent in lan9303_phylink_get_caps()
1292 config->supported_interfaces); in lan9303_phylink_get_caps()
1303 struct lan9303 *chip = ds->priv; in lan9303_phylink_mac_link_up() local
1309 * to control there link settings. in lan9303_phylink_mac_link_up()
1314 /* Disable auto-negotiation and force the speed/duplex settings. */ in lan9303_phylink_mac_link_up()
1324 lan9303_read(chip->regmap, flow_ctl_reg[port], ®); in lan9303_phylink_mac_link_up()
1330 regmap_write(chip->regmap, flow_ctl_reg[port], reg); in lan9303_phylink_mac_link_up()
1356 static int lan9303_register_switch(struct lan9303 *chip) in lan9303_register_switch() argument
1360 chip->ds = devm_kzalloc(chip->dev, sizeof(*chip->ds), GFP_KERNEL); in lan9303_register_switch()
1361 if (!chip->ds) in lan9303_register_switch()
1362 return -ENOMEM; in lan9303_register_switch()
1364 chip->ds->dev = chip->dev; in lan9303_register_switch()
1365 chip->ds->num_ports = LAN9303_NUM_PORTS; in lan9303_register_switch()
1366 chip->ds->priv = chip; in lan9303_register_switch()
1367 chip->ds->ops = &lan9303_switch_ops; in lan9303_register_switch()
1368 base = chip->phy_addr_base; in lan9303_register_switch()
1369 chip->ds->phys_mii_mask = GENMASK(LAN9303_NUM_PORTS - 1 + base, base); in lan9303_register_switch()
1371 return dsa_register_switch(chip->ds); in lan9303_register_switch()
1374 static int lan9303_probe_reset_gpio(struct lan9303 *chip, in lan9303_probe_reset_gpio() argument
1377 chip->reset_gpio = devm_gpiod_get_optional(chip->dev, "reset", in lan9303_probe_reset_gpio()
1379 if (IS_ERR(chip->reset_gpio)) in lan9303_probe_reset_gpio()
1380 return PTR_ERR(chip->reset_gpio); in lan9303_probe_reset_gpio()
1382 if (!chip->reset_gpio) { in lan9303_probe_reset_gpio()
1383 dev_dbg(chip->dev, "No reset GPIO defined\n"); in lan9303_probe_reset_gpio()
1387 chip->reset_duration = 200; in lan9303_probe_reset_gpio()
1390 of_property_read_u32(np, "reset-duration", in lan9303_probe_reset_gpio()
1391 &chip->reset_duration); in lan9303_probe_reset_gpio()
1393 dev_dbg(chip->dev, "reset duration defaults to 200 ms\n"); in lan9303_probe_reset_gpio()
1397 if (chip->reset_duration > 1000) in lan9303_probe_reset_gpio()
1398 chip->reset_duration = 1000; in lan9303_probe_reset_gpio()
1403 int lan9303_probe(struct lan9303 *chip, struct device_node *np) in lan9303_probe() argument
1408 mutex_init(&chip->indirect_mutex); in lan9303_probe()
1409 mutex_init(&chip->alr_mutex); in lan9303_probe()
1411 ret = lan9303_probe_reset_gpio(chip, np); in lan9303_probe()
1415 lan9303_handle_reset(chip); in lan9303_probe()
1417 /* First read to the device. This is a Dummy read to ensure MDIO */ in lan9303_probe()
1418 /* access is in 32-bit sync. */ in lan9303_probe()
1419 ret = lan9303_read(chip->regmap, LAN9303_BYTE_ORDER, ®); in lan9303_probe()
1421 dev_err(chip->dev, "failed to access the device: %d\n", in lan9303_probe()
1423 if (!chip->reset_gpio) { in lan9303_probe()
1424 dev_dbg(chip->dev, in lan9303_probe()
1425 "hint: maybe failed due to missing reset GPIO\n"); in lan9303_probe()
1430 ret = lan9303_check_device(chip); in lan9303_probe()
1434 ret = lan9303_register_switch(chip); in lan9303_probe()
1436 dev_dbg(chip->dev, "Failed to register switch: %d\n", ret); in lan9303_probe()
1444 int lan9303_remove(struct lan9303 *chip) in lan9303_remove() argument
1448 rc = lan9303_disable_processing(chip); in lan9303_remove()
1450 dev_warn(chip->dev, "shutting down failed\n"); in lan9303_remove()
1452 dsa_unregister_switch(chip->ds); in lan9303_remove()
1454 /* assert reset to the whole device to prevent it from doing anything */ in lan9303_remove()
1455 gpiod_set_value_cansleep(chip->reset_gpio, 1); in lan9303_remove()
1461 void lan9303_shutdown(struct lan9303 *chip) in lan9303_shutdown() argument
1463 dsa_switch_shutdown(chip->ds); in lan9303_shutdown()