| .. | .. |
|---|
| 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_ */ |
|---|