1*5113495bSYour Name /* 2*5113495bSYour Name * Copyright (c) 2013-2019 The Linux Foundation. All rights reserved. 3*5113495bSYour Name * 4*5113495bSYour Name * Permission to use, copy, modify, and/or distribute this software for 5*5113495bSYour Name * any purpose with or without fee is hereby granted, provided that the 6*5113495bSYour Name * above copyright notice and this permission notice appear in all 7*5113495bSYour Name * copies. 8*5113495bSYour Name * 9*5113495bSYour Name * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 10*5113495bSYour Name * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 11*5113495bSYour Name * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE 12*5113495bSYour Name * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 13*5113495bSYour Name * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 14*5113495bSYour Name * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 15*5113495bSYour Name * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 16*5113495bSYour Name * PERFORMANCE OF THIS SOFTWARE. 17*5113495bSYour Name */ 18*5113495bSYour Name 19*5113495bSYour Name #ifndef __ATH_USB_H__ 20*5113495bSYour Name #define __ATH_USB_H__ 21*5113495bSYour Name 22*5113495bSYour Name #include <linux/reboot.h> 23*5113495bSYour Name 24*5113495bSYour Name /* 25*5113495bSYour Name * There may be some pending tx frames during platform suspend. 26*5113495bSYour Name * Suspend operation should be delayed until those tx frames are 27*5113495bSYour Name * transferred from the host to target. This macro specifies how 28*5113495bSYour Name * long suspend thread has to sleep before checking pending tx 29*5113495bSYour Name * frame count. 30*5113495bSYour Name */ 31*5113495bSYour Name #define OL_ATH_TX_DRAIN_WAIT_DELAY 50 /* ms */ 32*5113495bSYour Name /* 33*5113495bSYour Name * Wait time (in unit of OL_ATH_TX_DRAIN_WAIT_DELAY) for pending 34*5113495bSYour Name * tx frame completion before suspend. Refer: hif_pci_suspend() 35*5113495bSYour Name */ 36*5113495bSYour Name #define OL_ATH_TX_DRAIN_WAIT_CNT 10 37*5113495bSYour Name 38*5113495bSYour Name #define CONFIG_COPY_ENGINE_SUPPORT /* TBDXXX: here for now */ 39*5113495bSYour Name #define ATH_DBG_DEFAULT 0 40*5113495bSYour Name #include <osdep.h> 41*5113495bSYour Name #include <ol_if_athvar.h> 42*5113495bSYour Name #include <athdefs.h> 43*5113495bSYour Name #include "osapi_linux.h" 44*5113495bSYour Name #include "hif_main.h" 45*5113495bSYour Name #include "hif.h" 46*5113495bSYour Name 47*5113495bSYour Name #define FW_REG_DUMP_CNT 60 48*5113495bSYour Name 49*5113495bSYour Name /* Magic patterns for FW to report crash information (Rome USB) */ 50*5113495bSYour Name #define FW_ASSERT_PATTERN 0x0000c600 51*5113495bSYour Name #define FW_REG_PATTERN 0x0000d600 52*5113495bSYour Name #define FW_REG_END_PATTERN 0x0000e600 53*5113495bSYour Name #define FW_RAMDUMP_PATTERN 0x0000f600 54*5113495bSYour Name #define FW_RAMDUMP_END_PATTERN 0x0000f601 55*5113495bSYour Name #define FW_RAMDUMP_PATTERN_MASK 0xfffffff0 56*5113495bSYour Name #define FW_RAMDUMP_DRAMSIZE 0x00098000 57*5113495bSYour Name #define FW_RAMDUMP_IRAMSIZE 0x000C0000 58*5113495bSYour Name #define FW_RAMDUMP_AXISIZE 0x00020000 59*5113495bSYour Name 60*5113495bSYour Name /* FW RAM segments (Rome USB) */ 61*5113495bSYour Name enum { 62*5113495bSYour Name FW_RAM_SEG_DRAM, 63*5113495bSYour Name FW_RAM_SEG_IRAM, 64*5113495bSYour Name FW_RAM_SEG_AXI, 65*5113495bSYour Name FW_RAM_SEG_CNT 66*5113495bSYour Name }; 67*5113495bSYour Name 68*5113495bSYour Name /* Allocate 384K memory to save each segment of ram dump */ 69*5113495bSYour Name #define FW_RAMDUMP_SEG_SIZE 393216 70*5113495bSYour Name 71*5113495bSYour Name /* structure to save RAM dump information */ 72*5113495bSYour Name struct fw_ramdump { 73*5113495bSYour Name uint32_t start_addr; 74*5113495bSYour Name uint32_t length; 75*5113495bSYour Name uint8_t *mem; 76*5113495bSYour Name }; 77*5113495bSYour Name 78*5113495bSYour Name /* USB Endpoint definition */ 79*5113495bSYour Name enum HIF_USB_PIPE_ID { 80*5113495bSYour Name HIF_TX_CTRL_PIPE = 0, 81*5113495bSYour Name HIF_TX_DATA_LP_PIPE, 82*5113495bSYour Name HIF_TX_DATA_MP_PIPE, 83*5113495bSYour Name HIF_TX_DATA_HP_PIPE, 84*5113495bSYour Name HIF_RX_CTRL_PIPE, 85*5113495bSYour Name HIF_RX_DATA_PIPE, 86*5113495bSYour Name HIF_RX_DATA2_PIPE, 87*5113495bSYour Name HIF_RX_INT_PIPE, 88*5113495bSYour Name HIF_USB_PIPE_MAX 89*5113495bSYour Name }; 90*5113495bSYour Name 91*5113495bSYour Name #define HIF_USB_PIPE_INVALID HIF_USB_PIPE_MAX 92*5113495bSYour Name 93*5113495bSYour Name struct HIF_USB_PIPE { 94*5113495bSYour Name DL_LIST urb_list_head; 95*5113495bSYour Name DL_LIST urb_pending_list; 96*5113495bSYour Name int32_t urb_alloc; 97*5113495bSYour Name int32_t urb_cnt; 98*5113495bSYour Name int32_t urb_cnt_thresh; 99*5113495bSYour Name unsigned int usb_pipe_handle; 100*5113495bSYour Name uint32_t flags; 101*5113495bSYour Name uint8_t ep_address; 102*5113495bSYour Name uint8_t logical_pipe_num; 103*5113495bSYour Name struct HIF_DEVICE_USB *device; 104*5113495bSYour Name uint16_t max_packet_size; 105*5113495bSYour Name #ifdef HIF_USB_TASKLET 106*5113495bSYour Name struct tasklet_struct io_complete_tasklet; 107*5113495bSYour Name #else 108*5113495bSYour Name struct work_struct io_complete_work; 109*5113495bSYour Name #endif 110*5113495bSYour Name struct sk_buff_head io_comp_queue; 111*5113495bSYour Name struct usb_endpoint_descriptor *ep_desc; 112*5113495bSYour Name int32_t urb_prestart_cnt; 113*5113495bSYour Name }; 114*5113495bSYour Name 115*5113495bSYour Name struct HIF_DEVICE_USB { 116*5113495bSYour Name struct hif_softc ol_sc; 117*5113495bSYour Name qdf_spinlock_t cs_lock; 118*5113495bSYour Name qdf_spinlock_t tx_lock; 119*5113495bSYour Name qdf_spinlock_t rx_lock; 120*5113495bSYour Name qdf_spinlock_t rx_prestart_lock; 121*5113495bSYour Name struct hif_msg_callbacks htc_callbacks; 122*5113495bSYour Name struct usb_device *udev; 123*5113495bSYour Name struct usb_interface *interface; 124*5113495bSYour Name struct HIF_USB_PIPE pipes[HIF_USB_PIPE_MAX]; 125*5113495bSYour Name uint8_t *diag_cmd_buffer; 126*5113495bSYour Name uint8_t *diag_resp_buffer; 127*5113495bSYour Name void *claimed_context; 128*5113495bSYour Name A_BOOL is_bundle_enabled; 129*5113495bSYour Name uint16_t rx_bundle_cnt; 130*5113495bSYour Name uint32_t rx_bundle_buf_len; 131*5113495bSYour Name bool rx_ctrl_pipe_supported; 132*5113495bSYour Name }; 133*5113495bSYour Name 134*5113495bSYour Name struct hif_usb_softc { 135*5113495bSYour Name struct HIF_DEVICE_USB hif_hdl; 136*5113495bSYour Name /* For efficiency, should be first in struct */ 137*5113495bSYour Name struct device *dev; 138*5113495bSYour Name struct usb_dev *pdev; 139*5113495bSYour Name /* 140*5113495bSYour Name * Guard changes to Target HW state and to software 141*5113495bSYour Name * structures that track hardware state. 142*5113495bSYour Name */ 143*5113495bSYour Name u16 devid; 144*5113495bSYour Name struct usb_interface *interface; 145*5113495bSYour Name struct notifier_block reboot_notifier; /* default mode before reboot */ 146*5113495bSYour Name u8 suspend_state; 147*5113495bSYour Name u8 *fw_data; 148*5113495bSYour Name u32 fw_data_len; 149*5113495bSYour Name /* structure to save FW RAM dump (Rome USB) */ 150*5113495bSYour Name struct fw_ramdump *ramdump[FW_RAM_SEG_CNT]; 151*5113495bSYour Name uint8_t ramdump_index; 152*5113495bSYour Name bool fw_ram_dumping; 153*5113495bSYour Name /* enable FW self-recovery for Rome USB */ 154*5113495bSYour Name bool enable_self_recovery; 155*5113495bSYour Name }; 156*5113495bSYour Name 157*5113495bSYour Name /** 158*5113495bSYour Name * hif_dump_info() - dump info about all HIF pipes and endpoints 159*5113495bSYour Name * @scn: pointer to hif_opaque_softc 160*5113495bSYour Name * 161*5113495bSYour Name * Return: none 162*5113495bSYour Name */ 163*5113495bSYour Name void hif_dump_info(struct hif_opaque_softc *scn); 164*5113495bSYour Name 165*5113495bSYour Name /** 166*5113495bSYour Name * hif_suspend_wow() - Send wow suspend command 167*5113495bSYour Name * @scn: pointer to hif_opaque_softc 168*5113495bSYour Name * 169*5113495bSYour Name * Return: none 170*5113495bSYour Name */ 171*5113495bSYour Name void hif_suspend_wow(struct hif_opaque_softc *scn); 172*5113495bSYour Name #endif /* __ATH_USB_H__ */ 173