Lines Matching refs:ale
119 static int cpsw_ale_read(struct cpsw_ale *ale, int idx, u32 *ale_entry) in cpsw_ale_read() argument
123 WARN_ON(idx > ale->params.ale_entries); in cpsw_ale_read()
125 __raw_writel(idx, ale->params.ale_regs + ALE_TABLE_CONTROL); in cpsw_ale_read()
128 ale_entry[i] = __raw_readl(ale->params.ale_regs + in cpsw_ale_read()
134 static int cpsw_ale_write(struct cpsw_ale *ale, int idx, u32 *ale_entry) in cpsw_ale_write() argument
138 WARN_ON(idx > ale->params.ale_entries); in cpsw_ale_write()
141 __raw_writel(ale_entry[i], ale->params.ale_regs + in cpsw_ale_write()
144 __raw_writel(idx | ALE_TABLE_WRITE, ale->params.ale_regs + in cpsw_ale_write()
150 static int cpsw_ale_match_addr(struct cpsw_ale *ale, u8 *addr, u16 vid) in cpsw_ale_match_addr() argument
155 for (idx = 0; idx < ale->params.ale_entries; idx++) { in cpsw_ale_match_addr()
158 cpsw_ale_read(ale, idx, ale_entry); in cpsw_ale_match_addr()
171 static int cpsw_ale_match_vlan(struct cpsw_ale *ale, u16 vid) in cpsw_ale_match_vlan() argument
176 for (idx = 0; idx < ale->params.ale_entries; idx++) { in cpsw_ale_match_vlan()
177 cpsw_ale_read(ale, idx, ale_entry); in cpsw_ale_match_vlan()
187 static int cpsw_ale_match_free(struct cpsw_ale *ale) in cpsw_ale_match_free() argument
192 for (idx = 0; idx < ale->params.ale_entries; idx++) { in cpsw_ale_match_free()
193 cpsw_ale_read(ale, idx, ale_entry); in cpsw_ale_match_free()
201 static int cpsw_ale_find_ageable(struct cpsw_ale *ale) in cpsw_ale_find_ageable() argument
206 for (idx = 0; idx < ale->params.ale_entries; idx++) { in cpsw_ale_find_ageable()
207 cpsw_ale_read(ale, idx, ale_entry); in cpsw_ale_find_ageable()
221 static void cpsw_ale_flush_mcast(struct cpsw_ale *ale, u32 *ale_entry, in cpsw_ale_flush_mcast() argument
238 int cpsw_ale_flush_multicast(struct cpsw_ale *ale, int port_mask, int vid) in cpsw_ale_flush_multicast() argument
243 for (idx = 0; idx < ale->params.ale_entries; idx++) { in cpsw_ale_flush_multicast()
244 cpsw_ale_read(ale, idx, ale_entry); in cpsw_ale_flush_multicast()
262 cpsw_ale_flush_mcast(ale, ale_entry, port_mask); in cpsw_ale_flush_multicast()
265 cpsw_ale_write(ale, idx, ale_entry); in cpsw_ale_flush_multicast()
282 int cpsw_ale_add_ucast(struct cpsw_ale *ale, u8 *addr, int port, in cpsw_ale_add_ucast() argument
296 idx = cpsw_ale_match_addr(ale, addr, (flags & ALE_VLAN) ? vid : 0); in cpsw_ale_add_ucast()
298 idx = cpsw_ale_match_free(ale); in cpsw_ale_add_ucast()
300 idx = cpsw_ale_find_ageable(ale); in cpsw_ale_add_ucast()
304 cpsw_ale_write(ale, idx, ale_entry); in cpsw_ale_add_ucast()
309 int cpsw_ale_del_ucast(struct cpsw_ale *ale, u8 *addr, int port, in cpsw_ale_del_ucast() argument
315 idx = cpsw_ale_match_addr(ale, addr, (flags & ALE_VLAN) ? vid : 0); in cpsw_ale_del_ucast()
320 cpsw_ale_write(ale, idx, ale_entry); in cpsw_ale_del_ucast()
325 int cpsw_ale_add_mcast(struct cpsw_ale *ale, u8 *addr, int port_mask, in cpsw_ale_add_mcast() argument
331 idx = cpsw_ale_match_addr(ale, addr, (flags & ALE_VLAN) ? vid : 0); in cpsw_ale_add_mcast()
333 cpsw_ale_read(ale, idx, ale_entry); in cpsw_ale_add_mcast()
346 idx = cpsw_ale_match_free(ale); in cpsw_ale_add_mcast()
348 idx = cpsw_ale_find_ageable(ale); in cpsw_ale_add_mcast()
352 cpsw_ale_write(ale, idx, ale_entry); in cpsw_ale_add_mcast()
357 int cpsw_ale_del_mcast(struct cpsw_ale *ale, u8 *addr, int port_mask, in cpsw_ale_del_mcast() argument
363 idx = cpsw_ale_match_addr(ale, addr, (flags & ALE_VLAN) ? vid : 0); in cpsw_ale_del_mcast()
367 cpsw_ale_read(ale, idx, ale_entry); in cpsw_ale_del_mcast()
374 cpsw_ale_write(ale, idx, ale_entry); in cpsw_ale_del_mcast()
379 int cpsw_ale_add_vlan(struct cpsw_ale *ale, u16 vid, int port, int untag, in cpsw_ale_add_vlan() argument
385 idx = cpsw_ale_match_vlan(ale, vid); in cpsw_ale_add_vlan()
387 cpsw_ale_read(ale, idx, ale_entry); in cpsw_ale_add_vlan()
398 idx = cpsw_ale_match_free(ale); in cpsw_ale_add_vlan()
400 idx = cpsw_ale_find_ageable(ale); in cpsw_ale_add_vlan()
404 cpsw_ale_write(ale, idx, ale_entry); in cpsw_ale_add_vlan()
409 int cpsw_ale_del_vlan(struct cpsw_ale *ale, u16 vid, int port_mask) in cpsw_ale_del_vlan() argument
414 idx = cpsw_ale_match_vlan(ale, vid); in cpsw_ale_del_vlan()
418 cpsw_ale_read(ale, idx, ale_entry); in cpsw_ale_del_vlan()
425 cpsw_ale_write(ale, idx, ale_entry); in cpsw_ale_del_vlan()
430 void cpsw_ale_set_allmulti(struct cpsw_ale *ale, int allmulti) in cpsw_ale_set_allmulti() argument
437 if (ale->allmulti == allmulti) in cpsw_ale_set_allmulti()
441 ale->allmulti = allmulti; in cpsw_ale_set_allmulti()
443 for (idx = 0; idx < ale->params.ale_entries; idx++) { in cpsw_ale_set_allmulti()
444 cpsw_ale_read(ale, idx, ale_entry); in cpsw_ale_set_allmulti()
455 cpsw_ale_write(ale, idx, ale_entry); in cpsw_ale_set_allmulti()
654 int cpsw_ale_control_set(struct cpsw_ale *ale, int port, int control, in cpsw_ale_control_set() argument
668 if (port < 0 || port > ale->params.ale_ports) in cpsw_ale_control_set()
678 tmp = __raw_readl(ale->params.ale_regs + offset); in cpsw_ale_control_set()
680 __raw_writel(tmp, ale->params.ale_regs + offset); in cpsw_ale_control_set()
686 int cpsw_ale_control_get(struct cpsw_ale *ale, int port, int control) in cpsw_ale_control_get() argument
699 if (port < 0 || port > ale->params.ale_ports) in cpsw_ale_control_get()
705 tmp = __raw_readl(ale->params.ale_regs + offset) >> shift; in cpsw_ale_control_get()
712 struct cpsw_ale *ale = (struct cpsw_ale *)arg; in cpsw_ale_timer() local
714 cpsw_ale_control_set(ale, 0, ALE_AGEOUT, 1); in cpsw_ale_timer()
716 if (ale->ageout) { in cpsw_ale_timer()
717 ale->timer.expires = jiffies + ale->ageout; in cpsw_ale_timer()
718 add_timer(&ale->timer); in cpsw_ale_timer()
722 void cpsw_ale_start(struct cpsw_ale *ale) in cpsw_ale_start() argument
726 rev = __raw_readl(ale->params.ale_regs + ALE_IDVER); in cpsw_ale_start()
727 dev_dbg(ale->params.dev, "initialized cpsw ale revision %d.%d\n", in cpsw_ale_start()
729 cpsw_ale_control_set(ale, 0, ALE_ENABLE, 1); in cpsw_ale_start()
730 cpsw_ale_control_set(ale, 0, ALE_CLEAR, 1); in cpsw_ale_start()
732 init_timer(&ale->timer); in cpsw_ale_start()
733 ale->timer.data = (unsigned long)ale; in cpsw_ale_start()
734 ale->timer.function = cpsw_ale_timer; in cpsw_ale_start()
735 if (ale->ageout) { in cpsw_ale_start()
736 ale->timer.expires = jiffies + ale->ageout; in cpsw_ale_start()
737 add_timer(&ale->timer); in cpsw_ale_start()
742 void cpsw_ale_stop(struct cpsw_ale *ale) in cpsw_ale_stop() argument
744 del_timer_sync(&ale->timer); in cpsw_ale_stop()
750 struct cpsw_ale *ale; in cpsw_ale_create() local
752 ale = kzalloc(sizeof(*ale), GFP_KERNEL); in cpsw_ale_create()
753 if (!ale) in cpsw_ale_create()
756 ale->params = *params; in cpsw_ale_create()
757 ale->ageout = ale->params.ale_ageout * HZ; in cpsw_ale_create()
759 return ale; in cpsw_ale_create()
763 int cpsw_ale_destroy(struct cpsw_ale *ale) in cpsw_ale_destroy() argument
765 if (!ale) in cpsw_ale_destroy()
767 cpsw_ale_control_set(ale, 0, ALE_ENABLE, 0); in cpsw_ale_destroy()
768 kfree(ale); in cpsw_ale_destroy()
773 void cpsw_ale_dump(struct cpsw_ale *ale, u32 *data) in cpsw_ale_dump() argument
777 for (i = 0; i < ale->params.ale_entries; i++) { in cpsw_ale_dump()
778 cpsw_ale_read(ale, i, data); in cpsw_ale_dump()