2 * Copyright (c) 2010-2011 Atheros Communications Inc.
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
20 struct wmi_event_txrate
{
33 struct wmi_fw_version
{
39 struct wmi_event_swba
{
45 * 64 - HTC header - WMI header - 1 / txstatus
46 * And some other hdr. space is also accounted for.
47 * 12 seems to be the magic number.
49 #define HTC_MAX_TX_STATUS 12
51 #define ATH9K_HTC_TXSTAT_ACK BIT(0)
52 #define ATH9K_HTC_TXSTAT_FILT BIT(1)
53 #define ATH9K_HTC_TXSTAT_RTC_CTS BIT(2)
54 #define ATH9K_HTC_TXSTAT_MCS BIT(3)
55 #define ATH9K_HTC_TXSTAT_CW40 BIT(4)
56 #define ATH9K_HTC_TXSTAT_SGI BIT(5)
59 * Legacy rates are indicated as indices.
60 * HT rates are indicated as dot11 numbers.
61 * This allows us to resrict the rate field
64 #define ATH9K_HTC_TXSTAT_RATE 0x0f
65 #define ATH9K_HTC_TXSTAT_RATE_S 0
67 #define ATH9K_HTC_TXSTAT_EPID 0xf0
68 #define ATH9K_HTC_TXSTAT_EPID_S 4
70 struct __wmi_event_txstatus
{
72 u8 ts_rate
; /* Also holds EP ID */
76 struct wmi_event_txstatus
{
78 struct __wmi_event_txstatus txstatus
[HTC_MAX_TX_STATUS
];
82 WMI_ECHO_CMDID
= 0x0001,
83 WMI_ACCESS_MEMORY_CMDID
,
85 /* Commands to Target */
87 WMI_DISABLE_INTR_CMDID
,
88 WMI_ENABLE_INTR_CMDID
,
91 WMI_STOP_TX_DMA_CMDID
,
92 WMI_ABORT_TX_DMA_CMDID
,
94 WMI_DRAIN_TXQ_ALL_CMDID
,
99 WMI_NODE_CREATE_CMDID
,
100 WMI_NODE_REMOVE_CMDID
,
101 WMI_VAP_REMOVE_CMDID
,
102 WMI_VAP_CREATE_CMDID
,
105 WMI_RC_STATE_CHANGE_CMDID
,
106 WMI_RC_RATE_UPDATE_CMDID
,
107 WMI_TARGET_IC_UPDATE_CMDID
,
108 WMI_TX_AGGR_ENABLE_CMDID
,
109 WMI_TGT_DETACH_CMDID
,
110 WMI_NODE_UPDATE_CMDID
,
114 WMI_BITRATE_MASK_CMDID
,
118 WMI_TGT_RDY_EVENTID
= 0x1001,
124 WMI_TXSTATUS_EVENTID
,
127 #define MAX_CMD_NUMBER 62
129 struct register_write
{
134 struct ath9k_htc_tx_event
{
136 struct __wmi_event_txstatus txs
;
137 struct list_head list
;
141 struct ath9k_htc_priv
*drv_priv
;
142 struct htc_target
*htc
;
143 enum htc_endpoint_id ctrl_epid
;
144 struct mutex op_mutex
;
145 struct completion cmd_wait
;
146 enum wmi_cmd_id last_cmd_id
;
147 struct sk_buff_head wmi_event_queue
;
148 struct tasklet_struct wmi_event_tasklet
;
154 struct list_head pending_tx_events
;
155 spinlock_t event_lock
;
160 struct register_write multi_write
[MAX_CMD_NUMBER
];
162 struct mutex multi_write_mutex
;
165 struct wmi
*ath9k_init_wmi(struct ath9k_htc_priv
*priv
);
166 void ath9k_deinit_wmi(struct ath9k_htc_priv
*priv
);
167 int ath9k_wmi_connect(struct htc_target
*htc
, struct wmi
*wmi
,
168 enum htc_endpoint_id
*wmi_ctrl_epid
);
169 int ath9k_wmi_cmd(struct wmi
*wmi
, enum wmi_cmd_id cmd_id
,
170 u8
*cmd_buf
, u32 cmd_len
,
171 u8
*rsp_buf
, u32 rsp_len
,
173 void ath9k_wmi_event_tasklet(unsigned long data
);
174 void ath9k_fatal_work(struct work_struct
*work
);
175 void ath9k_wmi_event_drain(struct ath9k_htc_priv
*priv
);
177 #define WMI_CMD(_wmi_cmd) \
179 ret = ath9k_wmi_cmd(priv->wmi, _wmi_cmd, NULL, 0, \
181 sizeof(cmd_rsp), HZ*2); \
184 #define WMI_CMD_BUF(_wmi_cmd, _buf) \
186 ret = ath9k_wmi_cmd(priv->wmi, _wmi_cmd, \
187 (u8 *) _buf, sizeof(*_buf), \
188 &cmd_rsp, sizeof(cmd_rsp), HZ*2); \