• Home
  • Raw
  • Download

Lines Matching refs:ocelot

50 static inline u32 ocelot_mact_read_macaccess(struct ocelot *ocelot)  in ocelot_mact_read_macaccess()  argument
52 return ocelot_read(ocelot, ANA_TABLES_MACACCESS); in ocelot_mact_read_macaccess()
55 static inline int ocelot_mact_wait_for_completion(struct ocelot *ocelot) in ocelot_mact_wait_for_completion() argument
60 ocelot, val, in ocelot_mact_wait_for_completion()
66 static void ocelot_mact_select(struct ocelot *ocelot, in ocelot_mact_select() argument
83 ocelot_write(ocelot, macl, ANA_TABLES_MACLDATA); in ocelot_mact_select()
84 ocelot_write(ocelot, mach, ANA_TABLES_MACHDATA); in ocelot_mact_select()
88 static int ocelot_mact_learn(struct ocelot *ocelot, int port, in ocelot_mact_learn() argument
93 ocelot_mact_select(ocelot, mac, vid); in ocelot_mact_learn()
96 ocelot_write(ocelot, ANA_TABLES_MACACCESS_VALID | in ocelot_mact_learn()
102 return ocelot_mact_wait_for_completion(ocelot); in ocelot_mact_learn()
105 static int ocelot_mact_forget(struct ocelot *ocelot, in ocelot_mact_forget() argument
109 ocelot_mact_select(ocelot, mac, vid); in ocelot_mact_forget()
112 ocelot_write(ocelot, in ocelot_mact_forget()
116 return ocelot_mact_wait_for_completion(ocelot); in ocelot_mact_forget()
119 static void ocelot_mact_init(struct ocelot *ocelot) in ocelot_mact_init() argument
125 ocelot_rmw(ocelot, 0, in ocelot_mact_init()
132 ocelot_write(ocelot, MACACCESS_CMD_INIT, ANA_TABLES_MACACCESS); in ocelot_mact_init()
135 static void ocelot_vcap_enable(struct ocelot *ocelot, struct ocelot_port *port) in ocelot_vcap_enable() argument
137 ocelot_write_gix(ocelot, ANA_PORT_VCAP_S2_CFG_S2_ENA | in ocelot_vcap_enable()
142 static inline u32 ocelot_vlant_read_vlanaccess(struct ocelot *ocelot) in ocelot_vlant_read_vlanaccess() argument
144 return ocelot_read(ocelot, ANA_TABLES_VLANACCESS); in ocelot_vlant_read_vlanaccess()
147 static inline int ocelot_vlant_wait_for_completion(struct ocelot *ocelot) in ocelot_vlant_wait_for_completion() argument
152 ocelot, in ocelot_vlant_wait_for_completion()
159 static int ocelot_vlant_set_mask(struct ocelot *ocelot, u16 vid, u32 mask) in ocelot_vlant_set_mask() argument
162 ocelot_write(ocelot, ANA_TABLES_VLANTIDX_V_INDEX(vid), in ocelot_vlant_set_mask()
165 ocelot_write(ocelot, ANA_TABLES_VLANACCESS_VLAN_PORT_MASK(mask) | in ocelot_vlant_set_mask()
169 return ocelot_vlant_wait_for_completion(ocelot); in ocelot_vlant_set_mask()
175 struct ocelot *ocelot = port->ocelot; in ocelot_vlan_mode() local
180 val = ocelot_read(ocelot, ANA_VLANMASK); in ocelot_vlan_mode()
185 ocelot_write(ocelot, val, ANA_VLANMASK); in ocelot_vlan_mode()
188 static void ocelot_vlan_port_apply(struct ocelot *ocelot, in ocelot_vlan_port_apply() argument
200 ocelot_rmw_gix(ocelot, val, in ocelot_vlan_port_apply()
215 ocelot_write_gix(ocelot, val, ANA_PORT_DROP_CFG, port->chip_port); in ocelot_vlan_port_apply()
228 ocelot_rmw_gix(ocelot, val, in ocelot_vlan_port_apply()
236 ocelot_rmw_gix(ocelot, val, in ocelot_vlan_port_apply()
246 struct ocelot *ocelot = port->ocelot; in ocelot_vlan_vid_add() local
250 ocelot_mact_learn(ocelot, PGID_CPU, dev->dev_addr, vid, in ocelot_vlan_vid_add()
254 ocelot->vlan_mask[vid] |= BIT(port->chip_port); in ocelot_vlan_vid_add()
255 ret = ocelot_vlant_set_mask(ocelot, vid, ocelot->vlan_mask[vid]); in ocelot_vlan_vid_add()
266 dev_err(ocelot->dev, in ocelot_vlan_vid_add()
274 ocelot_vlan_port_apply(ocelot, port); in ocelot_vlan_vid_add()
282 struct ocelot *ocelot = port->ocelot; in ocelot_vlan_vid_del() local
293 ocelot_mact_forget(ocelot, dev->dev_addr, vid); in ocelot_vlan_vid_del()
296 ocelot->vlan_mask[vid] &= ~BIT(port->chip_port); in ocelot_vlan_vid_del()
297 ret = ocelot_vlant_set_mask(ocelot, vid, ocelot->vlan_mask[vid]); in ocelot_vlan_vid_del()
309 ocelot_vlan_port_apply(ocelot, port); in ocelot_vlan_vid_del()
314 static void ocelot_vlan_init(struct ocelot *ocelot) in ocelot_vlan_init() argument
319 ocelot_write(ocelot, ANA_TABLES_VLANACCESS_CMD_INIT, in ocelot_vlan_init()
321 ocelot_vlant_wait_for_completion(ocelot); in ocelot_vlan_init()
325 ocelot->vlan_mask[vid] = 0; in ocelot_vlan_init()
326 ocelot_vlant_set_mask(ocelot, vid, ocelot->vlan_mask[vid]); in ocelot_vlan_init()
333 ocelot->vlan_mask[0] = GENMASK(ocelot->num_phys_ports - 1, 0); in ocelot_vlan_init()
334 ocelot_vlant_set_mask(ocelot, 0, ocelot->vlan_mask[0]); in ocelot_vlan_init()
337 ocelot_write_gix(ocelot, ANA_PORT_VLAN_CFG_VLAN_VID(0) | in ocelot_vlan_init()
340 ANA_PORT_VLAN_CFG, ocelot->num_phys_ports); in ocelot_vlan_init()
345 ocelot_write(ocelot, GENMASK(9, 0), ANA_VLANMASK); in ocelot_vlan_init()
347 for (port = 0; port < ocelot->num_phys_ports; port++) { in ocelot_vlan_init()
348 ocelot_write_gix(ocelot, 0, REW_PORT_VLAN_CFG, port); in ocelot_vlan_init()
349 ocelot_write_gix(ocelot, 0, REW_TAG_CFG, port); in ocelot_vlan_init()
368 struct ocelot *ocelot = port->ocelot; in ocelot_port_adjust_link() local
453 ocelot_write_gix(ocelot, ANA_PFC_PFC_CFG_FC_LINK_SPEED(speed), in ocelot_port_adjust_link()
460 ocelot_write_rix(ocelot, SYS_PAUSE_CFG_PAUSE_ENA | in ocelot_port_adjust_link()
465 ocelot_write_rix(ocelot, QSYS_SWITCH_PORT_MODE_INGRESS_DROP_MODE | in ocelot_port_adjust_link()
471 ocelot_write_rix(ocelot, SYS_MAC_FC_CFG_PAUSE_VAL_CFG(0xffff) | in ocelot_port_adjust_link()
477 ocelot_write_rix(ocelot, 0, ANA_POL_FLOWC, p); in ocelot_port_adjust_link()
480 atop_wm = (ocelot->shared_queue_sz - 9 * VLAN_ETH_FRAME_LEN) / OCELOT_BUFFER_CELL_SZ; in ocelot_port_adjust_link()
481 ocelot_write_rix(ocelot, ocelot_wm_enc(9 * VLAN_ETH_FRAME_LEN), in ocelot_port_adjust_link()
483 ocelot_write(ocelot, ocelot_wm_enc(atop_wm), SYS_ATOP_TOT_CFG); in ocelot_port_adjust_link()
489 struct ocelot *ocelot = port->ocelot; in ocelot_port_open() local
495 ocelot_write_gix(ocelot, ANA_PORT_PORT_CFG_LEARNAUTO | in ocelot_port_open()
532 ocelot_rmw_rix(port->ocelot, 0, QSYS_SWITCH_PORT_MODE_PORT_ENA, in ocelot_port_stop()
561 struct ocelot *ocelot = port->ocelot; in ocelot_port_xmit() local
567 val = ocelot_read(ocelot, QS_INJ_STATUS); in ocelot_port_xmit()
572 ocelot_write_rix(ocelot, QS_INJ_CTRL_GAP_SIZE(1) | in ocelot_port_xmit()
580 if (ocelot->ptp && shinfo->tx_flags & SKBTX_HW_TSTAMP) { in ocelot_port_xmit()
589 ocelot_write_rix(ocelot, (__force u32)cpu_to_be32(ifh[i]), in ocelot_port_xmit()
595 ocelot_write_rix(ocelot, ((u32 *)skb->data)[i], QS_INJ_WR, grp); in ocelot_port_xmit()
600 ocelot_write_rix(ocelot, 0, QS_INJ_WR, grp); in ocelot_port_xmit()
605 ocelot_write_rix(ocelot, QS_INJ_CTRL_GAP_SIZE(1) | in ocelot_port_xmit()
611 ocelot_write_rix(ocelot, 0, QS_INJ_WR, grp); in ocelot_port_xmit()
617 if (ocelot->ptp && shinfo->tx_flags & SKBTX_HW_TSTAMP && in ocelot_port_xmit()
641 void ocelot_get_hwtimestamp(struct ocelot *ocelot, struct timespec64 *ts) in ocelot_get_hwtimestamp() argument
646 spin_lock_irqsave(&ocelot->ptp_clock_lock, flags); in ocelot_get_hwtimestamp()
649 val = ocelot_read_rix(ocelot, PTP_PIN_CFG, TOD_ACC_PIN); in ocelot_get_hwtimestamp()
653 ocelot_write_rix(ocelot, val, PTP_PIN_CFG, TOD_ACC_PIN); in ocelot_get_hwtimestamp()
654 ts->tv_sec = ocelot_read_rix(ocelot, PTP_PIN_TOD_SEC_LSB, TOD_ACC_PIN); in ocelot_get_hwtimestamp()
657 val = ocelot_read(ocelot, SYS_PTP_TXSTAMP); in ocelot_get_hwtimestamp()
664 spin_unlock_irqrestore(&ocelot->ptp_clock_lock, flags); in ocelot_get_hwtimestamp()
672 return ocelot_mact_forget(port->ocelot, addr, port->pvid); in ocelot_mc_unsync()
679 return ocelot_mact_learn(port->ocelot, PGID_CPU, addr, port->pvid, in ocelot_mc_sync()
686 struct ocelot *ocelot = port->ocelot; in ocelot_set_rx_mode() local
694 val = GENMASK(ocelot->num_phys_ports - 1, 0); in ocelot_set_rx_mode()
695 for (i = ocelot->num_phys_ports + 1; i < PGID_CPU; i++) in ocelot_set_rx_mode()
696 ocelot_write_rix(ocelot, val, ANA_PGID_PGID, i); in ocelot_set_rx_mode()
717 struct ocelot *ocelot = port->ocelot; in ocelot_port_set_mac_address() local
721 ocelot_mact_learn(ocelot, PGID_CPU, addr->sa_data, port->pvid, in ocelot_port_set_mac_address()
724 ocelot_mact_forget(ocelot, dev->dev_addr, port->pvid); in ocelot_port_set_mac_address()
734 struct ocelot *ocelot = port->ocelot; in ocelot_get_stats64() local
737 ocelot_write(ocelot, SYS_STAT_CFG_STAT_VIEW(port->chip_port), in ocelot_get_stats64()
741 stats->rx_bytes = ocelot_read(ocelot, SYS_COUNT_RX_OCTETS); in ocelot_get_stats64()
742 stats->rx_packets = ocelot_read(ocelot, SYS_COUNT_RX_SHORTS) + in ocelot_get_stats64()
743 ocelot_read(ocelot, SYS_COUNT_RX_FRAGMENTS) + in ocelot_get_stats64()
744 ocelot_read(ocelot, SYS_COUNT_RX_JABBERS) + in ocelot_get_stats64()
745 ocelot_read(ocelot, SYS_COUNT_RX_LONGS) + in ocelot_get_stats64()
746 ocelot_read(ocelot, SYS_COUNT_RX_64) + in ocelot_get_stats64()
747 ocelot_read(ocelot, SYS_COUNT_RX_65_127) + in ocelot_get_stats64()
748 ocelot_read(ocelot, SYS_COUNT_RX_128_255) + in ocelot_get_stats64()
749 ocelot_read(ocelot, SYS_COUNT_RX_256_1023) + in ocelot_get_stats64()
750 ocelot_read(ocelot, SYS_COUNT_RX_1024_1526) + in ocelot_get_stats64()
751 ocelot_read(ocelot, SYS_COUNT_RX_1527_MAX); in ocelot_get_stats64()
752 stats->multicast = ocelot_read(ocelot, SYS_COUNT_RX_MULTICAST); in ocelot_get_stats64()
756 stats->tx_bytes = ocelot_read(ocelot, SYS_COUNT_TX_OCTETS); in ocelot_get_stats64()
757 stats->tx_packets = ocelot_read(ocelot, SYS_COUNT_TX_64) + in ocelot_get_stats64()
758 ocelot_read(ocelot, SYS_COUNT_TX_65_127) + in ocelot_get_stats64()
759 ocelot_read(ocelot, SYS_COUNT_TX_128_511) + in ocelot_get_stats64()
760 ocelot_read(ocelot, SYS_COUNT_TX_512_1023) + in ocelot_get_stats64()
761 ocelot_read(ocelot, SYS_COUNT_TX_1024_1526) + in ocelot_get_stats64()
762 ocelot_read(ocelot, SYS_COUNT_TX_1527_MAX); in ocelot_get_stats64()
763 stats->tx_dropped = ocelot_read(ocelot, SYS_COUNT_TX_DROPS) + in ocelot_get_stats64()
764 ocelot_read(ocelot, SYS_COUNT_TX_AGING); in ocelot_get_stats64()
765 stats->collisions = ocelot_read(ocelot, SYS_COUNT_TX_COLLISION); in ocelot_get_stats64()
774 struct ocelot *ocelot = port->ocelot; in ocelot_fdb_add() local
790 return ocelot_mact_learn(ocelot, port->chip_port, addr, vid, in ocelot_fdb_add()
799 struct ocelot *ocelot = port->ocelot; in ocelot_fdb_del() local
801 return ocelot_mact_forget(ocelot, addr, vid); in ocelot_fdb_del()
856 struct ocelot *ocelot = port->ocelot; in ocelot_mact_read() local
861 ocelot_field_write(ocelot, ANA_TABLES_MACTINDX_M_INDEX, row); in ocelot_mact_read()
862 ocelot_field_write(ocelot, ANA_TABLES_MACTINDX_BUCKET, col); in ocelot_mact_read()
865 ocelot_write(ocelot, in ocelot_mact_read()
869 if (ocelot_mact_wait_for_completion(ocelot)) in ocelot_mact_read()
873 val = ocelot_read(ocelot, ANA_TABLES_MACACCESS); in ocelot_mact_read()
885 macl = ocelot_read(ocelot, ANA_TABLES_MACLDATA); in ocelot_mact_read()
886 mach = ocelot_read(ocelot, ANA_TABLES_MACHDATA); in ocelot_mact_read()
976 struct ocelot *ocelot = ocelot_port->ocelot; in ocelot_get_port_parent_id() local
978 ppid->id_len = sizeof(ocelot->base_mac); in ocelot_get_port_parent_id()
979 memcpy(&ppid->id, &ocelot->base_mac, ppid->id_len); in ocelot_get_port_parent_id()
986 struct ocelot *ocelot = port->ocelot; in ocelot_hwstamp_get() local
988 return copy_to_user(ifr->ifr_data, &ocelot->hwtstamp_config, in ocelot_hwstamp_get()
989 sizeof(ocelot->hwtstamp_config)) ? -EFAULT : 0; in ocelot_hwstamp_get()
994 struct ocelot *ocelot = port->ocelot; in ocelot_hwstamp_set() local
1022 mutex_lock(&ocelot->ptp_lock); in ocelot_hwstamp_set()
1045 mutex_unlock(&ocelot->ptp_lock); in ocelot_hwstamp_set()
1050 memcpy(&ocelot->hwtstamp_config, &cfg, sizeof(cfg)); in ocelot_hwstamp_set()
1051 mutex_unlock(&ocelot->ptp_lock); in ocelot_hwstamp_set()
1059 struct ocelot *ocelot = port->ocelot; in ocelot_ioctl() local
1062 if (!ocelot->ptp) in ocelot_ioctl()
1097 struct ocelot *ocelot = port->ocelot; in ocelot_get_strings() local
1103 for (i = 0; i < ocelot->num_stats; i++) in ocelot_get_strings()
1104 memcpy(data + i * ETH_GSTRING_LEN, ocelot->stats_layout[i].name, in ocelot_get_strings()
1108 static void ocelot_update_stats(struct ocelot *ocelot) in ocelot_update_stats() argument
1112 mutex_lock(&ocelot->stats_lock); in ocelot_update_stats()
1114 for (i = 0; i < ocelot->num_phys_ports; i++) { in ocelot_update_stats()
1116 ocelot_write(ocelot, SYS_STAT_CFG_STAT_VIEW(i), SYS_STAT_CFG); in ocelot_update_stats()
1118 for (j = 0; j < ocelot->num_stats; j++) { in ocelot_update_stats()
1120 unsigned int idx = i * ocelot->num_stats + j; in ocelot_update_stats()
1122 val = ocelot_read_rix(ocelot, SYS_COUNT_RX_OCTETS, in ocelot_update_stats()
1123 ocelot->stats_layout[j].offset); in ocelot_update_stats()
1125 if (val < (ocelot->stats[idx] & U32_MAX)) in ocelot_update_stats()
1126 ocelot->stats[idx] += (u64)1 << 32; in ocelot_update_stats()
1128 ocelot->stats[idx] = (ocelot->stats[idx] & in ocelot_update_stats()
1133 mutex_unlock(&ocelot->stats_lock); in ocelot_update_stats()
1139 struct ocelot *ocelot = container_of(del_work, struct ocelot, in ocelot_check_stats_work() local
1142 ocelot_update_stats(ocelot); in ocelot_check_stats_work()
1144 queue_delayed_work(ocelot->stats_queue, &ocelot->stats_work, in ocelot_check_stats_work()
1152 struct ocelot *ocelot = port->ocelot; in ocelot_get_ethtool_stats() local
1156 ocelot_update_stats(ocelot); in ocelot_get_ethtool_stats()
1159 for (i = 0; i < ocelot->num_stats; i++) in ocelot_get_ethtool_stats()
1160 *data++ = ocelot->stats[port->chip_port * ocelot->num_stats + i]; in ocelot_get_ethtool_stats()
1166 struct ocelot *ocelot = port->ocelot; in ocelot_get_sset_count() local
1170 return ocelot->num_stats; in ocelot_get_sset_count()
1177 struct ocelot *ocelot = ocelot_port->ocelot; in ocelot_get_ts_info() local
1179 if (!ocelot->ptp) in ocelot_get_ts_info()
1182 info->phc_index = ocelot->ptp_clock ? in ocelot_get_ts_info()
1183 ptp_clock_index(ocelot->ptp_clock) : -1; in ocelot_get_ts_info()
1210 struct ocelot *ocelot = ocelot_port->ocelot; in ocelot_port_attr_stp_state_set() local
1217 if (!(BIT(ocelot_port->chip_port) & ocelot->bridge_mask)) in ocelot_port_attr_stp_state_set()
1220 port_cfg = ocelot_read_gix(ocelot, ANA_PORT_PORT_CFG, in ocelot_port_attr_stp_state_set()
1225 ocelot->bridge_fwd_mask |= BIT(ocelot_port->chip_port); in ocelot_port_attr_stp_state_set()
1233 ocelot->bridge_fwd_mask &= ~BIT(ocelot_port->chip_port); in ocelot_port_attr_stp_state_set()
1237 ocelot_write_gix(ocelot, port_cfg, ANA_PORT_PORT_CFG, in ocelot_port_attr_stp_state_set()
1243 for (port = 0; port < ocelot->num_phys_ports; port++) { in ocelot_port_attr_stp_state_set()
1244 if (ocelot->bridge_fwd_mask & BIT(port)) { in ocelot_port_attr_stp_state_set()
1245 unsigned long mask = ocelot->bridge_fwd_mask & ~BIT(port); in ocelot_port_attr_stp_state_set()
1247 for (i = 0; i < ocelot->num_phys_ports; i++) { in ocelot_port_attr_stp_state_set()
1248 unsigned long bond_mask = ocelot->lags[i]; in ocelot_port_attr_stp_state_set()
1259 ocelot_write_rix(ocelot, in ocelot_port_attr_stp_state_set()
1260 BIT(ocelot->num_phys_ports) | mask, in ocelot_port_attr_stp_state_set()
1266 ocelot_write_rix(ocelot, in ocelot_port_attr_stp_state_set()
1267 BIT(ocelot->num_phys_ports), in ocelot_port_attr_stp_state_set()
1278 struct ocelot *ocelot = ocelot_port->ocelot; in ocelot_port_attr_ageing_set() local
1282 ocelot_write(ocelot, ANA_AUTOAGE_AGE_PERIOD(ageing_time / 2), in ocelot_port_attr_ageing_set()
1288 struct ocelot *ocelot = port->ocelot; in ocelot_port_attr_mc_set() local
1289 u32 val = ocelot_read_gix(ocelot, ANA_PORT_CPU_FWD_CFG, in ocelot_port_attr_mc_set()
1301 ocelot_write_gix(ocelot, val, ANA_PORT_CPU_FWD_CFG, port->chip_port); in ocelot_port_attr_mc_set()
1321 ocelot_vlan_port_apply(ocelot_port->ocelot, ocelot_port); in ocelot_port_attr_set()
1368 static struct ocelot_multicast *ocelot_multicast_get(struct ocelot *ocelot, in ocelot_multicast_get() argument
1374 list_for_each_entry(mc, &ocelot->multicast, list) { in ocelot_multicast_get()
1387 struct ocelot *ocelot = port->ocelot; in ocelot_port_obj_add_mdb() local
1396 mc = ocelot_multicast_get(ocelot, mdb->addr, vid); in ocelot_port_obj_add_mdb()
1398 mc = devm_kzalloc(ocelot->dev, sizeof(*mc), GFP_KERNEL); in ocelot_port_obj_add_mdb()
1405 list_add_tail(&mc->list, &ocelot->multicast); in ocelot_port_obj_add_mdb()
1415 ocelot_mact_forget(ocelot, addr, vid); in ocelot_port_obj_add_mdb()
1422 return ocelot_mact_learn(ocelot, 0, addr, vid, ENTRYTYPE_MACv4); in ocelot_port_obj_add_mdb()
1429 struct ocelot *ocelot = port->ocelot; in ocelot_port_obj_del_mdb() local
1437 mc = ocelot_multicast_get(ocelot, mdb->addr, vid); in ocelot_port_obj_del_mdb()
1445 ocelot_mact_forget(ocelot, addr, vid); in ocelot_port_obj_del_mdb()
1450 devm_kfree(ocelot->dev, mc); in ocelot_port_obj_del_mdb()
1457 return ocelot_mact_learn(ocelot, 0, addr, vid, ENTRYTYPE_MACv4); in ocelot_port_obj_del_mdb()
1507 struct ocelot *ocelot = ocelot_port->ocelot; in ocelot_port_bridge_join() local
1509 if (!ocelot->bridge_mask) { in ocelot_port_bridge_join()
1510 ocelot->hw_bridge_dev = bridge; in ocelot_port_bridge_join()
1512 if (ocelot->hw_bridge_dev != bridge) in ocelot_port_bridge_join()
1518 ocelot->bridge_mask |= BIT(ocelot_port->chip_port); in ocelot_port_bridge_join()
1526 struct ocelot *ocelot = ocelot_port->ocelot; in ocelot_port_bridge_leave() local
1528 ocelot->bridge_mask &= ~BIT(ocelot_port->chip_port); in ocelot_port_bridge_leave()
1530 if (!ocelot->bridge_mask) in ocelot_port_bridge_leave()
1531 ocelot->hw_bridge_dev = NULL; in ocelot_port_bridge_leave()
1539 static void ocelot_set_aggr_pgids(struct ocelot *ocelot) in ocelot_set_aggr_pgids() argument
1544 for (port = 0; port < ocelot->num_phys_ports; port++) in ocelot_set_aggr_pgids()
1545 ocelot_write_rix(ocelot, BIT(port), ANA_PGID_PGID, port); in ocelot_set_aggr_pgids()
1548 ocelot_write_rix(ocelot, GENMASK(ocelot->num_phys_ports - 1, 0), in ocelot_set_aggr_pgids()
1552 for (lag = 0; lag < ocelot->num_phys_ports; lag++) { in ocelot_set_aggr_pgids()
1557 bond_mask = ocelot->lags[lag]; in ocelot_set_aggr_pgids()
1561 for_each_set_bit(port, &bond_mask, ocelot->num_phys_ports) { in ocelot_set_aggr_pgids()
1563 ocelot_write_rix(ocelot, bond_mask, in ocelot_set_aggr_pgids()
1572 ac = ocelot_read_rix(ocelot, ANA_PGID_PGID, i); in ocelot_set_aggr_pgids()
1575 ocelot_write_rix(ocelot, ac, ANA_PGID_PGID, i); in ocelot_set_aggr_pgids()
1580 static void ocelot_setup_lag(struct ocelot *ocelot, int lag) in ocelot_setup_lag() argument
1582 unsigned long bond_mask = ocelot->lags[lag]; in ocelot_setup_lag()
1585 for_each_set_bit(p, &bond_mask, ocelot->num_phys_ports) { in ocelot_setup_lag()
1586 u32 port_cfg = ocelot_read_gix(ocelot, ANA_PORT_PORT_CFG, p); in ocelot_setup_lag()
1591 ocelot_write_gix(ocelot, port_cfg | in ocelot_setup_lag()
1600 struct ocelot *ocelot = ocelot_port->ocelot; in ocelot_port_lag_join() local
1621 ocelot->lags[p] = bond_mask; in ocelot_port_lag_join()
1625 ocelot->lags[lp] = 0; in ocelot_port_lag_join()
1629 ocelot->lags[lp] |= BIT(p); in ocelot_port_lag_join()
1632 ocelot_setup_lag(ocelot, lag); in ocelot_port_lag_join()
1633 ocelot_set_aggr_pgids(ocelot); in ocelot_port_lag_join()
1641 struct ocelot *ocelot = ocelot_port->ocelot; in ocelot_port_lag_leave() local
1647 for (i = 0; i < ocelot->num_phys_ports; i++) in ocelot_port_lag_leave()
1648 ocelot->lags[i] &= ~BIT(ocelot_port->chip_port); in ocelot_port_lag_leave()
1653 if (ocelot->lags[p]) { in ocelot_port_lag_leave()
1654 int n = __ffs(ocelot->lags[p]); in ocelot_port_lag_leave()
1656 ocelot->lags[n] = ocelot->lags[p]; in ocelot_port_lag_leave()
1657 ocelot->lags[p] = 0; in ocelot_port_lag_leave()
1659 ocelot_setup_lag(ocelot, n); in ocelot_port_lag_leave()
1662 port_cfg = ocelot_read_gix(ocelot, ANA_PORT_PORT_CFG, p); in ocelot_port_lag_leave()
1664 ocelot_write_gix(ocelot, port_cfg | ANA_PORT_PORT_CFG_PORTID_VAL(p), in ocelot_port_lag_leave()
1667 ocelot_set_aggr_pgids(ocelot); in ocelot_port_lag_leave()
1693 ocelot_vlan_port_apply(ocelot_port->ocelot, in ocelot_netdevice_port_event()
1816 struct ocelot *ocelot = container_of(ptp, struct ocelot, ptp_info); in ocelot_ptp_gettime64() local
1822 spin_lock_irqsave(&ocelot->ptp_clock_lock, flags); in ocelot_ptp_gettime64()
1824 val = ocelot_read_rix(ocelot, PTP_PIN_CFG, TOD_ACC_PIN); in ocelot_ptp_gettime64()
1827 ocelot_write_rix(ocelot, val, PTP_PIN_CFG, TOD_ACC_PIN); in ocelot_ptp_gettime64()
1829 s = ocelot_read_rix(ocelot, PTP_PIN_TOD_SEC_MSB, TOD_ACC_PIN) & 0xffff; in ocelot_ptp_gettime64()
1831 s += ocelot_read_rix(ocelot, PTP_PIN_TOD_SEC_LSB, TOD_ACC_PIN); in ocelot_ptp_gettime64()
1832 ns = ocelot_read_rix(ocelot, PTP_PIN_TOD_NSEC, TOD_ACC_PIN); in ocelot_ptp_gettime64()
1834 spin_unlock_irqrestore(&ocelot->ptp_clock_lock, flags); in ocelot_ptp_gettime64()
1851 struct ocelot *ocelot = container_of(ptp, struct ocelot, ptp_info); in ocelot_ptp_settime64() local
1855 spin_lock_irqsave(&ocelot->ptp_clock_lock, flags); in ocelot_ptp_settime64()
1857 val = ocelot_read_rix(ocelot, PTP_PIN_CFG, TOD_ACC_PIN); in ocelot_ptp_settime64()
1861 ocelot_write_rix(ocelot, val, PTP_PIN_CFG, TOD_ACC_PIN); in ocelot_ptp_settime64()
1863 ocelot_write_rix(ocelot, lower_32_bits(ts->tv_sec), PTP_PIN_TOD_SEC_LSB, in ocelot_ptp_settime64()
1865 ocelot_write_rix(ocelot, upper_32_bits(ts->tv_sec), PTP_PIN_TOD_SEC_MSB, in ocelot_ptp_settime64()
1867 ocelot_write_rix(ocelot, ts->tv_nsec, PTP_PIN_TOD_NSEC, TOD_ACC_PIN); in ocelot_ptp_settime64()
1869 val = ocelot_read_rix(ocelot, PTP_PIN_CFG, TOD_ACC_PIN); in ocelot_ptp_settime64()
1873 ocelot_write_rix(ocelot, val, PTP_PIN_CFG, TOD_ACC_PIN); in ocelot_ptp_settime64()
1875 spin_unlock_irqrestore(&ocelot->ptp_clock_lock, flags); in ocelot_ptp_settime64()
1882 struct ocelot *ocelot = container_of(ptp, struct ocelot, ptp_info); in ocelot_ptp_adjtime() local
1886 spin_lock_irqsave(&ocelot->ptp_clock_lock, flags); in ocelot_ptp_adjtime()
1888 val = ocelot_read_rix(ocelot, PTP_PIN_CFG, TOD_ACC_PIN); in ocelot_ptp_adjtime()
1892 ocelot_write_rix(ocelot, val, PTP_PIN_CFG, TOD_ACC_PIN); in ocelot_ptp_adjtime()
1894 ocelot_write_rix(ocelot, 0, PTP_PIN_TOD_SEC_LSB, TOD_ACC_PIN); in ocelot_ptp_adjtime()
1895 ocelot_write_rix(ocelot, 0, PTP_PIN_TOD_SEC_MSB, TOD_ACC_PIN); in ocelot_ptp_adjtime()
1896 ocelot_write_rix(ocelot, delta, PTP_PIN_TOD_NSEC, TOD_ACC_PIN); in ocelot_ptp_adjtime()
1898 val = ocelot_read_rix(ocelot, PTP_PIN_CFG, TOD_ACC_PIN); in ocelot_ptp_adjtime()
1902 ocelot_write_rix(ocelot, val, PTP_PIN_CFG, TOD_ACC_PIN); in ocelot_ptp_adjtime()
1904 spin_unlock_irqrestore(&ocelot->ptp_clock_lock, flags); in ocelot_ptp_adjtime()
1922 struct ocelot *ocelot = container_of(ptp, struct ocelot, ptp_info); in ocelot_ptp_adjfine() local
1927 spin_lock_irqsave(&ocelot->ptp_clock_lock, flags); in ocelot_ptp_adjfine()
1951 ocelot_write(ocelot, unit | adj, PTP_CLK_CFG_ADJ_FREQ); in ocelot_ptp_adjfine()
1952 ocelot_write(ocelot, PTP_CFG_CLK_ADJ_CFG_ENA | direction, in ocelot_ptp_adjfine()
1955 spin_unlock_irqrestore(&ocelot->ptp_clock_lock, flags); in ocelot_ptp_adjfine()
1959 ocelot_write(ocelot, 0, PTP_CLK_CFG_ADJ_CFG); in ocelot_ptp_adjfine()
1961 spin_unlock_irqrestore(&ocelot->ptp_clock_lock, flags); in ocelot_ptp_adjfine()
1980 static int ocelot_init_timestamp(struct ocelot *ocelot) in ocelot_init_timestamp() argument
1984 ocelot->ptp_info = ocelot_ptp_clock_info; in ocelot_init_timestamp()
1985 ptp_clock = ptp_clock_register(&ocelot->ptp_info, ocelot->dev); in ocelot_init_timestamp()
1992 ocelot->ptp_clock = ptp_clock; in ocelot_init_timestamp()
1994 ocelot_write(ocelot, SYS_PTP_CFG_PTP_STAMP_WID(30), SYS_PTP_CFG); in ocelot_init_timestamp()
1995 ocelot_write(ocelot, 0xffffffff, ANA_TABLES_PTP_ID_LOW); in ocelot_init_timestamp()
1996 ocelot_write(ocelot, 0xffffffff, ANA_TABLES_PTP_ID_HIGH); in ocelot_init_timestamp()
1998 ocelot_write(ocelot, PTP_CFG_MISC_PTP_EN, PTP_CFG_MISC); in ocelot_init_timestamp()
2003 ocelot->hwtstamp_config.rx_filter = HWTSTAMP_FILTER_PTP_V2_EVENT; in ocelot_init_timestamp()
2008 int ocelot_probe_port(struct ocelot *ocelot, u8 port, in ocelot_probe_port() argument
2019 SET_NETDEV_DEV(dev, ocelot->dev); in ocelot_probe_port()
2022 ocelot_port->ocelot = ocelot; in ocelot_probe_port()
2026 ocelot->ports[port] = ocelot_port; in ocelot_probe_port()
2035 memcpy(dev->dev_addr, ocelot->base_mac, ETH_ALEN); in ocelot_probe_port()
2037 ocelot_mact_learn(ocelot, PGID_CPU, dev->dev_addr, ocelot_port->pvid, in ocelot_probe_port()
2044 dev_err(ocelot->dev, "register_netdev failed\n"); in ocelot_probe_port()
2049 ocelot_vlan_port_apply(ocelot, ocelot_port); in ocelot_probe_port()
2052 ocelot_vcap_enable(ocelot, ocelot_port); in ocelot_probe_port()
2062 int ocelot_init(struct ocelot *ocelot) in ocelot_init() argument
2065 int i, ret, cpu = ocelot->num_phys_ports; in ocelot_init()
2068 ocelot->lags = devm_kcalloc(ocelot->dev, ocelot->num_phys_ports, in ocelot_init()
2070 if (!ocelot->lags) in ocelot_init()
2073 ocelot->stats = devm_kcalloc(ocelot->dev, in ocelot_init()
2074 ocelot->num_phys_ports * ocelot->num_stats, in ocelot_init()
2076 if (!ocelot->stats) in ocelot_init()
2079 mutex_init(&ocelot->stats_lock); in ocelot_init()
2080 mutex_init(&ocelot->ptp_lock); in ocelot_init()
2081 spin_lock_init(&ocelot->ptp_clock_lock); in ocelot_init()
2083 dev_name(ocelot->dev)); in ocelot_init()
2084 ocelot->stats_queue = create_singlethread_workqueue(queue_name); in ocelot_init()
2085 if (!ocelot->stats_queue) in ocelot_init()
2088 ocelot_mact_init(ocelot); in ocelot_init()
2089 ocelot_vlan_init(ocelot); in ocelot_init()
2090 ocelot_ace_init(ocelot); in ocelot_init()
2092 for (port = 0; port < ocelot->num_phys_ports; port++) { in ocelot_init()
2094 ocelot_write(ocelot, SYS_STAT_CFG_STAT_VIEW(port) | in ocelot_init()
2100 ocelot_write(ocelot, ETH_P_8021AD, SYS_VLAN_ETYPE_CFG); in ocelot_init()
2103 ocelot_write(ocelot, ANA_AGGR_CFG_AC_SMAC_ENA | in ocelot_init()
2111 ocelot_write(ocelot, in ocelot_init()
2116 regmap_field_write(ocelot->regfields[ANA_ADVLEARN_VLAN_CHK], 1); in ocelot_init()
2119 ocelot_write(ocelot, SYS_FRM_AGING_AGE_TX_ENA | in ocelot_init()
2123 ocelot_write_rix(ocelot, ANA_FLOODING_FLD_MULTICAST(PGID_MC) | in ocelot_init()
2127 ocelot_write(ocelot, ANA_FLOODING_IPMC_FLD_MC6_DATA(PGID_MCIPV6) | in ocelot_init()
2133 for (port = 0; port < ocelot->num_phys_ports; port++) { in ocelot_init()
2135 ocelot_write_rix(ocelot, BIT(port), ANA_PGID_PGID, port); in ocelot_init()
2137 ocelot_write_gix(ocelot, in ocelot_init()
2142 ocelot_write_rix(ocelot, 0, ANA_PGID_PGID, PGID_SRC + port); in ocelot_init()
2146 ocelot_write_rix(ocelot, 0, ANA_PGID_PGID, cpu); in ocelot_init()
2147 ocelot_write_rix(ocelot, BIT(cpu), ANA_PGID_PGID, PGID_CPU); in ocelot_init()
2148 ocelot_write_gix(ocelot, ANA_PORT_PORT_CFG_RECV_ENA | in ocelot_init()
2153 for (i = ocelot->num_phys_ports + 1; i < PGID_CPU; i++) { in ocelot_init()
2154 u32 val = ANA_PGID_PGID_PGID(GENMASK(ocelot->num_phys_ports - 1, 0)); in ocelot_init()
2156 ocelot_write_rix(ocelot, val, ANA_PGID_PGID, i); in ocelot_init()
2158 ocelot_write_rix(ocelot, in ocelot_init()
2159 ANA_PGID_PGID_PGID(GENMASK(ocelot->num_phys_ports, 0)), in ocelot_init()
2161 ocelot_write_rix(ocelot, 0, ANA_PGID_PGID, PGID_MCIPV4); in ocelot_init()
2162 ocelot_write_rix(ocelot, 0, ANA_PGID_PGID, PGID_MCIPV6); in ocelot_init()
2165 ocelot_write_rix(ocelot, QSYS_SWITCH_PORT_MODE_INGRESS_DROP_MODE | in ocelot_init()
2169 ocelot_write_rix(ocelot, SYS_PORT_MODE_INCL_XTR_HDR(1) | in ocelot_init()
2174 ocelot_write_rix(ocelot, QS_INJ_GRP_CFG_BYTE_SWAP | in ocelot_init()
2176 ocelot_write_rix(ocelot, QS_XTR_GRP_CFG_BYTE_SWAP | in ocelot_init()
2178 ocelot_write(ocelot, ANA_CPUQ_CFG_CPUQ_MIRROR(2) | in ocelot_init()
2188 ocelot_write_rix(ocelot, ANA_CPUQ_8021_CFG_CPUQ_GARP_VAL(6) | in ocelot_init()
2192 INIT_DELAYED_WORK(&ocelot->stats_work, ocelot_check_stats_work); in ocelot_init()
2193 queue_delayed_work(ocelot->stats_queue, &ocelot->stats_work, in ocelot_init()
2196 if (ocelot->ptp) { in ocelot_init()
2197 ret = ocelot_init_timestamp(ocelot); in ocelot_init()
2199 dev_err(ocelot->dev, in ocelot_init()
2209 void ocelot_deinit(struct ocelot *ocelot) in ocelot_deinit() argument
2216 cancel_delayed_work(&ocelot->stats_work); in ocelot_deinit()
2217 destroy_workqueue(ocelot->stats_queue); in ocelot_deinit()
2218 mutex_destroy(&ocelot->stats_lock); in ocelot_deinit()
2220 if (ocelot->ptp_clock) in ocelot_deinit()
2221 ptp_clock_unregister(ocelot->ptp_clock); in ocelot_deinit()
2223 for (i = 0; i < ocelot->num_phys_ports; i++) { in ocelot_deinit()
2224 port = ocelot->ports[i]; in ocelot_deinit()