Path: blob/master/ALFA-W1F1/RTL8814AU/core/rtw_debug.c
1307 views
/******************************************************************************1*2* Copyright(c) 2007 - 2019 Realtek Corporation.3*4* This program is free software; you can redistribute it and/or modify it5* under the terms of version 2 of the GNU General Public License as6* published by the Free Software Foundation.7*8* This program is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for11* more details.12*13*****************************************************************************/14#define _RTW_DEBUG_C_1516#include <drv_types.h>17#include <hal_data.h>1819#ifdef CONFIG_RTW_DEBUG20const char *rtw_log_level_str[] = {21"_DRV_NONE_ = 0",22"_DRV_ALWAYS_ = 1",23"_DRV_ERR_ = 2",24"_DRV_WARNING_ = 3",25"_DRV_INFO_ = 4",26"_DRV_DEBUG_ = 5",27"_DRV_MAX_ = 6",28};29#endif3031#ifdef CONFIG_DEBUG_RTL871X32u64 GlobalDebugComponents = 0;33#endif /* CONFIG_DEBUG_RTL871X */3435#include <rtw_version.h>3637#ifdef CONFIG_TDLS38#define TDLS_DBG_INFO_SPACE_BTWN_ITEM_AND_VALUE 4139#endif4041void dump_drv_version(void *sel)42{43RTW_PRINT_SEL(sel, "%s %s\n", DRV_NAME, DRIVERVERSION);44//RTW_PRINT_SEL(sel, "build time: %s %s\n", __DATE__, __TIME__);45}4647void dump_drv_cfg(void *sel)48{49#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 24))50char *kernel_version = utsname()->release;5152RTW_PRINT_SEL(sel, "\nKernel Version: %s\n", kernel_version);53#endif5455RTW_PRINT_SEL(sel, "Driver Version: %s\n", DRIVERVERSION);56RTW_PRINT_SEL(sel, "------------------------------------------------\n");57#ifdef CONFIG_IOCTL_CFG8021158RTW_PRINT_SEL(sel, "CFG80211\n");59#ifdef RTW_USE_CFG80211_STA_EVENT60RTW_PRINT_SEL(sel, "RTW_USE_CFG80211_STA_EVENT\n");61#endif62#ifdef CONFIG_RADIO_WORK63RTW_PRINT_SEL(sel, "CONFIG_RADIO_WORK\n");64#endif65#else66RTW_PRINT_SEL(sel, "WEXT\n");67#endif6869RTW_PRINT_SEL(sel, "DBG:%d\n", DBG);70#ifdef CONFIG_RTW_DEBUG71RTW_PRINT_SEL(sel, "CONFIG_RTW_DEBUG\n");72#endif7374#ifdef CONFIG_CONCURRENT_MODE75RTW_PRINT_SEL(sel, "CONFIG_CONCURRENT_MODE\n");76#endif7778#ifdef CONFIG_POWER_SAVING79RTW_PRINT_SEL(sel, "CONFIG_POWER_SAVING\n");80#ifdef CONFIG_IPS81RTW_PRINT_SEL(sel, "CONFIG_IPS\n");82#endif83#ifdef CONFIG_LPS84RTW_PRINT_SEL(sel, "CONFIG_LPS\n");85#ifdef CONFIG_LPS_LCLK86RTW_PRINT_SEL(sel, "CONFIG_LPS_LCLK\n");87#ifdef CONFIG_DETECT_CPWM_BY_POLLING88RTW_PRINT_SEL(sel, "CONFIG_DETECT_CPWM_BY_POLLING\n");89#endif90#endif /*CONFIG_LPS_LCLK*/91#ifdef CONFIG_LPS_CHK_BY_TP92RTW_PRINT_SEL(sel, "CONFIG_LPS_CHK_BY_TP\n");93#endif94#ifdef CONFIG_LPS_ACK95RTW_PRINT_SEL(sel, "CONFIG_LPS_ACK\n");96#endif97#endif/*CONFIG_LPS*/98#endif99100#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE101RTW_PRINT_SEL(sel, "LOAD_PHY_PARA_FROM_FILE - REALTEK_CONFIG_PATH=%s\n", REALTEK_CONFIG_PATH);102#if defined(CONFIG_MULTIDRV) || defined(REALTEK_CONFIG_PATH_WITH_IC_NAME_FOLDER)103RTW_PRINT_SEL(sel, "LOAD_PHY_PARA_FROM_FILE - REALTEK_CONFIG_PATH_WITH_IC_NAME_FOLDER\n");104#endif105106/* configurations about TX power */107#ifdef CONFIG_CALIBRATE_TX_POWER_BY_REGULATORY108RTW_PRINT_SEL(sel, "CONFIG_CALIBRATE_TX_POWER_BY_REGULATORY\n");109#endif110#ifdef CONFIG_CALIBRATE_TX_POWER_TO_MAX111RTW_PRINT_SEL(sel, "CONFIG_CALIBRATE_TX_POWER_TO_MAX\n");112#endif113#endif114RTW_PRINT_SEL(sel, "RTW_DEF_MODULE_REGULATORY_CERT=0x%02x\n", RTW_DEF_MODULE_REGULATORY_CERT);115116RTW_PRINT_SEL(sel, "CONFIG_TXPWR_BY_RATE=%d\n", CONFIG_TXPWR_BY_RATE);117RTW_PRINT_SEL(sel, "CONFIG_TXPWR_BY_RATE_EN=%d\n", CONFIG_TXPWR_BY_RATE_EN);118RTW_PRINT_SEL(sel, "CONFIG_TXPWR_LIMIT=%d\n", CONFIG_TXPWR_LIMIT);119RTW_PRINT_SEL(sel, "CONFIG_TXPWR_LIMIT_EN=%d\n", CONFIG_TXPWR_LIMIT_EN);120121122#ifdef CONFIG_DISABLE_ODM123RTW_PRINT_SEL(sel, "CONFIG_DISABLE_ODM\n");124#endif125126#ifdef CONFIG_MINIMAL_MEMORY_USAGE127RTW_PRINT_SEL(sel, "CONFIG_MINIMAL_MEMORY_USAGE\n");128#endif129130RTW_PRINT_SEL(sel, "CONFIG_RTW_ADAPTIVITY_EN = %d\n", CONFIG_RTW_ADAPTIVITY_EN);131#if (CONFIG_RTW_ADAPTIVITY_EN)132RTW_PRINT_SEL(sel, "ADAPTIVITY_MODE = %s\n", (CONFIG_RTW_ADAPTIVITY_MODE) ? "carrier_sense" : "normal");133#endif134135#ifdef CONFIG_WOWLAN136RTW_PRINT_SEL(sel, "CONFIG_WOWLAN - ");137138#ifdef CONFIG_GPIO_WAKEUP139RTW_PRINT_SEL(sel, "CONFIG_GPIO_WAKEUP - WAKEUP_GPIO_IDX:%d\n", WAKEUP_GPIO_IDX);140#endif141#endif142143#ifdef CONFIG_TDLS144RTW_PRINT_SEL(sel, "CONFIG_TDLS\n");145#endif146147#ifdef CONFIG_RTW_80211R148RTW_PRINT_SEL(sel, "CONFIG_RTW_80211R\n");149#endif150151#ifdef CONFIG_RTW_NETIF_SG152RTW_PRINT_SEL(sel, "CONFIG_RTW_NETIF_SG\n");153#endif154155#ifdef CONFIG_RTW_WIFI_HAL156RTW_PRINT_SEL(sel, "CONFIG_RTW_WIFI_HAL\n");157#endif158159#ifdef CONFIG_RTW_TPT_MODE160RTW_PRINT_SEL(sel, "CONFIG_RTW_TPT_MODE\n");161#endif162163#ifdef CONFIG_USB_HCI164#ifdef CONFIG_SUPPORT_USB_INT165RTW_PRINT_SEL(sel, "CONFIG_SUPPORT_USB_INT\n");166#endif167#ifdef CONFIG_USB_INTERRUPT_IN_PIPE168RTW_PRINT_SEL(sel, "CONFIG_USB_INTERRUPT_IN_PIPE\n");169#endif170#ifdef CONFIG_USB_TX_AGGREGATION171RTW_PRINT_SEL(sel, "CONFIG_USB_TX_AGGREGATION\n");172#endif173#ifdef CONFIG_USB_RX_AGGREGATION174RTW_PRINT_SEL(sel, "CONFIG_USB_RX_AGGREGATION\n");175#endif176#ifdef CONFIG_USE_USB_BUFFER_ALLOC_TX177RTW_PRINT_SEL(sel, "CONFIG_USE_USB_BUFFER_ALLOC_TX\n");178#endif179#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX180RTW_PRINT_SEL(sel, "CONFIG_USE_USB_BUFFER_ALLOC_RX\n");181#endif182#ifdef CONFIG_PREALLOC_RECV_SKB183RTW_PRINT_SEL(sel, "CONFIG_PREALLOC_RECV_SKB\n");184#endif185#ifdef CONFIG_FIX_NR_BULKIN_BUFFER186RTW_PRINT_SEL(sel, "CONFIG_FIX_NR_BULKIN_BUFFER\n");187#endif188#endif /*CONFIG_USB_HCI*/189190#ifdef CONFIG_SDIO_HCI191#ifdef CONFIG_TX_AGGREGATION192RTW_PRINT_SEL(sel, "CONFIG_TX_AGGREGATION\n");193#endif194#ifdef CONFIG_RX_AGGREGATION195RTW_PRINT_SEL(sel, "CONFIG_RX_AGGREGATION\n");196#endif197#ifdef RTW_XMIT_THREAD_HIGH_PRIORITY198RTW_PRINT_SEL(sel, "RTW_XMIT_THREAD_HIGH_PRIORITY\n");199#endif200#ifdef RTW_XMIT_THREAD_HIGH_PRIORITY_AGG201RTW_PRINT_SEL(sel, "RTW_XMIT_THREAD_HIGH_PRIORITY_AGG\n");202#endif203204#ifdef DBG_SDIO205RTW_PRINT_SEL(sel, "DBG_SDIO = %d\n", DBG_SDIO);206#endif207#endif /*CONFIG_SDIO_HCI*/208209#ifdef CONFIG_PCI_HCI210#endif211212RTW_PRINT_SEL(sel, "CONFIG_IFACE_NUMBER = %d\n", CONFIG_IFACE_NUMBER);213#ifdef CONFIG_MI_WITH_MBSSID_CAM214RTW_PRINT_SEL(sel, "CONFIG_MI_WITH_MBSSID_CAM\n");215#endif216#ifdef CONFIG_SWTIMER_BASED_TXBCN217RTW_PRINT_SEL(sel, "CONFIG_SWTIMER_BASED_TXBCN\n");218#endif219#ifdef CONFIG_FW_HANDLE_TXBCN220RTW_PRINT_SEL(sel, "CONFIG_FW_HANDLE_TXBCN\n");221RTW_PRINT_SEL(sel, "CONFIG_LIMITED_AP_NUM = %d\n", CONFIG_LIMITED_AP_NUM);222#endif223#ifdef CONFIG_CLIENT_PORT_CFG224RTW_PRINT_SEL(sel, "CONFIG_CLIENT_PORT_CFG\n");225#endif226#ifdef CONFIG_PCI_TX_POLLING227RTW_PRINT_SEL(sel, "CONFIG_PCI_TX_POLLING\n");228#endif229RTW_PRINT_SEL(sel, "CONFIG_RTW_UP_MAPPING_RULE = %s\n", (CONFIG_RTW_UP_MAPPING_RULE == 1) ? "dscp" : "tos");230231RTW_PRINT_SEL(sel, "\n=== XMIT-INFO ===\n");232RTW_PRINT_SEL(sel, "NR_XMITFRAME = %d\n", NR_XMITFRAME);233RTW_PRINT_SEL(sel, "NR_XMITBUFF = %d\n", NR_XMITBUFF);234RTW_PRINT_SEL(sel, "MAX_XMITBUF_SZ = %d\n", MAX_XMITBUF_SZ);235RTW_PRINT_SEL(sel, "NR_XMIT_EXTBUFF = %d\n", NR_XMIT_EXTBUFF);236RTW_PRINT_SEL(sel, "MAX_XMIT_EXTBUF_SZ = %d\n", MAX_XMIT_EXTBUF_SZ);237RTW_PRINT_SEL(sel, "MAX_CMDBUF_SZ = %d\n", MAX_CMDBUF_SZ);238239RTW_PRINT_SEL(sel, "\n=== RECV-INFO ===\n");240RTW_PRINT_SEL(sel, "NR_RECVFRAME = %d\n", NR_RECVFRAME);241RTW_PRINT_SEL(sel, "NR_RECVBUFF = %d\n", NR_RECVBUFF);242RTW_PRINT_SEL(sel, "MAX_RECVBUF_SZ = %d\n", MAX_RECVBUF_SZ);243244}245246void dump_log_level(void *sel)247{248#ifdef CONFIG_RTW_DEBUG249int i;250251RTW_PRINT_SEL(sel, "drv_log_level:%d\n", rtw_drv_log_level);252for (i = 0; i <= _DRV_MAX_; i++) {253if (rtw_log_level_str[i])254RTW_PRINT_SEL(sel, "%c %s = %d\n",255(rtw_drv_log_level == i) ? '+' : ' ', rtw_log_level_str[i], i);256}257#else258RTW_PRINT_SEL(sel, "CONFIG_RTW_DEBUG is disabled\n");259#endif260}261262#ifdef CONFIG_SDIO_HCI263void sd_f0_reg_dump(void *sel, _adapter *adapter)264{265int i;266267for (i = 0x0; i <= 0xff; i++) {268if (i % 16 == 0)269RTW_PRINT_SEL(sel, "0x%02x ", i);270271_RTW_PRINT_SEL(sel, "%02x ", rtw_sd_f0_read8(adapter, i));272273if (i % 16 == 15)274_RTW_PRINT_SEL(sel, "\n");275else if (i % 8 == 7)276_RTW_PRINT_SEL(sel, "\t");277}278}279280void sdio_local_reg_dump(void *sel, _adapter *adapter)281{282int i, j = 1;283284for (i = 0x0; i < 0x100; i += 4) {285if (j % 4 == 1)286RTW_PRINT_SEL(sel, "0x%02x", i);287_RTW_PRINT_SEL(sel, " 0x%08x ", rtw_read32(adapter, (0x1025 << 16) | i));288if ((j++) % 4 == 0)289_RTW_PRINT_SEL(sel, "\n");290}291}292#endif /* CONFIG_SDIO_HCI */293294void mac_reg_dump(void *sel, _adapter *adapter)295{296int i, j = 1;297298RTW_PRINT_SEL(sel, "======= MAC REG =======\n");299300for (i = 0x0; i < 0x800; i += 4) {301if (j % 4 == 1)302RTW_PRINT_SEL(sel, "0x%04x", i);303_RTW_PRINT_SEL(sel, " 0x%08x ", rtw_read32(adapter, i));304if ((j++) % 4 == 0)305_RTW_PRINT_SEL(sel, "\n");306}307308#ifdef CONFIG_RTL8814A309{310for (i = 0x1000; i < 0x1650; i += 4) {311if (j % 4 == 1)312RTW_PRINT_SEL(sel, "0x%04x", i);313_RTW_PRINT_SEL(sel, " 0x%08x ", rtw_read32(adapter, i));314if ((j++) % 4 == 0)315_RTW_PRINT_SEL(sel, "\n");316}317}318#endif /* CONFIG_RTL8814A */319320#if defined(CONFIG_RTL8822B) || defined(CONFIG_RTL8821C) ||defined(CONFIG_RTL8192F) || defined(CONFIG_RTL8822C) || defined(CONFIG_RTL8814B)321for (i = 0x1000; i < 0x1800; i += 4) {322if (j % 4 == 1)323RTW_PRINT_SEL(sel, "0x%04x", i);324_RTW_PRINT_SEL(sel, " 0x%08x ", rtw_read32(adapter, i));325if ((j++) % 4 == 0)326_RTW_PRINT_SEL(sel, "\n");327}328#endif /* CONFIG_RTL8822B or 8821c or 8192f*/329330#if defined(CONFIG_RTL8814B)331for (i = 0x2000; i < 0x2800; i += 4) {332if (j % 4 == 1)333RTW_PRINT_SEL(sel, "0x%04x", i);334_RTW_PRINT_SEL(sel, " 0x%08x ", rtw_read32(adapter, i));335if ((j++) % 4 == 0)336_RTW_PRINT_SEL(sel, "\n");337}338339for (i = 0x3000; i < 0x3800; i += 4) {340if (j % 4 == 1)341RTW_PRINT_SEL(sel, "0x%04x", i);342_RTW_PRINT_SEL(sel, " 0x%08x ", rtw_read32(adapter, i));343if ((j++) % 4 == 0)344_RTW_PRINT_SEL(sel, "\n");345}346#endif347348}349350void bb_reg_dump(void *sel, _adapter *adapter)351{352int i, j = 1;353354RTW_PRINT_SEL(sel, "======= BB REG =======\n");355for (i = 0x800; i < 0x1000; i += 4) {356if (j % 4 == 1)357RTW_PRINT_SEL(sel, "0x%04x", i);358_RTW_PRINT_SEL(sel, " 0x%08x ", rtw_read32(adapter, i));359if ((j++) % 4 == 0)360_RTW_PRINT_SEL(sel, "\n");361}362363#if defined(CONFIG_RTL8822B) || defined(CONFIG_RTL8821C) || defined(CONFIG_RTL8822C) || defined(CONFIG_RTL8814B)364for (i = 0x1800; i < 0x2000; i += 4) {365if (j % 4 == 1)366RTW_PRINT_SEL(sel, "0x%04x", i);367_RTW_PRINT_SEL(sel, " 0x%08x ", rtw_read32(adapter, i));368if ((j++) % 4 == 0)369_RTW_PRINT_SEL(sel, "\n");370}371#endif /* CONFIG_RTL8822B */372373#if defined(CONFIG_RTL8822C) || defined(CONFIG_RTL8814B)374for (i = 0x2c00; i < 0x2c60; i += 4) {375if (j % 4 == 1)376RTW_PRINT_SEL(sel, "0x%04x", i);377_RTW_PRINT_SEL(sel, " 0x%08x ", rtw_read32(adapter, i));378if ((j++) % 4 == 0)379_RTW_PRINT_SEL(sel, "\n");380}381382for (i = 0x2d00; i < 0x2df0; i += 4) {383if (j % 4 == 1)384RTW_PRINT_SEL(sel, "0x%04x", i);385_RTW_PRINT_SEL(sel, " 0x%08x ", rtw_read32(adapter, i));386if ((j++) % 4 == 0)387_RTW_PRINT_SEL(sel, "\n");388}389390for (i = 0x4000; i < 0x4060; i += 4) {391if (j % 4 == 1)392RTW_PRINT_SEL(sel, "0x%04x", i);393_RTW_PRINT_SEL(sel, " 0x%08x ", rtw_read32(adapter, i));394if ((j++) % 4 == 0)395_RTW_PRINT_SEL(sel, "\n");396}397398for (i = 0x4100; i < 0x4200; i += 4) {399if (j % 4 == 1)400RTW_PRINT_SEL(sel, "0x%04x", i);401_RTW_PRINT_SEL(sel, " 0x%08x ", rtw_read32(adapter, i));402if ((j++) % 4 == 0)403_RTW_PRINT_SEL(sel, "\n");404}405406#endif /* CONFIG_RTL8822C || CONFIG_RTL8814B */407408#if defined(CONFIG_RTL8814B)409for (i = 0x5200; i < 0x5400; i += 4) {410if (j % 4 == 1)411RTW_PRINT_SEL(sel, "0x%04x", i);412_RTW_PRINT_SEL(sel, " 0x%08x ", rtw_read32(adapter, i));413if ((j++) % 4 == 0)414_RTW_PRINT_SEL(sel, "\n");415}416#endif /* CONFIG_RTL8814B */417}418419void bb_reg_dump_ex(void *sel, _adapter *adapter)420{421int i;422423RTW_PRINT_SEL(sel, "======= BB REG =======\n");424for (i = 0x800; i < 0x1000; i += 4) {425RTW_PRINT_SEL(sel, "0x%04x", i);426_RTW_PRINT_SEL(sel, " 0x%08x ", rtw_read32(adapter, i));427_RTW_PRINT_SEL(sel, "\n");428}429430#if defined(CONFIG_RTL8822B) || defined(CONFIG_RTL8821C) || defined(CONFIG_RTL8822C) || defined(CONFIG_RTL8814B)431for (i = 0x1800; i < 0x2000; i += 4) {432RTW_PRINT_SEL(sel, "0x%04x", i);433_RTW_PRINT_SEL(sel, " 0x%08x ", rtw_read32(adapter, i));434_RTW_PRINT_SEL(sel, "\n");435}436#endif /* CONFIG_RTL8822B */437}438439void rf_reg_dump(void *sel, _adapter *adapter)440{441int i, j = 1, path;442u32 value;443u8 path_nums = GET_HAL_RFPATH_NUM(adapter);444445RTW_PRINT_SEL(sel, "======= RF REG =======\n");446447for (path = 0; path < path_nums; path++) {448RTW_PRINT_SEL(sel, "RF_Path(%x)\n", path);449for (i = 0; i < 0x100; i++) {450value = rtw_hal_read_rfreg(adapter, path, i, 0xffffffff);451if (j % 4 == 1)452RTW_PRINT_SEL(sel, "0x%02x ", i);453_RTW_PRINT_SEL(sel, " 0x%08x ", value);454if ((j++) % 4 == 0)455_RTW_PRINT_SEL(sel, "\n");456}457}458}459460void rtw_sink_rtp_seq_dbg(_adapter *adapter, u8 *ehdr_pos)461{462struct recv_priv *precvpriv = &(adapter->recvpriv);463if (precvpriv->sink_udpport > 0) {464if (*((u16 *)(ehdr_pos + 0x24)) == cpu_to_be16(precvpriv->sink_udpport)) {465precvpriv->pre_rtp_rxseq = precvpriv->cur_rtp_rxseq;466precvpriv->cur_rtp_rxseq = be16_to_cpu(*((u16 *)(ehdr_pos + 0x2C)));467if (precvpriv->pre_rtp_rxseq + 1 != precvpriv->cur_rtp_rxseq) {468if(precvpriv->pre_rtp_rxseq == 65535 ) {469if( precvpriv->cur_rtp_rxseq != 0) {470RTW_INFO("%s : RTP Seq num from %d to %d\n", __FUNCTION__, precvpriv->pre_rtp_rxseq, precvpriv->cur_rtp_rxseq);471}472} else {473RTW_INFO("%s : RTP Seq num from %d to %d\n", __FUNCTION__, precvpriv->pre_rtp_rxseq, precvpriv->cur_rtp_rxseq);474}475}476}477}478}479480void sta_rx_reorder_ctl_dump(void *sel, struct sta_info *sta)481{482struct recv_reorder_ctrl *reorder_ctl;483int i;484485for (i = 0; i < 16; i++) {486reorder_ctl = &sta->recvreorder_ctrl[i];487if (reorder_ctl->ampdu_size != RX_AMPDU_SIZE_INVALID || reorder_ctl->indicate_seq != 0xFFFF) {488RTW_PRINT_SEL(sel, "tid=%d, enable=%d, ampdu_size=%u, indicate_seq=%u\n"489, i, reorder_ctl->enable, reorder_ctl->ampdu_size, reorder_ctl->indicate_seq490);491}492}493}494495void dump_tx_rate_bmp(void *sel, struct dvobj_priv *dvobj)496{497_adapter *adapter = dvobj_get_primary_adapter(dvobj);498struct rf_ctl_t *rfctl = dvobj_to_rfctl(dvobj);499u8 bw;500501RTW_PRINT_SEL(sel, "%-6s", "bw");502if (hal_chk_proto_cap(adapter, PROTO_CAP_11AC))503_RTW_PRINT_SEL(sel, " %-15s", "vht");504505_RTW_PRINT_SEL(sel, " %-11s %-4s %-3s\n", "ht", "ofdm", "cck");506507for (bw = CHANNEL_WIDTH_20; bw <= CHANNEL_WIDTH_160; bw++) {508if (!hal_is_bw_support(adapter, bw))509continue;510511RTW_PRINT_SEL(sel, "%6s", ch_width_str(bw));512if (hal_chk_proto_cap(adapter, PROTO_CAP_11AC)) {513_RTW_PRINT_SEL(sel, " %03x %03x %03x %03x"514, RATE_BMP_GET_VHT_4SS(rfctl->rate_bmp_vht_by_bw[bw])515, RATE_BMP_GET_VHT_3SS(rfctl->rate_bmp_vht_by_bw[bw])516, RATE_BMP_GET_VHT_2SS(rfctl->rate_bmp_vht_by_bw[bw])517, RATE_BMP_GET_VHT_1SS(rfctl->rate_bmp_vht_by_bw[bw])518);519}520521_RTW_PRINT_SEL(sel, " %02x %02x %02x %02x"522, bw <= CHANNEL_WIDTH_40 ? RATE_BMP_GET_HT_4SS(rfctl->rate_bmp_ht_by_bw[bw]) : 0523, bw <= CHANNEL_WIDTH_40 ? RATE_BMP_GET_HT_3SS(rfctl->rate_bmp_ht_by_bw[bw]) : 0524, bw <= CHANNEL_WIDTH_40 ? RATE_BMP_GET_HT_2SS(rfctl->rate_bmp_ht_by_bw[bw]) : 0525, bw <= CHANNEL_WIDTH_40 ? RATE_BMP_GET_HT_1SS(rfctl->rate_bmp_ht_by_bw[bw]) : 0526);527528_RTW_PRINT_SEL(sel, " %03x %01x\n"529, bw <= CHANNEL_WIDTH_20 ? RATE_BMP_GET_OFDM(rfctl->rate_bmp_cck_ofdm) : 0530, bw <= CHANNEL_WIDTH_20 ? RATE_BMP_GET_CCK(rfctl->rate_bmp_cck_ofdm) : 0531);532}533}534535void dump_adapters_status(void *sel, struct dvobj_priv *dvobj)536{537struct rf_ctl_t *rfctl = dvobj_to_rfctl(dvobj);538int i;539_adapter *iface;540u8 u_ch, u_bw, u_offset;541#if (defined(CONFIG_SUPPORT_MULTI_BCN) && defined(CONFIG_FW_HANDLE_TXBCN)) || defined(CONFIG_CLIENT_PORT_CFG)542char str_val[64] = {'\0'};543#endif544dump_mi_status(sel, dvobj);545546#if defined(CONFIG_SUPPORT_MULTI_BCN) && defined(CONFIG_FW_HANDLE_TXBCN)547RTW_PRINT_SEL(sel, "[AP] LIMITED_AP_NUM:%d\n", CONFIG_LIMITED_AP_NUM);548RTW_PRINT_SEL(sel, "[AP] vap_map:0x%02x\n", dvobj->vap_map);549#endif550#ifdef CONFIG_HW_P0_TSF_SYNC551RTW_PRINT_SEL(sel, "[AP] p0 tsf sync port = %d\n", dvobj->p0_tsf.sync_port);552RTW_PRINT_SEL(sel, "[AP] p0 tsf timer offset = %d\n", dvobj->p0_tsf.offset);553#endif554#ifdef CONFIG_CLIENT_PORT_CFG555RTW_PRINT_SEL(sel, "[CLT] clt_num = %d\n", dvobj->clt_port.num);556RTW_PRINT_SEL(sel, "[CLT] clt_map = 0x%02x\n", dvobj->clt_port.bmp);557#endif558#ifdef CONFIG_FW_MULTI_PORT_SUPPORT559RTW_PRINT_SEL(sel, "[MI] default port id:%d\n\n", dvobj->dft.port_id);560#endif /* CONFIG_FW_MULTI_PORT_SUPPORT */561562RTW_PRINT_SEL(sel, "dev status:%s%s\n\n"563, dev_is_surprise_removed(dvobj) ? " SR" : ""564, dev_is_drv_stopped(dvobj) ? " DS" : ""565);566567#ifdef CONFIG_P2P568#define P2P_INFO_TITLE_FMT " %-3s %-4s"569#define P2P_INFO_TITLE_ARG , "lch", "p2ps"570#ifdef CONFIG_IOCTL_CFG80211571#define P2P_INFO_VALUE_FMT " %3u %c%3u"572#define P2P_INFO_VALUE_ARG , iface->wdinfo.listen_channel, iface->wdev_data.p2p_enabled ? 'e' : ' ', rtw_p2p_state(&iface->wdinfo)573#else574#define P2P_INFO_VALUE_FMT " %3u %4u"575#define P2P_INFO_VALUE_ARG , iface->wdinfo.listen_channel, rtw_p2p_state(&iface->wdinfo)576#endif577#define P2P_INFO_DASH "---------"578#else579#define P2P_INFO_TITLE_FMT ""580#define P2P_INFO_TITLE_ARG581#define P2P_INFO_VALUE_FMT ""582#define P2P_INFO_VALUE_ARG583#define P2P_INFO_DASH584#endif585586#ifdef DBG_TSF_UPDATE587#define TSF_PAUSE_TIME_TITLE_FMT " %-5s"588#define TSF_PAUSE_TIME_TITLE_ARG , "tsfup"589#define TSF_PAUSE_TIME_VALUE_FMT " %5d"590#define TSF_PAUSE_TIME_VALUE_ARG , ((iface->mlmeextpriv.tsf_update_required && iface->mlmeextpriv.tsf_update_pause_stime) ? (rtw_get_passing_time_ms(iface->mlmeextpriv.tsf_update_pause_stime) > 99999 ? 99999 : rtw_get_passing_time_ms(iface->mlmeextpriv.tsf_update_pause_stime)) : 0)591#else592#define TSF_PAUSE_TIME_TITLE_FMT ""593#define TSF_PAUSE_TIME_TITLE_ARG594#define TSF_PAUSE_TIME_VALUE_FMT ""595#define TSF_PAUSE_TIME_VALUE_ARG596#endif597598#if (defined(CONFIG_SUPPORT_MULTI_BCN) && defined(CONFIG_FW_HANDLE_TXBCN)) || defined(CONFIG_CLIENT_PORT_CFG)599#define INFO_FMT " %-4s"600#define INFO_ARG , "info"601#define INFO_CNT_FMT " %-20s"602#define INFO_CNT_ARG , str_val603#else604#define INFO_FMT ""605#define INFO_ARG606#define INFO_CNT_FMT ""607#define INFO_CNT_ARG608#endif609610RTW_PRINT_SEL(sel, "%-2s %-15s %c %-3s %-3s %-3s %-17s %-4s %-7s"611P2P_INFO_TITLE_FMT612TSF_PAUSE_TIME_TITLE_FMT613" %s"INFO_FMT"\n"614, "id", "ifname", ' ', "bup", "nup", "ncd", "macaddr", "port", "ch"615P2P_INFO_TITLE_ARG616TSF_PAUSE_TIME_TITLE_ARG617, "status"INFO_ARG);618619RTW_PRINT_SEL(sel, "---------------------------------------------------------------"620P2P_INFO_DASH621"-------\n");622623for (i = 0; i < dvobj->iface_nums; i++) {624iface = dvobj->padapters[i];625if (iface) {626#if (defined(CONFIG_SUPPORT_MULTI_BCN) && defined(CONFIG_FW_HANDLE_TXBCN)) || defined(CONFIG_CLIENT_PORT_CFG)627_rtw_memset(&str_val, '\0', sizeof(str_val));628#endif629#if defined(CONFIG_SUPPORT_MULTI_BCN) && defined(CONFIG_FW_HANDLE_TXBCN)630if (MLME_IS_AP(iface) || MLME_IS_MESH(iface)) {631u8 len;632char *p = str_val;633char tmp_str[10] = {'\0'};634635len = snprintf(tmp_str, sizeof(tmp_str), "%s", "ap_id:");636strncpy(p, tmp_str, len);637p += len;638_rtw_memset(&tmp_str, '\0', sizeof(tmp_str));639#ifdef DBG_HW_PORT640len = snprintf(tmp_str, sizeof(tmp_str), "%d (%d,%d)", iface->vap_id, iface->hw_port, iface->client_port);641#else642len = snprintf(tmp_str, sizeof(tmp_str), "%d", iface->vap_id);643#endif644strncpy(p, tmp_str, len);645}646#endif647#ifdef CONFIG_CLIENT_PORT_CFG648if (MLME_IS_STA(iface)) {649u8 len;650char *p = str_val;651char tmp_str[10] = {'\0'};652653len = snprintf(tmp_str, sizeof(tmp_str), "%s", "c_pid:");654strncpy(p, tmp_str, len);655p += len;656_rtw_memset(&tmp_str, '\0', sizeof(tmp_str));657#ifdef DBG_HW_PORT658len = snprintf(tmp_str, sizeof(tmp_str), "%d (%d,%d)", iface->client_port, iface->hw_port, iface->client_port);659#else660len = snprintf(tmp_str, sizeof(tmp_str), "%d", iface->client_port);661#endif662strncpy(p, tmp_str, len);663}664#endif665666RTW_PRINT_SEL(sel, "%2d %-15s %c %3u %3u %3u "MAC_FMT" %4hhu %3u,%u,%u"667P2P_INFO_VALUE_FMT668TSF_PAUSE_TIME_VALUE_FMT669" "MLME_STATE_FMT" " INFO_CNT_FMT"\n"670, i, iface->registered ? ADPT_ARG(iface) : NULL671, iface->registered ? 'R' : ' '672, iface->bup673, iface->netif_up674, iface->net_closed675, MAC_ARG(adapter_mac_addr(iface))676, rtw_hal_get_port(iface)677, iface->mlmeextpriv.cur_channel678, iface->mlmeextpriv.cur_bwmode679, iface->mlmeextpriv.cur_ch_offset680P2P_INFO_VALUE_ARG681TSF_PAUSE_TIME_VALUE_ARG682, MLME_STATE_ARG(iface)683INFO_CNT_ARG684);685}686}687688RTW_PRINT_SEL(sel, "---------------------------------------------------------------"689P2P_INFO_DASH690"-------\n");691692if (rtw_mi_get_ch_setting_union(dvobj_get_primary_adapter(dvobj), &u_ch, &u_bw, &u_offset))693RTW_PRINT_SEL(sel, "%55s %3u,%u,%u\n"694, "union:"695, u_ch, u_bw, u_offset);696697RTW_PRINT_SEL(sel, "%55s %3u,%u,%u offch_state:%d\n"698, "oper:"699, dvobj->oper_channel700, dvobj->oper_bwmode701, dvobj->oper_ch_offset702, rfctl->offch_state703);704705#ifdef CONFIG_DFS_MASTER706if (rfctl->radar_detect_ch != 0) {707RTW_PRINT_SEL(sel, "%55s %3u,%u,%u"708, "radar_detect:"709, rfctl->radar_detect_ch710, rfctl->radar_detect_bw711, rfctl->radar_detect_offset712);713714if (rfctl->radar_detect_by_others)715_RTW_PRINT_SEL(sel, ", by AP of STA link");716else {717u32 non_ocp_ms;718u32 cac_ms;719u8 dfs_domain = rtw_odm_get_dfs_domain(dvobj);720721_RTW_PRINT_SEL(sel, ", domain:%u", dfs_domain);722723rtw_get_ch_waiting_ms(rfctl724, rfctl->radar_detect_ch725, rfctl->radar_detect_bw726, rfctl->radar_detect_offset727, &non_ocp_ms728, &cac_ms729);730731if (non_ocp_ms)732_RTW_PRINT_SEL(sel, ", non_ocp:%d", non_ocp_ms);733if (cac_ms)734_RTW_PRINT_SEL(sel, ", cac:%d", cac_ms);735}736737_RTW_PRINT_SEL(sel, "\n");738}739#endif /* CONFIG_DFS_MASTER */740}741742#define SEC_CAM_ENT_ID_TITLE_FMT "%-2s"743#define SEC_CAM_ENT_ID_TITLE_ARG "id"744#define SEC_CAM_ENT_ID_VALUE_FMT "%2u"745#define SEC_CAM_ENT_ID_VALUE_ARG(id) (id)746747#define SEC_CAM_ENT_TITLE_FMT "%-6s %-17s %-32s %-3s %-7s %-2s %-2s %-5s"748#define SEC_CAM_ENT_TITLE_ARG "ctrl", "addr", "key", "kid", "type", "MK", "GK", "valid"749#define SEC_CAM_ENT_VALUE_FMT "0x%04x "MAC_FMT" "KEY_FMT" %3u %-7s %2u %2u %5u"750#define SEC_CAM_ENT_VALUE_ARG(ent) \751(ent)->ctrl \752, MAC_ARG((ent)->mac) \753, KEY_ARG((ent)->key) \754, ((ent)->ctrl) & 0x03 \755, security_type_str((((ent)->ctrl) >> 2) & 0x07) \756, (((ent)->ctrl) >> 5) & 0x01 \757, (((ent)->ctrl) >> 6) & 0x01 \758, (((ent)->ctrl) >> 15) & 0x01759760void dump_sec_cam_ent(void *sel, struct sec_cam_ent *ent, int id)761{762if (id >= 0) {763RTW_PRINT_SEL(sel, SEC_CAM_ENT_ID_VALUE_FMT " " SEC_CAM_ENT_VALUE_FMT"\n"764, SEC_CAM_ENT_ID_VALUE_ARG(id), SEC_CAM_ENT_VALUE_ARG(ent));765} else766RTW_PRINT_SEL(sel, SEC_CAM_ENT_VALUE_FMT"\n", SEC_CAM_ENT_VALUE_ARG(ent));767}768769void dump_sec_cam_ent_title(void *sel, u8 has_id)770{771if (has_id) {772RTW_PRINT_SEL(sel, SEC_CAM_ENT_ID_TITLE_FMT " " SEC_CAM_ENT_TITLE_FMT"\n"773, SEC_CAM_ENT_ID_TITLE_ARG, SEC_CAM_ENT_TITLE_ARG);774} else775RTW_PRINT_SEL(sel, SEC_CAM_ENT_TITLE_FMT"\n", SEC_CAM_ENT_TITLE_ARG);776}777778void dump_sec_cam(void *sel, _adapter *adapter)779{780struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);781struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;782struct sec_cam_ent ent;783int i;784785RTW_PRINT_SEL(sel, "HW sec cam:\n");786dump_sec_cam_ent_title(sel, 1);787for (i = 0; i < cam_ctl->num; i++) {788rtw_sec_read_cam_ent(adapter, i, (u8 *)(&ent.ctrl), ent.mac, ent.key);789dump_sec_cam_ent(sel , &ent, i);790}791}792793void dump_sec_cam_cache(void *sel, _adapter *adapter)794{795struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);796struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;797int i;798799RTW_PRINT_SEL(sel, "SW sec cam cache:\n");800dump_sec_cam_ent_title(sel, 1);801for (i = 0; i < cam_ctl->num; i++) {802if (dvobj->cam_cache[i].ctrl != 0)803dump_sec_cam_ent(sel, &dvobj->cam_cache[i], i);804}805806}807808static u8 fwdl_test_chksum_fail = 0;809static u8 fwdl_test_wintint_rdy_fail = 0;810811bool rtw_fwdl_test_trigger_chksum_fail(void)812{813if (fwdl_test_chksum_fail) {814RTW_PRINT("fwdl test case: trigger chksum_fail\n");815fwdl_test_chksum_fail--;816return _TRUE;817}818return _FALSE;819}820821bool rtw_fwdl_test_trigger_wintint_rdy_fail(void)822{823if (fwdl_test_wintint_rdy_fail) {824RTW_PRINT("fwdl test case: trigger wintint_rdy_fail\n");825fwdl_test_wintint_rdy_fail--;826return _TRUE;827}828return _FALSE;829}830831static u8 del_rx_ampdu_test_no_tx_fail = 0;832833bool rtw_del_rx_ampdu_test_trigger_no_tx_fail(void)834{835if (del_rx_ampdu_test_no_tx_fail) {836RTW_PRINT("del_rx_ampdu test case: trigger no_tx_fail\n");837del_rx_ampdu_test_no_tx_fail--;838return _TRUE;839}840return _FALSE;841}842843static u32 g_wait_hiq_empty_ms = 0;844845u32 rtw_get_wait_hiq_empty_ms(void)846{847return g_wait_hiq_empty_ms;848}849850static systime sta_linking_test_start_time = 0;851static u32 sta_linking_test_wait_ms = 0;852static u8 sta_linking_test_force_fail = 0;853854void rtw_sta_linking_test_set_start(void)855{856sta_linking_test_start_time = rtw_get_current_time();857}858859bool rtw_sta_linking_test_wait_done(void)860{861return rtw_get_passing_time_ms(sta_linking_test_start_time) >= sta_linking_test_wait_ms;862}863864bool rtw_sta_linking_test_force_fail(void)865{866return sta_linking_test_force_fail;867}868869#ifdef CONFIG_AP_MODE870static u16 ap_linking_test_force_auth_fail = 0;871static u16 ap_linking_test_force_asoc_fail = 0;872873u16 rtw_ap_linking_test_force_auth_fail(void)874{875return ap_linking_test_force_auth_fail;876}877878u16 rtw_ap_linking_test_force_asoc_fail(void)879{880return ap_linking_test_force_asoc_fail;881}882#endif883884#ifdef CONFIG_PROC_DEBUG885ssize_t proc_set_write_reg(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)886{887struct net_device *dev = data;888_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);889char tmp[32];890u32 addr, val, len;891892if (count < 3) {893RTW_INFO("argument size is less than 3\n");894return -EFAULT;895}896897if (count > sizeof(tmp)) {898rtw_warn_on(1);899return -EFAULT;900}901902if (buffer && !copy_from_user(tmp, buffer, count)) {903904int num = sscanf(tmp, "%x %x %x", &addr, &val, &len);905906if (num != 3) {907RTW_INFO("invalid write_reg parameter!\n");908return count;909}910911switch (len) {912case 1:913rtw_write8(padapter, addr, (u8)val);914break;915case 2:916rtw_write16(padapter, addr, (u16)val);917break;918case 4:919rtw_write32(padapter, addr, val);920break;921default:922RTW_INFO("error write length=%d", len);923break;924}925926}927928return count;929930}931932static u32 proc_get_read_addr = 0xeeeeeeee;933static u32 proc_get_read_len = 0x4;934935int proc_get_read_reg(struct seq_file *m, void *v)936{937struct net_device *dev = m->private;938_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);939940if (proc_get_read_addr == 0xeeeeeeee) {941RTW_PRINT_SEL(m, "address not initialized\n");942return 0;943}944945switch (proc_get_read_len) {946case 1:947RTW_PRINT_SEL(m, "rtw_read8(0x%x)=0x%x\n", proc_get_read_addr, rtw_read8(padapter, proc_get_read_addr));948break;949case 2:950RTW_PRINT_SEL(m, "rtw_read16(0x%x)=0x%x\n", proc_get_read_addr, rtw_read16(padapter, proc_get_read_addr));951break;952case 4:953RTW_PRINT_SEL(m, "rtw_read32(0x%x)=0x%x\n", proc_get_read_addr, rtw_read32(padapter, proc_get_read_addr));954break;955default:956RTW_PRINT_SEL(m, "error read length=%d\n", proc_get_read_len);957break;958}959960return 0;961}962963ssize_t proc_set_read_reg(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)964{965char tmp[16];966u32 addr, len;967968if (count < 2) {969RTW_INFO("argument size is less than 2\n");970return -EFAULT;971}972973if (count > sizeof(tmp)) {974rtw_warn_on(1);975return -EFAULT;976}977978if (buffer && !copy_from_user(tmp, buffer, count)) {979980int num = sscanf(tmp, "%x %x", &addr, &len);981982if (num != 2) {983RTW_INFO("invalid read_reg parameter!\n");984return count;985}986987proc_get_read_addr = addr;988989proc_get_read_len = len;990}991992return count;993994}995996int proc_get_rx_stat(struct seq_file *m, void *v)997{998_irqL irqL;999_list *plist, *phead;1000struct net_device *dev = m->private;1001_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);1002struct sta_info *psta = NULL;1003struct stainfo_stats *pstats = NULL;1004struct sta_priv *pstapriv = &(adapter->stapriv);1005u32 i, j;1006u8 bc_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};1007u8 null_addr[ETH_ALEN] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};10081009_enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);1010for (i = 0; i < NUM_STA; i++) {1011phead = &(pstapriv->sta_hash[i]);1012plist = get_next(phead);1013while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) {1014psta = LIST_CONTAINOR(plist, struct sta_info, hash_list);1015plist = get_next(plist);1016pstats = &psta->sta_stats;10171018if (pstats == NULL)1019continue;1020if ((_rtw_memcmp(psta->cmn.mac_addr, bc_addr, ETH_ALEN) != _TRUE)1021&& (_rtw_memcmp(psta->cmn.mac_addr, null_addr, ETH_ALEN) != _TRUE)1022&& (_rtw_memcmp(psta->cmn.mac_addr, adapter_mac_addr(adapter), ETH_ALEN) != _TRUE)) {1023RTW_PRINT_SEL(m, "MAC :\t\t"MAC_FMT "\n", MAC_ARG(psta->cmn.mac_addr));1024RTW_PRINT_SEL(m, "data_rx_cnt :\t%llu\n", sta_rx_data_uc_pkts(psta) - pstats->last_rx_data_uc_pkts);1025pstats->last_rx_data_uc_pkts = sta_rx_data_uc_pkts(psta);1026RTW_PRINT_SEL(m, "duplicate_cnt :\t%u\n", pstats->duplicate_cnt);1027pstats->duplicate_cnt = 0;1028RTW_PRINT_SEL(m, "rx_per_rate_cnt :\n");10291030for (j = 0; j < 0x60; j++) {1031RTW_PRINT_SEL(m, "%08u ", pstats->rxratecnt[j]);1032pstats->rxratecnt[j] = 0;1033if ((j%8) == 7)1034RTW_PRINT_SEL(m, "\n");1035}1036RTW_PRINT_SEL(m, "\n");1037}1038}1039}1040_exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);1041return 0;1042}10431044int proc_get_tx_stat(struct seq_file *m, void *v)1045{1046_irqL irqL;1047_list *plist, *phead;1048struct net_device *dev = m->private;1049_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);1050struct sta_info *psta = NULL;1051u8 sta_mac[NUM_STA][ETH_ALEN] = {{0}};1052uint mac_id[NUM_STA];1053struct stainfo_stats *pstats = NULL;1054struct sta_priv *pstapriv = &(adapter->stapriv);1055struct sta_priv *pstapriv_primary = &(GET_PRIMARY_ADAPTER(adapter))->stapriv;1056u32 i, macid_rec_idx = 0;1057u8 bc_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};1058u8 null_addr[ETH_ALEN] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};1059struct submit_ctx gotc2h;10601061_enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);1062for (i = 0; i < NUM_STA; i++) {1063phead = &(pstapriv->sta_hash[i]);1064plist = get_next(phead);1065while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) {1066psta = LIST_CONTAINOR(plist, struct sta_info, hash_list);1067plist = get_next(plist);1068if ((_rtw_memcmp(psta->cmn.mac_addr, bc_addr, ETH_ALEN) != _TRUE)1069&& (_rtw_memcmp(psta->cmn.mac_addr, null_addr, ETH_ALEN) != _TRUE)1070&& (_rtw_memcmp(psta->cmn.mac_addr, adapter_mac_addr(adapter), ETH_ALEN) != _TRUE)) {1071_rtw_memcpy(&sta_mac[macid_rec_idx][0], psta->cmn.mac_addr, ETH_ALEN);1072mac_id[macid_rec_idx] = psta->cmn.mac_id;1073macid_rec_idx++;1074}1075}1076}1077_exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);1078for (i = 0; i < macid_rec_idx; i++) {1079_rtw_memcpy(pstapriv_primary->c2h_sta_mac, &sta_mac[i][0], ETH_ALEN);1080pstapriv_primary->c2h_adapter_id = adapter->iface_id;1081rtw_sctx_init(&gotc2h, 60);1082pstapriv_primary->gotc2h = &gotc2h;1083rtw_hal_reqtxrpt(adapter, mac_id[i]);1084if (rtw_sctx_wait(&gotc2h, __func__)) {1085psta = rtw_get_stainfo(pstapriv, &sta_mac[i][0]);1086if(psta) {1087pstats = &psta->sta_stats;1088#ifndef ROKU_PRIVATE1089RTW_PRINT_SEL(m, "data_sent_cnt :\t%u\n", pstats->tx_ok_cnt + pstats->tx_fail_cnt);1090RTW_PRINT_SEL(m, "success_cnt :\t%u\n", pstats->tx_ok_cnt);1091RTW_PRINT_SEL(m, "failure_cnt :\t%u\n", pstats->tx_fail_cnt);1092RTW_PRINT_SEL(m, "retry_cnt :\t%u\n\n", pstats->tx_retry_cnt);1093#else1094RTW_PRINT_SEL(m, "MAC: " MAC_FMT " sent: %u fail: %u retry: %u\n",1095MAC_ARG(&sta_mac[i][0]), pstats->tx_ok_cnt, pstats->tx_fail_cnt, pstats->tx_retry_cnt);1096#endif /* ROKU_PRIVATE */10971098} else1099RTW_PRINT_SEL(m, "STA is gone\n");1100} else {1101//to avoid c2h modify counters1102pstapriv_primary->gotc2h = NULL;1103_rtw_memset(pstapriv_primary->c2h_sta_mac, 0, ETH_ALEN);1104pstapriv_primary->c2h_adapter_id = CONFIG_IFACE_NUMBER;1105RTW_PRINT_SEL(m, "Warming : Query timeout, operation abort!!\n");1106break;1107}1108pstapriv_primary->gotc2h = NULL;1109_rtw_memset(pstapriv_primary->c2h_sta_mac, 0, ETH_ALEN);1110pstapriv_primary->c2h_adapter_id = CONFIG_IFACE_NUMBER;1111}1112return 0;1113}11141115int proc_get_fwstate(struct seq_file *m, void *v)1116{1117struct net_device *dev = m->private;1118_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);1119struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);11201121RTW_PRINT_SEL(m, "fwstate=0x%x\n", get_fwstate(pmlmepriv));11221123return 0;1124}11251126int proc_get_sec_info(struct seq_file *m, void *v)1127{1128struct net_device *dev = m->private;1129_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);1130struct security_priv *sec = &padapter->securitypriv;11311132RTW_PRINT_SEL(m, "auth_alg=0x%x, enc_alg=0x%x, auth_type=0x%x, enc_type=0x%x\n",1133sec->dot11AuthAlgrthm, sec->dot11PrivacyAlgrthm,1134sec->ndisauthtype, sec->ndisencryptstatus);11351136RTW_PRINT_SEL(m, "hw_decrypted=%d\n", sec->hw_decrypted);11371138#ifdef DBG_SW_SEC_CNT1139RTW_PRINT_SEL(m, "wep_sw_enc_cnt=%llu, %llu, %llu\n"1140, sec->wep_sw_enc_cnt_bc , sec->wep_sw_enc_cnt_mc, sec->wep_sw_enc_cnt_uc);1141RTW_PRINT_SEL(m, "wep_sw_dec_cnt=%llu, %llu, %llu\n"1142, sec->wep_sw_dec_cnt_bc , sec->wep_sw_dec_cnt_mc, sec->wep_sw_dec_cnt_uc);11431144RTW_PRINT_SEL(m, "tkip_sw_enc_cnt=%llu, %llu, %llu\n"1145, sec->tkip_sw_enc_cnt_bc , sec->tkip_sw_enc_cnt_mc, sec->tkip_sw_enc_cnt_uc);1146RTW_PRINT_SEL(m, "tkip_sw_dec_cnt=%llu, %llu, %llu\n"1147, sec->tkip_sw_dec_cnt_bc , sec->tkip_sw_dec_cnt_mc, sec->tkip_sw_dec_cnt_uc);11481149RTW_PRINT_SEL(m, "aes_sw_enc_cnt=%llu, %llu, %llu\n"1150, sec->aes_sw_enc_cnt_bc , sec->aes_sw_enc_cnt_mc, sec->aes_sw_enc_cnt_uc);1151RTW_PRINT_SEL(m, "aes_sw_dec_cnt=%llu, %llu, %llu\n"1152, sec->aes_sw_dec_cnt_bc , sec->aes_sw_dec_cnt_mc, sec->aes_sw_dec_cnt_uc);1153#endif /* DBG_SW_SEC_CNT */11541155return 0;1156}11571158int proc_get_mlmext_state(struct seq_file *m, void *v)1159{1160struct net_device *dev = m->private;1161_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);1162struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;1163struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);11641165RTW_PRINT_SEL(m, "pmlmeinfo->state=0x%x\n", pmlmeinfo->state);11661167return 0;1168}11691170#ifdef CONFIG_LAYER2_ROAMING1171int proc_get_roam_flags(struct seq_file *m, void *v)1172{1173struct net_device *dev = m->private;1174_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);11751176RTW_PRINT_SEL(m, "0x%02x\n", rtw_roam_flags(adapter));11771178return 0;1179}11801181ssize_t proc_set_roam_flags(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)1182{1183struct net_device *dev = data;1184_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);11851186char tmp[32];1187u8 flags;11881189if (count < 1)1190return -EFAULT;11911192if (count > sizeof(tmp)) {1193rtw_warn_on(1);1194return -EFAULT;1195}11961197if (buffer && !copy_from_user(tmp, buffer, count)) {11981199int num = sscanf(tmp, "%hhx", &flags);12001201if (num == 1)1202rtw_assign_roam_flags(adapter, flags);1203}12041205return count;12061207}12081209int proc_get_roam_param(struct seq_file *m, void *v)1210{1211struct net_device *dev = m->private;1212_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);1213struct mlme_priv *mlme = &adapter->mlmepriv;12141215RTW_PRINT_SEL(m, "%12s %15s %26s %16s\n", "rssi_diff_th", "scanr_exp_ms", "scan_interval(unit:2 sec)", "rssi_threshold");1216RTW_PRINT_SEL(m, "%-15u %-13u %-27u %-11u\n"1217, mlme->roam_rssi_diff_th1218, mlme->roam_scanr_exp_ms1219, mlme->roam_scan_int1220, mlme->roam_rssi_threshold1221);12221223return 0;1224}12251226ssize_t proc_set_roam_param(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)1227{1228struct net_device *dev = data;1229_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);1230struct mlme_priv *mlme = &adapter->mlmepriv;12311232char tmp[32];1233u8 rssi_diff_th;1234u32 scanr_exp_ms;1235u32 scan_int;1236u8 rssi_threshold;12371238if (count < 1)1239return -EFAULT;12401241if (count > sizeof(tmp)) {1242rtw_warn_on(1);1243return -EFAULT;1244}12451246if (buffer && !copy_from_user(tmp, buffer, count)) {12471248int num = sscanf(tmp, "%hhu %u %u %hhu", &rssi_diff_th, &scanr_exp_ms, &scan_int, &rssi_threshold);12491250if (num >= 1)1251mlme->roam_rssi_diff_th = rssi_diff_th;1252if (num >= 2)1253mlme->roam_scanr_exp_ms = scanr_exp_ms;1254if (num >= 3)1255mlme->roam_scan_int = scan_int;1256if (num >= 4)1257mlme->roam_rssi_threshold = rssi_threshold;1258}12591260return count;12611262}12631264ssize_t proc_set_roam_tgt_addr(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)1265{1266struct net_device *dev = data;1267_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);12681269char tmp[32];1270u8 addr[ETH_ALEN];12711272if (count < 1)1273return -EFAULT;12741275if (count > sizeof(tmp)) {1276rtw_warn_on(1);1277return -EFAULT;1278}12791280if (buffer && !copy_from_user(tmp, buffer, count)) {12811282int num = sscanf(tmp, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", addr, addr + 1, addr + 2, addr + 3, addr + 4, addr + 5);1283if (num == 6)1284_rtw_memcpy(adapter->mlmepriv.roam_tgt_addr, addr, ETH_ALEN);12851286RTW_INFO("set roam_tgt_addr to "MAC_FMT"\n", MAC_ARG(adapter->mlmepriv.roam_tgt_addr));1287}12881289return count;1290}1291#endif /* CONFIG_LAYER2_ROAMING */12921293#ifdef CONFIG_RTW_80211R1294ssize_t proc_set_ft_flags(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)1295{1296struct net_device *dev = data;1297_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);12981299char tmp[32];1300u8 flags;13011302if (count < 1)1303return -EFAULT;13041305if (count > sizeof(tmp)) {1306rtw_warn_on(1);1307return -EFAULT;1308}13091310if (buffer && !copy_from_user(tmp, buffer, count)) {1311int num = sscanf(tmp, "%hhx", &flags);13121313if (num == 1)1314adapter->mlmepriv.ft_roam.ft_flags = flags;1315}13161317return count;13181319}13201321int proc_get_ft_flags(struct seq_file *m, void *v)1322{1323struct net_device *dev = m->private;1324_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);13251326RTW_PRINT_SEL(m, "0x%02x\n", adapter->mlmepriv.ft_roam.ft_flags);13271328return 0;1329}1330#endif13311332int proc_get_qos_option(struct seq_file *m, void *v)1333{1334struct net_device *dev = m->private;1335_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);1336struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);13371338RTW_PRINT_SEL(m, "qos_option=%d\n", pmlmepriv->qospriv.qos_option);13391340return 0;1341}13421343int proc_get_ht_option(struct seq_file *m, void *v)1344{1345struct net_device *dev = m->private;1346_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);1347struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);13481349#ifdef CONFIG_80211N_HT1350RTW_PRINT_SEL(m, "ht_option=%d\n", pmlmepriv->htpriv.ht_option);1351#endif /* CONFIG_80211N_HT */13521353return 0;1354}13551356int proc_get_rf_info(struct seq_file *m, void *v)1357{1358struct net_device *dev = m->private;1359_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);1360struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;13611362RTW_PRINT_SEL(m, "cur_ch=%d, cur_bw=%d, cur_ch_offet=%d\n",1363pmlmeext->cur_channel, pmlmeext->cur_bwmode, pmlmeext->cur_ch_offset);13641365RTW_PRINT_SEL(m, "oper_ch=%d, oper_bw=%d, oper_ch_offet=%d\n",1366rtw_get_oper_ch(padapter), rtw_get_oper_bw(padapter), rtw_get_oper_choffset(padapter));13671368return 0;1369}13701371int proc_get_scan_param(struct seq_file *m, void *v)1372{1373struct net_device *dev = m->private;1374_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);1375struct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv;1376struct ss_res *ss = &mlmeext->sitesurvey_res;13771378#define SCAN_PARAM_TITLE_FMT "%10s"1379#define SCAN_PARAM_VALUE_FMT "%-10u"1380#define SCAN_PARAM_TITLE_ARG , "scan_ch_ms"1381#define SCAN_PARAM_VALUE_ARG , ss->scan_ch_ms1382#ifdef CONFIG_80211N_HT1383#define SCAN_PARAM_TITLE_FMT_HT " %15s %13s"1384#define SCAN_PARAM_VALUE_FMT_HT " %-15u %-13u"1385#define SCAN_PARAM_TITLE_ARG_HT , "rx_ampdu_accept", "rx_ampdu_size"1386#define SCAN_PARAM_VALUE_ARG_HT , ss->rx_ampdu_accept, ss->rx_ampdu_size1387#else1388#define SCAN_PARAM_TITLE_FMT_HT ""1389#define SCAN_PARAM_VALUE_FMT_HT ""1390#define SCAN_PARAM_TITLE_ARG_HT1391#define SCAN_PARAM_VALUE_ARG_HT1392#endif1393#ifdef CONFIG_SCAN_BACKOP1394#define SCAN_PARAM_TITLE_FMT_BACKOP " %9s %12s"1395#define SCAN_PARAM_VALUE_FMT_BACKOP " %-9u %-12u"1396#define SCAN_PARAM_TITLE_ARG_BACKOP , "backop_ms", "scan_cnt_max"1397#define SCAN_PARAM_VALUE_ARG_BACKOP , ss->backop_ms, ss->scan_cnt_max1398#else1399#define SCAN_PARAM_TITLE_FMT_BACKOP ""1400#define SCAN_PARAM_VALUE_FMT_BACKOP ""1401#define SCAN_PARAM_TITLE_ARG_BACKOP1402#define SCAN_PARAM_VALUE_ARG_BACKOP1403#endif14041405RTW_PRINT_SEL(m,1406SCAN_PARAM_TITLE_FMT1407SCAN_PARAM_TITLE_FMT_HT1408SCAN_PARAM_TITLE_FMT_BACKOP1409"\n"1410SCAN_PARAM_TITLE_ARG1411SCAN_PARAM_TITLE_ARG_HT1412SCAN_PARAM_TITLE_ARG_BACKOP1413);14141415RTW_PRINT_SEL(m,1416SCAN_PARAM_VALUE_FMT1417SCAN_PARAM_VALUE_FMT_HT1418SCAN_PARAM_VALUE_FMT_BACKOP1419"\n"1420SCAN_PARAM_VALUE_ARG1421SCAN_PARAM_VALUE_ARG_HT1422SCAN_PARAM_VALUE_ARG_BACKOP1423);14241425return 0;1426}14271428ssize_t proc_set_scan_param(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)1429{1430struct net_device *dev = data;1431_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);1432struct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv;1433struct ss_res *ss = &mlmeext->sitesurvey_res;14341435char tmp[32] = {0};14361437u16 scan_ch_ms;1438#define SCAN_PARAM_INPUT_FMT "%hu"1439#define SCAN_PARAM_INPUT_ARG , &scan_ch_ms1440#ifdef CONFIG_80211N_HT1441u8 rx_ampdu_accept;1442u8 rx_ampdu_size;1443#define SCAN_PARAM_INPUT_FMT_HT " %hhu %hhu"1444#define SCAN_PARAM_INPUT_ARG_HT , &rx_ampdu_accept, &rx_ampdu_size1445#else1446#define SCAN_PARAM_INPUT_FMT_HT ""1447#define SCAN_PARAM_INPUT_ARG_HT1448#endif1449#ifdef CONFIG_SCAN_BACKOP1450u16 backop_ms;1451u8 scan_cnt_max;1452#define SCAN_PARAM_INPUT_FMT_BACKOP " %hu %hhu"1453#define SCAN_PARAM_INPUT_ARG_BACKOP , &backop_ms, &scan_cnt_max1454#else1455#define SCAN_PARAM_INPUT_FMT_BACKOP ""1456#define SCAN_PARAM_INPUT_ARG_BACKOP1457#endif14581459if (count < 1)1460return -EFAULT;14611462if (count > sizeof(tmp)) {1463rtw_warn_on(1);1464return -EFAULT;1465}14661467if (buffer && !copy_from_user(tmp, buffer, count)) {14681469int num = sscanf(tmp,1470SCAN_PARAM_INPUT_FMT1471SCAN_PARAM_INPUT_FMT_HT1472SCAN_PARAM_INPUT_FMT_BACKOP1473SCAN_PARAM_INPUT_ARG1474SCAN_PARAM_INPUT_ARG_HT1475SCAN_PARAM_INPUT_ARG_BACKOP1476);14771478if (num-- > 0)1479ss->scan_ch_ms = scan_ch_ms;1480#ifdef CONFIG_80211N_HT1481if (num-- > 0)1482ss->rx_ampdu_accept = rx_ampdu_accept;1483if (num-- > 0)1484ss->rx_ampdu_size = rx_ampdu_size;1485#endif1486#ifdef CONFIG_SCAN_BACKOP1487if (num-- > 0)1488ss->backop_ms = backop_ms;1489if (num-- > 0)1490ss->scan_cnt_max = scan_cnt_max;1491#endif1492}14931494return count;1495}14961497int proc_get_scan_abort(struct seq_file *m, void *v)1498{1499struct net_device *dev = m->private;1500_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);1501u32 pass_ms;15021503pass_ms = rtw_scan_abort_timeout(adapter, 10000);15041505RTW_PRINT_SEL(m, "%u\n", pass_ms);15061507return 0;1508}15091510#ifdef CONFIG_RTW_REPEATER_SON1511int proc_get_rson_data(struct seq_file *m, void *v)1512{1513struct net_device *dev = m->private;1514_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);1515char rson_data_str[256];15161517rtw_rson_get_property_str(padapter, rson_data_str);1518RTW_PRINT_SEL(m, "%s\n", rson_data_str);1519return 0;1520}15211522ssize_t proc_set_rson_data(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)1523{1524struct net_device *dev = data;1525_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);1526struct dvobj_priv *pdvobj = adapter_to_dvobj(padapter);1527char tmp[64] = {0};1528int num;1529u8 field[10], value[64];15301531if (count < 1)1532return -EFAULT;15331534if (count > sizeof(tmp)) {1535rtw_warn_on(1);1536return -EFAULT;1537}15381539if (buffer && !copy_from_user(tmp, buffer, count)) {1540num = sscanf(tmp, "%s %s", field, value);1541if (num != 2) {1542RTW_INFO("Invalid format : echo <field> <value> > son_data\n");1543return count;1544}1545RTW_INFO("field=%s value=%s\n", field, value);1546num = rtw_rson_set_property(padapter, field, value);1547if (num != 1) {1548RTW_INFO("Invalid field(%s) or value(%s)\n", field, value);1549return count;1550}1551}1552return count;1553}1554#endif /*CONFIG_RTW_REPEATER_SON*/15551556int proc_get_survey_info(struct seq_file *m, void *v)1557{1558_irqL irqL;1559struct net_device *dev = m->private;1560_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);1561struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);1562_queue *queue = &(pmlmepriv->scanned_queue);1563struct wlan_network *pnetwork = NULL;1564_list *plist, *phead;1565s32 notify_signal;1566s16 notify_noise = 0;1567u16 index = 0, ie_cap = 0;1568unsigned char *ie_wpa = NULL, *ie_wpa2 = NULL, *ie_wps = NULL;1569unsigned char *ie_p2p = NULL, *ssid = NULL;1570char flag_str[64];1571int ielen = 0;1572u32 wpsielen = 0;1573#ifdef CONFIG_RTW_MESH1574const char *ssid_title_str = "ssid/mesh_id";1575#else1576const char *ssid_title_str = "ssid";1577#endif15781579_enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);1580phead = get_list_head(queue);1581if (!phead)1582goto _exit;1583plist = get_next(phead);1584if (!plist)1585goto _exit;15861587#ifdef CONFIG_RTW_REPEATER_SON1588rtw_rson_show_survey_info(m, plist, phead);1589#else15901591RTW_PRINT_SEL(m, "%5s %-17s %3s %-3s %-4s %-4s %5s %32s %32s\n", "index", "bssid", "ch", "RSSI", "SdBm", "Noise", "age", "flag", ssid_title_str);1592while (1) {1593if (rtw_end_of_queue_search(phead, plist) == _TRUE)1594break;15951596pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);1597if (!pnetwork)1598break;15991600if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE &&1601is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network, 0)) {1602notify_signal = translate_percentage_to_dbm(padapter->recvpriv.signal_strength);/* dbm */1603} else {1604notify_signal = translate_percentage_to_dbm(pnetwork->network.PhyInfo.SignalStrength);/* dbm */1605}16061607#ifdef CONFIG_BACKGROUND_NOISE_MONITOR1608if (IS_NM_ENABLE(padapter))1609notify_noise = rtw_noise_query_by_chan_num(padapter, pnetwork->network.Configuration.DSConfig);1610#endif16111612ie_wpa = rtw_get_wpa_ie(&pnetwork->network.IEs[12], &ielen, pnetwork->network.IELength - 12);1613ie_wpa2 = rtw_get_wpa2_ie(&pnetwork->network.IEs[12], &ielen, pnetwork->network.IELength - 12);1614ie_cap = rtw_get_capability(&pnetwork->network);1615ie_wps = rtw_get_wps_ie(&pnetwork->network.IEs[12], pnetwork->network.IELength - 12, NULL, &wpsielen);1616ie_p2p = rtw_get_p2p_ie(&pnetwork->network.IEs[12], pnetwork->network.IELength - 12, NULL, &ielen);1617ssid = pnetwork->network.Ssid.Ssid;1618sprintf(flag_str, "%s%s%s%s%s%s%s",1619(ie_wpa) ? "[WPA]" : "",1620(ie_wpa2) ? "[WPA2]" : "",1621(!ie_wpa && !ie_wpa && ie_cap & BIT(4)) ? "[WEP]" : "",1622(ie_wps) ? "[WPS]" : "",1623(pnetwork->network.InfrastructureMode == Ndis802_11IBSS) ? "[IBSS]" :1624(pnetwork->network.InfrastructureMode == Ndis802_11_mesh) ? "[MESH]" : "",1625(ie_cap & BIT(0)) ? "[ESS]" : "",1626(ie_p2p) ? "[P2P]" : "");1627RTW_PRINT_SEL(m, "%5d "MAC_FMT" %3d %3d %4d %4d %5d %32s %32s\n",1628++index,1629MAC_ARG(pnetwork->network.MacAddress),1630pnetwork->network.Configuration.DSConfig,1631(int)pnetwork->network.Rssi,1632notify_signal,1633notify_noise,1634rtw_get_passing_time_ms(pnetwork->last_scanned),1635flag_str,1636pnetwork->network.InfrastructureMode == Ndis802_11_mesh ? pnetwork->network.mesh_id.Ssid : pnetwork->network.Ssid.Ssid1637);1638plist = get_next(plist);1639}1640#endif1641_exit:1642_exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);16431644return 0;1645}16461647ssize_t proc_set_survey_info(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)1648{1649struct net_device *dev = data;1650_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);1651u8 _status = _FALSE;1652u8 ssc_chk;1653if (count < 1)1654return -EFAULT;16551656#if 11657ssc_chk = rtw_sitesurvey_condition_check(padapter, _FALSE);1658if (ssc_chk != SS_ALLOW)1659goto exit;16601661rtw_ps_deny(padapter, PS_DENY_SCAN);1662if (_FAIL == rtw_pwr_wakeup(padapter))1663goto cancel_ps_deny;1664if (!rtw_is_adapter_up(padapter)) {1665RTW_INFO("scan abort!! adapter cannot use\n");1666goto cancel_ps_deny;1667}1668#else1669#ifdef CONFIG_MP_INCLUDED1670if (rtw_mp_mode_check(padapter)) {1671RTW_INFO("MP mode block Scan request\n");1672goto exit;1673}1674#endif1675if (rtw_is_scan_deny(padapter)) {1676RTW_INFO(FUNC_ADPT_FMT ": scan deny\n", FUNC_ADPT_ARG(padapter));1677goto exit;1678}16791680rtw_ps_deny(padapter, PS_DENY_SCAN);1681if (_FAIL == rtw_pwr_wakeup(padapter))1682goto cancel_ps_deny;16831684if (!rtw_is_adapter_up(padapter)) {1685RTW_INFO("scan abort!! adapter cannot use\n");1686goto cancel_ps_deny;1687}16881689if (rtw_mi_busy_traffic_check(padapter, _FALSE)) {1690RTW_INFO("scan abort!! BusyTraffic == _TRUE\n");1691goto cancel_ps_deny;1692}16931694if (check_fwstate(pmlmepriv, WIFI_AP_STATE) && check_fwstate(pmlmepriv, WIFI_UNDER_WPS)) {1695RTW_INFO("scan abort!! AP mode process WPS\n");1696goto cancel_ps_deny;1697}1698if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY | _FW_UNDER_LINKING) == _TRUE) {1699RTW_INFO("scan abort!! fwstate=0x%x\n", pmlmepriv->fw_state);1700goto cancel_ps_deny;1701}17021703#ifdef CONFIG_CONCURRENT_MODE1704if (rtw_mi_buddy_check_fwstate(padapter,1705_FW_UNDER_SURVEY | _FW_UNDER_LINKING | WIFI_UNDER_WPS)) {1706RTW_INFO("scan abort!! buddy_fwstate check failed\n");1707goto cancel_ps_deny;1708}1709#endif1710#endif1711_status = rtw_set_802_11_bssid_list_scan(padapter, NULL);17121713cancel_ps_deny:1714rtw_ps_deny_cancel(padapter, PS_DENY_SCAN);1715exit:1716return count;1717}1718#ifdef ROKU_PRIVATE1719int proc_get_infra_ap(struct seq_file *m, void *v)1720{1721struct net_device *dev = m->private;1722struct sta_info *psta;1723_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);1724struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);1725struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;1726struct ht_priv_infra_ap *phtpriv = &pmlmepriv->htpriv_infra_ap;1727#ifdef CONFIG_80211AC_VHT1728struct vht_priv_infra_ap *pvhtpriv = &pmlmepriv->vhtpriv_infra_ap;1729#endif1730struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);1731struct wlan_network *cur_network = &(pmlmepriv->cur_network);1732struct sta_priv *pstapriv = &padapter->stapriv;17331734if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) {1735psta = rtw_get_stainfo(pstapriv, cur_network->network.MacAddress);1736if (psta) {1737unsigned int i, j;1738unsigned int Rx_ss = 0, Tx_ss = 0;1739struct recv_reorder_ctrl *preorder_ctrl;17401741RTW_PRINT_SEL(m, "SSID=%s\n", pmlmeinfo->network.Ssid.Ssid);1742RTW_PRINT_SEL(m, "sta's macaddr:" MAC_FMT "\n", MAC_ARG(psta->cmn.mac_addr));1743RTW_PRINT_SEL(m, "Supported rate=");1744for (i = 0; i < NDIS_802_11_LENGTH_RATES_EX; i++) {1745if (pmlmeinfo->SupportedRates_infra_ap[i] == 0)1746break;1747RTW_PRINT_SEL(m, " 0x%x", pmlmeinfo->SupportedRates_infra_ap[i]);1748}1749RTW_PRINT_SEL(m, "\n");1750#ifdef CONFIG_80211N_HT1751if (pmlmeinfo->ht_vht_received & BIT(0)) {1752RTW_PRINT_SEL(m, "Supported MCS set=");1753for (i = 0; i < 16 ; i++)1754RTW_PRINT_SEL(m, " 0x%02x", phtpriv->MCS_set_infra_ap[i]);1755RTW_PRINT_SEL(m, "\n");1756RTW_PRINT_SEL(m, "highest supported data rate=0x%x\n", phtpriv->rx_highest_data_rate_infra_ap);1757RTW_PRINT_SEL(m, "HT_supported_channel_width_set=0x%x\n", phtpriv->channel_width_infra_ap);1758RTW_PRINT_SEL(m, "sgi_20m=%d, sgi_40m=%d\n", phtpriv->sgi_20m_infra_ap, phtpriv->sgi_40m_infra_ap);1759RTW_PRINT_SEL(m, "ldpc_cap=0x%x, stbc_cap=0x%x\n", phtpriv->ldpc_cap_infra_ap, phtpriv->stbc_cap_infra_ap);1760RTW_PRINT_SEL(m, "HT_number_of_stream=%d\n", phtpriv->Rx_ss_infra_ap);1761}1762#endif17631764#ifdef CONFIG_80211AC_VHT1765if (pmlmeinfo->ht_vht_received & BIT(1)) {1766RTW_PRINT_SEL(m, "VHT_supported_channel_width_set=0x%x\n", pvhtpriv->channel_width_infra_ap);1767RTW_PRINT_SEL(m, "vht_ldpc_cap=0x%x, vht_stbc_cap=0x%x, vht_beamform_cap=0x%x\n", pvhtpriv->ldpc_cap_infra_ap, pvhtpriv->stbc_cap_infra_ap, pvhtpriv->beamform_cap_infra_ap);1768RTW_PRINT_SEL(m, "Rx_vht_mcs_map=0x%x, Tx_vht_mcs_map=0x%x\n", *(u16 *)pvhtpriv->vht_mcs_map_infra_ap, *(u16 *)pvhtpriv->vht_mcs_map_tx_infra_ap);1769RTW_PRINT_SEL(m, "VHT_number_of_stream=%d\n", pvhtpriv->number_of_streams_infra_ap);1770}1771#endif1772} else1773RTW_PRINT_SEL(m, "can't get sta's macaddr, cur_network's macaddr:" MAC_FMT "\n", MAC_ARG(cur_network->network.MacAddress));1774} else1775RTW_PRINT_SEL(m, "this only applies to STA mode\n");1776return 0;1777}17781779#endif /* ROKU_PRIVATE */17801781static int wireless_mode_to_str(u32 mode, char *str)1782{1783str[0]='\0';1784if (mode&WIRELESS_11A)1785sprintf(str+strlen(str),"%s","A/");1786if (mode&WIRELESS_11B)1787sprintf(str+strlen(str),"%s","B/");1788if (mode&WIRELESS_11G)1789sprintf(str+strlen(str),"%s","G/");1790if (mode&(WIRELESS_11_24N|WIRELESS_11_5N))1791sprintf(str+strlen(str),"%s","N/");1792if (mode&WIRELESS_11AC)1793sprintf(str+strlen(str),"%s","AC/");17941795if (strlen(str)>1)1796str[strlen(str)-1]='\0';17971798return strlen(str);1799}18001801int proc_get_ap_info(struct seq_file *m, void *v)1802{1803struct net_device *dev = m->private;1804struct sta_info *psta;1805_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);1806struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);1807struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;1808struct wlan_network *cur_network = &(pmlmepriv->cur_network);1809struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);1810struct sta_priv *pstapriv = &padapter->stapriv;1811char wl_mode[16];18121813/* ap vendor */1814char vendor[VENDOR_NAME_LEN] = {0};1815get_assoc_AP_Vendor(vendor,pmlmeinfo->assoc_AP_vendor);1816RTW_PRINT_SEL(m,"AP Vendor %s\n", vendor);18171818psta = rtw_get_stainfo(pstapriv, cur_network->network.MacAddress);1819if (psta) {1820wireless_mode_to_str(psta->wireless_mode, wl_mode);1821RTW_PRINT_SEL(m, "SSID=%s\n", cur_network->network.Ssid.Ssid);1822RTW_PRINT_SEL(m, "sta's macaddr:" MAC_FMT "\n", MAC_ARG(psta->cmn.mac_addr));1823RTW_PRINT_SEL(m, "cur_channel=%d, cur_bwmode=%d(%s), cur_ch_offset=%d\n", pmlmeext->cur_channel, pmlmeext->cur_bwmode, ch_width_str(pmlmeext->cur_bwmode), pmlmeext->cur_ch_offset);1824RTW_PRINT_SEL(m, "wireless_mode=0x%x(%s), rtsen=%d, cts2slef=%d\n", psta->wireless_mode, wl_mode, psta->rtsen, psta->cts2self);1825RTW_PRINT_SEL(m, "state=0x%x, aid=%d, macid=%d, raid=%d\n",1826psta->state, psta->cmn.aid, psta->cmn.mac_id, psta->cmn.ra_info.rate_id);1827#ifdef CONFIG_80211N_HT1828RTW_PRINT_SEL(m, "qos_en=%d, ht_en=%d, init_rate=%d\n", psta->qos_option, psta->htpriv.ht_option, psta->init_rate);1829RTW_PRINT_SEL(m, "bwmode=%d, ch_offset=%d, sgi_20m=%d,sgi_40m=%d\n"1830, psta->cmn.bw_mode, psta->htpriv.ch_offset, psta->htpriv.sgi_20m, psta->htpriv.sgi_40m);1831RTW_PRINT_SEL(m, "ampdu_enable = %d\n", psta->htpriv.ampdu_enable);1832RTW_PRINT_SEL(m, "agg_enable_bitmap=%x, candidate_tid_bitmap=%x\n", psta->htpriv.agg_enable_bitmap, psta->htpriv.candidate_tid_bitmap);1833RTW_PRINT_SEL(m, "ldpc_cap=0x%x, stbc_cap=0x%x, beamform_cap=0x%x\n", psta->htpriv.ldpc_cap, psta->htpriv.stbc_cap, psta->htpriv.beamform_cap);1834#endif /* CONFIG_80211N_HT */1835#ifdef CONFIG_80211AC_VHT1836RTW_PRINT_SEL(m, "vht_en=%d, vht_sgi_80m=%d\n", psta->vhtpriv.vht_option, psta->vhtpriv.sgi_80m);1837RTW_PRINT_SEL(m, "vht_ldpc_cap=0x%x, vht_stbc_cap=0x%x, vht_beamform_cap=0x%x\n", psta->vhtpriv.ldpc_cap, psta->vhtpriv.stbc_cap, psta->vhtpriv.beamform_cap);1838RTW_PRINT_SEL(m, "vht_mcs_map=0x%x, vht_highest_rate=0x%x, vht_ampdu_len=%d\n", *(u16 *)psta->vhtpriv.vht_mcs_map, psta->vhtpriv.vht_highest_rate, psta->vhtpriv.ampdu_len);1839#endif1840sta_rx_reorder_ctl_dump(m, psta);1841} else1842RTW_PRINT_SEL(m, "can't get sta's macaddr, cur_network's macaddr:" MAC_FMT "\n", MAC_ARG(cur_network->network.MacAddress));18431844return 0;1845}18461847ssize_t proc_reset_trx_info(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)1848{1849struct net_device *dev = data;1850_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);1851struct recv_priv *precvpriv = &padapter->recvpriv;1852char cmd[32] = {0};1853u8 cnt = 0;18541855if (count > sizeof(cmd)) {1856rtw_warn_on(1);1857return -EFAULT;1858}18591860if (buffer && !copy_from_user(cmd, buffer, count)) {1861int num = sscanf(cmd, "%hhx", &cnt);18621863if (num == 1 && cnt == 0) {1864precvpriv->dbg_rx_ampdu_drop_count = 0;1865precvpriv->dbg_rx_ampdu_forced_indicate_count = 0;1866precvpriv->dbg_rx_ampdu_loss_count = 0;1867precvpriv->dbg_rx_dup_mgt_frame_drop_count = 0;1868precvpriv->dbg_rx_ampdu_window_shift_cnt = 0;1869precvpriv->dbg_rx_conflic_mac_addr_cnt = 0;1870precvpriv->dbg_rx_drop_count = 0;1871}1872}18731874return count;1875}18761877int proc_get_trx_info(struct seq_file *m, void *v)1878{1879struct net_device *dev = m->private;1880int i;1881_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);1882struct xmit_priv *pxmitpriv = &padapter->xmitpriv;1883struct recv_priv *precvpriv = &padapter->recvpriv;1884struct hw_xmit *phwxmit;1885u16 vo_params[4], vi_params[4], be_params[4], bk_params[4];18861887padapter->hal_func.read_wmmedca_reg(padapter, vo_params, vi_params, be_params, bk_params);18881889RTW_PRINT_SEL(m, "wmm_edca_vo, aifs = %u us, cw_min = %u, cw_max = %u, txop_limit = %u us\n", vo_params[0], vo_params[1], vo_params[2], vo_params[3]);1890RTW_PRINT_SEL(m, "wmm_edca_vi, aifs = %u us, cw_min = %u, cw_max = %u, txop_limit = %u us\n", vi_params[0], vi_params[1], vi_params[2], vi_params[3]);1891RTW_PRINT_SEL(m, "wmm_edca_be, aifs = %u us, cw_min = %u, cw_max = %u, txop_limit = %u us\n", be_params[0], be_params[1], be_params[2], be_params[3]);1892RTW_PRINT_SEL(m, "wmm_edca_bk, aifs = %u us, cw_min = %u, cw_max = %u, txop_limit = %u us\n", bk_params[0], bk_params[1], bk_params[2], bk_params[3]);18931894dump_os_queue(m, padapter);18951896RTW_PRINT_SEL(m, "free_xmitbuf_cnt=%d, free_xmitframe_cnt=%d\n"1897, pxmitpriv->free_xmitbuf_cnt, pxmitpriv->free_xmitframe_cnt);1898RTW_PRINT_SEL(m, "free_ext_xmitbuf_cnt=%d, free_xframe_ext_cnt=%d\n"1899, pxmitpriv->free_xmit_extbuf_cnt, pxmitpriv->free_xframe_ext_cnt);1900RTW_PRINT_SEL(m, "free_recvframe_cnt=%d\n"1901, precvpriv->free_recvframe_cnt);19021903for (i = 0; i < 4; i++) {1904phwxmit = pxmitpriv->hwxmits + i;1905RTW_PRINT_SEL(m, "%d, hwq.accnt=%d\n", i, phwxmit->accnt);1906}19071908rtw_hal_get_hwreg(padapter, HW_VAR_DUMP_MAC_TXFIFO, (u8 *)m);19091910#ifdef CONFIG_USB_HCI1911RTW_PRINT_SEL(m, "rx_urb_pending_cn=%d\n", ATOMIC_READ(&(precvpriv->rx_pending_cnt)));1912#endif19131914dump_rx_bh_tk(m, &GET_PRIMARY_ADAPTER(padapter)->recvpriv);19151916/* Folowing are RX info */1917RTW_PRINT_SEL(m, "RX: Count of Packets dropped by Driver: %llu\n", (unsigned long long)precvpriv->dbg_rx_drop_count);1918/* Counts of packets whose seq_num is less than preorder_ctrl->indicate_seq, Ex delay, retransmission, redundant packets and so on */1919RTW_PRINT_SEL(m, "Rx: Counts of Packets Whose Seq_Num Less Than Reorder Control Seq_Num: %llu\n", (unsigned long long)precvpriv->dbg_rx_ampdu_drop_count);1920/* How many times the Rx Reorder Timer is triggered. */1921RTW_PRINT_SEL(m, "Rx: Reorder Time-out Trigger Counts: %llu\n", (unsigned long long)precvpriv->dbg_rx_ampdu_forced_indicate_count);1922/* Total counts of packets loss */1923RTW_PRINT_SEL(m, "Rx: Packet Loss Counts: %llu\n", (unsigned long long)precvpriv->dbg_rx_ampdu_loss_count);1924RTW_PRINT_SEL(m, "Rx: Duplicate Management Frame Drop Count: %llu\n", (unsigned long long)precvpriv->dbg_rx_dup_mgt_frame_drop_count);1925RTW_PRINT_SEL(m, "Rx: AMPDU BA window shift Count: %llu\n", (unsigned long long)precvpriv->dbg_rx_ampdu_window_shift_cnt);1926/*The same mac addr counts*/1927RTW_PRINT_SEL(m, "Rx: Conflict MAC Address Frames Count: %llu\n", (unsigned long long)precvpriv->dbg_rx_conflic_mac_addr_cnt);1928return 0;1929}19301931int proc_get_rate_ctl(struct seq_file *m, void *v)1932{1933struct net_device *dev = m->private;1934_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);1935u8 data_rate = 0, sgi = 0, data_fb = 0;19361937if (adapter->fix_rate != 0xff) {1938data_rate = adapter->fix_rate & 0x7F;1939sgi = adapter->fix_rate >> 7;1940data_fb = adapter->data_fb ? 1 : 0;1941RTW_PRINT_SEL(m, "FIXED %s%s%s\n"1942, HDATA_RATE(data_rate)1943, data_rate > DESC_RATE54M ? (sgi ? " SGI" : " LGI") : ""1944, data_fb ? " FB" : ""1945);1946RTW_PRINT_SEL(m, "0x%02x %u\n", adapter->fix_rate, adapter->data_fb);1947} else1948RTW_PRINT_SEL(m, "RA\n");19491950return 0;1951}19521953#ifdef CONFIG_PHDYM_FW_FIXRATE1954void phydm_fw_fix_rate(void *dm_void, u8 en, u8 macid, u8 bw, u8 rate);1955#endif1956ssize_t proc_set_rate_ctl(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)1957{1958struct net_device *dev = data;1959_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);1960HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);1961char tmp[32];1962u8 fix_rate = 0xFF;1963#ifdef CONFIG_PHDYM_FW_FIXRATE1964u8 bw = 0;1965#else1966u8 data_fb = 0;1967#endif19681969if (count < 1)1970return -EFAULT;19711972if (count > sizeof(tmp)) {1973rtw_warn_on(1);1974return -EFAULT;1975}19761977if (buffer && !copy_from_user(tmp, buffer, count)) {1978#ifdef CONFIG_PHDYM_FW_FIXRATE1979struct dm_struct *dm = adapter_to_phydm(adapter);1980u8 en = 1, macid = 255;1981_irqL irqL;1982_list *plist, *phead;1983struct sta_info *psta = NULL;1984struct sta_priv *pstapriv = &(adapter->stapriv);1985u8 bc_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};1986u8 null_addr[ETH_ALEN] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};1987uint mac_id[NUM_STA];1988int i, macid_rec_idx = 0;1989int num = sscanf(tmp, "%hhx %hhu %hhu", &fix_rate, &bw, &macid);19901991if (num < 1) {1992RTW_INFO("Invalid input!! \"ex: echo <rate> <bw> <macid> > /proc/.../rate_ctl\"\n");1993return count;1994}19951996if ((fix_rate == 0) || (fix_rate == 0xFF))1997en = 0;19981999if (macid != 255) {2000RTW_INFO("Call phydm_fw_fix_rate()--en[%d] mac_id[%d] bw[%d] fix_rate[%d]\n", en, macid, bw, fix_rate);2001phydm_fw_fix_rate(dm, en, macid, bw, fix_rate);2002return count;2003}20042005/* no specific macid, apply to all macids except bc/mc macid */2006_enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);2007for (i = 0; i < NUM_STA; i++) {2008phead = &(pstapriv->sta_hash[i]);2009plist = get_next(phead);2010while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) {2011psta = LIST_CONTAINOR(plist, struct sta_info, hash_list);2012plist = get_next(plist);2013if ((_rtw_memcmp(psta->cmn.mac_addr, bc_addr, ETH_ALEN) != _TRUE)2014&& (_rtw_memcmp(psta->cmn.mac_addr, null_addr, ETH_ALEN) != _TRUE)2015&& (_rtw_memcmp(psta->cmn.mac_addr, adapter_mac_addr(adapter), ETH_ALEN) != _TRUE)) {2016mac_id[macid_rec_idx] = psta->cmn.mac_id;2017macid_rec_idx++;2018}2019}2020}2021_exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);20222023for (i = 0; i < macid_rec_idx; i++) {2024RTW_INFO("Call phydm_fw_fix_rate()--en[%d] mac_id[%d] bw[%d] fix_rate[%d]\n", en, mac_id[i], bw, fix_rate);2025phydm_fw_fix_rate(dm, en, mac_id[i], bw, fix_rate);2026}2027#else2028int num = sscanf(tmp, "%hhx %hhu", &fix_rate, &data_fb);20292030if (num >= 1) {2031u8 fix_rate_ori = adapter->fix_rate;20322033adapter->fix_rate = fix_rate;2034if (fix_rate == 0xFF)2035hal_data->ForcedDataRate = 0;2036else2037hal_data->ForcedDataRate = hw_rate_to_m_rate(fix_rate & 0x7F);20382039if (adapter->fix_bw != 0xFF && fix_rate_ori != fix_rate)2040rtw_update_tx_rate_bmp(adapter_to_dvobj(adapter));2041}2042if (num >= 2)2043adapter->data_fb = data_fb ? 1 : 0;2044#endif2045}20462047return count;2048}20492050#ifdef CONFIG_AP_MODE2051int proc_get_bmc_tx_rate(struct seq_file *m, void *v)2052{2053struct net_device *dev = m->private;2054_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);20552056if (!MLME_IS_AP(adapter) && !MLME_IS_MESH(adapter)) {2057RTW_PRINT_SEL(m, "[ERROR] Not in SoftAP/Mesh mode !!\n");2058return 0;2059}20602061RTW_PRINT_SEL(m, " BMC Tx rate - %s\n", MGN_RATE_STR(adapter->bmc_tx_rate));2062return 0;2063}20642065ssize_t proc_set_bmc_tx_rate(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)2066{2067struct net_device *dev = data;2068_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);2069char tmp[32];2070u8 bmc_tx_rate;20712072if (count < 1)2073return -EFAULT;20742075if (count > sizeof(tmp)) {2076rtw_warn_on(1);2077return -EFAULT;2078}20792080if (buffer && !copy_from_user(tmp, buffer, count)) {20812082int num = sscanf(tmp, "%hhx", &bmc_tx_rate);20832084if (num >= 1)2085/*adapter->bmc_tx_rate = hw_rate_to_m_rate(bmc_tx_rate);*/2086adapter->bmc_tx_rate = bmc_tx_rate;2087}20882089return count;2090}2091#endif /*CONFIG_AP_MODE*/209220932094int proc_get_tx_power_offset(struct seq_file *m, void *v)2095{2096struct net_device *dev = m->private;2097_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);20982099RTW_PRINT_SEL(m, "Tx power offset - %u\n", adapter->power_offset);2100return 0;2101}21022103ssize_t proc_set_tx_power_offset(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)2104{2105struct net_device *dev = data;2106_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);2107char tmp[32];2108u8 power_offset = 0;21092110if (count < 1)2111return -EFAULT;21122113if (count > sizeof(tmp)) {2114rtw_warn_on(1);2115return -EFAULT;2116}21172118if (buffer && !copy_from_user(tmp, buffer, count)) {21192120int num = sscanf(tmp, "%hhu", &power_offset);21212122if (num >= 1) {2123if (power_offset > 5)2124power_offset = 0;21252126adapter->power_offset = power_offset;2127}2128}21292130return count;2131}21322133int proc_get_bw_ctl(struct seq_file *m, void *v)2134{2135struct net_device *dev = m->private;2136_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);2137u8 data_bw = 0;21382139if (adapter->fix_bw != 0xff) {2140data_bw = adapter->fix_bw;2141RTW_PRINT_SEL(m, "FIXED %s\n", ch_width_str(data_bw));2142} else2143RTW_PRINT_SEL(m, "Auto\n");21442145return 0;2146}21472148ssize_t proc_set_bw_ctl(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)2149{2150struct net_device *dev = data;2151_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);2152char tmp[32];2153u8 fix_bw;21542155if (count < 1)2156return -EFAULT;21572158if (count > sizeof(tmp)) {2159rtw_warn_on(1);2160return -EFAULT;2161}21622163if (buffer && !copy_from_user(tmp, buffer, count)) {2164int num = sscanf(tmp, "%hhu", &fix_bw);21652166if (num >= 1) {2167u8 fix_bw_ori = adapter->fix_bw;21682169adapter->fix_bw = fix_bw;21702171if (adapter->fix_rate != 0xFF && fix_bw_ori != fix_bw)2172rtw_update_tx_rate_bmp(adapter_to_dvobj(adapter));2173}2174}21752176return count;2177}21782179#ifdef DBG_RX_COUNTER_DUMP2180int proc_get_rx_cnt_dump(struct seq_file *m, void *v)2181{2182struct net_device *dev = m->private;2183int i;2184_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);21852186RTW_PRINT_SEL(m, "BIT0- Dump RX counters of DRV\n");2187RTW_PRINT_SEL(m, "BIT1- Dump RX counters of MAC\n");2188RTW_PRINT_SEL(m, "BIT2- Dump RX counters of PHY\n");2189RTW_PRINT_SEL(m, "BIT3- Dump TRX data frame of DRV\n");2190RTW_PRINT_SEL(m, "dump_rx_cnt_mode = 0x%02x\n", adapter->dump_rx_cnt_mode);21912192return 0;2193}2194ssize_t proc_set_rx_cnt_dump(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)2195{2196struct net_device *dev = data;2197_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);2198char tmp[32];2199u8 dump_rx_cnt_mode;22002201if (count < 1)2202return -EFAULT;22032204if (count > sizeof(tmp)) {2205rtw_warn_on(1);2206return -EFAULT;2207}22082209if (buffer && !copy_from_user(tmp, buffer, count)) {22102211int num = sscanf(tmp, "%hhx", &dump_rx_cnt_mode);22122213if (num == 1) {2214rtw_dump_phy_rxcnts_preprocess(adapter, dump_rx_cnt_mode);2215adapter->dump_rx_cnt_mode = dump_rx_cnt_mode;2216}2217}22182219return count;2220}2221#endif22222223ssize_t proc_set_fwdl_test_case(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)2224{2225char tmp[32];22262227if (count < 1)2228return -EFAULT;22292230if (count > sizeof(tmp)) {2231rtw_warn_on(1);2232return -EFAULT;2233}22342235if (buffer && !copy_from_user(tmp, buffer, count))2236sscanf(tmp, "%hhu %hhu", &fwdl_test_chksum_fail, &fwdl_test_wintint_rdy_fail);22372238return count;2239}22402241ssize_t proc_set_del_rx_ampdu_test_case(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)2242{2243char tmp[32];22442245if (count < 1)2246return -EFAULT;22472248if (count > sizeof(tmp)) {2249rtw_warn_on(1);2250return -EFAULT;2251}22522253if (buffer && !copy_from_user(tmp, buffer, count))2254sscanf(tmp, "%hhu", &del_rx_ampdu_test_no_tx_fail);22552256return count;2257}22582259ssize_t proc_set_wait_hiq_empty(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)2260{2261char tmp[32];22622263if (count < 1)2264return -EFAULT;22652266if (count > sizeof(tmp)) {2267rtw_warn_on(1);2268return -EFAULT;2269}22702271if (buffer && !copy_from_user(tmp, buffer, count))2272sscanf(tmp, "%u", &g_wait_hiq_empty_ms);22732274return count;2275}22762277ssize_t proc_set_sta_linking_test(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)2278{2279char tmp[32];22802281if (count < 1)2282return -EFAULT;22832284if (count > sizeof(tmp)) {2285rtw_warn_on(1);2286return -EFAULT;2287}22882289if (buffer && !copy_from_user(tmp, buffer, count)) {2290u32 wait_ms = 0;2291u8 force_fail = 0;2292int num = sscanf(tmp, "%u %hhu", &wait_ms, &force_fail);22932294if (num >= 1)2295sta_linking_test_wait_ms = wait_ms;2296if (num >= 2)2297sta_linking_test_force_fail = force_fail;2298}22992300return count;2301}23022303#ifdef CONFIG_AP_MODE2304ssize_t proc_set_ap_linking_test(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)2305{2306char tmp[32];23072308if (count < 1)2309return -EFAULT;23102311if (count > sizeof(tmp)) {2312rtw_warn_on(1);2313return -EFAULT;2314}23152316if (buffer && !copy_from_user(tmp, buffer, count)) {2317u16 force_auth_fail = 0;2318u16 force_asoc_fail = 0;2319int num = sscanf(tmp, "%hu %hu", &force_auth_fail, &force_asoc_fail);23202321if (num >= 1)2322ap_linking_test_force_auth_fail = force_auth_fail;2323if (num >= 2)2324ap_linking_test_force_asoc_fail = force_asoc_fail;2325}23262327return count;2328}2329#endif /* CONFIG_AP_MODE */23302331int proc_get_ps_dbg_info(struct seq_file *m, void *v)2332{2333struct net_device *dev = m->private;2334_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);2335struct dvobj_priv *dvobj = padapter->dvobj;2336struct debug_priv *pdbgpriv = &dvobj->drv_dbg;23372338RTW_PRINT_SEL(m, "dbg_sdio_alloc_irq_cnt=%d\n", pdbgpriv->dbg_sdio_alloc_irq_cnt);2339RTW_PRINT_SEL(m, "dbg_sdio_free_irq_cnt=%d\n", pdbgpriv->dbg_sdio_free_irq_cnt);2340RTW_PRINT_SEL(m, "dbg_sdio_alloc_irq_error_cnt=%d\n", pdbgpriv->dbg_sdio_alloc_irq_error_cnt);2341RTW_PRINT_SEL(m, "dbg_sdio_free_irq_error_cnt=%d\n", pdbgpriv->dbg_sdio_free_irq_error_cnt);2342RTW_PRINT_SEL(m, "dbg_sdio_init_error_cnt=%d\n", pdbgpriv->dbg_sdio_init_error_cnt);2343RTW_PRINT_SEL(m, "dbg_sdio_deinit_error_cnt=%d\n", pdbgpriv->dbg_sdio_deinit_error_cnt);2344RTW_PRINT_SEL(m, "dbg_suspend_error_cnt=%d\n", pdbgpriv->dbg_suspend_error_cnt);2345RTW_PRINT_SEL(m, "dbg_suspend_cnt=%d\n", pdbgpriv->dbg_suspend_cnt);2346RTW_PRINT_SEL(m, "dbg_resume_cnt=%d\n", pdbgpriv->dbg_resume_cnt);2347RTW_PRINT_SEL(m, "dbg_resume_error_cnt=%d\n", pdbgpriv->dbg_resume_error_cnt);2348RTW_PRINT_SEL(m, "dbg_deinit_fail_cnt=%d\n", pdbgpriv->dbg_deinit_fail_cnt);2349RTW_PRINT_SEL(m, "dbg_carddisable_cnt=%d\n", pdbgpriv->dbg_carddisable_cnt);2350RTW_PRINT_SEL(m, "dbg_ps_insuspend_cnt=%d\n", pdbgpriv->dbg_ps_insuspend_cnt);2351RTW_PRINT_SEL(m, "dbg_dev_unload_inIPS_cnt=%d\n", pdbgpriv->dbg_dev_unload_inIPS_cnt);2352RTW_PRINT_SEL(m, "dbg_scan_pwr_state_cnt=%d\n", pdbgpriv->dbg_scan_pwr_state_cnt);2353RTW_PRINT_SEL(m, "dbg_downloadfw_pwr_state_cnt=%d\n", pdbgpriv->dbg_downloadfw_pwr_state_cnt);2354RTW_PRINT_SEL(m, "dbg_carddisable_error_cnt=%d\n", pdbgpriv->dbg_carddisable_error_cnt);2355RTW_PRINT_SEL(m, "dbg_fw_read_ps_state_fail_cnt=%d\n", pdbgpriv->dbg_fw_read_ps_state_fail_cnt);2356RTW_PRINT_SEL(m, "dbg_leave_ips_fail_cnt=%d\n", pdbgpriv->dbg_leave_ips_fail_cnt);2357RTW_PRINT_SEL(m, "dbg_leave_lps_fail_cnt=%d\n", pdbgpriv->dbg_leave_lps_fail_cnt);2358RTW_PRINT_SEL(m, "dbg_h2c_leave32k_fail_cnt=%d\n", pdbgpriv->dbg_h2c_leave32k_fail_cnt);2359RTW_PRINT_SEL(m, "dbg_diswow_dload_fw_fail_cnt=%d\n", pdbgpriv->dbg_diswow_dload_fw_fail_cnt);2360RTW_PRINT_SEL(m, "dbg_enwow_dload_fw_fail_cnt=%d\n", pdbgpriv->dbg_enwow_dload_fw_fail_cnt);2361RTW_PRINT_SEL(m, "dbg_ips_drvopen_fail_cnt=%d\n", pdbgpriv->dbg_ips_drvopen_fail_cnt);2362RTW_PRINT_SEL(m, "dbg_poll_fail_cnt=%d\n", pdbgpriv->dbg_poll_fail_cnt);2363RTW_PRINT_SEL(m, "dbg_rpwm_toogle_cnt=%d\n", pdbgpriv->dbg_rpwm_toogle_cnt);2364RTW_PRINT_SEL(m, "dbg_rpwm_timeout_fail_cnt=%d\n", pdbgpriv->dbg_rpwm_timeout_fail_cnt);2365RTW_PRINT_SEL(m, "dbg_sreset_cnt=%d\n", pdbgpriv->dbg_sreset_cnt);2366RTW_PRINT_SEL(m, "dbg_fw_mem_dl_error_cnt=%d\n", pdbgpriv->dbg_fw_mem_dl_error_cnt);23672368return 0;2369}2370ssize_t proc_set_ps_dbg_info(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)2371{2372struct net_device *dev = data;2373_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);2374struct dvobj_priv *dvobj = adapter->dvobj;2375struct debug_priv *pdbgpriv = &dvobj->drv_dbg;2376char tmp[32];2377u8 ps_dbg_cmd_id;23782379if (count < 1)2380return -EFAULT;23812382if (count > sizeof(tmp)) {2383rtw_warn_on(1);2384return -EFAULT;2385}23862387if (buffer && !copy_from_user(tmp, buffer, count)) {23882389int num = sscanf(tmp, "%hhx", &ps_dbg_cmd_id);23902391if (num == 1 && ps_dbg_cmd_id == 1) /*Clean all*/2392_rtw_memset(pdbgpriv, 0, sizeof(struct debug_priv));23932394}23952396return count;2397}239823992400#ifdef CONFIG_DBG_COUNTER24012402int proc_get_rx_logs(struct seq_file *m, void *v)2403{2404struct net_device *dev = m->private;2405_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);2406struct rx_logs *rx_logs = &padapter->rx_logs;24072408RTW_PRINT_SEL(m,2409"intf_rx=%d\n"2410"intf_rx_err_recvframe=%d\n"2411"intf_rx_err_skb=%d\n"2412"intf_rx_report=%d\n"2413"core_rx=%d\n"2414"core_rx_pre=%d\n"2415"core_rx_pre_ver_err=%d\n"2416"core_rx_pre_mgmt=%d\n"2417"core_rx_pre_mgmt_err_80211w=%d\n"2418"core_rx_pre_mgmt_err=%d\n"2419"core_rx_pre_ctrl=%d\n"2420"core_rx_pre_ctrl_err=%d\n"2421"core_rx_pre_data=%d\n"2422"core_rx_pre_data_wapi_seq_err=%d\n"2423"core_rx_pre_data_wapi_key_err=%d\n"2424"core_rx_pre_data_handled=%d\n"2425"core_rx_pre_data_err=%d\n"2426"core_rx_pre_data_unknown=%d\n"2427"core_rx_pre_unknown=%d\n"2428"core_rx_enqueue=%d\n"2429"core_rx_dequeue=%d\n"2430"core_rx_post=%d\n"2431"core_rx_post_decrypt=%d\n"2432"core_rx_post_decrypt_wep=%d\n"2433"core_rx_post_decrypt_tkip=%d\n"2434"core_rx_post_decrypt_aes=%d\n"2435"core_rx_post_decrypt_wapi=%d\n"2436"core_rx_post_decrypt_hw=%d\n"2437"core_rx_post_decrypt_unknown=%d\n"2438"core_rx_post_decrypt_err=%d\n"2439"core_rx_post_defrag_err=%d\n"2440"core_rx_post_portctrl_err=%d\n"2441"core_rx_post_indicate=%d\n"2442"core_rx_post_indicate_in_oder=%d\n"2443"core_rx_post_indicate_reoder=%d\n"2444"core_rx_post_indicate_err=%d\n"2445"os_indicate=%d\n"2446"os_indicate_ap_mcast=%d\n"2447"os_indicate_ap_forward=%d\n"2448"os_indicate_ap_self=%d\n"2449"os_indicate_err=%d\n"2450"os_netif_ok=%d\n"2451"os_netif_err=%d\n",2452rx_logs->intf_rx,2453rx_logs->intf_rx_err_recvframe,2454rx_logs->intf_rx_err_skb,2455rx_logs->intf_rx_report,2456rx_logs->core_rx,2457rx_logs->core_rx_pre,2458rx_logs->core_rx_pre_ver_err,2459rx_logs->core_rx_pre_mgmt,2460rx_logs->core_rx_pre_mgmt_err_80211w,2461rx_logs->core_rx_pre_mgmt_err,2462rx_logs->core_rx_pre_ctrl,2463rx_logs->core_rx_pre_ctrl_err,2464rx_logs->core_rx_pre_data,2465rx_logs->core_rx_pre_data_wapi_seq_err,2466rx_logs->core_rx_pre_data_wapi_key_err,2467rx_logs->core_rx_pre_data_handled,2468rx_logs->core_rx_pre_data_err,2469rx_logs->core_rx_pre_data_unknown,2470rx_logs->core_rx_pre_unknown,2471rx_logs->core_rx_enqueue,2472rx_logs->core_rx_dequeue,2473rx_logs->core_rx_post,2474rx_logs->core_rx_post_decrypt,2475rx_logs->core_rx_post_decrypt_wep,2476rx_logs->core_rx_post_decrypt_tkip,2477rx_logs->core_rx_post_decrypt_aes,2478rx_logs->core_rx_post_decrypt_wapi,2479rx_logs->core_rx_post_decrypt_hw,2480rx_logs->core_rx_post_decrypt_unknown,2481rx_logs->core_rx_post_decrypt_err,2482rx_logs->core_rx_post_defrag_err,2483rx_logs->core_rx_post_portctrl_err,2484rx_logs->core_rx_post_indicate,2485rx_logs->core_rx_post_indicate_in_oder,2486rx_logs->core_rx_post_indicate_reoder,2487rx_logs->core_rx_post_indicate_err,2488rx_logs->os_indicate,2489rx_logs->os_indicate_ap_mcast,2490rx_logs->os_indicate_ap_forward,2491rx_logs->os_indicate_ap_self,2492rx_logs->os_indicate_err,2493rx_logs->os_netif_ok,2494rx_logs->os_netif_err2495);24962497return 0;2498}24992500int proc_get_tx_logs(struct seq_file *m, void *v)2501{2502struct net_device *dev = m->private;2503_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);2504struct tx_logs *tx_logs = &padapter->tx_logs;25052506RTW_PRINT_SEL(m,2507"os_tx=%d\n"2508"os_tx_err_up=%d\n"2509"os_tx_err_xmit=%d\n"2510"os_tx_m2u=%d\n"2511"os_tx_m2u_ignore_fw_linked=%d\n"2512"os_tx_m2u_ignore_self=%d\n"2513"os_tx_m2u_entry=%d\n"2514"os_tx_m2u_entry_err_xmit=%d\n"2515"os_tx_m2u_entry_err_skb=%d\n"2516"os_tx_m2u_stop=%d\n"2517"core_tx=%d\n"2518"core_tx_err_pxmitframe=%d\n"2519"core_tx_err_brtx=%d\n"2520"core_tx_upd_attrib=%d\n"2521"core_tx_upd_attrib_adhoc=%d\n"2522"core_tx_upd_attrib_sta=%d\n"2523"core_tx_upd_attrib_ap=%d\n"2524"core_tx_upd_attrib_unknown=%d\n"2525"core_tx_upd_attrib_dhcp=%d\n"2526"core_tx_upd_attrib_icmp=%d\n"2527"core_tx_upd_attrib_active=%d\n"2528"core_tx_upd_attrib_err_ucast_sta=%d\n"2529"core_tx_upd_attrib_err_ucast_ap_link=%d\n"2530"core_tx_upd_attrib_err_sta=%d\n"2531"core_tx_upd_attrib_err_link=%d\n"2532"core_tx_upd_attrib_err_sec=%d\n"2533"core_tx_ap_enqueue_warn_fwstate=%d\n"2534"core_tx_ap_enqueue_warn_sta=%d\n"2535"core_tx_ap_enqueue_warn_nosta=%d\n"2536"core_tx_ap_enqueue_warn_link=%d\n"2537"core_tx_ap_enqueue_warn_trigger=%d\n"2538"core_tx_ap_enqueue_mcast=%d\n"2539"core_tx_ap_enqueue_ucast=%d\n"2540"core_tx_ap_enqueue=%d\n"2541"intf_tx=%d\n"2542"intf_tx_pending_ac=%d\n"2543"intf_tx_pending_fw_under_survey=%d\n"2544"intf_tx_pending_fw_under_linking=%d\n"2545"intf_tx_pending_xmitbuf=%d\n"2546"intf_tx_enqueue=%d\n"2547"core_tx_enqueue=%d\n"2548"core_tx_enqueue_class=%d\n"2549"core_tx_enqueue_class_err_sta=%d\n"2550"core_tx_enqueue_class_err_nosta=%d\n"2551"core_tx_enqueue_class_err_fwlink=%d\n"2552"intf_tx_direct=%d\n"2553"intf_tx_direct_err_coalesce=%d\n"2554"intf_tx_dequeue=%d\n"2555"intf_tx_dequeue_err_coalesce=%d\n"2556"intf_tx_dump_xframe=%d\n"2557"intf_tx_dump_xframe_err_txdesc=%d\n"2558"intf_tx_dump_xframe_err_port=%d\n",2559tx_logs->os_tx,2560tx_logs->os_tx_err_up,2561tx_logs->os_tx_err_xmit,2562tx_logs->os_tx_m2u,2563tx_logs->os_tx_m2u_ignore_fw_linked,2564tx_logs->os_tx_m2u_ignore_self,2565tx_logs->os_tx_m2u_entry,2566tx_logs->os_tx_m2u_entry_err_xmit,2567tx_logs->os_tx_m2u_entry_err_skb,2568tx_logs->os_tx_m2u_stop,2569tx_logs->core_tx,2570tx_logs->core_tx_err_pxmitframe,2571tx_logs->core_tx_err_brtx,2572tx_logs->core_tx_upd_attrib,2573tx_logs->core_tx_upd_attrib_adhoc,2574tx_logs->core_tx_upd_attrib_sta,2575tx_logs->core_tx_upd_attrib_ap,2576tx_logs->core_tx_upd_attrib_unknown,2577tx_logs->core_tx_upd_attrib_dhcp,2578tx_logs->core_tx_upd_attrib_icmp,2579tx_logs->core_tx_upd_attrib_active,2580tx_logs->core_tx_upd_attrib_err_ucast_sta,2581tx_logs->core_tx_upd_attrib_err_ucast_ap_link,2582tx_logs->core_tx_upd_attrib_err_sta,2583tx_logs->core_tx_upd_attrib_err_link,2584tx_logs->core_tx_upd_attrib_err_sec,2585tx_logs->core_tx_ap_enqueue_warn_fwstate,2586tx_logs->core_tx_ap_enqueue_warn_sta,2587tx_logs->core_tx_ap_enqueue_warn_nosta,2588tx_logs->core_tx_ap_enqueue_warn_link,2589tx_logs->core_tx_ap_enqueue_warn_trigger,2590tx_logs->core_tx_ap_enqueue_mcast,2591tx_logs->core_tx_ap_enqueue_ucast,2592tx_logs->core_tx_ap_enqueue,2593tx_logs->intf_tx,2594tx_logs->intf_tx_pending_ac,2595tx_logs->intf_tx_pending_fw_under_survey,2596tx_logs->intf_tx_pending_fw_under_linking,2597tx_logs->intf_tx_pending_xmitbuf,2598tx_logs->intf_tx_enqueue,2599tx_logs->core_tx_enqueue,2600tx_logs->core_tx_enqueue_class,2601tx_logs->core_tx_enqueue_class_err_sta,2602tx_logs->core_tx_enqueue_class_err_nosta,2603tx_logs->core_tx_enqueue_class_err_fwlink,2604tx_logs->intf_tx_direct,2605tx_logs->intf_tx_direct_err_coalesce,2606tx_logs->intf_tx_dequeue,2607tx_logs->intf_tx_dequeue_err_coalesce,2608tx_logs->intf_tx_dump_xframe,2609tx_logs->intf_tx_dump_xframe_err_txdesc,2610tx_logs->intf_tx_dump_xframe_err_port2611);26122613return 0;2614}26152616int proc_get_int_logs(struct seq_file *m, void *v)2617{2618struct net_device *dev = m->private;2619_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);26202621RTW_PRINT_SEL(m,2622"all=%d\n"2623"err=%d\n"2624"tbdok=%d\n"2625"tbder=%d\n"2626"bcnderr=%d\n"2627"bcndma=%d\n"2628"bcndma_e=%d\n"2629"rx=%d\n"2630"rx_rdu=%d\n"2631"rx_fovw=%d\n"2632"txfovw=%d\n"2633"mgntok=%d\n"2634"highdok=%d\n"2635"bkdok=%d\n"2636"bedok=%d\n"2637"vidok=%d\n"2638"vodok=%d\n",2639padapter->int_logs.all,2640padapter->int_logs.err,2641padapter->int_logs.tbdok,2642padapter->int_logs.tbder,2643padapter->int_logs.bcnderr,2644padapter->int_logs.bcndma,2645padapter->int_logs.bcndma_e,2646padapter->int_logs.rx,2647padapter->int_logs.rx_rdu,2648padapter->int_logs.rx_fovw,2649padapter->int_logs.txfovw,2650padapter->int_logs.mgntok,2651padapter->int_logs.highdok,2652padapter->int_logs.bkdok,2653padapter->int_logs.bedok,2654padapter->int_logs.vidok,2655padapter->int_logs.vodok2656);26572658return 0;2659}26602661#endif /* CONFIG_DBG_COUNTER */26622663int proc_get_hw_status(struct seq_file *m, void *v)2664{2665struct net_device *dev = m->private;2666_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);2667struct dvobj_priv *dvobj = padapter->dvobj;2668struct debug_priv *pdbgpriv = &dvobj->drv_dbg;2669struct registry_priv *regsty = dvobj_to_regsty(dvobj);26702671if (regsty->check_hw_status == 0)2672RTW_PRINT_SEL(m, "RX FIFO full count: not check in watch dog\n");2673else if (pdbgpriv->dbg_rx_fifo_last_overflow == 12674&& pdbgpriv->dbg_rx_fifo_curr_overflow == 12675&& pdbgpriv->dbg_rx_fifo_diff_overflow == 12676)2677RTW_PRINT_SEL(m, "RX FIFO full count: no implementation\n");2678else {2679RTW_PRINT_SEL(m, "RX FIFO full count: last_time=%llu, current_time=%llu, differential=%llu\n"2680, pdbgpriv->dbg_rx_fifo_last_overflow, pdbgpriv->dbg_rx_fifo_curr_overflow, pdbgpriv->dbg_rx_fifo_diff_overflow);2681}26822683return 0;2684}26852686ssize_t proc_set_hw_status(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)2687{2688struct net_device *dev = data;2689_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);2690struct dvobj_priv *dvobj = padapter->dvobj;2691struct registry_priv *regsty = dvobj_to_regsty(dvobj);2692char tmp[32];2693u32 enable;26942695if (count < 1)2696return -EFAULT;26972698if (count > sizeof(tmp)) {2699rtw_warn_on(1);2700return -EFAULT;2701}27022703if (buffer && !copy_from_user(tmp, buffer, count)) {27042705int num = sscanf(tmp, "%d ", &enable);27062707if (num == 1 && regsty && enable <= 1) {2708regsty->check_hw_status = enable;2709RTW_INFO("check_hw_status=%d\n", regsty->check_hw_status);2710}2711}27122713return count;2714}27152716#ifdef CONFIG_HUAWEI_PROC2717int proc_get_huawei_trx_info(struct seq_file *sel, void *v)2718{2719struct net_device *dev = sel->private;2720_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);2721struct dm_struct *dm = adapter_to_phydm(padapter);2722struct sta_info *psta;2723struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);2724struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);2725struct ra_sta_info *ra_info;2726u8 curr_tx_sgi = _FALSE;2727u8 curr_tx_rate = 0;2728u8 mac_id;2729#ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA2730u8 isCCKrate, rf_path;2731PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);2732struct rx_raw_rssi *psample_pkt_rssi = &padapter->recvpriv.raw_rssi_info;2733#endif27342735if (!dm->is_linked) {2736RTW_PRINT_SEL(sel, "NO link\n\n");2737return 0;2738}27392740/*============ tx info ============ */2741for (mac_id = 0; mac_id < macid_ctl->num; mac_id++) {2742if (rtw_macid_is_used(macid_ctl, mac_id) && !rtw_macid_is_bmc(macid_ctl, mac_id)) {2743psta = macid_ctl->sta[mac_id];2744if (!psta)2745continue;27462747RTW_PRINT_SEL(sel, "STA [" MAC_FMT "]\n", MAC_ARG(psta->cmn.mac_addr));27482749ra_info = &psta->cmn.ra_info;2750curr_tx_sgi = rtw_get_current_tx_sgi(padapter, psta);2751curr_tx_rate = rtw_get_current_tx_rate(padapter, psta);2752RTW_PRINT_SEL(sel, "curr_tx_rate : %s (%s)\n",2753HDATA_RATE(curr_tx_rate), (curr_tx_sgi) ? "S" : "L");2754RTW_PRINT_SEL(sel, "curr_tx_bw : %s\n", ch_width_str(ra_info->curr_tx_bw));2755}2756}27572758/*============ rx info ============ */2759RTW_PRINT_SEL(sel, "rx_rate : %s\n", HDATA_RATE(dm->rx_rate));2760#ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA2761isCCKrate = (psample_pkt_rssi->data_rate <= DESC_RATE11M) ? TRUE : FALSE;27622763for (rf_path = 0; rf_path < pHalData->NumTotalRFPath; rf_path++) {2764if (!isCCKrate)2765_RTW_PRINT_SEL(sel , "RF_PATH_%d : rx_ofdm_pwr:%d(dBm), rx_ofdm_snr:%d(dB)\n",2766rf_path, psample_pkt_rssi->ofdm_pwr[rf_path], psample_pkt_rssi->ofdm_snr[rf_path]);2767}2768#endif2769RTW_PRINT_SEL(sel, "\n");2770return 0;2771}2772#endif /* CONFIG_HUAWEI_PROC */27732774int proc_get_trx_info_debug(struct seq_file *m, void *v)2775{2776struct net_device *dev = m->private;2777_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);27782779/*============ tx info ============ */2780rtw_hal_get_def_var(padapter, HW_DEF_RA_INFO_DUMP, m);27812782/*============ rx info ============ */2783rtw_hal_set_odm_var(padapter, HAL_ODM_RX_INFO_DUMP, m, _FALSE);27842785return 0;2786}27872788int proc_get_rx_signal(struct seq_file *m, void *v)2789{2790struct net_device *dev = m->private;2791_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);27922793RTW_PRINT_SEL(m, "rssi:%d\n", padapter->recvpriv.rssi);2794#ifdef CONFIG_MP_INCLUDED2795if (padapter->registrypriv.mp_mode == 1) {2796struct dm_struct *odm = adapter_to_phydm(padapter);2797if (padapter->mppriv.antenna_rx == ANTENNA_A)2798RTW_PRINT_SEL(m, "Antenna: A\n");2799else if (padapter->mppriv.antenna_rx == ANTENNA_B)2800RTW_PRINT_SEL(m, "Antenna: B\n");2801else if (padapter->mppriv.antenna_rx == ANTENNA_C)2802RTW_PRINT_SEL(m, "Antenna: C\n");2803else if (padapter->mppriv.antenna_rx == ANTENNA_D)2804RTW_PRINT_SEL(m, "Antenna: D\n");2805else if (padapter->mppriv.antenna_rx == ANTENNA_AB)2806RTW_PRINT_SEL(m, "Antenna: AB\n");2807else if (padapter->mppriv.antenna_rx == ANTENNA_BC)2808RTW_PRINT_SEL(m, "Antenna: BC\n");2809else if (padapter->mppriv.antenna_rx == ANTENNA_CD)2810RTW_PRINT_SEL(m, "Antenna: CD\n");2811else2812RTW_PRINT_SEL(m, "Antenna: __\n");28132814RTW_PRINT_SEL(m, "rx_rate = %s\n", HDATA_RATE(odm->rx_rate));2815return 0;2816} else2817#endif2818{2819/* RTW_PRINT_SEL(m, "rxpwdb:%d\n", padapter->recvpriv.rxpwdb); */2820RTW_PRINT_SEL(m, "signal_strength:%u\n", padapter->recvpriv.signal_strength);2821RTW_PRINT_SEL(m, "signal_qual:%u\n", padapter->recvpriv.signal_qual);2822}2823#ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA2824rtw_odm_get_perpkt_rssi(m, padapter);2825rtw_get_raw_rssi_info(m, padapter);2826#endif2827return 0;2828}28292830ssize_t proc_set_rx_signal(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)2831{2832struct net_device *dev = data;2833_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);2834char tmp[32];2835u32 is_signal_dbg, signal_strength;28362837if (count < 1)2838return -EFAULT;28392840if (count > sizeof(tmp)) {2841rtw_warn_on(1);2842return -EFAULT;2843}28442845if (buffer && !copy_from_user(tmp, buffer, count)) {28462847int num = sscanf(tmp, "%u %u", &is_signal_dbg, &signal_strength);28482849if (num < 1)2850return count;28512852is_signal_dbg = is_signal_dbg == 0 ? 0 : 1;28532854if (is_signal_dbg && num < 2)2855return count;28562857signal_strength = signal_strength > 100 ? 100 : signal_strength;28582859padapter->recvpriv.is_signal_dbg = is_signal_dbg;2860padapter->recvpriv.signal_strength_dbg = signal_strength;28612862if (is_signal_dbg)2863RTW_INFO("set %s %u\n", "DBG_SIGNAL_STRENGTH", signal_strength);2864else2865RTW_INFO("set %s\n", "HW_SIGNAL_STRENGTH");28662867}28682869return count;28702871}28722873int proc_get_mac_rptbuf(struct seq_file *m, void *v)2874{2875#ifdef CONFIG_RTL8814A2876struct net_device *dev = m->private;2877_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);2878u16 i;2879u16 mac_id;2880u32 shcut_addr = 0;2881u32 read_addr = 0;28822883RTW_PRINT_SEL(m, "TX ShortCut:\n");2884for (mac_id = 0; mac_id < 64; mac_id++) {2885rtw_write16(padapter, 0x140, 0x662 | ((mac_id & BIT5) >> 5));2886shcut_addr = 0x8000;2887shcut_addr = shcut_addr | ((mac_id & 0x1f) << 7);2888RTW_PRINT_SEL(m, "mac_id=%d, 0x140=%x =>\n", mac_id, 0x662 | ((mac_id & BIT5) >> 5));2889for (i = 0; i < 30; i++) {2890read_addr = 0;2891read_addr = shcut_addr | (i << 2);2892RTW_PRINT_SEL(m, "i=%02d: MAC_%04x= %08x ", i, read_addr, rtw_read32(padapter, read_addr));2893if (!((i + 1) % 4))2894RTW_PRINT_SEL(m, "\n");2895if (i == 29)2896RTW_PRINT_SEL(m, "\n");2897}2898}2899#endif /* CONFIG_RTL8814A */2900return 0;2901}29022903#ifdef CONFIG_80211N_HT29042905int proc_get_ht_enable(struct seq_file *m, void *v)2906{2907struct net_device *dev = m->private;2908_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);2909struct registry_priv *pregpriv = &padapter->registrypriv;29102911if (pregpriv)2912RTW_PRINT_SEL(m, "%d\n", pregpriv->ht_enable);29132914return 0;2915}29162917ssize_t proc_set_ht_enable(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)2918{2919struct net_device *dev = data;2920_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);2921struct registry_priv *pregpriv = &padapter->registrypriv;2922char tmp[32];2923u32 mode;29242925if (count < 1)2926return -EFAULT;29272928if (count > sizeof(tmp)) {2929rtw_warn_on(1);2930return -EFAULT;2931}29322933if (buffer && !copy_from_user(tmp, buffer, count)) {29342935int num = sscanf(tmp, "%d ", &mode);29362937if ( num == 1 && pregpriv && mode < 2) {2938pregpriv->ht_enable = mode;2939RTW_INFO("ht_enable=%d\n", pregpriv->ht_enable);2940}2941}29422943return count;29442945}29462947int proc_get_bw_mode(struct seq_file *m, void *v)2948{2949struct net_device *dev = m->private;2950_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);2951struct registry_priv *pregpriv = &padapter->registrypriv;29522953if (pregpriv)2954RTW_PRINT_SEL(m, "0x%02x\n", pregpriv->bw_mode);29552956return 0;2957}29582959ssize_t proc_set_bw_mode(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)2960{2961struct net_device *dev = data;2962_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);2963struct registry_priv *pregpriv = &padapter->registrypriv;2964char tmp[32];2965u32 mode;2966u8 bw_2g;2967u8 bw_5g;29682969if (count < 1)2970return -EFAULT;29712972if (count > sizeof(tmp)) {2973rtw_warn_on(1);2974return -EFAULT;2975}29762977if (buffer && !copy_from_user(tmp, buffer, count)) {29782979int num = sscanf(tmp, "%x ", &mode);2980bw_5g = mode >> 4;2981bw_2g = mode & 0x0f;29822983if (num == 1 && pregpriv && bw_2g <= 4 && bw_5g <= 4) {2984pregpriv->bw_mode = mode;2985printk("bw_mode=0x%x\n", mode);2986}2987}29882989return count;29902991}29922993int proc_get_ampdu_enable(struct seq_file *m, void *v)2994{2995struct net_device *dev = m->private;2996_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);2997struct registry_priv *pregpriv = &padapter->registrypriv;29982999if (pregpriv)3000RTW_PRINT_SEL(m, "%d\n", pregpriv->ampdu_enable);30013002return 0;3003}30043005ssize_t proc_set_ampdu_enable(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)3006{3007struct net_device *dev = data;3008_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);3009struct registry_priv *pregpriv = &padapter->registrypriv;3010char tmp[32];3011u32 mode;30123013if (count < 1)3014return -EFAULT;30153016if (count > sizeof(tmp)) {3017rtw_warn_on(1);3018return -EFAULT;3019}30203021if (buffer && !copy_from_user(tmp, buffer, count)) {30223023int num = sscanf(tmp, "%d ", &mode);30243025if (num == 1 && pregpriv && mode < 2) {3026pregpriv->ampdu_enable = mode;3027printk("ampdu_enable=%d\n", mode);3028}30293030}30313032return count;30333034}303530363037void dump_regsty_rx_ampdu_size_limit(void *sel, _adapter *adapter)3038{3039struct registry_priv *regsty = adapter_to_regsty(adapter);3040int i;30413042RTW_PRINT_SEL(sel, "%-3s %-3s %-3s %-3s %-4s\n"3043, "", "20M", "40M", "80M", "160M");3044for (i = 0; i < 4; i++)3045RTW_PRINT_SEL(sel, "%dSS %3u %3u %3u %4u\n", i + 13046, regsty->rx_ampdu_sz_limit_by_nss_bw[i][0]3047, regsty->rx_ampdu_sz_limit_by_nss_bw[i][1]3048, regsty->rx_ampdu_sz_limit_by_nss_bw[i][2]3049, regsty->rx_ampdu_sz_limit_by_nss_bw[i][3]);3050}30513052int proc_get_rx_ampdu(struct seq_file *m, void *v)3053{3054struct net_device *dev = m->private;3055_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);30563057_RTW_PRINT_SEL(m, "accept: ");3058if (padapter->fix_rx_ampdu_accept == RX_AMPDU_ACCEPT_INVALID)3059RTW_PRINT_SEL(m, "%u%s\n", rtw_rx_ampdu_is_accept(padapter), "(auto)");3060else3061RTW_PRINT_SEL(m, "%u%s\n", padapter->fix_rx_ampdu_accept, "(fixed)");30623063_RTW_PRINT_SEL(m, "size: ");3064if (padapter->fix_rx_ampdu_size == RX_AMPDU_SIZE_INVALID) {3065RTW_PRINT_SEL(m, "%u%s\n", rtw_rx_ampdu_size(padapter), "(auto) with conditional limit:");3066dump_regsty_rx_ampdu_size_limit(m, padapter);3067} else3068RTW_PRINT_SEL(m, "%u%s\n", padapter->fix_rx_ampdu_size, "(fixed)");3069RTW_PRINT_SEL(m, "\n");30703071RTW_PRINT_SEL(m, "%19s %17s\n", "fix_rx_ampdu_accept", "fix_rx_ampdu_size");30723073_RTW_PRINT_SEL(m, "%-19d %-17u\n"3074, padapter->fix_rx_ampdu_accept3075, padapter->fix_rx_ampdu_size);30763077return 0;3078}30793080ssize_t proc_set_rx_ampdu(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)3081{3082struct net_device *dev = data;3083_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);3084char tmp[32];3085u8 accept;3086u8 size;30873088if (count < 1)3089return -EFAULT;30903091if (count > sizeof(tmp)) {3092rtw_warn_on(1);3093return -EFAULT;3094}30953096if (buffer && !copy_from_user(tmp, buffer, count)) {30973098int num = sscanf(tmp, "%hhu %hhu", &accept, &size);30993100if (num >= 1)3101rtw_rx_ampdu_set_accept(padapter, accept, RX_AMPDU_DRV_FIXED);3102if (num >= 2)3103rtw_rx_ampdu_set_size(padapter, size, RX_AMPDU_DRV_FIXED);31043105rtw_rx_ampdu_apply(padapter);3106}31073108return count;3109}31103111int proc_get_rx_ampdu_factor(struct seq_file *m, void *v)3112{3113struct net_device *dev = m->private;3114_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);311531163117if (padapter)3118RTW_PRINT_SEL(m, "rx ampdu factor = %x\n", padapter->driver_rx_ampdu_factor);31193120return 0;3121}31223123ssize_t proc_set_rx_ampdu_factor(struct file *file, const char __user *buffer3124, size_t count, loff_t *pos, void *data)3125{3126struct net_device *dev = data;3127_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);3128char tmp[32];3129u32 factor;31303131if (count < 1)3132return -EFAULT;31333134if (count > sizeof(tmp)) {3135rtw_warn_on(1);3136return -EFAULT;3137}31383139if (buffer && !copy_from_user(tmp, buffer, count)) {31403141int num = sscanf(tmp, "%d ", &factor);31423143if (padapter && (num == 1)) {3144RTW_INFO("padapter->driver_rx_ampdu_factor = %x\n", factor);31453146if (factor > 0x03)3147padapter->driver_rx_ampdu_factor = 0xFF;3148else3149padapter->driver_rx_ampdu_factor = factor;3150}3151}31523153return count;3154}31553156int proc_get_tx_max_agg_num(struct seq_file *m, void *v)3157{3158struct net_device *dev = m->private;3159_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);316031613162if (padapter)3163RTW_PRINT_SEL(m, "tx max AMPDU num = 0x%02x\n", padapter->driver_tx_max_agg_num);31643165return 0;3166}31673168ssize_t proc_set_tx_max_agg_num(struct file *file, const char __user *buffer3169, size_t count, loff_t *pos, void *data)3170{3171struct net_device *dev = data;3172_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);3173char tmp[32];3174u8 agg_num;31753176if (count < 1)3177return -EFAULT;31783179if (count > sizeof(tmp)) {3180rtw_warn_on(1);3181return -EFAULT;3182}31833184if (buffer && !copy_from_user(tmp, buffer, count)) {31853186int num = sscanf(tmp, "%hhx ", &agg_num);31873188if (padapter && (num == 1)) {3189RTW_INFO("padapter->driver_tx_max_agg_num = 0x%02x\n", agg_num);31903191padapter->driver_tx_max_agg_num = agg_num;3192}3193}31943195return count;3196}31973198int proc_get_rx_ampdu_density(struct seq_file *m, void *v)3199{3200struct net_device *dev = m->private;3201_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);320232033204if (padapter)3205RTW_PRINT_SEL(m, "rx ampdu densityg = %x\n", padapter->driver_rx_ampdu_spacing);32063207return 0;3208}32093210ssize_t proc_set_rx_ampdu_density(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)3211{3212struct net_device *dev = data;3213_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);3214char tmp[32];3215u32 density;32163217if (count < 1)3218return -EFAULT;32193220if (count > sizeof(tmp)) {3221rtw_warn_on(1);3222return -EFAULT;3223}32243225if (buffer && !copy_from_user(tmp, buffer, count)) {32263227int num = sscanf(tmp, "%d ", &density);32283229if (padapter && (num == 1)) {3230RTW_INFO("padapter->driver_rx_ampdu_spacing = %x\n", density);32313232if (density > 0x07)3233padapter->driver_rx_ampdu_spacing = 0xFF;3234else3235padapter->driver_rx_ampdu_spacing = density;3236}3237}32383239return count;3240}32413242int proc_get_tx_ampdu_density(struct seq_file *m, void *v)3243{3244struct net_device *dev = m->private;3245_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);324632473248if (padapter)3249RTW_PRINT_SEL(m, "tx ampdu density = %x\n", padapter->driver_ampdu_spacing);32503251return 0;3252}32533254ssize_t proc_set_tx_ampdu_density(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)3255{3256struct net_device *dev = data;3257_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);3258char tmp[32];3259u32 density;32603261if (count < 1)3262return -EFAULT;32633264if (count > sizeof(tmp)) {3265rtw_warn_on(1);3266return -EFAULT;3267}32683269if (buffer && !copy_from_user(tmp, buffer, count)) {32703271int num = sscanf(tmp, "%d ", &density);32723273if (padapter && (num == 1)) {3274RTW_INFO("padapter->driver_ampdu_spacing = %x\n", density);32753276if (density > 0x07)3277padapter->driver_ampdu_spacing = 0xFF;3278else3279padapter->driver_ampdu_spacing = density;3280}3281}32823283return count;3284}32853286#ifdef CONFIG_TX_AMSDU3287int proc_get_tx_amsdu(struct seq_file *m, void *v)3288{3289struct net_device *dev = m->private;3290_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);3291struct xmit_priv *pxmitpriv = &padapter->xmitpriv;32923293if (padapter)3294{3295RTW_PRINT_SEL(m, "tx amsdu = %d\n", padapter->tx_amsdu);3296RTW_PRINT_SEL(m, "amsdu set timer conut = %u\n", pxmitpriv->amsdu_debug_set_timer);3297RTW_PRINT_SEL(m, "amsdu time out count = %u\n", pxmitpriv->amsdu_debug_timeout);3298RTW_PRINT_SEL(m, "amsdu coalesce one count = %u\n", pxmitpriv->amsdu_debug_coalesce_one);3299RTW_PRINT_SEL(m, "amsdu coalesce two count = %u\n", pxmitpriv->amsdu_debug_coalesce_two);3300}33013302return 0;3303}33043305ssize_t proc_set_tx_amsdu(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)3306{3307struct net_device *dev = data;3308_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);3309struct xmit_priv *pxmitpriv = &padapter->xmitpriv;3310char tmp[32];3311u32 amsdu;33123313if (count < 1)3314return -EFAULT;33153316if (count > sizeof(tmp)) {3317rtw_warn_on(1);3318return -EFAULT;3319}33203321if (buffer && !copy_from_user(tmp, buffer, count)) {33223323int num = sscanf(tmp, "%d ", &amsdu);33243325if (padapter && (num == 1)) {3326RTW_INFO("padapter->tx_amsdu = %x\n", amsdu);33273328if (amsdu > 3)3329padapter->tx_amsdu = 0;3330else if(amsdu == 3)3331{3332pxmitpriv->amsdu_debug_set_timer = 0;3333pxmitpriv->amsdu_debug_timeout = 0;3334pxmitpriv->amsdu_debug_coalesce_one = 0;3335pxmitpriv->amsdu_debug_coalesce_two = 0;3336}3337else3338padapter->tx_amsdu = amsdu;3339}3340}33413342return count;3343}33443345int proc_get_tx_amsdu_rate(struct seq_file *m, void *v)3346{3347struct net_device *dev = m->private;3348_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);33493350if (padapter)3351RTW_PRINT_SEL(m, "tx amsdu rate = %d Mbps\n", padapter->tx_amsdu_rate);33523353return 0;3354}33553356ssize_t proc_set_tx_amsdu_rate(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)3357{3358struct net_device *dev = data;3359_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);3360char tmp[32];3361u32 amsdu_rate;33623363if (count < 1)3364return -EFAULT;33653366if (count > sizeof(tmp)) {3367rtw_warn_on(1);3368return -EFAULT;3369}33703371if (buffer && !copy_from_user(tmp, buffer, count)) {33723373int num = sscanf(tmp, "%d ", &amsdu_rate);33743375if (padapter && (num == 1)) {3376RTW_INFO("padapter->tx_amsdu_rate = %x\n", amsdu_rate);3377padapter->tx_amsdu_rate = amsdu_rate;3378}3379}33803381return count;3382}3383#endif /* CONFIG_TX_AMSDU */3384#endif /* CONFIG_80211N_HT */33853386int proc_get_en_fwps(struct seq_file *m, void *v)3387{3388struct net_device *dev = m->private;3389_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);3390struct registry_priv *pregpriv = &padapter->registrypriv;33913392if (pregpriv)3393RTW_PRINT_SEL(m, "check_fw_ps = %d , 1:enable get FW PS state , 0: disable get FW PS state\n"3394, pregpriv->check_fw_ps);33953396return 0;3397}33983399ssize_t proc_set_en_fwps(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)3400{3401struct net_device *dev = data;3402_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);3403struct registry_priv *pregpriv = &padapter->registrypriv;3404char tmp[32];3405u32 mode;34063407if (count < 1)3408return -EFAULT;34093410if (count > sizeof(tmp)) {3411rtw_warn_on(1);3412return -EFAULT;3413}34143415if (buffer && !copy_from_user(tmp, buffer, count)) {34163417int num = sscanf(tmp, "%d ", &mode);34183419if (num == 1 && pregpriv && mode < 2) {3420pregpriv->check_fw_ps = mode;3421RTW_INFO("pregpriv->check_fw_ps=%d\n", pregpriv->check_fw_ps);3422}34233424}34253426return count;3427}34283429/*3430int proc_get_two_path_rssi(struct seq_file *m, void *v)3431{3432struct net_device *dev = m->private;3433_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);34343435if(padapter)3436RTW_PRINT_SEL(m, "%d %d\n",3437padapter->recvpriv.RxRssi[0], padapter->recvpriv.RxRssi[1]);34383439return 0;3440}3441*/3442#ifdef CONFIG_80211N_HT3443void rtw_dump_dft_phy_cap(void *sel, _adapter *adapter)3444{3445struct mlme_priv *pmlmepriv = &adapter->mlmepriv;3446struct ht_priv *phtpriv = &pmlmepriv->htpriv;3447#ifdef CONFIG_80211AC_VHT3448struct vht_priv *pvhtpriv = &pmlmepriv->vhtpriv;3449#endif34503451#ifdef CONFIG_80211AC_VHT3452RTW_PRINT_SEL(sel, "[DFT CAP] VHT STBC Tx : %s\n", (TEST_FLAG(pvhtpriv->stbc_cap, STBC_VHT_ENABLE_TX)) ? "V" : "X");3453RTW_PRINT_SEL(sel, "[DFT CAP] VHT STBC Rx : %s\n", (TEST_FLAG(pvhtpriv->stbc_cap, STBC_VHT_ENABLE_RX)) ? "V" : "X");3454#endif3455RTW_PRINT_SEL(sel, "[DFT CAP] HT STBC Tx : %s\n", (TEST_FLAG(phtpriv->stbc_cap, STBC_HT_ENABLE_TX)) ? "V" : "X");3456RTW_PRINT_SEL(sel, "[DFT CAP] HT STBC Rx : %s\n\n", (TEST_FLAG(phtpriv->stbc_cap, STBC_HT_ENABLE_RX)) ? "V" : "X");34573458#ifdef CONFIG_80211AC_VHT3459RTW_PRINT_SEL(sel, "[DFT CAP] VHT LDPC Tx : %s\n", (TEST_FLAG(pvhtpriv->ldpc_cap, LDPC_VHT_ENABLE_TX)) ? "V" : "X");3460RTW_PRINT_SEL(sel, "[DFT CAP] VHT LDPC Rx : %s\n", (TEST_FLAG(pvhtpriv->ldpc_cap, LDPC_VHT_ENABLE_RX)) ? "V" : "X");3461#endif3462RTW_PRINT_SEL(sel, "[DFT CAP] HT LDPC Tx : %s\n", (TEST_FLAG(phtpriv->ldpc_cap, LDPC_HT_ENABLE_TX)) ? "V" : "X");3463RTW_PRINT_SEL(sel, "[DFT CAP] HT LDPC Rx : %s\n\n", (TEST_FLAG(phtpriv->ldpc_cap, LDPC_HT_ENABLE_RX)) ? "V" : "X");34643465#ifdef CONFIG_BEAMFORMING3466#ifdef CONFIG_80211AC_VHT3467RTW_PRINT_SEL(sel, "[DFT CAP] VHT MU Bfer : %s\n", (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_MU_MIMO_AP_ENABLE)) ? "V" : "X");3468RTW_PRINT_SEL(sel, "[DFT CAP] VHT MU Bfee : %s\n", (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_MU_MIMO_STA_ENABLE)) ? "V" : "X");3469RTW_PRINT_SEL(sel, "[DFT CAP] VHT SU Bfer : %s\n", (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE)) ? "V" : "X");3470RTW_PRINT_SEL(sel, "[DFT CAP] VHT SU Bfee : %s\n", (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMEE_ENABLE)) ? "V" : "X");3471#endif3472RTW_PRINT_SEL(sel, "[DFT CAP] HT Bfer : %s\n", (TEST_FLAG(phtpriv->beamform_cap, BEAMFORMING_HT_BEAMFORMER_ENABLE)) ? "V" : "X");3473RTW_PRINT_SEL(sel, "[DFT CAP] HT Bfee : %s\n", (TEST_FLAG(phtpriv->beamform_cap, BEAMFORMING_HT_BEAMFORMEE_ENABLE)) ? "V" : "X");3474#endif3475}34763477void rtw_get_dft_phy_cap(void *sel, _adapter *adapter)3478{3479RTW_PRINT_SEL(sel, "\n ======== PHY CAP protocol ========\n");3480rtw_ht_use_default_setting(adapter);3481#ifdef CONFIG_80211AC_VHT3482rtw_vht_use_default_setting(adapter);3483#endif3484#ifdef CONFIG_80211N_HT3485rtw_dump_dft_phy_cap(sel, adapter);3486#endif3487}34883489void rtw_dump_drv_phy_cap(void *sel, _adapter *adapter)3490{3491struct registry_priv *pregistry_priv = &adapter->registrypriv;34923493RTW_PRINT_SEL(sel, "\n ======== DRV's configuration ========\n");3494#if 03495RTW_PRINT_SEL(sel, "[DRV CAP] TRx Capability : 0x%08x\n", phy_spec->trx_cap);3496RTW_PRINT_SEL(sel, "[DRV CAP] Tx Stream Num Index : %d\n", (phy_spec->trx_cap >> 24) & 0xFF); /*Tx Stream Num Index [31:24]*/3497RTW_PRINT_SEL(sel, "[DRV CAP] Rx Stream Num Index : %d\n", (phy_spec->trx_cap >> 16) & 0xFF); /*Rx Stream Num Index [23:16]*/3498RTW_PRINT_SEL(sel, "[DRV CAP] Tx Path Num Index : %d\n", (phy_spec->trx_cap >> 8) & 0xFF);/*Tx Path Num Index [15:8]*/3499RTW_PRINT_SEL(sel, "[DRV CAP] Rx Path Num Index : %d\n", (phy_spec->trx_cap & 0xFF));/*Rx Path Num Index [7:0]*/3500#endif3501#ifdef CONFIG_80211N_HT3502RTW_PRINT_SEL(sel, "[DRV CAP] STBC Capability : 0x%02x\n", pregistry_priv->stbc_cap);3503RTW_PRINT_SEL(sel, "[DRV CAP] VHT STBC Tx : %s\n", (TEST_FLAG(pregistry_priv->stbc_cap, BIT1)) ? "V" : "X"); /*BIT1: Enable VHT STBC Tx*/3504RTW_PRINT_SEL(sel, "[DRV CAP] VHT STBC Rx : %s\n", (TEST_FLAG(pregistry_priv->stbc_cap, BIT0)) ? "V" : "X"); /*BIT0: Enable VHT STBC Rx*/3505RTW_PRINT_SEL(sel, "[DRV CAP] HT STBC Tx : %s\n", (TEST_FLAG(pregistry_priv->stbc_cap, BIT5)) ? "V" : "X"); /*BIT5: Enable HT STBC Tx*/3506RTW_PRINT_SEL(sel, "[DRV CAP] HT STBC Rx : %s\n\n", (TEST_FLAG(pregistry_priv->stbc_cap, BIT4)) ? "V" : "X"); /*BIT4: Enable HT STBC Rx*/35073508RTW_PRINT_SEL(sel, "[DRV CAP] LDPC Capability : 0x%02x\n", pregistry_priv->ldpc_cap);3509RTW_PRINT_SEL(sel, "[DRV CAP] VHT LDPC Tx : %s\n", (TEST_FLAG(pregistry_priv->ldpc_cap, BIT1)) ? "V" : "X"); /*BIT1: Enable VHT LDPC Tx*/3510RTW_PRINT_SEL(sel, "[DRV CAP] VHT LDPC Rx : %s\n", (TEST_FLAG(pregistry_priv->ldpc_cap, BIT0)) ? "V" : "X"); /*BIT0: Enable VHT LDPC Rx*/3511RTW_PRINT_SEL(sel, "[DRV CAP] HT LDPC Tx : %s\n", (TEST_FLAG(pregistry_priv->ldpc_cap, BIT5)) ? "V" : "X"); /*BIT5: Enable HT LDPC Tx*/3512RTW_PRINT_SEL(sel, "[DRV CAP] HT LDPC Rx : %s\n\n", (TEST_FLAG(pregistry_priv->ldpc_cap, BIT4)) ? "V" : "X"); /*BIT4: Enable HT LDPC Rx*/3513#endif /* CONFIG_80211N_HT */3514#ifdef CONFIG_BEAMFORMING3515#if 03516RTW_PRINT_SEL(sel, "[DRV CAP] TxBF parameter : 0x%08x\n", phy_spec->txbf_param);3517RTW_PRINT_SEL(sel, "[DRV CAP] VHT Sounding Dim : %d\n", (phy_spec->txbf_param >> 24) & 0xFF); /*VHT Sounding Dim [31:24]*/3518RTW_PRINT_SEL(sel, "[DRV CAP] VHT Steering Ant : %d\n", (phy_spec->txbf_param >> 16) & 0xFF); /*VHT Steering Ant [23:16]*/3519RTW_PRINT_SEL(sel, "[DRV CAP] HT Sounding Dim : %d\n", (phy_spec->txbf_param >> 8) & 0xFF); /*HT Sounding Dim [15:8]*/3520RTW_PRINT_SEL(sel, "[DRV CAP] HT Steering Ant : %d\n", phy_spec->txbf_param & 0xFF); /*HT Steering Ant [7:0]*/3521#endif35223523/*3524* BIT0: Enable VHT SU Beamformer3525* BIT1: Enable VHT SU Beamformee3526* BIT2: Enable VHT MU Beamformer, depend on VHT SU Beamformer3527* BIT3: Enable VHT MU Beamformee, depend on VHT SU Beamformee3528* BIT4: Enable HT Beamformer3529* BIT5: Enable HT Beamformee3530*/3531RTW_PRINT_SEL(sel, "[DRV CAP] TxBF Capability : 0x%02x\n", pregistry_priv->beamform_cap);3532RTW_PRINT_SEL(sel, "[DRV CAP] VHT MU Bfer : %s\n", (TEST_FLAG(pregistry_priv->beamform_cap, BIT2)) ? "V" : "X");3533RTW_PRINT_SEL(sel, "[DRV CAP] VHT MU Bfee : %s\n", (TEST_FLAG(pregistry_priv->beamform_cap, BIT3)) ? "V" : "X");3534RTW_PRINT_SEL(sel, "[DRV CAP] VHT SU Bfer : %s\n", (TEST_FLAG(pregistry_priv->beamform_cap, BIT0)) ? "V" : "X");3535RTW_PRINT_SEL(sel, "[DRV CAP] VHT SU Bfee : %s\n", (TEST_FLAG(pregistry_priv->beamform_cap, BIT1)) ? "V" : "X");3536RTW_PRINT_SEL(sel, "[DRV CAP] HT Bfer : %s\n", (TEST_FLAG(pregistry_priv->beamform_cap, BIT4)) ? "V" : "X");3537RTW_PRINT_SEL(sel, "[DRV CAP] HT Bfee : %s\n", (TEST_FLAG(pregistry_priv->beamform_cap, BIT5)) ? "V" : "X");35383539RTW_PRINT_SEL(sel, "[DRV CAP] Tx Bfer rf_num : %d\n", pregistry_priv->beamformer_rf_num);3540RTW_PRINT_SEL(sel, "[DRV CAP] Tx Bfee rf_num : %d\n", pregistry_priv->beamformee_rf_num);3541#endif3542}35433544int proc_get_stbc_cap(struct seq_file *m, void *v)3545{3546struct net_device *dev = m->private;3547_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);3548struct registry_priv *pregpriv = &padapter->registrypriv;35493550if (pregpriv)3551RTW_PRINT_SEL(m, "0x%02x\n", pregpriv->stbc_cap);35523553return 0;3554}35553556ssize_t proc_set_stbc_cap(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)3557{3558struct net_device *dev = data;3559_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);3560struct registry_priv *pregpriv = &padapter->registrypriv;3561char tmp[32];3562u32 mode;35633564if (count < 1)3565return -EFAULT;35663567if (count > sizeof(tmp)) {3568rtw_warn_on(1);3569return -EFAULT;3570}35713572if (buffer && !copy_from_user(tmp, buffer, count)) {35733574int num = sscanf(tmp, "%d ", &mode);35753576if (num == 1 && pregpriv) {3577pregpriv->stbc_cap = mode;3578RTW_INFO("stbc_cap = 0x%02x\n", mode);3579}3580}35813582return count;3583}3584int proc_get_rx_stbc(struct seq_file *m, void *v)3585{3586struct net_device *dev = m->private;3587_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);3588struct registry_priv *pregpriv = &padapter->registrypriv;35893590if (pregpriv)3591RTW_PRINT_SEL(m, "%d\n", pregpriv->rx_stbc);35923593return 0;3594}35953596ssize_t proc_set_rx_stbc(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)3597{3598struct net_device *dev = data;3599_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);3600struct registry_priv *pregpriv = &padapter->registrypriv;3601char tmp[32];3602u32 mode;36033604if (count < 1)3605return -EFAULT;36063607if (count > sizeof(tmp)) {3608rtw_warn_on(1);3609return -EFAULT;3610}36113612if (buffer && !copy_from_user(tmp, buffer, count)) {36133614int num = sscanf(tmp, "%d ", &mode);36153616if (num == 1 && pregpriv && (mode == 0 || mode == 1 || mode == 2 || mode == 3)) {3617pregpriv->rx_stbc = mode;3618printk("rx_stbc=%d\n", mode);3619}3620}36213622return count;36233624}3625int proc_get_ldpc_cap(struct seq_file *m, void *v)3626{3627struct net_device *dev = m->private;3628_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);3629struct registry_priv *pregpriv = &padapter->registrypriv;36303631if (pregpriv)3632RTW_PRINT_SEL(m, "0x%02x\n", pregpriv->ldpc_cap);36333634return 0;3635}36363637ssize_t proc_set_ldpc_cap(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)3638{3639struct net_device *dev = data;3640_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);3641struct registry_priv *pregpriv = &padapter->registrypriv;3642char tmp[32];3643u32 mode;36443645if (count < 1)3646return -EFAULT;36473648if (count > sizeof(tmp)) {3649rtw_warn_on(1);3650return -EFAULT;3651}36523653if (buffer && !copy_from_user(tmp, buffer, count)) {36543655int num = sscanf(tmp, "%d ", &mode);36563657if (num == 1 && pregpriv) {3658pregpriv->ldpc_cap = mode;3659RTW_INFO("ldpc_cap = 0x%02x\n", mode);3660}3661}36623663return count;3664}3665#ifdef CONFIG_BEAMFORMING3666int proc_get_txbf_cap(struct seq_file *m, void *v)3667{3668struct net_device *dev = m->private;3669_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);3670struct registry_priv *pregpriv = &padapter->registrypriv;36713672if (pregpriv)3673RTW_PRINT_SEL(m, "0x%02x\n", pregpriv->beamform_cap);36743675return 0;3676}36773678ssize_t proc_set_txbf_cap(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)3679{3680struct net_device *dev = data;3681_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);3682struct registry_priv *pregpriv = &padapter->registrypriv;3683char tmp[32];3684u32 mode;36853686if (count < 1)3687return -EFAULT;36883689if (count > sizeof(tmp)) {3690rtw_warn_on(1);3691return -EFAULT;3692}36933694if (buffer && !copy_from_user(tmp, buffer, count)) {36953696int num = sscanf(tmp, "%d ", &mode);36973698if (num == 1 && pregpriv) {3699pregpriv->beamform_cap = mode;3700RTW_INFO("beamform_cap = 0x%02x\n", mode);3701}3702}37033704return count;3705}3706#endif3707#endif /* CONFIG_80211N_HT */37083709/*int proc_get_rssi_disp(struct seq_file *m, void *v)3710{3711struct net_device *dev = m->private;3712return 0;3713}3714*/37153716/*ssize_t proc_set_rssi_disp(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)3717{3718struct net_device *dev = data;3719_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);3720char tmp[32];3721u32 enable=0;37223723if (count < 1)3724{3725RTW_INFO("argument size is less than 1\n");3726return -EFAULT;3727}37283729if (count > sizeof(tmp)) {3730rtw_warn_on(1);3731return -EFAULT;3732}37333734if (buffer && !copy_from_user(tmp, buffer, count)) {37353736int num = sscanf(tmp, "%x", &enable);37373738if (num != 1) {3739RTW_INFO("invalid set_rssi_disp parameter!\n");3740return count;3741}37423743if(enable)3744{3745RTW_INFO("Linked info Function Enable\n");3746padapter->bLinkInfoDump = enable ;3747}3748else3749{3750RTW_INFO("Linked info Function Disable\n");3751padapter->bLinkInfoDump = 0 ;3752}37533754}37553756return count;37573758}37593760*/3761#ifdef CONFIG_AP_MODE37623763int proc_get_all_sta_info(struct seq_file *m, void *v)3764{3765struct net_device *dev = m->private;3766_irqL irqL;3767struct sta_info *psta;3768_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);3769struct sta_priv *pstapriv = &padapter->stapriv;3770int i;3771_list *plist, *phead;37723773RTW_MAP_DUMP_SEL(m, "sta_dz_bitmap=", pstapriv->sta_dz_bitmap, pstapriv->aid_bmp_len);3774RTW_MAP_DUMP_SEL(m, "tim_bitmap=", pstapriv->tim_bitmap, pstapriv->aid_bmp_len);37753776_enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);37773778for (i = 0; i < NUM_STA; i++) {3779phead = &(pstapriv->sta_hash[i]);3780plist = get_next(phead);37813782while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) {3783psta = LIST_CONTAINOR(plist, struct sta_info, hash_list);37843785plist = get_next(plist);37863787/* if(extra_arg == psta->cmn.aid) */3788{3789RTW_PRINT_SEL(m, "==============================\n");3790RTW_PRINT_SEL(m, "sta's macaddr:" MAC_FMT "\n", MAC_ARG(psta->cmn.mac_addr));3791RTW_PRINT_SEL(m, "rtsen=%d, cts2slef=%d\n", psta->rtsen, psta->cts2self);3792RTW_PRINT_SEL(m, "state=0x%x, aid=%d, macid=%d, raid=%d\n",3793psta->state, psta->cmn.aid, psta->cmn.mac_id, psta->cmn.ra_info.rate_id);3794#ifdef CONFIG_RTS_FULL_BW3795if(psta->vendor_8812)3796RTW_PRINT_SEL(m,"Vendor Realtek 8812\n");3797#endif/*CONFIG_RTS_FULL_BW*/3798#ifdef CONFIG_80211N_HT3799RTW_PRINT_SEL(m, "qos_en=%d, ht_en=%d, init_rate=%d\n", psta->qos_option, psta->htpriv.ht_option, psta->init_rate);3800RTW_PRINT_SEL(m, "bwmode=%d, ch_offset=%d, sgi_20m=%d,sgi_40m=%d\n"3801, psta->cmn.bw_mode, psta->htpriv.ch_offset, psta->htpriv.sgi_20m, psta->htpriv.sgi_40m);3802RTW_PRINT_SEL(m, "ampdu_enable = %d\n", psta->htpriv.ampdu_enable);3803RTW_PRINT_SEL(m, "tx_amsdu_enable = %d\n", psta->htpriv.tx_amsdu_enable);3804RTW_PRINT_SEL(m, "agg_enable_bitmap=%x, candidate_tid_bitmap=%x\n", psta->htpriv.agg_enable_bitmap, psta->htpriv.candidate_tid_bitmap);3805#endif /* CONFIG_80211N_HT */3806#ifdef CONFIG_80211AC_VHT3807RTW_PRINT_SEL(m, "vht_en=%d, vht_sgi_80m=%d\n", psta->vhtpriv.vht_option, psta->vhtpriv.sgi_80m);3808RTW_PRINT_SEL(m, "vht_ldpc_cap=0x%x, vht_stbc_cap=0x%x, vht_beamform_cap=0x%x\n", psta->vhtpriv.ldpc_cap, psta->vhtpriv.stbc_cap, psta->vhtpriv.beamform_cap);3809RTW_PRINT_SEL(m, "vht_mcs_map=0x%x, vht_highest_rate=0x%x, vht_ampdu_len=%d\n", *(u16 *)psta->vhtpriv.vht_mcs_map, psta->vhtpriv.vht_highest_rate, psta->vhtpriv.ampdu_len);3810#endif3811RTW_PRINT_SEL(m, "sleepq_len=%d\n", psta->sleepq_len);3812RTW_PRINT_SEL(m, "sta_xmitpriv.vo_q_qcnt=%d\n", psta->sta_xmitpriv.vo_q.qcnt);3813RTW_PRINT_SEL(m, "sta_xmitpriv.vi_q_qcnt=%d\n", psta->sta_xmitpriv.vi_q.qcnt);3814RTW_PRINT_SEL(m, "sta_xmitpriv.be_q_qcnt=%d\n", psta->sta_xmitpriv.be_q.qcnt);3815RTW_PRINT_SEL(m, "sta_xmitpriv.bk_q_qcnt=%d\n", psta->sta_xmitpriv.bk_q.qcnt);38163817RTW_PRINT_SEL(m, "capability=0x%x\n", psta->capability);3818RTW_PRINT_SEL(m, "flags=0x%x\n", psta->flags);3819RTW_PRINT_SEL(m, "wpa_psk=0x%x\n", psta->wpa_psk);3820RTW_PRINT_SEL(m, "wpa2_group_cipher=0x%x\n", psta->wpa2_group_cipher);3821RTW_PRINT_SEL(m, "wpa2_pairwise_cipher=0x%x\n", psta->wpa2_pairwise_cipher);3822RTW_PRINT_SEL(m, "qos_info=0x%x\n", psta->qos_info);3823RTW_PRINT_SEL(m, "dot118021XPrivacy=0x%x\n", psta->dot118021XPrivacy);38243825sta_rx_reorder_ctl_dump(m, psta);38263827#ifdef CONFIG_TDLS3828RTW_PRINT_SEL(m, "tdls_sta_state=0x%08x\n", psta->tdls_sta_state);3829RTW_PRINT_SEL(m, "PeerKey_Lifetime=%d\n", psta->TDLS_PeerKey_Lifetime);3830#endif /* CONFIG_TDLS */3831RTW_PRINT_SEL(m, "rx_data_uc_pkts=%llu\n", sta_rx_data_uc_pkts(psta));3832RTW_PRINT_SEL(m, "rx_data_mc_pkts=%llu\n", psta->sta_stats.rx_data_mc_pkts);3833RTW_PRINT_SEL(m, "rx_data_bc_pkts=%llu\n", psta->sta_stats.rx_data_bc_pkts);3834RTW_PRINT_SEL(m, "rx_uc_bytes=%llu\n", sta_rx_uc_bytes(psta));3835RTW_PRINT_SEL(m, "rx_mc_bytes=%llu\n", psta->sta_stats.rx_mc_bytes);3836RTW_PRINT_SEL(m, "rx_bc_bytes=%llu\n", psta->sta_stats.rx_bc_bytes);3837if (psta->sta_stats.rx_tp_kbits >> 10)3838RTW_PRINT_SEL(m, "rx_tp =%d (Mbps)\n", psta->sta_stats.rx_tp_kbits >> 10);3839else3840RTW_PRINT_SEL(m, "rx_tp =%d (Kbps)\n", psta->sta_stats.rx_tp_kbits);38413842RTW_PRINT_SEL(m, "tx_data_pkts=%llu\n", psta->sta_stats.tx_pkts);3843RTW_PRINT_SEL(m, "tx_bytes=%llu\n", psta->sta_stats.tx_bytes);3844if (psta->sta_stats.tx_tp_kbits >> 10)3845RTW_PRINT_SEL(m, "tx_tp =%d (Mbps)\n", psta->sta_stats.tx_tp_kbits >> 10);3846else3847RTW_PRINT_SEL(m, "tx_tp =%d (Kbps)\n", psta->sta_stats.tx_tp_kbits);3848#ifdef CONFIG_RTW_80211K3849RTW_PRINT_SEL(m, "rm_en_cap="RM_CAP_FMT"\n", RM_CAP_ARG(psta->rm_en_cap));3850#endif3851dump_st_ctl(m, &psta->st_ctl);38523853if (STA_OP_WFD_MODE(psta))3854RTW_PRINT_SEL(m, "op_wfd_mode:0x%02x\n", STA_OP_WFD_MODE(psta));38553856RTW_PRINT_SEL(m, "==============================\n");3857}38583859}38603861}38623863_exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);38643865return 0;3866}38673868#endif38693870#ifdef CONFIG_PREALLOC_RX_SKB_BUFFER3871int proc_get_rtkm_info(struct seq_file *m, void *v)3872{3873struct net_device *dev = m->private;3874_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);3875struct recv_priv *precvpriv = &padapter->recvpriv;3876struct recv_buf *precvbuf;38773878precvbuf = (struct recv_buf *)precvpriv->precv_buf;38793880RTW_PRINT_SEL(m, "============[RTKM Info]============\n");3881RTW_PRINT_SEL(m, "MAX_RTKM_NR_PREALLOC_RECV_SKB: %d\n", rtw_rtkm_get_nr_recv_skb());3882RTW_PRINT_SEL(m, "MAX_RTKM_RECVBUF_SZ: %d\n", rtw_rtkm_get_buff_size());38833884RTW_PRINT_SEL(m, "============[Driver Info]============\n");3885RTW_PRINT_SEL(m, "NR_PREALLOC_RECV_SKB: %d\n", NR_PREALLOC_RECV_SKB);3886RTW_PRINT_SEL(m, "MAX_RECVBUF_SZ: %d\n", precvbuf->alloc_sz);38873888return 0;3889}3890#endif /* CONFIG_PREALLOC_RX_SKB_BUFFER */38913892#ifdef DBG_MEMORY_LEAK3893#include <asm/atomic.h>3894extern atomic_t _malloc_cnt;;3895extern atomic_t _malloc_size;;38963897int proc_get_malloc_cnt(struct seq_file *m, void *v)3898{3899RTW_PRINT_SEL(m, "_malloc_cnt=%d\n", atomic_read(&_malloc_cnt));3900RTW_PRINT_SEL(m, "_malloc_size=%d\n", atomic_read(&_malloc_size));39013902return 0;3903}3904#endif /* DBG_MEMORY_LEAK */39053906#ifdef CONFIG_FIND_BEST_CHANNEL3907int proc_get_best_channel(struct seq_file *m, void *v)3908{3909struct net_device *dev = m->private;3910_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);3911struct rf_ctl_t *rfctl = adapter_to_rfctl(padapter);3912u32 i, best_channel_24G = 1, best_channel_5G = 36, index_24G = 0, index_5G = 0;39133914for (i = 0; i < rfctl->max_chan_nums && rfctl->channel_set[i].ChannelNum != 0; i++) {3915if (rfctl->channel_set[i].ChannelNum == 1)3916index_24G = i;3917if (rfctl->channel_set[i].ChannelNum == 36)3918index_5G = i;3919}39203921for (i = 0; i < rfctl->max_chan_nums && rfctl->channel_set[i].ChannelNum != 0; i++) {3922/* 2.4G */3923if (rfctl->channel_set[i].ChannelNum == 6) {3924if (rfctl->channel_set[i].rx_count < rfctl->channel_set[index_24G].rx_count) {3925index_24G = i;3926best_channel_24G = rfctl->channel_set[i].ChannelNum;3927}3928}39293930/* 5G */3931if (rfctl->channel_set[i].ChannelNum >= 363932&& rfctl->channel_set[i].ChannelNum < 140) {3933/* Find primary channel */3934if (((rfctl->channel_set[i].ChannelNum - 36) % 8 == 0)3935&& (rfctl->channel_set[i].rx_count < rfctl->channel_set[index_5G].rx_count)) {3936index_5G = i;3937best_channel_5G = rfctl->channel_set[i].ChannelNum;3938}3939}39403941if (rfctl->channel_set[i].ChannelNum >= 1493942&& rfctl->channel_set[i].ChannelNum < 165) {3943/* find primary channel */3944if (((rfctl->channel_set[i].ChannelNum - 149) % 8 == 0)3945&& (rfctl->channel_set[i].rx_count < rfctl->channel_set[index_5G].rx_count)) {3946index_5G = i;3947best_channel_5G = rfctl->channel_set[i].ChannelNum;3948}3949}3950#if 1 /* debug */3951RTW_PRINT_SEL(m, "The rx cnt of channel %3d = %d\n",3952rfctl->channel_set[i].ChannelNum, rfctl->channel_set[i].rx_count);3953#endif3954}39553956RTW_PRINT_SEL(m, "best_channel_5G = %d\n", best_channel_5G);3957RTW_PRINT_SEL(m, "best_channel_24G = %d\n", best_channel_24G);39583959return 0;3960}39613962ssize_t proc_set_best_channel(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)3963{3964struct net_device *dev = data;3965_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);3966struct rf_ctl_t *rfctl = adapter_to_rfctl(padapter);3967char tmp[32];39683969if (count < 1)3970return -EFAULT;39713972if (count > sizeof(tmp)) {3973rtw_warn_on(1);3974return -EFAULT;3975}39763977if (buffer && !copy_from_user(tmp, buffer, count)) {3978int i;3979for (i = 0; i < rfctl->max_chan_nums && rfctl->channel_set[i].ChannelNum != 0; i++)3980rfctl->channel_set[i].rx_count = 0;39813982RTW_INFO("set %s\n", "Clean Best Channel Count");3983}39843985return count;3986}3987#endif /* CONFIG_FIND_BEST_CHANNEL */39883989#ifdef CONFIG_BT_COEXIST3990int proc_get_btcoex_dbg(struct seq_file *m, void *v)3991{3992struct net_device *dev = m->private;3993PADAPTER padapter;3994char buf[512] = {0};3995padapter = (PADAPTER)rtw_netdev_priv(dev);39963997rtw_btcoex_GetDBG(padapter, buf, 512);39983999_RTW_PRINT_SEL(m, "%s", buf);40004001return 0;4002}40034004ssize_t proc_set_btcoex_dbg(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)4005{4006struct net_device *dev = data;4007PADAPTER padapter;4008u8 tmp[80] = {0};4009u32 module[2] = {0};4010u32 num;40114012padapter = (PADAPTER)rtw_netdev_priv(dev);40134014/* RTW_INFO("+" FUNC_ADPT_FMT "\n", FUNC_ADPT_ARG(padapter)); */40154016if (NULL == buffer) {4017RTW_INFO(FUNC_ADPT_FMT ": input buffer is NULL!\n",4018FUNC_ADPT_ARG(padapter));40194020return -EFAULT;4021}40224023if (count < 1) {4024RTW_INFO(FUNC_ADPT_FMT ": input length is 0!\n",4025FUNC_ADPT_ARG(padapter));40264027return -EFAULT;4028}40294030num = count;4031if (num > (sizeof(tmp) - 1))4032num = (sizeof(tmp) - 1);40334034if (copy_from_user(tmp, buffer, num)) {4035RTW_INFO(FUNC_ADPT_FMT ": copy buffer from user space FAIL!\n",4036FUNC_ADPT_ARG(padapter));40374038return -EFAULT;4039}40404041num = sscanf(tmp, "%x %x", module, module + 1);4042if (1 == num) {4043if (0 == module[0])4044_rtw_memset(module, 0, sizeof(module));4045else4046_rtw_memset(module, 0xFF, sizeof(module));4047} else if (2 != num) {4048RTW_INFO(FUNC_ADPT_FMT ": input(\"%s\") format incorrect!\n",4049FUNC_ADPT_ARG(padapter), tmp);40504051if (0 == num)4052return -EFAULT;4053}40544055RTW_INFO(FUNC_ADPT_FMT ": input 0x%08X 0x%08X\n",4056FUNC_ADPT_ARG(padapter), module[0], module[1]);4057rtw_btcoex_SetDBG(padapter, module);40584059return count;4060}40614062int proc_get_btcoex_info(struct seq_file *m, void *v)4063{4064struct net_device *dev = m->private;4065PADAPTER padapter;4066const u32 bufsize = 40 * 100;4067u8 *pbuf = NULL;40684069padapter = (PADAPTER)rtw_netdev_priv(dev);40704071pbuf = rtw_zmalloc(bufsize);4072if (NULL == pbuf)4073return -ENOMEM;40744075rtw_btcoex_DisplayBtCoexInfo(padapter, pbuf, bufsize);40764077_RTW_PRINT_SEL(m, "%s\n", pbuf);40784079rtw_mfree(pbuf, bufsize);40804081return 0;4082}40834084#ifdef CONFIG_RF4CE_COEXIST4085int proc_get_rf4ce_state(struct seq_file *m, void *v)4086{4087struct net_device *dev = m->private;4088_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);4089u8 state = 0, voice = 0;40904091state = rtw_btcoex_GetRf4ceLinkState(adapter);40924093RTW_PRINT_SEL(m, "RF4CE %s\n", state?"Connected":"Disconnect");40944095return 0;4096}40974098/* This interface is designed for user space application to inform RF4CE state4099* Initial define for DHC 1295 E387 project4100*4101* echo state voice > rf4ce_state4102* state4103* 0: RF4CE disconnected4104* 1: RF4CE connected4105*/4106ssize_t proc_set_rf4ce_state(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)4107{4108struct net_device *dev = data;4109_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);4110char tmp[32];4111u8 state;41124113if (count < 1)4114return -EFAULT;41154116if (count > sizeof(tmp)) {4117rtw_warn_on(1);4118return -EFAULT;4119}41204121if (buffer && !copy_from_user(tmp, buffer, count)) {41224123int num = sscanf(tmp, "%hhx", &state);41244125if (num >= 1)4126rtw_btcoex_SetRf4ceLinkState(adapter, state);4127}41284129return count;4130}4131#endif /* CONFIG_RF4CE_COEXIST */4132#endif /* CONFIG_BT_COEXIST */41334134#if defined(DBG_CONFIG_ERROR_DETECT)4135int proc_get_sreset(struct seq_file *m, void *v)4136{4137struct net_device *dev = m->private;4138_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);4139struct dvobj_priv *psdpriv = padapter->dvobj;4140struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;4141HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);4142struct sreset_priv *psrtpriv = &pHalData->srestpriv;41434144if (psrtpriv->dbg_sreset_ctrl == _TRUE) {4145RTW_PRINT_SEL(m, "self_dect_tx_cnt:%llu\n", psrtpriv->self_dect_tx_cnt);4146RTW_PRINT_SEL(m, "self_dect_rx_cnt:%llu\n", psrtpriv->self_dect_rx_cnt);4147RTW_PRINT_SEL(m, "self_dect_fw_cnt:%llu\n", psrtpriv->self_dect_fw_cnt);4148RTW_PRINT_SEL(m, "tx_dma_status_cnt:%llu\n", psrtpriv->tx_dma_status_cnt);4149RTW_PRINT_SEL(m, "rx_dma_status_cnt:%llu\n", psrtpriv->rx_dma_status_cnt);4150RTW_PRINT_SEL(m, "self_dect_case:%d\n", psrtpriv->self_dect_case);4151RTW_PRINT_SEL(m, "dbg_sreset_cnt:%d\n", pdbgpriv->dbg_sreset_cnt);4152}4153return 0;4154}41554156ssize_t proc_set_sreset(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)4157{4158struct net_device *dev = data;4159_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);4160HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);4161struct sreset_priv *psrtpriv = &pHalData->srestpriv;4162char tmp[32];4163s32 trigger_point;41644165if (count < 1)4166return -EFAULT;41674168if (count > sizeof(tmp)) {4169rtw_warn_on(1);4170return -EFAULT;4171}41724173if (buffer && !copy_from_user(tmp, buffer, count)) {41744175int num = sscanf(tmp, "%d", &trigger_point);41764177if (num < 1)4178return count;41794180if (trigger_point == SRESET_TGP_NULL)4181rtw_hal_sreset_reset(padapter);4182else if (trigger_point == SRESET_TGP_INFO)4183psrtpriv->dbg_sreset_ctrl = _TRUE;4184else4185sreset_set_trigger_point(padapter, trigger_point);4186}41874188return count;41894190}4191#endif /* DBG_CONFIG_ERROR_DETECT */41924193#ifdef CONFIG_PCI_HCI41944195ssize_t proc_set_pci_bridge_conf_space(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)4196{4197struct net_device *dev = data;4198_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);4199struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);4200struct pci_dev *pdev = pdvobjpriv->ppcidev;4201struct pci_dev *bridge_pdev = pdev->bus->self;42024203char tmp[32] = { 0 };4204int num;42054206u32 reg = 0, value = 0;42074208if (count < 1)4209return -EFAULT;42104211if (count > sizeof(tmp)) {4212rtw_warn_on(1);4213return -EFAULT;4214}42154216if (buffer && !copy_from_user(tmp, buffer, count)) {42174218num = sscanf(tmp, "%x %x", ®, &value);4219if (num != 2) {4220RTW_INFO("invalid parameter!\n");4221return count;4222}42234224if (reg >= 0x1000) {4225RTW_INFO("invalid register!\n");4226return count;4227}42284229if (value > 0xFF) {4230RTW_INFO("invalid value! Only one byte\n");4231return count;4232}42334234RTW_INFO(FUNC_ADPT_FMT ": register 0x%x value 0x%x\n",4235FUNC_ADPT_ARG(padapter), reg, value);42364237pci_write_config_byte(bridge_pdev, reg, value);4238}4239return count;4240}424142424243int proc_get_pci_bridge_conf_space(struct seq_file *m, void *v)4244{4245struct net_device *dev = m->private;4246_adapter *padapter = (_adapter *) rtw_netdev_priv(dev);4247struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);4248struct pci_dev *pdev = pdvobjpriv->ppcidev;4249struct pci_dev *bridge_pdev = pdev->bus->self;42504251u32 tmp[4] = { 0 };4252u32 i, j;42534254RTW_PRINT_SEL(m, "\n***** PCI Host Device Configuration Space*****\n\n");42554256for (i = 0; i < 0x1000; i += 0x10) {4257for (j = 0 ; j < 4 ; j++)4258pci_read_config_dword(bridge_pdev, i + j * 4, tmp+j);42594260RTW_PRINT_SEL(m, "%03x: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n",4261i, tmp[0] & 0xFF, (tmp[0] >> 8) & 0xFF, (tmp[0] >> 16) & 0xFF, (tmp[0] >> 24) & 0xFF,4262tmp[1] & 0xFF, (tmp[1] >> 8) & 0xFF, (tmp[1] >> 16) & 0xFF, (tmp[1] >> 24) & 0xFF,4263tmp[2] & 0xFF, (tmp[2] >> 8) & 0xFF, (tmp[2] >> 16) & 0xFF, (tmp[2] >> 24) & 0xFF,4264tmp[3] & 0xFF, (tmp[3] >> 8) & 0xFF, (tmp[3] >> 16) & 0xFF, (tmp[3] >> 24) & 0xFF);4265}4266return 0;4267}426842694270ssize_t proc_set_pci_conf_space(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)4271{4272struct net_device *dev = data;4273_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);4274struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);4275struct pci_dev *pdev = pdvobjpriv->ppcidev;42764277char tmp[32] = { 0 };4278int num;42794280u32 reg = 0, value = 0;42814282if (count < 1)4283return -EFAULT;42844285if (count > sizeof(tmp)) {4286rtw_warn_on(1);4287return -EFAULT;4288}42894290if (buffer && !copy_from_user(tmp, buffer, count)) {42914292num = sscanf(tmp, "%x %x", ®, &value);42934294if (num != 2) {4295RTW_INFO("invalid parameter!\n");4296return count;4297}429842994300if (reg >= 0x1000) {4301RTW_INFO("invalid register!\n");4302return count;4303}43044305if (value > 0xFF) {4306RTW_INFO("invalid value! Only one byte\n");4307return count;4308}43094310RTW_INFO(FUNC_ADPT_FMT ": register 0x%x value 0x%x\n",4311FUNC_ADPT_ARG(padapter), reg, value);43124313pci_write_config_byte(pdev, reg, value);431443154316}4317return count;4318}431943204321int proc_get_pci_conf_space(struct seq_file *m, void *v)4322{4323struct net_device *dev = m->private;4324_adapter *padapter = (_adapter *) rtw_netdev_priv(dev);4325struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);4326struct pci_dev *pdev = pdvobjpriv->ppcidev;4327struct pci_dev *bridge_pdev = pdev->bus->self;43284329u32 tmp[4] = { 0 };4330u32 i, j;43314332RTW_PRINT_SEL(m, "\n***** PCI Device Configuration Space *****\n\n");43334334for (i = 0; i < 0x1000; i += 0x10) {4335for (j = 0 ; j < 4 ; j++)4336pci_read_config_dword(pdev, i + j * 4, tmp+j);43374338RTW_PRINT_SEL(m, "%03x: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n",4339i, tmp[0] & 0xFF, (tmp[0] >> 8) & 0xFF, (tmp[0] >> 16) & 0xFF, (tmp[0] >> 24) & 0xFF,4340tmp[1] & 0xFF, (tmp[1] >> 8) & 0xFF, (tmp[1] >> 16) & 0xFF, (tmp[1] >> 24) & 0xFF,4341tmp[2] & 0xFF, (tmp[2] >> 8) & 0xFF, (tmp[2] >> 16) & 0xFF, (tmp[2] >> 24) & 0xFF,4342tmp[3] & 0xFF, (tmp[3] >> 8) & 0xFF, (tmp[3] >> 16) & 0xFF, (tmp[3] >> 24) & 0xFF);4343}43444345return 0;4346}434743484349int proc_get_pci_aspm(struct seq_file *m, void *v)4350{4351struct net_device *dev = m->private;4352_adapter *padapter = (_adapter *) rtw_netdev_priv(dev);4353struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);4354HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);4355struct pci_priv *pcipriv = &(pdvobjpriv->pcipriv);4356u8 tmp8 = 0;4357u16 tmp16 = 0;4358u32 tmp32 = 0;4359u8 l1_idle = 0;436043614362RTW_PRINT_SEL(m, "***** ASPM Capability *****\n");43634364pci_read_config_dword(pdvobjpriv->ppcidev, pcipriv->pciehdr_offset + PCI_EXP_LNKCAP, &tmp32);43654366RTW_PRINT_SEL(m, "CLK REQ: %s\n", (tmp32&PCI_EXP_LNKCAP_CLKPM) ? "Enable" : "Disable");4367RTW_PRINT_SEL(m, "ASPM L0s: %s\n", (tmp32&BIT10) ? "Enable" : "Disable");4368RTW_PRINT_SEL(m, "ASPM L1: %s\n", (tmp32&BIT11) ? "Enable" : "Disable");43694370tmp8 = rtw_hal_pci_l1off_capability(padapter);4371RTW_PRINT_SEL(m, "ASPM L1OFF: %s\n", tmp8 ? "Enable" : "Disable");43724373RTW_PRINT_SEL(m, "***** ASPM CTRL Reg *****\n");43744375pci_read_config_word(pdvobjpriv->ppcidev, pcipriv->pciehdr_offset + PCI_EXP_LNKCTL, &tmp16);43764377RTW_PRINT_SEL(m, "CLK REQ: %s\n", (tmp16&PCI_EXP_LNKCTL_CLKREQ_EN) ? "Enable" : "Disable");4378RTW_PRINT_SEL(m, "ASPM L0s: %s\n", (tmp16&BIT0) ? "Enable" : "Disable");4379RTW_PRINT_SEL(m, "ASPM L1: %s\n", (tmp16&BIT1) ? "Enable" : "Disable");43804381tmp8 = rtw_hal_pci_l1off_nic_support(padapter);4382RTW_PRINT_SEL(m, "ASPM L1OFF: %s\n", tmp8 ? "Enable" : "Disable");43834384RTW_PRINT_SEL(m, "***** ASPM Backdoor *****\n");43854386tmp8 = rtw_hal_pci_dbi_read(padapter, 0x719);4387RTW_PRINT_SEL(m, "CLK REQ: %s\n", (tmp8 & BIT4) ? "Enable" : "Disable");43884389tmp8 = rtw_hal_pci_dbi_read(padapter, 0x70f);4390l1_idle = tmp8 & 0x38;4391RTW_PRINT_SEL(m, "ASPM L0s: %s\n", (tmp8&BIT7) ? "Enable" : "Disable");43924393tmp8 = rtw_hal_pci_dbi_read(padapter, 0x719);4394RTW_PRINT_SEL(m, "ASPM L1: %s\n", (tmp8 & BIT3) ? "Enable" : "Disable");43954396tmp8 = rtw_hal_pci_dbi_read(padapter, 0x718);4397RTW_PRINT_SEL(m, "ASPM L1OFF: %s\n", (tmp8 & BIT5) ? "Enable" : "Disable");43984399RTW_PRINT_SEL(m, "********* MISC **********\n");4400RTW_PRINT_SEL(m, "ASPM L1 Idel Time: 0x%x\n", l1_idle>>3);4401RTW_PRINT_SEL(m, "*************************\n");44024403#ifdef CONFIG_PCI_DYNAMIC_ASPM4404RTW_PRINT_SEL(m, "Dynamic ASPM mode: %d (%s)\n", pcipriv->aspm_mode,4405pcipriv->aspm_mode == ASPM_MODE_PERF ? "Perf" :4406pcipriv->aspm_mode == ASPM_MODE_PS ? "PS" : "Und");4407#endif44084409return 0;4410}44114412int proc_get_rx_ring(struct seq_file *m, void *v)4413{4414_irqL irqL;4415struct net_device *dev = m->private;4416_adapter *padapter = (_adapter *) rtw_netdev_priv(dev);4417struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);4418struct recv_priv *precvpriv = &padapter->recvpriv;4419struct rtw_rx_ring *rx_ring = &precvpriv->rx_ring[RX_MPDU_QUEUE];4420int i, j;44214422RTW_PRINT_SEL(m, "rx ring (%p)\n", rx_ring);4423RTW_PRINT_SEL(m, " dma: 0x%08x\n", (int) rx_ring->dma);4424RTW_PRINT_SEL(m, " idx: %d\n", rx_ring->idx);44254426_enter_critical(&pdvobjpriv->irq_th_lock, &irqL);4427for (i = 0; i < precvpriv->rxringcount; i++) {4428#ifdef CONFIG_TRX_BD_ARCH4429struct rx_buf_desc *entry = &rx_ring->buf_desc[i];4430#else4431struct recv_stat *entry = &rx_ring->desc[i];4432#endif4433struct sk_buff *skb = rx_ring->rx_buf[i];44344435RTW_PRINT_SEL(m, " desc[%03d]: %p, rx_buf[%03d]: 0x%08x\n",4436i, entry, i, cpu_to_le32(*((dma_addr_t *)skb->cb)));44374438for (j = 0; j < sizeof(*entry) / 4; j++) {4439if ((j % 4) == 0)4440RTW_PRINT_SEL(m, " 0x%03x", j);44414442RTW_PRINT_SEL(m, " 0x%08x ", ((int *) entry)[j]);44434444if ((j % 4) == 3)4445RTW_PRINT_SEL(m, "\n");4446}4447}4448_exit_critical(&pdvobjpriv->irq_th_lock, &irqL);44494450return 0;4451}44524453int proc_get_tx_ring(struct seq_file *m, void *v)4454{4455_irqL irqL;4456struct net_device *dev = m->private;4457_adapter *padapter = (_adapter *) rtw_netdev_priv(dev);4458struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);4459struct xmit_priv *pxmitpriv = &padapter->xmitpriv;4460int i, j, k;44614462_enter_critical(&pdvobjpriv->irq_th_lock, &irqL);4463for (i = 0; i < PCI_MAX_TX_QUEUE_COUNT; i++) {4464struct rtw_tx_ring *tx_ring = &pxmitpriv->tx_ring[i];44654466RTW_PRINT_SEL(m, "tx ring[%d] (%p)\n", i, tx_ring);4467RTW_PRINT_SEL(m, " dma: 0x%08x\n", (int) tx_ring->dma);4468RTW_PRINT_SEL(m, " idx: %d\n", tx_ring->idx);4469RTW_PRINT_SEL(m, " entries: %d\n", tx_ring->entries);4470/* RTW_PRINT_SEL(m, " queue: %d\n", tx_ring->queue); */4471RTW_PRINT_SEL(m, " qlen: %d\n", tx_ring->qlen);44724473for (j = 0; j < pxmitpriv->txringcount[i]; j++) {4474#ifdef CONFIG_TRX_BD_ARCH4475struct tx_buf_desc *entry = &tx_ring->buf_desc[j];4476RTW_PRINT_SEL(m, " buf_desc[%03d]: %p\n", j, entry);4477#else4478struct tx_desc *entry = &tx_ring->desc[j];4479RTW_PRINT_SEL(m, " desc[%03d]: %p\n", j, entry);4480#endif44814482for (k = 0; k < sizeof(*entry) / 4; k++) {4483if ((k % 4) == 0)4484RTW_PRINT_SEL(m, " 0x%03x", k);44854486RTW_PRINT_SEL(m, " 0x%08x ", ((int *) entry)[k]);44874488if ((k % 4) == 3)4489RTW_PRINT_SEL(m, "\n");4490}4491}4492}4493_exit_critical(&pdvobjpriv->irq_th_lock, &irqL);44944495return 0;4496}44974498#ifdef DBG_TXBD_DESC_DUMP4499int proc_get_tx_ring_ext(struct seq_file *m, void *v)4500{4501_irqL irqL;4502struct net_device *dev = m->private;4503_adapter *padapter = (_adapter *) rtw_netdev_priv(dev);4504struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);4505struct xmit_priv *pxmitpriv = &padapter->xmitpriv;4506struct rtw_tx_desc_backup *pbuf;4507int i, j, k, idx;45084509RTW_PRINT_SEL(m, "<<<< tx ring ext dump settings >>>>\n");4510RTW_PRINT_SEL(m, " - backup frame num: %d\n", TX_BAK_FRMAE_CNT);4511RTW_PRINT_SEL(m, " - backup max. desc size: %d bytes\n", TX_BAK_DESC_LEN);4512RTW_PRINT_SEL(m, " - backup data size: %d bytes\n\n", TX_BAK_DATA_LEN);45134514if (!pxmitpriv->dump_txbd_desc) {4515RTW_PRINT_SEL(m, "Dump function is disabled.\n");4516return 0;4517}45184519_enter_critical(&pdvobjpriv->irq_th_lock, &irqL);4520for (i = 0; i < HW_QUEUE_ENTRY; i++) {4521struct rtw_tx_ring *tx_ring = &pxmitpriv->tx_ring[i];45224523idx = rtw_get_tx_desc_backup(padapter, i, &pbuf);45244525RTW_PRINT_SEL(m, "Tx ring[%d]", i);4526switch (i) {4527case 0:4528RTW_PRINT_SEL(m, " (VO)\n");4529break;4530case 1:4531RTW_PRINT_SEL(m, " (VI)\n");4532break;4533case 2:4534RTW_PRINT_SEL(m, " (BE)\n");4535break;4536case 3:4537RTW_PRINT_SEL(m, " (BK)\n");4538break;4539case 4:4540RTW_PRINT_SEL(m, " (BCN)\n");4541break;4542case 5:4543RTW_PRINT_SEL(m, " (MGT)\n");4544break;4545case 6:4546RTW_PRINT_SEL(m, " (HIGH)\n");4547break;4548case 7:4549RTW_PRINT_SEL(m, " (TXCMD)\n");4550break;4551default:4552RTW_PRINT_SEL(m, " (?)\n");4553break;4554}45554556RTW_PRINT_SEL(m, " Entries: %d\n", TX_BAK_FRMAE_CNT);4557RTW_PRINT_SEL(m, " Last idx: %d\n", idx);45584559for (j = 0; j < TX_BAK_FRMAE_CNT; j++) {4560RTW_PRINT_SEL(m, " desc[%03d]:\n", j);45614562for (k = 0; k < (pbuf->tx_desc_size) / 4; k++) {4563if ((k % 4) == 0)4564RTW_PRINT_SEL(m, " 0x%03x", k);45654566RTW_PRINT_SEL(m, " 0x%08x ", ((int *)pbuf->tx_bak_desc)[k]);45674568if ((k % 4) == 3)4569RTW_PRINT_SEL(m, "\n");4570}45714572#if 1 /* data dump */4573if (pbuf->tx_desc_size) {4574RTW_PRINT_SEL(m, " data[%03d]:\n", j);45754576for (k = 0; k < (TX_BAK_DATA_LEN) / 4; k++) {4577if ((k % 4) == 0)4578RTW_PRINT_SEL(m, " 0x%03x", k);45794580RTW_PRINT_SEL(m, " 0x%08x ", ((int *)pbuf->tx_bak_data_hdr)[k]);45814582if ((k % 4) == 3)4583RTW_PRINT_SEL(m, "\n");4584}4585RTW_PRINT_SEL(m, "\n");4586}4587#endif45884589RTW_PRINT_SEL(m, " R/W pointer: %d/%d\n", pbuf->tx_bak_rp, pbuf->tx_bak_wp);45904591pbuf = pbuf + 1;4592}4593RTW_PRINT_SEL(m, "\n");4594}4595_exit_critical(&pdvobjpriv->irq_th_lock, &irqL);45964597return 0;4598}45994600ssize_t proc_set_tx_ring_ext(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)4601{4602_irqL irqL;4603struct net_device *dev = data;4604_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);4605struct xmit_priv *pxmitpriv = &padapter->xmitpriv;4606struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);4607char tmp[32];4608u32 reset = 0;4609u32 dump = 0;46104611if (count < 1)4612return -EFAULT;46134614if (count > sizeof(tmp)) {4615rtw_warn_on(1);4616return -EFAULT;4617}46184619if (buffer && !copy_from_user(tmp, buffer, count)) {46204621int num = sscanf(tmp, "%u %u", &dump, &reset);46224623if (num != 2) {4624RTW_INFO("invalid parameter!\n");4625return count;4626}46274628_enter_critical(&pdvobjpriv->irq_th_lock, &irqL);4629pxmitpriv->dump_txbd_desc = (BOOLEAN) dump;46304631if (reset == 1)4632rtw_tx_desc_backup_reset();46334634_exit_critical(&pdvobjpriv->irq_th_lock, &irqL);46354636}46374638return count;4639}46404641#endif46424643#endif46444645#ifdef CONFIG_WOWLAN4646int proc_get_pattern_info(struct seq_file *m, void *v)4647{4648struct net_device *dev = m->private;4649_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);4650struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);4651u8 val8;4652char str_1[128];4653char *p_str;4654int i = 0 , j = 0, k = 0;4655int len = 0, max_len = 0, total = 0;46564657p_str = str_1;4658max_len = sizeof(str_1);46594660total = pwrpriv->wowlan_pattern_idx;46614662rtw_set_default_pattern(padapter);46634664/*show pattern*/4665RTW_PRINT_SEL(m, "\n======[Pattern Info.]======\n");4666RTW_PRINT_SEL(m, "pattern number: %d\n", total);4667RTW_PRINT_SEL(m, "support default patterns: %c\n",4668(pwrpriv->default_patterns_en) ? 'Y' : 'N');46694670for (k = 0; k < total ; k++) {4671RTW_PRINT_SEL(m, "\npattern idx: %d\n", k);4672RTW_PRINT_SEL(m, "pattern content:\n");46734674p_str = str_1;4675max_len = sizeof(str_1);4676for (i = 0 ; i < MAX_WKFM_PATTERN_SIZE / 8 ; i++) {4677_rtw_memset(p_str, 0, max_len);4678len = 0;4679for (j = 0 ; j < 8 ; j++) {4680val8 = pwrpriv->patterns[k].content[i * 8 + j];4681len += snprintf(p_str + len, max_len - len,4682"%02x ", val8);4683}4684RTW_PRINT_SEL(m, "%s\n", p_str);4685}4686RTW_PRINT_SEL(m, "\npattern mask:\n");4687for (i = 0 ; i < MAX_WKFM_SIZE / 8 ; i++) {4688_rtw_memset(p_str, 0, max_len);4689len = 0;4690for (j = 0 ; j < 8 ; j++) {4691val8 = pwrpriv->patterns[k].mask[i * 8 + j];4692len += snprintf(p_str + len, max_len - len,4693"%02x ", val8);4694}4695RTW_PRINT_SEL(m, "%s\n", p_str);4696}46974698RTW_PRINT_SEL(m, "\npriv_pattern_len:\n");4699RTW_PRINT_SEL(m, "pattern_len: %d\n", pwrpriv->patterns[k].len);4700RTW_PRINT_SEL(m, "*****************\n");4701}47024703return 0;4704}47054706ssize_t proc_set_pattern_info(struct file *file, const char __user *buffer,4707size_t count, loff_t *pos, void *data)4708{4709struct net_device *dev = data;4710_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);4711struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);4712struct wowlan_ioctl_param poidparam;4713u8 tmp[MAX_WKFM_PATTERN_STR_LEN + 1] = {0};4714int ret = 0;4715u8 index = 0;47164717poidparam.subcode = 0;47184719if (count < 1)4720return -EFAULT;47214722if (count >= sizeof(tmp)) {4723RTW_ERR("%s: pattern string is too long, count=%zu\n",4724__func__, count);4725return -EFAULT;4726}47274728if (pwrpriv->wowlan_pattern_idx >= MAX_WKFM_CAM_NUM) {4729RTW_ERR("priv-pattern is full(idx: %d)\n",4730pwrpriv->wowlan_pattern_idx);4731RTW_ERR("please clean priv-pattern first\n");4732return -ENOMEM;4733}47344735if (buffer && !copy_from_user(tmp, buffer, count)) {4736if (strncmp(tmp, "clean", 5) == 0) {4737poidparam.subcode = WOWLAN_PATTERN_CLEAN;4738rtw_hal_set_hwreg(padapter,4739HW_VAR_WOWLAN, (u8 *)&poidparam);4740} else {4741index = pwrpriv->wowlan_pattern_idx;4742ret = rtw_wowlan_parser_pattern_cmd(tmp,4743pwrpriv->patterns[index].content,4744&pwrpriv->patterns[index].len,4745pwrpriv->patterns[index].mask);4746if (ret == _TRUE)4747pwrpriv->wowlan_pattern_idx++;4748}4749} else {4750rtw_warn_on(1);4751return -EFAULT;4752}47534754return count;4755}47564757int proc_get_wakeup_event(struct seq_file *m, void *v)4758{4759struct net_device *dev = m->private;4760_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);4761struct registry_priv *registry_par = &padapter->registrypriv;47624763RTW_PRINT_SEL(m, "wakeup event: %#02x\n", registry_par->wakeup_event);4764return 0;4765}47664767ssize_t proc_set_wakeup_event(struct file *file, const char __user *buffer,4768size_t count, loff_t *pos, void *data)4769{4770struct net_device *dev = data;4771_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);4772struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);4773struct registry_priv *registry_par = &padapter->registrypriv;4774u32 wakeup_event = 0;47754776u8 tmp[8] = {0};4777int num = 0;47784779if (count < 1)4780return -EFAULT;47814782if (count > sizeof(tmp)) {4783rtw_warn_on(1);4784return -EFAULT;4785}47864787if (buffer && !copy_from_user(tmp, buffer, count))4788num = sscanf(tmp, "%u", &wakeup_event);4789else4790return -EFAULT;47914792if (num == 1 && wakeup_event <= 0x07) {4793registry_par->wakeup_event = wakeup_event;47944795if (wakeup_event & BIT(1))4796pwrctrlpriv->default_patterns_en = _TRUE;4797else4798pwrctrlpriv->default_patterns_en = _FALSE;47994800rtw_wow_pattern_sw_reset(padapter);48014802RTW_INFO("%s: wakeup_event: %#2x, default pattern: %d\n",4803__func__, registry_par->wakeup_event,4804pwrctrlpriv->default_patterns_en);4805} else {4806return -EINVAL;4807}48084809return count;4810}48114812int proc_get_wakeup_reason(struct seq_file *m, void *v)4813{4814struct net_device *dev = m->private;4815_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);4816struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);4817u8 val = pwrpriv->wowlan_last_wake_reason;48184819RTW_PRINT_SEL(m, "last wake reason: %#02x\n", val);4820return 0;4821}4822#endif /*CONFIG_WOWLAN*/48234824#ifdef CONFIG_GPIO_WAKEUP4825int proc_get_wowlan_gpio_info(struct seq_file *m, void *v)4826{4827struct net_device *dev = m->private;4828_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);4829struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);4830u8 val = pwrpriv->is_high_active;48314832RTW_PRINT_SEL(m, "wakeup_gpio_idx: %d\n", WAKEUP_GPIO_IDX);4833RTW_PRINT_SEL(m, "high_active: %d\n", val);48344835return 0;4836}48374838ssize_t proc_set_wowlan_gpio_info(struct file *file, const char __user *buffer,4839size_t count, loff_t *pos, void *data)4840{4841struct net_device *dev = data;4842_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);4843struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);4844char tmp[32] = {0};4845int num = 0;4846u32 is_high_active = 0;4847u8 val8 = 0;48484849if (count < 1)4850return -EFAULT;48514852if (count > sizeof(tmp)) {4853rtw_warn_on(1);4854return -EFAULT;4855}48564857if (buffer && !copy_from_user(tmp, buffer, count)) {48584859num = sscanf(tmp, "%u", &is_high_active);48604861if (num != 1) {4862RTW_INFO("Invalid format\n");4863return count;4864}48654866is_high_active = is_high_active == 0 ? 0 : 1;48674868pwrpriv->is_high_active = is_high_active;48694870rtw_ps_deny(padapter, PS_DENY_IOCTL);4871LeaveAllPowerSaveModeDirect(padapter);48724873#ifdef CONFIG_WAKEUP_GPIO_INPUT_MODE4874if (pwrpriv->is_high_active == 0)4875rtw_hal_set_input_gpio(padapter, WAKEUP_GPIO_IDX);4876else4877rtw_hal_set_output_gpio(padapter, WAKEUP_GPIO_IDX, 0);4878#else4879val8 = (pwrpriv->is_high_active == 0) ? 1 : 0;4880rtw_hal_switch_gpio_wl_ctrl(padapter, WAKEUP_GPIO_IDX, _TRUE);4881rtw_hal_set_output_gpio(padapter, WAKEUP_GPIO_IDX, val8);4882#endif4883rtw_ps_deny_cancel(padapter, PS_DENY_IOCTL);48844885RTW_INFO("set %s %d\n", "gpio_high_active",4886pwrpriv->is_high_active);4887RTW_INFO("%s: set GPIO_%d %d as default.\n",4888__func__, WAKEUP_GPIO_IDX, val8);4889}48904891return count;4892}4893#endif /* CONFIG_GPIO_WAKEUP */48944895#ifdef CONFIG_P2P_WOWLAN4896int proc_get_p2p_wowlan_info(struct seq_file *m, void *v)4897{4898struct net_device *dev = m->private;4899_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);4900struct wifidirect_info *pwdinfo = &(padapter->wdinfo);4901struct p2p_wowlan_info peerinfo = pwdinfo->p2p_wow_info;4902if (_TRUE == peerinfo.is_trigger) {4903RTW_PRINT_SEL(m, "is_trigger: TRUE\n");4904switch (peerinfo.wowlan_recv_frame_type) {4905case P2P_WOWLAN_RECV_NEGO_REQ:4906RTW_PRINT_SEL(m, "Frame Type: Nego Request\n");4907break;4908case P2P_WOWLAN_RECV_INVITE_REQ:4909RTW_PRINT_SEL(m, "Frame Type: Invitation Request\n");4910break;4911case P2P_WOWLAN_RECV_PROVISION_REQ:4912RTW_PRINT_SEL(m, "Frame Type: Provision Request\n");4913break;4914default:4915break;4916}4917RTW_PRINT_SEL(m, "Peer Addr: "MAC_FMT"\n", MAC_ARG(peerinfo.wowlan_peer_addr));4918RTW_PRINT_SEL(m, "Peer WPS Config: %x\n", peerinfo.wowlan_peer_wpsconfig);4919RTW_PRINT_SEL(m, "Persistent Group: %d\n", peerinfo.wowlan_peer_is_persistent);4920RTW_PRINT_SEL(m, "Intivation Type: %d\n", peerinfo.wowlan_peer_invitation_type);4921} else4922RTW_PRINT_SEL(m, "is_trigger: False\n");4923return 0;4924}4925#endif /* CONFIG_P2P_WOWLAN */4926#ifdef CONFIG_BCN_CNT_CONFIRM_HDL4927int proc_get_new_bcn_max(struct seq_file *m, void *v)4928{4929extern int new_bcn_max;49304931RTW_PRINT_SEL(m, "%d", new_bcn_max);4932return 0;4933}49344935ssize_t proc_set_new_bcn_max(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)4936{4937char tmp[32];4938extern int new_bcn_max;49394940if (count < 1)4941return -EFAULT;49424943if (count > sizeof(tmp)) {4944rtw_warn_on(1);4945return -EFAULT;4946}49474948if (buffer && !copy_from_user(tmp, buffer, count))4949sscanf(tmp, "%d ", &new_bcn_max);49504951return count;4952}4953#endif4954#ifdef CONFIG_POWER_SAVING4955int proc_get_ps_info(struct seq_file *m, void *v)4956{4957struct net_device *dev = m->private;4958_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);4959struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);4960u8 ips_mode = pwrpriv->ips_mode_req;4961u8 lps_mode = pwrpriv->power_mgnt;4962u8 lps_level = pwrpriv->lps_level;4963#ifdef CONFIG_LPS_1T1R4964u8 lps_1t1r = pwrpriv->lps_1t1r;4965#endif4966#ifdef CONFIG_WOWLAN4967u8 wow_lps_mode = pwrpriv->wowlan_power_mgmt;4968u8 wow_lps_level = pwrpriv->wowlan_lps_level;4969#ifdef CONFIG_LPS_1T1R4970u8 wow_lps_1t1r = pwrpriv->wowlan_lps_1t1r;4971#endif4972#endif /* CONFIG_WOWLAN */4973char *str = "";49744975RTW_PRINT_SEL(m, "======Power Saving Info:======\n");4976RTW_PRINT_SEL(m, "*IPS:\n");49774978if (ips_mode == IPS_NORMAL) {4979#ifdef CONFIG_FWLPS_IN_IPS4980str = "FW_LPS_IN_IPS";4981#else4982str = "Card Disable";4983#endif4984} else if (ips_mode == IPS_NONE)4985str = "NO IPS";4986else if (ips_mode == IPS_LEVEL_2)4987str = "IPS_LEVEL_2";4988else4989str = "invalid ips_mode";49904991RTW_PRINT_SEL(m, " IPS mode: %s\n", str);4992RTW_PRINT_SEL(m, " IPS enter count:%d, IPS leave count:%d\n",4993pwrpriv->ips_enter_cnts, pwrpriv->ips_leave_cnts);4994RTW_PRINT_SEL(m, "------------------------------\n");4995RTW_PRINT_SEL(m, "*LPS:\n");49964997if (lps_mode == PS_MODE_ACTIVE)4998str = "NO LPS";4999else if (lps_mode == PS_MODE_MIN)5000str = "MIN";5001else if (lps_mode == PS_MODE_MAX)5002str = "MAX";5003else if (lps_mode == PS_MODE_DTIM)5004str = "DTIM";5005else5006sprintf(str, "%d", lps_mode);50075008RTW_PRINT_SEL(m, " LPS mode: %s\n", str);50095010if (pwrpriv->dtim != 0)5011RTW_PRINT_SEL(m, " DTIM: %d\n", pwrpriv->dtim);5012RTW_PRINT_SEL(m, " LPS enter count:%d, LPS leave count:%d\n",5013pwrpriv->lps_enter_cnts, pwrpriv->lps_leave_cnts);50145015if (lps_level == LPS_LCLK)5016str = "LPS_LCLK";5017else if (lps_level == LPS_PG)5018str = "LPS_PG";5019else5020str = "LPS_NORMAL";5021RTW_PRINT_SEL(m, " LPS level: %s\n", str);50225023#ifdef CONFIG_LPS_1T1R5024RTW_PRINT_SEL(m, " LPS 1T1R: %d\n", lps_1t1r);5025#endif50265027#ifdef CONFIG_WOWLAN5028RTW_PRINT_SEL(m, "------------------------------\n");5029RTW_PRINT_SEL(m, "*WOW LPS:\n");50305031if (wow_lps_mode == PS_MODE_ACTIVE)5032str = "NO LPS";5033else if (wow_lps_mode == PS_MODE_MIN)5034str = "MIN";5035else if (wow_lps_mode == PS_MODE_MAX)5036str = "MAX";5037else if (wow_lps_mode == PS_MODE_DTIM)5038str = "DTIM";5039else5040sprintf(str, "%d", wow_lps_mode);50415042RTW_PRINT_SEL(m, " WOW LPS mode: %s\n", str);50435044if (wow_lps_level == LPS_LCLK)5045str = "LPS_LCLK";5046else if (wow_lps_level == LPS_PG)5047str = "LPS_PG";5048else5049str = "LPS_NORMAL";5050RTW_PRINT_SEL(m, " WOW LPS level: %s\n", str);50515052#ifdef CONFIG_LPS_1T1R5053RTW_PRINT_SEL(m, " WOW LPS 1T1R: %d\n", wow_lps_1t1r);5054#endif5055#endif /* CONFIG_WOWLAN */50565057RTW_PRINT_SEL(m, "=============================\n");5058return 0;5059}50605061ssize_t proc_set_ps_info(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)5062{5063struct net_device *dev = data;5064struct _ADAPTER *adapter = (_adapter *)rtw_netdev_priv(dev);5065char tmp[8];5066int num = 0;5067int mode = 0;5068int en = 0;50695070if (count > sizeof(tmp)) {5071rtw_warn_on(1);5072return -EFAULT;5073}50745075if (!buffer || copy_from_user(tmp, buffer, count))5076goto exit;50775078num = sscanf(tmp, "%d %d", &mode, &en);5079if (num > 2) {5080RTW_ERR("%s: invalid parameter!\n", __FUNCTION__);5081goto exit;5082}50835084if (num == 1 && mode == 0) {5085/* back to original LPS/IPS Mode */5086RTW_INFO("%s: back to original LPS/IPS Mode\n", __FUNCTION__);50875088rtw_pm_set_lps(adapter, adapter->registrypriv.power_mgnt);50895090rtw_pm_set_ips(adapter, adapter->registrypriv.ips_mode);50915092#ifdef CONFIG_WOWLAN5093RTW_INFO("%s: back to original WOW LPS Mode\n", __FUNCTION__);50945095rtw_pm_set_wow_lps(adapter, adapter->registrypriv.wow_power_mgnt);5096#endif /* CONFIG_WOWLAN */50975098goto exit;5099}51005101if (mode == 1) {5102/* LPS */5103RTW_INFO("%s: LPS: %s, en=%d\n", __FUNCTION__, (en == 0) ? "disable":"enable", en);5104if (rtw_pm_set_lps(adapter, en) != 0 )5105RTW_ERR("%s: invalid parameter, mode=%d, level=%d\n", __FUNCTION__, mode, en);51065107} else if (mode == 2) {5108/* IPS */5109RTW_INFO("%s: IPS: %s, en=%d\n", __FUNCTION__, (en == 0) ? "disable":"enable", en);5110if (rtw_pm_set_ips(adapter, en) != 0 )5111RTW_ERR("%s: invalid parameter, mode=%d, level=%d\n", __FUNCTION__, mode, en);5112}5113#ifdef CONFIG_WOWLAN5114else if (mode == 3) {5115/* WOW LPS */5116RTW_INFO("%s: WOW LPS: %s, en=%d\n", __FUNCTION__, (en == 0) ? "disable":"enable", en);5117if (rtw_pm_set_wow_lps(adapter, en) != 0 )5118RTW_ERR("%s: invalid parameter, mode=%d, level=%d\n", __FUNCTION__, mode, en);5119}5120#endif /* CONFIG_WOWLAN */5121else5122RTW_ERR("%s: invalid parameter, mode = %d!\n", __FUNCTION__, mode);51235124exit:5125return count;5126}51275128#ifdef CONFIG_WMMPS_STA5129int proc_get_wmmps_info(struct seq_file *m, void *v)5130{5131struct net_device *dev = m->private;5132_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);5133struct registry_priv *pregpriv = &padapter->registrypriv;5134char *uapsd_max_sp_str="";51355136if (pregpriv){5137switch(pregpriv->uapsd_max_sp_len) {5138case 0:5139uapsd_max_sp_str = "NO_LIMIT";5140break;5141case 1:5142uapsd_max_sp_str = "TWO_MSDU";5143break;5144case 2:5145uapsd_max_sp_str = "FOUR_MSDU";5146break;5147case 3:5148uapsd_max_sp_str = "SIX_MSDU";5149break;5150default:5151uapsd_max_sp_str = "UNSPECIFIED";5152break;5153}51545155RTW_PRINT_SEL(m, "====== WMMPS_STA Info:======\n");5156RTW_PRINT_SEL(m, "uapsd_max_sp_len=0x%02x (%s)\n", pregpriv->uapsd_max_sp_len, uapsd_max_sp_str);5157RTW_PRINT_SEL(m, "uapsd_ac_enable=0x%02x\n", pregpriv->uapsd_ac_enable);5158RTW_PRINT_SEL(m, "BIT0 - AC_VO UAPSD: %s\n", (pregpriv->uapsd_ac_enable & DRV_CFG_UAPSD_VO) ? "Enabled" : "Disabled");5159RTW_PRINT_SEL(m, "BIT1 - AC_VI UAPSD: %s\n", (pregpriv->uapsd_ac_enable & DRV_CFG_UAPSD_VI) ? "Enabled" : "Disabled");5160RTW_PRINT_SEL(m, "BIT2 - AC_BK UAPSD: %s\n", (pregpriv->uapsd_ac_enable & DRV_CFG_UAPSD_BK) ? "Enabled" : "Disabled");5161RTW_PRINT_SEL(m, "BIT3 - AC_BE UAPSD: %s\n", (pregpriv->uapsd_ac_enable & DRV_CFG_UAPSD_BE) ? "Enabled" : "Disabled");5162RTW_PRINT_SEL(m, "============================\n");5163}51645165return 0;5166}51675168ssize_t proc_set_wmmps_info(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)5169{5170struct net_device *dev = data;5171_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);5172struct registry_priv *pregpriv = &padapter->registrypriv;5173char tmp[32];5174u8 uapsd_ac_setting;5175u8 uapsd_max_sp_len_setting;51765177if (count < 1)5178return -EFAULT;51795180if (count > sizeof(tmp)) {5181rtw_warn_on(1);5182return -EFAULT;5183}51845185if (buffer && !copy_from_user(tmp, buffer, count)) {51865187int num = sscanf(tmp, "%hhu %hhx", &uapsd_max_sp_len_setting, &uapsd_ac_setting);51885189if (pregpriv) {5190if (num >= 1) {5191pregpriv->uapsd_max_sp_len = uapsd_max_sp_len_setting;5192RTW_INFO("uapsd_max_sp_len = %d\n", pregpriv->uapsd_max_sp_len);5193}51945195if (num >= 2) {5196pregpriv->uapsd_ac_enable = uapsd_ac_setting;5197RTW_INFO("uapsd_ac_enable = 0x%02x\n", pregpriv->uapsd_ac_enable);5198}5199}5200}52015202return count;5203}5204#endif /* CONFIG_WMMPS_STA */5205#endif /* CONFIG_POWER_SAVING */52065207#ifdef CONFIG_TDLS5208int proc_get_tdls_enable(struct seq_file *m, void *v)5209{5210struct net_device *dev = m->private;5211_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);5212struct registry_priv *pregpriv = &padapter->registrypriv;52135214if (pregpriv)5215RTW_PRINT_SEL(m, "TDLS is %s !\n", (rtw_is_tdls_enabled(padapter) == _TRUE) ? "enabled" : "disabled");52165217return 0;5218}52195220ssize_t proc_set_tdls_enable(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)5221{5222struct net_device *dev = data;5223_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);5224struct registry_priv *pregpriv = &padapter->registrypriv;5225char tmp[32];5226u32 en_tdls = 0;52275228if (count < 1)5229return -EFAULT;52305231if (count > sizeof(tmp)) {5232rtw_warn_on(1);5233return -EFAULT;5234}52355236if (buffer && !copy_from_user(tmp, buffer, count)) {52375238int num = sscanf(tmp, "%d ", &en_tdls);52395240if (num == 1 && pregpriv) {5241if (en_tdls > 0)5242rtw_enable_tdls_func(padapter);5243else5244rtw_disable_tdls_func(padapter, _TRUE);5245}5246}52475248return count;5249}52505251static int proc_tdls_display_tdls_function_info(struct seq_file *m)5252{5253struct net_device *dev = m->private;5254_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);5255struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;5256u8 SpaceBtwnItemAndValue = TDLS_DBG_INFO_SPACE_BTWN_ITEM_AND_VALUE;5257u8 SpaceBtwnItemAndValueTmp = 0;5258BOOLEAN FirstMatchFound = _FALSE;5259int j = 0;52605261RTW_PRINT_SEL(m, "============[TDLS Function Info]============\n");5262RTW_PRINT_SEL(m, "%-*s = %s\n", SpaceBtwnItemAndValue, "TDLS Enable", (rtw_is_tdls_enabled(padapter) == _TRUE) ? "_TRUE" : "_FALSE");5263RTW_PRINT_SEL(m, "%-*s = %s\n", SpaceBtwnItemAndValue, "TDLS Driver Setup", (ptdlsinfo->driver_setup == _TRUE) ? "_TRUE" : "_FALSE");5264RTW_PRINT_SEL(m, "%-*s = %s\n", SpaceBtwnItemAndValue, "TDLS Prohibited", (ptdlsinfo->ap_prohibited == _TRUE) ? "_TRUE" : "_FALSE");5265RTW_PRINT_SEL(m, "%-*s = %s\n", SpaceBtwnItemAndValue, "TDLS Channel Switch Prohibited", (ptdlsinfo->ch_switch_prohibited == _TRUE) ? "_TRUE" : "_FALSE");5266RTW_PRINT_SEL(m, "%-*s = %s\n", SpaceBtwnItemAndValue, "TDLS Link Established", (ptdlsinfo->link_established == _TRUE) ? "_TRUE" : "_FALSE");5267RTW_PRINT_SEL(m, "%-*s = %d/%d\n", SpaceBtwnItemAndValue, "TDLS STA Num (Linked/Allowed)", ptdlsinfo->sta_cnt, MAX_ALLOWED_TDLS_STA_NUM);5268RTW_PRINT_SEL(m, "%-*s = %s\n", SpaceBtwnItemAndValue, "TDLS Allowed STA Num Reached", (ptdlsinfo->sta_maximum == _TRUE) ? "_TRUE" : "_FALSE");52695270#ifdef CONFIG_TDLS_CH_SW5271RTW_PRINT_SEL(m, "%-*s =", SpaceBtwnItemAndValue, "TDLS CH SW State");5272if (ptdlsinfo->chsw_info.ch_sw_state == TDLS_STATE_NONE)5273RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_STATE_NONE");5274else {5275for (j = 0; j < 32; j++) {5276if (ptdlsinfo->chsw_info.ch_sw_state & BIT(j)) {5277if (FirstMatchFound == _FALSE) {5278SpaceBtwnItemAndValueTmp = 1;5279FirstMatchFound = _TRUE;5280} else5281SpaceBtwnItemAndValueTmp = SpaceBtwnItemAndValue + 3;5282switch (BIT(j)) {5283case TDLS_INITIATOR_STATE:5284RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_INITIATOR_STATE");5285break;5286case TDLS_RESPONDER_STATE:5287RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_RESPONDER_STATE");5288break;5289case TDLS_LINKED_STATE:5290RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_LINKED_STATE");5291break;5292case TDLS_WAIT_PTR_STATE:5293RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_WAIT_PTR_STATE");5294break;5295case TDLS_ALIVE_STATE:5296RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_ALIVE_STATE");5297break;5298case TDLS_CH_SWITCH_ON_STATE:5299RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_CH_SWITCH_ON_STATE");5300break;5301case TDLS_PEER_AT_OFF_STATE:5302RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_PEER_AT_OFF_STATE");5303break;5304case TDLS_CH_SW_INITIATOR_STATE:5305RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_CH_SW_INITIATOR_STATE");5306break;5307case TDLS_WAIT_CH_RSP_STATE:5308RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValue, " ", "TDLS_WAIT_CH_RSP_STATE");5309break;5310default:5311RTW_PRINT_SEL(m, "%-*sBIT(%d)\n", SpaceBtwnItemAndValueTmp, " ", j);5312break;5313}5314}5315}5316}53175318RTW_PRINT_SEL(m, "%-*s = %s\n", SpaceBtwnItemAndValue, "TDLS CH SW On", (ATOMIC_READ(&ptdlsinfo->chsw_info.chsw_on) == _TRUE) ? "_TRUE" : "_FALSE");5319RTW_PRINT_SEL(m, "%-*s = %d\n", SpaceBtwnItemAndValue, "TDLS CH SW Off-Channel Num", ptdlsinfo->chsw_info.off_ch_num);5320RTW_PRINT_SEL(m, "%-*s = %d\n", SpaceBtwnItemAndValue, "TDLS CH SW Channel Offset", ptdlsinfo->chsw_info.ch_offset);5321RTW_PRINT_SEL(m, "%-*s = %d\n", SpaceBtwnItemAndValue, "TDLS CH SW Current Time", ptdlsinfo->chsw_info.cur_time);5322RTW_PRINT_SEL(m, "%-*s = %s\n", SpaceBtwnItemAndValue, "TDLS CH SW Delay Switch Back", (ptdlsinfo->chsw_info.delay_switch_back == _TRUE) ? "_TRUE" : "_FALSE");5323RTW_PRINT_SEL(m, "%-*s = %d\n", SpaceBtwnItemAndValue, "TDLS CH SW Dump Back", ptdlsinfo->chsw_info.dump_stack);5324#endif53255326RTW_PRINT_SEL(m, "%-*s = %s\n", SpaceBtwnItemAndValue, "TDLS Device Discovered", (ptdlsinfo->dev_discovered == _TRUE) ? "_TRUE" : "_FALSE");53275328return 0;5329}53305331static int proc_tdls_display_network_info(struct seq_file *m)5332{5333struct net_device *dev = m->private;5334_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);5335struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);5336struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;5337struct wlan_network *cur_network = &(pmlmepriv->cur_network);5338int i = 0;5339u8 SpaceBtwnItemAndValue = TDLS_DBG_INFO_SPACE_BTWN_ITEM_AND_VALUE;53405341/* Display the linked AP/GO info */5342RTW_PRINT_SEL(m, "============[Associated AP/GO Info]============\n");53435344if ((pmlmepriv->fw_state & WIFI_STATION_STATE) && (pmlmepriv->fw_state & _FW_LINKED)) {5345RTW_PRINT_SEL(m, "%-*s = %s\n", SpaceBtwnItemAndValue, "BSSID", cur_network->network.Ssid.Ssid);5346RTW_PRINT_SEL(m, "%-*s = "MAC_FMT"\n", SpaceBtwnItemAndValue, "Mac Address", MAC_ARG(cur_network->network.MacAddress));53475348RTW_PRINT_SEL(m, "%-*s = ", SpaceBtwnItemAndValue, "Wireless Mode");5349for (i = 0; i < 8; i++) {5350if (pmlmeext->cur_wireless_mode & BIT(i)) {5351switch (BIT(i)) {5352case WIRELESS_11B:5353RTW_PRINT_SEL(m, "%4s", "11B ");5354break;5355case WIRELESS_11G:5356RTW_PRINT_SEL(m, "%4s", "11G ");5357break;5358case WIRELESS_11A:5359RTW_PRINT_SEL(m, "%4s", "11A ");5360break;5361case WIRELESS_11_24N:5362RTW_PRINT_SEL(m, "%7s", "11_24N ");5363break;5364case WIRELESS_11_5N:5365RTW_PRINT_SEL(m, "%6s", "11_5N ");5366break;5367case WIRELESS_AUTO:5368RTW_PRINT_SEL(m, "%5s", "AUTO ");5369break;5370case WIRELESS_11AC:5371RTW_PRINT_SEL(m, "%5s", "11AC ");5372break;5373}5374}5375}5376RTW_PRINT_SEL(m, "\n");53775378RTW_PRINT_SEL(m, "%-*s = ", SpaceBtwnItemAndValue, "Privacy");5379switch (padapter->securitypriv.dot11PrivacyAlgrthm) {5380case _NO_PRIVACY_:5381RTW_PRINT_SEL(m, "%s\n", "NO PRIVACY");5382break;5383case _WEP40_:5384RTW_PRINT_SEL(m, "%s\n", "WEP 40");5385break;5386case _TKIP_:5387RTW_PRINT_SEL(m, "%s\n", "TKIP");5388break;5389case _TKIP_WTMIC_:5390RTW_PRINT_SEL(m, "%s\n", "TKIP WTMIC");5391break;5392case _AES_:5393RTW_PRINT_SEL(m, "%s\n", "AES");5394break;5395case _WEP104_:5396RTW_PRINT_SEL(m, "%s\n", "WEP 104");5397break;5398case _WEP_WPA_MIXED_:5399RTW_PRINT_SEL(m, "%s\n", "WEP/WPA Mixed");5400break;5401case _SMS4_:5402RTW_PRINT_SEL(m, "%s\n", "SMS4");5403break;5404#ifdef CONFIG_IEEE80211W5405case _BIP_:5406RTW_PRINT_SEL(m, "%s\n", "BIP");5407break;5408#endif /* CONFIG_IEEE80211W */5409}54105411RTW_PRINT_SEL(m, "%-*s = %d\n", SpaceBtwnItemAndValue, "Channel", pmlmeext->cur_channel);5412RTW_PRINT_SEL(m, "%-*s = ", SpaceBtwnItemAndValue, "Channel Offset");5413switch (pmlmeext->cur_ch_offset) {5414case HAL_PRIME_CHNL_OFFSET_DONT_CARE:5415RTW_PRINT_SEL(m, "%s\n", "N/A");5416break;5417case HAL_PRIME_CHNL_OFFSET_LOWER:5418RTW_PRINT_SEL(m, "%s\n", "Lower");5419break;5420case HAL_PRIME_CHNL_OFFSET_UPPER:5421RTW_PRINT_SEL(m, "%s\n", "Upper");5422break;5423}54245425RTW_PRINT_SEL(m, "%-*s = ", SpaceBtwnItemAndValue, "Bandwidth Mode");5426switch (pmlmeext->cur_bwmode) {5427case CHANNEL_WIDTH_20:5428RTW_PRINT_SEL(m, "%s\n", "20MHz");5429break;5430case CHANNEL_WIDTH_40:5431RTW_PRINT_SEL(m, "%s\n", "40MHz");5432break;5433case CHANNEL_WIDTH_80:5434RTW_PRINT_SEL(m, "%s\n", "80MHz");5435break;5436case CHANNEL_WIDTH_160:5437RTW_PRINT_SEL(m, "%s\n", "160MHz");5438break;5439case CHANNEL_WIDTH_80_80:5440RTW_PRINT_SEL(m, "%s\n", "80MHz + 80MHz");5441break;5442}5443} else5444RTW_PRINT_SEL(m, "No association with AP/GO exists!\n");54455446return 0;5447}54485449static int proc_tdls_display_tdls_sta_info(struct seq_file *m)5450{5451struct net_device *dev = m->private;5452_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);5453struct sta_priv *pstapriv = &padapter->stapriv;5454struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;5455struct sta_info *psta;5456int i = 0, j = 0;5457_irqL irqL;5458_list *plist, *phead;5459u8 SpaceBtwnItemAndValue = TDLS_DBG_INFO_SPACE_BTWN_ITEM_AND_VALUE;5460u8 SpaceBtwnItemAndValueTmp = 0;5461u8 NumOfTdlsStaToShow = 0;5462BOOLEAN FirstMatchFound = _FALSE;54635464/* Search for TDLS sta info to display */5465_enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);5466for (i = 0; i < NUM_STA; i++) {5467phead = &(pstapriv->sta_hash[i]);5468plist = get_next(phead);5469while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) {5470psta = LIST_CONTAINOR(plist, struct sta_info, hash_list);5471plist = get_next(plist);5472if (psta->tdls_sta_state != TDLS_STATE_NONE) {5473/* We got one TDLS sta info to show */5474RTW_PRINT_SEL(m, "============[TDLS Peer STA Info: STA %d]============\n", ++NumOfTdlsStaToShow);5475RTW_PRINT_SEL(m, "%-*s = "MAC_FMT"\n", SpaceBtwnItemAndValue, "Mac Address", MAC_ARG(psta->cmn.mac_addr));5476RTW_PRINT_SEL(m, "%-*s =", SpaceBtwnItemAndValue, "TDLS STA State");5477SpaceBtwnItemAndValueTmp = 0;5478FirstMatchFound = _FALSE;5479for (j = 0; j < 32; j++) {5480if (psta->tdls_sta_state & BIT(j)) {5481if (FirstMatchFound == _FALSE) {5482SpaceBtwnItemAndValueTmp = 1;5483FirstMatchFound = _TRUE;5484} else5485SpaceBtwnItemAndValueTmp = SpaceBtwnItemAndValue + 3;5486switch (BIT(j)) {5487case TDLS_INITIATOR_STATE:5488RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_INITIATOR_STATE");5489break;5490case TDLS_RESPONDER_STATE:5491RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_RESPONDER_STATE");5492break;5493case TDLS_LINKED_STATE:5494RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_LINKED_STATE");5495break;5496case TDLS_WAIT_PTR_STATE:5497RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_WAIT_PTR_STATE");5498break;5499case TDLS_ALIVE_STATE:5500RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_ALIVE_STATE");5501break;5502case TDLS_CH_SWITCH_ON_STATE:5503RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_CH_SWITCH_ON_STATE");5504break;5505case TDLS_PEER_AT_OFF_STATE:5506RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_PEER_AT_OFF_STATE");5507break;5508case TDLS_CH_SW_INITIATOR_STATE:5509RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_CH_SW_INITIATOR_STATE");5510break;5511case TDLS_WAIT_CH_RSP_STATE:5512RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValue, " ", "TDLS_WAIT_CH_RSP_STATE");5513break;5514default:5515RTW_PRINT_SEL(m, "%-*sBIT(%d)\n", SpaceBtwnItemAndValueTmp, " ", j);5516break;5517}5518}5519}55205521RTW_PRINT_SEL(m, "%-*s = ", SpaceBtwnItemAndValue, "Wireless Mode");5522for (j = 0; j < 8; j++) {5523if (psta->wireless_mode & BIT(j)) {5524switch (BIT(j)) {5525case WIRELESS_11B:5526RTW_PRINT_SEL(m, "%4s", "11B ");5527break;5528case WIRELESS_11G:5529RTW_PRINT_SEL(m, "%4s", "11G ");5530break;5531case WIRELESS_11A:5532RTW_PRINT_SEL(m, "%4s", "11A ");5533break;5534case WIRELESS_11_24N:5535RTW_PRINT_SEL(m, "%7s", "11_24N ");5536break;5537case WIRELESS_11_5N:5538RTW_PRINT_SEL(m, "%6s", "11_5N ");5539break;5540case WIRELESS_AUTO:5541RTW_PRINT_SEL(m, "%5s", "AUTO ");5542break;5543case WIRELESS_11AC:5544RTW_PRINT_SEL(m, "%5s", "11AC ");5545break;5546}5547}5548}5549RTW_PRINT_SEL(m, "\n");55505551RTW_PRINT_SEL(m, "%-*s = ", SpaceBtwnItemAndValue, "Bandwidth Mode");5552switch (psta->cmn.bw_mode) {5553case CHANNEL_WIDTH_20:5554RTW_PRINT_SEL(m, "%s\n", "20MHz");5555break;5556case CHANNEL_WIDTH_40:5557RTW_PRINT_SEL(m, "%s\n", "40MHz");5558break;5559case CHANNEL_WIDTH_80:5560RTW_PRINT_SEL(m, "%s\n", "80MHz");5561break;5562case CHANNEL_WIDTH_160:5563RTW_PRINT_SEL(m, "%s\n", "160MHz");5564break;5565case CHANNEL_WIDTH_80_80:5566RTW_PRINT_SEL(m, "%s\n", "80MHz + 80MHz");5567break;5568case CHANNEL_WIDTH_5:5569RTW_PRINT_SEL(m, "%s\n", "5MHz");5570break;5571case CHANNEL_WIDTH_10:5572RTW_PRINT_SEL(m, "%s\n", "10MHz");5573break;5574default:5575RTW_PRINT_SEL(m, "(%d)%s\n", psta->cmn.bw_mode, "invalid");5576break;5577}55785579RTW_PRINT_SEL(m, "%-*s = ", SpaceBtwnItemAndValue, "Privacy");5580switch (psta->dot118021XPrivacy) {5581case _NO_PRIVACY_:5582RTW_PRINT_SEL(m, "%s\n", "NO PRIVACY");5583break;5584case _WEP40_:5585RTW_PRINT_SEL(m, "%s\n", "WEP 40");5586break;5587case _TKIP_:5588RTW_PRINT_SEL(m, "%s\n", "TKIP");5589break;5590case _TKIP_WTMIC_:5591RTW_PRINT_SEL(m, "%s\n", "TKIP WTMIC");5592break;5593case _AES_:5594RTW_PRINT_SEL(m, "%s\n", "AES");5595break;5596case _WEP104_:5597RTW_PRINT_SEL(m, "%s\n", "WEP 104");5598break;5599case _WEP_WPA_MIXED_:5600RTW_PRINT_SEL(m, "%s\n", "WEP/WPA Mixed");5601break;5602case _SMS4_:5603RTW_PRINT_SEL(m, "%s\n", "SMS4");5604break;5605#ifdef CONFIG_IEEE80211W5606case _BIP_:5607RTW_PRINT_SEL(m, "%s\n", "BIP");5608break;5609#endif /* CONFIG_IEEE80211W */5610}56115612RTW_PRINT_SEL(m, "%-*s = %d sec/%d sec\n", SpaceBtwnItemAndValue, "TPK Lifetime (Current/Expire)", psta->TPK_count, psta->TDLS_PeerKey_Lifetime);5613RTW_PRINT_SEL(m, "%-*s = %llu\n", SpaceBtwnItemAndValue, "Tx Packets Over Direct Link", psta->sta_stats.tx_pkts);5614RTW_PRINT_SEL(m, "%-*s = %llu\n", SpaceBtwnItemAndValue, "Rx Packets Over Direct Link", psta->sta_stats.rx_data_pkts);5615}5616}5617}5618_exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);5619if (NumOfTdlsStaToShow == 0) {5620RTW_PRINT_SEL(m, "============[TDLS Peer STA Info]============\n");5621RTW_PRINT_SEL(m, "No TDLS direct link exists!\n");5622}56235624return 0;5625}56265627int proc_get_tdls_info(struct seq_file *m, void *v)5628{5629struct net_device *dev = m->private;5630_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);5631struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);5632struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;5633struct wlan_network *cur_network = &(pmlmepriv->cur_network);5634struct sta_priv *pstapriv = &padapter->stapriv;5635struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;5636struct sta_info *psta;5637int i = 0, j = 0;5638_irqL irqL;5639_list *plist, *phead;5640u8 SpaceBtwnItemAndValue = 41;5641u8 SpaceBtwnItemAndValueTmp = 0;5642u8 NumOfTdlsStaToShow = 0;5643BOOLEAN FirstMatchFound = _FALSE;56445645if (hal_chk_wl_func(padapter, WL_FUNC_TDLS) == _FALSE) {5646RTW_PRINT_SEL(m, "No tdls info can be shown since hal doesn't support tdls\n");5647return 0;5648}56495650proc_tdls_display_tdls_function_info(m);5651proc_tdls_display_network_info(m);5652proc_tdls_display_tdls_sta_info(m);56535654return 0;5655}5656#endif56575658int proc_get_monitor(struct seq_file *m, void *v)5659{5660struct net_device *dev = m->private;5661_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);5662struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);56635664if (WIFI_MONITOR_STATE == get_fwstate(pmlmepriv)) {5665RTW_PRINT_SEL(m, "Monitor mode : Enable\n");56665667RTW_PRINT_SEL(m, "ch=%d, ch_offset=%d, bw=%d\n",5668rtw_get_oper_ch(padapter), rtw_get_oper_choffset(padapter), rtw_get_oper_bw(padapter));5669} else5670RTW_PRINT_SEL(m, "Monitor mode : Disable\n");56715672return 0;5673}56745675ssize_t proc_set_monitor(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)5676{5677char tmp[32];5678struct net_device *dev = data;5679_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);5680u8 target_chan, target_offset, target_bw;56815682if (count < 3) {5683RTW_INFO("argument size is less than 3\n");5684return -EFAULT;5685}56865687if (count > sizeof(tmp)) {5688rtw_warn_on(1);5689return -EFAULT;5690}56915692if (buffer && !copy_from_user(tmp, buffer, count)) {5693int num = sscanf(tmp, "%hhu %hhu %hhu", &target_chan, &target_offset, &target_bw);56945695if (num != 3) {5696RTW_INFO("invalid write_reg parameter!\n");5697return count;5698}56995700padapter->mlmeextpriv.cur_channel = target_chan;5701set_channel_bwmode(padapter, target_chan, target_offset, target_bw);5702}57035704return count;5705}5706#ifdef DBG_XMIT_BLOCK5707int proc_get_xmit_block(struct seq_file *m, void *v)5708{5709struct net_device *dev = m->private;5710_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);57115712dump_xmit_block(m, padapter);57135714return 0;5715}57165717ssize_t proc_set_xmit_block(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)5718{5719struct net_device *dev = data;5720_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);5721char tmp[32];5722u8 xb_mode, xb_reason;57235724if (count < 1)5725return -EFAULT;57265727if (count > sizeof(tmp)) {5728rtw_warn_on(1);5729return -EFAULT;5730}57315732if (buffer && !copy_from_user(tmp, buffer, count)) {57335734int num = sscanf(tmp, "%hhx %hhx", &xb_mode, &xb_reason);57355736if (num != 2) {5737RTW_INFO("invalid parameter!\n");5738return count;5739}57405741if (xb_mode == 0)/*set*/5742rtw_set_xmit_block(padapter, xb_reason);5743else if (xb_mode == 1)/*clear*/5744rtw_clr_xmit_block(padapter, xb_reason);5745else5746RTW_INFO("invalid parameter!\n");5747}57485749return count;5750}5751#endif57525753#include <hal_data.h>5754int proc_get_efuse_map(struct seq_file *m, void *v)5755{5756struct net_device *dev = m->private;5757_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);5758PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);5759struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);5760PEFUSE_HAL pEfuseHal = &pHalData->EfuseHal;5761int i, j;5762u8 ips_mode = IPS_NUM;5763u16 mapLen;57645765EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (void *)&mapLen, _FALSE);5766if (mapLen > EFUSE_MAX_MAP_LEN)5767mapLen = EFUSE_MAX_MAP_LEN;57685769ips_mode = pwrctrlpriv->ips_mode;5770rtw_pm_set_ips(padapter, IPS_NONE);57715772if (pHalData->efuse_file_status == EFUSE_FILE_LOADED) {5773RTW_PRINT_SEL(m, "File eFuse Map loaded! file path:%s\nDriver eFuse Map From File\n", EFUSE_MAP_PATH);5774if (pHalData->bautoload_fail_flag)5775RTW_PRINT_SEL(m, "File Autoload fail!!!\n");5776} else if (pHalData->efuse_file_status == EFUSE_FILE_FAILED) {5777RTW_PRINT_SEL(m, "Open File eFuse Map Fail ! file path:%s\nDriver eFuse Map From Default\n", EFUSE_MAP_PATH);5778if (pHalData->bautoload_fail_flag)5779RTW_PRINT_SEL(m, "HW Autoload fail!!!\n");5780} else {5781RTW_PRINT_SEL(m, "Driver eFuse Map From HW\n");5782if (pHalData->bautoload_fail_flag)5783RTW_PRINT_SEL(m, "HW Autoload fail!!!\n");5784}5785for (i = 0; i < mapLen; i += 16) {5786RTW_PRINT_SEL(m, "0x%02x\t", i);5787for (j = 0; j < 8; j++)5788RTW_PRINT_SEL(m, "%02X ", pHalData->efuse_eeprom_data[i + j]);5789RTW_PRINT_SEL(m, "\t");5790for (; j < 16; j++)5791RTW_PRINT_SEL(m, "%02X ", pHalData->efuse_eeprom_data[i + j]);5792RTW_PRINT_SEL(m, "\n");5793}57945795if (rtw_efuse_map_read(padapter, 0, mapLen, pEfuseHal->fakeEfuseInitMap) == _FAIL) {5796RTW_PRINT_SEL(m, "WARN - Read Realmap Failed\n");5797return 0;5798}57995800RTW_PRINT_SEL(m, "\n");5801RTW_PRINT_SEL(m, "HW eFuse Map\n");5802for (i = 0; i < mapLen; i += 16) {5803RTW_PRINT_SEL(m, "0x%02x\t", i);5804for (j = 0; j < 8; j++)5805RTW_PRINT_SEL(m, "%02X ", pEfuseHal->fakeEfuseInitMap[i + j]);5806RTW_PRINT_SEL(m, "\t");5807for (; j < 16; j++)5808RTW_PRINT_SEL(m, "%02X ", pEfuseHal->fakeEfuseInitMap[i + j]);5809RTW_PRINT_SEL(m, "\n");5810}58115812rtw_pm_set_ips(padapter, ips_mode);58135814return 0;5815}58165817ssize_t proc_set_efuse_map(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)5818{5819#if 05820char tmp[256] = {0};5821u32 addr, cnts;5822u8 efuse_data;58235824int jj, kk;58255826struct net_device *dev = data;5827_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);5828struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);5829u8 ips_mode = IPS_NUM;58305831if (count < 3) {5832RTW_INFO("argument size is less than 3\n");5833return -EFAULT;5834}58355836if (count > sizeof(tmp)) {5837rtw_warn_on(1);5838return -EFAULT;5839}58405841if (buffer && !copy_from_user(tmp, buffer, count)) {58425843int num = sscanf(tmp, "%x %d %x", &addr, &cnts, &efuse_data);58445845if (num != 3) {5846RTW_INFO("invalid write_reg parameter!\n");5847return count;5848}5849}5850ips_mode = pwrctrlpriv->ips_mode;5851rtw_pm_set_ips(padapter, IPS_NONE);5852if (rtw_efuse_map_write(padapter, addr, cnts, &efuse_data) == _FAIL)5853RTW_INFO("WARN - rtw_efuse_map_write error!!\n");5854rtw_pm_set_ips(padapter, ips_mode);5855#endif5856return count;5857}58585859#ifdef CONFIG_IEEE80211W5860ssize_t proc_set_tx_sa_query(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)5861{5862struct net_device *dev = data;5863_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);5864struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;5865struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);5866struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);5867struct sta_priv *pstapriv = &padapter->stapriv;5868struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);5869struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);5870struct sta_info *psta;5871_list *plist, *phead;5872_irqL irqL;5873char tmp[16];5874u8 mac_addr[NUM_STA][ETH_ALEN];5875u32 key_type;5876u8 index;58775878if (count > 2) {5879RTW_INFO("argument size is more than 2\n");5880return -EFAULT;5881}58825883if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {58845885int num = sscanf(tmp, "%x", &key_type);58865887if (num != 1) {5888RTW_INFO("invalid read_reg parameter!\n");5889return count;5890}5891RTW_INFO("0: set sa query request , key_type=%d\n", key_type);5892}58935894if ((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)5895&& (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) && SEC_IS_BIP_KEY_INSTALLED(&padapter->securitypriv) == _TRUE) {5896RTW_INFO("STA:"MAC_FMT"\n", MAC_ARG(get_my_bssid(&(pmlmeinfo->network))));5897/* TX unicast sa_query to AP */5898issue_action_SA_Query(padapter, get_my_bssid(&(pmlmeinfo->network)), 0, 0, (u8)key_type);5899} else if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE && SEC_IS_BIP_KEY_INSTALLED(&padapter->securitypriv) == _TRUE) {5900/* TX unicast sa_query to every client STA */5901_enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);5902for (index = 0; index < NUM_STA; index++) {5903psta = NULL;59045905phead = &(pstapriv->sta_hash[index]);5906plist = get_next(phead);59075908while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) {5909psta = LIST_CONTAINOR(plist, struct sta_info, hash_list);5910plist = get_next(plist);5911_rtw_memcpy(&mac_addr[psta->cmn.mac_id][0], psta->cmn.mac_addr, ETH_ALEN);5912}5913}5914_exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);59155916for (index = 0; index < macid_ctl->num && index < NUM_STA; index++) {5917if (rtw_macid_is_used(macid_ctl, index) && !rtw_macid_is_bmc(macid_ctl, index)) {5918if (!_rtw_memcmp(get_my_bssid(&(pmlmeinfo->network)), &mac_addr[index][0], ETH_ALEN)5919&& !IS_MCAST(&mac_addr[index][0])) {5920issue_action_SA_Query(padapter, &mac_addr[index][0], 0, 0, (u8)key_type);5921RTW_INFO("STA[%u]:"MAC_FMT"\n", index , MAC_ARG(&mac_addr[index][0]));5922}5923}5924}5925}59265927return count;5928}59295930int proc_get_tx_sa_query(struct seq_file *m, void *v)5931{5932struct net_device *dev = m->private;5933_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);59345935RTW_PRINT_SEL(m, "%s\n", __func__);5936return 0;5937}59385939ssize_t proc_set_tx_deauth(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)5940{5941struct net_device *dev = data;5942_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);5943struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;5944struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);5945struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);5946struct sta_priv *pstapriv = &padapter->stapriv;5947struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);5948struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);5949struct sta_info *psta;5950_list *plist, *phead;5951_irqL irqL;5952char tmp[16];5953u8 mac_addr[NUM_STA][ETH_ALEN];5954u8 bc_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};5955u32 key_type;5956u8 index;595759585959if (count > 2) {5960RTW_INFO("argument size is more than 2\n");5961return -EFAULT;5962}59635964if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {59655966int num = sscanf(tmp, "%x", &key_type);59675968if (num != 1) {5969RTW_INFO("invalid read_reg parameter!\n");5970return count;5971}5972RTW_INFO("key_type=%d\n", key_type);5973}5974if (key_type < 0 || key_type > 4)5975return count;59765977if ((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)5978&& (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)) {5979if (key_type == 3) /* key_type 3 only for AP mode */5980return count;5981/* TX unicast deauth to AP */5982issue_deauth_11w(padapter, get_my_bssid(&(pmlmeinfo->network)), 0, (u8)key_type);5983} else if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) {5984u8 updated = _FALSE;59855986if (key_type == 3)5987issue_deauth_11w(padapter, bc_addr, 0, IEEE80211W_RIGHT_KEY);59885989/* TX unicast deauth to every client STA */5990_enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);5991for (index = 0; index < NUM_STA; index++) {5992psta = NULL;59935994phead = &(pstapriv->sta_hash[index]);5995plist = get_next(phead);59965997while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) {5998psta = LIST_CONTAINOR(plist, struct sta_info, hash_list);5999plist = get_next(plist);6000_rtw_memcpy(&mac_addr[psta->cmn.mac_id][0], psta->cmn.mac_addr, ETH_ALEN);6001}6002}6003_exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);60046005for (index = 0; index < macid_ctl->num && index < NUM_STA; index++) {6006if (rtw_macid_is_used(macid_ctl, index) && !rtw_macid_is_bmc(macid_ctl, index)) {6007if (!_rtw_memcmp(get_my_bssid(&(pmlmeinfo->network)), &mac_addr[index][0], ETH_ALEN)) {6008if (key_type != 3)6009issue_deauth_11w(padapter, &mac_addr[index][0], 0, (u8)key_type);60106011psta = rtw_get_stainfo(pstapriv, &mac_addr[index][0]);6012if (psta && key_type != IEEE80211W_WRONG_KEY && key_type != IEEE80211W_NO_KEY) {6013_enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);6014if (rtw_is_list_empty(&psta->asoc_list) == _FALSE) {6015rtw_list_delete(&psta->asoc_list);6016pstapriv->asoc_list_cnt--;6017updated |= ap_free_sta(padapter, psta, _FALSE, WLAN_REASON_PREV_AUTH_NOT_VALID, _TRUE);60186019}6020_exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);6021}60226023RTW_INFO("STA[%u]:"MAC_FMT"\n", index , MAC_ARG(&mac_addr[index][0]));6024}6025}6026}60276028associated_clients_update(padapter, updated, STA_INFO_UPDATE_ALL);6029}60306031return count;6032}60336034int proc_get_tx_deauth(struct seq_file *m, void *v)6035{6036struct net_device *dev = m->private;6037_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);60386039RTW_PRINT_SEL(m, "%s\n", __func__);6040return 0;6041}60426043ssize_t proc_set_tx_auth(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)6044{6045struct net_device *dev = data;6046_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);6047struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;6048struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);6049struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);6050struct sta_priv *pstapriv = &padapter->stapriv;6051struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);6052struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);6053struct sta_info *psta;6054_list *plist, *phead;6055_irqL irqL;6056char tmp[16];6057u8 mac_addr[NUM_STA][ETH_ALEN];6058u8 bc_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};6059u32 tx_auth;6060u8 index;606160626063if (count > 2) {6064RTW_INFO("argument size is more than 2\n");6065return -EFAULT;6066}60676068if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {60696070int num = sscanf(tmp, "%x", &tx_auth);60716072if (num != 1) {6073RTW_INFO("invalid read_reg parameter!\n");6074return count;6075}6076RTW_INFO("1: setnd auth, 2: send assoc request. tx_auth=%d\n", tx_auth);6077}60786079if ((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)6080&& (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)) {6081if (tx_auth == 1) {6082/* TX unicast auth to AP */6083issue_auth(padapter, NULL, 0);6084} else if (tx_auth == 2) {6085/* TX unicast auth to AP */6086issue_assocreq(padapter);6087}6088}60896090return count;6091}60926093int proc_get_tx_auth(struct seq_file *m, void *v)6094{6095struct net_device *dev = m->private;6096_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);60976098RTW_PRINT_SEL(m, "%s\n", __func__);6099return 0;6100}6101#endif /* CONFIG_IEEE80211W */61026103#ifdef CONFIG_CUSTOMER01_SMART_ANTENNA6104static u32 phase_idx;6105int proc_get_pathb_phase(struct seq_file *m, void *v)6106{6107struct net_device *dev = m->private;6108_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);61096110RTW_PRINT_SEL(m, "PathB phase index =%d\n", phase_idx);6111return 0;6112}61136114ssize_t proc_set_pathb_phase(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)6115{6116struct net_device *dev = data;6117_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);6118char tmp[255];6119int num;6120u32 tmp_idx;61216122if (NULL == buffer) {6123RTW_INFO(FUNC_ADPT_FMT ": input buffer is NULL!\n", FUNC_ADPT_ARG(padapter));6124return -EFAULT;6125}61266127if (count < 1) {6128RTW_INFO(FUNC_ADPT_FMT ": input length is 0!\n", FUNC_ADPT_ARG(padapter));6129return -EFAULT;6130}61316132if (buffer && !copy_from_user(tmp, buffer, count)) {6133num = sscanf(tmp, "%u", &tmp_idx);6134if ((tmp_idx < 0) || (tmp_idx > 11)) {6135RTW_INFO(FUNC_ADPT_FMT "Invalid input value\n", FUNC_ADPT_ARG(padapter));6136return count;6137}6138phase_idx = tmp_idx;6139rtw_hal_set_pathb_phase(padapter, phase_idx);6140}6141return count;6142}6143#endif61446145#ifdef CONFIG_MCC_MODE6146int proc_get_mcc_info(struct seq_file *m, void *v)6147{6148struct net_device *dev = m->private;6149_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);61506151dump_adapters_status(m, adapter_to_dvobj(adapter));6152rtw_hal_dump_mcc_info(m, adapter_to_dvobj(adapter));6153return 0;6154}61556156int proc_get_mcc_policy_table(struct seq_file *m, void *v)6157{6158struct net_device *dev = m->private;6159_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);61606161rtw_hal_dump_mcc_policy_table(m);6162return 0;6163}61646165ssize_t proc_set_mcc_enable(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)6166{6167struct net_device *dev = data;6168_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);6169char tmp[255];6170u32 en_mcc = 0;61716172if (NULL == buffer) {6173RTW_INFO(FUNC_ADPT_FMT ": input buffer is NULL!\n", FUNC_ADPT_ARG(padapter));6174return -EFAULT;6175}61766177if (count < 1) {6178RTW_INFO(FUNC_ADPT_FMT ": input length is 0!\n", FUNC_ADPT_ARG(padapter));6179return -EFAULT;6180}61816182if (count > sizeof(tmp)) {6183RTW_INFO(FUNC_ADPT_FMT ": input length is too large\n", FUNC_ADPT_ARG(padapter));6184rtw_warn_on(1);6185return -EFAULT;6186}61876188if (buffer && !copy_from_user(tmp, buffer, count)) {6189struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);6190_adapter *iface = NULL;6191u8 i = 0;6192int num = sscanf(tmp, "%u", &en_mcc);61936194if (num < 1) {6195RTW_INFO(FUNC_ADPT_FMT ": input parameters < 1\n", FUNC_ADPT_ARG(padapter));6196return -EINVAL;6197}61986199RTW_INFO("%s: en_mcc = %d\n", __func__, en_mcc);62006201for (i = 0; i < dvobj->iface_nums; i++) {6202iface = dvobj->padapters[i];6203if (!iface)6204continue;6205iface->registrypriv.en_mcc = en_mcc;6206}6207}62086209return count;6210}62116212ssize_t proc_set_mcc_duration(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)6213{6214struct net_device *dev = data;6215_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);6216char tmp[255];6217u32 enable_runtime_duration = 0, mcc_duration = 0, type = 0;62186219if (NULL == buffer) {6220RTW_INFO(FUNC_ADPT_FMT ": input buffer is NULL!\n", FUNC_ADPT_ARG(padapter));6221return -EFAULT;6222}62236224if (count < 1) {6225RTW_INFO(FUNC_ADPT_FMT ": input length is 0!\n", FUNC_ADPT_ARG(padapter));6226return -EFAULT;6227}62286229if (count > sizeof(tmp)) {6230RTW_INFO(FUNC_ADPT_FMT ": input length is too large\n", FUNC_ADPT_ARG(padapter));6231rtw_warn_on(1);6232return -EFAULT;6233}62346235if (buffer && !copy_from_user(tmp, buffer, count)) {6236int num = sscanf(tmp, "%u %u %u", &enable_runtime_duration, &type, &mcc_duration);62376238if (num < 1) {6239RTW_INFO(FUNC_ADPT_FMT ": input parameters < 1\n", FUNC_ADPT_ARG(padapter));6240return -EINVAL;6241}62426243if (num > 3) {6244RTW_INFO(FUNC_ADPT_FMT ": input parameters > 2\n", FUNC_ADPT_ARG(padapter));6245return -EINVAL;6246}62476248if (num == 2) {6249RTW_INFO(FUNC_ADPT_FMT ": input parameters > 2\n", FUNC_ADPT_ARG(padapter));6250return -EINVAL;6251}62526253if (num >= 1) {6254SET_MCC_RUNTIME_DURATION(padapter, enable_runtime_duration);6255RTW_INFO("runtime duration:%s\n", enable_runtime_duration ? "enable":"disable");6256}62576258if (num == 3) {6259RTW_INFO("type:%d, mcc duration:%d\n", type, mcc_duration);6260rtw_set_mcc_duration_cmd(padapter, type, mcc_duration);6261}6262}62636264return count;6265}62666267#ifdef CONFIG_MCC_PHYDM_OFFLOAD6268ssize_t proc_set_mcc_phydm_offload_enable(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)6269{6270struct net_device *dev = data;6271_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);6272char tmp[255];6273u32 mcc_phydm_enable = 0;62746275if (NULL == buffer) {6276RTW_INFO(FUNC_ADPT_FMT ": input buffer is NULL!\n", FUNC_ADPT_ARG(padapter));6277return -EFAULT;6278}62796280if (count < 1) {6281RTW_INFO(FUNC_ADPT_FMT ": input length is 0!\n", FUNC_ADPT_ARG(padapter));6282return -EFAULT;6283}62846285if (count > sizeof(tmp)) {6286RTW_INFO(FUNC_ADPT_FMT ": input length is too large\n", FUNC_ADPT_ARG(padapter));6287rtw_warn_on(1);6288return -EFAULT;6289}62906291if (buffer && !copy_from_user(tmp, buffer, count)) {6292struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);6293u8 i = 0;6294int num = sscanf(tmp, "%u", &mcc_phydm_enable);62956296if (num < 1) {6297RTW_INFO(FUNC_ADPT_FMT ": input parameters < 1\n", FUNC_ADPT_ARG(padapter));6298return -EINVAL;6299}63006301RTW_INFO("%s: mcc phydm enable = %d\n", __func__, mcc_phydm_enable);6302rtw_set_mcc_phydm_offload_enable_cmd(padapter, mcc_phydm_enable, _TRUE);6303}63046305return count;6306}6307#endif63086309ssize_t proc_set_mcc_single_tx_criteria(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)6310{6311struct net_device *dev = data;6312_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);6313char tmp[255];6314u32 mcc_single_tx_criteria = 0;63156316if (NULL == buffer) {6317RTW_INFO(FUNC_ADPT_FMT ": input buffer is NULL!\n", FUNC_ADPT_ARG(padapter));6318return -EFAULT;6319}63206321if (count < 1) {6322RTW_INFO(FUNC_ADPT_FMT ": input length is 0!\n", FUNC_ADPT_ARG(padapter));6323return -EFAULT;6324}63256326if (count > sizeof(tmp)) {6327RTW_INFO(FUNC_ADPT_FMT ": input length is too large\n", FUNC_ADPT_ARG(padapter));6328rtw_warn_on(1);6329return -EFAULT;6330}63316332if (buffer && !copy_from_user(tmp, buffer, count)) {6333struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);6334_adapter *iface = NULL;6335u8 i = 0;6336int num = sscanf(tmp, "%u", &mcc_single_tx_criteria);63376338if (num < 1) {6339RTW_INFO(FUNC_ADPT_FMT ": input parameters < 1\n", FUNC_ADPT_ARG(padapter));6340return -EINVAL;6341}63426343RTW_INFO("%s: mcc_single_tx_criteria = %d\n", __func__, mcc_single_tx_criteria);63446345for (i = 0; i < dvobj->iface_nums; i++) {6346iface = dvobj->padapters[i];6347if (!iface)6348continue;6349iface->registrypriv.rtw_mcc_single_tx_cri = mcc_single_tx_criteria;6350}635163526353}63546355return count;6356}635763586359ssize_t proc_set_mcc_ap_bw20_target_tp(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)6360{6361struct net_device *dev = data;6362_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);6363char tmp[255];6364u32 mcc_ap_bw20_target_tp = 0;63656366if (NULL == buffer) {6367RTW_INFO(FUNC_ADPT_FMT ": input buffer is NULL!\n", FUNC_ADPT_ARG(padapter));6368return -EFAULT;6369}63706371if (count < 1) {6372RTW_INFO(FUNC_ADPT_FMT ": input length is 0!\n", FUNC_ADPT_ARG(padapter));6373return -EFAULT;6374}63756376if (count > sizeof(tmp)) {6377RTW_INFO(FUNC_ADPT_FMT ": input length is too large\n", FUNC_ADPT_ARG(padapter));6378rtw_warn_on(1);6379return -EFAULT;6380}63816382if (buffer && !copy_from_user(tmp, buffer, count)) {6383int num = sscanf(tmp, "%u", &mcc_ap_bw20_target_tp);63846385if (num < 1) {6386RTW_INFO(FUNC_ADPT_FMT ": input parameters < 1\n", FUNC_ADPT_ARG(padapter));6387return -EINVAL;6388}63896390RTW_INFO("%s: mcc_ap_bw20_target_tp = %d\n", __func__, mcc_ap_bw20_target_tp);63916392padapter->registrypriv.rtw_mcc_ap_bw20_target_tx_tp = mcc_ap_bw20_target_tp;639363946395}63966397return count;6398}63996400ssize_t proc_set_mcc_ap_bw40_target_tp(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)6401{6402struct net_device *dev = data;6403_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);6404char tmp[255];6405u32 mcc_ap_bw40_target_tp = 0;64066407if (NULL == buffer) {6408RTW_INFO(FUNC_ADPT_FMT ": input buffer is NULL!\n", FUNC_ADPT_ARG(padapter));6409return -EFAULT;6410}64116412if (count < 1) {6413RTW_INFO(FUNC_ADPT_FMT ": input length is 0!\n", FUNC_ADPT_ARG(padapter));6414return -EFAULT;6415}64166417if (count > sizeof(tmp)) {6418RTW_INFO(FUNC_ADPT_FMT ": input length is too large\n", FUNC_ADPT_ARG(padapter));6419rtw_warn_on(1);6420return -EFAULT;6421}64226423if (buffer && !copy_from_user(tmp, buffer, count)) {6424int num = sscanf(tmp, "%u", &mcc_ap_bw40_target_tp);64256426if (num < 1) {6427RTW_INFO(FUNC_ADPT_FMT ": input parameters < 1\n", FUNC_ADPT_ARG(padapter));6428return -EINVAL;6429}64306431RTW_INFO("%s: mcc_ap_bw40_target_tp = %d\n", __func__, mcc_ap_bw40_target_tp);64326433padapter->registrypriv.rtw_mcc_ap_bw40_target_tx_tp = mcc_ap_bw40_target_tp;643464356436}64376438return count;6439}64406441ssize_t proc_set_mcc_ap_bw80_target_tp(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)6442{6443struct net_device *dev = data;6444_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);6445char tmp[255];6446u32 mcc_ap_bw80_target_tp = 0;64476448if (NULL == buffer) {6449RTW_INFO(FUNC_ADPT_FMT ": input buffer is NULL!\n", FUNC_ADPT_ARG(padapter));6450return -EFAULT;6451}64526453if (count < 1) {6454RTW_INFO(FUNC_ADPT_FMT ": input length is 0!\n", FUNC_ADPT_ARG(padapter));6455return -EFAULT;6456}64576458if (count > sizeof(tmp)) {6459RTW_INFO(FUNC_ADPT_FMT ": input length is too large\n", FUNC_ADPT_ARG(padapter));6460rtw_warn_on(1);6461return -EFAULT;6462}64636464if (buffer && !copy_from_user(tmp, buffer, count)) {6465int num = sscanf(tmp, "%u", &mcc_ap_bw80_target_tp);64666467if (num < 1) {6468RTW_INFO(FUNC_ADPT_FMT ": input parameters < 1\n", FUNC_ADPT_ARG(padapter));6469return -EINVAL;6470}64716472RTW_INFO("%s: mcc_ap_bw80_target_tp = %d\n", __func__, mcc_ap_bw80_target_tp);64736474padapter->registrypriv.rtw_mcc_ap_bw80_target_tx_tp = mcc_ap_bw80_target_tp;647564766477}64786479return count;6480}64816482ssize_t proc_set_mcc_sta_bw20_target_tp(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)6483{6484struct net_device *dev = data;6485_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);6486char tmp[255];6487u32 mcc_sta_bw20_target_tp = 0;64886489if (NULL == buffer) {6490RTW_INFO(FUNC_ADPT_FMT ": input buffer is NULL!\n", FUNC_ADPT_ARG(padapter));6491return -EFAULT;6492}64936494if (count < 1) {6495RTW_INFO(FUNC_ADPT_FMT ": input length is 0!\n", FUNC_ADPT_ARG(padapter));6496return -EFAULT;6497}64986499if (count > sizeof(tmp)) {6500RTW_INFO(FUNC_ADPT_FMT ": input length is too large\n", FUNC_ADPT_ARG(padapter));6501rtw_warn_on(1);6502return -EFAULT;6503}65046505if (buffer && !copy_from_user(tmp, buffer, count)) {6506int num = sscanf(tmp, "%u", &mcc_sta_bw20_target_tp);65076508if (num < 1) {6509RTW_INFO(FUNC_ADPT_FMT ": input parameters < 1\n", FUNC_ADPT_ARG(padapter));6510return -EINVAL;6511}65126513RTW_INFO("%s: mcc_sta_bw20_target_tp = %d\n", __func__, mcc_sta_bw20_target_tp);65146515padapter->registrypriv.rtw_mcc_sta_bw20_target_tx_tp = mcc_sta_bw20_target_tp;651665176518}65196520return count;6521}65226523ssize_t proc_set_mcc_sta_bw40_target_tp(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)6524{6525struct net_device *dev = data;6526_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);6527char tmp[255];6528u32 mcc_sta_bw40_target_tp = 0;65296530if (NULL == buffer) {6531RTW_INFO(FUNC_ADPT_FMT ": input buffer is NULL!\n", FUNC_ADPT_ARG(padapter));6532return -EFAULT;6533}65346535if (count < 1) {6536RTW_INFO(FUNC_ADPT_FMT ": input length is 0!\n", FUNC_ADPT_ARG(padapter));6537return -EFAULT;6538}65396540if (count > sizeof(tmp)) {6541RTW_INFO(FUNC_ADPT_FMT ": input length is too large\n", FUNC_ADPT_ARG(padapter));6542rtw_warn_on(1);6543return -EFAULT;6544}65456546if (buffer && !copy_from_user(tmp, buffer, count)) {6547int num = sscanf(tmp, "%u", &mcc_sta_bw40_target_tp);65486549if (num < 1) {6550RTW_INFO(FUNC_ADPT_FMT ": input parameters < 1\n", FUNC_ADPT_ARG(padapter));6551return -EINVAL;6552}65536554RTW_INFO("%s: mcc_sta_bw40_target_tp = %d\n", __func__, mcc_sta_bw40_target_tp);65556556padapter->registrypriv.rtw_mcc_sta_bw40_target_tx_tp = mcc_sta_bw40_target_tp;655765586559}65606561return count;6562}65636564ssize_t proc_set_mcc_sta_bw80_target_tp(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)6565{6566struct net_device *dev = data;6567_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);6568char tmp[255];6569u32 mcc_sta_bw80_target_tp = 0;65706571if (NULL == buffer) {6572RTW_INFO(FUNC_ADPT_FMT ": input buffer is NULL!\n", FUNC_ADPT_ARG(padapter));6573return -EFAULT;6574}65756576if (count < 1) {6577RTW_INFO(FUNC_ADPT_FMT ": input length is 0!\n", FUNC_ADPT_ARG(padapter));6578return -EFAULT;6579}65806581if (count > sizeof(tmp)) {6582RTW_INFO(FUNC_ADPT_FMT ": input length is too large\n", FUNC_ADPT_ARG(padapter));6583rtw_warn_on(1);6584return -EFAULT;6585}65866587if (buffer && !copy_from_user(tmp, buffer, count)) {6588int num = sscanf(tmp, "%u", &mcc_sta_bw80_target_tp);65896590if (num < 1) {6591RTW_INFO(FUNC_ADPT_FMT ": input parameters < 1\n", FUNC_ADPT_ARG(padapter));6592return -EINVAL;6593}65946595RTW_INFO("%s: mcc_sta_bw80_target_tp = %d\n", __func__, mcc_sta_bw80_target_tp);65966597padapter->registrypriv.rtw_mcc_sta_bw80_target_tx_tp = mcc_sta_bw80_target_tp;659865996600}66016602return count;6603}6604#endif /* CONFIG_MCC_MODE */66056606int proc_get_ack_timeout(struct seq_file *m, void *v)6607{6608struct net_device *dev = m->private;6609_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);6610u8 ack_timeout_val;6611#ifdef CONFIG_RTL8821C6612u8 ack_timeout_val_cck;6613#endif66146615ack_timeout_val = rtw_read8(padapter, REG_ACKTO);66166617#ifdef CONFIG_RTL8821C6618ack_timeout_val_cck = rtw_read8(padapter, REG_ACKTO_CCK_8821C);6619RTW_PRINT_SEL(m, "Current CCK packet ACK Timeout = %d us (0x%x).\n", ack_timeout_val_cck, ack_timeout_val_cck);6620RTW_PRINT_SEL(m, "Current non-CCK packet ACK Timeout = %d us (0x%x).\n", ack_timeout_val, ack_timeout_val);6621#else6622RTW_PRINT_SEL(m, "Current ACK Timeout = %d us (0x%x).\n", ack_timeout_val, ack_timeout_val);6623#endif66246625return 0;6626}66276628ssize_t proc_set_ack_timeout(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)6629{6630struct net_device *dev = data;6631_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);6632char tmp[32];6633u32 ack_timeout_ms, ack_timeout_ms_cck;66346635if (count > sizeof(tmp)) {6636rtw_warn_on(1);6637return -EFAULT;6638}66396640if (buffer && !copy_from_user(tmp, buffer, count)) {6641int num = sscanf(tmp, "%u %u", &ack_timeout_ms, &ack_timeout_ms_cck);66426643#ifdef CONFIG_RTL8821C6644if (num < 2) {6645RTW_INFO(FUNC_ADPT_FMT ": input parameters < 2\n", FUNC_ADPT_ARG(padapter));6646return -EINVAL;6647}6648#else6649if (num < 1) {6650RTW_INFO(FUNC_ADPT_FMT ": input parameters < 1\n", FUNC_ADPT_ARG(padapter));6651return -EINVAL;6652}6653#endif6654/* This register sets the Ack time out value after Tx unicast packet. It is in units of us. */6655rtw_write8(padapter, REG_ACKTO, (u8)ack_timeout_ms);66566657#ifdef CONFIG_RTL8821C6658/* This register sets the Ack time out value after Tx unicast CCK packet. It is in units of us. */6659rtw_write8(padapter, REG_ACKTO_CCK_8821C, (u8)ack_timeout_ms_cck);6660RTW_INFO("Set CCK packet ACK Timeout to %d us.\n", ack_timeout_ms_cck);6661RTW_INFO("Set non-CCK packet ACK Timeout to %d us.\n", ack_timeout_ms);6662#else6663RTW_INFO("Set ACK Timeout to %d us.\n", ack_timeout_ms);6664#endif6665}66666667return count;6668}66696670ssize_t proc_set_fw_offload(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)6671{6672struct net_device *dev = data;6673_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);6674_adapter *pri_adapter = GET_PRIMARY_ADAPTER(adapter);6675HAL_DATA_TYPE *hal = GET_HAL_DATA(adapter);6676char tmp[32];6677u32 iqk_offload_enable = 0, ch_switch_offload_enable = 0;66786679if (buffer == NULL) {6680RTW_INFO("input buffer is NULL!\n");6681return -EFAULT;6682}66836684if (count < 1) {6685RTW_INFO("input length is 0!\n");6686return -EFAULT;6687}66886689if (count > sizeof(tmp)) {6690RTW_INFO("input length is too large\n");6691rtw_warn_on(1);6692return -EFAULT;6693}66946695if (buffer && !copy_from_user(tmp, buffer, count)) {6696int num = sscanf(tmp, "%d %d", &iqk_offload_enable, &ch_switch_offload_enable);66976698if (num < 2) {6699RTW_INFO("input parameters < 1\n");6700return -EINVAL;6701}67026703if (hal->RegIQKFWOffload != iqk_offload_enable) {6704hal->RegIQKFWOffload = iqk_offload_enable;6705rtw_run_in_thread_cmd(pri_adapter, ((void *)(rtw_hal_update_iqk_fw_offload_cap)), pri_adapter);6706}67076708if (hal->ch_switch_offload != ch_switch_offload_enable)6709hal->ch_switch_offload = ch_switch_offload_enable;6710}67116712return count;6713}67146715int proc_get_fw_offload(struct seq_file *m, void *v)6716{6717struct net_device *dev = m->private;6718_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);6719HAL_DATA_TYPE *hal = GET_HAL_DATA(adapter);672067216722RTW_PRINT_SEL(m, "IQK FW offload:%s\n", hal->RegIQKFWOffload?"enable":"disable");6723RTW_PRINT_SEL(m, "Channel switch FW offload:%s\n", hal->ch_switch_offload?"enable":"disable");6724return 0;6725}6726#ifdef CONFIG_FW_HANDLE_TXBCN6727extern void rtw_hal_set_fw_ap_bcn_offload_cmd(_adapter *adapter, bool fw_bcn_en, u8 tbtt_rpt_map);6728ssize_t proc_set_fw_tbtt_rpt(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)6729{6730struct net_device *dev = data;6731_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);6732char tmp[32];6733u32 fw_tbtt_rpt, fw_bcn_offload;673467356736if (buffer == NULL) {6737RTW_INFO("input buffer is NULL!\n");6738return -EFAULT;6739}67406741if (count < 1) {6742RTW_INFO("input length is 0!\n");6743return -EFAULT;6744}67456746if (count > sizeof(tmp)) {6747RTW_INFO("input length is too large\n");6748rtw_warn_on(1);6749return -EFAULT;6750}67516752if (buffer && !copy_from_user(tmp, buffer, count)) {6753int num = sscanf(tmp, "%d %x",&fw_bcn_offload, &fw_tbtt_rpt);67546755if (num < 2) {6756RTW_INFO("input parameters < 2\n");6757return -EINVAL;6758}6759rtw_hal_set_fw_ap_bcn_offload_cmd(adapter, fw_bcn_offload, fw_tbtt_rpt);6760}67616762return count;6763}67646765int proc_get_fw_tbtt_rpt(struct seq_file *m, void *v)6766{6767struct net_device *dev = m->private;6768_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);6769struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);67706771RTW_PRINT_SEL(m, "FW BCN offload:%s\n", dvobj->fw_bcn_offload ? "enable" : "disable");6772RTW_PRINT_SEL(m, "FW TBTT RPT:%x\n", dvobj->vap_tbtt_rpt_map);6773return 0;6774}67756776#endif67776778#ifdef CONFIG_CTRL_TXSS_BY_TP6779ssize_t proc_set_txss_tp(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)6780{6781struct net_device *dev = data;6782_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);6783struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv);67846785char tmp[32];6786u32 enable = 0;6787u32 txss_tx_tp = 0;6788int txss_chk_cnt = 0;67896790if (buffer == NULL) {6791RTW_INFO("input buffer is NULL!\n");6792return -EFAULT;6793}67946795if (count < 1) {6796RTW_INFO("input length is 0!\n");6797return -EFAULT;6798}67996800if (count > sizeof(tmp)) {6801RTW_INFO("input length is too large\n");6802rtw_warn_on(1);6803return -EFAULT;6804}68056806if (buffer && !copy_from_user(tmp, buffer, count)) {6807int num = sscanf(tmp, "%u %u %d",6808&enable, &txss_tx_tp, &txss_chk_cnt);68096810if (num < 1) {6811RTW_INFO("input parameters < 1\n");6812return -EINVAL;6813}6814pmlmeext->txss_ctrl_en = enable;68156816if (txss_tx_tp)6817pmlmeext->txss_tp_th = txss_tx_tp;6818if (txss_chk_cnt)6819pmlmeext->txss_tp_chk_cnt = txss_chk_cnt;68206821RTW_INFO("%s txss_ctl_en :%s , txss_tp_th:%d, tp_chk_cnt:%d\n",6822__func__, pmlmeext->txss_tp_th ? "Y" : "N",6823pmlmeext->txss_tp_th, pmlmeext->txss_tp_chk_cnt);68246825}68266827return count;6828}68296830int proc_get_txss_tp(struct seq_file *m, void *v)6831{6832struct net_device *dev = m->private;6833_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);6834struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv);68356836RTW_PRINT_SEL(m, "TXSS Control - %s\n", pmlmeext->txss_ctrl_en ? "enable" : "disable");6837RTW_PRINT_SEL(m, "TXSS Tx TP TH - %d\n", pmlmeext->txss_tp_th);6838RTW_PRINT_SEL(m, "TXSS check cnt - %d\n", pmlmeext->txss_tp_chk_cnt);68396840return 0;6841}6842#ifdef DBG_CTRL_TXSS6843ssize_t proc_set_txss_ctrl(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)6844{6845struct net_device *dev = data;6846_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);6847struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv);68486849char tmp[32];6850u32 tx_1ss = 0;68516852if (buffer == NULL) {6853RTW_INFO("input buffer is NULL!\n");6854return -EFAULT;6855}68566857if (count < 1) {6858RTW_INFO("input length is 0!\n");6859return -EFAULT;6860}68616862if (count > sizeof(tmp)) {6863RTW_INFO("input length is too large\n");6864rtw_warn_on(1);6865return -EFAULT;6866}68676868if (buffer && !copy_from_user(tmp, buffer, count)) {6869int num = sscanf(tmp, "%u", &tx_1ss);68706871if (num < 1) {6872RTW_INFO("input parameters < 1\n");6873return -EINVAL;6874}68756876pmlmeext->txss_ctrl_en = _FALSE;68776878dbg_ctrl_txss(adapter, tx_1ss);68796880RTW_INFO("%s set tx to 1ss :%s\n", __func__, tx_1ss ? "Y" : "N");6881}68826883return count;6884}68856886int proc_get_txss_ctrl(struct seq_file *m, void *v)6887{6888struct net_device *dev = m->private;6889_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);6890struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv);68916892RTW_PRINT_SEL(m, "TXSS 1ss - %s\n", pmlmeext->txss_1ss ? "Y" : "N");68936894return 0;6895}6896#endif6897#endif68986899#ifdef CONFIG_DBG_RF_CAL6900int proc_get_iqk_info(struct seq_file *m, void *v)6901{6902struct net_device *dev = m->private;6903_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);69046905return 0;6906}69076908ssize_t proc_set_iqk(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)6909{6910struct net_device *dev = data;6911_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);6912char tmp[32];6913u32 recovery, clear, segment;69146915if (count < 1)6916return -EFAULT;69176918if (count > sizeof(tmp)) {6919rtw_warn_on(1);6920return -EFAULT;6921}69226923if (buffer && !copy_from_user(tmp, buffer, count)) {69246925int num = sscanf(tmp, "%d %d %d", &recovery, &clear, &segment);69266927if (num != 3) {6928RTW_INFO("Invalid format\n");6929return count;6930}69316932rtw_hal_iqk_test(padapter, recovery, clear, segment);6933}69346935return count;69366937}69386939int proc_get_lck_info(struct seq_file *m, void *v)6940{6941struct net_device *dev = m->private;6942_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);69436944return 0;6945}69466947ssize_t proc_set_lck(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)6948{6949struct net_device *dev = data;6950_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);6951char tmp[32];6952u32 trigger;69536954if (count < 1)6955return -EFAULT;69566957if (count > sizeof(tmp)) {6958rtw_warn_on(1);6959return -EFAULT;6960}69616962if (buffer && !copy_from_user(tmp, buffer, count)) {69636964int num = sscanf(tmp, "%d", &trigger);69656966if (num != 1) {6967RTW_INFO("Invalid format\n");6968return count;6969}69706971rtw_hal_lck_test(padapter);6972}69736974return count;6975}6976#endif /* CONFIG_DBG_RF_CAL */69776978#ifdef CONFIG_LPS_CHK_BY_TP6979ssize_t proc_set_lps_chk_tp(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)6980{6981struct net_device *dev = data;6982_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);6983struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(adapter);6984char tmp[32];6985u32 enable = 0;6986u32 lps_tx_tp = 0, lps_rx_tp = 0, lps_bi_tp = 0;6987int lps_chk_cnt_th = 0;6988u32 lps_tx_pkts = 0, lps_rx_pkts = 0;69896990if (buffer == NULL) {6991RTW_INFO("input buffer is NULL!\n");6992return -EFAULT;6993}69946995if (count < 1) {6996RTW_INFO("input length is 0!\n");6997return -EFAULT;6998}69997000if (count > sizeof(tmp)) {7001RTW_INFO("input length is too large\n");7002rtw_warn_on(1);7003return -EFAULT;7004}70057006if (buffer && !copy_from_user(tmp, buffer, count)) {7007int num = sscanf(tmp, "%u %u %u %u %d %u %u",7008&enable, &lps_tx_tp, &lps_rx_tp, &lps_bi_tp,7009&lps_chk_cnt_th, &lps_tx_pkts, &lps_rx_pkts);70107011if (num < 1) {7012RTW_INFO("input parameters < 1\n");7013return -EINVAL;7014}7015pwrpriv->lps_chk_by_tp = enable;70167017if (lps_tx_tp) {7018pwrpriv->lps_tx_tp_th = lps_tx_tp;7019pwrpriv->lps_rx_tp_th = lps_tx_tp;7020pwrpriv->lps_bi_tp_th = lps_tx_tp;7021}7022if (lps_rx_tp)7023pwrpriv->lps_rx_tp_th = lps_rx_tp;7024if (lps_bi_tp)7025pwrpriv->lps_bi_tp_th = lps_bi_tp;70267027if (lps_chk_cnt_th)7028pwrpriv->lps_chk_cnt_th = lps_chk_cnt_th;70297030if (lps_tx_pkts)7031pwrpriv->lps_tx_pkts = lps_tx_pkts;70327033if (lps_rx_pkts)7034pwrpriv->lps_rx_pkts = lps_rx_pkts;70357036RTW_INFO("%s lps_chk_by_tp:%s , lps_tx_tp_th:%d, lps_tx_tp_th:%d, lps_bi_tp:%d\n",7037__func__, pwrpriv->lps_chk_by_tp ? "Y" : "N",7038pwrpriv->lps_tx_tp_th, pwrpriv->lps_tx_tp_th, pwrpriv->lps_bi_tp_th);7039RTW_INFO("%s lps_chk_cnt_th:%d , lps_tx_pkts:%d, lps_rx_pkts:%d\n",7040__func__, pwrpriv->lps_chk_cnt_th, pwrpriv->lps_tx_pkts, pwrpriv->lps_rx_pkts);7041}70427043return count;7044}70457046int proc_get_lps_chk_tp(struct seq_file *m, void *v)7047{7048struct net_device *dev = m->private;7049_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);7050struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(adapter);70517052RTW_PRINT_SEL(m, "LPS chk by tp - %s\n", pwrpriv->lps_chk_by_tp ? "enable" : "disable");7053RTW_PRINT_SEL(m, "LPS Tx TP TH - %d(Mbps)\n", pwrpriv->lps_tx_tp_th);7054RTW_PRINT_SEL(m, "LPS Rx TP TH - %d(Mbps)\n", pwrpriv->lps_rx_tp_th);7055RTW_PRINT_SEL(m, "LPS BI TP TH - %d(Mbps)\n", pwrpriv->lps_bi_tp_th);70567057RTW_PRINT_SEL(m, "LPS CHK CNT - %d\n", pwrpriv->lps_chk_cnt_th);7058RTW_PRINT_SEL(m, "LPS Tx PKTs - %d\n", pwrpriv->lps_tx_pkts);7059RTW_PRINT_SEL(m, "LPS Rx PKTs - %d\n", pwrpriv->lps_rx_pkts);7060return 0;7061}7062#endif /*CONFIG_LPS_CHK_BY_TP*/7063#ifdef CONFIG_SUPPORT_STATIC_SMPS7064ssize_t proc_set_smps(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)7065{7066struct net_device *dev = data;7067_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);7068struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv);7069char tmp[32];7070u32 enable = 0;7071u32 smps_en, smps_tx_tp = 0, smps_rx_tp = 0;7072u32 smps_test = 0, smps_test_en = 0;70737074if (buffer == NULL) {7075RTW_INFO("input buffer is NULL!\n");7076return -EFAULT;7077}70787079if (count < 1) {7080RTW_INFO("input length is 0!\n");7081return -EFAULT;7082}70837084if (count > sizeof(tmp)) {7085RTW_INFO("input length is too large\n");7086rtw_warn_on(1);7087return -EFAULT;7088}70897090if (buffer && !copy_from_user(tmp, buffer, count)) {7091int num = sscanf(tmp, "%u %u %u %u %u", &smps_en, &smps_tx_tp, &smps_rx_tp,7092&smps_test, &smps_test_en);70937094if (num < 1) {7095RTW_INFO("input parameters < 1\n");7096return -EINVAL;7097}70987099pmlmeext->ssmps_en = smps_en;7100if (smps_tx_tp) {7101pmlmeext->ssmps_tx_tp_th= smps_tx_tp;7102pmlmeext->ssmps_rx_tp_th= smps_tx_tp;7103}7104if (smps_rx_tp)7105pmlmeext->ssmps_rx_tp_th = smps_rx_tp;71067107#ifdef DBG_STATIC_SMPS7108if (num > 3) {7109pmlmeext->ssmps_test = smps_test;7110pmlmeext->ssmps_test_en = smps_test_en;7111}7112#endif7113RTW_INFO("SM PS : %s tx_tp_th:%d, rx_tp_th:%d\n",7114(smps_en) ? "Enable" : "Disable",7115pmlmeext->ssmps_tx_tp_th,7116pmlmeext->ssmps_rx_tp_th);7117#ifdef DBG_STATIC_SMPS7118RTW_INFO("SM PS : %s ssmps_test_en:%d\n",7119(smps_test) ? "Enable" : "Disable",7120pmlmeext->ssmps_test_en);7121#endif7122}71237124return count;7125}71267127int proc_get_smps(struct seq_file *m, void *v)7128{7129struct net_device *dev = m->private;7130_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);7131struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv);71327133RTW_PRINT_SEL(m, "Static SMPS %s\n", pmlmeext->ssmps_en ? "enable" : "disable");7134RTW_PRINT_SEL(m, "Tx TP TH %d\n", pmlmeext->ssmps_tx_tp_th);7135RTW_PRINT_SEL(m, "Rx TP TH %d\n", pmlmeext->ssmps_rx_tp_th);7136#ifdef DBG_STATIC_SMPS7137RTW_PRINT_SEL(m, "test %d, test_en:%d\n", pmlmeext->ssmps_test, pmlmeext->ssmps_test_en);7138#endif7139return 0;7140}7141#endif /*CONFIG_SUPPORT_STATIC_SMPS*/71427143#endif /* CONFIG_PROC_DEBUG */7144#define RTW_BUFDUMP_BSIZE 167145#if 17146inline void RTW_BUF_DUMP_SEL(uint _loglevel, void *sel, u8 *_titlestring,7147bool _idx_show, const u8 *_hexdata, int _hexdatalen)7148{7149#ifdef CONFIG_RTW_DEBUG7150int __i;7151u8 *ptr = (u8 *)_hexdata;71527153if (_loglevel <= rtw_drv_log_level) {7154if (_titlestring) {7155if (sel == RTW_DBGDUMP)7156RTW_PRINT("");7157_RTW_PRINT_SEL(sel, "%s", _titlestring);7158if (_hexdatalen >= RTW_BUFDUMP_BSIZE)7159_RTW_PRINT_SEL(sel, "\n");7160}71617162for (__i = 0; __i < _hexdatalen; __i++) {7163if (((__i % RTW_BUFDUMP_BSIZE) == 0) && (_hexdatalen >= RTW_BUFDUMP_BSIZE)) {7164if (sel == RTW_DBGDUMP)7165RTW_PRINT("");7166if (_idx_show)7167_RTW_PRINT_SEL(sel, "0x%03X: ", __i);7168}7169_RTW_PRINT_SEL(sel, "%02X%s", ptr[__i], (((__i + 1) % 4) == 0) ? " " : " ");7170if ((__i + 1 < _hexdatalen) && ((__i + 1) % RTW_BUFDUMP_BSIZE) == 0)7171_RTW_PRINT_SEL(sel, "\n");7172}7173_RTW_PRINT_SEL(sel, "\n");7174}7175#endif7176}7177#else7178inline void _RTW_STR_DUMP_SEL(void *sel, char *str_out)7179{7180if (sel == RTW_DBGDUMP)7181_dbgdump("%s\n", str_out);7182#if defined(_seqdump)7183else7184_seqdump(sel, "%s\n", str_out);7185#endif /*_seqdump*/7186}7187inline void RTW_BUF_DUMP_SEL(uint _loglevel, void *sel, u8 *_titlestring,7188bool _idx_show, u8 *_hexdata, int _hexdatalen)7189{7190int __i, len;7191int __j, idx;7192int block_num, remain_byte;7193char str_out[128] = {'\0'};7194char str_val[32] = {'\0'};7195char *p = NULL;7196u8 *ptr = (u8 *)_hexdata;71977198if (_loglevel <= rtw_drv_log_level) {7199/*dump title*/7200p = &str_out[0];7201if (_titlestring) {7202if (sel == RTW_DBGDUMP) {7203len = snprintf(str_val, sizeof(str_val), "%s", DRIVER_PREFIX);7204strncpy(p, str_val, len);7205p += len;7206}7207len = snprintf(str_val, sizeof(str_val), "%s", _titlestring);7208strncpy(p, str_val, len);7209p += len;7210}7211if (p != &str_out[0]) {7212_RTW_STR_DUMP_SEL(sel, str_out);7213_rtw_memset(&str_out, '\0', sizeof(str_out));7214}72157216/*dump buffer*/7217block_num = _hexdatalen / RTW_BUFDUMP_BSIZE;7218remain_byte = _hexdatalen % RTW_BUFDUMP_BSIZE;7219for (__i = 0; __i < block_num; __i++) {7220p = &str_out[0];7221if (sel == RTW_DBGDUMP) {7222len = snprintf(str_val, sizeof(str_val), "%s", DRIVER_PREFIX);7223strncpy(p, str_val, len);7224p += len;7225}7226if (_idx_show) {7227len = snprintf(str_val, sizeof(str_val), "0x%03X: ", __i * RTW_BUFDUMP_BSIZE);7228strncpy(p, str_val, len);7229p += len;7230}7231for (__j =0; __j < RTW_BUFDUMP_BSIZE; __j++) {7232idx = __i * RTW_BUFDUMP_BSIZE + __j;7233len = snprintf(str_val, sizeof(str_val), "%02X%s", ptr[idx], (((__j + 1) % 4) == 0) ? " " : " ");7234strncpy(p, str_val, len);7235p += len;7236}7237_RTW_STR_DUMP_SEL(sel, str_out);7238_rtw_memset(&str_out, '\0', sizeof(str_out));7239}72407241p = &str_out[0];7242if ((sel == RTW_DBGDUMP) && remain_byte) {7243len = snprintf(str_val, sizeof(str_val), "%s", DRIVER_PREFIX);7244strncpy(p, str_val, len);7245p += len;7246}7247if (_idx_show && remain_byte) {7248len = snprintf(str_val, sizeof(str_val), "0x%03X: ", block_num * RTW_BUFDUMP_BSIZE);7249strncpy(p, str_val, len);7250p += len;7251}7252for (__i = 0; __i < remain_byte; __i++) {7253idx = block_num * RTW_BUFDUMP_BSIZE + __i;7254len = snprintf(str_val, sizeof(str_val), "%02X%s", ptr[idx], (((__i + 1) % 4) == 0) ? " " : " ");7255strncpy(p, str_val, len);7256p += len;7257}7258_RTW_STR_DUMP_SEL(sel, str_out);7259}7260}72617262#endif726372647265