wifi driver
git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1636 bbd45198-f89e-11dd-88c7-29a3b14d5316
This commit is contained in:
parent
ef90978b16
commit
b29605dce4
|
@ -0,0 +1,8 @@
|
||||||
|
/*
|
||||||
|
* Copyright © Marvell International Ltd. and/or its affiliates, 2003-2006
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _OS_HEADER1_
|
||||||
|
#define _OS_HEADER1_
|
||||||
|
|
||||||
|
#endif /* _OS_HEADER1 */
|
|
@ -0,0 +1,37 @@
|
||||||
|
/*
|
||||||
|
* Copyright © Marvell International Ltd. and/or its affiliates, 2003-2006
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _OS_HEADERS_H
|
||||||
|
#define _OS_HEADERS_H
|
||||||
|
|
||||||
|
#ifndef __ATTRIB_ALIGN__
|
||||||
|
#define __ATTRIB_ALIGN__ (__aligned(4)) //changed by dennis for compiler compatibility
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __ATTRIB_PACK__
|
||||||
|
//#define __ATTRIB_PACK__ __attribute__ ((packed))
|
||||||
|
//#define __ATTRIB_PACK__ //changed by dennis for compiler compatibility
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* RT_Thread header files */
|
||||||
|
#include <rtconfig.h>
|
||||||
|
#include <rtthread.h>
|
||||||
|
#include <rtdef.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
/* New Code to synchronize between IEEE Power save and PM*/
|
||||||
|
#ifdef ENABLE_PM
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ASM files */
|
||||||
|
|
||||||
|
|
||||||
|
/* Net header files */
|
||||||
|
|
||||||
|
|
||||||
|
/* Wireless header */
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,105 @@
|
||||||
|
/*
|
||||||
|
* Copyright © Marvell International Ltd. and/or its affiliates, 2003-2006
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _OS_TIMERS_H
|
||||||
|
#define _OS_TIMERS_H
|
||||||
|
#include "os_defs.h"
|
||||||
|
|
||||||
|
typedef struct __WLAN_DRV_TIMER
|
||||||
|
{
|
||||||
|
//struct timer_list tl;
|
||||||
|
struct rt_timer tl;
|
||||||
|
void (*timeoutfunction)(void* parameter);
|
||||||
|
void (*timer_function) (void *context);
|
||||||
|
void *timer_parameter;
|
||||||
|
void *function_context;
|
||||||
|
unsigned int time_period;
|
||||||
|
char * name;
|
||||||
|
BOOLEAN timer_is_periodic;
|
||||||
|
BOOLEAN timer_is_canceled;
|
||||||
|
char init_flag; /*0:uninitialized 1:initialized 2:has been used at least once*/
|
||||||
|
} WLAN_DRV_TIMER, *PWLAN_DRV_TIMER;
|
||||||
|
|
||||||
|
static void TimerHandler(void* fcontext)
|
||||||
|
{
|
||||||
|
|
||||||
|
PWLAN_DRV_TIMER timer = (PWLAN_DRV_TIMER) fcontext;
|
||||||
|
|
||||||
|
timer->timer_function(timer->function_context);
|
||||||
|
|
||||||
|
// if (timer->timer_is_periodic == TRUE) {
|
||||||
|
// mod_timer(&timer->tl, jiffies + ((timer->time_period * HZ) / 1000));
|
||||||
|
// }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
InitializeTimer(PWLAN_DRV_TIMER timer,
|
||||||
|
void (*TimerFunction) (void *context), void *FunctionContext,char *name)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
timer->timeoutfunction = TimerHandler;
|
||||||
|
timer->timer_parameter=timer;
|
||||||
|
if(name!=NULL)
|
||||||
|
timer->name=name;
|
||||||
|
// 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 = FALSE;
|
||||||
|
timer->init_flag=1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
SetTimer(PWLAN_DRV_TIMER timer, unsigned int MillisecondPeriod)
|
||||||
|
{
|
||||||
|
/* timer->time_period = MillisecondPeriod;
|
||||||
|
timer->timer_is_periodic = FALSE;
|
||||||
|
timer->tl.expires = jiffies + (MillisecondPeriod * HZ) / 1000;
|
||||||
|
add_timer(&timer->tl);
|
||||||
|
timer->timer_is_canceled = FALSE;
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
static void
|
||||||
|
ModTimer(PWLAN_DRV_TIMER timer, unsigned int MillisecondPeriod)
|
||||||
|
{
|
||||||
|
|
||||||
|
int tick= (MillisecondPeriod/1000)*RT_TICK_PER_SECOND;
|
||||||
|
timer->timer_is_periodic = FALSE;
|
||||||
|
timer->time_period = MillisecondPeriod;
|
||||||
|
if(timer->init_flag==1)
|
||||||
|
{
|
||||||
|
rt_timer_init(&timer->tl, timer->name, timer->timeoutfunction,timer->timer_parameter,
|
||||||
|
tick,RT_TIMER_FLAG_ONE_SHOT);
|
||||||
|
timer->init_flag=2;
|
||||||
|
}else if(timer->init_flag==2){
|
||||||
|
rt_timer_control(&timer->tl, RT_TIMER_CTRL_SET_TIME, &tick);
|
||||||
|
}
|
||||||
|
rt_timer_start(&timer->tl);
|
||||||
|
|
||||||
|
timer->timer_is_periodic = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
SetPeriodicTimer(PWLAN_DRV_TIMER timer, unsigned int MillisecondPeriod)
|
||||||
|
{
|
||||||
|
/* timer->time_period = MillisecondPeriod;
|
||||||
|
timer->timer_is_periodic = TRUE;
|
||||||
|
timer->tl.expires = jiffies + (MillisecondPeriod * HZ) / 1000;
|
||||||
|
add_timer(&timer->tl);
|
||||||
|
timer->timer_is_canceled = FALSE;
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
#define FreeTimer(x) do {} while (0)
|
||||||
|
|
||||||
|
static void CancelTimer(WLAN_DRV_TIMER * timer)
|
||||||
|
{
|
||||||
|
/* del_timer(&timer->tl);
|
||||||
|
timer->timer_is_canceled = TRUE;
|
||||||
|
*/
|
||||||
|
rt_timer_detach(&timer->tl);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* _OS_TIMERS_H */
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,29 @@
|
||||||
|
/*
|
||||||
|
* Debugging macros
|
||||||
|
*
|
||||||
|
* Copyright © Marvell International Ltd. and/or its affiliates, 2003-2006
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define DEBUG_SSP_LEVEL3
|
||||||
|
|
||||||
|
#ifdef DEBUG_SSP_LEVEL0
|
||||||
|
#define spi_debug1(...)
|
||||||
|
#define spi_debug2(...)
|
||||||
|
#define spi_debug3(...)
|
||||||
|
#endif
|
||||||
|
#ifdef DEBUG_SSP_LEVEL1
|
||||||
|
#define spi_debug1 rt_kprintf
|
||||||
|
#define spi_debug2 //rt_kprintf
|
||||||
|
#define spi_debug3 //rt_kprintf
|
||||||
|
#endif
|
||||||
|
#ifdef DEBUG_SSP_LEVEL2
|
||||||
|
#define spi_debug1 rt_kprintf
|
||||||
|
#define spi_debug2 rt_kprintf
|
||||||
|
#define spi_debug3 //rt_kprintf
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef DEBUG_SSP_LEVEL3
|
||||||
|
#define spi_debug1 rt_kprintf
|
||||||
|
#define spi_debug2 rt_kprintf
|
||||||
|
#define spi_debug3 rt_kprintf
|
||||||
|
#endif
|
|
@ -0,0 +1,519 @@
|
||||||
|
/*
|
||||||
|
* File: gspi_io.c
|
||||||
|
* Desc: Low level SSP driver on pxa27x for GSPI
|
||||||
|
*
|
||||||
|
* Copyright © Marvell International Ltd. and/or its affiliates, 2003-2006
|
||||||
|
*/
|
||||||
|
/********************************************************
|
||||||
|
Change log:
|
||||||
|
01/30/06: Add kernel 2.6 support for GSPI8xxx/Bulverde
|
||||||
|
********************************************************/
|
||||||
|
#include "sep4020.h"
|
||||||
|
#include "rtthread.h"
|
||||||
|
#include "gspi_io.h"
|
||||||
|
#include "gspi_debug.h"
|
||||||
|
static int DMA_ENABLE=1;
|
||||||
|
int g_dummy_clk_reg = 0;
|
||||||
|
int g_dummy_clk_ioport = 0;
|
||||||
|
int g_bus_mode_reg = 0x02;
|
||||||
|
gspihost_info_t *G_gspiinfo;
|
||||||
|
static struct rt_semaphore gspi_lock;
|
||||||
|
static struct rt_event txrxevent; //only set or rec the 0x01
|
||||||
|
#define DMA_TX_ONLY (1)
|
||||||
|
#define DMA_TX_RX (2)
|
||||||
|
#define DMA_Dummy_TX (4)
|
||||||
|
#define DMA_NO_ACTION (0)
|
||||||
|
static char DMA_ACTION;
|
||||||
|
#define MaskWarning(x) ((x)=(x))
|
||||||
|
extern void rt_hw_interrupt_install(rt_uint32_t vector, rt_isr_handler_t new_handler, rt_isr_handler_t *old_handler);
|
||||||
|
extern void rt_hw_interrupt_umask(rt_uint32_t vector);
|
||||||
|
static int gspi_acquire_io(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
rt_sem_take(&gspi_lock, RT_WAITING_FOREVER);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
static void gspi_release_io(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
rt_sem_release(&gspi_lock);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
static char transmittembuf[2048];
|
||||||
|
void setup_write_dma(char * data ,int n)
|
||||||
|
{
|
||||||
|
unsigned int regval=0;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/*clear the interupt*/
|
||||||
|
/*0 is tx channel */
|
||||||
|
*(volatile unsigned long*)DMAC_INTINTERRCLR_V |= 0x1;
|
||||||
|
*(volatile unsigned long*)DMAC_INTINTERRCLR_V &= (~0x1); //clear the erro interupt
|
||||||
|
|
||||||
|
*(volatile unsigned long*)DMAC_INTTCCLEAR_V |= 0x1;
|
||||||
|
*(volatile unsigned long*)DMAC_INTTCCLEAR_V &= (~0x1); //clear the interupt
|
||||||
|
|
||||||
|
|
||||||
|
/*set source address*/
|
||||||
|
*(volatile unsigned long*)DMAC_C0SRCADDR_V = (unsigned int)data;
|
||||||
|
|
||||||
|
/*set target address*/
|
||||||
|
*(volatile unsigned long*)DMAC_C0DESTADDR_V = SSI_DR;
|
||||||
|
|
||||||
|
/*clear the size*/
|
||||||
|
//*(volatile unsigned long*)DMAC_C0CONTROL_V = 0;
|
||||||
|
|
||||||
|
//desc->dcmd |= DCMD_ENDIRQEN | n;
|
||||||
|
|
||||||
|
/*set transfer size,data width is 2 bytes,burst size is 4*2bytes,source Address Increment*/
|
||||||
|
regval=((n/2) <<14)+(0x1<<12)+(0x1<<9)+(0x1<<6)+((0x0)<<3)+(0x0);
|
||||||
|
*(volatile unsigned long*)DMAC_C0CONTROL_V = regval;
|
||||||
|
|
||||||
|
/*write data from memory to ssi*/
|
||||||
|
// *(volatile unsigned long*)DMAC_C0CONFIGURATION_V=0;
|
||||||
|
*(volatile unsigned long*)DMAC_C0DESCRIPTOR_V = 0;
|
||||||
|
|
||||||
|
|
||||||
|
/* 2) start DMA channel */
|
||||||
|
|
||||||
|
/*spi dma set*/
|
||||||
|
*(volatile unsigned long*)SSI_DMATDLR_V=0x2; // (0x10009050)//tx DMA threadthold
|
||||||
|
if(DMA_ACTION==DMA_TX_RX)
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
*(volatile unsigned long*)SSI_DMARDLR_V=0x2;
|
||||||
|
*(volatile unsigned long*)SSI_DMACR_V|=(0x3); //0x1 rxDMAenable 0x2 txDMAenable
|
||||||
|
*(volatile unsigned long*)DMAC_C1CONFIGURATION_V = ((0x5)<<7) +((0x2)<<1)+0x01;
|
||||||
|
*(volatile unsigned long*)DMAC_C0CONFIGURATION_V = ((0x5)<<11)+((0x1)<<1)+0x01;
|
||||||
|
#else
|
||||||
|
*(volatile unsigned long*)SSI_DMARDLR_V=0x4;
|
||||||
|
*(volatile unsigned long*)SSI_DMACR_V|=(0x1); //0x1 rxDMAenable 0x2 txDMAenable
|
||||||
|
*(volatile unsigned long*)DMAC_C1CONFIGURATION_V = ((0x5)<<7) +((0x2)<<1)+0x01;
|
||||||
|
for(i=0;i<n/2;i++)
|
||||||
|
{
|
||||||
|
while((*(volatile unsigned long*)SSI_SR_V&2)==0);
|
||||||
|
*(volatile unsigned long* )SSI_DR_V = 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}else if(DMA_ACTION==DMA_TX_ONLY)
|
||||||
|
{
|
||||||
|
*(volatile unsigned long*)SSI_DMACR_V|=(0x1<<1); //0x1 rxDMAenable 0x2 txDMAenable
|
||||||
|
*(volatile unsigned long*)DMAC_C0CONFIGURATION_V = ((0x5)<<11)+((0x1)<<1)+0x01;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int gspi_write_data_direct(u8 * data, u16 reg, u16 n)
|
||||||
|
{
|
||||||
|
|
||||||
|
int i;
|
||||||
|
u16 *dat;
|
||||||
|
rt_uint32_t e;
|
||||||
|
gspi_acquire_io();
|
||||||
|
/* N bytes are sent wrt to 16 bytes, convert it to 8 bytes */
|
||||||
|
n = (n * 2);
|
||||||
|
|
||||||
|
/*active CS signal*/
|
||||||
|
*(volatile unsigned long*)(GPIO_PORTD_DATA_V)&=~0x04;
|
||||||
|
reg |= 0x8000;
|
||||||
|
|
||||||
|
rt_memcpy(transmittembuf, ®, sizeof(u16));
|
||||||
|
rt_memcpy(transmittembuf + sizeof(u16), data, (n - 2));
|
||||||
|
|
||||||
|
if((n>16)&&(DMA_ENABLE==1))
|
||||||
|
{
|
||||||
|
//Write data by DMA mode
|
||||||
|
DMA_ACTION=DMA_TX_ONLY;
|
||||||
|
setup_write_dma(transmittembuf,n);
|
||||||
|
|
||||||
|
rt_event_recv(&txrxevent,0x01,RT_EVENT_FLAG_OR|RT_EVENT_FLAG_CLEAR,RT_WAITING_FOREVER,&e);
|
||||||
|
}else{
|
||||||
|
//Write data through SSDR by CPU mode
|
||||||
|
dat = (u16 *) transmittembuf;
|
||||||
|
*(volatile unsigned long*)SSI_DMACR_V&=(~0x3); //0x1 rxDMAenable 0x2 txDMAenable
|
||||||
|
for (i = 0; i < (n / 2); i++) {
|
||||||
|
|
||||||
|
while((*(volatile unsigned long*)SSI_SR_V&2)==0){}
|
||||||
|
*(volatile unsigned long*)SSI_DR_V = *dat++; //add for 4020
|
||||||
|
}
|
||||||
|
if ((n % 4) != 0) {
|
||||||
|
|
||||||
|
while((*(volatile unsigned long*)SSI_SR_V&2)==0){}
|
||||||
|
*(volatile unsigned long*)SSI_DR_V = 0;//add for 4020
|
||||||
|
}
|
||||||
|
while((*(volatile unsigned long*)SSI_SR_V&1)==1);
|
||||||
|
}
|
||||||
|
/*inactive CS frame*/
|
||||||
|
*(volatile unsigned long*)(GPIO_PORTD_DATA_V)|=0x04;
|
||||||
|
gspi_release_io();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int gspi_write_reg( u16 reg, u16 val)
|
||||||
|
{
|
||||||
|
gspi_write_data_direct((u8 *) & val, reg, 2);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int gspi_write_data( u16 * data, u16 size)
|
||||||
|
{
|
||||||
|
gspi_write_data_direct((u8 *) & data[1], data[0], 2);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static char rectembuf[2048+1024];
|
||||||
|
static char rxtxdummybuf[2048+1024];
|
||||||
|
void
|
||||||
|
gspi_write_to_read(int n,u16 reg,u16*data)
|
||||||
|
{
|
||||||
|
u16 temp;
|
||||||
|
/*config the receive channel*/
|
||||||
|
/*set source address*/
|
||||||
|
*(volatile unsigned long*)DMAC_C1SRCADDR_V = SSI_DR;
|
||||||
|
|
||||||
|
/*set target address*/
|
||||||
|
*(volatile unsigned long*)DMAC_C1DESTADDR_V = (unsigned int)data;
|
||||||
|
|
||||||
|
/*clear the size*/
|
||||||
|
// *(volatile unsigned long*)DMAC_C1CONTROL_V = 0; //~(0x3ffd000)
|
||||||
|
|
||||||
|
/*set transfer size,data width is 2 bytes,burst size is 4*2bytes,source Address Increment*/
|
||||||
|
*(volatile unsigned long*)DMAC_C1CONTROL_V = ((n /2)<<14)+(1<<13) + (1<<9) + (1<<6)+((0x3)<<3) +(0x3);
|
||||||
|
|
||||||
|
/*receive data from ssi*/
|
||||||
|
*(volatile unsigned long*)DMAC_C1CONFIGURATION_V = ((0x5)<<7) +((0x2)<<1)+0x01;
|
||||||
|
*(volatile unsigned long*)DMAC_C1DESCRIPTOR_V = 0;
|
||||||
|
#if 0
|
||||||
|
/*config the transfer channel*/
|
||||||
|
/*set source address*/
|
||||||
|
*(volatile unsigned long*)DMAC_C0SRCADDR_V = gspiinfo->phys_addr_rw;
|
||||||
|
|
||||||
|
/*set target address*/
|
||||||
|
*(volatile unsigned long*)DMAC_C0DESTADDR_V = SSI_DR;
|
||||||
|
|
||||||
|
/*clear the size*/
|
||||||
|
*(volatile unsigned long*)DMAC_C0CONTROL_V = ~(0x3ffd000);
|
||||||
|
|
||||||
|
|
||||||
|
/*set transfer size,data width is 2 bytes,burst size is 4*2bytes,source Address Increment*/
|
||||||
|
*(volatile unsigned long*)DMAC_C0CONTROL_V = (n <<14)|(1<<12) | (1<<9) | (1<<6) |((011)<<3) | (011);
|
||||||
|
|
||||||
|
/*write data from memory to ssi*/
|
||||||
|
*(volatile unsigned long*)DMAC_C0CONFIGURATION_V = ((0101)<<11) | ((01)<<1);
|
||||||
|
|
||||||
|
/*set address of next descripor */
|
||||||
|
*(volatile unsigned long*)DMAC_C0DESCRIPTOR_V = 0;
|
||||||
|
*(volatile unsigned long*)DMAC_C1DESCRIPTOR_V = 0;
|
||||||
|
|
||||||
|
/* Start Rx for read */
|
||||||
|
*(volatile unsigned long*)DMAC_C1CONFIGURATION_V = 0x01; //enable channel 1
|
||||||
|
/* Start Tx for dummy write */
|
||||||
|
*(volatile unsigned long*)DMAC_C0CONFIGURATION_V = 0x01; //enable channel 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
/* Write the register to read */
|
||||||
|
*(volatile unsigned long*)SSI_DMACR_V&=(~0x3); //0x1 rxDMAenable 0x2 txDMAenable
|
||||||
|
*(volatile unsigned long* )SSI_DR_V = reg;
|
||||||
|
while((*(volatile unsigned long*)SSI_SR_V&8))
|
||||||
|
temp = *(volatile unsigned long* )SSI_DR_V;
|
||||||
|
temp=temp;
|
||||||
|
#endif
|
||||||
|
setup_write_dma(rxtxdummybuf ,n);
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup_read_dma(u16 reg, u16 * data, int n)
|
||||||
|
{
|
||||||
|
|
||||||
|
/*clear the interupt*/
|
||||||
|
*(volatile unsigned long*)DMAC_INTINTERRCLR_V |= 0x2;
|
||||||
|
*(volatile unsigned long*)DMAC_INTINTERRCLR_V &= (~0x2); //clear the erro interupt
|
||||||
|
|
||||||
|
*(volatile unsigned long*)DMAC_INTTCCLEAR_V |= 0x2;
|
||||||
|
*(volatile unsigned long*)DMAC_INTTCCLEAR_V &= (~0x2);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
gspi_write_to_read(n, reg,data);
|
||||||
|
}
|
||||||
|
|
||||||
|
int gspi_read_data_direct(u8 * data, u16 reg, u16 n)
|
||||||
|
{
|
||||||
|
int fifonum=0;
|
||||||
|
int i;
|
||||||
|
u32 nothing;
|
||||||
|
u16 *dat;
|
||||||
|
rt_uint32_t e;
|
||||||
|
int retry = 0;
|
||||||
|
int timeout = 100;
|
||||||
|
int dmaflag=0;
|
||||||
|
|
||||||
|
MaskWarning(nothing);
|
||||||
|
|
||||||
|
if (gspi_acquire_io()) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(fifonum=0;fifonum<16;fifonum++)//clear fifo add by vincent for 4020
|
||||||
|
{
|
||||||
|
nothing = *(volatile unsigned long* )SSI_DR_V;
|
||||||
|
}
|
||||||
|
|
||||||
|
n = ((n + g_dummy_clk_ioport) * 2);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*active SPI CS */
|
||||||
|
*(volatile unsigned long*)(GPIO_PORTD_DATA_V)&=~0x04;
|
||||||
|
|
||||||
|
///Process the data
|
||||||
|
#if 1
|
||||||
|
if(n>16&&(DMA_ENABLE==1))
|
||||||
|
//if((DMA_ENABLE==1))
|
||||||
|
{
|
||||||
|
DMA_ACTION=DMA_TX_RX;
|
||||||
|
dmaflag=1;
|
||||||
|
|
||||||
|
do {
|
||||||
|
retry = 0;
|
||||||
|
spi_debug3("DMA MODEL");
|
||||||
|
DMA_ACTION=DMA_TX_RX;
|
||||||
|
setup_read_dma(reg,(u16*) rectembuf, n);
|
||||||
|
rt_event_recv(&txrxevent,0x01,RT_EVENT_FLAG_OR|RT_EVENT_FLAG_CLEAR,RT_WAITING_FOREVER,&e);
|
||||||
|
|
||||||
|
if (rectembuf[(g_dummy_clk_ioport + 1) * 2] == 0xff) {
|
||||||
|
if (!rt_memcmp(&rectembuf[(g_dummy_clk_ioport + 1) * 2],&rxtxdummybuf[2], 5)) {
|
||||||
|
retry = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while ( retry && --timeout);
|
||||||
|
|
||||||
|
if (!timeout)
|
||||||
|
spi_debug1("Timeout for gspi_read_data_direct\n");
|
||||||
|
}else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
dat=(u16*)rectembuf;
|
||||||
|
*(volatile unsigned long*)SSI_DMACR_V&=(~0x3); //0x1 rxDMAenable 0x2 txDMAenable
|
||||||
|
while((*(volatile unsigned long*)SSI_SR_V&2)==0);
|
||||||
|
*(volatile unsigned long* )SSI_DR_V = reg;
|
||||||
|
for (i = 0; i < (n / 2); i++) {
|
||||||
|
while((*(volatile unsigned long*)SSI_SR_V&2)==0);
|
||||||
|
*(volatile unsigned long* )SSI_DR_V = 0;
|
||||||
|
|
||||||
|
while((*(volatile unsigned long*)SSI_SR_V&8)==0);
|
||||||
|
*dat = *(volatile unsigned long* )SSI_DR_V;
|
||||||
|
|
||||||
|
dat++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*(volatile unsigned long*)(GPIO_PORTD_DATA_V)|=0x04;
|
||||||
|
if(dmaflag==1)
|
||||||
|
rt_memcpy(data, rectembuf + (g_dummy_clk_ioport + 1) * 2+12,
|
||||||
|
(n - (g_dummy_clk_ioport + 1) * 2+12));
|
||||||
|
else
|
||||||
|
rt_memcpy(data, rectembuf + (g_dummy_clk_ioport + 1) * 2,
|
||||||
|
(n - (g_dummy_clk_ioport + 1) * 2));
|
||||||
|
|
||||||
|
gspi_release_io();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int gspi_read_data( u16 * data, u16 size)
|
||||||
|
{
|
||||||
|
return gspi_read_data_direct((u8 *) & data[1], data[0], 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
int gspi_read_reg( u16 reg, u16 * val)
|
||||||
|
{
|
||||||
|
gspi_read_data_direct((u8 *) val, reg, 2);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
extern void sbi_interrupt(int vector);
|
||||||
|
static void spi_interrupt(int dev)
|
||||||
|
{
|
||||||
|
unsigned int intstate;
|
||||||
|
unsigned int rcl;
|
||||||
|
MaskWarning(rcl);
|
||||||
|
intstate=*(volatile unsigned long*)SSI_ISR_V;
|
||||||
|
// spi_debug1("spi spi_interrupt\r\n");
|
||||||
|
if(intstate&0x01)
|
||||||
|
{
|
||||||
|
spi_debug1("spi tx fifo empty\r\n");
|
||||||
|
}
|
||||||
|
if(intstate&(0x01<<1))
|
||||||
|
{
|
||||||
|
spi_debug1("spi tx fifo up over\r\n");
|
||||||
|
rcl=*(volatile unsigned long*)SSI_TXOICR_V;
|
||||||
|
}
|
||||||
|
if(intstate&(0x01<<2))
|
||||||
|
{
|
||||||
|
spi_debug1("spi Rx fifo down over\r\n");
|
||||||
|
rcl=*(volatile unsigned long*)SSI_RXUICR_V;
|
||||||
|
}
|
||||||
|
if(intstate&(0x01<<3))
|
||||||
|
{
|
||||||
|
spi_debug1("spi rx fifo up over\r\n");
|
||||||
|
rcl=*(volatile unsigned long*)SSI_RXOICR_V;
|
||||||
|
}
|
||||||
|
if(intstate&(0x01<<4))
|
||||||
|
{
|
||||||
|
|
||||||
|
spi_debug1("spi rx fifo full\r\n");
|
||||||
|
|
||||||
|
}
|
||||||
|
rcl=*(volatile unsigned long*)SSI_ICR_V;
|
||||||
|
|
||||||
|
}
|
||||||
|
static void dma_interrupt(int dev)
|
||||||
|
{
|
||||||
|
unsigned int intstatus;
|
||||||
|
unsigned int endstatus;
|
||||||
|
unsigned int errstatus;
|
||||||
|
unsigned int rcl;
|
||||||
|
rcl=rcl;
|
||||||
|
intstatus=*(volatile unsigned long*)DMAC_INTSTATUS_V;
|
||||||
|
endstatus=*(volatile unsigned long*)DMAC_INTTCSTATUS_V;
|
||||||
|
errstatus=*(volatile unsigned long*)DMAC_INTERRORSTATUS_V;
|
||||||
|
spi_debug1("dma int int 0x%x,end 0x%x,err0x%x\r\n",intstatus,endstatus,errstatus);
|
||||||
|
|
||||||
|
if(intstatus&0x01) //channel 0 tx channel
|
||||||
|
{
|
||||||
|
if(endstatus&0x01)
|
||||||
|
{
|
||||||
|
|
||||||
|
*(volatile unsigned long*)DMAC_INTTCCLEAR_V=endstatus|0x01;
|
||||||
|
*(volatile unsigned long*)DMAC_INTTCCLEAR_V=endstatus&(~0x01);
|
||||||
|
}
|
||||||
|
if(errstatus&0x01)
|
||||||
|
{
|
||||||
|
*(volatile unsigned long*)DMAC_INTERRORSTATUS_V=endstatus|0x01;
|
||||||
|
*(volatile unsigned long*)DMAC_INTERRORSTATUS_V=endstatus&(~0x01);
|
||||||
|
}
|
||||||
|
if(DMA_ACTION==DMA_TX_ONLY)
|
||||||
|
{
|
||||||
|
rt_event_send(&txrxevent, 0X01);
|
||||||
|
|
||||||
|
}
|
||||||
|
*(volatile unsigned long*)SSI_DMACR_V&=(~0x01); //0x1 rxDMAenable 0x2 txDMAenable
|
||||||
|
|
||||||
|
}
|
||||||
|
if(intstatus&0x02) //channel 1 rx channel
|
||||||
|
{
|
||||||
|
if(endstatus&0x02)
|
||||||
|
{
|
||||||
|
|
||||||
|
*(volatile unsigned long*)DMAC_INTTCCLEAR_V=endstatus|0x02;
|
||||||
|
*(volatile unsigned long*)DMAC_INTTCCLEAR_V=endstatus&(~0x02);
|
||||||
|
}
|
||||||
|
if(errstatus&0x02)
|
||||||
|
{
|
||||||
|
*(volatile unsigned long*)DMAC_INTERRORSTATUS_V=endstatus|0x02;
|
||||||
|
*(volatile unsigned long*)DMAC_INTERRORSTATUS_V=endstatus&(~0x02);
|
||||||
|
}
|
||||||
|
if(DMA_ACTION==DMA_TX_RX)
|
||||||
|
{
|
||||||
|
rt_event_send(&txrxevent, 0X01);
|
||||||
|
*(volatile unsigned long*)SSI_DMACR_V&=(~0x02); //0x1 rxDMAenable 0x2 txDMAenable
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
// *(volatile unsigned long*)(SSI_SSIENR_V)= 0x00; //disable SSI
|
||||||
|
// *(volatile unsigned long*)(SSI_SER_V)= 0x00; //disable SSI channel0
|
||||||
|
|
||||||
|
rcl=*(volatile unsigned long*)SSI_ICR_V;
|
||||||
|
rcl=*(volatile unsigned long*)SSI_RXOICR_V;
|
||||||
|
rcl=*(volatile unsigned long*)SSI_RXUICR_V;
|
||||||
|
|
||||||
|
// *(volatile unsigned long*)(SSI_SSIENR_V)= 0x01; //disable SSI
|
||||||
|
// *(volatile unsigned long*)(SSI_SER_V)= 0x01; //disable SSI channel0
|
||||||
|
DMA_ACTION=0;
|
||||||
|
}
|
||||||
|
extern void rt_hw_interrupt_install(rt_uint32_t vector, rt_isr_handler_t new_handler, rt_isr_handler_t *old_handler);
|
||||||
|
int gspi_register_irq(int * irqnum)
|
||||||
|
{
|
||||||
|
|
||||||
|
disable_irq(INTSRC_EXINT4) ;
|
||||||
|
*(volatile unsigned long*)(GPIO_PORTA_DIR_V) |= (0X1)<<4;
|
||||||
|
*(volatile unsigned long*)(GPIO_PORTA_SEL_V )|= (0X1)<<4;
|
||||||
|
*(volatile unsigned long*)(GPIO_PORTA_INCTL_V) |= (0X1)<<4;
|
||||||
|
*(volatile unsigned long*)(GPIO_PORTA_INTRCTL_V) |= (0X11)<<8;//low level enable irq
|
||||||
|
*(volatile unsigned long*)(GPIO_PORTA_INTRCLR_V) |= (0X1)<<4; //add for 4020 GPA6
|
||||||
|
*irqnum= INTSRC_EXINT4;
|
||||||
|
rt_hw_interrupt_install(INTSRC_EXINT4, sbi_interrupt, RT_NULL);
|
||||||
|
rt_hw_interrupt_umask(INTSRC_EXINT4);
|
||||||
|
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void gspi_irq_clear(void)
|
||||||
|
{
|
||||||
|
*(volatile unsigned long*)(GPIO_PORTA_INTRCLR_V) |= (0X1)<<4; //add for 4020 GPA6
|
||||||
|
}
|
||||||
|
static int dma_init( void )
|
||||||
|
{
|
||||||
|
// *(volatile unsigned long*)(DMAC_ENBLDCHNS_V ) = (1<<0)+(1<<1); //enable the channels
|
||||||
|
if(DMA_ENABLE==1)
|
||||||
|
{
|
||||||
|
rt_memset(rxtxdummybuf,0x00,(2048+1024));
|
||||||
|
rt_hw_interrupt_install(INTSRC_SSI, spi_interrupt, RT_NULL);
|
||||||
|
rt_hw_interrupt_umask(INTSRC_SSI);
|
||||||
|
enable_irq(INTSRC_SSI);
|
||||||
|
}
|
||||||
|
|
||||||
|
rt_hw_interrupt_install(INTSRC_DMAC, dma_interrupt, RT_NULL);
|
||||||
|
rt_hw_interrupt_umask(INTSRC_DMAC);
|
||||||
|
enable_irq(INTSRC_DMAC);
|
||||||
|
spi_debug3("\nDMA Initialization done....\n");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
static int gspihost_init_hw(void)
|
||||||
|
{
|
||||||
|
*(volatile unsigned long*)(GPIO_PORTD_DIR_V)&=~0x04;
|
||||||
|
*(volatile unsigned long*)(GPIO_PORTD_SEL_V)&=~0x1b;
|
||||||
|
*(volatile unsigned long*)(GPIO_PORTD_SEL_V)|= 0x04;
|
||||||
|
|
||||||
|
*(volatile unsigned long*)(SSI_SSIENR_V)= 0x00; //disable SSI
|
||||||
|
|
||||||
|
*(volatile unsigned long*)(SSI_BAUDR_V) = 0x08; //set baudrate
|
||||||
|
|
||||||
|
|
||||||
|
*(volatile unsigned long*)(SSI_TXFLR_V) = 0x00;
|
||||||
|
*(volatile unsigned long*)(SSI_RXFLR_V) = 0x00;
|
||||||
|
|
||||||
|
*(volatile unsigned long*)(SSI_CONTROL0_V) = 0x0f; //?configure SSI channel0
|
||||||
|
*(volatile unsigned long*)(SSI_IMR_V) = 0x00;//0x1f; //mask all irqs of ssi
|
||||||
|
|
||||||
|
*(volatile unsigned long*)(SSI_SER_V)= 0x01; //enable SSI channel0
|
||||||
|
*(volatile unsigned long*)(SSI_SSIENR_V)= 0x01; //enable SSI
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int gspihost_init(void)
|
||||||
|
{
|
||||||
|
int ret=RT_EOK;
|
||||||
|
spi_debug1("gspihost_init\n");
|
||||||
|
|
||||||
|
ret=rt_sem_init(&gspi_lock, "wifi_gspi", 1, RT_IPC_FLAG_FIFO);
|
||||||
|
if(ret!=RT_EOK)
|
||||||
|
ret=rt_event_init(&txrxevent, "spievent", RT_IPC_FLAG_FIFO);
|
||||||
|
if(ret!=RT_EOK)
|
||||||
|
return ret;
|
||||||
|
gspihost_init_hw();
|
||||||
|
if( DMA_ENABLE==1)
|
||||||
|
dma_init();
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,116 @@
|
||||||
|
/*
|
||||||
|
* File: gspi_io.h
|
||||||
|
*
|
||||||
|
* Copyright © Marvell International Ltd. and/or its affiliates, 2003-2006
|
||||||
|
*/
|
||||||
|
#ifndef _GSPI_IO_H
|
||||||
|
#define _GSPI_IO_H
|
||||||
|
typedef char s8;
|
||||||
|
typedef unsigned char u8;
|
||||||
|
|
||||||
|
typedef signed short s16;
|
||||||
|
typedef unsigned short u16;
|
||||||
|
|
||||||
|
typedef signed long s32;
|
||||||
|
typedef unsigned long u32;
|
||||||
|
|
||||||
|
typedef signed long long s64;
|
||||||
|
typedef unsigned long long u64;
|
||||||
|
|
||||||
|
#define GPIO_PORTA_DIR_V (0x1000f004)
|
||||||
|
#define GPIO_PORTA_SEL_V (0x1000f008)
|
||||||
|
#define GPIO_PORTA_INCTL_V (0x1000f00c)
|
||||||
|
#define GPIO_PORTA_INTRCTL_V (0x1000f010)
|
||||||
|
#define GPIO_PORTA_INTRCLR_V (0x1000f014)
|
||||||
|
|
||||||
|
#define GPIO_PORTD_DIR_V (0x1000f034)
|
||||||
|
#define GPIO_PORTD_SEL_V (0x1000f038)
|
||||||
|
#define GPIO_PORTD_DATA_V (0x1000f040)
|
||||||
|
|
||||||
|
#define SSI_CONTROL0_V (0x10009000)
|
||||||
|
#define SSI_CONTROL1_V (0x10009004)
|
||||||
|
#define SSI_SSIENR_V (0x10009008)
|
||||||
|
#define SSI_SER_V (0x10009010)
|
||||||
|
#define SSI_BAUDR_V (0x10009014)
|
||||||
|
#define SSI_TXFLR_V (0x10009020)
|
||||||
|
#define SSI_RXFLR_V (0x1000901C)
|
||||||
|
#define SSI_SR_V (0x10009028)
|
||||||
|
#define SSI_IMR_V (0x1000902c)
|
||||||
|
#define SSI_ISR_V (0x10009030)
|
||||||
|
#define SSI_TXOICR_V (0x10009038)
|
||||||
|
#define SSI_RXOICR_V (0x1000903C)
|
||||||
|
#define SSI_RXUICR_V (0x10009040)
|
||||||
|
#define SSI_DR_V (0x10009060)
|
||||||
|
#define SSI_DMACR_V (0x1000904C)
|
||||||
|
#define SSI_ICR_V (0x10009048)
|
||||||
|
#define SSI_DMATDLR_V (0x10009050)
|
||||||
|
#define SSI_DMARDLR_V (0x10009054)
|
||||||
|
|
||||||
|
|
||||||
|
#define DMAC_INTSTATUS_V (0x11001020)
|
||||||
|
|
||||||
|
#define DMAC_INTTCSTATUS_V (0x11001050)
|
||||||
|
|
||||||
|
#define DMAC_INTTCCLEAR_V (0x11001060)
|
||||||
|
#define DMAC_INTINTERRCLR_V (0x11001090)
|
||||||
|
#define DMAC_INTTCCLEAR_V (0x11001060)
|
||||||
|
|
||||||
|
#define DMAC_INTERRORSTATUS_V (0x11001090)
|
||||||
|
|
||||||
|
#define DMAC_INTERRCLR_V (0x11001080)
|
||||||
|
#define DMAC_C0SRCADDR_V (0x11001000)
|
||||||
|
#define DMAC_C1SRCADDR_V (0x11001100)
|
||||||
|
#define DMAC_C0DESTADDR_V (0x11001004)
|
||||||
|
#define DMAC_C1DESTADDR_V (0x11001104)
|
||||||
|
|
||||||
|
#define DMAC_C0CONTROL_V (0x1100100C)
|
||||||
|
#define DMAC_C1CONTROL_V (0x1100110C)
|
||||||
|
#define DMAC_C0CONFIGURATION_V (0x11001010)
|
||||||
|
#define DMAC_C1CONFIGURATION_V (0x11001110)
|
||||||
|
#define DMAC_C0DESCRIPTOR_V (0x11001014)
|
||||||
|
#define DMAC_C1DESCRIPTOR_V (0x11001114)
|
||||||
|
#define DMAC_ENBLDCHNS_V (0x110010B0)
|
||||||
|
#define GSPI_OK 0
|
||||||
|
|
||||||
|
typedef struct gspihost_info gspihost_info_t;
|
||||||
|
typedef gspihost_info_t *gspihost_info_p;
|
||||||
|
typedef struct gspi_card_rec *gspi_card_rec_p;
|
||||||
|
|
||||||
|
typedef struct gspi_card_rec io_card_rec_t;
|
||||||
|
typedef io_card_rec_t *io_card_rec_p;
|
||||||
|
|
||||||
|
struct gspi_card_rec
|
||||||
|
{
|
||||||
|
u8 magic[4];
|
||||||
|
gspihost_info_p ctrlr; // Back Reference to Host Controller
|
||||||
|
int (*add) (gspi_card_rec_p card);
|
||||||
|
int (*remove) (gspi_card_rec_p card);
|
||||||
|
// IRQ_RET_TYPE(*user_isr) (int, void *, struct pt_regs *);
|
||||||
|
void *user_arg;
|
||||||
|
u16 chiprev;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct gspihost_info
|
||||||
|
{
|
||||||
|
int irq;
|
||||||
|
u16 dev_id;
|
||||||
|
int dma_init; /* physical address */
|
||||||
|
unsigned char *iodata; /* I/O data buffer */
|
||||||
|
unsigned char *iorw; /* I/O data buffer */
|
||||||
|
gspi_card_rec_p card;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern int gspi_read_reg(u16 reg, u16 * data);
|
||||||
|
extern int gspi_write_reg(u16 reg, u16 data);
|
||||||
|
extern int gspi_read_data(u16 * data, u16 size);
|
||||||
|
extern int gspi_write_data(u16 * data, u16 size);
|
||||||
|
//extern int gspi_read_data_direct(u8 * data, u16 reg, u16 size);
|
||||||
|
extern int gspi_write_data_direct(u8 * data, u16 reg, u16 n);
|
||||||
|
extern int gspi_read_data_direct(u8 * data, u16 reg, u16 n);
|
||||||
|
//extern int gspi_write_data_direct(u8 * data, u16 reg, u16 size);
|
||||||
|
extern void gspi_irq_clear(void);//FOR 4020
|
||||||
|
extern int gspihost_init(void);
|
||||||
|
#endif /* _GSPI_IO_H */
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,840 @@
|
||||||
|
/** @file if_gspi.c
|
||||||
|
* @brief This file contains generic GSPI functions
|
||||||
|
*
|
||||||
|
* Copyright © Marvell International Ltd. and/or its affiliates, 2003-2007
|
||||||
|
*/
|
||||||
|
/********************************************************
|
||||||
|
Change log:
|
||||||
|
09/26/05: Add Doxygen format comments
|
||||||
|
10/20/05: Add GSPI8686 support
|
||||||
|
01/30/06: Add kernel 2.6 support for GSPI8xxx/Bulverde
|
||||||
|
|
||||||
|
********************************************************/
|
||||||
|
#include "if_gspi.h"
|
||||||
|
#include "if_gspi_debug.h"
|
||||||
|
#include "gspi_io.h"
|
||||||
|
|
||||||
|
//#include "helper.h"
|
||||||
|
|
||||||
|
//#include "gspi8686.h"
|
||||||
|
#include "rtthread.h"
|
||||||
|
#include "sep4020.h"
|
||||||
|
#define HIC_DEFAULT_VALUE 0
|
||||||
|
/********************************************************
|
||||||
|
Local Variables
|
||||||
|
********************************************************/
|
||||||
|
|
||||||
|
/********************************************************
|
||||||
|
Global Variables
|
||||||
|
********************************************************/
|
||||||
|
extern int gspi_register_irq(int * irqnum);
|
||||||
|
|
||||||
|
extern int g_dummy_clk_reg;
|
||||||
|
extern int g_dummy_clk_ioport;
|
||||||
|
|
||||||
|
/********************************************************
|
||||||
|
Local Functions
|
||||||
|
********************************************************/
|
||||||
|
|
||||||
|
static int gspi_read_reg32(wlan_private * priv,u16 offset, u32 * data);
|
||||||
|
static int gspi_read_host_int_status(wlan_private * priv,u8 * data);
|
||||||
|
static int gspi_read_event_scratch(wlan_private * priv);
|
||||||
|
static wlan_private *pwlanpriv;
|
||||||
|
static wlan_private *(*wlan_add_callback) (void *dev_id);
|
||||||
|
static int (*wlan_remove_callback) (void *dev_id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief clear the auto generate interrupt bit in Host
|
||||||
|
* Interrupt Control register
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @return NA
|
||||||
|
*/
|
||||||
|
static void gspi_init_HOST_INT_CTRL_REG(wlan_private * priv)
|
||||||
|
{
|
||||||
|
gspi_write_reg(HOST_INT_CTRL_REG,HIC_DEFAULT_VALUE & ~(HIC_TxDnldAuto|HIC_RxUpldAuto | HIC_CmdDnldAuto|HIC_CmdUpldAuto));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function re-enable the interrupt of the mask bit.
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @param mask interrupt mask
|
||||||
|
* @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
static int gspi_write_host_int_status(wlan_private * priv,u16 mask)
|
||||||
|
{
|
||||||
|
if (gspi_write_reg(HOST_INT_STATUS_REG, ~mask)) {
|
||||||
|
rt_kprintf("gspi_write_reg failed\n");
|
||||||
|
return WLAN_STATUS_FAILURE;
|
||||||
|
}
|
||||||
|
return WLAN_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function used to poll CmdDnLdRdy bit of Host Interrupt Status Register
|
||||||
|
*
|
||||||
|
* @param cardp A pointer to gspi_card_rec structure
|
||||||
|
* @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
static int wait_for_hostintstatus(void *card)
|
||||||
|
{
|
||||||
|
#define MAX_WAIT_TRIES 100
|
||||||
|
int i = 0,y;
|
||||||
|
u16 stat;
|
||||||
|
|
||||||
|
for (i = 0; i < MAX_WAIT_TRIES; ++i) {
|
||||||
|
gspi_read_reg(HOST_INT_STATUS_REG, &stat);
|
||||||
|
|
||||||
|
if (stat & GHIS_CmdDnLdRdy)
|
||||||
|
return WLAN_STATUS_SUCCESS;
|
||||||
|
for(y=0;y<1000;y++);
|
||||||
|
//rt_thread_delay(1);//may be for loop more suitable
|
||||||
|
}
|
||||||
|
|
||||||
|
return WLAN_STATUS_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function read a 32bit value from GSPI register
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @param reg GSPI hardware register
|
||||||
|
* @param data A pointer to return the register value
|
||||||
|
* @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
static int gspi_read_reg32(wlan_private * priv, u16 reg, u32 * data)
|
||||||
|
{
|
||||||
|
u16 readdt[3];
|
||||||
|
|
||||||
|
if (gspi_read_data_direct((u8 *) readdt, reg, 4) < 0) {
|
||||||
|
rt_kprintf( "Error on gspi_read_reg32(%02x)\n", reg);
|
||||||
|
return WLAN_STATUS_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(data, readdt, 4);
|
||||||
|
#ifdef GSPI_TX_RX_DEBUG
|
||||||
|
rt_kprintf("read reg32(0x%x) = 0x%x\n", reg, *data);
|
||||||
|
#endif
|
||||||
|
return WLAN_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function read the host inerrrupt status register
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @param curHIS A pointer to return the value of Host Interrupt Status register
|
||||||
|
* @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
static int gspi_read_host_int_status(wlan_private * priv, u8 * curHIS)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
u16 his;
|
||||||
|
|
||||||
|
ret = gspi_read_reg(HOST_INT_STATUS_REG, &his);
|
||||||
|
if (!ret)
|
||||||
|
*curHIS = (u8) his;
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Read Event cause from the event scratch register
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
gspi_read_event_scratch(wlan_private * priv)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
ret = gspi_read_reg32(priv, SCRATCH_3_REG, &priv->adapter->EventCause);
|
||||||
|
if (ret < 0) {
|
||||||
|
rt_kprintf("ERROR: Event Scratch Pad Register Read!\n");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
rt_kprintf("The event is %x\n", priv->adapter->EventCause);
|
||||||
|
|
||||||
|
priv->adapter->EventCause <<= 3;
|
||||||
|
return WLAN_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function enables the host interrupts mask
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @param mask the interrupt mask
|
||||||
|
* @return WLAN_STATUS_SUCCESS
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
enable_host_int_mask(wlan_private * priv, u8 mask)
|
||||||
|
{
|
||||||
|
int ret = WLAN_STATUS_SUCCESS;
|
||||||
|
/* Enabling TxDnldRdy, RxDnldRdy, CmdUpldRdy, CmdDnldRdy, CardEvent
|
||||||
|
* interrupts */
|
||||||
|
gspi_write_reg(HOST_INT_STATUS_MASK_REG,HISM_TxDnLdRdy | HISM_RxUpLdRdy | HISM_CmdDnLdRdy|HISM_CardEvent | HISM_CmdUpLdRdy);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @brief This function disables the host interrupts mask.
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @param mask the interrupt mask
|
||||||
|
* @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
static int disable_host_int_mask(wlan_private * priv,u8 int_mask)
|
||||||
|
{
|
||||||
|
return gspi_write_reg(HOST_INT_STATUS_MASK_REG, 0x00);
|
||||||
|
}
|
||||||
|
|
||||||
|
/********************************************************
|
||||||
|
Global Functions
|
||||||
|
********************************************************/
|
||||||
|
/**
|
||||||
|
* @brief This is the interrupt handler for GSPI device
|
||||||
|
*
|
||||||
|
* @param irq The irq of GSPI device.
|
||||||
|
* @param dev_id A pointer to net_device structure
|
||||||
|
* @param fp A pointer to pt_regs structure
|
||||||
|
* @return n/a
|
||||||
|
*/
|
||||||
|
|
||||||
|
void sbi_interrupt(int dev)
|
||||||
|
{
|
||||||
|
|
||||||
|
disable_irq(INTSRC_EXINT4) ;
|
||||||
|
|
||||||
|
wlan_interrupt((struct rt_wlan_dev *)dev);
|
||||||
|
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @brief Call back function when New Hardware insert.
|
||||||
|
*
|
||||||
|
* This function will notify wlan driver a new hardware insert.
|
||||||
|
*
|
||||||
|
* @param card A pointer to struct net_device
|
||||||
|
* @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
int sbi_add_card(void* card)
|
||||||
|
{
|
||||||
|
if (!wlan_add_callback)
|
||||||
|
return WLAN_STATUS_FAILURE;
|
||||||
|
|
||||||
|
pwlanpriv = wlan_add_callback(card);
|
||||||
|
|
||||||
|
return (pwlanpriv != NULL) ? WLAN_STATUS_SUCCESS : WLAN_STATUS_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Call back function when Hardware been removed.
|
||||||
|
*
|
||||||
|
* This function will notify wlan driver a hardware removed.
|
||||||
|
*
|
||||||
|
* @param card A pointer to struct net_device
|
||||||
|
* @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
sbi_remove_card(void *card)
|
||||||
|
{
|
||||||
|
if (!wlan_remove_callback)
|
||||||
|
return WLAN_STATUS_FAILURE;
|
||||||
|
|
||||||
|
pwlanpriv = NULL;
|
||||||
|
return wlan_remove_callback(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief wlan driver call this function to register to bus driver
|
||||||
|
*
|
||||||
|
* This function will be used to register wlan driver's add/remove callback function.
|
||||||
|
*
|
||||||
|
* @param add wlan driver's call back funtion for add card.
|
||||||
|
* @param remove wlan driver's call back funtion for remove card.
|
||||||
|
* @param arg not been used
|
||||||
|
* @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
struct gspi_card_rec cardp;
|
||||||
|
int sbi_register(wlan_notifier_fn_add add, wlan_notifier_fn_remove remove,void *arg)
|
||||||
|
{
|
||||||
|
struct gspi_card_rec cardp;
|
||||||
|
wlan_add_callback = add;
|
||||||
|
wlan_remove_callback = remove;
|
||||||
|
cardp.add = sbi_add_card;
|
||||||
|
cardp.remove = sbi_remove_card;
|
||||||
|
// cardp.user_isr = sbi_interrupt;
|
||||||
|
sbi_add_card(&cardp);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @brief wlan driver call this function to unregister to bus driver
|
||||||
|
*
|
||||||
|
* This function will be used to unregister wlan driver.
|
||||||
|
*
|
||||||
|
* @return NA
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
sbi_unregister(void)
|
||||||
|
{
|
||||||
|
// unregister_user(&gspi_notifier);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief fake function for gspi interface hardware
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @return WLAN_STATUS_SUCCESS
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
sbi_get_cis_info(wlan_private * priv)
|
||||||
|
{
|
||||||
|
|
||||||
|
return WLAN_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief fake function for gspi interface hardware
|
||||||
|
*
|
||||||
|
* @param card_p not used
|
||||||
|
* @return WLAN_STATUS_SUCCESS
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
sbi_probe_card(void *card_p)
|
||||||
|
{
|
||||||
|
return WLAN_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define IPFIELD_ALIGN_OFFSET 2
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function read the current interrupt status register.
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @param ireg A pointer to hold the return interrupt status value
|
||||||
|
* @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
int sbi_get_int_status(wlan_private * priv, u8 * ireg)
|
||||||
|
{
|
||||||
|
int ret = WLAN_STATUS_SUCCESS;
|
||||||
|
u8 tmp;
|
||||||
|
struct sk_buff *skb=RT_NULL;
|
||||||
|
u8 *cmdBuf;
|
||||||
|
wlan_adapter *Adapter = priv->adapter;
|
||||||
|
|
||||||
|
disable_host_int_mask(priv, HIM_DISABLE);
|
||||||
|
ret = gspi_read_host_int_status(priv, &tmp);
|
||||||
|
gspi_irq_clear();
|
||||||
|
enable_irq(priv->wlan_dev.netdev->irq);
|
||||||
|
|
||||||
|
/* re-map bit 0 and bit 1 for WLAN module since the definition is different */
|
||||||
|
|
||||||
|
*ireg = tmp & (~(GHIS_TxDnLdRdy | GHIS_RxUpLdRdy));
|
||||||
|
|
||||||
|
if (tmp & GHIS_TxDnLdRdy) {
|
||||||
|
priv->wlan_dev.dnld_sent = DNLD_RES_RECEIVED;
|
||||||
|
*ireg |= HIS_TxDnLdRdy;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tmp & GHIS_RxUpLdRdy) {
|
||||||
|
*ireg |= HIS_RxUpLdRdy;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*ireg & HIS_RxUpLdRdy) {
|
||||||
|
if((skb=rt_malloc(sizeof(struct sk_buff)))==RT_NULL)
|
||||||
|
{
|
||||||
|
ifspi_debug1 ("no memry for skb\n\r");
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
}
|
||||||
|
rt_memset(skb,0x00,sizeof(struct sk_buff));
|
||||||
|
INIT_LIST_HEAD((struct list_head *)skb);
|
||||||
|
skb->data = rt_malloc(MRVDRV_ETH_RX_PACKET_BUFFER_SIZE);
|
||||||
|
if (!skb->data) {
|
||||||
|
ifspi_debug1("No free skb data buf\n");
|
||||||
|
priv->stats.rx_dropped++;
|
||||||
|
ret = WLAN_STATUS_FAILURE;
|
||||||
|
rt_free(skb);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*16 Byte Align the IP fields */ /*why the IPFIELD_ALIGN_OFFSET is 2 not 16*/
|
||||||
|
skb->head=skb->data;
|
||||||
|
skb->data=(unsigned char *)(((u32)skb->data+3)&0xfffffffc);
|
||||||
|
wlan_debug3("data buf skb %x data %x",(u32)skb,(u32)skb->head);
|
||||||
|
/* skb->tail is passed as we are calling skb_put after we
|
||||||
|
* are reading the data */
|
||||||
|
if (sbi_card_to_host(priv, MVMS_DAT,
|
||||||
|
&priv->wlan_dev.upld_len,
|
||||||
|
skb->data,
|
||||||
|
MRVDRV_ETH_RX_PACKET_BUFFER_SIZE) < 0) {
|
||||||
|
ifspi_debug1("ERROR: Data Transfer from device failed\n");
|
||||||
|
if (skb)
|
||||||
|
{
|
||||||
|
rt_free(skb);
|
||||||
|
if(skb->head!=RT_NULL)
|
||||||
|
rt_free(skb->head);
|
||||||
|
}
|
||||||
|
ret = WLAN_STATUS_FAILURE;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
ifspi_debug3( "Data <= FW\n");
|
||||||
|
|
||||||
|
skb->len+= priv->wlan_dev.upld_len;
|
||||||
|
list_add_tail((struct list_head *) skb,
|
||||||
|
(struct list_head *) &Adapter->RxSkbQ);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*ireg & HIS_CmdUpLdRdy) {
|
||||||
|
|
||||||
|
if (!Adapter->CurCmd) {
|
||||||
|
cmdBuf = priv->wlan_dev.upld_buf;
|
||||||
|
} else {
|
||||||
|
cmdBuf = Adapter->CurCmd->BufVirtualAddr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sbi_card_to_host(priv, MVMS_CMD,
|
||||||
|
&priv->wlan_dev.upld_len,
|
||||||
|
cmdBuf, WLAN_UPLD_SIZE) < 0) {
|
||||||
|
ifspi_debug1("ERROR: Data Transfer from device failed\n");
|
||||||
|
ret = WLAN_STATUS_FAILURE;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
done:
|
||||||
|
enable_host_int_mask(priv, HIM_ENABLE);
|
||||||
|
// ifspi_debug2("GSPI int status = %02x:%02x\n", *ireg, Adapter->HisRegCpy);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief initial the gspi hardware
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
int sbi_card_init(wlan_private * priv)
|
||||||
|
{
|
||||||
|
|
||||||
|
u16 host_int_mask;
|
||||||
|
u16 chiprev;
|
||||||
|
u32 irq_num;
|
||||||
|
|
||||||
|
gspi_write_reg( SPU_BUS_MODE_REG, BUS_MODE_16_NO_DELAY);
|
||||||
|
gspi_read_reg( CHIPREV_REG, &chiprev);
|
||||||
|
ifspi_debug2("Chiprev is %x", chiprev);
|
||||||
|
priv->adapter->chip_rev = chiprev;
|
||||||
|
|
||||||
|
/* Read the HOST_INT_STATUS_REG for ACK the first interrrupt got
|
||||||
|
* from the bootloader. If we don't do this we get a interrupt
|
||||||
|
* as soon as we register the irq. */
|
||||||
|
gspi_read_reg(HOST_INT_STATUS_REG, &host_int_mask);
|
||||||
|
|
||||||
|
if (gspi_register_irq((int*)&irq_num) != GSPI_OK){
|
||||||
|
ifspi_debug1("gspi_register_irq failed\n");
|
||||||
|
return WLAN_STATUS_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
enable_host_int_mask(priv, HIM_ENABLE);
|
||||||
|
gspi_init_HOST_INT_CTRL_REG(priv);
|
||||||
|
priv->wlan_dev.netdev->irq = irq_num;
|
||||||
|
|
||||||
|
|
||||||
|
return WLAN_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function check the firmware download status
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
sbi_verify_fw_download(wlan_private * priv)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
u32 scr4;
|
||||||
|
|
||||||
|
for (i = 0; i < MAX_FIRMWARE_POLL_TRIES; ++i) {
|
||||||
|
|
||||||
|
if (gspi_read_reg32(priv,SCRATCH_4_REG, &scr4) < 0) {
|
||||||
|
rt_kprintf( "Read from Scratch 4 failed !!!\n");
|
||||||
|
return WLAN_STATUS_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (scr4 == FIRMWARE_DNLD_OK) {
|
||||||
|
rt_kprintf("FW download successful !!!\n");
|
||||||
|
return WLAN_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
rt_thread_delay(100);
|
||||||
|
}
|
||||||
|
|
||||||
|
return WLAN_STATUS_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function download the firmware to the hardware
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @param firmware A pointer to firmware
|
||||||
|
* @param firmwarelen the len of firmware
|
||||||
|
* @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
sbi_download_wlan_fw_image( wlan_private * priv,const u8 * firmware,
|
||||||
|
int firmwarelen)
|
||||||
|
{
|
||||||
|
int ret,i;
|
||||||
|
u16 dlimage[1024];
|
||||||
|
u16 len;
|
||||||
|
u32 cnt = 0;
|
||||||
|
|
||||||
|
// rt_kprintf("Downloading FW of size %d bytes\n", firmwarelen);
|
||||||
|
//printk(KERN_ERR "Downloading--FW of size %d bytes\n", firmwarelen);
|
||||||
|
|
||||||
|
/* Wait initially for the first non-zero value */
|
||||||
|
|
||||||
|
do {
|
||||||
|
|
||||||
|
for(i=0;i<1000;i++);
|
||||||
|
gspi_read_reg(SCRATCH_1_REG, &len);
|
||||||
|
} while (!len);
|
||||||
|
//printk(KERN_ERR "LEN size %d bytes\n", len);
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
if (wait_for_hostintstatus(RT_NULL)) {
|
||||||
|
rt_kprintf("FW download died\n");
|
||||||
|
return WLAN_STATUS_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
gspi_read_reg(SCRATCH_1_REG, &len);
|
||||||
|
|
||||||
|
if (!len) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (len & 1) {
|
||||||
|
// rt_kprintf("CRC Error\n");
|
||||||
|
len &= ~1;
|
||||||
|
} else {
|
||||||
|
// rt_kprintf(".");
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(dlimage, firmware + cnt, len);
|
||||||
|
gspi_write_data_direct((u8 *) dlimage, CMD_RDWRPORT_REG,
|
||||||
|
(len / 2) + 1);
|
||||||
|
gspi_write_reg(HOST_INT_STATUS_REG, 0x0000);
|
||||||
|
gspi_write_reg(CARD_INT_CAUSE_REG, CIC_CmdDnLdOvr);
|
||||||
|
cnt += len;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*printk(KERN_ERR "\nFW Image of Size %d bytes downloaded, cnt %d\n",
|
||||||
|
firmwarelen,cnt);*/
|
||||||
|
// rt_kprintf("\nFW Image of Size bytes downloaded, cnt %d\n",
|
||||||
|
// firmwarelen, cnt);
|
||||||
|
|
||||||
|
ret = WLAN_STATUS_SUCCESS;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function will call sbi_download_wlan_fw_image to download the firmware
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
sbi_prog_firmware_w_helper(wlan_private * priv)
|
||||||
|
{
|
||||||
|
wlan_adapter *Adapter = priv->adapter;
|
||||||
|
if (Adapter->fmimage != NULL) {
|
||||||
|
return sbi_download_wlan_fw_image(priv,
|
||||||
|
Adapter->fmimage,
|
||||||
|
Adapter->fmimage_len);
|
||||||
|
} else {
|
||||||
|
rt_kprintf("No external FW image\n");
|
||||||
|
return WLAN_STATUS_FAILURE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function is used to download firmware to hardware
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @param firmware A pointer to fimware
|
||||||
|
* @param firmwarelen firmware length
|
||||||
|
* @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
sbi_prog_firmware_image(wlan_private * priv, const u8 * firmware,
|
||||||
|
int firmwarelen)
|
||||||
|
{
|
||||||
|
int ret = WLAN_STATUS_SUCCESS;
|
||||||
|
u16 dlimage[FIRMWARE_DNLD_PCKCNT];
|
||||||
|
int fwblknow;
|
||||||
|
|
||||||
|
|
||||||
|
for (fwblknow = 0; fwblknow < firmwarelen;
|
||||||
|
fwblknow += FIRMWARE_DNLD_PCKCNT) {
|
||||||
|
gspi_write_reg(SCRATCH_1_REG, FIRMWARE_DNLD_PCKCNT);
|
||||||
|
|
||||||
|
if (wait_for_hostintstatus(RT_NULL)) {
|
||||||
|
rt_kprintf("FW download died\n");
|
||||||
|
return WLAN_STATUS_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
rt_memcpy(dlimage, firmware + fwblknow, FIRMWARE_DNLD_PCKCNT);
|
||||||
|
gspi_write_data_direct((u8 *) dlimage, CMD_RDWRPORT_REG,
|
||||||
|
(FIRMWARE_DNLD_PCKCNT / 2) + 1);
|
||||||
|
gspi_write_reg(HOST_INT_STATUS_REG, 0x0000);
|
||||||
|
gspi_write_reg(CARD_INT_CAUSE_REG, CIC_CmdDnLdOvr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Writing 0 to Scr1 is to indicate the end of Firmware dwld */
|
||||||
|
gspi_write_reg(SCRATCH_1_REG, FIRMWARE_DNLD_END);
|
||||||
|
gspi_write_reg(HOST_INT_STATUS_REG, 0x0000);
|
||||||
|
gspi_write_reg(CARD_INT_CAUSE_REG, CIC_CmdDnLdOvr);
|
||||||
|
|
||||||
|
ret = WLAN_STATUS_SUCCESS;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function will call sbi_prog_firmware_image to
|
||||||
|
* download the firmware
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
sbi_prog_firmware(wlan_private * priv)
|
||||||
|
{
|
||||||
|
wlan_adapter *Adapter = priv->adapter;
|
||||||
|
if (Adapter->fmimage != NULL) {
|
||||||
|
return sbi_prog_firmware_image(priv,
|
||||||
|
Adapter->fmimage,
|
||||||
|
Adapter->fmimage_len);
|
||||||
|
} else {
|
||||||
|
ifspi_debug3( "No external FW image\n");
|
||||||
|
return WLAN_STATUS_FAILURE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function will call sbi_prog_firmware_image to
|
||||||
|
* download the helperimage
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
sbi_prog_helper(wlan_private * priv)
|
||||||
|
{
|
||||||
|
wlan_adapter *Adapter = priv->adapter;
|
||||||
|
if (Adapter->helper != NULL) {
|
||||||
|
return sbi_prog_firmware_image(priv,
|
||||||
|
Adapter->helper, Adapter->helper_len);
|
||||||
|
} else {
|
||||||
|
rt_kprintf("No external helper image\n");
|
||||||
|
return WLAN_STATUS_FAILURE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief wlan driver call this function to register the device
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @return WLAN_STATUS_SUCCESS
|
||||||
|
*/
|
||||||
|
int spi_register_dev(wlan_private * priv)
|
||||||
|
{
|
||||||
|
int ret = WLAN_STATUS_SUCCESS;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
/* Initialize the private structure */
|
||||||
|
strncpy(priv->wlan_dev.name, "gspi0", sizeof(priv->wlan_dev.name));
|
||||||
|
priv->wlan_dev.ioport = 0;
|
||||||
|
priv->wlan_dev.upld_rcv = 0;
|
||||||
|
priv->wlan_dev.upld_typ = 0;
|
||||||
|
priv->wlan_dev.upld_len = 0;
|
||||||
|
|
||||||
|
sbi_card_init(priv);
|
||||||
|
|
||||||
|
LEAVE();
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @brief enable the host interrupt on the GSPI device
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @return WLAN_STATUS_SUCCESS
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
sbi_enable_host_int(wlan_private * priv)
|
||||||
|
{
|
||||||
|
gspi_irq_clear();
|
||||||
|
enable_irq(priv->wlan_dev.netdev->irq);
|
||||||
|
return WLAN_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Disable the Host interrupt on the GSPI device
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @return WLAN_STATUS_SUCCESS
|
||||||
|
*/
|
||||||
|
int sbi_disable_host_int(wlan_private * priv)
|
||||||
|
{
|
||||||
|
disable_irq(priv->wlan_dev.netdev->irq);
|
||||||
|
return WLAN_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function is used to send the data/cmd to hardware
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @param type 1--Cmd, 0--Data
|
||||||
|
* @param payload A point to the data or cmd buffer
|
||||||
|
* @param nb len of data/cmd buffer
|
||||||
|
* @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
sbi_host_to_card(wlan_private * priv, u8 type, u8 * payload, u16 nb)
|
||||||
|
{
|
||||||
|
int ret = WLAN_STATUS_SUCCESS;
|
||||||
|
u16 writeReg;
|
||||||
|
u8 intType;
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
intType = type ? CIC_CmdDnLdOvr : CIC_TxDnLdOvr;
|
||||||
|
writeReg = (type) ? CMD_RDWRPORT_REG : DATA_RDWRPORT_REG;
|
||||||
|
priv->wlan_dev.dnld_sent = (type) ? DNLD_CMD_SENT : DNLD_DATA_SENT;
|
||||||
|
|
||||||
|
if (nb & 0x0001)
|
||||||
|
nb += 1;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If the bytes written is not a multiple of four then make it
|
||||||
|
* a multiple of four as the RWPORT is 4 byte aligned from
|
||||||
|
* the host
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (!(nb % 4))
|
||||||
|
ret = gspi_write_data_direct(payload, writeReg, (nb / 2) + 1);
|
||||||
|
else
|
||||||
|
ret = gspi_write_data_direct(payload, writeReg, (nb / 2) + 2);
|
||||||
|
|
||||||
|
gspi_write_reg(CARD_INT_CAUSE_REG, intType);
|
||||||
|
|
||||||
|
LEAVE();
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function is used to read data/cmd from the card.
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @param type 1--Cmd, 0--Data
|
||||||
|
* @param nb A point to return how many bytes has been read back from hardware
|
||||||
|
* @param payload A point to data buffer for receive data/cmd
|
||||||
|
* @param npayload the size of payload buffer
|
||||||
|
* @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
sbi_card_to_host(wlan_private * priv, u32 type,
|
||||||
|
u32 * nb, u8 * payload, u16 npayload)
|
||||||
|
{
|
||||||
|
int ret = WLAN_STATUS_SUCCESS;
|
||||||
|
u16 len;
|
||||||
|
u16 intType = 0, readReg;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
intType = type ? CIC_CmdUpLdOvr : CIC_RxUpLdOvr;
|
||||||
|
readReg = type ? CMD_RDWRPORT_REG : DATA_RDWRPORT_REG;
|
||||||
|
|
||||||
|
gspi_read_reg((type) ? SCRATCH_2_REG : SCRATCH_1_REG, &len);
|
||||||
|
|
||||||
|
if (!len || len > npayload) {
|
||||||
|
ifspi_debug3( "Error packet of len %d\n", len);
|
||||||
|
len = MRVDRV_ETH_RX_PACKET_BUFFER_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (len & 0x0001)
|
||||||
|
len += 1;
|
||||||
|
|
||||||
|
if (!(len % 4))
|
||||||
|
ret = gspi_read_data_direct(payload, readReg, (len / 2) + 1);
|
||||||
|
else
|
||||||
|
ret = gspi_read_data_direct(payload, readReg, (len / 2) + 2);
|
||||||
|
|
||||||
|
gspi_write_reg(CARD_INT_CAUSE_REG, intType);
|
||||||
|
|
||||||
|
*nb = len;
|
||||||
|
|
||||||
|
LEAVE();
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function is used to read the event cause from card
|
||||||
|
* and re-enable event interrupt.
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
sbi_read_event_cause(wlan_private * priv)
|
||||||
|
{
|
||||||
|
gspi_read_event_scratch(priv);
|
||||||
|
|
||||||
|
/* re-enable the interrupt */
|
||||||
|
gspi_write_host_int_status(priv, GHIS_CardEvent);
|
||||||
|
|
||||||
|
/* generate interrupt to firmware */
|
||||||
|
gspi_write_reg(CARD_INT_CAUSE_REG, CIC_HostEvent);
|
||||||
|
|
||||||
|
return WLAN_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief configure hardware to quit deep sleep state
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
int sbi_exit_deep_sleep(wlan_private * priv)
|
||||||
|
{
|
||||||
|
|
||||||
|
/* set Wakeup bit */
|
||||||
|
return gspi_write_reg(HOST_INT_CTRL_REG,
|
||||||
|
HIC_DEFAULT_VALUE | HIC_WakeUp);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief clear the Wake up bit in Host Interrupt Control Register
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
int sbi_reset_deepsleep_wakeup( wlan_private *priv)
|
||||||
|
{
|
||||||
|
|
||||||
|
/* clear wakeup bit */
|
||||||
|
return gspi_write_reg(HOST_INT_CTRL_REG,
|
||||||
|
HIC_DEFAULT_VALUE & ~HIC_WakeUp);
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,110 @@
|
||||||
|
/** @file if_gspi.h
|
||||||
|
* @brief This file contains MSU registers definition
|
||||||
|
*
|
||||||
|
* Copyright © Marvell International Ltd. and/or its affiliates, 2003-2006
|
||||||
|
*/
|
||||||
|
/********************************************************
|
||||||
|
Change log:
|
||||||
|
09/26/05: Add Doxygen format comments
|
||||||
|
|
||||||
|
********************************************************/
|
||||||
|
|
||||||
|
#ifndef __GSPIREG_H_
|
||||||
|
#define __GSPIREG_H_
|
||||||
|
|
||||||
|
#include "..\wlan\include.h" //changed by dennis
|
||||||
|
/* GSPI Registers Offset. All the resgisters are at DWORD boundary */
|
||||||
|
#define DEVICEID_CTRL_REG 0x00
|
||||||
|
#define CHIPREV_REG 0x02
|
||||||
|
|
||||||
|
#define IO_READBASE_REG 0x04
|
||||||
|
#define IO_WRITEBASE_REG 0x08
|
||||||
|
#define IO_RDWRPORT_REG 0x0C
|
||||||
|
|
||||||
|
#define CMD_READBASE_REG 0x10
|
||||||
|
#define CMD_WRITEBASE_REG 0x14
|
||||||
|
#define CMD_RDWRPORT_REG 0x18
|
||||||
|
|
||||||
|
#define DATA_READBASE_REG 0x1C
|
||||||
|
#define DATA_WRITEBASE_REG 0x20
|
||||||
|
#define DATA_RDWRPORT_REG 0x24
|
||||||
|
|
||||||
|
#define SCRATCH_1_REG 0x28
|
||||||
|
#define SCRATCH_2_REG 0x2C
|
||||||
|
#define SCRATCH_3_REG 0x30
|
||||||
|
#define SCRATCH_4_REG 0x34
|
||||||
|
|
||||||
|
#define TX_FRAME_SEQ_NUM_REG 0x38
|
||||||
|
#define TX_FRAME_STATUS_REG 0x3C
|
||||||
|
|
||||||
|
#define HOST_INT_CTRL_REG 0x40
|
||||||
|
|
||||||
|
#define CARD_INT_CAUSE_REG 0x44
|
||||||
|
#define CARD_INT_STATUS_REG 0x48
|
||||||
|
#define CARD_INT_EVENT_MASK_REG 0x4C
|
||||||
|
#define CARD_INT_STATUS_MASK_REG 0x50
|
||||||
|
#define CARD_INT_RESET_SELECT_REG 0x54
|
||||||
|
|
||||||
|
#define HOST_INT_CAUSE_REG 0x58
|
||||||
|
#define HOST_INT_STATUS_REG 0x5C
|
||||||
|
#define HOST_INT_EVENT_MASK_REG 0x60
|
||||||
|
#define HOST_INT_STATUS_MASK_REG 0x64
|
||||||
|
#define HOST_INT_RESET_SELECT_REG 0x68
|
||||||
|
|
||||||
|
#define DELAY_READ_REG 0x6C
|
||||||
|
#define SPU_BUS_MODE_REG 0x70
|
||||||
|
#define BUS_MODE_16_NO_DELAY 0x02
|
||||||
|
|
||||||
|
/* Bit definition for CARD_INT_CAUSE (Card Interrupt Cause) */
|
||||||
|
#define CIC_TxDnLdOvr B_BIT_0
|
||||||
|
#define CIC_RxUpLdOvr B_BIT_1
|
||||||
|
#define CIC_CmdDnLdOvr B_BIT_2
|
||||||
|
#define CIC_HostEvent B_BIT_3
|
||||||
|
#define CIC_CmdUpLdOvr B_BIT_4
|
||||||
|
#define CIC_PwrDown B_BIT_5
|
||||||
|
|
||||||
|
/* Bit definition for HOST_INT_STATUS (Host Interrupt Status) */
|
||||||
|
#define GHIS_TxDnLdRdy B_BIT_0
|
||||||
|
#define GHIS_RxUpLdRdy B_BIT_1
|
||||||
|
#define GHIS_CmdDnLdRdy B_BIT_2
|
||||||
|
#define GHIS_CardEvent B_BIT_3
|
||||||
|
#define GHIS_CmdUpLdRdy B_BIT_4
|
||||||
|
#define GHIS_IOWrFifoOvrflow B_BIT_5
|
||||||
|
#define GHIS_IORdFifoUndrflow B_BIT_6
|
||||||
|
#define GHIS_DATAWrFifoOvrflow B_BIT_7
|
||||||
|
#define GHIS_DATARdFifoUndrflow B_BIT_8
|
||||||
|
#define GHIS_CMDWrFifoOvrflow B_BIT_9
|
||||||
|
#define GHIS_CMDRdFifoUndrflow B_BIT_10
|
||||||
|
/* Bit definition for HOST_INT_STATUS_MASK_REG (Host Interrupt Status Mask) */
|
||||||
|
#define HISM_TxDnLdRdy B_BIT_0
|
||||||
|
#define HISM_RxUpLdRdy B_BIT_1
|
||||||
|
#define HISM_CmdDnLdRdy B_BIT_2
|
||||||
|
#define HISM_CardEvent B_BIT_3
|
||||||
|
#define HISM_CmdUpLdRdy B_BIT_4
|
||||||
|
#define HISM_IOWrFifoOvrflow B_BIT_5
|
||||||
|
#define HISM_IORdFifoUndrflow B_BIT_6
|
||||||
|
#define HISM_DATAWrFifoOvrflow B_BIT_7
|
||||||
|
#define HISM_DATARdFifoUndrflow B_BIT_8
|
||||||
|
#define HISM_CMDWrFifoOvrflow B_BIT_9
|
||||||
|
#define HISM_CMDRdFifoUndrflow B_BIT_10
|
||||||
|
|
||||||
|
/* Bit definition for HOST_INT_CTRL_REG (Host Interrupt Control) */
|
||||||
|
#define HIC_WakeUp B_BIT_0
|
||||||
|
#define HIC_WlanRdy B_BIT_1
|
||||||
|
#define HIC_TxDnldAuto B_BIT_5
|
||||||
|
#define HIC_RxUpldAuto B_BIT_6
|
||||||
|
#define HIC_CmdDnldAuto B_BIT_7
|
||||||
|
#define HIC_CmdUpldAuto B_BIT_8
|
||||||
|
|
||||||
|
/* Bit definition for SPU_BUS_MODE_REG (SPU Bus mode register)*/
|
||||||
|
#define SBM_DataFormat_2 B_BIT_2
|
||||||
|
|
||||||
|
/* Value to check once the firmware is downloaded */
|
||||||
|
#define FIRMWARE_DNLD_OK 0x88888888
|
||||||
|
|
||||||
|
/* Value to write to indicate end of firmware dnld */
|
||||||
|
#define FIRMWARE_DNLD_END 0x0000
|
||||||
|
#define FIRMWARE_DNLD_PCKCNT 64
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* __GSPIREG_H_ */
|
|
@ -0,0 +1,38 @@
|
||||||
|
/** @file if_gspi.h
|
||||||
|
* @brief This file contains MSU registers definition
|
||||||
|
*
|
||||||
|
* Copyright © Marvell International Ltd. and/or its affiliates, 2003-2006
|
||||||
|
*/
|
||||||
|
/********************************************************
|
||||||
|
Change log:
|
||||||
|
09/26/05: Add Doxygen format comments
|
||||||
|
|
||||||
|
********************************************************/
|
||||||
|
|
||||||
|
#ifndef __IF_GSPI_DEBUG_H_
|
||||||
|
#define __IF_GSPI_DEBUG_H_
|
||||||
|
#define DEBUG_IF_SSP_LEVEL3
|
||||||
|
#ifdef DEBUG_IF_SSP_LEVEL0
|
||||||
|
#define ifspi_debug1(...)
|
||||||
|
#define ifspi_debug2(...)
|
||||||
|
#define ifspi_debug3(...)
|
||||||
|
#endif
|
||||||
|
#ifdef DEBUG_IF_SSP_LEVEL1
|
||||||
|
#define ifspi_debug1(a...) rt_kprintf(a)
|
||||||
|
#define ifspi_debug2(a...) do{}while(0)
|
||||||
|
#define ifspi_debug3(a...) do{}while(0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef DEBUG_IF_SSP_LEVEL2
|
||||||
|
#define ifspi_debug1(a...) rt_kprintf(a)
|
||||||
|
#define ifspi_debug2(a...) rt_kprintf(a)
|
||||||
|
#define ifspi_debug3(a...) do{}while(0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef DEBUG_IF_SSP_LEVEL3
|
||||||
|
#define ifspi_debug1(a...) rt_kprintf(a)
|
||||||
|
#define ifspi_debug2(a...) rt_kprintf(a)
|
||||||
|
#define ifspi_debug3(a...) rt_kprintf(a)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __GSPIREG_H_ */
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,135 @@
|
||||||
|
char helpgspibin[]={
|
||||||
|
0x03,0x00,0x00,0xEA,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x50,0x00,0x9F,0xE5,0x10,0x0F,0x01,0xEE,0x00,0x00,0xE0,0xE3,
|
||||||
|
0x48,0x10,0x9F,0xE5,0x0C,0x00,0x81,0xE5,0x18,0x00,0x91,0xE5,0x20,0x08,0xA0,0xE1,
|
||||||
|
0x0B,0x00,0x50,0xE3,0x04,0x00,0x00,0x0A,0x1B,0x00,0x50,0xE3,0x02,0x00,0x00,0x0A,
|
||||||
|
0x2C,0x00,0x9F,0xE5,0x30,0x00,0x81,0xE5,0x01,0x00,0x00,0xEA,0x24,0x00,0x9F,0xE5,
|
||||||
|
0x30,0x00,0x81,0xE5,0x20,0xD0,0x9F,0xE5,0x20,0x00,0x9F,0xE5,0x00,0x10,0x90,0xE5,
|
||||||
|
0x1C,0x20,0x9F,0xE5,0x00,0x10,0x82,0xE5,0x06,0x00,0x00,0xEA,0x74,0x1F,0x00,0x00,
|
||||||
|
0x00,0x20,0x00,0x80,0x12,0x09,0x00,0x00,0xE7,0x3A,0x07,0x14,0x00,0x20,0x00,0x04,
|
||||||
|
0x04,0x00,0x00,0x00,0xFC,0xFF,0x00,0x00,0xC4,0x80,0x8F,0xE2,0x03,0x00,0x98,0xE8,
|
||||||
|
0x08,0x00,0x80,0xE0,0x08,0x10,0x81,0xE0,0x01,0xB0,0x40,0xE2,0x01,0x00,0x50,0xE1,
|
||||||
|
0x13,0x00,0x00,0x0A,0x70,0x00,0xB0,0xE8,0x05,0x00,0x54,0xE1,0xFA,0xFF,0xFF,0x0A,
|
||||||
|
0x01,0x00,0x14,0xE3,0x0B,0x40,0x84,0x10,0x01,0x00,0x15,0xE3,0x0B,0x50,0x85,0x10,
|
||||||
|
0x02,0x00,0x15,0xE3,0x09,0x50,0x85,0x10,0x03,0x50,0xC5,0xE3,0x10,0x60,0x56,0xE2,
|
||||||
|
0x8C,0x10,0xB4,0x28,0x8C,0x10,0xA5,0x28,0xFB,0xFF,0xFF,0x8A,0x86,0x6E,0xB0,0xE1,
|
||||||
|
0x0C,0x00,0xB4,0x28,0x0C,0x00,0xA5,0x28,0x04,0x70,0x94,0x44,0x04,0x70,0x85,0x44,
|
||||||
|
0xE9,0xFF,0xFF,0xEA,0x08,0x20,0x98,0xE5,0x0C,0x30,0x98,0xE5,0x08,0x20,0x82,0xE0,
|
||||||
|
0x08,0x30,0x83,0xE0,0x01,0xC0,0x42,0xE2,0x00,0x70,0xA0,0xE3,0x00,0x00,0xA0,0xE3,
|
||||||
|
0x00,0x60,0xA0,0xE3,0x00,0xB0,0xA0,0xE3,0x03,0x00,0x52,0xE1,0x10,0x00,0x00,0x0B,
|
||||||
|
0x30,0x00,0xB2,0xE8,0x01,0x00,0x14,0xE3,0x0C,0x40,0x84,0x10,0x02,0x00,0x14,0xE3,
|
||||||
|
0x09,0x40,0x84,0x10,0x03,0x40,0xC4,0xE3,0x10,0x50,0x55,0xE2,0xC1,0x08,0xA4,0x28,
|
||||||
|
0xFC,0xFF,0xFF,0x8A,0x85,0x5E,0xB0,0xE1,0x41,0x00,0xA4,0x28,0x04,0x70,0x84,0x44,
|
||||||
|
0xF0,0xFF,0xFF,0xEA,0x18,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,
|
||||||
|
0x54,0x00,0x00,0x00,0x04,0xF0,0x1F,0xE5,0x80,0x01,0x00,0xC0,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA8,0x01,0x00,0x00,0x00,0x00,0x00,0xC0,
|
||||||
|
0x3C,0x06,0x00,0x00,0xE4,0x07,0x00,0x00,0x00,0x08,0x00,0xC0,0x78,0x00,0x00,0x00,
|
||||||
|
0xA8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x06,0x00,0xC0,0x00,0x00,0x00,0x00,
|
||||||
|
0x78,0x08,0x00,0xC0,0x70,0x00,0x00,0x00,0x70,0x47,0x70,0x47,0x00,0x47,0x08,0x47,
|
||||||
|
0x10,0x47,0x18,0x47,0x20,0x47,0x28,0x47,0x30,0x47,0x38,0x47,0x78,0x47,0x00,0x00,
|
||||||
|
0x03,0x00,0x52,0xE3,0x83,0x00,0x00,0x9A,0x03,0xC0,0x10,0xE2,0x08,0x00,0x00,0x0A,
|
||||||
|
0x01,0x30,0xD1,0xE4,0x02,0x00,0x5C,0xE3,0x0C,0x20,0x82,0xE0,0x01,0xC0,0xD1,0x94,
|
||||||
|
0x01,0x30,0xC0,0xE4,0x01,0x30,0xD1,0x34,0x04,0x20,0x42,0xE2,0x01,0xC0,0xC0,0x94,
|
||||||
|
0x01,0x30,0xC0,0x34,0x03,0x30,0x11,0xE2,0x63,0x00,0x00,0x0A,0x04,0x20,0x52,0xE2,
|
||||||
|
0x74,0x00,0x00,0x3A,0x03,0xC0,0x31,0xE7,0x02,0x00,0x53,0xE3,0x08,0x00,0x00,0x0A,
|
||||||
|
0x0F,0x00,0x00,0x8A,0x2C,0x34,0xA0,0xE1,0x04,0xC0,0xB1,0xE5,0x04,0x20,0x52,0xE2,
|
||||||
|
0x0C,0x3C,0x83,0xE1,0x04,0x30,0x80,0xE4,0xF9,0xFF,0xFF,0x2A,0x01,0x10,0x81,0xE2,
|
||||||
|
0x68,0x00,0x00,0xEA,0x2C,0x38,0xA0,0xE1,0x04,0xC0,0xB1,0xE5,0x04,0x20,0x52,0xE2,
|
||||||
|
0x0C,0x38,0x83,0xE1,0x04,0x30,0x80,0xE4,0xF9,0xFF,0xFF,0x2A,0x02,0x10,0x81,0xE2,
|
||||||
|
0x60,0x00,0x00,0xEA,0x2C,0x3C,0xA0,0xE1,0x04,0xC0,0xB1,0xE5,0x04,0x20,0x52,0xE2,
|
||||||
|
0x0C,0x34,0x83,0xE1,0x04,0x30,0x80,0xE4,0xF9,0xFF,0xFF,0x2A,0x03,0x10,0x81,0xE2,
|
||||||
|
0x58,0x00,0x00,0xEA,0x78,0x47,0x00,0x00,0x1E,0xFF,0x2F,0xE1,0x78,0x47,0x00,0x00,
|
||||||
|
0x0E,0x50,0xA0,0xE1,0x3C,0x00,0x00,0xEB,0x05,0xE0,0xA0,0xE1,0x00,0x40,0xA0,0xE1,
|
||||||
|
0x0D,0x10,0xA0,0xE1,0x0A,0x30,0xA0,0xE1,0x07,0x00,0xC0,0xE3,0x60,0xD0,0x80,0xE2,
|
||||||
|
0x10,0x40,0x2D,0xE9,0xF0,0x00,0x00,0xEB,0x10,0x40,0xBD,0xE8,0x07,0xD0,0xC1,0xE3,
|
||||||
|
0x00,0x60,0xA0,0xE3,0x00,0x70,0xA0,0xE3,0x00,0x80,0xA0,0xE3,0x00,0xB0,0xA0,0xE3,
|
||||||
|
0x04,0xC0,0xA0,0xE1,0xC0,0x09,0xAC,0xE8,0xC0,0x09,0xAC,0xE8,0xC0,0x09,0xAC,0xE8,
|
||||||
|
0xC0,0x09,0xAC,0xE8,0x1F,0x40,0x2D,0xE9,0x00,0x00,0xA0,0xE3,0x00,0x10,0xA0,0xE3,
|
||||||
|
0xFF,0xFF,0xFF,0xEB,0x40,0x10,0x81,0xE2,0x01,0x60,0x80,0xE0,0x44,0x6F,0x86,0xE2,
|
||||||
|
0x1C,0x60,0x84,0xE5,0x18,0x10,0x84,0xE5,0x01,0x00,0xA0,0xE3,0x14,0x00,0x84,0xE5,
|
||||||
|
0x1F,0x40,0xBD,0xE8,0x02,0x10,0xA0,0xE1,0x1E,0xFF,0x2F,0xE1,0x78,0x47,0x00,0x00,
|
||||||
|
0x10,0x40,0x2D,0xE9,0x00,0x20,0xA0,0xE1,0x00,0x00,0xA0,0xE3,0xFF,0xFF,0xFF,0xEB,
|
||||||
|
0x10,0x40,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0xD4,0xFF,0xFF,0xEB,0x36,0x00,0x00,0xFA,
|
||||||
|
0x1C,0xC0,0x9F,0xE5,0x0F,0xC0,0x8C,0xE0,0x01,0x00,0x1C,0xE3,0x0D,0xE0,0x8F,0x12,
|
||||||
|
0x0F,0xE0,0xA0,0x01,0x1C,0xFF,0x2F,0xE1,0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1,
|
||||||
|
0x00,0xF0,0x52,0xF8,0xC5,0x03,0x00,0x00,0x78,0x47,0x00,0x00,0x01,0x40,0x2D,0xE9,
|
||||||
|
0x50,0x00,0x00,0xFB,0x01,0x40,0xBD,0xE8,0x01,0x00,0x00,0xEA,0x78,0x47,0x00,0x00,
|
||||||
|
0x00,0x00,0xE0,0xE3,0x53,0x00,0x00,0xEA,0x78,0x47,0x00,0x00,0x00,0x00,0x9F,0xE5,
|
||||||
|
0x1E,0xFF,0x2F,0xE1,0x88,0x08,0x00,0xC0,0x78,0x47,0x00,0x00,0x10,0x40,0x2D,0xE9,
|
||||||
|
0x20,0x20,0x52,0xE2,0x05,0x00,0x00,0x3A,0x18,0x50,0xB1,0x28,0x18,0x50,0xA0,0x28,
|
||||||
|
0x18,0x50,0xB1,0x28,0x18,0x50,0xA0,0x28,0x20,0x20,0x52,0x22,0xF9,0xFF,0xFF,0x2A,
|
||||||
|
0x02,0xCE,0xB0,0xE1,0x18,0x50,0xB1,0x28,0x18,0x50,0xA0,0x28,0x18,0x00,0xB1,0x48,
|
||||||
|
0x18,0x00,0xA0,0x48,0x10,0x40,0xBD,0xE8,0x02,0xCF,0xB0,0xE1,0x04,0x30,0x91,0x24,
|
||||||
|
0x04,0x30,0x80,0x24,0x1E,0xFF,0x2F,0x01,0x82,0x2F,0xB0,0xE1,0x01,0x20,0xD1,0x44,
|
||||||
|
0x01,0x30,0xD1,0x24,0x01,0xC0,0xD1,0x24,0x01,0x20,0xC0,0x44,0x01,0x30,0xC0,0x24,
|
||||||
|
0x01,0xC0,0xC0,0x24,0x1E,0xFF,0x2F,0xE1,0x10,0xB5,0x04,0x1C,0x00,0xF0,0x00,0xF8,
|
||||||
|
0x20,0x1C,0xFF,0xF7,0xAC,0xEF,0x10,0xBC,0x08,0xBC,0x18,0x47,0xF0,0xB5,0x04,0x1C,
|
||||||
|
0x0D,0x1C,0x83,0xB0,0x00,0xF0,0xDA,0xE9,0x00,0x94,0x01,0x95,0x00,0x20,0x00,0xF0,
|
||||||
|
0x00,0xF8,0x02,0x90,0x26,0x48,0x69,0x46,0x78,0x44,0x00,0xF0,0x00,0xF8,0x05,0x1C,
|
||||||
|
0x0E,0x1C,0x00,0xA9,0x03,0xC9,0x00,0xF0,0x00,0xF8,0x00,0xF0,0x00,0xF8,0x00,0xF0,
|
||||||
|
0x00,0xF8,0x00,0x21,0x00,0x20,0x00,0xF0,0x00,0xF8,0x07,0x1C,0xFF,0xF7,0x96,0xEF,
|
||||||
|
0x04,0x1C,0x00,0x21,0x07,0x62,0x00,0x20,0x00,0xF0,0x00,0xF8,0x41,0x1C,0x61,0x62,
|
||||||
|
0x00,0x21,0x00,0x20,0x00,0xF0,0x00,0xF8,0x00,0x21,0xA0,0x62,0x00,0x20,0x00,0xF0,
|
||||||
|
0x00,0xF8,0x00,0x21,0xE0,0x62,0x00,0x20,0x00,0xF0,0x00,0xF8,0x20,0x63,0x00,0xF0,
|
||||||
|
0x00,0xF8,0x00,0xF0,0x00,0xF8,0x00,0xF0,0x00,0xF8,0x00,0xF0,0x00,0xF8,0x00,0xF0,
|
||||||
|
0x00,0xF8,0x00,0xF0,0x00,0xF8,0x00,0xF0,0x00,0xF8,0x00,0xF0,0x00,0xF8,0x28,0x1C,
|
||||||
|
0x31,0x1C,0x03,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x08,0xB5,0x00,0xF0,0x00,0xF8,
|
||||||
|
0x00,0xF0,0x00,0xF8,0x00,0xF0,0x00,0xF8,0x01,0xB0,0x08,0xBC,0x18,0x47,0x00,0x00,
|
||||||
|
0x94,0x00,0x00,0x00,0x78,0x47,0x00,0x00,0x18,0x00,0xA0,0xE3,0x08,0x10,0x9F,0xE5,
|
||||||
|
0x56,0x34,0x12,0xEF,0x1E,0xFF,0x2F,0xE1,0x09,0x00,0x00,0x00,0x26,0x00,0x02,0x00,
|
||||||
|
0x78,0x47,0x00,0x00,0x1E,0xFF,0x2F,0xE1,0x78,0x47,0x00,0x00,0x10,0x40,0x2D,0xE9,
|
||||||
|
0xA1,0xFF,0xFF,0xEB,0x04,0x00,0x80,0xE2,0x10,0x40,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,
|
||||||
|
0x00,0x47,0x00,0x00,0xFE,0xB5,0x00,0x20,0x02,0x90,0x01,0x90,0x4D,0x48,0x01,0x26,
|
||||||
|
0xC0,0x6B,0x05,0x28,0x19,0xD2,0x02,0xA3,0x1B,0x5C,0x5B,0x00,0x9F,0x44,0x00,0x00,
|
||||||
|
0x03,0x04,0x04,0x04,0x04,0x00,0x00,0x26,0x47,0x4A,0x00,0x21,0x11,0x60,0x84,0x00,
|
||||||
|
0x46,0x48,0x51,0x60,0x91,0x60,0x46,0x4D,0x01,0x59,0x28,0x1C,0xFF,0xF7,0x37,0xFE,
|
||||||
|
0x44,0x48,0x00,0x59,0xFF,0xF7,0x32,0xFE,0x00,0xE0,0xFE,0xE7,0x01,0x98,0x00,0x28,
|
||||||
|
0x09,0xD0,0x41,0x48,0x80,0x69,0x00,0x0C,0x00,0x02,0x10,0x21,0x08,0x43,0x05,0x1C,
|
||||||
|
0x00,0x20,0x01,0x90,0x00,0xE0,0x10,0x25,0x3C,0x4F,0x28,0x1C,0x39,0x59,0xFF,0xF7,
|
||||||
|
0x1E,0xFE,0x00,0x2E,0x04,0xD0,0x3A,0x48,0x00,0x59,0xFF,0xF7,0x17,0xFE,0x00,0x26,
|
||||||
|
0x00,0x20,0x00,0x90,0x37,0x48,0x00,0x59,0xFF,0xF7,0x10,0xFE,0x30,0x48,0x2E,0x4F,
|
||||||
|
0x0F,0xC8,0x0F,0xC7,0x10,0x3F,0x38,0x68,0x01,0x28,0x0F,0xD0,0x04,0x28,0x0D,0xD0,
|
||||||
|
0x01,0x20,0x2E,0x4F,0x05,0x43,0x28,0x1C,0x39,0x59,0xFF,0xF7,0x00,0xFE,0x2C,0x48,
|
||||||
|
0x00,0x59,0xFF,0xF7,0xFB,0xFD,0x00,0x98,0x00,0x28,0xE3,0xD0,0x22,0x48,0x00,0x68,
|
||||||
|
0x01,0x28,0x18,0xD0,0x04,0x28,0x0C,0xD1,0x24,0x4F,0x00,0x20,0x39,0x59,0xFF,0xF7,
|
||||||
|
0xEE,0xFD,0x23,0x48,0x00,0x59,0xFF,0xF7,0xE9,0xFD,0x1B,0x48,0x40,0x68,0xFF,0xF7,
|
||||||
|
0x8F,0xFF,0x19,0x49,0x00,0x20,0x08,0x60,0x48,0x60,0x88,0x60,0xC8,0x60,0x02,0x98,
|
||||||
|
0x00,0x28,0xAB,0xD0,0xFE,0xBD,0x19,0x4F,0x13,0x48,0x39,0x59,0x85,0x68,0x28,0x1C,
|
||||||
|
0xFF,0xF7,0xD5,0xFD,0x16,0x48,0x00,0x59,0xFF,0xF7,0xD0,0xFD,0x00,0x20,0x00,0x90,
|
||||||
|
0x14,0x48,0x00,0x59,0xFF,0xF7,0xCA,0xFD,0x13,0x48,0x00,0x59,0xFF,0xF7,0xC6,0xFD,
|
||||||
|
0x00,0x28,0x01,0xD1,0x01,0x26,0xDC,0xE7,0x01,0x20,0x05,0x43,0x28,0x1C,0x39,0x59,
|
||||||
|
0xFF,0xF7,0xBD,0xFD,0x0A,0x48,0x00,0x59,0xFF,0xF7,0xB8,0xFD,0x00,0x98,0x00,0x28,
|
||||||
|
0xCF,0xD1,0xE5,0xE7,0xC0,0xFF,0x00,0x00,0x78,0x08,0x00,0xC0,0x14,0x08,0x00,0xC0,
|
||||||
|
0x00,0x0A,0x00,0xC0,0x00,0x08,0x00,0xC0,0x00,0x20,0x00,0x80,0x64,0x08,0x00,0xC0,
|
||||||
|
0x3C,0x08,0x00,0xC0,0x28,0x08,0x00,0xC0,0x50,0x08,0x00,0xC0,0x04,0x00,0x9F,0xE5,
|
||||||
|
0x40,0x1D,0x80,0xE2,0x0E,0xF0,0xA0,0xE1,0x00,0x10,0x00,0x04,0x01,0x49,0x05,0x20,
|
||||||
|
0x48,0x61,0x70,0x47,0x00,0x0C,0x00,0x80,0x70,0x47,0x00,0x00,0x00,0x20,0x70,0x47,
|
||||||
|
0x70,0x47,0x00,0x00,0x70,0x47,0x00,0x00,0x70,0x47,0x00,0x00,0x03,0x48,0x04,0x49,
|
||||||
|
0x08,0x80,0x40,0x07,0x41,0x88,0x41,0x80,0x70,0x47,0x00,0x00,0x04,0x80,0x00,0x00,
|
||||||
|
0x20,0x00,0x00,0x80,0x01,0x21,0xC9,0x07,0x48,0x88,0x40,0x07,0xFC,0xD5,0x70,0x47,
|
||||||
|
0x02,0x49,0x03,0x48,0x01,0x80,0x8F,0x21,0xC1,0x83,0x70,0x47,0x04,0x80,0x00,0x00,
|
||||||
|
0x20,0x00,0x00,0x80,0x01,0x21,0xC9,0x07,0x88,0x62,0x70,0x47,0x01,0x21,0xC9,0x07,
|
||||||
|
0x88,0x63,0x70,0x47,0x05,0x4A,0x80,0xB5,0x12,0x1D,0x05,0xCA,0x02,0x49,0x04,0x3A,
|
||||||
|
0xFF,0xF7,0x66,0xED,0x00,0x20,0x80,0xBD,0x00,0x0A,0x00,0xC0,0x78,0x08,0x00,0xC0,
|
||||||
|
0x80,0xB5,0xFF,0xF7,0xFF,0xFE,0x00,0x20,0x80,0xBD,0x00,0x00,0x04,0x21,0x48,0x07,
|
||||||
|
0x41,0x63,0x00,0x21,0x41,0x62,0x70,0x47,0x01,0x21,0xC9,0x07,0x48,0x6A,0x40,0x07,
|
||||||
|
0xFC,0xD5,0x70,0x47,0x01,0x21,0xC8,0x07,0x01,0x62,0x04,0x21,0x41,0x63,0x70,0x47,
|
||||||
|
0x01,0x21,0xC9,0x07,0x88,0x81,0x70,0x47,0x01,0x21,0xC9,0x07,0xC8,0x63,0x70,0x47,
|
||||||
|
0x02,0x48,0x00,0x21,0x01,0x81,0x0D,0x21,0x01,0x80,0x70,0x47,0x20,0x01,0x00,0x80,
|
||||||
|
0x02,0x49,0x08,0x89,0xC0,0x07,0xFC,0xD5,0x70,0x47,0x00,0x00,0x20,0x01,0x00,0x80,
|
||||||
|
0x03,0x48,0x0D,0x21,0x01,0x80,0x00,0x21,0x81,0x81,0x01,0x21,0x81,0x80,0x70,0x47,
|
||||||
|
0x20,0x01,0x00,0x80,0x01,0x49,0x08,0x61,0x70,0x47,0x00,0x00,0x00,0x01,0x00,0x80,
|
||||||
|
0x01,0x49,0x48,0x61,0x70,0x47,0x00,0x00,0x00,0x01,0x00,0x80,0x01,0x49,0x04,0x20,
|
||||||
|
0x08,0x83,0x70,0x47,0x40,0x00,0x00,0x80,0x03,0x49,0x08,0x89,0x40,0x07,0xFC,0xD5,
|
||||||
|
0x00,0x20,0x08,0x81,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x80,0x01,0x49,0x04,0x20,
|
||||||
|
0x08,0x83,0x70,0x47,0x40,0x00,0x00,0x80,0x01,0x21,0xC9,0x07,0x88,0x62,0x70,0x47,
|
||||||
|
0x01,0x21,0xC9,0x07,0x48,0x61,0x70,0x47,0x78,0x47,0x00,0x00,0x10,0x40,0x2D,0xE9,
|
||||||
|
0x45,0xFF,0xFF,0xEB,0x00,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5,0x10,0x40,0xBD,0xE8,
|
||||||
|
0x1E,0xFF,0x2F,0xE1,0x19,0x05,0x00,0xC0,0xE9,0x04,0x00,0xC0,0xB9,0x05,0x00,0xC0,
|
||||||
|
0x05,0x06,0x00,0xC0,0x7D,0x05,0x00,0xC0,0x35,0x05,0x00,0xC0,0xF1,0x04,0x00,0xC0,
|
||||||
|
0xD9,0x05,0x00,0xC0,0x19,0x06,0x00,0xC0,0x91,0x05,0x00,0xC0,0x0D,0x05,0x00,0xC0,
|
||||||
|
0xE1,0x04,0x00,0xC0,0xA9,0x05,0x00,0xC0,0xF1,0x05,0x00,0xC0,0x71,0x05,0x00,0xC0,
|
||||||
|
0xF5,0x04,0x00,0xC0,0xD5,0x04,0x00,0xC0,0x99,0x05,0x00,0xC0,0xE5,0x05,0x00,0xC0,
|
||||||
|
0x65,0x05,0x00,0xC0,0x3D,0x05,0x00,0xC0,0xE5,0x04,0x00,0xC0,0x3D,0x05,0x00,0xC0,
|
||||||
|
0x3D,0x05,0x00,0xC0,0x3D,0x05,0x00,0xC0,0x2D,0x05,0x00,0xC0,0xED,0x04,0x00,0xC0,
|
||||||
|
0xCD,0x05,0x00,0xC0,0x11,0x06,0x00,0xC0,0x89,0x05,0x00,0xC0};
|
|
@ -0,0 +1,337 @@
|
||||||
|
/** @file host.h
|
||||||
|
*
|
||||||
|
* @brief This file contains definitions of WLAN commands.
|
||||||
|
*
|
||||||
|
* Copyright © Marvell International Ltd. and/or its affiliates, 2003-2007
|
||||||
|
*/
|
||||||
|
/********************************************************
|
||||||
|
Change log:
|
||||||
|
10/11/05: Add Doxygen format comments
|
||||||
|
01/11/06: Remove assoc response codes; full IEEE assoc resp now returned
|
||||||
|
04/06/06: Add TSPEC, queue metrics, and MSDU expiry support
|
||||||
|
04/10/06: Add power_adapt_cfg_ext command
|
||||||
|
04/18/06: Remove old Subscrive Event and add new Subscribe Event
|
||||||
|
implementation through generic hostcmd API
|
||||||
|
05/03/06: Add auto_tx hostcmd
|
||||||
|
05/04/06: Add IBSS coalescing related new hostcmd and event
|
||||||
|
08/28/06: Add LED_CTRL hostcmd
|
||||||
|
********************************************************/
|
||||||
|
|
||||||
|
#ifndef _HOST_H_
|
||||||
|
#define _HOST_H_
|
||||||
|
|
||||||
|
/** PUBLIC DEFINITIONS */
|
||||||
|
#define DEFAULT_AD_HOC_CHANNEL 6
|
||||||
|
#define DEFAULT_AD_HOC_CHANNEL_A 36
|
||||||
|
|
||||||
|
/** IEEE 802.11 OIDs */
|
||||||
|
#define OID_802_11_INFRASTRUCTURE_MODE 0x00008001
|
||||||
|
#define OID_802_11_FRAGMENTATION_THRESHOLD 0x00008002
|
||||||
|
#define OID_802_11_RTS_THRESHOLD 0x00008003
|
||||||
|
#define OID_802_11_ADD_WEP 0x00008004
|
||||||
|
#define OID_802_11_REMOVE_WEP 0x00008005
|
||||||
|
#define OID_802_11_TX_RETRYCOUNT 0x00008006
|
||||||
|
#define OID_802_11D_ENABLE 0x00008007
|
||||||
|
|
||||||
|
#define HostCmd_OPTION_WAITFORRSP 0x0002
|
||||||
|
|
||||||
|
/** Host Command ID */
|
||||||
|
#define HostCmd_CMD_GET_HW_SPEC 0x0003
|
||||||
|
#define HostCmd_CMD_802_11_RESET 0x0005
|
||||||
|
#define HostCmd_CMD_802_11_SCAN 0x0006
|
||||||
|
#define HostCmd_CMD_802_11_GET_LOG 0x000b
|
||||||
|
#define HostCmd_CMD_MAC_MULTICAST_ADR 0x0010
|
||||||
|
#define HostCmd_CMD_802_11_EEPROM_ACCESS 0x0059
|
||||||
|
#define HostCmd_CMD_802_11_ASSOCIATE 0x0012
|
||||||
|
#define HostCmd_CMD_802_11_SET_WEP 0x0013
|
||||||
|
#define HostCmd_CMD_802_11_SNMP_MIB 0x0016
|
||||||
|
#define HostCmd_CMD_MAC_REG_ACCESS 0x0019
|
||||||
|
#define HostCmd_CMD_BBP_REG_ACCESS 0x001a
|
||||||
|
#define HostCmd_CMD_RF_REG_ACCESS 0x001b
|
||||||
|
#define HostCmd_CMD_802_11_RADIO_CONTROL 0x001c
|
||||||
|
#define HostCmd_CMD_802_11_RF_CHANNEL 0x001d
|
||||||
|
#define HostCmd_CMD_802_11_RF_TX_POWER 0x001e
|
||||||
|
#define HostCmd_CMD_802_11_RSSI 0x001f
|
||||||
|
#define HostCmd_CMD_802_11_RF_ANTENNA 0x0020
|
||||||
|
|
||||||
|
#define HostCmd_CMD_802_11_PS_MODE 0x0021
|
||||||
|
|
||||||
|
#define HostCmd_CMD_802_11_DEAUTHENTICATE 0x0024
|
||||||
|
#define HostCmd_CMD_MAC_CONTROL 0x0028
|
||||||
|
#define HostCmd_CMD_802_11_AD_HOC_START 0x002b
|
||||||
|
#define HostCmd_CMD_802_11_AD_HOC_JOIN 0x002c
|
||||||
|
|
||||||
|
#define HostCmd_CMD_802_11_KEY_MATERIAL 0x005e
|
||||||
|
|
||||||
|
#define HostCmd_CMD_802_11_DEEP_SLEEP 0x003e
|
||||||
|
|
||||||
|
#define HostCmd_CMD_802_11_AD_HOC_STOP 0x0040
|
||||||
|
|
||||||
|
#define HostCmd_CMD_802_11_HOST_SLEEP_CFG 0x0043
|
||||||
|
#define HostCmd_CMD_802_11_WAKEUP_CONFIRM 0x0044
|
||||||
|
|
||||||
|
#define HostCmd_CMD_802_11_MAC_ADDRESS 0x004D
|
||||||
|
#define HostCmd_CMD_802_11_EEPROM_ACCESS 0x0059
|
||||||
|
|
||||||
|
#define HostCmd_CMD_GSPI_BUS_CONFIG 0x005A
|
||||||
|
|
||||||
|
#define HostCmd_CMD_802_11_BAND_CONFIG 0x0058
|
||||||
|
|
||||||
|
#define HostCmd_CMD_802_11D_DOMAIN_INFO 0x005b
|
||||||
|
|
||||||
|
#define HostCmd_CMD_802_11_SLEEP_PARAMS 0x0066
|
||||||
|
|
||||||
|
#define HostCmd_CMD_802_11_INACTIVITY_TIMEOUT 0x0067
|
||||||
|
|
||||||
|
#define HostCmd_CMD_802_11_SLEEP_PERIOD 0x0068
|
||||||
|
#define HostCmd_CMD_802_11_BCA_CONFIG_TIMESHARE 0x0069
|
||||||
|
|
||||||
|
#define HostCmd_CMD_802_11_BG_SCAN_CONFIG 0x006b
|
||||||
|
#define HostCmd_CMD_802_11_BG_SCAN_QUERY 0x006c
|
||||||
|
|
||||||
|
#define HostCmd_CMD_802_11_CAL_DATA_EXT 0x006d
|
||||||
|
|
||||||
|
#define HostCmd_CMD_WMM_ADDTS_REQ 0x006E
|
||||||
|
#define HostCmd_CMD_WMM_DELTS_REQ 0x006F
|
||||||
|
#define HostCmd_CMD_WMM_QUEUE_CONFIG 0x0070
|
||||||
|
#define HostCmd_CMD_WMM_GET_STATUS 0x0071
|
||||||
|
|
||||||
|
#define HostCmd_CMD_802_11_TPC_CFG 0x0072
|
||||||
|
|
||||||
|
#define HostCmd_CMD_802_11_FW_WAKE_METHOD 0x0074
|
||||||
|
|
||||||
|
#define HostCmd_CMD_802_11_LED_CONTROL 0x004e
|
||||||
|
|
||||||
|
#define HostCmd_CMD_802_11_SUBSCRIBE_EVENT 0x0075
|
||||||
|
|
||||||
|
#define HostCmd_CMD_802_11_RATE_ADAPT_RATESET 0x0076
|
||||||
|
|
||||||
|
#define HostCmd_CMD_802_11_CRYPTO 0x0078
|
||||||
|
|
||||||
|
#define HostCmd_CMD_802_11_TX_RATE_QUERY 0x007f
|
||||||
|
|
||||||
|
#define HostCmd_CMD_802_11_POWER_ADAPT_CFG_EXT 0x007e
|
||||||
|
|
||||||
|
#define HostCmd_CMD_GET_TSF 0x0080
|
||||||
|
|
||||||
|
#define HostCmd_CMD_WMM_QUEUE_STATS 0x0081
|
||||||
|
|
||||||
|
#define HostCmd_CMD_802_11_AUTO_TX 0x0082
|
||||||
|
#define HostCmd_CMD_802_11_IBSS_COALESCING_STATUS 0x0083
|
||||||
|
|
||||||
|
#define HostCmd_CMD_MEM_ACCESS 0x0086
|
||||||
|
|
||||||
|
#ifdef MFG_CMD_SUPPORT
|
||||||
|
#define HostCmd_CMD_MFG_COMMAND 0x0089
|
||||||
|
#define HostCmd_RET_MFG_COMMAND 0x8089
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define HostCmd_CMD_TX_PKT_STATS 0x008d
|
||||||
|
|
||||||
|
#define HostCmd_CMD_802_11_LDO_CONFIG 0x0096
|
||||||
|
|
||||||
|
#define HostCmd_CMD_VERSION_EXT 0x0097
|
||||||
|
|
||||||
|
/* For the IEEE Power Save */
|
||||||
|
#define HostCmd_SubCmd_Enter_PS 0x0030
|
||||||
|
#define HostCmd_SubCmd_Exit_PS 0x0031
|
||||||
|
#define HostCmd_SubCmd_Sleep_Confirmed 0x0034
|
||||||
|
#define HostCmd_SubCmd_Full_PowerDown 0x0035
|
||||||
|
#define HostCmd_SubCmd_Full_PowerUp 0x0036
|
||||||
|
|
||||||
|
/* Command RET code, MSB is set to 1 */
|
||||||
|
#define HostCmd_RET_HW_SPEC_INFO 0x8003
|
||||||
|
#define HostCmd_RET_802_11_RESET 0x8005
|
||||||
|
#define HostCmd_RET_802_11_SCAN 0x8006
|
||||||
|
#define HostCmd_RET_802_11_GET_LOG 0x800b
|
||||||
|
#define HostCmd_RET_MAC_CONTROL 0x8028
|
||||||
|
#define HostCmd_RET_MAC_MULTICAST_ADR 0x8010
|
||||||
|
#define HostCmd_RET_802_11_DEAUTHENTICATE 0x8024
|
||||||
|
#define HostCmd_RET_802_11_ASSOCIATE 0x8012
|
||||||
|
#define HostCmd_RET_802_11_SET_WEP 0x8013
|
||||||
|
#define HostCmd_RET_802_3_STAT 0x8015
|
||||||
|
#define HostCmd_RET_802_11_SNMP_MIB 0x8016
|
||||||
|
#define HostCmd_RET_MAC_REG_ACCESS 0x8019
|
||||||
|
#define HostCmd_RET_BBP_REG_ACCESS 0x801a
|
||||||
|
#define HostCmd_RET_RF_REG_ACCESS 0x801b
|
||||||
|
#define HostCmd_RET_802_11_RADIO_CONTROL 0x801c
|
||||||
|
#define HostCmd_RET_802_11_RF_CHANNEL 0x801d
|
||||||
|
#define HostCmd_RET_802_11_RSSI 0x801f
|
||||||
|
#define HostCmd_RET_802_11_RF_TX_POWER 0x801e
|
||||||
|
#define HostCmd_RET_802_11_RF_ANTENNA 0x8020
|
||||||
|
#define HostCmd_RET_802_11_PS_MODE 0x8021
|
||||||
|
|
||||||
|
#define HostCmd_RET_802_11_AD_HOC_START 0x802B
|
||||||
|
#define HostCmd_RET_802_11_AD_HOC_JOIN 0x802C
|
||||||
|
|
||||||
|
#define HostCmd_RET_802_11_KEY_MATERIAL 0x805e
|
||||||
|
|
||||||
|
#define HostCmd_ACT_SET 0x0001
|
||||||
|
#define HostCmd_ACT_GET 0x0000
|
||||||
|
|
||||||
|
#define HostCmd_RET_802_11_AD_HOC_STOP 0x8040
|
||||||
|
|
||||||
|
#define HostCmd_RET_802_11_HOST_SLEEP_CFG 0x8043
|
||||||
|
#define HostCmd_RET_802_11_WAKEUP_CONFIRM 0x8044
|
||||||
|
|
||||||
|
#define HostCmd_RET_802_11_MAC_ADDRESS 0x804D
|
||||||
|
#define HostCmd_RET_802_11_EEPROM_ACCESS 0x8059
|
||||||
|
|
||||||
|
#define HostCmd_RET_CMD_GSPI_BUS_CONFIG 0x805A
|
||||||
|
|
||||||
|
#define HostCmd_RET_802_11_BAND_CONFIG 0x8058
|
||||||
|
|
||||||
|
#define HostCmd_RET_802_11_SLEEP_PARAMS 0x8066
|
||||||
|
|
||||||
|
#define HostCmd_RET_802_11_INACTIVITY_TIMEOUT 0x8067
|
||||||
|
|
||||||
|
#define HostCmd_RET_802_11_SLEEP_PERIOD 0x8068
|
||||||
|
#define HostCmd_RET_802_11_BCA_CONFIG_TIMESHARE 0x8069
|
||||||
|
|
||||||
|
#define HostCmd_RET_802_11D_DOMAIN_INFO 0x805B
|
||||||
|
|
||||||
|
#define HostCmd_RET_802_11_BG_SCAN_CONFIG 0x806b
|
||||||
|
#define HostCmd_RET_802_11_BG_SCAN_QUERY 0x806c
|
||||||
|
|
||||||
|
#define HostCmd_RET_802_11_CAL_DATA_EXT 0x806d
|
||||||
|
|
||||||
|
#define HostCmd_RET_WMM_ADDTS_REQ 0x806E
|
||||||
|
#define HostCmd_RET_WMM_DELTS_REQ 0x806F
|
||||||
|
#define HostCmd_RET_WMM_QUEUE_CONFIG 0x8070
|
||||||
|
#define HostCmd_RET_WMM_GET_STATUS 0x8071
|
||||||
|
|
||||||
|
#define HostCmd_RET_802_11_TPC_CFG 0x8072
|
||||||
|
|
||||||
|
#define HostCmd_RET_802_11_LED_CONTROL 0x804e
|
||||||
|
|
||||||
|
#define HostCmd_RET_802_11_FW_WAKE_METHOD 0x8074
|
||||||
|
|
||||||
|
#define HostCmd_RET_802_11_SUBSCRIBE_EVENT 0x8075
|
||||||
|
|
||||||
|
#define HostCmd_RET_802_11_RATE_ADAPT_RATESET 0x8076
|
||||||
|
|
||||||
|
#define HostCmd_RET_802_11_CRYPTO 0x8078
|
||||||
|
|
||||||
|
#define HostCmd_RTE_802_11_TX_RATE_QUERY 0x807f
|
||||||
|
|
||||||
|
#define HostCmd_RET_GET_TSF 0x8080
|
||||||
|
|
||||||
|
#define HostCmd_RET_WMM_QUEUE_STATS 0x8081
|
||||||
|
|
||||||
|
#define HostCmd_RET_802_11_POWER_ADAPT_CFG_EXT 0x807e
|
||||||
|
|
||||||
|
#define HostCmd_RET_802_11_AUTO_TX 0x8082
|
||||||
|
#define HostCmd_RET_802_11_IBSS_COALESCING_STATUS 0x8083
|
||||||
|
|
||||||
|
#define HostCmd_RET_MEM_ACCESS 0x8086
|
||||||
|
|
||||||
|
#define HostCmd_RET_802_11_LDO_CONFIG 0x8096
|
||||||
|
|
||||||
|
#define HostCmd_RET_VERSION_EXT 0x8097
|
||||||
|
|
||||||
|
/** General Result Code*/
|
||||||
|
/* OK */
|
||||||
|
#define HostCmd_RESULT_OK 0x0000
|
||||||
|
/* Genenral error */
|
||||||
|
#define HostCmd_RESULT_ERROR 0x0001
|
||||||
|
/* Command is not valid */
|
||||||
|
#define HostCmd_RESULT_NOT_SUPPORT 0x0002
|
||||||
|
/* Command is pending */
|
||||||
|
#define HostCmd_RESULT_PENDING 0x0003
|
||||||
|
/* System is busy (command ignored) */
|
||||||
|
#define HostCmd_RESULT_BUSY 0x0004
|
||||||
|
/* Data buffer is not big enough */
|
||||||
|
#define HostCmd_RESULT_PARTIAL_DATA 0x0005
|
||||||
|
|
||||||
|
/* Definition of action or option for each command */
|
||||||
|
|
||||||
|
/* Define general purpose action */
|
||||||
|
#define HostCmd_ACT_GEN_READ 0x0000
|
||||||
|
#define HostCmd_ACT_GEN_WRITE 0x0001
|
||||||
|
#define HostCmd_ACT_GEN_GET 0x0000
|
||||||
|
#define HostCmd_ACT_GEN_SET 0x0001
|
||||||
|
#define HostCmd_ACT_GEN_REMOVE 0x0002
|
||||||
|
#define HostCmd_ACT_GEN_OFF 0x0000
|
||||||
|
#define HostCmd_ACT_GEN_ON 0x0001
|
||||||
|
|
||||||
|
/* Define action or option for HostCmd_CMD_802_11_SET_WEP */
|
||||||
|
#define HostCmd_ACT_ADD 0x0002
|
||||||
|
#define HostCmd_ACT_REMOVE 0x0004
|
||||||
|
|
||||||
|
#define HostCmd_TYPE_WEP_40_BIT 0x0001
|
||||||
|
#define HostCmd_TYPE_WEP_104_BIT 0x0002
|
||||||
|
|
||||||
|
#define HostCmd_WEP_KEY_INDEX_MASK 0x3fff
|
||||||
|
|
||||||
|
/* Define action or option for HostCmd_CMD_802_11_SCAN */
|
||||||
|
#define HostCmd_BSS_TYPE_BSS 0x0001
|
||||||
|
#define HostCmd_BSS_TYPE_IBSS 0x0002
|
||||||
|
#define HostCmd_BSS_TYPE_ANY 0x0003
|
||||||
|
|
||||||
|
/* Define action or option for HostCmd_CMD_802_11_SCAN */
|
||||||
|
#define HostCmd_SCAN_TYPE_ACTIVE 0x0000
|
||||||
|
#define HostCmd_SCAN_TYPE_PASSIVE 0x0001
|
||||||
|
|
||||||
|
/* Radio type definitions for the channel TLV */
|
||||||
|
#define HostCmd_SCAN_RADIO_TYPE_BG 0
|
||||||
|
#define HostCmd_SCAN_RADIO_TYPE_A 1
|
||||||
|
|
||||||
|
/* Define action or option for HostCmd_CMD_MAC_CONTROL */
|
||||||
|
#define HostCmd_ACT_MAC_RX_ON 0x0001
|
||||||
|
#define HostCmd_ACT_MAC_TX_ON 0x0002
|
||||||
|
#define HostCmd_ACT_MAC_LOOPBACK_ON 0x0004
|
||||||
|
#define HostCmd_ACT_MAC_WEP_ENABLE 0x0008
|
||||||
|
#define HostCmd_ACT_MAC_ETHERNETII_ENABLE 0x0010
|
||||||
|
#define HostCmd_ACT_MAC_PROMISCUOUS_ENABLE 0x0080
|
||||||
|
#define HostCmd_ACT_MAC_ALL_MULTICAST_ENABLE 0x0100
|
||||||
|
#define HostCmd_ACT_MAC_STRICT_PROTECTION_ENABLE 0x0400
|
||||||
|
#define HostCmd_ACT_MAC_ADHOC_G_PROTECTION_ON 0x2000
|
||||||
|
|
||||||
|
/* Define action or option or constant for HostCmd_CMD_MAC_MULTICAST_ADR */
|
||||||
|
#define HostCmd_SIZE_MAC_ADR 6
|
||||||
|
#define HostCmd_MAX_MCAST_ADRS 32
|
||||||
|
|
||||||
|
#define RADIO_ON 0x01
|
||||||
|
#define RADIO_OFF 0x00
|
||||||
|
|
||||||
|
/* Define action or option for CMD_802_11_RF_CHANNEL */
|
||||||
|
#define HostCmd_OPT_802_11_RF_CHANNEL_GET 0x00
|
||||||
|
#define HostCmd_OPT_802_11_RF_CHANNEL_SET 0x01
|
||||||
|
|
||||||
|
#define HostCmd_ACT_SET_RX 0x0001
|
||||||
|
#define HostCmd_ACT_SET_TX 0x0002
|
||||||
|
#define HostCmd_ACT_SET_BOTH 0x0003
|
||||||
|
#define HostCmd_ACT_GET_RX 0x0004
|
||||||
|
#define HostCmd_ACT_GET_TX 0x0008
|
||||||
|
#define HostCmd_ACT_GET_BOTH 0x000c
|
||||||
|
|
||||||
|
/** Card Event definition */
|
||||||
|
#define MACREG_INT_CODE_DUMMY_HOST_WAKEUP_SIGNAL 0x00000001
|
||||||
|
#define MACREG_INT_CODE_LINK_LOST_WITH_SCAN 0x00000002
|
||||||
|
#define MACREG_INT_CODE_LINK_LOST 0x00000003
|
||||||
|
#define MACREG_INT_CODE_LINK_SENSED 0x00000004
|
||||||
|
#define MACREG_INT_CODE_MIB_CHANGED 0x00000006
|
||||||
|
#define MACREG_INT_CODE_INIT_DONE 0x00000007
|
||||||
|
#define MACREG_INT_CODE_DEAUTHENTICATED 0x00000008
|
||||||
|
#define MACREG_INT_CODE_DISASSOCIATED 0x00000009
|
||||||
|
#define MACREG_INT_CODE_PS_AWAKE 0x0000000a
|
||||||
|
#define MACREG_INT_CODE_PS_SLEEP 0x0000000b
|
||||||
|
#define MACREG_INT_CODE_MIC_ERR_MULTICAST 0x0000000d
|
||||||
|
#define MACREG_INT_CODE_MIC_ERR_UNICAST 0x0000000e
|
||||||
|
#define MACREG_INT_CODE_WM_AWAKE 0x0000000f
|
||||||
|
#define MACREG_INT_CODE_DEEP_SLEEP_AWAKE 0x00000010
|
||||||
|
#define MACREG_INT_CODE_ADHOC_BCN_LOST 0x00000011
|
||||||
|
#define MACREG_INT_CODE_HOST_SLEEP_AWAKE 0x00000012
|
||||||
|
#define MACREG_INT_CODE_WMM_STATUS_CHANGE 0x00000017
|
||||||
|
#define MACREG_INT_CODE_BG_SCAN_REPORT 0x00000018
|
||||||
|
#define MACREG_INT_CODE_RSSI_LOW 0x00000019
|
||||||
|
#define MACREG_INT_CODE_SNR_LOW 0x0000001a
|
||||||
|
#define MACREG_INT_CODE_MAX_FAIL 0x0000001b
|
||||||
|
#define MACREG_INT_CODE_RSSI_HIGH 0x0000001c
|
||||||
|
#define MACREG_INT_CODE_SNR_HIGH 0x0000001d
|
||||||
|
#define MACREG_INT_CODE_IBSS_COALESCED 0x0000001e
|
||||||
|
|
||||||
|
/* Define bitmap conditions for HOST_SLEEP_CFG */
|
||||||
|
#define HOST_SLEEP_CFG_CANCEL 0xffffffff
|
||||||
|
|
||||||
|
#endif /* _HOST_H_ */
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,44 @@
|
||||||
|
/** @file include.h
|
||||||
|
*
|
||||||
|
* @brief This file contains all the necessary include file.
|
||||||
|
*
|
||||||
|
* Copyright © Marvell International Ltd. and/or its affiliates, 2003-2007
|
||||||
|
*/
|
||||||
|
/********************************************************
|
||||||
|
Change log:
|
||||||
|
10/11/05: Add Doxygen format comments
|
||||||
|
01/11/06: Conditional include file removal/addition
|
||||||
|
01/30/06: Add kernel 2.6 support
|
||||||
|
|
||||||
|
********************************************************/
|
||||||
|
|
||||||
|
#ifndef _INCLUDE_H_
|
||||||
|
#define _INCLUDE_H_
|
||||||
|
|
||||||
|
#include "..\os\os_headers.h"
|
||||||
|
#include "wlan_debug.h"
|
||||||
|
#include "wlan_types.h"
|
||||||
|
#include "wlan_defs.h"
|
||||||
|
#include "wlan_thread.h" //dennis
|
||||||
|
|
||||||
|
#include "wlan_wmm.h"
|
||||||
|
#include "wlan_11d.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#include "host.h"
|
||||||
|
#include "hostcmd.h"
|
||||||
|
|
||||||
|
#include "wlan_scan.h"
|
||||||
|
#include "wlan_join.h"
|
||||||
|
|
||||||
|
#include "wlan_dev.h"
|
||||||
|
|
||||||
|
|
||||||
|
#include "sbi.h"
|
||||||
|
|
||||||
|
#include "..\spi\gspi_io.h"
|
||||||
|
|
||||||
|
#include "wlan_wext.h"
|
||||||
|
#include "wlan_decl.h"
|
||||||
|
#endif /* _INCLUDE_H_ */
|
|
@ -0,0 +1,153 @@
|
||||||
|
#include <rtthread.h>
|
||||||
|
#include <netif/ethernetif.h>
|
||||||
|
|
||||||
|
#include "rt_wlan_dev.h"
|
||||||
|
#include "wlan_dev.h"
|
||||||
|
#include <rtthread.h>
|
||||||
|
#define WLAN_DEV 1
|
||||||
|
#if WLAN_DEV
|
||||||
|
#define DEV_TRACE rt_kprintf
|
||||||
|
#else
|
||||||
|
#define DEV_TRACE(...)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define MAX_ADDR_LEN 6
|
||||||
|
|
||||||
|
static struct rt_wlan_dev wlan_eth;
|
||||||
|
|
||||||
|
extern int wlan_init_module(struct rt_wlan_dev * wlan_dev);
|
||||||
|
/* RT-Thread Device Interface */
|
||||||
|
/* initialize the interface */
|
||||||
|
static rt_err_t rt_wlan_dev_init(rt_device_t dev)
|
||||||
|
{
|
||||||
|
return RT_EOK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static rt_err_t rt_wlan_dev_open(rt_device_t dev, rt_uint16_t oflag)
|
||||||
|
{
|
||||||
|
rt_err_t error=RT_EOK;
|
||||||
|
|
||||||
|
if(dev==RT_NULL||dev->user_data==RT_NULL)
|
||||||
|
{
|
||||||
|
error=-RT_EEMPTY;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
done:
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
static rt_err_t rt_wlan_dev_close(rt_device_t dev)
|
||||||
|
{
|
||||||
|
|
||||||
|
return RT_EOK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static rt_size_t rt_wlan_dev_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size)
|
||||||
|
{
|
||||||
|
rt_set_errno(-RT_ENOSYS);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static rt_size_t rt_wlan_dev_write (rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size)
|
||||||
|
{
|
||||||
|
rt_set_errno(-RT_ENOSYS);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
rt_err_t rt_wlan_dev_control(rt_device_t dev, rt_uint8_t cmd, void *args)
|
||||||
|
{
|
||||||
|
rt_err_t error=RT_EOK;
|
||||||
|
struct rt_wlan_dev * wlan_dev;
|
||||||
|
wlan_private *priv = NULL;
|
||||||
|
struct WLAN_IO_CTRL_PAR * par;
|
||||||
|
char addressbuf[6]={0xff,0xff,0xff,0xff,0xff,0xff};
|
||||||
|
if(dev==RT_NULL||dev->user_data==RT_NULL)
|
||||||
|
{
|
||||||
|
error=-RT_EEMPTY;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
wlan_dev=dev->user_data;
|
||||||
|
priv=wlan_dev->priv;
|
||||||
|
switch (cmd)
|
||||||
|
{
|
||||||
|
case NIOCTL_GADDR:
|
||||||
|
/* get mac address */
|
||||||
|
//if (args) rt_memcpy(args, dm9000_device.dev_addr, 6);
|
||||||
|
//else return -RT_ERROR;
|
||||||
|
|
||||||
|
|
||||||
|
if(rt_memcmp(priv->adapter->CurrentAddr,addressbuf,6)==0)
|
||||||
|
{
|
||||||
|
error=-RT_ERROR;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
rt_memcpy((u8*)args,priv->adapter->CurrentAddr,6);
|
||||||
|
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default :
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
done:
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
/* ethernet device interface */
|
||||||
|
/* transmit packet. */
|
||||||
|
extern void
|
||||||
|
netif_set_addr(struct netif *netif, struct ip_addr *ipaddr, struct ip_addr *netmask,
|
||||||
|
struct ip_addr *gw);
|
||||||
|
int wlan_set_addr(rt_uint32_t ipaddr,rt_uint32_t mask,rt_uint32_t gwaddr)
|
||||||
|
{
|
||||||
|
struct ip_addr myip,gwip,maskip;
|
||||||
|
/* myip 192.168.1.66->C0,A8,1,42*/
|
||||||
|
myip.addr=ipaddr;
|
||||||
|
/*gwip 192.168.1.1->C0,A8,1,1 */
|
||||||
|
gwip.addr=gwaddr;
|
||||||
|
/*maskip255.255.255.0,FF,FF,FF,0*/
|
||||||
|
maskip.addr=mask;
|
||||||
|
netif_set_addr(wlan_eth.parent.netif,&myip,&maskip,&gwip);
|
||||||
|
}
|
||||||
|
extern rt_err_t rt_wlan_dev_tx( rt_device_t dev, struct pbuf* p);
|
||||||
|
extern struct pbuf *rt_wlan_dev_rx(rt_device_t dev);
|
||||||
|
int rt_hw_wlan_dev_init(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
rt_int32_t value=0;
|
||||||
|
rt_err_t error=RT_EOK;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* SRAM Tx/Rx pointer automatically return to start address,
|
||||||
|
* Packet Transmitted, Packet Received
|
||||||
|
*/
|
||||||
|
wlan_eth.parent.parent.init = rt_wlan_dev_init;
|
||||||
|
wlan_eth.parent.parent.open = rt_wlan_dev_open;
|
||||||
|
wlan_eth.parent.parent.close = rt_wlan_dev_close;
|
||||||
|
wlan_eth.parent.parent.read = rt_wlan_dev_read;
|
||||||
|
wlan_eth.parent.parent.write = rt_wlan_dev_write;
|
||||||
|
wlan_eth.parent.parent.control = rt_wlan_dev_control;
|
||||||
|
wlan_eth.parent.parent.user_data =(void *)&wlan_eth ;
|
||||||
|
|
||||||
|
wlan_eth.parent.eth_rx = rt_wlan_dev_rx;
|
||||||
|
wlan_eth.parent.eth_tx = rt_wlan_dev_tx;
|
||||||
|
value=gspihost_init();
|
||||||
|
if(value<0)
|
||||||
|
{
|
||||||
|
error=-RT_ERROR;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
value=wlan_init_module(&wlan_eth);
|
||||||
|
if(value<0)
|
||||||
|
{
|
||||||
|
error=-RT_ERROR;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
eth_device_init(&(wlan_eth.parent), "wlan_eth0");
|
||||||
|
done:
|
||||||
|
return error;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
#ifndef __RT_WLAN_DEV_H__
|
||||||
|
#define __RT_WLAN_DEV_H__
|
||||||
|
#include <netif/ethernetif.h>
|
||||||
|
#include "lwipopts.h"
|
||||||
|
#include "wlan_types.h"
|
||||||
|
#define WLANMACADDRESSLENGTH (6)
|
||||||
|
//#define CMD
|
||||||
|
struct WLAN_IO_CTRL_PAR
|
||||||
|
{
|
||||||
|
|
||||||
|
/** parameters Header */
|
||||||
|
u16 inputlength;
|
||||||
|
u16 outputlength;
|
||||||
|
|
||||||
|
/** Command Body */
|
||||||
|
union
|
||||||
|
{
|
||||||
|
u8 MacAdd[MRVDRV_ETH_ADDR_LEN];
|
||||||
|
} params;
|
||||||
|
};
|
||||||
|
struct rt_wlan_dev
|
||||||
|
{
|
||||||
|
/* inherit from ethernet device */
|
||||||
|
struct eth_device parent;
|
||||||
|
void * priv ;
|
||||||
|
unsigned int irq;
|
||||||
|
char name[16];
|
||||||
|
char dev_addr[6];
|
||||||
|
};
|
||||||
|
|
||||||
|
int rt_hw_wlan_dev_init(void);
|
||||||
|
#endif
|
|
@ -0,0 +1,106 @@
|
||||||
|
/** @file sbi.h
|
||||||
|
*
|
||||||
|
* @brief This file contains IF layer definitions.
|
||||||
|
*
|
||||||
|
* Copyright © Marvell International Ltd. and/or its affiliates, 2003-2006
|
||||||
|
*/
|
||||||
|
/********************************************************
|
||||||
|
Change log:
|
||||||
|
10/11/05: Add Doxygen format comments
|
||||||
|
01/05/06: Add kernel 2.6.x support
|
||||||
|
|
||||||
|
********************************************************/
|
||||||
|
|
||||||
|
#ifndef _SBI_H_
|
||||||
|
#define _SBI_H_
|
||||||
|
|
||||||
|
/**Bit Definition*/
|
||||||
|
#define B_BIT_0 0x01
|
||||||
|
#define B_BIT_1 0x02
|
||||||
|
#define B_BIT_2 0x04
|
||||||
|
#define B_BIT_3 0x08
|
||||||
|
#define B_BIT_4 0x10
|
||||||
|
#define B_BIT_5 0x20
|
||||||
|
#define B_BIT_6 0x40
|
||||||
|
#define B_BIT_7 0x80
|
||||||
|
#define B_BIT_8 0x100
|
||||||
|
#define B_BIT_9 0X200
|
||||||
|
#define B_BIT_10 0x400
|
||||||
|
|
||||||
|
/** INT Status Bit Definition*/
|
||||||
|
#define HIS_RxUpLdRdy B_BIT_0
|
||||||
|
#define HIS_TxDnLdRdy B_BIT_1
|
||||||
|
#define HIS_CmdDnLdRdy B_BIT_2
|
||||||
|
#define HIS_CardEvent B_BIT_3
|
||||||
|
#define HIS_CmdUpLdRdy B_BIT_4
|
||||||
|
#define HIS_WrFifoOvrflow B_BIT_5
|
||||||
|
#define HIS_RdFifoUndrflow B_BIT_6
|
||||||
|
#define HIS_WlanReady B_BIT_7
|
||||||
|
|
||||||
|
#define HIM_DISABLE 0xff
|
||||||
|
#define HIM_ENABLE 0x03
|
||||||
|
|
||||||
|
#define FIRMWARE_READY 0xfedc
|
||||||
|
#ifndef DEV_NAME_LEN
|
||||||
|
#define DEV_NAME_LEN 32
|
||||||
|
#endif
|
||||||
|
#define MAXKEYLEN 13
|
||||||
|
|
||||||
|
/* The number of times to try when polling for status bits */
|
||||||
|
#define MAX_POLL_TRIES 100
|
||||||
|
|
||||||
|
/* The number of times to try when waiting for downloaded firmware to
|
||||||
|
become active. (polling the scratch register). */
|
||||||
|
|
||||||
|
#define MAX_FIRMWARE_POLL_TRIES 100
|
||||||
|
|
||||||
|
#define FIRMWARE_TRANSFER_NBLOCK 2
|
||||||
|
#define SBI_EVENT_CAUSE_SHIFT 3
|
||||||
|
|
||||||
|
#define GSPI_BUS_DELAY_TIME_MODE 1
|
||||||
|
#define GSPI_BUS_DELAY_CLK_MODE 0
|
||||||
|
|
||||||
|
typedef enum _mv_sd_type
|
||||||
|
{
|
||||||
|
MVSD_DAT = 0,
|
||||||
|
MVSD_CMD = 1,
|
||||||
|
MVSD_EVENT = 3
|
||||||
|
} mv_sd_type;
|
||||||
|
|
||||||
|
/** Function Prototype Declaration */
|
||||||
|
typedef wlan_private *(*wlan_notifier_fn_add) (void *dev_id);
|
||||||
|
typedef int (*wlan_notifier_fn_remove) (void *dev_id);
|
||||||
|
|
||||||
|
//typedef IRQ_RET_TYPE(*isr_notifier_fn_t) (s32 irq, void *dev_id,struct pt_regs * reg);
|
||||||
|
typedef IRQ_RET_TYPE(*isr_notifier_fn_t) (s32 irq, void *dev_id,void* reg);
|
||||||
|
typedef IRQ_RET_TYPE(*handler_fn_t) (s32 irq, void *dev_id, void *);
|
||||||
|
|
||||||
|
/* Probe and Check if the card is present*/
|
||||||
|
int sbi_probe_card(void *card);
|
||||||
|
int sbi_register_dev(wlan_private * priv);
|
||||||
|
int sbi_disable_host_int(wlan_private * priv);
|
||||||
|
int sbi_get_int_status(wlan_private * priv, u8 *);
|
||||||
|
int sbi_register(wlan_notifier_fn_add, wlan_notifier_fn_remove, void *);
|
||||||
|
void sbi_unregister(void);
|
||||||
|
int sbi_prog_firmware(wlan_private *);
|
||||||
|
//int sbi_verify_fw_download(wlan_private *);
|
||||||
|
|
||||||
|
int sbi_prog_helper(wlan_private *);
|
||||||
|
int sbi_prog_firmware_w_helper(wlan_private *);
|
||||||
|
|
||||||
|
int sbi_read_event_cause(wlan_private *);
|
||||||
|
//int sbi_host_to_card(wlan_private * priv, u8 type, u8 * payload, u16 nb);
|
||||||
|
int sbi_card_to_host(wlan_private * priv, u32 type, u32 * nb, u8 * payload,
|
||||||
|
u16 npayload);
|
||||||
|
int sbi_enable_host_int(wlan_private *);
|
||||||
|
|
||||||
|
int sbi_exit_deep_sleep(wlan_private *);
|
||||||
|
int sbi_reset_deepsleep_wakeup(wlan_private *);
|
||||||
|
#ifdef ENABLE_PM
|
||||||
|
int sbi_suspend(wlan_private *);
|
||||||
|
int sbi_resume(wlan_private *);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int sbi_get_cis_info(wlan_private * priv);
|
||||||
|
|
||||||
|
#endif /* _SBI_H */
|
|
@ -0,0 +1,891 @@
|
||||||
|
/** @file wlan_11d.c
|
||||||
|
* @brief This file contains functions for 802.11D.
|
||||||
|
*
|
||||||
|
* Copyright © Marvell International Ltd. and/or its affiliates, 2003-2006
|
||||||
|
*/
|
||||||
|
/********************************************************
|
||||||
|
Change log:
|
||||||
|
10/04/05: Add Doxygen format comments
|
||||||
|
|
||||||
|
********************************************************/
|
||||||
|
#include "include.h"
|
||||||
|
|
||||||
|
/********************************************************
|
||||||
|
Local Variables
|
||||||
|
********************************************************/
|
||||||
|
#define TX_PWR_DEFAULT 10
|
||||||
|
|
||||||
|
static region_code_mapping_t region_code_mapping[] = {
|
||||||
|
{"US ", 0x10}, /* US FCC */
|
||||||
|
{"CA ", 0x20}, /* IC Canada */
|
||||||
|
{"SG ", 0x10}, /* Singapore */
|
||||||
|
{"EU ", 0x30}, /* ETSI */
|
||||||
|
{"AU ", 0x30}, /* Australia */
|
||||||
|
{"KR ", 0x30}, /* Republic Of Korea */
|
||||||
|
{"ES ", 0x31}, /* Spain */
|
||||||
|
{"FR ", 0x32}, /* France */
|
||||||
|
{"JP ", 0x40}, /* Japan */
|
||||||
|
{"JP ", 0x41}, /* Japan */
|
||||||
|
};
|
||||||
|
|
||||||
|
/********************************************************
|
||||||
|
Global Variables
|
||||||
|
********************************************************/
|
||||||
|
/* Following 2 structure defines the supported channels */
|
||||||
|
CHANNEL_FREQ_POWER channel_freq_power_UN_BG[] = {
|
||||||
|
{1, 2412, TX_PWR_DEFAULT},
|
||||||
|
{2, 2417, TX_PWR_DEFAULT},
|
||||||
|
{3, 2422, TX_PWR_DEFAULT},
|
||||||
|
{4, 2427, TX_PWR_DEFAULT},
|
||||||
|
{5, 2432, TX_PWR_DEFAULT},
|
||||||
|
{6, 2437, TX_PWR_DEFAULT},
|
||||||
|
{7, 2442, TX_PWR_DEFAULT},
|
||||||
|
{8, 2447, TX_PWR_DEFAULT},
|
||||||
|
{9, 2452, TX_PWR_DEFAULT},
|
||||||
|
{10, 2457, TX_PWR_DEFAULT},
|
||||||
|
{11, 2462, TX_PWR_DEFAULT},
|
||||||
|
{12, 2467, TX_PWR_DEFAULT},
|
||||||
|
{13, 2472, TX_PWR_DEFAULT},
|
||||||
|
{14, 2484, TX_PWR_DEFAULT}
|
||||||
|
};
|
||||||
|
|
||||||
|
CHANNEL_FREQ_POWER channel_freq_power_UN_AJ[] = {
|
||||||
|
{8, 5040, TX_PWR_DEFAULT},
|
||||||
|
{12, 5060, TX_PWR_DEFAULT},
|
||||||
|
{16, 5080, TX_PWR_DEFAULT},
|
||||||
|
{34, 5170, TX_PWR_DEFAULT},
|
||||||
|
{38, 5190, TX_PWR_DEFAULT},
|
||||||
|
{42, 5210, TX_PWR_DEFAULT},
|
||||||
|
{46, 5230, TX_PWR_DEFAULT},
|
||||||
|
{36, 5180, TX_PWR_DEFAULT},
|
||||||
|
{40, 5200, TX_PWR_DEFAULT},
|
||||||
|
{44, 5220, TX_PWR_DEFAULT},
|
||||||
|
{48, 5240, TX_PWR_DEFAULT},
|
||||||
|
{52, 5260, TX_PWR_DEFAULT},
|
||||||
|
{56, 5280, TX_PWR_DEFAULT},
|
||||||
|
{60, 5300, TX_PWR_DEFAULT},
|
||||||
|
{64, 5320, TX_PWR_DEFAULT},
|
||||||
|
{100, 5500, TX_PWR_DEFAULT},
|
||||||
|
{104, 5520, TX_PWR_DEFAULT},
|
||||||
|
{108, 5540, TX_PWR_DEFAULT},
|
||||||
|
{112, 5560, TX_PWR_DEFAULT},
|
||||||
|
{116, 5580, TX_PWR_DEFAULT},
|
||||||
|
{120, 5600, TX_PWR_DEFAULT},
|
||||||
|
{124, 5620, TX_PWR_DEFAULT},
|
||||||
|
{128, 5640, TX_PWR_DEFAULT},
|
||||||
|
{132, 5660, TX_PWR_DEFAULT},
|
||||||
|
{136, 5680, TX_PWR_DEFAULT},
|
||||||
|
{140, 5700, TX_PWR_DEFAULT},
|
||||||
|
{149, 5745, TX_PWR_DEFAULT},
|
||||||
|
{153, 5765, TX_PWR_DEFAULT},
|
||||||
|
{157, 5785, TX_PWR_DEFAULT},
|
||||||
|
{161, 5805, TX_PWR_DEFAULT},
|
||||||
|
{165, 5825, TX_PWR_DEFAULT},
|
||||||
|
/* {240, 4920, TX_PWR_DEFAULT},
|
||||||
|
{244, 4940, TX_PWR_DEFAULT},
|
||||||
|
{248, 4960, TX_PWR_DEFAULT},
|
||||||
|
{252, 4980, TX_PWR_DEFAULT},
|
||||||
|
channels for 11J JP 10M channel gap */
|
||||||
|
};
|
||||||
|
|
||||||
|
extern CHANNEL_FREQ_POWER *wlan_get_region_cfp_table(u8 region,
|
||||||
|
u8 band, int *cfp_no);
|
||||||
|
|
||||||
|
/********************************************************
|
||||||
|
Local Functions
|
||||||
|
********************************************************/
|
||||||
|
/**
|
||||||
|
* @brief This function convert Region string to code integer
|
||||||
|
* @param region region string
|
||||||
|
* @return region id
|
||||||
|
*/
|
||||||
|
static u8
|
||||||
|
wlan_region_2_code(s8 * region)
|
||||||
|
{
|
||||||
|
u8 i;
|
||||||
|
u8 size = sizeof(region_code_mapping) / sizeof(region_code_mapping_t);
|
||||||
|
|
||||||
|
for (i = 0; region[i] && i < COUNTRY_CODE_LEN; i++)
|
||||||
|
region[i] = toupper(region[i]);
|
||||||
|
|
||||||
|
for (i = 0; i < size; i++) {
|
||||||
|
if (!memcmp(region, region_code_mapping[i].region, COUNTRY_CODE_LEN))
|
||||||
|
return (region_code_mapping[i].code);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* default is US */
|
||||||
|
return (region_code_mapping[0].code);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function converts interger code to region string
|
||||||
|
* @param code region code
|
||||||
|
* @return region string
|
||||||
|
*/
|
||||||
|
static u8 *
|
||||||
|
wlan_code_2_region(u8 code)
|
||||||
|
{
|
||||||
|
u8 i;
|
||||||
|
u8 size = sizeof(region_code_mapping) / sizeof(region_code_mapping_t);
|
||||||
|
for (i = 0; i < size; i++) {
|
||||||
|
if (region_code_mapping[i].code == code)
|
||||||
|
return (region_code_mapping[i].region);
|
||||||
|
}
|
||||||
|
/* default is US */
|
||||||
|
return (region_code_mapping[0].region);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function finds the NoOfChan-th chan after the firstChan
|
||||||
|
* @param band band
|
||||||
|
* @param firstChan first channel number
|
||||||
|
* @param NoOfChan number of channels
|
||||||
|
* @return the NoOfChan-th chan number
|
||||||
|
*/
|
||||||
|
static BOOLEAN
|
||||||
|
wlan_get_chan_11d(u8 band, u8 firstChan, u8 NoOfChan, u8 * chan)
|
||||||
|
/*find the NoOfChan-th chan after the firstChan*/
|
||||||
|
{
|
||||||
|
u8 i;
|
||||||
|
CHANNEL_FREQ_POWER *cfp;
|
||||||
|
u8 cfp_no;
|
||||||
|
|
||||||
|
// ENTER();
|
||||||
|
|
||||||
|
{
|
||||||
|
cfp = channel_freq_power_UN_BG;
|
||||||
|
cfp_no = sizeof(channel_freq_power_UN_BG) /
|
||||||
|
sizeof(CHANNEL_FREQ_POWER);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < cfp_no; i++) {
|
||||||
|
if ((cfp + i)->Channel == firstChan) {
|
||||||
|
rt_kprintf("firstChan found\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i < cfp_no) {
|
||||||
|
/*if beyond the boundary */
|
||||||
|
if (i + NoOfChan < cfp_no) {
|
||||||
|
*chan = (cfp + i + NoOfChan)->Channel;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// LEAVE();
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function Checks if chan txpwr is learned from AP/IBSS
|
||||||
|
* @param chan chan number
|
||||||
|
* @param parsed_region_chan pointer to parsed_region_chan_11d_t
|
||||||
|
* @return TRUE; FALSE
|
||||||
|
*/
|
||||||
|
BOOLEAN
|
||||||
|
wlan_channel_known_11d(u8 chan, parsed_region_chan_11d_t * parsed_region_chan)
|
||||||
|
{
|
||||||
|
chan_power_11d_t *chanPwr = parsed_region_chan->chanPwr;
|
||||||
|
u8 NoOfChan = parsed_region_chan->NoOfChan;
|
||||||
|
u8 i = 0;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
for (i = 0; i < NoOfChan; i++) {
|
||||||
|
if (chan == chanPwr[i].chan) {
|
||||||
|
wlan_debug3( "11D: Found Chan:%d\n", chan);
|
||||||
|
LEAVE();
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LEAVE();
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/********************************************************
|
||||||
|
Global Functions
|
||||||
|
********************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function Converts chan to frequency
|
||||||
|
* @param chan channel number
|
||||||
|
* @param band band
|
||||||
|
* @return channel frequency
|
||||||
|
*/
|
||||||
|
u32
|
||||||
|
chan_2_freq(u8 chan, u8 band)
|
||||||
|
{
|
||||||
|
CHANNEL_FREQ_POWER *cf;
|
||||||
|
u16 cnt;
|
||||||
|
u16 i;
|
||||||
|
u32 freq = 0;
|
||||||
|
|
||||||
|
// ENTER();
|
||||||
|
|
||||||
|
{
|
||||||
|
cf = channel_freq_power_UN_BG;
|
||||||
|
cnt = sizeof(channel_freq_power_UN_BG) / sizeof(CHANNEL_FREQ_POWER);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < cnt; i++) {
|
||||||
|
if (chan == cf[i].Channel)
|
||||||
|
freq = cf[i].Freq;
|
||||||
|
}
|
||||||
|
|
||||||
|
// LEAVE();
|
||||||
|
return freq;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function generates domaininfo from parsed_region_chan
|
||||||
|
* @param parsed_region_chan pointer to parsed_region_chan_11d_t
|
||||||
|
* @param domaininfo pointer to wlan_802_11d_domain_reg_t
|
||||||
|
* @return WLAN_STATUS_SUCCESS
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
wlan_generate_domain_info_11d(parsed_region_chan_11d_t * parsed_region_chan,
|
||||||
|
wlan_802_11d_domain_reg_t * domaininfo)
|
||||||
|
{
|
||||||
|
u8 NoOfSubband = 0;
|
||||||
|
|
||||||
|
u8 NoOfChan = parsed_region_chan->NoOfChan;
|
||||||
|
u8 NoOfParsedChan = 0;
|
||||||
|
|
||||||
|
u8 firstChan = 0, nextChan = 0, maxPwr = 0;
|
||||||
|
|
||||||
|
u8 i, flag = 0;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
memcpy(domaininfo->CountryCode, parsed_region_chan->CountryCode,COUNTRY_CODE_LEN);
|
||||||
|
|
||||||
|
wlan_debug3("11D:NoOfChan=%d\n", NoOfChan);
|
||||||
|
// HEXDUMP("11D:parsed_region_chan:", (char *) parsed_region_chan,sizeof(parsed_region_chan_11d_t));
|
||||||
|
|
||||||
|
for (i = 0; i < NoOfChan; i++) {
|
||||||
|
if (!flag) {
|
||||||
|
flag = 1;
|
||||||
|
nextChan = firstChan = parsed_region_chan->chanPwr[i].chan;
|
||||||
|
maxPwr = parsed_region_chan->chanPwr[i].pwr;
|
||||||
|
NoOfParsedChan = 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parsed_region_chan->chanPwr[i].chan == nextChan + 1 &&
|
||||||
|
parsed_region_chan->chanPwr[i].pwr == maxPwr) {
|
||||||
|
nextChan++;
|
||||||
|
NoOfParsedChan++;
|
||||||
|
} else {
|
||||||
|
domaininfo->Subband[NoOfSubband].FirstChan = firstChan;
|
||||||
|
domaininfo->Subband[NoOfSubband].NoOfChan = NoOfParsedChan;
|
||||||
|
domaininfo->Subband[NoOfSubband].MaxTxPwr = maxPwr;
|
||||||
|
NoOfSubband++;
|
||||||
|
NoOfParsedChan = 1;
|
||||||
|
nextChan = firstChan = parsed_region_chan->chanPwr[i].chan;
|
||||||
|
maxPwr = parsed_region_chan->chanPwr[i].pwr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flag) {
|
||||||
|
domaininfo->Subband[NoOfSubband].FirstChan = firstChan;
|
||||||
|
domaininfo->Subband[NoOfSubband].NoOfChan = NoOfParsedChan;
|
||||||
|
domaininfo->Subband[NoOfSubband].MaxTxPwr = maxPwr;
|
||||||
|
NoOfSubband++;
|
||||||
|
}
|
||||||
|
domaininfo->NoOfSubband = NoOfSubband;
|
||||||
|
|
||||||
|
wlan_debug3("NoOfSubband=%x\n", domaininfo->NoOfSubband);
|
||||||
|
// HEXDUMP("11D:domaininfo:", (char *) domaininfo,
|
||||||
|
// COUNTRY_CODE_LEN + 1 +
|
||||||
|
// sizeof(IEEEtypes_SubbandSet_t) * NoOfSubband);
|
||||||
|
LEAVE();
|
||||||
|
return WLAN_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function generates parsed_region_chan from Domain Info learned from AP/IBSS
|
||||||
|
* @param region_chan pointer to REGION_CHANNEL
|
||||||
|
* @param *parsed_region_chan pointer to parsed_region_chan_11d_t
|
||||||
|
* @return N/A
|
||||||
|
*/
|
||||||
|
void wlan_generate_parsed_region_chan_11d(REGION_CHANNEL * region_chan,
|
||||||
|
parsed_region_chan_11d_t *
|
||||||
|
parsed_region_chan)
|
||||||
|
{
|
||||||
|
u8 i;
|
||||||
|
CHANNEL_FREQ_POWER *cfp;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
if (region_chan == NULL) {
|
||||||
|
wlan_debug3("11D: region_chan is NULL\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
cfp = region_chan->CFP;
|
||||||
|
if (cfp == NULL) {
|
||||||
|
wlan_debug3( "11D: cfp equal NULL \n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
parsed_region_chan->band = region_chan->Band;
|
||||||
|
parsed_region_chan->region = region_chan->Region;
|
||||||
|
memcpy(parsed_region_chan->CountryCode,
|
||||||
|
wlan_code_2_region(region_chan->Region), COUNTRY_CODE_LEN);
|
||||||
|
|
||||||
|
wlan_debug3("11D: region[0x%x] band[%d]\n", parsed_region_chan->region,
|
||||||
|
parsed_region_chan->band);
|
||||||
|
|
||||||
|
for (i = 0; i < region_chan->NrCFP; i++, cfp++) {
|
||||||
|
parsed_region_chan->chanPwr[i].chan = cfp->Channel;
|
||||||
|
parsed_region_chan->chanPwr[i].pwr = cfp->MaxTxPower;
|
||||||
|
wlan_debug3("11D: Chan[%d] Pwr[%d]\n",
|
||||||
|
parsed_region_chan->chanPwr[i].chan,
|
||||||
|
parsed_region_chan->chanPwr[i].pwr);
|
||||||
|
}
|
||||||
|
parsed_region_chan->NoOfChan = region_chan->NrCFP;
|
||||||
|
|
||||||
|
wlan_debug3("11D: NoOfChan[%d]\n", parsed_region_chan->NoOfChan);
|
||||||
|
|
||||||
|
LEAVE();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief generate parsed_region_chan from Domain Info learned from AP/IBSS
|
||||||
|
* @param region region ID
|
||||||
|
* @param band band
|
||||||
|
* @param chan chan
|
||||||
|
* @return TRUE;FALSE
|
||||||
|
*/
|
||||||
|
BOOLEAN
|
||||||
|
wlan_region_chan_supported_11d(u8 region, u8 band, u8 chan)
|
||||||
|
{
|
||||||
|
CHANNEL_FREQ_POWER *cfp;
|
||||||
|
int cfp_no;
|
||||||
|
u8 idx;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
if ((cfp = wlan_get_region_cfp_table(region, band, &cfp_no)) == NULL) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (idx = 0; idx < cfp_no; idx++) {
|
||||||
|
if (chan == (cfp + idx)->Channel) {
|
||||||
|
/* If Mrvl Chip Supported? */
|
||||||
|
if ((cfp + idx)->Unsupported) {
|
||||||
|
return FALSE;
|
||||||
|
} else {
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*chan is not in the region table */
|
||||||
|
LEAVE();
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function checks if chan txpwr is learned from AP/IBSS
|
||||||
|
* @param chan chan number
|
||||||
|
* @param parsed_region_chan pointer to parsed_region_chan_11d_t
|
||||||
|
* @return WLAN_STATUS_SUCCESS
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
wlan_parse_domain_info_11d(IEEEtypes_CountryInfoFullSet_t * CountryInfo,
|
||||||
|
u8 band,
|
||||||
|
parsed_region_chan_11d_t * parsed_region_chan)
|
||||||
|
{
|
||||||
|
u8 NoOfSubband, NoOfChan;
|
||||||
|
u8 lastChan, firstChan, curChan;
|
||||||
|
u8 region;
|
||||||
|
|
||||||
|
u8 idx = 0; /*chan index in parsed_region_chan */
|
||||||
|
|
||||||
|
u8 j, i;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
/*Validation Rules:
|
||||||
|
1. Valid Region Code
|
||||||
|
2. First Chan increment
|
||||||
|
3. Channel range no overlap
|
||||||
|
4. Channel is valid?
|
||||||
|
5. Channel is supported by Region?
|
||||||
|
6. Others
|
||||||
|
*/
|
||||||
|
|
||||||
|
// HEXDUMP("CountryInfo:", (s8 *) CountryInfo, 30);
|
||||||
|
|
||||||
|
if ((*(CountryInfo->CountryCode)) == 0 ||
|
||||||
|
(CountryInfo->Len <= COUNTRY_CODE_LEN)) {
|
||||||
|
/* No region Info or Wrong region info: treat as No 11D info */
|
||||||
|
LEAVE();
|
||||||
|
return WLAN_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*Step1: check region_code */
|
||||||
|
parsed_region_chan->region = region =
|
||||||
|
wlan_region_2_code(CountryInfo->CountryCode);
|
||||||
|
|
||||||
|
wlan_debug3( "regioncode=%x\n", (u8) parsed_region_chan->region);
|
||||||
|
|
||||||
|
parsed_region_chan->band = band;
|
||||||
|
|
||||||
|
memcpy(parsed_region_chan->CountryCode, CountryInfo->CountryCode,
|
||||||
|
COUNTRY_CODE_LEN);
|
||||||
|
|
||||||
|
NoOfSubband = (CountryInfo->Len - COUNTRY_CODE_LEN) /
|
||||||
|
sizeof(IEEEtypes_SubbandSet_t);
|
||||||
|
|
||||||
|
for (j = 0, lastChan = 0; j < NoOfSubband; j++) {
|
||||||
|
|
||||||
|
if (CountryInfo->Subband[j].FirstChan <= lastChan) {
|
||||||
|
/*Step2&3. Check First Chan Num increment and no overlap */
|
||||||
|
wlan_debug3("11D: Chan[%d>%d] Overlap\n",
|
||||||
|
CountryInfo->Subband[j].FirstChan, lastChan);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
firstChan = CountryInfo->Subband[j].FirstChan;
|
||||||
|
NoOfChan = CountryInfo->Subband[j].NoOfChan;
|
||||||
|
|
||||||
|
for (i = 0; idx < MAX_NO_OF_CHAN && i < NoOfChan; i++) {
|
||||||
|
/*step4: channel is supported? */
|
||||||
|
|
||||||
|
if (wlan_get_chan_11d(band, firstChan, i, &curChan)
|
||||||
|
== FALSE) {
|
||||||
|
/* Chan is not found in UN table */
|
||||||
|
wlan_debug3("chan is not supported: %d \n", i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
lastChan = curChan;
|
||||||
|
|
||||||
|
/*step5: We don't need to Check if curChan is supported by mrvl in region */
|
||||||
|
parsed_region_chan->chanPwr[idx].chan = curChan;
|
||||||
|
parsed_region_chan->chanPwr[idx].pwr =
|
||||||
|
CountryInfo->Subband[j].MaxTxPwr;
|
||||||
|
idx++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*Step6: Add other checking if any */
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
parsed_region_chan->NoOfChan = idx;
|
||||||
|
|
||||||
|
wlan_debug3("NoOfChan=%x\n", parsed_region_chan->NoOfChan);
|
||||||
|
// HEXDUMP("11D:parsed_region_chan:", (s8 *) parsed_region_chan,
|
||||||
|
// 2 + COUNTRY_CODE_LEN + sizeof(parsed_region_chan_11d_t) * idx);
|
||||||
|
|
||||||
|
LEAVE();
|
||||||
|
return WLAN_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function calculates the scan type for channels
|
||||||
|
* @param chan chan number
|
||||||
|
* @param parsed_region_chan pointer to parsed_region_chan_11d_t
|
||||||
|
* @return PASSIVE if chan is unknown; ACTIVE if chan is known
|
||||||
|
*/
|
||||||
|
u8
|
||||||
|
wlan_get_scan_type_11d(u8 chan, parsed_region_chan_11d_t * parsed_region_chan)
|
||||||
|
{
|
||||||
|
u8 scan_type = HostCmd_SCAN_TYPE_PASSIVE;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
if (wlan_channel_known_11d(chan, parsed_region_chan)) {
|
||||||
|
wlan_debug3( "11D: Found and do Active Scan\n");
|
||||||
|
scan_type = HostCmd_SCAN_TYPE_ACTIVE;
|
||||||
|
} else {
|
||||||
|
wlan_debug3( "11D: Not Find and do Passive Scan\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
LEAVE();
|
||||||
|
return scan_type;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function gets if 11D is enabled
|
||||||
|
* @param priv pointer to wlan_private
|
||||||
|
* @return ENABLE_11D;DISABLE_11D
|
||||||
|
*/
|
||||||
|
state_11d_t
|
||||||
|
wlan_get_state_11d(wlan_private * priv)
|
||||||
|
{
|
||||||
|
wlan_adapter *Adapter = priv->adapter;
|
||||||
|
wlan_802_11d_state_t *state = &Adapter->State11D;
|
||||||
|
return (state->Enable11D);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief initialize internal variable for 11D
|
||||||
|
* @param priv pointer to wlan_private
|
||||||
|
* @return N/A
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
wlan_init_11d(wlan_private * priv)
|
||||||
|
{
|
||||||
|
wlan_adapter *Adapter = priv->adapter;
|
||||||
|
wlan_802_11d_state_t *state = &Adapter->State11D;
|
||||||
|
|
||||||
|
state->Enable11D = DISABLE_11D;
|
||||||
|
|
||||||
|
memset(&(priv->adapter->parsed_region_chan), 0,
|
||||||
|
sizeof(parsed_region_chan_11d_t));
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function enable/disable 11D
|
||||||
|
* @param priv pointer to wlan_private
|
||||||
|
* @param flag enable/disable flag
|
||||||
|
* @return WLAN_STATUS_SUCCESS; WLAN_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
wlan_enable_11d(wlan_private * priv, state_11d_t flag)
|
||||||
|
{
|
||||||
|
wlan_adapter *Adapter = priv->adapter;
|
||||||
|
wlan_802_11d_state_t *state = &Adapter->State11D;
|
||||||
|
int ret;
|
||||||
|
state_11d_t enable = flag;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
state->Enable11D = flag;
|
||||||
|
|
||||||
|
/* send cmd to FW to enable/disable 11D fucntion in FW */
|
||||||
|
ret = PrepareAndSendCommand(priv,
|
||||||
|
HostCmd_CMD_802_11_SNMP_MIB,
|
||||||
|
HostCmd_ACT_SET,
|
||||||
|
HostCmd_OPTION_WAITFORRSP,
|
||||||
|
OID_802_11D_ENABLE, &enable);
|
||||||
|
if (ret) {
|
||||||
|
wlan_debug3( "11D: Fail to enable 11D \n");
|
||||||
|
}
|
||||||
|
|
||||||
|
LEAVE();
|
||||||
|
return WLAN_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function sets DOMAIN INFO to FW
|
||||||
|
* @param priv pointer to wlan_private
|
||||||
|
* @return WLAN_STATUS_SUCCESS; WLAN_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
wlan_set_domain_info_11d(wlan_private * priv)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (!wlan_get_state_11d(priv)) {
|
||||||
|
wlan_debug3( "11D: dnld domain Info with 11d disabled\n");
|
||||||
|
return WLAN_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = PrepareAndSendCommand(priv, HostCmd_CMD_802_11D_DOMAIN_INFO,
|
||||||
|
HostCmd_ACT_GEN_SET,
|
||||||
|
HostCmd_OPTION_WAITFORRSP, 0, NULL);
|
||||||
|
if (ret) {
|
||||||
|
wlan_debug3( "11D: Fail to dnld domain Info\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
LEAVE();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function setups scan channels
|
||||||
|
* @param priv pointer to wlan_private
|
||||||
|
* @param band band
|
||||||
|
* @return WLAN_STATUS_SUCCESS
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
wlan_set_universaltable(wlan_private * priv, u8 band)
|
||||||
|
{
|
||||||
|
wlan_adapter *Adapter = priv->adapter;
|
||||||
|
u16 size = sizeof(CHANNEL_FREQ_POWER);
|
||||||
|
u16 i = 0;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
memset(Adapter->universal_channel, 0, sizeof(Adapter->universal_channel));
|
||||||
|
|
||||||
|
{
|
||||||
|
Adapter->universal_channel[i].NrCFP =
|
||||||
|
sizeof(channel_freq_power_UN_BG) / size;
|
||||||
|
wlan_debug3("11D: BG-band NrCFP=%d\n",
|
||||||
|
Adapter->universal_channel[i].NrCFP);
|
||||||
|
|
||||||
|
Adapter->universal_channel[i].CFP = channel_freq_power_UN_BG;
|
||||||
|
Adapter->universal_channel[i].Valid = TRUE;
|
||||||
|
Adapter->universal_channel[i].Region = UNIVERSAL_REGION_CODE;
|
||||||
|
Adapter->universal_channel[i].Band = band;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
LEAVE();
|
||||||
|
return WLAN_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function implements command CMD_802_11D_DOMAIN_INFO
|
||||||
|
* @param priv pointer to wlan_private
|
||||||
|
* @param cmd pointer to cmd buffer
|
||||||
|
* @param cmdno cmd ID
|
||||||
|
* @param CmdOption cmd action
|
||||||
|
* @return WLAN_STATUS_SUCCESS
|
||||||
|
*/
|
||||||
|
int wlan_cmd_802_11d_domain_info(wlan_private * priv,HostCmd_DS_COMMAND * cmd, u16 cmdno,u16 CmdOption)
|
||||||
|
{
|
||||||
|
HostCmd_DS_802_11D_DOMAIN_INFO *pDomainInfo = &cmd->params.domaininfo;
|
||||||
|
MrvlIEtypes_DomainParamSet_t *domain = &pDomainInfo->Domain;
|
||||||
|
wlan_adapter *Adapter = priv->adapter;
|
||||||
|
u8 NoOfSubband = Adapter->DomainReg.NoOfSubband;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
wlan_debug3("NoOfSubband=%x\n", NoOfSubband);
|
||||||
|
|
||||||
|
cmd->Command = wlan_cpu_to_le16(cmdno);
|
||||||
|
pDomainInfo->Action = wlan_cpu_to_le16(CmdOption);
|
||||||
|
if (CmdOption == HostCmd_ACT_GET) {
|
||||||
|
cmd->Size = wlan_cpu_to_le16(sizeof(pDomainInfo->Action) + S_DS_GEN);
|
||||||
|
// HEXDUMP("11D: 802_11D_DOMAIN_INFO:", (u8 *) cmd, (int) (cmd->Size));
|
||||||
|
LEAVE();
|
||||||
|
return WLAN_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
domain->Header.Type = wlan_cpu_to_le16(TLV_TYPE_DOMAIN);
|
||||||
|
memcpy(domain->CountryCode, Adapter->DomainReg.CountryCode,
|
||||||
|
sizeof(domain->CountryCode));
|
||||||
|
|
||||||
|
domain->Header.Len =
|
||||||
|
wlan_cpu_to_le16(NoOfSubband * sizeof(IEEEtypes_SubbandSet_t) +
|
||||||
|
sizeof(domain->CountryCode));
|
||||||
|
|
||||||
|
if (NoOfSubband) {
|
||||||
|
memcpy(domain->Subband, Adapter->DomainReg.Subband,
|
||||||
|
NoOfSubband * sizeof(IEEEtypes_SubbandSet_t));
|
||||||
|
|
||||||
|
cmd->Size = wlan_cpu_to_le16(sizeof(pDomainInfo->Action) +
|
||||||
|
domain->Header.Len +
|
||||||
|
sizeof(MrvlIEtypesHeader_t) + S_DS_GEN);
|
||||||
|
} else {
|
||||||
|
cmd->Size = wlan_cpu_to_le16(sizeof(pDomainInfo->Action) + S_DS_GEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
// HEXDUMP("11D:802_11D_DOMAIN_INFO:", (u8 *) cmd, (int) (cmd->Size));
|
||||||
|
|
||||||
|
LEAVE();
|
||||||
|
|
||||||
|
return WLAN_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function implements private cmd: enable/disable 11D
|
||||||
|
* @param priv pointer to wlan_private
|
||||||
|
* @param wrq pointer to user data
|
||||||
|
* @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
int wlan_cmd_enable_11d(wlan_private * priv, void*wrq)
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
int data = 0;
|
||||||
|
int *val;
|
||||||
|
wlan_adapter *Adapter = priv->adapter;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
data = *((int *) (wrq->u.name + SUBCMD_OFFSET));
|
||||||
|
|
||||||
|
wlan_debug3("Enable 11D: %s\n",
|
||||||
|
(data == CMD_ENABLED) ? "Enable" : "Disable");
|
||||||
|
switch (data) {
|
||||||
|
case CMD_ENABLED:
|
||||||
|
wlan_enable_11d(priv, ENABLE_11D);
|
||||||
|
break;
|
||||||
|
case CMD_DISABLED:
|
||||||
|
wlan_enable_11d(priv, DISABLE_11D);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
data =
|
||||||
|
(Adapter->State11D.Enable11D ==
|
||||||
|
ENABLE_11D) ? CMD_ENABLED : CMD_DISABLED;
|
||||||
|
val = (int *) wrq->u.name;
|
||||||
|
*val = data;
|
||||||
|
#endif
|
||||||
|
LEAVE();
|
||||||
|
return WLAN_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function parses countryinfo from AP and download country info to FW
|
||||||
|
* @param priv pointer to wlan_private
|
||||||
|
* @param resp pointer to command response buffer
|
||||||
|
* @return WLAN_STATUS_SUCCESS; WLAN_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
int wlan_ret_802_11d_domain_info(wlan_private * priv, HostCmd_DS_COMMAND * resp)
|
||||||
|
{
|
||||||
|
HostCmd_DS_802_11D_DOMAIN_INFO_RSP
|
||||||
|
* domaininfo = &resp->params.domaininforesp;
|
||||||
|
MrvlIEtypes_DomainParamSet_t * domain = &domaininfo->Domain;
|
||||||
|
u16 Action = wlan_le16_to_cpu(domaininfo->Action);
|
||||||
|
s16 ret = WLAN_STATUS_SUCCESS;
|
||||||
|
u8 NoOfSubband = 0;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
// HEXDUMP("11D DOMAIN Info Rsp Data:", (u8 *) resp, resp->Size);
|
||||||
|
|
||||||
|
NoOfSubband =
|
||||||
|
(wlan_le16_to_cpu(domain->Header.Len) -
|
||||||
|
3) / sizeof(IEEEtypes_SubbandSet_t);
|
||||||
|
/* countrycode 3 bytes */
|
||||||
|
|
||||||
|
wlan_debug3( "11D Domain Info Resp: NoOfSubband=%d\n", NoOfSubband);
|
||||||
|
|
||||||
|
if (NoOfSubband > MRVDRV_MAX_SUBBAND_802_11D) {
|
||||||
|
wlan_debug3("Invalid Numrer of Subband returned!!\n");
|
||||||
|
return WLAN_STATUS_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (Action) {
|
||||||
|
case HostCmd_ACT_SET: /*Proc Set Action */
|
||||||
|
break;
|
||||||
|
|
||||||
|
case HostCmd_ACT_GET:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
wlan_debug3("Invalid Action:%d\n", domaininfo->Action);
|
||||||
|
ret = WLAN_STATUS_FAILURE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
LEAVE();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function parses countryinfo from AP and download country info to FW
|
||||||
|
* @param priv pointer to wlan_private
|
||||||
|
* @return WLAN_STATUS_SUCCESS; WLAN_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
wlan_parse_dnld_countryinfo_11d(wlan_private * priv)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
wlan_adapter *Adapter = priv->adapter;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
if (Adapter->MediaConnectStatus == WlanMediaStateConnected) {
|
||||||
|
/* Skip new 11d download when roaming */
|
||||||
|
return WLAN_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (wlan_get_state_11d(priv) == ENABLE_11D) {
|
||||||
|
|
||||||
|
memset(&Adapter->parsed_region_chan, 0,
|
||||||
|
sizeof(parsed_region_chan_11d_t));
|
||||||
|
|
||||||
|
ret =
|
||||||
|
wlan_parse_domain_info_11d(&Adapter->pAttemptedBSSDesc->
|
||||||
|
CountryInfo, 0,
|
||||||
|
&Adapter->parsed_region_chan);
|
||||||
|
|
||||||
|
if (ret == WLAN_STATUS_FAILURE) {
|
||||||
|
wlan_debug3( "11D: Err Parse domain_info from AP..\n");
|
||||||
|
LEAVE();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(&Adapter->DomainReg, 0, sizeof(wlan_802_11d_domain_reg_t));
|
||||||
|
wlan_generate_domain_info_11d(&Adapter->parsed_region_chan,
|
||||||
|
&Adapter->DomainReg);
|
||||||
|
|
||||||
|
ret = wlan_set_domain_info_11d(priv);
|
||||||
|
|
||||||
|
if (ret) {
|
||||||
|
wlan_debug3( "11D: Err set domainInfo to FW\n");
|
||||||
|
LEAVE();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LEAVE();
|
||||||
|
return WLAN_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function generates 11D info from user specified regioncode and download to FW
|
||||||
|
* @param priv pointer to wlan_private
|
||||||
|
* @return WLAN_STATUS_SUCCESS; WLAN_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
wlan_create_dnld_countryinfo_11d(wlan_private * priv)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
wlan_adapter *Adapter = priv->adapter;
|
||||||
|
REGION_CHANNEL *region_chan;
|
||||||
|
u8 j;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
wlan_debug3("11D:CurBssParams.Band[%d]\n", Adapter->CurBssParams.band);
|
||||||
|
|
||||||
|
if (wlan_get_state_11d(priv) == ENABLE_11D) {
|
||||||
|
/* update parsed_region_chan_11; dnld domaininf to FW */
|
||||||
|
|
||||||
|
for (j = 0; j < sizeof(Adapter->region_channel) /
|
||||||
|
sizeof(Adapter->region_channel[0]); j++) {
|
||||||
|
region_chan = &Adapter->region_channel[j];
|
||||||
|
|
||||||
|
wlan_debug3( "11D:[%d] region_chan->Band[%d]\n", j,
|
||||||
|
region_chan->Band);
|
||||||
|
|
||||||
|
if (!region_chan || !region_chan->Valid || !region_chan->CFP)
|
||||||
|
continue;
|
||||||
|
if (region_chan->Band != Adapter->CurBssParams.band)
|
||||||
|
continue;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (j >= sizeof(Adapter->region_channel) /
|
||||||
|
sizeof(Adapter->region_channel[0])) {
|
||||||
|
wlan_debug3("11D:region_chan not found. Band[%d]\n",
|
||||||
|
Adapter->CurBssParams.band);
|
||||||
|
LEAVE();
|
||||||
|
return WLAN_STATUS_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(&Adapter->parsed_region_chan, 0,
|
||||||
|
sizeof(parsed_region_chan_11d_t));
|
||||||
|
wlan_generate_parsed_region_chan_11d(region_chan,
|
||||||
|
&Adapter->parsed_region_chan);
|
||||||
|
|
||||||
|
memset(&Adapter->DomainReg, 0, sizeof(wlan_802_11d_domain_reg_t));
|
||||||
|
wlan_generate_domain_info_11d(&Adapter->parsed_region_chan,
|
||||||
|
&Adapter->DomainReg);
|
||||||
|
|
||||||
|
ret = wlan_set_domain_info_11d(priv);
|
||||||
|
|
||||||
|
if (ret) {
|
||||||
|
wlan_debug3("11D: Err set domainInfo to FW\n");
|
||||||
|
LEAVE();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
LEAVE();
|
||||||
|
return WLAN_STATUS_SUCCESS;
|
||||||
|
}
|
|
@ -0,0 +1,109 @@
|
||||||
|
/** @file wlan_11d.h
|
||||||
|
* @brief This header file contains data structures and
|
||||||
|
* function declarations of 802.11d
|
||||||
|
*
|
||||||
|
* Copyright © Marvell International Ltd. and/or its affiliates, 2003-2006
|
||||||
|
*/
|
||||||
|
/*************************************************************
|
||||||
|
Change log:
|
||||||
|
09/26/05: add Doxygen format comments
|
||||||
|
************************************************************/
|
||||||
|
|
||||||
|
#ifndef _WLAN_11D_
|
||||||
|
#define _WLAN_11D_
|
||||||
|
|
||||||
|
#define MAX_CHAN_NUM 255
|
||||||
|
|
||||||
|
#define UNIVERSAL_REGION_CODE 0xff
|
||||||
|
|
||||||
|
/** (Beaconsize(256)-5(IEId,len,contrystr(3))/3(FirstChan,NoOfChan,MaxPwr)
|
||||||
|
*/
|
||||||
|
#define MAX_NO_OF_CHAN 40
|
||||||
|
typedef struct _REGION_CHANNEL *PREGION_CHANNEL;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
DISABLE_11D = 0,
|
||||||
|
ENABLE_11D = 1,
|
||||||
|
} state_11d_t;
|
||||||
|
|
||||||
|
/** domain regulatory information */
|
||||||
|
typedef struct _wlan_802_11d_domain_reg
|
||||||
|
{
|
||||||
|
/** country Code*/
|
||||||
|
u8 CountryCode[COUNTRY_CODE_LEN];
|
||||||
|
/** No. of subband*/
|
||||||
|
u8 NoOfSubband;
|
||||||
|
IEEEtypes_SubbandSet_t Subband[MRVDRV_MAX_SUBBAND_802_11D];
|
||||||
|
} wlan_802_11d_domain_reg_t;
|
||||||
|
|
||||||
|
typedef struct _chan_power_11d
|
||||||
|
{
|
||||||
|
u8 chan;
|
||||||
|
u8 pwr;
|
||||||
|
} __ATTRIB_PACK__ chan_power_11d_t;
|
||||||
|
|
||||||
|
typedef struct _parsed_region_chan_11d
|
||||||
|
{
|
||||||
|
u8 band;
|
||||||
|
u8 region;
|
||||||
|
s8 CountryCode[COUNTRY_CODE_LEN];
|
||||||
|
chan_power_11d_t chanPwr[MAX_NO_OF_CHAN];
|
||||||
|
u8 NoOfChan;
|
||||||
|
} __ATTRIB_PACK__ parsed_region_chan_11d_t;
|
||||||
|
|
||||||
|
/** Data for state machine */
|
||||||
|
typedef struct _wlan_802_11d_state
|
||||||
|
{
|
||||||
|
/** True for Enabling 11D*/
|
||||||
|
BOOLEAN Enable11D;
|
||||||
|
} wlan_802_11d_state_t;
|
||||||
|
|
||||||
|
typedef struct _region_code_mapping
|
||||||
|
{
|
||||||
|
s8 region[COUNTRY_CODE_LEN];
|
||||||
|
u8 code;
|
||||||
|
} region_code_mapping_t;
|
||||||
|
|
||||||
|
/* function prototypes*/
|
||||||
|
int wlan_generate_domain_info_11d(parsed_region_chan_11d_t *
|
||||||
|
parsed_region_chan,
|
||||||
|
wlan_802_11d_domain_reg_t * domaininfo);
|
||||||
|
|
||||||
|
int wlan_parse_domain_info_11d(IEEEtypes_CountryInfoFullSet_t * CountryInfo,
|
||||||
|
u8 band,
|
||||||
|
parsed_region_chan_11d_t * parsed_region_chan);
|
||||||
|
|
||||||
|
u8 wlan_get_scan_type_11d(u8 chan,
|
||||||
|
parsed_region_chan_11d_t * parsed_region_chan);
|
||||||
|
|
||||||
|
u32 chan_2_freq(u8 chan, u8 band);
|
||||||
|
|
||||||
|
int wlan_set_domain_info_11d(wlan_private * priv);
|
||||||
|
|
||||||
|
state_11d_t wlan_get_state_11d(wlan_private * priv);
|
||||||
|
|
||||||
|
void wlan_init_11d(wlan_private * priv);
|
||||||
|
|
||||||
|
int wlan_enable_11d(wlan_private * priv, state_11d_t flag);
|
||||||
|
|
||||||
|
int wlan_set_universaltable(wlan_private * priv, u8 band);
|
||||||
|
|
||||||
|
void wlan_generate_parsed_region_chan_11d(PREGION_CHANNEL region_chan,
|
||||||
|
parsed_region_chan_11d_t *
|
||||||
|
parsed_region_chan);
|
||||||
|
|
||||||
|
int wlan_cmd_802_11d_domain_info(wlan_private * priv,
|
||||||
|
HostCmd_DS_COMMAND * cmd, u16 cmdno,
|
||||||
|
u16 CmdOption);
|
||||||
|
|
||||||
|
//int wlan_cmd_enable_11d(wlan_private * priv, struct iwreq *wrq);
|
||||||
|
|
||||||
|
int wlan_ret_802_11d_domain_info(wlan_private * priv,
|
||||||
|
HostCmd_DS_COMMAND * resp);
|
||||||
|
|
||||||
|
int wlan_parse_dnld_countryinfo_11d(wlan_private * priv);
|
||||||
|
|
||||||
|
int wlan_create_dnld_countryinfo_11d(wlan_private * priv);
|
||||||
|
|
||||||
|
#endif /* _WLAN_11D_ */
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,29 @@
|
||||||
|
#ifndef _WLAN_DEBUG_H
|
||||||
|
#define _WLAN_DEBUG_H
|
||||||
|
|
||||||
|
#define WLAN_DEBUG_LEVEL_3
|
||||||
|
#ifdef WLAN_DEBUG_LEVEL_0
|
||||||
|
#define wlan_debug1(...)
|
||||||
|
#define wlan_debug2(...)
|
||||||
|
#define wlan_debug3(...)
|
||||||
|
#endif
|
||||||
|
#ifdef WLAN_DEBUG_LEVEL_1
|
||||||
|
#define wlan_debug1(a...) rt_kprintf(a)
|
||||||
|
#define wlan_debug2(...)
|
||||||
|
#define wlan_debug3(...)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef WLAN_DEBUG_LEVEL_2
|
||||||
|
#define wlan_debug1(a...) rt_kprintf(a)
|
||||||
|
#define wlan_debug2(a...) rt_kprintf(a)
|
||||||
|
#define wlan_debug3(...)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef WLAN_DEBUG_LEVEL_3
|
||||||
|
#define wlan_debug1(a...) rt_kprintf(a)
|
||||||
|
#define wlan_debug2(a...) rt_kprintf(a)
|
||||||
|
#define wlan_debug3(a...) rt_kprintf(a)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define WLANEPARAMETER 101;
|
||||||
|
#endif
|
|
@ -0,0 +1,79 @@
|
||||||
|
/** @file wlan_decl.h
|
||||||
|
* @brief This file contains declaration referring to
|
||||||
|
* functions defined in other source files
|
||||||
|
*
|
||||||
|
* Copyright © Marvell International Ltd. and/or its affiliates, 2003-2007
|
||||||
|
*/
|
||||||
|
/******************************************************
|
||||||
|
Change log:
|
||||||
|
09/29/05: add Doxygen format comments
|
||||||
|
01/05/06: Add kernel 2.6.x support
|
||||||
|
01/11/06: Conditionalize new scan/join structures.
|
||||||
|
Move wlan_wext statics to their source file.
|
||||||
|
******************************************************/
|
||||||
|
|
||||||
|
#ifndef _WLAN_DECL_H_
|
||||||
|
#define _WLAN_DECL_H_
|
||||||
|
/** Function Prototype Declaration */
|
||||||
|
int wlan_init_fw(wlan_private * priv);
|
||||||
|
int wlan_tx_packet(wlan_private * priv, struct pbuf *skb);
|
||||||
|
void wlan_free_adapter(wlan_private * priv);
|
||||||
|
|
||||||
|
int SendNullPacket(wlan_private * priv, u8 flags);
|
||||||
|
BOOLEAN CheckLastPacketIndication(wlan_private * priv);
|
||||||
|
|
||||||
|
void Wep_encrypt(wlan_private * priv, u8 * Buf, u32 Len);
|
||||||
|
int FreeCmdBuffer(wlan_private * priv);
|
||||||
|
void CleanUpCmdCtrlNode(CmdCtrlNode * pTempNode);
|
||||||
|
CmdCtrlNode *GetFreeCmdCtrlNode(wlan_private * priv);
|
||||||
|
|
||||||
|
void SetCmdCtrlNode(wlan_private * priv,
|
||||||
|
CmdCtrlNode * pTempNode,
|
||||||
|
WLAN_OID cmd_oid, u16 wait_option, void *pdata_buf);
|
||||||
|
|
||||||
|
BOOLEAN Is_Command_Allowed(wlan_private * priv);
|
||||||
|
|
||||||
|
int PrepareAndSendCommand(wlan_private * priv,
|
||||||
|
u16 cmd_no,
|
||||||
|
u16 cmd_action,
|
||||||
|
u16 wait_option, WLAN_OID cmd_oid, void *pdata_buf);
|
||||||
|
|
||||||
|
void QueueCmd(wlan_adapter * Adapter, CmdCtrlNode * CmdNode, BOOLEAN addtail);
|
||||||
|
|
||||||
|
int SetDeepSleep(wlan_private * priv, BOOLEAN bDeepSleep);
|
||||||
|
int AllocateCmdBuffer(wlan_private * priv);
|
||||||
|
int ExecuteNextCommand(wlan_private * priv);
|
||||||
|
int wlan_process_event(wlan_private * priv);
|
||||||
|
void wlan_interrupt(struct rt_wlan_dev *);
|
||||||
|
u32 index_to_data_rate(u8 index);
|
||||||
|
u8 data_rate_to_index(u32 rate);
|
||||||
|
void HexDump(char *prompt, u8 * data, int len);
|
||||||
|
void get_version(wlan_adapter * adapter, char *version, int maxlen);
|
||||||
|
void wlan_read_write_rfreg(wlan_private * priv);
|
||||||
|
|
||||||
|
int wlan_process_rx_command(wlan_private * priv);
|
||||||
|
void wlan_process_tx(wlan_private * priv);
|
||||||
|
void CleanupAndInsertCmd(wlan_private * priv, CmdCtrlNode * pTempCmd);
|
||||||
|
void MrvDrvCommandTimerFunction(void *FunctionContext);
|
||||||
|
|
||||||
|
int wlan_set_regiontable(wlan_private * priv, u8 region, u8 band);
|
||||||
|
|
||||||
|
void wlan_clean_txrx(wlan_private * priv);
|
||||||
|
|
||||||
|
int wlan_host_sleep_activated_event(wlan_private * priv);
|
||||||
|
|
||||||
|
|
||||||
|
struct pbuf *ProcessRxedPacket(wlan_private * priv, struct sk_buff *);
|
||||||
|
|
||||||
|
void PSSleep(wlan_private * priv, int wait_option);
|
||||||
|
void PSConfirmSleep(wlan_private * priv, u16 PSMode);
|
||||||
|
void PSWakeup(wlan_private * priv, int wait_option);
|
||||||
|
|
||||||
|
void wlan_send_rxskbQ(wlan_private * priv);
|
||||||
|
extern void MacEventDisconnected(wlan_private * priv);
|
||||||
|
void INIT_LIST_HEAD(struct list_head *list);
|
||||||
|
void list_add_tail(struct list_head *new, struct list_head *head);
|
||||||
|
void list_add(struct list_head *new, struct list_head *head);
|
||||||
|
int list_empty(const struct list_head *head);
|
||||||
|
void list_del(struct list_head *entry);
|
||||||
|
#endif /* _WLAN_DECL_H_ */
|
|
@ -0,0 +1,512 @@
|
||||||
|
/** @file wlan_defs.h
|
||||||
|
* @brief This header file contains global constant/enum definitions,
|
||||||
|
* global variable declaration.
|
||||||
|
*
|
||||||
|
* Copyright © Marvell International Ltd. and/or its affiliates, 2003-2007
|
||||||
|
*/
|
||||||
|
/*************************************************************
|
||||||
|
Change log:
|
||||||
|
10/11/05: add Doxygen format comments
|
||||||
|
01/11/06: Add NELEMENTS, BAND_XX defines
|
||||||
|
04/10/06: Add hostcmd generic API and power_adapt_cfg_ext command
|
||||||
|
************************************************************/
|
||||||
|
|
||||||
|
#ifndef _WLAN_DEFS_H_
|
||||||
|
#define _WLAN_DEFS_H_
|
||||||
|
|
||||||
|
#include "wlan_types.h" //changed by dennis
|
||||||
|
/** Global Varibale Declaration */
|
||||||
|
typedef struct rt_semaphore SEMAPHORE;
|
||||||
|
struct list_head {
|
||||||
|
struct list_head *next, *prev;
|
||||||
|
};
|
||||||
|
typedef int IRQ_RET_TYPE;
|
||||||
|
#define IRQ_RET return IRQ_HANDLED
|
||||||
|
typedef u8 BOOLEAN;
|
||||||
|
typedef int WLAN_STATUS;
|
||||||
|
/** Double-Word(32Bit) Bit definition */
|
||||||
|
#define DW_BIT_0 0x00000001
|
||||||
|
#define DW_BIT_1 0x00000002
|
||||||
|
#define DW_BIT_2 0x00000004
|
||||||
|
#define DW_BIT_3 0x00000008
|
||||||
|
#define DW_BIT_4 0x00000010
|
||||||
|
#define DW_BIT_5 0x00000020
|
||||||
|
#define DW_BIT_6 0x00000040
|
||||||
|
#define DW_BIT_7 0x00000080
|
||||||
|
#define DW_BIT_8 0x00000100
|
||||||
|
#define DW_BIT_9 0x00000200
|
||||||
|
#define DW_BIT_10 0x00000400
|
||||||
|
#define DW_BIT_11 0x00000800
|
||||||
|
#define DW_BIT_12 0x00001000
|
||||||
|
#define DW_BIT_13 0x00002000
|
||||||
|
#define DW_BIT_14 0x00004000
|
||||||
|
#define DW_BIT_15 0x00008000
|
||||||
|
#define DW_BIT_16 0x00010000
|
||||||
|
#define DW_BIT_17 0x00020000
|
||||||
|
#define DW_BIT_18 0x00040000
|
||||||
|
#define DW_BIT_19 0x00080000
|
||||||
|
#define DW_BIT_20 0x00100000
|
||||||
|
#define DW_BIT_21 0x00200000
|
||||||
|
#define DW_BIT_22 0x00400000
|
||||||
|
#define DW_BIT_23 0x00800000
|
||||||
|
#define DW_BIT_24 0x01000000
|
||||||
|
#define DW_BIT_25 0x02000000
|
||||||
|
#define DW_BIT_26 0x04000000
|
||||||
|
#define DW_BIT_27 0x08000000
|
||||||
|
#define DW_BIT_28 0x10000000
|
||||||
|
#define DW_BIT_29 0x20000000
|
||||||
|
#define DW_BIT_30 0x40000000
|
||||||
|
#define DW_BIT_31 0x80000000
|
||||||
|
|
||||||
|
/** Word (16bit) Bit Definition*/
|
||||||
|
#define W_BIT_0 0x0001
|
||||||
|
#define W_BIT_1 0x0002
|
||||||
|
#define W_BIT_2 0x0004
|
||||||
|
#define W_BIT_3 0x0008
|
||||||
|
#define W_BIT_4 0x0010
|
||||||
|
#define W_BIT_5 0x0020
|
||||||
|
#define W_BIT_6 0x0040
|
||||||
|
#define W_BIT_7 0x0080
|
||||||
|
#define W_BIT_8 0x0100
|
||||||
|
#define W_BIT_9 0x0200
|
||||||
|
#define W_BIT_10 0x0400
|
||||||
|
#define W_BIT_11 0x0800
|
||||||
|
#define W_BIT_12 0x1000
|
||||||
|
#define W_BIT_13 0x2000
|
||||||
|
#define W_BIT_14 0x4000
|
||||||
|
#define W_BIT_15 0x8000
|
||||||
|
|
||||||
|
/** Byte (8Bit) Bit definition*/
|
||||||
|
#define B_BIT_0 0x01
|
||||||
|
#define B_BIT_1 0x02
|
||||||
|
#define B_BIT_2 0x04
|
||||||
|
#define B_BIT_3 0x08
|
||||||
|
#define B_BIT_4 0x10
|
||||||
|
#define B_BIT_5 0x20
|
||||||
|
#define B_BIT_6 0x40
|
||||||
|
#define B_BIT_7 0x80
|
||||||
|
|
||||||
|
#define ENTER() wlan_debug3("Enter: %s, %s:%i\n", __FUNCTION__, __FILE__, __LINE__);
|
||||||
|
#define LEAVE() wlan_debug3("Leave: %s, %s:%i\n", __FUNCTION__, __FILE__, __LINE__);
|
||||||
|
#define HEXDUMP(x,y,z)
|
||||||
|
|
||||||
|
#ifndef TRUE
|
||||||
|
#define TRUE 1
|
||||||
|
#endif
|
||||||
|
#ifndef FALSE
|
||||||
|
#define FALSE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MIN
|
||||||
|
#define MIN(a,b) ((a) < (b) ? (a) : (b))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MAX
|
||||||
|
#define MAX(a,b) ((a) > (b) ? (a) : (b))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef NELEMENTS
|
||||||
|
#define NELEMENTS(x) (sizeof(x)/sizeof(x[0]))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Buffer Constants */
|
||||||
|
|
||||||
|
/* The size of SQ memory PPA, DPA are 8 DWORDs, that keep the physical
|
||||||
|
* addresses of TxPD buffers. Station has only 8 TxPD available, Whereas
|
||||||
|
* driver has more local TxPDs. Each TxPD on the host memory is associated
|
||||||
|
* with a Tx control node. The driver maintains 8 RxPD descriptors for
|
||||||
|
* station firmware to store Rx packet information.
|
||||||
|
*
|
||||||
|
* Current version of MAC has a 32x6 multicast address buffer.
|
||||||
|
*
|
||||||
|
* 802.11b can have up to 14 channels, the driver keeps the
|
||||||
|
* BSSID(MAC address) of each APs or Ad hoc stations it has sensed.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define MRVDRV_SIZE_OF_PPA 0x00000008
|
||||||
|
#define MRVDRV_SIZE_OF_DPA 0x00000008
|
||||||
|
#define MRVDRV_NUM_OF_TxPD 0x00000020
|
||||||
|
#define MRVDRV_NUM_OF_CMD_BUFFER 10
|
||||||
|
#define MRVDRV_SIZE_OF_CMD_BUFFER (2 * 1024)
|
||||||
|
#define MRVDRV_MAX_BSSID_LIST 64
|
||||||
|
#define MRVDRV_TIMER_10S 10000
|
||||||
|
#define MRVDRV_TIMER_5S 5000
|
||||||
|
#define MRVDRV_TIMER_1S 1000
|
||||||
|
#define MRVDRV_SNAP_HEADER_LEN 8
|
||||||
|
#define MRVDRV_ETH_HEADER_SIZE 14
|
||||||
|
#define ARP_FILTER_MAX_BUF_SIZE 2
|
||||||
|
#define WLAN_UPLD_SIZE 2312
|
||||||
|
#define DEV_NAME_LEN 32
|
||||||
|
#ifndef ETH_ALEN
|
||||||
|
#define ETH_ALEN 6
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Misc constants */
|
||||||
|
/* This section defines 802.11 specific contants */
|
||||||
|
|
||||||
|
#define MRVDRV_MAX_REGION_CODE 7
|
||||||
|
#define MRVDRV_MAX_SSID_LIST_LENGTH 10
|
||||||
|
#define MRVDRV_IGNORE_MULTIPLE_DTIM 0xfffe
|
||||||
|
#define MRVDRV_MIN_MULTIPLE_DTIM 1
|
||||||
|
#define MRVDRV_MAX_MULTIPLE_DTIM 5
|
||||||
|
#define MRVDRV_DEFAULT_MULTIPLE_DTIM 1
|
||||||
|
#define MRVDRV_DEFAULT_LISTEN_INTERVAL 10
|
||||||
|
#define MRVDRV_DEFAULT_LOCAL_LISTEN_INTERVAL 0
|
||||||
|
|
||||||
|
#ifdef PROGRESSIVE_SCAN
|
||||||
|
#define MRVDRV_CHANNELS_PER_SCAN 4
|
||||||
|
#define MRVDRV_MAX_CHANNELS_PER_SCAN 14
|
||||||
|
#endif /* PROGRESSIVE_SCAN */
|
||||||
|
|
||||||
|
#define MRVDRV_CHANNELS_PER_ACTIVE_SCAN 14
|
||||||
|
#define MRVDRV_MIN_BEACON_INTERVAL 20
|
||||||
|
#define MRVDRV_MAX_BEACON_INTERVAL 1000
|
||||||
|
#define MRVDRV_BEACON_INTERVAL 100
|
||||||
|
|
||||||
|
#define MRVDRV_DEFAULT_WATCHDOG_TIMEOUT (2 * HZ)
|
||||||
|
#define MRVDRV_SCAN_WATCHDOG_TIMEOUT (10 * HZ)
|
||||||
|
|
||||||
|
/** TxPD Status */
|
||||||
|
|
||||||
|
/* Station firmware use TxPD status field to report final Tx transmit
|
||||||
|
* result, Bit masks are used to present combined situations.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define MRVDRV_TxPD_POWER_MGMT_NULL_PACKET 0x01
|
||||||
|
#define MRVDRV_TxPD_POWER_MGMT_LAST_PACKET 0x08
|
||||||
|
|
||||||
|
/** Tx control node status */
|
||||||
|
|
||||||
|
#define MRVDRV_TX_CTRL_NODE_STATUS_IDLE 0x0000
|
||||||
|
|
||||||
|
/* Link spped */
|
||||||
|
#define MRVDRV_LINK_SPEED_1mbps 10000 /* in unit of 100bps */
|
||||||
|
#define MRVDRV_LINK_SPEED_11mbps 110000
|
||||||
|
|
||||||
|
/** RSSI-related defines */
|
||||||
|
/* RSSI constants are used to implement 802.11 RSSI threshold
|
||||||
|
* indication. if the Rx packet signal got too weak for 5 consecutive
|
||||||
|
* times, miniport driver (driver) will report this event to wrapper
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define MRVDRV_NF_DEFAULT_SCAN_VALUE (-96)
|
||||||
|
|
||||||
|
/** RTS/FRAG related defines */
|
||||||
|
#define MRVDRV_RTS_MIN_VALUE 0
|
||||||
|
#define MRVDRV_RTS_MAX_VALUE 2347
|
||||||
|
#define MRVDRV_FRAG_MIN_VALUE 256
|
||||||
|
#define MRVDRV_FRAG_MAX_VALUE 2346
|
||||||
|
|
||||||
|
/* Fixed IE size is 8 bytes time stamp + 2 bytes beacon interval +
|
||||||
|
* 2 bytes cap */
|
||||||
|
#define MRVL_FIXED_IE_SIZE 12
|
||||||
|
|
||||||
|
/* This is for firmware specific length */
|
||||||
|
#define EXTRA_LEN 36
|
||||||
|
#define MRVDRV_MAXIMUM_ETH_PACKET_SIZE 1514
|
||||||
|
|
||||||
|
#define MRVDRV_ETH_TX_PACKET_BUFFER_SIZE \
|
||||||
|
(MRVDRV_MAXIMUM_ETH_PACKET_SIZE + sizeof(TxPD) + EXTRA_LEN)
|
||||||
|
|
||||||
|
#define MRVDRV_ETH_RX_PACKET_BUFFER_SIZE \
|
||||||
|
(MRVDRV_MAXIMUM_ETH_PACKET_SIZE + sizeof(RxPD) \
|
||||||
|
+ MRVDRV_SNAP_HEADER_LEN + EXTRA_LEN)
|
||||||
|
|
||||||
|
#define CMD_F_HOSTCMD (1 << 0)
|
||||||
|
|
||||||
|
/* to resolve CISCO AP extension */
|
||||||
|
#define MRVDRV_SCAN_LIST_VAR_IE_SPACE 256
|
||||||
|
#define FW_IS_WPA_ENABLED(_adapter) \
|
||||||
|
(_adapter->fwCapInfo & FW_CAPINFO_WPA)
|
||||||
|
|
||||||
|
#define FW_CAPINFO_WPA (1 << 0)
|
||||||
|
#define WLAN_802_11_AI_REQFI_CAPABILITIES 1
|
||||||
|
#define WLAN_802_11_AI_REQFI_LISTENINTERVAL 2
|
||||||
|
#define WLAN_802_11_AI_REQFI_CURRENTAPADDRESS 4
|
||||||
|
|
||||||
|
#define WLAN_802_11_AI_RESFI_CAPABILITIES 1
|
||||||
|
#define WLAN_802_11_AI_RESFI_STATUSCODE 2
|
||||||
|
#define WLAN_802_11_AI_RESFI_ASSOCIATIONID 4
|
||||||
|
|
||||||
|
#define MRVL_NUM_WEP_KEY 4
|
||||||
|
|
||||||
|
/** WPA Key LENGTH*/
|
||||||
|
/* Support 4 keys per key set */
|
||||||
|
#define MRVL_NUM_WPA_KEY_PER_SET 4
|
||||||
|
#define MRVL_MAX_WPA_KEY_LENGTH 32
|
||||||
|
|
||||||
|
#define WPA_AES_KEY_LEN 16
|
||||||
|
#define WPA_TKIP_KEY_LEN 32
|
||||||
|
|
||||||
|
/* A few details needed for WEP (Wireless Equivalent Privacy) */
|
||||||
|
/* 104 bits */
|
||||||
|
#define MAX_WEP_KEY_SIZE 13
|
||||||
|
/*40 bits RC4 - WEP*/
|
||||||
|
#define MIN_WEP_KEY_SIZE 5
|
||||||
|
|
||||||
|
#define RF_ANTENNA_1 0x1
|
||||||
|
#define RF_ANTENNA_2 0x2
|
||||||
|
#define RF_ANTENNA_AUTO 0xFFFF
|
||||||
|
|
||||||
|
#define KEY_INFO_ENABLED 0x01
|
||||||
|
|
||||||
|
#define SNR_BEACON 0
|
||||||
|
#define SNR_RXPD 1
|
||||||
|
#define NF_BEACON 2
|
||||||
|
#define NF_RXPD 3
|
||||||
|
|
||||||
|
/** MACRO DEFINITIONS */
|
||||||
|
#define CAL_NF(NF) ((s32)(-(s32)(NF)))
|
||||||
|
#define CAL_RSSI(SNR, NF) ((s32)((s32)(SNR) + CAL_NF(NF)))
|
||||||
|
#define SCAN_RSSI(RSSI) (0x100 - ((u8)(RSSI)))
|
||||||
|
|
||||||
|
#define DEFAULT_BCN_AVG_FACTOR 8
|
||||||
|
#define DEFAULT_DATA_AVG_FACTOR 8
|
||||||
|
#define MIN_BCN_AVG_FACTOR 1
|
||||||
|
#define MAX_BCN_AVG_FACTOR 8
|
||||||
|
#define MIN_DATA_AVG_FACTOR 1
|
||||||
|
#define MAX_DATA_AVG_FACTOR 8
|
||||||
|
#define AVG_SCALE 100
|
||||||
|
#define CAL_AVG_SNR_NF(AVG, SNRNF, N) \
|
||||||
|
(((AVG) == 0) ? ((u16)(SNRNF) * AVG_SCALE) : \
|
||||||
|
((((int)(AVG) * (N -1)) + ((u16)(SNRNF) * \
|
||||||
|
AVG_SCALE)) / N))
|
||||||
|
|
||||||
|
#define WLAN_STATUS_SUCCESS (0)
|
||||||
|
#define WLAN_STATUS_FAILURE (-1)
|
||||||
|
#define WLAN_STATUS_NOT_ACCEPTED (-2)
|
||||||
|
|
||||||
|
#define MAX_LEDS 3
|
||||||
|
#define LED_DISABLED 16
|
||||||
|
#define LED_BLINKING 2
|
||||||
|
|
||||||
|
/* S_SWAP : To swap 2 u8 */
|
||||||
|
#define S_SWAP(a,b) do { \
|
||||||
|
u8 t = SArr[a]; \
|
||||||
|
SArr[a] = SArr[b]; SArr[b] = t; \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
/* SWAP: swap u8 */
|
||||||
|
#define SWAP_U8(a,b) {u8 t; t=a; a=b; b=t;}
|
||||||
|
|
||||||
|
/* SWAP: swap u8 */
|
||||||
|
#define SWAP_U16(a,b) {u16 t; t=a; a=b; b=t;}
|
||||||
|
|
||||||
|
#define wlan_le16_to_cpu(x) x
|
||||||
|
#define wlan_le32_to_cpu(x) x
|
||||||
|
#define wlan_le64_to_cpu(x) x
|
||||||
|
#define wlan_cpu_to_le16(x) x
|
||||||
|
#define wlan_cpu_to_le32(x) x
|
||||||
|
#define wlan_cpu_to_le64(x) x
|
||||||
|
|
||||||
|
#define endian_convert_TxPD(x)
|
||||||
|
#define endian_convert_RxPD(x)
|
||||||
|
#define endian_convert_GET_LOG(x)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef MFG_CMD_SUPPORT
|
||||||
|
#define SIOCCFMFG SIOCDEVPRIVATE
|
||||||
|
#endif /* MFG_CMD_SUPPORT */
|
||||||
|
|
||||||
|
/** ENUM definition*/
|
||||||
|
/** SNRNF_TYPE */
|
||||||
|
typedef enum _SNRNF_TYPE
|
||||||
|
{
|
||||||
|
TYPE_BEACON = 0,
|
||||||
|
TYPE_RXPD,
|
||||||
|
MAX_TYPE_B
|
||||||
|
} SNRNF_TYPE;
|
||||||
|
|
||||||
|
/** SNRNF_DATA*/
|
||||||
|
typedef enum _SNRNF_DATA
|
||||||
|
{
|
||||||
|
TYPE_NOAVG = 0,
|
||||||
|
TYPE_AVG,
|
||||||
|
MAX_TYPE_AVG
|
||||||
|
} SNRNF_DATA;
|
||||||
|
|
||||||
|
/** WLAN_802_11_AUTH_ALG*/
|
||||||
|
typedef enum _WLAN_802_11_AUTH_ALG
|
||||||
|
{
|
||||||
|
AUTH_ALG_OPEN_SYSTEM = 1,
|
||||||
|
AUTH_ALG_SHARED_KEY = 2,
|
||||||
|
AUTH_ALG_NETWORK_EAP = 8,
|
||||||
|
} WLAN_802_11_AUTH_ALG;
|
||||||
|
|
||||||
|
/** WLAN_802_11_ENCRYPTION_MODE */
|
||||||
|
typedef enum _WLAN_802_11_ENCRYPTION_MODE
|
||||||
|
{
|
||||||
|
CIPHER_NONE,
|
||||||
|
CIPHER_WEP40,
|
||||||
|
CIPHER_TKIP,
|
||||||
|
CIPHER_CCMP,
|
||||||
|
CIPHER_WEP104,
|
||||||
|
} WLAN_802_11_ENCRYPTION_MODE;
|
||||||
|
|
||||||
|
/** WLAN_802_11_POWER_MODE */
|
||||||
|
typedef enum _WLAN_802_11_POWER_MODE
|
||||||
|
{
|
||||||
|
Wlan802_11PowerModeCAM,
|
||||||
|
Wlan802_11PowerModeMAX_PSP,
|
||||||
|
Wlan802_11PowerModeFast_PSP,
|
||||||
|
|
||||||
|
/*not a real mode, defined as an upper bound */
|
||||||
|
Wlan802_11PowerModeMax
|
||||||
|
} WLAN_802_11_POWER_MODE;
|
||||||
|
|
||||||
|
/** PS_STATE */
|
||||||
|
typedef enum _PS_STATE
|
||||||
|
{
|
||||||
|
PS_STATE_FULL_POWER,
|
||||||
|
PS_STATE_AWAKE,
|
||||||
|
PS_STATE_PRE_SLEEP,
|
||||||
|
PS_STATE_SLEEP
|
||||||
|
} PS_STATE;
|
||||||
|
|
||||||
|
/** DNLD_STATE */
|
||||||
|
typedef enum _DNLD_STATE
|
||||||
|
{
|
||||||
|
DNLD_RES_RECEIVED,
|
||||||
|
DNLD_DATA_SENT,
|
||||||
|
DNLD_CMD_SENT
|
||||||
|
} DNLD_STATE;
|
||||||
|
|
||||||
|
/** WLAN_MEDIA_STATE */
|
||||||
|
typedef enum _WLAN_MEDIA_STATE
|
||||||
|
{
|
||||||
|
WlanMediaStateDisconnected,
|
||||||
|
WlanMediaStateConnected
|
||||||
|
} WLAN_MEDIA_STATE;
|
||||||
|
|
||||||
|
/** WLAN_802_11_PRIVACY_FILTER */
|
||||||
|
typedef enum _WLAN_802_11_PRIVACY_FILTER
|
||||||
|
{
|
||||||
|
Wlan802_11PrivFilterAcceptAll,
|
||||||
|
Wlan802_11PrivFilter8021xWEP
|
||||||
|
} WLAN_802_11_PRIVACY_FILTER;
|
||||||
|
|
||||||
|
/** mv_ms_type */
|
||||||
|
typedef enum _mv_ms_type
|
||||||
|
{
|
||||||
|
MVMS_DAT = 0,
|
||||||
|
MVMS_CMD = 1,
|
||||||
|
/* 2: reserved */
|
||||||
|
MVMS_EVENT = 3
|
||||||
|
} mv_ms_type;
|
||||||
|
|
||||||
|
/* Hardware status codes */
|
||||||
|
typedef enum _WLAN_HARDWARE_STATUS
|
||||||
|
{
|
||||||
|
WlanHardwareStatusReady,
|
||||||
|
WlanHardwareStatusInitializing,
|
||||||
|
WlanHardwareStatusReset,
|
||||||
|
WlanHardwareStatusClosing,
|
||||||
|
WlanHardwareStatusNotReady
|
||||||
|
} WLAN_HARDWARE_STATUS;
|
||||||
|
|
||||||
|
/** WLAN_802_11_AUTHENTICATION_MODE */
|
||||||
|
typedef enum _WLAN_802_11_AUTHENTICATION_MODE
|
||||||
|
{
|
||||||
|
Wlan802_11AuthModeOpen = 0x00,
|
||||||
|
Wlan802_11AuthModeShared = 0x01,
|
||||||
|
Wlan802_11AuthModeNetworkEAP = 0x80,
|
||||||
|
} WLAN_802_11_AUTHENTICATION_MODE;
|
||||||
|
|
||||||
|
/** WLAN_802_11_WEP_STATUS */
|
||||||
|
typedef enum _WLAN_802_11_WEP_STATUS
|
||||||
|
{
|
||||||
|
Wlan802_11WEPEnabled,
|
||||||
|
Wlan802_11WEPDisabled,
|
||||||
|
Wlan802_11WEPKeyAbsent,
|
||||||
|
Wlan802_11WEPNotSupported
|
||||||
|
} WLAN_802_11_WEP_STATUS;
|
||||||
|
|
||||||
|
/** SNMP_MIB_INDEX_e */
|
||||||
|
typedef enum _SNMP_MIB_INDEX_e
|
||||||
|
{
|
||||||
|
DesiredBssType_i = 0,
|
||||||
|
OpRateSet_i,
|
||||||
|
BcnPeriod_i,
|
||||||
|
DtimPeriod_i,
|
||||||
|
AssocRspTimeOut_i,
|
||||||
|
RtsThresh_i,
|
||||||
|
ShortRetryLim_i,
|
||||||
|
LongRetryLim_i,
|
||||||
|
FragThresh_i,
|
||||||
|
Dot11D_i,
|
||||||
|
Dot11H_i,
|
||||||
|
ManufId_i,
|
||||||
|
ProdId_i,
|
||||||
|
ManufOui_i,
|
||||||
|
ManufName_i,
|
||||||
|
ManufProdName_i,
|
||||||
|
ManufProdVer_i
|
||||||
|
} SNMP_MIB_INDEX_e;
|
||||||
|
|
||||||
|
/** KEY_TYPE_ID */
|
||||||
|
typedef enum _KEY_TYPE_ID
|
||||||
|
{
|
||||||
|
KEY_TYPE_ID_WEP = 0,
|
||||||
|
KEY_TYPE_ID_TKIP,
|
||||||
|
KEY_TYPE_ID_AES
|
||||||
|
} KEY_TYPE_ID;
|
||||||
|
|
||||||
|
/** KEY_INFO_WEP*/
|
||||||
|
typedef enum _KEY_INFO_WEP
|
||||||
|
{
|
||||||
|
KEY_INFO_WEP_DEFAULT_KEY = 0x01
|
||||||
|
} KEY_INFO_WEP;
|
||||||
|
|
||||||
|
/** KEY_INFO_TKIP */
|
||||||
|
typedef enum _KEY_INFO_TKIP
|
||||||
|
{
|
||||||
|
KEY_INFO_TKIP_MCAST = 0x01,
|
||||||
|
KEY_INFO_TKIP_UNICAST = 0x02,
|
||||||
|
KEY_INFO_TKIP_ENABLED = 0x04
|
||||||
|
} KEY_INFO_TKIP;
|
||||||
|
|
||||||
|
/** KEY_INFO_AES*/
|
||||||
|
typedef enum _KEY_INFO_AES
|
||||||
|
{
|
||||||
|
KEY_INFO_AES_MCAST = 0x01,
|
||||||
|
KEY_INFO_AES_UNICAST = 0x02,
|
||||||
|
KEY_INFO_AES_ENABLED = 0x04
|
||||||
|
} KEY_INFO_AES;
|
||||||
|
|
||||||
|
/** SNMP_MIB_VALUE_e */
|
||||||
|
typedef enum _SNMP_MIB_VALUE_e
|
||||||
|
{
|
||||||
|
SNMP_MIB_VALUE_INFRA = 1,
|
||||||
|
SNMP_MIB_VALUE_ADHOC
|
||||||
|
} SNMP_MIB_VALUE_e;
|
||||||
|
|
||||||
|
/** HWRateDropMode */
|
||||||
|
typedef enum _HWRateDropMode
|
||||||
|
{
|
||||||
|
NO_HW_RATE_DROP,
|
||||||
|
HW_TABLE_RATE_DROP,
|
||||||
|
HW_SINGLE_RATE_DROP
|
||||||
|
} HWRateDropMode;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct _wlan_private wlan_private;
|
||||||
|
typedef struct _wlan_adapter wlan_adapter;
|
||||||
|
typedef struct _HostCmd_DS_COMMAND HostCmd_DS_COMMAND;
|
||||||
|
|
||||||
|
extern u32 DSFreqList[15];
|
||||||
|
extern const char driver_version[];
|
||||||
|
extern u32 DSFreqList[];
|
||||||
|
extern u16 RegionCodeToIndex[MRVDRV_MAX_REGION_CODE];
|
||||||
|
|
||||||
|
extern u8 WlanDataRates[WLAN_SUPPORTED_RATES];
|
||||||
|
|
||||||
|
extern u8 SupportedRates[G_SUPPORTED_RATES];
|
||||||
|
|
||||||
|
extern wlan_private *wlanpriv;
|
||||||
|
|
||||||
|
extern int g_bus_mode_reg;
|
||||||
|
extern int g_dummy_clk_ioport;
|
||||||
|
extern int g_dummy_clk_reg;
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,483 @@
|
||||||
|
/** @file wlan_dev.h
|
||||||
|
* @brief This file contains definitions and data structures specific
|
||||||
|
* to Marvell 802.11 NIC. It contains the Device Information
|
||||||
|
* structure wlan_adapter.
|
||||||
|
*
|
||||||
|
* Copyright © Marvell International Ltd. and/or its affiliates, 2003-2007
|
||||||
|
*/
|
||||||
|
/*************************************************************
|
||||||
|
Change log:
|
||||||
|
09/26/05: add Doxygen format comments
|
||||||
|
01/11/06: Conditionalize new scan/join structures.
|
||||||
|
04/18/06: Remove old Subscrive Event and add new Subscribe Event
|
||||||
|
implementation through generic hostcmd API
|
||||||
|
05/08/06: Remove PermanentAddr from Adapter
|
||||||
|
|
||||||
|
************************************************************/
|
||||||
|
|
||||||
|
#ifndef _WLAN_DEV_H_
|
||||||
|
#define _WLAN_DEV_H_
|
||||||
|
#include "include.h"
|
||||||
|
#include "wlan_thread.h"
|
||||||
|
#include "wlan_types.h"
|
||||||
|
#include "wlan_defs.h"
|
||||||
|
#include "rt_wlan_dev.h"
|
||||||
|
#include "..\os\os_timers.h"
|
||||||
|
#include "hostcmd.h"
|
||||||
|
#include <netif/ethernetif.h>
|
||||||
|
#define MAX_BSSID_PER_CHANNEL 16
|
||||||
|
|
||||||
|
/* For the extended Scan */
|
||||||
|
#define MAX_EXTENDED_SCAN_BSSID_LIST MAX_BSSID_PER_CHANNEL (MRVDRV_MAX_CHANNEL_SIZE + 1)
|
||||||
|
struct net_device_stats //this struct copied form LInux
|
||||||
|
{
|
||||||
|
unsigned long rx_packets; /* total packets received */
|
||||||
|
unsigned long tx_packets; /* total packets transmitted */
|
||||||
|
unsigned long rx_bytes; /* total bytes received */
|
||||||
|
unsigned long tx_bytes; /* total bytes transmitted */
|
||||||
|
unsigned long rx_errors; /* bad packets received */
|
||||||
|
unsigned long tx_errors; /* packet transmit problems */
|
||||||
|
unsigned long rx_dropped; /* no space in linux buffers */
|
||||||
|
unsigned long tx_dropped; /* no space available in linux */
|
||||||
|
unsigned long multicast; /* multicast packets received */
|
||||||
|
unsigned long collisions;
|
||||||
|
|
||||||
|
/* detailed rx_errors: */
|
||||||
|
unsigned long rx_length_errors;
|
||||||
|
unsigned long rx_over_errors; /* receiver ring buff overflow */
|
||||||
|
unsigned long rx_crc_errors; /* recved pkt with crc error */
|
||||||
|
unsigned long rx_frame_errors; /* recv'd frame alignment error */
|
||||||
|
unsigned long rx_fifo_errors; /* recv'r fifo overrun */
|
||||||
|
unsigned long rx_missed_errors; /* receiver missed packet */
|
||||||
|
|
||||||
|
/* detailed tx_errors */
|
||||||
|
unsigned long tx_aborted_errors;
|
||||||
|
unsigned long tx_carrier_errors;
|
||||||
|
unsigned long tx_fifo_errors;
|
||||||
|
unsigned long tx_heartbeat_errors;
|
||||||
|
unsigned long tx_window_errors;
|
||||||
|
|
||||||
|
/* for cslip etc */
|
||||||
|
unsigned long rx_compressed;
|
||||||
|
unsigned long tx_compressed;
|
||||||
|
};
|
||||||
|
typedef struct _PER_CHANNEL_BSSID_LIST_DATA
|
||||||
|
{
|
||||||
|
u8 ucStart;
|
||||||
|
u8 ucNumEntry;
|
||||||
|
} PER_CHANNEL_BSSID_LIST_DATA, *PPER_CHANNEL_BSSID_LIST_DATA;
|
||||||
|
|
||||||
|
typedef struct _MRV_BSSID_IE_LIST
|
||||||
|
{
|
||||||
|
WLAN_802_11_FIXED_IEs FixedIE;
|
||||||
|
u8 VariableIE[MRVDRV_SCAN_LIST_VAR_IE_SPACE];
|
||||||
|
} MRV_BSSID_IE_LIST, *PMRV_BSSID_IE_LIST;
|
||||||
|
|
||||||
|
#define MAX_REGION_CHANNEL_NUM 2
|
||||||
|
|
||||||
|
/** Chan-Freq-TxPower mapping table*/
|
||||||
|
typedef struct _CHANNEL_FREQ_POWER
|
||||||
|
{
|
||||||
|
/** Channel Number */
|
||||||
|
u16 Channel;
|
||||||
|
/** Frequency of this Channel */
|
||||||
|
u32 Freq;
|
||||||
|
/** Max allowed Tx power level */
|
||||||
|
u16 MaxTxPower;
|
||||||
|
/** TRUE:channel unsupported; FLASE:supported*/
|
||||||
|
BOOLEAN Unsupported;
|
||||||
|
} CHANNEL_FREQ_POWER;
|
||||||
|
|
||||||
|
/** region-band mapping table*/
|
||||||
|
typedef struct _REGION_CHANNEL
|
||||||
|
{
|
||||||
|
/** TRUE if this entry is valid */
|
||||||
|
BOOLEAN Valid;
|
||||||
|
/** Region code for US, Japan ... */
|
||||||
|
u8 Region;
|
||||||
|
/** Band B/G/A, used for BAND_CONFIG cmd */
|
||||||
|
u8 Band;
|
||||||
|
/** Actual No. of elements in the array below */
|
||||||
|
u8 NrCFP;
|
||||||
|
/** chan-freq-txpower mapping table*/
|
||||||
|
CHANNEL_FREQ_POWER *CFP;
|
||||||
|
} REGION_CHANNEL;
|
||||||
|
|
||||||
|
typedef struct _wlan_802_11_security_t
|
||||||
|
{
|
||||||
|
BOOLEAN WPAEnabled;
|
||||||
|
BOOLEAN WPA2Enabled;
|
||||||
|
WLAN_802_11_WEP_STATUS WEPStatus;
|
||||||
|
WLAN_802_11_AUTHENTICATION_MODE AuthenticationMode;
|
||||||
|
WLAN_802_11_ENCRYPTION_MODE EncryptionMode;
|
||||||
|
} wlan_802_11_security_t;
|
||||||
|
|
||||||
|
/** Current Basic Service Set State Structure */
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
BSSDescriptor_t BSSDescriptor;
|
||||||
|
|
||||||
|
/** band */
|
||||||
|
u8 band;
|
||||||
|
|
||||||
|
/** number of rates supported */
|
||||||
|
int NumOfRates;
|
||||||
|
|
||||||
|
/** supported rates*/
|
||||||
|
u8 DataRates[WLAN_SUPPORTED_RATES];
|
||||||
|
|
||||||
|
/** wmm enable? */
|
||||||
|
u8 wmm_enabled;
|
||||||
|
|
||||||
|
/** uapsd enable?*/
|
||||||
|
u8 wmm_uapsd_enabled;
|
||||||
|
} CurrentBSSParams_t;
|
||||||
|
|
||||||
|
/** sleep_params */
|
||||||
|
typedef struct SleepParams
|
||||||
|
{
|
||||||
|
u16 sp_error;
|
||||||
|
u16 sp_offset;
|
||||||
|
u16 sp_stabletime;
|
||||||
|
u8 sp_calcontrol;
|
||||||
|
u8 sp_extsleepclk;
|
||||||
|
u16 sp_reserved;
|
||||||
|
} SleepParams;
|
||||||
|
|
||||||
|
/** sleep_period */
|
||||||
|
typedef struct SleepPeriod
|
||||||
|
{
|
||||||
|
u16 period;
|
||||||
|
u16 reserved;
|
||||||
|
} SleepPeriod;
|
||||||
|
|
||||||
|
/** info for debug purpose */
|
||||||
|
typedef struct _wlan_dbg
|
||||||
|
{
|
||||||
|
u32 num_cmd_host_to_card_failure;
|
||||||
|
u32 num_cmd_sleep_cfm_host_to_card_failure;
|
||||||
|
u32 num_tx_host_to_card_failure;
|
||||||
|
u32 num_event_deauth;
|
||||||
|
u32 num_event_disassoc;
|
||||||
|
u32 num_event_link_lost;
|
||||||
|
u32 num_cmd_deauth;
|
||||||
|
u32 num_cmd_assoc_success;
|
||||||
|
u32 num_cmd_assoc_failure;
|
||||||
|
u32 num_tx_timeout;
|
||||||
|
u32 num_cmd_timeout;
|
||||||
|
u16 TimeoutCmdId;
|
||||||
|
u16 TimeoutCmdAct;
|
||||||
|
u16 LastCmdId;
|
||||||
|
u16 LastCmdRespId;
|
||||||
|
} wlan_dbg;
|
||||||
|
|
||||||
|
/** Data structure for the Marvell WLAN device */
|
||||||
|
typedef struct _wlan_dev
|
||||||
|
{
|
||||||
|
/** device name */
|
||||||
|
char name[DEV_NAME_LEN];
|
||||||
|
/** card pointer */
|
||||||
|
|
||||||
|
/** IO port */
|
||||||
|
u32 ioport;
|
||||||
|
/** Upload received */
|
||||||
|
u32 upld_rcv;
|
||||||
|
/** Upload type */
|
||||||
|
u32 upld_typ;
|
||||||
|
/** Upload length */
|
||||||
|
u32 upld_len;
|
||||||
|
/** netdev pointer */
|
||||||
|
// struct net_device *netdev;
|
||||||
|
struct rt_wlan_dev *netdev;
|
||||||
|
/* Upload buffer */
|
||||||
|
u8 upld_buf[WLAN_UPLD_SIZE];
|
||||||
|
/* Download sent:
|
||||||
|
bit0 1/0=data_sent/data_tx_done,
|
||||||
|
bit1 1/0=cmd_sent/cmd_tx_done,
|
||||||
|
all other bits reserved 0 */
|
||||||
|
u8 dnld_sent;
|
||||||
|
} wlan_dev_t, *pwlan_dev_t;
|
||||||
|
|
||||||
|
/* Data structure for WPS information */
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
IEEEtypes_VendorSpecific_t wpsIe;
|
||||||
|
BOOLEAN SessionEnable;
|
||||||
|
} wps_t;
|
||||||
|
|
||||||
|
/** Private structure for the MV device */
|
||||||
|
struct _wlan_private
|
||||||
|
{
|
||||||
|
int open;
|
||||||
|
|
||||||
|
wlan_adapter *adapter;
|
||||||
|
wlan_dev_t wlan_dev;
|
||||||
|
|
||||||
|
struct net_device_stats stats;
|
||||||
|
|
||||||
|
/** thread to service interrupts */
|
||||||
|
wlan_thread MainThread;
|
||||||
|
|
||||||
|
#ifdef REASSOCIATION
|
||||||
|
/** thread to service mac events */
|
||||||
|
wlan_thread ReassocThread;
|
||||||
|
#endif /* REASSOCIATION */
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Wlan Adapter data structure*/
|
||||||
|
struct _wlan_adapter
|
||||||
|
{
|
||||||
|
u8 TmpTxBuf[WLAN_UPLD_SIZE] ;
|
||||||
|
/** STATUS variables */
|
||||||
|
WLAN_HARDWARE_STATUS HardwareStatus;
|
||||||
|
u32 FWReleaseNumber;
|
||||||
|
u32 fwCapInfo;
|
||||||
|
u8 chip_rev;
|
||||||
|
|
||||||
|
/** Command-related variables */
|
||||||
|
u16 SeqNum;
|
||||||
|
CmdCtrlNode *CmdArray;
|
||||||
|
/** Current Command */
|
||||||
|
CmdCtrlNode *CurCmd;
|
||||||
|
int CurCmdRetCode;
|
||||||
|
|
||||||
|
/** Command Queues */
|
||||||
|
/** Free command buffers */
|
||||||
|
struct list_head CmdFreeQ;
|
||||||
|
/** Pending command buffers */
|
||||||
|
struct list_head CmdPendingQ;
|
||||||
|
|
||||||
|
/** Variables brought in from private structure */
|
||||||
|
int irq;
|
||||||
|
|
||||||
|
/** Async and Sync Event variables */
|
||||||
|
u32 IntCounter;
|
||||||
|
u32 IntCounterSaved; /* save int for DS/PS */
|
||||||
|
u32 EventCause;
|
||||||
|
u8 nodeName[16]; /* nickname */
|
||||||
|
|
||||||
|
/** spin locks */
|
||||||
|
// spinlock_t QueueSpinLock __ATTRIB_ALIGN__;
|
||||||
|
// int QueueSpinLock ;//__ATTRIB_ALIGN__;
|
||||||
|
/** Timers */
|
||||||
|
WLAN_DRV_TIMER MrvDrvCommandTimer ;// __ATTRIB_ALIGN__;
|
||||||
|
BOOLEAN CommandTimerIsSet;
|
||||||
|
|
||||||
|
#ifdef REASSOCIATION
|
||||||
|
/**Reassociation timer*/
|
||||||
|
BOOLEAN ReassocTimerIsSet;
|
||||||
|
WLAN_DRV_TIMER MrvDrvTimer;// __ATTRIB_ALIGN__;
|
||||||
|
#endif /* REASSOCIATION */
|
||||||
|
|
||||||
|
/** Event Queues */
|
||||||
|
struct rt_event ds_awake_q;// __ATTRIB_ALIGN__;
|
||||||
|
|
||||||
|
u8 HisRegCpy;
|
||||||
|
|
||||||
|
/** bg scan related variable */
|
||||||
|
HostCmd_DS_802_11_BG_SCAN_CONFIG *bgScanConfig;
|
||||||
|
u32 bgScanConfigSize;
|
||||||
|
|
||||||
|
/** WMM related variable*/
|
||||||
|
WMM_DESC wmm;
|
||||||
|
|
||||||
|
/** current ssid/bssid related parameters*/
|
||||||
|
CurrentBSSParams_t CurBssParams;
|
||||||
|
|
||||||
|
WLAN_802_11_NETWORK_INFRASTRUCTURE InfrastructureMode;
|
||||||
|
|
||||||
|
BSSDescriptor_t *pAttemptedBSSDesc;
|
||||||
|
|
||||||
|
WLAN_802_11_SSID AttemptedSSIDBeforeScan;
|
||||||
|
WLAN_802_11_SSID PreviousSSID;
|
||||||
|
u8 PreviousBSSID[MRVDRV_ETH_ADDR_LEN];
|
||||||
|
|
||||||
|
BSSDescriptor_t *ScanTable;
|
||||||
|
u32 NumInScanTable;
|
||||||
|
|
||||||
|
u8 ScanType;
|
||||||
|
u32 ScanMode;
|
||||||
|
u16 SpecificScanTime;
|
||||||
|
u16 ActiveScanTime;
|
||||||
|
u16 PassiveScanTime;
|
||||||
|
|
||||||
|
u16 BeaconPeriod;
|
||||||
|
u8 AdhocCreate;
|
||||||
|
BOOLEAN AdhocLinkSensed;
|
||||||
|
|
||||||
|
#ifdef REASSOCIATION
|
||||||
|
/** Reassociation on and off */
|
||||||
|
BOOLEAN Reassoc_on;
|
||||||
|
SEMAPHORE ReassocSem;
|
||||||
|
#endif /* REASSOCIATION */
|
||||||
|
|
||||||
|
BOOLEAN ATIMEnabled;
|
||||||
|
|
||||||
|
/** MAC address information */
|
||||||
|
u8 CurrentAddr[MRVDRV_ETH_ADDR_LEN];
|
||||||
|
u8 MulticastList[MRVDRV_MAX_MULTICAST_LIST_SIZE]
|
||||||
|
[MRVDRV_ETH_ADDR_LEN];
|
||||||
|
u32 NumOfMulticastMACAddr;
|
||||||
|
|
||||||
|
u16 HWRateDropMode;
|
||||||
|
u16 RateBitmap;
|
||||||
|
u16 Threshold;
|
||||||
|
u16 FinalRate;
|
||||||
|
/** control G Rates */
|
||||||
|
BOOLEAN adhoc_grate_enabled;
|
||||||
|
|
||||||
|
WLAN_802_11_ANTENNA TxAntenna;
|
||||||
|
WLAN_802_11_ANTENNA RxAntenna;
|
||||||
|
|
||||||
|
u8 AdhocChannel;
|
||||||
|
WLAN_802_11_FRAGMENTATION_THRESHOLD FragThsd;
|
||||||
|
WLAN_802_11_RTS_THRESHOLD RTSThsd;
|
||||||
|
|
||||||
|
u32 DataRate;
|
||||||
|
BOOLEAN Is_DataRate_Auto;
|
||||||
|
|
||||||
|
/** number of association attempts for the current SSID cmd */
|
||||||
|
u16 ListenInterval;
|
||||||
|
u8 TxRetryCount;
|
||||||
|
|
||||||
|
/** Tx-related variables (for single packet tx) */
|
||||||
|
struct sk_buff *CurrentTxSkb;
|
||||||
|
struct sk_buff RxSkbQ;
|
||||||
|
BOOLEAN TxLockFlag;
|
||||||
|
u16 gen_null_pkg;
|
||||||
|
// spinlock_t CurrentTxLock __ATTRIB_ALIGN__;
|
||||||
|
// int CurrentTxLock ; //temporarily
|
||||||
|
/** NIC Operation characteristics */
|
||||||
|
u16 CurrentPacketFilter;
|
||||||
|
u32 MediaConnectStatus;
|
||||||
|
u16 RegionCode;
|
||||||
|
u16 TxPowerLevel;
|
||||||
|
u8 MaxTxPowerLevel;
|
||||||
|
u8 MinTxPowerLevel;
|
||||||
|
|
||||||
|
/** POWER MANAGEMENT AND PnP SUPPORT */
|
||||||
|
BOOLEAN SurpriseRemoved;
|
||||||
|
u16 AtimWindow;
|
||||||
|
|
||||||
|
u16 PSMode; /* Wlan802_11PowerModeCAM=disable
|
||||||
|
Wlan802_11PowerModeMAX_PSP=enable */
|
||||||
|
u16 MultipleDtim;
|
||||||
|
u16 BCNMissTimeOut;
|
||||||
|
u32 PSState;
|
||||||
|
BOOLEAN NeedToWakeup;
|
||||||
|
|
||||||
|
PS_CMD_ConfirmSleep PSConfirmSleep;
|
||||||
|
u16 LocalListenInterval;
|
||||||
|
u16 NullPktInterval;
|
||||||
|
u16 AdhocAwakePeriod;
|
||||||
|
u16 fwWakeupMethod;
|
||||||
|
BOOLEAN IsDeepSleep;
|
||||||
|
BOOLEAN bWakeupDevRequired;
|
||||||
|
u32 WakeupTries;
|
||||||
|
BOOLEAN bHostSleepConfigured;
|
||||||
|
HostCmd_DS_802_11_HOST_SLEEP_CFG HSCfg;
|
||||||
|
/** ARP filter related variable */
|
||||||
|
u8 ArpFilter[ARP_FILTER_MAX_BUF_SIZE];
|
||||||
|
u32 ArpFilterSize;
|
||||||
|
|
||||||
|
/** Encryption parameter */
|
||||||
|
wlan_802_11_security_t SecInfo;
|
||||||
|
|
||||||
|
MRVL_WEP_KEY WepKey[MRVL_NUM_WEP_KEY];
|
||||||
|
u16 CurrentWepKeyIndex;
|
||||||
|
|
||||||
|
/** Buffer for TLVs passed from the application to be inserted into the
|
||||||
|
* association request to firmware
|
||||||
|
*/
|
||||||
|
u8 mrvlAssocTlvBuffer[MRVDRV_ASSOC_TLV_BUF_SIZE];
|
||||||
|
|
||||||
|
/** Length of the data stored in mrvlAssocTlvBuffer*/
|
||||||
|
u8 mrvlAssocTlvBufferLen;
|
||||||
|
|
||||||
|
/** Buffer to store the association response for application retrieval */
|
||||||
|
u8 assocRspBuffer[MRVDRV_ASSOC_RSP_BUF_SIZE];
|
||||||
|
|
||||||
|
/** Length of the data stored in assocRspBuffer */
|
||||||
|
int assocRspSize;
|
||||||
|
|
||||||
|
/** Generice IEEE IEs passed from the application to be inserted into the
|
||||||
|
* association request to firmware
|
||||||
|
*/
|
||||||
|
u8 genIeBuffer[MRVDRV_GENIE_BUF_SIZE];
|
||||||
|
|
||||||
|
/** Length of the data stored in genIeBuffer */
|
||||||
|
u8 genIeBufferLen;
|
||||||
|
|
||||||
|
BOOLEAN IsGTK_SET;
|
||||||
|
|
||||||
|
/** Encryption Key*/
|
||||||
|
u8 Wpa_ie[256];
|
||||||
|
u8 Wpa_ie_len;
|
||||||
|
|
||||||
|
HostCmd_DS_802_11_KEY_MATERIAL aeskey;
|
||||||
|
|
||||||
|
/* Advanced Encryption Standard */
|
||||||
|
BOOLEAN AdhocAESEnabled;
|
||||||
|
struct rt_event cmd_EncKey;
|
||||||
|
|
||||||
|
u16 RxAntennaMode;
|
||||||
|
u16 TxAntennaMode;
|
||||||
|
|
||||||
|
/** Requested Signal Strength*/
|
||||||
|
u16 bcn_avg_factor;
|
||||||
|
u16 data_avg_factor;
|
||||||
|
u16 SNR[MAX_TYPE_B][MAX_TYPE_AVG];
|
||||||
|
u16 NF[MAX_TYPE_B][MAX_TYPE_AVG];
|
||||||
|
u8 RSSI[MAX_TYPE_B][MAX_TYPE_AVG];
|
||||||
|
u8 rawSNR[DEFAULT_DATA_AVG_FACTOR];
|
||||||
|
u8 rawNF[DEFAULT_DATA_AVG_FACTOR];
|
||||||
|
u16 nextSNRNF;
|
||||||
|
u16 numSNRNF;
|
||||||
|
u32 RxPDAge;
|
||||||
|
u16 RxPDRate;
|
||||||
|
|
||||||
|
BOOLEAN RadioOn;
|
||||||
|
|
||||||
|
/** Blue Tooth Co-existence Arbitration */
|
||||||
|
HostCmd_DS_802_11_BCA_TIMESHARE bca_ts;
|
||||||
|
|
||||||
|
/** sleep_params */
|
||||||
|
SleepParams sp;
|
||||||
|
|
||||||
|
/** sleep_period (Enhanced Power Save) */
|
||||||
|
SleepPeriod sleep_period;
|
||||||
|
|
||||||
|
#define MAX_REGION_CHANNEL_NUM 2
|
||||||
|
/** Region Channel data */
|
||||||
|
REGION_CHANNEL region_channel[MAX_REGION_CHANNEL_NUM];
|
||||||
|
|
||||||
|
REGION_CHANNEL universal_channel[MAX_REGION_CHANNEL_NUM];
|
||||||
|
|
||||||
|
/** 11D and Domain Regulatory Data */
|
||||||
|
wlan_802_11d_domain_reg_t DomainReg;
|
||||||
|
parsed_region_chan_11d_t parsed_region_chan;
|
||||||
|
|
||||||
|
/** FSM variable for 11d support */
|
||||||
|
wlan_802_11d_state_t State11D;
|
||||||
|
u8 beaconBuffer[MAX_SCAN_BEACON_BUFFER];
|
||||||
|
u8 *pBeaconBufEnd;
|
||||||
|
|
||||||
|
HostCmd_DS_802_11_GET_LOG LogMsg;
|
||||||
|
u16 ScanProbes;
|
||||||
|
|
||||||
|
u32 PktTxCtrl;
|
||||||
|
|
||||||
|
u8 *helper;
|
||||||
|
u32 helper_len;
|
||||||
|
u8 *fmimage;
|
||||||
|
u32 fmimage_len;
|
||||||
|
u16 TxRate;
|
||||||
|
|
||||||
|
wps_t wps;
|
||||||
|
|
||||||
|
wlan_dbg dbg;
|
||||||
|
wlan_subscribe_event subevent;
|
||||||
|
u32 num_cmd_timeout;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* _WLAN_DEV_H_ */
|
|
@ -0,0 +1,471 @@
|
||||||
|
/** @file wlan_fw.c
|
||||||
|
* @brief This file contains the initialization for FW
|
||||||
|
* and HW
|
||||||
|
*
|
||||||
|
* Copyright © Marvell International Ltd. and/or its affiliates, 2003-2006
|
||||||
|
*/
|
||||||
|
/********************************************************
|
||||||
|
Change log:
|
||||||
|
09/28/05: Add Doxygen format comments
|
||||||
|
01/05/06: Add kernel 2.6.x support
|
||||||
|
01/11/06: Conditionalize new scan/join functions.
|
||||||
|
Cleanup association response handler initialization.
|
||||||
|
01/06/05: Add FW file read
|
||||||
|
05/08/06: Remove the 2nd GET_HW_SPEC command and TempAddr/PermanentAddr
|
||||||
|
06/30/06: replaced MODULE_PARM(name, type) with module_param(name, type, perm)
|
||||||
|
|
||||||
|
********************************************************/
|
||||||
|
|
||||||
|
#include "include.h"
|
||||||
|
#include "gspibin.h"
|
||||||
|
#include "helper_gspi.h"
|
||||||
|
#include "wlan_debug.h"
|
||||||
|
//#include <linux/vmalloc.h>
|
||||||
|
|
||||||
|
/********************************************************
|
||||||
|
Local Variables
|
||||||
|
********************************************************/
|
||||||
|
|
||||||
|
char *helper_name = NULL;
|
||||||
|
char *fw_name = NULL;
|
||||||
|
|
||||||
|
/********************************************************
|
||||||
|
Global Variables
|
||||||
|
********************************************************/
|
||||||
|
|
||||||
|
/********************************************************
|
||||||
|
Local Functions
|
||||||
|
********************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function downloads firmware image, gets
|
||||||
|
* HW spec from firmware and set basic parameters to
|
||||||
|
* firmware.
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
wlan_download_firmware(wlan_private * priv)
|
||||||
|
{
|
||||||
|
int ret = WLAN_STATUS_SUCCESS;
|
||||||
|
wlan_adapter *adapter = priv->adapter;
|
||||||
|
u8 *ptr = NULL;
|
||||||
|
u8* temp1;
|
||||||
|
u32 len = 0;
|
||||||
|
|
||||||
|
HostCmd_DS_CMD_GSPI_BUS_CONFIG bus_config;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
sbi_disable_host_int(priv);
|
||||||
|
|
||||||
|
adapter->fmimage = NULL;
|
||||||
|
adapter->fmimage_len = 0;
|
||||||
|
adapter->helper = NULL;
|
||||||
|
adapter->helper_len = 0;
|
||||||
|
ptr=(u8*)helpgspibin;
|
||||||
|
len=sizeof(helpgspibin);
|
||||||
|
|
||||||
|
|
||||||
|
adapter->helper = ptr;
|
||||||
|
adapter->helper_len = len;
|
||||||
|
wlan_debug2("helper read success, len=%x\n", len);
|
||||||
|
|
||||||
|
ptr=(u8*)gspi8686bin;
|
||||||
|
len=sizeof(gspi8686bin);
|
||||||
|
|
||||||
|
|
||||||
|
adapter->fmimage = ptr;
|
||||||
|
adapter->fmimage_len = len;
|
||||||
|
|
||||||
|
|
||||||
|
/* Download the helper */
|
||||||
|
ret = sbi_prog_helper(priv);
|
||||||
|
|
||||||
|
if (ret) {
|
||||||
|
wlan_debug1("down load helper failed!\n");
|
||||||
|
ret = WLAN_STATUS_FAILURE;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
/* Download firmware */
|
||||||
|
if (sbi_prog_firmware_w_helper(priv)) {
|
||||||
|
wlan_debug1("down load firmware unsuccessful\n");
|
||||||
|
ret = WLAN_STATUS_FAILURE;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* check if the fimware is downloaded successfully or not */
|
||||||
|
if (sbi_verify_fw_download(priv)) {
|
||||||
|
wlan_debug1( "FW failed to be active in time!\n");
|
||||||
|
ret = WLAN_STATUS_FAILURE;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
wlan_debug3(" fw has been load to board\n ");
|
||||||
|
#define RF_REG_OFFSET 0x07
|
||||||
|
#define RF_REG_VALUE 0xc8
|
||||||
|
|
||||||
|
sbi_enable_host_int(priv);
|
||||||
|
|
||||||
|
#define SPI_BMR_DELAY_METHOD B_BIT_2
|
||||||
|
#define SPI_BMR_BUSMODE_16_16 0x02 //16bit address and 16bit data
|
||||||
|
g_bus_mode_reg = SPI_BMR_BUSMODE_16_16 | SPI_BMR_DELAY_METHOD;
|
||||||
|
g_dummy_clk_ioport = 1;
|
||||||
|
g_dummy_clk_reg = 1;
|
||||||
|
bus_config.BusDelayMode = g_bus_mode_reg;
|
||||||
|
bus_config.HostTimeDelayToReadPort = g_dummy_clk_ioport * 16;
|
||||||
|
bus_config.HostTimeDelayToReadregister = g_dummy_clk_reg * 16;
|
||||||
|
wlan_debug3 ("Setting for %d %d\n", g_dummy_clk_ioport,
|
||||||
|
g_dummy_clk_reg);
|
||||||
|
ret =PrepareAndSendCommand(priv, HostCmd_CMD_GSPI_BUS_CONFIG,
|
||||||
|
HostCmd_ACT_GEN_SET,
|
||||||
|
HostCmd_OPTION_WAITFORRSP, 0, &bus_config);
|
||||||
|
if (ret) {
|
||||||
|
ret = WLAN_STATUS_FAILURE;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
wlan_debug3("Hostcmd_CMD_GSPI_BUS_CONFIG OK\n ");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Read MAC address from HW
|
||||||
|
*/
|
||||||
|
memset(adapter->CurrentAddr, 0xff, MRVDRV_ETH_ADDR_LEN);
|
||||||
|
|
||||||
|
ret = PrepareAndSendCommand(priv, HostCmd_CMD_GET_HW_SPEC,
|
||||||
|
0, HostCmd_OPTION_WAITFORRSP, 0, NULL);
|
||||||
|
|
||||||
|
if (ret) {
|
||||||
|
ret = WLAN_STATUS_FAILURE;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
temp1=adapter->CurrentAddr;
|
||||||
|
wlan_debug3 ("Hostcmd_CMD_GET_HW_SPEC OK:%x,%x,%x,%x,%x,%x,%x,%x\n",
|
||||||
|
temp1[0],temp1[1],temp1[2],temp1[3],temp1[4],temp1[5],temp1[6],temp1[7]);
|
||||||
|
|
||||||
|
ret = PrepareAndSendCommand(priv,
|
||||||
|
HostCmd_CMD_MAC_CONTROL,
|
||||||
|
0, HostCmd_OPTION_WAITFORRSP, 0,
|
||||||
|
&adapter->CurrentPacketFilter);
|
||||||
|
|
||||||
|
if (ret) {
|
||||||
|
ret = WLAN_STATUS_FAILURE;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
wlan_debug2("Hostcmd_CMD_MAC_CONTROL OK\n");
|
||||||
|
|
||||||
|
ret = PrepareAndSendCommand(priv,
|
||||||
|
HostCmd_CMD_802_11_FW_WAKE_METHOD,
|
||||||
|
HostCmd_ACT_GET,
|
||||||
|
HostCmd_OPTION_WAITFORRSP, 0,
|
||||||
|
&priv->adapter->fwWakeupMethod);
|
||||||
|
|
||||||
|
if (ret) {
|
||||||
|
ret = WLAN_STATUS_FAILURE;
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
}
|
||||||
|
ret = PrepareAndSendCommand(priv,
|
||||||
|
HostCmd_CMD_802_11_RATE_ADAPT_RATESET,
|
||||||
|
HostCmd_ACT_GEN_GET,
|
||||||
|
HostCmd_OPTION_WAITFORRSP, 0, NULL);
|
||||||
|
if (ret) {
|
||||||
|
ret = WLAN_STATUS_FAILURE;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
priv->adapter->DataRate = 0;
|
||||||
|
ret = PrepareAndSendCommand(priv,
|
||||||
|
HostCmd_CMD_802_11_RF_TX_POWER,
|
||||||
|
HostCmd_ACT_GEN_GET,
|
||||||
|
HostCmd_OPTION_WAITFORRSP, 0, NULL);
|
||||||
|
|
||||||
|
if (ret) {
|
||||||
|
ret = WLAN_STATUS_FAILURE;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
wlan_debug3("Hostcmd_CMD_802_11_RF_TX_POWER OK\n ");
|
||||||
|
|
||||||
|
ret = WLAN_STATUS_SUCCESS;
|
||||||
|
done:
|
||||||
|
LEAVE();
|
||||||
|
|
||||||
|
return (ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function initializes timers.
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @return n/a
|
||||||
|
*/
|
||||||
|
static void init_sync_objects(wlan_private * priv)
|
||||||
|
{
|
||||||
|
wlan_adapter *Adapter = priv->adapter;
|
||||||
|
|
||||||
|
InitializeTimer(&Adapter->MrvDrvCommandTimer,
|
||||||
|
MrvDrvCommandTimerFunction, priv,"cmdtimer");
|
||||||
|
Adapter->CommandTimerIsSet = FALSE;
|
||||||
|
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function allocates buffer for the member of adapter
|
||||||
|
* structure like command buffer and BSSID list.
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
wlan_allocate_adapter(wlan_private * priv)
|
||||||
|
{
|
||||||
|
u32 ulBufSize;
|
||||||
|
wlan_adapter *Adapter = priv->adapter;
|
||||||
|
|
||||||
|
BSSDescriptor_t *pTempScanTable;
|
||||||
|
|
||||||
|
/* Allocate buffer to store the BSSID list */
|
||||||
|
ulBufSize = sizeof(BSSDescriptor_t) * MRVDRV_MAX_BSSID_LIST;
|
||||||
|
pTempScanTable = (BSSDescriptor_t *)rt_malloc(ulBufSize);
|
||||||
|
if (!pTempScanTable) {
|
||||||
|
return WLAN_STATUS_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
Adapter->ScanTable = pTempScanTable;
|
||||||
|
memset(Adapter->ScanTable, 0, ulBufSize);
|
||||||
|
Adapter->bgScanConfig =(HostCmd_DS_802_11_BG_SCAN_CONFIG *)rt_malloc(sizeof(HostCmd_DS_802_11_BG_SCAN_CONFIG));
|
||||||
|
if (!Adapter->bgScanConfig) {
|
||||||
|
return WLAN_STATUS_FAILURE;
|
||||||
|
}
|
||||||
|
Adapter->bgScanConfigSize = sizeof(HostCmd_DS_802_11_BG_SCAN_CONFIG);
|
||||||
|
memset(Adapter->bgScanConfig, 0, Adapter->bgScanConfigSize);
|
||||||
|
|
||||||
|
/* Allocate the command buffers */
|
||||||
|
if (AllocateCmdBuffer(priv) != WLAN_STATUS_SUCCESS) {
|
||||||
|
return WLAN_STATUS_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(&Adapter->PSConfirmSleep, 0, sizeof(PS_CMD_ConfirmSleep));
|
||||||
|
Adapter->PSConfirmSleep.SeqNum = (++Adapter->SeqNum);
|
||||||
|
Adapter->PSConfirmSleep.Command =(HostCmd_CMD_802_11_PS_MODE);
|
||||||
|
Adapter->PSConfirmSleep.Size =(sizeof(PS_CMD_ConfirmSleep));
|
||||||
|
Adapter->PSConfirmSleep.Result = 0;
|
||||||
|
Adapter->PSConfirmSleep.Action =(HostCmd_SubCmd_Sleep_Confirmed);
|
||||||
|
|
||||||
|
return WLAN_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function initializes the adapter structure
|
||||||
|
* and set default value to the member of adapter.
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @return n/a
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
wlan_init_adapter(wlan_private * priv)
|
||||||
|
{
|
||||||
|
wlan_adapter *Adapter = priv->adapter;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
Adapter->ScanProbes = 0;
|
||||||
|
|
||||||
|
Adapter->bcn_avg_factor = DEFAULT_BCN_AVG_FACTOR;
|
||||||
|
Adapter->data_avg_factor = DEFAULT_DATA_AVG_FACTOR;
|
||||||
|
|
||||||
|
/* ATIM params */
|
||||||
|
Adapter->AtimWindow = 0;
|
||||||
|
Adapter->ATIMEnabled = FALSE;
|
||||||
|
|
||||||
|
Adapter->MediaConnectStatus = WlanMediaStateDisconnected;
|
||||||
|
memset(Adapter->CurrentAddr, 0xff, MRVDRV_ETH_ADDR_LEN);
|
||||||
|
|
||||||
|
/* Status variables */
|
||||||
|
Adapter->HardwareStatus = WlanHardwareStatusInitializing;
|
||||||
|
|
||||||
|
/* scan type */
|
||||||
|
Adapter->ScanType = HostCmd_SCAN_TYPE_ACTIVE;
|
||||||
|
|
||||||
|
/* scan mode */
|
||||||
|
Adapter->ScanMode = HostCmd_BSS_TYPE_ANY;
|
||||||
|
|
||||||
|
/* scan time */
|
||||||
|
Adapter->SpecificScanTime = MRVDRV_SPECIFIC_SCAN_CHAN_TIME;
|
||||||
|
Adapter->ActiveScanTime = MRVDRV_ACTIVE_SCAN_CHAN_TIME;
|
||||||
|
Adapter->PassiveScanTime = MRVDRV_PASSIVE_SCAN_CHAN_TIME;
|
||||||
|
|
||||||
|
/* 802.11 specific */
|
||||||
|
Adapter->SecInfo.WEPStatus = Wlan802_11WEPDisabled;
|
||||||
|
for (i = 0; i < sizeof(Adapter->WepKey) / sizeof(Adapter->WepKey[0]); i++)
|
||||||
|
memset(&Adapter->WepKey[i], 0, sizeof(MRVL_WEP_KEY));
|
||||||
|
Adapter->CurrentWepKeyIndex = 0;
|
||||||
|
Adapter->SecInfo.AuthenticationMode = Wlan802_11AuthModeOpen;
|
||||||
|
Adapter->SecInfo.EncryptionMode = CIPHER_NONE;
|
||||||
|
|
||||||
|
///////ADD FOR WEP TEST//////////
|
||||||
|
Adapter->SecInfo.WPAEnabled = FALSE;
|
||||||
|
Adapter->SecInfo.WPA2Enabled= FALSE;
|
||||||
|
Adapter->mrvlAssocTlvBufferLen=0;
|
||||||
|
///////ADD FOR WEP TEST//////////
|
||||||
|
|
||||||
|
Adapter->AdhocAESEnabled = FALSE;
|
||||||
|
Adapter->InfrastructureMode = Wlan802_11Infrastructure;
|
||||||
|
|
||||||
|
Adapter->NumInScanTable = 0;
|
||||||
|
Adapter->pAttemptedBSSDesc = NULL;
|
||||||
|
Adapter->pBeaconBufEnd = Adapter->beaconBuffer;
|
||||||
|
|
||||||
|
Adapter->HisRegCpy |= HIS_TxDnLdRdy;
|
||||||
|
|
||||||
|
memset(&Adapter->CurBssParams, 0, sizeof(Adapter->CurBssParams));
|
||||||
|
|
||||||
|
/* PnP and power profile */
|
||||||
|
Adapter->SurpriseRemoved = FALSE;
|
||||||
|
|
||||||
|
Adapter->CurrentPacketFilter =
|
||||||
|
HostCmd_ACT_MAC_RX_ON | HostCmd_ACT_MAC_TX_ON;
|
||||||
|
|
||||||
|
Adapter->RadioOn = RADIO_ON;
|
||||||
|
Adapter->TxAntenna = RF_ANTENNA_2;
|
||||||
|
Adapter->RxAntenna = RF_ANTENNA_AUTO;
|
||||||
|
|
||||||
|
Adapter->HWRateDropMode = HW_TABLE_RATE_DROP;
|
||||||
|
Adapter->Is_DataRate_Auto = TRUE;
|
||||||
|
Adapter->BeaconPeriod = MRVDRV_BEACON_INTERVAL;
|
||||||
|
|
||||||
|
Adapter->AdhocChannel = DEFAULT_AD_HOC_CHANNEL;
|
||||||
|
|
||||||
|
Adapter->PSMode = Wlan802_11PowerModeCAM;
|
||||||
|
Adapter->MultipleDtim = MRVDRV_DEFAULT_MULTIPLE_DTIM;
|
||||||
|
|
||||||
|
Adapter->ListenInterval = MRVDRV_DEFAULT_LISTEN_INTERVAL;
|
||||||
|
|
||||||
|
Adapter->PSState = PS_STATE_FULL_POWER;
|
||||||
|
Adapter->NeedToWakeup = FALSE;
|
||||||
|
Adapter->LocalListenInterval = 0; /* default value in firmware will be used */
|
||||||
|
Adapter->fwWakeupMethod = WAKEUP_FW_UNCHANGED;
|
||||||
|
|
||||||
|
Adapter->IsDeepSleep = FALSE;
|
||||||
|
|
||||||
|
Adapter->bWakeupDevRequired = FALSE;
|
||||||
|
Adapter->WakeupTries = 0;
|
||||||
|
Adapter->bHostSleepConfigured = FALSE;
|
||||||
|
Adapter->HSCfg.conditions = HOST_SLEEP_CFG_CANCEL;
|
||||||
|
Adapter->HSCfg.gpio = 0;
|
||||||
|
Adapter->HSCfg.gap = 0;
|
||||||
|
|
||||||
|
Adapter->DataRate = 0; // Initially indicate the rate as auto
|
||||||
|
|
||||||
|
Adapter->adhoc_grate_enabled = FALSE;
|
||||||
|
|
||||||
|
Adapter->IntCounter = Adapter->IntCounterSaved = 0;
|
||||||
|
|
||||||
|
INIT_LIST_HEAD((struct list_head *) &Adapter->RxSkbQ);
|
||||||
|
|
||||||
|
Adapter->gen_null_pkg = TRUE; /*Enable NULL Pkg generation */
|
||||||
|
|
||||||
|
|
||||||
|
rt_event_init(&Adapter->cmd_EncKey, "EncKeyevt", RT_IPC_FLAG_FIFO); //which thread wait on this queue
|
||||||
|
|
||||||
|
|
||||||
|
Adapter->CurrentTxSkb = NULL;
|
||||||
|
Adapter->PktTxCtrl = 0;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/********************************************************
|
||||||
|
Global Functions
|
||||||
|
********************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function initializes firmware
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
wlan_init_fw(wlan_private * priv)
|
||||||
|
{
|
||||||
|
int ret = WLAN_STATUS_SUCCESS;
|
||||||
|
wlan_adapter *Adapter = priv->adapter;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
/* Allocate adapter structure */
|
||||||
|
if ((ret = wlan_allocate_adapter(priv)) != WLAN_STATUS_SUCCESS) {
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* init adapter structure */
|
||||||
|
wlan_init_adapter(priv);
|
||||||
|
|
||||||
|
/* init timer etc. */
|
||||||
|
init_sync_objects(priv);
|
||||||
|
|
||||||
|
/* download fimrware etc. */
|
||||||
|
if ((ret = wlan_download_firmware(priv)) != WLAN_STATUS_SUCCESS) {
|
||||||
|
Adapter->HardwareStatus = WlanHardwareStatusNotReady;
|
||||||
|
ret = WLAN_STATUS_FAILURE;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
/* init 802.11d */
|
||||||
|
wlan_init_11d(priv);
|
||||||
|
|
||||||
|
Adapter->HardwareStatus = WlanHardwareStatusReady;
|
||||||
|
ret = WLAN_STATUS_SUCCESS;
|
||||||
|
done:
|
||||||
|
LEAVE();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function frees the structure of adapter
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @return n/a
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
wlan_free_adapter(wlan_private * priv)
|
||||||
|
{
|
||||||
|
wlan_adapter *Adapter = priv->adapter;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
if (!Adapter) {
|
||||||
|
wlan_debug1( "Why double free adapter?:)\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
wlan_debug3("Free Command buffer\n");
|
||||||
|
FreeCmdBuffer(priv);
|
||||||
|
|
||||||
|
wlan_debug2("Free CommandTimer\n");
|
||||||
|
if (Adapter->CommandTimerIsSet) {
|
||||||
|
CancelTimer(&Adapter->MrvDrvCommandTimer);
|
||||||
|
Adapter->CommandTimerIsSet = FALSE;
|
||||||
|
}
|
||||||
|
FreeTimer(&Adapter->MrvDrvCommandTimer);
|
||||||
|
|
||||||
|
if (Adapter->bgScanConfig) {
|
||||||
|
rt_free(Adapter->bgScanConfig);
|
||||||
|
Adapter->bgScanConfig = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
wlan_debug3("Free ScanTable\n");
|
||||||
|
if (Adapter->ScanTable) {
|
||||||
|
rt_free(Adapter->ScanTable);
|
||||||
|
Adapter->ScanTable = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
wlan_debug3("Free Adapter\n");
|
||||||
|
|
||||||
|
/* Free the adapter object itself */
|
||||||
|
rt_free(Adapter);
|
||||||
|
priv->adapter = NULL;
|
||||||
|
LEAVE();
|
||||||
|
}
|
|
@ -0,0 +1,955 @@
|
||||||
|
/** @file wlan_join.c
|
||||||
|
*
|
||||||
|
* @brief Functions implementing wlan infrastructure and adhoc join routines
|
||||||
|
*
|
||||||
|
* IOCTL handlers as well as command preperation and response routines
|
||||||
|
* for sending adhoc start, adhoc join, and association commands
|
||||||
|
* to the firmware.
|
||||||
|
*
|
||||||
|
* Copyright © Marvell International Ltd. and/or its affiliates, 2003-2006
|
||||||
|
*
|
||||||
|
* @sa wlan_join.h
|
||||||
|
*/
|
||||||
|
/*************************************************************
|
||||||
|
Change Log:
|
||||||
|
01/11/06: Initial revision. Match new scan code, relocate related functions
|
||||||
|
01/19/06: Fix failure to save adhoc ssid as current after adhoc start
|
||||||
|
03/16/06: Add a semaphore to protect reassociation thread
|
||||||
|
|
||||||
|
************************************************************/
|
||||||
|
|
||||||
|
#include "include.h"
|
||||||
|
#include "rt_wlan_dev.h"
|
||||||
|
#define EBUSY 1000
|
||||||
|
#define ENOTSUPP 1001
|
||||||
|
BOOLEAN
|
||||||
|
Is_Command_Allowed(wlan_private * priv)
|
||||||
|
{
|
||||||
|
BOOLEAN ret = TRUE;
|
||||||
|
|
||||||
|
{
|
||||||
|
if ((priv->adapter->IsDeepSleep == TRUE)) {
|
||||||
|
wlan_debug3("IOCTLS called when station is in DeepSleep\n");
|
||||||
|
ret = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @brief This function finds out the common rates between rate1 and rate2.
|
||||||
|
*
|
||||||
|
* It will fill common rates in rate1 as output if found.
|
||||||
|
*
|
||||||
|
* NOTE: Setting the MSB of the basic rates need to be taken
|
||||||
|
* care, either before or after calling this function
|
||||||
|
*
|
||||||
|
* @param Adapter A pointer to wlan_adapter structure
|
||||||
|
* @param rate1 the buffer which keeps input and output
|
||||||
|
* @param rate1_size the size of rate1 buffer
|
||||||
|
* @param rate2 the buffer which keeps rate2
|
||||||
|
* @param rate2_size the size of rate2 buffer.
|
||||||
|
*
|
||||||
|
* @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
get_common_rates(wlan_adapter * Adapter, u8 * rate1,
|
||||||
|
int rate1_size, u8 * rate2, int rate2_size)
|
||||||
|
{
|
||||||
|
u8 *ptr = rate1;
|
||||||
|
int ret = WLAN_STATUS_SUCCESS;
|
||||||
|
u8 *tmp = NULL;
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
if (!(tmp = (u8*)malloc(rate1_size))) {
|
||||||
|
wlan_debug3("Allocate buffer for common rates failed\n");
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(tmp, rate1, rate1_size);
|
||||||
|
memset(rate1, 0, rate1_size);
|
||||||
|
|
||||||
|
for (i = 0; rate2[i] && i < rate2_size; i++) {
|
||||||
|
for (j = 0; tmp[j] && j < rate1_size; j++) {
|
||||||
|
/* Check common rate, excluding the bit for basic rate */
|
||||||
|
if ((rate2[i] & 0x7F) == (tmp[j] & 0x7F)) {
|
||||||
|
*rate1++ = tmp[j];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!Adapter->Is_DataRate_Auto) {
|
||||||
|
while (*ptr) {
|
||||||
|
if ((*ptr & 0x7f) == Adapter->DataRate) {
|
||||||
|
ret = WLAN_STATUS_SUCCESS;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
ptr++;
|
||||||
|
}
|
||||||
|
wlan_debug3("Previously set fixed data rate %#x isn't "
|
||||||
|
"compatible with the network.\n", Adapter->DataRate);
|
||||||
|
|
||||||
|
ret = WLAN_STATUS_FAILURE;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = WLAN_STATUS_SUCCESS;
|
||||||
|
done:
|
||||||
|
free(tmp);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Create the intersection of the rates supported by a target BSS and
|
||||||
|
* our Adapter settings for use in an assoc/join command.
|
||||||
|
*
|
||||||
|
* @param Adapter A pointer to wlan_adapter structure
|
||||||
|
* @param pBSSDesc BSS Descriptor whose rates are used in the setup
|
||||||
|
* @param pOutRates Output: Octet array of rates common between the BSS
|
||||||
|
* and the Adapter supported rates settings
|
||||||
|
* @param pOutRatesSize Output: Number of rates/octets set in pOutRates
|
||||||
|
*
|
||||||
|
* @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
setup_rates_from_bssdesc(wlan_adapter * Adapter,
|
||||||
|
BSSDescriptor_t * pBSSDesc,
|
||||||
|
u8 * pOutRates, int *pOutRatesSize)
|
||||||
|
{
|
||||||
|
u8 *card_rates;
|
||||||
|
int card_rates_size;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
memcpy(pOutRates, pBSSDesc->SupportedRates, WLAN_SUPPORTED_RATES);
|
||||||
|
|
||||||
|
card_rates = SupportedRates;
|
||||||
|
card_rates_size = sizeof(SupportedRates);
|
||||||
|
|
||||||
|
if (get_common_rates(Adapter, pOutRates, WLAN_SUPPORTED_RATES,
|
||||||
|
card_rates, card_rates_size)) {
|
||||||
|
*pOutRatesSize = 0;
|
||||||
|
wlan_debug2( "get_common_rates failed\n");
|
||||||
|
LEAVE();
|
||||||
|
return WLAN_STATUS_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
*pOutRatesSize = MIN(strlen(pOutRates), WLAN_SUPPORTED_RATES);
|
||||||
|
|
||||||
|
LEAVE();
|
||||||
|
|
||||||
|
return WLAN_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @brief Connect to the AP or Ad-hoc Network with specific bssid
|
||||||
|
*
|
||||||
|
* NOTE: Scan should be issued by application before this function is called
|
||||||
|
*
|
||||||
|
* @param dev A pointer to net_device structure
|
||||||
|
* @param info A pointer to iw_request_info structure
|
||||||
|
* @param awrq A pointer to iw_param structure
|
||||||
|
* @param extra A pointer to extra data buf
|
||||||
|
* @return WLAN_STATUS_SUCCESS --success, otherwise fail
|
||||||
|
*/
|
||||||
|
int wlan_set_wap (struct rt_wlan_dev *dev, char * dstbssid,int len)
|
||||||
|
{
|
||||||
|
|
||||||
|
wlan_private *priv = dev->priv;
|
||||||
|
wlan_adapter *Adapter = priv->adapter;
|
||||||
|
int ret = WLAN_STATUS_SUCCESS;
|
||||||
|
const u8 bcast[ETH_ALEN] = { 255, 255, 255, 255, 255, 255 };
|
||||||
|
u8 reqBSSID[ETH_ALEN];
|
||||||
|
int i;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
if(len!=ETH_ALEN)
|
||||||
|
return -WLANEPARAMETER;
|
||||||
|
if (!Is_Command_Allowed(priv)) {
|
||||||
|
wlan_debug1( "%s: not allowed\n", __FUNCTION__);
|
||||||
|
return -EBUSY;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Clear any past association response stored for application retrieval */
|
||||||
|
Adapter->assocRspSize = 0;
|
||||||
|
|
||||||
|
wlan_debug3("ASSOC: WAP: sa_data: %02x:%02x:%02x:%02x:%02x:%02x\n",
|
||||||
|
(u8) dstbssid[0], (u8) dstbssid[1],
|
||||||
|
(u8) dstbssid[2], (u8) dstbssid[3],
|
||||||
|
(u8) dstbssid[4], (u8) dstbssid[5]);
|
||||||
|
|
||||||
|
#ifdef REASSOCIATION
|
||||||
|
// cancel re-association timer if there's one
|
||||||
|
if (Adapter->ReassocTimerIsSet == TRUE) {
|
||||||
|
CancelTimer(&Adapter->MrvDrvTimer);
|
||||||
|
Adapter->ReassocTimerIsSet = FALSE;
|
||||||
|
}
|
||||||
|
#endif /* REASSOCIATION */
|
||||||
|
|
||||||
|
if (!memcmp(bcast, dstbssid, ETH_ALEN)) {
|
||||||
|
i = FindBestSSIDInList(Adapter);
|
||||||
|
} else {
|
||||||
|
memcpy(reqBSSID, dstbssid, ETH_ALEN);
|
||||||
|
|
||||||
|
wlan_debug3( "ASSOC: WAP: Bssid = %02x:%02x:%02x:%02x:%02x:%02x\n",
|
||||||
|
dstbssid[0], dstbssid[1], dstbssid[2],
|
||||||
|
dstbssid[3], dstbssid[4], dstbssid[5]);
|
||||||
|
|
||||||
|
/* Search for index position in list for requested MAC */
|
||||||
|
i = FindBSSIDInList(Adapter, reqBSSID, Adapter->InfrastructureMode);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i < 0) {
|
||||||
|
wlan_debug1( "ASSOC: WAP: MAC address not found in BSSID List\n");
|
||||||
|
return -ENETUNREACH;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Adapter->InfrastructureMode == Wlan802_11Infrastructure) {
|
||||||
|
|
||||||
|
ret = wlan_associate(priv, &Adapter->ScanTable[i]);
|
||||||
|
|
||||||
|
if (ret) {
|
||||||
|
LEAVE();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check to see if we successfully connected */
|
||||||
|
if (Adapter->MediaConnectStatus == WlanMediaStateConnected) {
|
||||||
|
ret = WLAN_STATUS_SUCCESS;
|
||||||
|
} else {
|
||||||
|
ret = -ENETDOWN;
|
||||||
|
}
|
||||||
|
|
||||||
|
LEAVE();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Associated to a specific BSS discovered in a scan
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @param pBSSDesc Pointer to the BSS descriptor to associate with.
|
||||||
|
*
|
||||||
|
* @return WLAN_STATUS_SUCCESS-success, otherwise fail
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
wlan_associate(wlan_private * priv, BSSDescriptor_t * pBSSDesc)
|
||||||
|
{
|
||||||
|
wlan_adapter *Adapter = priv->adapter;
|
||||||
|
int enableData = TRUE;
|
||||||
|
// union iwreq_data wrqu;
|
||||||
|
int ret;
|
||||||
|
IEEEtypes_AssocRsp_t *pAssocRsp;
|
||||||
|
u8 currentBSSID[MRVDRV_ETH_ADDR_LEN];
|
||||||
|
int reassocAttempt = FALSE;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
/* Return error if the Adapter or table entry is not marked as infra */
|
||||||
|
if ((Adapter->InfrastructureMode != Wlan802_11Infrastructure)
|
||||||
|
|| (pBSSDesc->InfrastructureMode != Wlan802_11Infrastructure)) {
|
||||||
|
LEAVE();
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(¤tBSSID,
|
||||||
|
&Adapter->CurBssParams.BSSDescriptor.MacAddress,
|
||||||
|
sizeof(currentBSSID));
|
||||||
|
|
||||||
|
if (Adapter->MediaConnectStatus == WlanMediaStateConnected) {
|
||||||
|
reassocAttempt = TRUE;
|
||||||
|
wlan_debug3( "Attempting reassociation, stopping wmm queues\n");
|
||||||
|
wmm_stop_queue(priv);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Clear any past association response stored for application retrieval */
|
||||||
|
Adapter->assocRspSize = 0;
|
||||||
|
|
||||||
|
ret = PrepareAndSendCommand(priv, HostCmd_CMD_802_11_ASSOCIATE,
|
||||||
|
0, HostCmd_OPTION_WAITFORRSP, 0, pBSSDesc);
|
||||||
|
|
||||||
|
if (Adapter->wmm.enabled) {
|
||||||
|
/* Don't re-enable carrier until we get the WMM_GET_STATUS event */
|
||||||
|
enableData = FALSE;
|
||||||
|
} else {
|
||||||
|
/* Since WMM is not enabled, setup the queues with the defaults */
|
||||||
|
wmm_setup_queues(priv);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Adapter->MediaConnectStatus == WlanMediaStateConnected) {
|
||||||
|
|
||||||
|
if (reassocAttempt
|
||||||
|
&& (memcmp(¤tBSSID,
|
||||||
|
&Adapter->CurBssParams.BSSDescriptor.MacAddress,
|
||||||
|
sizeof(currentBSSID)) == 0)) {
|
||||||
|
|
||||||
|
/* Reassociation attempt failed, still associated to old AP,
|
||||||
|
** no need to wait for WMM notification to restart data
|
||||||
|
*/
|
||||||
|
enableData = TRUE;
|
||||||
|
}
|
||||||
|
if (enableData) {
|
||||||
|
wlan_debug2( "Post association, re-enabling data flow\n");
|
||||||
|
wmm_start_queue(priv);
|
||||||
|
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
wlan_debug2( "Post association, stopping data flow\n");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// memcpy(wrqu.ap_addr.sa_data,
|
||||||
|
// &Adapter->CurBssParams.BSSDescriptor.MacAddress, ETH_ALEN);
|
||||||
|
// wrqu.ap_addr.sa_family = ARPHRD_ETHER;
|
||||||
|
// wireless_send_event(priv->wlan_dev.netdev, SIOCGIWAP, &wrqu, NULL);
|
||||||
|
|
||||||
|
pAssocRsp = (IEEEtypes_AssocRsp_t *) Adapter->assocRspBuffer;
|
||||||
|
|
||||||
|
if (ret || pAssocRsp->StatusCode) {
|
||||||
|
ret = -ENETUNREACH;
|
||||||
|
}
|
||||||
|
|
||||||
|
LEAVE();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Associated to a specific indexed entry in the ScanTable
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @param tableIdx Index into the ScanTable to associate to, index parameter
|
||||||
|
* base value is 1. No scanning is done before the
|
||||||
|
* association attempt.
|
||||||
|
*
|
||||||
|
* @return WLAN_STATUS_SUCCESS-success, otherwise fail
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
wlan_associate_to_table_idx(wlan_private * priv, int tableIdx)
|
||||||
|
{
|
||||||
|
wlan_adapter *Adapter = priv->adapter;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
wlan_debug3("ASSOC: iwpriv: Index = %d, NumInScanTable = %d\n",
|
||||||
|
tableIdx, Adapter->NumInScanTable);
|
||||||
|
|
||||||
|
/* Check index in table, subtract 1 if within range and call association
|
||||||
|
* sub-function. ScanTable[] is 0 based, parameter is 1 based to
|
||||||
|
* conform with IW_ENCODE_INDEX flag parameter passing in iwconfig/iwlist
|
||||||
|
*/
|
||||||
|
if (tableIdx && (tableIdx <= Adapter->NumInScanTable)) {
|
||||||
|
ret = wlan_associate(priv, &Adapter->ScanTable[tableIdx - 1]);
|
||||||
|
} else {
|
||||||
|
ret = -EINVAL;
|
||||||
|
}
|
||||||
|
LEAVE();
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Send Deauthentication Request
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @return WLAN_STATUS_SUCCESS--success, WLAN_STATUS_FAILURE--fail
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
SendDeauthentication(wlan_private * priv)
|
||||||
|
{
|
||||||
|
return PrepareAndSendCommand(priv, HostCmd_CMD_802_11_DEAUTHENTICATE,
|
||||||
|
0, HostCmd_OPTION_WAITFORRSP, 0, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Append a generic IE as a passthrough TLV to a TLV buffer.
|
||||||
|
*
|
||||||
|
* This function is called from the network join command prep. routine.
|
||||||
|
* If the IE buffer has been setup by the application, this routine appends
|
||||||
|
* the buffer as a passthrough TLV type to the request.
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @param ppBuffer pointer to command buffer pointer
|
||||||
|
*
|
||||||
|
* @return bytes added to the buffer
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
wlan_cmd_append_generic_ie(wlan_private * priv, u8 ** ppBuffer)
|
||||||
|
{
|
||||||
|
wlan_adapter *Adapter = priv->adapter;
|
||||||
|
int retLen = 0;
|
||||||
|
MrvlIEtypesHeader_t ieHeader;
|
||||||
|
|
||||||
|
/* Null Checks */
|
||||||
|
if (ppBuffer == 0)
|
||||||
|
return 0;
|
||||||
|
if (*ppBuffer == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If there is a generic ie buffer setup, append it to the return
|
||||||
|
* parameter buffer pointer.
|
||||||
|
*/
|
||||||
|
if (Adapter->genIeBufferLen) {
|
||||||
|
wlan_debug3("append generic %d to %p\n", Adapter->genIeBufferLen,
|
||||||
|
*ppBuffer);
|
||||||
|
|
||||||
|
/* Wrap the generic IE buffer with a passthrough TLV type */
|
||||||
|
ieHeader.Type = wlan_cpu_to_le16(TLV_TYPE_PASSTHROUGH);
|
||||||
|
ieHeader.Len = wlan_cpu_to_le16(Adapter->genIeBufferLen);
|
||||||
|
memcpy(*ppBuffer, &ieHeader, sizeof(ieHeader));
|
||||||
|
|
||||||
|
/* Increment the return size and the return buffer pointer param */
|
||||||
|
*ppBuffer += sizeof(ieHeader);
|
||||||
|
retLen += sizeof(ieHeader);
|
||||||
|
|
||||||
|
/* Copy the generic IE buffer to the output buffer, advance pointer */
|
||||||
|
memcpy(*ppBuffer, Adapter->genIeBuffer, Adapter->genIeBufferLen);
|
||||||
|
|
||||||
|
/* Increment the return size and the return buffer pointer param */
|
||||||
|
*ppBuffer += Adapter->genIeBufferLen;
|
||||||
|
retLen += Adapter->genIeBufferLen;
|
||||||
|
|
||||||
|
/* Reset the generic IE buffer */
|
||||||
|
Adapter->genIeBufferLen = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* return the length appended to the buffer */
|
||||||
|
return retLen;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Append any application provided Marvell TLVs to a TLV buffer.
|
||||||
|
*
|
||||||
|
* This function is called from the network join command prep. routine.
|
||||||
|
* If the Marvell TLV buffer has been setup by the application, this routine
|
||||||
|
* appends the buffer to the request.
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @param ppBuffer pointer to command buffer pointer
|
||||||
|
*
|
||||||
|
* @return bytes added to the buffer
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
wlan_cmd_append_marvell_tlv(wlan_private * priv, u8 ** ppBuffer)
|
||||||
|
{
|
||||||
|
wlan_adapter *Adapter = priv->adapter;
|
||||||
|
int retLen = 0;
|
||||||
|
|
||||||
|
/* Null Checks */
|
||||||
|
if (ppBuffer == 0)
|
||||||
|
return 0;
|
||||||
|
if (*ppBuffer == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If there is a Marvell TLV buffer setup, append it to the return
|
||||||
|
* parameter buffer pointer.
|
||||||
|
*/
|
||||||
|
if (Adapter->mrvlAssocTlvBufferLen) {
|
||||||
|
wlan_debug3("append tlv %d to %p\n",
|
||||||
|
Adapter->mrvlAssocTlvBufferLen, *ppBuffer);
|
||||||
|
|
||||||
|
/* Copy the TLV buffer to the output buffer, advance pointer */
|
||||||
|
memcpy(*ppBuffer,
|
||||||
|
Adapter->mrvlAssocTlvBuffer, Adapter->mrvlAssocTlvBufferLen);
|
||||||
|
|
||||||
|
/* Increment the return size and the return buffer pointer param */
|
||||||
|
*ppBuffer += Adapter->mrvlAssocTlvBufferLen;
|
||||||
|
retLen += Adapter->mrvlAssocTlvBufferLen;
|
||||||
|
|
||||||
|
/* Reset the Marvell TLV buffer */
|
||||||
|
Adapter->mrvlAssocTlvBufferLen = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* return the length appended to the buffer */
|
||||||
|
return retLen;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Append TSF tracking info from the scan table for the target AP
|
||||||
|
*
|
||||||
|
* This function is called from the network join command prep. routine.
|
||||||
|
* The TSF table TSF sent to the firmware contians two TSF values:
|
||||||
|
* - the TSF of the target AP from its previous beacon/probe response
|
||||||
|
* - the TSF timestamp of our local MAC at the time we observed the
|
||||||
|
* beacon/probe response.
|
||||||
|
*
|
||||||
|
* The firmware uses the timestamp values to set an initial TSF value
|
||||||
|
* in the MAC for the new association after a reassociation attempt.
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @param ppBuffer A pointer to command buffer pointer
|
||||||
|
* @param pBSSDesc A pointer to the BSS Descriptor from the scan table of
|
||||||
|
* the AP we are trying to join
|
||||||
|
*
|
||||||
|
* @return bytes added to the buffer
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
wlan_cmd_append_tsf_tlv(wlan_private * priv, u8 ** ppBuffer,
|
||||||
|
BSSDescriptor_t * pBSSDesc)
|
||||||
|
{
|
||||||
|
MrvlIEtypes_TsfTimestamp_t tsfTlv;
|
||||||
|
u64 tsfVal;
|
||||||
|
|
||||||
|
/* Null Checks */
|
||||||
|
if (ppBuffer == 0)
|
||||||
|
return 0;
|
||||||
|
if (*ppBuffer == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
tsfTlv.Header.Type = wlan_cpu_to_le16(TLV_TYPE_TSFTIMESTAMP);
|
||||||
|
tsfTlv.Header.Len = wlan_cpu_to_le16(2 * sizeof(tsfVal));
|
||||||
|
|
||||||
|
memcpy(*ppBuffer, &tsfTlv, sizeof(tsfTlv.Header));
|
||||||
|
*ppBuffer += sizeof(tsfTlv.Header);
|
||||||
|
|
||||||
|
/* TSF timestamp from the firmware TSF when the bcn/prb rsp was received */
|
||||||
|
tsfVal = wlan_cpu_to_le64(pBSSDesc->networkTSF);
|
||||||
|
memcpy(*ppBuffer, &tsfVal, sizeof(tsfVal));
|
||||||
|
*ppBuffer += sizeof(tsfVal);
|
||||||
|
|
||||||
|
memcpy(&tsfVal, pBSSDesc->TimeStamp, sizeof(tsfVal));
|
||||||
|
|
||||||
|
wlan_debug3( "ASSOC: TSF offset calc: %016llx - %016llx\n",
|
||||||
|
tsfVal, pBSSDesc->networkTSF);
|
||||||
|
|
||||||
|
tsfVal = wlan_cpu_to_le64(tsfVal);
|
||||||
|
memcpy(*ppBuffer, &tsfVal, sizeof(tsfVal));
|
||||||
|
*ppBuffer += sizeof(tsfVal);
|
||||||
|
|
||||||
|
return (sizeof(tsfTlv.Header) + (2 * sizeof(tsfVal)));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function prepares command of deauthenticate.
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @param cmd A pointer to HostCmd_DS_COMMAND structure
|
||||||
|
* @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
wlan_cmd_802_11_deauthenticate(wlan_private * priv, HostCmd_DS_COMMAND * cmd)
|
||||||
|
{
|
||||||
|
wlan_adapter *Adapter = priv->adapter;
|
||||||
|
HostCmd_DS_802_11_DEAUTHENTICATE *dauth = &cmd->params.deauth;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
cmd->Command = wlan_cpu_to_le16(HostCmd_CMD_802_11_DEAUTHENTICATE);
|
||||||
|
cmd->Size =
|
||||||
|
wlan_cpu_to_le16(sizeof(HostCmd_DS_802_11_DEAUTHENTICATE) + S_DS_GEN);
|
||||||
|
|
||||||
|
/* set AP MAC address */
|
||||||
|
memcpy(dauth->MacAddr,
|
||||||
|
&Adapter->CurBssParams.BSSDescriptor.MacAddress, ETH_ALEN);
|
||||||
|
|
||||||
|
/* Reason code 3 = Station is leaving */
|
||||||
|
#define REASON_CODE_STA_LEAVING 3
|
||||||
|
dauth->ReasonCode = wlan_cpu_to_le16(REASON_CODE_STA_LEAVING);
|
||||||
|
|
||||||
|
LEAVE();
|
||||||
|
return WLAN_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function prepares command of association.
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @param cmd A pointer to HostCmd_DS_COMMAND structure
|
||||||
|
* @param pdata_buf Void cast of BSSDescriptor_t from the scan table to assoc
|
||||||
|
* @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
static char parabuf[256];
|
||||||
|
int
|
||||||
|
wlan_cmd_802_11_associate(wlan_private * priv,
|
||||||
|
HostCmd_DS_COMMAND * cmd, void *pdata_buf)
|
||||||
|
{
|
||||||
|
wlan_adapter *Adapter = priv->adapter;
|
||||||
|
HostCmd_DS_802_11_ASSOCIATE *pAsso = &cmd->params.associate;
|
||||||
|
int ret = WLAN_STATUS_SUCCESS;
|
||||||
|
BSSDescriptor_t *pBSSDesc;
|
||||||
|
WLAN_802_11_RATES rates;
|
||||||
|
int ratesSize;
|
||||||
|
u8 *pos;
|
||||||
|
u16 TmpCap;
|
||||||
|
u8* tempuf;
|
||||||
|
u32 temlen=0;
|
||||||
|
MrvlIEtypes_SsIdParamSet_t *pSsidTlv;
|
||||||
|
MrvlIEtypes_PhyParamSet_t *pPhyTlv;
|
||||||
|
MrvlIEtypes_SsParamSet_t *pSsTlv;
|
||||||
|
MrvlIEtypes_RatesParamSet_t *pRatesTlv;
|
||||||
|
MrvlIEtypes_AuthType_t *pAuthTlv;
|
||||||
|
MrvlIEtypes_RsnParamSet_t *pRsnTlv;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
tempuf=rt_malloc(256);
|
||||||
|
if(tempuf==RT_NULL)
|
||||||
|
{
|
||||||
|
wlan_debug1("wlan_cmd_802_11_associate fail to get mem\r\n ");
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
rt_memset(tempuf,0x00,256);
|
||||||
|
pBSSDesc = (BSSDescriptor_t *) pdata_buf;
|
||||||
|
pos = (u8 *) pAsso;
|
||||||
|
|
||||||
|
cmd->Command = wlan_cpu_to_le16(HostCmd_CMD_802_11_ASSOCIATE);
|
||||||
|
|
||||||
|
/* Save so we know which BSS Desc to use in the response handler */
|
||||||
|
Adapter->pAttemptedBSSDesc = pBSSDesc;
|
||||||
|
|
||||||
|
rt_memcpy(pAsso->PeerStaAddr,
|
||||||
|
pBSSDesc->MacAddress, sizeof(pAsso->PeerStaAddr));
|
||||||
|
pos += sizeof(pAsso->PeerStaAddr);
|
||||||
|
|
||||||
|
/* set the listen interval */
|
||||||
|
pAsso->ListenInterval = wlan_cpu_to_le16(Adapter->ListenInterval);
|
||||||
|
|
||||||
|
pos += sizeof(pAsso->CapInfo);
|
||||||
|
pos += sizeof(pAsso->ListenInterval);
|
||||||
|
pos += sizeof(pAsso->Reserved1);
|
||||||
|
|
||||||
|
pSsidTlv=(MrvlIEtypes_SsIdParamSet_t *)tempuf;
|
||||||
|
//pSsidTlv = (MrvlIEtypes_SsIdParamSet_t *) pos;
|
||||||
|
pSsidTlv->Header.Type = wlan_cpu_to_le16(TLV_TYPE_SSID);
|
||||||
|
pSsidTlv->Header.Len = pBSSDesc->Ssid.SsidLength;
|
||||||
|
rt_memcpy(pSsidTlv->SsId, pBSSDesc->Ssid.Ssid, pSsidTlv->Header.Len);
|
||||||
|
temlen+=sizeof(pSsidTlv->Header) + pSsidTlv->Header.Len;
|
||||||
|
rt_memcpy(pos, (u8*)pSsidTlv, temlen);
|
||||||
|
pos += sizeof(pSsidTlv->Header) + pSsidTlv->Header.Len;
|
||||||
|
|
||||||
|
rt_memset(tempuf,0x00,256);
|
||||||
|
temlen=0;
|
||||||
|
pPhyTlv=(MrvlIEtypes_PhyParamSet_t *)tempuf;
|
||||||
|
// pPhyTlv = (MrvlIEtypes_PhyParamSet_t *) pos;
|
||||||
|
pPhyTlv->Header.Type = wlan_cpu_to_le16(TLV_TYPE_PHY_DS);
|
||||||
|
pPhyTlv->Header.Len = sizeof(pPhyTlv->fh_ds.DsParamSet);
|
||||||
|
rt_memcpy(&pPhyTlv->fh_ds.DsParamSet,
|
||||||
|
&pBSSDesc->PhyParamSet.DsParamSet.CurrentChan,
|
||||||
|
sizeof(pPhyTlv->fh_ds.DsParamSet));
|
||||||
|
temlen=sizeof(pPhyTlv->Header) + pPhyTlv->Header.Len;
|
||||||
|
rt_memcpy(pos, (u8*)pPhyTlv, temlen);
|
||||||
|
pos += sizeof(pPhyTlv->Header) + pPhyTlv->Header.Len;
|
||||||
|
// pPhyTlv->Header.Len = wlan_cpu_to_le16(pPhyTlv->Header.Len);
|
||||||
|
|
||||||
|
rt_memset(tempuf,0x00,256);
|
||||||
|
temlen=0;
|
||||||
|
pSsTlv=(MrvlIEtypes_SsParamSet_t *)tempuf;
|
||||||
|
// pSsTlv = (MrvlIEtypes_SsParamSet_t *) pos;
|
||||||
|
pSsTlv->Header.Type = wlan_cpu_to_le16(TLV_TYPE_CF);
|
||||||
|
pSsTlv->Header.Len = sizeof(pSsTlv->cf_ibss.CfParamSet);
|
||||||
|
|
||||||
|
temlen=sizeof(pSsTlv->Header) + pSsTlv->Header.Len;
|
||||||
|
rt_memcpy(pos, (u8*)pSsTlv, temlen);
|
||||||
|
pos += sizeof(pSsTlv->Header) + pSsTlv->Header.Len;
|
||||||
|
// pSsTlv->Header.Len = wlan_cpu_to_le16(pSsTlv->Header.Len);
|
||||||
|
|
||||||
|
/* Get the common rates supported between the driver and the BSS Desc */
|
||||||
|
if (setup_rates_from_bssdesc(Adapter, pBSSDesc, rates, &ratesSize)) {
|
||||||
|
ret = WLAN_STATUS_FAILURE;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Setup the Rates TLV in the association command */
|
||||||
|
rt_memset(tempuf,0x00,256);
|
||||||
|
temlen=0;
|
||||||
|
pRatesTlv=(MrvlIEtypes_RatesParamSet_t *)tempuf;
|
||||||
|
//pRatesTlv = (MrvlIEtypes_RatesParamSet_t *) pos;
|
||||||
|
pRatesTlv->Header.Type = wlan_cpu_to_le16(TLV_TYPE_RATES);
|
||||||
|
pRatesTlv->Header.Len = wlan_cpu_to_le16(ratesSize);
|
||||||
|
rt_memcpy(pRatesTlv->Rates, rates, ratesSize);
|
||||||
|
temlen=sizeof(pRatesTlv->Header) + ratesSize;
|
||||||
|
rt_memcpy(pos, (u8*)pRatesTlv, temlen);
|
||||||
|
pos += sizeof(pRatesTlv->Header) + ratesSize;
|
||||||
|
wlan_debug3( "ASSOC_CMD: Rates size = %d\n", ratesSize);
|
||||||
|
|
||||||
|
/* Add the Authentication type to be used for Auth frames if needed */
|
||||||
|
rt_memset(tempuf,0x00,256);
|
||||||
|
temlen=0;
|
||||||
|
pAuthTlv=(MrvlIEtypes_AuthType_t *)tempuf;
|
||||||
|
// pAuthTlv = (MrvlIEtypes_AuthType_t *) pos;
|
||||||
|
pAuthTlv->Header.Type = wlan_cpu_to_le16(TLV_TYPE_AUTH_TYPE);
|
||||||
|
pAuthTlv->Header.Len = sizeof(pAuthTlv->AuthType);
|
||||||
|
pAuthTlv->AuthType = Adapter->SecInfo.AuthenticationMode;
|
||||||
|
temlen=sizeof(pAuthTlv->Header) + pAuthTlv->Header.Len;
|
||||||
|
rt_memcpy(pos, (u8*)pAuthTlv, temlen);
|
||||||
|
pos += sizeof(pAuthTlv->Header) + pAuthTlv->Header.Len;
|
||||||
|
// pAuthTlv->Header.Len = wlan_cpu_to_le16(pAuthTlv->Header.Len);
|
||||||
|
rt_memset(tempuf,0x00,256);
|
||||||
|
temlen=0;
|
||||||
|
if (!Adapter->wps.SessionEnable) {
|
||||||
|
if (Adapter->SecInfo.WPAEnabled || Adapter->SecInfo.WPA2Enabled) {
|
||||||
|
pRsnTlv=(MrvlIEtypes_RsnParamSet_t *)tempuf;
|
||||||
|
// pRsnTlv = (MrvlIEtypes_RsnParamSet_t *) pos;
|
||||||
|
pRsnTlv->Header.Type = (u16) Adapter->Wpa_ie[0]; /* WPA_IE or WPA2_IE */
|
||||||
|
pRsnTlv->Header.Type = pRsnTlv->Header.Type & 0x00FF;
|
||||||
|
pRsnTlv->Header.Type = wlan_cpu_to_le16(pRsnTlv->Header.Type);
|
||||||
|
pRsnTlv->Header.Len = (u16) Adapter->Wpa_ie[1];
|
||||||
|
pRsnTlv->Header.Len = pRsnTlv->Header.Len & 0x00FF;
|
||||||
|
rt_memcpy(pRsnTlv->RsnIE, &Adapter->Wpa_ie[2], pRsnTlv->Header.Len);
|
||||||
|
temlen+=sizeof(pRsnTlv->Header) + pRsnTlv->Header.Len;
|
||||||
|
rt_memcpy(pos, (u8*)pRsnTlv, temlen);
|
||||||
|
// HEXDUMP("ASSOC_CMD: RSN IE", (u8 *) pRsnTlv,
|
||||||
|
// sizeof(pRsnTlv->Header) + pRsnTlv->Header.Len);
|
||||||
|
pos += sizeof(pRsnTlv->Header) + pRsnTlv->Header.Len;
|
||||||
|
// pRsnTlv->Header.Len = wlan_cpu_to_le16(pRsnTlv->Header.Len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rt_free(tempuf);
|
||||||
|
wlan_wmm_process_association_req(priv, &pos, &pBSSDesc->wmmIE);
|
||||||
|
|
||||||
|
wlan_cmd_append_generic_ie(priv, &pos);
|
||||||
|
|
||||||
|
wlan_cmd_append_marvell_tlv(priv, &pos);
|
||||||
|
|
||||||
|
wlan_cmd_append_tsf_tlv(priv, &pos, pBSSDesc);
|
||||||
|
|
||||||
|
if (wlan_parse_dnld_countryinfo_11d(priv)) {
|
||||||
|
ret = WLAN_STATUS_FAILURE;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd->Size = wlan_cpu_to_le16((u16) (pos - (u8 *) pAsso) + S_DS_GEN);
|
||||||
|
|
||||||
|
/* set the Capability info at last */
|
||||||
|
rt_memcpy(&TmpCap, &pBSSDesc->Cap, sizeof(pAsso->CapInfo));
|
||||||
|
TmpCap &= CAPINFO_MASK;
|
||||||
|
wlan_debug3( "ASSOC_CMD: TmpCap=%4X CAPINFO_MASK=%4X\n",
|
||||||
|
TmpCap, CAPINFO_MASK);
|
||||||
|
TmpCap = wlan_cpu_to_le16(TmpCap);
|
||||||
|
rt_memcpy(&pAsso->CapInfo, &TmpCap, sizeof(pAsso->CapInfo));
|
||||||
|
|
||||||
|
done:
|
||||||
|
LEAVE();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Association firmware command response handler
|
||||||
|
*
|
||||||
|
* The response buffer for the association command has the following
|
||||||
|
* memory layout.
|
||||||
|
*
|
||||||
|
* For cases where an association response was not received (indicated
|
||||||
|
* by the CapInfo and AId field):
|
||||||
|
*
|
||||||
|
* .------------------------------------------------------------.
|
||||||
|
* | Header(4 * sizeof(u16)): Standard command response hdr |
|
||||||
|
* .------------------------------------------------------------.
|
||||||
|
* | CapInfo/Error Return(u16): |
|
||||||
|
* | 0xFFFF(-1): Internal error |
|
||||||
|
* | 0xFFFE(-2): Authentication unhandled message |
|
||||||
|
* | 0xFFFD(-3): Authentication refused |
|
||||||
|
* .------------------------------------------------------------.
|
||||||
|
* | StatusCode(u16): |
|
||||||
|
* | If CapInfo is -1: |
|
||||||
|
* | (1) Internal processing failure |
|
||||||
|
* | (2) Timeout waiting for AP response |
|
||||||
|
* | |
|
||||||
|
* | If CapInfo is -2: |
|
||||||
|
* | An authentication frame was received but was |
|
||||||
|
* | not handled by the firmware. IEEE Status |
|
||||||
|
* | code for the failure is returned. |
|
||||||
|
* | |
|
||||||
|
* | If CapInfo is -3: |
|
||||||
|
* | An authentication frame was received and the |
|
||||||
|
* | StatusCode is the IEEE Status reported in the |
|
||||||
|
* | response. |
|
||||||
|
* .------------------------------------------------------------.
|
||||||
|
* | AId(u16): 0xFFFF |
|
||||||
|
* .------------------------------------------------------------.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* For cases where an association response was received, the IEEE
|
||||||
|
* standard association response frame is returned:
|
||||||
|
*
|
||||||
|
* .------------------------------------------------------------.
|
||||||
|
* | Header(4 * sizeof(u16)): Standard command response hdr |
|
||||||
|
* .------------------------------------------------------------.
|
||||||
|
* | CapInfo(u16): IEEE Capability |
|
||||||
|
* .------------------------------------------------------------.
|
||||||
|
* | StatusCode(u16): IEEE Status Code |
|
||||||
|
* .------------------------------------------------------------.
|
||||||
|
* | AId(u16): IEEE Association ID |
|
||||||
|
* .------------------------------------------------------------.
|
||||||
|
* | IEEE IEs(variable): Any received IEs comprising the |
|
||||||
|
* | remaining portion of a received |
|
||||||
|
* | association response frame. |
|
||||||
|
* .------------------------------------------------------------.
|
||||||
|
*
|
||||||
|
* For simplistic handling, the StatusCode field can be used to determine
|
||||||
|
* an association success (0) or failure (non-zero).
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @param resp A pointer to HostCmd_DS_COMMAND
|
||||||
|
* @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
wlan_ret_802_11_associate(wlan_private * priv, HostCmd_DS_COMMAND * resp)
|
||||||
|
{
|
||||||
|
wlan_adapter *Adapter = priv->adapter;
|
||||||
|
int ret = WLAN_STATUS_SUCCESS;
|
||||||
|
IEEEtypes_AssocRsp_t *pAssocRsp;
|
||||||
|
BSSDescriptor_t *pBSSDesc;
|
||||||
|
WLAN_802_11_RATES rates;
|
||||||
|
int ratesSize;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
pAssocRsp = (IEEEtypes_AssocRsp_t *) & resp->params;
|
||||||
|
|
||||||
|
// HEXDUMP("ASSOC_RESP:", (void *) &resp->params,
|
||||||
|
// wlan_le16_to_cpu(resp->Size) - S_DS_GEN);
|
||||||
|
|
||||||
|
Adapter->assocRspSize = MIN(wlan_le16_to_cpu(resp->Size) - S_DS_GEN,
|
||||||
|
sizeof(Adapter->assocRspBuffer));
|
||||||
|
|
||||||
|
memcpy(Adapter->assocRspBuffer, &resp->params, Adapter->assocRspSize);
|
||||||
|
|
||||||
|
if (pAssocRsp->StatusCode) {
|
||||||
|
priv->adapter->dbg.num_cmd_assoc_failure++;
|
||||||
|
wlan_debug3("ASSOC_RESP: Association Failed, status code = %d\n",
|
||||||
|
pAssocRsp->StatusCode);
|
||||||
|
|
||||||
|
ret = WLAN_STATUS_FAILURE;
|
||||||
|
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Send a Media Connected event, according to the Spec */
|
||||||
|
Adapter->MediaConnectStatus = WlanMediaStateConnected;
|
||||||
|
|
||||||
|
/* Set the attempted BSSID Index to current */
|
||||||
|
pBSSDesc = Adapter->pAttemptedBSSDesc;
|
||||||
|
|
||||||
|
wlan_debug3("ASSOC_RESP: %s\n", pBSSDesc->Ssid.Ssid);
|
||||||
|
|
||||||
|
/* Make a copy of current BSSID descriptor */
|
||||||
|
memcpy(&Adapter->CurBssParams.BSSDescriptor,
|
||||||
|
pBSSDesc, sizeof(BSSDescriptor_t));
|
||||||
|
|
||||||
|
/* update CurBssParams */
|
||||||
|
Adapter->CurBssParams.BSSDescriptor.Channel
|
||||||
|
= pBSSDesc->PhyParamSet.DsParamSet.CurrentChan;
|
||||||
|
|
||||||
|
if (setup_rates_from_bssdesc(Adapter, pBSSDesc, rates, &ratesSize)) {
|
||||||
|
ret = WLAN_STATUS_FAILURE;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Copy the infra. association rates into Current BSS state structure */
|
||||||
|
Adapter->CurBssParams.NumOfRates = ratesSize;
|
||||||
|
memcpy(&Adapter->CurBssParams.DataRates, rates, ratesSize);
|
||||||
|
|
||||||
|
/* Adjust the timestamps in the scan table to be relative to the newly
|
||||||
|
* associated AP's TSF
|
||||||
|
*/
|
||||||
|
wlan_scan_update_tsf_timestamps(priv, pBSSDesc);
|
||||||
|
|
||||||
|
if (pBSSDesc->wmmIE.VendHdr.ElementId == WMM_IE) {
|
||||||
|
Adapter->CurBssParams.wmm_enabled = TRUE;
|
||||||
|
} else {
|
||||||
|
Adapter->CurBssParams.wmm_enabled = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Adapter->wmm.required && Adapter->CurBssParams.wmm_enabled) {
|
||||||
|
Adapter->wmm.enabled = TRUE;
|
||||||
|
} else {
|
||||||
|
Adapter->wmm.enabled = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
Adapter->CurBssParams.wmm_uapsd_enabled = FALSE;
|
||||||
|
|
||||||
|
if (Adapter->wmm.enabled == TRUE) {
|
||||||
|
Adapter->CurBssParams.wmm_uapsd_enabled
|
||||||
|
= pBSSDesc->wmmIE.QoSInfo.QosUAPSD;
|
||||||
|
}
|
||||||
|
|
||||||
|
wlan_debug3("ASSOC_RESP: CurrentPacketFilter is %x\n",
|
||||||
|
Adapter->CurrentPacketFilter);
|
||||||
|
|
||||||
|
if (Adapter->SecInfo.WPAEnabled || Adapter->SecInfo.WPA2Enabled)
|
||||||
|
Adapter->IsGTK_SET = FALSE;
|
||||||
|
|
||||||
|
Adapter->SNR[TYPE_RXPD][TYPE_AVG] = 0;
|
||||||
|
Adapter->NF[TYPE_RXPD][TYPE_AVG] = 0;
|
||||||
|
|
||||||
|
memset(Adapter->rawSNR, 0x00, sizeof(Adapter->rawSNR));
|
||||||
|
memset(Adapter->rawNF, 0x00, sizeof(Adapter->rawNF));
|
||||||
|
Adapter->nextSNRNF = 0;
|
||||||
|
Adapter->numSNRNF = 0;
|
||||||
|
|
||||||
|
priv->adapter->dbg.num_cmd_assoc_success++;
|
||||||
|
wlan_debug3("ASSOC_RESP: Associated \n");
|
||||||
|
|
||||||
|
done:
|
||||||
|
LEAVE();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function handles the command response of disassociate
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @param resp A pointer to HostCmd_DS_COMMAND
|
||||||
|
* @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
wlan_ret_802_11_disassociate(wlan_private * priv, HostCmd_DS_COMMAND * resp)
|
||||||
|
{
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
priv->adapter->dbg.num_cmd_deauth++;
|
||||||
|
MacEventDisconnected(priv);
|
||||||
|
|
||||||
|
LEAVE();
|
||||||
|
return WLAN_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function handles the command response of ad_hoc_start and
|
||||||
|
* ad_hoc_join
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @param resp A pointer to HostCmd_DS_COMMAND
|
||||||
|
* @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef REASSOCIATION
|
||||||
|
/**
|
||||||
|
* @brief This function triggers re-association by waking up
|
||||||
|
* re-assoc thread.
|
||||||
|
*
|
||||||
|
* @param FunctionContext A pointer to FunctionContext
|
||||||
|
* @return n/a
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
MrvDrvReassocTimerFunction(void *FunctionContext)
|
||||||
|
{
|
||||||
|
wlan_private *priv = (wlan_private *) FunctionContext;
|
||||||
|
wlan_adapter *Adapter = priv->adapter;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
PRINTM(INFO, "MrvDrvReassocTimer fired.\n");
|
||||||
|
Adapter->ReassocTimerIsSet = FALSE;
|
||||||
|
if (Adapter->PSState != PS_STATE_FULL_POWER) {
|
||||||
|
/* wait until Exit_PS command returns */
|
||||||
|
Adapter->ReassocTimerIsSet = TRUE;
|
||||||
|
ModTimer(&Adapter->MrvDrvTimer, MRVDRV_TIMER_1S);
|
||||||
|
PRINTM(INFO, "MrvDrvTimerFunction(PSState=%d) waiting"
|
||||||
|
"for Exit_PS done\n", Adapter->PSState);
|
||||||
|
LEAVE();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
PRINTM(INFO, "Waking Up the Reassoc Thread\n");
|
||||||
|
|
||||||
|
// wake_up_interruptible(&priv->ReassocThread.waitQ);
|
||||||
|
rt_event_send(&priv->ReassocThread.waitQ, WakeUpReassociationThread);
|
||||||
|
LEAVE();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif /* REASSOCIATION */
|
|
@ -0,0 +1,57 @@
|
||||||
|
/** @file wlan_join.h
|
||||||
|
*
|
||||||
|
* @brief Interface for the wlan infrastructure and adhoc join routines
|
||||||
|
*
|
||||||
|
* Driver interface functions and type declarations for the join module
|
||||||
|
* implemented in wlan_join.c. Process all start/join requests for
|
||||||
|
* both adhoc and infrastructure networks
|
||||||
|
*
|
||||||
|
* Copyright © Marvell International Ltd. and/or its affiliates, 2003-2006
|
||||||
|
*
|
||||||
|
* @sa wlan_join.c
|
||||||
|
*/
|
||||||
|
/*************************************************************
|
||||||
|
Change Log:
|
||||||
|
01/11/06: Initial revision. Match new scan code, relocate related functions
|
||||||
|
|
||||||
|
************************************************************/
|
||||||
|
|
||||||
|
#ifndef _WLAN_JOIN_H
|
||||||
|
#define _WLAN_JOIN_H
|
||||||
|
|
||||||
|
//! Size of buffer allocated to store the association response from firmware
|
||||||
|
#define MRVDRV_ASSOC_RSP_BUF_SIZE 500
|
||||||
|
|
||||||
|
//! Size of buffer allocated to store IEs passed to firmware in the assoc req
|
||||||
|
#define MRVDRV_GENIE_BUF_SIZE 256
|
||||||
|
|
||||||
|
//! Size of buffer allocated to store TLVs passed to firmware in the assoc req
|
||||||
|
#define MRVDRV_ASSOC_TLV_BUF_SIZE 256
|
||||||
|
|
||||||
|
extern int wlan_cmd_802_11_authenticate(wlan_private * priv,
|
||||||
|
HostCmd_DS_COMMAND * cmd,
|
||||||
|
void *pdata_buf);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern int wlan_cmd_802_11_deauthenticate(wlan_private * priv,
|
||||||
|
HostCmd_DS_COMMAND * cmd);
|
||||||
|
extern int wlan_cmd_802_11_associate(wlan_private * priv,
|
||||||
|
HostCmd_DS_COMMAND * cmd,
|
||||||
|
void *pdata_buf);
|
||||||
|
extern int wlan_ret_802_11_authenticate(wlan_private * priv,
|
||||||
|
HostCmd_DS_COMMAND * resp);
|
||||||
|
extern int wlan_ret_802_11_disassociate(wlan_private * priv,
|
||||||
|
HostCmd_DS_COMMAND * resp);
|
||||||
|
extern int wlan_ret_802_11_associate(wlan_private * priv,
|
||||||
|
HostCmd_DS_COMMAND * resp);
|
||||||
|
|
||||||
|
extern int wlan_associate(wlan_private * priv, BSSDescriptor_t * pBSSDesc);
|
||||||
|
extern int wlan_associate_to_table_idx(wlan_private * priv, int tableIdx);
|
||||||
|
|
||||||
|
extern int wlanidle_off(wlan_private * priv);
|
||||||
|
|
||||||
|
extern int SendDeauthentication(wlan_private * priv);
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,921 @@
|
||||||
|
/* @file wlan_main.c
|
||||||
|
*
|
||||||
|
* @brief This file contains the major functions in WLAN
|
||||||
|
* driver. It includes init, exit, open, close and main
|
||||||
|
* thread etc..
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @mainpage M-WLAN Linux Driver
|
||||||
|
*
|
||||||
|
* @section overview_sec Overview
|
||||||
|
*
|
||||||
|
* The M-WLAN is a Linux reference driver for Marvell
|
||||||
|
* 802.11 (a/b/g) WLAN chipset.
|
||||||
|
*
|
||||||
|
* @section copyright_sec Copyright
|
||||||
|
*
|
||||||
|
* Copyright © Marvell International Ltd. and/or its affiliates, 2003-2007
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
/********************************************************
|
||||||
|
Change log:
|
||||||
|
09/30/05: Add Doxygen format comments
|
||||||
|
12/09/05: Add TX_QUEUE support
|
||||||
|
01/05/06: Add kernel 2.6.x support
|
||||||
|
01/11/06: Conditionalize new scan/join functions.
|
||||||
|
01/12/06: Add TxLockFlag for UAPSD power save mode
|
||||||
|
and Proprietary Periodic sleep support
|
||||||
|
********************************************************/
|
||||||
|
|
||||||
|
#include "include.h"
|
||||||
|
#include "wlan_debug.h"
|
||||||
|
#include <netif/ethernetif.h>
|
||||||
|
#include <rtdef.h>
|
||||||
|
/********************************************************
|
||||||
|
Local Variables
|
||||||
|
********************************************************/
|
||||||
|
static struct rt_semaphore tx_sem_lock;
|
||||||
|
struct rt_event wlan_tx_event;
|
||||||
|
u32 driver_flags;
|
||||||
|
|
||||||
|
#define WLAN_TX_PWR_DEFAULT 20 /*100mW */
|
||||||
|
#define WLAN_TX_PWR_US_DEFAULT 20 /*100mW */
|
||||||
|
#define WLAN_TX_PWR_JP_DEFAULT 16 /*50mW */
|
||||||
|
#define WLAN_TX_PWR_FR_100MW 20 /*100mW */
|
||||||
|
#define WLAN_TX_PWR_EMEA_DEFAULT 20 /*100mW */
|
||||||
|
|
||||||
|
/* Format { Channel, Frequency (MHz), MaxTxPower } */
|
||||||
|
/* Band: 'B/G', Region: USA FCC/Canada IC */
|
||||||
|
static CHANNEL_FREQ_POWER channel_freq_power_US_BG[] = {
|
||||||
|
{1, 2412, WLAN_TX_PWR_US_DEFAULT},
|
||||||
|
{2, 2417, WLAN_TX_PWR_US_DEFAULT},
|
||||||
|
{3, 2422, WLAN_TX_PWR_US_DEFAULT},
|
||||||
|
{4, 2427, WLAN_TX_PWR_US_DEFAULT},
|
||||||
|
{5, 2432, WLAN_TX_PWR_US_DEFAULT},
|
||||||
|
{6, 2437, WLAN_TX_PWR_US_DEFAULT},
|
||||||
|
{7, 2442, WLAN_TX_PWR_US_DEFAULT},
|
||||||
|
{8, 2447, WLAN_TX_PWR_US_DEFAULT},
|
||||||
|
{9, 2452, WLAN_TX_PWR_US_DEFAULT},
|
||||||
|
{10, 2457, WLAN_TX_PWR_US_DEFAULT},
|
||||||
|
{11, 2462, WLAN_TX_PWR_US_DEFAULT}
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Band: 'B/G', Region: Europe ETSI */
|
||||||
|
static CHANNEL_FREQ_POWER channel_freq_power_EU_BG[] = {
|
||||||
|
{1, 2412, WLAN_TX_PWR_EMEA_DEFAULT},
|
||||||
|
{2, 2417, WLAN_TX_PWR_EMEA_DEFAULT},
|
||||||
|
{3, 2422, WLAN_TX_PWR_EMEA_DEFAULT},
|
||||||
|
{4, 2427, WLAN_TX_PWR_EMEA_DEFAULT},
|
||||||
|
{5, 2432, WLAN_TX_PWR_EMEA_DEFAULT},
|
||||||
|
{6, 2437, WLAN_TX_PWR_EMEA_DEFAULT},
|
||||||
|
{7, 2442, WLAN_TX_PWR_EMEA_DEFAULT},
|
||||||
|
{8, 2447, WLAN_TX_PWR_EMEA_DEFAULT},
|
||||||
|
{9, 2452, WLAN_TX_PWR_EMEA_DEFAULT},
|
||||||
|
{10, 2457, WLAN_TX_PWR_EMEA_DEFAULT},
|
||||||
|
{11, 2462, WLAN_TX_PWR_EMEA_DEFAULT},
|
||||||
|
{12, 2467, WLAN_TX_PWR_EMEA_DEFAULT},
|
||||||
|
{13, 2472, WLAN_TX_PWR_EMEA_DEFAULT}
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Band: 'B/G', Region: Spain */
|
||||||
|
static CHANNEL_FREQ_POWER channel_freq_power_SPN_BG[] = {
|
||||||
|
{10, 2457, WLAN_TX_PWR_DEFAULT},
|
||||||
|
{11, 2462, WLAN_TX_PWR_DEFAULT}
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Band: 'B/G', Region: France */
|
||||||
|
static CHANNEL_FREQ_POWER channel_freq_power_FR_BG[] = {
|
||||||
|
{10, 2457, WLAN_TX_PWR_FR_100MW},
|
||||||
|
{11, 2462, WLAN_TX_PWR_FR_100MW},
|
||||||
|
{12, 2467, WLAN_TX_PWR_FR_100MW},
|
||||||
|
{13, 2472, WLAN_TX_PWR_FR_100MW}
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Band: 'B/G', Region: Japan */
|
||||||
|
static CHANNEL_FREQ_POWER channel_freq_power_JPN41_BG[] = {
|
||||||
|
{1, 2412, WLAN_TX_PWR_JP_DEFAULT},
|
||||||
|
{2, 2417, WLAN_TX_PWR_JP_DEFAULT},
|
||||||
|
{3, 2422, WLAN_TX_PWR_JP_DEFAULT},
|
||||||
|
{4, 2427, WLAN_TX_PWR_JP_DEFAULT},
|
||||||
|
{5, 2432, WLAN_TX_PWR_JP_DEFAULT},
|
||||||
|
{6, 2437, WLAN_TX_PWR_JP_DEFAULT},
|
||||||
|
{7, 2442, WLAN_TX_PWR_JP_DEFAULT},
|
||||||
|
{8, 2447, WLAN_TX_PWR_JP_DEFAULT},
|
||||||
|
{9, 2452, WLAN_TX_PWR_JP_DEFAULT},
|
||||||
|
{10, 2457, WLAN_TX_PWR_JP_DEFAULT},
|
||||||
|
{11, 2462, WLAN_TX_PWR_JP_DEFAULT},
|
||||||
|
{12, 2467, WLAN_TX_PWR_JP_DEFAULT},
|
||||||
|
{13, 2472, WLAN_TX_PWR_JP_DEFAULT}
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Band: 'B/G', Region: Japan */
|
||||||
|
static CHANNEL_FREQ_POWER channel_freq_power_JPN40_BG[] = {
|
||||||
|
{14, 2484, WLAN_TX_PWR_JP_DEFAULT}
|
||||||
|
};
|
||||||
|
|
||||||
|
/********************************************************
|
||||||
|
Global Variables
|
||||||
|
********************************************************/
|
||||||
|
struct rt_wlan_dev *wlan_eth = NULL;
|
||||||
|
struct rt_semaphore driver_sem;
|
||||||
|
/**
|
||||||
|
* the structure for channel, frequency and power
|
||||||
|
*/
|
||||||
|
typedef struct _region_cfp_table
|
||||||
|
{
|
||||||
|
u8 region;
|
||||||
|
CHANNEL_FREQ_POWER *cfp_BG;
|
||||||
|
int cfp_no_BG;
|
||||||
|
} region_cfp_table_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* the structure for the mapping between region and CFP
|
||||||
|
*/
|
||||||
|
region_cfp_table_t region_cfp_table[] = {
|
||||||
|
{0x10, /*US FCC */
|
||||||
|
channel_freq_power_US_BG,
|
||||||
|
sizeof(channel_freq_power_US_BG) / sizeof(CHANNEL_FREQ_POWER),
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{0x20, /*CANADA IC */
|
||||||
|
channel_freq_power_US_BG,
|
||||||
|
sizeof(channel_freq_power_US_BG) / sizeof(CHANNEL_FREQ_POWER),
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{0x30, /*EU*/ channel_freq_power_EU_BG,
|
||||||
|
sizeof(channel_freq_power_EU_BG) / sizeof(CHANNEL_FREQ_POWER),
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{0x31, /*SPAIN*/ channel_freq_power_SPN_BG,
|
||||||
|
sizeof(channel_freq_power_SPN_BG) / sizeof(CHANNEL_FREQ_POWER),
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{0x32, /*FRANCE*/ channel_freq_power_FR_BG,
|
||||||
|
sizeof(channel_freq_power_FR_BG) / sizeof(CHANNEL_FREQ_POWER),
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{0x40, /*JAPAN*/ channel_freq_power_JPN40_BG,
|
||||||
|
sizeof(channel_freq_power_JPN40_BG) / sizeof(CHANNEL_FREQ_POWER),
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{0x41, /*JAPAN*/ channel_freq_power_JPN41_BG,
|
||||||
|
sizeof(channel_freq_power_JPN41_BG) / sizeof(CHANNEL_FREQ_POWER),
|
||||||
|
}
|
||||||
|
,
|
||||||
|
/*Add new region here */
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* the rates supported by the card
|
||||||
|
*/
|
||||||
|
u8 WlanDataRates[WLAN_SUPPORTED_RATES] =
|
||||||
|
{ 0x02, 0x04, 0x0B, 0x16, 0x00, 0x0C, 0x12,
|
||||||
|
0x18, 0x24, 0x30, 0x48, 0x60, 0x6C, 0x00
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* the rates supported
|
||||||
|
*/
|
||||||
|
u8 SupportedRates[G_SUPPORTED_RATES] =
|
||||||
|
{ 0x82, 0x84, 0x8b, 0x96, 0x0c, 0x12, 0x18, 0x24, 0x30, 0x48,
|
||||||
|
0x60, 0x6c, 0
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* the global variable of a pointer to wlan_private
|
||||||
|
* structure variable
|
||||||
|
*/
|
||||||
|
wlan_private *wlanpriv = NULL;
|
||||||
|
|
||||||
|
u32 DSFreqList[15] = {
|
||||||
|
0, 2412000, 2417000, 2422000, 2427000, 2432000, 2437000, 2442000,
|
||||||
|
2447000, 2452000, 2457000, 2462000, 2467000, 2472000, 2484000
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* the table to keep region code
|
||||||
|
*/
|
||||||
|
u16 RegionCodeToIndex[MRVDRV_MAX_REGION_CODE] =
|
||||||
|
{ 0x10, 0x20, 0x30, 0x31, 0x32, 0x40, 0x41 };
|
||||||
|
char main_thread_stack[2048];
|
||||||
|
char assciation_thread_stack[2048];
|
||||||
|
|
||||||
|
/********************************************************
|
||||||
|
Local Functions
|
||||||
|
********************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function opens the network device
|
||||||
|
*
|
||||||
|
* @param dev A pointer to net_device structure
|
||||||
|
* @return WLAN_STATUS_SUCCESS
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
wlan_open(struct rt_wlan_dev *dev)
|
||||||
|
{
|
||||||
|
wlan_private *priv = (wlan_private *) dev->priv;
|
||||||
|
wlan_adapter *adapter = priv->adapter;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
priv->open = TRUE;
|
||||||
|
|
||||||
|
|
||||||
|
LEAVE();
|
||||||
|
return WLAN_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function closes the network device
|
||||||
|
*
|
||||||
|
* @param dev A pointer to net_device structure
|
||||||
|
* @return WLAN_STATUS_SUCCESS
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
wlan_close(struct rt_wlan_dev *dev)
|
||||||
|
{
|
||||||
|
wlan_private *priv = dev->priv;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
wlan_clean_txrx(priv);
|
||||||
|
|
||||||
|
priv->open = FALSE;
|
||||||
|
|
||||||
|
LEAVE();
|
||||||
|
return WLAN_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function handles packet transmission
|
||||||
|
*
|
||||||
|
* @param skb A pointer to sk_buff structure
|
||||||
|
* @param dev A pointer to net_device structure
|
||||||
|
* @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
rt_err_t rt_wlan_dev_tx( rt_device_t dev, struct pbuf* packet)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
struct rt_wlan_dev *wlandev=dev->user_data;
|
||||||
|
wlan_private *priv = wlandev->priv;
|
||||||
|
|
||||||
|
ret = RT_EOK;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
wlan_debug3( "Data <= kernel\n");
|
||||||
|
|
||||||
|
rt_sem_take(&tx_sem_lock, RT_WAITING_FOREVER);
|
||||||
|
if (wlan_tx_packet(priv, packet)) {
|
||||||
|
rt_sem_release(&tx_sem_lock);
|
||||||
|
/* Transmit failed */
|
||||||
|
ret = RT_ERROR;
|
||||||
|
}
|
||||||
|
rt_sem_release(&tx_sem_lock);
|
||||||
|
LEAVE();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function handles the timeout of packet
|
||||||
|
* transmission
|
||||||
|
*
|
||||||
|
* @param dev A pointer to net_device structure
|
||||||
|
* @return n/a
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
wlan_tx_timeout(struct rt_wlan_dev *dev)
|
||||||
|
{
|
||||||
|
wlan_private *priv = (wlan_private *) dev->priv;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
wlan_debug2("wlan_tx timeout\n");
|
||||||
|
priv->adapter->dbg.num_tx_timeout++;
|
||||||
|
|
||||||
|
priv->adapter->IntCounter++;
|
||||||
|
rt_event_send(&priv->MainThread.waitQ, WakeUpMainThread);
|
||||||
|
|
||||||
|
LEAVE();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function returns the network statistics
|
||||||
|
*
|
||||||
|
* @param dev A pointer to wlan_private structure
|
||||||
|
* @return A pointer to net_device_stats structure
|
||||||
|
*/
|
||||||
|
static struct net_device_stats *
|
||||||
|
wlan_get_stats(struct rt_wlan_dev *dev)
|
||||||
|
{
|
||||||
|
wlan_private *priv = (wlan_private *) dev->priv;
|
||||||
|
|
||||||
|
return &priv->stats;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function sets the MAC address to firmware.
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @param pRxPD A pointer to RxPD structure of received packet
|
||||||
|
* @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
wlan_set_mac_address(struct rt_wlan_dev *dev, char *addr)
|
||||||
|
{
|
||||||
|
int ret = WLAN_STATUS_SUCCESS;
|
||||||
|
wlan_private *priv = (wlan_private *) dev->priv;
|
||||||
|
wlan_adapter *Adapter = priv->adapter;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
memset(Adapter->CurrentAddr, 0, MRVDRV_ETH_ADDR_LEN);
|
||||||
|
|
||||||
|
/* dev->dev_addr is 8 bytes */
|
||||||
|
rt_memcpy(Adapter->CurrentAddr, addr, ETH_ALEN);
|
||||||
|
|
||||||
|
ret = PrepareAndSendCommand(priv, HostCmd_CMD_802_11_MAC_ADDRESS,
|
||||||
|
HostCmd_ACT_SET,
|
||||||
|
HostCmd_OPTION_WAITFORRSP, 0, NULL);
|
||||||
|
|
||||||
|
if (ret) {
|
||||||
|
wlan_debug1("set mac address failed.\n");
|
||||||
|
ret = WLAN_STATUS_FAILURE;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
rt_memcpy(dev->dev_addr, Adapter->CurrentAddr, ETH_ALEN);
|
||||||
|
|
||||||
|
done:
|
||||||
|
LEAVE();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function sets multicast addresses to firmware
|
||||||
|
*
|
||||||
|
* @param dev A pointer to net_device structure
|
||||||
|
* @return n/a
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
wlan_set_multicast_list(struct rt_wlan_dev *dev)
|
||||||
|
{
|
||||||
|
wlan_private *priv = dev->priv;
|
||||||
|
wlan_adapter *Adapter = priv->adapter;
|
||||||
|
int OldPacketFilter;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
OldPacketFilter = Adapter->CurrentPacketFilter;
|
||||||
|
#if 0
|
||||||
|
if (dev->flags & IFF_PROMISC) {
|
||||||
|
wlan_debug3("Enable Promiscuous mode\n");
|
||||||
|
Adapter->CurrentPacketFilter |= HostCmd_ACT_MAC_PROMISCUOUS_ENABLE;
|
||||||
|
Adapter->CurrentPacketFilter &= ~HostCmd_ACT_MAC_ALL_MULTICAST_ENABLE;
|
||||||
|
} else {
|
||||||
|
/* Multicast */
|
||||||
|
Adapter->CurrentPacketFilter &= ~HostCmd_ACT_MAC_PROMISCUOUS_ENABLE;
|
||||||
|
|
||||||
|
if (dev->flags & IFF_ALLMULTI || dev->mc_count >
|
||||||
|
MRVDRV_MAX_MULTICAST_LIST_SIZE) {
|
||||||
|
wlan_debug3("Enabling All Multicast!\n");
|
||||||
|
Adapter->CurrentPacketFilter |=
|
||||||
|
HostCmd_ACT_MAC_ALL_MULTICAST_ENABLE;
|
||||||
|
} else {
|
||||||
|
Adapter->CurrentPacketFilter &=
|
||||||
|
~HostCmd_ACT_MAC_ALL_MULTICAST_ENABLE;
|
||||||
|
|
||||||
|
if (!dev->mc_count) {
|
||||||
|
wlan_debug3("No multicast addresses - "
|
||||||
|
"disabling multicast!\n");
|
||||||
|
|
||||||
|
} else {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
Adapter->NumOfMulticastMACAddr =
|
||||||
|
CopyMulticastAddrs(Adapter, dev);
|
||||||
|
|
||||||
|
PRINTM(INFO, "Multicast addresses: %d\n", dev->mc_count);
|
||||||
|
|
||||||
|
for (i = 0; i < dev->mc_count; i++) {
|
||||||
|
wlan_debug3("Multicast address %d:"
|
||||||
|
"%x %x %x %x %x %x\n", i,
|
||||||
|
Adapter->MulticastList[i][0],
|
||||||
|
Adapter->MulticastList[i][1],
|
||||||
|
Adapter->MulticastList[i][2],
|
||||||
|
Adapter->MulticastList[i][3],
|
||||||
|
Adapter->MulticastList[i][4],
|
||||||
|
Adapter->MulticastList[i][5]);
|
||||||
|
}
|
||||||
|
/* set multicast addresses to firmware */
|
||||||
|
PrepareAndSendCommand(priv, HostCmd_CMD_MAC_MULTICAST_ADR,
|
||||||
|
HostCmd_ACT_GEN_SET, 0, 0, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Adapter->CurrentPacketFilter != OldPacketFilter) {
|
||||||
|
PrepareAndSendCommand(priv,
|
||||||
|
HostCmd_CMD_MAC_CONTROL,
|
||||||
|
0, 0, 0, &Adapter->CurrentPacketFilter);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
LEAVE();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function pops rx_skb from the rx queue.
|
||||||
|
*
|
||||||
|
* @param RxSkbQ A pointer to rx_skb queue
|
||||||
|
* @return A pointer to skb
|
||||||
|
*/
|
||||||
|
static struct sk_buff * wlan_pop_rx_skb(struct sk_buff *RxSkbQ)
|
||||||
|
{
|
||||||
|
struct sk_buff *skb_data = NULL;
|
||||||
|
|
||||||
|
if (!list_empty((struct list_head *) RxSkbQ)) {
|
||||||
|
skb_data = RxSkbQ->next;
|
||||||
|
list_del((struct list_head *) RxSkbQ->next);
|
||||||
|
}
|
||||||
|
|
||||||
|
return skb_data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function hanldes the major job in WLAN driver.
|
||||||
|
* it handles the event generated by firmware, rx data received
|
||||||
|
* from firmware and tx data sent from kernel.
|
||||||
|
*
|
||||||
|
* @param data A pointer to wlan_thread structure
|
||||||
|
* @return WLAN_STATUS_SUCCESS
|
||||||
|
*/
|
||||||
|
static void wlan_service_main_thread(void *data)
|
||||||
|
{
|
||||||
|
wlan_thread *thread = data;
|
||||||
|
wlan_private *priv = thread->priv;
|
||||||
|
wlan_adapter *Adapter = priv->adapter;
|
||||||
|
u8 ireg = 0;
|
||||||
|
rt_uint32_t e;
|
||||||
|
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
if (rt_sem_init(&driver_sem, "wlansem", 1, RT_IPC_FLAG_FIFO)!=RT_EOK)
|
||||||
|
{
|
||||||
|
wlan_debug2("init driver_sem failed/r/n");
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
wlan_activate_thread(thread);
|
||||||
|
|
||||||
|
wmm_init(priv);
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
|
||||||
|
if ((Adapter->WakeupTries) ||
|
||||||
|
(Adapter->PSState == PS_STATE_SLEEP
|
||||||
|
&& !Adapter->bWakeupDevRequired) ||
|
||||||
|
(!Adapter->IntCounter &&
|
||||||
|
Adapter->PSState == PS_STATE_PRE_SLEEP) ||
|
||||||
|
(!Adapter->IntCounter
|
||||||
|
&& (priv->wlan_dev.dnld_sent || Adapter->TxLockFlag
|
||||||
|
|| wmm_lists_empty(priv) || wmm_is_queue_stopped(priv))
|
||||||
|
&& (priv->wlan_dev.dnld_sent || !Adapter->CurrentTxSkb)
|
||||||
|
&& (priv->wlan_dev.dnld_sent || Adapter->CurCmd ||
|
||||||
|
list_empty(&Adapter->CmdPendingQ))
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
wlan_debug2 ("main-thread sleeping... "
|
||||||
|
"WakeupReq=%s Conn=%s PS_Mode=%d PS_State=%d\n\r",
|
||||||
|
(Adapter->bWakeupDevRequired) ? "Y" : "N",
|
||||||
|
(Adapter->MediaConnectStatus) ? "Y" : "N",
|
||||||
|
Adapter->PSMode, Adapter->PSState);
|
||||||
|
rt_event_recv(&thread->waitQ,WakeUpMainThread,RT_EVENT_FLAG_OR|RT_EVENT_FLAG_CLEAR,RT_WAITING_FOREVER,&e);
|
||||||
|
|
||||||
|
wlan_debug2 ("main-thread waking up: IntCnt=%d ""CurCmd=%s CmdPending=%s\n\r"
|
||||||
|
"Connect=%s "
|
||||||
|
"CurTxSkb=%s dnld_sent=%d\n\r",
|
||||||
|
Adapter->IntCounter,
|
||||||
|
(Adapter->CurCmd) ? "Y" : "N",
|
||||||
|
list_empty(&Adapter->CmdPendingQ) ? "N" : "Y",
|
||||||
|
(Adapter->MediaConnectStatus) ? "Y" : "N",
|
||||||
|
(Adapter->CurrentTxSkb) ? "Y" : "N",
|
||||||
|
priv->wlan_dev.dnld_sent);
|
||||||
|
} else {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Adapter->IntCounter) {
|
||||||
|
rt_sem_take(&driver_sem, RT_WAITING_FOREVER);
|
||||||
|
Adapter->IntCounter = 0;
|
||||||
|
rt_sem_release(&driver_sem);
|
||||||
|
|
||||||
|
if (sbi_get_int_status(priv, &ireg)) {
|
||||||
|
wlan_debug1("main-thread: reading HOST_INT_STATUS_REG failed\n");
|
||||||
|
wlan_debug1("sbi_get_int_status return \n");
|
||||||
|
}
|
||||||
|
rt_sem_take(&driver_sem, RT_WAITING_FOREVER);
|
||||||
|
Adapter->HisRegCpy |= ireg;
|
||||||
|
rt_sem_release(&driver_sem);
|
||||||
|
wlan_debug1("INT: status = 0x%x\n", Adapter->HisRegCpy);
|
||||||
|
} else if (Adapter->bWakeupDevRequired
|
||||||
|
&& ((Adapter->PSState == PS_STATE_SLEEP)
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
Adapter->WakeupTries++;
|
||||||
|
wlan_debug3("Wakeup device... WakeupReq=%s Conn=%s PS_Mode=%d PS_State=%d\n",
|
||||||
|
(Adapter->bWakeupDevRequired) ? "Y" : "N",
|
||||||
|
(priv->adapter->MediaConnectStatus) ? "Y" : "N",
|
||||||
|
priv->adapter->PSMode, priv->adapter->PSState);
|
||||||
|
|
||||||
|
/* Wake up device */
|
||||||
|
if (sbi_exit_deep_sleep(priv))
|
||||||
|
wlan_debug3("main-thread: wakeup dev failed\n");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Command response? */
|
||||||
|
if (Adapter->HisRegCpy & HIS_CmdUpLdRdy) {
|
||||||
|
rt_sem_take(&driver_sem, RT_WAITING_FOREVER);
|
||||||
|
Adapter->HisRegCpy &= ~HIS_CmdUpLdRdy;
|
||||||
|
rt_sem_release(&driver_sem);
|
||||||
|
|
||||||
|
wlan_process_rx_command(priv);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Any received data? */
|
||||||
|
if (Adapter->HisRegCpy & HIS_RxUpLdRdy) {
|
||||||
|
rt_sem_take(&driver_sem, RT_WAITING_FOREVER);
|
||||||
|
Adapter->HisRegCpy &= ~HIS_RxUpLdRdy;
|
||||||
|
rt_sem_release(&driver_sem);
|
||||||
|
|
||||||
|
wlan_send_rxskbQ(priv);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Any Card Event */
|
||||||
|
if (Adapter->HisRegCpy & HIS_CardEvent) {
|
||||||
|
rt_sem_take(&driver_sem, RT_WAITING_FOREVER);
|
||||||
|
Adapter->HisRegCpy &= ~HIS_CardEvent;
|
||||||
|
rt_sem_release(&driver_sem);
|
||||||
|
|
||||||
|
if (sbi_read_event_cause(priv)) {
|
||||||
|
wlan_debug1("main-thread: sbi_read_event_cause failed.\n");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
wlan_process_event(priv);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if we need to confirm Sleep Request received previously */
|
||||||
|
if (Adapter->PSState == PS_STATE_PRE_SLEEP) {
|
||||||
|
if (!priv->wlan_dev.dnld_sent && !Adapter->CurCmd) {
|
||||||
|
wlan_debug1("Adapter->MediaConnectStatus ==WlanMediaStateConnected");
|
||||||
|
PSConfirmSleep(priv, (u16) Adapter->PSMode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The PS state is changed during processing of
|
||||||
|
* Sleep Request event above
|
||||||
|
*/
|
||||||
|
if ((Adapter->PSState == PS_STATE_SLEEP)
|
||||||
|
|| (Adapter->PSState == PS_STATE_PRE_SLEEP)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Execute the next command */
|
||||||
|
if (!priv->wlan_dev.dnld_sent && !Adapter->CurCmd) {
|
||||||
|
ExecuteNextCommand(priv);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!priv->wlan_dev.dnld_sent
|
||||||
|
&& !wmm_lists_empty(priv) && !wmm_is_queue_stopped(priv)) {
|
||||||
|
if ((Adapter->PSState == PS_STATE_FULL_POWER)
|
||||||
|
|| (Adapter->sleep_period.period == 0)
|
||||||
|
|| (Adapter->TxLockFlag == FALSE)) {
|
||||||
|
wmm_process_tx(priv);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
LEAVE();
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function adds the card. it will probe the
|
||||||
|
* card, allocate the wlan_priv and initialize the device.
|
||||||
|
*
|
||||||
|
* @param card A pointer to card
|
||||||
|
* @return A pointer to wlan_private structure
|
||||||
|
*/
|
||||||
|
static wlan_private * wlan_FW_thread_init(struct rt_wlan_dev *wlandev)
|
||||||
|
{
|
||||||
|
struct rt_wlan_dev *dev = NULL;
|
||||||
|
wlan_private *priv = NULL;
|
||||||
|
if(wlandev==NULL){
|
||||||
|
wlan_debug1( "wlan add card input error\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
dev=wlandev;
|
||||||
|
priv = (wlan_private*)rt_malloc(sizeof(wlan_private));
|
||||||
|
if(!priv ) {
|
||||||
|
wlan_debug1( "Init ethernet device private failed!\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
rt_memset(priv,0x00,sizeof(wlan_private));
|
||||||
|
dev->priv=priv;
|
||||||
|
wlanpriv= priv;
|
||||||
|
wlan_eth=dev;
|
||||||
|
priv->adapter =(wlan_adapter*) rt_malloc(sizeof(wlan_adapter));
|
||||||
|
if(!priv->adapter) {
|
||||||
|
wlan_debug1("Allocate buffer for wlan_adapter failed!\n");
|
||||||
|
goto err_malloc;
|
||||||
|
}
|
||||||
|
rt_memset(priv->adapter, 0, sizeof(wlan_adapter));
|
||||||
|
rt_sem_init(&priv->adapter->wmm.flowcrsem, "tx_flowcr", 0, RT_IPC_FLAG_FIFO);
|
||||||
|
priv->wlan_dev.netdev = dev;
|
||||||
|
rt_event_init(&priv->adapter->ds_awake_q, "deepsleep", RT_IPC_FLAG_FIFO);
|
||||||
|
INIT_LIST_HEAD(&priv->adapter->CmdFreeQ);
|
||||||
|
INIT_LIST_HEAD(&priv->adapter->CmdPendingQ);
|
||||||
|
priv->MainThread.priv = priv;
|
||||||
|
rt_thread_init(&priv->MainThread.task,
|
||||||
|
"wlan_men_thread",
|
||||||
|
wlan_service_main_thread,
|
||||||
|
&priv->MainThread,
|
||||||
|
&main_thread_stack[0],
|
||||||
|
sizeof(main_thread_stack), 121, 100);
|
||||||
|
rt_thread_startup(&priv->MainThread.task);
|
||||||
|
rt_sem_init(&tx_sem_lock, "wlan_tx_lock", 1, RT_IPC_FLAG_FIFO);
|
||||||
|
|
||||||
|
if (spi_register_dev(priv) < 0) {
|
||||||
|
wlan_debug1("Failed to register wlan device!\n");
|
||||||
|
goto err_registerdev;
|
||||||
|
}
|
||||||
|
wlan_debug2("%s: Marvell Wlan 802.11 Adapter "
|
||||||
|
"revision 0x%02X at IRQ %i\n", dev->name,
|
||||||
|
priv->adapter->chip_rev, dev->irq);
|
||||||
|
/* init FW and HW */
|
||||||
|
if (wlan_init_fw(priv)) {
|
||||||
|
wlan_debug1("Firmware Init Failed\n");
|
||||||
|
goto err_init_fw;
|
||||||
|
}
|
||||||
|
return priv;
|
||||||
|
err_init_fw:
|
||||||
|
err_registerdev:
|
||||||
|
err_malloc:
|
||||||
|
rt_free(priv);
|
||||||
|
wlanpriv = NULL;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @brief This function removes the card.
|
||||||
|
*
|
||||||
|
* @param priv A pointer to card
|
||||||
|
* @return WLAN_STATUS_SUCCESS
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
wlan_remove_card(void *card)
|
||||||
|
{
|
||||||
|
wlan_private *priv = wlanpriv;
|
||||||
|
wlan_adapter *Adapter;
|
||||||
|
struct rt_wlan_dev *dev;
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
if (!priv) {
|
||||||
|
LEAVE();
|
||||||
|
return WLAN_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
Adapter = priv->adapter;
|
||||||
|
|
||||||
|
if (!Adapter) {
|
||||||
|
LEAVE();
|
||||||
|
return WLAN_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
dev = priv->wlan_dev.netdev;
|
||||||
|
|
||||||
|
|
||||||
|
rt_event_send(&Adapter->ds_awake_q, 0x01);
|
||||||
|
|
||||||
|
if (Adapter->CurCmd) {
|
||||||
|
rt_kprintf("Wake up current cmdwait_q\n");
|
||||||
|
|
||||||
|
rt_event_send(&Adapter->CurCmd->cmdwait, CmdWaitQWoken);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
Adapter->CurCmd = NULL;
|
||||||
|
|
||||||
|
if (Adapter->MediaConnectStatus == WlanMediaStateConnected) {
|
||||||
|
wlan_clean_txrx(priv);
|
||||||
|
Adapter->MediaConnectStatus = WlanMediaStateDisconnected;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Adapter->PSMode == Wlan802_11PowerModeMAX_PSP) {
|
||||||
|
Adapter->PSMode = Wlan802_11PowerModeCAM;
|
||||||
|
PSWakeup(priv, HostCmd_OPTION_WAITFORRSP);
|
||||||
|
}
|
||||||
|
if (Adapter->IsDeepSleep == TRUE) {
|
||||||
|
Adapter->IsDeepSleep = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
PrepareAndSendCommand(priv, HostCmd_CMD_802_11_RESET, 0, 0, 0, NULL);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
wlan_clean_txrx(priv);
|
||||||
|
|
||||||
|
Adapter->SurpriseRemoved = TRUE;
|
||||||
|
|
||||||
|
/* Stop the thread servicing the interrupts */
|
||||||
|
|
||||||
|
rt_event_send(&priv->MainThread.waitQ, WakeUpMainThread);
|
||||||
|
wlan_free_adapter(priv);
|
||||||
|
|
||||||
|
/* Last reference is our one */
|
||||||
|
wlan_debug3("Unregister finish\n");
|
||||||
|
|
||||||
|
priv->wlan_dev.netdev = NULL;
|
||||||
|
|
||||||
|
wlanpriv = NULL;
|
||||||
|
|
||||||
|
LEAVE();
|
||||||
|
return WLAN_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/********************************************************
|
||||||
|
Global Functions
|
||||||
|
********************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function sends the rx packets to the os from the skb queue
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @return n/a
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
wlan_send_rxskbQ(wlan_private * priv)
|
||||||
|
{
|
||||||
|
struct rt_wlan_dev* netdev=priv->wlan_dev.netdev;
|
||||||
|
rt_err_t result;
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
result = eth_device_ready(&(netdev->parent));
|
||||||
|
if(result!=RT_EOK)
|
||||||
|
wlan_debug1("wlan_send_rxskbQ %d",result);
|
||||||
|
RT_ASSERT(result == RT_EOK);
|
||||||
|
|
||||||
|
LEAVE();
|
||||||
|
}
|
||||||
|
/* reception packet. */
|
||||||
|
struct pbuf *rt_wlan_dev_rx(rt_device_t dev)
|
||||||
|
{
|
||||||
|
struct rt_wlan_dev*netdev=(struct rt_wlan_dev*)(dev->user_data);
|
||||||
|
wlan_private * priv=netdev->priv;
|
||||||
|
struct pbuf* p= RT_NULL;
|
||||||
|
struct sk_buff *skb=RT_NULL;
|
||||||
|
rt_err_t result;
|
||||||
|
if (priv->adapter) {
|
||||||
|
skb = wlan_pop_rx_skb(&priv->adapter->RxSkbQ);
|
||||||
|
if(skb==RT_NULL)
|
||||||
|
{
|
||||||
|
return RT_NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
p=ProcessRxedPacket(priv, skb);
|
||||||
|
wlan_debug3("free skb %x,data %x",(u32)skb,(u32)skb->data);
|
||||||
|
if(skb!=RT_NULL)
|
||||||
|
{
|
||||||
|
if(skb->head!=RT_NULL)
|
||||||
|
rt_free(skb->head);
|
||||||
|
rt_free(skb);
|
||||||
|
}
|
||||||
|
if (!list_empty((struct list_head *) (&priv->adapter->RxSkbQ))) {
|
||||||
|
result = eth_device_ready(&(priv->wlan_dev.netdev->parent));
|
||||||
|
if(result!=RT_EOK)
|
||||||
|
wlan_debug1("rt_wlan_dev_rx %d",result);
|
||||||
|
RT_ASSERT(result == RT_EOK);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function finds the CFP in
|
||||||
|
* region_cfp_table based on region and band parameter.
|
||||||
|
*
|
||||||
|
* @param region The region code
|
||||||
|
* @param band The band
|
||||||
|
* @param cfp_no A pointer to CFP number
|
||||||
|
* @return A pointer to CFP
|
||||||
|
*/
|
||||||
|
CHANNEL_FREQ_POWER *
|
||||||
|
wlan_get_region_cfp_table(u8 region, u8 band, int *cfp_no)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
for (i = 0; i < sizeof(region_cfp_table) / sizeof(region_cfp_table_t);
|
||||||
|
i++) {
|
||||||
|
wlan_debug3( "region_cfp_table[i].region=%d\n",
|
||||||
|
region_cfp_table[i].region);
|
||||||
|
if (region_cfp_table[i].region == region) {
|
||||||
|
{
|
||||||
|
*cfp_no = region_cfp_table[i].cfp_no_BG;
|
||||||
|
LEAVE();
|
||||||
|
return region_cfp_table[i].cfp_BG;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
LEAVE();
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function sets region table.
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @param region The region code
|
||||||
|
* @param band The band
|
||||||
|
* @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
wlan_set_regiontable(wlan_private * priv, u8 region, u8 band)
|
||||||
|
{
|
||||||
|
wlan_adapter *Adapter = priv->adapter;
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
CHANNEL_FREQ_POWER *cfp;
|
||||||
|
int cfp_no;
|
||||||
|
ENTER();
|
||||||
|
memset(Adapter->region_channel, 0, sizeof(Adapter->region_channel));
|
||||||
|
|
||||||
|
{
|
||||||
|
cfp = wlan_get_region_cfp_table(region, band, &cfp_no);
|
||||||
|
if (cfp != NULL) {
|
||||||
|
Adapter->region_channel[i].NrCFP = cfp_no;
|
||||||
|
Adapter->region_channel[i].CFP = cfp;
|
||||||
|
} else {
|
||||||
|
wlan_debug3("wrong region code %#x in Band B-G\n", region);
|
||||||
|
return WLAN_STATUS_FAILURE;
|
||||||
|
}
|
||||||
|
Adapter->region_channel[i].Valid = TRUE;
|
||||||
|
Adapter->region_channel[i].Region = region;
|
||||||
|
Adapter->region_channel[i].Band = band;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
LEAVE();
|
||||||
|
return WLAN_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function handles the interrupt. it will change PS
|
||||||
|
* state if applicable. it will wake up main_thread to handle
|
||||||
|
* the interrupt event as well.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
wlan_interrupt(struct rt_wlan_dev *dev)
|
||||||
|
{
|
||||||
|
|
||||||
|
wlan_private *priv=wlanpriv;
|
||||||
|
priv->adapter->IntCounter++;
|
||||||
|
|
||||||
|
wlan_debug3 ("*\n");
|
||||||
|
|
||||||
|
priv->adapter->WakeupTries = 0;
|
||||||
|
|
||||||
|
if (priv->adapter->PSState == PS_STATE_SLEEP) {
|
||||||
|
priv->adapter->PSState = PS_STATE_AWAKE;
|
||||||
|
}
|
||||||
|
|
||||||
|
rt_event_send(&priv->MainThread.waitQ, WakeUpMainThread);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function initializes module.
|
||||||
|
*
|
||||||
|
* @param n/a A pointer to rt_wlan_dev structure
|
||||||
|
* @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
int wlan_init_module(struct rt_wlan_dev * wlan_dev)
|
||||||
|
{
|
||||||
|
int ret = WLAN_STATUS_SUCCESS;
|
||||||
|
wlan_private * prv=RT_NULL;
|
||||||
|
wlan_debug3("start wlan device init..... \r\n");
|
||||||
|
if(wlan_dev==NULL)
|
||||||
|
{
|
||||||
|
ret = WLAN_STATUS_FAILURE;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
rt_event_init(&wlan_tx_event, "wlantx", RT_IPC_FLAG_FIFO);
|
||||||
|
prv=wlan_FW_thread_init(wlan_dev);
|
||||||
|
if(prv==NULL){
|
||||||
|
ret = WLAN_STATUS_FAILURE;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
done:
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
|
@ -0,0 +1,355 @@
|
||||||
|
/** @file wlan_rx.c
|
||||||
|
* @brief This file contains the handling of RX in wlan
|
||||||
|
* driver.
|
||||||
|
*
|
||||||
|
* Copyright © Marvell International Ltd. and/or its affiliates, 2003-2006
|
||||||
|
*/
|
||||||
|
/********************************************************
|
||||||
|
Change log:
|
||||||
|
09/28/05: Add Doxygen format comments
|
||||||
|
12/09/05: ADD Sliding window SNR/NF Average Calculation support
|
||||||
|
|
||||||
|
********************************************************/
|
||||||
|
|
||||||
|
#include "include.h"
|
||||||
|
|
||||||
|
/********************************************************
|
||||||
|
Local Variables
|
||||||
|
********************************************************/
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
u8 dest_addr[6];
|
||||||
|
u8 src_addr[6];
|
||||||
|
u16 h803_len;
|
||||||
|
|
||||||
|
}Eth803Hdr_t;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
u8 llc_dsap;
|
||||||
|
u8 llc_ssap;
|
||||||
|
u8 llc_ctrl;
|
||||||
|
u8 snap_oui[3];
|
||||||
|
u16 snap_type;
|
||||||
|
|
||||||
|
}Rfc1042Hdr_t;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
Eth803Hdr_t eth803_hdr;
|
||||||
|
Rfc1042Hdr_t rfc1042_hdr;
|
||||||
|
|
||||||
|
}RxPacketHdr_t;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
u8 dest_addr[6];
|
||||||
|
u8 src_addr[6];
|
||||||
|
u16 ethertype;
|
||||||
|
|
||||||
|
} EthII_Hdr_t;
|
||||||
|
|
||||||
|
/********************************************************
|
||||||
|
Global Variables
|
||||||
|
********************************************************/
|
||||||
|
|
||||||
|
/********************************************************
|
||||||
|
Local Functions
|
||||||
|
********************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function computes the AvgSNR .
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @return AvgSNR
|
||||||
|
*/
|
||||||
|
static u8
|
||||||
|
wlan_getAvgSNR(wlan_private * priv)
|
||||||
|
{
|
||||||
|
u8 i;
|
||||||
|
u16 temp = 0;
|
||||||
|
wlan_adapter *Adapter = priv->adapter;
|
||||||
|
if (Adapter->numSNRNF == 0)
|
||||||
|
return 0;
|
||||||
|
for (i = 0; i < Adapter->numSNRNF; i++)
|
||||||
|
temp += Adapter->rawSNR[i];
|
||||||
|
return (u8) (temp / Adapter->numSNRNF);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function computes the AvgNF
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @return AvgNF
|
||||||
|
*/
|
||||||
|
static u8
|
||||||
|
wlan_getAvgNF(wlan_private * priv)
|
||||||
|
{
|
||||||
|
u8 i;
|
||||||
|
u16 temp = 0;
|
||||||
|
wlan_adapter *Adapter = priv->adapter;
|
||||||
|
if (Adapter->numSNRNF == 0)
|
||||||
|
return 0;
|
||||||
|
for (i = 0; i < Adapter->numSNRNF; i++)
|
||||||
|
temp += Adapter->rawNF[i];
|
||||||
|
return (u8) (temp / Adapter->numSNRNF);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function save the raw SNR/NF to our internel buffer
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @param pRxPD A pointer to RxPD structure of received packet
|
||||||
|
* @return n/a
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
wlan_save_rawSNRNF(wlan_private * priv, RxPD * pRxPD)
|
||||||
|
{
|
||||||
|
wlan_adapter *Adapter = priv->adapter;
|
||||||
|
if (Adapter->numSNRNF < Adapter->data_avg_factor)
|
||||||
|
Adapter->numSNRNF++;
|
||||||
|
Adapter->rawSNR[Adapter->nextSNRNF] = pRxPD->SNR;
|
||||||
|
Adapter->rawNF[Adapter->nextSNRNF] = pRxPD->NF;
|
||||||
|
Adapter->nextSNRNF++;
|
||||||
|
if (Adapter->nextSNRNF >= Adapter->data_avg_factor)
|
||||||
|
Adapter->nextSNRNF = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define DATA_RSSI_LOW_BIT 0x01
|
||||||
|
#define DATA_SNR_LOW_BIT 0x02
|
||||||
|
#define DATA_RSSI_HIGH_BIT 0x04
|
||||||
|
#define DATA_SNR_HIGH_BIT 0x08
|
||||||
|
/**
|
||||||
|
* @brief This function computes the RSSI in received packet.
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @return n/a
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
wlan_check_subscribe_event(wlan_private * priv)
|
||||||
|
{
|
||||||
|
wlan_adapter *Adapter = priv->adapter;
|
||||||
|
int temp;
|
||||||
|
if (Adapter->subevent.EventsBitmap == 0)
|
||||||
|
return;
|
||||||
|
if ((Adapter->subevent.EventsBitmap & DATA_RSSI_LOW_BIT) ||
|
||||||
|
(Adapter->subevent.EventsBitmap & DATA_RSSI_HIGH_BIT)) {
|
||||||
|
temp =
|
||||||
|
-CAL_RSSI(Adapter->SNR[TYPE_RXPD][TYPE_AVG] / AVG_SCALE,
|
||||||
|
Adapter->NF[TYPE_RXPD][TYPE_AVG] / AVG_SCALE);
|
||||||
|
if (Adapter->subevent.EventsBitmap & DATA_RSSI_LOW_BIT) {
|
||||||
|
if (temp > Adapter->subevent.Rssi_low.value) {
|
||||||
|
if (!Adapter->subevent.Rssi_low.Freq)
|
||||||
|
Adapter->subevent.EventsBitmap &= ~DATA_RSSI_LOW_BIT;
|
||||||
|
if (Adapter->subevent.Rssi_low.Freq > 1) {
|
||||||
|
Adapter->subevent.Rssi_low.Freq--;
|
||||||
|
if (Adapter->subevent.Rssi_low.Freq == 1)
|
||||||
|
Adapter->subevent.Rssi_low.Freq = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (Adapter->subevent.EventsBitmap & DATA_RSSI_HIGH_BIT) {
|
||||||
|
if (temp < Adapter->subevent.Rssi_high.value) {
|
||||||
|
if (!Adapter->subevent.Rssi_high.Freq)
|
||||||
|
Adapter->subevent.EventsBitmap &= ~DATA_RSSI_HIGH_BIT;
|
||||||
|
if (Adapter->subevent.Rssi_high.Freq > 1) {
|
||||||
|
Adapter->subevent.Rssi_high.Freq--;
|
||||||
|
if (Adapter->subevent.Rssi_high.Freq == 1)
|
||||||
|
Adapter->subevent.Rssi_high.Freq = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ((Adapter->subevent.EventsBitmap & DATA_SNR_LOW_BIT) ||
|
||||||
|
(Adapter->subevent.EventsBitmap & DATA_SNR_HIGH_BIT)) {
|
||||||
|
temp = Adapter->SNR[TYPE_RXPD][TYPE_AVG] / AVG_SCALE;
|
||||||
|
if (Adapter->subevent.EventsBitmap & DATA_SNR_LOW_BIT) {
|
||||||
|
if (temp < Adapter->subevent.Snr_low.value) {
|
||||||
|
if (!Adapter->subevent.Snr_low.Freq)
|
||||||
|
Adapter->subevent.EventsBitmap &= ~DATA_SNR_LOW_BIT;
|
||||||
|
if (Adapter->subevent.Snr_low.Freq > 1) {
|
||||||
|
Adapter->subevent.Snr_low.Freq--;
|
||||||
|
if (Adapter->subevent.Snr_low.Freq == 1)
|
||||||
|
Adapter->subevent.Snr_low.Freq = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (Adapter->subevent.EventsBitmap & DATA_SNR_HIGH_BIT) {
|
||||||
|
if (temp > Adapter->subevent.Snr_high.value) {
|
||||||
|
if (!Adapter->subevent.Snr_high.Freq)
|
||||||
|
Adapter->subevent.EventsBitmap &= ~DATA_SNR_HIGH_BIT;
|
||||||
|
if (Adapter->subevent.Snr_high.Freq > 1) {
|
||||||
|
Adapter->subevent.Snr_high.Freq--;
|
||||||
|
if (Adapter->subevent.Snr_high.Freq == 1)
|
||||||
|
Adapter->subevent.Snr_high.Freq = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function computes the RSSI in received packet.
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @param pRxPD A pointer to RxPD structure of received packet
|
||||||
|
* @return n/a
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
wlan_compute_rssi(wlan_private * priv, RxPD * pRxPD)
|
||||||
|
{
|
||||||
|
wlan_adapter *Adapter = priv->adapter;
|
||||||
|
static int timer=0;
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
wlan_debug3("RxPD: SNR = %d, NF = %d\n", pRxPD->SNR, pRxPD->NF);
|
||||||
|
|
||||||
|
Adapter->SNR[TYPE_RXPD][TYPE_NOAVG] = pRxPD->SNR;
|
||||||
|
Adapter->NF[TYPE_RXPD][TYPE_NOAVG] = pRxPD->NF;
|
||||||
|
wlan_save_rawSNRNF(priv, pRxPD);
|
||||||
|
|
||||||
|
Adapter->RxPDAge =timer++;
|
||||||
|
Adapter->RxPDRate = pRxPD->RxRate;
|
||||||
|
|
||||||
|
Adapter->SNR[TYPE_RXPD][TYPE_AVG] = wlan_getAvgSNR(priv) * AVG_SCALE;
|
||||||
|
Adapter->NF[TYPE_RXPD][TYPE_AVG] = wlan_getAvgNF(priv) * AVG_SCALE;
|
||||||
|
wlan_debug3("SNR-avg = %d, NF-avg = %d\n",
|
||||||
|
Adapter->SNR[TYPE_RXPD][TYPE_AVG] / AVG_SCALE,
|
||||||
|
Adapter->NF[TYPE_RXPD][TYPE_AVG] / AVG_SCALE);
|
||||||
|
|
||||||
|
Adapter->RSSI[TYPE_RXPD][TYPE_NOAVG] =
|
||||||
|
CAL_RSSI(Adapter->SNR[TYPE_RXPD][TYPE_NOAVG],
|
||||||
|
Adapter->NF[TYPE_RXPD][TYPE_NOAVG]);
|
||||||
|
|
||||||
|
Adapter->RSSI[TYPE_RXPD][TYPE_AVG] =
|
||||||
|
CAL_RSSI(Adapter->SNR[TYPE_RXPD][TYPE_AVG] / AVG_SCALE,
|
||||||
|
Adapter->NF[TYPE_RXPD][TYPE_AVG] / AVG_SCALE);
|
||||||
|
wlan_check_subscribe_event(priv);
|
||||||
|
LEAVE();
|
||||||
|
}
|
||||||
|
|
||||||
|
/********************************************************
|
||||||
|
Global functions
|
||||||
|
********************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function processes received packet and forwards it
|
||||||
|
* to kernel/upper layer
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private
|
||||||
|
* @param skb A pointer to skb which includes the received packet
|
||||||
|
* @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
struct pbuf* ProcessRxedPacket(wlan_private * priv, struct sk_buff *skb)
|
||||||
|
{
|
||||||
|
int ret = WLAN_STATUS_SUCCESS;
|
||||||
|
struct pbuf* p=RT_NULL;
|
||||||
|
RxPacketHdr_t *pRxPkt;
|
||||||
|
RxPD *pRxPD;
|
||||||
|
u32 pbuflen;
|
||||||
|
int hdrChop;
|
||||||
|
int minlen;
|
||||||
|
EthII_Hdr_t *pEthHdr;
|
||||||
|
|
||||||
|
const u8 rfc1042_eth_hdr[] = { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 };
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
pRxPD = (RxPD *) skb->data;
|
||||||
|
pRxPkt = (RxPacketHdr_t *) ((u8 *) pRxPD + pRxPD->PktOffset);
|
||||||
|
/*mac source address :6byte .mac destination address :6byte. length 2 bytes =14*/
|
||||||
|
minlen=(8+4+(pRxPD->PktOffset));
|
||||||
|
|
||||||
|
if (skb->len < minlen) {
|
||||||
|
wlan_debug1( "RX Error: FRAME RECEIVED WITH BAD LENGTH\n");
|
||||||
|
priv->stats.rx_length_errors++;
|
||||||
|
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
wlan_debug3( "RX Data: skb->len - pRxPD->PktOffset = %d - %d = %d\n",
|
||||||
|
skb->len, pRxPD->PktOffset, skb->len - pRxPD->PktOffset);
|
||||||
|
|
||||||
|
wlan_debug3("RX Data: Dest %x,%x,%x,%x,%x,%x", pRxPkt->eth803_hdr.dest_addr[0],
|
||||||
|
pRxPkt->eth803_hdr.dest_addr[1],
|
||||||
|
pRxPkt->eth803_hdr.dest_addr[2],
|
||||||
|
pRxPkt->eth803_hdr.dest_addr[3],
|
||||||
|
pRxPkt->eth803_hdr.dest_addr[4],
|
||||||
|
pRxPkt->eth803_hdr.dest_addr[5]);
|
||||||
|
wlan_debug3("RX Data: Src %x,%x,%x,%x,%x,%x", pRxPkt->eth803_hdr.src_addr[0],
|
||||||
|
pRxPkt->eth803_hdr.src_addr[1],
|
||||||
|
pRxPkt->eth803_hdr.src_addr[2],
|
||||||
|
pRxPkt->eth803_hdr.src_addr[3],
|
||||||
|
pRxPkt->eth803_hdr.src_addr[4],
|
||||||
|
pRxPkt->eth803_hdr.src_addr[5]);
|
||||||
|
|
||||||
|
if (memcmp(&pRxPkt->rfc1042_hdr,
|
||||||
|
rfc1042_eth_hdr, sizeof(rfc1042_eth_hdr)) == 0) {
|
||||||
|
/*
|
||||||
|
* Replace the 803 header and rfc1042 header (llc/snap) with an
|
||||||
|
* EthernetII header, keep the src/dst and snap_type (ethertype)
|
||||||
|
*
|
||||||
|
* The firmware only passes up SNAP frames converting
|
||||||
|
* all RX Data from 802.11 to 802.2/LLC/SNAP frames.
|
||||||
|
*
|
||||||
|
* To create the Ethernet II, just move the src, dst address right
|
||||||
|
* before the snap_type.
|
||||||
|
*/
|
||||||
|
pEthHdr = (EthII_Hdr_t *)
|
||||||
|
((u8 *) & pRxPkt->eth803_hdr
|
||||||
|
+ sizeof(pRxPkt->eth803_hdr) + sizeof(pRxPkt->rfc1042_hdr)
|
||||||
|
- sizeof(pRxPkt->eth803_hdr.dest_addr)
|
||||||
|
- sizeof(pRxPkt->eth803_hdr.src_addr)
|
||||||
|
- sizeof(pRxPkt->rfc1042_hdr.snap_type));
|
||||||
|
|
||||||
|
rt_memcpy(pEthHdr->src_addr, pRxPkt->eth803_hdr.src_addr,
|
||||||
|
sizeof(pEthHdr->src_addr));
|
||||||
|
rt_memcpy(pEthHdr->dest_addr, pRxPkt->eth803_hdr.dest_addr,
|
||||||
|
sizeof(pEthHdr->dest_addr));
|
||||||
|
|
||||||
|
/* Chop off the RxPD + the excess memory from the 802.2/llc/snap header
|
||||||
|
* that was removed
|
||||||
|
*/
|
||||||
|
hdrChop = (u8 *) pEthHdr - (u8 *) pRxPD;
|
||||||
|
} else {
|
||||||
|
HEXDUMP("RX Data: LLC/SNAP",
|
||||||
|
(u8 *) & pRxPkt->rfc1042_hdr, sizeof(pRxPkt->rfc1042_hdr));
|
||||||
|
|
||||||
|
/* Chop off the RxPD */
|
||||||
|
hdrChop = (u8 *) & pRxPkt->eth803_hdr - (u8 *) pRxPD;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Chop off the leading header bytes so the skb points to the start of
|
||||||
|
* either the reconstructed EthII frame or the 802.2/llc/snap frame
|
||||||
|
*/
|
||||||
|
|
||||||
|
wlan_compute_rssi(priv, pRxPD);
|
||||||
|
pbuflen=(skb->len-hdrChop);
|
||||||
|
wlan_debug1("pbuflen= %d",pbuflen);
|
||||||
|
p = pbuf_alloc(PBUF_LINK, pbuflen, PBUF_RAM);
|
||||||
|
if(p==RT_NULL)
|
||||||
|
{
|
||||||
|
wlan_debug1("alloc pbuf failed length %d",pbuflen);
|
||||||
|
return RT_NULL;
|
||||||
|
}
|
||||||
|
rt_memcpy(p->payload,(u8*)((u32)pRxPD+hdrChop),pbuflen);
|
||||||
|
|
||||||
|
priv->stats.rx_bytes += skb->len;
|
||||||
|
priv->stats.rx_packets++;
|
||||||
|
|
||||||
|
wlan_debug3("Data => kernel\n");
|
||||||
|
|
||||||
|
done:
|
||||||
|
LEAVE();
|
||||||
|
|
||||||
|
return (p);
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,375 @@
|
||||||
|
/** @file wlan_scan.h
|
||||||
|
*
|
||||||
|
* @brief Interface for the wlan network scan routines
|
||||||
|
*
|
||||||
|
* Driver interface functions and type declarations for the scan module
|
||||||
|
* implemented in wlan_scan.c.
|
||||||
|
*
|
||||||
|
* Copyright © Marvell International Ltd. and/or its affiliates, 2003-2006
|
||||||
|
*
|
||||||
|
* @sa wlan_scan.c
|
||||||
|
*/
|
||||||
|
/*************************************************************
|
||||||
|
Change Log:
|
||||||
|
01/11/06: Initial revision. New scan code, relocate related functions
|
||||||
|
|
||||||
|
************************************************************/
|
||||||
|
|
||||||
|
#ifndef _WLAN_SCAN_H
|
||||||
|
#define _WLAN_SCAN_H
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Maximum number of channels that can be sent in a setuserscan ioctl
|
||||||
|
*
|
||||||
|
* @sa wlan_ioctl_user_scan_cfg
|
||||||
|
*/
|
||||||
|
#define WLAN_IOCTL_USER_SCAN_CHAN_MAX 50
|
||||||
|
|
||||||
|
//! Infrastructure BSS scan type in wlan_scan_cmd_config
|
||||||
|
#define WLAN_SCAN_BSS_TYPE_BSS 1
|
||||||
|
|
||||||
|
//! Adhoc BSS scan type in wlan_scan_cmd_config
|
||||||
|
#define WLAN_SCAN_BSS_TYPE_IBSS 2
|
||||||
|
|
||||||
|
//! Adhoc or Infrastructure BSS scan type in wlan_scan_cmd_config, no filter
|
||||||
|
#define WLAN_SCAN_BSS_TYPE_ANY 3
|
||||||
|
|
||||||
|
/** @brief Maximum buffer space for beacons retrieved from scan responses
|
||||||
|
* 4000 has successfully stored up to 40 beacons
|
||||||
|
* 6000 has successfully stored the max scan results (max 64)
|
||||||
|
*/
|
||||||
|
#define MAX_SCAN_BEACON_BUFFER 6000
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Buffer pad space for newly allocated beacons/probe responses
|
||||||
|
*
|
||||||
|
* Beacons are typically 6 bytes longer than an equivalent probe response.
|
||||||
|
* For each scan response stored, allocate an extra byte pad at the end to
|
||||||
|
* allow easy expansion to store a beacon in the same memory a probe reponse
|
||||||
|
* previously contained
|
||||||
|
*/
|
||||||
|
#define SCAN_BEACON_ENTRY_PAD 6
|
||||||
|
|
||||||
|
//! Scan time specified in the channel TLV for each channel for passive scans
|
||||||
|
#define MRVDRV_PASSIVE_SCAN_CHAN_TIME 100
|
||||||
|
|
||||||
|
//! Scan time specified in the channel TLV for each channel for active scans
|
||||||
|
#define MRVDRV_ACTIVE_SCAN_CHAN_TIME 100
|
||||||
|
|
||||||
|
//! Scan time specified in the channel TLV for each channel for specific scans
|
||||||
|
#define MRVDRV_SPECIFIC_SCAN_CHAN_TIME 100
|
||||||
|
|
||||||
|
//! Max passive scan time for each channel in milliseconds
|
||||||
|
#define MRVDRV_MAX_PASSIVE_SCAN_CHAN_TIME 2000
|
||||||
|
|
||||||
|
//! Max active scan time for each channel in milliseconds
|
||||||
|
#define MRVDRV_MAX_ACTIVE_SCAN_CHAN_TIME 500
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Max total scan time in milliseconds
|
||||||
|
* The total scan time should be less than scan command timeout value (10s)
|
||||||
|
*/
|
||||||
|
#define MRVDRV_MAX_TOTAL_SCAN_TIME (MRVDRV_TIMER_10S - MRVDRV_TIMER_1S)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Structure used internally in the wlan driver to configure a scan.
|
||||||
|
*
|
||||||
|
* Sent to the command processing module to configure the firmware
|
||||||
|
* scan command prepared by wlan_cmd_802_11_scan.
|
||||||
|
*
|
||||||
|
* @sa wlan_scan_networks
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @brief BSS Type to be sent in the firmware command
|
||||||
|
*
|
||||||
|
* Field can be used to restrict the types of networks returned in the
|
||||||
|
* scan. Valid settings are:
|
||||||
|
*
|
||||||
|
* - WLAN_SCAN_BSS_TYPE_BSS (infrastructure)
|
||||||
|
* - WLAN_SCAN_BSS_TYPE_IBSS (adhoc)
|
||||||
|
* - WLAN_SCAN_BSS_TYPE_ANY (unrestricted, adhoc and infrastructure)
|
||||||
|
*/
|
||||||
|
u8 bssType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Specific BSSID used to filter scan results in the firmware
|
||||||
|
*/
|
||||||
|
u8 specificBSSID[MRVDRV_ETH_ADDR_LEN];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Length of TLVs sent in command starting at tlvBuffer
|
||||||
|
*/
|
||||||
|
int tlvBufferLen;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SSID TLV(s) and ChanList TLVs to be sent in the firmware command
|
||||||
|
*
|
||||||
|
* @sa TLV_TYPE_CHANLIST, MrvlIEtypes_ChanListParamSet_t
|
||||||
|
* @sa TLV_TYPE_SSID, MrvlIEtypes_SsIdParamSet_t
|
||||||
|
*/
|
||||||
|
u8 tlvBuffer[1]; //!< SSID TLV(s) and ChanList TLVs are stored here
|
||||||
|
} wlan_scan_cmd_config;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief IOCTL channel sub-structure sent in wlan_ioctl_user_scan_cfg
|
||||||
|
*
|
||||||
|
* Multiple instances of this structure are included in the IOCTL command
|
||||||
|
* to configure a instance of a scan on the specific channel.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
u8 chanNumber; //!< Channel Number to scan
|
||||||
|
u8 radioType; //!< Radio type: 'B/G' Band = 0, 'A' Band = 1
|
||||||
|
u8 scanType; //!< Scan type: Active = 0, Passive = 1
|
||||||
|
u8 reserved;
|
||||||
|
u16 scanTime; //!< Scan duration in milliseconds; if 0 default used
|
||||||
|
} __ATTRIB_PACK__ wlan_ioctl_user_scan_chan;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief IOCTL SSID List sub-structure sent in wlan_ioctl_user_scan_cfg
|
||||||
|
*
|
||||||
|
* Used to specify SSID specific filters as well as SSID pattern matching
|
||||||
|
* filters for scan result processing in firmware.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
char ssid[MRVDRV_MAX_SSID_LENGTH + 1];
|
||||||
|
u8 maxLen;
|
||||||
|
} __ATTRIB_PACK__ wlan_ioctl_user_scan_ssid;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief IOCTL input structure to configure an immediate scan cmd to firmware
|
||||||
|
*
|
||||||
|
* Used in the setuserscan (WLAN_SET_USER_SCAN) private ioctl. Specifies
|
||||||
|
* a number of parameters to be used in general for the scan as well
|
||||||
|
* as a channel list (wlan_ioctl_user_scan_chan) for each scan period
|
||||||
|
* desired.
|
||||||
|
*
|
||||||
|
* @sa wlan_set_user_scan_ioctl
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Flag set to keep the previous scan table intact
|
||||||
|
*
|
||||||
|
* If set, the scan results will accumulate, replacing any previous
|
||||||
|
* matched entries for a BSS with the new scan data
|
||||||
|
*/
|
||||||
|
u8 keepPreviousScan; //!< Do not erase the existing scan results
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief BSS Type to be sent in the firmware command
|
||||||
|
*
|
||||||
|
* Field can be used to restrict the types of networks returned in the
|
||||||
|
* scan. Valid settings are:
|
||||||
|
*
|
||||||
|
* - WLAN_SCAN_BSS_TYPE_BSS (infrastructure)
|
||||||
|
* - WLAN_SCAN_BSS_TYPE_IBSS (adhoc)
|
||||||
|
* - WLAN_SCAN_BSS_TYPE_ANY (unrestricted, adhoc and infrastructure)
|
||||||
|
*/
|
||||||
|
u8 bssType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Configure the number of probe requests for active chan scans
|
||||||
|
*/
|
||||||
|
u8 numProbes;
|
||||||
|
|
||||||
|
u8 reserved;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief BSSID filter sent in the firmware command to limit the results
|
||||||
|
*/
|
||||||
|
u8 specificBSSID[MRVDRV_ETH_ADDR_LEN];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SSID filter list used in the to limit the scan results
|
||||||
|
*/
|
||||||
|
wlan_ioctl_user_scan_ssid ssidList[MRVDRV_MAX_SSID_LIST_LENGTH];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Variable number (fixed maximum) of channels to scan up
|
||||||
|
*/
|
||||||
|
wlan_ioctl_user_scan_chan chanList[WLAN_IOCTL_USER_SCAN_CHAN_MAX];
|
||||||
|
|
||||||
|
} __ATTRIB_PACK__ wlan_ioctl_user_scan_cfg;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sub-structure passed in wlan_ioctl_get_scan_table_entry for each BSS
|
||||||
|
*
|
||||||
|
* Fixed field information returned for the scan response in the IOCTL
|
||||||
|
* response.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
u8 bssid[6]; //!< BSSID of this network
|
||||||
|
u8 channel; //!< Channel this beacon/probe response was detected
|
||||||
|
u8 rssi; //!< RSSI for the received packet
|
||||||
|
u64 networkTSF; //!< TSF value from the firmware at packet reception
|
||||||
|
} __ATTRIB_PACK__ wlan_ioctl_get_scan_table_fixed;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Structure passed in the wlan_ioctl_get_scan_table_info for each
|
||||||
|
* BSS returned in the WLAN_GET_SCAN_RESP IOCTL
|
||||||
|
*
|
||||||
|
* @sa wlan_get_scan_table_ioctl
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Fixed field length included in the response.
|
||||||
|
*
|
||||||
|
* Length value is included so future fixed fields can be added to the
|
||||||
|
* response without breaking backwards compatibility. Use the length
|
||||||
|
* to find the offset for the bssInfoLength field, not a sizeof() calc.
|
||||||
|
*/
|
||||||
|
u32 fixedFieldLength;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Always present, fixed length data fields for the BSS
|
||||||
|
*/
|
||||||
|
wlan_ioctl_get_scan_table_fixed fixedFields;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Length of the BSS Information (probe resp or beacon) that
|
||||||
|
* follows starting at bssInfoBuffer
|
||||||
|
*/
|
||||||
|
u32 bssInfoLength;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Probe response or beacon scanned for the BSS.
|
||||||
|
*
|
||||||
|
* Field layout:
|
||||||
|
* - TSF 8 octets
|
||||||
|
* - Beacon Interval 2 octets
|
||||||
|
* - Capability Info 2 octets
|
||||||
|
*
|
||||||
|
* - IEEE Infomation Elements; variable number & length per 802.11 spec
|
||||||
|
*/
|
||||||
|
u8 bssInfoBuffer[1];
|
||||||
|
} __ATTRIB_PACK__ wlan_ioctl_get_scan_table_entry;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief WLAN_GET_SCAN_RESP private IOCTL struct to retrieve the scan table
|
||||||
|
*
|
||||||
|
* @sa wlan_get_scan_table_ioctl
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* - Zero based scan entry to start retrieval in command request
|
||||||
|
* - Number of scans entires returned in command response
|
||||||
|
*/
|
||||||
|
u32 scanNumber;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Buffer marker for multiple wlan_ioctl_get_scan_table_entry structures.
|
||||||
|
* Each struct is padded to the nearest 32 bit boundary.
|
||||||
|
*/
|
||||||
|
u8 scan_table_entry_buffer[1];
|
||||||
|
|
||||||
|
} __ATTRIB_PACK__ wlan_ioctl_get_scan_table_info;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Structure used to store information for each beacon/probe response
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
WLAN_802_11_MAC_ADDRESS MacAddress;
|
||||||
|
|
||||||
|
WLAN_802_11_SSID Ssid;
|
||||||
|
|
||||||
|
/* WEP encryption requirement */
|
||||||
|
u32 Privacy;
|
||||||
|
|
||||||
|
/* receive signal strength in dBm */
|
||||||
|
WLAN_802_11_RSSI Rssi;
|
||||||
|
|
||||||
|
u32 Channel;
|
||||||
|
|
||||||
|
u16 BeaconPeriod;
|
||||||
|
|
||||||
|
u32 ATIMWindow;
|
||||||
|
u8 ERPFlags;
|
||||||
|
|
||||||
|
WLAN_802_11_NETWORK_TYPE NetworkTypeInUse;
|
||||||
|
WLAN_802_11_NETWORK_INFRASTRUCTURE InfrastructureMode;
|
||||||
|
WLAN_802_11_RATES SupportedRates;
|
||||||
|
IEEEtypes_WmmParameter_t wmmIE;
|
||||||
|
|
||||||
|
int extra_ie;
|
||||||
|
|
||||||
|
u8 TimeStamp[8]; //!< TSF value included in the beacon/probe response
|
||||||
|
|
||||||
|
IEEEtypes_PhyParamSet_t PhyParamSet;
|
||||||
|
IEEEtypes_SsParamSet_t SsParamSet;
|
||||||
|
IEEEtypes_CapInfo_t Cap;
|
||||||
|
|
||||||
|
u8 DataRates[WLAN_SUPPORTED_RATES];
|
||||||
|
|
||||||
|
u64 networkTSF; //!< TSF timestamp from the current firmware TSF
|
||||||
|
|
||||||
|
IEEEtypes_CountryInfoFullSet_t CountryInfo;
|
||||||
|
|
||||||
|
IEEEtypes_VendorSpecific_t wpaIE;
|
||||||
|
IEEEtypes_Generic_t rsnIE;
|
||||||
|
|
||||||
|
IEEEtypes_VendorSpecific_t wpsIE;
|
||||||
|
|
||||||
|
u8 *pBeaconBuf; //!< Pointer to the returned scan response
|
||||||
|
u32 beaconBufSize; //!< Length of the stored scan response //dennis
|
||||||
|
u32 beaconBufSizeMax; //!< Max allocated size for updated scan response //dennis
|
||||||
|
|
||||||
|
} BSSDescriptor_t;
|
||||||
|
|
||||||
|
extern int SSIDcmp(WLAN_802_11_SSID * ssid1, WLAN_802_11_SSID * ssid2);
|
||||||
|
extern int FindSSIDInList(wlan_adapter * Adapter, WLAN_802_11_SSID * ssid,
|
||||||
|
u8 * bssid, int mode);
|
||||||
|
extern int FindBestSSIDInList(wlan_adapter * Adapter);
|
||||||
|
extern int FindBSSIDInList(wlan_adapter * Adapter, u8 * bssid, int mode);
|
||||||
|
|
||||||
|
extern int FindBestNetworkSsid(wlan_private * priv, WLAN_802_11_SSID * pSSID);
|
||||||
|
|
||||||
|
extern int SendSpecificSSIDScan(wlan_private * priv,
|
||||||
|
WLAN_802_11_SSID * pRequestedSSID);
|
||||||
|
extern int SendSpecificBSSIDScan(wlan_private * priv, u8 * bssid);
|
||||||
|
|
||||||
|
extern int wlan_get_scan_table_ioctl(wlan_private * priv, void*wrq);
|
||||||
|
extern int wlan_set_user_scan_ioctl(wlan_private * priv, void *wrq);
|
||||||
|
|
||||||
|
extern int wlan_associate(wlan_private * priv, BSSDescriptor_t * pBSSDesc);
|
||||||
|
|
||||||
|
extern int wlan_cmd_802_11_scan(wlan_private * priv,
|
||||||
|
HostCmd_DS_COMMAND * cmd, void *pdata_buf);
|
||||||
|
|
||||||
|
extern void wlan_scan_update_tsf_timestamps(wlan_private * priv,
|
||||||
|
BSSDescriptor_t * pNewBssDesc);
|
||||||
|
|
||||||
|
extern int wlan_ret_802_11_scan(wlan_private * priv,
|
||||||
|
HostCmd_DS_COMMAND * resp);
|
||||||
|
|
||||||
|
extern int wlan_extscan_ioctl(wlan_private * priv, void *req);
|
||||||
|
|
||||||
|
extern int sendBgScanQueryCmd(wlan_private * priv);
|
||||||
|
extern int wlan_bg_scan_enable(wlan_private * priv, BOOLEAN enable);
|
||||||
|
//extern int wlan_do_bg_scan_config_ioctl(wlan_private * priv,
|
||||||
|
// void *req);
|
||||||
|
extern int wlan_cmd_802_11_bg_scan_config(wlan_private * priv,
|
||||||
|
HostCmd_DS_COMMAND * cmd,
|
||||||
|
int cmd_action, void *pdata_buf);
|
||||||
|
extern int wlan_cmd_802_11_bg_scan_query(wlan_private * priv,
|
||||||
|
HostCmd_DS_COMMAND * cmd);
|
||||||
|
|
||||||
|
#ifdef __KERNEL__
|
||||||
|
extern int wlan_get_scan(struct net_device *dev, struct iw_request_info *info,
|
||||||
|
struct iw_point *dwrq, char *extra);
|
||||||
|
extern int wlan_set_scan(struct net_device *dev, struct iw_request_info *info,
|
||||||
|
struct iw_param *vwrq, char *extra);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _WLAN_SCAN_H */
|
|
@ -0,0 +1,40 @@
|
||||||
|
/*
|
||||||
|
* Copyright © Marvell International Ltd. and/or its affiliates, 2003-2006
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __WLAN_THREAD_H_
|
||||||
|
#define __WLAN_THREAD_H_
|
||||||
|
|
||||||
|
#include <rtthread.h>
|
||||||
|
#define WakeUpMainThread (0x01)
|
||||||
|
#define WakeUpReassociationThread (0x02)
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
struct rt_thread task; //wait for modified
|
||||||
|
struct rt_event waitQ;
|
||||||
|
int priority;
|
||||||
|
void *priv;
|
||||||
|
} wlan_thread;
|
||||||
|
|
||||||
|
static void wlan_activate_thread(wlan_thread * thr)
|
||||||
|
{
|
||||||
|
/** Record the thread pid */
|
||||||
|
rt_event_init(&thr->waitQ, "threadevt", RT_IPC_FLAG_FIFO);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void wlan_deactivate_thread(wlan_thread * thr)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static void wlan_create_thread(int (*wlanfunc) (void *), wlan_thread * thr, char *name)
|
||||||
|
{
|
||||||
|
// thr->task = kthread_run(wlanfunc, thr, "%s", name);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int wlan_terminate_thread(wlan_thread * thr)
|
||||||
|
{
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,332 @@
|
||||||
|
/** @file wlan_tx.c
|
||||||
|
* @brief This file contains the handling of TX in wlan
|
||||||
|
* driver.
|
||||||
|
*
|
||||||
|
* Copyright © Marvell International Ltd. and/or its affiliates, 2003-2006
|
||||||
|
*/
|
||||||
|
/********************************************************
|
||||||
|
Change log:
|
||||||
|
09/28/05: Add Doxygen format comments
|
||||||
|
12/13/05: Add Proprietary periodic sleep support
|
||||||
|
01/05/06: Add kernel 2.6.x support
|
||||||
|
04/06/06: Add TSPEC, queue metrics, and MSDU expiry support
|
||||||
|
********************************************************/
|
||||||
|
|
||||||
|
#include "include.h"
|
||||||
|
#include <netif/ethernetif.h>
|
||||||
|
#define TX_QUEUED_PACKET_LOWER_LIMIT 40
|
||||||
|
#define TX_QUEUED_PACKET_UPPER_LIMIT 50
|
||||||
|
/********************************************************
|
||||||
|
Local Variables
|
||||||
|
********************************************************/
|
||||||
|
|
||||||
|
/********************************************************
|
||||||
|
Global Variables
|
||||||
|
********************************************************/
|
||||||
|
extern struct rt_event wlan_tx_event;
|
||||||
|
/********************************************************
|
||||||
|
Local Functions
|
||||||
|
********************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function processes a single packet and sends
|
||||||
|
* to IF layer
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @param skb A pointer to skb which includes TX packet
|
||||||
|
* @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
SendSinglePacket(wlan_private * priv, struct sk_buff *skb)
|
||||||
|
{
|
||||||
|
wlan_adapter *Adapter = priv->adapter;
|
||||||
|
int ret = WLAN_STATUS_SUCCESS;
|
||||||
|
TxPD LocalTxPD;
|
||||||
|
TxPD *pLocalTxPD = &LocalTxPD;
|
||||||
|
u8 *ptr = Adapter->TmpTxBuf;
|
||||||
|
struct pbuf *phead;
|
||||||
|
int curlen;
|
||||||
|
rt_base_t level;
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
if (!skb->len || (skb->len > MRVDRV_ETH_TX_PACKET_BUFFER_SIZE)) {
|
||||||
|
wlan_debug1( "Tx Error: Bad skb length %d : %d\n",
|
||||||
|
skb->len, MRVDRV_ETH_TX_PACKET_BUFFER_SIZE);
|
||||||
|
ret = WLAN_STATUS_FAILURE;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(pLocalTxPD, 0, sizeof(TxPD));
|
||||||
|
|
||||||
|
pLocalTxPD->TxPacketLength = skb->len;
|
||||||
|
|
||||||
|
if (Adapter->PSState != PS_STATE_FULL_POWER) {
|
||||||
|
if (TRUE == CheckLastPacketIndication(priv)) {
|
||||||
|
Adapter->TxLockFlag = TRUE;
|
||||||
|
pLocalTxPD->Flags = MRVDRV_TxPD_POWER_MGMT_LAST_PACKET;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* offset of actual data */
|
||||||
|
pLocalTxPD->TxPacketLocation = sizeof(TxPD);
|
||||||
|
|
||||||
|
if (pLocalTxPD->TxControl == 0) {
|
||||||
|
/* TxCtrl set by user or default */
|
||||||
|
pLocalTxPD->TxControl = Adapter->PktTxCtrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
endian_convert_TxPD(pLocalTxPD);
|
||||||
|
|
||||||
|
memcpy(pLocalTxPD->TxDestAddrHigh, skb->data, MRVDRV_ETH_ADDR_LEN);
|
||||||
|
|
||||||
|
memcpy(ptr, pLocalTxPD, sizeof(TxPD));
|
||||||
|
|
||||||
|
ptr += sizeof(TxPD);
|
||||||
|
phead=(struct pbuf*)skb->head;
|
||||||
|
curlen=0;
|
||||||
|
if(phead ->tot_len>=2048)
|
||||||
|
{
|
||||||
|
wlan_debug1("tx too long\r\n");
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
while(phead!=RT_NULL&&curlen<phead ->tot_len)
|
||||||
|
{
|
||||||
|
rt_memcpy(ptr+curlen, phead->payload,phead->len);
|
||||||
|
curlen+=phead->len;
|
||||||
|
phead=phead->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
// memcpy(ptr, skb->data, skb->len);
|
||||||
|
|
||||||
|
ret = sbi_host_to_card(priv, MVMS_DAT, Adapter->TmpTxBuf,
|
||||||
|
skb->len + sizeof(TxPD));
|
||||||
|
if (ret) {
|
||||||
|
wlan_debug1("SendSinglePacket Error: sbi_host_to_card failed: 0x%X\n",
|
||||||
|
ret);
|
||||||
|
Adapter->dbg.num_tx_host_to_card_failure++;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
wlan_debug3("Data => FW\n");
|
||||||
|
//wmm_process_fw_iface_tx_xfer_start(priv);
|
||||||
|
if (--Adapter->wmm.packetsQueued < TX_QUEUED_PACKET_LOWER_LIMIT) {
|
||||||
|
wlan_debug2( "WMM: FW OS+: %d\n", Adapter->wmm.packetsQueued);
|
||||||
|
if(Adapter->wmm.downlinkblock==TRUE)
|
||||||
|
{
|
||||||
|
level = rt_hw_interrupt_disable();
|
||||||
|
Adapter->wmm.downlinkblock=FALSE;
|
||||||
|
rt_hw_interrupt_enable(level);
|
||||||
|
rt_sem_release(&Adapter->wmm.flowcrsem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
done:
|
||||||
|
if (!ret) {
|
||||||
|
priv->stats.tx_packets++;
|
||||||
|
priv->stats.tx_bytes += skb->len;
|
||||||
|
} else {
|
||||||
|
priv->stats.tx_dropped++;
|
||||||
|
priv->stats.tx_errors++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* need to be freed in all cases */
|
||||||
|
// if(skb->head!=NULL)
|
||||||
|
{
|
||||||
|
//rt_free(skb->head);
|
||||||
|
rt_free(skb);
|
||||||
|
}
|
||||||
|
level = rt_hw_interrupt_disable();
|
||||||
|
priv->adapter->CurrentTxSkb = NULL;
|
||||||
|
rt_hw_interrupt_enable(level);
|
||||||
|
rt_event_send(&wlan_tx_event, 0x01);
|
||||||
|
|
||||||
|
LEAVE();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/********************************************************
|
||||||
|
Global functions
|
||||||
|
********************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function checks the conditions and sends packet to IF
|
||||||
|
* layer if everything is ok.
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @return n/a
|
||||||
|
*/
|
||||||
|
extern struct rt_semaphore driver_sem;
|
||||||
|
void wlan_process_tx(wlan_private * priv)
|
||||||
|
{
|
||||||
|
wlan_adapter *Adapter = priv->adapter;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
if (priv->wlan_dev.dnld_sent) {
|
||||||
|
wlan_debug1 ("TX Error: dnld_sent = %d, not sending\n",priv->wlan_dev.dnld_sent);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
SendSinglePacket(priv, Adapter->CurrentTxSkb);
|
||||||
|
rt_sem_take(&driver_sem, RT_WAITING_FOREVER);
|
||||||
|
priv->adapter->HisRegCpy &= ~HIS_TxDnLdRdy;
|
||||||
|
rt_sem_release(&driver_sem);
|
||||||
|
|
||||||
|
done:
|
||||||
|
LEAVE();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function queues the packet received from
|
||||||
|
* kernel/upper layer and wake up the main thread to handle it.
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @param skb A pointer to skb which includes TX packet
|
||||||
|
* @return WLAN_STATUS_SUCCESS or WLAN_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
|
||||||
|
int wlan_tx_packet(wlan_private * priv, struct pbuf *packet)
|
||||||
|
{
|
||||||
|
u32 flags;
|
||||||
|
wlan_adapter *Adapter = priv->adapter;
|
||||||
|
int ret = WLAN_STATUS_SUCCESS;
|
||||||
|
rt_base_t level;
|
||||||
|
struct sk_buff *skb=RT_NULL;
|
||||||
|
struct pbuf* p;
|
||||||
|
int datalen=0;
|
||||||
|
rt_uint32_t e;
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
skb=rt_malloc(sizeof(struct sk_buff));
|
||||||
|
if(skb==RT_NULL)
|
||||||
|
{
|
||||||
|
wlan_debug1("tx skb malloc failed\r\n");
|
||||||
|
return WLAN_STATUS_FAILURE;
|
||||||
|
}
|
||||||
|
skb->head = (char*)packet;
|
||||||
|
wlan_debug3("tx buf %d,%x\n",packet->tot_len, skb->head);
|
||||||
|
if (!(skb->head )) {
|
||||||
|
wlan_debug1("No free skb data buf\n");
|
||||||
|
|
||||||
|
ret = WLAN_STATUS_FAILURE;
|
||||||
|
rt_free(skb);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
skb->data=(char *)packet->payload;
|
||||||
|
/* p=packet;
|
||||||
|
while(p!=RT_NULL&&datalen< packet->tot_len)
|
||||||
|
{
|
||||||
|
rt_memcpy(skb->data+datalen, p->payload,p->len);
|
||||||
|
datalen+=p->len;
|
||||||
|
p=p->next;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
skb->len=packet->tot_len;
|
||||||
|
level = rt_hw_interrupt_disable();
|
||||||
|
list_add_tail((struct list_head *) skb,
|
||||||
|
(struct list_head *) &Adapter->wmm.txSkbQ);
|
||||||
|
Adapter->wmm.packetsQueued++;
|
||||||
|
if (!priv->wlan_dev.dnld_sent
|
||||||
|
|| (Adapter->wmm.packetsQueued >= TX_QUEUED_PACKET_UPPER_LIMIT)) {
|
||||||
|
wlan_debug1( "WMM: APP OS-: %d\n", Adapter->wmm.packetsQueued);
|
||||||
|
|
||||||
|
Adapter->wmm.downlinkblock=TRUE;
|
||||||
|
}
|
||||||
|
rt_hw_interrupt_enable(level);
|
||||||
|
|
||||||
|
rt_event_send(&priv->MainThread.waitQ, WakeUpMainThread);
|
||||||
|
if(Adapter->wmm.downlinkblock==TRUE)
|
||||||
|
{
|
||||||
|
rt_sem_take(&Adapter->wmm.flowcrsem, RT_WAITING_FOREVER);
|
||||||
|
}
|
||||||
|
rt_event_recv(&wlan_tx_event,0x1,RT_EVENT_FLAG_OR|RT_EVENT_FLAG_CLEAR,RT_WAITING_FOREVER,&e);
|
||||||
|
LEAVE();
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function tells firmware to send a NULL data packet.
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
* @param flags Trasnit Pkt Flags
|
||||||
|
* @return n/a
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
SendNullPacket(wlan_private * priv, u8 flags)
|
||||||
|
{
|
||||||
|
wlan_adapter *Adapter = priv->adapter;
|
||||||
|
TxPD txpd;
|
||||||
|
int ret = WLAN_STATUS_SUCCESS;
|
||||||
|
u8 *ptr = Adapter->TmpTxBuf;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
if (Adapter->SurpriseRemoved == TRUE) {
|
||||||
|
ret = WLAN_STATUS_FAILURE;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Adapter->MediaConnectStatus == WlanMediaStateDisconnected) {
|
||||||
|
ret = WLAN_STATUS_FAILURE;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(&txpd, 0, sizeof(TxPD));
|
||||||
|
|
||||||
|
txpd.TxControl = Adapter->PktTxCtrl;
|
||||||
|
txpd.Flags = flags;
|
||||||
|
txpd.Priority = WMM_HIGHEST_PRIORITY;
|
||||||
|
txpd.TxPacketLocation = sizeof(TxPD);
|
||||||
|
|
||||||
|
endian_convert_TxPD(&txpd);
|
||||||
|
|
||||||
|
memcpy(ptr, &txpd, sizeof(TxPD));
|
||||||
|
|
||||||
|
ret = sbi_host_to_card(priv, MVMS_DAT, Adapter->TmpTxBuf, sizeof(TxPD));
|
||||||
|
|
||||||
|
if (ret != 0) {
|
||||||
|
wlan_debug1( "TX Error: SendNullPacket failed!\n");
|
||||||
|
Adapter->dbg.num_tx_host_to_card_failure++;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
wlan_debug3("Null data => FW\n");
|
||||||
|
|
||||||
|
|
||||||
|
done:
|
||||||
|
LEAVE();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function check if we need send last packet indication.
|
||||||
|
*
|
||||||
|
* @param priv A pointer to wlan_private structure
|
||||||
|
*
|
||||||
|
* @return TRUE or FALSE
|
||||||
|
*/
|
||||||
|
BOOLEAN
|
||||||
|
CheckLastPacketIndication(wlan_private * priv)
|
||||||
|
{
|
||||||
|
wlan_adapter *Adapter = priv->adapter;
|
||||||
|
BOOLEAN ret = FALSE;
|
||||||
|
BOOLEAN prop_ps = TRUE;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
if (Adapter->sleep_period.period == 0 || Adapter->gen_null_pkg == FALSE /* for UPSD certification tests */
|
||||||
|
) {
|
||||||
|
LEAVE();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (wmm_lists_empty(priv)) {
|
||||||
|
// if (((Adapter->CurBssParams.wmm_uapsd_enabled == TRUE)
|
||||||
|
// && (Adapter->wmm.qosinfo != 0)) || prop_ps) {
|
||||||
|
ret = TRUE;
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
LEAVE();
|
||||||
|
return ret;
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,67 @@
|
||||||
|
#include "wlan_defs.h"
|
||||||
|
#include "stdio.h"
|
||||||
|
void INIT_LIST_HEAD(struct list_head *list)
|
||||||
|
{
|
||||||
|
list->next = list;
|
||||||
|
list->prev = list;
|
||||||
|
}
|
||||||
|
static void __list_add(struct list_head *new,
|
||||||
|
struct list_head *prev,
|
||||||
|
struct list_head *next)
|
||||||
|
{
|
||||||
|
next->prev = new;
|
||||||
|
new->next = next;
|
||||||
|
new->prev = prev;
|
||||||
|
prev->next = new;
|
||||||
|
}
|
||||||
|
void list_add_tail(struct list_head *new, struct list_head *head)
|
||||||
|
{
|
||||||
|
__list_add(new, head->prev, head);
|
||||||
|
}
|
||||||
|
void list_add(struct list_head *new, struct list_head *head)
|
||||||
|
{
|
||||||
|
__list_add(new, head, head->next);
|
||||||
|
}
|
||||||
|
int list_empty(const struct list_head *head)
|
||||||
|
{
|
||||||
|
return head->next == head;
|
||||||
|
}
|
||||||
|
static void __list_del(struct list_head * prev, struct list_head * next)
|
||||||
|
{
|
||||||
|
next->prev = prev;
|
||||||
|
prev->next = next;
|
||||||
|
}
|
||||||
|
void list_del(struct list_head *entry)
|
||||||
|
{
|
||||||
|
__list_del(entry->prev, entry->next);
|
||||||
|
entry->next = NULL;
|
||||||
|
entry->prev = NULL;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* memmove - Copy one area of memory to another
|
||||||
|
* @dest: Where to copy to
|
||||||
|
* @src: Where to copy from
|
||||||
|
* @count: The size of the area.
|
||||||
|
*
|
||||||
|
* Unlike memcpy(), memmove() copes with overlapping areas.
|
||||||
|
*/
|
||||||
|
void *memmove(void *dest, const void *src, unsigned int count)
|
||||||
|
{
|
||||||
|
char *tmp;
|
||||||
|
const char *s;
|
||||||
|
|
||||||
|
if (dest <= src) {
|
||||||
|
tmp = dest;
|
||||||
|
s = src;
|
||||||
|
while (count--)
|
||||||
|
*tmp++ = *s++;
|
||||||
|
} else {
|
||||||
|
tmp = dest;
|
||||||
|
tmp += count;
|
||||||
|
s = src;
|
||||||
|
s += count;
|
||||||
|
while (count--)
|
||||||
|
*--tmp = *--s;
|
||||||
|
}
|
||||||
|
return dest;
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
/** @file wlan_version.h
|
||||||
|
* @brief This file contains wlan driver version number.
|
||||||
|
*
|
||||||
|
* Copyright © Marvell International Ltd. and/or its affiliates, 2003-2006
|
||||||
|
*/
|
||||||
|
/********************************************************
|
||||||
|
Change log:
|
||||||
|
10/04/05: Add Doxygen format comments
|
||||||
|
|
||||||
|
********************************************************/
|
||||||
|
//#include "../release_version.h"
|
||||||
|
|
||||||
|
const char driver_version[] =
|
||||||
|
// "gspi8686-%s-" DRIVER_RELEASE_VERSION "-(" "FP" FPNUM ")"
|
||||||
|
//#ifdef DEBUG_LEVEL2
|
||||||
|
"-dbg"
|
||||||
|
//#endif
|
||||||
|
" ";
|
|
@ -0,0 +1,221 @@
|
||||||
|
/** @file wlan_wext.c
|
||||||
|
* @brief This file contains ioctl functions
|
||||||
|
*
|
||||||
|
* Copyright © Marvell International Ltd. and/or its affiliates, 2003-2007
|
||||||
|
*/
|
||||||
|
/********************************************************
|
||||||
|
Change log:
|
||||||
|
10/10/05: Add Doxygen format comments
|
||||||
|
12/23/05: Modify FindBSSIDInList to search entire table for
|
||||||
|
duplicate BSSIDs when earlier matches are not compatible
|
||||||
|
12/26/05: Remove errant memcpy in wlanidle_off; overwriting stack space
|
||||||
|
01/05/06: Add kernel 2.6.x support
|
||||||
|
01/11/06: Conditionalize new scan/join functions.
|
||||||
|
Update statics/externs. Move forward decl. from wlan_decl.h
|
||||||
|
04/06/06: Add TSPEC, queue metrics, and MSDU expiry support
|
||||||
|
04/10/06: Add hostcmd generic API
|
||||||
|
04/18/06: Remove old Subscrive Event and add new Subscribe Event
|
||||||
|
implementation through generic hostcmd API
|
||||||
|
05/04/06: Add IBSS coalescing related new iwpriv command
|
||||||
|
08/29/06: Add ledgpio private command
|
||||||
|
10/23/06: Validate setbcnavg/setdataavg command parameters and
|
||||||
|
return error if out of range
|
||||||
|
********************************************************/
|
||||||
|
|
||||||
|
#include "include.h"
|
||||||
|
|
||||||
|
#include "wlan_version.h"
|
||||||
|
#include "wlan_dev.h"
|
||||||
|
#include "wlan_debug.h"
|
||||||
|
#include "wlan_wext.h"
|
||||||
|
extern struct rt_wlan_dev *wlan_eth ;
|
||||||
|
extern wlan_private *wlanpriv;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Find the channel frequency power info with specific channel
|
||||||
|
*
|
||||||
|
* @param adapter A pointer to wlan_adapter structure
|
||||||
|
* @param band it can be BAND_A, BAND_G or BAND_B
|
||||||
|
* @param channel the channel for looking
|
||||||
|
* @return A pointer to CHANNEL_FREQ_POWER structure or NULL if not find.
|
||||||
|
*/
|
||||||
|
CHANNEL_FREQ_POWER *
|
||||||
|
find_cfp_by_band_and_channel(wlan_adapter * adapter, u8 band, u16 channel)
|
||||||
|
{
|
||||||
|
CHANNEL_FREQ_POWER *cfp = NULL;
|
||||||
|
REGION_CHANNEL *rc;
|
||||||
|
int count = sizeof(adapter->region_channel) /
|
||||||
|
sizeof(adapter->region_channel[0]);
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
for (j = 0; !cfp && (j < count); j++) {
|
||||||
|
rc = &adapter->region_channel[j];
|
||||||
|
|
||||||
|
if (adapter->State11D.Enable11D == ENABLE_11D) {
|
||||||
|
rc = &adapter->universal_channel[j];
|
||||||
|
}
|
||||||
|
if (!rc->Valid || !rc->CFP)
|
||||||
|
continue;
|
||||||
|
if (rc->Band != band)
|
||||||
|
continue;
|
||||||
|
for (i = 0; i < rc->NrCFP; i++) {
|
||||||
|
if (rc->CFP[i].Channel == channel) {
|
||||||
|
cfp = &rc->CFP[i];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!cfp && channel)
|
||||||
|
wlan_debug1("find_cfp_by_band_and_channel(): cannot find "
|
||||||
|
"cfp by band %d & channel %d\n", band, channel);
|
||||||
|
|
||||||
|
return cfp;
|
||||||
|
}
|
||||||
|
int wlan_scan_network_for_AP(void)
|
||||||
|
{
|
||||||
|
if(wlan_eth==NULL)
|
||||||
|
return -1;
|
||||||
|
if(wlan_set_scan(wlan_eth, NULL,NULL,NULL)!=0)
|
||||||
|
wlan_debug1("wlan_set_scan sucess\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
int wlan_associate_AP(char *dstbssid,int len)
|
||||||
|
{
|
||||||
|
char * ssid[6];
|
||||||
|
if(dstbssid==RT_NULL)
|
||||||
|
rt_memset(ssid,0xff,6);
|
||||||
|
else{
|
||||||
|
rt_memcpy(ssid,dstbssid,6);
|
||||||
|
}
|
||||||
|
wlan_set_wap (wlan_eth, ssid,6);
|
||||||
|
}
|
||||||
|
static _wep_key_set_arg keyset;
|
||||||
|
int set_wlan_wep_key_char(char *key,int len)
|
||||||
|
{
|
||||||
|
|
||||||
|
int keylen=len;
|
||||||
|
wlan_debug1( "set wep key %s\n",key);
|
||||||
|
rt_memset((u8*)&keyset,0x00,sizeof(Wep_Key_Set_Arg));
|
||||||
|
rt_memcpy((u8*)(&keyset.Key_value[0]),key,len);
|
||||||
|
keyset.KeyLength[0]=len;
|
||||||
|
keyset.defaut_key_index=0;
|
||||||
|
keyset.wepkeyaction=SETWEPKEY;
|
||||||
|
wlan_set_wep_key(&keyset);
|
||||||
|
|
||||||
|
}
|
||||||
|
int wlan_set_wep_key(Wep_Key_Set_Arg key_set_arg)
|
||||||
|
{
|
||||||
|
int ret = WLAN_STATUS_SUCCESS;
|
||||||
|
wlan_private *priv = wlan_eth->priv;
|
||||||
|
wlan_adapter *Adapter = priv->adapter;
|
||||||
|
MRVL_WEP_KEY *pWep;
|
||||||
|
int index, PrevAuthMode,i=0;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
if (!Is_Command_Allowed(priv)) {
|
||||||
|
wlan_debug1( "%s: not allowed\n", __FUNCTION__);
|
||||||
|
return -EBUSY;
|
||||||
|
}
|
||||||
|
if(key_set_arg->defaut_key_index>=MRVL_NUM_WEP_KEY)
|
||||||
|
{ return -WLANEPARAMETER;}
|
||||||
|
else{index=key_set_arg->defaut_key_index;}
|
||||||
|
|
||||||
|
if(key_set_arg->KeyLength[index]==0||key_set_arg->KeyLength[index]>MAX_WEP_KEY_SIZE)
|
||||||
|
return -WLANEPARAMETER;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if(key_set_arg->wepkeyaction==SETWEPKEY)
|
||||||
|
{
|
||||||
|
Adapter->CurrentWepKeyIndex = index;
|
||||||
|
for(i=0;i<MRVL_NUM_WEP_KEY;i++)
|
||||||
|
{
|
||||||
|
pWep = &Adapter->WepKey[i];
|
||||||
|
if((key_set_arg->KeyLength[i]!=0)&&(key_set_arg->KeyLength[i]<=MAX_WEP_KEY_SIZE))
|
||||||
|
{
|
||||||
|
|
||||||
|
rt_memcpy(pWep->KeyMaterial,&key_set_arg->Key_value[i][0],key_set_arg->KeyLength[i]);
|
||||||
|
if (key_set_arg->KeyLength[i]>MIN_WEP_KEY_SIZE) {
|
||||||
|
pWep->KeyLength = MAX_WEP_KEY_SIZE;
|
||||||
|
} else {
|
||||||
|
if (key_set_arg->KeyLength[i] > 0) {
|
||||||
|
pWep->KeyLength = MIN_WEP_KEY_SIZE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
pWep->KeyLength = 0;
|
||||||
|
rt_memset(pWep->KeyMaterial,0x00,MAX_WEP_KEY_SIZE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Adapter->SecInfo.WEPStatus = Wlan802_11WEPEnabled;
|
||||||
|
ret = PrepareAndSendCommand(priv,
|
||||||
|
HostCmd_CMD_802_11_SET_WEP,
|
||||||
|
0, HostCmd_OPTION_WAITFORRSP,
|
||||||
|
OID_802_11_ADD_WEP, NULL);
|
||||||
|
|
||||||
|
if (ret) {
|
||||||
|
LEAVE();
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
}
|
||||||
|
}else if(key_set_arg->wepkeyaction==NOWEPKEY)
|
||||||
|
{
|
||||||
|
|
||||||
|
Adapter->SecInfo.WEPStatus = Wlan802_11WEPDisabled;
|
||||||
|
}
|
||||||
|
wlan_debug3("act %d, Length=%d Index=%d CurrentWepKeyIndex=%d\n",
|
||||||
|
key_set_arg->wepkeyaction, key_set_arg->KeyLength[index], Adapter->CurrentWepKeyIndex);
|
||||||
|
if (Adapter->SecInfo.WEPStatus == Wlan802_11WEPEnabled) {
|
||||||
|
Adapter->CurrentPacketFilter |= HostCmd_ACT_MAC_WEP_ENABLE;
|
||||||
|
} else {
|
||||||
|
Adapter->CurrentPacketFilter &= ~HostCmd_ACT_MAC_WEP_ENABLE;
|
||||||
|
}
|
||||||
|
ret = PrepareAndSendCommand(priv,
|
||||||
|
HostCmd_CMD_MAC_CONTROL,
|
||||||
|
0, HostCmd_OPTION_WAITFORRSP,
|
||||||
|
0, &Adapter->CurrentPacketFilter);
|
||||||
|
LEAVE();
|
||||||
|
return WLAN_STATUS_SUCCESS;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int wlan_set_wpa_psk(WLAN_802_11_KEY* wpa_psk_arg)
|
||||||
|
{
|
||||||
|
int ret = WLAN_STATUS_SUCCESS;
|
||||||
|
wlan_private *priv = wlan_eth->priv;
|
||||||
|
WLAN_802_11_KEY *pKey;
|
||||||
|
|
||||||
|
ENTER();
|
||||||
|
|
||||||
|
if (!Is_Command_Allowed(priv)) {
|
||||||
|
wlan_debug1("%s: not allowed\n", __FUNCTION__);
|
||||||
|
return -EBUSY;
|
||||||
|
}
|
||||||
|
|
||||||
|
pKey = wpa_psk_arg;
|
||||||
|
|
||||||
|
wlan_debug3("Key buffer: %s", pKey->KeyMaterial);
|
||||||
|
|
||||||
|
// current driver only supports key length of up to 32 bytes
|
||||||
|
if (pKey->KeyLength > MRVL_MAX_WPA_KEY_LENGTH) {
|
||||||
|
wlan_debug1( " Error in key length \n");
|
||||||
|
return WLAN_STATUS_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = PrepareAndSendCommand(priv,
|
||||||
|
HostCmd_CMD_802_11_KEY_MATERIAL,
|
||||||
|
HostCmd_ACT_SET,
|
||||||
|
HostCmd_OPTION_WAITFORRSP,
|
||||||
|
KEY_INFO_ENABLED, pKey);
|
||||||
|
|
||||||
|
if (ret) {
|
||||||
|
LEAVE();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
LEAVE();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,318 @@
|
||||||
|
/** @file wlan_wext.h
|
||||||
|
* @brief This file contains definition for IOCTL call.
|
||||||
|
*
|
||||||
|
* Copyright © Marvell International Ltd. and/or its affiliates, 2003-2007
|
||||||
|
*/
|
||||||
|
/********************************************************
|
||||||
|
Change log:
|
||||||
|
10/11/05: Add Doxygen format comments
|
||||||
|
12/19/05: Correct a typo in structure _wlan_ioctl_wmm_tspec
|
||||||
|
01/11/06: Conditionalize new scan/join ioctls
|
||||||
|
04/10/06: Add hostcmd generic API
|
||||||
|
04/18/06: Remove old Subscrive Event and add new Subscribe Event
|
||||||
|
implementation through generic hostcmd API
|
||||||
|
06/08/06: Add definitions of custom events
|
||||||
|
08/29/06: Add ledgpio private command
|
||||||
|
********************************************************/
|
||||||
|
|
||||||
|
#ifndef _WLAN_WEXT_H_
|
||||||
|
#define _WLAN_WEXT_H_
|
||||||
|
#include "wlan_defs.h"
|
||||||
|
#define SUBCMD_OFFSET 4
|
||||||
|
/** PRIVATE CMD ID */
|
||||||
|
#define WLANIOCTL 0x8BE0
|
||||||
|
|
||||||
|
#define WLANSETWPAIE (WLANIOCTL + 0)
|
||||||
|
#ifdef MFG_CMD_SUPPORT
|
||||||
|
#define WLANMANFCMD (WLANIOCTL + 2)
|
||||||
|
#endif
|
||||||
|
#define WLANREGRDWR (WLANIOCTL + 3)
|
||||||
|
#define MAX_EEPROM_DATA 256
|
||||||
|
#define WLANHOSTCMD (WLANIOCTL + 4)
|
||||||
|
|
||||||
|
#define WLANHOSTSLEEPCFG (WLANIOCTL + 5)
|
||||||
|
#define WLANARPFILTER (WLANIOCTL + 6)
|
||||||
|
|
||||||
|
#define WLAN_SETINT_GETINT (WLANIOCTL + 7)
|
||||||
|
#define WLANNF 1
|
||||||
|
#define WLANRSSI 2
|
||||||
|
#define WLANBGSCAN 4
|
||||||
|
#define WLANENABLE11D 5
|
||||||
|
#define WLANADHOCGRATE 6
|
||||||
|
#define WLANWMM_ENABLE 8
|
||||||
|
#define WLANNULLGEN 10
|
||||||
|
#define WLANADHOCCSET 11
|
||||||
|
#define WLAN_ADHOC_G_PROT 12
|
||||||
|
|
||||||
|
#define WLAN_SETNONE_GETNONE (WLANIOCTL + 8)
|
||||||
|
#define WLANDEAUTH 1
|
||||||
|
#define WLANRADIOON 2
|
||||||
|
#define WLANRADIOOFF 3
|
||||||
|
#define WLANREMOVEADHOCAES 4
|
||||||
|
#define WLANADHOCSTOP 5
|
||||||
|
#define WLANCRYPTOTEST 7
|
||||||
|
#ifdef REASSOCIATION
|
||||||
|
#define WLANREASSOCIATIONAUTO 8
|
||||||
|
#define WLANREASSOCIATIONUSER 9
|
||||||
|
#endif /* REASSOCIATION */
|
||||||
|
#define WLANWLANIDLEON 10
|
||||||
|
#define WLANWLANIDLEOFF 11
|
||||||
|
|
||||||
|
#define WLANGETLOG (WLANIOCTL + 9)
|
||||||
|
#define WLAN_SETCONF_GETCONF (WLANIOCTL + 10)
|
||||||
|
|
||||||
|
#define BG_SCAN_CONFIG 1
|
||||||
|
#define CAL_DATA_EXT_CONFIG 2
|
||||||
|
|
||||||
|
#define WLANSCAN_TYPE (WLANIOCTL + 11)
|
||||||
|
|
||||||
|
#define WLAN_SET_GET_2K (WLANIOCTL + 13)
|
||||||
|
#define WLAN_SET_USER_SCAN 1
|
||||||
|
#define WLAN_GET_SCAN_TABLE 2
|
||||||
|
#define WLAN_SET_MRVL_TLV 3
|
||||||
|
#define WLAN_GET_ASSOC_RSP 4
|
||||||
|
#define WLAN_ADDTS_REQ 5
|
||||||
|
#define WLAN_DELTS_REQ 6
|
||||||
|
#define WLAN_QUEUE_CONFIG 7
|
||||||
|
#define WLAN_QUEUE_STATS 8
|
||||||
|
#define WLAN_GET_CFP_TABLE 9
|
||||||
|
#define WLAN_TX_PKT_STATS 12
|
||||||
|
|
||||||
|
#define WLAN_SETNONE_GETONEINT (WLANIOCTL + 15)
|
||||||
|
#define WLANGETREGION 1
|
||||||
|
#define WLAN_GET_LISTEN_INTERVAL 2
|
||||||
|
#define WLAN_GET_MULTIPLE_DTIM 3
|
||||||
|
#define WLAN_GET_TX_RATE 4
|
||||||
|
#define WLANGETBCNAVG 5
|
||||||
|
#define WLANGETDATAAVG 6
|
||||||
|
|
||||||
|
#define WLAN_SETNONE_GETTWELVE_CHAR (WLANIOCTL + 19)
|
||||||
|
#define WLAN_SUBCMD_GETRXANTENNA 1
|
||||||
|
#define WLAN_SUBCMD_GETTXANTENNA 2
|
||||||
|
#define WLAN_GET_TSF 3
|
||||||
|
#define WLAN_WPS_SESSION 4
|
||||||
|
|
||||||
|
#define WLAN_SETWORDCHAR_GETNONE (WLANIOCTL + 20)
|
||||||
|
#define WLANSETADHOCAES 1
|
||||||
|
|
||||||
|
#define WLAN_SETONEINT_GETWORDCHAR (WLANIOCTL + 21)
|
||||||
|
#define WLANGETADHOCAES 1
|
||||||
|
#define WLANVERSION 2
|
||||||
|
#define WLANVEREXT 3
|
||||||
|
|
||||||
|
#define WLAN_SETONEINT_GETONEINT (WLANIOCTL + 23)
|
||||||
|
#define WLAN_WMM_QOSINFO 2
|
||||||
|
#define WLAN_LISTENINTRVL 3
|
||||||
|
#define WLAN_FW_WAKEUP_METHOD 4
|
||||||
|
#define WAKEUP_FW_UNCHANGED 0
|
||||||
|
#define WAKEUP_FW_THRU_INTERFACE 1
|
||||||
|
#define WAKEUP_FW_THRU_GPIO 2
|
||||||
|
|
||||||
|
#define WLAN_NULLPKTINTERVAL 5
|
||||||
|
#define WLAN_BCN_MISS_TIMEOUT 6
|
||||||
|
#define WLAN_ADHOC_AWAKE_PERIOD 7
|
||||||
|
#define WLAN_LDO 8
|
||||||
|
|
||||||
|
#define WLAN_SETONEINT_GETNONE (WLANIOCTL + 24)
|
||||||
|
#define WLAN_SUBCMD_SETRXANTENNA 1
|
||||||
|
#define WLAN_SUBCMD_SETTXANTENNA 2
|
||||||
|
#define WLANSETAUTHALG 4
|
||||||
|
#define WLANSETENCRYPTIONMODE 5
|
||||||
|
#define WLANSETREGION 6
|
||||||
|
#define WLAN_SET_LISTEN_INTERVAL 7
|
||||||
|
|
||||||
|
#define WLAN_SET_MULTIPLE_DTIM 8
|
||||||
|
|
||||||
|
#define WLANSETBCNAVG 9
|
||||||
|
#define WLANSETDATAAVG 10
|
||||||
|
#define WLANASSOCIATE 11
|
||||||
|
|
||||||
|
#define WLAN_SET64CHAR_GET64CHAR (WLANIOCTL + 25)
|
||||||
|
#define WLANSLEEPPARAMS 2
|
||||||
|
#define WLAN_BCA_TIMESHARE 3
|
||||||
|
#define WLANSCAN_MODE 6
|
||||||
|
|
||||||
|
#define WLAN_GET_ADHOC_STATUS 9
|
||||||
|
|
||||||
|
#if (WIRELESS_EXT < 18)
|
||||||
|
#define WLAN_SET_GEN_IE 10
|
||||||
|
#define WLAN_GET_GEN_IE 11
|
||||||
|
#endif
|
||||||
|
#define WLAN_WMM_QUEUE_STATUS 13
|
||||||
|
|
||||||
|
#define WLANEXTSCAN (WLANIOCTL + 26)
|
||||||
|
#define WLANDEEPSLEEP (WLANIOCTL + 27)
|
||||||
|
#define DEEP_SLEEP_ENABLE 1
|
||||||
|
#define DEEP_SLEEP_DISABLE 0
|
||||||
|
|
||||||
|
#define WLAN_SET_GET_SIXTEEN_INT (WLANIOCTL + 29)
|
||||||
|
#define WLAN_TPCCFG 1
|
||||||
|
#define WLAN_LED_GPIO_CTRL 5
|
||||||
|
#define WLAN_SCANPROBES 6
|
||||||
|
#define WLAN_SLEEP_PERIOD 7
|
||||||
|
#define WLAN_ADAPT_RATESET 8
|
||||||
|
#define WLAN_INACTIVITY_TIMEOUT 9
|
||||||
|
#define WLANSNR 10
|
||||||
|
#define WLAN_GET_RATE 11
|
||||||
|
#define WLAN_GET_RXINFO 12
|
||||||
|
#define WLAN_SET_ATIM_WINDOW 13
|
||||||
|
#define WLAN_BEACON_INTERVAL 14
|
||||||
|
#define WLAN_SCAN_TIME 16
|
||||||
|
#define WLAN_DATA_SUBSCRIBE_EVENT 18
|
||||||
|
#define WLAN_TXCONTROL 19
|
||||||
|
#define WLAN_GSPI_REG_RW 20
|
||||||
|
#define WLANHSCFG 21
|
||||||
|
#ifdef DEBUG_LEVEL1
|
||||||
|
#define WLAN_DRV_DBG 24
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define REG_MAC 0x19
|
||||||
|
#define REG_BBP 0x1a
|
||||||
|
#define REG_RF 0x1b
|
||||||
|
#define REG_EEPROM 0x59
|
||||||
|
|
||||||
|
#define CMD_DISABLED 0
|
||||||
|
#define CMD_ENABLED 1
|
||||||
|
#define CMD_GET 2
|
||||||
|
#define SKIP_CMDNUM 4
|
||||||
|
#define SKIP_TYPE 1
|
||||||
|
#define SKIP_SIZE 2
|
||||||
|
#define SKIP_ACTION 2
|
||||||
|
#define SKIP_TYPE_SIZE (SKIP_TYPE + SKIP_SIZE)
|
||||||
|
#define SKIP_TYPE_ACTION (SKIP_TYPE + SKIP_ACTION)
|
||||||
|
|
||||||
|
/* define custom events */
|
||||||
|
#define CUS_EVT_HWM_CFG_DONE "HWM_CFG_DONE.indication "
|
||||||
|
#define CUS_EVT_BEACON_RSSI_LOW "EVENT=BEACON_RSSI_LOW"
|
||||||
|
#define CUS_EVT_BEACON_SNR_LOW "EVENT=BEACON_SNR_LOW"
|
||||||
|
#define CUS_EVT_BEACON_RSSI_HIGH "EVENT=BEACON_RSSI_HIGH"
|
||||||
|
#define CUS_EVT_BEACON_SNR_HIGH "EVENT=BEACON_SNR_HIGH"
|
||||||
|
#define CUS_EVT_MAX_FAIL "EVENT=MAX_FAIL"
|
||||||
|
#define CUS_EVT_MLME_MIC_ERR_UNI "MLME-MICHAELMICFAILURE.indication unicast "
|
||||||
|
#define CUS_EVT_MLME_MIC_ERR_MUL "MLME-MICHAELMICFAILURE.indication multicast "
|
||||||
|
|
||||||
|
#define CUS_EVT_DATA_RSSI_LOW "EVENT=DATA_RSSI_LOW"
|
||||||
|
#define CUS_EVT_DATA_SNR_LOW "EVENT=DATA_SNR_LOW"
|
||||||
|
#define CUS_EVT_DATA_RSSI_HIGH "EVENT=DATA_RSSI_HIGH"
|
||||||
|
#define CUS_EVT_DATA_SNR_HIGH "EVENT=DATA_SNR_HIGH"
|
||||||
|
|
||||||
|
#define CUS_EVT_DEEP_SLEEP_AWAKE "EVENT=DS_AWAKE"
|
||||||
|
|
||||||
|
#define CUS_EVT_ADHOC_LINK_SENSED "EVENT=ADHOC_LINK_SENSED"
|
||||||
|
#define CUS_EVT_ADHOC_BCN_LOST "EVENT=ADHOC_BCN_LOST"
|
||||||
|
|
||||||
|
/** wlan_ioctl */
|
||||||
|
typedef struct _wlan_ioctl
|
||||||
|
{
|
||||||
|
/** Command ID */
|
||||||
|
u16 command;
|
||||||
|
/** data length */
|
||||||
|
u16 len;
|
||||||
|
/** data pointer */
|
||||||
|
u8 *data;
|
||||||
|
} wlan_ioctl;
|
||||||
|
|
||||||
|
/** wlan_ioctl_rfantenna */
|
||||||
|
typedef struct _wlan_ioctl_rfantenna
|
||||||
|
{
|
||||||
|
u16 Action;
|
||||||
|
u16 AntennaMode;
|
||||||
|
} wlan_ioctl_rfantenna;
|
||||||
|
|
||||||
|
/** wlan_ioctl_regrdwr */
|
||||||
|
typedef struct _wlan_ioctl_regrdwr
|
||||||
|
{
|
||||||
|
/** Which register to access */
|
||||||
|
u16 WhichReg;
|
||||||
|
/** Read or Write */
|
||||||
|
u16 Action;
|
||||||
|
u32 Offset;
|
||||||
|
u16 NOB;
|
||||||
|
u32 Value;
|
||||||
|
} wlan_ioctl_regrdwr;
|
||||||
|
|
||||||
|
/** wlan_ioctl_cfregrdwr */
|
||||||
|
typedef struct _wlan_ioctl_cfregrdwr
|
||||||
|
{
|
||||||
|
/** Read or Write */
|
||||||
|
u8 Action;
|
||||||
|
/** register address */
|
||||||
|
u16 Offset;
|
||||||
|
/** register value */
|
||||||
|
u16 Value;
|
||||||
|
} wlan_ioctl_cfregrdwr;
|
||||||
|
|
||||||
|
/** wlan_ioctl_adhoc_key_info */
|
||||||
|
typedef struct _wlan_ioctl_adhoc_key_info
|
||||||
|
{
|
||||||
|
u16 action;
|
||||||
|
u8 key[16];
|
||||||
|
u8 tkiptxmickey[16];
|
||||||
|
u8 tkiprxmickey[16];
|
||||||
|
} wlan_ioctl_adhoc_key_info;
|
||||||
|
|
||||||
|
/** sleep_params */
|
||||||
|
typedef struct _wlan_ioctl_sleep_params_config
|
||||||
|
{
|
||||||
|
u16 Action;
|
||||||
|
u16 Error;
|
||||||
|
u16 Offset;
|
||||||
|
u16 StableTime;
|
||||||
|
u8 CalControl;
|
||||||
|
u8 ExtSleepClk;
|
||||||
|
u16 Reserved;
|
||||||
|
} __ATTRIB_PACK__ wlan_ioctl_sleep_params_config,
|
||||||
|
*pwlan_ioctl_sleep_params_config;
|
||||||
|
|
||||||
|
/** BCA TIME SHARE */
|
||||||
|
typedef struct _wlan_ioctl_bca_timeshare_config
|
||||||
|
{
|
||||||
|
/** ACT_GET/ACT_SET */
|
||||||
|
u16 Action;
|
||||||
|
/** Type: WLAN, BT */
|
||||||
|
u16 TrafficType;
|
||||||
|
/** Interval: 20msec - 60000msec */
|
||||||
|
u32 TimeShareInterval;
|
||||||
|
/** PTA arbiter time in msec */
|
||||||
|
u32 BTTime;
|
||||||
|
} __ATTRIB_PACK__ wlan_ioctl_bca_timeshare_config,
|
||||||
|
*pwlan_ioctl_bca_timeshare_config;
|
||||||
|
|
||||||
|
#define MAX_CFP_LIST_NUM 64
|
||||||
|
|
||||||
|
/** wlan_ioctl_cfp_table */
|
||||||
|
typedef struct _wlan_ioctl_cfp_table
|
||||||
|
{
|
||||||
|
u32 region;
|
||||||
|
u32 cfp_no;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
u16 Channel;
|
||||||
|
u32 Freq;
|
||||||
|
u16 MaxTxPower;
|
||||||
|
BOOLEAN Unsupported;
|
||||||
|
} cfp[MAX_CFP_LIST_NUM];
|
||||||
|
} __ATTRIB_PACK__ wlan_ioctl_cfp_table, *pwlan_ioctl_cfp_table;
|
||||||
|
/** WLAN_802_11_AUTHENTICATION_MODE */
|
||||||
|
typedef enum Key_Actiond
|
||||||
|
{
|
||||||
|
READWEPKEY= 0x00,
|
||||||
|
SETWEPKEY= 0x01,
|
||||||
|
NOWEPKEY= 0x3,
|
||||||
|
} WEP_Key_Actiond;
|
||||||
|
|
||||||
|
typedef struct _wep_key_set_arg{
|
||||||
|
u8 Key_value[MRVL_NUM_WEP_KEY][16];
|
||||||
|
u8 KeyLength[4]; /* each element key corresponds to the key_value with the same index*/
|
||||||
|
u8 defaut_key_index; /*valide range from 0 to 3*/
|
||||||
|
WLAN_802_11_WEP_STATUS wepstatus;
|
||||||
|
WLAN_802_11_AUTHENTICATION_MODE AuMode;
|
||||||
|
WEP_Key_Actiond wepkeyaction;
|
||||||
|
}_wep_key_set_arg,*Wep_Key_Set_Arg;
|
||||||
|
typedef struct _Wlan_WPA_PSK
|
||||||
|
{
|
||||||
|
u32 KeyLength;
|
||||||
|
u8 BSSID[6]; /*AP MAC address*/
|
||||||
|
u8 KeyMaterial[MRVL_MAX_KEY_WPA_KEY_LENGTH];
|
||||||
|
} WLAN_WPA_PSK_ARG,*WLAN_WPA_PSK_PTR;;
|
||||||
|
#endif /* _WLAN_WEXT_H_ */
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,113 @@
|
||||||
|
/** @file wlan_wmm.h
|
||||||
|
* @brief This file contains related macros, enum, and struct
|
||||||
|
* of wmm functionalities
|
||||||
|
*
|
||||||
|
* Copyright © Marvell International Ltd. and/or its affiliates, 2003-2006
|
||||||
|
*/
|
||||||
|
/****************************************************
|
||||||
|
Change log:
|
||||||
|
09/26/05: add Doxygen format comments
|
||||||
|
04/06/06: Add TSPEC, queue metrics, and MSDU expiry support
|
||||||
|
****************************************************/
|
||||||
|
|
||||||
|
#ifndef __WLAN_WMM_H
|
||||||
|
#define __WLAN_WMM_H
|
||||||
|
#include "wlan_types.h"
|
||||||
|
#include "wlan_defs.h"
|
||||||
|
/** Custom indiciation message sent to the application layer for WMM changes */
|
||||||
|
#define WMM_CONFIG_CHANGE_INDICATION "WMM_CONFIG_CHANGE.indication"
|
||||||
|
|
||||||
|
/** Highest priority setting for a packet (uses voice AC) */
|
||||||
|
#define WMM_HIGHEST_PRIORITY 7
|
||||||
|
|
||||||
|
|
||||||
|
/** struct of WMM DESC */
|
||||||
|
struct sk_buff {
|
||||||
|
/* These two members must be first. */
|
||||||
|
struct sk_buff *next;
|
||||||
|
struct sk_buff *prev;
|
||||||
|
unsigned int len;
|
||||||
|
unsigned char *head,*data;
|
||||||
|
};
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
u8 required;
|
||||||
|
u8 enabled;
|
||||||
|
u8 packetsQueued;
|
||||||
|
u8 queueStopped;
|
||||||
|
u8 downlinkblock;
|
||||||
|
struct rt_semaphore flowcrsem;
|
||||||
|
struct sk_buff txSkbQ;
|
||||||
|
// WmmAcStatus_t acStatus[MAX_AC_QUEUES];
|
||||||
|
// wlan_wmm_ac_e acDowngradedVals[MAX_AC_QUEUES];
|
||||||
|
|
||||||
|
/** wmm queue priority table*/
|
||||||
|
//u8 queuePriority[MAX_AC_QUEUES];
|
||||||
|
|
||||||
|
// u8 qosinfo;
|
||||||
|
} __ATTRIB_PACK__ WMM_DESC;
|
||||||
|
#ifdef __KERNEL__
|
||||||
|
|
||||||
|
extern u8 wmm_compute_driver_packet_delay(const struct sk_buff *skb);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern int sendWMMStatusChangeCmd(wlan_private * priv);
|
||||||
|
extern int wmm_lists_empty(wlan_private * priv);
|
||||||
|
extern void wmm_process_tx(wlan_private * priv);
|
||||||
|
|
||||||
|
extern void wmm_init(wlan_private * priv);
|
||||||
|
extern void wmm_setup_queues(wlan_private * priv);
|
||||||
|
extern void wmm_start_queue(wlan_private * priv);
|
||||||
|
extern void wmm_stop_queue(wlan_private * priv);
|
||||||
|
extern int wmm_is_queue_stopped(wlan_private * priv);
|
||||||
|
|
||||||
|
extern void wmm_process_fw_iface_tx_xfer_start(wlan_private * priv);
|
||||||
|
extern void wmm_process_fw_iface_tx_xfer_end(wlan_private * priv);
|
||||||
|
extern void wmm_process_app_iface_tx(wlan_private * priv);
|
||||||
|
extern wlan_wmm_ac_e wmm_convert_tos_to_ac(int tos);
|
||||||
|
extern wlan_wmm_ac_e wmm_downgrade_ac(wlan_private * priv,wlan_wmm_ac_e acVal);
|
||||||
|
|
||||||
|
extern u32 wlan_wmm_process_association_req(wlan_private * priv,
|
||||||
|
u8 ** ppAssocBuf,
|
||||||
|
IEEEtypes_WmmParameter_t *
|
||||||
|
pWmmIE);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Functions used in the cmd handling routine
|
||||||
|
*/
|
||||||
|
extern int wlan_cmd_wmm_get_status(wlan_private * priv,
|
||||||
|
HostCmd_DS_COMMAND * cmd, void *InfoBuf);
|
||||||
|
extern int wlan_cmd_wmm_addts_req(wlan_private * priv,
|
||||||
|
HostCmd_DS_COMMAND * cmd, void *InfoBuf);
|
||||||
|
extern int wlan_cmd_wmm_delts_req(wlan_private * priv,
|
||||||
|
HostCmd_DS_COMMAND * cmd, void *InfoBuf);
|
||||||
|
extern int wlan_cmd_wmm_queue_config(wlan_private * priv,
|
||||||
|
HostCmd_DS_COMMAND * cmd, void *InfoBuf);
|
||||||
|
extern int wlan_cmd_wmm_queue_stats(wlan_private * priv,
|
||||||
|
HostCmd_DS_COMMAND * cmd, void *InfoBuf);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Functions used in the cmdresp handling routine
|
||||||
|
*/
|
||||||
|
extern int wlan_cmdresp_wmm_get_status(wlan_private * priv,
|
||||||
|
const HostCmd_DS_COMMAND * resp);
|
||||||
|
extern int wlan_cmdresp_wmm_addts_req(wlan_private * priv,
|
||||||
|
const HostCmd_DS_COMMAND * resp);
|
||||||
|
extern int wlan_cmdresp_wmm_delts_req(wlan_private * priv,
|
||||||
|
const HostCmd_DS_COMMAND * resp);
|
||||||
|
extern int wlan_cmdresp_wmm_queue_config(wlan_private * priv,
|
||||||
|
const HostCmd_DS_COMMAND * resp);
|
||||||
|
extern int wlan_cmdresp_wmm_queue_stats(wlan_private * priv,
|
||||||
|
const HostCmd_DS_COMMAND * resp);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* IOCTLs
|
||||||
|
*/
|
||||||
|
//extern int wlan_wmm_enable_ioctl(wlan_private * priv, struct iwreq *wrq);
|
||||||
|
//extern int wlan_wmm_queue_status_ioctl(wlan_private * priv,struct iwreq *wrq);
|
||||||
|
|
||||||
|
//extern int wlan_wmm_addts_req_ioctl(wlan_private * priv, struct iwreq *wrq);
|
||||||
|
//extern int wlan_wmm_delts_req_ioctl(wlan_private * priv, struct iwreq *wrq);
|
||||||
|
//extern int wlan_wmm_queue_config_ioctl(wlan_private * priv,struct iwreq *wrq);
|
||||||
|
//extern int wlan_wmm_queue_stats_ioctl(wlan_private * priv, struct iwreq *wrq);
|
||||||
|
#endif /* __WLAN_WMM_H */
|
Loading…
Reference in New Issue