ath10k: allow loading device specific board files
[deliverable/linux.git] / drivers / net / wireless / ath / ath10k / core.h
1 /*
2 * Copyright (c) 2005-2011 Atheros Communications Inc.
3 * Copyright (c) 2011-2013 Qualcomm Atheros, Inc.
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 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18 #ifndef _CORE_H_
19 #define _CORE_H_
20
21 #include <linux/completion.h>
22 #include <linux/if_ether.h>
23 #include <linux/types.h>
24 #include <linux/pci.h>
25 #include <linux/uuid.h>
26 #include <linux/time.h>
27
28 #include "htt.h"
29 #include "htc.h"
30 #include "hw.h"
31 #include "targaddrs.h"
32 #include "wmi.h"
33 #include "../ath.h"
34 #include "../regd.h"
35 #include "../dfs_pattern_detector.h"
36 #include "spectral.h"
37 #include "thermal.h"
38 #include "wow.h"
39
40 #define MS(_v, _f) (((_v) & _f##_MASK) >> _f##_LSB)
41 #define SM(_v, _f) (((_v) << _f##_LSB) & _f##_MASK)
42 #define WO(_f) ((_f##_OFFSET) >> 2)
43
44 #define ATH10K_SCAN_ID 0
45 #define WMI_READY_TIMEOUT (5 * HZ)
46 #define ATH10K_FLUSH_TIMEOUT_HZ (5*HZ)
47 #define ATH10K_CONNECTION_LOSS_HZ (3*HZ)
48 #define ATH10K_NUM_CHANS 39
49
50 /* Antenna noise floor */
51 #define ATH10K_DEFAULT_NOISE_FLOOR -95
52
53 #define ATH10K_MAX_NUM_MGMT_PENDING 128
54
55 /* number of failed packets (20 packets with 16 sw reties each) */
56 #define ATH10K_KICKOUT_THRESHOLD (20 * 16)
57
58 /*
59 * Use insanely high numbers to make sure that the firmware implementation
60 * won't start, we have the same functionality already in hostapd. Unit
61 * is seconds.
62 */
63 #define ATH10K_KEEPALIVE_MIN_IDLE 3747
64 #define ATH10K_KEEPALIVE_MAX_IDLE 3895
65 #define ATH10K_KEEPALIVE_MAX_UNRESPONSIVE 3900
66
67 struct ath10k;
68
69 enum ath10k_bus {
70 ATH10K_BUS_PCI,
71 };
72
73 static inline const char *ath10k_bus_str(enum ath10k_bus bus)
74 {
75 switch (bus) {
76 case ATH10K_BUS_PCI:
77 return "pci";
78 }
79
80 return "unknown";
81 }
82
83 struct ath10k_skb_cb {
84 dma_addr_t paddr;
85 u8 eid;
86 u8 vdev_id;
87 enum ath10k_hw_txrx_mode txmode;
88 bool is_protected;
89
90 struct {
91 u8 tid;
92 u16 freq;
93 bool is_offchan;
94 struct ath10k_htt_txbuf *txbuf;
95 u32 txbuf_paddr;
96 } __packed htt;
97
98 struct {
99 bool dtim_zero;
100 bool deliver_cab;
101 } bcn;
102 } __packed;
103
104 struct ath10k_skb_rxcb {
105 dma_addr_t paddr;
106 struct hlist_node hlist;
107 };
108
109 static inline struct ath10k_skb_cb *ATH10K_SKB_CB(struct sk_buff *skb)
110 {
111 BUILD_BUG_ON(sizeof(struct ath10k_skb_cb) >
112 IEEE80211_TX_INFO_DRIVER_DATA_SIZE);
113 return (struct ath10k_skb_cb *)&IEEE80211_SKB_CB(skb)->driver_data;
114 }
115
116 static inline struct ath10k_skb_rxcb *ATH10K_SKB_RXCB(struct sk_buff *skb)
117 {
118 BUILD_BUG_ON(sizeof(struct ath10k_skb_rxcb) > sizeof(skb->cb));
119 return (struct ath10k_skb_rxcb *)skb->cb;
120 }
121
122 #define ATH10K_RXCB_SKB(rxcb) \
123 container_of((void *)rxcb, struct sk_buff, cb)
124
125 static inline u32 host_interest_item_address(u32 item_offset)
126 {
127 return QCA988X_HOST_INTEREST_ADDRESS + item_offset;
128 }
129
130 struct ath10k_bmi {
131 bool done_sent;
132 };
133
134 struct ath10k_mem_chunk {
135 void *vaddr;
136 dma_addr_t paddr;
137 u32 len;
138 u32 req_id;
139 };
140
141 struct ath10k_wmi {
142 enum ath10k_fw_wmi_op_version op_version;
143 enum ath10k_htc_ep_id eid;
144 struct completion service_ready;
145 struct completion unified_ready;
146 wait_queue_head_t tx_credits_wq;
147 DECLARE_BITMAP(svc_map, WMI_SERVICE_MAX);
148 struct wmi_cmd_map *cmd;
149 struct wmi_vdev_param_map *vdev_param;
150 struct wmi_pdev_param_map *pdev_param;
151 const struct wmi_ops *ops;
152
153 u32 num_mem_chunks;
154 struct ath10k_mem_chunk mem_chunks[WMI_MAX_MEM_REQS];
155 };
156
157 struct ath10k_fw_stats_peer {
158 struct list_head list;
159
160 u8 peer_macaddr[ETH_ALEN];
161 u32 peer_rssi;
162 u32 peer_tx_rate;
163 u32 peer_rx_rate; /* 10x only */
164 };
165
166 struct ath10k_fw_stats_vdev {
167 struct list_head list;
168
169 u32 vdev_id;
170 u32 beacon_snr;
171 u32 data_snr;
172 u32 num_tx_frames[4];
173 u32 num_rx_frames;
174 u32 num_tx_frames_retries[4];
175 u32 num_tx_frames_failures[4];
176 u32 num_rts_fail;
177 u32 num_rts_success;
178 u32 num_rx_err;
179 u32 num_rx_discard;
180 u32 num_tx_not_acked;
181 u32 tx_rate_history[10];
182 u32 beacon_rssi_history[10];
183 };
184
185 struct ath10k_fw_stats_pdev {
186 struct list_head list;
187
188 /* PDEV stats */
189 s32 ch_noise_floor;
190 u32 tx_frame_count;
191 u32 rx_frame_count;
192 u32 rx_clear_count;
193 u32 cycle_count;
194 u32 phy_err_count;
195 u32 chan_tx_power;
196 u32 ack_rx_bad;
197 u32 rts_bad;
198 u32 rts_good;
199 u32 fcs_bad;
200 u32 no_beacons;
201 u32 mib_int_count;
202
203 /* PDEV TX stats */
204 s32 comp_queued;
205 s32 comp_delivered;
206 s32 msdu_enqued;
207 s32 mpdu_enqued;
208 s32 wmm_drop;
209 s32 local_enqued;
210 s32 local_freed;
211 s32 hw_queued;
212 s32 hw_reaped;
213 s32 underrun;
214 s32 tx_abort;
215 s32 mpdus_requed;
216 u32 tx_ko;
217 u32 data_rc;
218 u32 self_triggers;
219 u32 sw_retry_failure;
220 u32 illgl_rate_phy_err;
221 u32 pdev_cont_xretry;
222 u32 pdev_tx_timeout;
223 u32 pdev_resets;
224 u32 phy_underrun;
225 u32 txop_ovf;
226
227 /* PDEV RX stats */
228 s32 mid_ppdu_route_change;
229 s32 status_rcvd;
230 s32 r0_frags;
231 s32 r1_frags;
232 s32 r2_frags;
233 s32 r3_frags;
234 s32 htt_msdus;
235 s32 htt_mpdus;
236 s32 loc_msdus;
237 s32 loc_mpdus;
238 s32 oversize_amsdu;
239 s32 phy_errs;
240 s32 phy_err_drop;
241 s32 mpdu_errs;
242 };
243
244 struct ath10k_fw_stats {
245 struct list_head pdevs;
246 struct list_head vdevs;
247 struct list_head peers;
248 };
249
250 struct ath10k_dfs_stats {
251 u32 phy_errors;
252 u32 pulses_total;
253 u32 pulses_detected;
254 u32 pulses_discarded;
255 u32 radar_detected;
256 };
257
258 #define ATH10K_MAX_NUM_PEER_IDS (1 << 11) /* htt rx_desc limit */
259
260 struct ath10k_peer {
261 struct list_head list;
262 int vdev_id;
263 u8 addr[ETH_ALEN];
264 DECLARE_BITMAP(peer_ids, ATH10K_MAX_NUM_PEER_IDS);
265
266 /* protected by ar->data_lock */
267 struct ieee80211_key_conf *keys[WMI_MAX_KEY_INDEX + 1];
268 };
269
270 struct ath10k_sta {
271 struct ath10k_vif *arvif;
272
273 /* the following are protected by ar->data_lock */
274 u32 changed; /* IEEE80211_RC_* */
275 u32 bw;
276 u32 nss;
277 u32 smps;
278
279 struct work_struct update_wk;
280
281 #ifdef CONFIG_MAC80211_DEBUGFS
282 /* protected by conf_mutex */
283 bool aggr_mode;
284 #endif
285 };
286
287 struct ath10k_chanctx {
288 /* Used to story copy of chanctx_conf to avoid inconsistencies. Ideally
289 * mac80211 should allow some sort of explicit locking to guarantee
290 * that the publicly available chanctx_conf can be accessed safely at
291 * all times.
292 */
293 struct ieee80211_chanctx_conf conf;
294 };
295
296 #define ATH10K_VDEV_SETUP_TIMEOUT_HZ (5*HZ)
297
298 enum ath10k_beacon_state {
299 ATH10K_BEACON_SCHEDULED = 0,
300 ATH10K_BEACON_SENDING,
301 ATH10K_BEACON_SENT,
302 };
303
304 struct ath10k_vif {
305 struct list_head list;
306
307 u32 vdev_id;
308 enum wmi_vdev_type vdev_type;
309 enum wmi_vdev_subtype vdev_subtype;
310 u32 beacon_interval;
311 u32 dtim_period;
312 struct sk_buff *beacon;
313 /* protected by data_lock */
314 enum ath10k_beacon_state beacon_state;
315 void *beacon_buf;
316 dma_addr_t beacon_paddr;
317 unsigned long tx_paused; /* arbitrary values defined by target */
318
319 struct ath10k *ar;
320 struct ieee80211_vif *vif;
321
322 bool is_started;
323 bool is_up;
324 bool spectral_enabled;
325 bool ps;
326 u32 aid;
327 u8 bssid[ETH_ALEN];
328
329 struct ieee80211_key_conf *wep_keys[WMI_MAX_KEY_INDEX + 1];
330 s8 def_wep_key_idx;
331
332 u16 tx_seq_no;
333
334 union {
335 struct {
336 u32 uapsd;
337 } sta;
338 struct {
339 /* 127 stations; wmi limit */
340 u8 tim_bitmap[16];
341 u8 tim_len;
342 u32 ssid_len;
343 u8 ssid[IEEE80211_MAX_SSID_LEN];
344 bool hidden_ssid;
345 /* P2P_IE with NoA attribute for P2P_GO case */
346 u32 noa_len;
347 u8 *noa_data;
348 } ap;
349 } u;
350
351 bool use_cts_prot;
352 int num_legacy_stations;
353 int txpower;
354 struct wmi_wmm_params_all_arg wmm_params;
355 struct work_struct ap_csa_work;
356 struct delayed_work connection_loss_work;
357 };
358
359 struct ath10k_vif_iter {
360 u32 vdev_id;
361 struct ath10k_vif *arvif;
362 };
363
364 /* used for crash-dump storage, protected by data-lock */
365 struct ath10k_fw_crash_data {
366 bool crashed_since_read;
367
368 uuid_le uuid;
369 struct timespec timestamp;
370 __le32 registers[REG_DUMP_COUNT_QCA988X];
371 };
372
373 struct ath10k_debug {
374 struct dentry *debugfs_phy;
375
376 struct ath10k_fw_stats fw_stats;
377 struct completion fw_stats_complete;
378 bool fw_stats_done;
379
380 unsigned long htt_stats_mask;
381 struct delayed_work htt_stats_dwork;
382 struct ath10k_dfs_stats dfs_stats;
383 struct ath_dfs_pool_stats dfs_pool_stats;
384
385 /* protected by conf_mutex */
386 u32 fw_dbglog_mask;
387 u32 fw_dbglog_level;
388 u32 pktlog_filter;
389 u32 reg_addr;
390 u32 nf_cal_period;
391
392 u8 htt_max_amsdu;
393 u8 htt_max_ampdu;
394
395 struct ath10k_fw_crash_data *fw_crash_data;
396 };
397
398 enum ath10k_state {
399 ATH10K_STATE_OFF = 0,
400 ATH10K_STATE_ON,
401
402 /* When doing firmware recovery the device is first powered down.
403 * mac80211 is supposed to call in to start() hook later on. It is
404 * however possible that driver unloading and firmware crash overlap.
405 * mac80211 can wait on conf_mutex in stop() while the device is
406 * stopped in ath10k_core_restart() work holding conf_mutex. The state
407 * RESTARTED means that the device is up and mac80211 has started hw
408 * reconfiguration. Once mac80211 is done with the reconfiguration we
409 * set the state to STATE_ON in reconfig_complete(). */
410 ATH10K_STATE_RESTARTING,
411 ATH10K_STATE_RESTARTED,
412
413 /* The device has crashed while restarting hw. This state is like ON
414 * but commands are blocked in HTC and -ECOMM response is given. This
415 * prevents completion timeouts and makes the driver more responsive to
416 * userspace commands. This is also prevents recursive recovery. */
417 ATH10K_STATE_WEDGED,
418
419 /* factory tests */
420 ATH10K_STATE_UTF,
421 };
422
423 enum ath10k_firmware_mode {
424 /* the default mode, standard 802.11 functionality */
425 ATH10K_FIRMWARE_MODE_NORMAL,
426
427 /* factory tests etc */
428 ATH10K_FIRMWARE_MODE_UTF,
429 };
430
431 enum ath10k_fw_features {
432 /* wmi_mgmt_rx_hdr contains extra RSSI information */
433 ATH10K_FW_FEATURE_EXT_WMI_MGMT_RX = 0,
434
435 /* Firmware from 10X branch. Deprecated, don't use in new code. */
436 ATH10K_FW_FEATURE_WMI_10X = 1,
437
438 /* firmware support tx frame management over WMI, otherwise it's HTT */
439 ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX = 2,
440
441 /* Firmware does not support P2P */
442 ATH10K_FW_FEATURE_NO_P2P = 3,
443
444 /* Firmware 10.2 feature bit. The ATH10K_FW_FEATURE_WMI_10X feature
445 * bit is required to be set as well. Deprecated, don't use in new
446 * code.
447 */
448 ATH10K_FW_FEATURE_WMI_10_2 = 4,
449
450 /* Some firmware revisions lack proper multi-interface client powersave
451 * implementation. Enabling PS could result in connection drops,
452 * traffic stalls, etc.
453 */
454 ATH10K_FW_FEATURE_MULTI_VIF_PS_SUPPORT = 5,
455
456 /* Some firmware revisions have an incomplete WoWLAN implementation
457 * despite WMI service bit being advertised. This feature flag is used
458 * to distinguish whether WoWLAN is really supported or not.
459 */
460 ATH10K_FW_FEATURE_WOWLAN_SUPPORT = 6,
461
462 /* keep last */
463 ATH10K_FW_FEATURE_COUNT,
464 };
465
466 enum ath10k_dev_flags {
467 /* Indicates that ath10k device is during CAC phase of DFS */
468 ATH10K_CAC_RUNNING,
469 ATH10K_FLAG_CORE_REGISTERED,
470
471 /* Device has crashed and needs to restart. This indicates any pending
472 * waiters should immediately cancel instead of waiting for a time out.
473 */
474 ATH10K_FLAG_CRASH_FLUSH,
475 };
476
477 enum ath10k_cal_mode {
478 ATH10K_CAL_MODE_FILE,
479 ATH10K_CAL_MODE_OTP,
480 ATH10K_CAL_MODE_DT,
481 };
482
483 static inline const char *ath10k_cal_mode_str(enum ath10k_cal_mode mode)
484 {
485 switch (mode) {
486 case ATH10K_CAL_MODE_FILE:
487 return "file";
488 case ATH10K_CAL_MODE_OTP:
489 return "otp";
490 case ATH10K_CAL_MODE_DT:
491 return "dt";
492 }
493
494 return "unknown";
495 }
496
497 enum ath10k_scan_state {
498 ATH10K_SCAN_IDLE,
499 ATH10K_SCAN_STARTING,
500 ATH10K_SCAN_RUNNING,
501 ATH10K_SCAN_ABORTING,
502 };
503
504 static inline const char *ath10k_scan_state_str(enum ath10k_scan_state state)
505 {
506 switch (state) {
507 case ATH10K_SCAN_IDLE:
508 return "idle";
509 case ATH10K_SCAN_STARTING:
510 return "starting";
511 case ATH10K_SCAN_RUNNING:
512 return "running";
513 case ATH10K_SCAN_ABORTING:
514 return "aborting";
515 }
516
517 return "unknown";
518 }
519
520 enum ath10k_tx_pause_reason {
521 ATH10K_TX_PAUSE_Q_FULL,
522 ATH10K_TX_PAUSE_MAX,
523 };
524
525 struct ath10k {
526 struct ath_common ath_common;
527 struct ieee80211_hw *hw;
528 struct device *dev;
529 u8 mac_addr[ETH_ALEN];
530
531 enum ath10k_hw_rev hw_rev;
532 u32 chip_id;
533 u32 target_version;
534 u8 fw_version_major;
535 u32 fw_version_minor;
536 u16 fw_version_release;
537 u16 fw_version_build;
538 u32 fw_stats_req_mask;
539 u32 phy_capability;
540 u32 hw_min_tx_power;
541 u32 hw_max_tx_power;
542 u32 ht_cap_info;
543 u32 vht_cap_info;
544 u32 num_rf_chains;
545 /* protected by conf_mutex */
546 bool ani_enabled;
547
548 DECLARE_BITMAP(fw_features, ATH10K_FW_FEATURE_COUNT);
549
550 bool p2p;
551
552 struct {
553 enum ath10k_bus bus;
554 const struct ath10k_hif_ops *ops;
555 } hif;
556
557 struct completion target_suspend;
558
559 const struct ath10k_hw_regs *regs;
560 struct ath10k_bmi bmi;
561 struct ath10k_wmi wmi;
562 struct ath10k_htc htc;
563 struct ath10k_htt htt;
564
565 struct ath10k_hw_params {
566 u32 id;
567 const char *name;
568 u32 patch_load_addr;
569 int uart_pin;
570
571 struct ath10k_hw_params_fw {
572 const char *dir;
573 const char *fw;
574 const char *otp;
575 const char *board;
576 size_t board_size;
577 size_t board_ext_size;
578 } fw;
579 } hw_params;
580
581 const struct firmware *board;
582 const void *board_data;
583 size_t board_len;
584
585 const struct firmware *otp;
586 const void *otp_data;
587 size_t otp_len;
588
589 const struct firmware *firmware;
590 const void *firmware_data;
591 size_t firmware_len;
592
593 const struct firmware *cal_file;
594
595 char spec_board_id[100];
596 bool spec_board_loaded;
597
598 int fw_api;
599 enum ath10k_cal_mode cal_mode;
600
601 struct {
602 struct completion started;
603 struct completion completed;
604 struct completion on_channel;
605 struct delayed_work timeout;
606 enum ath10k_scan_state state;
607 bool is_roc;
608 int vdev_id;
609 int roc_freq;
610 } scan;
611
612 struct {
613 struct ieee80211_supported_band sbands[IEEE80211_NUM_BANDS];
614 } mac;
615
616 /* should never be NULL; needed for regular htt rx */
617 struct ieee80211_channel *rx_channel;
618
619 /* valid during scan; needed for mgmt rx during scan */
620 struct ieee80211_channel *scan_channel;
621
622 /* current operating channel definition */
623 struct cfg80211_chan_def chandef;
624
625 unsigned long long free_vdev_map;
626 struct ath10k_vif *monitor_arvif;
627 bool monitor;
628 int monitor_vdev_id;
629 bool monitor_started;
630 unsigned int filter_flags;
631 unsigned long dev_flags;
632 u32 dfs_block_radar_events;
633
634 /* protected by conf_mutex */
635 bool radar_enabled;
636 int num_started_vdevs;
637
638 /* Protected by conf-mutex */
639 u8 supp_tx_chainmask;
640 u8 supp_rx_chainmask;
641 u8 cfg_tx_chainmask;
642 u8 cfg_rx_chainmask;
643
644 struct completion install_key_done;
645
646 struct completion vdev_setup_done;
647
648 struct workqueue_struct *workqueue;
649
650 /* prevents concurrent FW reconfiguration */
651 struct mutex conf_mutex;
652
653 /* protects shared structure data */
654 spinlock_t data_lock;
655
656 struct list_head arvifs;
657 struct list_head peers;
658 wait_queue_head_t peer_mapping_wq;
659
660 /* protected by conf_mutex */
661 int num_peers;
662 int num_stations;
663
664 int max_num_peers;
665 int max_num_stations;
666 int max_num_vdevs;
667 int max_num_tdls_vdevs;
668
669 struct work_struct offchan_tx_work;
670 struct sk_buff_head offchan_tx_queue;
671 struct completion offchan_tx_completed;
672 struct sk_buff *offchan_tx_skb;
673
674 struct work_struct wmi_mgmt_tx_work;
675 struct sk_buff_head wmi_mgmt_tx_queue;
676
677 enum ath10k_state state;
678
679 struct work_struct register_work;
680 struct work_struct restart_work;
681
682 /* cycle count is reported twice for each visited channel during scan.
683 * access protected by data_lock */
684 u32 survey_last_rx_clear_count;
685 u32 survey_last_cycle_count;
686 struct survey_info survey[ATH10K_NUM_CHANS];
687
688 struct dfs_pattern_detector *dfs_detector;
689
690 unsigned long tx_paused; /* see ATH10K_TX_PAUSE_ */
691
692 #ifdef CONFIG_ATH10K_DEBUGFS
693 struct ath10k_debug debug;
694 #endif
695
696 struct {
697 /* relay(fs) channel for spectral scan */
698 struct rchan *rfs_chan_spec_scan;
699
700 /* spectral_mode and spec_config are protected by conf_mutex */
701 enum ath10k_spectral_mode mode;
702 struct ath10k_spec_scan config;
703 } spectral;
704
705 struct {
706 /* protected by conf_mutex */
707 const struct firmware *utf;
708 DECLARE_BITMAP(orig_fw_features, ATH10K_FW_FEATURE_COUNT);
709 enum ath10k_fw_wmi_op_version orig_wmi_op_version;
710
711 /* protected by data_lock */
712 bool utf_monitor;
713 } testmode;
714
715 struct {
716 /* protected by data_lock */
717 u32 fw_crash_counter;
718 u32 fw_warm_reset_counter;
719 u32 fw_cold_reset_counter;
720 } stats;
721
722 struct ath10k_thermal thermal;
723 struct ath10k_wow wow;
724
725 /* must be last */
726 u8 drv_priv[0] __aligned(sizeof(void *));
727 };
728
729 struct ath10k *ath10k_core_create(size_t priv_size, struct device *dev,
730 enum ath10k_bus bus,
731 enum ath10k_hw_rev hw_rev,
732 const struct ath10k_hif_ops *hif_ops);
733 void ath10k_core_destroy(struct ath10k *ar);
734
735 int ath10k_core_start(struct ath10k *ar, enum ath10k_firmware_mode mode);
736 int ath10k_wait_for_suspend(struct ath10k *ar, u32 suspend_opt);
737 void ath10k_core_stop(struct ath10k *ar);
738 int ath10k_core_register(struct ath10k *ar, u32 chip_id);
739 void ath10k_core_unregister(struct ath10k *ar);
740
741 #endif /* _CORE_H_ */
This page took 0.047409 seconds and 5 git commands to generate.