1 // SPDX-License-Identifier: ISC 2 /* 3 * Copyright (c) 2014 Broadcom Corporation 4 */ 5 #ifndef BRCMFMAC_FLOWRING_H 6 #define BRCMFMAC_FLOWRING_H 7 8 9 #define BRCMF_FLOWRING_HASHSIZE 512 /* has to be 2^x */ 10 #define BRCMF_FLOWRING_INVALID_ID 0xFFFFFFFF 11 12 13 struct brcmf_flowring_hash { 14 u8 mac[ETH_ALEN]; 15 u8 fifo; 16 u8 ifidx; 17 u16 flowid; 18 }; 19 20 enum ring_status { 21 RING_CLOSED, 22 RING_CLOSING, 23 RING_OPEN 24 }; 25 26 struct brcmf_flowring_ring { 27 u16 hash_id; 28 bool blocked; 29 enum ring_status status; 30 struct sk_buff_head skblist; 31 }; 32 33 struct brcmf_flowring_tdls_entry { 34 u8 mac[ETH_ALEN]; 35 struct brcmf_flowring_tdls_entry *next; 36 }; 37 38 struct brcmf_flowring { 39 struct device *dev; 40 struct brcmf_flowring_hash hash[BRCMF_FLOWRING_HASHSIZE]; 41 struct brcmf_flowring_ring **rings; 42 spinlock_t block_lock; 43 enum proto_addr_mode addr_mode[BRCMF_MAX_IFS]; 44 u16 nrofrings; 45 bool tdls_active; 46 struct brcmf_flowring_tdls_entry *tdls_entry; 47 }; 48 49 50 u32 brcmf_flowring_lookup(struct brcmf_flowring *flow, u8 da[ETH_ALEN], 51 u8 prio, u8 ifidx); 52 u32 brcmf_flowring_create(struct brcmf_flowring *flow, u8 da[ETH_ALEN], 53 u8 prio, u8 ifidx); 54 void brcmf_flowring_delete(struct brcmf_flowring *flow, u16 flowid); 55 void brcmf_flowring_open(struct brcmf_flowring *flow, u16 flowid); 56 u8 brcmf_flowring_tid(struct brcmf_flowring *flow, u16 flowid); 57 u32 brcmf_flowring_enqueue(struct brcmf_flowring *flow, u16 flowid, 58 struct sk_buff *skb); 59 struct sk_buff *brcmf_flowring_dequeue(struct brcmf_flowring *flow, u16 flowid); 60 void brcmf_flowring_reinsert(struct brcmf_flowring *flow, u16 flowid, 61 struct sk_buff *skb); 62 u32 brcmf_flowring_qlen(struct brcmf_flowring *flow, u16 flowid); 63 u8 brcmf_flowring_ifidx_get(struct brcmf_flowring *flow, u16 flowid); 64 struct brcmf_flowring *brcmf_flowring_attach(struct device *dev, u16 nrofrings); 65 void brcmf_flowring_detach(struct brcmf_flowring *flow); 66 void brcmf_flowring_configure_addr_mode(struct brcmf_flowring *flow, int ifidx, 67 enum proto_addr_mode addr_mode); 68 void brcmf_flowring_delete_peer(struct brcmf_flowring *flow, int ifidx, 69 u8 peer[ETH_ALEN]); 70 void brcmf_flowring_add_tdls_peer(struct brcmf_flowring *flow, int ifidx, 71 u8 peer[ETH_ALEN]); 72 73 74 #endif /* BRCMFMAC_FLOWRING_H */ 75