blob: a6b9cf6ba360313b07db10148f14073619d20257 [file] [log] [blame]
Prakash Dhavalid5c9f1c2015-11-08 19:04:44 -08001/*
Houston Hoffmanebc68142016-01-18 15:38:27 -08002 * Copyright (c) 2013-2016 The Linux Foundation. All rights reserved.
Prakash Dhavalid5c9f1c2015-11-08 19:04:44 -08003 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
20 */
21
22/*
23 * This file was originally distributed by Qualcomm Atheros, Inc.
24 * under proprietary terms before Copyright ownership was assigned
25 * to the Linux Foundation.
26 */
27
28#ifndef _HIF_H_
29#define _HIF_H_
30
31#ifdef __cplusplus
32extern "C" {
33#endif /* __cplusplus */
34
35/* Header files */
36#include "athdefs.h"
37#include "a_types.h"
38#include "osapi_linux.h"
39#include "cdf_status.h"
40#include "cdf_nbuf.h"
41#include "ol_if_athvar.h"
42#include <linux/platform_device.h>
43#ifdef HIF_PCI
44#include <linux/pci.h>
45#endif /* HIF_PCI */
46
47#define ENABLE_MBOX_DUMMY_SPACE_FEATURE 1
48
49typedef struct htc_callbacks HTC_CALLBACKS;
50typedef void __iomem *A_target_id_t;
51
52#define HIF_TYPE_AR6002 2
53#define HIF_TYPE_AR6003 3
54#define HIF_TYPE_AR6004 5
55#define HIF_TYPE_AR9888 6
56#define HIF_TYPE_AR6320 7
57#define HIF_TYPE_AR6320V2 8
58/* For attaching Peregrine 2.0 board host_reg_tbl only */
59#define HIF_TYPE_AR9888V2 8
60#define HIF_TYPE_QCA6180 9
61#define HIF_TYPE_ADRASTEA 10
62
63#define TARGET_TYPE_UNKNOWN 0
64#define TARGET_TYPE_AR6001 1
65#define TARGET_TYPE_AR6002 2
66#define TARGET_TYPE_AR6003 3
67#define TARGET_TYPE_AR6004 5
68#define TARGET_TYPE_AR6006 6
69#define TARGET_TYPE_AR9888 7
70#define TARGET_TYPE_AR6320 8
71#define TARGET_TYPE_AR900B 9
72/* For attach Peregrine 2.0 board target_reg_tbl only */
73#define TARGET_TYPE_AR9888V2 10
74/* For attach Rome1.0 target_reg_tbl only*/
75#define TARGET_TYPE_AR6320V1 11
76/* For Rome2.0/2.1 target_reg_tbl ID*/
77#define TARGET_TYPE_AR6320V2 12
78/* For Rome3.0 target_reg_tbl ID*/
79#define TARGET_TYPE_AR6320V3 13
80/* For Tufello1.0 target_reg_tbl ID*/
81#define TARGET_TYPE_QCA9377V1 14
82/* For QCA6180 target */
83#define TARGET_TYPE_QCA6180 15
84/* For Adrastea target */
85#define TARGET_TYPE_ADRASTEA 16
86
87struct CE_state;
Sanjay Devnani9ce15772015-11-12 14:08:57 -080088#ifdef QCA_WIFI_3_0_ADRASTEA
89#define CE_COUNT_MAX 12
90#else
Prakash Dhavalid5c9f1c2015-11-08 19:04:44 -080091#define CE_COUNT_MAX 8
Sanjay Devnani9ce15772015-11-12 14:08:57 -080092#endif
Prakash Dhavalid5c9f1c2015-11-08 19:04:44 -080093
94/* These numbers are selected so that the product is close to current
95 higher limit of packets HIF services at one shot (1000) */
96#define QCA_NAPI_BUDGET 64
97#define QCA_NAPI_DEF_SCALE 16
98/* NOTE: This is to adapt non-NAPI solution to use
99 the same "budget" as NAPI. Will be removed
100 `once decision about NAPI is made */
101#define HIF_NAPI_MAX_RECEIVES (QCA_NAPI_BUDGET * QCA_NAPI_DEF_SCALE)
102
103/* NOTE: "napi->scale" can be changed,
104 but this does not change the number of buckets */
105#define QCA_NAPI_NUM_BUCKETS (QCA_NAPI_BUDGET / QCA_NAPI_DEF_SCALE)
106struct qca_napi_stat {
107 uint32_t napi_schedules;
108 uint32_t napi_polls;
109 uint32_t napi_completes;
110 uint32_t napi_workdone;
111 uint32_t napi_budget_uses[QCA_NAPI_NUM_BUCKETS];
112};
113
114/**
115 * per NAPI instance data structure
116 * This data structure holds stuff per NAPI instance.
117 * Note that, in the current implementation, though scale is
118 * an instance variable, it is set to the same value for all
119 * instances.
120 */
121struct qca_napi_info {
122 struct napi_struct napi; /* one NAPI Instance per CE in phase I */
123 uint8_t scale; /* currently same on all instances */
124 uint8_t id;
125 struct qca_napi_stat stats[NR_CPUS];
126};
127
128/**
129 * NAPI data-sructure common to all NAPI instances.
130 *
131 * A variable of this type will be stored in hif module context.
132 */
133
134struct qca_napi_data {
135 /* NOTE: make sure the mutex is inited only at the very beginning
136 once for the lifetime of the driver. For now, granularity of one
137 is OK, but we might want to have a better granularity later */
138 struct mutex mutex;
139 uint32_t state;
140 uint32_t ce_map; /* bitmap of created/registered NAPI
141 instances, indexed by pipe_id,
142 not used by clients (clients use an
143 id returned by create) */
144 struct net_device netdev; /* dummy net_dev */
145 struct qca_napi_info napis[CE_COUNT_MAX];
146};
147
Komal Seelam91553ce2016-01-27 18:57:10 +0530148/**
149 * struct hif_config_info - Place Holder for hif configuration
150 * @enable_uart_print: UART Print
151 * @enable_self_recovery: Self Recovery
152 * @enable_fw_log: To Enable FW LOG
153 * @enable_lpass_support: LPASS support
154 * @enable_ramdump_collection: Ramdump Collection
155 * @max_no_of_peers: Max Number of Peers
156 *
157 * Structure for holding ini parameters.
158 */
159struct hif_config_info {
160 bool enable_uart_print;
161 bool enable_self_recovery;
162 bool enable_fw_log;
163 bool enable_lpass_support;
164 bool enable_ramdump_collection;
165 uint8_t max_no_of_peers;
166};
167
168/**
169 * struct hif_target_info - Target Information
170 * @target_version: Target Version
171 * @target_type: Target Type
172 * @target_revision: Target Revision
173 * @soc_version: SOC Version
174 *
175 * Structure to hold target information.
176 */
177struct hif_target_info {
178 uint32_t target_version;
179 uint32_t target_type;
180 uint32_t target_revision;
181 uint32_t soc_version;
182};
183
Komal Seelamb3a3bdf2016-02-01 19:22:17 +0530184struct bmi_info {
185 uint8_t *bmi_cmd_buff;
186 uint8_t *bmi_rsp_buff;
187 dma_addr_t bmi_cmd_da;
188 dma_addr_t bmi_rsp_da;
189 uint8_t *cal_in_flash;
190 bool bmi_done;
191#ifdef CONFIG_CNSS
192 struct cnss_fw_files fw_files;
193#endif
194};
195
Prakash Dhavalid5c9f1c2015-11-08 19:04:44 -0800196struct ol_softc {
197 void __iomem *mem; /* IO mapped memory base address */
198 cdf_dma_addr_t mem_pa;
Komal Seelam91553ce2016-01-27 18:57:10 +0530199 struct hif_config_info hif_config;
200 struct hif_target_info target_info;
Komal Seelamb3a3bdf2016-02-01 19:22:17 +0530201 struct bmi_info bmi_ctx;
Prakash Dhavalid5c9f1c2015-11-08 19:04:44 -0800202 /*
203 * handle for code that uses the osdep.h version of OS
204 * abstraction primitives
205 */
206 struct _NIC_DEV aps_osdev;
207 enum ath_hal_bus_type bus_type;
Prakash Dhavalid5c9f1c2015-11-08 19:04:44 -0800208 bool request_irq_done;
209 /*
210 * handle for code that uses cdf version of OS
211 * abstraction primitives
212 */
213 cdf_device_t cdf_dev;
214
Prakash Dhavalid5c9f1c2015-11-08 19:04:44 -0800215 /* Packet statistics */
216 struct ol_ath_stats pkt_stats;
217
Prakash Dhavalid5c9f1c2015-11-08 19:04:44 -0800218 ol_target_status target_status;
Prakash Dhavalid5c9f1c2015-11-08 19:04:44 -0800219 /* calibration data is stored in flash */
220 uint8_t *cal_in_flash;
221 /* virtual address for the calibration data on the flash */
222 void *cal_mem;
223 /* status of target init */
224 WLAN_INIT_STATUS wlan_init_status;
225
Prakash Dhavalid5c9f1c2015-11-08 19:04:44 -0800226 /* Handles for Lower Layers : filled in at init time */
227 hif_handle_t hif_hdl;
228#ifdef HIF_PCI
229 struct hif_pci_softc *hif_sc;
230#endif
231
232#ifdef WLAN_FEATURE_FASTPATH
233 int fastpath_mode_on; /* Duplicating this for data path efficiency */
234#endif /* WLAN_FEATURE_FASTPATH */
235
236 /* HTC handles */
237 void *htc_handle;
238
Prakash Dhavalid5c9f1c2015-11-08 19:04:44 -0800239 uint8_t vow_extstats;
Prakash Dhavalid5c9f1c2015-11-08 19:04:44 -0800240 struct targetdef_s *targetdef;
241 struct ce_reg_def *target_ce_def;
242 struct hostdef_s *hostdef;
243 struct host_shadow_regs_s *host_shadow_regs;
244 bool athdiag_procfs_inited;
245 /*
246 * Guard changes to Target HW state and to software
247 * structures that track hardware state.
248 */
Prakash Dhavalid5c9f1c2015-11-08 19:04:44 -0800249 unsigned int ce_count; /* Number of Copy Engines supported */
Prakash Dhavalid5c9f1c2015-11-08 19:04:44 -0800250 struct CE_state *ce_id_to_state[CE_COUNT_MAX]; /* CE id to CE_state */
251#ifdef FEATURE_NAPI
252 struct qca_napi_data napi_data;
253#endif /* FEATURE_NAPI */
254 int htc_endpoint;
255 bool recovery;
256 bool hif_init_done;
257 int linkstate_vote;
258 atomic_t link_suspended;
259 atomic_t wow_done;
260 atomic_t tasklet_from_intr;
261 atomic_t active_tasklet_cnt;
262 bool notice_send;
263#ifdef HIF_PCI
Prakash Dhavalid5c9f1c2015-11-08 19:04:44 -0800264 uint32_t ce_irq_summary;
265#endif
Sanjay Devnanib925d7e2015-11-12 14:43:58 -0800266 uint32_t *vaddr_rri_on_ddr;
Prakash Dhavalid5c9f1c2015-11-08 19:04:44 -0800267};
268
269typedef enum {
270 HIF_DEVICE_POWER_UP, /* HIF layer should power up interface
271 * and/or module */
272 HIF_DEVICE_POWER_DOWN, /* HIF layer should initiate bus-specific
273 * measures to minimize power */
274 HIF_DEVICE_POWER_CUT /* HIF layer should initiate bus-specific
275 * AND/OR platform-specific measures
276 * to completely power-off the module and
277 * associated hardware (i.e. cut power
278 * supplies) */
279} HIF_DEVICE_POWER_CHANGE_TYPE;
280
281/**
282 * enum hif_enable_type: what triggered the enabling of hif
283 *
284 * @HIF_ENABLE_TYPE_PROBE: probe triggered enable
285 * @HIF_ENABLE_TYPE_REINIT: reinit triggered enable
286 */
287enum hif_enable_type {
288 HIF_ENABLE_TYPE_PROBE,
289 HIF_ENABLE_TYPE_REINIT,
290 HIF_ENABLE_TYPE_MAX
291};
292
293/**
294 * enum hif_disable_type: what triggered the disabling of hif
295 *
296 * @HIF_DISABLE_TYPE_PROBE_ERROR: probe error triggered disable
297 * @HIF_DISABLE_TYPE_REINIT_ERROR: reinit error triggered
298 * disable
299 * @HIF_DISABLE_TYPE_REMOVE: remove triggered disable
300 * @HIF_DISABLE_TYPE_SHUTDOWN: shutdown triggered disable
301 */
302enum hif_disable_type {
303 HIF_DISABLE_TYPE_PROBE_ERROR,
304 HIF_DISABLE_TYPE_REINIT_ERROR,
305 HIF_DISABLE_TYPE_REMOVE,
306 HIF_DISABLE_TYPE_SHUTDOWN,
307 HIF_DISABLE_TYPE_MAX
308};
309
310#ifdef CONFIG_ATH_PCIE_ACCESS_DEBUG
311typedef struct _HID_ACCESS_LOG {
312 uint32_t seqnum;
313 bool is_write;
314 void *addr;
315 uint32_t value;
316} HIF_ACCESS_LOG;
317#endif
318
319#define HIF_MAX_DEVICES 1
320
321struct htc_callbacks {
322 void *context; /* context to pass to the dsrhandler
323 * note : rwCompletionHandler is provided
324 * the context passed to hif_read_write */
325 int (*rwCompletionHandler)(void *rwContext, int status);
326 int (*dsrHandler)(void *context);
327};
328
329typedef struct osdrv_callbacks {
330 void *context; /* context to pass for all callbacks
331 * except deviceRemovedHandler
332 * the deviceRemovedHandler is only
333 * called if the device is claimed */
334 int (*deviceInsertedHandler)(void *context, void *hif_handle);
335 int (*deviceRemovedHandler)(void *claimedContext,
336 void *hif_handle);
337 int (*deviceSuspendHandler)(void *context);
338 int (*deviceResumeHandler)(void *context);
339 int (*deviceWakeupHandler)(void *context);
340 int (*devicePowerChangeHandler)(void *context,
341 HIF_DEVICE_POWER_CHANGE_TYPE
342 config);
343} OSDRV_CALLBACKS;
344
345/*
346 * This API is used to perform any global initialization of the HIF layer
347 * and to set OS driver callbacks (i.e. insertion/removal) to the HIF layer
348 *
349 */
350int hif_init(OSDRV_CALLBACKS *callbacks);
351
Prakash Dhavalid5c9f1c2015-11-08 19:04:44 -0800352/* This API detaches the HTC layer from the HIF device */
353void hif_detach_htc(struct ol_softc *scn);
354
355/****************************************************************/
356/* BMI and Diag window abstraction */
357/****************************************************************/
358
359#define HIF_BMI_EXCHANGE_NO_TIMEOUT ((uint32_t)(0))
360
361#define DIAG_TRANSFER_LIMIT 2048U /* maximum number of bytes that can be
362 * handled atomically by
363 * DiagRead/DiagWrite */
364
365/*
366 * API to handle HIF-specific BMI message exchanges, this API is synchronous
367 * and only allowed to be called from a context that can block (sleep) */
368CDF_STATUS hif_exchange_bmi_msg(struct ol_softc *scn,
369 uint8_t *pSendMessage,
370 uint32_t Length,
371 uint8_t *pResponseMessage,
372 uint32_t *pResponseLength, uint32_t TimeoutMS);
373
374/*
375 * APIs to handle HIF specific diagnostic read accesses. These APIs are
376 * synchronous and only allowed to be called from a context that
377 * can block (sleep). They are not high performance APIs.
378 *
379 * hif_diag_read_access reads a 4 Byte aligned/length value from a
380 * Target register or memory word.
381 *
382 * hif_diag_read_mem reads an arbitrary length of arbitrarily aligned memory.
383 */
384CDF_STATUS hif_diag_read_access(struct ol_softc *scn, uint32_t address,
385 uint32_t *data);
386CDF_STATUS hif_diag_read_mem(struct ol_softc *scn, uint32_t address,
387 uint8_t *data, int nbytes);
388void hif_dump_target_memory(struct ol_softc *scn, void *ramdump_base,
389 uint32_t address, uint32_t size);
390/*
391 * APIs to handle HIF specific diagnostic write accesses. These APIs are
392 * synchronous and only allowed to be called from a context that
393 * can block (sleep).
394 * They are not high performance APIs.
395 *
396 * hif_diag_write_access writes a 4 Byte aligned/length value to a
397 * Target register or memory word.
398 *
399 * hif_diag_write_mem writes an arbitrary length of arbitrarily aligned memory.
400 */
401CDF_STATUS hif_diag_write_access(struct ol_softc *scn, uint32_t address,
402 uint32_t data);
403CDF_STATUS hif_diag_write_mem(struct ol_softc *scn, uint32_t address,
404 uint8_t *data, int nbytes);
405
406/*
407 * Set the FASTPATH_mode_on flag in sc, for use by data path
408 */
409#ifdef WLAN_FEATURE_FASTPATH
Komal Seelamc92a0cf2016-02-22 20:43:52 +0530410void hif_enable_fastpath(struct ol_softc *hif_ctx);
411bool hif_is_fastpath_mode_enabled(struct ol_softc *hif_ctx);
412void *hif_get_ce_handle(struct ol_softc *hif_ctx, int);
Prakash Dhavalid5c9f1c2015-11-08 19:04:44 -0800413#endif
414
415#if defined(HIF_PCI) && !defined(A_SIMOS_DEVHOST)
416/*
417 * This API allows the Host to access Target registers of a given
418 * A_target_id_t directly and relatively efficiently over PCIe.
419 * This allows the Host to avoid extra overhead associated with
420 * sending a message to firmware and waiting for a response message
421 * from firmware, as is done on other interconnects.
422 *
423 * Yet there is some complexity with direct accesses because the
424 * Target's power state is not known a priori. The Host must issue
425 * special PCIe reads/writes in order to explicitly wake the Target
426 * and to verify that it is awake and will remain awake.
427 *
428 * NB: Host endianness conversion is left for the caller to handle.
429 * These interfaces handle access; not interpretation.
430 *
431 * Usage:
432 * During initialization, use A_TARGET_ID to obtain an 'target ID'
433 * for use with these interfaces.
434 *
435 * Use A_TARGET_READ and A_TARGET_WRITE to access Target space.
436 * These calls must be bracketed by A_TARGET_ACCESS_BEGIN and
437 * A_TARGET_ACCESS_END. A single BEGIN/END pair is adequate for
438 * multiple READ/WRITE operations.
439 *
440 * Use A_TARGET_ACCESS_BEGIN to put the Target in a state in
441 * which it is legal for the Host to directly access it. This
442 * may involve waking the Target from a low power state, which
443 * may take up to 2Ms!
444 *
445 * Use A_TARGET_ACCESS_END to tell the Target that as far as
446 * this code path is concerned, it no longer needs to remain
447 * directly accessible. BEGIN/END is under a reference counter;
448 * multiple code paths may issue BEGIN/END on a single targid.
449 *
450 * For added efficiency, the Host may use A_TARGET_ACCESS_LIKELY.
451 * The LIKELY interface works just like A_TARGET_ACCESS_BEGIN,
452 * except that it may return before the Target is actually
453 * available. It's a vague indication that some Target accesses
454 * are expected "soon". When the LIKELY API is used,
455 * A_TARGET_ACCESS_BEGIN must be used before any access.
456 *
457 * There are several uses for the LIKELY/UNLIKELY API:
458 * -If there is some potential time before Target accesses
459 * and we want to get a head start on waking the Target
460 * (e.g. to overlap Target wake with Host-side malloc)
461 * -High-level code knows that it will call low-level
462 * functions that will use BEGIN/END, and we don't want
463 * to allow the Target to sleep until the entire sequence
464 * has completed.
465 *
466 * A_TARGET_ACCESS_OK verifies that the Target can be
467 * accessed. In general, this should not be needed, but it
468 * may be useful for debugging or for special uses.
469 *
470 * Note that there must be a matching END for each BEGIN
471 * AND there must be a matching UNLIKELY for each LIKELY!
472 *
473 * NB: This API is designed to allow some flexibility in tradeoffs
474 * between Target power utilization and Host efficiency and
475 * system performance.
476 */
477
478/*
479 * Enable/disable CDC max performance workaround
480 * For max-performace set this to 0
481 * To allow SoC to enter sleep set this to 1
482 */
483#define CONFIG_DISABLE_CDC_MAX_PERF_WAR 0
484#endif
485
486#ifdef IPA_OFFLOAD
Prakash Dhavalid5c9f1c2015-11-08 19:04:44 -0800487void hif_ipa_get_ce_resource(struct ol_softc *scn,
Leo Changd85f78d2015-11-13 10:55:34 -0800488 cdf_dma_addr_t *ce_sr_base_paddr,
Prakash Dhavalid5c9f1c2015-11-08 19:04:44 -0800489 uint32_t *ce_sr_ring_size,
490 cdf_dma_addr_t *ce_reg_paddr);
491#else
Leo Changd85f78d2015-11-13 10:55:34 -0800492/**
493 * hif_ipa_get_ce_resource() - get uc resource on hif
494 * @scn: bus context
495 * @ce_sr_base_paddr: copyengine source ring base physical address
496 * @ce_sr_ring_size: copyengine source ring size
497 * @ce_reg_paddr: copyengine register physical address
498 *
499 * IPA micro controller data path offload feature enabled,
500 * HIF should release copy engine related resource information to IPA UC
501 * IPA UC will access hardware resource with released information
502 *
503 * Return: None
504 */
Prakash Dhavalid5c9f1c2015-11-08 19:04:44 -0800505static inline void hif_ipa_get_ce_resource(struct ol_softc *scn,
Leo Changd85f78d2015-11-13 10:55:34 -0800506 cdf_dma_addr_t *ce_sr_base_paddr,
Prakash Dhavalid5c9f1c2015-11-08 19:04:44 -0800507 uint32_t *ce_sr_ring_size,
508 cdf_dma_addr_t *ce_reg_paddr)
509{
510 return;
511}
512#endif /* IPA_OFFLOAD */
513
514
515void hif_read_phy_mem_base(struct ol_softc *scn,
516 cdf_dma_addr_t *bar_value);
517
518/**
519 * @brief List of callbacks - filled in by HTC.
520 */
521struct hif_msg_callbacks {
522 void *Context;
523 /**< context meaningful to HTC */
524 CDF_STATUS (*txCompletionHandler)(void *Context, cdf_nbuf_t wbuf,
525 uint32_t transferID,
526 uint32_t toeplitz_hash_result);
527 CDF_STATUS (*rxCompletionHandler)(void *Context, cdf_nbuf_t wbuf,
528 uint8_t pipeID);
529 void (*txResourceAvailHandler)(void *context, uint8_t pipe);
530 void (*fwEventHandler)(void *context, CDF_STATUS status);
531};
532
533#define HIF_DATA_ATTR_SET_TX_CLASSIFY(attr, v) \
534 (attr |= (v & 0x01) << 5)
535#define HIF_DATA_ATTR_SET_ENCAPSULATION_TYPE(attr, v) \
536 (attr |= (v & 0x03) << 6)
537#define HIF_DATA_ATTR_SET_ADDR_X_SEARCH_DISABLE(attr, v) \
538 (attr |= (v & 0x01) << 13)
539#define HIF_DATA_ATTR_SET_ADDR_Y_SEARCH_DISABLE(attr, v) \
540 (attr |= (v & 0x01) << 14)
541#define HIF_DATA_ATTR_SET_TOEPLITZ_HASH_ENABLE(attr, v) \
542 (attr |= (v & 0x01) << 15)
543#define HIF_DATA_ATTR_SET_PACKET_OR_RESULT_OFFSET(attr, v) \
544 (attr |= (v & 0x0FFF) << 16)
545#define HIF_DATA_ATTR_SET_ENABLE_11H(attr, v) \
546 (attr |= (v & 0x01) << 30)
547
548#ifdef HIF_PCI
549typedef struct pci_device_id hif_bus_id;
550#else
551typedef struct device hif_bus_id;
552#endif
553
554void hif_post_init(struct ol_softc *scn, void *hHTC,
555 struct hif_msg_callbacks *callbacks);
556CDF_STATUS hif_start(struct ol_softc *scn);
557void hif_stop(struct ol_softc *scn);
558void hif_flush_surprise_remove(struct ol_softc *scn);
559void hif_dump(struct ol_softc *scn, uint8_t CmdId, bool start);
560CDF_STATUS hif_send_head(struct ol_softc *scn, uint8_t PipeID,
561 uint32_t transferID, uint32_t nbytes,
562 cdf_nbuf_t wbuf, uint32_t data_attr);
563void hif_send_complete_check(struct ol_softc *scn, uint8_t PipeID,
564 int force);
565void hif_cancel_deferred_target_sleep(struct ol_softc *scn);
566void hif_get_default_pipe(struct ol_softc *scn, uint8_t *ULPipe,
567 uint8_t *DLPipe);
Sanjay Devnanic319c822015-11-06 16:44:28 -0800568int hif_map_service_to_pipe(struct ol_softc *scn, uint16_t svc_id,
569 uint8_t *ul_pipe, uint8_t *dl_pipe, int *ul_is_polled,
570 int *dl_is_polled);
Prakash Dhavalid5c9f1c2015-11-08 19:04:44 -0800571uint16_t hif_get_free_queue_number(struct ol_softc *scn, uint8_t PipeID);
572void *hif_get_targetdef(struct ol_softc *scn);
573void hi_fsuspendwow(struct ol_softc *scn);
574uint32_t hif_hia_item_address(uint32_t target_type, uint32_t item_offset);
575void hif_set_target_sleep(struct ol_softc *scn, bool sleep_ok,
576 bool wait_for_it);
577int hif_check_fw_reg(struct ol_softc *scn);
578int hif_check_soc_status(struct ol_softc *scn);
Prakash Dhavalid5c9f1c2015-11-08 19:04:44 -0800579void hif_disable_isr(void *scn);
580void hif_reset_soc(void *scn);
Komal Seelamf8600682016-02-02 18:17:13 +0530581void hif_disable_aspm(void *);
582void hif_save_htc_htt_config_endpoint(void *hif_ctx, int htc_endpoint);
583CDF_STATUS hif_open(cdf_device_t cdf_ctx, enum ath_hal_bus_type bus_type);
Prakash Dhavalid5c9f1c2015-11-08 19:04:44 -0800584void hif_close(void *hif_ctx);
585CDF_STATUS hif_enable(void *hif_ctx, struct device *dev, void *bdev,
586 const hif_bus_id *bid, enum ath_hal_bus_type bus_type,
587 enum hif_enable_type type);
588void hif_disable(void *hif_ctx, enum hif_disable_type type);
589void hif_enable_power_gating(void *hif_ctx);
Houston Hoffman9078a152015-11-02 16:15:02 -0800590
591#ifdef FEATURE_RUNTIME_PM
592struct hif_pm_runtime_lock;
593int hif_pm_runtime_get(void *hif_ctx);
Houston Hoffmanf4607852015-12-17 17:14:40 -0800594void hif_pm_runtime_get_noresume(void *hif_ctx);
Houston Hoffman9078a152015-11-02 16:15:02 -0800595int hif_pm_runtime_put(void *hif_ctx);
596struct hif_pm_runtime_lock *hif_runtime_lock_init(const char *name);
Komal Seelamf8600682016-02-02 18:17:13 +0530597void hif_runtime_lock_deinit(void *hif_ctx, struct hif_pm_runtime_lock *lock);
Houston Hoffman9078a152015-11-02 16:15:02 -0800598int hif_pm_runtime_prevent_suspend(void *ol_sc,
599 struct hif_pm_runtime_lock *lock);
600int hif_pm_runtime_allow_suspend(void *ol_sc,
601 struct hif_pm_runtime_lock *lock);
602int hif_pm_runtime_prevent_suspend_timeout(void *ol_sc,
603 struct hif_pm_runtime_lock *lock, unsigned int delay);
604#else
605struct hif_pm_runtime_lock {
606 const char *name;
607};
Houston Hoffmanf4607852015-12-17 17:14:40 -0800608
609static inline void hif_pm_runtime_get_noresume(void *hif_ctx)
610{}
611
Houston Hoffman9078a152015-11-02 16:15:02 -0800612static inline int hif_pm_runtime_get(void *hif_ctx)
613{ return 0; }
614static inline int hif_pm_runtime_put(void *hif_ctx)
615{ return 0; }
616static inline struct hif_pm_runtime_lock *hif_runtime_lock_init(
617 const char *name)
618{ return NULL; }
Komal Seelamf8600682016-02-02 18:17:13 +0530619static inline void
620hif_runtime_lock_deinit(void *hif_ctx, struct hif_pm_runtime_lock *lock) {}
Houston Hoffman9078a152015-11-02 16:15:02 -0800621
622static inline int hif_pm_runtime_prevent_suspend(void *ol_sc,
623 struct hif_pm_runtime_lock *lock)
624{ return 0; }
625static inline int hif_pm_runtime_allow_suspend(void *ol_sc,
626 struct hif_pm_runtime_lock *lock)
627{ return 0; }
628static inline int hif_pm_runtime_prevent_suspend_timeout(void *ol_sc,
629 struct hif_pm_runtime_lock *lock, unsigned int delay)
630{ return 0; }
631#endif
632
Houston Hoffman62aa58d2015-11-02 21:14:55 -0800633void hif_enable_power_management(void *hif_ctx);
Houston Hoffman53b34c42015-11-18 15:51:32 -0800634void hif_disable_power_management(void *hif_ctx);
Houston Hoffman78467a82016-01-05 20:08:56 -0800635
Komal Seelamf8600682016-02-02 18:17:13 +0530636void hif_vote_link_down(void *);
637void hif_vote_link_up(void *);
638bool hif_can_suspend_link(void *);
Houston Hoffman78467a82016-01-05 20:08:56 -0800639
Komal Seelamf8600682016-02-02 18:17:13 +0530640int hif_bus_resume(void *);
641int hif_bus_suspend(void *);
Houston Hoffman692cc052015-11-10 18:42:47 -0800642
643#ifdef FEATURE_RUNTIME_PM
Komal Seelamf8600682016-02-02 18:17:13 +0530644int hif_pre_runtime_suspend(void *hif_ctx);
645void hif_pre_runtime_resume(void *hif_ctx);
646int hif_runtime_suspend(void *hif_ctx);
647int hif_runtime_resume(void *hif_ctx);
648void hif_process_runtime_suspend_success(void *);
649void hif_process_runtime_suspend_failure(void *);
650void hif_process_runtime_resume_success(void *);
Houston Hoffman692cc052015-11-10 18:42:47 -0800651#endif
652
Govind Singh2443fb32016-01-13 17:44:48 +0530653int hif_dump_registers(struct ol_softc *scn);
Prakash Dhavalid5c9f1c2015-11-08 19:04:44 -0800654int ol_copy_ramdump(struct ol_softc *scn);
Prakash Dhavalid5c9f1c2015-11-08 19:04:44 -0800655void hif_crash_shutdown(void *hif_ctx);
Komal Seelam91553ce2016-01-27 18:57:10 +0530656void hif_get_hw_info(struct ol_softc *scn, u32 *version, u32 *revision,
657 const char **target_name);
658struct hif_target_info *hif_get_target_info_handle(struct ol_softc *scn);
659struct hif_config_info *hif_get_ini_handle(struct ol_softc *scn);
Komal Seelamc92a0cf2016-02-22 20:43:52 +0530660struct bmi_info *hif_get_bmi_ctx(struct ol_softc *scn);
661void hif_lro_flush_cb_register(struct ol_softc *scn,
662 void (handler)(void *), void *data);
663void hif_lro_flush_cb_deregister(struct ol_softc *scn);
Prakash Dhavalid5c9f1c2015-11-08 19:04:44 -0800664#ifdef __cplusplus
665}
666#endif
667#endif /* _HIF_H_ */