diff options
Diffstat (limited to 'drivers/net/wireless/sd8797/mlan/mlan_sta_cmdresp.c')
-rw-r--r-- | drivers/net/wireless/sd8797/mlan/mlan_sta_cmdresp.c | 94 |
1 files changed, 90 insertions, 4 deletions
diff --git a/drivers/net/wireless/sd8797/mlan/mlan_sta_cmdresp.c b/drivers/net/wireless/sd8797/mlan/mlan_sta_cmdresp.c index be56a16615b9..086d16ae5a62 100644 --- a/drivers/net/wireless/sd8797/mlan/mlan_sta_cmdresp.c +++ b/drivers/net/wireless/sd8797/mlan/mlan_sta_cmdresp.c @@ -3,7 +3,7 @@ * @brief This file contains the handling of command * responses generated by firmware. * - * Copyright (C) 2008-2011, Marvell International Ltd. + * Copyright (C) 2008-2012, Marvell International Ltd. * * This software file (the "File") is distributed by Marvell International * Ltd. under the terms of the GNU General Public License Version 2, June 1991 @@ -231,6 +231,12 @@ wlan_ret_802_11_snmp_mib(IN pmlan_private pmpriv, wlan_le16_to_cpu(psmib->buf_size)); if (query_type == HostCmd_ACT_GEN_GET) { switch (oid) { + case DtimPeriod_i: + ul_temp = psmib->value[0]; + PRINTM(MINFO, "SNMP_RESP: DTIM Period =%u\n", ul_temp); + if (mib) + mib->param.dtim_period = ul_temp; + break; case FragThresh_i: ul_temp = wlan_le16_to_cpu(*((t_u16 *) (psmib->value))); PRINTM(MINFO, "SNMP_RESP: FragThsd =%u\n", ul_temp); @@ -765,6 +771,7 @@ wlan_ret_802_11_key_material(IN pmlan_private pmpriv, IN mlan_ioctl_req * pioctl_buf) { HostCmd_DS_802_11_KEY_MATERIAL *pkey = &resp->params.key_material; + mlan_ds_sec_cfg *sec = MNULL; ENTER(); @@ -780,8 +787,50 @@ wlan_ret_802_11_key_material(IN pmlan_private pmpriv, } pmpriv->scan_block = MFALSE; } + } else { + if (pioctl_buf && + (wlan_le16_to_cpu(pkey->key_param_set.type) == + TLV_TYPE_KEY_MATERIAL)) { + PRINTM(MIOCTL, "key_type_id=%d, key_len=%d, key_info=0x%x\n", + wlan_le16_to_cpu(pkey->key_param_set.key_type_id), + wlan_le16_to_cpu(pkey->key_param_set.key_len), + wlan_le16_to_cpu(pkey->key_param_set.key_info)); + sec = (mlan_ds_sec_cfg *) pioctl_buf->pbuf; +#define WAPI_KEY_SIZE 32 + switch (wlan_le16_to_cpu(pkey->key_param_set.key_type_id)) { + case KEY_TYPE_ID_WEP: + sec->param.encrypt_key.key_index = pkey->key_param_set.key[0]; + sec->param.encrypt_key.key_len = + wlan_le16_to_cpu(pkey->key_param_set.key_len); + memcpy(pmpriv->adapter, sec->param.encrypt_key.key_material, + &pkey->key_param_set.key[2], + sec->param.encrypt_key.key_len); + break; + case KEY_TYPE_ID_TKIP: + sec->param.encrypt_key.key_len = + wlan_le16_to_cpu(pkey->key_param_set.key_len); + memcpy(pmpriv->adapter, sec->param.encrypt_key.key_material, + pkey->key_param_set.key, sec->param.encrypt_key.key_len); + break; + case KEY_TYPE_ID_AES: + sec->param.encrypt_key.key_len = + wlan_le16_to_cpu(pkey->key_param_set.key_len); + memcpy(pmpriv->adapter, sec->param.encrypt_key.key_material, + pkey->key_param_set.key, sec->param.encrypt_key.key_len); + break; + case KEY_TYPE_ID_WAPI: + sec->param.encrypt_key.is_wapi_key = MTRUE; + sec->param.encrypt_key.key_index = pkey->key_param_set.key[0]; + sec->param.encrypt_key.key_len = WAPI_KEY_SIZE; + memcpy(pmpriv->adapter, sec->param.encrypt_key.key_material, + &pkey->key_param_set.key[2], + sec->param.encrypt_key.key_len); + memcpy(pmpriv->adapter, sec->param.encrypt_key.pn, + &pkey->key_param_set.key[2 + WAPI_KEY_SIZE], PN_SIZE); + break; + } + } } - LEAVE(); return MLAN_STATUS_SUCCESS; } @@ -1374,6 +1423,41 @@ wlan_ret_subscribe_event(IN pmlan_private pmpriv, return MLAN_STATUS_SUCCESS; } +/** + * @brief This function handles the command response of + * OTP user data + * + * @param pmpriv A pointer to mlan_private structure + * @param resp A pointer to HostCmd_DS_COMMAND + * @param pioctl_buf A pointer to command buffer + * + * @return MLAN_STATUS_SUCCESS + */ +static mlan_status +wlan_ret_otp_user_data(IN pmlan_private pmpriv, + IN HostCmd_DS_COMMAND * resp, + IN mlan_ioctl_req * pioctl_buf) +{ + + HostCmd_DS_OTP_USER_DATA *cmd_user_data = + (HostCmd_DS_OTP_USER_DATA *) & resp->params.otp_user_data; + mlan_ds_misc_otp_user_data *user_data = MNULL; + + ENTER(); + if (pioctl_buf && (pioctl_buf->action == MLAN_ACT_GET)) { + user_data = (mlan_ds_misc_otp_user_data *) pioctl_buf->pbuf; + user_data->user_data_length = MIN(MAX_OTP_USER_DATA_LEN, + wlan_le16_to_cpu(cmd_user_data-> + user_data_length)); + memcpy(pmpriv->adapter, user_data->user_data, cmd_user_data->user_data, + user_data->user_data_length); + pioctl_buf->data_read_written = + sizeof(mlan_ds_misc_otp_user_data) + user_data->user_data_length; + } + LEAVE(); + return MLAN_STATUS_SUCCESS; +} + /******************************************************** Global Functions ********************************************************/ @@ -1442,8 +1526,7 @@ wlan_ops_sta_process_cmdresp(IN t_void * priv, ret = wlan_ret_bgscan_config(pmpriv, resp, pioctl_buf); break; case HostCmd_CMD_802_11_BG_SCAN_QUERY: - ret = wlan_ret_802_11_scan(pmpriv, resp, pioctl_buf); - wlan_recv_event(pmpriv, MLAN_EVENT_ID_FW_BG_SCAN, MNULL); + ret = wlan_ret_802_11_bgscan_query(pmpriv, resp, pioctl_buf); PRINTM(MINFO, "CMD_RESP: BG_SCAN result is ready!\n"); break; case HostCmd_CMD_TXPWR_CFG: @@ -1629,6 +1712,9 @@ wlan_ops_sta_process_cmdresp(IN t_void * priv, case HostCmd_CMD_802_11_SUBSCRIBE_EVENT: ret = wlan_ret_subscribe_event(pmpriv, resp, pioctl_buf); break; + case HostCmd_CMD_OTP_READ_USER_DATA: + ret = wlan_ret_otp_user_data(pmpriv, resp, pioctl_buf); + break; default: PRINTM(MERROR, "CMD_RESP: Unknown command response %#x\n", resp->command); |