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