Lines Matching refs:ar

251 static int ath6kl_set_host_app_area(struct ath6kl *ar)
258 address = ath6kl_get_hi_item_addr(ar, HI_ITEM(hi_app_host_interest));
259 address = TARG_VTOP(ar->target_type, address);
261 if (ath6kl_diag_read32(ar, address, &data))
264 address = TARG_VTOP(ar->target_type, data);
266 if (ath6kl_diag_write(ar, address, (u8 *) &host_app_area,
273 static inline void set_ac2_ep_map(struct ath6kl *ar,
277 ar->ac2ep_map[ac] = ep;
278 ar->ep2ac_map[ep] = ac;
282 static int ath6kl_connectservice(struct ath6kl *ar,
291 status = ath6kl_htc_conn_service(ar->htc_target, con_req, &response);
300 if (test_bit(WMI_ENABLED, &ar->flag))
301 ath6kl_wmi_set_control_ep(ar->wmi, response.endpoint);
302 ar->ctrl_ep = response.endpoint;
305 set_ac2_ep_map(ar, WMM_AC_BE, response.endpoint);
308 set_ac2_ep_map(ar, WMM_AC_BK, response.endpoint);
311 set_ac2_ep_map(ar, WMM_AC_VI, response.endpoint);
314 set_ac2_ep_map(ar, WMM_AC_VO, response.endpoint);
324 static int ath6kl_init_service_ep(struct ath6kl *ar)
347 if (ath6kl_connectservice(ar, &connect, "WMI CONTROL"))
377 if (ath6kl_connectservice(ar, &connect, "WMI DATA BE"))
382 if (ath6kl_connectservice(ar, &connect, "WMI DATA BK"))
387 if (ath6kl_connectservice(ar, &connect, "WMI DATA VI"))
398 if (ath6kl_connectservice(ar, &connect, "WMI DATA VO"))
416 static int ath6kl_set_htc_params(struct ath6kl *ar, u32 mbox_isr_yield_val,
422 blk_size = ar->mbox_info.block_size;
428 status = ath6kl_bmi_write_hi32(ar, hi_mbox_io_block_sz, blk_size);
436 ath6kl_get_hi_item_addr(ar, HI_ITEM(hi_mbox_io_block_sz)));
440 status = ath6kl_bmi_write_hi32(ar, hi_mbox_isr_yield_limit,
452 static int ath6kl_target_config_wlan_params(struct ath6kl *ar, int idx)
461 ret = ath6kl_wmi_set_rx_frame_format_cmd(ar->wmi, idx,
462 ar->rx_meta_ver, 0, 0);
468 if (ar->conf_flags & ATH6KL_CONF_IGNORE_PS_FAIL_EVT_IN_SCAN) {
469 ret = ath6kl_wmi_pmparams_cmd(ar->wmi, idx, 0, 1, 0, 0, 1,
478 if (!(ar->conf_flags & ATH6KL_CONF_IGNORE_ERP_BARKER)) {
479 ret = ath6kl_wmi_set_lpreamble_cmd(ar->wmi, idx, 0,
488 ret = ath6kl_wmi_set_keepalive_cmd(ar->wmi, idx,
495 ret = ath6kl_wmi_disctimeout_cmd(ar->wmi, idx,
502 if (!(ar->conf_flags & ATH6KL_CONF_ENABLE_TX_BURST)) {
503 ret = ath6kl_wmi_set_wmm_txop(ar->wmi, idx, WMI_TXOP_DISABLED);
510 if (ar->p2p && (ar->vif_max == 1 || idx)) {
511 ret = ath6kl_wmi_info_req_cmd(ar->wmi, idx,
519 ar->p2p = false;
523 if (ar->p2p && (ar->vif_max == 1 || idx)) {
525 ret = ath6kl_wmi_probe_report_req_cmd(ar->wmi, idx, true);
536 int ath6kl_configure_target(struct ath6kl *ar)
542 param = !!(ar->conf_flags & ATH6KL_CONF_UART_DEBUG);
543 if (ath6kl_bmi_write_hi32(ar, hi_serial_enable, param)) {
558 for (i = 0; i < ar->vif_max; i++)
571 ar->fw_capabilities)) {
572 for (i = 0; i < ar->vif_max; i++)
576 for (i = 0; i < ar->max_norm_iface; i++)
580 for (i = ar->max_norm_iface; i < ar->vif_max; i++)
584 if (ar->p2p && ar->vif_max == 1)
588 if (ath6kl_bmi_write_hi32(ar, hi_app_host_interest,
597 if (ath6kl_bmi_read_hi32(ar, hi_option_flag, &param) != 0) {
602 param |= (ar->vif_max << HI_OPTION_NUM_DEV_SHIFT);
609 if (ath6kl_bmi_write_hi32(ar, hi_option_flag, param) != 0) {
625 if ((ar->target_type == TARGET_TYPE_AR6003) ||
626 (ar->version.target_ver == AR6004_HW_1_3_VERSION) ||
627 (ar->version.target_ver == AR6004_HW_3_0_VERSION)) {
628 param = ar->hw.board_ext_data_addr;
629 ram_reserved_size = ar->hw.reserved_ram_size;
631 if (ath6kl_bmi_write_hi32(ar, hi_board_ext_data, param) != 0) {
636 if (ath6kl_bmi_write_hi32(ar, hi_end_ram_reserve_sz,
644 if (ath6kl_set_htc_params(ar, MBOX_YIELD_LIMIT, 0))
649 status = ath6kl_bmi_write_hi32(ar, hi_dbg_uart_txpin,
650 ar->hw.uarttx_pin);
655 if (ar->conf_flags & ATH6KL_CONF_UART_DEBUG) {
656 status = ath6kl_bmi_write_hi32(ar, hi_desired_baud_rate,
657 ar->hw.uarttx_rate);
663 if (ar->hw.refclk_hz != 0) {
664 status = ath6kl_bmi_write_hi32(ar, hi_refclk_hz,
665 ar->hw.refclk_hz);
674 static int ath6kl_get_fw(struct ath6kl *ar, const char *filename,
680 ret = request_firmware(&fw_entry, filename, ar->dev);
702 static bool check_device_tree(struct ath6kl *ar)
718 "%s/bdata.%s.bin", ar->hw.fw.dir, board_id);
720 ret = ath6kl_get_fw(ar, board_filename, &ar->fw_board,
721 &ar->fw_board_len);
733 static bool check_device_tree(struct ath6kl *ar)
739 static int ath6kl_fetch_board_file(struct ath6kl *ar)
744 if (ar->fw_board != NULL)
747 if (WARN_ON(ar->hw.fw_board == NULL))
750 filename = ar->hw.fw_board;
752 ret = ath6kl_get_fw(ar, filename, &ar->fw_board,
753 &ar->fw_board_len);
759 if (check_device_tree(ar)) {
768 filename = ar->hw.fw_default_board;
770 ret = ath6kl_get_fw(ar, filename, &ar->fw_board,
771 &ar->fw_board_len);
784 static int ath6kl_fetch_otp_file(struct ath6kl *ar)
789 if (ar->fw_otp != NULL)
792 if (ar->hw.fw.otp == NULL) {
799 ar->hw.fw.dir, ar->hw.fw.otp);
801 ret = ath6kl_get_fw(ar, filename, &ar->fw_otp,
802 &ar->fw_otp_len);
812 static int ath6kl_fetch_testmode_file(struct ath6kl *ar)
817 if (ar->testmode == 0)
820 ath6kl_dbg(ATH6KL_DBG_BOOT, "testmode %d\n", ar->testmode);
822 if (ar->testmode == 2) {
823 if (ar->hw.fw.utf == NULL) {
829 ar->hw.fw.dir, ar->hw.fw.utf);
831 if (ar->hw.fw.tcmd == NULL) {
837 ar->hw.fw.dir, ar->hw.fw.tcmd);
840 set_bit(TESTMODE, &ar->flag);
842 ret = ath6kl_get_fw(ar, filename, &ar->fw, &ar->fw_len);
845 ar->testmode, filename, ret);
852 static int ath6kl_fetch_fw_file(struct ath6kl *ar)
857 if (ar->fw != NULL)
861 if (WARN_ON(ar->hw.fw.fw == NULL))
865 ar->hw.fw.dir, ar->hw.fw.fw);
867 ret = ath6kl_get_fw(ar, filename, &ar->fw, &ar->fw_len);
877 static int ath6kl_fetch_patch_file(struct ath6kl *ar)
882 if (ar->fw_patch != NULL)
885 if (ar->hw.fw.patch == NULL)
889 ar->hw.fw.dir, ar->hw.fw.patch);
891 ret = ath6kl_get_fw(ar, filename, &ar->fw_patch,
892 &ar->fw_patch_len);
902 static int ath6kl_fetch_testscript_file(struct ath6kl *ar)
907 if (ar->testmode != 2)
910 if (ar->fw_testscript != NULL)
913 if (ar->hw.fw.testscript == NULL)
917 ar->hw.fw.dir, ar->hw.fw.testscript);
919 ret = ath6kl_get_fw(ar, filename, &ar->fw_testscript,
920 &ar->fw_testscript_len);
930 static int ath6kl_fetch_fw_api1(struct ath6kl *ar)
934 ret = ath6kl_fetch_otp_file(ar);
938 ret = ath6kl_fetch_fw_file(ar);
942 ret = ath6kl_fetch_patch_file(ar);
946 ret = ath6kl_fetch_testscript_file(ar);
953 static int ath6kl_fetch_fw_apin(struct ath6kl *ar, const char *name)
963 snprintf(filename, sizeof(filename), "%s/%s", ar->hw.fw.dir, name);
965 ret = request_firmware(&fw, filename, ar->dev);
1017 strscpy(ar->wiphy->fw_version, data,
1018 min(sizeof(ar->wiphy->fw_version), ie_len+1));
1022 ar->wiphy->fw_version);
1028 ar->fw_otp = kmemdup(data, ie_len, GFP_KERNEL);
1030 if (ar->fw_otp == NULL) {
1036 ar->fw_otp_len = ie_len;
1043 if (ar->fw != NULL)
1046 ar->fw = vmalloc(ie_len);
1048 if (ar->fw == NULL) {
1054 memcpy(ar->fw, data, ie_len);
1055 ar->fw_len = ie_len;
1061 ar->fw_patch = kmemdup(data, ie_len, GFP_KERNEL);
1063 if (ar->fw_patch == NULL) {
1069 ar->fw_patch_len = ie_len;
1073 ar->hw.reserved_ram_size = le32_to_cpup(val);
1077 ar->hw.reserved_ram_size);
1092 __set_bit(i, ar->fw_capabilities);
1096 ar->fw_capabilities,
1097 sizeof(ar->fw_capabilities));
1104 ar->hw.dataset_patch_addr = le32_to_cpup(val);
1108 ar->hw.dataset_patch_addr);
1115 ar->hw.board_addr = le32_to_cpup(val);
1119 ar->hw.board_addr);
1126 ar->vif_max = min_t(unsigned int, le32_to_cpup(val),
1129 if (ar->vif_max > 1 && !ar->p2p)
1130 ar->max_norm_iface = 2;
1133 "found vif max ie %d\n", ar->vif_max);
1152 int ath6kl_init_fetch_firmwares(struct ath6kl *ar)
1156 ret = ath6kl_fetch_board_file(ar);
1160 ret = ath6kl_fetch_testmode_file(ar);
1164 ret = ath6kl_fetch_fw_apin(ar, ATH6KL_FW_API5_FILE);
1166 ar->fw_api = 5;
1170 ret = ath6kl_fetch_fw_apin(ar, ATH6KL_FW_API4_FILE);
1172 ar->fw_api = 4;
1176 ret = ath6kl_fetch_fw_apin(ar, ATH6KL_FW_API3_FILE);
1178 ar->fw_api = 3;
1182 ret = ath6kl_fetch_fw_apin(ar, ATH6KL_FW_API2_FILE);
1184 ar->fw_api = 2;
1188 ret = ath6kl_fetch_fw_api1(ar);
1192 ar->fw_api = 1;
1195 ath6kl_dbg(ATH6KL_DBG_BOOT, "using fw api %d\n", ar->fw_api);
1200 static int ath6kl_upload_board_file(struct ath6kl *ar)
1206 if (WARN_ON(ar->fw_board == NULL))
1214 if (ar->hw.board_addr != 0) {
1215 board_address = ar->hw.board_addr;
1216 ath6kl_bmi_write_hi32(ar, hi_board_data,
1219 ret = ath6kl_bmi_read_hi32(ar, hi_board_data, &board_address);
1227 ret = ath6kl_bmi_read_hi32(ar, hi_board_ext_data, &board_ext_address);
1233 if (ar->target_type == TARGET_TYPE_AR6003 &&
1239 switch (ar->target_type) {
1243 if (ar->fw_board_len > (board_data_size + board_ext_data_size))
1256 ar->fw_board_len == (board_data_size + board_ext_data_size)) {
1262 ret = ath6kl_bmi_write(ar, board_ext_address,
1263 ar->fw_board + board_data_size,
1274 ath6kl_bmi_write_hi32(ar, hi_board_ext_data_config, param);
1277 if (ar->fw_board_len < board_data_size) {
1278 ath6kl_err("Too small board file: %zu\n", ar->fw_board_len);
1286 ret = ath6kl_bmi_write(ar, board_address, ar->fw_board,
1295 if ((ar->version.target_ver == AR6004_HW_1_3_VERSION) ||
1296 (ar->version.target_ver == AR6004_HW_3_0_VERSION))
1301 ath6kl_bmi_write_hi32(ar, hi_board_data_initialized, param);
1306 static int ath6kl_upload_otp(struct ath6kl *ar)
1312 if (ar->fw_otp == NULL)
1315 address = ar->hw.app_load_addr;
1318 ar->fw_otp_len);
1320 ret = ath6kl_bmi_fast_download(ar, address, ar->fw_otp,
1321 ar->fw_otp_len);
1328 ret = ath6kl_bmi_read_hi32(ar, hi_app_start, &address);
1335 if (ar->hw.app_start_override_addr == 0) {
1336 ar->hw.app_start_override_addr = address;
1342 ar->hw.app_start_override_addr);
1346 ar->hw.app_start_override_addr);
1348 ath6kl_bmi_execute(ar, ar->hw.app_start_override_addr, &param);
1353 static int ath6kl_upload_firmware(struct ath6kl *ar)
1358 if (WARN_ON(ar->fw == NULL))
1361 address = ar->hw.app_load_addr;
1364 address, ar->fw_len);
1366 ret = ath6kl_bmi_fast_download(ar, address, ar->fw, ar->fw_len);
1377 if (ar->target_type != TARGET_TYPE_AR6004) {
1378 address = ar->hw.app_start_override_addr;
1379 ath6kl_bmi_set_app_start(ar, address);
1384 static int ath6kl_upload_patch(struct ath6kl *ar)
1389 if (ar->fw_patch == NULL)
1392 address = ar->hw.dataset_patch_addr;
1395 address, ar->fw_patch_len);
1397 ret = ath6kl_bmi_write(ar, address, ar->fw_patch, ar->fw_patch_len);
1403 ath6kl_bmi_write_hi32(ar, hi_dset_list_head, address);
1408 static int ath6kl_upload_testscript(struct ath6kl *ar)
1413 if (ar->testmode != 2)
1416 if (ar->fw_testscript == NULL)
1419 address = ar->hw.testscript_addr;
1422 address, ar->fw_testscript_len);
1424 ret = ath6kl_bmi_write(ar, address, ar->fw_testscript,
1425 ar->fw_testscript_len);
1431 ath6kl_bmi_write_hi32(ar, hi_ota_testscript, address);
1433 if ((ar->version.target_ver != AR6004_HW_1_3_VERSION) &&
1434 (ar->version.target_ver != AR6004_HW_3_0_VERSION))
1435 ath6kl_bmi_write_hi32(ar, hi_end_ram_reserve_sz, 4096);
1437 ath6kl_bmi_write_hi32(ar, hi_test_apps_related, 1);
1442 static int ath6kl_init_upload(struct ath6kl *ar)
1447 if (ar->target_type != TARGET_TYPE_AR6003 &&
1448 ar->target_type != TARGET_TYPE_AR6004)
1453 status = ath6kl_bmi_reg_read(ar, address, &param);
1460 status = ath6kl_bmi_reg_write(ar, address, param);
1465 status = ath6kl_bmi_reg_read(ar, address, &param);
1472 status = ath6kl_bmi_reg_write(ar, address, param);
1481 if (ar->target_type != TARGET_TYPE_AR6004) {
1482 status = ath6kl_bmi_reg_write(ar, ATH6KL_ANALOG_PLL_REGISTER,
1492 status = ath6kl_bmi_reg_write(ar, address, param);
1500 status = ath6kl_bmi_reg_write(ar, address, param);
1505 if (ar->hw.flags & ATH6KL_HW_SDIO_CRC_ERROR_WAR) {
1510 status = ath6kl_bmi_reg_write(ar, address, param);
1517 status = ath6kl_bmi_reg_write(ar, address, param);
1522 status = ath6kl_bmi_reg_write(ar, address, param);
1527 status = ath6kl_bmi_reg_write(ar, address, param);
1532 status = ath6kl_bmi_reg_write(ar, address, param);
1538 status = ath6kl_upload_board_file(ar);
1543 status = ath6kl_upload_otp(ar);
1548 status = ath6kl_upload_firmware(ar);
1552 status = ath6kl_upload_patch(ar);
1557 status = ath6kl_upload_testscript(ar);
1563 status = ath6kl_bmi_reg_write(ar, address, sleep);
1569 status = ath6kl_bmi_reg_write(ar, address, param);
1576 int ath6kl_init_hw_params(struct ath6kl *ar)
1584 if (hw->id == ar->version.target_ver)
1590 ar->version.target_ver);
1594 ar->hw = *hw;
1598 ar->version.target_ver, ar->target_type,
1599 ar->hw.dataset_patch_addr, ar->hw.app_load_addr);
1602 ar->hw.app_start_override_addr, ar->hw.board_ext_data_addr,
1603 ar->hw.reserved_ram_size);
1606 ar->hw.refclk_hz, ar->hw.uarttx_pin);
1661 static void ath6kl_init_get_fwcaps(struct ath6kl *ar, char *buf, size_t buf_len)
1663 u8 *data = (u8 *) ar->fw_capabilities;
1672 if (index >= sizeof(ar->fw_capabilities) * 4)
1698 static int ath6kl_init_hw_reset(struct ath6kl *ar)
1702 return ath6kl_diag_write32(ar, RESET_CONTROL_ADDRESS,
1706 static int __ath6kl_init_hw_start(struct ath6kl *ar)
1714 ret = ath6kl_hif_power_on(ar);
1718 ret = ath6kl_configure_target(ar);
1722 ret = ath6kl_init_upload(ar);
1727 ret = ath6kl_bmi_done(ar);
1736 ret = ath6kl_htc_wait_target(ar->htc_target);
1746 ath6kl_init_hw_reset(ar);
1753 ret = ath6kl_init_service_ep(ar);
1760 ath6kl_htc_credit_setup(ar->htc_target, &ar->credit_state_info);
1763 ret = ath6kl_htc_start(ar->htc_target);
1766 ath6kl_cookie_cleanup(ar);
1771 timeleft = wait_event_interruptible_timeout(ar->event_wq,
1773 &ar->flag),
1776 clear_bit(WMI_READY, &ar->flag);
1785 if (test_and_clear_bit(FIRST_BOOT, &ar->flag)) {
1787 ar->hw.name,
1788 ath6kl_init_get_hif_name(ar->hif_type),
1789 ar->wiphy->fw_version,
1790 ar->fw_api,
1791 test_bit(TESTMODE, &ar->flag) ? " testmode" : "");
1792 ath6kl_init_get_fwcaps(ar, buf, sizeof(buf));
1796 if (ar->version.abi_ver != ATH6KL_ABI_VERSION) {
1798 ATH6KL_ABI_VERSION, ar->version.abi_ver);
1807 if ((ath6kl_set_host_app_area(ar)) != 0)
1810 for (i = 0; i < ar->vif_max; i++) {
1811 ret = ath6kl_target_config_wlan_params(ar, i);
1819 ath6kl_htc_stop(ar->htc_target);
1821 ath6kl_hif_cleanup_scatter(ar);
1823 ath6kl_hif_power_off(ar);
1828 int ath6kl_init_hw_start(struct ath6kl *ar)
1832 err = __ath6kl_init_hw_start(ar);
1835 ar->state = ATH6KL_STATE_ON;
1839 static int __ath6kl_init_hw_stop(struct ath6kl *ar)
1845 ath6kl_htc_stop(ar->htc_target);
1847 ath6kl_hif_stop(ar);
1849 ath6kl_bmi_reset(ar);
1851 ret = ath6kl_hif_power_off(ar);
1858 int ath6kl_init_hw_stop(struct ath6kl *ar)
1862 err = __ath6kl_init_hw_stop(ar);
1865 ar->state = ATH6KL_STATE_OFF;
1869 void ath6kl_init_hw_restart(struct ath6kl *ar)
1871 clear_bit(WMI_READY, &ar->flag);
1873 ath6kl_cfg80211_stop_all(ar);
1875 if (__ath6kl_init_hw_stop(ar)) {
1880 if (__ath6kl_init_hw_start(ar)) {
1886 void ath6kl_stop_txrx(struct ath6kl *ar)
1891 set_bit(DESTROY_IN_PROGRESS, &ar->flag);
1893 if (down_interruptible(&ar->sem)) {
1899 aggr_reset_state(ar->sta_list[i].aggr_conn);
1901 spin_lock_bh(&ar->list_lock);
1902 list_for_each_entry_safe(vif, tmp_vif, &ar->vif_list, list) {
1904 spin_unlock_bh(&ar->list_lock);
1905 ath6kl_cfg80211_vif_stop(vif, test_bit(WMI_READY, &ar->flag));
1907 wiphy_lock(ar->wiphy);
1909 wiphy_unlock(ar->wiphy);
1911 spin_lock_bh(&ar->list_lock);
1913 spin_unlock_bh(&ar->list_lock);
1915 clear_bit(WMI_READY, &ar->flag);
1917 if (ar->fw_recovery.enable)
1918 del_timer_sync(&ar->fw_recovery.hb_timer);
1929 ath6kl_wmi_shutdown(ar->wmi);
1931 clear_bit(WMI_ENABLED, &ar->flag);
1932 if (ar->htc_target) {
1934 ath6kl_htc_stop(ar->htc_target);
1941 ath6kl_init_hw_reset(ar);
1943 up(&ar->sem);