xref: /wlan-dirver/qca-wifi-host-cmn/os_if/linux/wlan_cfg80211.h (revision a86b23ee68a2491aede2e03991f3fb37046f4e41)
1 /*
2  * Copyright (c) 2016-2020 The Linux Foundation. All rights reserved.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for
5  * any purpose with or without fee is hereby granted, provided that the
6  * above copyright notice and this permission notice appear in all
7  * copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16  * PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 /**
20  * DOC: declares driver functions interfacing with linux kernel
21  */
22 
23 
24 #ifndef _WLAN_CFG80211_H_
25 #define _WLAN_CFG80211_H_
26 
27 #include <linux/version.h>
28 #include <linux/netdevice.h>
29 #include <net/netlink.h>
30 #include <net/cfg80211.h>
31 #include <qca_vendor.h>
32 #include <qdf_nbuf.h>
33 #include "qal_devcfg.h"
34 
35 #define osif_alert(params...) \
36 	QDF_TRACE_FATAL(QDF_MODULE_ID_OS_IF, params)
37 #define osif_err(params...) \
38 	QDF_TRACE_ERROR(QDF_MODULE_ID_OS_IF, params)
39 #define osif_warn(params...) \
40 	QDF_TRACE_WARN(QDF_MODULE_ID_OS_IF, params)
41 #define osif_notice(params...) \
42 	QDF_TRACE_INFO(QDF_MODULE_ID_OS_IF, params)
43 #define osif_info(params...) \
44 	QDF_TRACE_INFO(QDF_MODULE_ID_OS_IF, params)
45 #define osif_debug(params...) \
46 	QDF_TRACE_DEBUG(QDF_MODULE_ID_OS_IF, params)
47 #define osif_rl_debug(params...) \
48 	QDF_TRACE_DEBUG_RL(QDF_MODULE_ID_OS_IF, params)
49 
50 #define osif_nofl_alert(params...) \
51 	QDF_TRACE_FATAL_NO_FL(QDF_MODULE_ID_OS_IF, params)
52 #define osif_nofl_err(params...) \
53 	QDF_TRACE_ERROR_NO_FL(QDF_MODULE_ID_OS_IF, params)
54 #define osif_nofl_warn(params...) \
55 	QDF_TRACE_WARN_NO_FL(QDF_MODULE_ID_OS_IF, params)
56 #define osif_nofl_info(params...) \
57 	QDF_TRACE_INFO_NO_FL(QDF_MODULE_ID_OS_IF, params)
58 #define osif_nofl_debug(params...) \
59 	QDF_TRACE_DEBUG_NO_FL(QDF_MODULE_ID_OS_IF, params)
60 
61 /* For kernel version >= 5.2, driver needs to provide policy */
62 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 2, 0))
63 #define vendor_command_policy(__policy, __maxattr) \
64 	.policy = __policy,                        \
65 	.maxattr = __maxattr
66 #define VENDOR_NLA_POLICY_NESTED(__policy) \
67 	NLA_POLICY_NESTED(__policy)
68 #else
69 #define vendor_command_policy(__policy, __maxattr)
70 #define VENDOR_NLA_POLICY_NESTED(__policy) {.type = NLA_NESTED}
71 #endif /*End of (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 2, 0) */
72 
73 /* For kernel version <= 4.20, driver needs to provide policy */
74 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 20, 0))
75 #define VENDOR_NLA_POLICY_MAC_ADDR NLA_POLICY_ETH_ADDR
76 #else
77 #define VENDOR_NLA_POLICY_MAC_ADDR \
78 	{.type = NLA_UNSPEC, .len = QDF_MAC_ADDR_SIZE}
79 #define NLA_EXACT_LEN NLA_UNSPEC
80 #endif /*End of (LINUX_VERSION_CODE <= KERNEL_VERSION(4, 20, 0) */
81 
82 #if defined(NBUF_MEMORY_DEBUG) && defined(NETLINK_BUF_TRACK)
83 #define wlan_cfg80211_vendor_free_skb(skb) \
84 	qdf_nbuf_free(skb)
85 
86 #define wlan_cfg80211_vendor_event(skb, gfp) \
87 { \
88 	qdf_nbuf_count_dec(skb); \
89 	qdf_net_buf_debug_release_skb(skb); \
90 	cfg80211_vendor_event(skb, gfp); \
91 }
92 
93 #define wlan_cfg80211_vendor_cmd_reply(skb) \
94 { \
95 	qdf_nbuf_count_dec(skb); \
96 	qdf_net_buf_debug_release_skb(skb); \
97 	cfg80211_vendor_cmd_reply(skb); \
98 }
99 
100 static inline QDF_STATUS wlan_cfg80211_qal_devcfg_send_response(qdf_nbuf_t skb)
101 {
102 	qdf_nbuf_count_dec(skb);
103 	qdf_net_buf_debug_release_skb(skb);
104 	return qal_devcfg_send_response(skb);
105 }
106 
107 static inline struct sk_buff *
108 __cfg80211_vendor_cmd_alloc_reply_skb(struct wiphy *wiphy, int len,
109 				      const char *func, uint32_t line)
110 {
111 	struct sk_buff *skb;
112 
113 	skb = cfg80211_vendor_cmd_alloc_reply_skb(wiphy, len);
114 	if (skb) {
115 		qdf_nbuf_count_inc(skb);
116 		qdf_net_buf_debug_acquire_skb(skb, func, line);
117 	}
118 	return skb;
119 }
120 #define wlan_cfg80211_vendor_cmd_alloc_reply_skb(wiphy, len) \
121 	__cfg80211_vendor_cmd_alloc_reply_skb(wiphy, len, __func__, __LINE__)
122 
123 static inline struct sk_buff *
124 __cfg80211_vendor_event_alloc(struct wiphy *wiphy,
125 			      struct wireless_dev *wdev,
126 			      int approxlen,
127 			      int event_idx,
128 			      gfp_t gfp,
129 			      const char *func,
130 			      uint32_t line)
131 {
132 	struct sk_buff *skb;
133 
134 	skb = cfg80211_vendor_event_alloc(wiphy, wdev,
135 					  approxlen,
136 					  event_idx,
137 					  gfp);
138 	if (skb) {
139 		qdf_nbuf_count_inc(skb);
140 		qdf_net_buf_debug_acquire_skb(skb, func, line);
141 	}
142 	return skb;
143 }
144 #define wlan_cfg80211_vendor_event_alloc(wiphy, wdev, len, idx, gfp) \
145 	__cfg80211_vendor_event_alloc(wiphy, wdev, len, \
146 				      idx, gfp, \
147 				      __func__, __LINE__)
148 #else /* NBUF_MEMORY_DEBUG && NETLINK_BUF_TRACK */
149 #define wlan_cfg80211_vendor_free_skb(skb) \
150 	kfree_skb(skb)
151 
152 #define wlan_cfg80211_vendor_event(skb, gfp) \
153 	cfg80211_vendor_event(skb, gfp)
154 
155 #define wlan_cfg80211_vendor_cmd_reply(skb) \
156 	cfg80211_vendor_cmd_reply(skb)
157 
158 #define wlan_cfg80211_vendor_cmd_alloc_reply_skb(wiphy, len) \
159 	cfg80211_vendor_cmd_alloc_reply_skb(wiphy, len)
160 
161 #define wlan_cfg80211_vendor_event_alloc(wiphy, wdev, len, idx, gfp) \
162 	cfg80211_vendor_event_alloc(wiphy, wdev, len, idx, gfp)
163 
164 static inline QDF_STATUS wlan_cfg80211_qal_devcfg_send_response( qdf_nbuf_t skb)
165 {
166 	return qal_devcfg_send_response(skb);
167 }
168 #endif /* NBUF_MEMORY_DEBUG && NETLINK_BUF_TRACK */
169 
170 #undef nla_parse
171 #undef nla_parse_nested
172 #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 12, 0)
173 static inline int wlan_cfg80211_nla_parse(struct nlattr **tb,
174 					  int maxtype,
175 					  const struct nlattr *head,
176 					  int len,
177 					  const struct nla_policy *policy)
178 {
179 	return nla_parse(tb, maxtype, head, len, policy);
180 }
181 
182 static inline int
183 wlan_cfg80211_nla_parse_nested(struct nlattr *tb[],
184 			       int maxtype,
185 			       const struct nlattr *nla,
186 			       const struct nla_policy *policy)
187 {
188 	return nla_parse_nested(tb, maxtype, nla, policy);
189 }
190 #else
191 static inline int wlan_cfg80211_nla_parse(struct nlattr **tb,
192 					  int maxtype,
193 					  const struct nlattr *head,
194 					  int len,
195 					  const struct nla_policy *policy)
196 {
197 	return nla_parse(tb, maxtype, head, len, policy, NULL);
198 }
199 
200 static inline int
201 wlan_cfg80211_nla_parse_nested(struct nlattr *tb[],
202 			       int maxtype,
203 			       const struct nlattr *nla,
204 			       const struct nla_policy *policy)
205 {
206 	return nla_parse_nested(tb, maxtype, nla, policy, NULL);
207 }
208 #endif
209 #define nla_parse(...) (obsolete, use wlan_cfg80211_nla_parse)
210 #define nla_parse_nested(...) (obsolete, use wlan_cfg80211_nla_parse_nested)
211 
212 #if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 7, 0))
213 static inline int
214 wlan_cfg80211_nla_put_u64(struct sk_buff *skb, int attrtype, u64 value)
215 {
216 	return nla_put_u64(skb, attrtype, value);
217 }
218 #else
219 static inline int
220 wlan_cfg80211_nla_put_u64(struct sk_buff *skb, int attrtype, u64 value)
221 {
222 	return nla_put_u64_64bit(skb, attrtype, value, NL80211_ATTR_PAD);
223 }
224 #endif
225 #endif
226