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