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