cmd.c revision 0230dfea09f7319658c86c07f5507092366dfc00
1/*
2 * This file is part of wl1271
3 *
4 * Copyright (C) 2009-2010 Nokia Corporation
5 *
6 * Contact: Luciano Coelho <luciano.coelho@nokia.com>
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * version 2 as published by the Free Software Foundation.
11 *
12 * This program is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 * General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
20 * 02110-1301 USA
21 *
22 */
23
24#include <linux/module.h>
25#include <linux/platform_device.h>
26#include <linux/spi/spi.h>
27#include <linux/etherdevice.h>
28#include <linux/ieee80211.h>
29#include <linux/slab.h>
30
31#include "wlcore.h"
32#include "debug.h"
33#include "io.h"
34#include "acx.h"
35#include "wl12xx_80211.h"
36#include "cmd.h"
37#include "event.h"
38#include "tx.h"
39
40#define WL1271_CMD_FAST_POLL_COUNT       50
41
42/*
43 * send command to firmware
44 *
45 * @wl: wl struct
46 * @id: command id
47 * @buf: buffer containing the command, must work with dma
48 * @len: length of the buffer
49 */
50int wl1271_cmd_send(struct wl1271 *wl, u16 id, void *buf, size_t len,
51		    size_t res_len)
52{
53	struct wl1271_cmd_header *cmd;
54	unsigned long timeout;
55	u32 intr;
56	int ret = 0;
57	u16 status;
58	u16 poll_count = 0;
59
60	cmd = buf;
61	cmd->id = cpu_to_le16(id);
62	cmd->status = 0;
63
64	WARN_ON(len % 4 != 0);
65	WARN_ON(test_bit(WL1271_FLAG_IN_ELP, &wl->flags));
66
67	wl1271_write(wl, wl->cmd_box_addr, buf, len, false);
68
69	/*
70	 * TODO: we just need this because one bit is in a different
71	 * place.  Is there any better way?
72	 */
73	wl->ops->trigger_cmd(wl, wl->cmd_box_addr, buf, len);
74
75	timeout = jiffies + msecs_to_jiffies(WL1271_COMMAND_TIMEOUT);
76
77	intr = wlcore_read_reg(wl, REG_INTERRUPT_NO_CLEAR);
78	while (!(intr & WL1271_ACX_INTR_CMD_COMPLETE)) {
79		if (time_after(jiffies, timeout)) {
80			wl1271_error("command complete timeout");
81			ret = -ETIMEDOUT;
82			goto fail;
83		}
84
85		poll_count++;
86		if (poll_count < WL1271_CMD_FAST_POLL_COUNT)
87			udelay(10);
88		else
89			msleep(1);
90
91		intr = wlcore_read_reg(wl, REG_INTERRUPT_NO_CLEAR);
92	}
93
94	/* read back the status code of the command */
95	if (res_len == 0)
96		res_len = sizeof(struct wl1271_cmd_header);
97	wl1271_read(wl, wl->cmd_box_addr, cmd, res_len, false);
98
99	status = le16_to_cpu(cmd->status);
100	if (status != CMD_STATUS_SUCCESS) {
101		wl1271_error("command execute failure %d", status);
102		ret = -EIO;
103		goto fail;
104	}
105
106	wlcore_write_reg(wl, REG_INTERRUPT_ACK, WL1271_ACX_INTR_CMD_COMPLETE);
107	return 0;
108
109fail:
110	WARN_ON(1);
111	wl12xx_queue_recovery_work(wl);
112	return ret;
113}
114
115/*
116 * Poll the mailbox event field until any of the bits in the mask is set or a
117 * timeout occurs (WL1271_EVENT_TIMEOUT in msecs)
118 */
119static int wl1271_cmd_wait_for_event_or_timeout(struct wl1271 *wl, u32 mask)
120{
121	u32 *events_vector;
122	u32 event;
123	unsigned long timeout;
124	int ret = 0;
125
126	events_vector = kmalloc(sizeof(*events_vector), GFP_KERNEL | GFP_DMA);
127	if (!events_vector)
128		return -ENOMEM;
129
130	timeout = jiffies + msecs_to_jiffies(WL1271_EVENT_TIMEOUT);
131
132	do {
133		if (time_after(jiffies, timeout)) {
134			wl1271_debug(DEBUG_CMD, "timeout waiting for event %d",
135				     (int)mask);
136			ret = -ETIMEDOUT;
137			goto out;
138		}
139
140		msleep(1);
141
142		/* read from both event fields */
143		wl1271_read(wl, wl->mbox_ptr[0], events_vector,
144			    sizeof(*events_vector), false);
145		event = *events_vector & mask;
146		wl1271_read(wl, wl->mbox_ptr[1], events_vector,
147			    sizeof(*events_vector), false);
148		event |= *events_vector & mask;
149	} while (!event);
150
151out:
152	kfree(events_vector);
153	return ret;
154}
155
156static int wl1271_cmd_wait_for_event(struct wl1271 *wl, u32 mask)
157{
158	int ret;
159
160	ret = wl1271_cmd_wait_for_event_or_timeout(wl, mask);
161	if (ret != 0) {
162		wl12xx_queue_recovery_work(wl);
163		return ret;
164	}
165
166	return 0;
167}
168
169int wl12xx_cmd_role_enable(struct wl1271 *wl, u8 *addr, u8 role_type,
170			   u8 *role_id)
171{
172	struct wl12xx_cmd_role_enable *cmd;
173	int ret;
174
175	wl1271_debug(DEBUG_CMD, "cmd role enable");
176
177	if (WARN_ON(*role_id != WL12XX_INVALID_ROLE_ID))
178		return -EBUSY;
179
180	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
181	if (!cmd) {
182		ret = -ENOMEM;
183		goto out;
184	}
185
186	/* get role id */
187	cmd->role_id = find_first_zero_bit(wl->roles_map, WL12XX_MAX_ROLES);
188	if (cmd->role_id >= WL12XX_MAX_ROLES) {
189		ret = -EBUSY;
190		goto out_free;
191	}
192
193	memcpy(cmd->mac_address, addr, ETH_ALEN);
194	cmd->role_type = role_type;
195
196	ret = wl1271_cmd_send(wl, CMD_ROLE_ENABLE, cmd, sizeof(*cmd), 0);
197	if (ret < 0) {
198		wl1271_error("failed to initiate cmd role enable");
199		goto out_free;
200	}
201
202	__set_bit(cmd->role_id, wl->roles_map);
203	*role_id = cmd->role_id;
204
205out_free:
206	kfree(cmd);
207
208out:
209	return ret;
210}
211
212int wl12xx_cmd_role_disable(struct wl1271 *wl, u8 *role_id)
213{
214	struct wl12xx_cmd_role_disable *cmd;
215	int ret;
216
217	wl1271_debug(DEBUG_CMD, "cmd role disable");
218
219	if (WARN_ON(*role_id == WL12XX_INVALID_ROLE_ID))
220		return -ENOENT;
221
222	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
223	if (!cmd) {
224		ret = -ENOMEM;
225		goto out;
226	}
227	cmd->role_id = *role_id;
228
229	ret = wl1271_cmd_send(wl, CMD_ROLE_DISABLE, cmd, sizeof(*cmd), 0);
230	if (ret < 0) {
231		wl1271_error("failed to initiate cmd role disable");
232		goto out_free;
233	}
234
235	__clear_bit(*role_id, wl->roles_map);
236	*role_id = WL12XX_INVALID_ROLE_ID;
237
238out_free:
239	kfree(cmd);
240
241out:
242	return ret;
243}
244
245int wl12xx_allocate_link(struct wl1271 *wl, struct wl12xx_vif *wlvif, u8 *hlid)
246{
247	unsigned long flags;
248	u8 link = find_first_zero_bit(wl->links_map, WL12XX_MAX_LINKS);
249	if (link >= WL12XX_MAX_LINKS)
250		return -EBUSY;
251
252	/* these bits are used by op_tx */
253	spin_lock_irqsave(&wl->wl_lock, flags);
254	__set_bit(link, wl->links_map);
255	__set_bit(link, wlvif->links_map);
256	spin_unlock_irqrestore(&wl->wl_lock, flags);
257	*hlid = link;
258	return 0;
259}
260
261void wl12xx_free_link(struct wl1271 *wl, struct wl12xx_vif *wlvif, u8 *hlid)
262{
263	unsigned long flags;
264
265	if (*hlid == WL12XX_INVALID_LINK_ID)
266		return;
267
268	/* these bits are used by op_tx */
269	spin_lock_irqsave(&wl->wl_lock, flags);
270	__clear_bit(*hlid, wl->links_map);
271	__clear_bit(*hlid, wlvif->links_map);
272	spin_unlock_irqrestore(&wl->wl_lock, flags);
273
274	/*
275	 * At this point op_tx() will not add more packets to the queues. We
276	 * can purge them.
277	 */
278	wl1271_tx_reset_link_queues(wl, *hlid);
279
280	*hlid = WL12XX_INVALID_LINK_ID;
281}
282
283static int wl12xx_get_new_session_id(struct wl1271 *wl,
284				     struct wl12xx_vif *wlvif)
285{
286	if (wlvif->session_counter >= SESSION_COUNTER_MAX)
287		wlvif->session_counter = 0;
288
289	wlvif->session_counter++;
290
291	return wlvif->session_counter;
292}
293
294static int wl12xx_cmd_role_start_dev(struct wl1271 *wl,
295				     struct wl12xx_vif *wlvif)
296{
297	struct wl12xx_cmd_role_start *cmd;
298	int ret;
299
300	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
301	if (!cmd) {
302		ret = -ENOMEM;
303		goto out;
304	}
305
306	wl1271_debug(DEBUG_CMD, "cmd role start dev %d", wlvif->dev_role_id);
307
308	cmd->role_id = wlvif->dev_role_id;
309	if (wlvif->band == IEEE80211_BAND_5GHZ)
310		cmd->band = WLCORE_BAND_5GHZ;
311	cmd->channel = wlvif->channel;
312
313	if (wlvif->dev_hlid == WL12XX_INVALID_LINK_ID) {
314		ret = wl12xx_allocate_link(wl, wlvif, &wlvif->dev_hlid);
315		if (ret)
316			goto out_free;
317	}
318	cmd->device.hlid = wlvif->dev_hlid;
319	cmd->device.session = wl12xx_get_new_session_id(wl, wlvif);
320
321	wl1271_debug(DEBUG_CMD, "role start: roleid=%d, hlid=%d, session=%d",
322		     cmd->role_id, cmd->device.hlid, cmd->device.session);
323
324	ret = wl1271_cmd_send(wl, CMD_ROLE_START, cmd, sizeof(*cmd), 0);
325	if (ret < 0) {
326		wl1271_error("failed to initiate cmd role enable");
327		goto err_hlid;
328	}
329
330	goto out_free;
331
332err_hlid:
333	/* clear links on error */
334	wl12xx_free_link(wl, wlvif, &wlvif->dev_hlid);
335
336out_free:
337	kfree(cmd);
338
339out:
340	return ret;
341}
342
343static int wl12xx_cmd_role_stop_dev(struct wl1271 *wl,
344				    struct wl12xx_vif *wlvif)
345{
346	struct wl12xx_cmd_role_stop *cmd;
347	int ret;
348
349	if (WARN_ON(wlvif->dev_hlid == WL12XX_INVALID_LINK_ID))
350		return -EINVAL;
351
352	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
353	if (!cmd) {
354		ret = -ENOMEM;
355		goto out;
356	}
357
358	wl1271_debug(DEBUG_CMD, "cmd role stop dev");
359
360	cmd->role_id = wlvif->dev_role_id;
361	cmd->disc_type = DISCONNECT_IMMEDIATE;
362	cmd->reason = cpu_to_le16(WLAN_REASON_UNSPECIFIED);
363
364	ret = wl1271_cmd_send(wl, CMD_ROLE_STOP, cmd, sizeof(*cmd), 0);
365	if (ret < 0) {
366		wl1271_error("failed to initiate cmd role stop");
367		goto out_free;
368	}
369
370	ret = wl1271_cmd_wait_for_event(wl, ROLE_STOP_COMPLETE_EVENT_ID);
371	if (ret < 0) {
372		wl1271_error("cmd role stop dev event completion error");
373		goto out_free;
374	}
375
376	wl12xx_free_link(wl, wlvif, &wlvif->dev_hlid);
377
378out_free:
379	kfree(cmd);
380
381out:
382	return ret;
383}
384
385int wl12xx_cmd_role_start_sta(struct wl1271 *wl, struct wl12xx_vif *wlvif)
386{
387	struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
388	struct wl12xx_cmd_role_start *cmd;
389	int ret;
390
391	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
392	if (!cmd) {
393		ret = -ENOMEM;
394		goto out;
395	}
396
397	wl1271_debug(DEBUG_CMD, "cmd role start sta %d", wlvif->role_id);
398
399	cmd->role_id = wlvif->role_id;
400	if (wlvif->band == IEEE80211_BAND_5GHZ)
401		cmd->band = WLCORE_BAND_5GHZ;
402	cmd->channel = wlvif->channel;
403	cmd->sta.basic_rate_set = cpu_to_le32(wlvif->basic_rate_set);
404	cmd->sta.beacon_interval = cpu_to_le16(wlvif->beacon_int);
405	cmd->sta.ssid_type = WL12XX_SSID_TYPE_ANY;
406	cmd->sta.ssid_len = wlvif->ssid_len;
407	memcpy(cmd->sta.ssid, wlvif->ssid, wlvif->ssid_len);
408	memcpy(cmd->sta.bssid, vif->bss_conf.bssid, ETH_ALEN);
409	cmd->sta.local_rates = cpu_to_le32(wlvif->rate_set);
410
411	if (wlvif->sta.hlid == WL12XX_INVALID_LINK_ID) {
412		ret = wl12xx_allocate_link(wl, wlvif, &wlvif->sta.hlid);
413		if (ret)
414			goto out_free;
415	}
416	cmd->sta.hlid = wlvif->sta.hlid;
417	cmd->sta.session = wl12xx_get_new_session_id(wl, wlvif);
418	cmd->sta.remote_rates = cpu_to_le32(wlvif->rate_set);
419
420	wl1271_debug(DEBUG_CMD, "role start: roleid=%d, hlid=%d, session=%d "
421		     "basic_rate_set: 0x%x, remote_rates: 0x%x",
422		     wlvif->role_id, cmd->sta.hlid, cmd->sta.session,
423		     wlvif->basic_rate_set, wlvif->rate_set);
424
425	ret = wl1271_cmd_send(wl, CMD_ROLE_START, cmd, sizeof(*cmd), 0);
426	if (ret < 0) {
427		wl1271_error("failed to initiate cmd role start sta");
428		goto err_hlid;
429	}
430
431	goto out_free;
432
433err_hlid:
434	/* clear links on error. */
435	wl12xx_free_link(wl, wlvif, &wlvif->sta.hlid);
436
437out_free:
438	kfree(cmd);
439
440out:
441	return ret;
442}
443
444/* use this function to stop ibss as well */
445int wl12xx_cmd_role_stop_sta(struct wl1271 *wl, struct wl12xx_vif *wlvif)
446{
447	struct wl12xx_cmd_role_stop *cmd;
448	int ret;
449
450	if (WARN_ON(wlvif->sta.hlid == WL12XX_INVALID_LINK_ID))
451		return -EINVAL;
452
453	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
454	if (!cmd) {
455		ret = -ENOMEM;
456		goto out;
457	}
458
459	wl1271_debug(DEBUG_CMD, "cmd role stop sta %d", wlvif->role_id);
460
461	cmd->role_id = wlvif->role_id;
462	cmd->disc_type = DISCONNECT_IMMEDIATE;
463	cmd->reason = cpu_to_le16(WLAN_REASON_UNSPECIFIED);
464
465	ret = wl1271_cmd_send(wl, CMD_ROLE_STOP, cmd, sizeof(*cmd), 0);
466	if (ret < 0) {
467		wl1271_error("failed to initiate cmd role stop sta");
468		goto out_free;
469	}
470
471	wl12xx_free_link(wl, wlvif, &wlvif->sta.hlid);
472
473out_free:
474	kfree(cmd);
475
476out:
477	return ret;
478}
479
480int wl12xx_cmd_role_start_ap(struct wl1271 *wl, struct wl12xx_vif *wlvif)
481{
482	struct wl12xx_cmd_role_start *cmd;
483	struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
484	struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
485	int ret;
486
487	wl1271_debug(DEBUG_CMD, "cmd role start ap %d", wlvif->role_id);
488
489	/* trying to use hidden SSID with an old hostapd version */
490	if (wlvif->ssid_len == 0 && !bss_conf->hidden_ssid) {
491		wl1271_error("got a null SSID from beacon/bss");
492		ret = -EINVAL;
493		goto out;
494	}
495
496	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
497	if (!cmd) {
498		ret = -ENOMEM;
499		goto out;
500	}
501
502	ret = wl12xx_allocate_link(wl, wlvif, &wlvif->ap.global_hlid);
503	if (ret < 0)
504		goto out_free;
505
506	ret = wl12xx_allocate_link(wl, wlvif, &wlvif->ap.bcast_hlid);
507	if (ret < 0)
508		goto out_free_global;
509
510	cmd->role_id = wlvif->role_id;
511	cmd->ap.aging_period = cpu_to_le16(wl->conf.tx.ap_aging_period);
512	cmd->ap.bss_index = WL1271_AP_BSS_INDEX;
513	cmd->ap.global_hlid = wlvif->ap.global_hlid;
514	cmd->ap.broadcast_hlid = wlvif->ap.bcast_hlid;
515	cmd->ap.basic_rate_set = cpu_to_le32(wlvif->basic_rate_set);
516	cmd->ap.beacon_interval = cpu_to_le16(wlvif->beacon_int);
517	cmd->ap.dtim_interval = bss_conf->dtim_period;
518	cmd->ap.beacon_expiry = WL1271_AP_DEF_BEACON_EXP;
519	/* FIXME: Change when adding DFS */
520	cmd->ap.reset_tsf = 1;  /* By default reset AP TSF */
521	cmd->channel = wlvif->channel;
522
523	if (!bss_conf->hidden_ssid) {
524		/* take the SSID from the beacon for backward compatibility */
525		cmd->ap.ssid_type = WL12XX_SSID_TYPE_PUBLIC;
526		cmd->ap.ssid_len = wlvif->ssid_len;
527		memcpy(cmd->ap.ssid, wlvif->ssid, wlvif->ssid_len);
528	} else {
529		cmd->ap.ssid_type = WL12XX_SSID_TYPE_HIDDEN;
530		cmd->ap.ssid_len = bss_conf->ssid_len;
531		memcpy(cmd->ap.ssid, bss_conf->ssid, bss_conf->ssid_len);
532	}
533
534	cmd->ap.local_rates = cpu_to_le32(0xffffffff);
535
536	switch (wlvif->band) {
537	case IEEE80211_BAND_2GHZ:
538		cmd->band = WLCORE_BAND_2_4GHZ;
539		break;
540	case IEEE80211_BAND_5GHZ:
541		cmd->band = WLCORE_BAND_5GHZ;
542		break;
543	default:
544		wl1271_warning("ap start - unknown band: %d", (int)wlvif->band);
545		cmd->band = WLCORE_BAND_2_4GHZ;
546		break;
547	}
548
549	ret = wl1271_cmd_send(wl, CMD_ROLE_START, cmd, sizeof(*cmd), 0);
550	if (ret < 0) {
551		wl1271_error("failed to initiate cmd role start ap");
552		goto out_free_bcast;
553	}
554
555	goto out_free;
556
557out_free_bcast:
558	wl12xx_free_link(wl, wlvif, &wlvif->ap.bcast_hlid);
559
560out_free_global:
561	wl12xx_free_link(wl, wlvif, &wlvif->ap.global_hlid);
562
563out_free:
564	kfree(cmd);
565
566out:
567	return ret;
568}
569
570int wl12xx_cmd_role_stop_ap(struct wl1271 *wl, struct wl12xx_vif *wlvif)
571{
572	struct wl12xx_cmd_role_stop *cmd;
573	int ret;
574
575	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
576	if (!cmd) {
577		ret = -ENOMEM;
578		goto out;
579	}
580
581	wl1271_debug(DEBUG_CMD, "cmd role stop ap %d", wlvif->role_id);
582
583	cmd->role_id = wlvif->role_id;
584
585	ret = wl1271_cmd_send(wl, CMD_ROLE_STOP, cmd, sizeof(*cmd), 0);
586	if (ret < 0) {
587		wl1271_error("failed to initiate cmd role stop ap");
588		goto out_free;
589	}
590
591	wl12xx_free_link(wl, wlvif, &wlvif->ap.bcast_hlid);
592	wl12xx_free_link(wl, wlvif, &wlvif->ap.global_hlid);
593
594out_free:
595	kfree(cmd);
596
597out:
598	return ret;
599}
600
601int wl12xx_cmd_role_start_ibss(struct wl1271 *wl, struct wl12xx_vif *wlvif)
602{
603	struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
604	struct wl12xx_cmd_role_start *cmd;
605	struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
606	int ret;
607
608	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
609	if (!cmd) {
610		ret = -ENOMEM;
611		goto out;
612	}
613
614	wl1271_debug(DEBUG_CMD, "cmd role start ibss %d", wlvif->role_id);
615
616	cmd->role_id = wlvif->role_id;
617	if (wlvif->band == IEEE80211_BAND_5GHZ)
618		cmd->band = WLCORE_BAND_5GHZ;
619	cmd->channel = wlvif->channel;
620	cmd->ibss.basic_rate_set = cpu_to_le32(wlvif->basic_rate_set);
621	cmd->ibss.beacon_interval = cpu_to_le16(wlvif->beacon_int);
622	cmd->ibss.dtim_interval = bss_conf->dtim_period;
623	cmd->ibss.ssid_type = WL12XX_SSID_TYPE_ANY;
624	cmd->ibss.ssid_len = wlvif->ssid_len;
625	memcpy(cmd->ibss.ssid, wlvif->ssid, wlvif->ssid_len);
626	memcpy(cmd->ibss.bssid, vif->bss_conf.bssid, ETH_ALEN);
627	cmd->sta.local_rates = cpu_to_le32(wlvif->rate_set);
628
629	if (wlvif->sta.hlid == WL12XX_INVALID_LINK_ID) {
630		ret = wl12xx_allocate_link(wl, wlvif, &wlvif->sta.hlid);
631		if (ret)
632			goto out_free;
633	}
634	cmd->ibss.hlid = wlvif->sta.hlid;
635	cmd->ibss.remote_rates = cpu_to_le32(wlvif->rate_set);
636
637	wl1271_debug(DEBUG_CMD, "role start: roleid=%d, hlid=%d, session=%d "
638		     "basic_rate_set: 0x%x, remote_rates: 0x%x",
639		     wlvif->role_id, cmd->sta.hlid, cmd->sta.session,
640		     wlvif->basic_rate_set, wlvif->rate_set);
641
642	wl1271_debug(DEBUG_CMD, "vif->bss_conf.bssid = %pM",
643		     vif->bss_conf.bssid);
644
645	ret = wl1271_cmd_send(wl, CMD_ROLE_START, cmd, sizeof(*cmd), 0);
646	if (ret < 0) {
647		wl1271_error("failed to initiate cmd role enable");
648		goto err_hlid;
649	}
650
651	goto out_free;
652
653err_hlid:
654	/* clear links on error. */
655	wl12xx_free_link(wl, wlvif, &wlvif->sta.hlid);
656
657out_free:
658	kfree(cmd);
659
660out:
661	return ret;
662}
663
664
665/**
666 * send test command to firmware
667 *
668 * @wl: wl struct
669 * @buf: buffer containing the command, with all headers, must work with dma
670 * @len: length of the buffer
671 * @answer: is answer needed
672 */
673int wl1271_cmd_test(struct wl1271 *wl, void *buf, size_t buf_len, u8 answer)
674{
675	int ret;
676	size_t res_len = 0;
677
678	wl1271_debug(DEBUG_CMD, "cmd test");
679
680	if (answer)
681		res_len = buf_len;
682
683	ret = wl1271_cmd_send(wl, CMD_TEST, buf, buf_len, res_len);
684
685	if (ret < 0) {
686		wl1271_warning("TEST command failed");
687		return ret;
688	}
689
690	return ret;
691}
692EXPORT_SYMBOL_GPL(wl1271_cmd_test);
693
694/**
695 * read acx from firmware
696 *
697 * @wl: wl struct
698 * @id: acx id
699 * @buf: buffer for the response, including all headers, must work with dma
700 * @len: length of buf
701 */
702int wl1271_cmd_interrogate(struct wl1271 *wl, u16 id, void *buf, size_t len)
703{
704	struct acx_header *acx = buf;
705	int ret;
706
707	wl1271_debug(DEBUG_CMD, "cmd interrogate");
708
709	acx->id = cpu_to_le16(id);
710
711	/* payload length, does not include any headers */
712	acx->len = cpu_to_le16(len - sizeof(*acx));
713
714	ret = wl1271_cmd_send(wl, CMD_INTERROGATE, acx, sizeof(*acx), len);
715	if (ret < 0)
716		wl1271_error("INTERROGATE command failed");
717
718	return ret;
719}
720
721/**
722 * write acx value to firmware
723 *
724 * @wl: wl struct
725 * @id: acx id
726 * @buf: buffer containing acx, including all headers, must work with dma
727 * @len: length of buf
728 */
729int wl1271_cmd_configure(struct wl1271 *wl, u16 id, void *buf, size_t len)
730{
731	struct acx_header *acx = buf;
732	int ret;
733
734	wl1271_debug(DEBUG_CMD, "cmd configure (%d)", id);
735
736	acx->id = cpu_to_le16(id);
737
738	/* payload length, does not include any headers */
739	acx->len = cpu_to_le16(len - sizeof(*acx));
740
741	ret = wl1271_cmd_send(wl, CMD_CONFIGURE, acx, len, 0);
742	if (ret < 0) {
743		wl1271_warning("CONFIGURE command NOK");
744		return ret;
745	}
746
747	return 0;
748}
749EXPORT_SYMBOL_GPL(wl1271_cmd_configure);
750
751int wl1271_cmd_data_path(struct wl1271 *wl, bool enable)
752{
753	struct cmd_enabledisable_path *cmd;
754	int ret;
755	u16 cmd_rx, cmd_tx;
756
757	wl1271_debug(DEBUG_CMD, "cmd data path");
758
759	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
760	if (!cmd) {
761		ret = -ENOMEM;
762		goto out;
763	}
764
765	/* the channel here is only used for calibration, so hardcoded to 1 */
766	cmd->channel = 1;
767
768	if (enable) {
769		cmd_rx = CMD_ENABLE_RX;
770		cmd_tx = CMD_ENABLE_TX;
771	} else {
772		cmd_rx = CMD_DISABLE_RX;
773		cmd_tx = CMD_DISABLE_TX;
774	}
775
776	ret = wl1271_cmd_send(wl, cmd_rx, cmd, sizeof(*cmd), 0);
777	if (ret < 0) {
778		wl1271_error("rx %s cmd for channel %d failed",
779			     enable ? "start" : "stop", cmd->channel);
780		goto out;
781	}
782
783	wl1271_debug(DEBUG_BOOT, "rx %s cmd channel %d",
784		     enable ? "start" : "stop", cmd->channel);
785
786	ret = wl1271_cmd_send(wl, cmd_tx, cmd, sizeof(*cmd), 0);
787	if (ret < 0) {
788		wl1271_error("tx %s cmd for channel %d failed",
789			     enable ? "start" : "stop", cmd->channel);
790		goto out;
791	}
792
793	wl1271_debug(DEBUG_BOOT, "tx %s cmd channel %d",
794		     enable ? "start" : "stop", cmd->channel);
795
796out:
797	kfree(cmd);
798	return ret;
799}
800
801int wl1271_cmd_ps_mode(struct wl1271 *wl, struct wl12xx_vif *wlvif,
802		       u8 ps_mode, u16 auto_ps_timeout)
803{
804	struct wl1271_cmd_ps_params *ps_params = NULL;
805	int ret = 0;
806
807	wl1271_debug(DEBUG_CMD, "cmd set ps mode");
808
809	ps_params = kzalloc(sizeof(*ps_params), GFP_KERNEL);
810	if (!ps_params) {
811		ret = -ENOMEM;
812		goto out;
813	}
814
815	ps_params->role_id = wlvif->role_id;
816	ps_params->ps_mode = ps_mode;
817	ps_params->auto_ps_timeout = auto_ps_timeout;
818
819	ret = wl1271_cmd_send(wl, CMD_SET_PS_MODE, ps_params,
820			      sizeof(*ps_params), 0);
821	if (ret < 0) {
822		wl1271_error("cmd set_ps_mode failed");
823		goto out;
824	}
825
826out:
827	kfree(ps_params);
828	return ret;
829}
830
831int wl1271_cmd_template_set(struct wl1271 *wl, u8 role_id,
832			    u16 template_id, void *buf, size_t buf_len,
833			    int index, u32 rates)
834{
835	struct wl1271_cmd_template_set *cmd;
836	int ret = 0;
837
838	wl1271_debug(DEBUG_CMD, "cmd template_set %d (role %d)",
839		     template_id, role_id);
840
841	WARN_ON(buf_len > WL1271_CMD_TEMPL_MAX_SIZE);
842	buf_len = min_t(size_t, buf_len, WL1271_CMD_TEMPL_MAX_SIZE);
843
844	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
845	if (!cmd) {
846		ret = -ENOMEM;
847		goto out;
848	}
849
850	/* during initialization wlvif is NULL */
851	cmd->role_id = role_id;
852	cmd->len = cpu_to_le16(buf_len);
853	cmd->template_type = template_id;
854	cmd->enabled_rates = cpu_to_le32(rates);
855	cmd->short_retry_limit = wl->conf.tx.tmpl_short_retry_limit;
856	cmd->long_retry_limit = wl->conf.tx.tmpl_long_retry_limit;
857	cmd->index = index;
858
859	if (buf)
860		memcpy(cmd->template_data, buf, buf_len);
861
862	ret = wl1271_cmd_send(wl, CMD_SET_TEMPLATE, cmd, sizeof(*cmd), 0);
863	if (ret < 0) {
864		wl1271_warning("cmd set_template failed: %d", ret);
865		goto out_free;
866	}
867
868out_free:
869	kfree(cmd);
870
871out:
872	return ret;
873}
874
875int wl12xx_cmd_build_null_data(struct wl1271 *wl, struct wl12xx_vif *wlvif)
876{
877	struct sk_buff *skb = NULL;
878	int size;
879	void *ptr;
880	int ret = -ENOMEM;
881
882
883	if (wlvif->bss_type == BSS_TYPE_IBSS) {
884		size = sizeof(struct wl12xx_null_data_template);
885		ptr = NULL;
886	} else {
887		skb = ieee80211_nullfunc_get(wl->hw,
888					     wl12xx_wlvif_to_vif(wlvif));
889		if (!skb)
890			goto out;
891		size = skb->len;
892		ptr = skb->data;
893	}
894
895	ret = wl1271_cmd_template_set(wl, wlvif->role_id,
896				      CMD_TEMPL_NULL_DATA, ptr, size, 0,
897				      wlvif->basic_rate);
898
899out:
900	dev_kfree_skb(skb);
901	if (ret)
902		wl1271_warning("cmd buld null data failed %d", ret);
903
904	return ret;
905
906}
907
908int wl12xx_cmd_build_klv_null_data(struct wl1271 *wl,
909				   struct wl12xx_vif *wlvif)
910{
911	struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
912	struct sk_buff *skb = NULL;
913	int ret = -ENOMEM;
914
915	skb = ieee80211_nullfunc_get(wl->hw, vif);
916	if (!skb)
917		goto out;
918
919	ret = wl1271_cmd_template_set(wl, wlvif->role_id, CMD_TEMPL_KLV,
920				      skb->data, skb->len,
921				      CMD_TEMPL_KLV_IDX_NULL_DATA,
922				      wlvif->basic_rate);
923
924out:
925	dev_kfree_skb(skb);
926	if (ret)
927		wl1271_warning("cmd build klv null data failed %d", ret);
928
929	return ret;
930
931}
932
933int wl1271_cmd_build_ps_poll(struct wl1271 *wl, struct wl12xx_vif *wlvif,
934			     u16 aid)
935{
936	struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
937	struct sk_buff *skb;
938	int ret = 0;
939
940	skb = ieee80211_pspoll_get(wl->hw, vif);
941	if (!skb)
942		goto out;
943
944	ret = wl1271_cmd_template_set(wl, wlvif->role_id,
945				      CMD_TEMPL_PS_POLL, skb->data,
946				      skb->len, 0, wlvif->basic_rate_set);
947
948out:
949	dev_kfree_skb(skb);
950	return ret;
951}
952
953int wl12xx_cmd_build_probe_req(struct wl1271 *wl, struct wl12xx_vif *wlvif,
954			       u8 role_id, u8 band,
955			       const u8 *ssid, size_t ssid_len,
956			       const u8 *ie, size_t ie_len)
957{
958	struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
959	struct sk_buff *skb;
960	int ret;
961	u32 rate;
962
963	skb = ieee80211_probereq_get(wl->hw, vif, ssid, ssid_len,
964				     ie, ie_len);
965	if (!skb) {
966		ret = -ENOMEM;
967		goto out;
968	}
969
970	wl1271_dump(DEBUG_SCAN, "PROBE REQ: ", skb->data, skb->len);
971
972	rate = wl1271_tx_min_rate_get(wl, wlvif->bitrate_masks[band]);
973	if (band == IEEE80211_BAND_2GHZ)
974		ret = wl1271_cmd_template_set(wl, role_id,
975					      CMD_TEMPL_CFG_PROBE_REQ_2_4,
976					      skb->data, skb->len, 0, rate);
977	else
978		ret = wl1271_cmd_template_set(wl, role_id,
979					      CMD_TEMPL_CFG_PROBE_REQ_5,
980					      skb->data, skb->len, 0, rate);
981
982out:
983	dev_kfree_skb(skb);
984	return ret;
985}
986
987struct sk_buff *wl1271_cmd_build_ap_probe_req(struct wl1271 *wl,
988					      struct wl12xx_vif *wlvif,
989					      struct sk_buff *skb)
990{
991	struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
992	int ret;
993	u32 rate;
994
995	if (!skb)
996		skb = ieee80211_ap_probereq_get(wl->hw, vif);
997	if (!skb)
998		goto out;
999
1000	wl1271_dump(DEBUG_SCAN, "AP PROBE REQ: ", skb->data, skb->len);
1001
1002	rate = wl1271_tx_min_rate_get(wl, wlvif->bitrate_masks[wlvif->band]);
1003	if (wlvif->band == IEEE80211_BAND_2GHZ)
1004		ret = wl1271_cmd_template_set(wl, wlvif->role_id,
1005					      CMD_TEMPL_CFG_PROBE_REQ_2_4,
1006					      skb->data, skb->len, 0, rate);
1007	else
1008		ret = wl1271_cmd_template_set(wl, wlvif->role_id,
1009					      CMD_TEMPL_CFG_PROBE_REQ_5,
1010					      skb->data, skb->len, 0, rate);
1011
1012	if (ret < 0)
1013		wl1271_error("Unable to set ap probe request template.");
1014
1015out:
1016	return skb;
1017}
1018
1019int wl1271_cmd_build_arp_rsp(struct wl1271 *wl, struct wl12xx_vif *wlvif)
1020{
1021	int ret, extra;
1022	u16 fc;
1023	struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
1024	struct sk_buff *skb;
1025	struct wl12xx_arp_rsp_template *tmpl;
1026	struct ieee80211_hdr_3addr *hdr;
1027	struct arphdr *arp_hdr;
1028
1029	skb = dev_alloc_skb(sizeof(*hdr) + sizeof(__le16) + sizeof(*tmpl) +
1030			    WL1271_EXTRA_SPACE_MAX);
1031	if (!skb) {
1032		wl1271_error("failed to allocate buffer for arp rsp template");
1033		return -ENOMEM;
1034	}
1035
1036	skb_reserve(skb, sizeof(*hdr) + WL1271_EXTRA_SPACE_MAX);
1037
1038	tmpl = (struct wl12xx_arp_rsp_template *)skb_put(skb, sizeof(*tmpl));
1039	memset(tmpl, 0, sizeof(tmpl));
1040
1041	/* llc layer */
1042	memcpy(tmpl->llc_hdr, rfc1042_header, sizeof(rfc1042_header));
1043	tmpl->llc_type = cpu_to_be16(ETH_P_ARP);
1044
1045	/* arp header */
1046	arp_hdr = &tmpl->arp_hdr;
1047	arp_hdr->ar_hrd = cpu_to_be16(ARPHRD_ETHER);
1048	arp_hdr->ar_pro = cpu_to_be16(ETH_P_IP);
1049	arp_hdr->ar_hln = ETH_ALEN;
1050	arp_hdr->ar_pln = 4;
1051	arp_hdr->ar_op = cpu_to_be16(ARPOP_REPLY);
1052
1053	/* arp payload */
1054	memcpy(tmpl->sender_hw, vif->addr, ETH_ALEN);
1055	tmpl->sender_ip = wlvif->ip_addr;
1056
1057	/* encryption space */
1058	switch (wlvif->encryption_type) {
1059	case KEY_TKIP:
1060		extra = WL1271_EXTRA_SPACE_TKIP;
1061		break;
1062	case KEY_AES:
1063		extra = WL1271_EXTRA_SPACE_AES;
1064		break;
1065	case KEY_NONE:
1066	case KEY_WEP:
1067	case KEY_GEM:
1068		extra = 0;
1069		break;
1070	default:
1071		wl1271_warning("Unknown encryption type: %d",
1072			       wlvif->encryption_type);
1073		ret = -EINVAL;
1074		goto out;
1075	}
1076
1077	if (extra) {
1078		u8 *space = skb_push(skb, extra);
1079		memset(space, 0, extra);
1080	}
1081
1082	/* QoS header - BE */
1083	if (wlvif->sta.qos)
1084		memset(skb_push(skb, sizeof(__le16)), 0, sizeof(__le16));
1085
1086	/* mac80211 header */
1087	hdr = (struct ieee80211_hdr_3addr *)skb_push(skb, sizeof(*hdr));
1088	memset(hdr, 0, sizeof(hdr));
1089	fc = IEEE80211_FTYPE_DATA | IEEE80211_FCTL_TODS;
1090	if (wlvif->sta.qos)
1091		fc |= IEEE80211_STYPE_QOS_DATA;
1092	else
1093		fc |= IEEE80211_STYPE_DATA;
1094	if (wlvif->encryption_type != KEY_NONE)
1095		fc |= IEEE80211_FCTL_PROTECTED;
1096
1097	hdr->frame_control = cpu_to_le16(fc);
1098	memcpy(hdr->addr1, vif->bss_conf.bssid, ETH_ALEN);
1099	memcpy(hdr->addr2, vif->addr, ETH_ALEN);
1100	memset(hdr->addr3, 0xff, ETH_ALEN);
1101
1102	ret = wl1271_cmd_template_set(wl, wlvif->role_id, CMD_TEMPL_ARP_RSP,
1103				      skb->data, skb->len, 0,
1104				      wlvif->basic_rate);
1105out:
1106	dev_kfree_skb(skb);
1107	return ret;
1108}
1109
1110int wl1271_build_qos_null_data(struct wl1271 *wl, struct ieee80211_vif *vif)
1111{
1112	struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
1113	struct ieee80211_qos_hdr template;
1114
1115	memset(&template, 0, sizeof(template));
1116
1117	memcpy(template.addr1, vif->bss_conf.bssid, ETH_ALEN);
1118	memcpy(template.addr2, vif->addr, ETH_ALEN);
1119	memcpy(template.addr3, vif->bss_conf.bssid, ETH_ALEN);
1120
1121	template.frame_control = cpu_to_le16(IEEE80211_FTYPE_DATA |
1122					     IEEE80211_STYPE_QOS_NULLFUNC |
1123					     IEEE80211_FCTL_TODS);
1124
1125	/* FIXME: not sure what priority to use here */
1126	template.qos_ctrl = cpu_to_le16(0);
1127
1128	return wl1271_cmd_template_set(wl, wlvif->role_id,
1129				       CMD_TEMPL_QOS_NULL_DATA, &template,
1130				       sizeof(template), 0,
1131				       wlvif->basic_rate);
1132}
1133
1134int wl12xx_cmd_set_default_wep_key(struct wl1271 *wl, u8 id, u8 hlid)
1135{
1136	struct wl1271_cmd_set_keys *cmd;
1137	int ret = 0;
1138
1139	wl1271_debug(DEBUG_CMD, "cmd set_default_wep_key %d", id);
1140
1141	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
1142	if (!cmd) {
1143		ret = -ENOMEM;
1144		goto out;
1145	}
1146
1147	cmd->hlid = hlid;
1148	cmd->key_id = id;
1149	cmd->lid_key_type = WEP_DEFAULT_LID_TYPE;
1150	cmd->key_action = cpu_to_le16(KEY_SET_ID);
1151	cmd->key_type = KEY_WEP;
1152
1153	ret = wl1271_cmd_send(wl, CMD_SET_KEYS, cmd, sizeof(*cmd), 0);
1154	if (ret < 0) {
1155		wl1271_warning("cmd set_default_wep_key failed: %d", ret);
1156		goto out;
1157	}
1158
1159out:
1160	kfree(cmd);
1161
1162	return ret;
1163}
1164
1165int wl1271_cmd_set_sta_key(struct wl1271 *wl, struct wl12xx_vif *wlvif,
1166		       u16 action, u8 id, u8 key_type,
1167		       u8 key_size, const u8 *key, const u8 *addr,
1168		       u32 tx_seq_32, u16 tx_seq_16)
1169{
1170	struct wl1271_cmd_set_keys *cmd;
1171	int ret = 0;
1172
1173	/* hlid might have already been deleted */
1174	if (wlvif->sta.hlid == WL12XX_INVALID_LINK_ID)
1175		return 0;
1176
1177	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
1178	if (!cmd) {
1179		ret = -ENOMEM;
1180		goto out;
1181	}
1182
1183	cmd->hlid = wlvif->sta.hlid;
1184
1185	if (key_type == KEY_WEP)
1186		cmd->lid_key_type = WEP_DEFAULT_LID_TYPE;
1187	else if (is_broadcast_ether_addr(addr))
1188		cmd->lid_key_type = BROADCAST_LID_TYPE;
1189	else
1190		cmd->lid_key_type = UNICAST_LID_TYPE;
1191
1192	cmd->key_action = cpu_to_le16(action);
1193	cmd->key_size = key_size;
1194	cmd->key_type = key_type;
1195
1196	cmd->ac_seq_num16[0] = cpu_to_le16(tx_seq_16);
1197	cmd->ac_seq_num32[0] = cpu_to_le32(tx_seq_32);
1198
1199	cmd->key_id = id;
1200
1201	if (key_type == KEY_TKIP) {
1202		/*
1203		 * We get the key in the following form:
1204		 * TKIP (16 bytes) - TX MIC (8 bytes) - RX MIC (8 bytes)
1205		 * but the target is expecting:
1206		 * TKIP - RX MIC - TX MIC
1207		 */
1208		memcpy(cmd->key, key, 16);
1209		memcpy(cmd->key + 16, key + 24, 8);
1210		memcpy(cmd->key + 24, key + 16, 8);
1211
1212	} else {
1213		memcpy(cmd->key, key, key_size);
1214	}
1215
1216	wl1271_dump(DEBUG_CRYPT, "TARGET KEY: ", cmd, sizeof(*cmd));
1217
1218	ret = wl1271_cmd_send(wl, CMD_SET_KEYS, cmd, sizeof(*cmd), 0);
1219	if (ret < 0) {
1220		wl1271_warning("could not set keys");
1221	goto out;
1222	}
1223
1224out:
1225	kfree(cmd);
1226
1227	return ret;
1228}
1229
1230/*
1231 * TODO: merge with sta/ibss into 1 set_key function.
1232 * note there are slight diffs
1233 */
1234int wl1271_cmd_set_ap_key(struct wl1271 *wl, struct wl12xx_vif *wlvif,
1235			  u16 action, u8 id, u8 key_type,
1236			  u8 key_size, const u8 *key, u8 hlid, u32 tx_seq_32,
1237			  u16 tx_seq_16)
1238{
1239	struct wl1271_cmd_set_keys *cmd;
1240	int ret = 0;
1241	u8 lid_type;
1242
1243	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
1244	if (!cmd)
1245		return -ENOMEM;
1246
1247	if (hlid == wlvif->ap.bcast_hlid) {
1248		if (key_type == KEY_WEP)
1249			lid_type = WEP_DEFAULT_LID_TYPE;
1250		else
1251			lid_type = BROADCAST_LID_TYPE;
1252	} else {
1253		lid_type = UNICAST_LID_TYPE;
1254	}
1255
1256	wl1271_debug(DEBUG_CRYPT, "ap key action: %d id: %d lid: %d type: %d"
1257		     " hlid: %d", (int)action, (int)id, (int)lid_type,
1258		     (int)key_type, (int)hlid);
1259
1260	cmd->lid_key_type = lid_type;
1261	cmd->hlid = hlid;
1262	cmd->key_action = cpu_to_le16(action);
1263	cmd->key_size = key_size;
1264	cmd->key_type = key_type;
1265	cmd->key_id = id;
1266	cmd->ac_seq_num16[0] = cpu_to_le16(tx_seq_16);
1267	cmd->ac_seq_num32[0] = cpu_to_le32(tx_seq_32);
1268
1269	if (key_type == KEY_TKIP) {
1270		/*
1271		 * We get the key in the following form:
1272		 * TKIP (16 bytes) - TX MIC (8 bytes) - RX MIC (8 bytes)
1273		 * but the target is expecting:
1274		 * TKIP - RX MIC - TX MIC
1275		 */
1276		memcpy(cmd->key, key, 16);
1277		memcpy(cmd->key + 16, key + 24, 8);
1278		memcpy(cmd->key + 24, key + 16, 8);
1279	} else {
1280		memcpy(cmd->key, key, key_size);
1281	}
1282
1283	wl1271_dump(DEBUG_CRYPT, "TARGET AP KEY: ", cmd, sizeof(*cmd));
1284
1285	ret = wl1271_cmd_send(wl, CMD_SET_KEYS, cmd, sizeof(*cmd), 0);
1286	if (ret < 0) {
1287		wl1271_warning("could not set ap keys");
1288		goto out;
1289	}
1290
1291out:
1292	kfree(cmd);
1293	return ret;
1294}
1295
1296int wl12xx_cmd_set_peer_state(struct wl1271 *wl, u8 hlid)
1297{
1298	struct wl12xx_cmd_set_peer_state *cmd;
1299	int ret = 0;
1300
1301	wl1271_debug(DEBUG_CMD, "cmd set peer state (hlid=%d)", hlid);
1302
1303	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
1304	if (!cmd) {
1305		ret = -ENOMEM;
1306		goto out;
1307	}
1308
1309	cmd->hlid = hlid;
1310	cmd->state = WL1271_CMD_STA_STATE_CONNECTED;
1311
1312	ret = wl1271_cmd_send(wl, CMD_SET_PEER_STATE, cmd, sizeof(*cmd), 0);
1313	if (ret < 0) {
1314		wl1271_error("failed to send set peer state command");
1315		goto out_free;
1316	}
1317
1318out_free:
1319	kfree(cmd);
1320
1321out:
1322	return ret;
1323}
1324
1325int wl12xx_cmd_add_peer(struct wl1271 *wl, struct wl12xx_vif *wlvif,
1326			struct ieee80211_sta *sta, u8 hlid)
1327{
1328	struct wl12xx_cmd_add_peer *cmd;
1329	int i, ret;
1330	u32 sta_rates;
1331
1332	wl1271_debug(DEBUG_CMD, "cmd add peer %d", (int)hlid);
1333
1334	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
1335	if (!cmd) {
1336		ret = -ENOMEM;
1337		goto out;
1338	}
1339
1340	memcpy(cmd->addr, sta->addr, ETH_ALEN);
1341	cmd->bss_index = WL1271_AP_BSS_INDEX;
1342	cmd->aid = sta->aid;
1343	cmd->hlid = hlid;
1344	cmd->sp_len = sta->max_sp;
1345	cmd->wmm = sta->wme ? 1 : 0;
1346
1347	for (i = 0; i < NUM_ACCESS_CATEGORIES_COPY; i++)
1348		if (sta->wme && (sta->uapsd_queues & BIT(i)))
1349			cmd->psd_type[i] = WL1271_PSD_UPSD_TRIGGER;
1350		else
1351			cmd->psd_type[i] = WL1271_PSD_LEGACY;
1352
1353	sta_rates = sta->supp_rates[wlvif->band];
1354	if (sta->ht_cap.ht_supported)
1355		sta_rates |= sta->ht_cap.mcs.rx_mask[0] << HW_HT_RATES_OFFSET;
1356
1357	cmd->supported_rates =
1358		cpu_to_le32(wl1271_tx_enabled_rates_get(wl, sta_rates,
1359							wlvif->band));
1360
1361	wl1271_debug(DEBUG_CMD, "new peer rates=0x%x queues=0x%x",
1362		     cmd->supported_rates, sta->uapsd_queues);
1363
1364	ret = wl1271_cmd_send(wl, CMD_ADD_PEER, cmd, sizeof(*cmd), 0);
1365	if (ret < 0) {
1366		wl1271_error("failed to initiate cmd add peer");
1367		goto out_free;
1368	}
1369
1370out_free:
1371	kfree(cmd);
1372
1373out:
1374	return ret;
1375}
1376
1377int wl12xx_cmd_remove_peer(struct wl1271 *wl, u8 hlid)
1378{
1379	struct wl12xx_cmd_remove_peer *cmd;
1380	int ret;
1381
1382	wl1271_debug(DEBUG_CMD, "cmd remove peer %d", (int)hlid);
1383
1384	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
1385	if (!cmd) {
1386		ret = -ENOMEM;
1387		goto out;
1388	}
1389
1390	cmd->hlid = hlid;
1391	/* We never send a deauth, mac80211 is in charge of this */
1392	cmd->reason_opcode = 0;
1393	cmd->send_deauth_flag = 0;
1394
1395	ret = wl1271_cmd_send(wl, CMD_REMOVE_PEER, cmd, sizeof(*cmd), 0);
1396	if (ret < 0) {
1397		wl1271_error("failed to initiate cmd remove peer");
1398		goto out_free;
1399	}
1400
1401	/*
1402	 * We are ok with a timeout here. The event is sometimes not sent
1403	 * due to a firmware bug.
1404	 */
1405	wl1271_cmd_wait_for_event_or_timeout(wl,
1406					     PEER_REMOVE_COMPLETE_EVENT_ID);
1407
1408out_free:
1409	kfree(cmd);
1410
1411out:
1412	return ret;
1413}
1414
1415int wl12xx_cmd_config_fwlog(struct wl1271 *wl)
1416{
1417	struct wl12xx_cmd_config_fwlog *cmd;
1418	int ret = 0;
1419
1420	wl1271_debug(DEBUG_CMD, "cmd config firmware logger");
1421
1422	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
1423	if (!cmd) {
1424		ret = -ENOMEM;
1425		goto out;
1426	}
1427
1428	cmd->logger_mode = wl->conf.fwlog.mode;
1429	cmd->log_severity = wl->conf.fwlog.severity;
1430	cmd->timestamp = wl->conf.fwlog.timestamp;
1431	cmd->output = wl->conf.fwlog.output;
1432	cmd->threshold = wl->conf.fwlog.threshold;
1433
1434	ret = wl1271_cmd_send(wl, CMD_CONFIG_FWLOGGER, cmd, sizeof(*cmd), 0);
1435	if (ret < 0) {
1436		wl1271_error("failed to send config firmware logger command");
1437		goto out_free;
1438	}
1439
1440out_free:
1441	kfree(cmd);
1442
1443out:
1444	return ret;
1445}
1446
1447int wl12xx_cmd_start_fwlog(struct wl1271 *wl)
1448{
1449	struct wl12xx_cmd_start_fwlog *cmd;
1450	int ret = 0;
1451
1452	wl1271_debug(DEBUG_CMD, "cmd start firmware logger");
1453
1454	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
1455	if (!cmd) {
1456		ret = -ENOMEM;
1457		goto out;
1458	}
1459
1460	ret = wl1271_cmd_send(wl, CMD_START_FWLOGGER, cmd, sizeof(*cmd), 0);
1461	if (ret < 0) {
1462		wl1271_error("failed to send start firmware logger command");
1463		goto out_free;
1464	}
1465
1466out_free:
1467	kfree(cmd);
1468
1469out:
1470	return ret;
1471}
1472
1473int wl12xx_cmd_stop_fwlog(struct wl1271 *wl)
1474{
1475	struct wl12xx_cmd_stop_fwlog *cmd;
1476	int ret = 0;
1477
1478	wl1271_debug(DEBUG_CMD, "cmd stop firmware logger");
1479
1480	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
1481	if (!cmd) {
1482		ret = -ENOMEM;
1483		goto out;
1484	}
1485
1486	ret = wl1271_cmd_send(wl, CMD_STOP_FWLOGGER, cmd, sizeof(*cmd), 0);
1487	if (ret < 0) {
1488		wl1271_error("failed to send stop firmware logger command");
1489		goto out_free;
1490	}
1491
1492out_free:
1493	kfree(cmd);
1494
1495out:
1496	return ret;
1497}
1498
1499static int wl12xx_cmd_roc(struct wl1271 *wl, struct wl12xx_vif *wlvif,
1500			  u8 role_id)
1501{
1502	struct wl12xx_cmd_roc *cmd;
1503	int ret = 0;
1504
1505	wl1271_debug(DEBUG_CMD, "cmd roc %d (%d)", wlvif->channel, role_id);
1506
1507	if (WARN_ON(role_id == WL12XX_INVALID_ROLE_ID))
1508		return -EINVAL;
1509
1510	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
1511	if (!cmd) {
1512		ret = -ENOMEM;
1513		goto out;
1514	}
1515
1516	cmd->role_id = role_id;
1517	cmd->channel = wlvif->channel;
1518	switch (wlvif->band) {
1519	case IEEE80211_BAND_2GHZ:
1520		cmd->band = WLCORE_BAND_2_4GHZ;
1521		break;
1522	case IEEE80211_BAND_5GHZ:
1523		cmd->band = WLCORE_BAND_5GHZ;
1524		break;
1525	default:
1526		wl1271_error("roc - unknown band: %d", (int)wlvif->band);
1527		ret = -EINVAL;
1528		goto out_free;
1529	}
1530
1531
1532	ret = wl1271_cmd_send(wl, CMD_REMAIN_ON_CHANNEL, cmd, sizeof(*cmd), 0);
1533	if (ret < 0) {
1534		wl1271_error("failed to send ROC command");
1535		goto out_free;
1536	}
1537
1538out_free:
1539	kfree(cmd);
1540
1541out:
1542	return ret;
1543}
1544
1545static int wl12xx_cmd_croc(struct wl1271 *wl, u8 role_id)
1546{
1547	struct wl12xx_cmd_croc *cmd;
1548	int ret = 0;
1549
1550	wl1271_debug(DEBUG_CMD, "cmd croc (%d)", role_id);
1551
1552	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
1553	if (!cmd) {
1554		ret = -ENOMEM;
1555		goto out;
1556	}
1557	cmd->role_id = role_id;
1558
1559	ret = wl1271_cmd_send(wl, CMD_CANCEL_REMAIN_ON_CHANNEL, cmd,
1560			      sizeof(*cmd), 0);
1561	if (ret < 0) {
1562		wl1271_error("failed to send ROC command");
1563		goto out_free;
1564	}
1565
1566out_free:
1567	kfree(cmd);
1568
1569out:
1570	return ret;
1571}
1572
1573int wl12xx_roc(struct wl1271 *wl, struct wl12xx_vif *wlvif, u8 role_id)
1574{
1575	int ret = 0;
1576
1577	if (WARN_ON(test_bit(role_id, wl->roc_map)))
1578		return 0;
1579
1580	ret = wl12xx_cmd_roc(wl, wlvif, role_id);
1581	if (ret < 0)
1582		goto out;
1583
1584	ret = wl1271_cmd_wait_for_event(wl,
1585					REMAIN_ON_CHANNEL_COMPLETE_EVENT_ID);
1586	if (ret < 0) {
1587		wl1271_error("cmd roc event completion error");
1588		goto out;
1589	}
1590
1591	__set_bit(role_id, wl->roc_map);
1592out:
1593	return ret;
1594}
1595
1596int wl12xx_croc(struct wl1271 *wl, u8 role_id)
1597{
1598	int ret = 0;
1599
1600	if (WARN_ON(!test_bit(role_id, wl->roc_map)))
1601		return 0;
1602
1603	ret = wl12xx_cmd_croc(wl, role_id);
1604	if (ret < 0)
1605		goto out;
1606
1607	__clear_bit(role_id, wl->roc_map);
1608
1609	/*
1610	 * Rearm the tx watchdog when removing the last ROC. This prevents
1611	 * recoveries due to just finished ROCs - when Tx hasn't yet had
1612	 * a chance to get out.
1613	 */
1614	if (find_first_bit(wl->roc_map, WL12XX_MAX_ROLES) >= WL12XX_MAX_ROLES)
1615		wl12xx_rearm_tx_watchdog_locked(wl);
1616out:
1617	return ret;
1618}
1619
1620int wl12xx_cmd_channel_switch(struct wl1271 *wl,
1621			      struct wl12xx_vif *wlvif,
1622			      struct ieee80211_channel_switch *ch_switch)
1623{
1624	struct wl12xx_cmd_channel_switch *cmd;
1625	int ret;
1626
1627	wl1271_debug(DEBUG_ACX, "cmd channel switch");
1628
1629	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
1630	if (!cmd) {
1631		ret = -ENOMEM;
1632		goto out;
1633	}
1634
1635	cmd->role_id = wlvif->role_id;
1636	cmd->channel = ch_switch->channel->hw_value;
1637	cmd->switch_time = ch_switch->count;
1638	cmd->stop_tx = ch_switch->block_tx;
1639
1640	/* FIXME: control from mac80211 in the future */
1641	cmd->post_switch_tx_disable = 0;  /* Enable TX on the target channel */
1642
1643	ret = wl1271_cmd_send(wl, CMD_CHANNEL_SWITCH, cmd, sizeof(*cmd), 0);
1644	if (ret < 0) {
1645		wl1271_error("failed to send channel switch command");
1646		goto out_free;
1647	}
1648
1649out_free:
1650	kfree(cmd);
1651
1652out:
1653	return ret;
1654}
1655
1656int wl12xx_cmd_stop_channel_switch(struct wl1271 *wl)
1657{
1658	struct wl12xx_cmd_stop_channel_switch *cmd;
1659	int ret;
1660
1661	wl1271_debug(DEBUG_ACX, "cmd stop channel switch");
1662
1663	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
1664	if (!cmd) {
1665		ret = -ENOMEM;
1666		goto out;
1667	}
1668
1669	ret = wl1271_cmd_send(wl, CMD_STOP_CHANNEL_SWICTH, cmd, sizeof(*cmd), 0);
1670	if (ret < 0) {
1671		wl1271_error("failed to stop channel switch command");
1672		goto out_free;
1673	}
1674
1675out_free:
1676	kfree(cmd);
1677
1678out:
1679	return ret;
1680}
1681
1682/* start dev role and roc on its channel */
1683int wl12xx_start_dev(struct wl1271 *wl, struct wl12xx_vif *wlvif)
1684{
1685	int ret;
1686
1687	if (WARN_ON(!(wlvif->bss_type == BSS_TYPE_STA_BSS ||
1688		      wlvif->bss_type == BSS_TYPE_IBSS)))
1689		return -EINVAL;
1690
1691	ret = wl12xx_cmd_role_start_dev(wl, wlvif);
1692	if (ret < 0)
1693		goto out;
1694
1695	ret = wl12xx_roc(wl, wlvif, wlvif->dev_role_id);
1696	if (ret < 0)
1697		goto out_stop;
1698
1699	return 0;
1700
1701out_stop:
1702	wl12xx_cmd_role_stop_dev(wl, wlvif);
1703out:
1704	return ret;
1705}
1706
1707/* croc dev hlid, and stop the role */
1708int wl12xx_stop_dev(struct wl1271 *wl, struct wl12xx_vif *wlvif)
1709{
1710	int ret;
1711
1712	if (WARN_ON(!(wlvif->bss_type == BSS_TYPE_STA_BSS ||
1713		      wlvif->bss_type == BSS_TYPE_IBSS)))
1714		return -EINVAL;
1715
1716	/* flush all pending packets */
1717	wl1271_tx_work_locked(wl);
1718
1719	if (test_bit(wlvif->dev_role_id, wl->roc_map)) {
1720		ret = wl12xx_croc(wl, wlvif->dev_role_id);
1721		if (ret < 0)
1722			goto out;
1723	}
1724
1725	ret = wl12xx_cmd_role_stop_dev(wl, wlvif);
1726	if (ret < 0)
1727		goto out;
1728out:
1729	return ret;
1730}
1731