summaryrefslogtreecommitdiffstats
path: root/carl9170fw/carlfw/include/carl9170.h
blob: cb16415c5adbeed7a0350f99f680ccda3f19b453 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
/*
 * carl9170 firmware - used by the ar9170 wireless device
 *
 * Firmware context definition
 *
 * Copyright 2009-2011 Christian Lamparter <chunkeey@googlemail.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

#ifndef __CARL9170FW_CARL9170_H
#define __CARL9170FW_CARL9170_H

#include "generated/autoconf.h"
#include "version.h"
#include "config.h"
#include "types.h"
#include "compiler.h"
#include "fwcmd.h"
#include "hw.h"
#include "dma.h"
#include "usb.h"
#include "cmd.h"

struct carl9170_bar_ctx {
	uint8_t ta[6];
	uint8_t ra[6];
	__le16 start_seq_num;
	__le16 control;
};

#ifdef CONFIG_CARL9170FW_CAB_QUEUE
enum carl9170_cab_trigger {
	CARL9170_CAB_TRIGGER_EMPTY	= 0,
	CARL9170_CAB_TRIGGER_ARMED	= BIT(0),
	CARL9170_CAB_TRIGGER_DEFER	= BIT(1),
};
#endif /* CONFIG_CARL9170FW_CAB_QUEUE */

enum carl9170_ep0_action {
	CARL9170_EP0_NO_ACTION		= 0,
	CARL9170_EP0_STALL		= BIT(0),
	CARL9170_EP0_TRIGGER		= BIT(1),
};

enum carl9170_mac_reset_state {
	CARL9170_MAC_RESET_OFF		= 0,
	CARL9170_MAC_RESET_ARMED,
	CARL9170_MAC_RESET_RESET,
	CARL9170_MAC_RESET_FORCE,
};

enum carl9170_suspend_mode {
	CARL9170_HOST_AWAKE			= 0,
	CARL9170_HOST_SUSPENDED,
	CARL9170_AWAKE_HOST,
};

enum carl9170_phy_state {
	CARL9170_PHY_OFF		= 0,
	CARL9170_PHY_ON
};

typedef void (*fw_desc_callback_t)(void *, const bool);

/*
 * This platform - being an odd 32-bit architecture - prefers to
 * have 32-Bit variables.
 */

struct firmware_context_struct {
	/* timer / clocks */
	unsigned int ticks_per_usec;
	unsigned int counter;			/* main() cycles */

	/* misc */
	unsigned int watchdog_enable;
	unsigned int reboot;
	unsigned int suspend_mode;

	struct {
		/* Host Interface DMA queues */
		struct dma_queue up_queue;	/* used to send frames to the host */
		struct dma_queue down_queue;	/* stores incoming frames from the host */
	} pta;

	struct {
		/* Hardware DMA queues */
		struct dma_queue tx_queue[__AR9170_NUM_TX_QUEUES];	/* wlan tx queue */
		struct dma_queue tx_retry;
		struct dma_queue rx_queue;				/* wlan rx queue */

		/* tx aggregate scheduling */
		struct carl9170_tx_superframe *ampdu_prev[__AR9170_NUM_TX_QUEUES];

		/* Hardware DMA queue unstuck/fix detection */
		unsigned int last_super_num[__AR9170_NUM_TX_QUEUES];
		struct carl9170_tx_superframe *last_super[__AR9170_NUM_TX_QUEUES];
		unsigned int mac_reset;
		unsigned int soft_int;

		/* rx filter */
		unsigned int rx_filter;

		/* tx sequence control counters */
		unsigned int sequence[CARL9170_INTF_NUM];

#ifdef CONFIG_CARL9170FW_CAB_QUEUE
		/* CAB */
		struct dma_queue cab_queue[CARL9170_INTF_NUM];
		unsigned int cab_queue_len[CARL9170_INTF_NUM];
		unsigned int cab_flush_time;
		enum carl9170_cab_trigger cab_flush_trigger[CARL9170_INTF_NUM];
#endif /* CONFIG_CARL9170FW_CAB_QUEUE */

		/* tx status */
		unsigned int tx_status_pending,
			     tx_status_head_idx,
			     tx_status_tail_idx;
		struct carl9170_tx_status tx_status_cache[CARL9170_TX_STATUS_NUM];

		/* internal descriptor for use within the service routines */
		struct dma_desc *fw_desc;
		unsigned int fw_desc_available;
		void *fw_desc_data;
		fw_desc_callback_t fw_desc_callback;

		/* BA(R) Request Handler */
		struct carl9170_bar_ctx ba_cache[CONFIG_CARL9170FW_BACK_REQS_NUM];
		unsigned int ba_tail_idx,
			     ba_head_idx,
			     queued_ba;

		unsigned int queued_bar;
	} wlan;

	struct {
		unsigned int config,
			     interface_setting,
			     alternate_interface_setting,
			     device_feature;
		enum carl9170_ep0_action ep0_action;

		void *ep0_txrx_buffer;
		unsigned int ep0_txrx_len,
			     ep0_txrx_pos;

		struct ar9170_usb_config *cfg_desc;
		struct ar9170_usb_config *os_cfg_desc;

		/*
		 * special buffers for command & response handling
		 *
		 * the firmware uses a sort of ring-buffer to communicate
		 * to the host.
		 */
		unsigned int int_pending,
			     int_desc_available,
			     int_head_index,
			     int_tail_index;
		struct dma_desc *int_desc;
		struct carl9170_rsp int_buf[CARL9170_INT_RQ_CACHES];

#ifdef CONFIG_CARL9170FW_DEBUG_USB
		/* USB printf */
		unsigned int put_index;
		uint8_t put_buffer[CARL9170_MAX_CMD_PAYLOAD_LEN];
#endif /* CONFIG_CARL9170FW_DEBUG_USB */

	} usb;

	struct {
#ifdef CONFIG_CARL9170FW_RADIO_FUNCTIONS
		/* (cached) ar9170_rf_init */

		/* PHY/RF state */
		unsigned int frequency;
		unsigned int ht_settings;

		enum carl9170_phy_state state;
		struct carl9170_psm psm;
#endif /* CONFIG_CARL9170FW_RADIO_FUNCTIONS */
	} phy;

	unsigned int tally_clock;
	struct carl9170_tally_rsp tally;
	unsigned int tx_time;

#ifdef CONFIG_CARL9170FW_WOL
	struct {
		struct carl9170_wol_cmd cmd;
		unsigned int last_beacon;
		unsigned int lost_null;
		unsigned int last_null;
		bool wake_up;
	} wol;
#endif /* CONFIG_CARL9170FW_WOL */

#ifdef CONFIG_CARL9170FW_GPIO_INTERRUPT
	struct carl9170_gpio cached_gpio_state;
#endif /*CONFIG_CARL9170FW_GPIO_INTERRUPT */
};

/*
 * global firmware context struct.
 *
 * NOTE: This struct will zeroed out in start()
 */
extern struct firmware_context_struct fw;
#endif /* __CARL9170FW_CARL9170_H */