3 #include <linux/module.h>
4 #include <linux/crc7.h>
5 #include <linux/spi/spi.h>
8 #include "wl12xx_80211.h"
13 int wl12xx_cmd_send(struct wl12xx
*wl
, u16 type
, void *buf
, size_t buf_len
)
15 struct wl12xx_command cmd
;
16 unsigned long timeout
;
21 memset(&cmd
, 0, sizeof(cmd
));
24 memcpy(cmd
.parameters
, buf
, buf_len
);
25 cmd_len
= ALIGN(buf_len
, 4) + CMDMBOX_HEADER_LEN
;
27 wl12xx_ps_elp_wakeup(wl
);
29 wl12xx_spi_mem_write(wl
, wl
->cmd_box_addr
, &cmd
, cmd_len
);
31 wl12xx_reg_write32(wl
, ACX_REG_INTERRUPT_TRIG
, INTR_TRIG_CMD
);
33 timeout
= jiffies
+ msecs_to_jiffies(WL12XX_COMMAND_TIMEOUT
);
35 intr
= wl12xx_reg_read32(wl
, ACX_REG_INTERRUPT_NO_CLEAR
);
36 while (!(intr
& wl
->chip
.intr_cmd_complete
)) {
37 if (time_after(jiffies
, timeout
)) {
38 wl12xx_error("command complete timeout");
45 intr
= wl12xx_reg_read32(wl
, ACX_REG_INTERRUPT_NO_CLEAR
);
48 wl12xx_reg_write32(wl
, ACX_REG_INTERRUPT_ACK
,
49 wl
->chip
.intr_cmd_complete
);
52 wl12xx_ps_elp_sleep(wl
);
57 int wl12xx_cmd_test(struct wl12xx
*wl
, void *buf
, size_t buf_len
, u8 answer
)
61 wl12xx_debug(DEBUG_CMD
, "cmd test");
63 ret
= wl12xx_cmd_send(wl
, CMD_TEST
, buf
, buf_len
);
65 wl12xx_warning("TEST command failed");
70 struct wl12xx_command
*cmd_answer
;
73 * The test command got in, we can read the answer.
74 * The answer would be a wl12xx_command, where the
75 * parameter array contains the actual answer.
78 wl12xx_ps_elp_wakeup(wl
);
80 wl12xx_spi_mem_read(wl
, wl
->cmd_box_addr
, buf
, buf_len
);
82 wl12xx_ps_elp_sleep(wl
);
85 if (cmd_answer
->status
!= CMD_STATUS_SUCCESS
)
86 wl12xx_error("TEST command answer error: %d",
94 int wl12xx_cmd_interrogate(struct wl12xx
*wl
, u16 ie_id
, u16 ie_len
,
97 struct wl12xx_command
*cmd
;
98 struct acx_header header
;
101 wl12xx_debug(DEBUG_CMD
, "cmd interrogate");
104 header
.len
= ie_len
- sizeof(header
);
106 ret
= wl12xx_cmd_send(wl
, CMD_INTERROGATE
, &header
, sizeof(header
));
108 wl12xx_error("INTERROGATE command failed");
112 wl12xx_ps_elp_wakeup(wl
);
114 /* the interrogate command got in, we can read the answer */
115 wl12xx_spi_mem_read(wl
, wl
->cmd_box_addr
, answer
,
116 CMDMBOX_HEADER_LEN
+ ie_len
);
118 wl12xx_ps_elp_sleep(wl
);
121 if (cmd
->status
!= CMD_STATUS_SUCCESS
)
122 wl12xx_error("INTERROGATE command error: %d",
129 int wl12xx_cmd_configure(struct wl12xx
*wl
, void *ie
, int ie_len
)
133 wl12xx_debug(DEBUG_CMD
, "cmd configure");
135 ret
= wl12xx_cmd_send(wl
, CMD_CONFIGURE
, ie
,
138 wl12xx_warning("CONFIGURE command NOK");
146 int wl12xx_cmd_vbm(struct wl12xx
*wl
, u8 identity
,
147 void *bitmap
, u16 bitmap_len
, u8 bitmap_control
)
149 struct vbm_update_request vbm
;
152 wl12xx_debug(DEBUG_CMD
, "cmd vbm");
154 /* Count and period will be filled by the target */
155 vbm
.tim
.bitmap_ctrl
= bitmap_control
;
156 if (bitmap_len
> PARTIAL_VBM_MAX
) {
157 wl12xx_warning("cmd vbm len is %d B, truncating to %d",
158 bitmap_len
, PARTIAL_VBM_MAX
);
159 bitmap_len
= PARTIAL_VBM_MAX
;
161 memcpy(vbm
.tim
.pvb_field
, bitmap
, bitmap_len
);
162 vbm
.tim
.identity
= identity
;
163 vbm
.tim
.length
= bitmap_len
+ 3;
165 vbm
.len
= cpu_to_le16(bitmap_len
+ 5);
167 ret
= wl12xx_cmd_send(wl
, CMD_VBM
, &vbm
, sizeof(vbm
));
169 wl12xx_error("VBM command failed");
176 int wl12xx_cmd_data_path(struct wl12xx
*wl
, u8 channel
, u8 enable
)
181 wl12xx_debug(DEBUG_CMD
, "cmd data path");
184 cmd_rx
= CMD_ENABLE_RX
;
185 cmd_tx
= CMD_ENABLE_TX
;
187 cmd_rx
= CMD_DISABLE_RX
;
188 cmd_tx
= CMD_DISABLE_TX
;
191 ret
= wl12xx_cmd_send(wl
, cmd_rx
, &channel
, sizeof(channel
));
193 wl12xx_error("rx %s cmd for channel %d failed",
194 enable
? "start" : "stop", channel
);
198 wl12xx_debug(DEBUG_BOOT
, "rx %s cmd channel %d",
199 enable
? "start" : "stop", channel
);
201 ret
= wl12xx_cmd_send(wl
, cmd_tx
, &channel
, sizeof(channel
));
203 wl12xx_error("tx %s cmd for channel %d failed",
204 enable
? "start" : "stop", channel
);
208 wl12xx_debug(DEBUG_BOOT
, "tx %s cmd channel %d",
209 enable
? "start" : "stop", channel
);
214 int wl12xx_cmd_join(struct wl12xx
*wl
, u8 bss_type
, u8 dtim_interval
,
215 u16 beacon_interval
, u8 wait
)
217 unsigned long timeout
;
218 struct cmd_join join
= {};
222 /* FIXME: this should be in main.c */
223 ret
= wl12xx_acx_frame_rates(wl
, DEFAULT_HW_GEN_TX_RATE
,
224 DEFAULT_HW_GEN_MODULATION_TYPE
,
225 wl
->tx_mgmt_frm_rate
,
226 wl
->tx_mgmt_frm_mod
);
230 wl12xx_debug(DEBUG_CMD
, "cmd join");
232 /* Reverse order BSSID */
233 bssid
= (u8
*)&join
.bssid_lsb
;
234 for (i
= 0; i
< ETH_ALEN
; i
++)
235 bssid
[i
] = wl
->bssid
[ETH_ALEN
- i
- 1];
237 join
.rx_config_options
= wl
->rx_config
;
238 join
.rx_filter_options
= wl
->rx_filter
;
240 join
.basic_rate_set
= RATE_MASK_1MBPS
| RATE_MASK_2MBPS
|
241 RATE_MASK_5_5MBPS
| RATE_MASK_11MBPS
;
243 join
.beacon_interval
= beacon_interval
;
244 join
.dtim_interval
= dtim_interval
;
245 join
.bss_type
= bss_type
;
246 join
.channel
= wl
->channel
;
247 join
.ctrl
= JOIN_CMD_CTRL_TX_FLUSH
;
249 ret
= wl12xx_cmd_send(wl
, CMD_START_JOIN
, &join
, sizeof(join
));
251 wl12xx_error("failed to initiate cmd join");
255 timeout
= msecs_to_jiffies(JOIN_TIMEOUT
);
258 * ugly hack: we should wait for JOIN_EVENT_COMPLETE_ID but to
259 * simplify locking we just sleep instead, for now
267 int wl12xx_cmd_ps_mode(struct wl12xx
*wl
, u8 ps_mode
)
270 struct acx_ps_params ps_params
;
272 /* FIXME: this should be in ps.c */
273 ret
= wl12xx_acx_wake_up_conditions(wl
, wl
->listen_int
);
275 wl12xx_error("Couldnt set wake up conditions");
279 wl12xx_debug(DEBUG_CMD
, "cmd set ps mode");
281 ps_params
.ps_mode
= ps_mode
;
282 ps_params
.send_null_data
= 1;
283 ps_params
.retries
= 5;
284 ps_params
.hang_over_period
= 128;
285 ps_params
.null_data_rate
= 1; /* 1 Mbps */
287 ret
= wl12xx_cmd_send(wl
, CMD_SET_PS_MODE
, &ps_params
,
290 wl12xx_error("cmd set_ps_mode failed");
297 int wl12xx_cmd_read_memory(struct wl12xx
*wl
, u32 addr
, u32 len
, void *answer
)
299 struct cmd_read_write_memory mem_cmd
, *mem_answer
;
300 struct wl12xx_command cmd
;
303 wl12xx_debug(DEBUG_CMD
, "cmd read memory");
305 memset(&mem_cmd
, 0, sizeof(mem_cmd
));
309 ret
= wl12xx_cmd_send(wl
, CMD_READ_MEMORY
, &mem_cmd
, sizeof(mem_cmd
));
311 wl12xx_error("read memory command failed: %d", ret
);
315 /* the read command got in, we can now read the answer */
316 wl12xx_spi_mem_read(wl
, wl
->cmd_box_addr
, &cmd
,
317 CMDMBOX_HEADER_LEN
+ sizeof(mem_cmd
));
319 if (cmd
.status
!= CMD_STATUS_SUCCESS
)
320 wl12xx_error("error in read command result: %d", cmd
.status
);
322 mem_answer
= (struct cmd_read_write_memory
*) cmd
.parameters
;
323 memcpy(answer
, mem_answer
->value
, len
);
328 int wl12xx_cmd_template_set(struct wl12xx
*wl
, u16 cmd_id
,
329 void *buf
, size_t buf_len
)
331 struct wl12xx_cmd_packet_template
template;
334 wl12xx_debug(DEBUG_CMD
, "cmd template %d", cmd_id
);
336 memset(&template, 0, sizeof(template));
338 WARN_ON(buf_len
> WL12XX_MAX_TEMPLATE_SIZE
);
339 buf_len
= min_t(size_t, buf_len
, WL12XX_MAX_TEMPLATE_SIZE
);
340 template.size
= cpu_to_le16(buf_len
);
343 memcpy(template.template, buf
, buf_len
);
345 ret
= wl12xx_cmd_send(wl
, cmd_id
, &template,
346 sizeof(template.size
) + buf_len
);
348 wl12xx_warning("cmd set_template failed: %d", ret
);