Browse Source

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
pull/286/head
Ben Greear Harshavardhana 2 years ago
parent
commit
ba6fa69560
13 changed files with 355 additions and 106 deletions
  1. +25
    -1
      Makefile
  2. +7
    -0
      README.md
  3. +1
    -1
      core/rtw_ap.c
  4. +6
    -1
      core/rtw_mlme_ext.c
  5. +3
    -1
      include/drv_conf.h
  6. +0
    -0
      include/linux/old_unused_rtl_wireless.h
  7. +0
    -0
      include/rtl_autoconf.h
  8. +12
    -0
      include/rtw_byteorder.h
  9. +1
    -1
      include/wifi.h
  10. +8
    -4
      os_dep/linux/ioctl_cfg80211.c
  11. +262
    -86
      os_dep/linux/ioctl_linux.c
  12. +14
    -0
      os_dep/linux/os_intfs.c
  13. +16
    -11
      os_dep/linux/usb_intf.c

+ 25
- 1
Makefile View File

@@ -83,6 +83,7 @@ CONFIG_PLATFORM_ARM_S3C6K4 = n
CONFIG_PLATFORM_MIPS_RMI = n
CONFIG_PLATFORM_RTD2880B = n
CONFIG_PLATFORM_MIPS_AR9132 = n
CONFIG_PLATFORM_OPENWRT_NEO2 = n
CONFIG_PLATFORM_RTK_DMP = n
CONFIG_PLATFORM_MIPS_PLM = n
CONFIG_PLATFORM_MSTAR389 = n
@@ -869,18 +870,31 @@ EXTRA_CFLAGS += -DCONFIG_TDLS
endif

ifeq ($(CONFIG_PLATFORM_I386_PC), y)

ifdef EXT_EXTRA_CFLAGS
EXTRA_CFLAGS += $(EXT_EXTRA_CFLAGS)
else
EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
#EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE
EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT
#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)
endif
ifndef CROSS_COMPILE
CROSS_COMPILE ?=
endif
ifndef KVER
KVER ?= $(shell uname -r)
endif
ifndef KSRC
KSRC := /lib/modules/$(KVER)/build
endif
ifndef MODDESTDIR
MODDESTDIR := /lib/modules/$(KVER)/kernel/drivers/net/wireless/
endif
INSTALL_PREFIX :=
endif

@@ -1046,6 +1060,16 @@ CROSS_COMPILE := mips-openwrt-linux-
KSRC := /home/alex/test_openwrt/tmp/linux-2.6.30.9
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)
EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DRTK_DMP_PLATFORM
ARCH := mips


+ 7
- 0
README.md View File

@@ -79,6 +79,13 @@ Load module
# 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

```sh


+ 1
- 1
core/rtw_ap.c 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 *pie = pnetwork->IEs;
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;) {
pIE = (PNDIS_802_11_VARIABLE_IEs)(pnetwork->IEs + i);


+ 6
- 1
core/rtw_mlme_ext.c 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;
u32 p2poui = cpu_to_be32(P2POUI);
u8 oui_subtype = P2P_GO_NEGO_RESP;
u8 wpsie[ 255 ] = { 0x00 }, p2pie[ 255 ] = { 0x00 };
u8 *wpsie;
u8 p2pie[ 255 ] = { 0x00 };
u8 p2pielen = 0;
uint wpsielen = 0;
u16 wps_devicepassword_id = 0x0000;
@@ -3560,6 +3561,8 @@ void issue_p2p_GO_response(_adapter *padapter, u8* raddr, u8* frame_body,uint le
return;
}

wpsie = rtw_zmalloc(256);

DBG_871X( "[%s] In, result = %d\n", __FUNCTION__, result );
//update attribute
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);

kfree(wpsie);

return;

}


+ 3
- 1
include/drv_conf.h View File

@@ -19,7 +19,9 @@
******************************************************************************/
#ifndef __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)



include/linux/wireless.h → include/linux/old_unused_rtl_wireless.h View File


include/autoconf.h → include/rtl_autoconf.h View File


+ 12
- 0
include/rtw_byteorder.h View File

@@ -25,6 +25,18 @@
#error "Shall be CONFIG_LITTLE_ENDIAN or CONFIG_BIG_ENDIAN, but not both!\n"
#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)
#ifndef CONFIG_PLATFORM_MSTAR389
# include <byteorder/little_endian.h>


+ 1
- 1
include/wifi.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)
*/
#define IEEE80211_MIN_AMPDU_BUF 0x8
#define IEEE80211_MAX_AMPDU_BUF 0x40
//#define IEEE80211_MAX_AMPDU_BUF 0x40


/* Spatial Multiplexing Power Save Modes */


+ 8
- 4
os_dep/linux/ioctl_cfg80211.c View File

@@ -349,6 +349,9 @@ static int rtw_ieee80211_channel_to_frequency(int chan, int band)

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))
struct timespec ts;
get_monotonic_boottime(&ts);
@@ -358,6 +361,7 @@ static u64 rtw_get_systime_us(void)
do_gettimeofday(&tv);
return ((u64)tv.tv_sec*1000000) + tv.tv_usec;
#endif
#endif
}

#define MAX_BSSINFO_LEN 1000
@@ -5837,10 +5841,6 @@ void rtw_cfg80211_init_wiphy(_adapter *padapter)

/* init regulary domain */
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;
#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)
rtw_cfgvendor_attach(wiphy);
#endif


+ 262
- 86
os_dep/linux/ioctl_linux.c View File

@@ -83,6 +83,8 @@ static const char * const iw_operation_mode[] = {
"Auto", "Ad-Hoc", "Managed", "Master", "Repeater", "Secondary", "Monitor"
};

#ifdef CONFIG_WIRELESS_EXT

static int hex2num_i(char c)
{
if (c >= '0' && c <= '9')
@@ -132,6 +134,7 @@ static int hwaddr_aton_i(const char *txt, u8 *addr)

return 0;
}
#endif

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,
struct iw_request_info* info, struct wlan_network *pnetwork,
char *start, char *stop)
@@ -378,6 +383,8 @@ static int search_p2p_wfd_ie(_adapter *padapter,
#endif //CONFIG_P2P
return _TRUE;
}
#endif

static inline char *iwe_stream_mac_addr_proess(_adapter *padapter,
struct iw_request_info* info, struct wlan_network *pnetwork,
char *start, char *stop,struct iw_event *iwe)
@@ -826,6 +833,8 @@ static inline char * iwe_stream_net_rsv_process(_adapter *padapter,
return start;
}

#ifdef CONFIG_WIRELESS_EXT

#if 1
static char *translate_scan(_adapter *padapter,
struct iw_request_info* info, struct wlan_network *pnetwork,
@@ -1735,6 +1744,9 @@ exit:

return ret;
}
#endif

#ifdef CONFIG_WIRELESS_EXT

static int rtw_wx_get_name(struct net_device *dev,
struct iw_request_info *info,
@@ -10238,31 +10250,48 @@ static int rtw_mp_write_reg(struct net_device *dev,
char *width_str;
char width;
u32 addr, data;
int ret;
int ret = 0;
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))
return -EFAULT;
if (!input)
return -ENOMEM;
if (copy_from_user(input, wrqu->pointer, wrqu->length)) {
ret = -EFAULT;
goto out;
}

_rtw_memset(extra, 0, wrqu->length);

pch = input;

pnext = strpbrk(pch, " ,.-");
if (pnext == NULL) return -EINVAL;
if (pnext == NULL) {
ret = -EINVAL;
goto out;
}
*pnext = 0;
width_str = pch;

pch = pnext + 1;
pnext = strpbrk(pch, " ,.-");
if (pnext == NULL) return -EINVAL;
if (pnext == NULL) {
ret = -EINVAL;
goto out;
}
*pnext = 0;
addr = simple_strtoul(pch, &ptmp, 16);
if (addr > 0x3FFF) return -EINVAL;
if (addr > 0x3FFF) {
ret = -EINVAL;
goto out;
}

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);

ret = 0;
@@ -10293,6 +10322,8 @@ static int rtw_mp_write_reg(struct net_device *dev,
break;
}

out:
kfree(input);
return ret;
}

@@ -10311,7 +10342,7 @@ static int rtw_mp_read_reg(struct net_device *dev,
struct iw_request_info *info,
struct iw_point *wrqu, char *extra)
{
char input[wrqu->length];
char input[128];
char *pch, *pnext, *ptmp;
char *width_str;
char width;
@@ -10446,20 +10477,28 @@ static int rtw_mp_write_rf(struct net_device *dev,
union iwreq_data *wrqu, char *extra)
*/
u32 path, addr, data;
int ret;
int ret = 0;
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))
return -EFAULT;
if (copy_from_user(input, wrqu->pointer, wrqu->length)) {
ret = -EFAULT;
goto out;
}


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 (addr > 0xFF) return -EINVAL;
if (data > 0xFFFFF) return -EINVAL;
if ((path >= GET_HAL_RFPATH_NUM(padapter)) ||
(addr > 0xFF) ||
(data > 0xFFFFF)) {
ret = -EINVAL;
goto out;
}

_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");
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_point *wrqu, char *extra)
{
char input[wrqu->length];
char input[128];
char *pch, *pnext, *ptmp;
char data[20],tmp[20];
//u32 *data = (u32*)extra;
@@ -10624,11 +10665,17 @@ static int rtw_mp_rate(struct net_device *dev,
struct iw_point *wrqu, char *extra)
{
u32 rate = MPT_RATE_1M;
u8 input[wrqu->length];
u8* input = kmalloc(wrqu->length, GFP_KERNEL);
PADAPTER padapter = rtw_netdev_priv(dev);
int ret = 0;

if (copy_from_user(input, wrqu->pointer, wrqu->length))
return -EFAULT;
if (!input)
return -ENOMEM;
if (copy_from_user(input, wrqu->pointer, wrqu->length)) {
ret = -EFAULT;
goto out;
}

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 );
DBG_871X("%s: %s rate index=%d \n", __func__,input,rate);

if (rate >= MPT_RATE_LAST )
return -EINVAL;
if (rate >= MPT_RATE_LAST ) {
ret = -EINVAL;
goto out;
}

padapter->mppriv.rateidx = rate;
Hal_SetDataRate(padapter);

wrqu->length = strlen(extra);
return 0;

out:
kfree(input);
return ret;
}

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);
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
u8 input[wrqu->length];
u8* input = kmalloc(wrqu->length, GFP_KERNEL);
u32 channel = 1;
int ret = 0;
//int cur_ch_offset;

if (copy_from_user(input, wrqu->pointer, wrqu->length))
return -EFAULT;
if (!input)
return -ENOMEM;
if (copy_from_user(input, wrqu->pointer, wrqu->length)) {
ret = -EFAULT;
goto out;
}

channel = rtw_atoi(input);
//DBG_871X("%s: channel=%d\n", __func__, channel);
@@ -10683,7 +10741,9 @@ static int rtw_mp_channel(struct net_device *dev,
pHalData->CurrentChannel = channel;

wrqu->length = strlen(extra);
return 0;
out:
kfree(input);
return ret;
}

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)
{
PADAPTER padapter = rtw_netdev_priv(dev);
char input[wrqu->length];
char input[128];
u32 rfpath;
u32 txpower_inx;

@@ -10750,12 +10810,17 @@ static int rtw_mp_txpower(struct net_device *dev,
{
u32 idx_a = 0, idx_b = 0;
int MsetPower = 1;
u8 input[wrqu->length];
u8* input = kmalloc(wrqu->length, GFP_KERNEL);
int ret = 0;
PADAPTER padapter = rtw_netdev_priv(dev);

if (copy_from_user(input, wrqu->pointer, wrqu->length))
return -EFAULT;
if (!input)
return -ENOMEM;
if (copy_from_user(input, wrqu->pointer, wrqu->length)) {
ret = -EFAULT;
goto out;
}

MsetPower = strncmp(input, "off", 3);
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);
}
wrqu->length = strlen(extra);

out:
kfree(input);
return 0;
}

@@ -10779,12 +10847,18 @@ static int rtw_mp_ant_tx(struct net_device *dev,
struct iw_point *wrqu, char *extra)
{
u8 i;
u8 input[wrqu->length];
u8 *input = kmalloc(wrqu->length, GFP_KERNEL);
u16 antenna = 0;
PADAPTER padapter = rtw_netdev_priv(dev);
int ret = 0;

if (copy_from_user(input, wrqu->pointer, wrqu->length))
return -EFAULT;
if (!input)
return -ENOMEM;
if (copy_from_user(input, wrqu->pointer, wrqu->length)) {
ret = -EFAULT;
goto out;
}

//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);

wrqu->length = strlen(extra);
return 0;
out:
kfree(input);
return ret;
}

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;
u16 antenna = 0;
u8 input[wrqu->length];
u8 *input = kmalloc(wrqu->length, GFP_KERNEL);
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);
_rtw_memset(extra, 0, wrqu->length);

@@ -10849,7 +10932,9 @@ static int rtw_mp_ant_rx(struct net_device *dev,
Hal_SetAntenna(padapter);
wrqu->length = strlen(extra);

return 0;
out:
kfree(input);
return ret;
}

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;
#endif

u8 input[wrqu->data.length];
u8 *input = kmalloc(wrqu->data.length, GFP_KERNEL);
u32 bt_coexist;
int ret = 0;

if (copy_from_user(input, wrqu->data.pointer, wrqu->data.length))
return -EFAULT;
if (!input)
return -ENOMEM;
if (copy_from_user(input, wrqu->data.pointer, wrqu->data.length)) {
ret = -EFAULT;
goto out;
}

bt_coexist = rtw_atoi(input);

@@ -11092,7 +11183,9 @@ static int rtw_mp_disable_bt_coexist(struct net_device *dev,
#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 bmac_filter = 0, bmon = 0;
u8 input[wrqu->length];
u8 *input = kmalloc(wrqu->length, GFP_KERNEL);
char *pch, *token, *tmp[2]= {0x00,0x00};
u32 i = 0, jj = 0, kk = 0, cnts = 0;
PADAPTER padapter = rtw_netdev_priv(dev);
struct mp_priv *pmppriv = &padapter->mppriv;
struct dbg_rx_counter rx_counter;
int ret = 0;

if (copy_from_user(input, wrqu->pointer, wrqu->length))
return -EFAULT;
if (!input)
return -ENOMEM;
if (copy_from_user(input, wrqu->pointer, wrqu->length)) {
ret = -EFAULT;
goto out;
}

DBG_871X("%s: %s\n", __func__, input);

@@ -11131,10 +11230,14 @@ static int rtw_mp_arx(struct net_device *dev,
i++;
}
if ((tmp[0]==NULL) && (tmp[1]==NULL)) {
return -EFAULT;
ret = -EFAULT;
goto out;
} else {
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: data=%s\n", __FUNCTION__, tmp[1]);
for (jj=0, kk=0; jj < cnts ; jj++, kk+=2) {
@@ -11154,10 +11257,14 @@ static int rtw_mp_arx(struct net_device *dev,
i++;
}
if ((tmp[0]==NULL) && (tmp[1]==NULL)) {
return -EFAULT;
ret = -EFAULT;
goto out;
} else {
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: data=%s\n", __FUNCTION__, tmp[1]);
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;

return 0;
out:
kfree(input);
return ret;
}

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;
s32 ret;
PADAPTER padapter = rtw_netdev_priv(dev);
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
u8 input[wrqu->length];
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
u8 *input = kmalloc(wrqu->length, GFP_KERNEL);

if (copy_from_user(input, wrqu->pointer, wrqu->length))
return -EFAULT;
if (!input)
return -ENOMEM;
if (copy_from_user(input, wrqu->pointer, wrqu->length)) {
ret = -EFAULT;
goto out;
}

_rtw_memset(extra, 0, wrqu->length);

@@ -11265,11 +11379,17 @@ static int rtw_mp_pwrtrk(struct net_device *dev,
}

ret = Hal_SetPowerTracking(padapter, enable);
if (ret == _FAIL) return -EPERM;
if (ret == _FAIL) {
ret = -EPERM;
goto out;
}

wrqu->length = strlen(extra);
ret = 0;

return 0;
out:
kfree(input);
return ret;
}

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)
{
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))
return -EFAULT;
if (!input)
return -ENOMEM;
if (copy_from_user(input, wrqu->pointer, wrqu->length)) {
ret = -EFAULT;
goto out;
}

strcpy(extra,input);

wrqu->length = mp_query_psd(padapter, extra);

return 0;
out:
kfree(input);
return ret;
}

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 pkt_attrib *pattrib;
//u32 value;
u8 input[wrqu->length];
u8 *input = kmalloc(wrqu->length, GFP_KERNEL);
//u8 rf_type,path_nums = 0;
//u32 i,j=1,path;
PADAPTER padapter = rtw_netdev_priv(dev);
int ret = 0;

if (!input)
return -ENOMEM;
pmp_priv = &padapter->mppriv;

if (copy_from_user(input, wrqu->pointer, wrqu->length))
return -EFAULT;
if (copy_from_user(input, wrqu->pointer, wrqu->length)) {
ret = -EFAULT;
goto out;
}

if ( strncmp(input, "all", 4)==0 ) {
mac_reg_dump(RTW_DBGDUMP, padapter);
bb_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,
@@ -11405,11 +11542,17 @@ static int rtw_mp_phypara(struct net_device *dev,

PADAPTER padapter = rtw_netdev_priv(dev);
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
char input[wrqu->length];
char *input = kmalloc(wrqu->length, GFP_KERNEL);
u32 valxcap;
int ret = 0;

if (copy_from_user(input, wrqu->pointer, wrqu->length))
return -EFAULT;
if (!input)
return -ENOMEM;
if (copy_from_user(input, wrqu->pointer, wrqu->length)) {
ret = -EFAULT;
goto out;
}

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 );
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)
{
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 ret = 0;

if (copy_from_user(input, wrqu->data.pointer, wrqu->data.length))
return -EFAULT;
if (!input)
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);

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__);
}

return 0;
out:
kfree(input);
return ret;
}

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)
{
PADAPTER padapter = rtw_netdev_priv(dev);
char input[wrqu->data.length];
char* input = kmalloc(wrqu->data.length, GFP_KERNEL);
int qAutoLoad = 1;
int ret = 0;

EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);

if (copy_from_user(input, wrqu->data.pointer, wrqu->data.length))
return -EFAULT;
if (!input)
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);

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");
}
wrqu->data.length = strlen(extra) + 1;
return 0;

out:
kfree(input);
return ret;
}

/* update Tx AGC offset */
@@ -11496,11 +11658,17 @@ static int rtw_mp_PwrCtlDM(struct net_device *dev,
struct iw_point *wrqu, char *extra)
{
PADAPTER padapter = rtw_netdev_priv(dev);
u8 input[wrqu->length];
u8 *input = kmalloc(wrqu->length, GFP_KERNEL);
int bstart=1;
int ret = 0;

if (copy_from_user(input, wrqu->pointer, wrqu->length))
return -EFAULT;
if (!input)
return -ENOMEM;
if (copy_from_user(input, wrqu->pointer, wrqu->length)) {
ret = -EFAULT;
goto out;
}

bstart = strncmp(input, "start", 5); // strncmp TRUE is 0
if(bstart==0) {
@@ -11512,7 +11680,9 @@ static int rtw_mp_PwrCtlDM(struct net_device *dev,
}
wrqu->length = strlen(extra);

return 0;
out:
kfree(input);
return ret;
}

static int rtw_mp_getver(struct net_device *dev,
@@ -13828,6 +13998,7 @@ static int rtw_test(
return 0;
}

#ifdef CONFIG_WIRELESS_EXT
static iw_handler rtw_handlers[] = {
NULL, /* SIOCSIWCOMMIT */
rtw_wx_get_name, /* SIOCGIWNAME */
@@ -14113,8 +14284,9 @@ static iw_handler rtw_private_handler[] = {
rtw_widi_set_probe_request, //0x1F
#endif // CONFIG_INTEL_WIDI
};
#endif

#ifdef CONFIG_WIRELESS_EXT
#if WIRELESS_EXT >= 17
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;
}
#endif
#endif

#ifdef CONFIG_WIRELESS_EXT
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,
#endif
};
#endif

// copy from net/wireless/wext.c start
/* ---------------------------------------------------------------- */
@@ -14534,6 +14706,7 @@ exit:

return err;
}
#endif

#ifdef CONFIG_COMPAT
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

#ifdef CONFIG_WIRELESS_EXT
static inline int rtw_ioctl_standard_wext_private(struct net_device *dev, struct ifreq *rq)
{
struct iw_point *iwp;
@@ -14623,3 +14797,5 @@ int rtw_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
return ret;
}

#endif
#endif

+ 14
- 0
os_dep/linux/os_intfs.c 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
#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
#endif
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
, select_queue_fallback_t fallback
#endif
@@ -745,12 +749,14 @@ static int rtw_ndev_notifier_call(struct notifier_block * nb, unsigned long stat
struct net_device *dev = ptr;
#endif

#ifdef CONFIG_WIRELESS_EXT
#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29))
if (dev->netdev_ops->ndo_do_ioctl != rtw_ioctl)
#else
if (dev->do_ioctl != rtw_ioctl)
#endif
return NOTIFY_DONE;
#endif

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
.ndo_set_mac_address = rtw_net_set_mac_address,
.ndo_get_stats = rtw_net_get_stats,
#ifdef CONFIG_WIRELESS_EXT
.ndo_do_ioctl = rtw_ioctl,
#endif
};
#endif

@@ -896,8 +904,10 @@ struct net_device *rtw_init_netdev(_adapter *old_padapter)
pnetdev->hard_start_xmit = rtw_xmit_entry;
pnetdev->set_mac_address = rtw_net_set_mac_address;
pnetdev->get_stats = rtw_net_get_stats;
#ifdef CONFIG_WIRELESS_EXT
pnetdev->do_ioctl = rtw_ioctl;
#endif
#endif


#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_set_mac_address = rtw_net_set_mac_address,
.ndo_get_stats = rtw_net_get_stats,
#ifdef CONFIG_WIRELESS_EXT
.ndo_do_ioctl = rtw_ioctl,
#endif
#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35))
.ndo_select_queue = rtw_select_queue,
#endif
@@ -1989,7 +2001,9 @@ static const struct net_device_ops rtw_netdev_if2_ops = {
.ndo_start_xmit = rtw_xmit_entry,
.ndo_set_mac_address = rtw_net_set_mac_address,
.ndo_get_stats = rtw_net_get_stats,
#ifdef CONFIG_WIRELESS_EXT
.ndo_do_ioctl = rtw_ioctl,
#endif
#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35))
.ndo_select_queue = rtw_select_queue,
#endif


+ 16
- 11
os_dep/linux/usb_intf.c View File

@@ -1314,17 +1314,9 @@ _adapter *rtw_usb_if1_init(struct dvobj_priv *dvobj,
if (rtw_handle_dualmac(padapter, 1) != _SUCCESS)
goto free_adapter;

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
/* Code used to call rtw_init_netdev here, but MAC has not been probed
* yet, so moving it lower. --Ben
*/

//step 2. hook HalFunc, allocate HalData
//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
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.
if(rtw_init_drv_sw(padapter) ==_FAIL) {
RT_TRACE(_module_hci_intfs_c_,_drv_err_,("Initialize driver software resource Failed!\n"));


Loading…
Cancel
Save