xref: /freebsd/sys/contrib/dev/broadcom/brcm80211/brcmfmac/proto.h (revision 902136e0fe112383ec64d2ef43a446063b5e6417)
1b4c3e9b5SBjoern A. Zeeb // SPDX-License-Identifier: ISC
2b4c3e9b5SBjoern A. Zeeb /*
3b4c3e9b5SBjoern A. Zeeb  * Copyright (c) 2013 Broadcom Corporation
4b4c3e9b5SBjoern A. Zeeb  */
5b4c3e9b5SBjoern A. Zeeb #ifndef BRCMFMAC_PROTO_H
6b4c3e9b5SBjoern A. Zeeb #define BRCMFMAC_PROTO_H
7b4c3e9b5SBjoern A. Zeeb 
8b4c3e9b5SBjoern A. Zeeb 
9b4c3e9b5SBjoern A. Zeeb enum proto_addr_mode {
10b4c3e9b5SBjoern A. Zeeb 	ADDR_INDIRECT	= 0,
11b4c3e9b5SBjoern A. Zeeb 	ADDR_DIRECT
12b4c3e9b5SBjoern A. Zeeb };
13b4c3e9b5SBjoern A. Zeeb 
14b4c3e9b5SBjoern A. Zeeb struct brcmf_skb_reorder_data {
15b4c3e9b5SBjoern A. Zeeb 	u8 *reorder;
16b4c3e9b5SBjoern A. Zeeb };
17b4c3e9b5SBjoern A. Zeeb 
18b4c3e9b5SBjoern A. Zeeb struct brcmf_proto {
19b4c3e9b5SBjoern A. Zeeb 	int (*hdrpull)(struct brcmf_pub *drvr, bool do_fws,
20b4c3e9b5SBjoern A. Zeeb 		       struct sk_buff *skb, struct brcmf_if **ifp);
21b4c3e9b5SBjoern A. Zeeb 	int (*query_dcmd)(struct brcmf_pub *drvr, int ifidx, uint cmd,
22b4c3e9b5SBjoern A. Zeeb 			  void *buf, uint len, int *fwerr);
23b4c3e9b5SBjoern A. Zeeb 	int (*set_dcmd)(struct brcmf_pub *drvr, int ifidx, uint cmd, void *buf,
24b4c3e9b5SBjoern A. Zeeb 			uint len, int *fwerr);
25b4c3e9b5SBjoern A. Zeeb 	int (*tx_queue_data)(struct brcmf_pub *drvr, int ifidx,
26b4c3e9b5SBjoern A. Zeeb 			     struct sk_buff *skb);
27b4c3e9b5SBjoern A. Zeeb 	int (*txdata)(struct brcmf_pub *drvr, int ifidx, u8 offset,
28b4c3e9b5SBjoern A. Zeeb 		      struct sk_buff *skb);
29b4c3e9b5SBjoern A. Zeeb 	void (*configure_addr_mode)(struct brcmf_pub *drvr, int ifidx,
30b4c3e9b5SBjoern A. Zeeb 				    enum proto_addr_mode addr_mode);
31b4c3e9b5SBjoern A. Zeeb 	void (*delete_peer)(struct brcmf_pub *drvr, int ifidx,
32*902136e0SBjoern A. Zeeb #if defined(__linux__)
33b4c3e9b5SBjoern A. Zeeb 			    u8 peer[ETH_ALEN]);
34*902136e0SBjoern A. Zeeb #elif defined(__FreeBSD__)
35*902136e0SBjoern A. Zeeb 			    const u8 peer[ETH_ALEN]);
36*902136e0SBjoern A. Zeeb #endif
37b4c3e9b5SBjoern A. Zeeb 	void (*add_tdls_peer)(struct brcmf_pub *drvr, int ifidx,
38*902136e0SBjoern A. Zeeb #if defined(__linux__)
39b4c3e9b5SBjoern A. Zeeb 			      u8 peer[ETH_ALEN]);
40*902136e0SBjoern A. Zeeb #elif defined(__FreeBSD__)
41*902136e0SBjoern A. Zeeb 			      const u8 peer[ETH_ALEN]);
42*902136e0SBjoern A. Zeeb #endif
43b4c3e9b5SBjoern A. Zeeb 	void (*rxreorder)(struct brcmf_if *ifp, struct sk_buff *skb);
44b4c3e9b5SBjoern A. Zeeb 	void (*add_if)(struct brcmf_if *ifp);
45b4c3e9b5SBjoern A. Zeeb 	void (*del_if)(struct brcmf_if *ifp);
46b4c3e9b5SBjoern A. Zeeb 	void (*reset_if)(struct brcmf_if *ifp);
47b4c3e9b5SBjoern A. Zeeb 	int (*init_done)(struct brcmf_pub *drvr);
48b4c3e9b5SBjoern A. Zeeb 	void (*debugfs_create)(struct brcmf_pub *drvr);
49b4c3e9b5SBjoern A. Zeeb 	void *pd;
50b4c3e9b5SBjoern A. Zeeb };
51b4c3e9b5SBjoern A. Zeeb 
52b4c3e9b5SBjoern A. Zeeb 
53b4c3e9b5SBjoern A. Zeeb int brcmf_proto_attach(struct brcmf_pub *drvr);
54b4c3e9b5SBjoern A. Zeeb void brcmf_proto_detach(struct brcmf_pub *drvr);
55b4c3e9b5SBjoern A. Zeeb 
brcmf_proto_hdrpull(struct brcmf_pub * drvr,bool do_fws,struct sk_buff * skb,struct brcmf_if ** ifp)56b4c3e9b5SBjoern A. Zeeb static inline int brcmf_proto_hdrpull(struct brcmf_pub *drvr, bool do_fws,
57b4c3e9b5SBjoern A. Zeeb 				      struct sk_buff *skb,
58b4c3e9b5SBjoern A. Zeeb 				      struct brcmf_if **ifp)
59b4c3e9b5SBjoern A. Zeeb {
60b4c3e9b5SBjoern A. Zeeb 	struct brcmf_if *tmp = NULL;
61b4c3e9b5SBjoern A. Zeeb 
62b4c3e9b5SBjoern A. Zeeb 	/* assure protocol is always called with
63b4c3e9b5SBjoern A. Zeeb 	 * non-null initialized pointer.
64b4c3e9b5SBjoern A. Zeeb 	 */
65b4c3e9b5SBjoern A. Zeeb 	if (ifp)
66b4c3e9b5SBjoern A. Zeeb 		*ifp = NULL;
67b4c3e9b5SBjoern A. Zeeb 	else
68b4c3e9b5SBjoern A. Zeeb 		ifp = &tmp;
69b4c3e9b5SBjoern A. Zeeb 	return drvr->proto->hdrpull(drvr, do_fws, skb, ifp);
70b4c3e9b5SBjoern A. Zeeb }
brcmf_proto_query_dcmd(struct brcmf_pub * drvr,int ifidx,uint cmd,void * buf,uint len,int * fwerr)71b4c3e9b5SBjoern A. Zeeb static inline int brcmf_proto_query_dcmd(struct brcmf_pub *drvr, int ifidx,
72b4c3e9b5SBjoern A. Zeeb 					 uint cmd, void *buf, uint len,
73b4c3e9b5SBjoern A. Zeeb 					 int *fwerr)
74b4c3e9b5SBjoern A. Zeeb {
75b4c3e9b5SBjoern A. Zeeb 	return drvr->proto->query_dcmd(drvr, ifidx, cmd, buf, len,fwerr);
76b4c3e9b5SBjoern A. Zeeb }
brcmf_proto_set_dcmd(struct brcmf_pub * drvr,int ifidx,uint cmd,void * buf,uint len,int * fwerr)77b4c3e9b5SBjoern A. Zeeb static inline int brcmf_proto_set_dcmd(struct brcmf_pub *drvr, int ifidx,
78b4c3e9b5SBjoern A. Zeeb 				       uint cmd, void *buf, uint len,
79b4c3e9b5SBjoern A. Zeeb 				       int *fwerr)
80b4c3e9b5SBjoern A. Zeeb {
81b4c3e9b5SBjoern A. Zeeb 	return drvr->proto->set_dcmd(drvr, ifidx, cmd, buf, len, fwerr);
82b4c3e9b5SBjoern A. Zeeb }
83b4c3e9b5SBjoern A. Zeeb 
brcmf_proto_tx_queue_data(struct brcmf_pub * drvr,int ifidx,struct sk_buff * skb)84b4c3e9b5SBjoern A. Zeeb static inline int brcmf_proto_tx_queue_data(struct brcmf_pub *drvr, int ifidx,
85b4c3e9b5SBjoern A. Zeeb 					    struct sk_buff *skb)
86b4c3e9b5SBjoern A. Zeeb {
87b4c3e9b5SBjoern A. Zeeb 	return drvr->proto->tx_queue_data(drvr, ifidx, skb);
88b4c3e9b5SBjoern A. Zeeb }
89b4c3e9b5SBjoern A. Zeeb 
brcmf_proto_txdata(struct brcmf_pub * drvr,int ifidx,u8 offset,struct sk_buff * skb)90b4c3e9b5SBjoern A. Zeeb static inline int brcmf_proto_txdata(struct brcmf_pub *drvr, int ifidx,
91b4c3e9b5SBjoern A. Zeeb 				     u8 offset, struct sk_buff *skb)
92b4c3e9b5SBjoern A. Zeeb {
93b4c3e9b5SBjoern A. Zeeb 	return drvr->proto->txdata(drvr, ifidx, offset, skb);
94b4c3e9b5SBjoern A. Zeeb }
95b4c3e9b5SBjoern A. Zeeb static inline void
brcmf_proto_configure_addr_mode(struct brcmf_pub * drvr,int ifidx,enum proto_addr_mode addr_mode)96b4c3e9b5SBjoern A. Zeeb brcmf_proto_configure_addr_mode(struct brcmf_pub *drvr, int ifidx,
97b4c3e9b5SBjoern A. Zeeb 				enum proto_addr_mode addr_mode)
98b4c3e9b5SBjoern A. Zeeb {
99b4c3e9b5SBjoern A. Zeeb 	drvr->proto->configure_addr_mode(drvr, ifidx, addr_mode);
100b4c3e9b5SBjoern A. Zeeb }
101b4c3e9b5SBjoern A. Zeeb static inline void
102*902136e0SBjoern A. Zeeb #if defined(__linux__)
brcmf_proto_delete_peer(struct brcmf_pub * drvr,int ifidx,u8 peer[ETH_ALEN])103b4c3e9b5SBjoern A. Zeeb brcmf_proto_delete_peer(struct brcmf_pub *drvr, int ifidx, u8 peer[ETH_ALEN])
104*902136e0SBjoern A. Zeeb #elif defined(__FreeBSD__)
105*902136e0SBjoern A. Zeeb brcmf_proto_delete_peer(struct brcmf_pub *drvr, int ifidx, const u8 peer[ETH_ALEN])
106*902136e0SBjoern A. Zeeb #endif
107b4c3e9b5SBjoern A. Zeeb {
108b4c3e9b5SBjoern A. Zeeb 	drvr->proto->delete_peer(drvr, ifidx, peer);
109b4c3e9b5SBjoern A. Zeeb }
110b4c3e9b5SBjoern A. Zeeb static inline void
111*902136e0SBjoern A. Zeeb #if defined(__linux__)
brcmf_proto_add_tdls_peer(struct brcmf_pub * drvr,int ifidx,u8 peer[ETH_ALEN])112b4c3e9b5SBjoern A. Zeeb brcmf_proto_add_tdls_peer(struct brcmf_pub *drvr, int ifidx, u8 peer[ETH_ALEN])
113*902136e0SBjoern A. Zeeb #elif defined(__FreeBSD__)
114*902136e0SBjoern A. Zeeb brcmf_proto_add_tdls_peer(struct brcmf_pub *drvr, int ifidx, const u8 peer[ETH_ALEN])
115*902136e0SBjoern A. Zeeb #endif
116b4c3e9b5SBjoern A. Zeeb {
117b4c3e9b5SBjoern A. Zeeb 	drvr->proto->add_tdls_peer(drvr, ifidx, peer);
118b4c3e9b5SBjoern A. Zeeb }
brcmf_proto_is_reorder_skb(struct sk_buff * skb)119b4c3e9b5SBjoern A. Zeeb static inline bool brcmf_proto_is_reorder_skb(struct sk_buff *skb)
120b4c3e9b5SBjoern A. Zeeb {
121b4c3e9b5SBjoern A. Zeeb 	struct brcmf_skb_reorder_data *rd;
122b4c3e9b5SBjoern A. Zeeb 
123b4c3e9b5SBjoern A. Zeeb 	rd = (struct brcmf_skb_reorder_data *)skb->cb;
124b4c3e9b5SBjoern A. Zeeb 	return !!rd->reorder;
125b4c3e9b5SBjoern A. Zeeb }
126b4c3e9b5SBjoern A. Zeeb 
127b4c3e9b5SBjoern A. Zeeb static inline void
brcmf_proto_rxreorder(struct brcmf_if * ifp,struct sk_buff * skb)128b4c3e9b5SBjoern A. Zeeb brcmf_proto_rxreorder(struct brcmf_if *ifp, struct sk_buff *skb)
129b4c3e9b5SBjoern A. Zeeb {
130b4c3e9b5SBjoern A. Zeeb 	ifp->drvr->proto->rxreorder(ifp, skb);
131b4c3e9b5SBjoern A. Zeeb }
132b4c3e9b5SBjoern A. Zeeb 
133b4c3e9b5SBjoern A. Zeeb static inline void
brcmf_proto_add_if(struct brcmf_pub * drvr,struct brcmf_if * ifp)134b4c3e9b5SBjoern A. Zeeb brcmf_proto_add_if(struct brcmf_pub *drvr, struct brcmf_if *ifp)
135b4c3e9b5SBjoern A. Zeeb {
136b4c3e9b5SBjoern A. Zeeb 	if (!drvr->proto->add_if)
137b4c3e9b5SBjoern A. Zeeb 		return;
138b4c3e9b5SBjoern A. Zeeb 	drvr->proto->add_if(ifp);
139b4c3e9b5SBjoern A. Zeeb }
140b4c3e9b5SBjoern A. Zeeb 
141b4c3e9b5SBjoern A. Zeeb static inline void
brcmf_proto_del_if(struct brcmf_pub * drvr,struct brcmf_if * ifp)142b4c3e9b5SBjoern A. Zeeb brcmf_proto_del_if(struct brcmf_pub *drvr, struct brcmf_if *ifp)
143b4c3e9b5SBjoern A. Zeeb {
144b4c3e9b5SBjoern A. Zeeb 	if (!drvr->proto->del_if)
145b4c3e9b5SBjoern A. Zeeb 		return;
146b4c3e9b5SBjoern A. Zeeb 	drvr->proto->del_if(ifp);
147b4c3e9b5SBjoern A. Zeeb }
148b4c3e9b5SBjoern A. Zeeb 
149b4c3e9b5SBjoern A. Zeeb static inline void
brcmf_proto_reset_if(struct brcmf_pub * drvr,struct brcmf_if * ifp)150b4c3e9b5SBjoern A. Zeeb brcmf_proto_reset_if(struct brcmf_pub *drvr, struct brcmf_if *ifp)
151b4c3e9b5SBjoern A. Zeeb {
152b4c3e9b5SBjoern A. Zeeb 	if (!drvr->proto->reset_if)
153b4c3e9b5SBjoern A. Zeeb 		return;
154b4c3e9b5SBjoern A. Zeeb 	drvr->proto->reset_if(ifp);
155b4c3e9b5SBjoern A. Zeeb }
156b4c3e9b5SBjoern A. Zeeb 
157b4c3e9b5SBjoern A. Zeeb static inline int
brcmf_proto_init_done(struct brcmf_pub * drvr)158b4c3e9b5SBjoern A. Zeeb brcmf_proto_init_done(struct brcmf_pub *drvr)
159b4c3e9b5SBjoern A. Zeeb {
160b4c3e9b5SBjoern A. Zeeb 	if (!drvr->proto->init_done)
161b4c3e9b5SBjoern A. Zeeb 		return 0;
162b4c3e9b5SBjoern A. Zeeb 	return drvr->proto->init_done(drvr);
163b4c3e9b5SBjoern A. Zeeb }
164b4c3e9b5SBjoern A. Zeeb 
165b4c3e9b5SBjoern A. Zeeb static inline void
brcmf_proto_debugfs_create(struct brcmf_pub * drvr)166b4c3e9b5SBjoern A. Zeeb brcmf_proto_debugfs_create(struct brcmf_pub *drvr)
167b4c3e9b5SBjoern A. Zeeb {
168b4c3e9b5SBjoern A. Zeeb 	drvr->proto->debugfs_create(drvr);
169b4c3e9b5SBjoern A. Zeeb }
170b4c3e9b5SBjoern A. Zeeb 
171b4c3e9b5SBjoern A. Zeeb #endif /* BRCMFMAC_PROTO_H */
172