Lines Matching full:ale
30 /* ALE Registers */
41 /* ALE NetCP NU switch specific Registers */
56 * struct ale_entry_fld - The ALE tbl entry field description
75 * struct cpsw_ale_dev_id - The ALE version/SoC specific configuration
76 * @dev_id: ALE version/SoC id
77 * @features: features supported by ALE
78 * @tbl_entries: number of ALE entries
79 * @major_ver_mask: mask of ALE Major Version Value in ALE_IDVER reg.
80 * @nu_switch_ale: NU Switch ALE
81 * @vlan_entry_tbl: ALE vlan entry fields description tbl
217 static int cpsw_ale_entry_get_fld(struct cpsw_ale *ale, in cpsw_ale_entry_get_fld() argument
225 if (!ale || !ale_entry) in cpsw_ale_entry_get_fld()
230 dev_err(ale->params.dev, "get: wrong ale fld id %d\n", fld_id); in cpsw_ale_entry_get_fld()
236 bits = ale->port_mask_bits; in cpsw_ale_entry_get_fld()
241 static void cpsw_ale_entry_set_fld(struct cpsw_ale *ale, in cpsw_ale_entry_set_fld() argument
250 if (!ale || !ale_entry) in cpsw_ale_entry_set_fld()
255 dev_err(ale->params.dev, "set: wrong ale fld id %d\n", fld_id); in cpsw_ale_entry_set_fld()
261 bits = ale->port_mask_bits; in cpsw_ale_entry_set_fld()
266 static int cpsw_ale_vlan_get_fld(struct cpsw_ale *ale, in cpsw_ale_vlan_get_fld() argument
270 return cpsw_ale_entry_get_fld(ale, ale_entry, in cpsw_ale_vlan_get_fld()
271 ale->vlan_entry_tbl, fld_id); in cpsw_ale_vlan_get_fld()
274 static void cpsw_ale_vlan_set_fld(struct cpsw_ale *ale, in cpsw_ale_vlan_set_fld() argument
279 cpsw_ale_entry_set_fld(ale, ale_entry, in cpsw_ale_vlan_set_fld()
280 ale->vlan_entry_tbl, fld_id, value); in cpsw_ale_vlan_set_fld()
283 /* The MAC address field in the ALE entry cannot be macroized as above */
300 static int cpsw_ale_read(struct cpsw_ale *ale, int idx, u32 *ale_entry) in cpsw_ale_read() argument
304 WARN_ON(idx > ale->params.ale_entries); in cpsw_ale_read()
306 writel_relaxed(idx, ale->params.ale_regs + ALE_TABLE_CONTROL); in cpsw_ale_read()
309 ale_entry[i] = readl_relaxed(ale->params.ale_regs + in cpsw_ale_read()
315 static int cpsw_ale_write(struct cpsw_ale *ale, int idx, u32 *ale_entry) in cpsw_ale_write() argument
319 WARN_ON(idx > ale->params.ale_entries); in cpsw_ale_write()
322 writel_relaxed(ale_entry[i], ale->params.ale_regs + in cpsw_ale_write()
325 writel_relaxed(idx | ALE_TABLE_WRITE, ale->params.ale_regs + in cpsw_ale_write()
331 static int cpsw_ale_match_addr(struct cpsw_ale *ale, const u8 *addr, u16 vid) in cpsw_ale_match_addr() argument
336 for (idx = 0; idx < ale->params.ale_entries; idx++) { in cpsw_ale_match_addr()
339 cpsw_ale_read(ale, idx, ale_entry); in cpsw_ale_match_addr()
352 static int cpsw_ale_match_vlan(struct cpsw_ale *ale, u16 vid) in cpsw_ale_match_vlan() argument
357 for (idx = 0; idx < ale->params.ale_entries; idx++) { in cpsw_ale_match_vlan()
358 cpsw_ale_read(ale, idx, ale_entry); in cpsw_ale_match_vlan()
368 static int cpsw_ale_match_free(struct cpsw_ale *ale) in cpsw_ale_match_free() argument
373 for (idx = 0; idx < ale->params.ale_entries; idx++) { in cpsw_ale_match_free()
374 cpsw_ale_read(ale, idx, ale_entry); in cpsw_ale_match_free()
382 static int cpsw_ale_find_ageable(struct cpsw_ale *ale) in cpsw_ale_find_ageable() argument
387 for (idx = 0; idx < ale->params.ale_entries; idx++) { in cpsw_ale_find_ageable()
388 cpsw_ale_read(ale, idx, ale_entry); in cpsw_ale_find_ageable()
402 static void cpsw_ale_flush_mcast(struct cpsw_ale *ale, u32 *ale_entry, in cpsw_ale_flush_mcast() argument
408 ale->port_mask_bits); in cpsw_ale_flush_mcast()
416 ale->port_mask_bits); in cpsw_ale_flush_mcast()
421 int cpsw_ale_flush_multicast(struct cpsw_ale *ale, int port_mask, int vid) in cpsw_ale_flush_multicast() argument
426 for (idx = 0; idx < ale->params.ale_entries; idx++) { in cpsw_ale_flush_multicast()
427 cpsw_ale_read(ale, idx, ale_entry); in cpsw_ale_flush_multicast()
448 cpsw_ale_flush_mcast(ale, ale_entry, port_mask); in cpsw_ale_flush_multicast()
451 cpsw_ale_write(ale, idx, ale_entry); in cpsw_ale_flush_multicast()
467 int cpsw_ale_add_ucast(struct cpsw_ale *ale, const u8 *addr, int port, in cpsw_ale_add_ucast() argument
479 cpsw_ale_set_port_num(ale_entry, port, ale->port_num_bits); in cpsw_ale_add_ucast()
481 idx = cpsw_ale_match_addr(ale, addr, (flags & ALE_VLAN) ? vid : 0); in cpsw_ale_add_ucast()
483 idx = cpsw_ale_match_free(ale); in cpsw_ale_add_ucast()
485 idx = cpsw_ale_find_ageable(ale); in cpsw_ale_add_ucast()
489 cpsw_ale_write(ale, idx, ale_entry); in cpsw_ale_add_ucast()
493 int cpsw_ale_del_ucast(struct cpsw_ale *ale, const u8 *addr, int port, in cpsw_ale_del_ucast() argument
499 idx = cpsw_ale_match_addr(ale, addr, (flags & ALE_VLAN) ? vid : 0); in cpsw_ale_del_ucast()
504 cpsw_ale_write(ale, idx, ale_entry); in cpsw_ale_del_ucast()
508 int cpsw_ale_add_mcast(struct cpsw_ale *ale, const u8 *addr, int port_mask, in cpsw_ale_add_mcast() argument
514 idx = cpsw_ale_match_addr(ale, addr, (flags & ALE_VLAN) ? vid : 0); in cpsw_ale_add_mcast()
516 cpsw_ale_read(ale, idx, ale_entry); in cpsw_ale_add_mcast()
525 ale->port_mask_bits); in cpsw_ale_add_mcast()
528 ale->port_mask_bits); in cpsw_ale_add_mcast()
531 idx = cpsw_ale_match_free(ale); in cpsw_ale_add_mcast()
533 idx = cpsw_ale_find_ageable(ale); in cpsw_ale_add_mcast()
537 cpsw_ale_write(ale, idx, ale_entry); in cpsw_ale_add_mcast()
541 int cpsw_ale_del_mcast(struct cpsw_ale *ale, const u8 *addr, int port_mask, in cpsw_ale_del_mcast() argument
548 idx = cpsw_ale_match_addr(ale, addr, (flags & ALE_VLAN) ? vid : 0); in cpsw_ale_del_mcast()
552 cpsw_ale_read(ale, idx, ale_entry); in cpsw_ale_del_mcast()
556 ale->port_mask_bits); in cpsw_ale_del_mcast()
562 ale->port_mask_bits); in cpsw_ale_del_mcast()
566 cpsw_ale_write(ale, idx, ale_entry); in cpsw_ale_del_mcast()
570 /* ALE NetCP NU switch specific vlan functions */
571 static void cpsw_ale_set_vlan_mcast(struct cpsw_ale *ale, u32 *ale_entry, in cpsw_ale_set_vlan_mcast() argument
577 idx = cpsw_ale_vlan_get_fld(ale, ale_entry, in cpsw_ale_set_vlan_mcast()
579 writel(reg_mcast, ale->params.ale_regs + ALE_VLAN_MASK_MUX(idx)); in cpsw_ale_set_vlan_mcast()
582 idx = cpsw_ale_vlan_get_fld(ale, ale_entry, in cpsw_ale_set_vlan_mcast()
584 writel(unreg_mcast, ale->params.ale_regs + ALE_VLAN_MASK_MUX(idx)); in cpsw_ale_set_vlan_mcast()
587 static void cpsw_ale_set_vlan_untag(struct cpsw_ale *ale, u32 *ale_entry, in cpsw_ale_set_vlan_untag() argument
590 cpsw_ale_vlan_set_fld(ale, ale_entry, in cpsw_ale_set_vlan_untag()
594 bitmap_set(ale->p0_untag_vid_mask, vid, 1); in cpsw_ale_set_vlan_untag()
596 bitmap_clear(ale->p0_untag_vid_mask, vid, 1); in cpsw_ale_set_vlan_untag()
599 int cpsw_ale_add_vlan(struct cpsw_ale *ale, u16 vid, int port_mask, int untag, in cpsw_ale_add_vlan() argument
605 idx = cpsw_ale_match_vlan(ale, vid); in cpsw_ale_add_vlan()
607 cpsw_ale_read(ale, idx, ale_entry); in cpsw_ale_add_vlan()
611 cpsw_ale_set_vlan_untag(ale, ale_entry, vid, untag); in cpsw_ale_add_vlan()
613 if (!ale->params.nu_switch_ale) { in cpsw_ale_add_vlan()
614 cpsw_ale_vlan_set_fld(ale, ale_entry, in cpsw_ale_add_vlan()
616 cpsw_ale_vlan_set_fld(ale, ale_entry, in cpsw_ale_add_vlan()
619 cpsw_ale_vlan_set_fld(ale, ale_entry, in cpsw_ale_add_vlan()
622 cpsw_ale_set_vlan_mcast(ale, ale_entry, reg_mcast, unreg_mcast); in cpsw_ale_add_vlan()
625 cpsw_ale_vlan_set_fld(ale, ale_entry, in cpsw_ale_add_vlan()
629 idx = cpsw_ale_match_free(ale); in cpsw_ale_add_vlan()
631 idx = cpsw_ale_find_ageable(ale); in cpsw_ale_add_vlan()
635 cpsw_ale_write(ale, idx, ale_entry); in cpsw_ale_add_vlan()
639 static void cpsw_ale_vlan_del_modify_int(struct cpsw_ale *ale, u32 *ale_entry, in cpsw_ale_vlan_del_modify_int() argument
645 members = cpsw_ale_vlan_get_fld(ale, ale_entry, in cpsw_ale_vlan_del_modify_int()
649 cpsw_ale_set_vlan_untag(ale, ale_entry, vid, 0); in cpsw_ale_vlan_del_modify_int()
654 untag = cpsw_ale_vlan_get_fld(ale, ale_entry, in cpsw_ale_vlan_del_modify_int()
656 reg_mcast = cpsw_ale_vlan_get_fld(ale, ale_entry, in cpsw_ale_vlan_del_modify_int()
658 unreg_mcast = cpsw_ale_vlan_get_fld(ale, ale_entry, in cpsw_ale_vlan_del_modify_int()
664 cpsw_ale_set_vlan_untag(ale, ale_entry, vid, untag); in cpsw_ale_vlan_del_modify_int()
666 if (!ale->params.nu_switch_ale) { in cpsw_ale_vlan_del_modify_int()
667 cpsw_ale_vlan_set_fld(ale, ale_entry, in cpsw_ale_vlan_del_modify_int()
669 cpsw_ale_vlan_set_fld(ale, ale_entry, in cpsw_ale_vlan_del_modify_int()
672 cpsw_ale_set_vlan_mcast(ale, ale_entry, reg_mcast, in cpsw_ale_vlan_del_modify_int()
675 cpsw_ale_vlan_set_fld(ale, ale_entry, in cpsw_ale_vlan_del_modify_int()
679 int cpsw_ale_vlan_del_modify(struct cpsw_ale *ale, u16 vid, int port_mask) in cpsw_ale_vlan_del_modify() argument
684 idx = cpsw_ale_match_vlan(ale, vid); in cpsw_ale_vlan_del_modify()
688 cpsw_ale_read(ale, idx, ale_entry); in cpsw_ale_vlan_del_modify()
690 cpsw_ale_vlan_del_modify_int(ale, ale_entry, vid, port_mask); in cpsw_ale_vlan_del_modify()
691 cpsw_ale_write(ale, idx, ale_entry); in cpsw_ale_vlan_del_modify()
696 int cpsw_ale_del_vlan(struct cpsw_ale *ale, u16 vid, int port_mask) in cpsw_ale_del_vlan() argument
701 idx = cpsw_ale_match_vlan(ale, vid); in cpsw_ale_del_vlan()
705 cpsw_ale_read(ale, idx, ale_entry); in cpsw_ale_del_vlan()
711 * remove port_mask ports from VLAN ALE entry excluding Host port. in cpsw_ale_del_vlan()
713 members = cpsw_ale_vlan_get_fld(ale, ale_entry, ALE_ENT_VID_MEMBER_LIST); in cpsw_ale_del_vlan()
718 cpsw_ale_set_vlan_untag(ale, ale_entry, vid, 0); in cpsw_ale_del_vlan()
722 cpsw_ale_vlan_del_modify_int(ale, ale_entry, vid, port_mask); in cpsw_ale_del_vlan()
725 cpsw_ale_write(ale, idx, ale_entry); in cpsw_ale_del_vlan()
730 int cpsw_ale_vlan_add_modify(struct cpsw_ale *ale, u16 vid, int port_mask, in cpsw_ale_vlan_add_modify() argument
738 idx = cpsw_ale_match_vlan(ale, vid); in cpsw_ale_vlan_add_modify()
740 cpsw_ale_read(ale, idx, ale_entry); in cpsw_ale_vlan_add_modify()
742 vlan_members = cpsw_ale_vlan_get_fld(ale, ale_entry, in cpsw_ale_vlan_add_modify()
744 reg_mcast_members = cpsw_ale_vlan_get_fld(ale, ale_entry, in cpsw_ale_vlan_add_modify()
747 cpsw_ale_vlan_get_fld(ale, ale_entry, in cpsw_ale_vlan_add_modify()
749 untag_members = cpsw_ale_vlan_get_fld(ale, ale_entry, in cpsw_ale_vlan_add_modify()
757 ret = cpsw_ale_add_vlan(ale, vid, vlan_members, untag_members, in cpsw_ale_vlan_add_modify()
760 dev_err(ale->params.dev, "Unable to add vlan\n"); in cpsw_ale_vlan_add_modify()
763 dev_dbg(ale->params.dev, "port mask 0x%x untag 0x%x\n", vlan_members, in cpsw_ale_vlan_add_modify()
769 void cpsw_ale_set_unreg_mcast(struct cpsw_ale *ale, int unreg_mcast_mask, in cpsw_ale_set_unreg_mcast() argument
776 for (idx = 0; idx < ale->params.ale_entries; idx++) { in cpsw_ale_set_unreg_mcast()
777 cpsw_ale_read(ale, idx, ale_entry); in cpsw_ale_set_unreg_mcast()
783 cpsw_ale_vlan_get_fld(ale, ale_entry, in cpsw_ale_set_unreg_mcast()
789 cpsw_ale_vlan_set_fld(ale, ale_entry, in cpsw_ale_set_unreg_mcast()
792 cpsw_ale_write(ale, idx, ale_entry); in cpsw_ale_set_unreg_mcast()
796 static void cpsw_ale_vlan_set_unreg_mcast(struct cpsw_ale *ale, u32 *ale_entry, in cpsw_ale_vlan_set_unreg_mcast() argument
801 unreg_mcast = cpsw_ale_vlan_get_fld(ale, ale_entry, in cpsw_ale_vlan_set_unreg_mcast()
808 cpsw_ale_vlan_set_fld(ale, ale_entry, in cpsw_ale_vlan_set_unreg_mcast()
813 cpsw_ale_vlan_set_unreg_mcast_idx(struct cpsw_ale *ale, u32 *ale_entry, in cpsw_ale_vlan_set_unreg_mcast_idx() argument
819 idx = cpsw_ale_vlan_get_fld(ale, ale_entry, in cpsw_ale_vlan_set_unreg_mcast_idx()
822 unreg_mcast = readl(ale->params.ale_regs + ALE_VLAN_MASK_MUX(idx)); in cpsw_ale_vlan_set_unreg_mcast_idx()
829 writel(unreg_mcast, ale->params.ale_regs + ALE_VLAN_MASK_MUX(idx)); in cpsw_ale_vlan_set_unreg_mcast_idx()
832 void cpsw_ale_set_allmulti(struct cpsw_ale *ale, int allmulti, int port) in cpsw_ale_set_allmulti() argument
837 for (idx = 0; idx < ale->params.ale_entries; idx++) { in cpsw_ale_set_allmulti()
840 cpsw_ale_read(ale, idx, ale_entry); in cpsw_ale_set_allmulti()
845 vlan_members = cpsw_ale_vlan_get_fld(ale, ale_entry, in cpsw_ale_set_allmulti()
851 if (!ale->params.nu_switch_ale) in cpsw_ale_set_allmulti()
852 cpsw_ale_vlan_set_unreg_mcast(ale, ale_entry, allmulti); in cpsw_ale_set_allmulti()
854 cpsw_ale_vlan_set_unreg_mcast_idx(ale, ale_entry, in cpsw_ale_set_allmulti()
857 cpsw_ale_write(ale, idx, ale_entry); in cpsw_ale_set_allmulti()
1087 int cpsw_ale_control_set(struct cpsw_ale *ale, int port, int control, in cpsw_ale_control_set() argument
1101 if (port < 0 || port >= ale->params.ale_ports) in cpsw_ale_control_set()
1111 tmp = readl_relaxed(ale->params.ale_regs + offset); in cpsw_ale_control_set()
1113 writel_relaxed(tmp, ale->params.ale_regs + offset); in cpsw_ale_control_set()
1118 int cpsw_ale_control_get(struct cpsw_ale *ale, int port, int control) in cpsw_ale_control_get() argument
1131 if (port < 0 || port >= ale->params.ale_ports) in cpsw_ale_control_get()
1137 tmp = readl_relaxed(ale->params.ale_regs + offset) >> shift; in cpsw_ale_control_get()
1141 int cpsw_ale_rx_ratelimit_mc(struct cpsw_ale *ale, int port, unsigned int ratelimit_pps) in cpsw_ale_rx_ratelimit_mc() argument
1148 dev_err(ale->params.dev, "ALE MC port:%d ratelimit min value 1000pps\n", port); in cpsw_ale_rx_ratelimit_mc()
1153 dev_info(ale->params.dev, "ALE port:%d MC ratelimit set to %dpps (requested %d)\n", in cpsw_ale_rx_ratelimit_mc()
1156 cpsw_ale_control_set(ale, port, ALE_PORT_MCAST_LIMIT, val); in cpsw_ale_rx_ratelimit_mc()
1158 dev_dbg(ale->params.dev, "ALE port:%d MC ratelimit set %d\n", in cpsw_ale_rx_ratelimit_mc()
1163 int cpsw_ale_rx_ratelimit_bc(struct cpsw_ale *ale, int port, unsigned int ratelimit_pps) in cpsw_ale_rx_ratelimit_bc() argument
1170 dev_err(ale->params.dev, "ALE port:%d BC ratelimit min value 1000pps\n", port); in cpsw_ale_rx_ratelimit_bc()
1175 dev_info(ale->params.dev, "ALE port:%d BC ratelimit set to %dpps (requested %d)\n", in cpsw_ale_rx_ratelimit_bc()
1178 cpsw_ale_control_set(ale, port, ALE_PORT_BCAST_LIMIT, val); in cpsw_ale_rx_ratelimit_bc()
1180 dev_dbg(ale->params.dev, "ALE port:%d BC ratelimit set %d\n", in cpsw_ale_rx_ratelimit_bc()
1187 struct cpsw_ale *ale = from_timer(ale, t, timer); in cpsw_ale_timer() local
1189 cpsw_ale_control_set(ale, 0, ALE_AGEOUT, 1); in cpsw_ale_timer()
1191 if (ale->ageout) { in cpsw_ale_timer()
1192 ale->timer.expires = jiffies + ale->ageout; in cpsw_ale_timer()
1193 add_timer(&ale->timer); in cpsw_ale_timer()
1197 static void cpsw_ale_hw_aging_timer_start(struct cpsw_ale *ale) in cpsw_ale_hw_aging_timer_start() argument
1201 aging_timer = ale->params.bus_freq / 1000000; in cpsw_ale_hw_aging_timer_start()
1202 aging_timer *= ale->params.ale_ageout; in cpsw_ale_hw_aging_timer_start()
1206 dev_warn(ale->params.dev, in cpsw_ale_hw_aging_timer_start()
1207 "ALE aging timer overflow, set to max\n"); in cpsw_ale_hw_aging_timer_start()
1210 writel(aging_timer, ale->params.ale_regs + ALE_AGING_TIMER); in cpsw_ale_hw_aging_timer_start()
1213 static void cpsw_ale_hw_aging_timer_stop(struct cpsw_ale *ale) in cpsw_ale_hw_aging_timer_stop() argument
1215 writel(0, ale->params.ale_regs + ALE_AGING_TIMER); in cpsw_ale_hw_aging_timer_stop()
1218 static void cpsw_ale_aging_start(struct cpsw_ale *ale) in cpsw_ale_aging_start() argument
1220 if (!ale->params.ale_ageout) in cpsw_ale_aging_start()
1223 if (ale->features & CPSW_ALE_F_HW_AUTOAGING) { in cpsw_ale_aging_start()
1224 cpsw_ale_hw_aging_timer_start(ale); in cpsw_ale_aging_start()
1228 timer_setup(&ale->timer, cpsw_ale_timer, 0); in cpsw_ale_aging_start()
1229 ale->timer.expires = jiffies + ale->ageout; in cpsw_ale_aging_start()
1230 add_timer(&ale->timer); in cpsw_ale_aging_start()
1233 static void cpsw_ale_aging_stop(struct cpsw_ale *ale) in cpsw_ale_aging_stop() argument
1235 if (!ale->params.ale_ageout) in cpsw_ale_aging_stop()
1238 if (ale->features & CPSW_ALE_F_HW_AUTOAGING) { in cpsw_ale_aging_stop()
1239 cpsw_ale_hw_aging_timer_stop(ale); in cpsw_ale_aging_stop()
1243 del_timer_sync(&ale->timer); in cpsw_ale_aging_stop()
1246 void cpsw_ale_start(struct cpsw_ale *ale) in cpsw_ale_start() argument
1260 ale_prescale = ale->params.bus_freq / ALE_RATE_LIMIT_MIN_PPS; in cpsw_ale_start()
1261 writel((u32)ale_prescale, ale->params.ale_regs + ALE_PRESCALE); in cpsw_ale_start()
1266 cpsw_ale_control_set(ale, 0, ALE_RATE_LIMIT, 1); in cpsw_ale_start()
1268 cpsw_ale_control_set(ale, 0, ALE_ENABLE, 1); in cpsw_ale_start()
1269 cpsw_ale_control_set(ale, 0, ALE_CLEAR, 1); in cpsw_ale_start()
1271 cpsw_ale_aging_start(ale); in cpsw_ale_start()
1274 void cpsw_ale_stop(struct cpsw_ale *ale) in cpsw_ale_stop() argument
1276 cpsw_ale_aging_stop(ale); in cpsw_ale_stop()
1277 cpsw_ale_control_set(ale, 0, ALE_CLEAR, 1); in cpsw_ale_stop()
1278 cpsw_ale_control_set(ale, 0, ALE_ENABLE, 0); in cpsw_ale_stop()
1353 struct cpsw_ale *ale; in cpsw_ale_create() local
1364 ale = devm_kzalloc(params->dev, sizeof(*ale), GFP_KERNEL); in cpsw_ale_create()
1365 if (!ale) in cpsw_ale_create()
1368 ale->p0_untag_vid_mask = devm_bitmap_zalloc(params->dev, VLAN_N_VID, in cpsw_ale_create()
1370 if (!ale->p0_untag_vid_mask) in cpsw_ale_create()
1373 ale->params = *params; in cpsw_ale_create()
1374 ale->ageout = ale->params.ale_ageout * HZ; in cpsw_ale_create()
1375 ale->features = ale_dev_id->features; in cpsw_ale_create()
1376 ale->vlan_entry_tbl = ale_dev_id->vlan_entry_tbl; in cpsw_ale_create()
1378 rev = readl_relaxed(ale->params.ale_regs + ALE_IDVER); in cpsw_ale_create()
1379 ale->version = in cpsw_ale_create()
1380 (ALE_VERSION_MAJOR(rev, ale->params.major_ver_mask) << 8) | in cpsw_ale_create()
1382 dev_info(ale->params.dev, "initialized cpsw ale version %d.%d\n", in cpsw_ale_create()
1383 ALE_VERSION_MAJOR(rev, ale->params.major_ver_mask), in cpsw_ale_create()
1386 if (ale->features & CPSW_ALE_F_STATUS_REG && in cpsw_ale_create()
1387 !ale->params.ale_entries) { in cpsw_ale_create()
1389 readl_relaxed(ale->params.ale_regs + ALE_STATUS) & in cpsw_ale_create()
1391 /* ALE available on newer NetCP switches has introduced in cpsw_ale_create()
1392 * a register, ALE_STATUS, to indicate the size of ALE in cpsw_ale_create()
1402 ale->params.ale_entries = ale_entries; in cpsw_ale_create()
1404 dev_info(ale->params.dev, in cpsw_ale_create()
1405 "ALE Table size %ld\n", ale->params.ale_entries); in cpsw_ale_create()
1408 ale->port_mask_bits = ale->params.ale_ports; in cpsw_ale_create()
1409 ale->port_num_bits = order_base_2(ale->params.ale_ports); in cpsw_ale_create()
1410 ale->vlan_field_bits = ale->params.ale_ports; in cpsw_ale_create()
1412 /* Set defaults override for ALE on NetCP NU switch and for version in cpsw_ale_create()
1415 if (ale->params.nu_switch_ale) { in cpsw_ale_create()
1417 * Also there are N bits, where N is number of ale in cpsw_ale_create()
1421 ale->params.ale_ports; in cpsw_ale_create()
1425 ale->params.ale_ports; in cpsw_ale_create()
1430 ale->params.ale_ports; in cpsw_ale_create()
1435 ale->params.ale_ports; in cpsw_ale_create()
1441 cpsw_ale_control_set(ale, 0, ALE_CLEAR, 1); in cpsw_ale_create()
1442 return ale; in cpsw_ale_create()
1445 void cpsw_ale_dump(struct cpsw_ale *ale, u32 *data) in cpsw_ale_dump() argument
1449 for (i = 0; i < ale->params.ale_entries; i++) { in cpsw_ale_dump()
1450 cpsw_ale_read(ale, i, data); in cpsw_ale_dump()
1455 u32 cpsw_ale_get_num_entries(struct cpsw_ale *ale) in cpsw_ale_get_num_entries() argument
1457 return ale ? ale->params.ale_entries : 0; in cpsw_ale_get_num_entries()