init.c revision abb0b3bfb2d2411034b721df21c31964265b851e
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 Coelhostatic int wl1271_init_general_parms(struct wl1271 *wl) 197f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho{ 198f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho struct wl1271_general_parms *gen_parms; 19947fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen struct conf_general_parms *g = &wl->conf.init.genparam; 200f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho int ret; 201f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 202f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho gen_parms = kzalloc(sizeof(*gen_parms), GFP_KERNEL); 203f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (!gen_parms) 204f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return -ENOMEM; 205f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 206f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho gen_parms->id = TEST_CMD_INI_FILE_GENERAL_PARAM; 207f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 20847fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen gen_parms->ref_clk = g->ref_clk; 20947fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen gen_parms->settling_time = g->settling_time; 21047fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen gen_parms->clk_valid_on_wakeup = g->clk_valid_on_wakeup; 21147fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen gen_parms->dc2dcmode = g->dc2dcmode; 21247fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen gen_parms->single_dual_band = g->single_dual_band; 21347fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen gen_parms->tx_bip_fem_autodetect = g->tx_bip_fem_autodetect; 21447fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen gen_parms->tx_bip_fem_manufacturer = g->tx_bip_fem_manufacturer; 21547fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen gen_parms->settings = g->settings; 216f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 217f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_cmd_test(wl, gen_parms, sizeof(*gen_parms), 0); 218f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) { 219f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho wl1271_warning("CMD_INI_FILE_GENERAL_PARAM failed"); 220f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return ret; 221f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho } 222f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 223f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho kfree(gen_parms); 224f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return 0; 225f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho} 226f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 227f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelhostatic int wl1271_init_radio_parms(struct wl1271 *wl) 228f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho{ 229f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho struct wl1271_radio_parms *radio_parms; 23047fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen struct conf_radio_parms *r = &wl->conf.init.radioparam; 23147fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen int i, ret; 232f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 233f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho radio_parms = kzalloc(sizeof(*radio_parms), GFP_KERNEL); 234f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (!radio_parms) 235f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return -ENOMEM; 236f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 237f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho radio_parms->id = TEST_CMD_INI_FILE_RADIO_PARAM; 238f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 239f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho /* Static radio parameters */ 24047fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen radio_parms->rx_trace_loss = r->rx_trace_loss; 24147fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen radio_parms->tx_trace_loss = r->tx_trace_loss; 24247fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen memcpy(radio_parms->rx_rssi_and_proc_compens, 24347fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen r->rx_rssi_and_proc_compens, 24447fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen CONF_RSSI_AND_PROCESS_COMPENSATION_SIZE); 24547fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen 24647fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen memcpy(radio_parms->rx_trace_loss_5, r->rx_trace_loss_5, 24747fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen CONF_NUMBER_OF_SUB_BANDS_5); 24847fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen memcpy(radio_parms->tx_trace_loss_5, r->tx_trace_loss_5, 24947fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen CONF_NUMBER_OF_SUB_BANDS_5); 25047fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen memcpy(radio_parms->rx_rssi_and_proc_compens_5, 25147fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen r->rx_rssi_and_proc_compens_5, 25247fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen CONF_RSSI_AND_PROCESS_COMPENSATION_SIZE); 253f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 254f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho /* Dynamic radio parameters */ 25547fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen radio_parms->tx_ref_pd_voltage = cpu_to_le16(r->tx_ref_pd_voltage); 25647fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen radio_parms->tx_ref_power = r->tx_ref_power; 25747fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen radio_parms->tx_offset_db = r->tx_offset_db; 25847fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen 25947fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen memcpy(radio_parms->tx_rate_limits_normal, r->tx_rate_limits_normal, 26047fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen CONF_NUMBER_OF_RATE_GROUPS); 26147fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen memcpy(radio_parms->tx_rate_limits_degraded, r->tx_rate_limits_degraded, 26247fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen CONF_NUMBER_OF_RATE_GROUPS); 26347fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen 26447fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen memcpy(radio_parms->tx_channel_limits_11b, r->tx_channel_limits_11b, 26547fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen CONF_NUMBER_OF_CHANNELS_2_4); 26647fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen memcpy(radio_parms->tx_channel_limits_ofdm, r->tx_channel_limits_ofdm, 26747fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen CONF_NUMBER_OF_CHANNELS_2_4); 26847fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen memcpy(radio_parms->tx_pdv_rate_offsets, r->tx_pdv_rate_offsets, 26947fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen CONF_NUMBER_OF_RATE_GROUPS); 27047fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen memcpy(radio_parms->tx_ibias, r->tx_ibias, CONF_NUMBER_OF_RATE_GROUPS); 27147fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen 27247fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen radio_parms->rx_fem_insertion_loss = r->rx_fem_insertion_loss; 27347fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen 27447fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen for (i = 0; i < CONF_NUMBER_OF_SUB_BANDS_5; i++) 27547fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen radio_parms->tx_ref_pd_voltage_5[i] = 27647fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen cpu_to_le16(r->tx_ref_pd_voltage_5[i]); 27747fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen memcpy(radio_parms->tx_ref_power_5, r->tx_ref_power_5, 27847fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen CONF_NUMBER_OF_SUB_BANDS_5); 27947fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen memcpy(radio_parms->tx_offset_db_5, r->tx_offset_db_5, 28047fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen CONF_NUMBER_OF_SUB_BANDS_5); 28147fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen memcpy(radio_parms->tx_rate_limits_normal_5, 28247fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen r->tx_rate_limits_normal_5, CONF_NUMBER_OF_RATE_GROUPS); 28347fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen memcpy(radio_parms->tx_rate_limits_degraded_5, 28447fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen r->tx_rate_limits_degraded_5, CONF_NUMBER_OF_RATE_GROUPS); 28547fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen memcpy(radio_parms->tx_channel_limits_ofdm_5, 28647fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen r->tx_channel_limits_ofdm_5, CONF_NUMBER_OF_CHANNELS_5); 28747fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen memcpy(radio_parms->tx_pdv_rate_offsets_5, r->tx_pdv_rate_offsets_5, 28847fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen CONF_NUMBER_OF_RATE_GROUPS); 28947fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen memcpy(radio_parms->tx_ibias_5, r->tx_ibias_5, 29047fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen CONF_NUMBER_OF_RATE_GROUPS); 29147fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen memcpy(radio_parms->rx_fem_insertion_loss_5, 29247fab7d589d46d87a5dbfd7f2ddd53deccfad504Juuso Oikarinen r->rx_fem_insertion_loss_5, CONF_NUMBER_OF_SUB_BANDS_5); 293f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 294f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_cmd_test(wl, radio_parms, sizeof(*radio_parms), 0); 295f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 296f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho wl1271_warning("CMD_INI_FILE_RADIO_PARAM failed"); 297f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 298f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho kfree(radio_parms); 299f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return ret; 300f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho} 301f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 302f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelhoint wl1271_hw_init(struct wl1271 *wl) 303f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho{ 304f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho int ret; 305f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 306f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_init_general_parms(wl); 307f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 308f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return ret; 309f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 310f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_init_radio_parms(wl); 311f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 312f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return ret; 313f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 314f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho /* Template settings */ 315f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_init_templates_config(wl); 316f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 317f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return ret; 318f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 319f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho /* Default memory configuration */ 320f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_acx_init_mem_config(wl); 321f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 322f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return ret; 323f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 324f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho /* RX config */ 325f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_init_rx_config(wl, 326eb5b28d021a1b96050f7af46e9140eb0051cc6d8Juuso Oikarinen RX_CFG_PROMISCUOUS | RX_CFG_TSF, 327eb5b28d021a1b96050f7af46e9140eb0051cc6d8Juuso Oikarinen RX_FILTER_OPTION_DEF); 328f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho /* RX_CONFIG_OPTION_ANY_DST_ANY_BSS, 329f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho RX_FILTER_OPTION_FILTER_ALL); */ 330f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 331f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho goto out_free_memmap; 332f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 333f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho /* PHY layer config */ 334f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_init_phy_config(wl); 335f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 336f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho goto out_free_memmap; 337f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 338344152361e6d14ade61d7f43678db7418cb445dbJuuso Oikarinen /* Initialize connection monitoring thresholds */ 339344152361e6d14ade61d7f43678db7418cb445dbJuuso Oikarinen ret = wl1271_acx_conn_monit_params(wl); 340344152361e6d14ade61d7f43678db7418cb445dbJuuso Oikarinen if (ret < 0) 341344152361e6d14ade61d7f43678db7418cb445dbJuuso Oikarinen goto out_free_memmap; 342344152361e6d14ade61d7f43678db7418cb445dbJuuso Oikarinen 343f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho /* Beacon filtering */ 344f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_init_beacon_filter(wl); 345f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 346f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho goto out_free_memmap; 347f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 348f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho /* Configure TX patch complete interrupt behavior */ 349f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_acx_tx_config_options(wl); 350f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 351f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho goto out_free_memmap; 352f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 353f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho /* RX complete interrupt pacing */ 354f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_acx_init_rx_interrupt(wl); 355f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 356f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho goto out_free_memmap; 357f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 358f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho /* Bluetooth WLAN coexistence */ 359f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_init_pta(wl); 360f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 361f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho goto out_free_memmap; 362f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 363f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho /* Energy detection */ 364f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_init_energy_detection(wl); 365f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 366f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho goto out_free_memmap; 367f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 368f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho /* Beacons and boradcast settings */ 369f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_init_beacon_broadcast(wl); 370f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 371f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho goto out_free_memmap; 372f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 373f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho /* Default fragmentation threshold */ 374f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_acx_frag_threshold(wl); 375f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 376f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho goto out_free_memmap; 377f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 378f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho /* Default TID configuration */ 379f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_acx_tid_cfg(wl); 380f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 381f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho goto out_free_memmap; 382f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 383f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho /* Default AC configuration */ 384f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_acx_ac_cfg(wl); 385f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 386f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho goto out_free_memmap; 387f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 388f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho /* Configure TX rate classes */ 38945b531a86f93c82d8e390e19a6258111b3627bb0Juuso Oikarinen ret = wl1271_acx_rate_policies(wl, CONF_TX_RATE_MASK_ALL); 390f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 391f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho goto out_free_memmap; 392f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 393f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho /* Enable data path */ 394f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_cmd_data_path(wl, wl->channel, 1); 395f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 396f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho goto out_free_memmap; 397f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 398f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho /* Configure for ELP power saving */ 399f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_acx_sleep_auth(wl, WL1271_PSM_ELP); 400f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 401f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho goto out_free_memmap; 402f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 403f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho /* Configure HW encryption */ 404f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho ret = wl1271_init_hwenc_config(wl); 405f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho if (ret < 0) 406f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho goto out_free_memmap; 407f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 4083cfd6cf960b2b030ccae1144a5c0dcd91c7c56a8Juuso Oikarinen /* Configure smart reflex */ 4093cfd6cf960b2b030ccae1144a5c0dcd91c7c56a8Juuso Oikarinen ret = wl1271_acx_smart_reflex(wl); 4103cfd6cf960b2b030ccae1144a5c0dcd91c7c56a8Juuso Oikarinen if (ret < 0) 4113cfd6cf960b2b030ccae1144a5c0dcd91c7c56a8Juuso Oikarinen goto out_free_memmap; 4123cfd6cf960b2b030ccae1144a5c0dcd91c7c56a8Juuso Oikarinen 413f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return 0; 414f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 415f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho out_free_memmap: 416f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho kfree(wl->target_mem_map); 417344152361e6d14ade61d7f43678db7418cb445dbJuuso Oikarinen wl->target_mem_map = NULL; 418f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho 419f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho return ret; 420f5fc0f86b02afef1119b523623b4cde41475bc8cLuciano Coelho} 421