1
0
mirror of https://github.com/abperiasamy/rtl8812AU_8821AU_linux.git synced 2025-04-29 15:19:40 +02:00

Openwrt and new compiler related fixes (#285)

* rtw-ap: Fix compiler warning.

Signed-off-by: Ben Greear <greearb@candelatech.com>

* makefile:  Add entry for compiling against openwrt tree.

Users would need to edit it to match their path, but
this should get them started.

Signed-off-by: Ben Greear <greearb@candelatech.com>

* makefile:  Allow defining KSRC outside of build.

So, you can do this:

KSRC=/tmp/my/kernel make

And not have to edit the makefile to have this function as desired.

Signed-off-by: Ben Greear <greearb@candelatech.com>

* Fix stack-too-large warning on x86-64 compile

Signed-off-by: Ben Greear <greearb@candelatech.com>

* compile:  Allow cross-compiling on cmd-line w/out editing Makefile

For instance:

KSRC=/home/greearb/git/openwrt-neo2-dev/build_dir/target-aarch64_cortex-a53_musl/linux-sunxi_cortexa53/linux-4.14.78 \
 EXT_EXTRA_CFLAGS=-DCONFIG_LITTLE_ENDIAN ARCH=arm64 CROSS_COMPILE=aarch64-openwrt-linux- MODDESTDIR=/tmp make V=1

Signed-off-by: Ben Greear <greearb@candelatech.com>

* build:  Attempt to auto-detect endian-ness.

Will make building in openwrt much easier.

Signed-off-by: Ben Greear <greearb@candelatech.com>

* Fix build against openwrt backports tree.

Like breaks builds elsewhere, can fix it up later.

Signed-off-by: Ben Greear <greearb@candelatech.com>

* Register wiphy after we probe MAC addr.

This way the phy object has a valid MAC-addr, which can be helpful
for identification.

Signed-off-by: Ben Greear <greearb@candelatech.com>

* Make sure MAC is set in wiphy_preinit

This is needed to make sure the phy registers with a proper MAC
address instead of all 00

Signed-off-by: Ben Greear <greearb@candelatech.com>

* Fix build on 4.19 kernel.

Signed-off-by: Ben Greear <greearb@candelatech.com>

* Fix compile against 4.20 kernel.

Remove some variable-length arrays (which could be security bugs,
ways to overflow the stack it seems), and remove use of
get_monotonic_boottime.

Signed-off-by: Ben Greear <greearb@candelatech.com>

* Support arm64
This commit is contained in:
Ben Greear 2019-03-08 09:22:32 -08:00 committed by Harshavardhana
parent fb91faf610
commit ba6fa69560
13 changed files with 355 additions and 106 deletions

View File

@ -83,6 +83,7 @@ CONFIG_PLATFORM_ARM_S3C6K4 = n
CONFIG_PLATFORM_MIPS_RMI = n CONFIG_PLATFORM_MIPS_RMI = n
CONFIG_PLATFORM_RTD2880B = n CONFIG_PLATFORM_RTD2880B = n
CONFIG_PLATFORM_MIPS_AR9132 = n CONFIG_PLATFORM_MIPS_AR9132 = n
CONFIG_PLATFORM_OPENWRT_NEO2 = n
CONFIG_PLATFORM_RTK_DMP = n CONFIG_PLATFORM_RTK_DMP = n
CONFIG_PLATFORM_MIPS_PLM = n CONFIG_PLATFORM_MIPS_PLM = n
CONFIG_PLATFORM_MSTAR389 = n CONFIG_PLATFORM_MSTAR389 = n
@ -869,18 +870,31 @@ EXTRA_CFLAGS += -DCONFIG_TDLS
endif endif
ifeq ($(CONFIG_PLATFORM_I386_PC), y) ifeq ($(CONFIG_PLATFORM_I386_PC), y)
ifdef EXT_EXTRA_CFLAGS
EXTRA_CFLAGS += $(EXT_EXTRA_CFLAGS)
else
EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
#EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE #EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE
EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT
#EXTRA_CFLAGS += -DCONFIG_P2P_IPS #EXTRA_CFLAGS += -DCONFIG_P2P_IPS
SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ | sed -e s/ppc64le/powerpc/) endif
ifndef ARCH
SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/ppc64le/powerpc/ -e s/aarch64/arm64/)
ARCH ?= $(SUBARCH) ARCH ?= $(SUBARCH)
endif
ifndef CROSS_COMPILE
CROSS_COMPILE ?= CROSS_COMPILE ?=
endif
ifndef KVER ifndef KVER
KVER ?= $(shell uname -r) KVER ?= $(shell uname -r)
endif endif
ifndef KSRC
KSRC := /lib/modules/$(KVER)/build KSRC := /lib/modules/$(KVER)/build
endif
ifndef MODDESTDIR
MODDESTDIR := /lib/modules/$(KVER)/kernel/drivers/net/wireless/ MODDESTDIR := /lib/modules/$(KVER)/kernel/drivers/net/wireless/
endif
INSTALL_PREFIX := INSTALL_PREFIX :=
endif endif
@ -1046,6 +1060,16 @@ CROSS_COMPILE := mips-openwrt-linux-
KSRC := /home/alex/test_openwrt/tmp/linux-2.6.30.9 KSRC := /home/alex/test_openwrt/tmp/linux-2.6.30.9
endif endif
# This is how I built for openwrt Neo2 platform. --Ben
ifeq ($(CONFIG_PLATFORM_OPENWRT_NEO2), y)
EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
ARCH := arm64
CROSS_COMPILE := aarch64-openwrt-linux-
#export PATH=$PATH:/home/greearb/git/openwrt-neo2-dev/staging_dir/toolchain-aarch64_cortex-a53_gcc-7.3.0_musl/bin/
#export STAGING_DIR=/home/greearb/git/openwrt-neo2-dev/staging_dir
KSRC := /home/greearb/git/openwrt-neo2-dev/build_dir/target-aarch64_cortex-a53_musl/linux-sunxi_cortexa53/linux-4.14.78
endif
ifeq ($(CONFIG_PLATFORM_DMP_PHILIPS), y) ifeq ($(CONFIG_PLATFORM_DMP_PHILIPS), y)
EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DRTK_DMP_PLATFORM EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DRTK_DMP_PLATFORM
ARCH := mips ARCH := mips

View File

@ -79,6 +79,13 @@ Load module
# sudo modprobe -a rtl8812au # sudo modprobe -a rtl8812au
``` ```
# Cross-compiling. You can now specify variables on the command line w/out editing
# makefile. For instance, this builds against recent OpenWRT neo2 platform. Your
# Cross-compile binaries should be in your PATH.
KSRC=/home/greearb/git/openwrt-neo2-dev/build_dir/target-aarch64_cortex-a53_musl/linux-sunxi_cortexa53/linux-4.14.78 EXT_EXTRA_CFLAGS=-DCONFIG_LITTLE_ENDIAN ARCH=arm64 CROSS_COMPILE=aarch64-openwrt-linux- MODDESTDIR=/tmp make V=1
Setup DKMS Setup DKMS
```sh ```sh

View File

@ -194,7 +194,7 @@ void rtw_add_bcn_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork, u8 index, u8 *d
u8 bmatch = _FALSE; u8 bmatch = _FALSE;
u8 *pie = pnetwork->IEs; u8 *pie = pnetwork->IEs;
u8 *p=NULL, *dst_ie=NULL, *premainder_ie=NULL, *pbackup_remainder_ie=NULL; u8 *p=NULL, *dst_ie=NULL, *premainder_ie=NULL, *pbackup_remainder_ie=NULL;
u32 i, offset, ielen, ie_offset, remainder_ielen = 0; u32 i, offset, ielen = 0, ie_offset, remainder_ielen = 0;
for (i = sizeof(NDIS_802_11_FIXED_IEs); i < pnetwork->IELength;) { for (i = sizeof(NDIS_802_11_FIXED_IEs); i < pnetwork->IELength;) {
pIE = (PNDIS_802_11_VARIABLE_IEs)(pnetwork->IEs + i); pIE = (PNDIS_802_11_VARIABLE_IEs)(pnetwork->IEs + i);

View File

@ -3534,7 +3534,8 @@ void issue_p2p_GO_response(_adapter *padapter, u8* raddr, u8* frame_body,uint le
u8 action = P2P_PUB_ACTION_ACTION; u8 action = P2P_PUB_ACTION_ACTION;
u32 p2poui = cpu_to_be32(P2POUI); u32 p2poui = cpu_to_be32(P2POUI);
u8 oui_subtype = P2P_GO_NEGO_RESP; u8 oui_subtype = P2P_GO_NEGO_RESP;
u8 wpsie[ 255 ] = { 0x00 }, p2pie[ 255 ] = { 0x00 }; u8 *wpsie;
u8 p2pie[ 255 ] = { 0x00 };
u8 p2pielen = 0; u8 p2pielen = 0;
uint wpsielen = 0; uint wpsielen = 0;
u16 wps_devicepassword_id = 0x0000; u16 wps_devicepassword_id = 0x0000;
@ -3560,6 +3561,8 @@ void issue_p2p_GO_response(_adapter *padapter, u8* raddr, u8* frame_body,uint le
return; return;
} }
wpsie = rtw_zmalloc(256);
DBG_871X( "[%s] In, result = %d\n", __FUNCTION__, result ); DBG_871X( "[%s] In, result = %d\n", __FUNCTION__, result );
//update attribute //update attribute
pattrib = &pmgntframe->attrib; pattrib = &pmgntframe->attrib;
@ -3965,6 +3968,8 @@ void issue_p2p_GO_response(_adapter *padapter, u8* raddr, u8* frame_body,uint le
dump_mgntframe(padapter, pmgntframe); dump_mgntframe(padapter, pmgntframe);
kfree(wpsie);
return; return;
} }

View File

@ -19,7 +19,9 @@
******************************************************************************/ ******************************************************************************/
#ifndef __DRV_CONF_H__ #ifndef __DRV_CONF_H__
#define __DRV_CONF_H__ #define __DRV_CONF_H__
#include "autoconf.h"
#include <generated/autoconf.h>
#include "rtl_autoconf.h"
#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) #if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS)

View File

@ -25,6 +25,18 @@
#error "Shall be CONFIG_LITTLE_ENDIAN or CONFIG_BIG_ENDIAN, but not both!\n" #error "Shall be CONFIG_LITTLE_ENDIAN or CONFIG_BIG_ENDIAN, but not both!\n"
#endif #endif
#if !((defined CONFIG_LITTLE_ENDIAN) || (defined CONFIG_BIG_ENDIAN))
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
#define CONFIG_LITTLE_ENDIAN
//#warning "Auto-detected little-endian system...hope it is correct!"
#else
#if __BYTE_ORDER == __BIG_ENDIAN
//#warning "Auto-detected big-endian system...hope it is correct!"
#define CONFIG_BIG_ENDIAN
#endif
#endif
#endif
#if defined (CONFIG_LITTLE_ENDIAN) #if defined (CONFIG_LITTLE_ENDIAN)
#ifndef CONFIG_PLATFORM_MSTAR389 #ifndef CONFIG_PLATFORM_MSTAR389
# include <byteorder/little_endian.h> # include <byteorder/little_endian.h>

View File

@ -977,7 +977,7 @@ typedef enum _HT_CAP_AMPDU_FACTOR {
* According to IEEE802.11n spec size varies from 8K to 64K (in powers of 2) * According to IEEE802.11n spec size varies from 8K to 64K (in powers of 2)
*/ */
#define IEEE80211_MIN_AMPDU_BUF 0x8 #define IEEE80211_MIN_AMPDU_BUF 0x8
#define IEEE80211_MAX_AMPDU_BUF 0x40 //#define IEEE80211_MAX_AMPDU_BUF 0x40
/* Spatial Multiplexing Power Save Modes */ /* Spatial Multiplexing Power Save Modes */

View File

@ -349,6 +349,9 @@ static int rtw_ieee80211_channel_to_frequency(int chan, int band)
static u64 rtw_get_systime_us(void) static u64 rtw_get_systime_us(void)
{ {
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,20,0))
return ktime_to_us(ktime_get_boottime());
#else
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,39)) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,39))
struct timespec ts; struct timespec ts;
get_monotonic_boottime(&ts); get_monotonic_boottime(&ts);
@ -358,6 +361,7 @@ static u64 rtw_get_systime_us(void)
do_gettimeofday(&tv); do_gettimeofday(&tv);
return ((u64)tv.tv_sec*1000000) + tv.tv_usec; return ((u64)tv.tv_sec*1000000) + tv.tv_usec;
#endif #endif
#endif
} }
#define MAX_BSSINFO_LEN 1000 #define MAX_BSSINFO_LEN 1000
@ -5837,10 +5841,6 @@ void rtw_cfg80211_init_wiphy(_adapter *padapter)
/* init regulary domain */ /* init regulary domain */
rtw_regd_init(padapter); rtw_regd_init(padapter);
/* copy mac_addr to wiphy */
_rtw_memcpy(wiphy->perm_addr, padapter->eeprompriv.mac_addr, ETH_ALEN);
} }
/* /*
@ -5959,6 +5959,10 @@ static void rtw_cfg80211_preinit_wiphy(_adapter *padapter, struct wiphy *wiphy)
//wiphy->flags |= WIPHY_FLAG_SUPPORTS_FW_ROAM; //wiphy->flags |= WIPHY_FLAG_SUPPORTS_FW_ROAM;
#endif #endif
/* copy mac_addr to wiphy */
_rtw_memcpy(wiphy->perm_addr, padapter->eeprompriv.mac_addr, ETH_ALEN);
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)) || defined(RTW_VENDOR_EXT_SUPPORT) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)) || defined(RTW_VENDOR_EXT_SUPPORT)
rtw_cfgvendor_attach(wiphy); rtw_cfgvendor_attach(wiphy);
#endif #endif

View File

@ -83,6 +83,8 @@ static const char * const iw_operation_mode[] = {
"Auto", "Ad-Hoc", "Managed", "Master", "Repeater", "Secondary", "Monitor" "Auto", "Ad-Hoc", "Managed", "Master", "Repeater", "Secondary", "Monitor"
}; };
#ifdef CONFIG_WIRELESS_EXT
static int hex2num_i(char c) static int hex2num_i(char c)
{ {
if (c >= '0' && c <= '9') if (c >= '0' && c <= '9')
@ -132,6 +134,7 @@ static int hwaddr_aton_i(const char *txt, u8 *addr)
return 0; return 0;
} }
#endif
static inline void indicate_wx_custom_event(_adapter *padapter, char *msg) static inline void indicate_wx_custom_event(_adapter *padapter, char *msg)
{ {
@ -304,6 +307,8 @@ uint rtw_is_cckratesonly_included(u8 *rate)
} }
*/ */
#ifdef CONFIG_WIRELESS_EXT
static int search_p2p_wfd_ie(_adapter *padapter, static int search_p2p_wfd_ie(_adapter *padapter,
struct iw_request_info* info, struct wlan_network *pnetwork, struct iw_request_info* info, struct wlan_network *pnetwork,
char *start, char *stop) char *start, char *stop)
@ -378,6 +383,8 @@ static int search_p2p_wfd_ie(_adapter *padapter,
#endif //CONFIG_P2P #endif //CONFIG_P2P
return _TRUE; return _TRUE;
} }
#endif
static inline char *iwe_stream_mac_addr_proess(_adapter *padapter, static inline char *iwe_stream_mac_addr_proess(_adapter *padapter,
struct iw_request_info* info, struct wlan_network *pnetwork, struct iw_request_info* info, struct wlan_network *pnetwork,
char *start, char *stop,struct iw_event *iwe) char *start, char *stop,struct iw_event *iwe)
@ -826,6 +833,8 @@ static inline char * iwe_stream_net_rsv_process(_adapter *padapter,
return start; return start;
} }
#ifdef CONFIG_WIRELESS_EXT
#if 1 #if 1
static char *translate_scan(_adapter *padapter, static char *translate_scan(_adapter *padapter,
struct iw_request_info* info, struct wlan_network *pnetwork, struct iw_request_info* info, struct wlan_network *pnetwork,
@ -1735,6 +1744,9 @@ exit:
return ret; return ret;
} }
#endif
#ifdef CONFIG_WIRELESS_EXT
static int rtw_wx_get_name(struct net_device *dev, static int rtw_wx_get_name(struct net_device *dev,
struct iw_request_info *info, struct iw_request_info *info,
@ -10238,31 +10250,48 @@ static int rtw_mp_write_reg(struct net_device *dev,
char *width_str; char *width_str;
char width; char width;
u32 addr, data; u32 addr, data;
int ret; int ret = 0;
PADAPTER padapter = rtw_netdev_priv(dev); PADAPTER padapter = rtw_netdev_priv(dev);
char input[wrqu->length]; char* input = kmalloc(wrqu->length, GFP_KERNEL);
if (copy_from_user(input, wrqu->pointer, wrqu->length)) if (!input)
return -EFAULT; return -ENOMEM;
if (copy_from_user(input, wrqu->pointer, wrqu->length)) {
ret = -EFAULT;
goto out;
}
_rtw_memset(extra, 0, wrqu->length); _rtw_memset(extra, 0, wrqu->length);
pch = input; pch = input;
pnext = strpbrk(pch, " ,.-"); pnext = strpbrk(pch, " ,.-");
if (pnext == NULL) return -EINVAL; if (pnext == NULL) {
ret = -EINVAL;
goto out;
}
*pnext = 0; *pnext = 0;
width_str = pch; width_str = pch;
pch = pnext + 1; pch = pnext + 1;
pnext = strpbrk(pch, " ,.-"); pnext = strpbrk(pch, " ,.-");
if (pnext == NULL) return -EINVAL; if (pnext == NULL) {
ret = -EINVAL;
goto out;
}
*pnext = 0; *pnext = 0;
addr = simple_strtoul(pch, &ptmp, 16); addr = simple_strtoul(pch, &ptmp, 16);
if (addr > 0x3FFF) return -EINVAL; if (addr > 0x3FFF) {
ret = -EINVAL;
goto out;
}
pch = pnext + 1; pch = pnext + 1;
if ((pch - extra) >= wrqu->length) return -EINVAL; if ((pch - extra) >= wrqu->length) {
ret = -EINVAL;
goto out;
}
data = simple_strtoul(pch, &ptmp, 16); data = simple_strtoul(pch, &ptmp, 16);
ret = 0; ret = 0;
@ -10293,6 +10322,8 @@ static int rtw_mp_write_reg(struct net_device *dev,
break; break;
} }
out:
kfree(input);
return ret; return ret;
} }
@ -10311,7 +10342,7 @@ static int rtw_mp_read_reg(struct net_device *dev,
struct iw_request_info *info, struct iw_request_info *info,
struct iw_point *wrqu, char *extra) struct iw_point *wrqu, char *extra)
{ {
char input[wrqu->length]; char input[128];
char *pch, *pnext, *ptmp; char *pch, *pnext, *ptmp;
char *width_str; char *width_str;
char width; char width;
@ -10446,20 +10477,28 @@ static int rtw_mp_write_rf(struct net_device *dev,
union iwreq_data *wrqu, char *extra) union iwreq_data *wrqu, char *extra)
*/ */
u32 path, addr, data; u32 path, addr, data;
int ret; int ret = 0;
PADAPTER padapter = rtw_netdev_priv(dev); PADAPTER padapter = rtw_netdev_priv(dev);
char input[wrqu->length]; char* input = kmalloc(wrqu->length, GFP_KERNEL);
if (copy_from_user(input, wrqu->pointer, wrqu->length)) if (copy_from_user(input, wrqu->pointer, wrqu->length)) {
return -EFAULT; ret = -EFAULT;
goto out;
}
ret = sscanf(input, "%d,%x,%x", &path, &addr, &data); ret = sscanf(input, "%d,%x,%x", &path, &addr, &data);
if (ret < 3) return -EINVAL; if (ret < 3) {
ret = -EINVAL;
goto out;
}
if (path >= GET_HAL_RFPATH_NUM(padapter)) return -EINVAL; if ((path >= GET_HAL_RFPATH_NUM(padapter)) ||
if (addr > 0xFF) return -EINVAL; (addr > 0xFF) ||
if (data > 0xFFFFF) return -EINVAL; (data > 0xFFFFF)) {
ret = -EINVAL;
goto out;
}
_rtw_memset(extra, 0, wrqu->length); _rtw_memset(extra, 0, wrqu->length);
@ -10468,7 +10507,9 @@ static int rtw_mp_write_rf(struct net_device *dev,
sprintf(extra, "write_rf completed \n"); sprintf(extra, "write_rf completed \n");
wrqu->length = strlen(extra); wrqu->length = strlen(extra);
return 0; out:
kfree(input);
return ret;
} }
/* /*
@ -10483,7 +10524,7 @@ static int rtw_mp_read_rf(struct net_device *dev,
struct iw_request_info *info, struct iw_request_info *info,
struct iw_point *wrqu, char *extra) struct iw_point *wrqu, char *extra)
{ {
char input[wrqu->length]; char input[128];
char *pch, *pnext, *ptmp; char *pch, *pnext, *ptmp;
char data[20],tmp[20]; char data[20],tmp[20];
//u32 *data = (u32*)extra; //u32 *data = (u32*)extra;
@ -10624,11 +10665,17 @@ static int rtw_mp_rate(struct net_device *dev,
struct iw_point *wrqu, char *extra) struct iw_point *wrqu, char *extra)
{ {
u32 rate = MPT_RATE_1M; u32 rate = MPT_RATE_1M;
u8 input[wrqu->length]; u8* input = kmalloc(wrqu->length, GFP_KERNEL);
PADAPTER padapter = rtw_netdev_priv(dev); PADAPTER padapter = rtw_netdev_priv(dev);
int ret = 0;
if (copy_from_user(input, wrqu->pointer, wrqu->length)) if (!input)
return -EFAULT; return -ENOMEM;
if (copy_from_user(input, wrqu->pointer, wrqu->length)) {
ret = -EFAULT;
goto out;
}
rate = rtw_mpRateParseFunc(padapter,input); rate = rtw_mpRateParseFunc(padapter,input);
@ -10650,14 +10697,19 @@ static int rtw_mp_rate(struct net_device *dev,
sprintf( extra, "Set data rate to %s index %d" ,input,rate ); sprintf( extra, "Set data rate to %s index %d" ,input,rate );
DBG_871X("%s: %s rate index=%d \n", __func__,input,rate); DBG_871X("%s: %s rate index=%d \n", __func__,input,rate);
if (rate >= MPT_RATE_LAST ) if (rate >= MPT_RATE_LAST ) {
return -EINVAL; ret = -EINVAL;
goto out;
}
padapter->mppriv.rateidx = rate; padapter->mppriv.rateidx = rate;
Hal_SetDataRate(padapter); Hal_SetDataRate(padapter);
wrqu->length = strlen(extra); wrqu->length = strlen(extra);
return 0;
out:
kfree(input);
return ret;
} }
static int rtw_mp_channel(struct net_device *dev, static int rtw_mp_channel(struct net_device *dev,
@ -10667,12 +10719,18 @@ static int rtw_mp_channel(struct net_device *dev,
PADAPTER padapter = rtw_netdev_priv(dev); PADAPTER padapter = rtw_netdev_priv(dev);
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
u8 input[wrqu->length]; u8* input = kmalloc(wrqu->length, GFP_KERNEL);
u32 channel = 1; u32 channel = 1;
int ret = 0;
//int cur_ch_offset; //int cur_ch_offset;
if (copy_from_user(input, wrqu->pointer, wrqu->length)) if (!input)
return -EFAULT; return -ENOMEM;
if (copy_from_user(input, wrqu->pointer, wrqu->length)) {
ret = -EFAULT;
goto out;
}
channel = rtw_atoi(input); channel = rtw_atoi(input);
//DBG_871X("%s: channel=%d\n", __func__, channel); //DBG_871X("%s: channel=%d\n", __func__, channel);
@ -10683,7 +10741,9 @@ static int rtw_mp_channel(struct net_device *dev,
pHalData->CurrentChannel = channel; pHalData->CurrentChannel = channel;
wrqu->length = strlen(extra); wrqu->length = strlen(extra);
return 0; out:
kfree(input);
return ret;
} }
static int rtw_mp_bandwidth(struct net_device *dev, static int rtw_mp_bandwidth(struct net_device *dev,
@ -10725,7 +10785,7 @@ static int rtw_mp_txpower_index(struct net_device *dev,
struct iw_point *wrqu, char *extra) struct iw_point *wrqu, char *extra)
{ {
PADAPTER padapter = rtw_netdev_priv(dev); PADAPTER padapter = rtw_netdev_priv(dev);
char input[wrqu->length]; char input[128];
u32 rfpath; u32 rfpath;
u32 txpower_inx; u32 txpower_inx;
@ -10750,12 +10810,17 @@ static int rtw_mp_txpower(struct net_device *dev,
{ {
u32 idx_a = 0, idx_b = 0; u32 idx_a = 0, idx_b = 0;
int MsetPower = 1; int MsetPower = 1;
u8 input[wrqu->length]; u8* input = kmalloc(wrqu->length, GFP_KERNEL);
int ret = 0;
PADAPTER padapter = rtw_netdev_priv(dev); PADAPTER padapter = rtw_netdev_priv(dev);
if (copy_from_user(input, wrqu->pointer, wrqu->length)) if (!input)
return -EFAULT; return -ENOMEM;
if (copy_from_user(input, wrqu->pointer, wrqu->length)) {
ret = -EFAULT;
goto out;
}
MsetPower = strncmp(input, "off", 3); MsetPower = strncmp(input, "off", 3);
sscanf(input,"patha=%d,pathb=%d",&idx_a,&idx_b); sscanf(input,"patha=%d,pathb=%d",&idx_a,&idx_b);
@ -10771,6 +10836,9 @@ static int rtw_mp_txpower(struct net_device *dev,
Hal_SetAntennaPathPower(padapter); Hal_SetAntennaPathPower(padapter);
} }
wrqu->length = strlen(extra); wrqu->length = strlen(extra);
out:
kfree(input);
return 0; return 0;
} }
@ -10779,12 +10847,18 @@ static int rtw_mp_ant_tx(struct net_device *dev,
struct iw_point *wrqu, char *extra) struct iw_point *wrqu, char *extra)
{ {
u8 i; u8 i;
u8 input[wrqu->length]; u8 *input = kmalloc(wrqu->length, GFP_KERNEL);
u16 antenna = 0; u16 antenna = 0;
PADAPTER padapter = rtw_netdev_priv(dev); PADAPTER padapter = rtw_netdev_priv(dev);
int ret = 0;
if (copy_from_user(input, wrqu->pointer, wrqu->length)) if (!input)
return -EFAULT; return -ENOMEM;
if (copy_from_user(input, wrqu->pointer, wrqu->length)) {
ret = -EFAULT;
goto out;
}
//DBG_871X("%s: input=%s\n", __func__, input); //DBG_871X("%s: input=%s\n", __func__, input);
@ -10809,7 +10883,9 @@ static int rtw_mp_ant_tx(struct net_device *dev,
Hal_SetAntenna(padapter); Hal_SetAntenna(padapter);
wrqu->length = strlen(extra); wrqu->length = strlen(extra);
return 0; out:
kfree(input);
return ret;
} }
static int rtw_mp_ant_rx(struct net_device *dev, static int rtw_mp_ant_rx(struct net_device *dev,
@ -10818,11 +10894,18 @@ static int rtw_mp_ant_rx(struct net_device *dev,
{ {
u8 i; u8 i;
u16 antenna = 0; u16 antenna = 0;
u8 input[wrqu->length]; u8 *input = kmalloc(wrqu->length, GFP_KERNEL);
PADAPTER padapter = rtw_netdev_priv(dev); PADAPTER padapter = rtw_netdev_priv(dev);
int ret = 0;
if (!input)
return -ENOMEM;
if (copy_from_user(input, wrqu->pointer, wrqu->length)) {
ret = -EFAULT;
goto out;
}
if (copy_from_user(input, wrqu->pointer, wrqu->length))
return -EFAULT;
//DBG_871X("%s: input=%s\n", __func__, input); //DBG_871X("%s: input=%s\n", __func__, input);
_rtw_memset(extra, 0, wrqu->length); _rtw_memset(extra, 0, wrqu->length);
@ -10849,7 +10932,9 @@ static int rtw_mp_ant_rx(struct net_device *dev,
Hal_SetAntenna(padapter); Hal_SetAntenna(padapter);
wrqu->length = strlen(extra); wrqu->length = strlen(extra);
return 0; out:
kfree(input);
return ret;
} }
static int rtw_set_ctx_destAddr(struct net_device *dev, static int rtw_set_ctx_destAddr(struct net_device *dev,
@ -11063,11 +11148,17 @@ static int rtw_mp_disable_bt_coexist(struct net_device *dev,
//struct hal_ops *pHalFunc = &padapter->HalFunc; //struct hal_ops *pHalFunc = &padapter->HalFunc;
#endif #endif
u8 input[wrqu->data.length]; u8 *input = kmalloc(wrqu->data.length, GFP_KERNEL);
u32 bt_coexist; u32 bt_coexist;
int ret = 0;
if (copy_from_user(input, wrqu->data.pointer, wrqu->data.length)) if (!input)
return -EFAULT; return -ENOMEM;
if (copy_from_user(input, wrqu->data.pointer, wrqu->data.length)) {
ret = -EFAULT;
goto out;
}
bt_coexist = rtw_atoi(input); bt_coexist = rtw_atoi(input);
@ -11092,7 +11183,9 @@ static int rtw_mp_disable_bt_coexist(struct net_device *dev,
#endif #endif
} }
return 0; out:
kfree(input);
return ret;
} }
@ -11102,15 +11195,21 @@ static int rtw_mp_arx(struct net_device *dev,
{ {
int bStartRx = 0, bStopRx = 0, bQueryPhy = 0, bQueryMac = 0, bSetBssid = 0; int bStartRx = 0, bStopRx = 0, bQueryPhy = 0, bQueryMac = 0, bSetBssid = 0;
int bmac_filter = 0, bmon = 0; int bmac_filter = 0, bmon = 0;
u8 input[wrqu->length]; u8 *input = kmalloc(wrqu->length, GFP_KERNEL);
char *pch, *token, *tmp[2]= {0x00,0x00}; char *pch, *token, *tmp[2]= {0x00,0x00};
u32 i = 0, jj = 0, kk = 0, cnts = 0; u32 i = 0, jj = 0, kk = 0, cnts = 0;
PADAPTER padapter = rtw_netdev_priv(dev); PADAPTER padapter = rtw_netdev_priv(dev);
struct mp_priv *pmppriv = &padapter->mppriv; struct mp_priv *pmppriv = &padapter->mppriv;
struct dbg_rx_counter rx_counter; struct dbg_rx_counter rx_counter;
int ret = 0;
if (copy_from_user(input, wrqu->pointer, wrqu->length)) if (!input)
return -EFAULT; return -ENOMEM;
if (copy_from_user(input, wrqu->pointer, wrqu->length)) {
ret = -EFAULT;
goto out;
}
DBG_871X("%s: %s\n", __func__, input); DBG_871X("%s: %s\n", __func__, input);
@ -11131,10 +11230,14 @@ static int rtw_mp_arx(struct net_device *dev,
i++; i++;
} }
if ((tmp[0]==NULL) && (tmp[1]==NULL)) { if ((tmp[0]==NULL) && (tmp[1]==NULL)) {
return -EFAULT; ret = -EFAULT;
goto out;
} else { } else {
cnts = strlen(tmp[1])/2; cnts = strlen(tmp[1])/2;
if (cnts<1) return -EFAULT; if (cnts<1) {
ret = -EFAULT;
goto out;
}
DBG_871X("%s: cnts=%d\n", __FUNCTION__, cnts); DBG_871X("%s: cnts=%d\n", __FUNCTION__, cnts);
DBG_871X("%s: data=%s\n", __FUNCTION__, tmp[1]); DBG_871X("%s: data=%s\n", __FUNCTION__, tmp[1]);
for (jj=0, kk=0; jj < cnts ; jj++, kk+=2) { for (jj=0, kk=0; jj < cnts ; jj++, kk+=2) {
@ -11154,10 +11257,14 @@ static int rtw_mp_arx(struct net_device *dev,
i++; i++;
} }
if ((tmp[0]==NULL) && (tmp[1]==NULL)) { if ((tmp[0]==NULL) && (tmp[1]==NULL)) {
return -EFAULT; ret = -EFAULT;
goto out;
} else { } else {
cnts = strlen(tmp[1])/2; cnts = strlen(tmp[1])/2;
if (cnts<1) return -EFAULT; if (cnts<1) {
ret = -EFAULT;
goto out;
}
DBG_871X("%s: cnts=%d\n", __FUNCTION__, cnts); DBG_871X("%s: cnts=%d\n", __FUNCTION__, cnts);
DBG_871X("%s: data=%s\n", __FUNCTION__, tmp[1]); DBG_871X("%s: data=%s\n", __FUNCTION__, tmp[1]);
for (jj=0, kk=0; jj < cnts ; jj++, kk+=2) { for (jj=0, kk=0; jj < cnts ; jj++, kk+=2) {
@ -11205,7 +11312,9 @@ static int rtw_mp_arx(struct net_device *dev,
wrqu->length = strlen(extra) + 1; wrqu->length = strlen(extra) + 1;
return 0; out:
kfree(input);
return ret;
} }
static int rtw_mp_trx_query(struct net_device *dev, static int rtw_mp_trx_query(struct net_device *dev,
@ -11240,11 +11349,16 @@ static int rtw_mp_pwrtrk(struct net_device *dev,
u32 thermal; u32 thermal;
s32 ret; s32 ret;
PADAPTER padapter = rtw_netdev_priv(dev); PADAPTER padapter = rtw_netdev_priv(dev);
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
u8 input[wrqu->length]; u8 *input = kmalloc(wrqu->length, GFP_KERNEL);
if (copy_from_user(input, wrqu->pointer, wrqu->length)) if (!input)
return -EFAULT; return -ENOMEM;
if (copy_from_user(input, wrqu->pointer, wrqu->length)) {
ret = -EFAULT;
goto out;
}
_rtw_memset(extra, 0, wrqu->length); _rtw_memset(extra, 0, wrqu->length);
@ -11265,11 +11379,17 @@ static int rtw_mp_pwrtrk(struct net_device *dev,
} }
ret = Hal_SetPowerTracking(padapter, enable); ret = Hal_SetPowerTracking(padapter, enable);
if (ret == _FAIL) return -EPERM; if (ret == _FAIL) {
ret = -EPERM;
goto out;
}
wrqu->length = strlen(extra); wrqu->length = strlen(extra);
ret = 0;
return 0; out:
kfree(input);
return ret;
} }
static int rtw_mp_psd(struct net_device *dev, static int rtw_mp_psd(struct net_device *dev,
@ -11277,16 +11397,24 @@ static int rtw_mp_psd(struct net_device *dev,
struct iw_point *wrqu, char *extra) struct iw_point *wrqu, char *extra)
{ {
PADAPTER padapter = rtw_netdev_priv(dev); PADAPTER padapter = rtw_netdev_priv(dev);
u8 input[wrqu->length]; u8 *input = kmalloc(wrqu->length, GFP_KERNEL);
int ret = 0;
if (copy_from_user(input, wrqu->pointer, wrqu->length)) if (!input)
return -EFAULT; return -ENOMEM;
if (copy_from_user(input, wrqu->pointer, wrqu->length)) {
ret = -EFAULT;
goto out;
}
strcpy(extra,input); strcpy(extra,input);
wrqu->length = mp_query_psd(padapter, extra); wrqu->length = mp_query_psd(padapter, extra);
return 0; out:
kfree(input);
return ret;
} }
static int rtw_mp_thermal(struct net_device *dev, static int rtw_mp_thermal(struct net_device *dev,
@ -11380,22 +11508,31 @@ static int rtw_mp_dump(struct net_device *dev,
struct mp_priv *pmp_priv; struct mp_priv *pmp_priv;
//struct pkt_attrib *pattrib; //struct pkt_attrib *pattrib;
//u32 value; //u32 value;
u8 input[wrqu->length]; u8 *input = kmalloc(wrqu->length, GFP_KERNEL);
//u8 rf_type,path_nums = 0; //u8 rf_type,path_nums = 0;
//u32 i,j=1,path; //u32 i,j=1,path;
PADAPTER padapter = rtw_netdev_priv(dev); PADAPTER padapter = rtw_netdev_priv(dev);
int ret = 0;
if (!input)
return -ENOMEM;
pmp_priv = &padapter->mppriv; pmp_priv = &padapter->mppriv;
if (copy_from_user(input, wrqu->pointer, wrqu->length)) if (copy_from_user(input, wrqu->pointer, wrqu->length)) {
return -EFAULT; ret = -EFAULT;
goto out;
}
if ( strncmp(input, "all", 4)==0 ) { if ( strncmp(input, "all", 4)==0 ) {
mac_reg_dump(RTW_DBGDUMP, padapter); mac_reg_dump(RTW_DBGDUMP, padapter);
bb_reg_dump(RTW_DBGDUMP, padapter); bb_reg_dump(RTW_DBGDUMP, padapter);
rf_reg_dump(RTW_DBGDUMP, padapter); rf_reg_dump(RTW_DBGDUMP, padapter);
} }
return 0;
out:
kfree(input);
return ret;
} }
static int rtw_mp_phypara(struct net_device *dev, static int rtw_mp_phypara(struct net_device *dev,
@ -11405,11 +11542,17 @@ static int rtw_mp_phypara(struct net_device *dev,
PADAPTER padapter = rtw_netdev_priv(dev); PADAPTER padapter = rtw_netdev_priv(dev);
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
char input[wrqu->length]; char *input = kmalloc(wrqu->length, GFP_KERNEL);
u32 valxcap; u32 valxcap;
int ret = 0;
if (copy_from_user(input, wrqu->pointer, wrqu->length)) if (!input)
return -EFAULT; return -ENOMEM;
if (copy_from_user(input, wrqu->pointer, wrqu->length)) {
ret = -EFAULT;
goto out;
}
DBG_871X("%s:iwpriv in=%s\n", __func__, input); DBG_871X("%s:iwpriv in=%s\n", __func__, input);
@ -11421,7 +11564,9 @@ static int rtw_mp_phypara(struct net_device *dev,
sprintf( extra, "Set xcap=%d",valxcap ); sprintf( extra, "Set xcap=%d",valxcap );
wrqu->length = strlen(extra) + 1; wrqu->length = strlen(extra) + 1;
return 0; out:
kfree(input);
return ret;
} }
@ -11430,11 +11575,17 @@ static int rtw_mp_SetRFPath(struct net_device *dev,
union iwreq_data *wrqu, char *extra) union iwreq_data *wrqu, char *extra)
{ {
PADAPTER padapter = rtw_netdev_priv(dev); PADAPTER padapter = rtw_netdev_priv(dev);
char input[wrqu->data.length]; char* input = kmalloc(wrqu->data.length, GFP_KERNEL);
int bMain = 1, bTurnoff = 1; int bMain = 1, bTurnoff = 1;
int ret = 0;
if (copy_from_user(input, wrqu->data.pointer, wrqu->data.length)) if (!input)
return -EFAULT; return -ENOMEM;
if (copy_from_user(input, wrqu->data.pointer, wrqu->data.length)) {
ret = -EFAULT;
goto out;
}
DBG_871X("%s:iwpriv in=%s\n", __func__, input); DBG_871X("%s:iwpriv in=%s\n", __func__, input);
bMain = strncmp(input, "1", 2); // strncmp TRUE is 0 bMain = strncmp(input, "1", 2); // strncmp TRUE is 0
@ -11448,7 +11599,9 @@ static int rtw_mp_SetRFPath(struct net_device *dev,
DBG_871X("%s:PHY_SetRFPathSwitch=FALSE\n", __func__); DBG_871X("%s:PHY_SetRFPathSwitch=FALSE\n", __func__);
} }
return 0; out:
kfree(input);
return ret;
} }
static int rtw_mp_QueryDrv(struct net_device *dev, static int rtw_mp_QueryDrv(struct net_device *dev,
@ -11456,13 +11609,19 @@ static int rtw_mp_QueryDrv(struct net_device *dev,
union iwreq_data *wrqu, char *extra) union iwreq_data *wrqu, char *extra)
{ {
PADAPTER padapter = rtw_netdev_priv(dev); PADAPTER padapter = rtw_netdev_priv(dev);
char input[wrqu->data.length]; char* input = kmalloc(wrqu->data.length, GFP_KERNEL);
int qAutoLoad = 1; int qAutoLoad = 1;
int ret = 0;
EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter); EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);
if (copy_from_user(input, wrqu->data.pointer, wrqu->data.length)) if (!input)
return -EFAULT; return -ENOMEM;
if (copy_from_user(input, wrqu->data.pointer, wrqu->data.length)) {
ret = -EFAULT;
goto out;
}
DBG_871X("%s:iwpriv in=%s\n", __func__, input); DBG_871X("%s:iwpriv in=%s\n", __func__, input);
qAutoLoad = strncmp(input, "autoload", 8); // strncmp TRUE is 0 qAutoLoad = strncmp(input, "autoload", 8); // strncmp TRUE is 0
@ -11476,7 +11635,10 @@ static int rtw_mp_QueryDrv(struct net_device *dev,
sprintf(extra, "ok"); sprintf(extra, "ok");
} }
wrqu->data.length = strlen(extra) + 1; wrqu->data.length = strlen(extra) + 1;
return 0;
out:
kfree(input);
return ret;
} }
/* update Tx AGC offset */ /* update Tx AGC offset */
@ -11496,11 +11658,17 @@ static int rtw_mp_PwrCtlDM(struct net_device *dev,
struct iw_point *wrqu, char *extra) struct iw_point *wrqu, char *extra)
{ {
PADAPTER padapter = rtw_netdev_priv(dev); PADAPTER padapter = rtw_netdev_priv(dev);
u8 input[wrqu->length]; u8 *input = kmalloc(wrqu->length, GFP_KERNEL);
int bstart=1; int bstart=1;
int ret = 0;
if (copy_from_user(input, wrqu->pointer, wrqu->length)) if (!input)
return -EFAULT; return -ENOMEM;
if (copy_from_user(input, wrqu->pointer, wrqu->length)) {
ret = -EFAULT;
goto out;
}
bstart = strncmp(input, "start", 5); // strncmp TRUE is 0 bstart = strncmp(input, "start", 5); // strncmp TRUE is 0
if(bstart==0) { if(bstart==0) {
@ -11512,7 +11680,9 @@ static int rtw_mp_PwrCtlDM(struct net_device *dev,
} }
wrqu->length = strlen(extra); wrqu->length = strlen(extra);
return 0; out:
kfree(input);
return ret;
} }
static int rtw_mp_getver(struct net_device *dev, static int rtw_mp_getver(struct net_device *dev,
@ -13828,6 +13998,7 @@ static int rtw_test(
return 0; return 0;
} }
#ifdef CONFIG_WIRELESS_EXT
static iw_handler rtw_handlers[] = { static iw_handler rtw_handlers[] = {
NULL, /* SIOCSIWCOMMIT */ NULL, /* SIOCSIWCOMMIT */
rtw_wx_get_name, /* SIOCGIWNAME */ rtw_wx_get_name, /* SIOCGIWNAME */
@ -14113,8 +14284,9 @@ static iw_handler rtw_private_handler[] = {
rtw_widi_set_probe_request, //0x1F rtw_widi_set_probe_request, //0x1F
#endif // CONFIG_INTEL_WIDI #endif // CONFIG_INTEL_WIDI
}; };
#endif
#ifdef CONFIG_WIRELESS_EXT
#if WIRELESS_EXT >= 17 #if WIRELESS_EXT >= 17
static struct iw_statistics *rtw_get_wireless_stats(struct net_device *dev) static struct iw_statistics *rtw_get_wireless_stats(struct net_device *dev)
{ {
@ -14174,6 +14346,7 @@ static struct iw_statistics *rtw_get_wireless_stats(struct net_device *dev)
return &padapter->iwstats; return &padapter->iwstats;
} }
#endif #endif
#endif
#ifdef CONFIG_WIRELESS_EXT #ifdef CONFIG_WIRELESS_EXT
struct iw_handler_def rtw_handlers_def = { struct iw_handler_def rtw_handlers_def = {
@ -14189,7 +14362,6 @@ struct iw_handler_def rtw_handlers_def = {
.get_wireless_stats = rtw_get_wireless_stats, .get_wireless_stats = rtw_get_wireless_stats,
#endif #endif
}; };
#endif
// copy from net/wireless/wext.c start // copy from net/wireless/wext.c start
/* ---------------------------------------------------------------- */ /* ---------------------------------------------------------------- */
@ -14534,6 +14706,7 @@ exit:
return err; return err;
} }
#endif
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
static int rtw_ioctl_compat_wext_private(struct net_device *dev, struct ifreq *rq) static int rtw_ioctl_compat_wext_private(struct net_device *dev, struct ifreq *rq)
@ -14561,6 +14734,7 @@ static int rtw_ioctl_compat_wext_private(struct net_device *dev, struct ifreq *r
} }
#endif // CONFIG_COMPAT #endif // CONFIG_COMPAT
#ifdef CONFIG_WIRELESS_EXT
static inline int rtw_ioctl_standard_wext_private(struct net_device *dev, struct ifreq *rq) static inline int rtw_ioctl_standard_wext_private(struct net_device *dev, struct ifreq *rq)
{ {
struct iw_point *iwp; struct iw_point *iwp;
@ -14623,3 +14797,5 @@ int rtw_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
return ret; return ret;
} }
#endif
#endif

View File

@ -688,7 +688,11 @@ unsigned int rtw_classify8021d(struct sk_buff *skb)
static u16 rtw_select_queue(struct net_device *dev, struct sk_buff *skb static u16 rtw_select_queue(struct net_device *dev, struct sk_buff *skb
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 13, 0) #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 13, 0)
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)
, struct net_device *sb_dev
#else
, void *accel_priv , void *accel_priv
#endif
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0) #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
, select_queue_fallback_t fallback , select_queue_fallback_t fallback
#endif #endif
@ -745,12 +749,14 @@ static int rtw_ndev_notifier_call(struct notifier_block * nb, unsigned long stat
struct net_device *dev = ptr; struct net_device *dev = ptr;
#endif #endif
#ifdef CONFIG_WIRELESS_EXT
#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29)) #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29))
if (dev->netdev_ops->ndo_do_ioctl != rtw_ioctl) if (dev->netdev_ops->ndo_do_ioctl != rtw_ioctl)
#else #else
if (dev->do_ioctl != rtw_ioctl) if (dev->do_ioctl != rtw_ioctl)
#endif #endif
return NOTIFY_DONE; return NOTIFY_DONE;
#endif
DBG_871X_LEVEL(_drv_info_, FUNC_NDEV_FMT" state:%lu\n", FUNC_NDEV_ARG(dev), state); DBG_871X_LEVEL(_drv_info_, FUNC_NDEV_FMT" state:%lu\n", FUNC_NDEV_ARG(dev), state);
@ -810,7 +816,9 @@ static const struct net_device_ops rtw_netdev_ops = {
#endif #endif
.ndo_set_mac_address = rtw_net_set_mac_address, .ndo_set_mac_address = rtw_net_set_mac_address,
.ndo_get_stats = rtw_net_get_stats, .ndo_get_stats = rtw_net_get_stats,
#ifdef CONFIG_WIRELESS_EXT
.ndo_do_ioctl = rtw_ioctl, .ndo_do_ioctl = rtw_ioctl,
#endif
}; };
#endif #endif
@ -896,8 +904,10 @@ struct net_device *rtw_init_netdev(_adapter *old_padapter)
pnetdev->hard_start_xmit = rtw_xmit_entry; pnetdev->hard_start_xmit = rtw_xmit_entry;
pnetdev->set_mac_address = rtw_net_set_mac_address; pnetdev->set_mac_address = rtw_net_set_mac_address;
pnetdev->get_stats = rtw_net_get_stats; pnetdev->get_stats = rtw_net_get_stats;
#ifdef CONFIG_WIRELESS_EXT
pnetdev->do_ioctl = rtw_ioctl; pnetdev->do_ioctl = rtw_ioctl;
#endif #endif
#endif
#ifdef CONFIG_TCP_CSUM_OFFLOAD_TX #ifdef CONFIG_TCP_CSUM_OFFLOAD_TX
@ -1598,7 +1608,9 @@ static const struct net_device_ops rtw_netdev_vir_if_ops = {
.ndo_start_xmit = rtw_xmit_entry, .ndo_start_xmit = rtw_xmit_entry,
.ndo_set_mac_address = rtw_net_set_mac_address, .ndo_set_mac_address = rtw_net_set_mac_address,
.ndo_get_stats = rtw_net_get_stats, .ndo_get_stats = rtw_net_get_stats,
#ifdef CONFIG_WIRELESS_EXT
.ndo_do_ioctl = rtw_ioctl, .ndo_do_ioctl = rtw_ioctl,
#endif
#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35)) #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35))
.ndo_select_queue = rtw_select_queue, .ndo_select_queue = rtw_select_queue,
#endif #endif
@ -1989,7 +2001,9 @@ static const struct net_device_ops rtw_netdev_if2_ops = {
.ndo_start_xmit = rtw_xmit_entry, .ndo_start_xmit = rtw_xmit_entry,
.ndo_set_mac_address = rtw_net_set_mac_address, .ndo_set_mac_address = rtw_net_set_mac_address,
.ndo_get_stats = rtw_net_get_stats, .ndo_get_stats = rtw_net_get_stats,
#ifdef CONFIG_WIRELESS_EXT
.ndo_do_ioctl = rtw_ioctl, .ndo_do_ioctl = rtw_ioctl,
#endif
#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35)) #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35))
.ndo_select_queue = rtw_select_queue, .ndo_select_queue = rtw_select_queue,
#endif #endif

View File

@ -1314,17 +1314,9 @@ _adapter *rtw_usb_if1_init(struct dvobj_priv *dvobj,
if (rtw_handle_dualmac(padapter, 1) != _SUCCESS) if (rtw_handle_dualmac(padapter, 1) != _SUCCESS)
goto free_adapter; goto free_adapter;
if((pnetdev = rtw_init_netdev(padapter)) == NULL) { /* Code used to call rtw_init_netdev here, but MAC has not been probed
goto handle_dualmac; * yet, so moving it lower. --Ben
} */
SET_NETDEV_DEV(pnetdev, dvobj_to_dev(dvobj));
padapter = rtw_netdev_priv(pnetdev);
#ifdef CONFIG_IOCTL_CFG80211
if(rtw_wdev_alloc(padapter, dvobj_to_dev(dvobj)) != 0) {
goto handle_dualmac;
}
#endif
//step 2. hook HalFunc, allocate HalData //step 2. hook HalFunc, allocate HalData
//hal_set_hal_ops(padapter); //hal_set_hal_ops(padapter);
@ -1349,6 +1341,19 @@ _adapter *rtw_usb_if1_init(struct dvobj_priv *dvobj,
//step read efuse/eeprom data and get mac_addr //step read efuse/eeprom data and get mac_addr
rtw_hal_read_chip_info(padapter); rtw_hal_read_chip_info(padapter);
/* Now that we have MAC, init the wiphy and such. --Ben */
if((pnetdev = rtw_init_netdev(padapter)) == NULL) {
goto handle_dualmac;
}
SET_NETDEV_DEV(pnetdev, dvobj_to_dev(dvobj));
padapter = rtw_netdev_priv(pnetdev);
#ifdef CONFIG_IOCTL_CFG80211
if(rtw_wdev_alloc(padapter, dvobj_to_dev(dvobj)) != 0) {
goto handle_dualmac;
}
#endif
//step 5. //step 5.
if(rtw_init_drv_sw(padapter) ==_FAIL) { if(rtw_init_drv_sw(padapter) ==_FAIL) {
RT_TRACE(_module_hci_intfs_c_,_drv_err_,("Initialize driver software resource Failed!\n")); RT_TRACE(_module_hci_intfs_c_,_drv_err_,("Initialize driver software resource Failed!\n"));