3 #include <linux/module.h>
4 #include <linux/slab.h>
5 #include <linux/etherdevice.h>
14 * send command to firmware
18 * @buf: buffer containing the command, must work with dma
19 * @len: length of the buffer
21 int wl1251_cmd_send(struct wl1251
*wl
, u16 id
, void *buf
, size_t len
)
23 struct wl1251_cmd_header
*cmd
;
24 unsigned long timeout
;
32 WARN_ON(len
% 4 != 0);
34 wl1251_mem_write(wl
, wl
->cmd_box_addr
, buf
, len
);
36 wl1251_reg_write32(wl
, ACX_REG_INTERRUPT_TRIG
, INTR_TRIG_CMD
);
38 timeout
= jiffies
+ msecs_to_jiffies(WL1251_COMMAND_TIMEOUT
);
40 intr
= wl1251_reg_read32(wl
, ACX_REG_INTERRUPT_NO_CLEAR
);
41 while (!(intr
& WL1251_ACX_INTR_CMD_COMPLETE
)) {
42 if (time_after(jiffies
, timeout
)) {
43 wl1251_error("command complete timeout");
50 intr
= wl1251_reg_read32(wl
, ACX_REG_INTERRUPT_NO_CLEAR
);
53 wl1251_reg_write32(wl
, ACX_REG_INTERRUPT_ACK
,
54 WL1251_ACX_INTR_CMD_COMPLETE
);
61 * send test command to firmware
64 * @buf: buffer containing the command, with all headers, must work with dma
65 * @len: length of the buffer
66 * @answer: is answer needed
68 int wl1251_cmd_test(struct wl1251
*wl
, void *buf
, size_t buf_len
, u8 answer
)
72 wl1251_debug(DEBUG_CMD
, "cmd test");
74 ret
= wl1251_cmd_send(wl
, CMD_TEST
, buf
, buf_len
);
77 wl1251_warning("TEST command failed");
82 struct wl1251_command
*cmd_answer
;
85 * The test command got in, we can read the answer.
86 * The answer would be a wl1251_command, where the
87 * parameter array contains the actual answer.
89 wl1251_mem_read(wl
, wl
->cmd_box_addr
, buf
, buf_len
);
93 if (cmd_answer
->header
.status
!= CMD_STATUS_SUCCESS
)
94 wl1251_error("TEST command answer error: %d",
95 cmd_answer
->header
.status
);
102 * read acx from firmware
106 * @buf: buffer for the response, including all headers, must work with dma
107 * @len: length of buf
109 int wl1251_cmd_interrogate(struct wl1251
*wl
, u16 id
, void *buf
, size_t len
)
111 struct acx_header
*acx
= buf
;
114 wl1251_debug(DEBUG_CMD
, "cmd interrogate");
118 /* payload length, does not include any headers */
119 acx
->len
= len
- sizeof(*acx
);
121 ret
= wl1251_cmd_send(wl
, CMD_INTERROGATE
, acx
, sizeof(*acx
));
123 wl1251_error("INTERROGATE command failed");
127 /* the interrogate command got in, we can read the answer */
128 wl1251_mem_read(wl
, wl
->cmd_box_addr
, buf
, len
);
131 if (acx
->cmd
.status
!= CMD_STATUS_SUCCESS
)
132 wl1251_error("INTERROGATE command error: %d",
140 * write acx value to firmware
144 * @buf: buffer containing acx, including all headers, must work with dma
145 * @len: length of buf
147 int wl1251_cmd_configure(struct wl1251
*wl
, u16 id
, void *buf
, size_t len
)
149 struct acx_header
*acx
= buf
;
152 wl1251_debug(DEBUG_CMD
, "cmd configure");
156 /* payload length, does not include any headers */
157 acx
->len
= len
- sizeof(*acx
);
159 ret
= wl1251_cmd_send(wl
, CMD_CONFIGURE
, acx
, len
);
161 wl1251_warning("CONFIGURE command NOK");
168 int wl1251_cmd_vbm(struct wl1251
*wl
, u8 identity
,
169 void *bitmap
, u16 bitmap_len
, u8 bitmap_control
)
171 struct wl1251_cmd_vbm_update
*vbm
;
174 wl1251_debug(DEBUG_CMD
, "cmd vbm");
176 vbm
= kzalloc(sizeof(*vbm
), GFP_KERNEL
);
182 /* Count and period will be filled by the target */
183 vbm
->tim
.bitmap_ctrl
= bitmap_control
;
184 if (bitmap_len
> PARTIAL_VBM_MAX
) {
185 wl1251_warning("cmd vbm len is %d B, truncating to %d",
186 bitmap_len
, PARTIAL_VBM_MAX
);
187 bitmap_len
= PARTIAL_VBM_MAX
;
189 memcpy(vbm
->tim
.pvb_field
, bitmap
, bitmap_len
);
190 vbm
->tim
.identity
= identity
;
191 vbm
->tim
.length
= bitmap_len
+ 3;
193 vbm
->len
= cpu_to_le16(bitmap_len
+ 5);
195 ret
= wl1251_cmd_send(wl
, CMD_VBM
, vbm
, sizeof(*vbm
));
197 wl1251_error("VBM command failed");
206 int wl1251_cmd_data_path_rx(struct wl1251
*wl
, u8 channel
, bool enable
)
208 struct cmd_enabledisable_path
*cmd
;
212 wl1251_debug(DEBUG_CMD
, "cmd data path");
214 cmd
= kzalloc(sizeof(*cmd
), GFP_KERNEL
);
220 cmd
->channel
= channel
;
223 cmd_rx
= CMD_ENABLE_RX
;
225 cmd_rx
= CMD_DISABLE_RX
;
227 ret
= wl1251_cmd_send(wl
, cmd_rx
, cmd
, sizeof(*cmd
));
229 wl1251_error("rx %s cmd for channel %d failed",
230 enable
? "start" : "stop", channel
);
234 wl1251_debug(DEBUG_BOOT
, "rx %s cmd channel %d",
235 enable
? "start" : "stop", channel
);
242 int wl1251_cmd_data_path_tx(struct wl1251
*wl
, u8 channel
, bool enable
)
244 struct cmd_enabledisable_path
*cmd
;
248 wl1251_debug(DEBUG_CMD
, "cmd data path");
250 cmd
= kzalloc(sizeof(*cmd
), GFP_KERNEL
);
254 cmd
->channel
= channel
;
257 cmd_tx
= CMD_ENABLE_TX
;
259 cmd_tx
= CMD_DISABLE_TX
;
261 ret
= wl1251_cmd_send(wl
, cmd_tx
, cmd
, sizeof(*cmd
));
263 wl1251_error("tx %s cmd for channel %d failed",
264 enable
? "start" : "stop", channel
);
266 wl1251_debug(DEBUG_BOOT
, "tx %s cmd channel %d",
267 enable
? "start" : "stop", channel
);
273 int wl1251_cmd_join(struct wl1251
*wl
, u8 bss_type
, u8 channel
,
274 u16 beacon_interval
, u8 dtim_interval
)
276 struct cmd_join
*join
;
280 join
= kzalloc(sizeof(*join
), GFP_KERNEL
);
286 wl1251_debug(DEBUG_CMD
, "cmd join%s ch %d %d/%d",
287 bss_type
== BSS_TYPE_IBSS
? " ibss" : "",
288 channel
, beacon_interval
, dtim_interval
);
290 /* Reverse order BSSID */
291 bssid
= (u8
*) &join
->bssid_lsb
;
292 for (i
= 0; i
< ETH_ALEN
; i
++)
293 bssid
[i
] = wl
->bssid
[ETH_ALEN
- i
- 1];
295 join
->rx_config_options
= wl
->rx_config
;
296 join
->rx_filter_options
= wl
->rx_filter
;
298 join
->basic_rate_set
= RATE_MASK_1MBPS
| RATE_MASK_2MBPS
|
299 RATE_MASK_5_5MBPS
| RATE_MASK_11MBPS
;
301 join
->beacon_interval
= beacon_interval
;
302 join
->dtim_interval
= dtim_interval
;
303 join
->bss_type
= bss_type
;
304 join
->channel
= channel
;
305 join
->ctrl
= JOIN_CMD_CTRL_TX_FLUSH
;
307 ret
= wl1251_cmd_send(wl
, CMD_START_JOIN
, join
, sizeof(*join
));
309 wl1251_error("failed to initiate cmd join");
318 int wl1251_cmd_ps_mode(struct wl1251
*wl
, u8 ps_mode
)
320 struct wl1251_cmd_ps_params
*ps_params
= NULL
;
323 wl1251_debug(DEBUG_CMD
, "cmd set ps mode");
325 ps_params
= kzalloc(sizeof(*ps_params
), GFP_KERNEL
);
331 ps_params
->ps_mode
= ps_mode
;
332 ps_params
->send_null_data
= 1;
333 ps_params
->retries
= 5;
334 ps_params
->hang_over_period
= 128;
335 ps_params
->null_data_rate
= 1; /* 1 Mbps */
337 ret
= wl1251_cmd_send(wl
, CMD_SET_PS_MODE
, ps_params
,
340 wl1251_error("cmd set_ps_mode failed");
349 int wl1251_cmd_read_memory(struct wl1251
*wl
, u32 addr
, void *answer
,
352 struct cmd_read_write_memory
*cmd
;
355 wl1251_debug(DEBUG_CMD
, "cmd read memory");
357 cmd
= kzalloc(sizeof(*cmd
), GFP_KERNEL
);
363 WARN_ON(len
> MAX_READ_SIZE
);
364 len
= min_t(size_t, len
, MAX_READ_SIZE
);
369 ret
= wl1251_cmd_send(wl
, CMD_READ_MEMORY
, cmd
, sizeof(*cmd
));
371 wl1251_error("read memory command failed: %d", ret
);
375 /* the read command got in, we can now read the answer */
376 wl1251_mem_read(wl
, wl
->cmd_box_addr
, cmd
, sizeof(*cmd
));
378 if (cmd
->header
.status
!= CMD_STATUS_SUCCESS
)
379 wl1251_error("error in read command result: %d",
382 memcpy(answer
, cmd
->value
, len
);
389 int wl1251_cmd_template_set(struct wl1251
*wl
, u16 cmd_id
,
390 void *buf
, size_t buf_len
)
392 struct wl1251_cmd_packet_template
*cmd
;
396 wl1251_debug(DEBUG_CMD
, "cmd template %d", cmd_id
);
398 WARN_ON(buf_len
> WL1251_MAX_TEMPLATE_SIZE
);
399 buf_len
= min_t(size_t, buf_len
, WL1251_MAX_TEMPLATE_SIZE
);
400 cmd_len
= ALIGN(sizeof(*cmd
) + buf_len
, 4);
402 cmd
= kzalloc(cmd_len
, GFP_KERNEL
);
408 cmd
->size
= cpu_to_le16(buf_len
);
411 memcpy(cmd
->data
, buf
, buf_len
);
413 ret
= wl1251_cmd_send(wl
, cmd_id
, cmd
, cmd_len
);
415 wl1251_warning("cmd set_template failed: %d", ret
);
424 int wl1251_cmd_scan(struct wl1251
*wl
, u8
*ssid
, size_t ssid_len
,
425 struct ieee80211_channel
*channels
[],
426 unsigned int n_channels
, unsigned int n_probes
)
428 struct wl1251_cmd_scan
*cmd
;
431 wl1251_debug(DEBUG_CMD
, "cmd scan channels %d", n_channels
);
433 WARN_ON(n_channels
> SCAN_MAX_NUM_OF_CHANNELS
);
435 cmd
= kzalloc(sizeof(*cmd
), GFP_KERNEL
);
439 cmd
->params
.rx_config_options
= cpu_to_le32(CFG_RX_ALL_GOOD
);
440 cmd
->params
.rx_filter_options
= cpu_to_le32(CFG_RX_PRSP_EN
|
443 cmd
->params
.scan_options
= 0;
445 * Use high priority scan when not associated to prevent fw issue
446 * causing never-ending scans (sometimes 20+ minutes).
447 * Note: This bug may be caused by the fw's DTIM handling.
449 if (is_zero_ether_addr(wl
->bssid
))
450 cmd
->params
.scan_options
|= cpu_to_le16(WL1251_SCAN_OPT_PRIORITY_HIGH
);
451 cmd
->params
.num_channels
= n_channels
;
452 cmd
->params
.num_probe_requests
= n_probes
;
453 cmd
->params
.tx_rate
= cpu_to_le16(1 << 1); /* 2 Mbps */
454 cmd
->params
.tid_trigger
= 0;
456 for (i
= 0; i
< n_channels
; i
++) {
457 cmd
->channels
[i
].min_duration
=
458 cpu_to_le32(WL1251_SCAN_MIN_DURATION
);
459 cmd
->channels
[i
].max_duration
=
460 cpu_to_le32(WL1251_SCAN_MAX_DURATION
);
461 memset(&cmd
->channels
[i
].bssid_lsb
, 0xff, 4);
462 memset(&cmd
->channels
[i
].bssid_msb
, 0xff, 2);
463 cmd
->channels
[i
].early_termination
= 0;
464 cmd
->channels
[i
].tx_power_att
= 0;
465 cmd
->channels
[i
].channel
= channels
[i
]->hw_value
;
468 cmd
->params
.ssid_len
= ssid_len
;
470 memcpy(cmd
->params
.ssid
, ssid
, ssid_len
);
472 ret
= wl1251_cmd_send(wl
, CMD_SCAN
, cmd
, sizeof(*cmd
));
474 wl1251_error("cmd scan failed: %d", ret
);
478 wl1251_mem_read(wl
, wl
->cmd_box_addr
, cmd
, sizeof(*cmd
));
480 if (cmd
->header
.status
!= CMD_STATUS_SUCCESS
) {
481 wl1251_error("cmd scan status wasn't success: %d",
492 int wl1251_cmd_trigger_scan_to(struct wl1251
*wl
, u32 timeout
)
494 struct wl1251_cmd_trigger_scan_to
*cmd
;
497 wl1251_debug(DEBUG_CMD
, "cmd trigger scan to");
499 cmd
= kzalloc(sizeof(*cmd
), GFP_KERNEL
);
503 cmd
->timeout
= timeout
;
505 ret
= wl1251_cmd_send(wl
, CMD_TRIGGER_SCAN_TO
, cmd
, sizeof(*cmd
));
507 wl1251_error("cmd trigger scan to failed: %d", ret
);