Lines Matching refs:ale_entry
107 static inline int cpsw_ale_get_field(u32 *ale_entry, u32 start, u32 bits) in cpsw_ale_get_field() argument
117 hi_val = ale_entry[index] << ((idx2 * 32) - start); in cpsw_ale_get_field()
121 return (hi_val + (ale_entry[idx] >> start)) & BITMASK(bits); in cpsw_ale_get_field()
124 static inline void cpsw_ale_set_field(u32 *ale_entry, u32 start, u32 bits, in cpsw_ale_set_field() argument
135 ale_entry[index] &= ~(BITMASK(bits + start - (idx2 * 32))); in cpsw_ale_set_field()
136 ale_entry[index] |= (value >> ((idx2 * 32) - start)); in cpsw_ale_set_field()
140 ale_entry[idx] &= ~(BITMASK(bits) << start); in cpsw_ale_set_field()
141 ale_entry[idx] |= (value << start); in cpsw_ale_set_field()
145 static inline int cpsw_ale_get_##name(u32 *ale_entry) \
147 return cpsw_ale_get_field(ale_entry, start, bits); \
149 static inline void cpsw_ale_set_##name(u32 *ale_entry, u32 value) \
151 cpsw_ale_set_field(ale_entry, start, bits, value); \
155 static inline int cpsw_ale_get_##name(u32 *ale_entry, u32 bits) \
157 return cpsw_ale_get_field(ale_entry, start, bits); \
159 static inline void cpsw_ale_set_##name(u32 *ale_entry, u32 value, \
162 cpsw_ale_set_field(ale_entry, start, bits, value); \
232 u32 *ale_entry, in cpsw_ale_entry_get_fld() argument
239 if (!ale || !ale_entry) in cpsw_ale_entry_get_fld()
252 return cpsw_ale_get_field(ale_entry, entry_fld->start_bit, bits); in cpsw_ale_entry_get_fld()
256 u32 *ale_entry, in cpsw_ale_entry_set_fld() argument
264 if (!ale || !ale_entry) in cpsw_ale_entry_set_fld()
277 cpsw_ale_set_field(ale_entry, entry_fld->start_bit, bits, value); in cpsw_ale_entry_set_fld()
281 u32 *ale_entry, in cpsw_ale_vlan_get_fld() argument
284 return cpsw_ale_entry_get_fld(ale, ale_entry, in cpsw_ale_vlan_get_fld()
289 u32 *ale_entry, in cpsw_ale_vlan_set_fld() argument
293 cpsw_ale_entry_set_fld(ale, ale_entry, in cpsw_ale_vlan_set_fld()
298 static inline void cpsw_ale_get_addr(u32 *ale_entry, u8 *addr) in cpsw_ale_get_addr() argument
303 addr[i] = cpsw_ale_get_field(ale_entry, 40 - 8*i, 8); in cpsw_ale_get_addr()
306 static inline void cpsw_ale_set_addr(u32 *ale_entry, const u8 *addr) in cpsw_ale_set_addr() argument
311 cpsw_ale_set_field(ale_entry, 40 - 8*i, 8, addr[i]); in cpsw_ale_set_addr()
314 static int cpsw_ale_read(struct cpsw_ale *ale, int idx, u32 *ale_entry) in cpsw_ale_read() argument
323 ale_entry[i] = readl_relaxed(ale->params.ale_regs + in cpsw_ale_read()
329 static int cpsw_ale_write(struct cpsw_ale *ale, int idx, u32 *ale_entry) in cpsw_ale_write() argument
336 writel_relaxed(ale_entry[i], ale->params.ale_regs + in cpsw_ale_write()
347 u32 ale_entry[ALE_ENTRY_WORDS]; in cpsw_ale_match_addr() local
353 cpsw_ale_read(ale, idx, ale_entry); in cpsw_ale_match_addr()
354 type = cpsw_ale_get_entry_type(ale_entry); in cpsw_ale_match_addr()
357 if (cpsw_ale_get_vlan_id(ale_entry) != vid) in cpsw_ale_match_addr()
359 cpsw_ale_get_addr(ale_entry, entry_addr); in cpsw_ale_match_addr()
368 u32 ale_entry[ALE_ENTRY_WORDS]; in cpsw_ale_match_vlan() local
372 cpsw_ale_read(ale, idx, ale_entry); in cpsw_ale_match_vlan()
373 type = cpsw_ale_get_entry_type(ale_entry); in cpsw_ale_match_vlan()
376 if (cpsw_ale_get_vlan_id(ale_entry) == vid) in cpsw_ale_match_vlan()
384 u32 ale_entry[ALE_ENTRY_WORDS]; in cpsw_ale_match_free() local
388 cpsw_ale_read(ale, idx, ale_entry); in cpsw_ale_match_free()
389 type = cpsw_ale_get_entry_type(ale_entry); in cpsw_ale_match_free()
398 u32 ale_entry[ALE_ENTRY_WORDS]; in cpsw_ale_find_ageable() local
402 cpsw_ale_read(ale, idx, ale_entry); in cpsw_ale_find_ageable()
403 type = cpsw_ale_get_entry_type(ale_entry); in cpsw_ale_find_ageable()
406 if (cpsw_ale_get_mcast(ale_entry)) in cpsw_ale_find_ageable()
408 type = cpsw_ale_get_ucast_type(ale_entry); in cpsw_ale_find_ageable()
416 static void cpsw_ale_flush_mcast(struct cpsw_ale *ale, u32 *ale_entry, in cpsw_ale_flush_mcast() argument
421 mask = cpsw_ale_get_port_mask(ale_entry, in cpsw_ale_flush_mcast()
429 cpsw_ale_set_port_mask(ale_entry, mask, in cpsw_ale_flush_mcast()
432 cpsw_ale_set_entry_type(ale_entry, ALE_TYPE_FREE); in cpsw_ale_flush_mcast()
437 u32 ale_entry[ALE_ENTRY_WORDS]; in cpsw_ale_flush_multicast() local
441 cpsw_ale_read(ale, idx, ale_entry); in cpsw_ale_flush_multicast()
442 ret = cpsw_ale_get_entry_type(ale_entry); in cpsw_ale_flush_multicast()
451 if (vid != -1 && cpsw_ale_get_vlan_id(ale_entry) != vid) in cpsw_ale_flush_multicast()
454 if (cpsw_ale_get_mcast(ale_entry)) { in cpsw_ale_flush_multicast()
457 if (cpsw_ale_get_super(ale_entry)) in cpsw_ale_flush_multicast()
460 cpsw_ale_get_addr(ale_entry, addr); in cpsw_ale_flush_multicast()
462 cpsw_ale_flush_mcast(ale, ale_entry, port_mask); in cpsw_ale_flush_multicast()
465 cpsw_ale_write(ale, idx, ale_entry); in cpsw_ale_flush_multicast()
470 static inline void cpsw_ale_set_vlan_entry_type(u32 *ale_entry, in cpsw_ale_set_vlan_entry_type() argument
474 cpsw_ale_set_entry_type(ale_entry, ALE_TYPE_VLAN_ADDR); in cpsw_ale_set_vlan_entry_type()
475 cpsw_ale_set_vlan_id(ale_entry, vid); in cpsw_ale_set_vlan_entry_type()
477 cpsw_ale_set_entry_type(ale_entry, ALE_TYPE_ADDR); in cpsw_ale_set_vlan_entry_type()
484 u32 ale_entry[ALE_ENTRY_WORDS] = {0, 0, 0}; in cpsw_ale_add_ucast() local
487 cpsw_ale_set_vlan_entry_type(ale_entry, flags, vid); in cpsw_ale_add_ucast()
489 cpsw_ale_set_addr(ale_entry, addr); in cpsw_ale_add_ucast()
490 cpsw_ale_set_ucast_type(ale_entry, ALE_UCAST_PERSISTANT); in cpsw_ale_add_ucast()
491 cpsw_ale_set_secure(ale_entry, (flags & ALE_SECURE) ? 1 : 0); in cpsw_ale_add_ucast()
492 cpsw_ale_set_blocked(ale_entry, (flags & ALE_BLOCKED) ? 1 : 0); in cpsw_ale_add_ucast()
493 cpsw_ale_set_port_num(ale_entry, port, ale->port_num_bits); in cpsw_ale_add_ucast()
503 cpsw_ale_write(ale, idx, ale_entry); in cpsw_ale_add_ucast()
510 u32 ale_entry[ALE_ENTRY_WORDS] = {0, 0, 0}; in cpsw_ale_del_ucast() local
517 cpsw_ale_set_entry_type(ale_entry, ALE_TYPE_FREE); in cpsw_ale_del_ucast()
518 cpsw_ale_write(ale, idx, ale_entry); in cpsw_ale_del_ucast()
525 u32 ale_entry[ALE_ENTRY_WORDS] = {0, 0, 0}; in cpsw_ale_add_mcast() local
530 cpsw_ale_read(ale, idx, ale_entry); in cpsw_ale_add_mcast()
532 cpsw_ale_set_vlan_entry_type(ale_entry, flags, vid); in cpsw_ale_add_mcast()
534 cpsw_ale_set_addr(ale_entry, addr); in cpsw_ale_add_mcast()
535 cpsw_ale_set_super(ale_entry, (flags & ALE_SUPER) ? 1 : 0); in cpsw_ale_add_mcast()
536 cpsw_ale_set_mcast_state(ale_entry, mcast_state); in cpsw_ale_add_mcast()
538 mask = cpsw_ale_get_port_mask(ale_entry, in cpsw_ale_add_mcast()
541 cpsw_ale_set_port_mask(ale_entry, port_mask, in cpsw_ale_add_mcast()
551 cpsw_ale_write(ale, idx, ale_entry); in cpsw_ale_add_mcast()
558 u32 ale_entry[ALE_ENTRY_WORDS] = {0, 0, 0}; in cpsw_ale_del_mcast() local
566 cpsw_ale_read(ale, idx, ale_entry); in cpsw_ale_del_mcast()
569 mcast_members = cpsw_ale_get_port_mask(ale_entry, in cpsw_ale_del_mcast()
575 cpsw_ale_set_port_mask(ale_entry, mcast_members, in cpsw_ale_del_mcast()
578 cpsw_ale_set_entry_type(ale_entry, ALE_TYPE_FREE); in cpsw_ale_del_mcast()
580 cpsw_ale_write(ale, idx, ale_entry); in cpsw_ale_del_mcast()
585 static void cpsw_ale_set_vlan_mcast(struct cpsw_ale *ale, u32 *ale_entry, in cpsw_ale_set_vlan_mcast() argument
591 idx = cpsw_ale_vlan_get_fld(ale, ale_entry, in cpsw_ale_set_vlan_mcast()
596 idx = cpsw_ale_vlan_get_fld(ale, ale_entry, in cpsw_ale_set_vlan_mcast()
601 static void cpsw_ale_set_vlan_untag(struct cpsw_ale *ale, u32 *ale_entry, in cpsw_ale_set_vlan_untag() argument
604 cpsw_ale_vlan_set_fld(ale, ale_entry, in cpsw_ale_set_vlan_untag()
616 u32 ale_entry[ALE_ENTRY_WORDS] = {0, 0, 0}; in cpsw_ale_add_vlan() local
621 cpsw_ale_read(ale, idx, ale_entry); in cpsw_ale_add_vlan()
623 cpsw_ale_set_entry_type(ale_entry, ALE_TYPE_VLAN); in cpsw_ale_add_vlan()
624 cpsw_ale_set_vlan_id(ale_entry, vid); in cpsw_ale_add_vlan()
625 cpsw_ale_set_vlan_untag(ale, ale_entry, vid, untag); in cpsw_ale_add_vlan()
628 cpsw_ale_vlan_set_fld(ale, ale_entry, in cpsw_ale_add_vlan()
630 cpsw_ale_vlan_set_fld(ale, ale_entry, in cpsw_ale_add_vlan()
633 cpsw_ale_vlan_set_fld(ale, ale_entry, in cpsw_ale_add_vlan()
636 cpsw_ale_set_vlan_mcast(ale, ale_entry, reg_mcast, unreg_mcast); in cpsw_ale_add_vlan()
639 cpsw_ale_vlan_set_fld(ale, ale_entry, in cpsw_ale_add_vlan()
649 cpsw_ale_write(ale, idx, ale_entry); in cpsw_ale_add_vlan()
653 static void cpsw_ale_vlan_del_modify_int(struct cpsw_ale *ale, u32 *ale_entry, in cpsw_ale_vlan_del_modify_int() argument
659 members = cpsw_ale_vlan_get_fld(ale, ale_entry, in cpsw_ale_vlan_del_modify_int()
663 cpsw_ale_set_vlan_untag(ale, ale_entry, vid, 0); in cpsw_ale_vlan_del_modify_int()
664 cpsw_ale_set_entry_type(ale_entry, ALE_TYPE_FREE); in cpsw_ale_vlan_del_modify_int()
668 untag = cpsw_ale_vlan_get_fld(ale, ale_entry, in cpsw_ale_vlan_del_modify_int()
670 reg_mcast = cpsw_ale_vlan_get_fld(ale, ale_entry, in cpsw_ale_vlan_del_modify_int()
672 unreg_mcast = cpsw_ale_vlan_get_fld(ale, ale_entry, in cpsw_ale_vlan_del_modify_int()
678 cpsw_ale_set_vlan_untag(ale, ale_entry, vid, untag); in cpsw_ale_vlan_del_modify_int()
681 cpsw_ale_vlan_set_fld(ale, ale_entry, in cpsw_ale_vlan_del_modify_int()
683 cpsw_ale_vlan_set_fld(ale, ale_entry, in cpsw_ale_vlan_del_modify_int()
686 cpsw_ale_set_vlan_mcast(ale, ale_entry, reg_mcast, in cpsw_ale_vlan_del_modify_int()
689 cpsw_ale_vlan_set_fld(ale, ale_entry, in cpsw_ale_vlan_del_modify_int()
695 u32 ale_entry[ALE_ENTRY_WORDS] = {0, 0, 0}; in cpsw_ale_vlan_del_modify() local
702 cpsw_ale_read(ale, idx, ale_entry); in cpsw_ale_vlan_del_modify()
704 cpsw_ale_vlan_del_modify_int(ale, ale_entry, vid, port_mask); in cpsw_ale_vlan_del_modify()
705 cpsw_ale_write(ale, idx, ale_entry); in cpsw_ale_vlan_del_modify()
712 u32 ale_entry[ALE_ENTRY_WORDS] = {0, 0, 0}; in cpsw_ale_del_vlan() local
719 cpsw_ale_read(ale, idx, ale_entry); in cpsw_ale_del_vlan()
727 members = cpsw_ale_vlan_get_fld(ale, ale_entry, ALE_ENT_VID_MEMBER_LIST); in cpsw_ale_del_vlan()
732 cpsw_ale_set_vlan_untag(ale, ale_entry, vid, 0); in cpsw_ale_del_vlan()
733 cpsw_ale_set_entry_type(ale_entry, ALE_TYPE_FREE); in cpsw_ale_del_vlan()
736 cpsw_ale_vlan_del_modify_int(ale, ale_entry, vid, port_mask); in cpsw_ale_del_vlan()
739 cpsw_ale_write(ale, idx, ale_entry); in cpsw_ale_del_vlan()
747 u32 ale_entry[ALE_ENTRY_WORDS] = {0, 0, 0}; in cpsw_ale_vlan_add_modify() local
754 cpsw_ale_read(ale, idx, ale_entry); in cpsw_ale_vlan_add_modify()
756 vlan_members = cpsw_ale_vlan_get_fld(ale, ale_entry, in cpsw_ale_vlan_add_modify()
758 reg_mcast_members = cpsw_ale_vlan_get_fld(ale, ale_entry, in cpsw_ale_vlan_add_modify()
761 cpsw_ale_vlan_get_fld(ale, ale_entry, in cpsw_ale_vlan_add_modify()
763 untag_members = cpsw_ale_vlan_get_fld(ale, ale_entry, in cpsw_ale_vlan_add_modify()
786 u32 ale_entry[ALE_ENTRY_WORDS]; in cpsw_ale_set_unreg_mcast() local
791 cpsw_ale_read(ale, idx, ale_entry); in cpsw_ale_set_unreg_mcast()
792 type = cpsw_ale_get_entry_type(ale_entry); in cpsw_ale_set_unreg_mcast()
797 cpsw_ale_vlan_get_fld(ale, ale_entry, in cpsw_ale_set_unreg_mcast()
803 cpsw_ale_vlan_set_fld(ale, ale_entry, in cpsw_ale_set_unreg_mcast()
806 cpsw_ale_write(ale, idx, ale_entry); in cpsw_ale_set_unreg_mcast()
810 static void cpsw_ale_vlan_set_unreg_mcast(struct cpsw_ale *ale, u32 *ale_entry, in cpsw_ale_vlan_set_unreg_mcast() argument
815 unreg_mcast = cpsw_ale_vlan_get_fld(ale, ale_entry, in cpsw_ale_vlan_set_unreg_mcast()
822 cpsw_ale_vlan_set_fld(ale, ale_entry, in cpsw_ale_vlan_set_unreg_mcast()
827 cpsw_ale_vlan_set_unreg_mcast_idx(struct cpsw_ale *ale, u32 *ale_entry, in cpsw_ale_vlan_set_unreg_mcast_idx() argument
833 idx = cpsw_ale_vlan_get_fld(ale, ale_entry, in cpsw_ale_vlan_set_unreg_mcast_idx()
848 u32 ale_entry[ALE_ENTRY_WORDS]; in cpsw_ale_set_allmulti() local
854 cpsw_ale_read(ale, idx, ale_entry); in cpsw_ale_set_allmulti()
855 type = cpsw_ale_get_entry_type(ale_entry); in cpsw_ale_set_allmulti()
859 vlan_members = cpsw_ale_vlan_get_fld(ale, ale_entry, in cpsw_ale_set_allmulti()
866 cpsw_ale_vlan_set_unreg_mcast(ale, ale_entry, allmulti); in cpsw_ale_set_allmulti()
868 cpsw_ale_vlan_set_unreg_mcast_idx(ale, ale_entry, in cpsw_ale_set_allmulti()
871 cpsw_ale_write(ale, idx, ale_entry); in cpsw_ale_set_allmulti()