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()
271 static void cpsw_ale_flush_ucast(struct cpsw_ale *ale, u32 *ale_entry, in cpsw_ale_flush_ucast() argument
282 int cpsw_ale_flush(struct cpsw_ale *ale, int port_mask) in cpsw_ale_flush() argument
287 for (idx = 0; idx < ale->params.ale_entries; idx++) { in cpsw_ale_flush()
288 cpsw_ale_read(ale, idx, ale_entry); in cpsw_ale_flush()
294 cpsw_ale_flush_mcast(ale, ale_entry, port_mask); in cpsw_ale_flush()
296 cpsw_ale_flush_ucast(ale, ale_entry, port_mask); in cpsw_ale_flush()
298 cpsw_ale_write(ale, idx, ale_entry); in cpsw_ale_flush()
315 int cpsw_ale_add_ucast(struct cpsw_ale *ale, u8 *addr, int port, in cpsw_ale_add_ucast() argument
329 idx = cpsw_ale_match_addr(ale, addr, (flags & ALE_VLAN) ? vid : 0); in cpsw_ale_add_ucast()
331 idx = cpsw_ale_match_free(ale); in cpsw_ale_add_ucast()
333 idx = cpsw_ale_find_ageable(ale); in cpsw_ale_add_ucast()
337 cpsw_ale_write(ale, idx, ale_entry); in cpsw_ale_add_ucast()
342 int cpsw_ale_del_ucast(struct cpsw_ale *ale, u8 *addr, int port, in cpsw_ale_del_ucast() argument
348 idx = cpsw_ale_match_addr(ale, addr, (flags & ALE_VLAN) ? vid : 0); in cpsw_ale_del_ucast()
353 cpsw_ale_write(ale, idx, ale_entry); in cpsw_ale_del_ucast()
358 int cpsw_ale_add_mcast(struct cpsw_ale *ale, u8 *addr, int port_mask, in cpsw_ale_add_mcast() argument
364 idx = cpsw_ale_match_addr(ale, addr, (flags & ALE_VLAN) ? vid : 0); in cpsw_ale_add_mcast()
366 cpsw_ale_read(ale, idx, ale_entry); in cpsw_ale_add_mcast()
379 idx = cpsw_ale_match_free(ale); in cpsw_ale_add_mcast()
381 idx = cpsw_ale_find_ageable(ale); in cpsw_ale_add_mcast()
385 cpsw_ale_write(ale, idx, ale_entry); in cpsw_ale_add_mcast()
390 int cpsw_ale_del_mcast(struct cpsw_ale *ale, u8 *addr, int port_mask, in cpsw_ale_del_mcast() argument
396 idx = cpsw_ale_match_addr(ale, addr, (flags & ALE_VLAN) ? vid : 0); in cpsw_ale_del_mcast()
400 cpsw_ale_read(ale, idx, ale_entry); in cpsw_ale_del_mcast()
407 cpsw_ale_write(ale, idx, ale_entry); in cpsw_ale_del_mcast()
412 int cpsw_ale_add_vlan(struct cpsw_ale *ale, u16 vid, int port, int untag, in cpsw_ale_add_vlan() argument
418 idx = cpsw_ale_match_vlan(ale, vid); in cpsw_ale_add_vlan()
420 cpsw_ale_read(ale, idx, ale_entry); in cpsw_ale_add_vlan()
431 idx = cpsw_ale_match_free(ale); in cpsw_ale_add_vlan()
433 idx = cpsw_ale_find_ageable(ale); in cpsw_ale_add_vlan()
437 cpsw_ale_write(ale, idx, ale_entry); in cpsw_ale_add_vlan()
442 int cpsw_ale_del_vlan(struct cpsw_ale *ale, u16 vid, int port_mask) in cpsw_ale_del_vlan() argument
447 idx = cpsw_ale_match_vlan(ale, vid); in cpsw_ale_del_vlan()
451 cpsw_ale_read(ale, idx, ale_entry); in cpsw_ale_del_vlan()
458 cpsw_ale_write(ale, idx, ale_entry); in cpsw_ale_del_vlan()
463 void cpsw_ale_set_allmulti(struct cpsw_ale *ale, int allmulti) in cpsw_ale_set_allmulti() argument
470 if (ale->allmulti == allmulti) in cpsw_ale_set_allmulti()
474 ale->allmulti = allmulti; in cpsw_ale_set_allmulti()
476 for (idx = 0; idx < ale->params.ale_entries; idx++) { in cpsw_ale_set_allmulti()
477 cpsw_ale_read(ale, idx, ale_entry); in cpsw_ale_set_allmulti()
488 cpsw_ale_write(ale, idx, ale_entry); in cpsw_ale_set_allmulti()
687 int cpsw_ale_control_set(struct cpsw_ale *ale, int port, int control, in cpsw_ale_control_set() argument
701 if (port < 0 || port > ale->params.ale_ports) in cpsw_ale_control_set()
711 tmp = __raw_readl(ale->params.ale_regs + offset); in cpsw_ale_control_set()
713 __raw_writel(tmp, ale->params.ale_regs + offset); in cpsw_ale_control_set()
719 int cpsw_ale_control_get(struct cpsw_ale *ale, int port, int control) in cpsw_ale_control_get() argument
732 if (port < 0 || port > ale->params.ale_ports) in cpsw_ale_control_get()
738 tmp = __raw_readl(ale->params.ale_regs + offset) >> shift; in cpsw_ale_control_get()
745 struct cpsw_ale *ale = (struct cpsw_ale *)arg; in cpsw_ale_timer() local
747 cpsw_ale_control_set(ale, 0, ALE_AGEOUT, 1); in cpsw_ale_timer()
749 if (ale->ageout) { in cpsw_ale_timer()
750 ale->timer.expires = jiffies + ale->ageout; in cpsw_ale_timer()
751 add_timer(&ale->timer); in cpsw_ale_timer()
755 int cpsw_ale_set_ageout(struct cpsw_ale *ale, int ageout) in cpsw_ale_set_ageout() argument
757 del_timer_sync(&ale->timer); in cpsw_ale_set_ageout()
758 ale->ageout = ageout * HZ; in cpsw_ale_set_ageout()
759 if (ale->ageout) { in cpsw_ale_set_ageout()
760 ale->timer.expires = jiffies + ale->ageout; in cpsw_ale_set_ageout()
761 add_timer(&ale->timer); in cpsw_ale_set_ageout()
767 void cpsw_ale_start(struct cpsw_ale *ale) in cpsw_ale_start() argument
771 rev = __raw_readl(ale->params.ale_regs + ALE_IDVER); in cpsw_ale_start()
772 dev_dbg(ale->params.dev, "initialized cpsw ale revision %d.%d\n", in cpsw_ale_start()
774 cpsw_ale_control_set(ale, 0, ALE_ENABLE, 1); in cpsw_ale_start()
775 cpsw_ale_control_set(ale, 0, ALE_CLEAR, 1); in cpsw_ale_start()
777 init_timer(&ale->timer); in cpsw_ale_start()
778 ale->timer.data = (unsigned long)ale; in cpsw_ale_start()
779 ale->timer.function = cpsw_ale_timer; in cpsw_ale_start()
780 if (ale->ageout) { in cpsw_ale_start()
781 ale->timer.expires = jiffies + ale->ageout; in cpsw_ale_start()
782 add_timer(&ale->timer); in cpsw_ale_start()
787 void cpsw_ale_stop(struct cpsw_ale *ale) in cpsw_ale_stop() argument
789 del_timer_sync(&ale->timer); in cpsw_ale_stop()
795 struct cpsw_ale *ale; in cpsw_ale_create() local
797 ale = kzalloc(sizeof(*ale), GFP_KERNEL); in cpsw_ale_create()
798 if (!ale) in cpsw_ale_create()
801 ale->params = *params; in cpsw_ale_create()
802 ale->ageout = ale->params.ale_ageout * HZ; in cpsw_ale_create()
804 return ale; in cpsw_ale_create()
808 int cpsw_ale_destroy(struct cpsw_ale *ale) in cpsw_ale_destroy() argument
810 if (!ale) in cpsw_ale_destroy()
812 cpsw_ale_control_set(ale, 0, ALE_ENABLE, 0); in cpsw_ale_destroy()
813 kfree(ale); in cpsw_ale_destroy()
818 void cpsw_ale_dump(struct cpsw_ale *ale, u32 *data) in cpsw_ale_dump() argument
822 for (i = 0; i < ale->params.ale_entries; i++) { in cpsw_ale_dump()
823 cpsw_ale_read(ale, i, data); in cpsw_ale_dump()