blob: e038e3e449717ea4f7219601a1d3ac1d6a0fbfdc [file] [log] [blame]
Kalle Valo5e3dd152013-06-12 20:52:10 +03001/*
2 * Copyright (c) 2005-2011 Atheros Communications Inc.
3 * Copyright (c) 2011-2013 Qualcomm Atheros, Inc.
4 *
5 * Permission to use, copy, modify, and/or distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18#include <linux/module.h>
19#include <linux/firmware.h>
Toshi Kikuchi5aabff02014-12-02 10:55:54 +020020#include <linux/of.h>
Kalle Valo5e3dd152013-06-12 20:52:10 +030021
22#include "core.h"
23#include "mac.h"
24#include "htc.h"
25#include "hif.h"
26#include "wmi.h"
27#include "bmi.h"
28#include "debug.h"
29#include "htt.h"
Kalle Valo43d2a302014-09-10 18:23:30 +030030#include "testmode.h"
Kalle Valo5e3dd152013-06-12 20:52:10 +030031
32unsigned int ath10k_debug_mask;
33static bool uart_print;
34static unsigned int ath10k_p2p;
Rajkumar Manoharan8868b122014-11-17 16:44:14 +020035static bool skip_otp;
36
Kalle Valo5e3dd152013-06-12 20:52:10 +030037module_param_named(debug_mask, ath10k_debug_mask, uint, 0644);
38module_param(uart_print, bool, 0644);
39module_param_named(p2p, ath10k_p2p, uint, 0644);
Rajkumar Manoharan8868b122014-11-17 16:44:14 +020040module_param(skip_otp, bool, 0644);
41
Kalle Valo5e3dd152013-06-12 20:52:10 +030042MODULE_PARM_DESC(debug_mask, "Debugging mask");
43MODULE_PARM_DESC(uart_print, "Uart target debugging");
44MODULE_PARM_DESC(p2p, "Enable ath10k P2P support");
Rajkumar Manoharan8868b122014-11-17 16:44:14 +020045MODULE_PARM_DESC(skip_otp, "Skip otp failure for calibration in testmode");
Kalle Valo5e3dd152013-06-12 20:52:10 +030046
47static const struct ath10k_hw_params ath10k_hw_params_list[] = {
48 {
Kalle Valo5e3dd152013-06-12 20:52:10 +030049 .id = QCA988X_HW_2_0_VERSION,
50 .name = "qca988x hw2.0",
51 .patch_load_addr = QCA988X_HW_2_0_PATCH_LOAD_ADDR,
52 .fw = {
53 .dir = QCA988X_HW_2_0_FW_DIR,
54 .fw = QCA988X_HW_2_0_FW_FILE,
55 .otp = QCA988X_HW_2_0_OTP_FILE,
56 .board = QCA988X_HW_2_0_BOARD_DATA_FILE,
Michal Kazior9764a2a2014-12-02 10:55:54 +020057 .board_size = QCA988X_BOARD_DATA_SZ,
58 .board_ext_size = QCA988X_BOARD_EXT_DATA_SZ,
Kalle Valo5e3dd152013-06-12 20:52:10 +030059 },
60 },
61};
62
63static void ath10k_send_suspend_complete(struct ath10k *ar)
64{
Michal Kazior7aa7a722014-08-25 12:09:38 +020065 ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot suspend complete\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +030066
Marek Puzyniak9042e172014-02-10 17:14:23 +010067 complete(&ar->target_suspend);
Kalle Valo5e3dd152013-06-12 20:52:10 +030068}
69
Kalle Valo5e3dd152013-06-12 20:52:10 +030070static int ath10k_init_configure_target(struct ath10k *ar)
71{
72 u32 param_host;
73 int ret;
74
75 /* tell target which HTC version it is used*/
76 ret = ath10k_bmi_write32(ar, hi_app_host_interest,
77 HTC_PROTOCOL_VERSION);
78 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +020079 ath10k_err(ar, "settings HTC version failed\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +030080 return ret;
81 }
82
83 /* set the firmware mode to STA/IBSS/AP */
84 ret = ath10k_bmi_read32(ar, hi_option_flag, &param_host);
85 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +020086 ath10k_err(ar, "setting firmware mode (1/2) failed\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +030087 return ret;
88 }
89
90 /* TODO following parameters need to be re-visited. */
91 /* num_device */
92 param_host |= (1 << HI_OPTION_NUM_DEV_SHIFT);
93 /* Firmware mode */
94 /* FIXME: Why FW_MODE_AP ??.*/
95 param_host |= (HI_OPTION_FW_MODE_AP << HI_OPTION_FW_MODE_SHIFT);
96 /* mac_addr_method */
97 param_host |= (1 << HI_OPTION_MAC_ADDR_METHOD_SHIFT);
98 /* firmware_bridge */
99 param_host |= (0 << HI_OPTION_FW_BRIDGE_SHIFT);
100 /* fwsubmode */
101 param_host |= (0 << HI_OPTION_FW_SUBMODE_SHIFT);
102
103 ret = ath10k_bmi_write32(ar, hi_option_flag, param_host);
104 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200105 ath10k_err(ar, "setting firmware mode (2/2) failed\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +0300106 return ret;
107 }
108
109 /* We do all byte-swapping on the host */
110 ret = ath10k_bmi_write32(ar, hi_be, 0);
111 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200112 ath10k_err(ar, "setting host CPU BE mode failed\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +0300113 return ret;
114 }
115
116 /* FW descriptor/Data swap flags */
117 ret = ath10k_bmi_write32(ar, hi_fw_swap, 0);
118
119 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200120 ath10k_err(ar, "setting FW data/desc swap flags failed\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +0300121 return ret;
122 }
123
124 return 0;
125}
126
127static const struct firmware *ath10k_fetch_fw_file(struct ath10k *ar,
128 const char *dir,
129 const char *file)
130{
131 char filename[100];
132 const struct firmware *fw;
133 int ret;
134
135 if (file == NULL)
136 return ERR_PTR(-ENOENT);
137
138 if (dir == NULL)
139 dir = ".";
140
141 snprintf(filename, sizeof(filename), "%s/%s", dir, file);
142 ret = request_firmware(&fw, filename, ar->dev);
143 if (ret)
144 return ERR_PTR(ret);
145
146 return fw;
147}
148
Kalle Valoa58227e2014-10-13 09:40:59 +0300149static int ath10k_push_board_ext_data(struct ath10k *ar, const void *data,
150 size_t data_len)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300151{
Michal Kazior9764a2a2014-12-02 10:55:54 +0200152 u32 board_data_size = ar->hw_params.fw.board_size;
153 u32 board_ext_data_size = ar->hw_params.fw.board_ext_size;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300154 u32 board_ext_data_addr;
155 int ret;
156
157 ret = ath10k_bmi_read32(ar, hi_board_ext_data, &board_ext_data_addr);
158 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200159 ath10k_err(ar, "could not read board ext data addr (%d)\n",
160 ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300161 return ret;
162 }
163
Michal Kazior7aa7a722014-08-25 12:09:38 +0200164 ath10k_dbg(ar, ATH10K_DBG_BOOT,
Kalle Valoeffea962013-09-08 17:55:44 +0300165 "boot push board extended data addr 0x%x\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300166 board_ext_data_addr);
167
168 if (board_ext_data_addr == 0)
169 return 0;
170
Kalle Valoa58227e2014-10-13 09:40:59 +0300171 if (data_len != (board_data_size + board_ext_data_size)) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200172 ath10k_err(ar, "invalid board (ext) data sizes %zu != %d+%d\n",
Kalle Valoa58227e2014-10-13 09:40:59 +0300173 data_len, board_data_size, board_ext_data_size);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300174 return -EINVAL;
175 }
176
177 ret = ath10k_bmi_write_memory(ar, board_ext_data_addr,
Kalle Valoa58227e2014-10-13 09:40:59 +0300178 data + board_data_size,
Kalle Valo5e3dd152013-06-12 20:52:10 +0300179 board_ext_data_size);
180 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200181 ath10k_err(ar, "could not write board ext data (%d)\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300182 return ret;
183 }
184
185 ret = ath10k_bmi_write32(ar, hi_board_ext_data_config,
186 (board_ext_data_size << 16) | 1);
187 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200188 ath10k_err(ar, "could not write board ext data bit (%d)\n",
189 ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300190 return ret;
191 }
192
193 return 0;
194}
195
Kalle Valoa58227e2014-10-13 09:40:59 +0300196static int ath10k_download_board_data(struct ath10k *ar, const void *data,
197 size_t data_len)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300198{
Michal Kazior9764a2a2014-12-02 10:55:54 +0200199 u32 board_data_size = ar->hw_params.fw.board_size;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300200 u32 address;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300201 int ret;
202
Kalle Valoa58227e2014-10-13 09:40:59 +0300203 ret = ath10k_push_board_ext_data(ar, data, data_len);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300204 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200205 ath10k_err(ar, "could not push board ext data (%d)\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300206 goto exit;
207 }
208
209 ret = ath10k_bmi_read32(ar, hi_board_data, &address);
210 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200211 ath10k_err(ar, "could not read board data addr (%d)\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300212 goto exit;
213 }
214
Kalle Valoa58227e2014-10-13 09:40:59 +0300215 ret = ath10k_bmi_write_memory(ar, address, data,
Kalle Valo958df3a2013-09-27 19:55:01 +0300216 min_t(u32, board_data_size,
Kalle Valoa58227e2014-10-13 09:40:59 +0300217 data_len));
Kalle Valo5e3dd152013-06-12 20:52:10 +0300218 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200219 ath10k_err(ar, "could not write board data (%d)\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300220 goto exit;
221 }
222
223 ret = ath10k_bmi_write32(ar, hi_board_data_initialized, 1);
224 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200225 ath10k_err(ar, "could not write board data bit (%d)\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300226 goto exit;
227 }
228
229exit:
Kalle Valo5e3dd152013-06-12 20:52:10 +0300230 return ret;
231}
232
Kalle Valoa58227e2014-10-13 09:40:59 +0300233static int ath10k_download_cal_file(struct ath10k *ar)
234{
235 int ret;
236
237 if (!ar->cal_file)
238 return -ENOENT;
239
240 if (IS_ERR(ar->cal_file))
241 return PTR_ERR(ar->cal_file);
242
243 ret = ath10k_download_board_data(ar, ar->cal_file->data,
244 ar->cal_file->size);
245 if (ret) {
246 ath10k_err(ar, "failed to download cal_file data: %d\n", ret);
247 return ret;
248 }
249
250 ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot cal file downloaded\n");
251
252 return 0;
253}
254
Toshi Kikuchi5aabff02014-12-02 10:55:54 +0200255static int ath10k_download_cal_dt(struct ath10k *ar)
256{
257 struct device_node *node;
258 int data_len;
259 void *data;
260 int ret;
261
262 node = ar->dev->of_node;
263 if (!node)
264 /* Device Tree is optional, don't print any warnings if
265 * there's no node for ath10k.
266 */
267 return -ENOENT;
268
269 if (!of_get_property(node, "qcom,ath10k-calibration-data",
270 &data_len)) {
271 /* The calibration data node is optional */
272 return -ENOENT;
273 }
274
275 if (data_len != QCA988X_CAL_DATA_LEN) {
276 ath10k_warn(ar, "invalid calibration data length in DT: %d\n",
277 data_len);
278 ret = -EMSGSIZE;
279 goto out;
280 }
281
282 data = kmalloc(data_len, GFP_KERNEL);
283 if (!data) {
284 ret = -ENOMEM;
285 goto out;
286 }
287
288 ret = of_property_read_u8_array(node, "qcom,ath10k-calibration-data",
289 data, data_len);
290 if (ret) {
291 ath10k_warn(ar, "failed to read calibration data from DT: %d\n",
292 ret);
293 goto out_free;
294 }
295
296 ret = ath10k_download_board_data(ar, data, data_len);
297 if (ret) {
298 ath10k_warn(ar, "failed to download calibration data from Device Tree: %d\n",
299 ret);
300 goto out_free;
301 }
302
303 ret = 0;
304
305out_free:
306 kfree(data);
307
308out:
309 return ret;
310}
311
Kalle Valo5e3dd152013-06-12 20:52:10 +0300312static int ath10k_download_and_run_otp(struct ath10k *ar)
313{
Kalle Valod6d4a582014-03-11 17:33:19 +0200314 u32 result, address = ar->hw_params.patch_load_addr;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300315 int ret;
316
Kalle Valoa58227e2014-10-13 09:40:59 +0300317 ret = ath10k_download_board_data(ar, ar->board_data, ar->board_len);
Kalle Valo83091552014-10-13 09:40:53 +0300318 if (ret) {
319 ath10k_err(ar, "failed to download board data: %d\n", ret);
320 return ret;
321 }
322
Kalle Valo5e3dd152013-06-12 20:52:10 +0300323 /* OTP is optional */
324
Kalle Valo7f06ea12014-03-11 17:33:28 +0200325 if (!ar->otp_data || !ar->otp_len) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200326 ath10k_warn(ar, "Not running otp, calibration will be incorrect (otp-data %p otp_len %zd)!\n",
Ben Greear36a8f412014-03-24 12:20:42 -0700327 ar->otp_data, ar->otp_len);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300328 return 0;
Kalle Valo7f06ea12014-03-11 17:33:28 +0200329 }
330
Michal Kazior7aa7a722014-08-25 12:09:38 +0200331 ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot upload otp to 0x%x len %zd\n",
Kalle Valo7f06ea12014-03-11 17:33:28 +0200332 address, ar->otp_len);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300333
Kalle Valo958df3a2013-09-27 19:55:01 +0300334 ret = ath10k_bmi_fast_download(ar, address, ar->otp_data, ar->otp_len);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300335 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200336 ath10k_err(ar, "could not write otp (%d)\n", ret);
Kalle Valo7f06ea12014-03-11 17:33:28 +0200337 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300338 }
339
Kalle Valod6d4a582014-03-11 17:33:19 +0200340 ret = ath10k_bmi_execute(ar, address, 0, &result);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300341 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200342 ath10k_err(ar, "could not execute otp (%d)\n", ret);
Kalle Valo7f06ea12014-03-11 17:33:28 +0200343 return ret;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300344 }
345
Michal Kazior7aa7a722014-08-25 12:09:38 +0200346 ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot otp execute result %d\n", result);
Kalle Valo7f06ea12014-03-11 17:33:28 +0200347
Rajkumar Manoharan8868b122014-11-17 16:44:14 +0200348 if (!skip_otp && result != 0) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200349 ath10k_err(ar, "otp calibration failed: %d", result);
Kalle Valo7f06ea12014-03-11 17:33:28 +0200350 return -EINVAL;
351 }
352
353 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300354}
355
Kalle Valo43d2a302014-09-10 18:23:30 +0300356static int ath10k_download_fw(struct ath10k *ar, enum ath10k_firmware_mode mode)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300357{
Kalle Valo43d2a302014-09-10 18:23:30 +0300358 u32 address, data_len;
359 const char *mode_name;
360 const void *data;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300361 int ret;
362
Kalle Valo5e3dd152013-06-12 20:52:10 +0300363 address = ar->hw_params.patch_load_addr;
364
Kalle Valo43d2a302014-09-10 18:23:30 +0300365 switch (mode) {
366 case ATH10K_FIRMWARE_MODE_NORMAL:
367 data = ar->firmware_data;
368 data_len = ar->firmware_len;
369 mode_name = "normal";
370 break;
371 case ATH10K_FIRMWARE_MODE_UTF:
372 data = ar->testmode.utf->data;
373 data_len = ar->testmode.utf->size;
374 mode_name = "utf";
375 break;
376 default:
377 ath10k_err(ar, "unknown firmware mode: %d\n", mode);
378 return -EINVAL;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300379 }
380
Kalle Valo43d2a302014-09-10 18:23:30 +0300381 ath10k_dbg(ar, ATH10K_DBG_BOOT,
382 "boot uploading firmware image %p len %d mode %s\n",
383 data, data_len, mode_name);
384
385 ret = ath10k_bmi_fast_download(ar, address, data, data_len);
386 if (ret) {
387 ath10k_err(ar, "failed to download %s firmware: %d\n",
388 mode_name, ret);
389 return ret;
390 }
391
Michal Kazior29385052013-07-16 09:38:58 +0200392 return ret;
393}
394
395static void ath10k_core_free_firmware_files(struct ath10k *ar)
396{
Kalle Valo36527912013-09-27 19:54:55 +0300397 if (ar->board && !IS_ERR(ar->board))
398 release_firmware(ar->board);
Michal Kazior29385052013-07-16 09:38:58 +0200399
400 if (ar->otp && !IS_ERR(ar->otp))
401 release_firmware(ar->otp);
402
403 if (ar->firmware && !IS_ERR(ar->firmware))
404 release_firmware(ar->firmware);
405
Kalle Valoa58227e2014-10-13 09:40:59 +0300406 if (ar->cal_file && !IS_ERR(ar->cal_file))
407 release_firmware(ar->cal_file);
408
Kalle Valo36527912013-09-27 19:54:55 +0300409 ar->board = NULL;
Kalle Valo958df3a2013-09-27 19:55:01 +0300410 ar->board_data = NULL;
411 ar->board_len = 0;
412
Michal Kazior29385052013-07-16 09:38:58 +0200413 ar->otp = NULL;
Kalle Valo958df3a2013-09-27 19:55:01 +0300414 ar->otp_data = NULL;
415 ar->otp_len = 0;
416
Michal Kazior29385052013-07-16 09:38:58 +0200417 ar->firmware = NULL;
Kalle Valo958df3a2013-09-27 19:55:01 +0300418 ar->firmware_data = NULL;
419 ar->firmware_len = 0;
Kalle Valoa58227e2014-10-13 09:40:59 +0300420
421 ar->cal_file = NULL;
422}
423
424static int ath10k_fetch_cal_file(struct ath10k *ar)
425{
426 char filename[100];
427
428 /* cal-<bus>-<id>.bin */
429 scnprintf(filename, sizeof(filename), "cal-%s-%s.bin",
430 ath10k_bus_str(ar->hif.bus), dev_name(ar->dev));
431
432 ar->cal_file = ath10k_fetch_fw_file(ar, ATH10K_FW_DIR, filename);
433 if (IS_ERR(ar->cal_file))
434 /* calibration file is optional, don't print any warnings */
435 return PTR_ERR(ar->cal_file);
436
437 ath10k_dbg(ar, ATH10K_DBG_BOOT, "found calibration file %s/%s\n",
438 ATH10K_FW_DIR, filename);
439
440 return 0;
Michal Kazior29385052013-07-16 09:38:58 +0200441}
442
Kalle Valo1a222432013-09-27 19:55:07 +0300443static int ath10k_core_fetch_firmware_api_1(struct ath10k *ar)
Michal Kazior29385052013-07-16 09:38:58 +0200444{
445 int ret = 0;
446
447 if (ar->hw_params.fw.fw == NULL) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200448 ath10k_err(ar, "firmware file not defined\n");
Michal Kazior29385052013-07-16 09:38:58 +0200449 return -EINVAL;
450 }
451
452 if (ar->hw_params.fw.board == NULL) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200453 ath10k_err(ar, "board data file not defined");
Michal Kazior29385052013-07-16 09:38:58 +0200454 return -EINVAL;
455 }
456
Kalle Valo36527912013-09-27 19:54:55 +0300457 ar->board = ath10k_fetch_fw_file(ar,
458 ar->hw_params.fw.dir,
459 ar->hw_params.fw.board);
460 if (IS_ERR(ar->board)) {
461 ret = PTR_ERR(ar->board);
Michal Kazior7aa7a722014-08-25 12:09:38 +0200462 ath10k_err(ar, "could not fetch board data (%d)\n", ret);
Michal Kazior29385052013-07-16 09:38:58 +0200463 goto err;
464 }
465
Kalle Valo958df3a2013-09-27 19:55:01 +0300466 ar->board_data = ar->board->data;
467 ar->board_len = ar->board->size;
468
Michal Kazior29385052013-07-16 09:38:58 +0200469 ar->firmware = ath10k_fetch_fw_file(ar,
470 ar->hw_params.fw.dir,
471 ar->hw_params.fw.fw);
472 if (IS_ERR(ar->firmware)) {
473 ret = PTR_ERR(ar->firmware);
Michal Kazior7aa7a722014-08-25 12:09:38 +0200474 ath10k_err(ar, "could not fetch firmware (%d)\n", ret);
Michal Kazior29385052013-07-16 09:38:58 +0200475 goto err;
476 }
477
Kalle Valo958df3a2013-09-27 19:55:01 +0300478 ar->firmware_data = ar->firmware->data;
479 ar->firmware_len = ar->firmware->size;
480
Michal Kazior29385052013-07-16 09:38:58 +0200481 /* OTP may be undefined. If so, don't fetch it at all */
482 if (ar->hw_params.fw.otp == NULL)
483 return 0;
484
485 ar->otp = ath10k_fetch_fw_file(ar,
486 ar->hw_params.fw.dir,
487 ar->hw_params.fw.otp);
488 if (IS_ERR(ar->otp)) {
489 ret = PTR_ERR(ar->otp);
Michal Kazior7aa7a722014-08-25 12:09:38 +0200490 ath10k_err(ar, "could not fetch otp (%d)\n", ret);
Michal Kazior29385052013-07-16 09:38:58 +0200491 goto err;
492 }
493
Kalle Valo958df3a2013-09-27 19:55:01 +0300494 ar->otp_data = ar->otp->data;
495 ar->otp_len = ar->otp->size;
496
Michal Kazior29385052013-07-16 09:38:58 +0200497 return 0;
498
499err:
500 ath10k_core_free_firmware_files(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300501 return ret;
502}
503
Kalle Valo1a222432013-09-27 19:55:07 +0300504static int ath10k_core_fetch_firmware_api_n(struct ath10k *ar, const char *name)
505{
506 size_t magic_len, len, ie_len;
507 int ie_id, i, index, bit, ret;
508 struct ath10k_fw_ie *hdr;
509 const u8 *data;
510 __le32 *timestamp;
511
512 /* first fetch the firmware file (firmware-*.bin) */
513 ar->firmware = ath10k_fetch_fw_file(ar, ar->hw_params.fw.dir, name);
514 if (IS_ERR(ar->firmware)) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200515 ath10k_err(ar, "could not fetch firmware file '%s/%s': %ld\n",
Ben Greear53c02282014-03-24 12:20:41 -0700516 ar->hw_params.fw.dir, name, PTR_ERR(ar->firmware));
Kalle Valo1a222432013-09-27 19:55:07 +0300517 return PTR_ERR(ar->firmware);
518 }
519
520 data = ar->firmware->data;
521 len = ar->firmware->size;
522
523 /* magic also includes the null byte, check that as well */
524 magic_len = strlen(ATH10K_FIRMWARE_MAGIC) + 1;
525
526 if (len < magic_len) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200527 ath10k_err(ar, "firmware file '%s/%s' too small to contain magic: %zu\n",
Ben Greear53c02282014-03-24 12:20:41 -0700528 ar->hw_params.fw.dir, name, len);
Michal Kazior9bab1cc2013-10-04 08:13:20 +0200529 ret = -EINVAL;
530 goto err;
Kalle Valo1a222432013-09-27 19:55:07 +0300531 }
532
533 if (memcmp(data, ATH10K_FIRMWARE_MAGIC, magic_len) != 0) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200534 ath10k_err(ar, "invalid firmware magic\n");
Michal Kazior9bab1cc2013-10-04 08:13:20 +0200535 ret = -EINVAL;
536 goto err;
Kalle Valo1a222432013-09-27 19:55:07 +0300537 }
538
539 /* jump over the padding */
540 magic_len = ALIGN(magic_len, 4);
541
542 len -= magic_len;
543 data += magic_len;
544
545 /* loop elements */
546 while (len > sizeof(struct ath10k_fw_ie)) {
547 hdr = (struct ath10k_fw_ie *)data;
548
549 ie_id = le32_to_cpu(hdr->id);
550 ie_len = le32_to_cpu(hdr->len);
551
552 len -= sizeof(*hdr);
553 data += sizeof(*hdr);
554
555 if (len < ie_len) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200556 ath10k_err(ar, "invalid length for FW IE %d (%zu < %zu)\n",
Kalle Valo1a222432013-09-27 19:55:07 +0300557 ie_id, len, ie_len);
Michal Kazior9bab1cc2013-10-04 08:13:20 +0200558 ret = -EINVAL;
559 goto err;
Kalle Valo1a222432013-09-27 19:55:07 +0300560 }
561
562 switch (ie_id) {
563 case ATH10K_FW_IE_FW_VERSION:
564 if (ie_len > sizeof(ar->hw->wiphy->fw_version) - 1)
565 break;
566
567 memcpy(ar->hw->wiphy->fw_version, data, ie_len);
568 ar->hw->wiphy->fw_version[ie_len] = '\0';
569
Michal Kazior7aa7a722014-08-25 12:09:38 +0200570 ath10k_dbg(ar, ATH10K_DBG_BOOT,
Kalle Valo1a222432013-09-27 19:55:07 +0300571 "found fw version %s\n",
572 ar->hw->wiphy->fw_version);
573 break;
574 case ATH10K_FW_IE_TIMESTAMP:
575 if (ie_len != sizeof(u32))
576 break;
577
578 timestamp = (__le32 *)data;
579
Michal Kazior7aa7a722014-08-25 12:09:38 +0200580 ath10k_dbg(ar, ATH10K_DBG_BOOT, "found fw timestamp %d\n",
Kalle Valo1a222432013-09-27 19:55:07 +0300581 le32_to_cpup(timestamp));
582 break;
583 case ATH10K_FW_IE_FEATURES:
Michal Kazior7aa7a722014-08-25 12:09:38 +0200584 ath10k_dbg(ar, ATH10K_DBG_BOOT,
Kalle Valo1a222432013-09-27 19:55:07 +0300585 "found firmware features ie (%zd B)\n",
586 ie_len);
587
588 for (i = 0; i < ATH10K_FW_FEATURE_COUNT; i++) {
589 index = i / 8;
590 bit = i % 8;
591
592 if (index == ie_len)
593 break;
594
Ben Greearf591a1a2014-02-04 19:51:38 +0200595 if (data[index] & (1 << bit)) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200596 ath10k_dbg(ar, ATH10K_DBG_BOOT,
Ben Greearf591a1a2014-02-04 19:51:38 +0200597 "Enabling feature bit: %i\n",
598 i);
Kalle Valo1a222432013-09-27 19:55:07 +0300599 __set_bit(i, ar->fw_features);
Ben Greearf591a1a2014-02-04 19:51:38 +0200600 }
Kalle Valo1a222432013-09-27 19:55:07 +0300601 }
602
Michal Kazior7aa7a722014-08-25 12:09:38 +0200603 ath10k_dbg_dump(ar, ATH10K_DBG_BOOT, "features", "",
Kalle Valo1a222432013-09-27 19:55:07 +0300604 ar->fw_features,
605 sizeof(ar->fw_features));
606 break;
607 case ATH10K_FW_IE_FW_IMAGE:
Michal Kazior7aa7a722014-08-25 12:09:38 +0200608 ath10k_dbg(ar, ATH10K_DBG_BOOT,
Kalle Valo1a222432013-09-27 19:55:07 +0300609 "found fw image ie (%zd B)\n",
610 ie_len);
611
612 ar->firmware_data = data;
613 ar->firmware_len = ie_len;
614
615 break;
616 case ATH10K_FW_IE_OTP_IMAGE:
Michal Kazior7aa7a722014-08-25 12:09:38 +0200617 ath10k_dbg(ar, ATH10K_DBG_BOOT,
Kalle Valo1a222432013-09-27 19:55:07 +0300618 "found otp image ie (%zd B)\n",
619 ie_len);
620
621 ar->otp_data = data;
622 ar->otp_len = ie_len;
623
624 break;
625 default:
Michal Kazior7aa7a722014-08-25 12:09:38 +0200626 ath10k_warn(ar, "Unknown FW IE: %u\n",
Kalle Valo1a222432013-09-27 19:55:07 +0300627 le32_to_cpu(hdr->id));
628 break;
629 }
630
631 /* jump over the padding */
632 ie_len = ALIGN(ie_len, 4);
633
634 len -= ie_len;
635 data += ie_len;
Fengguang Wue05634e2013-10-08 21:48:15 +0300636 }
Kalle Valo1a222432013-09-27 19:55:07 +0300637
638 if (!ar->firmware_data || !ar->firmware_len) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200639 ath10k_warn(ar, "No ATH10K_FW_IE_FW_IMAGE found from '%s/%s', skipping\n",
Ben Greear53c02282014-03-24 12:20:41 -0700640 ar->hw_params.fw.dir, name);
Kalle Valo1a222432013-09-27 19:55:07 +0300641 ret = -ENOMEDIUM;
642 goto err;
643 }
644
Michal Kazior24c88f72014-07-25 13:32:17 +0200645 if (test_bit(ATH10K_FW_FEATURE_WMI_10_2, ar->fw_features) &&
646 !test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features)) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200647 ath10k_err(ar, "feature bits corrupted: 10.2 feature requires 10.x feature to be set as well");
Michal Kazior24c88f72014-07-25 13:32:17 +0200648 ret = -EINVAL;
649 goto err;
650 }
651
Kalle Valo1a222432013-09-27 19:55:07 +0300652 /* now fetch the board file */
653 if (ar->hw_params.fw.board == NULL) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200654 ath10k_err(ar, "board data file not defined");
Kalle Valo1a222432013-09-27 19:55:07 +0300655 ret = -EINVAL;
656 goto err;
657 }
658
659 ar->board = ath10k_fetch_fw_file(ar,
660 ar->hw_params.fw.dir,
661 ar->hw_params.fw.board);
662 if (IS_ERR(ar->board)) {
663 ret = PTR_ERR(ar->board);
Michal Kazior7aa7a722014-08-25 12:09:38 +0200664 ath10k_err(ar, "could not fetch board data '%s/%s' (%d)\n",
Ben Greear53c02282014-03-24 12:20:41 -0700665 ar->hw_params.fw.dir, ar->hw_params.fw.board,
666 ret);
Kalle Valo1a222432013-09-27 19:55:07 +0300667 goto err;
668 }
669
670 ar->board_data = ar->board->data;
671 ar->board_len = ar->board->size;
672
673 return 0;
674
675err:
676 ath10k_core_free_firmware_files(ar);
677 return ret;
678}
679
680static int ath10k_core_fetch_firmware_files(struct ath10k *ar)
681{
682 int ret;
683
Kalle Valoa58227e2014-10-13 09:40:59 +0300684 /* calibration file is optional, don't check for any errors */
685 ath10k_fetch_cal_file(ar);
686
Michal Kazior24c88f72014-07-25 13:32:17 +0200687 ar->fw_api = 3;
Michal Kazior7aa7a722014-08-25 12:09:38 +0200688 ath10k_dbg(ar, ATH10K_DBG_BOOT, "trying fw api %d\n", ar->fw_api);
Michal Kazior24c88f72014-07-25 13:32:17 +0200689
690 ret = ath10k_core_fetch_firmware_api_n(ar, ATH10K_FW_API3_FILE);
691 if (ret == 0)
692 goto success;
693
Ben Greear53c02282014-03-24 12:20:41 -0700694 ar->fw_api = 2;
Michal Kazior7aa7a722014-08-25 12:09:38 +0200695 ath10k_dbg(ar, ATH10K_DBG_BOOT, "trying fw api %d\n", ar->fw_api);
Ben Greear53c02282014-03-24 12:20:41 -0700696
Kalle Valo1a222432013-09-27 19:55:07 +0300697 ret = ath10k_core_fetch_firmware_api_n(ar, ATH10K_FW_API2_FILE);
Ben Greear53c02282014-03-24 12:20:41 -0700698 if (ret == 0)
699 goto success;
700
701 ar->fw_api = 1;
Michal Kazior7aa7a722014-08-25 12:09:38 +0200702 ath10k_dbg(ar, ATH10K_DBG_BOOT, "trying fw api %d\n", ar->fw_api);
Kalle Valo1a222432013-09-27 19:55:07 +0300703
704 ret = ath10k_core_fetch_firmware_api_1(ar);
705 if (ret)
706 return ret;
707
Ben Greear53c02282014-03-24 12:20:41 -0700708success:
Michal Kazior7aa7a722014-08-25 12:09:38 +0200709 ath10k_dbg(ar, ATH10K_DBG_BOOT, "using fw api %d\n", ar->fw_api);
Kalle Valo1a222432013-09-27 19:55:07 +0300710
711 return 0;
712}
713
Kalle Valo83091552014-10-13 09:40:53 +0300714static int ath10k_download_cal_data(struct ath10k *ar)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300715{
716 int ret;
717
Kalle Valoa58227e2014-10-13 09:40:59 +0300718 ret = ath10k_download_cal_file(ar);
719 if (ret == 0) {
720 ar->cal_mode = ATH10K_CAL_MODE_FILE;
721 goto done;
722 }
723
724 ath10k_dbg(ar, ATH10K_DBG_BOOT,
Toshi Kikuchi5aabff02014-12-02 10:55:54 +0200725 "boot did not find a calibration file, try DT next: %d\n",
726 ret);
727
728 ret = ath10k_download_cal_dt(ar);
729 if (ret == 0) {
730 ar->cal_mode = ATH10K_CAL_MODE_DT;
731 goto done;
732 }
733
734 ath10k_dbg(ar, ATH10K_DBG_BOOT,
735 "boot did not find DT entry, try OTP next: %d\n",
Kalle Valoa58227e2014-10-13 09:40:59 +0300736 ret);
737
Kalle Valo5e3dd152013-06-12 20:52:10 +0300738 ret = ath10k_download_and_run_otp(ar);
Ben Greear36a8f412014-03-24 12:20:42 -0700739 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200740 ath10k_err(ar, "failed to run otp: %d\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300741 return ret;
Ben Greear36a8f412014-03-24 12:20:42 -0700742 }
Kalle Valo5e3dd152013-06-12 20:52:10 +0300743
Kalle Valoa58227e2014-10-13 09:40:59 +0300744 ar->cal_mode = ATH10K_CAL_MODE_OTP;
745
746done:
747 ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot using calibration mode %s\n",
748 ath10k_cal_mode_str(ar->cal_mode));
749 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300750}
751
752static int ath10k_init_uart(struct ath10k *ar)
753{
754 int ret;
755
756 /*
757 * Explicitly setting UART prints to zero as target turns it on
758 * based on scratch registers.
759 */
760 ret = ath10k_bmi_write32(ar, hi_serial_enable, 0);
761 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200762 ath10k_warn(ar, "could not disable UART prints (%d)\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300763 return ret;
764 }
765
Kalle Valoc8c39af2013-11-20 10:00:41 +0200766 if (!uart_print)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300767 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300768
769 ret = ath10k_bmi_write32(ar, hi_dbg_uart_txpin, 7);
770 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200771 ath10k_warn(ar, "could not enable UART prints (%d)\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300772 return ret;
773 }
774
775 ret = ath10k_bmi_write32(ar, hi_serial_enable, 1);
776 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200777 ath10k_warn(ar, "could not enable UART prints (%d)\n", ret);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300778 return ret;
779 }
780
Bartosz Markowski03fc1372013-09-03 14:24:02 +0200781 /* Set the UART baud rate to 19200. */
782 ret = ath10k_bmi_write32(ar, hi_desired_baud_rate, 19200);
783 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200784 ath10k_warn(ar, "could not set the baud rate (%d)\n", ret);
Bartosz Markowski03fc1372013-09-03 14:24:02 +0200785 return ret;
786 }
787
Michal Kazior7aa7a722014-08-25 12:09:38 +0200788 ath10k_info(ar, "UART prints enabled\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +0300789 return 0;
790}
791
792static int ath10k_init_hw_params(struct ath10k *ar)
793{
794 const struct ath10k_hw_params *uninitialized_var(hw_params);
795 int i;
796
797 for (i = 0; i < ARRAY_SIZE(ath10k_hw_params_list); i++) {
798 hw_params = &ath10k_hw_params_list[i];
799
800 if (hw_params->id == ar->target_version)
801 break;
802 }
803
804 if (i == ARRAY_SIZE(ath10k_hw_params_list)) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200805 ath10k_err(ar, "Unsupported hardware version: 0x%x\n",
Kalle Valo5e3dd152013-06-12 20:52:10 +0300806 ar->target_version);
807 return -EINVAL;
808 }
809
810 ar->hw_params = *hw_params;
811
Michal Kazior7aa7a722014-08-25 12:09:38 +0200812 ath10k_dbg(ar, ATH10K_DBG_BOOT, "Hardware name %s version 0x%x\n",
Kalle Valoc8c39af2013-11-20 10:00:41 +0200813 ar->hw_params.name, ar->target_version);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300814
815 return 0;
816}
817
Michal Kazioraffd3212013-07-16 09:54:35 +0200818static void ath10k_core_restart(struct work_struct *work)
819{
820 struct ath10k *ar = container_of(work, struct ath10k, restart_work);
821
Michal Kazior7962b0d2014-10-28 10:34:38 +0100822 set_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags);
823
824 /* Place a barrier to make sure the compiler doesn't reorder
825 * CRASH_FLUSH and calling other functions.
826 */
827 barrier();
828
829 ieee80211_stop_queues(ar->hw);
830 ath10k_drain_tx(ar);
831 complete_all(&ar->scan.started);
832 complete_all(&ar->scan.completed);
833 complete_all(&ar->scan.on_channel);
834 complete_all(&ar->offchan_tx_completed);
835 complete_all(&ar->install_key_done);
836 complete_all(&ar->vdev_setup_done);
837 wake_up(&ar->htt.empty_tx_wq);
838 wake_up(&ar->wmi.tx_credits_wq);
839 wake_up(&ar->peer_mapping_wq);
840
Michal Kazioraffd3212013-07-16 09:54:35 +0200841 mutex_lock(&ar->conf_mutex);
842
843 switch (ar->state) {
844 case ATH10K_STATE_ON:
Michal Kazioraffd3212013-07-16 09:54:35 +0200845 ar->state = ATH10K_STATE_RESTARTING;
Michal Kazior61e9aab2014-08-22 14:33:18 +0200846 ath10k_hif_stop(ar);
Michal Kazior5c81c7f2014-08-05 14:54:44 +0200847 ath10k_scan_finish(ar);
Michal Kazioraffd3212013-07-16 09:54:35 +0200848 ieee80211_restart_hw(ar->hw);
849 break;
850 case ATH10K_STATE_OFF:
Michal Kazior5e90de82013-10-16 16:46:05 +0300851 /* this can happen if driver is being unloaded
852 * or if the crash happens during FW probing */
Michal Kazior7aa7a722014-08-25 12:09:38 +0200853 ath10k_warn(ar, "cannot restart a device that hasn't been started\n");
Michal Kazioraffd3212013-07-16 09:54:35 +0200854 break;
855 case ATH10K_STATE_RESTARTING:
Michal Kaziorc5058f52014-05-26 12:46:03 +0300856 /* hw restart might be requested from multiple places */
857 break;
Michal Kazioraffd3212013-07-16 09:54:35 +0200858 case ATH10K_STATE_RESTARTED:
859 ar->state = ATH10K_STATE_WEDGED;
860 /* fall through */
861 case ATH10K_STATE_WEDGED:
Michal Kazior7aa7a722014-08-25 12:09:38 +0200862 ath10k_warn(ar, "device is wedged, will not restart\n");
Michal Kazioraffd3212013-07-16 09:54:35 +0200863 break;
Kalle Valo43d2a302014-09-10 18:23:30 +0300864 case ATH10K_STATE_UTF:
865 ath10k_warn(ar, "firmware restart in UTF mode not supported\n");
866 break;
Michal Kazioraffd3212013-07-16 09:54:35 +0200867 }
868
869 mutex_unlock(&ar->conf_mutex);
870}
871
Michal Kaziorcfd10612014-11-25 15:16:05 +0100872static void ath10k_core_init_max_sta_count(struct ath10k *ar)
873{
874 if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features)) {
875 ar->max_num_peers = TARGET_10X_NUM_PEERS;
876 ar->max_num_stations = TARGET_10X_NUM_STATIONS;
877 } else {
878 ar->max_num_peers = TARGET_NUM_PEERS;
879 ar->max_num_stations = TARGET_NUM_STATIONS;
880 }
881}
882
Kalle Valo43d2a302014-09-10 18:23:30 +0300883int ath10k_core_start(struct ath10k *ar, enum ath10k_firmware_mode mode)
Kalle Valo5e3dd152013-06-12 20:52:10 +0300884{
Kalle Valo5e3dd152013-06-12 20:52:10 +0300885 int status;
886
Kalle Valo60631c52013-10-08 21:45:25 +0300887 lockdep_assert_held(&ar->conf_mutex);
888
Michal Kazior7962b0d2014-10-28 10:34:38 +0100889 clear_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags);
890
Michal Kazior64d151d2013-07-16 09:38:53 +0200891 ath10k_bmi_start(ar);
892
Kalle Valo5e3dd152013-06-12 20:52:10 +0300893 if (ath10k_init_configure_target(ar)) {
894 status = -EINVAL;
895 goto err;
896 }
897
Kalle Valo83091552014-10-13 09:40:53 +0300898 status = ath10k_download_cal_data(ar);
899 if (status)
900 goto err;
901
902 status = ath10k_download_fw(ar, mode);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300903 if (status)
904 goto err;
905
906 status = ath10k_init_uart(ar);
907 if (status)
908 goto err;
909
Michal Kaziorcd003fa2013-07-05 16:15:13 +0300910 ar->htc.htc_ops.target_send_suspend_complete =
911 ath10k_send_suspend_complete;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300912
Michal Kaziorcd003fa2013-07-05 16:15:13 +0300913 status = ath10k_htc_init(ar);
914 if (status) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200915 ath10k_err(ar, "could not init HTC (%d)\n", status);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300916 goto err;
917 }
918
919 status = ath10k_bmi_done(ar);
920 if (status)
Michal Kaziorcd003fa2013-07-05 16:15:13 +0300921 goto err;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300922
923 status = ath10k_wmi_attach(ar);
924 if (status) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200925 ath10k_err(ar, "WMI attach failed: %d\n", status);
Michal Kaziorcd003fa2013-07-05 16:15:13 +0300926 goto err;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300927 }
928
Michal Kazior95bf21f2014-05-16 17:15:39 +0300929 status = ath10k_htt_init(ar);
930 if (status) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200931 ath10k_err(ar, "failed to init htt: %d\n", status);
Michal Kazior95bf21f2014-05-16 17:15:39 +0300932 goto err_wmi_detach;
933 }
934
935 status = ath10k_htt_tx_alloc(&ar->htt);
936 if (status) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200937 ath10k_err(ar, "failed to alloc htt tx: %d\n", status);
Michal Kazior95bf21f2014-05-16 17:15:39 +0300938 goto err_wmi_detach;
939 }
940
941 status = ath10k_htt_rx_alloc(&ar->htt);
942 if (status) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200943 ath10k_err(ar, "failed to alloc htt rx: %d\n", status);
Michal Kazior95bf21f2014-05-16 17:15:39 +0300944 goto err_htt_tx_detach;
945 }
946
Michal Kazior67e3c632013-11-08 08:05:18 +0100947 status = ath10k_hif_start(ar);
948 if (status) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200949 ath10k_err(ar, "could not start HIF: %d\n", status);
Michal Kazior95bf21f2014-05-16 17:15:39 +0300950 goto err_htt_rx_detach;
Michal Kazior67e3c632013-11-08 08:05:18 +0100951 }
952
953 status = ath10k_htc_wait_target(&ar->htc);
954 if (status) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200955 ath10k_err(ar, "failed to connect to HTC: %d\n", status);
Michal Kazior67e3c632013-11-08 08:05:18 +0100956 goto err_hif_stop;
957 }
Kalle Valo5e3dd152013-06-12 20:52:10 +0300958
Kalle Valo43d2a302014-09-10 18:23:30 +0300959 if (mode == ATH10K_FIRMWARE_MODE_NORMAL) {
960 status = ath10k_htt_connect(&ar->htt);
961 if (status) {
962 ath10k_err(ar, "failed to connect htt (%d)\n", status);
963 goto err_hif_stop;
964 }
Kalle Valo5e3dd152013-06-12 20:52:10 +0300965 }
966
Michal Kazior95bf21f2014-05-16 17:15:39 +0300967 status = ath10k_wmi_connect(ar);
968 if (status) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200969 ath10k_err(ar, "could not connect wmi: %d\n", status);
Michal Kazior95bf21f2014-05-16 17:15:39 +0300970 goto err_hif_stop;
971 }
972
973 status = ath10k_htc_start(&ar->htc);
974 if (status) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200975 ath10k_err(ar, "failed to start htc: %d\n", status);
Michal Kazior95bf21f2014-05-16 17:15:39 +0300976 goto err_hif_stop;
977 }
978
Kalle Valo43d2a302014-09-10 18:23:30 +0300979 if (mode == ATH10K_FIRMWARE_MODE_NORMAL) {
980 status = ath10k_wmi_wait_for_service_ready(ar);
981 if (status <= 0) {
982 ath10k_warn(ar, "wmi service ready event not received");
983 status = -ETIMEDOUT;
984 goto err_hif_stop;
985 }
Michal Kazior95bf21f2014-05-16 17:15:39 +0300986 }
Kalle Valo5e3dd152013-06-12 20:52:10 +0300987
Michal Kazior7aa7a722014-08-25 12:09:38 +0200988 ath10k_dbg(ar, ATH10K_DBG_BOOT, "firmware %s booted\n",
Kalle Valoc8c39af2013-11-20 10:00:41 +0200989 ar->hw->wiphy->fw_version);
Kalle Valo5e3dd152013-06-12 20:52:10 +0300990
Kalle Valo5e3dd152013-06-12 20:52:10 +0300991 status = ath10k_wmi_cmd_init(ar);
992 if (status) {
Michal Kazior7aa7a722014-08-25 12:09:38 +0200993 ath10k_err(ar, "could not send WMI init command (%d)\n",
994 status);
Michal Kaziorb7967dc2014-08-07 11:03:31 +0200995 goto err_hif_stop;
Kalle Valo5e3dd152013-06-12 20:52:10 +0300996 }
997
998 status = ath10k_wmi_wait_for_unified_ready(ar);
999 if (status <= 0) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001000 ath10k_err(ar, "wmi unified ready event not received\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +03001001 status = -ETIMEDOUT;
Michal Kaziorb7967dc2014-08-07 11:03:31 +02001002 goto err_hif_stop;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001003 }
1004
Kalle Valo43d2a302014-09-10 18:23:30 +03001005 /* we don't care about HTT in UTF mode */
1006 if (mode == ATH10K_FIRMWARE_MODE_NORMAL) {
1007 status = ath10k_htt_setup(&ar->htt);
1008 if (status) {
1009 ath10k_err(ar, "failed to setup htt: %d\n", status);
1010 goto err_hif_stop;
1011 }
Michal Kazior95bf21f2014-05-16 17:15:39 +03001012 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001013
Kalle Valodb66ea02013-09-03 11:44:03 +03001014 status = ath10k_debug_start(ar);
1015 if (status)
Michal Kaziorb7967dc2014-08-07 11:03:31 +02001016 goto err_hif_stop;
Kalle Valodb66ea02013-09-03 11:44:03 +03001017
Bartosz Markowskidfa413d2014-06-02 21:19:45 +03001018 if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features))
Ben Greear16c11172014-09-23 14:17:16 -07001019 ar->free_vdev_map = (1LL << TARGET_10X_NUM_VDEVS) - 1;
Bartosz Markowskidfa413d2014-06-02 21:19:45 +03001020 else
Ben Greear16c11172014-09-23 14:17:16 -07001021 ar->free_vdev_map = (1LL << TARGET_NUM_VDEVS) - 1;
Bartosz Markowskidfa413d2014-06-02 21:19:45 +03001022
Michal Kazior05791192013-10-16 15:44:45 +03001023 INIT_LIST_HEAD(&ar->arvifs);
Michal Kazior1a1b8a82013-07-16 09:38:55 +02001024
Michal Kaziordd30a362013-07-16 09:38:51 +02001025 return 0;
1026
Michal Kazior67e3c632013-11-08 08:05:18 +01001027err_hif_stop:
1028 ath10k_hif_stop(ar);
Michal Kazior95bf21f2014-05-16 17:15:39 +03001029err_htt_rx_detach:
1030 ath10k_htt_rx_free(&ar->htt);
1031err_htt_tx_detach:
1032 ath10k_htt_tx_free(&ar->htt);
Michal Kaziordd30a362013-07-16 09:38:51 +02001033err_wmi_detach:
1034 ath10k_wmi_detach(ar);
1035err:
1036 return status;
1037}
Michal Kazior818bdd12013-07-16 09:38:57 +02001038EXPORT_SYMBOL(ath10k_core_start);
Michal Kaziordd30a362013-07-16 09:38:51 +02001039
Marek Puzyniak00f54822014-02-10 17:14:24 +01001040int ath10k_wait_for_suspend(struct ath10k *ar, u32 suspend_opt)
1041{
1042 int ret;
1043
1044 reinit_completion(&ar->target_suspend);
1045
1046 ret = ath10k_wmi_pdev_suspend_target(ar, suspend_opt);
1047 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001048 ath10k_warn(ar, "could not suspend target (%d)\n", ret);
Marek Puzyniak00f54822014-02-10 17:14:24 +01001049 return ret;
1050 }
1051
1052 ret = wait_for_completion_timeout(&ar->target_suspend, 1 * HZ);
1053
1054 if (ret == 0) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001055 ath10k_warn(ar, "suspend timed out - target pause event never came\n");
Marek Puzyniak00f54822014-02-10 17:14:24 +01001056 return -ETIMEDOUT;
1057 }
1058
1059 return 0;
1060}
1061
Michal Kaziordd30a362013-07-16 09:38:51 +02001062void ath10k_core_stop(struct ath10k *ar)
1063{
Kalle Valo60631c52013-10-08 21:45:25 +03001064 lockdep_assert_held(&ar->conf_mutex);
1065
Marek Puzyniak00f54822014-02-10 17:14:24 +01001066 /* try to suspend target */
Kalle Valo43d2a302014-09-10 18:23:30 +03001067 if (ar->state != ATH10K_STATE_RESTARTING &&
1068 ar->state != ATH10K_STATE_UTF)
Michal Kazior216a1832014-04-23 19:30:04 +03001069 ath10k_wait_for_suspend(ar, WMI_PDEV_SUSPEND_AND_DISABLE_INTR);
1070
Kalle Valodb66ea02013-09-03 11:44:03 +03001071 ath10k_debug_stop(ar);
Michal Kazior95bf21f2014-05-16 17:15:39 +03001072 ath10k_hif_stop(ar);
1073 ath10k_htt_tx_free(&ar->htt);
1074 ath10k_htt_rx_free(&ar->htt);
Michal Kaziordd30a362013-07-16 09:38:51 +02001075 ath10k_wmi_detach(ar);
1076}
Michal Kazior818bdd12013-07-16 09:38:57 +02001077EXPORT_SYMBOL(ath10k_core_stop);
1078
1079/* mac80211 manages fw/hw initialization through start/stop hooks. However in
1080 * order to know what hw capabilities should be advertised to mac80211 it is
1081 * necessary to load the firmware (and tear it down immediately since start
1082 * hook will try to init it again) before registering */
1083static int ath10k_core_probe_fw(struct ath10k *ar)
1084{
Michal Kazior29385052013-07-16 09:38:58 +02001085 struct bmi_target_info target_info;
1086 int ret = 0;
Michal Kazior818bdd12013-07-16 09:38:57 +02001087
1088 ret = ath10k_hif_power_up(ar);
1089 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001090 ath10k_err(ar, "could not start pci hif (%d)\n", ret);
Michal Kazior818bdd12013-07-16 09:38:57 +02001091 return ret;
1092 }
1093
Michal Kazior29385052013-07-16 09:38:58 +02001094 memset(&target_info, 0, sizeof(target_info));
1095 ret = ath10k_bmi_get_target_info(ar, &target_info);
1096 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001097 ath10k_err(ar, "could not get target info (%d)\n", ret);
Michal Kazior29385052013-07-16 09:38:58 +02001098 ath10k_hif_power_down(ar);
1099 return ret;
1100 }
1101
1102 ar->target_version = target_info.version;
1103 ar->hw->wiphy->hw_version = target_info.version;
1104
1105 ret = ath10k_init_hw_params(ar);
1106 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001107 ath10k_err(ar, "could not get hw params (%d)\n", ret);
Michal Kazior29385052013-07-16 09:38:58 +02001108 ath10k_hif_power_down(ar);
1109 return ret;
1110 }
1111
1112 ret = ath10k_core_fetch_firmware_files(ar);
1113 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001114 ath10k_err(ar, "could not fetch firmware files (%d)\n", ret);
Michal Kazior29385052013-07-16 09:38:58 +02001115 ath10k_hif_power_down(ar);
1116 return ret;
1117 }
1118
Michal Kaziorcfd10612014-11-25 15:16:05 +01001119 ath10k_core_init_max_sta_count(ar);
1120
Kalle Valo60631c52013-10-08 21:45:25 +03001121 mutex_lock(&ar->conf_mutex);
1122
Kalle Valo43d2a302014-09-10 18:23:30 +03001123 ret = ath10k_core_start(ar, ATH10K_FIRMWARE_MODE_NORMAL);
Michal Kazior818bdd12013-07-16 09:38:57 +02001124 if (ret) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001125 ath10k_err(ar, "could not init core (%d)\n", ret);
Michal Kazior29385052013-07-16 09:38:58 +02001126 ath10k_core_free_firmware_files(ar);
Michal Kazior818bdd12013-07-16 09:38:57 +02001127 ath10k_hif_power_down(ar);
Kalle Valo60631c52013-10-08 21:45:25 +03001128 mutex_unlock(&ar->conf_mutex);
Michal Kazior818bdd12013-07-16 09:38:57 +02001129 return ret;
1130 }
1131
Michal Kazior8079de02014-08-22 14:23:29 +02001132 ath10k_print_driver_info(ar);
Michal Kazior818bdd12013-07-16 09:38:57 +02001133 ath10k_core_stop(ar);
Kalle Valo60631c52013-10-08 21:45:25 +03001134
1135 mutex_unlock(&ar->conf_mutex);
1136
Michal Kazior818bdd12013-07-16 09:38:57 +02001137 ath10k_hif_power_down(ar);
1138 return 0;
1139}
Michal Kaziordd30a362013-07-16 09:38:51 +02001140
Michal Kazior6782cb62014-05-23 12:28:47 +02001141static void ath10k_core_register_work(struct work_struct *work)
Michal Kaziordd30a362013-07-16 09:38:51 +02001142{
Michal Kazior6782cb62014-05-23 12:28:47 +02001143 struct ath10k *ar = container_of(work, struct ath10k, register_work);
Michal Kaziordd30a362013-07-16 09:38:51 +02001144 int status;
1145
Michal Kazior818bdd12013-07-16 09:38:57 +02001146 status = ath10k_core_probe_fw(ar);
1147 if (status) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001148 ath10k_err(ar, "could not probe fw (%d)\n", status);
Michal Kazior6782cb62014-05-23 12:28:47 +02001149 goto err;
Michal Kazior818bdd12013-07-16 09:38:57 +02001150 }
Michal Kaziordd30a362013-07-16 09:38:51 +02001151
Kalle Valo5e3dd152013-06-12 20:52:10 +03001152 status = ath10k_mac_register(ar);
Michal Kazior818bdd12013-07-16 09:38:57 +02001153 if (status) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001154 ath10k_err(ar, "could not register to mac80211 (%d)\n", status);
Michal Kazior29385052013-07-16 09:38:58 +02001155 goto err_release_fw;
Michal Kazior818bdd12013-07-16 09:38:57 +02001156 }
Kalle Valo5e3dd152013-06-12 20:52:10 +03001157
Michal Kaziore13cf7a2014-09-04 09:13:08 +02001158 status = ath10k_debug_register(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001159 if (status) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001160 ath10k_err(ar, "unable to initialize debugfs\n");
Kalle Valo5e3dd152013-06-12 20:52:10 +03001161 goto err_unregister_mac;
1162 }
1163
Simon Wunderlich855aed12014-08-02 09:12:54 +03001164 status = ath10k_spectral_create(ar);
1165 if (status) {
Michal Kazior7aa7a722014-08-25 12:09:38 +02001166 ath10k_err(ar, "failed to initialize spectral\n");
Simon Wunderlich855aed12014-08-02 09:12:54 +03001167 goto err_debug_destroy;
1168 }
1169
Michal Kazior6782cb62014-05-23 12:28:47 +02001170 set_bit(ATH10K_FLAG_CORE_REGISTERED, &ar->dev_flags);
1171 return;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001172
Simon Wunderlich855aed12014-08-02 09:12:54 +03001173err_debug_destroy:
1174 ath10k_debug_destroy(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001175err_unregister_mac:
1176 ath10k_mac_unregister(ar);
Michal Kazior29385052013-07-16 09:38:58 +02001177err_release_fw:
1178 ath10k_core_free_firmware_files(ar);
Michal Kazior6782cb62014-05-23 12:28:47 +02001179err:
Michal Kaziora491a922014-07-14 16:07:29 +03001180 /* TODO: It's probably a good idea to release device from the driver
1181 * but calling device_release_driver() here will cause a deadlock.
1182 */
Michal Kazior6782cb62014-05-23 12:28:47 +02001183 return;
1184}
1185
1186int ath10k_core_register(struct ath10k *ar, u32 chip_id)
1187{
Michal Kazior6782cb62014-05-23 12:28:47 +02001188 ar->chip_id = chip_id;
Michal Kazior6782cb62014-05-23 12:28:47 +02001189 queue_work(ar->workqueue, &ar->register_work);
1190
1191 return 0;
Kalle Valo5e3dd152013-06-12 20:52:10 +03001192}
1193EXPORT_SYMBOL(ath10k_core_register);
1194
1195void ath10k_core_unregister(struct ath10k *ar)
1196{
Michal Kazior6782cb62014-05-23 12:28:47 +02001197 cancel_work_sync(&ar->register_work);
1198
1199 if (!test_bit(ATH10K_FLAG_CORE_REGISTERED, &ar->dev_flags))
1200 return;
1201
Simon Wunderlich804eef1472014-08-12 17:12:17 +02001202 /* Stop spectral before unregistering from mac80211 to remove the
1203 * relayfs debugfs file cleanly. Otherwise the parent debugfs tree
1204 * would be already be free'd recursively, leading to a double free.
1205 */
1206 ath10k_spectral_destroy(ar);
1207
Kalle Valo5e3dd152013-06-12 20:52:10 +03001208 /* We must unregister from mac80211 before we stop HTC and HIF.
1209 * Otherwise we will fail to submit commands to FW and mac80211 will be
1210 * unhappy about callback failures. */
1211 ath10k_mac_unregister(ar);
Kalle Valodb66ea02013-09-03 11:44:03 +03001212
Kalle Valo43d2a302014-09-10 18:23:30 +03001213 ath10k_testmode_destroy(ar);
1214
Michal Kazior29385052013-07-16 09:38:58 +02001215 ath10k_core_free_firmware_files(ar);
Ben Greear6f1f56e2013-11-04 09:18:16 -08001216
Michal Kaziore13cf7a2014-09-04 09:13:08 +02001217 ath10k_debug_unregister(ar);
Kalle Valo5e3dd152013-06-12 20:52:10 +03001218}
1219EXPORT_SYMBOL(ath10k_core_unregister);
1220
Michal Kaziore7b54192014-08-07 11:03:27 +02001221struct ath10k *ath10k_core_create(size_t priv_size, struct device *dev,
Kalle Valoe07db352014-10-13 09:40:47 +03001222 enum ath10k_bus bus,
Michal Kazior0d0a6932014-05-23 12:28:45 +02001223 const struct ath10k_hif_ops *hif_ops)
1224{
1225 struct ath10k *ar;
Michal Kaziore13cf7a2014-09-04 09:13:08 +02001226 int ret;
Michal Kazior0d0a6932014-05-23 12:28:45 +02001227
Michal Kaziore7b54192014-08-07 11:03:27 +02001228 ar = ath10k_mac_create(priv_size);
Michal Kazior0d0a6932014-05-23 12:28:45 +02001229 if (!ar)
1230 return NULL;
1231
1232 ar->ath_common.priv = ar;
1233 ar->ath_common.hw = ar->hw;
1234
1235 ar->p2p = !!ath10k_p2p;
1236 ar->dev = dev;
1237
Michal Kazior0d0a6932014-05-23 12:28:45 +02001238 ar->hif.ops = hif_ops;
Kalle Valoe07db352014-10-13 09:40:47 +03001239 ar->hif.bus = bus;
Michal Kazior0d0a6932014-05-23 12:28:45 +02001240
1241 init_completion(&ar->scan.started);
1242 init_completion(&ar->scan.completed);
1243 init_completion(&ar->scan.on_channel);
1244 init_completion(&ar->target_suspend);
1245
1246 init_completion(&ar->install_key_done);
1247 init_completion(&ar->vdev_setup_done);
1248
Michal Kazior5c81c7f2014-08-05 14:54:44 +02001249 INIT_DELAYED_WORK(&ar->scan.timeout, ath10k_scan_timeout_work);
Michal Kazior0d0a6932014-05-23 12:28:45 +02001250
1251 ar->workqueue = create_singlethread_workqueue("ath10k_wq");
1252 if (!ar->workqueue)
Michal Kaziore13cf7a2014-09-04 09:13:08 +02001253 goto err_free_mac;
Michal Kazior0d0a6932014-05-23 12:28:45 +02001254
1255 mutex_init(&ar->conf_mutex);
1256 spin_lock_init(&ar->data_lock);
1257
1258 INIT_LIST_HEAD(&ar->peers);
1259 init_waitqueue_head(&ar->peer_mapping_wq);
Michal Kazior7962b0d2014-10-28 10:34:38 +01001260 init_waitqueue_head(&ar->htt.empty_tx_wq);
1261 init_waitqueue_head(&ar->wmi.tx_credits_wq);
Michal Kazior0d0a6932014-05-23 12:28:45 +02001262
1263 init_completion(&ar->offchan_tx_completed);
1264 INIT_WORK(&ar->offchan_tx_work, ath10k_offchan_tx_work);
1265 skb_queue_head_init(&ar->offchan_tx_queue);
1266
1267 INIT_WORK(&ar->wmi_mgmt_tx_work, ath10k_mgmt_over_wmi_tx_work);
1268 skb_queue_head_init(&ar->wmi_mgmt_tx_queue);
1269
Michal Kazior6782cb62014-05-23 12:28:47 +02001270 INIT_WORK(&ar->register_work, ath10k_core_register_work);
Michal Kazior0d0a6932014-05-23 12:28:45 +02001271 INIT_WORK(&ar->restart_work, ath10k_core_restart);
1272
Michal Kaziore13cf7a2014-09-04 09:13:08 +02001273 ret = ath10k_debug_create(ar);
1274 if (ret)
1275 goto err_free_wq;
1276
Michal Kazior0d0a6932014-05-23 12:28:45 +02001277 return ar;
1278
Michal Kaziore13cf7a2014-09-04 09:13:08 +02001279err_free_wq:
1280 destroy_workqueue(ar->workqueue);
1281
1282err_free_mac:
Michal Kazior0d0a6932014-05-23 12:28:45 +02001283 ath10k_mac_destroy(ar);
Michal Kaziore13cf7a2014-09-04 09:13:08 +02001284
Michal Kazior0d0a6932014-05-23 12:28:45 +02001285 return NULL;
1286}
1287EXPORT_SYMBOL(ath10k_core_create);
1288
1289void ath10k_core_destroy(struct ath10k *ar)
1290{
1291 flush_workqueue(ar->workqueue);
1292 destroy_workqueue(ar->workqueue);
1293
Michal Kaziore13cf7a2014-09-04 09:13:08 +02001294 ath10k_debug_destroy(ar);
Michal Kazior0d0a6932014-05-23 12:28:45 +02001295 ath10k_mac_destroy(ar);
1296}
1297EXPORT_SYMBOL(ath10k_core_destroy);
1298
Kalle Valo5e3dd152013-06-12 20:52:10 +03001299MODULE_AUTHOR("Qualcomm Atheros");
1300MODULE_DESCRIPTION("Core module for QCA988X PCIe devices.");
1301MODULE_LICENSE("Dual BSD/GPL");