.. | .. |
---|
1 | | -/* SPDX-License-Identifier: GPL-2.0 */ |
---|
2 | 1 | /* |
---|
3 | 2 | * Header file describing the internal (inter-module) DHD interfaces. |
---|
4 | 3 | * |
---|
5 | 4 | * Provides type definitions and function prototypes used to link the |
---|
6 | 5 | * DHD OS, bus, and protocol modules. |
---|
7 | 6 | * |
---|
8 | | - * Copyright (C) 1999-2019, Broadcom Corporation |
---|
9 | | - * |
---|
| 7 | + * Portions of this code are copyright (c) 2022 Cypress Semiconductor Corporation |
---|
| 8 | + * |
---|
| 9 | + * Copyright (C) 1999-2017, Broadcom Corporation |
---|
| 10 | + * |
---|
10 | 11 | * Unless you and Broadcom execute a separate written software license |
---|
11 | 12 | * agreement governing use of this software, this software is licensed to you |
---|
12 | 13 | * under the terms of the GNU General Public License version 2 (the "GPL"), |
---|
13 | 14 | * available at http://www.broadcom.com/licenses/GPLv2.php, with the |
---|
14 | 15 | * following added to such license: |
---|
15 | | - * |
---|
| 16 | + * |
---|
16 | 17 | * As a special exception, the copyright holders of this software give you |
---|
17 | 18 | * permission to link this software with independent modules, and to copy and |
---|
18 | 19 | * distribute the resulting executable under terms of your choice, provided that |
---|
.. | .. |
---|
20 | 21 | * the license of that module. An independent module is a module which is not |
---|
21 | 22 | * derived from this software. The special exception does not apply to any |
---|
22 | 23 | * modifications of the software. |
---|
23 | | - * |
---|
| 24 | + * |
---|
24 | 25 | * Notwithstanding the above, under no circumstances may you combine this |
---|
25 | 26 | * software in any way with any other Broadcom software provided under a license |
---|
26 | 27 | * other than the GPL, without Broadcom's express prior written consent. |
---|
.. | .. |
---|
28 | 29 | * |
---|
29 | 30 | * <<Broadcom-WL-IPTag/Open:>> |
---|
30 | 31 | * |
---|
31 | | - * $Id: dhd_bus.h 603826 2015-12-03 08:57:00Z $ |
---|
| 32 | + * $Id: dhd_bus.h 701741 2017-05-26 08:18:08Z $ |
---|
32 | 33 | */ |
---|
33 | 34 | |
---|
34 | 35 | #ifndef _dhd_bus_h_ |
---|
.. | .. |
---|
38 | 39 | * Exported from dhd bus module (dhd_usb, dhd_sdio) |
---|
39 | 40 | */ |
---|
40 | 41 | |
---|
| 42 | +/* global variable for the bus */ |
---|
| 43 | +extern struct dhd_bus *g_dhd_bus; |
---|
| 44 | + |
---|
41 | 45 | /* Indicate (dis)interest in finding dongles. */ |
---|
42 | 46 | extern int dhd_bus_register(void); |
---|
43 | 47 | extern void dhd_bus_unregister(void); |
---|
44 | 48 | |
---|
45 | 49 | /* Download firmware image and nvram image */ |
---|
46 | 50 | extern int dhd_bus_download_firmware(struct dhd_bus *bus, osl_t *osh, char *fw_path, char *nv_path); |
---|
| 51 | +#if defined(BT_OVER_SDIO) |
---|
| 52 | +extern int dhd_bus_download_btfw(struct dhd_bus *bus, osl_t *osh, char *btfw_path); |
---|
| 53 | +#endif /* defined (BT_OVER_SDIO) */ |
---|
47 | 54 | |
---|
48 | 55 | /* Stop bus module: clear pending frames, disable data flow */ |
---|
49 | 56 | extern void dhd_bus_stop(struct dhd_bus *bus, bool enforce_mutex); |
---|
.. | .. |
---|
62 | 69 | extern int dhd_bus_txdata(struct dhd_bus *bus, void *txp, uint8 ifidx); |
---|
63 | 70 | #else |
---|
64 | 71 | extern int dhd_bus_txdata(struct dhd_bus *bus, void *txp); |
---|
65 | | -#endif |
---|
| 72 | +#endif // endif |
---|
66 | 73 | |
---|
| 74 | +#ifdef BCMPCIE |
---|
| 75 | +extern void dhdpcie_cto_recovery_handler(dhd_pub_t *dhd); |
---|
| 76 | +#endif /* BCMPCIE */ |
---|
67 | 77 | |
---|
68 | 78 | /* Send/receive a control message to/from the dongle. |
---|
69 | 79 | * Expects caller to enforce a single outstanding transaction. |
---|
.. | .. |
---|
81 | 91 | extern void dhd_bus_dev_pm_relax(dhd_pub_t *dhdpub); |
---|
82 | 92 | extern bool dhd_bus_dev_pm_enabled(dhd_pub_t *dhdpub); |
---|
83 | 93 | |
---|
84 | | -#if defined(DHD_DEBUG) |
---|
85 | 94 | /* Device console input function */ |
---|
86 | 95 | extern int dhd_bus_console_in(dhd_pub_t *dhd, uchar *msg, uint msglen); |
---|
87 | | -#endif /* defined(DHD_DEBUG) */ |
---|
88 | 96 | |
---|
89 | 97 | /* Deferred processing for the bus, return TRUE requests reschedule */ |
---|
90 | 98 | extern bool dhd_bus_dpc(struct dhd_bus *bus); |
---|
91 | 99 | extern void dhd_bus_isr(bool * InterruptRecognized, bool * QueueMiniportHandleInterrupt, void *arg); |
---|
92 | | - |
---|
93 | 100 | |
---|
94 | 101 | /* Check for and handle local prot-specific iovar commands */ |
---|
95 | 102 | extern int dhd_bus_iovar_op(dhd_pub_t *dhdp, const char *name, |
---|
.. | .. |
---|
120 | 127 | extern uint8 dhd_bus_is_ioready(struct dhd_bus *bus); |
---|
121 | 128 | #else |
---|
122 | 129 | #define dhd_bus_set_dotxinrx(a, b) do {} while (0) |
---|
123 | | -#endif |
---|
| 130 | +#endif // endif |
---|
124 | 131 | |
---|
125 | 132 | #define DHD_SET_BUS_STATE_DOWN(_bus) do { \ |
---|
126 | 133 | (_bus)->dhd->busstate = DHD_BUS_DOWN; \ |
---|
.. | .. |
---|
132 | 139 | extern void dhd_txglom_enable(dhd_pub_t *dhdp, bool enable); |
---|
133 | 140 | extern int dhd_bus_get_ids(struct dhd_bus *bus, uint32 *bus_type, uint32 *bus_num, |
---|
134 | 141 | uint32 *slot_num); |
---|
| 142 | + |
---|
| 143 | +#if defined(DHD_FW_COREDUMP) && (defined(BCMPCIE) || defined(BCMSDIO)) |
---|
| 144 | +extern int dhd_bus_mem_dump(dhd_pub_t *dhd); |
---|
| 145 | +extern int dhd_bus_get_mem_dump(dhd_pub_t *dhdp); |
---|
| 146 | +#else |
---|
| 147 | +#define dhd_bus_mem_dump(x) |
---|
| 148 | +#define dhd_bus_get_mem_dump(x) |
---|
| 149 | +#endif /* DHD_FW_COREDUMP && (BCMPCIE || BCMSDIO) */ |
---|
135 | 150 | |
---|
136 | 151 | #ifdef BCMPCIE |
---|
137 | 152 | enum { |
---|
.. | .. |
---|
151 | 166 | D2H_DMA_INDX_WR_UPD, /* update D2H WR index in D2H WR dma indices buf */ |
---|
152 | 167 | D2H_DMA_INDX_RD_UPD, /* update D2H RD index in D2H RD dma indices buf */ |
---|
153 | 168 | |
---|
| 169 | + /* DHD Indices array buffers and update for: H2D flow ring WR */ |
---|
| 170 | + H2D_IFRM_INDX_WR_BUF, /* update H2D WR dma indices buf base addr to dongle */ |
---|
| 171 | + H2D_IFRM_INDX_WR_UPD, /* update H2D WR dma indices buf base addr to dongle */ |
---|
| 172 | + |
---|
154 | 173 | /* H2D and D2H Mailbox data update */ |
---|
155 | 174 | H2D_MB_DATA, |
---|
156 | 175 | D2H_MB_DATA, |
---|
.. | .. |
---|
165 | 184 | RING_WR_UPD, /* update ring write index from/to dongle */ |
---|
166 | 185 | |
---|
167 | 186 | TOTAL_LFRAG_PACKET_CNT, |
---|
168 | | - MAX_HOST_RXBUFS |
---|
| 187 | + MAX_HOST_RXBUFS, |
---|
| 188 | + HOST_API_VERSION, |
---|
| 189 | + DNGL_TO_HOST_TRAP_ADDR, |
---|
| 190 | + HOST_SCB_ADDR, /* update host scb base address to dongle */ |
---|
169 | 191 | }; |
---|
170 | 192 | |
---|
171 | 193 | typedef void (*dhd_mb_ring_t) (struct dhd_bus *, uint32); |
---|
| 194 | +typedef void (*dhd_mb_ring_2_t) (struct dhd_bus *, uint32, bool); |
---|
172 | 195 | extern void dhd_bus_cmn_writeshared(struct dhd_bus *bus, void * data, uint32 len, uint8 type, |
---|
173 | 196 | uint16 ringid); |
---|
174 | 197 | extern void dhd_bus_ringbell(struct dhd_bus *bus, uint32 value); |
---|
| 198 | +extern void dhd_bus_ringbell_2(struct dhd_bus *bus, uint32 value, bool devwake); |
---|
175 | 199 | extern void dhd_bus_cmn_readshared(struct dhd_bus *bus, void* data, uint8 type, uint16 ringid); |
---|
176 | 200 | extern uint32 dhd_bus_get_sharedflags(struct dhd_bus *bus); |
---|
177 | 201 | extern void dhd_bus_rx_frame(struct dhd_bus *bus, void* pkt, int ifidx, uint pkt_count); |
---|
178 | 202 | extern void dhd_bus_start_queue(struct dhd_bus *bus); |
---|
179 | 203 | extern void dhd_bus_stop_queue(struct dhd_bus *bus); |
---|
180 | | - |
---|
181 | 204 | extern dhd_mb_ring_t dhd_bus_get_mbintr_fn(struct dhd_bus *bus); |
---|
| 205 | +extern dhd_mb_ring_2_t dhd_bus_get_mbintr_2_fn(struct dhd_bus *bus); |
---|
182 | 206 | extern void dhd_bus_write_flow_ring_states(struct dhd_bus *bus, |
---|
183 | 207 | void * data, uint16 flowid); |
---|
184 | 208 | extern void dhd_bus_read_flow_ring_states(struct dhd_bus *bus, |
---|
.. | .. |
---|
193 | 217 | extern uint32 dhd_bus_max_h2d_queues(struct dhd_bus *bus); |
---|
194 | 218 | extern int dhd_bus_schedule_queue(struct dhd_bus *bus, uint16 flow_id, bool txs); |
---|
195 | 219 | |
---|
| 220 | +#ifdef IDLE_TX_FLOW_MGMT |
---|
| 221 | +extern void dhd_bus_flow_ring_resume_response(struct dhd_bus *bus, uint16 flowid, int32 status); |
---|
| 222 | +#endif /* IDLE_TX_FLOW_MGMT */ |
---|
196 | 223 | |
---|
197 | 224 | extern int dhdpcie_bus_clock_start(struct dhd_bus *bus); |
---|
198 | 225 | extern int dhdpcie_bus_clock_stop(struct dhd_bus *bus); |
---|
.. | .. |
---|
203 | 230 | extern bool dhdpcie_bus_dongle_attach(struct dhd_bus *bus); |
---|
204 | 231 | extern int dhd_bus_release_dongle(struct dhd_bus *bus); |
---|
205 | 232 | extern int dhd_bus_request_irq(struct dhd_bus *bus); |
---|
| 233 | +extern int dhdpcie_get_pcieirq(struct dhd_bus *bus, unsigned int *irq); |
---|
| 234 | +extern void dhd_bus_aer_config(struct dhd_bus *bus); |
---|
206 | 235 | |
---|
| 236 | +extern struct device * dhd_bus_to_dev(struct dhd_bus *bus); |
---|
| 237 | + |
---|
| 238 | +extern int dhdpcie_cto_init(struct dhd_bus *bus, bool enable); |
---|
| 239 | +extern int dhdpcie_cto_cfg_init(struct dhd_bus *bus, bool enable); |
---|
| 240 | + |
---|
| 241 | +extern void dhdpcie_ssreset_dis_enum_rst(struct dhd_bus *bus); |
---|
207 | 242 | |
---|
208 | 243 | #ifdef DHD_FW_COREDUMP |
---|
209 | | -extern int dhd_bus_mem_dump(dhd_pub_t *dhd); |
---|
| 244 | +#ifdef BCMDHDX |
---|
| 245 | +extern int dhdx_dongle_mem_dump(void); |
---|
| 246 | +#else |
---|
| 247 | +extern int dhd_dongle_mem_dump(void); |
---|
| 248 | +#endif /* BCMDHDX */ |
---|
210 | 249 | #endif /* DHD_FW_COREDUMP */ |
---|
211 | 250 | |
---|
| 251 | +#ifdef IDLE_TX_FLOW_MGMT |
---|
| 252 | +extern void dhd_bus_idle_tx_ring_suspend(dhd_pub_t *dhd, uint16 flow_ring_id); |
---|
| 253 | +#endif /* IDLE_TX_FLOW_MGMT */ |
---|
| 254 | +extern void dhd_bus_handle_mb_data(struct dhd_bus *bus, uint32 d2h_mb_data); |
---|
212 | 255 | #endif /* BCMPCIE */ |
---|
213 | 256 | |
---|
214 | | -#ifdef DHD_ULP |
---|
215 | | -extern int dhd_bcmsdh_send_buffer(void *bus, uint8 *frame, uint16 len); |
---|
216 | | -extern void dhd_bus_ulp_bus_wake(void *bus); |
---|
217 | | -extern void dhd_bus_ulp_disable_console(dhd_pub_t *dhdp); |
---|
218 | | -extern int dhd_bus_read_sdh_config(void *bus); |
---|
219 | | -extern void dhd_bus_schedule_dpc(void *bus); |
---|
| 257 | +/* dump the device trap informtation */ |
---|
| 258 | +extern void dhd_bus_dump_trap_info(struct dhd_bus *bus, struct bcmstrbuf *b); |
---|
| 259 | +extern void dhd_bus_copy_trap_sig(struct dhd_bus *bus, trap_t *tr); |
---|
| 260 | +#ifdef WL_CFGVENDOR_SEND_HANG_EVENT |
---|
| 261 | +void copy_ext_trap_sig(dhd_pub_t *dhd, trap_t *tr); |
---|
| 262 | +void copy_hang_info_trap(dhd_pub_t *dhd); |
---|
| 263 | +#endif /* WL_CFGVENDOR_SEND_HANG_EVENT */ |
---|
| 264 | +/* Function to set default min res mask */ |
---|
220 | 265 | extern bool dhd_bus_set_default_min_res_mask(struct dhd_bus *bus); |
---|
| 266 | + |
---|
| 267 | +/* Function to reset PMU registers */ |
---|
221 | 268 | extern void dhd_bus_pmu_reg_reset(dhd_pub_t *dhdp); |
---|
| 269 | + |
---|
| 270 | +extern void dhd_bus_ucode_download(struct dhd_bus *bus); |
---|
| 271 | + |
---|
| 272 | +#ifdef DHD_ULP |
---|
| 273 | +extern void dhd_bus_ulp_disable_console(dhd_pub_t *dhdp); |
---|
222 | 274 | #endif /* DHD_ULP */ |
---|
| 275 | +extern int dhd_bus_readwrite_bp_addr(dhd_pub_t *dhdp, uint addr, uint size, uint* data, bool read); |
---|
| 276 | +extern int dhd_get_idletime(dhd_pub_t *dhd); |
---|
| 277 | +#ifdef BCMPCIE |
---|
| 278 | +extern void dhd_bus_dump_console_buffer(struct dhd_bus *bus); |
---|
| 279 | +extern void dhd_bus_intr_count_dump(dhd_pub_t *dhdp); |
---|
| 280 | +extern void dhd_bus_set_dpc_sched_time(dhd_pub_t *dhdp); |
---|
| 281 | +extern bool dhd_bus_query_dpc_sched_errors(dhd_pub_t *dhdp); |
---|
| 282 | +extern int dhd_bus_dmaxfer_lpbk(dhd_pub_t *dhdp, uint32 type); |
---|
| 283 | +#ifndef BCMDHDX |
---|
| 284 | +extern bool dhd_bus_check_driver_up(void); |
---|
| 285 | +#else |
---|
| 286 | +extern bool dhdx_bus_check_driver_up(void); |
---|
| 287 | +#endif /* BCMDHDX */ |
---|
| 288 | +extern int dhd_bus_get_cto(dhd_pub_t *dhdp); |
---|
| 289 | +extern void dhd_bus_set_linkdown(dhd_pub_t *dhdp, bool val); |
---|
| 290 | +extern int dhd_bus_get_linkdown(dhd_pub_t *dhdp); |
---|
| 291 | +#else |
---|
| 292 | +#define dhd_bus_dump_console_buffer(x) |
---|
| 293 | +static INLINE void dhd_bus_intr_count_dump(dhd_pub_t *dhdp) { UNUSED_PARAMETER(dhdp); } |
---|
| 294 | +static INLINE void dhd_bus_set_dpc_sched_time(dhd_pub_t *dhdp) { } |
---|
| 295 | +static INLINE bool dhd_bus_query_dpc_sched_errors(dhd_pub_t *dhdp) { return 0; } |
---|
| 296 | +static INLINE int dhd_bus_dmaxfer_lpbk(dhd_pub_t *dhdp, uint32 type) { return 0; } |
---|
| 297 | +static INLINE bool dhd_bus_check_driver_up(void) { return FALSE; } |
---|
| 298 | +extern INLINE void dhd_bus_set_linkdown(dhd_pub_t *dhdp, bool val) { } |
---|
| 299 | +extern INLINE int dhd_bus_get_linkdown(dhd_pub_t *dhdp) { return 0; } |
---|
| 300 | +static INLINE int dhd_bus_get_cto(dhd_pub_t *dhdp) { return 0; } |
---|
| 301 | +#endif /* BCMPCIE */ |
---|
| 302 | + |
---|
| 303 | +#if defined(BCMPCIE) && defined(EWP_ETD_PRSRV_LOGS) |
---|
| 304 | +void dhdpcie_get_etd_preserve_logs(dhd_pub_t *dhd, uint8 *ext_trap_data, |
---|
| 305 | + void *event_decode_data); |
---|
| 306 | +#endif // endif |
---|
| 307 | + |
---|
| 308 | +extern uint16 dhd_get_chipid(dhd_pub_t *dhd); |
---|
| 309 | + |
---|
| 310 | +#ifdef DHD_WAKE_STATUS |
---|
| 311 | +extern wake_counts_t* dhd_bus_get_wakecount(dhd_pub_t *dhd); |
---|
| 312 | +extern int dhd_bus_get_bus_wake(dhd_pub_t * dhd); |
---|
| 313 | +#endif /* DHD_WAKE_STATUS */ |
---|
| 314 | + |
---|
| 315 | +#ifdef BT_OVER_SDIO |
---|
| 316 | +/* |
---|
| 317 | + * SDIO layer clock control functions exposed to be called from other layers. |
---|
| 318 | + * This is required especially in the case where the BUS is shared between |
---|
| 319 | + * BT and SDIO and we have to control the clock. The callers of this function |
---|
| 320 | + * are expected to hold the sdlock |
---|
| 321 | + */ |
---|
| 322 | +int __dhdsdio_clk_enable(struct dhd_bus *bus, bus_owner_t owner, int can_wait); |
---|
| 323 | +int __dhdsdio_clk_disable(struct dhd_bus *bus, bus_owner_t owner, int can_wait); |
---|
| 324 | +void dhdsdio_reset_bt_use_count(struct dhd_bus *bus); |
---|
| 325 | +#endif /* BT_OVER_SDIO */ |
---|
| 326 | + |
---|
| 327 | +int dhd_bus_perform_flr(struct dhd_bus *bus, bool force_fail); |
---|
| 328 | +extern bool dhd_bus_get_flr_force_fail(struct dhd_bus *bus); |
---|
| 329 | + |
---|
| 330 | +extern bool dhd_bus_aspm_enable_rc_ep(struct dhd_bus *bus, bool enable); |
---|
| 331 | +extern void dhd_bus_l1ss_enable_rc_ep(struct dhd_bus *bus, bool enable); |
---|
| 332 | + |
---|
| 333 | +bool dhd_bus_is_multibp_capable(struct dhd_bus *bus); |
---|
| 334 | + |
---|
| 335 | +#ifdef BCMPCIE |
---|
| 336 | +extern void dhdpcie_advertise_bus_cleanup(dhd_pub_t *dhdp); |
---|
| 337 | +extern void dhd_msgbuf_iovar_timeout_dump(dhd_pub_t *dhd); |
---|
| 338 | +#endif /* BCMPCIE */ |
---|
| 339 | + |
---|
| 340 | +extern bool dhd_bus_force_bt_quiesce_enabled(struct dhd_bus *bus); |
---|
| 341 | + |
---|
| 342 | +#ifdef DHD_SSSR_DUMP |
---|
| 343 | +extern int dhd_bus_fis_trigger(dhd_pub_t *dhd); |
---|
| 344 | +extern int dhd_bus_fis_dump(dhd_pub_t *dhd); |
---|
| 345 | +#endif /* DHD_SSSR_DUMP */ |
---|
| 346 | + |
---|
| 347 | +#ifdef PCIE_FULL_DONGLE |
---|
| 348 | +extern int dhdpcie_set_dma_ring_indices(dhd_pub_t *dhd, int32 int_val); |
---|
| 349 | +#endif /* PCIE_FULL_DONGLE */ |
---|
| 350 | + |
---|
| 351 | +#ifdef DHD_USE_BP_RESET |
---|
| 352 | +extern int dhd_bus_perform_bp_reset(struct dhd_bus *bus); |
---|
| 353 | +#endif /* DHD_USE_BP_RESET */ |
---|
| 354 | + |
---|
| 355 | +extern void dhd_bwm_bt_quiesce(struct dhd_bus *bus); |
---|
| 356 | +extern void dhd_bwm_bt_resume(struct dhd_bus *bus); |
---|
223 | 357 | #endif /* _dhd_bus_h_ */ |
---|