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