rtl8723cs/core/rtw_ioctl_rtl.c

1022 lines
30 KiB
C

/******************************************************************************
*
* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of version 2 of the GNU General Public License as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
*
*
******************************************************************************/
#define _RTW_IOCTL_RTL_C_
#include <drv_types.h>
#ifdef CONFIG_MP_INCLUDED
#include <rtw_mp_ioctl.h>
#endif
struct oid_obj_priv oid_rtl_seg_01_01[] =
{
{1, &oid_null_function}, //0x80
{1, &oid_null_function}, //0x81
{1, &oid_null_function}, //0x82
{1, &oid_null_function}, //0x83//OID_RT_SET_SNIFFER_MODE
{1, &oid_rt_get_signal_quality_hdl}, //0x84
{1, &oid_rt_get_small_packet_crc_hdl}, //0x85
{1, &oid_rt_get_middle_packet_crc_hdl}, //0x86
{1, &oid_rt_get_large_packet_crc_hdl}, //0x87
{1, &oid_rt_get_tx_retry_hdl}, //0x88
{1, &oid_rt_get_rx_retry_hdl}, //0x89
{1, &oid_rt_pro_set_fw_dig_state_hdl}, //0x8A
{1, &oid_rt_pro_set_fw_ra_state_hdl} , //0x8B
{1, &oid_null_function}, //0x8C
{1, &oid_null_function}, //0x8D
{1, &oid_null_function}, //0x8E
{1, &oid_null_function}, //0x8F
{1, &oid_rt_get_rx_total_packet_hdl}, //0x90
{1, &oid_rt_get_tx_beacon_ok_hdl}, //0x91
{1, &oid_rt_get_tx_beacon_err_hdl}, //0x92
{1, &oid_rt_get_rx_icv_err_hdl}, //0x93
{1, &oid_rt_set_encryption_algorithm_hdl}, //0x94
{1, &oid_null_function}, //0x95
{1, &oid_rt_get_preamble_mode_hdl}, //0x96
{1, &oid_null_function}, //0x97
{1, &oid_rt_get_ap_ip_hdl}, //0x98
{1, &oid_rt_get_channelplan_hdl}, //0x99
{1, &oid_rt_set_preamble_mode_hdl}, //0x9A
{1, &oid_rt_set_bcn_intvl_hdl}, //0x9B
{1, &oid_null_function}, //0x9C
{1, &oid_rt_dedicate_probe_hdl}, //0x9D
{1, &oid_null_function}, //0x9E
{1, &oid_null_function}, //0x9F
{1, &oid_null_function}, //0xA0
{1, &oid_null_function}, //0xA1
{1, &oid_null_function}, //0xA2
{1, &oid_null_function}, //0xA3
{1, &oid_null_function}, //0xA4
{1, &oid_null_function}, //0xA5
{1, &oid_null_function}, //0xA6
{1, &oid_rt_get_total_tx_bytes_hdl}, //0xA7
{1, &oid_rt_get_total_rx_bytes_hdl}, //0xA8
{1, &oid_rt_current_tx_power_level_hdl}, //0xA9
{1, &oid_rt_get_enc_key_mismatch_count_hdl}, //0xAA
{1, &oid_rt_get_enc_key_match_count_hdl}, //0xAB
{1, &oid_rt_get_channel_hdl}, //0xAC
{1, &oid_rt_set_channelplan_hdl}, //0xAD
{1, &oid_rt_get_hardware_radio_off_hdl}, //0xAE
{1, &oid_null_function}, //0xAF
{1, &oid_null_function}, //0xB0
{1, &oid_null_function}, //0xB1
{1, &oid_null_function}, //0xB2
{1, &oid_null_function}, //0xB3
{1, &oid_rt_get_key_mismatch_hdl}, //0xB4
{1, &oid_null_function}, //0xB5
{1, &oid_null_function}, //0xB6
{1, &oid_null_function}, //0xB7
{1, &oid_null_function}, //0xB8
{1, &oid_null_function}, //0xB9
{1, &oid_null_function}, //0xBA
{1, &oid_rt_supported_wireless_mode_hdl}, //0xBB
{1, &oid_rt_get_channel_list_hdl}, //0xBC
{1, &oid_rt_get_scan_in_progress_hdl}, //0xBD
{1, &oid_null_function}, //0xBE
{1, &oid_null_function}, //0xBF
{1, &oid_null_function}, //0xC0
{1, &oid_rt_forced_data_rate_hdl}, //0xC1
{1, &oid_rt_wireless_mode_for_scan_list_hdl}, //0xC2
{1, &oid_rt_get_bss_wireless_mode_hdl}, //0xC3
{1, &oid_rt_scan_with_magic_packet_hdl}, //0xC4
{1, &oid_null_function}, //0xC5
{1, &oid_null_function}, //0xC6
{1, &oid_null_function}, //0xC7
{1, &oid_null_function}, //0xC8
{1, &oid_null_function}, //0xC9
{1, &oid_null_function}, //0xCA
{1, &oid_null_function}, //0xCB
{1, &oid_null_function}, //0xCC
{1, &oid_null_function}, //0xCD
{1, &oid_null_function}, //0xCE
{1, &oid_null_function}, //0xCF
};
struct oid_obj_priv oid_rtl_seg_01_03[] =
{
{1, &oid_rt_ap_get_associated_station_list_hdl}, //0x00
{1, &oid_null_function}, //0x01
{1, &oid_rt_ap_switch_into_ap_mode_hdl}, //0x02
{1, &oid_null_function}, //0x03
{1, &oid_rt_ap_supported_hdl}, //0x04
{1, &oid_rt_ap_set_passphrase_hdl}, //0x05
};
struct oid_obj_priv oid_rtl_seg_01_11[] =
{
{1, &oid_null_function}, //0xC0 OID_RT_PRO_RX_FILTER
{1, &oid_null_function}, //0xC1 OID_CE_USB_WRITE_REGISTRY
{1, &oid_null_function}, //0xC2 OID_CE_USB_READ_REGISTRY
{1, &oid_null_function}, //0xC3 OID_RT_PRO_SET_INITIAL_GAIN
{1, &oid_null_function}, //0xC4 OID_RT_PRO_SET_BB_RF_STANDBY_MODE
{1, &oid_null_function}, //0xC5 OID_RT_PRO_SET_BB_RF_SHUTDOWN_MODE
{1, &oid_null_function}, //0xC6 OID_RT_PRO_SET_TX_CHARGE_PUMP
{1, &oid_null_function}, //0xC7 OID_RT_PRO_SET_RX_CHARGE_PUMP
{1, &oid_rt_pro_rf_write_registry_hdl}, //0xC8
{1, &oid_rt_pro_rf_read_registry_hdl}, //0xC9
{1, &oid_null_function} //0xCA OID_RT_PRO_QUERY_RF_TYPE
};
struct oid_obj_priv oid_rtl_seg_03_00[] =
{
{1, &oid_null_function}, //0x00
{1, &oid_rt_get_connect_state_hdl}, //0x01
{1, &oid_null_function}, //0x02
{1, &oid_null_function}, //0x03
{1, &oid_rt_set_default_key_id_hdl}, //0x04
};
//************** oid_rtl_seg_01_01 section start **************
NDIS_STATUS oid_rt_pro_set_fw_dig_state_hdl(struct oid_par_priv* poid_par_priv)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
#if 0
PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
_irqL oldirql;
_func_enter_;
if(poid_par_priv->type_of_oid != SET_OID)
{
status = NDIS_STATUS_NOT_ACCEPTED;
return status;
}
_irqlevel_changed_(&oldirql,LOWER);
if(poid_par_priv->information_buf_len >= sizeof(struct setdig_parm))
{
//DEBUG_ERR(("===> oid_rt_pro_set_fw_dig_state_hdl. type:0x%02x.\n",*((unsigned char*)poid_par_priv->information_buf )));
if(!rtw_setfwdig_cmd(Adapter,*((unsigned char*)poid_par_priv->information_buf )))
{
status = NDIS_STATUS_NOT_ACCEPTED;
}
}
else{
status = NDIS_STATUS_NOT_ACCEPTED;
}
_irqlevel_changed_(&oldirql,RAISE);
_func_exit_;
#endif
return status;
}
//-----------------------------------------------------------------------------
NDIS_STATUS oid_rt_pro_set_fw_ra_state_hdl(struct oid_par_priv* poid_par_priv)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
#if 0
PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
_irqL oldirql;
_func_enter_;
if(poid_par_priv->type_of_oid != SET_OID)
{
status = NDIS_STATUS_NOT_ACCEPTED;
return status;
}
_irqlevel_changed_(&oldirql,LOWER);
if(poid_par_priv->information_buf_len >= sizeof(struct setra_parm))
{
//DEBUG_ERR(("===> oid_rt_pro_set_fw_ra_state_hdl. type:0x%02x.\n",*((unsigned char*)poid_par_priv->information_buf )));
if(!rtw_setfwra_cmd(Adapter,*((unsigned char*)poid_par_priv->information_buf )))
{
status = NDIS_STATUS_NOT_ACCEPTED;
}
}
else{
status = NDIS_STATUS_NOT_ACCEPTED;
}
_irqlevel_changed_(&oldirql,RAISE);
_func_exit_;
#endif
return status;
}
//-----------------------------------------------------------------------------
NDIS_STATUS oid_rt_get_signal_quality_hdl(struct oid_par_priv* poid_par_priv)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
//DEBUG_ERR(("<**********************oid_rt_get_signal_quality_hdl \n"));
if(poid_par_priv->type_of_oid != QUERY_OID)
{
status = NDIS_STATUS_NOT_ACCEPTED;
return status;
}
#if 0
if(pMgntInfo->mAssoc || pMgntInfo->mIbss)
{
ulInfo = pAdapter->RxStats.SignalQuality;
*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
}
else
{
ulInfo = 0xffffffff; // It stands for -1 in 4-byte integer.
}
break;
#endif
return status;
}
//------------------------------------------------------------------------------
NDIS_STATUS oid_rt_get_small_packet_crc_hdl(struct oid_par_priv* poid_par_priv)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
if(poid_par_priv->type_of_oid != QUERY_OID)
{
status = NDIS_STATUS_NOT_ACCEPTED;
return status;
}
if(poid_par_priv->information_buf_len >= sizeof(ULONG) )
{
*(ULONG *)poid_par_priv->information_buf = padapter->recvpriv.rx_smallpacket_crcerr;
*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
}
else
{
status = NDIS_STATUS_INVALID_LENGTH;
}
return status;
}
//------------------------------------------------------------------------------
NDIS_STATUS oid_rt_get_middle_packet_crc_hdl(struct oid_par_priv* poid_par_priv)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
if(poid_par_priv->type_of_oid != QUERY_OID)
{
status = NDIS_STATUS_NOT_ACCEPTED;
return status;
}
if(poid_par_priv->information_buf_len >= sizeof(ULONG) )
{
*(ULONG *)poid_par_priv->information_buf = padapter->recvpriv.rx_middlepacket_crcerr;
*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
}
else
{
status = NDIS_STATUS_INVALID_LENGTH;
}
return status;
}
//------------------------------------------------------------------------------
NDIS_STATUS oid_rt_get_large_packet_crc_hdl(struct oid_par_priv* poid_par_priv)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
if(poid_par_priv->type_of_oid != QUERY_OID)
{
status = NDIS_STATUS_NOT_ACCEPTED;
return status;
}
if(poid_par_priv->information_buf_len >= sizeof(ULONG) )
{
*(ULONG *)poid_par_priv->information_buf = padapter->recvpriv.rx_largepacket_crcerr;
*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
}
else
{
status = NDIS_STATUS_INVALID_LENGTH;
}
return status;
}
//------------------------------------------------------------------------------
NDIS_STATUS oid_rt_get_tx_retry_hdl(struct oid_par_priv* poid_par_priv)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
if(poid_par_priv->type_of_oid != QUERY_OID)
{
status = NDIS_STATUS_NOT_ACCEPTED;
return status;
}
return status;
}
NDIS_STATUS oid_rt_get_rx_retry_hdl(struct oid_par_priv* poid_par_priv)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
if(poid_par_priv->type_of_oid != QUERY_OID)
{
status = NDIS_STATUS_NOT_ACCEPTED;
return status;
}
*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
return status;
}
//------------------------------------------------------------------------------
NDIS_STATUS oid_rt_get_rx_total_packet_hdl(struct oid_par_priv* poid_par_priv)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
if(poid_par_priv->type_of_oid != QUERY_OID)
{
status = NDIS_STATUS_NOT_ACCEPTED;
return status;
}
if(poid_par_priv->information_buf_len >= sizeof(ULONG) )
{
*(u64 *)poid_par_priv->information_buf = padapter->recvpriv.rx_pkts + padapter->recvpriv.rx_drop;
*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
}
else
{
status = NDIS_STATUS_INVALID_LENGTH;
}
return status;
}
//------------------------------------------------------------------------------
NDIS_STATUS oid_rt_get_tx_beacon_ok_hdl(struct oid_par_priv* poid_par_priv)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
if(poid_par_priv->type_of_oid != QUERY_OID)
{
status = NDIS_STATUS_NOT_ACCEPTED;
return status;
}
return status;
}
NDIS_STATUS oid_rt_get_tx_beacon_err_hdl(struct oid_par_priv* poid_par_priv)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
if(poid_par_priv->type_of_oid != QUERY_OID)
{
status = NDIS_STATUS_NOT_ACCEPTED;
return status;
}
return status;
}
//------------------------------------------------------------------------------
NDIS_STATUS oid_rt_get_rx_icv_err_hdl(struct oid_par_priv* poid_par_priv)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
if(poid_par_priv->type_of_oid != QUERY_OID)
{
status = NDIS_STATUS_NOT_ACCEPTED;
return status;
}
if(poid_par_priv->information_buf_len>= sizeof(u32))
{
//_rtw_memcpy(*(uint *)poid_par_priv->information_buf,padapter->recvpriv.rx_icv_err,sizeof(u32));
*(uint *)poid_par_priv->information_buf = padapter->recvpriv.rx_icv_err;
*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
}
else
{
status = NDIS_STATUS_INVALID_LENGTH ;
}
return status;
}
//------------------------------------------------------------------------------
NDIS_STATUS oid_rt_set_encryption_algorithm_hdl(struct oid_par_priv* poid_par_priv)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
if(poid_par_priv->type_of_oid != SET_OID)
{
status = NDIS_STATUS_NOT_ACCEPTED;
return status;
}
return status;
}
//------------------------------------------------------------------------------
NDIS_STATUS oid_rt_get_preamble_mode_hdl(struct oid_par_priv* poid_par_priv)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
ULONG preamblemode = 0 ;
if(poid_par_priv->type_of_oid != QUERY_OID)
{
status = NDIS_STATUS_NOT_ACCEPTED;
return status;
}
if(poid_par_priv->information_buf_len>= sizeof(ULONG))
{
if(padapter->registrypriv.preamble == PREAMBLE_LONG)
preamblemode = 0;
else if (padapter->registrypriv.preamble == PREAMBLE_AUTO)
preamblemode = 1;
else if (padapter->registrypriv.preamble == PREAMBLE_SHORT)
preamblemode = 2;
*(ULONG *)poid_par_priv->information_buf = preamblemode ;
*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
}
else
{
status = NDIS_STATUS_INVALID_LENGTH ;
}
return status;
}
//------------------------------------------------------------------------------
NDIS_STATUS oid_rt_get_ap_ip_hdl(struct oid_par_priv* poid_par_priv)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
if(poid_par_priv->type_of_oid != QUERY_OID)
{
status = NDIS_STATUS_NOT_ACCEPTED;
return status;
}
return status;
}
NDIS_STATUS oid_rt_get_channelplan_hdl(struct oid_par_priv* poid_par_priv)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
if(poid_par_priv->type_of_oid != QUERY_OID)
{
status = NDIS_STATUS_NOT_ACCEPTED;
return status;
}
*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
*(u16 *)poid_par_priv->information_buf = padapter->mlmepriv.ChannelPlan ;
return status;
}
NDIS_STATUS oid_rt_set_channelplan_hdl(struct oid_par_priv* poid_par_priv)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
if(poid_par_priv->type_of_oid != SET_OID)
{
status = NDIS_STATUS_NOT_ACCEPTED;
return status;
}
padapter->mlmepriv.ChannelPlan = *(u16 *)poid_par_priv->information_buf ;
return status;
}
//------------------------------------------------------------------------------
NDIS_STATUS oid_rt_set_preamble_mode_hdl(struct oid_par_priv* poid_par_priv)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
ULONG preamblemode = 0;
if(poid_par_priv->type_of_oid != SET_OID)
{
status = NDIS_STATUS_NOT_ACCEPTED;
return status;
}
if(poid_par_priv->information_buf_len>= sizeof(ULONG))
{
preamblemode = *(ULONG *)poid_par_priv->information_buf ;
if( preamblemode == 0)
padapter->registrypriv.preamble = PREAMBLE_LONG;
else if (preamblemode==1 )
padapter->registrypriv.preamble = PREAMBLE_AUTO;
else if ( preamblemode==2 )
padapter->registrypriv.preamble = PREAMBLE_SHORT;
*(ULONG *)poid_par_priv->information_buf = preamblemode ;
*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
}
else
{
status = NDIS_STATUS_INVALID_LENGTH ;
}
return status;
}
//------------------------------------------------------------------------------
NDIS_STATUS oid_rt_set_bcn_intvl_hdl(struct oid_par_priv* poid_par_priv)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
if(poid_par_priv->type_of_oid != SET_OID)
{
status = NDIS_STATUS_NOT_ACCEPTED;
return status;
}
return status;
}
NDIS_STATUS oid_rt_dedicate_probe_hdl(struct oid_par_priv* poid_par_priv)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
return status;
}
//------------------------------------------------------------------------------
NDIS_STATUS oid_rt_get_total_tx_bytes_hdl(struct oid_par_priv* poid_par_priv)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
if(poid_par_priv->type_of_oid != QUERY_OID)
{
status = NDIS_STATUS_NOT_ACCEPTED;
return status;
}
if(poid_par_priv->information_buf_len>= sizeof(ULONG))
{
*(u64 *)poid_par_priv->information_buf = padapter->xmitpriv.tx_bytes;
*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
}
else
{
status = NDIS_STATUS_INVALID_LENGTH ;
}
return status;
}
//------------------------------------------------------------------------------
NDIS_STATUS oid_rt_get_total_rx_bytes_hdl(struct oid_par_priv* poid_par_priv)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
if(poid_par_priv->type_of_oid != QUERY_OID)
{
status = NDIS_STATUS_NOT_ACCEPTED;
return status;
}
if(poid_par_priv->information_buf_len>= sizeof(ULONG))
{
//_rtw_memcpy(*(uint *)poid_par_priv->information_buf,padapter->recvpriv.rx_icv_err,sizeof(u32));
*(u64 *)poid_par_priv->information_buf = padapter->recvpriv.rx_bytes;
*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
}
else
{
status = NDIS_STATUS_INVALID_LENGTH ;
}
return status;
}
//------------------------------------------------------------------------------
NDIS_STATUS oid_rt_current_tx_power_level_hdl(struct oid_par_priv* poid_par_priv)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
return status;
}
NDIS_STATUS oid_rt_get_enc_key_mismatch_count_hdl(struct oid_par_priv* poid_par_priv)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
if(poid_par_priv->type_of_oid != QUERY_OID)
{
status = NDIS_STATUS_NOT_ACCEPTED;
return status;
}
return status;
}
NDIS_STATUS oid_rt_get_enc_key_match_count_hdl(struct oid_par_priv* poid_par_priv)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
if(poid_par_priv->type_of_oid != QUERY_OID)
{
status = NDIS_STATUS_NOT_ACCEPTED;
return status;
}
return status;
}
NDIS_STATUS oid_rt_get_channel_hdl(struct oid_par_priv* poid_par_priv)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
NDIS_802_11_CONFIGURATION *pnic_Config;
ULONG channelnum;
_func_enter_;
if(poid_par_priv->type_of_oid != QUERY_OID)
{
status = NDIS_STATUS_NOT_ACCEPTED;
return status;
}
if ( (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) ||
(check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE))
pnic_Config = &pmlmepriv->cur_network.network.Configuration;
else
pnic_Config = &padapter->registrypriv.dev_network.Configuration;
channelnum = pnic_Config->DSConfig;
*(ULONG *)poid_par_priv->information_buf = channelnum;
*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
_func_exit_;
return status;
}
NDIS_STATUS oid_rt_get_hardware_radio_off_hdl(struct oid_par_priv* poid_par_priv)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
if(poid_par_priv->type_of_oid != QUERY_OID)
{
status = NDIS_STATUS_NOT_ACCEPTED;
return status;
}
return status;
}
NDIS_STATUS oid_rt_get_key_mismatch_hdl(struct oid_par_priv* poid_par_priv)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
if(poid_par_priv->type_of_oid != QUERY_OID)
{
status = NDIS_STATUS_NOT_ACCEPTED;
return status;
}
return status;
}
NDIS_STATUS oid_rt_supported_wireless_mode_hdl(struct oid_par_priv* poid_par_priv)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
ULONG ulInfo = 0 ;
//DEBUG_ERR(("<**********************oid_rt_supported_wireless_mode_hdl \n"));
if(poid_par_priv->type_of_oid != QUERY_OID)
{
status = NDIS_STATUS_NOT_ACCEPTED;
return status;
}
if(poid_par_priv->information_buf_len >= sizeof(ULONG)){
ulInfo |= 0x0100; //WIRELESS_MODE_B
ulInfo |= 0x0200; //WIRELESS_MODE_G
ulInfo |= 0x0400; //WIRELESS_MODE_A
*(ULONG *) poid_par_priv->information_buf = ulInfo;
//DEBUG_ERR(("<===oid_rt_supported_wireless_mode %x\n",ulInfo));
*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
}
else{
status = NDIS_STATUS_INVALID_LENGTH;
}
return status;
}
NDIS_STATUS oid_rt_get_channel_list_hdl(struct oid_par_priv* poid_par_priv)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
if(poid_par_priv->type_of_oid != QUERY_OID)
{
status = NDIS_STATUS_NOT_ACCEPTED;
return status;
}
return status;
}
NDIS_STATUS oid_rt_get_scan_in_progress_hdl(struct oid_par_priv* poid_par_priv)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
if(poid_par_priv->type_of_oid != QUERY_OID)
{
status = NDIS_STATUS_NOT_ACCEPTED;
return status;
}
return status;
}
NDIS_STATUS oid_rt_forced_data_rate_hdl(struct oid_par_priv* poid_par_priv)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
return status;
}
NDIS_STATUS oid_rt_wireless_mode_for_scan_list_hdl(struct oid_par_priv* poid_par_priv)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
return status;
}
NDIS_STATUS oid_rt_get_bss_wireless_mode_hdl(struct oid_par_priv* poid_par_priv)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
if(poid_par_priv->type_of_oid != QUERY_OID)
{
status = NDIS_STATUS_NOT_ACCEPTED;
return status;
}
return status;
}
NDIS_STATUS oid_rt_scan_with_magic_packet_hdl(struct oid_par_priv* poid_par_priv)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
return status;
}
//************** oid_rtl_seg_01_01 section end **************
//************** oid_rtl_seg_01_03 section start **************
NDIS_STATUS oid_rt_ap_get_associated_station_list_hdl(struct oid_par_priv* poid_par_priv)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
if(poid_par_priv->type_of_oid != QUERY_OID)
{
status = NDIS_STATUS_NOT_ACCEPTED;
return status;
}
return status;
}
NDIS_STATUS oid_rt_ap_switch_into_ap_mode_hdl(struct oid_par_priv* poid_par_priv)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
return status;
}
NDIS_STATUS oid_rt_ap_supported_hdl(struct oid_par_priv* poid_par_priv)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
return status;
}
NDIS_STATUS oid_rt_ap_set_passphrase_hdl(struct oid_par_priv* poid_par_priv)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
if(poid_par_priv->type_of_oid != SET_OID)
{
status = NDIS_STATUS_NOT_ACCEPTED;
return status;
}
return status;
}
//************** oid_rtl_seg_01_03 section end **************
//**************** oid_rtl_seg_01_11 section start ****************
NDIS_STATUS oid_rt_pro_rf_write_registry_hdl(struct oid_par_priv* poid_par_priv)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
_irqL oldirql;
_func_enter_;
//DEBUG_ERR(("<**********************oid_rt_pro_rf_write_registry_hdl \n"));
if(poid_par_priv->type_of_oid != SET_OID) //QUERY_OID
{
status = NDIS_STATUS_NOT_ACCEPTED;
return status;
}
_irqlevel_changed_(&oldirql,LOWER);
if(poid_par_priv->information_buf_len== (sizeof(unsigned long)*3))
{
//RegOffsetValue - The offset of RF register to write.
//RegDataWidth - The data width of RF register to write.
//RegDataValue - The value to write.
//RegOffsetValue = *((unsigned long*)InformationBuffer);
//RegDataWidth = *((unsigned long*)InformationBuffer+1);
//RegDataValue = *((unsigned long*)InformationBuffer+2);
if(!rtw_setrfreg_cmd(Adapter,
*(unsigned char*)poid_par_priv->information_buf,
(unsigned long)(*((unsigned long*)poid_par_priv->information_buf+2))))
{
status = NDIS_STATUS_NOT_ACCEPTED;
}
}
else{
status = NDIS_STATUS_INVALID_LENGTH;
}
_irqlevel_changed_(&oldirql,RAISE);
_func_exit_;
return status;
}
//------------------------------------------------------------------------------
NDIS_STATUS oid_rt_pro_rf_read_registry_hdl(struct oid_par_priv* poid_par_priv)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
#if 0
PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);
_irqL oldirql;
_func_enter_;
//DEBUG_ERR(("<**********************oid_rt_pro_rf_read_registry_hdl \n"));
if(poid_par_priv->type_of_oid != SET_OID) //QUERY_OID
{
status = NDIS_STATUS_NOT_ACCEPTED;
return status;
}
_irqlevel_changed_(&oldirql,LOWER);
if(poid_par_priv->information_buf_len== (sizeof(unsigned long)*3))
{
if(Adapter->mppriv.act_in_progress == _TRUE)
{
status = NDIS_STATUS_NOT_ACCEPTED;
}
else
{
//init workparam
Adapter->mppriv.act_in_progress = _TRUE;
Adapter->mppriv.workparam.bcompleted= _FALSE;
Adapter->mppriv.workparam.act_type = MPT_READ_RF;
Adapter->mppriv.workparam.io_offset = *(unsigned long*)poid_par_priv->information_buf;
Adapter->mppriv.workparam.io_value = 0xcccccccc;
//RegOffsetValue - The offset of RF register to read.
//RegDataWidth - The data width of RF register to read.
//RegDataValue - The value to read.
//RegOffsetValue = *((unsigned long*)InformationBuffer);
//RegDataWidth = *((unsigned long*)InformationBuffer+1);
//RegDataValue = *((unsigned long*)InformationBuffer+2);
if(!rtw_getrfreg_cmd(Adapter,
*(unsigned char*)poid_par_priv->information_buf,
(unsigned char*)&Adapter->mppriv.workparam.io_value))
{
status = NDIS_STATUS_NOT_ACCEPTED;
}
}
}
else {
status = NDIS_STATUS_INVALID_LENGTH;
}
_irqlevel_changed_(&oldirql,RAISE);
_func_exit_;
#endif
return status;
}
//**************** oid_rtl_seg_01_11 section end****************
//************** oid_rtl_seg_03_00 section start **************
enum _CONNECT_STATE_{
CHECKINGSTATUS,
ASSOCIATED,
ADHOCMODE,
NOTASSOCIATED
};
NDIS_STATUS oid_rt_get_connect_state_hdl(struct oid_par_priv* poid_par_priv)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
ULONG ulInfo;
if(poid_par_priv->type_of_oid != QUERY_OID)
{
status = NDIS_STATUS_NOT_ACCEPTED;
return status;
}
// nStatus==0 CheckingStatus
// nStatus==1 Associated
// nStatus==2 AdHocMode
// nStatus==3 NotAssociated
if(check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE)
ulInfo = CHECKINGSTATUS;
else if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)
ulInfo = ASSOCIATED;
else if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)== _TRUE)
ulInfo = ADHOCMODE;
else
ulInfo = NOTASSOCIATED ;
*(ULONG *)poid_par_priv->information_buf = ulInfo;
*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
#if 0
// Rearrange the order to let the UI still shows connection when scan is in progress
RT_TRACE(COMP_OID_QUERY, DBG_LOUD, ("===> Query OID_RT_GET_CONNECT_STATE.\n"));
if(pMgntInfo->mAssoc)
ulInfo = 1;
else if(pMgntInfo->mIbss)
ulInfo = 2;
else if(pMgntInfo->bScanInProgress)
ulInfo = 0;
else
ulInfo = 3;
ulInfoLen = sizeof(ULONG);
RT_TRACE(COMP_OID_QUERY, DBG_LOUD, ("<=== Query OID_RT_GET_CONNECT_STATE: %d\n", ulInfo));
#endif
return status;
}
NDIS_STATUS oid_rt_set_default_key_id_hdl(struct oid_par_priv* poid_par_priv)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context);
if(poid_par_priv->type_of_oid != SET_OID)
{
status = NDIS_STATUS_NOT_ACCEPTED;
return status;
}
return status;
}
//************** oid_rtl_seg_03_00 section end **************