os_if_son.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552
  1. /*
  2. * Copyright (c) 2021, The Linux Foundation. All rights reserved.
  3. * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
  4. *
  5. * Permission to use, copy, modify, and/or distribute this software for any
  6. * purpose with or without fee is hereby granted, provided that the above
  7. * copyright notice and this permission notice appear in all copies.
  8. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  9. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  10. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  11. * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  12. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  13. * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  14. * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  15. */
  16. /**
  17. * DOC : os_if_son.h
  18. *
  19. * WLAN Host Device Driver file for son (Self Organizing Network)
  20. * support.
  21. *
  22. */
  23. #ifndef _OS_IF_SON_H_
  24. #define _OS_IF_SON_H_
  25. #include <qdf_types.h>
  26. #include <wlan_objmgr_vdev_obj.h>
  27. #include <wlan_objmgr_psoc_obj.h>
  28. #include <wlan_objmgr_pdev_obj.h>
  29. #include <wlan_reg_ucfg_api.h>
  30. #include <ieee80211_external.h>
  31. #define INVALID_WIDTH 0xFF
  32. /**
  33. * struct son_callbacks - struct containing callback to non-converged driver
  34. * @os_if_is_acs_in_progress: whether acs is in progress or not
  35. * @os_if_set_chan_ext_offset: set chan extend offset
  36. * @os_if_get_chan_ext_offset: get chan extend offset
  37. * @os_if_set_bandwidth: set band width
  38. * @os_if_get_bandwidth: get band width
  39. * @os_if_set_chan: set chan
  40. * @os_if_set_country_code: set country code
  41. * @os_if_set_candidate_freq: set freq to switch after radar detection
  42. * @os_if_get_candidate_freq: get freq to switch after radar detection
  43. * @os_if_set_phymode: set phy mode
  44. * @os_if_get_phymode: get phy mode
  45. * @os_if_get_rx_nss: Gets number of RX spatial streams
  46. * @os_if_set_acl_policy: set acl policy
  47. * @os_if_get_acl_policy: get acl policy
  48. * @os_if_add_acl_mac: add mac to acl
  49. * @os_if_del_acl_mac: del mac from acl
  50. * @os_if_kickout_mac: kickout sta with given mac
  51. * @os_if_set_chwidth: set chan width
  52. * @os_if_get_chwidth: get chan width
  53. * @os_if_get_sta_list: get sta list
  54. * @os_if_get_sta_space: get sta space
  55. * @os_if_deauth_sta: Deauths the target peer
  56. * @os_if_modify_acl: Add/Del target peer in ACL
  57. */
  58. struct son_callbacks {
  59. uint32_t (*os_if_is_acs_in_progress)(struct wlan_objmgr_vdev *vdev);
  60. int (*os_if_set_chan_ext_offset)(
  61. struct wlan_objmgr_vdev *vdev,
  62. enum sec20_chan_offset son_chan_ext_offset);
  63. enum sec20_chan_offset (*os_if_get_chan_ext_offset)(
  64. struct wlan_objmgr_vdev *vdev);
  65. int (*os_if_set_bandwidth)(struct wlan_objmgr_vdev *vdev,
  66. uint32_t son_bandwidth);
  67. uint32_t (*os_if_get_bandwidth)(struct wlan_objmgr_vdev *vdev);
  68. int (*os_if_set_chan)(struct wlan_objmgr_vdev *vdev, int chan,
  69. enum wlan_band_id son_band);
  70. uint32_t (*os_if_get_sta_count)(struct wlan_objmgr_vdev *vdev);
  71. int (*os_if_set_country_code)(struct wlan_objmgr_vdev *vdev,
  72. char *country_code);
  73. int (*os_if_set_candidate_freq)(struct wlan_objmgr_vdev *vdev,
  74. qdf_freq_t freq);
  75. qdf_freq_t (*os_if_get_candidate_freq)(struct wlan_objmgr_vdev *vdev);
  76. int (*os_if_set_phymode)(struct wlan_objmgr_vdev *vdev,
  77. enum ieee80211_phymode mode);
  78. enum ieee80211_phymode (*os_if_get_phymode)(
  79. struct wlan_objmgr_vdev *vdev);
  80. uint8_t (*os_if_get_rx_nss)(struct wlan_objmgr_vdev *vdev);
  81. QDF_STATUS (*os_if_set_acl_policy)(struct wlan_objmgr_vdev *vdev,
  82. ieee80211_acl_cmd son_acl_policy);
  83. ieee80211_acl_cmd (*os_if_get_acl_policy)(
  84. struct wlan_objmgr_vdev *vdev);
  85. int (*os_if_add_acl_mac)(struct wlan_objmgr_vdev *vdev,
  86. struct qdf_mac_addr *acl_mac);
  87. int (*os_if_del_acl_mac)(struct wlan_objmgr_vdev *vdev,
  88. struct qdf_mac_addr *acl_mac);
  89. int (*os_if_kickout_mac)(struct wlan_objmgr_vdev *vdev,
  90. struct qdf_mac_addr *acl_mac);
  91. int (*os_if_set_chwidth)(struct wlan_objmgr_vdev *vdev,
  92. enum ieee80211_cwm_width son_chwidth);
  93. enum ieee80211_cwm_width (*os_if_get_chwidth)(
  94. struct wlan_objmgr_vdev *vdev);
  95. void (*os_if_get_sta_list)(struct wlan_objmgr_vdev *vdev,
  96. struct ieee80211req_sta_info *req,
  97. uint32_t *space);
  98. uint32_t (*os_if_get_sta_space)(struct wlan_objmgr_vdev *vdev);
  99. void (*os_if_deauth_sta)(struct wlan_objmgr_vdev *vdev,
  100. uint8_t *peer_mac,
  101. bool ignore_frame);
  102. void (*os_if_modify_acl)(struct wlan_objmgr_vdev *vdev,
  103. uint8_t *peer_mac,
  104. bool allow_auth);
  105. };
  106. /**
  107. * os_if_son_register_hdd_callbacks() - register son hdd callback
  108. * @psoc: psoc
  109. * @cb_obj: pointer to callback
  110. *
  111. * Return: void
  112. */
  113. void os_if_son_register_hdd_callbacks(struct wlan_objmgr_psoc *psoc,
  114. struct son_callbacks *cb_obj);
  115. /**
  116. * os_if_son_get_freq() - get freq
  117. * @vdev: vdev
  118. *
  119. * Return: freq of given vdev
  120. */
  121. qdf_freq_t os_if_son_get_freq(struct wlan_objmgr_vdev *vdev);
  122. /**
  123. * os_if_son_is_acs_in_progress() - whether ACS in progress or not
  124. * @vdev: vdev
  125. *
  126. * Return: true if ACS is in progress
  127. */
  128. uint32_t os_if_son_is_acs_in_progress(struct wlan_objmgr_vdev *vdev);
  129. /**
  130. * os_if_son_is_cac_in_progress() - whether CAC is in progress or not
  131. * @vdev: vdev
  132. *
  133. * Return: true if CAC is in progress
  134. */
  135. uint32_t os_if_son_is_cac_in_progress(struct wlan_objmgr_vdev *vdev);
  136. /**
  137. * os_if_son_set_chan_ext_offset() - set chan extend offset
  138. * @vdev: vdev
  139. * @son_chan_ext_offset son chan extend offset
  140. *
  141. * Return: 0 on success, negative errno on failure
  142. */
  143. int os_if_son_set_chan_ext_offset(struct wlan_objmgr_vdev *vdev,
  144. enum sec20_chan_offset son_chan_ext_offset);
  145. /**
  146. * os_if_son_get_chan_ext_offset() - get chan extend offset
  147. * @vdev: vdev
  148. *
  149. * Return: enum sec20_chan_offset
  150. */
  151. enum sec20_chan_offset os_if_son_get_chan_ext_offset(
  152. struct wlan_objmgr_vdev *vdev);
  153. /**
  154. * os_if_son_set_bandwidth() - set band width
  155. * @vdev: vdev
  156. * @son_bandwidth: band width
  157. *
  158. * Return: 0 on success, negative errno on failure
  159. */
  160. int os_if_son_set_bandwidth(struct wlan_objmgr_vdev *vdev,
  161. uint32_t son_bandwidth);
  162. /**
  163. * os_if_son_get_bandwidth() - get band width
  164. * @vdev: vdev
  165. *
  166. * Return: band width
  167. */
  168. uint32_t os_if_son_get_bandwidth(struct wlan_objmgr_vdev *vdev);
  169. /**
  170. * os_if_son_get_band_info() - get band info
  171. * @vdev: vdev
  172. *
  173. * Return: band info
  174. */
  175. uint32_t os_if_son_get_band_info(struct wlan_objmgr_vdev *vdev);
  176. /**
  177. * os_if_son_get_chan_list() - get a list of chan information
  178. * @vdev: vdev
  179. * @ic_chans: chan information array to get
  180. * @chan_info: pointer to ieee80211_channel_info to get
  181. * @ic_nchans: number of chan information it gets
  182. * @flag_160: flag indicating the API to fill the center frequencies of 160MHz.
  183. *
  184. * Return: 0 on success, negative errno on failure
  185. */
  186. int os_if_son_get_chan_list(struct wlan_objmgr_vdev *vdev,
  187. struct ieee80211_ath_channel *ic_chans,
  188. struct ieee80211_channel_info *chan_info,
  189. uint8_t *ic_nchans, bool flag_160);
  190. /**
  191. * os_if_son_get_sta_count() - get connected STA count
  192. * @vdev: vdev
  193. *
  194. * Return: connected STA count
  195. */
  196. uint32_t os_if_son_get_sta_count(struct wlan_objmgr_vdev *vdev);
  197. /**
  198. * os_if_son_get_bssid() - get bssid of given vdev
  199. * @vdev: vdev
  200. * @bssid: pointer to BSSID
  201. *
  202. * Return: 0 if BSSID is gotten successfully
  203. */
  204. int os_if_son_get_bssid(struct wlan_objmgr_vdev *vdev,
  205. uint8_t bssid[QDF_MAC_ADDR_SIZE]);
  206. /**
  207. * os_if_son_get_ssid() - get ssid of given vdev
  208. * @vdev: vdev
  209. * @ssid: pointer to SSID
  210. * @ssid_len: ssid length
  211. *
  212. * Return: 0 if SSID is gotten successfully
  213. */
  214. int os_if_son_get_ssid(struct wlan_objmgr_vdev *vdev,
  215. char ssid[WLAN_SSID_MAX_LEN + 1],
  216. uint8_t *ssid_len);
  217. /**
  218. * os_if_son_set_chan() - set chan
  219. * @vdev: vdev
  220. * @chan: given chan
  221. * @son_band: given band
  222. *
  223. * Return: 0 on success, negative errno on failure
  224. */
  225. int os_if_son_set_chan(struct wlan_objmgr_vdev *vdev,
  226. int chan, enum wlan_band_id son_band);
  227. /**
  228. * os_if_son_set_cac_timeout() - set cac timeout
  229. * @vdev: vdev
  230. * @cac_timeout: cac timeount to set
  231. *
  232. * Return: 0 if cac time out is set successfully
  233. */
  234. int os_if_son_set_cac_timeout(struct wlan_objmgr_vdev *vdev,
  235. int cac_timeout);
  236. /**
  237. * os_if_son_get_cac_timeout() - get cac timeout
  238. * @vdev: vdev
  239. * @cac_timeout: cac timeout to get
  240. *
  241. * Return 0 if cac time out is get successfully
  242. */
  243. int os_if_son_get_cac_timeout(struct wlan_objmgr_vdev *vdev,
  244. int *cac_timeout);
  245. /**
  246. * os_if_son_set_country_code() - set country code
  247. * @vdev: vdev
  248. * @country_code: country code to set
  249. *
  250. * Return: 0 if country code is set successfully
  251. */
  252. int os_if_son_set_country_code(struct wlan_objmgr_vdev *vdev,
  253. char *country_code);
  254. /**
  255. * os_if_son_get_country_code() - get country code
  256. * @vdev: vdev
  257. * @country_code: country code to get
  258. *
  259. * Return: 0 if country code is get successfully
  260. */
  261. int os_if_son_get_country_code(struct wlan_objmgr_vdev *vdev,
  262. char *country_code);
  263. /**
  264. * os_if_son_set_candidate_freq() - set freq to switch after radar detection
  265. * @vdev: vdev
  266. * @freq: freq to switch
  267. *
  268. * Return: 0 if candidate freq is set successfully
  269. */
  270. int os_if_son_set_candidate_freq(struct wlan_objmgr_vdev *vdev,
  271. qdf_freq_t freq);
  272. /**
  273. * os_if_son_get_candidate_freq() - get freq to switch after radar detection
  274. * @vdev: vdev
  275. *
  276. * Return: candidate freq to switch after radar detection
  277. */
  278. qdf_freq_t os_if_son_get_candidate_freq(struct wlan_objmgr_vdev *vdev);
  279. /**
  280. * os_if_son_get_phymode() - get phy mode
  281. * @vdev: vdev
  282. *
  283. * Return: enum ieee80211_phymode
  284. */
  285. enum ieee80211_phymode os_if_son_get_phymode(struct wlan_objmgr_vdev *vdev);
  286. /**
  287. * os_if_son_set_phymode() - set phy mode
  288. * @vdev: vdev
  289. * @mode: son phy mode to set
  290. *
  291. * Return: 0 on success, negative errno on failure
  292. */
  293. int os_if_son_set_phymode(struct wlan_objmgr_vdev *vdev,
  294. enum ieee80211_phymode mode);
  295. /**
  296. * os_if_son_get_phy_stats() - get phy stats
  297. * @vdev: vdev
  298. * @phy_stats: phy stats
  299. *
  300. * Return: void
  301. */
  302. void os_if_son_get_phy_stats(struct wlan_objmgr_vdev *vdev,
  303. struct ol_ath_radiostats *phy_stats);
  304. /**
  305. * os_if_son_get_chan_util() - get chan utilization
  306. * @vdev: vdev
  307. *
  308. * Return: chan utilization (0 - 100)
  309. */
  310. uint8_t os_if_son_get_chan_util(struct wlan_objmgr_vdev *vdev);
  311. /**
  312. * os_if_son_pdev_ops() - Handles PDEV specific SON commands
  313. * @pdev: pdev
  314. * @type: SON command to handle
  315. * @data: Input Data
  316. * @ret: Output Data
  317. *
  318. * Return: QDF_SUCCCESS_SUCCESS in case of success
  319. */
  320. QDF_STATUS os_if_son_pdev_ops(struct wlan_objmgr_pdev *pdev,
  321. enum wlan_mlme_pdev_param type,
  322. void *data, void *ret);
  323. /**
  324. * os_if_son_vdev_ops() - Handles VDEV specific SON commands
  325. * @vdev: vdev
  326. * @type: SON command to handle
  327. * @data: Input Data
  328. * @ret: Output Data
  329. *
  330. * Return: QDF_SUCCCESS_SUCCESS in case of success
  331. */
  332. QDF_STATUS os_if_son_vdev_ops(struct wlan_objmgr_vdev *pdev,
  333. enum wlan_mlme_vdev_param type,
  334. void *data, void *ret);
  335. /**
  336. * os_if_son_peer_ops() - Handles PEER specific SON commands
  337. * @peer: peer
  338. * @type: SON command to handle
  339. * @data: Input Data. Pointer to wlan_mlme_peer_data
  340. * @ret: Output Data. Pointer to wlan_mlme_peer_data
  341. *
  342. * Return: QDF_SUCCCESS_SUCCESS in case of success
  343. */
  344. QDF_STATUS os_if_son_peer_ops(struct wlan_objmgr_peer *peer,
  345. enum wlan_mlme_peer_param type,
  346. union wlan_mlme_peer_data *data,
  347. union wlan_mlme_peer_data *ret);
  348. /**
  349. * os_if_son_scan_db_iterate() - get country code
  350. * @pdev: pdev
  351. * @handler: scan_iterator
  352. * @arg: argument to be passed to handler
  353. *
  354. * Return: QDF_SUCCCESS_SUCCESS in case of success
  355. */
  356. QDF_STATUS os_if_son_scan_db_iterate(struct wlan_objmgr_pdev *pdev,
  357. scan_iterator_func handler, void *arg);
  358. /**
  359. * os_if_son_acl_is_probe_wh_set() - Withheld probes for given mac_addr,
  360. * not supported
  361. * @vdev: vdev
  362. * @mac_addr: 6-Byte MAC address
  363. * @probe_rssi: Probe Request RSSI
  364. *
  365. * Return: true / false
  366. */
  367. bool os_if_son_acl_is_probe_wh_set(struct wlan_objmgr_vdev *vdev,
  368. const uint8_t *mac_addr,
  369. uint8_t probe_rssi);
  370. /**
  371. * os_if_son_get_rx_streams() - Gets number of RX spatial streams
  372. * @vdev: target vdev
  373. *
  374. * Return: number of spatial stream
  375. */
  376. uint8_t os_if_son_get_rx_streams(struct wlan_objmgr_vdev *vdev);
  377. /**
  378. * os_if_son_cfg80211_reply() - replies to cfg80211
  379. * @sk_buf: sk_buff to uper layer
  380. *
  381. * Return: QDF_STATUS_SUCCESS on success
  382. */
  383. QDF_STATUS os_if_son_cfg80211_reply(qdf_nbuf_t sk_buf);
  384. /**
  385. * os_if_son_vdev_is_wds() - checks if wds capability is supported or not
  386. * @vdev: Pointer to vdev
  387. *
  388. * Return: true if wds is supported
  389. */
  390. bool os_if_son_vdev_is_wds(struct wlan_objmgr_vdev *vdev);
  391. /*
  392. * os_if_son_set_acl_policy() - set acl policy
  393. * @vdev: vdev
  394. * @son_acl_policy: son acl policy. enum ieee80211_acl_cmd
  395. *
  396. * Return: QDF_STATUS
  397. */
  398. QDF_STATUS os_if_son_set_acl_policy(struct wlan_objmgr_vdev *vdev,
  399. ieee80211_acl_cmd son_acl_policy);
  400. /**
  401. * os_if_son_get_acl_policy() - get acl policy
  402. * @vdev: vdev
  403. *
  404. * Return: acl policy. enum ieee80211_acl_cmd
  405. */
  406. ieee80211_acl_cmd os_if_son_get_acl_policy(struct wlan_objmgr_vdev *vdev);
  407. /**
  408. * os_if_son_add_acl_mac() - add mac to acl
  409. * @vdev: vdev
  410. * @acl_mac: mac to add
  411. *
  412. * Return: 0 on success, negative errno on failure
  413. */
  414. int os_if_son_add_acl_mac(struct wlan_objmgr_vdev *vdev,
  415. struct qdf_mac_addr *acl_mac);
  416. /**
  417. * os_if_son_get_sta_space() - get sta space
  418. * @vdev: target vdev
  419. *
  420. * Return: bytes which is needed to fill sta information
  421. */
  422. uint32_t os_if_son_get_sta_space(struct wlan_objmgr_vdev *vdev);
  423. /**
  424. * os_if_son_get_sta_list() - get sta list
  425. * @vdev: target vdev
  426. * @si: pointer to ieee80211req_sta_info
  427. * @space: space left
  428. *
  429. * Return: void
  430. */
  431. void os_if_son_get_sta_list(struct wlan_objmgr_vdev *vdev,
  432. struct ieee80211req_sta_info *si, uint32_t *space);
  433. /**
  434. * os_if_son_del_acl_mac() - del mac from acl
  435. * @vdev: vdev
  436. * @acl_mac: mac to del
  437. *
  438. * Return: 0 on success, negative errno on failure
  439. */
  440. int os_if_son_del_acl_mac(struct wlan_objmgr_vdev *vdev,
  441. struct qdf_mac_addr *acl_mac);
  442. /**
  443. * os_if_son_kickout_mac() - kickout sta with given mac
  444. * @vdev: vdev
  445. * @acl_mac: sta mac to kickout
  446. *
  447. * Return: 0 on success, negative errno on failure
  448. */
  449. int os_if_son_kickout_mac(struct wlan_objmgr_vdev *vdev,
  450. struct qdf_mac_addr *mac);
  451. /**
  452. * os_if_son_set_chwidth() - set chan width
  453. * @vdev: vdev
  454. * @son_chwidth: son chan width
  455. *
  456. * Return: 0 on success, negative errno on failure
  457. */
  458. int os_if_son_set_chwidth(struct wlan_objmgr_vdev *vdev,
  459. enum ieee80211_cwm_width son_chwidth);
  460. /**
  461. * os_if_son_get_chwidth() - get chan width
  462. * @vdev: vdev
  463. *
  464. * Return: son chan width
  465. */
  466. enum ieee80211_cwm_width os_if_son_get_chwidth(struct wlan_objmgr_vdev *vdev);
  467. /**
  468. * os_if_son_deauth_peer_sta - Deauths specified STA
  469. * @vdev: vdev
  470. * @peer_mac: Target peer MAC address
  471. * @ignore_frame: True to silently deauth the peer
  472. *
  473. * Return: void
  474. */
  475. void os_if_son_deauth_peer_sta(struct wlan_objmgr_vdev *vdev,
  476. uint8_t *peer_mac,
  477. bool ignore_frame);
  478. /**
  479. * os_if_son_modify_acl - Updates ACL with given peer
  480. * @vdev: vdev
  481. * @peer_mac: Target peer MAC address
  482. * @allow_auth: True to allow specified peer to connect
  483. *
  484. * Return: void
  485. */
  486. void os_if_son_modify_acl(struct wlan_objmgr_vdev *vdev,
  487. uint8_t *peer_mac,
  488. bool allow_auth);
  489. /**
  490. * os_if_son_deliver_ald_event() - deliver ald events to son
  491. * @adapter: adapter object
  492. * @peer: peer object
  493. * @event: Name of the event
  494. * @event_data: event data
  495. *
  496. * Return: 0 on success
  497. */
  498. int os_if_son_deliver_ald_event(struct hdd_adapter *adapter,
  499. struct wlan_objmgr_peer *peer,
  500. enum ieee80211_event_type event,
  501. void *event_data);
  502. #endif