94
96
status = le16_to_cpu(cmd->status);
95
97
if (status != CMD_STATUS_SUCCESS) {
96
98
wl1271_error("command execute failure %d", status);
97
ieee80211_queue_work(wl->hw, &wl->recovery_work);
101
103
wl1271_write32(wl, ACX_REG_INTERRUPT_ACK,
102
104
WL1271_ACX_INTR_CMD_COMPLETE);
109
ieee80211_queue_work(wl->hw, &wl->recovery_work);
108
113
int wl1271_cmd_general_parms(struct wl1271 *wl)
110
115
struct wl1271_general_parms_cmd *gen_parms;
111
struct wl1271_ini_general_params *gp = &wl->nvs->general_params;
118
gen_parms = kzalloc(sizeof(*gen_parms), GFP_KERNEL);
122
gen_parms->test.id = TEST_CMD_INI_FILE_GENERAL_PARAM;
124
memcpy(&gen_parms->general_params, gp, sizeof(*gp));
126
if (gp->tx_bip_fem_auto_detect)
116
struct wl1271_ini_general_params *gp =
117
&((struct wl1271_nvs_file *)wl->nvs)->general_params;
124
gen_parms = kzalloc(sizeof(*gen_parms), GFP_KERNEL);
128
gen_parms->test.id = TEST_CMD_INI_FILE_GENERAL_PARAM;
130
memcpy(&gen_parms->general_params, gp, sizeof(*gp));
132
if (gp->tx_bip_fem_auto_detect)
135
/* Override the REF CLK from the NVS with the one from platform data */
136
gen_parms->general_params.ref_clock = wl->ref_clock;
138
ret = wl1271_cmd_test(wl, gen_parms, sizeof(*gen_parms), answer);
140
wl1271_warning("CMD_INI_FILE_GENERAL_PARAM failed");
144
gp->tx_bip_fem_manufacturer =
145
gen_parms->general_params.tx_bip_fem_manufacturer;
147
wl1271_debug(DEBUG_CMD, "FEM autodetect: %s, manufacturer: %d\n",
148
answer ? "auto" : "manual", gp->tx_bip_fem_manufacturer);
155
int wl128x_cmd_general_parms(struct wl1271 *wl)
157
struct wl128x_general_parms_cmd *gen_parms;
158
struct wl128x_ini_general_params *gp =
159
&((struct wl128x_nvs_file *)wl->nvs)->general_params;
166
gen_parms = kzalloc(sizeof(*gen_parms), GFP_KERNEL);
170
gen_parms->test.id = TEST_CMD_INI_FILE_GENERAL_PARAM;
172
memcpy(&gen_parms->general_params, gp, sizeof(*gp));
174
if (gp->tx_bip_fem_auto_detect)
177
/* Replace REF and TCXO CLKs with the ones from platform data */
178
gen_parms->general_params.ref_clock = wl->ref_clock;
179
gen_parms->general_params.tcxo_ref_clock = wl->tcxo_clock;
129
181
ret = wl1271_cmd_test(wl, gen_parms, sizeof(*gen_parms), answer);
159
212
radio_parms->test.id = TEST_CMD_INI_FILE_RADIO_PARAM;
161
214
/* 2.4GHz parameters */
162
memcpy(&radio_parms->static_params_2, &wl->nvs->stat_radio_params_2,
215
memcpy(&radio_parms->static_params_2, &nvs->stat_radio_params_2,
163
216
sizeof(struct wl1271_ini_band_params_2));
164
217
memcpy(&radio_parms->dyn_params_2,
165
&wl->nvs->dyn_radio_params_2[gp->tx_bip_fem_manufacturer].params,
218
&nvs->dyn_radio_params_2[gp->tx_bip_fem_manufacturer].params,
166
219
sizeof(struct wl1271_ini_fem_params_2));
168
221
/* 5GHz parameters */
169
222
memcpy(&radio_parms->static_params_5,
170
&wl->nvs->stat_radio_params_5,
223
&nvs->stat_radio_params_5,
171
224
sizeof(struct wl1271_ini_band_params_5));
172
225
memcpy(&radio_parms->dyn_params_5,
173
&wl->nvs->dyn_radio_params_5[gp->tx_bip_fem_manufacturer].params,
226
&nvs->dyn_radio_params_5[gp->tx_bip_fem_manufacturer].params,
174
227
sizeof(struct wl1271_ini_fem_params_5));
176
229
wl1271_dump(DEBUG_CMD, "TEST_CMD_INI_FILE_RADIO_PARAM: ",
240
int wl128x_cmd_radio_parms(struct wl1271 *wl)
242
struct wl128x_nvs_file *nvs = (struct wl128x_nvs_file *)wl->nvs;
243
struct wl128x_radio_parms_cmd *radio_parms;
244
struct wl128x_ini_general_params *gp = &nvs->general_params;
250
radio_parms = kzalloc(sizeof(*radio_parms), GFP_KERNEL);
254
radio_parms->test.id = TEST_CMD_INI_FILE_RADIO_PARAM;
256
/* 2.4GHz parameters */
257
memcpy(&radio_parms->static_params_2, &nvs->stat_radio_params_2,
258
sizeof(struct wl128x_ini_band_params_2));
259
memcpy(&radio_parms->dyn_params_2,
260
&nvs->dyn_radio_params_2[gp->tx_bip_fem_manufacturer].params,
261
sizeof(struct wl128x_ini_fem_params_2));
263
/* 5GHz parameters */
264
memcpy(&radio_parms->static_params_5,
265
&nvs->stat_radio_params_5,
266
sizeof(struct wl128x_ini_band_params_5));
267
memcpy(&radio_parms->dyn_params_5,
268
&nvs->dyn_radio_params_5[gp->tx_bip_fem_manufacturer].params,
269
sizeof(struct wl128x_ini_fem_params_5));
271
radio_parms->fem_vendor_and_options = nvs->fem_vendor_and_options;
273
wl1271_dump(DEBUG_CMD, "TEST_CMD_INI_FILE_RADIO_PARAM: ",
274
radio_parms, sizeof(*radio_parms));
276
ret = wl1271_cmd_test(wl, radio_parms, sizeof(*radio_parms), 0);
278
wl1271_warning("CMD_INI_FILE_RADIO_PARAM failed");
187
284
int wl1271_cmd_ext_radio_parms(struct wl1271 *wl)
189
286
struct wl1271_ext_radio_parms_cmd *ext_radio_parms;
661
772
memcpy(tmpl.llc_hdr, rfc1042_header, sizeof(rfc1042_header));
662
tmpl.llc_type = htons(ETH_P_ARP);
773
tmpl.llc_type = cpu_to_be16(ETH_P_ARP);
665
776
arp_hdr = &tmpl.arp_hdr;
666
arp_hdr->ar_hrd = htons(ARPHRD_ETHER);
667
arp_hdr->ar_pro = htons(ETH_P_IP);
777
arp_hdr->ar_hrd = cpu_to_be16(ARPHRD_ETHER);
778
arp_hdr->ar_pro = cpu_to_be16(ETH_P_IP);
668
779
arp_hdr->ar_hln = ETH_ALEN;
669
780
arp_hdr->ar_pln = 4;
670
arp_hdr->ar_op = htons(ARPOP_REPLY);
781
arp_hdr->ar_op = cpu_to_be16(ARPOP_REPLY);
672
783
/* arp payload */
673
784
memcpy(tmpl.sender_hw, wl->vif->addr, ETH_ALEN);
734
int wl1271_cmd_set_key(struct wl1271 *wl, u16 action, u8 id, u8 key_type,
845
int wl1271_cmd_set_ap_default_wep_key(struct wl1271 *wl, u8 id)
847
struct wl1271_cmd_set_ap_keys *cmd;
850
wl1271_debug(DEBUG_CMD, "cmd set_ap_default_wep_key %d", id);
852
cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
858
cmd->hlid = WL1271_AP_BROADCAST_HLID;
860
cmd->lid_key_type = WEP_DEFAULT_LID_TYPE;
861
cmd->key_action = cpu_to_le16(KEY_SET_ID);
862
cmd->key_type = KEY_WEP;
864
ret = wl1271_cmd_send(wl, CMD_SET_KEYS, cmd, sizeof(*cmd), 0);
866
wl1271_warning("cmd set_ap_default_wep_key failed: %d", ret);
876
int wl1271_cmd_set_sta_key(struct wl1271 *wl, u16 action, u8 id, u8 key_type,
735
877
u8 key_size, const u8 *key, const u8 *addr,
736
878
u32 tx_seq_32, u16 tx_seq_16)
738
struct wl1271_cmd_set_keys *cmd;
880
struct wl1271_cmd_set_sta_keys *cmd;
741
883
cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
933
int wl1271_cmd_set_ap_key(struct wl1271 *wl, u16 action, u8 id, u8 key_type,
934
u8 key_size, const u8 *key, u8 hlid, u32 tx_seq_32,
937
struct wl1271_cmd_set_ap_keys *cmd;
941
cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
945
if (hlid == WL1271_AP_BROADCAST_HLID) {
946
if (key_type == KEY_WEP)
947
lid_type = WEP_DEFAULT_LID_TYPE;
949
lid_type = BROADCAST_LID_TYPE;
951
lid_type = UNICAST_LID_TYPE;
954
wl1271_debug(DEBUG_CRYPT, "ap key action: %d id: %d lid: %d type: %d"
955
" hlid: %d", (int)action, (int)id, (int)lid_type,
956
(int)key_type, (int)hlid);
958
cmd->lid_key_type = lid_type;
960
cmd->key_action = cpu_to_le16(action);
961
cmd->key_size = key_size;
962
cmd->key_type = key_type;
964
cmd->ac_seq_num16[0] = cpu_to_le16(tx_seq_16);
965
cmd->ac_seq_num32[0] = cpu_to_le32(tx_seq_32);
967
if (key_type == KEY_TKIP) {
969
* We get the key in the following form:
970
* TKIP (16 bytes) - TX MIC (8 bytes) - RX MIC (8 bytes)
971
* but the target is expecting:
972
* TKIP - RX MIC - TX MIC
974
memcpy(cmd->key, key, 16);
975
memcpy(cmd->key + 16, key + 24, 8);
976
memcpy(cmd->key + 24, key + 16, 8);
978
memcpy(cmd->key, key, key_size);
981
wl1271_dump(DEBUG_CRYPT, "TARGET AP KEY: ", cmd, sizeof(*cmd));
983
ret = wl1271_cmd_send(wl, CMD_SET_KEYS, cmd, sizeof(*cmd), 0);
985
wl1271_warning("could not set ap keys");
791
994
int wl1271_cmd_disconnect(struct wl1271 *wl)
793
996
struct wl1271_cmd_disconnect *cmd;
1057
int wl1271_cmd_start_bss(struct wl1271 *wl)
1059
struct wl1271_cmd_bss_start *cmd;
1060
struct ieee80211_bss_conf *bss_conf = &wl->vif->bss_conf;
1063
wl1271_debug(DEBUG_CMD, "cmd start bss");
1066
* FIXME: We currently do not support hidden SSID. The real SSID
1067
* should be fetched from mac80211 first.
1069
if (wl->ssid_len == 0) {
1070
wl1271_warning("Hidden SSID currently not supported for AP");
1075
cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
1081
memcpy(cmd->bssid, bss_conf->bssid, ETH_ALEN);
1083
cmd->aging_period = cpu_to_le16(WL1271_AP_DEF_INACTIV_SEC);
1084
cmd->bss_index = WL1271_AP_BSS_INDEX;
1085
cmd->global_hlid = WL1271_AP_GLOBAL_HLID;
1086
cmd->broadcast_hlid = WL1271_AP_BROADCAST_HLID;
1087
cmd->basic_rate_set = cpu_to_le32(wl->basic_rate_set);
1088
cmd->beacon_interval = cpu_to_le16(wl->beacon_int);
1089
cmd->dtim_interval = bss_conf->dtim_period;
1090
cmd->beacon_expiry = WL1271_AP_DEF_BEACON_EXP;
1091
cmd->channel = wl->channel;
1092
cmd->ssid_len = wl->ssid_len;
1093
cmd->ssid_type = SSID_TYPE_PUBLIC;
1094
memcpy(cmd->ssid, wl->ssid, wl->ssid_len);
1097
case IEEE80211_BAND_2GHZ:
1098
cmd->band = RADIO_BAND_2_4GHZ;
1100
case IEEE80211_BAND_5GHZ:
1101
cmd->band = RADIO_BAND_5GHZ;
1104
wl1271_warning("bss start - unknown band: %d", (int)wl->band);
1105
cmd->band = RADIO_BAND_2_4GHZ;
1109
ret = wl1271_cmd_send(wl, CMD_BSS_START, cmd, sizeof(*cmd), 0);
1111
wl1271_error("failed to initiate cmd start bss");
1122
int wl1271_cmd_stop_bss(struct wl1271 *wl)
1124
struct wl1271_cmd_bss_start *cmd;
1127
wl1271_debug(DEBUG_CMD, "cmd stop bss");
1129
cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
1135
cmd->bss_index = WL1271_AP_BSS_INDEX;
1137
ret = wl1271_cmd_send(wl, CMD_BSS_STOP, cmd, sizeof(*cmd), 0);
1139
wl1271_error("failed to initiate cmd stop bss");
1150
int wl1271_cmd_add_sta(struct wl1271 *wl, struct ieee80211_sta *sta, u8 hlid)
1152
struct wl1271_cmd_add_sta *cmd;
1155
wl1271_debug(DEBUG_CMD, "cmd add sta %d", (int)hlid);
1157
cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
1163
/* currently we don't support UAPSD */
1166
memcpy(cmd->addr, sta->addr, ETH_ALEN);
1167
cmd->bss_index = WL1271_AP_BSS_INDEX;
1168
cmd->aid = sta->aid;
1172
* FIXME: Does STA support QOS? We need to propagate this info from
1173
* hostapd. Currently not that important since this is only used for
1174
* sending the correct flavor of null-data packet in response to a
1179
cmd->supported_rates = cpu_to_le32(wl1271_tx_enabled_rates_get(wl,
1180
sta->supp_rates[wl->band]));
1182
wl1271_debug(DEBUG_CMD, "new sta rates: 0x%x", cmd->supported_rates);
1184
ret = wl1271_cmd_send(wl, CMD_ADD_STA, cmd, sizeof(*cmd), 0);
1186
wl1271_error("failed to initiate cmd add sta");
1197
int wl1271_cmd_remove_sta(struct wl1271 *wl, u8 hlid)
1199
struct wl1271_cmd_remove_sta *cmd;
1202
wl1271_debug(DEBUG_CMD, "cmd remove sta %d", (int)hlid);
1204
cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
1211
/* We never send a deauth, mac80211 is in charge of this */
1212
cmd->reason_opcode = 0;
1213
cmd->send_deauth_flag = 0;
1215
ret = wl1271_cmd_send(wl, CMD_REMOVE_STA, cmd, sizeof(*cmd), 0);
1217
wl1271_error("failed to initiate cmd remove sta");
1222
* We are ok with a timeout here. The event is sometimes not sent
1223
* due to a firmware bug.
1225
wl1271_cmd_wait_for_event_or_timeout(wl, STA_REMOVE_COMPLETE_EVENT_ID);