1 // SPDX-License-Identifier: GPL-2.0
4 #include <linux/module.h>
5 #include <linux/slab.h>
6 #include <linux/etherdevice.h>
15 * send command to firmware
19 * @buf: buffer containing the command, must work with dma
20 * @len: length of the buffer
22 int wl1251_cmd_send(struct wl1251
*wl
, u16 id
, void *buf
, size_t len
)
24 struct wl1251_cmd_header
*cmd
;
25 unsigned long timeout
;
33 WARN_ON(len
% 4 != 0);
35 wl1251_mem_write(wl
, wl
->cmd_box_addr
, buf
, len
);
37 wl1251_reg_write32(wl
, ACX_REG_INTERRUPT_TRIG
, INTR_TRIG_CMD
);
39 timeout
= jiffies
+ msecs_to_jiffies(WL1251_COMMAND_TIMEOUT
);
41 intr
= wl1251_reg_read32(wl
, ACX_REG_INTERRUPT_NO_CLEAR
);
42 while (!(intr
& WL1251_ACX_INTR_CMD_COMPLETE
)) {
43 if (time_after(jiffies
, timeout
)) {
44 wl1251_error("command complete timeout");
51 intr
= wl1251_reg_read32(wl
, ACX_REG_INTERRUPT_NO_CLEAR
);
54 wl1251_reg_write32(wl
, ACX_REG_INTERRUPT_ACK
,
55 WL1251_ACX_INTR_CMD_COMPLETE
);
62 * send test command to firmware
65 * @buf: buffer containing the command, with all headers, must work with dma
66 * @len: length of the buffer
67 * @answer: is answer needed
69 int wl1251_cmd_test(struct wl1251
*wl
, void *buf
, size_t buf_len
, u8 answer
)
73 wl1251_debug(DEBUG_CMD
, "cmd test");
75 ret
= wl1251_cmd_send(wl
, CMD_TEST
, buf
, buf_len
);
78 wl1251_warning("TEST command failed");
83 struct wl1251_command
*cmd_answer
;
86 * The test command got in, we can read the answer.
87 * The answer would be a wl1251_command, where the
88 * parameter array contains the actual answer.
90 wl1251_mem_read(wl
, wl
->cmd_box_addr
, buf
, buf_len
);
94 if (cmd_answer
->header
.status
!= CMD_STATUS_SUCCESS
)
95 wl1251_error("TEST command answer error: %d",
96 cmd_answer
->header
.status
);
103 * read acx from firmware
107 * @buf: buffer for the response, including all headers, must work with dma
108 * @len: length of buf
110 int wl1251_cmd_interrogate(struct wl1251
*wl
, u16 id
, void *buf
, size_t len
)
112 struct acx_header
*acx
= buf
;
115 wl1251_debug(DEBUG_CMD
, "cmd interrogate");
119 /* payload length, does not include any headers */
120 acx
->len
= len
- sizeof(*acx
);
122 ret
= wl1251_cmd_send(wl
, CMD_INTERROGATE
, acx
, sizeof(*acx
));
124 wl1251_error("INTERROGATE command failed");
128 /* the interrogate command got in, we can read the answer */
129 wl1251_mem_read(wl
, wl
->cmd_box_addr
, buf
, len
);
132 if (acx
->cmd
.status
!= CMD_STATUS_SUCCESS
)
133 wl1251_error("INTERROGATE command error: %d",
141 * write acx value to firmware
145 * @buf: buffer containing acx, including all headers, must work with dma
146 * @len: length of buf
148 int wl1251_cmd_configure(struct wl1251
*wl
, u16 id
, void *buf
, size_t len
)
150 struct acx_header
*acx
= buf
;
153 wl1251_debug(DEBUG_CMD
, "cmd configure");
157 /* payload length, does not include any headers */
158 acx
->len
= len
- sizeof(*acx
);
160 ret
= wl1251_cmd_send(wl
, CMD_CONFIGURE
, acx
, len
);
162 wl1251_warning("CONFIGURE command NOK");
169 int wl1251_cmd_vbm(struct wl1251
*wl
, u8 identity
,
170 void *bitmap
, u16 bitmap_len
, u8 bitmap_control
)
172 struct wl1251_cmd_vbm_update
*vbm
;
175 wl1251_debug(DEBUG_CMD
, "cmd vbm");
177 vbm
= kzalloc(sizeof(*vbm
), GFP_KERNEL
);
183 /* Count and period will be filled by the target */
184 vbm
->tim
.bitmap_ctrl
= bitmap_control
;
185 if (bitmap_len
> PARTIAL_VBM_MAX
) {
186 wl1251_warning("cmd vbm len is %d B, truncating to %d",
187 bitmap_len
, PARTIAL_VBM_MAX
);
188 bitmap_len
= PARTIAL_VBM_MAX
;
190 memcpy(vbm
->tim
.pvb_field
, bitmap
, bitmap_len
);
191 vbm
->tim
.identity
= identity
;
192 vbm
->tim
.length
= bitmap_len
+ 3;
194 vbm
->len
= cpu_to_le16(bitmap_len
+ 5);
196 ret
= wl1251_cmd_send(wl
, CMD_VBM
, vbm
, sizeof(*vbm
));
198 wl1251_error("VBM command failed");
207 int wl1251_cmd_data_path_rx(struct wl1251
*wl
, u8 channel
, bool enable
)
209 struct cmd_enabledisable_path
*cmd
;
213 wl1251_debug(DEBUG_CMD
, "cmd data path");
215 cmd
= kzalloc(sizeof(*cmd
), GFP_KERNEL
);
221 cmd
->channel
= channel
;
224 cmd_rx
= CMD_ENABLE_RX
;
226 cmd_rx
= CMD_DISABLE_RX
;
228 ret
= wl1251_cmd_send(wl
, cmd_rx
, cmd
, sizeof(*cmd
));
230 wl1251_error("rx %s cmd for channel %d failed",
231 enable
? "start" : "stop", channel
);
235 wl1251_debug(DEBUG_BOOT
, "rx %s cmd channel %d",
236 enable
? "start" : "stop", channel
);
243 int wl1251_cmd_data_path_tx(struct wl1251
*wl
, u8 channel
, bool enable
)
245 struct cmd_enabledisable_path
*cmd
;
249 wl1251_debug(DEBUG_CMD
, "cmd data path");
251 cmd
= kzalloc(sizeof(*cmd
), GFP_KERNEL
);
255 cmd
->channel
= channel
;
258 cmd_tx
= CMD_ENABLE_TX
;
260 cmd_tx
= CMD_DISABLE_TX
;
262 ret
= wl1251_cmd_send(wl
, cmd_tx
, cmd
, sizeof(*cmd
));
264 wl1251_error("tx %s cmd for channel %d failed",
265 enable
? "start" : "stop", channel
);
267 wl1251_debug(DEBUG_BOOT
, "tx %s cmd channel %d",
268 enable
? "start" : "stop", channel
);
274 int wl1251_cmd_join(struct wl1251
*wl
, u8 bss_type
, u8 channel
,
275 u16 beacon_interval
, u8 dtim_interval
)
277 struct cmd_join
*join
;
281 join
= kzalloc(sizeof(*join
), GFP_KERNEL
);
287 wl1251_debug(DEBUG_CMD
, "cmd join%s ch %d %d/%d",
288 bss_type
== BSS_TYPE_IBSS
? " ibss" : "",
289 channel
, beacon_interval
, dtim_interval
);
291 /* Reverse order BSSID */
292 bssid
= (u8
*) &join
->bssid_lsb
;
293 for (i
= 0; i
< ETH_ALEN
; i
++)
294 bssid
[i
] = wl
->bssid
[ETH_ALEN
- i
- 1];
296 join
->rx_config_options
= wl
->rx_config
;
297 join
->rx_filter_options
= wl
->rx_filter
;
299 join
->basic_rate_set
= RATE_MASK_1MBPS
| RATE_MASK_2MBPS
|
300 RATE_MASK_5_5MBPS
| RATE_MASK_11MBPS
;
302 join
->beacon_interval
= beacon_interval
;
303 join
->dtim_interval
= dtim_interval
;
304 join
->bss_type
= bss_type
;
305 join
->channel
= channel
;
306 join
->ctrl
= JOIN_CMD_CTRL_TX_FLUSH
;
308 ret
= wl1251_cmd_send(wl
, CMD_START_JOIN
, join
, sizeof(*join
));
310 wl1251_error("failed to initiate cmd join");
319 int wl1251_cmd_ps_mode(struct wl1251
*wl
, u8 ps_mode
)
321 struct wl1251_cmd_ps_params
*ps_params
= NULL
;
324 wl1251_debug(DEBUG_CMD
, "cmd set ps mode");
326 ps_params
= kzalloc(sizeof(*ps_params
), GFP_KERNEL
);
332 ps_params
->ps_mode
= ps_mode
;
333 ps_params
->send_null_data
= 1;
334 ps_params
->retries
= 5;
335 ps_params
->hang_over_period
= 128;
336 ps_params
->null_data_rate
= 1; /* 1 Mbps */
338 ret
= wl1251_cmd_send(wl
, CMD_SET_PS_MODE
, ps_params
,
341 wl1251_error("cmd set_ps_mode failed");
350 int wl1251_cmd_read_memory(struct wl1251
*wl
, u32 addr
, void *answer
,
353 struct cmd_read_write_memory
*cmd
;
356 wl1251_debug(DEBUG_CMD
, "cmd read memory");
358 cmd
= kzalloc(sizeof(*cmd
), GFP_KERNEL
);
364 WARN_ON(len
> MAX_READ_SIZE
);
365 len
= min_t(size_t, len
, MAX_READ_SIZE
);
370 ret
= wl1251_cmd_send(wl
, CMD_READ_MEMORY
, cmd
, sizeof(*cmd
));
372 wl1251_error("read memory command failed: %d", ret
);
376 /* the read command got in, we can now read the answer */
377 wl1251_mem_read(wl
, wl
->cmd_box_addr
, cmd
, sizeof(*cmd
));
379 if (cmd
->header
.status
!= CMD_STATUS_SUCCESS
)
380 wl1251_error("error in read command result: %d",
383 memcpy(answer
, cmd
->value
, len
);
390 int wl1251_cmd_template_set(struct wl1251
*wl
, u16 cmd_id
,
391 void *buf
, size_t buf_len
)
393 struct wl1251_cmd_packet_template
*cmd
;
397 wl1251_debug(DEBUG_CMD
, "cmd template %d", cmd_id
);
399 WARN_ON(buf_len
> WL1251_MAX_TEMPLATE_SIZE
);
400 buf_len
= min_t(size_t, buf_len
, WL1251_MAX_TEMPLATE_SIZE
);
401 cmd_len
= ALIGN(sizeof(*cmd
) + buf_len
, 4);
403 cmd
= kzalloc(cmd_len
, GFP_KERNEL
);
409 cmd
->size
= cpu_to_le16(buf_len
);
412 memcpy(cmd
->data
, buf
, buf_len
);
414 ret
= wl1251_cmd_send(wl
, cmd_id
, cmd
, cmd_len
);
416 wl1251_warning("cmd set_template failed: %d", ret
);
425 int wl1251_cmd_scan(struct wl1251
*wl
, u8
*ssid
, size_t ssid_len
,
426 struct ieee80211_channel
*channels
[],
427 unsigned int n_channels
, unsigned int n_probes
)
429 struct wl1251_cmd_scan
*cmd
;
432 wl1251_debug(DEBUG_CMD
, "cmd scan channels %d", n_channels
);
434 WARN_ON(n_channels
> SCAN_MAX_NUM_OF_CHANNELS
);
436 cmd
= kzalloc(sizeof(*cmd
), GFP_KERNEL
);
440 cmd
->params
.rx_config_options
= cpu_to_le32(CFG_RX_ALL_GOOD
);
441 cmd
->params
.rx_filter_options
= cpu_to_le32(CFG_RX_PRSP_EN
|
444 cmd
->params
.scan_options
= 0;
446 * Use high priority scan when not associated to prevent fw issue
447 * causing never-ending scans (sometimes 20+ minutes).
448 * Note: This bug may be caused by the fw's DTIM handling.
450 if (is_zero_ether_addr(wl
->bssid
))
451 cmd
->params
.scan_options
|= cpu_to_le16(WL1251_SCAN_OPT_PRIORITY_HIGH
);
452 cmd
->params
.num_channels
= n_channels
;
453 cmd
->params
.num_probe_requests
= n_probes
;
454 cmd
->params
.tx_rate
= cpu_to_le16(1 << 1); /* 2 Mbps */
455 cmd
->params
.tid_trigger
= 0;
457 for (i
= 0; i
< n_channels
; i
++) {
458 cmd
->channels
[i
].min_duration
=
459 cpu_to_le32(WL1251_SCAN_MIN_DURATION
);
460 cmd
->channels
[i
].max_duration
=
461 cpu_to_le32(WL1251_SCAN_MAX_DURATION
);
462 memset(&cmd
->channels
[i
].bssid_lsb
, 0xff, 4);
463 memset(&cmd
->channels
[i
].bssid_msb
, 0xff, 2);
464 cmd
->channels
[i
].early_termination
= 0;
465 cmd
->channels
[i
].tx_power_att
= 0;
466 cmd
->channels
[i
].channel
= channels
[i
]->hw_value
;
469 cmd
->params
.ssid_len
= ssid_len
;
471 memcpy(cmd
->params
.ssid
, ssid
, ssid_len
);
473 ret
= wl1251_cmd_send(wl
, CMD_SCAN
, cmd
, sizeof(*cmd
));
475 wl1251_error("cmd scan failed: %d", ret
);
479 wl1251_mem_read(wl
, wl
->cmd_box_addr
, cmd
, sizeof(*cmd
));
481 if (cmd
->header
.status
!= CMD_STATUS_SUCCESS
) {
482 wl1251_error("cmd scan status wasn't success: %d",
493 int wl1251_cmd_trigger_scan_to(struct wl1251
*wl
, u32 timeout
)
495 struct wl1251_cmd_trigger_scan_to
*cmd
;
498 wl1251_debug(DEBUG_CMD
, "cmd trigger scan to");
500 cmd
= kzalloc(sizeof(*cmd
), GFP_KERNEL
);
504 cmd
->timeout
= timeout
;
506 ret
= wl1251_cmd_send(wl
, CMD_TRIGGER_SCAN_TO
, cmd
, sizeof(*cmd
));
508 wl1251_error("cmd trigger scan to failed: %d", ret
);