15e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao/* 25e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * Marvell Wireless LAN device driver: association and ad-hoc start/join 35e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * 45e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * Copyright (C) 2011, Marvell International Ltd. 55e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * 65e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * This software file (the "File") is distributed by Marvell International 75e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * Ltd. under the terms of the GNU General Public License Version 2, June 1991 85e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * (the "License"). You may use, redistribute and/or modify this File in 95e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * accordance with the terms and conditions of the License, a copy of which 105e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * is available by writing to the Free Software Foundation, Inc., 115e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA or on the 125e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. 135e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * 145e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE 155e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE 165e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * ARE EXPRESSLY DISCLAIMED. The License provides additional details about 175e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * this warranty disclaimer. 185e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao */ 195e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 205e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao#include "decl.h" 215e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao#include "ioctl.h" 225e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao#include "util.h" 235e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao#include "fw.h" 245e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao#include "main.h" 255e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao#include "wmm.h" 265e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao#include "11n.h" 275e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 285e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao#define CAPINFO_MASK (~(BIT(15) | BIT(14) | BIT(12) | BIT(11) | BIT(9))) 295e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 305e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao/* 315e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * Append a generic IE as a pass through TLV to a TLV buffer. 325e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * 335e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * This function is called from the network join command preparation routine. 345e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * 355e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * If the IE buffer has been setup by the application, this routine appends 365e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * the buffer as a pass through TLV type to the request. 375e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao */ 385e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhaostatic int 395e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhaomwifiex_cmd_append_generic_ie(struct mwifiex_private *priv, u8 **buffer) 405e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao{ 415e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao int ret_len = 0; 425e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao struct mwifiex_ie_types_header ie_header; 435e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 445e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Null Checks */ 455e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (!buffer) 465e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao return 0; 475e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (!(*buffer)) 485e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao return 0; 495e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 505e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* 515e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * If there is a generic ie buffer setup, append it to the return 525e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * parameter buffer pointer. 535e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao */ 545e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (priv->gen_ie_buf_len) { 555e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_dbg(priv->adapter->dev, "info: %s: append generic %d to %p\n", 565e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao __func__, priv->gen_ie_buf_len, *buffer); 575e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 585e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Wrap the generic IE buffer with a pass through TLV type */ 595e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao ie_header.type = cpu_to_le16(TLV_TYPE_PASSTHROUGH); 605e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao ie_header.len = cpu_to_le16(priv->gen_ie_buf_len); 615e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao memcpy(*buffer, &ie_header, sizeof(ie_header)); 625e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 635e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Increment the return size and the return buffer pointer 645e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao param */ 655e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao *buffer += sizeof(ie_header); 665e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao ret_len += sizeof(ie_header); 675e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 685e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Copy the generic IE buffer to the output buffer, advance 695e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao pointer */ 705e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao memcpy(*buffer, priv->gen_ie_buf, priv->gen_ie_buf_len); 715e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 725e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Increment the return size and the return buffer pointer 735e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao param */ 745e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao *buffer += priv->gen_ie_buf_len; 755e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao ret_len += priv->gen_ie_buf_len; 765e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 775e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Reset the generic IE buffer */ 785e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->gen_ie_buf_len = 0; 795e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao } 805e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 815e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* return the length appended to the buffer */ 825e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao return ret_len; 835e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao} 845e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 855e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao/* 865e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * Append TSF tracking info from the scan table for the target AP. 875e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * 885e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * This function is called from the network join command preparation routine. 895e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * 905e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * The TSF table TSF sent to the firmware contains two TSF values: 915e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * - The TSF of the target AP from its previous beacon/probe response 925e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * - The TSF timestamp of our local MAC at the time we observed the 935e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * beacon/probe response. 945e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * 955e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * The firmware uses the timestamp values to set an initial TSF value 965e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * in the MAC for the new association after a reassociation attempt. 975e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao */ 985e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhaostatic int 995e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhaomwifiex_cmd_append_tsf_tlv(struct mwifiex_private *priv, u8 **buffer, 1005e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao struct mwifiex_bssdescriptor *bss_desc) 1015e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao{ 1025e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao struct mwifiex_ie_types_tsf_timestamp tsf_tlv; 1031a5b306f5d7398c7ffb0f69fe9a2d0023f28deb9Bing Zhao __le64 tsf_val; 1045e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 1055e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Null Checks */ 1065e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (buffer == NULL) 1075e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao return 0; 1085e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (*buffer == NULL) 1095e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao return 0; 1105e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 1115e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao memset(&tsf_tlv, 0x00, sizeof(struct mwifiex_ie_types_tsf_timestamp)); 1125e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 1135e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao tsf_tlv.header.type = cpu_to_le16(TLV_TYPE_TSFTIMESTAMP); 1145e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao tsf_tlv.header.len = cpu_to_le16(2 * sizeof(tsf_val)); 1155e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 1165e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao memcpy(*buffer, &tsf_tlv, sizeof(tsf_tlv.header)); 1175e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao *buffer += sizeof(tsf_tlv.header); 1185e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 1191a5b306f5d7398c7ffb0f69fe9a2d0023f28deb9Bing Zhao /* TSF at the time when beacon/probe_response was received */ 1201a5b306f5d7398c7ffb0f69fe9a2d0023f28deb9Bing Zhao tsf_val = cpu_to_le64(bss_desc->network_tsf); 1211a5b306f5d7398c7ffb0f69fe9a2d0023f28deb9Bing Zhao memcpy(*buffer, &tsf_val, sizeof(tsf_val)); 1221a5b306f5d7398c7ffb0f69fe9a2d0023f28deb9Bing Zhao *buffer += sizeof(tsf_val); 1231a5b306f5d7398c7ffb0f69fe9a2d0023f28deb9Bing Zhao 1245e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao memcpy(&tsf_val, bss_desc->time_stamp, sizeof(tsf_val)); 1255e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 1265e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_dbg(priv->adapter->dev, "info: %s: TSF offset calc: %016llx - " 1275e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao "%016llx\n", __func__, tsf_val, bss_desc->network_tsf); 1285e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 1295e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao memcpy(*buffer, &tsf_val, sizeof(tsf_val)); 1305e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao *buffer += sizeof(tsf_val); 1315e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 1325e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao return sizeof(tsf_tlv.header) + (2 * sizeof(tsf_val)); 1335e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao} 1345e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 1355e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao/* 1365e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * This function finds out the common rates between rate1 and rate2. 1375e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * 1385e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * It will fill common rates in rate1 as output if found. 1395e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * 1405e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * NOTE: Setting the MSB of the basic rates needs to be taken 1415e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * care of, either before or after calling this function. 1425e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao */ 1435e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhaostatic int mwifiex_get_common_rates(struct mwifiex_private *priv, u8 *rate1, 1445e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao u32 rate1_size, u8 *rate2, u32 rate2_size) 1455e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao{ 146270e58e8898c8be40451ebee45b6c9b5bd5db04bYogesh Ashok Powar int ret; 147270e58e8898c8be40451ebee45b6c9b5bd5db04bYogesh Ashok Powar u8 *ptr = rate1, *tmp; 1485e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao u32 i, j; 1495e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 1505982b47aa410e6aef55a5b0087269f5c9c172110Yogesh Ashok Powar tmp = kmemdup(rate1, rate1_size, GFP_KERNEL); 1515e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (!tmp) { 1525e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_err(priv->adapter->dev, "failed to alloc tmp buf\n"); 1535e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao return -ENOMEM; 1545e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao } 1555e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 1565e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao memset(rate1, 0, rate1_size); 1575e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 1585e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao for (i = 0; rate2[i] && i < rate2_size; i++) { 1595e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao for (j = 0; tmp[j] && j < rate1_size; j++) { 1605e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Check common rate, excluding the bit for 1615e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao basic rate */ 1625e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if ((rate2[i] & 0x7F) == (tmp[j] & 0x7F)) { 1635e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao *rate1++ = tmp[j]; 1645e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao break; 1655e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao } 1665e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao } 1675e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao } 1685e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 1695e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_dbg(priv->adapter->dev, "info: Tx data rate set to %#x\n", 1705e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->data_rate); 1715e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 1725e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (!priv->is_data_rate_auto) { 1735e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao while (*ptr) { 1745e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if ((*ptr & 0x7f) == priv->data_rate) { 1755e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao ret = 0; 1765e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao goto done; 1775e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao } 1785e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao ptr++; 1795e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao } 1805e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_err(priv->adapter->dev, "previously set fixed data rate %#x" 1815e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao " is not compatible with the network\n", 1825e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->data_rate); 1835e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 1845e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao ret = -1; 1855e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao goto done; 1865e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao } 1875e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 1885e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao ret = 0; 1895e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhaodone: 1905e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao kfree(tmp); 1915e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao return ret; 1925e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao} 1935e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 1945e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao/* 1955e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * This function creates the intersection of the rates supported by a 1965e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * target BSS and our adapter settings for use in an assoc/join command. 1975e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao */ 1985e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhaostatic int 1995e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhaomwifiex_setup_rates_from_bssdesc(struct mwifiex_private *priv, 2005e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao struct mwifiex_bssdescriptor *bss_desc, 2015e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao u8 *out_rates, u32 *out_rates_size) 2025e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao{ 2035e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao u8 card_rates[MWIFIEX_SUPPORTED_RATES]; 204270e58e8898c8be40451ebee45b6c9b5bd5db04bYogesh Ashok Powar u32 card_rates_size; 2055e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 2065e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Copy AP supported rates */ 2075e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao memcpy(out_rates, bss_desc->supported_rates, MWIFIEX_SUPPORTED_RATES); 2085e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Get the STA supported rates */ 2095e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao card_rates_size = mwifiex_get_active_data_rates(priv, card_rates); 2105e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Get the common rates between AP and STA supported rates */ 2115e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (mwifiex_get_common_rates(priv, out_rates, MWIFIEX_SUPPORTED_RATES, 2125e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao card_rates, card_rates_size)) { 2135e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao *out_rates_size = 0; 2145e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_err(priv->adapter->dev, "%s: cannot get common rates\n", 2155e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao __func__); 2165e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao return -1; 2175e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao } 2185e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 2195e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao *out_rates_size = 2205e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao min_t(size_t, strlen(out_rates), MWIFIEX_SUPPORTED_RATES); 2215e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 2225e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao return 0; 2235e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao} 2245e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 2255e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao/* 2265e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * This function appends a WAPI IE. 2275e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * 2285e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * This function is called from the network join command preparation routine. 2295e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * 2305e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * If the IE buffer has been setup by the application, this routine appends 2315e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * the buffer as a WAPI TLV type to the request. 2325e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao */ 2335e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhaostatic int 2345e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhaomwifiex_cmd_append_wapi_ie(struct mwifiex_private *priv, u8 **buffer) 2355e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao{ 2365e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao int retLen = 0; 2375e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao struct mwifiex_ie_types_header ie_header; 2385e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 2395e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Null Checks */ 2405e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (buffer == NULL) 2415e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao return 0; 2425e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (*buffer == NULL) 2435e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao return 0; 2445e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 2455e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* 2465e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * If there is a wapi ie buffer setup, append it to the return 2475e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * parameter buffer pointer. 2485e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao */ 2495e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (priv->wapi_ie_len) { 2505e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_dbg(priv->adapter->dev, "cmd: append wapi ie %d to %p\n", 2515e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->wapi_ie_len, *buffer); 2525e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 2535e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Wrap the generic IE buffer with a pass through TLV type */ 2545e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao ie_header.type = cpu_to_le16(TLV_TYPE_WAPI_IE); 2555e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao ie_header.len = cpu_to_le16(priv->wapi_ie_len); 2565e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao memcpy(*buffer, &ie_header, sizeof(ie_header)); 2575e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 2585e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Increment the return size and the return buffer pointer 2595e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao param */ 2605e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao *buffer += sizeof(ie_header); 2615e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao retLen += sizeof(ie_header); 2625e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 2635e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Copy the wapi IE buffer to the output buffer, advance 2645e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao pointer */ 2655e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao memcpy(*buffer, priv->wapi_ie, priv->wapi_ie_len); 2665e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 2675e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Increment the return size and the return buffer pointer 2685e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao param */ 2695e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao *buffer += priv->wapi_ie_len; 2705e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao retLen += priv->wapi_ie_len; 2715e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 2725e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao } 2735e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* return the length appended to the buffer */ 2745e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao return retLen; 2755e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao} 2765e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 2775e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao/* 2785e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * This function appends rsn ie tlv for wpa/wpa2 security modes. 2795e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * It is called from the network join command preparation routine. 2805e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao */ 2815e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhaostatic int mwifiex_append_rsn_ie_wpa_wpa2(struct mwifiex_private *priv, 2825e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao u8 **buffer) 2835e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao{ 2845e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao struct mwifiex_ie_types_rsn_param_set *rsn_ie_tlv; 2855e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao int rsn_ie_len; 2865e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 2875e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (!buffer || !(*buffer)) 2885e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao return 0; 2895e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 2905e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao rsn_ie_tlv = (struct mwifiex_ie_types_rsn_param_set *) (*buffer); 2915e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao rsn_ie_tlv->header.type = cpu_to_le16((u16) priv->wpa_ie[0]); 2925e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao rsn_ie_tlv->header.type = cpu_to_le16( 2935e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao le16_to_cpu(rsn_ie_tlv->header.type) & 0x00FF); 2945e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao rsn_ie_tlv->header.len = cpu_to_le16((u16) priv->wpa_ie[1]); 2955e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao rsn_ie_tlv->header.len = cpu_to_le16(le16_to_cpu(rsn_ie_tlv->header.len) 2965e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao & 0x00FF); 2975e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (le16_to_cpu(rsn_ie_tlv->header.len) <= (sizeof(priv->wpa_ie) - 2)) 2985e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao memcpy(rsn_ie_tlv->rsn_ie, &priv->wpa_ie[2], 2995e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao le16_to_cpu(rsn_ie_tlv->header.len)); 3005e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao else 3015e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao return -1; 3025e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 3035e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao rsn_ie_len = sizeof(rsn_ie_tlv->header) + 3045e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao le16_to_cpu(rsn_ie_tlv->header.len); 3055e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao *buffer += rsn_ie_len; 3065e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 3075e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao return rsn_ie_len; 3085e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao} 3095e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 3105e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao/* 3115e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * This function prepares command for association. 3125e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * 3135e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * This sets the following parameters - 3145e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * - Peer MAC address 3155e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * - Listen interval 3165e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * - Beacon interval 3175e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * - Capability information 3185e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * 3195e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * ...and the following TLVs, as required - 3205e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * - SSID TLV 3215e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * - PHY TLV 3225e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * - SS TLV 3235e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * - Rates TLV 3245e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * - Authentication TLV 3255e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * - Channel TLV 3265e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * - WPA/WPA2 IE 3275e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * - 11n TLV 3285e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * - Vendor specific TLV 3295e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * - WMM TLV 3305e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * - WAPI IE 3315e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * - Generic IE 3325e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * - TSF TLV 3335e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * 3345e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * Preparation also includes - 3355e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * - Setting command ID and proper size 3365e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * - Ensuring correct endian-ness 3375e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao */ 3385e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhaoint mwifiex_cmd_802_11_associate(struct mwifiex_private *priv, 3395e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao struct host_cmd_ds_command *cmd, 340a5ffddb70c5cab29fa00e2fdf12217b64b940796Amitkumar Karwar struct mwifiex_bssdescriptor *bss_desc) 3415e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao{ 3425e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao struct host_cmd_ds_802_11_associate *assoc = &cmd->params.associate; 3435e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao struct mwifiex_ie_types_ssid_param_set *ssid_tlv; 3445e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao struct mwifiex_ie_types_phy_param_set *phy_tlv; 3455e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao struct mwifiex_ie_types_ss_param_set *ss_tlv; 3465e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao struct mwifiex_ie_types_rates_param_set *rates_tlv; 3475e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao struct mwifiex_ie_types_auth_type *auth_tlv; 3485e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao struct mwifiex_ie_types_chan_list_param_set *chan_tlv; 3495e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao u8 rates[MWIFIEX_SUPPORTED_RATES]; 3505e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao u32 rates_size; 3515e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao u16 tmp_cap; 3525e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao u8 *pos; 3535e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao int rsn_ie_len = 0; 3545e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 3555e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao pos = (u8 *) assoc; 3565e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 3575e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao mwifiex_cfg_tx_buf(priv, bss_desc); 3585e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 3595e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao cmd->command = cpu_to_le16(HostCmd_CMD_802_11_ASSOCIATE); 3605e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 3615e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Save so we know which BSS Desc to use in the response handler */ 3625e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->attempted_bss_desc = bss_desc; 3635e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 3645e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao memcpy(assoc->peer_sta_addr, 3655e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao bss_desc->mac_address, sizeof(assoc->peer_sta_addr)); 3665e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao pos += sizeof(assoc->peer_sta_addr); 3675e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 3685e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Set the listen interval */ 3695e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao assoc->listen_interval = cpu_to_le16(priv->listen_interval); 3705e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Set the beacon period */ 3715e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao assoc->beacon_period = cpu_to_le16(bss_desc->beacon_period); 3725e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 3735e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao pos += sizeof(assoc->cap_info_bitmap); 3745e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao pos += sizeof(assoc->listen_interval); 3755e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao pos += sizeof(assoc->beacon_period); 3765e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao pos += sizeof(assoc->dtim_period); 3775e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 3785e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao ssid_tlv = (struct mwifiex_ie_types_ssid_param_set *) pos; 3795e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao ssid_tlv->header.type = cpu_to_le16(WLAN_EID_SSID); 3805e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao ssid_tlv->header.len = cpu_to_le16((u16) bss_desc->ssid.ssid_len); 3815e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao memcpy(ssid_tlv->ssid, bss_desc->ssid.ssid, 3825e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao le16_to_cpu(ssid_tlv->header.len)); 3835e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao pos += sizeof(ssid_tlv->header) + le16_to_cpu(ssid_tlv->header.len); 3845e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 3855e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao phy_tlv = (struct mwifiex_ie_types_phy_param_set *) pos; 3865e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao phy_tlv->header.type = cpu_to_le16(WLAN_EID_DS_PARAMS); 3875e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao phy_tlv->header.len = cpu_to_le16(sizeof(phy_tlv->fh_ds.ds_param_set)); 3885e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao memcpy(&phy_tlv->fh_ds.ds_param_set, 3895e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao &bss_desc->phy_param_set.ds_param_set.current_chan, 3905e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao sizeof(phy_tlv->fh_ds.ds_param_set)); 3915e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao pos += sizeof(phy_tlv->header) + le16_to_cpu(phy_tlv->header.len); 3925e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 3935e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao ss_tlv = (struct mwifiex_ie_types_ss_param_set *) pos; 3945e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao ss_tlv->header.type = cpu_to_le16(WLAN_EID_CF_PARAMS); 3955e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao ss_tlv->header.len = cpu_to_le16(sizeof(ss_tlv->cf_ibss.cf_param_set)); 3965e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao pos += sizeof(ss_tlv->header) + le16_to_cpu(ss_tlv->header.len); 3975e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 3985e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Get the common rates supported between the driver and the BSS Desc */ 3995e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (mwifiex_setup_rates_from_bssdesc 4005e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao (priv, bss_desc, rates, &rates_size)) 4015e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao return -1; 4025e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 4035e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Save the data rates into Current BSS state structure */ 4045e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->curr_bss_params.num_of_rates = rates_size; 4055e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao memcpy(&priv->curr_bss_params.data_rates, rates, rates_size); 4065e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 4075e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Setup the Rates TLV in the association command */ 4085e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao rates_tlv = (struct mwifiex_ie_types_rates_param_set *) pos; 4095e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao rates_tlv->header.type = cpu_to_le16(WLAN_EID_SUPP_RATES); 4105e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao rates_tlv->header.len = cpu_to_le16((u16) rates_size); 4115e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao memcpy(rates_tlv->rates, rates, rates_size); 4125e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao pos += sizeof(rates_tlv->header) + rates_size; 4135e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_dbg(priv->adapter->dev, "info: ASSOC_CMD: rates size = %d\n", 4145e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao rates_size); 4155e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 416203afecaa320fa8c541ce130aed449ff53f5b4aaMarc Yang /* Add the Authentication type to be used for Auth frames */ 417203afecaa320fa8c541ce130aed449ff53f5b4aaMarc Yang auth_tlv = (struct mwifiex_ie_types_auth_type *) pos; 418203afecaa320fa8c541ce130aed449ff53f5b4aaMarc Yang auth_tlv->header.type = cpu_to_le16(TLV_TYPE_AUTH_TYPE); 419203afecaa320fa8c541ce130aed449ff53f5b4aaMarc Yang auth_tlv->header.len = cpu_to_le16(sizeof(auth_tlv->auth_type)); 420203afecaa320fa8c541ce130aed449ff53f5b4aaMarc Yang if (priv->sec_info.wep_status == MWIFIEX_802_11_WEP_ENABLED) 421203afecaa320fa8c541ce130aed449ff53f5b4aaMarc Yang auth_tlv->auth_type = cpu_to_le16( 422203afecaa320fa8c541ce130aed449ff53f5b4aaMarc Yang (u16) priv->sec_info.authentication_mode); 423203afecaa320fa8c541ce130aed449ff53f5b4aaMarc Yang else 424f986b6d538c9351c99108b51be9f77ac1b300b16Marc Yang auth_tlv->auth_type = cpu_to_le16(NL80211_AUTHTYPE_OPEN_SYSTEM); 425203afecaa320fa8c541ce130aed449ff53f5b4aaMarc Yang 426203afecaa320fa8c541ce130aed449ff53f5b4aaMarc Yang pos += sizeof(auth_tlv->header) + le16_to_cpu(auth_tlv->header.len); 4275e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 4285e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (IS_SUPPORT_MULTI_BANDS(priv->adapter) 4295e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao && !(ISSUPP_11NENABLED(priv->adapter->fw_cap_info) 4305e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao && (!bss_desc->disable_11n) 4315e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao && (priv->adapter->config_bands & BAND_GN 4325e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao || priv->adapter->config_bands & BAND_AN) 4335e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao && (bss_desc->bcn_ht_cap) 4345e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao ) 4355e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao ) { 4365e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Append a channel TLV for the channel the attempted AP was 4375e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao found on */ 4385e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao chan_tlv = (struct mwifiex_ie_types_chan_list_param_set *) pos; 4395e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao chan_tlv->header.type = cpu_to_le16(TLV_TYPE_CHANLIST); 4405e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao chan_tlv->header.len = 4415e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao cpu_to_le16(sizeof(struct mwifiex_chan_scan_param_set)); 4425e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 4435e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao memset(chan_tlv->chan_scan_param, 0x00, 4445e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao sizeof(struct mwifiex_chan_scan_param_set)); 4455e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao chan_tlv->chan_scan_param[0].chan_number = 4465e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao (bss_desc->phy_param_set.ds_param_set.current_chan); 4475e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_dbg(priv->adapter->dev, "info: Assoc: TLV Chan = %d\n", 4485e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao chan_tlv->chan_scan_param[0].chan_number); 4495e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 4505e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao chan_tlv->chan_scan_param[0].radio_type = 4515e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao mwifiex_band_to_radio_type((u8) bss_desc->bss_band); 4525e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 4535e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_dbg(priv->adapter->dev, "info: Assoc: TLV Band = %d\n", 4545e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao chan_tlv->chan_scan_param[0].radio_type); 4555e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao pos += sizeof(chan_tlv->header) + 4565e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao sizeof(struct mwifiex_chan_scan_param_set); 4575e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao } 4585e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 4595e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (!priv->wps.session_enable) { 4605e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (priv->sec_info.wpa_enabled || priv->sec_info.wpa2_enabled) 4615e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao rsn_ie_len = mwifiex_append_rsn_ie_wpa_wpa2(priv, &pos); 4625e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 4635e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (rsn_ie_len == -1) 4645e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao return -1; 4655e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao } 4665e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 4675e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (ISSUPP_11NENABLED(priv->adapter->fw_cap_info) 4685e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao && (!bss_desc->disable_11n) 4695e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao && (priv->adapter->config_bands & BAND_GN 4705e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao || priv->adapter->config_bands & BAND_AN)) 4715e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao mwifiex_cmd_append_11n_tlv(priv, bss_desc, &pos); 4725e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 4735e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Append vendor specific IE TLV */ 4745e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao mwifiex_cmd_append_vsie_tlv(priv, MWIFIEX_VSIE_MASK_ASSOC, &pos); 4755e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 4765e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao mwifiex_wmm_process_association_req(priv, &pos, &bss_desc->wmm_ie, 4775e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao bss_desc->bcn_ht_cap); 4785e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (priv->sec_info.wapi_enabled && priv->wapi_ie_len) 4795e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao mwifiex_cmd_append_wapi_ie(priv, &pos); 4805e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 4815e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 4825e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao mwifiex_cmd_append_generic_ie(priv, &pos); 4835e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 4845e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao mwifiex_cmd_append_tsf_tlv(priv, &pos, bss_desc); 4855e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 4865e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao cmd->size = cpu_to_le16((u16) (pos - (u8 *) assoc) + S_DS_GEN); 4875e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 4885e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Set the Capability info at last */ 4895e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao tmp_cap = bss_desc->cap_info_bitmap; 4905e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 4915e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (priv->adapter->config_bands == BAND_B) 492b93f85f0fb019f527b68569aafb836c94b89a47eBing Zhao tmp_cap &= ~WLAN_CAPABILITY_SHORT_SLOT_TIME; 4935e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 4945e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao tmp_cap &= CAPINFO_MASK; 4955e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_dbg(priv->adapter->dev, "info: ASSOC_CMD: tmp_cap=%4X CAPINFO_MASK=%4lX\n", 4965e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao tmp_cap, CAPINFO_MASK); 4975e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao assoc->cap_info_bitmap = cpu_to_le16(tmp_cap); 4985e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 4995e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao return 0; 5005e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao} 5015e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 5025e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao/* 5035e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * Association firmware command response handler 5045e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * 5055e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * The response buffer for the association command has the following 5065e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * memory layout. 5075e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * 5085e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * For cases where an association response was not received (indicated 5095e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * by the CapInfo and AId field): 5105e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * 5115e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * .------------------------------------------------------------. 5125e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * | Header(4 * sizeof(t_u16)): Standard command response hdr | 5135e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * .------------------------------------------------------------. 5145e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * | cap_info/Error Return(t_u16): | 5155e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * | 0xFFFF(-1): Internal error | 5165e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * | 0xFFFE(-2): Authentication unhandled message | 5175e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * | 0xFFFD(-3): Authentication refused | 5185e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * | 0xFFFC(-4): Timeout waiting for AP response | 5195e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * .------------------------------------------------------------. 5205e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * | status_code(t_u16): | 5215e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * | If cap_info is -1: | 5225e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * | An internal firmware failure prevented the | 5235e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * | command from being processed. The status_code | 5245e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * | will be set to 1. | 5255e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * | | 5265e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * | If cap_info is -2: | 5275e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * | An authentication frame was received but was | 5285e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * | not handled by the firmware. IEEE Status | 5295e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * | code for the failure is returned. | 5305e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * | | 5315e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * | If cap_info is -3: | 5325e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * | An authentication frame was received and the | 5335e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * | status_code is the IEEE Status reported in the | 5345e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * | response. | 5355e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * | | 5365e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * | If cap_info is -4: | 5375e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * | (1) Association response timeout | 5385e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * | (2) Authentication response timeout | 5395e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * .------------------------------------------------------------. 5405e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * | a_id(t_u16): 0xFFFF | 5415e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * .------------------------------------------------------------. 5425e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * 5435e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * 5445e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * For cases where an association response was received, the IEEE 5455e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * standard association response frame is returned: 5465e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * 5475e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * .------------------------------------------------------------. 5485e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * | Header(4 * sizeof(t_u16)): Standard command response hdr | 5495e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * .------------------------------------------------------------. 5505e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * | cap_info(t_u16): IEEE Capability | 5515e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * .------------------------------------------------------------. 5525e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * | status_code(t_u16): IEEE Status Code | 5535e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * .------------------------------------------------------------. 5545e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * | a_id(t_u16): IEEE Association ID | 5555e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * .------------------------------------------------------------. 5565e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * | IEEE IEs(variable): Any received IEs comprising the | 5575e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * | remaining portion of a received | 5585e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * | association response frame. | 5595e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * .------------------------------------------------------------. 5605e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * 5615e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * For simplistic handling, the status_code field can be used to determine 5625e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * an association success (0) or failure (non-zero). 5635e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao */ 5645e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhaoint mwifiex_ret_802_11_associate(struct mwifiex_private *priv, 565600f5d909a54a8dccf8c8c23898fc2e91bc0953eAmitkumar Karwar struct host_cmd_ds_command *resp) 5665e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao{ 567600f5d909a54a8dccf8c8c23898fc2e91bc0953eAmitkumar Karwar struct mwifiex_adapter *adapter = priv->adapter; 5685e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao int ret = 0; 5695e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao struct ieee_types_assoc_rsp *assoc_rsp; 5705e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao struct mwifiex_bssdescriptor *bss_desc; 5715e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao u8 enable_data = true; 5725e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 5735e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao assoc_rsp = (struct ieee_types_assoc_rsp *) &resp->params; 5745e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 5755e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->assoc_rsp_size = min(le16_to_cpu(resp->size) - S_DS_GEN, 5765e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao sizeof(priv->assoc_rsp_buf)); 5775e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 5785e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao memcpy(priv->assoc_rsp_buf, &resp->params, priv->assoc_rsp_size); 5795e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 5805e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (le16_to_cpu(assoc_rsp->status_code)) { 5815e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->adapter->dbg.num_cmd_assoc_failure++; 5825e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_err(priv->adapter->dev, "ASSOC_RESP: association failed, " 5835e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao "status code = %d, error = 0x%x, a_id = 0x%x\n", 5845e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao le16_to_cpu(assoc_rsp->status_code), 5855e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao le16_to_cpu(assoc_rsp->cap_info_bitmap), 5865e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao le16_to_cpu(assoc_rsp->a_id)); 5875e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 5885e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao ret = -1; 5895e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao goto done; 5905e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao } 5915e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 5925e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Send a Media Connected event, according to the Spec */ 5935e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->media_connected = true; 5945e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 5955e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->adapter->ps_state = PS_STATE_AWAKE; 5965e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->adapter->pps_uapsd_mode = false; 5975e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->adapter->tx_lock_flag = false; 5985e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 5995e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Set the attempted BSSID Index to current */ 6005e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao bss_desc = priv->attempted_bss_desc; 6015e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 6025e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_dbg(priv->adapter->dev, "info: ASSOC_RESP: %s\n", 6035e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao bss_desc->ssid.ssid); 6045e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 6055e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Make a copy of current BSSID descriptor */ 6065e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao memcpy(&priv->curr_bss_params.bss_descriptor, 6075e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao bss_desc, sizeof(struct mwifiex_bssdescriptor)); 6085e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 6095e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Update curr_bss_params */ 6105e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->curr_bss_params.bss_descriptor.channel 6115e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao = bss_desc->phy_param_set.ds_param_set.current_chan; 6125e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 6135e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->curr_bss_params.band = (u8) bss_desc->bss_band; 6145e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 6155e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (bss_desc->wmm_ie.vend_hdr.element_id == WLAN_EID_VENDOR_SPECIFIC) 6165e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->curr_bss_params.wmm_enabled = true; 6175e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao else 6185e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->curr_bss_params.wmm_enabled = false; 6195e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 6205e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if ((priv->wmm_required || bss_desc->bcn_ht_cap) 6215e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao && priv->curr_bss_params.wmm_enabled) 6225e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->wmm_enabled = true; 6235e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao else 6245e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->wmm_enabled = false; 6255e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 6265e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->curr_bss_params.wmm_uapsd_enabled = false; 6275e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 6285e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (priv->wmm_enabled) 6295e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->curr_bss_params.wmm_uapsd_enabled 6305e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao = ((bss_desc->wmm_ie.qos_info_bitmap & 6315e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao IEEE80211_WMM_IE_AP_QOSINFO_UAPSD) ? 1 : 0); 6325e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 6335e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_dbg(priv->adapter->dev, "info: ASSOC_RESP: curr_pkt_filter is %#x\n", 6345e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->curr_pkt_filter); 6355e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (priv->sec_info.wpa_enabled || priv->sec_info.wpa2_enabled) 6365e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->wpa_is_gtk_set = false; 6375e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 6385e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (priv->wmm_enabled) { 6395e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Don't re-enable carrier until we get the WMM_GET_STATUS 6405e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao event */ 6415e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao enable_data = false; 6425e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao } else { 6435e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Since WMM is not enabled, setup the queues with the 6445e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao defaults */ 6455e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao mwifiex_wmm_setup_queue_priorities(priv, NULL); 6465e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao mwifiex_wmm_setup_ac_downgrade(priv); 6475e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao } 6485e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 6495e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (enable_data) 6505e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_dbg(priv->adapter->dev, 6515e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao "info: post association, re-enabling data flow\n"); 6525e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 6535e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Reset SNR/NF/RSSI values */ 6545e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->data_rssi_last = 0; 6555e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->data_nf_last = 0; 6565e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->data_rssi_avg = 0; 6575e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->data_nf_avg = 0; 6585e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->bcn_rssi_last = 0; 6595e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->bcn_nf_last = 0; 6605e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->bcn_rssi_avg = 0; 6615e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->bcn_nf_avg = 0; 6625e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->rxpd_rate = 0; 6635e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->rxpd_htinfo = 0; 6645e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 6655e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao mwifiex_save_curr_bcn(priv); 6665e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 6675e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->adapter->dbg.num_cmd_assoc_success++; 6685e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 6695e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_dbg(priv->adapter->dev, "info: ASSOC_RESP: associated\n"); 6705e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 6715e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Add the ra_list here for infra mode as there will be only 1 ra 6725e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao always */ 6735e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao mwifiex_ralist_add(priv, 6745e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->curr_bss_params.bss_descriptor.mac_address); 6755e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 6765e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (!netif_carrier_ok(priv->netdev)) 6775e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao netif_carrier_on(priv->netdev); 6785e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (netif_queue_stopped(priv->netdev)) 6795e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao netif_wake_queue(priv->netdev); 6805e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 6815e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (priv->sec_info.wpa_enabled || priv->sec_info.wpa2_enabled) 6825e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->scan_block = true; 6835e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 6845e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhaodone: 6855e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Need to indicate IOCTL complete */ 686600f5d909a54a8dccf8c8c23898fc2e91bc0953eAmitkumar Karwar if (adapter->curr_cmd->wait_q_enabled) { 687600f5d909a54a8dccf8c8c23898fc2e91bc0953eAmitkumar Karwar if (ret) 688600f5d909a54a8dccf8c8c23898fc2e91bc0953eAmitkumar Karwar adapter->cmd_wait_q.status = -1; 689600f5d909a54a8dccf8c8c23898fc2e91bc0953eAmitkumar Karwar else 690600f5d909a54a8dccf8c8c23898fc2e91bc0953eAmitkumar Karwar adapter->cmd_wait_q.status = 0; 6915e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao } 6925e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 6935e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao return ret; 6945e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao} 6955e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 6965e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao/* 6975e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * This function prepares command for ad-hoc start. 6985e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * 6995e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * Driver will fill up SSID, BSS mode, IBSS parameters, physical 7005e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * parameters, probe delay, and capability information. Firmware 7015e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * will fill up beacon period, basic rates and operational rates. 7025e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * 7035e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * In addition, the following TLVs are added - 7045e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * - Channel TLV 7055e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * - Vendor specific IE 7065e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * - WPA/WPA2 IE 7075e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * - HT Capabilities IE 7085e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * - HT Information IE 7095e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * 7105e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * Preparation also includes - 7115e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * - Setting command ID and proper size 7125e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * - Ensuring correct endian-ness 7135e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao */ 7145e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhaoint 7155e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhaomwifiex_cmd_802_11_ad_hoc_start(struct mwifiex_private *priv, 716a5ffddb70c5cab29fa00e2fdf12217b64b940796Amitkumar Karwar struct host_cmd_ds_command *cmd, 717a5ffddb70c5cab29fa00e2fdf12217b64b940796Amitkumar Karwar struct mwifiex_802_11_ssid *req_ssid) 7185e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao{ 719636c4598499eeacce0893dc8d91113b904bd531eYogesh Ashok Powar int rsn_ie_len = 0; 7205e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao struct mwifiex_adapter *adapter = priv->adapter; 7215e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao struct host_cmd_ds_802_11_ad_hoc_start *adhoc_start = 7225e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao &cmd->params.adhoc_start; 7235e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao struct mwifiex_bssdescriptor *bss_desc; 7245e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao u32 cmd_append_size = 0; 7255e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao u32 i; 7265e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao u16 tmp_cap; 7275e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao struct mwifiex_ie_types_chan_list_param_set *chan_tlv; 728eedf15d34d3997051cc3a4bdd2adef68f3e36f57Yogesh Ashok Powar u8 radio_type; 7295e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 7305e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao struct mwifiex_ie_types_htcap *ht_cap; 7315e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao struct mwifiex_ie_types_htinfo *ht_info; 7325e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao u8 *pos = (u8 *) adhoc_start + 7335e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao sizeof(struct host_cmd_ds_802_11_ad_hoc_start); 7345e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 7355e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (!adapter) 7365e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao return -1; 7375e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 7385e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao cmd->command = cpu_to_le16(HostCmd_CMD_802_11_AD_HOC_START); 7395e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 7405e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao bss_desc = &priv->curr_bss_params.bss_descriptor; 7415e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->attempted_bss_desc = bss_desc; 7425e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 7435e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* 7445e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * Fill in the parameters for 2 data structures: 7455e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * 1. struct host_cmd_ds_802_11_ad_hoc_start command 7465e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * 2. bss_desc 7475e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * Driver will fill up SSID, bss_mode,IBSS param, Physical Param, 7485e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * probe delay, and Cap info. 7495e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * Firmware will fill up beacon period, Basic rates 7505e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * and operational rates. 7515e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao */ 7525e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 7535e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao memset(adhoc_start->ssid, 0, IEEE80211_MAX_SSID_LEN); 7545e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 755a5ffddb70c5cab29fa00e2fdf12217b64b940796Amitkumar Karwar memcpy(adhoc_start->ssid, req_ssid->ssid, req_ssid->ssid_len); 7565e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 7575e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_dbg(adapter->dev, "info: ADHOC_S_CMD: SSID = %s\n", 7585e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao adhoc_start->ssid); 7595e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 7605e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao memset(bss_desc->ssid.ssid, 0, IEEE80211_MAX_SSID_LEN); 761a5ffddb70c5cab29fa00e2fdf12217b64b940796Amitkumar Karwar memcpy(bss_desc->ssid.ssid, req_ssid->ssid, req_ssid->ssid_len); 7625e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 763a5ffddb70c5cab29fa00e2fdf12217b64b940796Amitkumar Karwar bss_desc->ssid.ssid_len = req_ssid->ssid_len; 7645e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 7655e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Set the BSS mode */ 7665e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao adhoc_start->bss_mode = HostCmd_BSS_MODE_IBSS; 767eecd8250e492ffc4e7b72953cda9c2f3ba0e6cccBing Zhao bss_desc->bss_mode = NL80211_IFTYPE_ADHOC; 7685e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao adhoc_start->beacon_period = cpu_to_le16(priv->beacon_period); 7695e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao bss_desc->beacon_period = priv->beacon_period; 7705e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 7715e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Set Physical param set */ 7725e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao/* Parameter IE Id */ 7735e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao#define DS_PARA_IE_ID 3 7745e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao/* Parameter IE length */ 7755e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao#define DS_PARA_IE_LEN 1 7765e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 7775e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao adhoc_start->phy_param_set.ds_param_set.element_id = DS_PARA_IE_ID; 7785e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao adhoc_start->phy_param_set.ds_param_set.len = DS_PARA_IE_LEN; 7795e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 7805e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (!mwifiex_get_cfp_by_band_and_channel_from_cfg80211 7815e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao (priv, adapter->adhoc_start_band, (u16) 7825e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->adhoc_channel)) { 7835e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao struct mwifiex_chan_freq_power *cfp; 7845e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao cfp = mwifiex_get_cfp_by_band_and_channel_from_cfg80211(priv, 7855e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao adapter->adhoc_start_band, FIRST_VALID_CHANNEL); 7865e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (cfp) 7875e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->adhoc_channel = (u8) cfp->channel; 7885e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao } 7895e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 7905e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (!priv->adhoc_channel) { 7915e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_err(adapter->dev, "ADHOC_S_CMD: adhoc_channel cannot be 0\n"); 7925e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao return -1; 7935e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao } 7945e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 7955e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_dbg(adapter->dev, "info: ADHOC_S_CMD: creating ADHOC on channel %d\n", 7965e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->adhoc_channel); 7975e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 7985e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->curr_bss_params.bss_descriptor.channel = priv->adhoc_channel; 7995e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->curr_bss_params.band = adapter->adhoc_start_band; 8005e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 8015e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao bss_desc->channel = priv->adhoc_channel; 8025e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao adhoc_start->phy_param_set.ds_param_set.current_chan = 8035e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->adhoc_channel; 8045e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 8055e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao memcpy(&bss_desc->phy_param_set, &adhoc_start->phy_param_set, 8065e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao sizeof(union ieee_types_phy_param_set)); 8075e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 8085e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Set IBSS param set */ 8095e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao/* IBSS parameter IE Id */ 8105e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao#define IBSS_PARA_IE_ID 6 8115e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao/* IBSS parameter IE length */ 8125e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao#define IBSS_PARA_IE_LEN 2 8135e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 8145e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao adhoc_start->ss_param_set.ibss_param_set.element_id = IBSS_PARA_IE_ID; 8155e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao adhoc_start->ss_param_set.ibss_param_set.len = IBSS_PARA_IE_LEN; 8165e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao adhoc_start->ss_param_set.ibss_param_set.atim_window 8175e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao = cpu_to_le16(priv->atim_window); 8185e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao memcpy(&bss_desc->ss_param_set, &adhoc_start->ss_param_set, 8195e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao sizeof(union ieee_types_ss_param_set)); 8205e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 8215e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Set Capability info */ 8225e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao bss_desc->cap_info_bitmap |= WLAN_CAPABILITY_IBSS; 8235e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao tmp_cap = le16_to_cpu(adhoc_start->cap_info_bitmap); 8245e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao tmp_cap &= ~WLAN_CAPABILITY_ESS; 8255e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao tmp_cap |= WLAN_CAPABILITY_IBSS; 8265e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 8275e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Set up privacy in bss_desc */ 8282be50b8df53f2f329b7ddcc8be286ef6a7469fd2Yogesh Ashok Powar if (priv->sec_info.encryption_mode) { 8295e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Ad-Hoc capability privacy on */ 8305e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_dbg(adapter->dev, 8315e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao "info: ADHOC_S_CMD: wep_status set privacy to WEP\n"); 8325e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao bss_desc->privacy = MWIFIEX_802_11_PRIV_FILTER_8021X_WEP; 8335e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao tmp_cap |= WLAN_CAPABILITY_PRIVACY; 8345e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao } else { 8355e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_dbg(adapter->dev, "info: ADHOC_S_CMD: wep_status NOT set," 8365e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao " setting privacy to ACCEPT ALL\n"); 8375e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao bss_desc->privacy = MWIFIEX_802_11_PRIV_FILTER_ACCEPT_ALL; 8385e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao } 8395e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 84063af63330f4c8b4fdcc13dec082dea3b81d53b0aYogesh Ashok Powar memset(adhoc_start->data_rate, 0, sizeof(adhoc_start->data_rate)); 84163af63330f4c8b4fdcc13dec082dea3b81d53b0aYogesh Ashok Powar mwifiex_get_active_data_rates(priv, adhoc_start->data_rate); 8425e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if ((adapter->adhoc_start_band & BAND_G) && 8435e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao (priv->curr_pkt_filter & HostCmd_ACT_MAC_ADHOC_G_PROTECTION_ON)) { 844636c4598499eeacce0893dc8d91113b904bd531eYogesh Ashok Powar if (mwifiex_send_cmd_async(priv, HostCmd_CMD_MAC_CONTROL, 845600f5d909a54a8dccf8c8c23898fc2e91bc0953eAmitkumar Karwar HostCmd_ACT_GEN_SET, 0, 846636c4598499eeacce0893dc8d91113b904bd531eYogesh Ashok Powar &priv->curr_pkt_filter)) { 8475e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_err(adapter->dev, 8485e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao "ADHOC_S_CMD: G Protection config failed\n"); 8495e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao return -1; 8505e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao } 8515e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao } 8525e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Find the last non zero */ 85363af63330f4c8b4fdcc13dec082dea3b81d53b0aYogesh Ashok Powar for (i = 0; i < sizeof(adhoc_start->data_rate); i++) 85463af63330f4c8b4fdcc13dec082dea3b81d53b0aYogesh Ashok Powar if (!adhoc_start->data_rate[i]) 85563af63330f4c8b4fdcc13dec082dea3b81d53b0aYogesh Ashok Powar break; 8565e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 8575e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->curr_bss_params.num_of_rates = i; 8585e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 8595e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Copy the ad-hoc creating rates into Current BSS rate structure */ 8605e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao memcpy(&priv->curr_bss_params.data_rates, 86163af63330f4c8b4fdcc13dec082dea3b81d53b0aYogesh Ashok Powar &adhoc_start->data_rate, priv->curr_bss_params.num_of_rates); 8625e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 8635e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_dbg(adapter->dev, "info: ADHOC_S_CMD: rates=%02x %02x %02x %02x\n", 86463af63330f4c8b4fdcc13dec082dea3b81d53b0aYogesh Ashok Powar adhoc_start->data_rate[0], adhoc_start->data_rate[1], 86563af63330f4c8b4fdcc13dec082dea3b81d53b0aYogesh Ashok Powar adhoc_start->data_rate[2], adhoc_start->data_rate[3]); 8665e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 8675e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_dbg(adapter->dev, "info: ADHOC_S_CMD: AD-HOC Start command is ready\n"); 8685e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 8695e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (IS_SUPPORT_MULTI_BANDS(adapter)) { 8705e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Append a channel TLV */ 8715e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao chan_tlv = (struct mwifiex_ie_types_chan_list_param_set *) pos; 8725e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao chan_tlv->header.type = cpu_to_le16(TLV_TYPE_CHANLIST); 8735e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao chan_tlv->header.len = 8745e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao cpu_to_le16(sizeof(struct mwifiex_chan_scan_param_set)); 8755e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 8765e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao memset(chan_tlv->chan_scan_param, 0x00, 8775e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao sizeof(struct mwifiex_chan_scan_param_set)); 8785e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao chan_tlv->chan_scan_param[0].chan_number = 8795e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao (u8) priv->curr_bss_params.bss_descriptor.channel; 8805e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 8815e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_dbg(adapter->dev, "info: ADHOC_S_CMD: TLV Chan = %d\n", 8825e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao chan_tlv->chan_scan_param[0].chan_number); 8835e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 8845e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao chan_tlv->chan_scan_param[0].radio_type 8855e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao = mwifiex_band_to_radio_type(priv->curr_bss_params.band); 8865e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (adapter->adhoc_start_band & BAND_GN 8875e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao || adapter->adhoc_start_band & BAND_AN) { 88821c3ba346486c3df39d23a2a085fcdfc7a59a853Amitkumar Karwar if (adapter->sec_chan_offset == 88921c3ba346486c3df39d23a2a085fcdfc7a59a853Amitkumar Karwar IEEE80211_HT_PARAM_CHA_SEC_ABOVE) 8905e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao chan_tlv->chan_scan_param[0].radio_type |= 89121c3ba346486c3df39d23a2a085fcdfc7a59a853Amitkumar Karwar (IEEE80211_HT_PARAM_CHA_SEC_ABOVE << 4); 89221c3ba346486c3df39d23a2a085fcdfc7a59a853Amitkumar Karwar else if (adapter->sec_chan_offset == 89321c3ba346486c3df39d23a2a085fcdfc7a59a853Amitkumar Karwar IEEE80211_HT_PARAM_CHA_SEC_ABOVE) 8945e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao chan_tlv->chan_scan_param[0].radio_type |= 89521c3ba346486c3df39d23a2a085fcdfc7a59a853Amitkumar Karwar (IEEE80211_HT_PARAM_CHA_SEC_BELOW << 4); 8965e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao } 8975e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_dbg(adapter->dev, "info: ADHOC_S_CMD: TLV Band = %d\n", 8985e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao chan_tlv->chan_scan_param[0].radio_type); 8995e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao pos += sizeof(chan_tlv->header) + 9005e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao sizeof(struct mwifiex_chan_scan_param_set); 9015e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao cmd_append_size += 9025e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao sizeof(chan_tlv->header) + 9035e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao sizeof(struct mwifiex_chan_scan_param_set); 9045e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao } 9055e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 9065e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Append vendor specific IE TLV */ 9075e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao cmd_append_size += mwifiex_cmd_append_vsie_tlv(priv, 9085e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao MWIFIEX_VSIE_MASK_ADHOC, &pos); 9095e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 9105e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (priv->sec_info.wpa_enabled) { 9115e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao rsn_ie_len = mwifiex_append_rsn_ie_wpa_wpa2(priv, &pos); 9125e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (rsn_ie_len == -1) 9135e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao return -1; 9145e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao cmd_append_size += rsn_ie_len; 9155e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao } 9165e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 9175e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (adapter->adhoc_11n_enabled) { 918eedf15d34d3997051cc3a4bdd2adef68f3e36f57Yogesh Ashok Powar /* Fill HT CAPABILITY */ 919eedf15d34d3997051cc3a4bdd2adef68f3e36f57Yogesh Ashok Powar ht_cap = (struct mwifiex_ie_types_htcap *) pos; 920eedf15d34d3997051cc3a4bdd2adef68f3e36f57Yogesh Ashok Powar memset(ht_cap, 0, sizeof(struct mwifiex_ie_types_htcap)); 921eedf15d34d3997051cc3a4bdd2adef68f3e36f57Yogesh Ashok Powar ht_cap->header.type = cpu_to_le16(WLAN_EID_HT_CAPABILITY); 922eedf15d34d3997051cc3a4bdd2adef68f3e36f57Yogesh Ashok Powar ht_cap->header.len = 923eedf15d34d3997051cc3a4bdd2adef68f3e36f57Yogesh Ashok Powar cpu_to_le16(sizeof(struct ieee80211_ht_cap)); 924eedf15d34d3997051cc3a4bdd2adef68f3e36f57Yogesh Ashok Powar radio_type = mwifiex_band_to_radio_type( 925eedf15d34d3997051cc3a4bdd2adef68f3e36f57Yogesh Ashok Powar priv->adapter->config_bands); 926eedf15d34d3997051cc3a4bdd2adef68f3e36f57Yogesh Ashok Powar mwifiex_fill_cap_info(priv, radio_type, ht_cap); 927eedf15d34d3997051cc3a4bdd2adef68f3e36f57Yogesh Ashok Powar 928eedf15d34d3997051cc3a4bdd2adef68f3e36f57Yogesh Ashok Powar pos += sizeof(struct mwifiex_ie_types_htcap); 929eedf15d34d3997051cc3a4bdd2adef68f3e36f57Yogesh Ashok Powar cmd_append_size += 930eedf15d34d3997051cc3a4bdd2adef68f3e36f57Yogesh Ashok Powar sizeof(struct mwifiex_ie_types_htcap); 931eedf15d34d3997051cc3a4bdd2adef68f3e36f57Yogesh Ashok Powar 932eedf15d34d3997051cc3a4bdd2adef68f3e36f57Yogesh Ashok Powar /* Fill HT INFORMATION */ 933eedf15d34d3997051cc3a4bdd2adef68f3e36f57Yogesh Ashok Powar ht_info = (struct mwifiex_ie_types_htinfo *) pos; 934eedf15d34d3997051cc3a4bdd2adef68f3e36f57Yogesh Ashok Powar memset(ht_info, 0, sizeof(struct mwifiex_ie_types_htinfo)); 935eedf15d34d3997051cc3a4bdd2adef68f3e36f57Yogesh Ashok Powar ht_info->header.type = cpu_to_le16(WLAN_EID_HT_INFORMATION); 936eedf15d34d3997051cc3a4bdd2adef68f3e36f57Yogesh Ashok Powar ht_info->header.len = 937eedf15d34d3997051cc3a4bdd2adef68f3e36f57Yogesh Ashok Powar cpu_to_le16(sizeof(struct ieee80211_ht_info)); 938eedf15d34d3997051cc3a4bdd2adef68f3e36f57Yogesh Ashok Powar 939eedf15d34d3997051cc3a4bdd2adef68f3e36f57Yogesh Ashok Powar ht_info->ht_info.control_chan = 940eedf15d34d3997051cc3a4bdd2adef68f3e36f57Yogesh Ashok Powar (u8) priv->curr_bss_params.bss_descriptor.channel; 94121c3ba346486c3df39d23a2a085fcdfc7a59a853Amitkumar Karwar if (adapter->sec_chan_offset) { 94221c3ba346486c3df39d23a2a085fcdfc7a59a853Amitkumar Karwar ht_info->ht_info.ht_param = adapter->sec_chan_offset; 943eedf15d34d3997051cc3a4bdd2adef68f3e36f57Yogesh Ashok Powar ht_info->ht_info.ht_param |= 9446d2bd916afe6950b50f750cd82bbb9c6ff58611fMarc Yang IEEE80211_HT_PARAM_CHAN_WIDTH_ANY; 9455e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao } 946eedf15d34d3997051cc3a4bdd2adef68f3e36f57Yogesh Ashok Powar ht_info->ht_info.operation_mode = 947eedf15d34d3997051cc3a4bdd2adef68f3e36f57Yogesh Ashok Powar cpu_to_le16(IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT); 948eedf15d34d3997051cc3a4bdd2adef68f3e36f57Yogesh Ashok Powar ht_info->ht_info.basic_set[0] = 0xff; 949eedf15d34d3997051cc3a4bdd2adef68f3e36f57Yogesh Ashok Powar pos += sizeof(struct mwifiex_ie_types_htinfo); 950eedf15d34d3997051cc3a4bdd2adef68f3e36f57Yogesh Ashok Powar cmd_append_size += 951eedf15d34d3997051cc3a4bdd2adef68f3e36f57Yogesh Ashok Powar sizeof(struct mwifiex_ie_types_htinfo); 9525e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao } 9535e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 9545e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao cmd->size = cpu_to_le16((u16) 9555e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao (sizeof(struct host_cmd_ds_802_11_ad_hoc_start) 9565e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao + S_DS_GEN + cmd_append_size)); 9575e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 9585e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (adapter->adhoc_start_band == BAND_B) 959b93f85f0fb019f527b68569aafb836c94b89a47eBing Zhao tmp_cap &= ~WLAN_CAPABILITY_SHORT_SLOT_TIME; 9605e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao else 961b93f85f0fb019f527b68569aafb836c94b89a47eBing Zhao tmp_cap |= WLAN_CAPABILITY_SHORT_SLOT_TIME; 9625e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 9635e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao adhoc_start->cap_info_bitmap = cpu_to_le16(tmp_cap); 9645e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 9655e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao return 0; 9665e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao} 9675e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 9685e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao/* 9695e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * This function prepares command for ad-hoc join. 9705e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * 9715e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * Most of the parameters are set up by copying from the target BSS descriptor 9725e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * from the scan response. 9735e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * 9745e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * In addition, the following TLVs are added - 9755e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * - Channel TLV 9765e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * - Vendor specific IE 9775e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * - WPA/WPA2 IE 9785e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * - 11n IE 9795e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * 9805e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * Preparation also includes - 9815e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * - Setting command ID and proper size 9825e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * - Ensuring correct endian-ness 9835e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao */ 9845e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhaoint 9855e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhaomwifiex_cmd_802_11_ad_hoc_join(struct mwifiex_private *priv, 986a5ffddb70c5cab29fa00e2fdf12217b64b940796Amitkumar Karwar struct host_cmd_ds_command *cmd, 987a5ffddb70c5cab29fa00e2fdf12217b64b940796Amitkumar Karwar struct mwifiex_bssdescriptor *bss_desc) 9885e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao{ 989636c4598499eeacce0893dc8d91113b904bd531eYogesh Ashok Powar int rsn_ie_len = 0; 9905e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao struct host_cmd_ds_802_11_ad_hoc_join *adhoc_join = 9915e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao &cmd->params.adhoc_join; 9925e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao struct mwifiex_ie_types_chan_list_param_set *chan_tlv; 9935e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao u32 cmd_append_size = 0; 9945e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao u16 tmp_cap; 9955e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao u32 i, rates_size = 0; 9965e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao u16 curr_pkt_filter; 9975e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao u8 *pos = 9985e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao (u8 *) adhoc_join + 9995e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao sizeof(struct host_cmd_ds_802_11_ad_hoc_join); 10005e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 10015e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao/* Use G protection */ 10025e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao#define USE_G_PROTECTION 0x02 10035e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (bss_desc->erp_flags & USE_G_PROTECTION) { 10045e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao curr_pkt_filter = 10055e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv-> 10065e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao curr_pkt_filter | HostCmd_ACT_MAC_ADHOC_G_PROTECTION_ON; 10075e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 1008636c4598499eeacce0893dc8d91113b904bd531eYogesh Ashok Powar if (mwifiex_send_cmd_async(priv, HostCmd_CMD_MAC_CONTROL, 1009600f5d909a54a8dccf8c8c23898fc2e91bc0953eAmitkumar Karwar HostCmd_ACT_GEN_SET, 0, 1010636c4598499eeacce0893dc8d91113b904bd531eYogesh Ashok Powar &curr_pkt_filter)) { 10115e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_err(priv->adapter->dev, 10125e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao "ADHOC_J_CMD: G Protection config failed\n"); 10135e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao return -1; 10145e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao } 10155e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao } 10165e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 10175e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->attempted_bss_desc = bss_desc; 10185e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 10195e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao cmd->command = cpu_to_le16(HostCmd_CMD_802_11_AD_HOC_JOIN); 10205e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 10215e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao adhoc_join->bss_descriptor.bss_mode = HostCmd_BSS_MODE_IBSS; 10225e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 10235e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao adhoc_join->bss_descriptor.beacon_period 10245e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao = cpu_to_le16(bss_desc->beacon_period); 10255e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 10265e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao memcpy(&adhoc_join->bss_descriptor.bssid, 10275e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao &bss_desc->mac_address, ETH_ALEN); 10285e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 10295e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao memcpy(&adhoc_join->bss_descriptor.ssid, 10305e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao &bss_desc->ssid.ssid, bss_desc->ssid.ssid_len); 10315e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 10325e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao memcpy(&adhoc_join->bss_descriptor.phy_param_set, 10335e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao &bss_desc->phy_param_set, 10345e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao sizeof(union ieee_types_phy_param_set)); 10355e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 10365e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao memcpy(&adhoc_join->bss_descriptor.ss_param_set, 10375e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao &bss_desc->ss_param_set, sizeof(union ieee_types_ss_param_set)); 10385e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 10395e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao tmp_cap = bss_desc->cap_info_bitmap; 10405e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 10415e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao tmp_cap &= CAPINFO_MASK; 10425e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 10435e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_dbg(priv->adapter->dev, "info: ADHOC_J_CMD: tmp_cap=%4X" 10445e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao " CAPINFO_MASK=%4lX\n", tmp_cap, CAPINFO_MASK); 10455e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 10465e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Information on BSSID descriptor passed to FW */ 10475e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_dbg(priv->adapter->dev, "info: ADHOC_J_CMD: BSSID = %pM, SSID = %s\n", 10485e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao adhoc_join->bss_descriptor.bssid, 10495e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao adhoc_join->bss_descriptor.ssid); 10505e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 10515e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao for (i = 0; bss_desc->supported_rates[i] && 10525e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao i < MWIFIEX_SUPPORTED_RATES; 10535e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao i++) 10545e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao ; 10555e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao rates_size = i; 10565e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 10575e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Copy Data Rates from the Rates recorded in scan response */ 10585e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao memset(adhoc_join->bss_descriptor.data_rates, 0, 10595e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao sizeof(adhoc_join->bss_descriptor.data_rates)); 10605e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao memcpy(adhoc_join->bss_descriptor.data_rates, 10615e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao bss_desc->supported_rates, rates_size); 10625e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 10635e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Copy the adhoc join rates into Current BSS state structure */ 10645e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->curr_bss_params.num_of_rates = rates_size; 10655e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao memcpy(&priv->curr_bss_params.data_rates, bss_desc->supported_rates, 10665e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao rates_size); 10675e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 10685e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Copy the channel information */ 10695e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->curr_bss_params.bss_descriptor.channel = bss_desc->channel; 10705e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->curr_bss_params.band = (u8) bss_desc->bss_band; 10715e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 10725e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (priv->sec_info.wep_status == MWIFIEX_802_11_WEP_ENABLED 10735e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao || priv->sec_info.wpa_enabled) 10745e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao tmp_cap |= WLAN_CAPABILITY_PRIVACY; 10755e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 10765e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (IS_SUPPORT_MULTI_BANDS(priv->adapter)) { 10775e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Append a channel TLV */ 10785e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao chan_tlv = (struct mwifiex_ie_types_chan_list_param_set *) pos; 10795e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao chan_tlv->header.type = cpu_to_le16(TLV_TYPE_CHANLIST); 10805e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao chan_tlv->header.len = 10815e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao cpu_to_le16(sizeof(struct mwifiex_chan_scan_param_set)); 10825e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 10835e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao memset(chan_tlv->chan_scan_param, 0x00, 10845e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao sizeof(struct mwifiex_chan_scan_param_set)); 10855e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao chan_tlv->chan_scan_param[0].chan_number = 10865e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao (bss_desc->phy_param_set.ds_param_set.current_chan); 10875e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_dbg(priv->adapter->dev, "info: ADHOC_J_CMD: TLV Chan = %d\n", 10885e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao chan_tlv->chan_scan_param[0].chan_number); 10895e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 10905e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao chan_tlv->chan_scan_param[0].radio_type = 10915e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao mwifiex_band_to_radio_type((u8) bss_desc->bss_band); 10925e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 10935e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_dbg(priv->adapter->dev, "info: ADHOC_J_CMD: TLV Band = %d\n", 10945e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao chan_tlv->chan_scan_param[0].radio_type); 10955e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao pos += sizeof(chan_tlv->header) + 10965e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao sizeof(struct mwifiex_chan_scan_param_set); 10975e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao cmd_append_size += sizeof(chan_tlv->header) + 10985e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao sizeof(struct mwifiex_chan_scan_param_set); 10995e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao } 11005e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 11015e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (priv->sec_info.wpa_enabled) 11025e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao rsn_ie_len = mwifiex_append_rsn_ie_wpa_wpa2(priv, &pos); 11035e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (rsn_ie_len == -1) 11045e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao return -1; 11055e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao cmd_append_size += rsn_ie_len; 11065e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 11075e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (ISSUPP_11NENABLED(priv->adapter->fw_cap_info)) 11085e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao cmd_append_size += mwifiex_cmd_append_11n_tlv(priv, 11095e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao bss_desc, &pos); 11105e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 11115e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Append vendor specific IE TLV */ 11125e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao cmd_append_size += mwifiex_cmd_append_vsie_tlv(priv, 11135e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao MWIFIEX_VSIE_MASK_ADHOC, &pos); 11145e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 11155e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao cmd->size = cpu_to_le16((u16) 11165e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao (sizeof(struct host_cmd_ds_802_11_ad_hoc_join) 11175e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao + S_DS_GEN + cmd_append_size)); 11185e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 11195e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao adhoc_join->bss_descriptor.cap_info_bitmap = cpu_to_le16(tmp_cap); 11205e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 1121636c4598499eeacce0893dc8d91113b904bd531eYogesh Ashok Powar return 0; 11225e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao} 11235e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 11245e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao/* 11255e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * This function handles the command response of ad-hoc start and 11265e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * ad-hoc join. 11275e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * 11285e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * The function generates a device-connected event to notify 11295e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * the applications, in case of successful ad-hoc start/join, and 11305e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * saves the beacon buffer. 11315e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao */ 11325e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhaoint mwifiex_ret_802_11_ad_hoc(struct mwifiex_private *priv, 1133600f5d909a54a8dccf8c8c23898fc2e91bc0953eAmitkumar Karwar struct host_cmd_ds_command *resp) 11345e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao{ 11355e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao int ret = 0; 1136600f5d909a54a8dccf8c8c23898fc2e91bc0953eAmitkumar Karwar struct mwifiex_adapter *adapter = priv->adapter; 11375e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao struct host_cmd_ds_802_11_ad_hoc_result *adhoc_result; 11385e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao struct mwifiex_bssdescriptor *bss_desc; 11395e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 11405e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao adhoc_result = &resp->params.adhoc_result; 11415e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 11425e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao bss_desc = priv->attempted_bss_desc; 11435e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 11445e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Join result code 0 --> SUCCESS */ 1145636c4598499eeacce0893dc8d91113b904bd531eYogesh Ashok Powar if (le16_to_cpu(resp->result)) { 11465e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_err(priv->adapter->dev, "ADHOC_RESP: failed\n"); 11475e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (priv->media_connected) 11485e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao mwifiex_reset_connect_state(priv); 11495e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 11505e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao memset(&priv->curr_bss_params.bss_descriptor, 11515e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 0x00, sizeof(struct mwifiex_bssdescriptor)); 11525e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 11535e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao ret = -1; 11545e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao goto done; 11555e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao } 11565e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 11575e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Send a Media Connected event, according to the Spec */ 11585e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->media_connected = true; 11595e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 1160636c4598499eeacce0893dc8d91113b904bd531eYogesh Ashok Powar if (le16_to_cpu(resp->command) == HostCmd_CMD_802_11_AD_HOC_START) { 11615e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_dbg(priv->adapter->dev, "info: ADHOC_S_RESP %s\n", 11625e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao bss_desc->ssid.ssid); 11635e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 11645e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Update the created network descriptor with the new BSSID */ 11655e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao memcpy(bss_desc->mac_address, 11665e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao adhoc_result->bssid, ETH_ALEN); 11675e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 11685e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->adhoc_state = ADHOC_STARTED; 11695e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao } else { 11705e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* 11715e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * Now the join cmd should be successful. 11725e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * If BSSID has changed use SSID to compare instead of BSSID 11735e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao */ 11745e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_dbg(priv->adapter->dev, "info: ADHOC_J_RESP %s\n", 11755e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao bss_desc->ssid.ssid); 11765e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 11775e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* 11785e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * Make a copy of current BSSID descriptor, only needed for 11795e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * join since the current descriptor is already being used 11805e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * for adhoc start 11815e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao */ 11825e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao memcpy(&priv->curr_bss_params.bss_descriptor, 11835e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao bss_desc, sizeof(struct mwifiex_bssdescriptor)); 11845e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 11855e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->adhoc_state = ADHOC_JOINED; 11865e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao } 11875e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 11885e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_dbg(priv->adapter->dev, "info: ADHOC_RESP: channel = %d\n", 11895e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->adhoc_channel); 11905e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_dbg(priv->adapter->dev, "info: ADHOC_RESP: BSSID = %pM\n", 11915e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->curr_bss_params.bss_descriptor.mac_address); 11925e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 11935e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (!netif_carrier_ok(priv->netdev)) 11945e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao netif_carrier_on(priv->netdev); 11955e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (netif_queue_stopped(priv->netdev)) 11965e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao netif_wake_queue(priv->netdev); 11975e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 11985e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao mwifiex_save_curr_bcn(priv); 11995e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 12005e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhaodone: 12015e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Need to indicate IOCTL complete */ 1202600f5d909a54a8dccf8c8c23898fc2e91bc0953eAmitkumar Karwar if (adapter->curr_cmd->wait_q_enabled) { 12035e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (ret) 1204600f5d909a54a8dccf8c8c23898fc2e91bc0953eAmitkumar Karwar adapter->cmd_wait_q.status = -1; 12055e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao else 1206600f5d909a54a8dccf8c8c23898fc2e91bc0953eAmitkumar Karwar adapter->cmd_wait_q.status = 0; 12075e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 12085e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao } 12095e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 12105e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao return ret; 12115e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao} 12125e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 12135e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao/* 12145e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * This function associates to a specific BSS discovered in a scan. 12155e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * 12165e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * It clears any past association response stored for application 12175e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * retrieval and calls the command preparation routine to send the 12185e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * command to firmware. 12195e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao */ 12205e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhaoint mwifiex_associate(struct mwifiex_private *priv, 1221600f5d909a54a8dccf8c8c23898fc2e91bc0953eAmitkumar Karwar struct mwifiex_bssdescriptor *bss_desc) 12225e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao{ 12235e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao u8 current_bssid[ETH_ALEN]; 12245e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 12255e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Return error if the adapter or table entry is not marked as infra */ 1226eecd8250e492ffc4e7b72953cda9c2f3ba0e6cccBing Zhao if ((priv->bss_mode != NL80211_IFTYPE_STATION) || 1227eecd8250e492ffc4e7b72953cda9c2f3ba0e6cccBing Zhao (bss_desc->bss_mode != NL80211_IFTYPE_STATION)) 12285e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao return -1; 12295e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 12305e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao memcpy(¤t_bssid, 12315e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao &priv->curr_bss_params.bss_descriptor.mac_address, 12325e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao sizeof(current_bssid)); 12335e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 12345e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Clear any past association response stored for application 12355e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao retrieval */ 12365e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->assoc_rsp_size = 0; 12375e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 1238636c4598499eeacce0893dc8d91113b904bd531eYogesh Ashok Powar return mwifiex_send_cmd_sync(priv, HostCmd_CMD_802_11_ASSOCIATE, 1239600f5d909a54a8dccf8c8c23898fc2e91bc0953eAmitkumar Karwar HostCmd_ACT_GEN_SET, 0, bss_desc); 12405e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao} 12415e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 12425e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao/* 12435e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * This function starts an ad-hoc network. 12445e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * 12455e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * It calls the command preparation routine to send the command to firmware. 12465e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao */ 12475e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhaoint 12485e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhaomwifiex_adhoc_start(struct mwifiex_private *priv, 1249600f5d909a54a8dccf8c8c23898fc2e91bc0953eAmitkumar Karwar struct mwifiex_802_11_ssid *adhoc_ssid) 12505e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao{ 12515e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_dbg(priv->adapter->dev, "info: Adhoc Channel = %d\n", 12525e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->adhoc_channel); 12535e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_dbg(priv->adapter->dev, "info: curr_bss_params.channel = %d\n", 12545e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->curr_bss_params.bss_descriptor.channel); 12555e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_dbg(priv->adapter->dev, "info: curr_bss_params.band = %d\n", 12565e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->curr_bss_params.band); 12575e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 1258636c4598499eeacce0893dc8d91113b904bd531eYogesh Ashok Powar return mwifiex_send_cmd_sync(priv, HostCmd_CMD_802_11_AD_HOC_START, 1259600f5d909a54a8dccf8c8c23898fc2e91bc0953eAmitkumar Karwar HostCmd_ACT_GEN_SET, 0, adhoc_ssid); 12605e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao} 12615e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 12625e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao/* 12635e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * This function joins an ad-hoc network found in a previous scan. 12645e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * 12655e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * It calls the command preparation routine to send the command to firmware, 12665e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * if already not connected to the requested SSID. 12675e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao */ 12685e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhaoint mwifiex_adhoc_join(struct mwifiex_private *priv, 1269600f5d909a54a8dccf8c8c23898fc2e91bc0953eAmitkumar Karwar struct mwifiex_bssdescriptor *bss_desc) 12705e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao{ 12715e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_dbg(priv->adapter->dev, "info: adhoc join: curr_bss ssid =%s\n", 12725e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->curr_bss_params.bss_descriptor.ssid.ssid); 12735e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_dbg(priv->adapter->dev, "info: adhoc join: curr_bss ssid_len =%u\n", 12745e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->curr_bss_params.bss_descriptor.ssid.ssid_len); 12755e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_dbg(priv->adapter->dev, "info: adhoc join: ssid =%s\n", 12765e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao bss_desc->ssid.ssid); 12775e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_dbg(priv->adapter->dev, "info: adhoc join: ssid_len =%u\n", 12785e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao bss_desc->ssid.ssid_len); 12795e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 12805e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao /* Check if the requested SSID is already joined */ 12815e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (priv->curr_bss_params.bss_descriptor.ssid.ssid_len && 12825e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao !mwifiex_ssid_cmp(&bss_desc->ssid, 12835e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao &priv->curr_bss_params.bss_descriptor.ssid) && 12845e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao (priv->curr_bss_params.bss_descriptor.bss_mode == 1285eecd8250e492ffc4e7b72953cda9c2f3ba0e6cccBing Zhao NL80211_IFTYPE_ADHOC)) { 12865e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_dbg(priv->adapter->dev, "info: ADHOC_J_CMD: new ad-hoc SSID" 12875e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao " is the same as current; not attempting to re-join\n"); 12885e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao return -1; 12895e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao } 12905e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 12915e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_dbg(priv->adapter->dev, "info: curr_bss_params.channel = %d\n", 12925e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->curr_bss_params.bss_descriptor.channel); 12935e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao dev_dbg(priv->adapter->dev, "info: curr_bss_params.band = %c\n", 12945e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao priv->curr_bss_params.band); 12955e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 1296636c4598499eeacce0893dc8d91113b904bd531eYogesh Ashok Powar return mwifiex_send_cmd_sync(priv, HostCmd_CMD_802_11_AD_HOC_JOIN, 1297600f5d909a54a8dccf8c8c23898fc2e91bc0953eAmitkumar Karwar HostCmd_ACT_GEN_SET, 0, bss_desc); 12985e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao} 12995e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 13005e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao/* 13015e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * This function deauthenticates/disconnects from infra network by sending 13025e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * deauthentication request. 13035e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao */ 1304600f5d909a54a8dccf8c8c23898fc2e91bc0953eAmitkumar Karwarstatic int mwifiex_deauthenticate_infra(struct mwifiex_private *priv, u8 *mac) 13055e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao{ 13065e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao u8 mac_address[ETH_ALEN]; 1307270e58e8898c8be40451ebee45b6c9b5bd5db04bYogesh Ashok Powar int ret; 13085e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao u8 zero_mac[ETH_ALEN] = { 0, 0, 0, 0, 0, 0 }; 13095e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 13105e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (mac) { 13115e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (!memcmp(mac, zero_mac, sizeof(zero_mac))) 13125e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao memcpy((u8 *) &mac_address, 13135e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao (u8 *) &priv->curr_bss_params.bss_descriptor. 13145e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao mac_address, ETH_ALEN); 13155e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao else 13165e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao memcpy((u8 *) &mac_address, (u8 *) mac, ETH_ALEN); 13175e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao } else { 13185e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao memcpy((u8 *) &mac_address, (u8 *) &priv->curr_bss_params. 13195e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao bss_descriptor.mac_address, ETH_ALEN); 13205e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao } 13215e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 1322600f5d909a54a8dccf8c8c23898fc2e91bc0953eAmitkumar Karwar ret = mwifiex_send_cmd_sync(priv, HostCmd_CMD_802_11_DEAUTHENTICATE, 1323600f5d909a54a8dccf8c8c23898fc2e91bc0953eAmitkumar Karwar HostCmd_ACT_GEN_SET, 0, &mac_address); 13245e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 13255e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao return ret; 13265e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao} 13275e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 13285e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao/* 13295e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * This function deauthenticates/disconnects from a BSS. 13305e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * 13315e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * In case of infra made, it sends deauthentication request, and 13325e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * in case of ad-hoc mode, a stop network request is sent to the firmware. 13335e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao */ 1334600f5d909a54a8dccf8c8c23898fc2e91bc0953eAmitkumar Karwarint mwifiex_deauthenticate(struct mwifiex_private *priv, u8 *mac) 13355e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao{ 13365e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao int ret = 0; 13375e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 13385e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao if (priv->media_connected) { 1339eecd8250e492ffc4e7b72953cda9c2f3ba0e6cccBing Zhao if (priv->bss_mode == NL80211_IFTYPE_STATION) { 1340600f5d909a54a8dccf8c8c23898fc2e91bc0953eAmitkumar Karwar ret = mwifiex_deauthenticate_infra(priv, mac); 1341eecd8250e492ffc4e7b72953cda9c2f3ba0e6cccBing Zhao } else if (priv->bss_mode == NL80211_IFTYPE_ADHOC) { 1342600f5d909a54a8dccf8c8c23898fc2e91bc0953eAmitkumar Karwar ret = mwifiex_send_cmd_sync(priv, 1343600f5d909a54a8dccf8c8c23898fc2e91bc0953eAmitkumar Karwar HostCmd_CMD_802_11_AD_HOC_STOP, 1344600f5d909a54a8dccf8c8c23898fc2e91bc0953eAmitkumar Karwar HostCmd_ACT_GEN_SET, 0, NULL); 13455e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao } 13465e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao } 13475e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 13485e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao return ret; 13495e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao} 1350600f5d909a54a8dccf8c8c23898fc2e91bc0953eAmitkumar KarwarEXPORT_SYMBOL_GPL(mwifiex_deauthenticate); 13515e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao 13525e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao/* 13535e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao * This function converts band to radio type used in channel TLV. 13545e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao */ 13555e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhaou8 13565e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhaomwifiex_band_to_radio_type(u8 band) 13575e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao{ 13585e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao switch (band) { 13595e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao case BAND_A: 13605e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao case BAND_AN: 13615e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao case BAND_A | BAND_AN: 1362636c4598499eeacce0893dc8d91113b904bd531eYogesh Ashok Powar return HostCmd_SCAN_RADIO_TYPE_A; 13635e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao case BAND_B: 13645e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao case BAND_G: 13655e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao case BAND_B | BAND_G: 13665e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao default: 1367636c4598499eeacce0893dc8d91113b904bd531eYogesh Ashok Powar return HostCmd_SCAN_RADIO_TYPE_BG; 13685e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao } 13695e6e3a92b9a4c9416b17f468fa5c7fa2233b8b4eBing Zhao} 1370