init.c revision 6e92b416b0aa6a59629cc32ee2b27129d73b98b8
1f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho/* 2f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho * This file is part of wl1271 3f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho * 4f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho * Copyright (C) 2009 Nokia Corporation 5f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho * 6f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho * Contact: Luciano Coelho <luciano.coelho@nokia.com> 7f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho * 8f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho * This program is free software; you can redistribute it and/or 9f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho * modify it under the terms of the GNU General Public License 10f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho * version 2 as published by the Free Software Foundation. 11f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho * 12f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho * This program is distributed in the hope that it will be useful, but 13f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho * WITHOUT ANY WARRANTY; without even the implied warranty of 14f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho * General Public License for more details. 16f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho * 17f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho * You should have received a copy of the GNU General Public License 18f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho * along with this program; if not, write to the Free Software 19f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 20f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho * 02110-1301 USA 21f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho * 22f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho */ 23f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 24f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho#include <linux/kernel.h> 25f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho#include <linux/module.h> 26f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 27f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho#include "wl1271_init.h" 28f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho#include "wl12xx_80211.h" 29f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho#include "wl1271_acx.h" 30f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho#include "wl1271_cmd.h" 31f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho#include "wl1271_reg.h" 32f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 33f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelhostatic int wl1271_init_hwenc_config(struct wl1271 *wl) 34f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho{ 35f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho int ret; 36f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 37f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_acx_feature_cfg(wl); 38f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) { 39f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho wl1271_warning("couldn't set feature config"); 40f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return ret; 41f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho } 42f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 43f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_cmd_set_default_wep_key(wl, wl->default_key); 44f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) { 45f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho wl1271_warning("couldn't set default key"); 46f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return ret; 47f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho } 48f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 49f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return 0; 50f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho} 51f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 52f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelhostatic int wl1271_init_templates_config(struct wl1271 *wl) 53f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho{ 54f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho int ret; 55f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 56f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho /* send empty templates for fw memory reservation */ 57f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_cmd_template_set(wl, CMD_TEMPL_CFG_PROBE_REQ_2_4, NULL, 58f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho sizeof(struct wl12xx_probe_req_template)); 59f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 60f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return ret; 61f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 62abb0b3bfb2d2411034b721df21c31964265b851eTeemu Paasikivi if (wl1271_11a_enabled()) { 63abb0b3bfb2d2411034b721df21c31964265b851eTeemu Paasikivi ret = wl1271_cmd_template_set(wl, CMD_TEMPL_CFG_PROBE_REQ_5, 64abb0b3bfb2d2411034b721df21c31964265b851eTeemu Paasikivi NULL, 65abb0b3bfb2d2411034b721df21c31964265b851eTeemu Paasikivi sizeof(struct wl12xx_probe_req_template)); 66abb0b3bfb2d2411034b721df21c31964265b851eTeemu Paasikivi if (ret < 0) 67abb0b3bfb2d2411034b721df21c31964265b851eTeemu Paasikivi return ret; 68abb0b3bfb2d2411034b721df21c31964265b851eTeemu Paasikivi } 69abb0b3bfb2d2411034b721df21c31964265b851eTeemu Paasikivi 70f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_cmd_template_set(wl, CMD_TEMPL_NULL_DATA, NULL, 71f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho sizeof(struct wl12xx_null_data_template)); 72f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 73f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return ret; 74f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 75f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_cmd_template_set(wl, CMD_TEMPL_PS_POLL, NULL, 76f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho sizeof(struct wl12xx_ps_poll_template)); 77f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 78f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return ret; 79f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 80f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_cmd_template_set(wl, CMD_TEMPL_QOS_NULL_DATA, NULL, 81f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho sizeof 82f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho (struct wl12xx_qos_null_data_template)); 83f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 84f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return ret; 85f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 86f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_cmd_template_set(wl, CMD_TEMPL_PROBE_RESPONSE, NULL, 87f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho sizeof 88f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho (struct wl12xx_probe_resp_template)); 89f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 90f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return ret; 91f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 92f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_cmd_template_set(wl, CMD_TEMPL_BEACON, NULL, 93f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho sizeof 94f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho (struct wl12xx_beacon_template)); 95f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 96f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return ret; 97f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 98f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return 0; 99f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho} 100f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 101f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelhostatic int wl1271_init_rx_config(struct wl1271 *wl, u32 config, u32 filter) 102f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho{ 103f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho int ret; 104f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 1058793f9bb19c00b26532e37f1f516e1d9c7bc0476Juuso Oikarinen ret = wl1271_acx_rx_msdu_life_time(wl); 106f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 107f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return ret; 108f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 109f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_acx_rx_config(wl, config, filter); 110f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 111f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return ret; 112f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 113f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return 0; 114f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho} 115f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 116f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelhostatic int wl1271_init_phy_config(struct wl1271 *wl) 117f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho{ 118f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho int ret; 119f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 120f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_acx_pd_threshold(wl); 121f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 122f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return ret; 123f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 124f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_acx_slot(wl, DEFAULT_SLOT_TIME); 125f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 126f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return ret; 127f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 128c87dec9f189b884df215756e285b9281cf065206Juuso Oikarinen ret = wl1271_acx_group_address_tbl(wl, true, NULL, 0); 129f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 130f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return ret; 131f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 132f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_acx_service_period_timeout(wl); 133f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 134f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return ret; 135f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 1368793f9bb19c00b26532e37f1f516e1d9c7bc0476Juuso Oikarinen ret = wl1271_acx_rts_threshold(wl, wl->conf.rx.rts_threshold); 137f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 138f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return ret; 139f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 140f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return 0; 141f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho} 142f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 143f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelhostatic int wl1271_init_beacon_filter(struct wl1271 *wl) 144f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho{ 145f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho int ret; 146f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 1471922167b9de575d9d1a56be9b80f0fa3b22785f9Juuso Oikarinen /* disable beacon filtering at this stage */ 1481922167b9de575d9d1a56be9b80f0fa3b22785f9Juuso Oikarinen ret = wl1271_acx_beacon_filter_opt(wl, false); 149f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 150f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return ret; 151f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 152f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_acx_beacon_filter_table(wl); 153f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 154f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return ret; 155f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 156f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return 0; 157f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho} 158f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 159f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelhostatic int wl1271_init_pta(struct wl1271 *wl) 160f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho{ 161f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho int ret; 162f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 163f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_acx_sg_enable(wl); 164f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 165f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return ret; 166f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 167f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_acx_sg_cfg(wl); 168f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 169f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return ret; 170f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 171f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return 0; 172f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho} 173f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 174f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelhostatic int wl1271_init_energy_detection(struct wl1271 *wl) 175f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho{ 176f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho int ret; 177f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 178f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_acx_cca_threshold(wl); 179f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 180f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return ret; 181f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 182f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return 0; 183f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho} 184f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 185f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelhostatic int wl1271_init_beacon_broadcast(struct wl1271 *wl) 186f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho{ 187f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho int ret; 188f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 189f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_acx_bcn_dtim_options(wl); 190f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 191f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return ret; 192f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 193f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return 0; 194f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho} 195f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 196f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelhoint wl1271_hw_init(struct wl1271 *wl) 197f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho{ 198f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho int ret; 199f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 20098b5dd5ded8cb59b598b2c0c396100054779eda7Luciano Coelho ret = wl1271_cmd_general_parms(wl); 2014a90406b876cade9bb8d9c95b048d60fb979ba6bLuciano Coelho if (ret < 0) 202f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return ret; 203f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 20498b5dd5ded8cb59b598b2c0c396100054779eda7Luciano Coelho ret = wl1271_cmd_radio_parms(wl); 2054a90406b876cade9bb8d9c95b048d60fb979ba6bLuciano Coelho if (ret < 0) 206f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return ret; 207f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 208f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho /* Template settings */ 209f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_init_templates_config(wl); 210f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 211f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return ret; 212f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 213f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho /* Default memory configuration */ 214f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_acx_init_mem_config(wl); 215f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 216f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return ret; 217f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 218f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho /* RX config */ 219f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_init_rx_config(wl, 220eb5b28d021a1b96050f7af46e9140eb0051cc6d8Juuso Oikarinen RX_CFG_PROMISCUOUS | RX_CFG_TSF, 221eb5b28d021a1b96050f7af46e9140eb0051cc6d8Juuso Oikarinen RX_FILTER_OPTION_DEF); 222f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho /* RX_CONFIG_OPTION_ANY_DST_ANY_BSS, 223f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho RX_FILTER_OPTION_FILTER_ALL); */ 224f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 225f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho goto out_free_memmap; 226f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 227f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho /* PHY layer config */ 228f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_init_phy_config(wl); 229f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 230f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho goto out_free_memmap; 231f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 2326e92b416b0aa6a59629cc32ee2b27129d73b98b8Luciano Coelho ret = wl1271_acx_dco_itrim_params(wl); 2336e92b416b0aa6a59629cc32ee2b27129d73b98b8Luciano Coelho if (ret < 0) 2346e92b416b0aa6a59629cc32ee2b27129d73b98b8Luciano Coelho goto out_free_memmap; 2356e92b416b0aa6a59629cc32ee2b27129d73b98b8Luciano Coelho 236344152361e6d14ade61d7f43678db7418cb445dbJuuso Oikarinen /* Initialize connection monitoring thresholds */ 237344152361e6d14ade61d7f43678db7418cb445dbJuuso Oikarinen ret = wl1271_acx_conn_monit_params(wl); 238344152361e6d14ade61d7f43678db7418cb445dbJuuso Oikarinen if (ret < 0) 239344152361e6d14ade61d7f43678db7418cb445dbJuuso Oikarinen goto out_free_memmap; 240344152361e6d14ade61d7f43678db7418cb445dbJuuso Oikarinen 241f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho /* Beacon filtering */ 242f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_init_beacon_filter(wl); 243f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 244f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho goto out_free_memmap; 245f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 246f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho /* Configure TX patch complete interrupt behavior */ 247f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_acx_tx_config_options(wl); 248f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 249f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho goto out_free_memmap; 250f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 251f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho /* RX complete interrupt pacing */ 252f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_acx_init_rx_interrupt(wl); 253f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 254f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho goto out_free_memmap; 255f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 256f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho /* Bluetooth WLAN coexistence */ 257f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_init_pta(wl); 258f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 259f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho goto out_free_memmap; 260f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 261f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho /* Energy detection */ 262f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_init_energy_detection(wl); 263f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 264f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho goto out_free_memmap; 265f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 266f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho /* Beacons and boradcast settings */ 267f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_init_beacon_broadcast(wl); 268f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 269f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho goto out_free_memmap; 270f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 271f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho /* Default fragmentation threshold */ 272f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_acx_frag_threshold(wl); 273f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 274f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho goto out_free_memmap; 275f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 276f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho /* Default TID configuration */ 277f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_acx_tid_cfg(wl); 278f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 279f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho goto out_free_memmap; 280f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 281f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho /* Default AC configuration */ 282f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_acx_ac_cfg(wl); 283f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 284f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho goto out_free_memmap; 285f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 286f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho /* Configure TX rate classes */ 287ac9b40fac6983ab30e8b5019a5d2abda200c89d5Luciano Coelho ret = wl1271_acx_rate_policies(wl, WL1271_DEFAULT_BASIC_RATE_SET); 288f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 289f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho goto out_free_memmap; 290f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 291f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho /* Enable data path */ 292f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_cmd_data_path(wl, wl->channel, 1); 293f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 294f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho goto out_free_memmap; 295f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 296f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho /* Configure for ELP power saving */ 297f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_acx_sleep_auth(wl, WL1271_PSM_ELP); 298f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 299f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho goto out_free_memmap; 300f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 301f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho /* Configure HW encryption */ 302f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_init_hwenc_config(wl); 303f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 304f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho goto out_free_memmap; 305f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 3063cfd6cf960b2b030ccae1144a5c0dcd91c7c56a8Juuso Oikarinen /* Configure smart reflex */ 3073cfd6cf960b2b030ccae1144a5c0dcd91c7c56a8Juuso Oikarinen ret = wl1271_acx_smart_reflex(wl); 3083cfd6cf960b2b030ccae1144a5c0dcd91c7c56a8Juuso Oikarinen if (ret < 0) 3093cfd6cf960b2b030ccae1144a5c0dcd91c7c56a8Juuso Oikarinen goto out_free_memmap; 3103cfd6cf960b2b030ccae1144a5c0dcd91c7c56a8Juuso Oikarinen 311f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return 0; 312f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 313f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho out_free_memmap: 314f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho kfree(wl->target_mem_map); 315344152361e6d14ade61d7f43678db7418cb445dbJuuso Oikarinen wl->target_mem_map = NULL; 316f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 317f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return ret; 318f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho} 319