blob: 6066060bdcfae9a2a7dbb9418b780011414e01ee [file] [log] [blame]
/** @file moal_main.h
*
* @brief This file contains wlan driver specific defines etc.
*
* Copyright (C) 2008-2014, Marvell International Ltd.
*
* This software file (the "File") is distributed by Marvell International
* Ltd. under the terms of the GNU General Public License Version 2, June 1991
* (the "License"). You may use, redistribute and/or modify this File in
* accordance with the terms and conditions of the License, a copy of which
* is available by writing to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA or on the
* worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
*
* THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
* IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
* ARE EXPRESSLY DISCLAIMED. The License provides additional details about
* this warranty disclaimer.
*
*/
/********************************************************
Change log:
10/21/2008: initial version
********************************************************/
#ifndef _MOAL_MAIN_H
#define _MOAL_MAIN_H
/* warnfix for FS redefination if any? */
#ifdef FS
#undef FS
#endif
/* Linux header files */
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/version.h>
#include <linux/param.h>
#include <linux/delay.h>
#include <linux/slab.h>
#include <linux/mm.h>
#include <linux/types.h>
#include <linux/sched.h>
#include <linux/timer.h>
#include <linux/ioport.h>
#include <linux/pci.h>
#include <linux/ctype.h>
#include <linux/proc_fs.h>
#include <linux/vmalloc.h>
#include <linux/ptrace.h>
#include <linux/string.h>
#include <linux/irqreturn.h>
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0)
#include <linux/namei.h>
#include <linux/fs.h>
#endif
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18)
#include <linux/config.h>
#endif
/* ASM files */
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)
#include <linux/semaphore.h>
#else
#include <asm/semaphore.h>
#endif
#include <asm/byteorder.h>
#include <asm/irq.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0)
#include <asm/switch_to.h>
#else
#include <asm/system.h>
#endif
/* Net header files */
#include <linux/netdevice.h>
#include <linux/net.h>
#include <linux/inet.h>
#include <linux/ip.h>
#include <linux/skbuff.h>
#include <linux/if_arp.h>
#include <linux/if_ether.h>
#include <linux/etherdevice.h>
#include <net/sock.h>
#include <net/arp.h>
#include <linux/rtnetlink.h>
#include <linux/inetdevice.h>
#include <linux/firmware.h>
#include "mlan.h"
#include "moal_shim.h"
/* Wireless header */
#if defined(STA_CFG80211) || defined(UAP_CFG80211)
#include <net/lib80211.h>
#include <net/cfg80211.h>
#include <net/ieee80211_radiotap.h>
#endif
#if defined(STA_WEXT) || defined(UAP_WEXT)
#include <linux/wireless.h>
#include <net/iw_handler.h>
#include "moal_wext.h"
#endif
#ifdef STA_WEXT
#include "moal_priv.h"
#endif
#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 24)
#define REFDATA __refdata
#else
#define REFDATA
#endif
/**
* Linux Kernels later 3.9 use CONFIG_PM_RUNTIME instead of
* CONFIG_USB_SUSPEND
*/
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)
#ifdef CONFIG_PM_RUNTIME
#ifndef CONFIG_USB_SUSPEND
#define CONFIG_USB_SUSPEND
#endif
#endif
#endif
/** Define BOOLEAN */
typedef t_u8 BOOLEAN;
/** Driver version */
extern char driver_version[];
/** Private structure for MOAL */
typedef struct _moal_private moal_private;
/** Handle data structure for MOAL */
typedef struct _moal_handle moal_handle;
/** Hardware status codes */
typedef enum _MOAL_HARDWARE_STATUS {
HardwareStatusReady,
HardwareStatusInitializing,
HardwareStatusFwReady,
HardwareStatusReset,
HardwareStatusClosing,
HardwareStatusNotReady
} MOAL_HARDWARE_STATUS;
/** moal_wait_option */
enum {
MOAL_NO_WAIT,
MOAL_IOCTL_WAIT,
MOAL_CMD_WAIT,
#ifdef CONFIG_PROC_FS
MOAL_PROC_WAIT,
#endif
MOAL_WSTATS_WAIT,
MOAL_IOCTL_WAIT_TIMEOUT,
MOAL_CMD_WAIT_TIMEOUT
};
/** moal_main_state */
enum {
MOAL_STATE_IDLE,
MOAL_RECV_INT,
MOAL_ENTER_WORK_QUEUE,
MOAL_START_MAIN_PROCESS,
MOAL_END_MAIN_PROCESS
};
/** HostCmd_Header */
typedef struct _HostCmd_Header {
/** Command */
t_u16 command;
/** Size */
t_u16 size;
} HostCmd_Header;
#ifndef MIN
/** Find minimum */
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#endif
/** Find maximum */
#ifndef MAX
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#endif
/*
* OS timer specific
*/
/** Timer structure */
typedef struct _moal_drv_timer {
/** Timer list */
struct timer_list tl;
/** Timer function */
void (*timer_function) (void *context);
/** Timer function context */
void *function_context;
/** Time period */
t_u32 time_period;
/** Is timer periodic ? */
t_u32 timer_is_periodic;
/** Is timer cancelled ? */
t_u32 timer_is_canceled;
} moal_drv_timer, *pmoal_drv_timer;
/**
* @brief Timer handler
*
* @param fcontext Timer context
*
* @return N/A
*/
static inline void
woal_timer_handler(unsigned long fcontext)
{
pmoal_drv_timer timer = (pmoal_drv_timer)fcontext;
timer->timer_function(timer->function_context);
if (timer->timer_is_periodic == MTRUE) {
mod_timer(&timer->tl,
jiffies + ((timer->time_period * HZ) / 1000));
} else {
timer->timer_is_canceled = MTRUE;
timer->time_period = 0;
}
}
/**
* @brief Initialize timer
*
* @param timer Timer structure
* @param TimerFunction Timer function
* @param FunctionContext Timer function context
*
* @return N/A
*/
static inline void
woal_initialize_timer(pmoal_drv_timer timer,
void (*TimerFunction) (void *context),
void *FunctionContext)
{
/* First, setup the timer to trigger the wlan_timer_handler proxy */
init_timer(&timer->tl);
timer->tl.function = woal_timer_handler;
timer->tl.data = (t_ptr)timer;
/* Then tell the proxy which function to call and what to pass it */
timer->timer_function = TimerFunction;
timer->function_context = FunctionContext;
timer->timer_is_canceled = MTRUE;
timer->time_period = 0;
timer->timer_is_periodic = MFALSE;
}
/**
* @brief Modify timer
*
* @param timer Timer structure
* @param millisecondperiod Time period in millisecond
*
* @return N/A
*/
static inline void
woal_mod_timer(pmoal_drv_timer timer, t_u32 millisecondperiod)
{
timer->time_period = millisecondperiod;
mod_timer(&timer->tl, jiffies + (millisecondperiod * HZ) / 1000);
timer->timer_is_canceled = MFALSE;
}
/**
* @brief Cancel timer
*
* @param timer Timer structure
*
* @return N/A
*/
static inline void
woal_cancel_timer(moal_drv_timer *timer)
{
if (timer->timer_is_periodic || in_atomic() || irqs_disabled())
del_timer(&timer->tl);
else
del_timer_sync(&timer->tl);
timer->timer_is_canceled = MTRUE;
timer->time_period = 0;
}
#ifdef REASSOCIATION
/*
* OS Thread Specific
*/
#include <linux/kthread.h>
/** Kernel thread structure */
typedef struct _moal_thread {
/** Task control structrue */
struct task_struct *task;
/** Pointer to wait_queue_head */
wait_queue_head_t wait_q;
/** PID */
pid_t pid;
/** Pointer to moal_handle */
void *handle;
} moal_thread;
/**
* @brief Activate thread
*
* @param thr Thread structure
* @return N/A
*/
static inline void
woal_activate_thread(moal_thread *thr)
{
/** Initialize the wait queue */
init_waitqueue_head(&thr->wait_q);
/** Record the thread pid */
thr->pid = current->pid;
}
/**
* @brief De-activate thread
*
* @param thr Thread structure
* @return N/A
*/
static inline void
woal_deactivate_thread(moal_thread *thr)
{
/* Reset the pid */
thr->pid = 0;
}
/**
* @brief Create and run the thread
*
* @param threadfunc Thread function
* @param thr Thread structure
* @param name Thread name
* @return N/A
*/
static inline void
woal_create_thread(int (*threadfunc) (void *), moal_thread *thr, char *name)
{
/* Create and run the thread */
thr->task = kthread_run(threadfunc, thr, "%s", name);
}
#endif /* REASSOCIATION */
/* The following macros are neccessary to retain compatibility
* around the workqueue chenges happened in kernels >= 2.6.20:
* - INIT_WORK changed to take 2 arguments and let the work function
* get its own data through the container_of macro
* - delayed works have been split from normal works to save some
* memory usage in struct work_struct
*/
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 20)
/** Work_queue work initialization */
#define MLAN_INIT_WORK(_work, _fun) INIT_WORK(_work, ((void (*)(void *))_fun), _work)
/** Work_queue delayed work initialization */
#define MLAN_INIT_DELAYED_WORK(_work, _fun) INIT_WORK(_work, ((void (*)(void *))_fun), _work)
/** Work_queue container parameter */
#define MLAN_DELAYED_CONTAINER_OF(_ptr, _type, _m) container_of(_ptr, _type, _m)
#else /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) */
/** Work_queue work initialization */
#define MLAN_INIT_WORK INIT_WORK
/** Work_queue delayed work initialization */
#define MLAN_INIT_DELAYED_WORK INIT_DELAYED_WORK
/** Work_queue container parameter */
#define MLAN_DELAYED_CONTAINER_OF(_ptr, _type, _m) container_of(_ptr, _type, _m.work)
#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) */
/**
* @brief Schedule timeout
*
* @param millisec Timeout duration in milli second
*
* @return N/A
*/
static inline void
woal_sched_timeout(t_u32 millisec)
{
set_current_state(TASK_INTERRUPTIBLE);
schedule_timeout((millisec * HZ) / 1000);
}
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 19)
#define IN6PTON_XDIGIT 0x00010000
#define IN6PTON_DIGIT 0x00020000
#define IN6PTON_COLON_MASK 0x00700000
#define IN6PTON_COLON_1 0x00100000 /* single : requested */
#define IN6PTON_COLON_2 0x00200000 /* second : requested */
#define IN6PTON_COLON_1_2 0x00400000 /* :: requested */
#define IN6PTON_DOT 0x00800000 /* . */
#define IN6PTON_DELIM 0x10000000
#define IN6PTON_NULL 0x20000000 /* first/tail */
#define IN6PTON_UNKNOWN 0x40000000
static inline int
xdigit2bin(char c, int delim)
{
if (c == delim || c == '\0')
return IN6PTON_DELIM;
if (c == ':')
return IN6PTON_COLON_MASK;
if (c == '.')
return IN6PTON_DOT;
if (c >= '0' && c <= '9')
return IN6PTON_XDIGIT | IN6PTON_DIGIT | (c - '0');
if (c >= 'a' && c <= 'f')
return IN6PTON_XDIGIT | (c - 'a' + 10);
if (c >= 'A' && c <= 'F')
return IN6PTON_XDIGIT | (c - 'A' + 10);
if (delim == -1)
return IN6PTON_DELIM;
return IN6PTON_UNKNOWN;
}
static inline int
in4_pton(const char *src, int srclen, u8 *dst, int delim, const char **end)
{
const char *s;
u8 *d;
u8 dbuf[4];
int ret = 0;
int i;
int w = 0;
if (srclen < 0)
srclen = strlen(src);
s = src;
d = dbuf;
i = 0;
while (1) {
int c;
c = xdigit2bin(srclen > 0 ? *s : '\0', delim);
if (!
(c &
(IN6PTON_DIGIT | IN6PTON_DOT | IN6PTON_DELIM |
IN6PTON_COLON_MASK))) {
goto out;
}
if (c & (IN6PTON_DOT | IN6PTON_DELIM | IN6PTON_COLON_MASK)) {
if (w == 0)
goto out;
*d++ = w & 0xff;
w = 0;
i++;
if (c & (IN6PTON_DELIM | IN6PTON_COLON_MASK)) {
if (i != 4)
goto out;
break;
}
goto cont;
}
w = (w * 10) + c;
if ((w & 0xffff) > 255)
goto out;
cont:
if (i >= 4)
goto out;
s++;
srclen--;
}
ret = 1;
memcpy(dst, dbuf, sizeof(dbuf));
out:
if (end)
*end = s;
return ret;
}
#endif /* < 2.6.19 */
#ifndef __ATTRIB_ALIGN__
#define __ATTRIB_ALIGN__ __attribute__((aligned(4)))
#endif
#ifndef __ATTRIB_PACK__
#define __ATTRIB_PACK__ __attribute__ ((packed))
#endif
/** Get module */
#define MODULE_GET try_module_get(THIS_MODULE)
/** Put module */
#define MODULE_PUT module_put(THIS_MODULE)
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 37)
/** Initialize semaphore */
#define MOAL_INIT_SEMAPHORE(x) init_MUTEX(x)
/** Initialize semaphore */
#define MOAL_INIT_SEMAPHORE_LOCKED(x) init_MUTEX_LOCKED(x)
#else
/** Initialize semaphore */
#define MOAL_INIT_SEMAPHORE(x) sema_init(x, 1)
/** Initialize semaphore */
#define MOAL_INIT_SEMAPHORE_LOCKED(x) sema_init(x, 0)
#endif
/** Acquire semaphore and with blocking */
#define MOAL_ACQ_SEMAPHORE_BLOCK(x) down_interruptible(x)
/** Acquire semaphore without blocking */
#define MOAL_ACQ_SEMAPHORE_NOBLOCK(x) down_trylock(x)
/** Release semaphore */
#define MOAL_REL_SEMAPHORE(x) up(x)
/** Request FW timeout in second */
#define REQUEST_FW_TIMEOUT 30
/** Default watchdog timeout */
#define MRVDRV_DEFAULT_WATCHDOG_TIMEOUT (10 * HZ)
#ifdef UAP_SUPPORT
/** Default watchdog timeout
Increase the value to avoid kernel Tx timeout message in case
station in PS mode or left.
The default value of PS station ageout timer is 40 seconds.
Hence, the watchdog timer is set to a value higher than it.
*/
#define MRVDRV_DEFAULT_UAP_WATCHDOG_TIMEOUT (41 * HZ)
#endif
/* IOCTL Timeout */
#define MOAL_IOCTL_TIMEOUT (20 * HZ)
/** Threshold value of number of times the Tx timeout happened */
#define NUM_TX_TIMEOUT_THRESHOLD 5
/** Custom event : DRIVER HANG */
#define CUS_EVT_DRIVER_HANG "EVENT=DRIVER_HANG"
/** TDLS connected event */
#define CUS_EVT_TDLS_CONNECTED "EVENT=TDLS_CONNECTED"
/** TDLS tear down event */
#define CUS_EVT_TDLS_TEARDOWN "EVENT=TDLS_TEARDOWN"
/** wmm info */
#define WMM_TYPE_INFO 0
/** wmm parameter */
#define WMM_TYPE_PARAMETER 1
/** AP connected event */
#define CUS_EVT_AP_CONNECTED "EVENT=AP_CONNECTED"
/** Custom event : BW changed */
#define CUS_EVT_BW_CHANGED "EVENT=BW_CHANGED"
/** Custom event : OBSS scan parameter */
#define CUS_EVT_OBSS_SCAN_PARAM "EVENT=OBSS_SCAN_PARAM"
/** Custom event : AdHoc link sensed */
#define CUS_EVT_ADHOC_LINK_SENSED "EVENT=ADHOC_LINK_SENSED"
/** Custom event : AdHoc link lost */
#define CUS_EVT_ADHOC_LINK_LOST "EVENT=ADHOC_LINK_LOST"
/** Custom event : MIC failure, unicast */
#define CUS_EVT_MLME_MIC_ERR_UNI "MLME-MICHAELMICFAILURE.indication unicast"
/** Custom event : MIC failure, multicast */
#define CUS_EVT_MLME_MIC_ERR_MUL "MLME-MICHAELMICFAILURE.indication multicast"
/** Custom event : Beacon RSSI low */
#define CUS_EVT_BEACON_RSSI_LOW "EVENT=BEACON_RSSI_LOW"
/** Custom event : Beacon SNR low */
#define CUS_EVT_BEACON_SNR_LOW "EVENT=BEACON_SNR_LOW"
/** Custom event : Beacon RSSI high */
#define CUS_EVT_BEACON_RSSI_HIGH "EVENT=BEACON_RSSI_HIGH"
/** Custom event : Beacon SNR high */
#define CUS_EVT_BEACON_SNR_HIGH "EVENT=BEACON_SNR_HIGH"
/** Custom event : Max fail */
#define CUS_EVT_MAX_FAIL "EVENT=MAX_FAIL"
/** Custom event : Data RSSI low */
#define CUS_EVT_DATA_RSSI_LOW "EVENT=DATA_RSSI_LOW"
/** Custom event : Data SNR low */
#define CUS_EVT_DATA_SNR_LOW "EVENT=DATA_SNR_LOW"
/** Custom event : Data RSSI high */
#define CUS_EVT_DATA_RSSI_HIGH "EVENT=DATA_RSSI_HIGH"
/** Custom event : Data SNR high */
#define CUS_EVT_DATA_SNR_HIGH "EVENT=DATA_SNR_HIGH"
/** Custom event : Link Quality */
#define CUS_EVT_LINK_QUALITY "EVENT=LINK_QUALITY"
/** Custom event : Port Release */
#define CUS_EVT_PORT_RELEASE "EVENT=PORT_RELEASE"
/** Custom event : Pre-Beacon Lost */
#define CUS_EVT_PRE_BEACON_LOST "EVENT=PRE_BEACON_LOST"
/** Custom event : Deep Sleep awake */
#define CUS_EVT_DEEP_SLEEP_AWAKE "EVENT=DS_AWAKE"
/** Custom event : Host Sleep activated */
#define CUS_EVT_HS_ACTIVATED "HS_ACTIVATED"
/** Custom event : Host Sleep deactivated */
#define CUS_EVT_HS_DEACTIVATED "HS_DEACTIVATED"
/** Custom event : Host Sleep wakeup */
#define CUS_EVT_HS_WAKEUP "HS_WAKEUP"
/** Custom event : WEP ICV error */
#define CUS_EVT_WEP_ICV_ERR "EVENT=WEP_ICV_ERR"
/** Custom event : Channel Switch Announcment */
#define CUS_EVT_CHANNEL_SWITCH_ANN "EVENT=CHANNEL_SWITCH_ANN"
/** Custom indiciation message sent to the application layer for WMM changes */
#define WMM_CONFIG_CHANGE_INDICATION "WMM_CONFIG_CHANGE.indication"
#ifdef UAP_SUPPORT
/** Custom event : STA connected */
#define CUS_EVT_STA_CONNECTED "EVENT=STA_CONNECTED"
/** Custom event : STA disconnected */
#define CUS_EVT_STA_DISCONNECTED "EVENT=STA_DISCONNECTED"
#endif
/** 10 seconds */
#define MOAL_TIMER_10S 10000
/** 5 seconds */
#define MOAL_TIMER_5S 5000
/** 1 second */
#define MOAL_TIMER_1S 1000
/** passive scan time */
#define PASSIVE_SCAN_CHAN_TIME 110
/** active scan time */
#define ACTIVE_SCAN_CHAN_TIME 110
/** specific scan time */
#define SPECIFIC_SCAN_CHAN_TIME 110
/** passive scan time */
#define INIT_PASSIVE_SCAN_CHAN_TIME 80
/** active scan time */
#define INIT_ACTIVE_SCAN_CHAN_TIME 80
/** specific scan time */
#define INIT_SPECIFIC_SCAN_CHAN_TIME 80
/** specific scan time after connected */
#define MIN_SPECIFIC_SCAN_CHAN_TIME 40
/** Default value of re-assoc timer */
#define REASSOC_TIMER_DEFAULT 500
/** Netlink protocol number */
#define NETLINK_MARVELL (MAX_LINKS - 1)
/** Netlink maximum payload size */
#define NL_MAX_PAYLOAD 1024
/** Netlink multicast group number */
#define NL_MULTICAST_GROUP 1
#define MAX_RX_PENDING_THRHLD 50
/** MAX Tx Pending count */
#define MAX_TX_PENDING 100
/** LOW Tx Pending count */
#define LOW_TX_PENDING 80
/** Offset for subcommand */
#define SUBCMD_OFFSET 4
/** default scan channel gap */
#define DEF_SCAN_CHAN_GAP 50
/** default scan time per channel in miracast mode */
#define DEF_MIRACAST_SCAN_TIME 20
/** Macro to extract the TOS field from a skb */
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 22)
#define SKB_TOS(skb) (ip_hdr(skb)->tos)
#else
#define SKB_TOS(skb) (skb->nh.iph->tos)
#endif
#define SKB_TIDV6(skb) (ipv6_get_dsfield(ipv6_hdr(skb)))
#define IS_SKB_MAGIC_VLAN(skb) (skb->priority >= 256 && skb->priority <= 263)
#define GET_VLAN_PRIO(skb) (skb->priority - 256)
/** Offset for TOS field in the IP header */
#define IPTOS_OFFSET 5
/** Offset for DSCP in the tos field */
#define DSCP_OFFSET 2
/** wait_queue structure */
typedef struct _wait_queue {
/** Pointer to wait_queue_head */
wait_queue_head_t *wait;
/** Wait condition */
BOOLEAN condition;
/** Start time */
long start_time;
/** Status from MLAN */
mlan_status status;
/** flag for wait_timeout */
t_u8 wait_timeout;
} wait_queue, *pwait_queue;
/** Auto Rate */
#define AUTO_RATE 0xFF
#define STA_WEXT_MASK MBIT(0)
#define UAP_WEXT_MASK MBIT(1)
#define STA_CFG80211_MASK MBIT(2)
#define UAP_CFG80211_MASK MBIT(3)
#ifdef STA_CFG80211
#ifdef STA_SUPPORT
/** Is STA CFG80211 enabled in module param */
#define IS_STA_CFG80211(x) (x & STA_CFG80211_MASK)
#endif
#endif
#ifdef UAP_CFG80211
#ifdef UAP_SUPPORT
/** Is UAP CFG80211 enabled in module param */
#define IS_UAP_CFG80211(x) (x & UAP_CFG80211_MASK)
#endif
#endif
#if defined(STA_CFG80211) || defined(UAP_CFG80211)
/** Is UAP or STA CFG80211 enabled in module param */
#define IS_STA_OR_UAP_CFG80211(x) (x & (STA_CFG80211_MASK | UAP_CFG80211_MASK))
#endif
#ifdef STA_WEXT
/** Is STA WEXT enabled in module param */
#define IS_STA_WEXT(x) (x & STA_WEXT_MASK)
#endif /* STA_WEXT */
#ifdef UAP_WEXT
/** Is UAP WEXT enabled in module param */
#define IS_UAP_WEXT(x) (x & UAP_WEXT_MASK)
#endif /* UAP_WEXT */
#if defined(STA_WEXT) || defined(UAP_WEXT)
/** Is UAP or STA WEXT enabled in module param */
#define IS_STA_OR_UAP_WEXT(x) (x & (STA_WEXT_MASK | UAP_WEXT_MASK))
#endif
#ifdef STA_SUPPORT
/** Driver mode STA bit */
#define DRV_MODE_STA MBIT(0)
/** Maximum STA BSS */
#define MAX_STA_BSS 1
/** Default STA BSS */
#define DEF_STA_BSS 1
#endif
#ifdef UAP_SUPPORT
/** Driver mode uAP bit */
#define DRV_MODE_UAP MBIT(1)
/** Maximum uAP BSS */
#define MAX_UAP_BSS 2
/** Default uAP BSS */
#define DEF_UAP_BSS 1
#endif
#if defined(WIFI_DIRECT_SUPPORT)
/** Driver mode WIFIDIRECT bit */
#define DRV_MODE_WIFIDIRECT MBIT(2)
/** Maximum WIFIDIRECT BSS */
#define MAX_WIFIDIRECT_BSS 2
/** Default WIFIDIRECT BSS */
#define DEF_WIFIDIRECT_BSS 1
#if defined(STA_CFG80211) && defined(UAP_CFG80211)
#define DEF_VIRTUAL_BSS 0
#endif
#endif /* WIFI_DIRECT_SUPPORT && V14_FEATURE */
/**
* the maximum number of adapter supported
**/
#define MAX_MLAN_ADAPTER 2
typedef struct _moal_drv_mode {
/** driver mode */
t_u16 drv_mode;
/** total number of interfaces */
t_u16 intf_num;
/** attribute of bss */
mlan_bss_attr *bss_attr;
/** name of firmware image */
char *fw_name;
} moal_drv_mode;
#ifdef PROC_DEBUG
/** Debug data */
struct debug_data {
/** Name */
char name[32];
/** Size */
t_u32 size;
/** Address */
t_ptr addr;
};
/** Private debug data */
struct debug_data_priv {
/** moal_private handle */
moal_private *priv;
/** Debug items */
struct debug_data *items;
/** numbre of item */
int num_of_items;
};
#endif
/** Maximum IP address buffer length */
#define IPADDR_MAX_BUF 20
/** IP address operation: Remove */
#define IPADDR_OP_REMOVE 0
struct tcp_sess {
struct list_head link;
/** tcp session info */
t_u32 src_ip_addr;
t_u32 dst_ip_addr;
t_u16 src_tcp_port;
t_u16 dst_tcp_port;
/** tx ack packet info */
t_u32 ack_seq;
/** tcp ack buffer */
void *ack_skb;
};
/** default rssi low threshold */
#define TDLS_RSSI_LOW_THRESHOLD 55
/** default rssi high threshold */
#define TDLS_RSSI_HIGH_THRESHOLD 50
/** TDLS idle time */
#define TDLS_IDLE_TIME (10*HZ)
/** TDLS max failure count */
#define TDLS_MAX_FAILURE_COUNT 4
/** TDLS tear down reason */
#define TDLS_TEARN_DOWN_REASON_UNSPECIFIC 26
/** TDLS status */
typedef enum _tdlsStatus_e {
TDLS_NOT_SETUP = 0,
TDLS_SETUP_INPROGRESS,
TDLS_SETUP_COMPLETE,
TDLS_SETUP_FAILURE,
TDLS_TEAR_DOWN,
TDLS_SWITCHING_CHANNEL,
TDLS_IN_BASE_CHANNEL,
TDLS_IN_OFF_CHANNEL,
} tdlsStatus_e;
/** tdls peer_info */
struct tdls_peer {
struct list_head link;
/** MAC address information */
t_u8 peer_addr[ETH_ALEN];
/** rssi */
int rssi;
/** jiffies with rssi */
long rssi_jiffies;
/** link status */
tdlsStatus_e link_status;
/** num of set up failure */
t_u8 num_failure;
};
/** Number of samples in histogram (/proc/mwlan/mlan0/histogram).*/
#define HIST_MAX_SAMPLES 1048576
#define RX_RATE_MAX 44
/** SRN MAX */
#define SNR_MAX 256
/** NOISE FLR MAX */
#define NOISE_FLR_MAX 256
/** SIG STRENTGH MAX */
#define SIG_STRENGTH_MAX 256
/** historgram data */
typedef struct _hgm_data {
/** rx rate */
atomic_t rx_rate[RX_RATE_MAX];
/** snr */
atomic_t snr[SNR_MAX];
/** noise flr */
atomic_t noise_flr[NOISE_FLR_MAX];
/** sig_str */
atomic_t sig_str[SIG_STRENGTH_MAX];
/** num sample */
atomic_t num_samples;
} hgm_data;
/** max antenna number */
#define MAX_ANTENNA_NUM 3
/* wlan_hist_proc_data */
typedef struct _wlan_hist_proc_data {
/** antenna */
u8 ant_idx;
/** Private structure */
struct _moal_private *priv;
} wlan_hist_proc_data;
/** Private structure for MOAL */
struct _moal_private {
/** Handle structure */
moal_handle *phandle;
/** Tx timeout count */
t_u32 num_tx_timeout;
/** BSS index */
t_u8 bss_index;
/** BSS type */
t_u8 bss_type;
/** BSS role */
t_u8 bss_role;
/** bss virtual flag */
t_u8 bss_virtual;
/** MAC address information */
t_u8 current_addr[ETH_ALEN];
/** Media connection status */
BOOLEAN media_connected;
/** Statistics of tcp ack tx dropped */
t_u32 tcp_ack_drop_cnt;
/** Statistics of tcp ack tx in total from kernel */
t_u32 tcp_ack_cnt;
#ifdef UAP_SUPPORT
/** uAP started or not */
BOOLEAN bss_started;
#endif
/** IP addr type */
t_u32 ip_addr_type;
/** IP addr */
t_u8 ip_addr[IPADDR_LEN];
#ifdef STA_SUPPORT
/** scan type */
t_u8 scan_type;
/** bg_scan_start */
t_u8 bg_scan_start;
/** bg_scan reported */
t_u8 bg_scan_reported;
/** bg_scan config */
wlan_bgscan_cfg scan_cfg;
/** sched scaning flag */
t_u8 sched_scanning;
#ifdef STA_CFG80211
/** roaming enabled flag */
t_u8 roaming_enabled;
/** rssi low threshold */
int rssi_low;
/** channel for connect */
struct ieee80211_channel conn_chan;
/** bssid for connect */
t_u8 conn_bssid[ETH_ALEN];
/** ssid for connect */
t_u8 conn_ssid[MLAN_MAX_SSID_LENGTH];
/** key data */
t_u8 conn_wep_key[MAX_WEP_KEY_SIZE];
/** connection param */
struct cfg80211_connect_params sme_current;
/** roaming required flag */
t_u8 roaming_required;
#endif
#endif
/** Net device pointer */
struct net_device *netdev;
/** Net device statistics structure */
struct net_device_stats stats;
#if defined(STA_CFG80211) || defined(UAP_CFG80211)
/** Wireless device pointer */
struct wireless_dev *wdev;
/** Wireless device */
struct wireless_dev w_dev;
/** Net device pointer */
struct net_device *pa_netdev;
/** channel parameter for UAP/GO */
t_u16 channel;
#ifdef UAP_SUPPORT
/** wep key */
wep_key uap_wep_key[4];
/** cipher */
t_u32 cipher;
#endif
/** beacon ie index */
t_u16 beacon_index;
/** proberesp ie index */
t_u16 proberesp_index;
/** proberesp_p2p_index */
t_u16 proberesp_p2p_index;
/** assocresp ie index */
t_u16 assocresp_index;
/** probereq index for mgmt ie */
t_u16 probereq_index;
/** mgmt_subtype_mask */
t_u32 mgmt_subtype_mask;
/** beacon wps index for mgmt ie */
t_u16 beacon_wps_index;
#endif
#ifdef STA_CFG80211
#ifdef STA_SUPPORT
/** CFG80211 scan request description */
struct cfg80211_scan_request *scan_request;
/** lock for scan_request */
spinlock_t scan_req_lock;
/** CFG80211 association description */
t_u8 cfg_bssid[ETH_ALEN];
/** Disconnect request from CFG80211 */
bool cfg_disconnect;
/** connect request from CFG80211 */
bool cfg_connect;
/** lock for cfg connect */
spinlock_t connect_lock;
/** assoc status */
t_u32 assoc_status;
/** rssi_threshold */
s32 cqm_rssi_thold;
/** rssi hysteresis */
u32 cqm_rssi_hyst;
/** last rssi_low */
u8 last_rssi_low;
/** last rssi_high */
u8 last_rssi_high;
/** mrvl rssi threshold */
u8 mrvl_rssi_low;
/** last event */
u32 last_event;
/** fake scan flag */
u8 fake_scan_complete;
#endif /* STA_SUPPORT */
#endif /* STA_CFG80211 */
/** IOCTL wait queue */
wait_queue_head_t ioctl_wait_q __ATTRIB_ALIGN__;
/** CMD wait queue */
wait_queue_head_t cmd_wait_q __ATTRIB_ALIGN__;
#ifdef CONFIG_PROC_FS
/** Proc entry */
struct proc_dir_entry *proc_entry;
/** Proc entry name */
char proc_entry_name[IFNAMSIZ];
/** proc entry for hist */
struct proc_dir_entry *hist_entry;
/** ant_hist_proc_data */
wlan_hist_proc_data hist_proc[MAX_ANTENNA_NUM];
/** PROC wait queue */
wait_queue_head_t proc_wait_q __ATTRIB_ALIGN__;
#endif /* CONFIG_PROC_FS */
#ifdef STA_SUPPORT
/** Nickname */
t_u8 nick_name[16];
/** AdHoc link sensed flag */
BOOLEAN is_adhoc_link_sensed;
/** Current WEP key index */
t_u16 current_key_index;
#ifdef REASSOCIATION
mlan_ssid_bssid prev_ssid_bssid;
/** Re-association required */
BOOLEAN reassoc_required;
/** Flag of re-association on/off */
BOOLEAN reassoc_on;
/** Set asynced essid flag */
BOOLEAN set_asynced_essid_flag;
#endif /* REASSOCIATION */
/** Report scan result */
t_u8 report_scan_result;
/** wpa_version */
t_u8 wpa_version;
/** key mgmt */
t_u8 key_mgmt;
/** rx_filter */
t_u8 rx_filter;
#endif /* STA_SUPPORT */
/** Rate index */
t_u16 rate_index;
#if defined(STA_WEXT) || defined(UAP_WEXT)
/** IW statistics */
struct iw_statistics w_stats;
/** w_stats wait queue */
wait_queue_head_t w_stats_wait_q __ATTRIB_ALIGN__;
#endif
#ifdef UAP_WEXT
/** Pairwise Cipher used for WPA/WPA2 mode */
t_u16 pairwise_cipher;
/** Group Cipher */
t_u16 group_cipher;
/** Protocol stored during uap wext configuratoin */
t_u16 uap_protocol;
/** Key Mgmt whether PSK or 1x */
t_u16 uap_key_mgmt;
/** Beacon IE length from hostapd */
t_u16 bcn_ie_len;
/** Beacon IE buffer from hostapd */
t_u8 bcn_ie_buf[MAX_IE_SIZE];
#endif
#ifdef PROC_DEBUG
/** MLAN debug info */
struct debug_data_priv items_priv;
struct debug_data_priv items_priv_peers;
#endif
/** tcp session queue */
struct list_head tcp_sess_queue;
/** TCP Ack enhance flag */
t_u8 enable_tcp_ack_enh;
/** TCP session spin lock */
spinlock_t tcp_sess_lock;
/** tcp list */
struct list_head tdls_list;
/** tdls spin lock */
spinlock_t tdls_lock;
/** auto tdls flag */
t_u8 enable_auto_tdls;
/** check tx packet for tdls peer */
t_u8 tdls_check_tx;
#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 29)
atomic_t wmm_tx_pending[4];
#endif
/** per interface extra headroom */
t_u16 extra_tx_head_len;
/** TX status spin lock */
spinlock_t tx_stat_lock;
/** tx_seq_num */
t_u8 tx_seq_num;
#if defined(STA_CFG80211) || defined(UAP_CFG80211)
/** tx_buf */
t_u8 *last_tx_buf;
/** tx_buf_len */
t_u8 last_tx_buf_len;
/** cookie */
t_u64 last_tx_cookie;
#endif
/** rx hgm data */
hgm_data *hist_data[3];
};
/** card info */
typedef struct _card_info {
/** support embeded supp */
t_bool embedded_supp;
/** support drcs */
t_bool drcs;
/** support Go NOA*/
t_bool go_noa;
/** support V15_UPDATE*/
t_bool v15_update;
} card_info;
/** Handle data structure for MOAL */
struct _moal_handle {
/** MLAN adapter structure */
t_void *pmlan_adapter;
/** Private pointer */
moal_private *priv[MLAN_MAX_BSS_NUM];
/** Priv number */
t_u8 priv_num;
/** Bss attr */
moal_drv_mode drv_mode;
/** set mac address flag */
t_u8 set_mac_addr;
/** MAC address */
t_u8 mac_addr[ETH_ALEN];
#ifdef CONFIG_PROC_FS
/** Proc top level directory entry */
struct proc_dir_entry *proc_mwlan;
#endif
/** Firmware */
const struct firmware *firmware;
/** Firmware request start time */
struct timeval req_fw_time;
/** Init config file */
const struct firmware *user_data;
/** Hotplug device */
struct device *hotplug_device;
/** STATUS variables */
MOAL_HARDWARE_STATUS hardware_status;
/** POWER MANAGEMENT AND PnP SUPPORT */
BOOLEAN surprise_removed;
/** Firmware release number */
t_u32 fw_release_number;
/** Init wait queue token */
t_u16 init_wait_q_woken;
/** Init wait queue */
wait_queue_head_t init_wait_q __ATTRIB_ALIGN__;
#if defined(SDIO_SUSPEND_RESUME)
/** Device suspend flag */
BOOLEAN is_suspended;
#ifdef SDIO_SUSPEND_RESUME
/** suspend notify flag */
BOOLEAN suspend_notify_req;
#endif
/** Host Sleep activated flag */
t_u8 hs_activated;
/** Host Sleep activated event wait queue token */
t_u16 hs_activate_wait_q_woken;
/** Host Sleep activated event wait queue */
wait_queue_head_t hs_activate_wait_q __ATTRIB_ALIGN__;
#endif
/** Card pointer */
t_void *card;
/** Rx pending in MLAN */
atomic_t rx_pending;
/** Tx packet pending count in mlan */
atomic_t tx_pending;
/** IOCTL pending count in mlan */
atomic_t ioctl_pending;
/** lock count */
atomic_t lock_count;
/** Malloc count */
atomic_t malloc_count;
/** vmalloc count */
atomic_t vmalloc_count;
/** mlan buffer alloc count */
atomic_t mbufalloc_count;
#if defined(SDIO_SUSPEND_RESUME)
/** hs skip count */
t_u32 hs_skip_count;
/** hs force count */
t_u32 hs_force_count;
/** suspend_fail flag */
BOOLEAN suspend_fail;
#endif
#ifdef REASSOCIATION
/** Re-association thread */
moal_thread reassoc_thread;
/** Re-association timer set flag */
BOOLEAN is_reassoc_timer_set;
/** Re-association timer */
moal_drv_timer reassoc_timer __ATTRIB_ALIGN__;
/** */
struct semaphore reassoc_sem;
/** Bitmap for re-association on/off */
t_u8 reassoc_on;
#endif /* REASSOCIATION */
/** Driver workqueue */
struct workqueue_struct *workqueue;
/** main work */
struct work_struct main_work;
/** Driver workqueue */
struct workqueue_struct *rx_workqueue;
/** main work */
struct work_struct rx_work;
#if defined(STA_CFG80211) || defined(UAP_CFG80211)
struct wiphy *wiphy;
/** Country code for regulatory domain */
t_u8 country_code[COUNTRY_CODE_LEN];
/** band */
enum ieee80211_band band;
/** first scan done flag */
t_u8 first_scan_done;
/** scan channel gap */
t_u16 scan_chan_gap;
#ifdef WIFI_DIRECT_SUPPORT
/** NoA duration */
t_u32 noa_duration;
/** NoA interval */
t_u32 noa_interval;
/** miracast mode */
t_u8 miracast_mode;
/** scan time in miracast mode */
t_u16 miracast_scan_time;
/** remain on channel flag */
t_u8 remain_on_channel;
/** bss index for remain on channel */
t_u8 remain_bss_index;
/** ieee802_11_channel */
struct ieee80211_channel chan;
#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0)
/** channel type */
enum nl80211_channel_type channel_type;
#endif
/** cookie */
t_u64 cookie;
/** GO timer set flag */
BOOLEAN is_go_timer_set;
/** GO timer */
moal_drv_timer go_timer __ATTRIB_ALIGN__;
/** remain_on_channel timer set flag */
BOOLEAN is_remain_timer_set;
/** remani_on_channel_timer */
moal_drv_timer remain_timer __ATTRIB_ALIGN__;
#endif
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0) || defined(COMPAT_WIRELESS)
/** cfg80211_suspend status */
t_u8 cfg80211_suspend;
#endif
#endif
/** Read SDIO registers for debugging */
t_u32 sdio_reg_dbg;
/** Netlink kernel socket */
struct sock *nl_sk;
/** Netlink kernel socket number */
t_u32 netlink_num;
/** w_stats wait queue token */
BOOLEAN meas_wait_q_woken;
/** w_stats wait queue */
wait_queue_head_t meas_wait_q __ATTRIB_ALIGN__;
/** Measurement start jiffes */
long meas_start_jiffies;
/** CAC checking period flag */
BOOLEAN cac_period;
/** BSS START command delay executing flag */
BOOLEAN delay_bss_start;
/** SSID,BSSID parameter of delay executing */
mlan_ssid_bssid delay_ssid_bssid;
#ifdef DFS_TESTING_SUPPORT
/** cac period length, valid only when dfs testing is enabled */
long cac_period_jiffies;
#endif
/** handle index - for multiple card supports */
t_u8 handle_idx;
#ifdef SDIO_MMC_DEBUG
/** cmd53 write state */
u8 cmd53w;
/** cmd53 read state */
u8 cmd53r;
#endif
#ifdef STA_SUPPORT
/** Scan pending on blocked flag */
t_u8 scan_pending_on_block;
/** Async scan semaphore */
struct semaphore async_sem;
#endif
/** main state */
t_u8 main_state;
/** driver state */
t_u8 driver_state;
/** ioctl timeout */
t_u8 ioctl_timeout;
/** FW dump state */
t_u8 fw_dump;
/** cmd52 function */
t_u8 cmd52_func;
/** cmd52 register */
t_u8 cmd52_reg;
/** cmd52 value */
t_u8 cmd52_val;
#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 29)
/** spinlock to stop_queue/wake_queue*/
spinlock_t queue_lock;
#endif
/** Driver spin lock */
spinlock_t driver_lock;
/** Driver ioctl spin lock */
spinlock_t ioctl_lock;
/** Card type */
t_u16 card_type;
/** card info */
card_info *card_info;
/** Card specific driver version */
t_s8 driver_version[MLAN_MAX_VER_STR_LEN];
t_u8 histogram_table_num;
};
/**
* @brief set trans_start for each TX queue.
*
* @param dev A pointer to net_device structure
*
* @return N/A
*/
static inline void
woal_set_trans_start(struct net_device *dev)
{
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 31)
unsigned int i;
for (i = 0; i < dev->num_tx_queues; i++)
netdev_get_tx_queue(dev, i)->trans_start = jiffies;
#endif
dev->trans_start = jiffies;
}
/**
* @brief Start queue
*
* @param dev A pointer to net_device structure
*
* @return N/A
*/
static inline void
woal_start_queue(struct net_device *dev)
{
#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 29)
netif_start_queue(dev);
#else
netif_tx_start_all_queues(dev);
#endif
}
/**
* @brief Stop queue
*
* @param dev A pointer to net_device structure
*
* @return N/A
*/
static inline void
woal_stop_queue(struct net_device *dev)
{
#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 29)
unsigned long flags;
moal_private *priv = (moal_private *)netdev_priv(dev);
spin_lock_irqsave(&priv->phandle->queue_lock, flags);
woal_set_trans_start(dev);
if (!netif_queue_stopped(dev))
netif_tx_stop_all_queues(dev);
spin_unlock_irqrestore(&priv->phandle->queue_lock, flags);
#else
woal_set_trans_start(dev);
if (!netif_queue_stopped(dev))
netif_stop_queue(dev);
#endif
}
/**
* @brief wake queue
*
* @param dev A pointer to net_device structure
*
* @return N/A
*/
static inline void
woal_wake_queue(struct net_device *dev)
{
#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 29)
unsigned long flags;
moal_private *priv = (moal_private *)netdev_priv(dev);
spin_lock_irqsave(&priv->phandle->queue_lock, flags);
if (netif_queue_stopped(dev))
netif_tx_wake_all_queues(dev);
spin_unlock_irqrestore(&priv->phandle->queue_lock, flags);
#else
if (netif_queue_stopped(dev))
netif_wake_queue(dev);
#endif
}
/** Debug Macro definition*/
#ifdef DEBUG_LEVEL1
extern t_u32 drvdbg;
#define LOG_CTRL(level) (0)
#ifdef DEBUG_LEVEL2
#define PRINTM_MINFO(level, msg...) do { \
woal_print(level, msg); \
if (drvdbg & MINFO) printk(KERN_DEBUG msg); \
} while (0)
#define PRINTM_MWARN(level, msg...) do { \
woal_print(level, msg); \
if (drvdbg & MWARN) printk(KERN_DEBUG msg); \
} while (0)
#define PRINTM_MENTRY(level, msg...) do { \
woal_print(level, msg); \
if (drvdbg & MENTRY) printk(KERN_DEBUG msg); \
} while (0)
#else
#define PRINTM_MINFO(level, msg...) do {} while (0)
#define PRINTM_MWARN(level, msg...) do {} while (0)
#define PRINTM_MENTRY(level, msg...) do {} while (0)
#endif /* DEBUG_LEVEL2 */
#define PRINTM_MFW_D(level, msg...) do { \
woal_print(level, msg); \
if (drvdbg & MFW_D) printk(KERN_DEBUG msg); \
} while (0)
#define PRINTM_MCMD_D(level, msg...) do { \
woal_print(level, msg); \
if (drvdbg & MCMD_D) printk(KERN_DEBUG msg); \
} while (0)
#define PRINTM_MDAT_D(level, msg...) do { \
woal_print(level, msg); \
if (drvdbg & MDAT_D) printk(KERN_DEBUG msg); \
} while (0)
#define PRINTM_MIF_D(level, msg...) do { \
woal_print(level, msg); \
if (drvdbg & MIF_D) printk(KERN_DEBUG msg); \
} while (0)
#define PRINTM_MIOCTL(level, msg...) do { \
woal_print(level, msg); \
if (drvdbg & MIOCTL) printk(KERN_DEBUG msg); \
} while (0)
#define PRINTM_MINTR(level, msg...) do { \
woal_print(level, msg); \
if (drvdbg & MINTR) printk(KERN_DEBUG msg); \
} while (0)
#define PRINTM_MEVENT(level, msg...) do { \
woal_print(level, msg); \
if (drvdbg & MEVENT) printk(msg); \
} while (0)
#define PRINTM_MCMND(level, msg...) do { \
woal_print(level, msg); \
if (drvdbg & MCMND) printk(KERN_DEBUG msg); \
} while (0)
#define PRINTM_MDATA(level, msg...) do { \
woal_print(level, msg); \
if (drvdbg & MDATA) printk(KERN_DEBUG msg); \
} while (0)
#define PRINTM_MERROR(level, msg...) do { \
woal_print(level, msg); \
if (drvdbg & MERROR) printk(KERN_ERR msg); \
} while (0)
#define PRINTM_MFATAL(level, msg...) do { \
woal_print(level, msg); \
if (drvdbg & MFATAL) printk(KERN_ERR msg); \
} while (0)
#define PRINTM_MMSG(level, msg...) do { \
woal_print(level, msg); \
if (drvdbg & MMSG) printk(KERN_ALERT msg); \
} while (0)
static inline void
woal_print(t_u32 level, char *fmt, ...)
{
}
#define PRINTM(level, msg...) PRINTM_##level(level, msg)
#else
#define PRINTM(level, msg...) do {} while (0)
#endif /* DEBUG_LEVEL1 */
/** Wait until a condition becomes true */
#define MASSERT(cond) \
do { \
if (!(cond)) { \
PRINTM(MFATAL, "ASSERT: %s: %i\n", __func__, __LINE__); \
panic("Assert failed: Panic!"); \
} \
} while (0)
/** Log entry point for debugging */
#define ENTER() PRINTM(MENTRY, "Enter: %s\n", \
__func__)
/** Log exit point for debugging */
#define LEAVE() PRINTM(MENTRY, "Leave: %s\n", \
__func__)
#ifdef DEBUG_LEVEL1
#define DBG_DUMP_BUF_LEN 64
#define MAX_DUMP_PER_LINE 16
static inline void
hexdump(t_u32 level, char *prompt, t_u8 *buf, int len)
{
int i;
char dbgdumpbuf[DBG_DUMP_BUF_LEN];
char *ptr = dbgdumpbuf;
if (drvdbg & level)
printk(KERN_DEBUG "%s:\n", prompt);
for (i = 1; i <= len; i++) {
ptr += snprintf(ptr, 4, "%02x ", *buf);
buf++;
if (i % MAX_DUMP_PER_LINE == 0) {
*ptr = 0;
if (drvdbg & level)
printk(KERN_DEBUG "%s\n", dbgdumpbuf);
ptr = dbgdumpbuf;
}
}
if (len % MAX_DUMP_PER_LINE) {
*ptr = 0;
if (drvdbg & level)
printk(KERN_DEBUG "%s\n", dbgdumpbuf);
}
}
#define DBG_HEXDUMP_MERROR(x, y, z) do { \
if ((drvdbg & MERROR) || LOG_CTRL(MERROR)) \
hexdump(MERROR, x, y, z); \
} while (0)
#define DBG_HEXDUMP_MCMD_D(x, y, z) do { \
if ((drvdbg & MCMD_D) || LOG_CTRL(MCMD_D)) \
hexdump(MCMD_D, x, y, z); \
} while (0)
#define DBG_HEXDUMP_MDAT_D(x, y, z) do { \
if ((drvdbg & MDAT_D) || LOG_CTRL(MDAT_D)) \
hexdump(MDAT_D, x, y, z); \
} while (0)
#define DBG_HEXDUMP_MIF_D(x, y, z) do { \
if ((drvdbg & MIF_D) || LOG_CTRL(MIF_D)) \
hexdump(MIF_D, x, y, z); \
} while (0)
#define DBG_HEXDUMP_MEVT_D(x, y, z) do { \
if ((drvdbg & MEVT_D) || LOG_CTRL(MEVT_D)) \
hexdump(MEVT_D, x, y, z); \
} while (0)
#define DBG_HEXDUMP_MFW_D(x, y, z) do { \
if ((drvdbg & MFW_D) || LOG_CTRL(MFW_D)) \
hexdump(MFW_D, x, y, z); \
} while (0)
#define DBG_HEXDUMP(level, x, y, z) DBG_HEXDUMP_##level(x, y, z)
#else
/** Do nothing since debugging is not turned on */
#define DBG_HEXDUMP(level, x, y, z) do {} while (0)
#endif
#ifdef DEBUG_LEVEL2
#define HEXDUMP(x, y, z) do { \
if ((drvdbg & MINFO) || LOG_CTRL(MINFO)) \
hexdump(MINFO, x, y, z); \
} while (0)
#else
/** Do nothing since debugging is not turned on */
#define HEXDUMP(x, y, z) do {} while (0)
#endif
#ifdef BIG_ENDIAN_SUPPORT
/** Convert from 16 bit little endian format to CPU format */
#define woal_le16_to_cpu(x) le16_to_cpu(x)
/** Convert from 32 bit little endian format to CPU format */
#define woal_le32_to_cpu(x) le32_to_cpu(x)
/** Convert from 64 bit little endian format to CPU format */
#define woal_le64_to_cpu(x) le64_to_cpu(x)
/** Convert to 16 bit little endian format from CPU format */
#define woal_cpu_to_le16(x) cpu_to_le16(x)
/** Convert to 32 bit little endian format from CPU format */
#define woal_cpu_to_le32(x) cpu_to_le32(x)
/** Convert to 64 bit little endian format from CPU format */
#define woal_cpu_to_le64(x) cpu_to_le64(x)
#else
/** Do nothing */
#define woal_le16_to_cpu(x) x
/** Do nothing */
#define woal_le32_to_cpu(x) x
/** Do nothing */
#define woal_le64_to_cpu(x) x
/** Do nothing */
#define woal_cpu_to_le16(x) x
/** Do nothing */
#define woal_cpu_to_le32(x) x
/** Do nothing */
#define woal_cpu_to_le64(x) x
#endif
/**
* @brief This function returns first available priv
* based on the BSS role
*
* @param handle A pointer to moal_handle
* @param bss_role BSS role or MLAN_BSS_ROLE_ANY
*
* @return Pointer to moal_private
*/
static inline moal_private *
woal_get_priv(moal_handle *handle, mlan_bss_role bss_role)
{
int i;
for (i = 0; i < MIN(handle->priv_num, MLAN_MAX_BSS_NUM); i++) {
if (handle->priv[i]) {
if (bss_role == MLAN_BSS_ROLE_ANY ||
GET_BSS_ROLE(handle->priv[i]) == bss_role)
return handle->priv[i];
}
}
return NULL;
}
/**
* @brief This function returns first available priv
* based on the BSS type
*
* @param handle A pointer to moal_handle
* @param bss_type BSS type or MLAN_BSS_TYPE_ANY
*
* @return Pointer to moal_private
*/
static inline moal_private *
woal_get_priv_bss_type(moal_handle *handle, mlan_bss_type bss_type)
{
int i;
for (i = 0; i < MIN(handle->priv_num, MLAN_MAX_BSS_NUM); i++) {
if (handle->priv[i]) {
if (bss_type == MLAN_BSS_TYPE_ANY ||
handle->priv[i]->bss_type == bss_type)
return handle->priv[i];
}
}
return NULL;
}
/** Max line length allowed in init config file */
#define MAX_LINE_LEN 256
/** Max MAC address string length allowed */
#define MAX_MAC_ADDR_LEN 18
/** Max register type/offset/value etc. parameter length allowed */
#define MAX_PARAM_LEN 12
/** HostCmd_CMD_CFG_DATA for CAL data */
#define HostCmd_CMD_CFG_DATA 0x008f
/** HostCmd action set */
#define HostCmd_ACT_GEN_SET 0x0001
/** HostCmd CAL data header length */
#define CFG_DATA_HEADER_LEN 6
typedef struct _HostCmd_DS_GEN {
t_u16 command;
t_u16 size;
t_u16 seq_num;
t_u16 result;
} HostCmd_DS_GEN;
typedef struct _HostCmd_DS_802_11_CFG_DATA {
/** Action */
t_u16 action;
/** Type */
t_u16 type;
/** Data length */
t_u16 data_len;
/** Data */
t_u8 data[1];
} __ATTRIB_PACK__ HostCmd_DS_802_11_CFG_DATA;
/** SD8787 card type */
#define CARD_TYPE_SD8787 0x01
/** SD8777 card type */
#define CARD_TYPE_SD8777 0x02
/** SD8887 card type */
#define CARD_TYPE_SD8887 0x03
/** SD8801 card type */
#define CARD_TYPE_SD8801 0x04
/** SD8897 card type */
#define CARD_TYPE_SD8897 0x05
/** SD8797 card type */
#define CARD_TYPE_SD8797 0x06
/** combo scan header */
#define WEXT_CSCAN_HEADER "CSCAN S\x01\x00\x00S\x00"
/** combo scan header size */
#define WEXT_CSCAN_HEADER_SIZE 12
/** combo scan ssid section */
#define WEXT_CSCAN_SSID_SECTION 'S'
/** commbo scan channel section */
#define WEXT_CSCAN_CHANNEL_SECTION 'C'
/** commbo scan passive dwell section */
#define WEXT_CSCAN_PASV_DWELL_SECTION 'P'
/** commbo scan home dwell section */
#define WEXT_CSCAN_HOME_DWELL_SECTION 'H'
/** BGSCAN RSSI section */
#define WEXT_BGSCAN_RSSI_SECTION 'R'
/** BGSCAN SCAN INTERVAL SECTION */
#define WEXT_BGSCAN_INTERVAL_SECTION 'T'
/** BGSCAN REPEAT SECTION */
#define WEXT_BGSCAN_REPEAT_SECTION 'E'
/** Min BGSCAN interval 30 second */
#define MIN_BGSCAN_INTERVAL 30000
/** default repeat count */
#define DEF_REPEAT_COUNT 6
/** default rssi low threshold */
#define DEFAULT_RSSI_LOW_THRESHOLD 70
/** RSSI HYSTERSIS */
#define RSSI_HYSTERESIS 6
/** lowest rssi threshold */
#define LOWEST_RSSI_THRESHOLD 82
/** delta rssi */
#define DELTA_RSSI 10
/** NL80211 scan configuration header */
#define NL80211_SCANCFG_HEADER "SCAN-CFG "
/** NL80211 scan configuration header length */
#define NL80211_SCANCFG_HEADER_SIZE 9
/** NL80211 scan configuration active scan section */
#define NL80211_SCANCFG_ACTV_DWELL_SECTION 'A'
/** NL80211 scan configuration passive scan section */
#define NL80211_SCANCFG_PASV_DWELL_SECTION 'P'
/** NL80211 scan configuration specific scan section */
#define NL80211_SCANCFG_SPCF_DWELL_SECTION 'S'
/** band AUTO */
#define WIFI_FREQUENCY_BAND_AUTO 0
/** band 5G */
#define WIFI_FREQUENCY_BAND_5GHZ 1
/** band 2G */
#define WIFI_FREQUENCY_BAND_2GHZ 2
/** All band */
#define WIFI_FREQUENCY_ALL_BAND 3
/** Rx filter: IPV4 multicast */
#define RX_FILTER_IPV4_MULTICAST 1
/** Rx filter: broadcast */
#define RX_FILTER_BROADCAST 2
/** Rx filter: unicast */
#define RX_FILTER_UNICAST 4
/** Rx filter: IPV6 multicast */
#define RX_FILTER_IPV6_MULTICAST 8
/** Convert ASCII string to hex value */
int woal_ascii2hex(t_u8 *d, char *s, t_u32 dlen);
/** parse ie */
const t_u8 *woal_parse_ie_tlv(const t_u8 *ie, int len, t_u8 id);
/** Convert mac address from string to t_u8 buffer */
void woal_mac2u8(t_u8 *mac_addr, char *buf);
/** Extract token from string */
char *woal_strsep(char **s, char delim, char esc);
/** Return int value of a given ASCII string */
mlan_status woal_atoi(int *data, char *a);
/** Return hex value of a given ASCII string */
int woal_atox(char *a);
/** Allocate buffer */
pmlan_buffer woal_alloc_mlan_buffer(moal_handle *handle, int size);
/** Allocate IOCTL request buffer */
pmlan_ioctl_req woal_alloc_mlan_ioctl_req(int size);
/** Free buffer */
void woal_free_mlan_buffer(moal_handle *handle, pmlan_buffer pmbuf);
/** Get private structure of a BSS by index */
moal_private *woal_bss_index_to_priv(moal_handle *handle, t_u8 bss_index);
/* Functions in interface module */
/** Add card */
moal_handle *woal_add_card(void *card);
/** Remove card */
mlan_status woal_remove_card(void *card);
/** broadcast event */
mlan_status woal_broadcast_event(moal_private *priv, t_u8 *payload, t_u32 len);
#ifdef CONFIG_PROC_FS
/** switch driver mode */
mlan_status woal_switch_drv_mode(moal_handle *handle, t_u32 mode);
#endif
/** Interrupt handler */
void woal_interrupt(moal_handle *handle);
/** Get version */
void woal_get_version(moal_handle *handle, char *version, int maxlen);
/** Get Driver Version */
int woal_get_driver_version(moal_private *priv, struct ifreq *req);
/** Get extended driver version */
int woal_get_driver_verext(moal_private *priv, struct ifreq *ireq);
/** check driver status */
t_u8 woal_check_driver_status(moal_handle *handle);
/** Mgmt frame forward registration */
int woal_reg_rx_mgmt_ind(moal_private *priv, t_u16 action,
t_u32 *pmgmt_subtype_mask, t_u8 wait_option);
#ifdef DEBUG_LEVEL1
/** Set driver debug bit masks */
int woal_set_drvdbg(moal_private *priv, t_u32 drvdbg);
#endif
mlan_status woal_set_get_tx_bf_cap(moal_private *priv, t_u16 action,
t_u32 *tx_bf_cap);
/** Request MAC address setting */
mlan_status woal_request_set_mac_address(moal_private *priv);
/** Request multicast list setting */
void woal_request_set_multicast_list(moal_private *priv,
struct net_device *dev);
/** Request IOCTL action */
mlan_status woal_request_ioctl(moal_private *priv, mlan_ioctl_req *req,
t_u8 wait_option);
#ifdef CONFIG_PROC_FS
mlan_status woal_request_soft_reset(moal_handle *handle);
#endif
#ifdef PROC_DEBUG
/** Get debug information */
mlan_status woal_get_debug_info(moal_private *priv, t_u8 wait_option,
mlan_debug_info *debug_info);
/** Set debug information */
mlan_status woal_set_debug_info(moal_private *priv, t_u8 wait_option,
mlan_debug_info *debug_info);
#endif
/** Disconnect */
mlan_status woal_disconnect(moal_private *priv, t_u8 wait_option, t_u8 *mac);
/** associate */
mlan_status woal_bss_start(moal_private *priv, t_u8 wait_option,
mlan_ssid_bssid *ssid_bssid);
/** Request firmware information */
mlan_status woal_request_get_fw_info(moal_private *priv, t_u8 wait_option,
mlan_fw_info *fw_info);
/** Set/get Host Sleep parameters */
mlan_status woal_set_get_hs_params(moal_private *priv, t_u16 action,
t_u8 wait_option, mlan_ds_hs_cfg *hscfg);
/** Cancel Host Sleep configuration */
mlan_status woal_cancel_hs(moal_private *priv, t_u8 wait_option);
#if defined(SDIO_SUSPEND_RESUME)
/** Enable Host Sleep configuration */
int woal_enable_hs(moal_private *priv);
/** hs active timeout 2 second */
#define HS_ACTIVE_TIMEOUT (2 * HZ)
#endif
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0)
void woal_create_dump_dir(moal_handle *phandle, char *dir_buf, int buf_size);
#endif
mlan_status woal_save_dump_info_to_file(char *dir_name, char *file_name,
t_u8 *buf, t_u32 buf_len);
void woal_dump_drv_info(moal_handle *phandle, t_u8 *dir_name);
void woal_dump_firmware_info(moal_handle *phandle);
void woal_dump_firmware_info_v2(moal_handle *phandle);
/** get deep sleep */
int woal_get_deep_sleep(moal_private *priv, t_u32 *data);
/** set deep sleep */
int woal_set_deep_sleep(moal_private *priv, t_u8 wait_option,
BOOLEAN bdeep_sleep, t_u16 idletime);
/** process hang */
void woal_process_hang(moal_handle *handle);
/** Get BSS information */
mlan_status woal_get_bss_info(moal_private *priv, t_u8 wait_option,
mlan_bss_info *bss_info);
void woal_process_ioctl_resp(moal_private *priv, mlan_ioctl_req *req);
#ifdef STA_SUPPORT
void woal_send_disconnect_to_system(moal_private *priv);
void woal_send_mic_error_event(moal_private *priv, t_u32 event);
void woal_ioctl_get_bss_resp(moal_private *priv, mlan_ds_bss *bss);
void woal_ioctl_get_info_resp(moal_private *priv, mlan_ds_get_info *info);
mlan_status woal_get_assoc_rsp(moal_private *priv,
mlan_ds_misc_assoc_rsp *assoc_rsp);
/** Get signal information */
mlan_status woal_get_signal_info(moal_private *priv, t_u8 wait_option,
mlan_ds_get_signal *signal);
/** Get mode */
t_u32 woal_get_mode(moal_private *priv, t_u8 wait_option);
char *region_code_2_string(t_u8 region_code);
t_u8 woal_is_valid_alpha2(char *alpha2);
/** Get statistics information */
mlan_status woal_get_stats_info(moal_private *priv, t_u8 wait_option,
mlan_ds_get_stats *stats);
#ifdef STA_WEXT
/** Get data rates */
mlan_status woal_get_data_rates(moal_private *priv, t_u8 wait_option,
moal_802_11_rates *m_rates);
void woal_send_iwevcustom_event(moal_private *priv, char *str);
/** Get channel list */
mlan_status woal_get_channel_list(moal_private *priv, t_u8 wait_option,
mlan_chan_list *chanlist);
#endif
/** Set/Get retry count */
mlan_status woal_set_get_retry(moal_private *priv, t_u32 action,
t_u8 wait_option, int *value);
/** Set/Get RTS threshold */
mlan_status woal_set_get_rts(moal_private *priv, t_u32 action, t_u8 wait_option,
int *value);
/** Set/Get fragment threshold */
mlan_status woal_set_get_frag(moal_private *priv, t_u32 action,
t_u8 wait_option, int *value);
/** Set/Get generic element */
mlan_status woal_set_get_gen_ie(moal_private *priv, t_u32 action, t_u8 *ie,
int *ie_len, t_u8 wait_option);
/** Set/Get TX power */
mlan_status woal_set_get_tx_power(moal_private *priv, t_u32 action,
mlan_power_cfg_t *pwr);
/** Set/Get power IEEE management */
mlan_status woal_set_get_power_mgmt(moal_private *priv, t_u32 action,
int *disabled, int type, t_u8 wait_option);
/** Get data rate */
mlan_status woal_set_get_data_rate(moal_private *priv, t_u8 action,
mlan_rate_cfg_t *datarate);
/** Request a network scan */
mlan_status woal_request_scan(moal_private *priv, t_u8 wait_option,
mlan_802_11_ssid *req_ssid);
/** Set radio on/off */
int woal_set_radio(moal_private *priv, t_u8 option);
/** Set region code */
mlan_status woal_set_region_code(moal_private *priv, char *region);
/** Set authentication mode */
mlan_status woal_set_auth_mode(moal_private *priv, t_u8 wait_option,
t_u32 auth_mode);
/** Set encryption mode */
mlan_status woal_set_encrypt_mode(moal_private *priv, t_u8 wait_option,
t_u32 encrypt_mode);
/** Enable wep key */
mlan_status woal_enable_wep_key(moal_private *priv, t_u8 wait_option);
/** Set WPA enable */
mlan_status woal_set_wpa_enable(moal_private *priv, t_u8 wait_option,
t_u32 enable);
/** cancel scan command */
mlan_status woal_cancel_scan(moal_private *priv, t_u8 wait_option);
/** Find best network to connect */
mlan_status woal_find_best_network(moal_private *priv, t_u8 wait_option,
mlan_ssid_bssid *ssid_bssid);
/** Set Ad-Hoc channel */
mlan_status woal_change_adhoc_chan(moal_private *priv, int channel,
t_u8 wait_option);
/** Get scan table */
mlan_status woal_get_scan_table(moal_private *priv, t_u8 wait_option,
mlan_scan_resp *scanresp);
/** Get authentication mode */
mlan_status woal_get_auth_mode(moal_private *priv, t_u8 wait_option,
t_u32 *auth_mode);
/** Get encryption mode */
mlan_status woal_get_encrypt_mode(moal_private *priv, t_u8 wait_option,
t_u32 *encrypt_mode);
/** Get WPA state */
mlan_status woal_get_wpa_enable(moal_private *priv, t_u8 wait_option,
t_u32 *enable);
#endif /**STA_SUPPORT */
mlan_status woal_set_wapi_enable(moal_private *priv, t_u8 wait_option,
t_u32 enable);
/** Initialize priv */
void woal_init_priv(moal_private *priv, t_u8 wait_option);
/** Reset interface(s) */
int woal_reset_intf(moal_private *priv, t_u8 wait_option, int all_intf);
/** common ioctl for uap, station */
int woal_custom_ie_ioctl(struct net_device *dev, struct ifreq *req);
int woal_send_host_packet(struct net_device *dev, struct ifreq *req);
/** Private command ID to pass mgmt frame */
#define WOAL_MGMT_FRAME_TX_IOCTL (SIOCDEVPRIVATE + 12)
/** common ioctl for TDLS */
int woal_tdls_config_ioctl(struct net_device *dev, struct ifreq *req);
int woal_get_bss_type(struct net_device *dev, struct ifreq *req);
#if defined(STA_WEXT) || defined(UAP_WEXT)
int woal_host_command(moal_private *priv, struct iwreq *wrq);
#endif
#if defined(STA_SUPPORT) && defined(UAP_SUPPORT)
mlan_status woal_bss_role_cfg(moal_private *priv, t_u8 action,
t_u8 wait_option, t_u8 *bss_role);
#if defined(STA_CFG80211) && defined(UAP_CFG80211)
void woal_go_timer_func(void *context);
#endif
#if defined(STA_WEXT) || defined(UAP_WEXT)
int woal_set_get_bss_role(moal_private *priv, struct iwreq *wrq);
#endif
#endif
#if defined(WIFI_DIRECT_SUPPORT) || defined(UAP_SUPPORT)
/** hostcmd ioctl for uap, wifidirect */
int woal_hostcmd_ioctl(struct net_device *dev, struct ifreq *req);
#endif
#if defined(WIFI_DIRECT_SUPPORT)
mlan_status woal_set_remain_channel_ioctl(moal_private *priv, t_u8 wait_option,
mlan_ds_remain_chan *pchan);
mlan_status woal_wifi_direct_mode_cfg(moal_private *priv, t_u16 action,
t_u16 *mode);
mlan_status woal_p2p_config(moal_private *priv, t_u32 action,
mlan_ds_wifi_direct_config *p2p_config);
void woal_remain_timer_func(void *context);
#endif /* WIFI_DIRECT_SUPPORT */
#ifdef CONFIG_PROC_FS
/** Initialize proc fs */
void woal_proc_init(moal_handle *handle);
/** Clean up proc fs */
void woal_proc_exit(moal_handle *handle);
/** Create proc entry */
void woal_create_proc_entry(moal_private *priv);
/** Remove proc entry */
void woal_proc_remove(moal_private *priv);
/** string to number */
int woal_string_to_number(char *s);
#endif
#ifdef PROC_DEBUG
/** Create debug proc fs */
void woal_debug_entry(moal_private *priv);
/** Remove debug proc fs */
void woal_debug_remove(moal_private *priv);
#endif /* PROC_DEBUG */
/** check pm info */
mlan_status woal_get_pm_info(moal_private *priv, mlan_ds_ps_info *pm_info);
/** get mlan debug info */
void woal_mlan_debug_info(moal_private *priv);
#ifdef REASSOCIATION
int woal_reassociation_thread(void *data);
void woal_reassoc_timer_func(void *context);
#endif /* REASSOCIATION */
t_void woal_main_work_queue(struct work_struct *work);
t_void woal_rx_work_queue(struct work_struct *work);
int woal_hard_start_xmit(struct sk_buff *skb, struct net_device *dev);
#ifdef STA_SUPPORT
mlan_status woal_init_sta_dev(struct net_device *dev, moal_private *priv);
#endif
#ifdef UAP_SUPPORT
mlan_status woal_init_uap_dev(struct net_device *dev, moal_private *priv);
#endif
moal_private *woal_add_interface(moal_handle *handle, t_u8 bss_num,
t_u8 bss_type);
void woal_remove_interface(moal_handle *handle, t_u8 bss_index);
void woal_set_multicast_list(struct net_device *dev);
mlan_status woal_request_fw(moal_handle *handle);
int woal_11h_channel_check_ioctl(moal_private *priv, t_u8 wait_option);
void woal_cancel_cac_block(moal_private *priv);
void woal_moal_debug_info(moal_private *priv, moal_handle *handle, u8 flag);
#ifdef STA_SUPPORT
mlan_status woal_get_powermode(moal_private *priv, int *powermode);
mlan_status woal_set_scan_type(moal_private *priv, t_u32 scan_type);
mlan_status woal_enable_ext_scan(moal_private *priv, t_u8 enable);
mlan_status woal_set_powermode(moal_private *priv, char *powermode);
int woal_find_essid(moal_private *priv, mlan_ssid_bssid *ssid_bssid,
t_u8 wait_option);
mlan_status woal_request_userscan(moal_private *priv, t_u8 wait_option,
wlan_user_scan_cfg *scan_cfg);
mlan_status woal_do_scan(moal_private *priv, wlan_user_scan_cfg *scan_cfg);
int woal_set_combo_scan(moal_private *priv, char *buf, int length);
mlan_status woal_set_scan_time(moal_private *priv, t_u16 active_scan_time,
t_u16 passive_scan_time,
t_u16 specific_scan_time);
mlan_status woal_get_band(moal_private *priv, int *band);
mlan_status woal_set_band(moal_private *priv, char *pband);
mlan_status woal_add_rxfilter(moal_private *priv, char *rxfilter);
mlan_status woal_remove_rxfilter(moal_private *priv, char *rxfilter);
mlan_status woal_priv_qos_cfg(moal_private *priv, t_u32 action, char *qos_cfg);
mlan_status woal_set_sleeppd(moal_private *priv, char *psleeppd);
int woal_set_scan_cfg(moal_private *priv, char *buf, int length);
/* EVENT: BCN_RSSI_LOW */
#define EVENT_BCN_RSSI_LOW 0x0001
/* EVENT: PRE_BCN_LOST */
#define EVENT_PRE_BCN_LOST 0x0002
mlan_status woal_set_rssi_low_threshold(moal_private *priv, char *rssi,
t_u8 wait_option);
mlan_status woal_set_rssi_threshold(moal_private *priv, t_u32 event_id,
t_u8 wait_option);
/* EVENT: BG_SCAN_REPORT */
#define EVENT_BG_SCAN_REPORT 0x0004
mlan_status woal_set_bg_scan(moal_private *priv, char *buf, int length);
mlan_status woal_stop_bg_scan(moal_private *priv, t_u8 wait_option);
void woal_reconfig_bgscan(moal_handle *handle);
#ifdef STA_CFG80211
void woal_config_bgscan_and_rssi(moal_private *priv, t_u8 set_rssi);
void woal_start_roaming(moal_private *priv);
#endif
#ifdef STA_CFG80211
void woal_save_conn_params(moal_private *priv,
struct cfg80211_connect_params *sme);
void woal_clear_conn_params(moal_private *priv);
#endif
mlan_status woal_request_bgscan(moal_private *priv, t_u8 wait_option,
wlan_bgscan_cfg *scan_cfg);
#endif
void woal_flush_tcp_sess_queue(moal_private *priv);
void woal_flush_tdls_list(moal_private *priv);
void wlan_scan_create_brief_table_entry(t_u8 **ppbuffer,
BSSDescriptor_t *pbss_desc);
int wlan_get_scan_table_ret_entry(BSSDescriptor_t *pbss_desc, t_u8 **ppbuffer,
int *pspace_left);
BOOLEAN woal_ssid_valid(mlan_802_11_ssid *pssid);
int woal_is_connected(moal_private *priv, mlan_ssid_bssid *ssid_bssid);
int woal_priv_hostcmd(moal_private *priv, t_u8 *respbuf, t_u32 respbuflen);
void woal_tcp_ack_tx_indication(moal_private *priv, mlan_buffer *pmbuf);
mlan_status woal_request_country_power_table(moal_private *priv, char *region);
mlan_status woal_mc_policy_cfg(moal_private *priv, t_u16 *enable,
t_u8 wait_option, t_u8 action);
#ifdef RX_PACKET_COALESCE
mlan_status woal_rx_pkt_coalesce_cfg(moal_private *priv, t_u16 *enable,
t_u8 wait_option, t_u8 action);
#endif
mlan_status woal_set_low_pwr_mode(moal_handle *handle, t_u8 wait_option);
void woal_hist_data_reset(moal_private *priv);
void woal_hist_do_reset(void *data);
void woal_hist_reset_table(moal_private *priv,t_u8 antenna);
void woal_hist_data_add(moal_private *priv, t_u8 rx_rate, t_s8 snr, t_s8 nflr,
t_u8 antenna);
mlan_status woal_set_hotspotcfg(moal_private *priv, t_u8 wait_option,
t_u32 hotspotcfg);
void woal_peer_mgmt_frame(moal_private * priv, t_s8 snr, t_s8 nf, t_s8 sig_str,
mlan_802_11_mac_addr mac);
#endif /* _MOAL_MAIN_H */