[PATCH] Marvell Libertas 8388 802.11b/g USB driver
Add the Marvell Libertas 8388 802.11 USB driver. Signed-off-by: Marcelo Tosatti <marcelo@kvack.org> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
35c3404efa
commit
876c9d3aeb
40 changed files with 22351 additions and 1 deletions
|
|
@ -265,6 +265,19 @@ config IPW2200_DEBUG
|
|||
|
||||
If you are not sure, say N here.
|
||||
|
||||
config LIBERTAS_USB
|
||||
tristate "Marvell Libertas 8388 802.11a/b/g cards"
|
||||
depends on NET_RADIO && USB
|
||||
select FW_LOADER
|
||||
---help---
|
||||
A driver for Marvell Libertas 8388 USB devices.
|
||||
|
||||
config LIBERTAS_USB_DEBUG
|
||||
bool "Enable full debugging output in the Libertas USB module."
|
||||
depends on LIBERTAS_USB
|
||||
---help---
|
||||
Debugging support.
|
||||
|
||||
config AIRO
|
||||
tristate "Cisco/Aironet 34X/35X/4500/4800 ISA and PCI cards"
|
||||
depends on ISA_DMA_API && WLAN_80211 && (PCI || BROKEN)
|
||||
|
|
|
|||
|
|
@ -43,3 +43,4 @@ obj-$(CONFIG_PCMCIA_RAYCS) += ray_cs.o
|
|||
obj-$(CONFIG_PCMCIA_WL3501) += wl3501_cs.o
|
||||
|
||||
obj-$(CONFIG_USB_ZD1201) += zd1201.o
|
||||
obj-$(CONFIG_LIBERTAS_USB) += libertas/
|
||||
|
|
|
|||
754
drivers/net/wireless/libertas/11d.c
Normal file
754
drivers/net/wireless/libertas/11d.c
Normal file
|
|
@ -0,0 +1,754 @@
|
|||
/**
|
||||
* This file contains functions for 802.11D.
|
||||
*/
|
||||
#include <linux/ctype.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/wireless.h>
|
||||
|
||||
#include "host.h"
|
||||
#include "decl.h"
|
||||
#include "11d.h"
|
||||
#include "dev.h"
|
||||
#include "wext.h"
|
||||
|
||||
#define TX_PWR_DEFAULT 10
|
||||
|
||||
static struct region_code_mapping region_code_mapping[] = {
|
||||
{"US ", 0x10}, /* US FCC */
|
||||
{"CA ", 0x10}, /* 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 */
|
||||
};
|
||||
|
||||
/* Following 2 structure defines the supported channels */
|
||||
static struct chan_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}
|
||||
};
|
||||
|
||||
static u8 wlan_region_2_code(u8 * region)
|
||||
{
|
||||
u8 i;
|
||||
u8 size = sizeof(region_code_mapping)/
|
||||
sizeof(struct region_code_mapping);
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
static u8 *wlan_code_2_region(u8 code)
|
||||
{
|
||||
u8 i;
|
||||
u8 size = sizeof(region_code_mapping)
|
||||
/ sizeof(struct region_code_mapping);
|
||||
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 nrchan-th chan after the firstchan
|
||||
* @param band band
|
||||
* @param firstchan first channel number
|
||||
* @param nrchan number of channels
|
||||
* @return the nrchan-th chan number
|
||||
*/
|
||||
static u8 wlan_get_chan_11d(u8 band, u8 firstchan, u8 nrchan, u8 * chan)
|
||||
/*find the nrchan-th chan after the firstchan*/
|
||||
{
|
||||
u8 i;
|
||||
struct chan_freq_power *cfp;
|
||||
u8 cfp_no;
|
||||
|
||||
cfp = channel_freq_power_UN_BG;
|
||||
cfp_no = sizeof(channel_freq_power_UN_BG) /
|
||||
sizeof(struct chan_freq_power);
|
||||
|
||||
for (i = 0; i < cfp_no; i++) {
|
||||
if ((cfp + i)->channel == firstchan) {
|
||||
lbs_pr_debug(1, "firstchan found\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i < cfp_no) {
|
||||
/*if beyond the boundary */
|
||||
if (i + nrchan < cfp_no) {
|
||||
*chan = (cfp + i + nrchan)->channel;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @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
|
||||
* @return TRUE; FALSE
|
||||
*/
|
||||
static u8 wlan_channel_known_11d(u8 chan,
|
||||
struct parsed_region_chan_11d * parsed_region_chan)
|
||||
{
|
||||
struct chan_power_11d *chanpwr = parsed_region_chan->chanpwr;
|
||||
u8 nr_chan = parsed_region_chan->nr_chan;
|
||||
u8 i = 0;
|
||||
|
||||
lbs_dbg_hex("11D:parsed_region_chan:", (char *)chanpwr,
|
||||
sizeof(struct chan_power_11d) * nr_chan);
|
||||
|
||||
for (i = 0; i < nr_chan; i++) {
|
||||
if (chan == chanpwr[i].chan) {
|
||||
lbs_pr_debug(1, "11D: Found Chan:%d\n", chan);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
lbs_pr_debug(1, "11D: Not Find Chan:%d\n", chan);
|
||||
return 0;
|
||||
}
|
||||
|
||||
u32 libertas_chan_2_freq(u8 chan, u8 band)
|
||||
{
|
||||
struct chan_freq_power *cf;
|
||||
u16 cnt;
|
||||
u16 i;
|
||||
u32 freq = 0;
|
||||
|
||||
cf = channel_freq_power_UN_BG;
|
||||
cnt =
|
||||
sizeof(channel_freq_power_UN_BG) /
|
||||
sizeof(struct chan_freq_power);
|
||||
|
||||
for (i = 0; i < cnt; i++) {
|
||||
if (chan == cf[i].channel)
|
||||
freq = cf[i].freq;
|
||||
}
|
||||
|
||||
return freq;
|
||||
}
|
||||
|
||||
static int generate_domain_info_11d(struct parsed_region_chan_11d
|
||||
*parsed_region_chan,
|
||||
struct wlan_802_11d_domain_reg * domaininfo)
|
||||
{
|
||||
u8 nr_subband = 0;
|
||||
|
||||
u8 nr_chan = parsed_region_chan->nr_chan;
|
||||
u8 nr_parsedchan = 0;
|
||||
|
||||
u8 firstchan = 0, nextchan = 0, maxpwr = 0;
|
||||
|
||||
u8 i, flag = 0;
|
||||
|
||||
memcpy(domaininfo->countrycode, parsed_region_chan->countrycode,
|
||||
COUNTRY_CODE_LEN);
|
||||
|
||||
lbs_pr_debug(1, "11D:nrchan=%d\n", nr_chan);
|
||||
lbs_dbg_hex("11D:parsed_region_chan:", (char *)parsed_region_chan,
|
||||
sizeof(struct parsed_region_chan_11d));
|
||||
|
||||
for (i = 0; i < nr_chan; i++) {
|
||||
if (!flag) {
|
||||
flag = 1;
|
||||
nextchan = firstchan =
|
||||
parsed_region_chan->chanpwr[i].chan;
|
||||
maxpwr = parsed_region_chan->chanpwr[i].pwr;
|
||||
nr_parsedchan = 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (parsed_region_chan->chanpwr[i].chan == nextchan + 1 &&
|
||||
parsed_region_chan->chanpwr[i].pwr == maxpwr) {
|
||||
nextchan++;
|
||||
nr_parsedchan++;
|
||||
} else {
|
||||
domaininfo->subband[nr_subband].firstchan = firstchan;
|
||||
domaininfo->subband[nr_subband].nrchan =
|
||||
nr_parsedchan;
|
||||
domaininfo->subband[nr_subband].maxtxpwr = maxpwr;
|
||||
nr_subband++;
|
||||
nextchan = firstchan =
|
||||
parsed_region_chan->chanpwr[i].chan;
|
||||
maxpwr = parsed_region_chan->chanpwr[i].pwr;
|
||||
}
|
||||
}
|
||||
|
||||
if (flag) {
|
||||
domaininfo->subband[nr_subband].firstchan = firstchan;
|
||||
domaininfo->subband[nr_subband].nrchan = nr_parsedchan;
|
||||
domaininfo->subband[nr_subband].maxtxpwr = maxpwr;
|
||||
nr_subband++;
|
||||
}
|
||||
domaininfo->nr_subband = nr_subband;
|
||||
|
||||
lbs_pr_debug(1, "nr_subband=%x\n", domaininfo->nr_subband);
|
||||
lbs_dbg_hex("11D:domaininfo:", (char *)domaininfo,
|
||||
COUNTRY_CODE_LEN + 1 +
|
||||
sizeof(struct ieeetypes_subbandset) * nr_subband);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function generates parsed_region_chan from Domain Info learned from AP/IBSS
|
||||
* @param region_chan pointer to struct region_channel
|
||||
* @param *parsed_region_chan pointer to parsed_region_chan_11d
|
||||
* @return N/A
|
||||
*/
|
||||
static void wlan_generate_parsed_region_chan_11d(struct region_channel * region_chan,
|
||||
struct parsed_region_chan_11d *
|
||||
parsed_region_chan)
|
||||
{
|
||||
u8 i;
|
||||
struct chan_freq_power *cfp;
|
||||
|
||||
if (region_chan == NULL) {
|
||||
lbs_pr_debug(1, "11D: region_chan is NULL\n");
|
||||
return;
|
||||
}
|
||||
|
||||
cfp = region_chan->CFP;
|
||||
if (cfp == NULL) {
|
||||
lbs_pr_debug(1, "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);
|
||||
|
||||
lbs_pr_debug(1, "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;
|
||||
lbs_pr_debug(1, "11D: Chan[%d] Pwr[%d]\n",
|
||||
parsed_region_chan->chanpwr[i].chan,
|
||||
parsed_region_chan->chanpwr[i].pwr);
|
||||
}
|
||||
parsed_region_chan->nr_chan = region_chan->nrcfp;
|
||||
|
||||
lbs_pr_debug(1, "11D: nrchan[%d]\n", parsed_region_chan->nr_chan);
|
||||
|
||||
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
|
||||
*/
|
||||
static u8 wlan_region_chan_supported_11d(u8 region, u8 band, u8 chan)
|
||||
{
|
||||
struct chan_freq_power *cfp;
|
||||
int cfp_no;
|
||||
u8 idx;
|
||||
|
||||
ENTER();
|
||||
|
||||
cfp = libertas_get_region_cfp_table(region, band, &cfp_no);
|
||||
if (cfp == NULL)
|
||||
return 0;
|
||||
|
||||
for (idx = 0; idx < cfp_no; idx++) {
|
||||
if (chan == (cfp + idx)->channel) {
|
||||
/* If Mrvl Chip Supported? */
|
||||
if ((cfp + idx)->unsupported) {
|
||||
return 0;
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*chan is not in the region table */
|
||||
LEAVE();
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @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
|
||||
* @return 0
|
||||
*/
|
||||
static int parse_domain_info_11d(struct ieeetypes_countryinfofullset*
|
||||
countryinfo,
|
||||
u8 band,
|
||||
struct parsed_region_chan_11d *
|
||||
parsed_region_chan)
|
||||
{
|
||||
u8 nr_subband, nrchan;
|
||||
u8 lastchan, firstchan;
|
||||
u8 region;
|
||||
u8 curchan = 0;
|
||||
|
||||
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
|
||||
*/
|
||||
|
||||
lbs_dbg_hex("CountryInfo:", (u8 *) 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 0;
|
||||
}
|
||||
|
||||
/*Step1: check region_code */
|
||||
parsed_region_chan->region = region =
|
||||
wlan_region_2_code(countryinfo->countrycode);
|
||||
|
||||
lbs_pr_debug(1, "regioncode=%x\n", (u8) parsed_region_chan->region);
|
||||
lbs_dbg_hex("CountryCode:", (char *)countryinfo->countrycode,
|
||||
COUNTRY_CODE_LEN);
|
||||
|
||||
parsed_region_chan->band = band;
|
||||
|
||||
memcpy(parsed_region_chan->countrycode, countryinfo->countrycode,
|
||||
COUNTRY_CODE_LEN);
|
||||
|
||||
nr_subband = (countryinfo->len - COUNTRY_CODE_LEN) /
|
||||
sizeof(struct ieeetypes_subbandset);
|
||||
|
||||
for (j = 0, lastchan = 0; j < nr_subband; j++) {
|
||||
|
||||
if (countryinfo->subband[j].firstchan <= lastchan) {
|
||||
/*Step2&3. Check First Chan Num increment and no overlap */
|
||||
lbs_pr_debug(1, "11D: Chan[%d>%d] Overlap\n",
|
||||
countryinfo->subband[j].firstchan, lastchan);
|
||||
continue;
|
||||
}
|
||||
|
||||
firstchan = countryinfo->subband[j].firstchan;
|
||||
nrchan = countryinfo->subband[j].nrchan;
|
||||
|
||||
for (i = 0; idx < MAX_NO_OF_CHAN && i < nrchan; i++) {
|
||||
/*step4: channel is supported? */
|
||||
|
||||
if (!wlan_get_chan_11d(band, firstchan, i, &curchan)) {
|
||||
/* Chan is not found in UN table */
|
||||
lbs_pr_debug(1, "chan is not supported: %d \n", i);
|
||||
break;
|
||||
}
|
||||
|
||||
lastchan = curchan;
|
||||
|
||||
if (wlan_region_chan_supported_11d
|
||||
(region, band, curchan)) {
|
||||
/*step5: 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++;
|
||||
} else {
|
||||
/*not supported and ignore the chan */
|
||||
lbs_pr_debug(1,
|
||||
"11D:i[%d] chan[%d] unsupported in region[%x] band[%d]\n",
|
||||
i, curchan, region, band);
|
||||
}
|
||||
}
|
||||
|
||||
/*Step6: Add other checking if any */
|
||||
|
||||
}
|
||||
|
||||
parsed_region_chan->nr_chan = idx;
|
||||
|
||||
lbs_pr_debug(1, "nrchan=%x\n", parsed_region_chan->nr_chan);
|
||||
lbs_dbg_hex("11D:parsed_region_chan:", (u8 *) parsed_region_chan,
|
||||
2 + COUNTRY_CODE_LEN + sizeof(struct parsed_region_chan_11d) * idx);
|
||||
|
||||
LEAVE();
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function calculates the scan type for channels
|
||||
* @param chan chan number
|
||||
* @param parsed_region_chan pointer to parsed_region_chan_11d
|
||||
* @return PASSIVE if chan is unknown; ACTIVE if chan is known
|
||||
*/
|
||||
u8 libertas_get_scan_type_11d(u8 chan,
|
||||
struct parsed_region_chan_11d * parsed_region_chan)
|
||||
{
|
||||
u8 scan_type = cmd_scan_type_passive;
|
||||
|
||||
ENTER();
|
||||
|
||||
if (wlan_channel_known_11d(chan, parsed_region_chan)) {
|
||||
lbs_pr_debug(1, "11D: Found and do Active Scan\n");
|
||||
scan_type = cmd_scan_type_active;
|
||||
} else {
|
||||
lbs_pr_debug(1, "11D: Not Find and do Passive Scan\n");
|
||||
}
|
||||
|
||||
LEAVE();
|
||||
return scan_type;
|
||||
|
||||
}
|
||||
|
||||
void libertas_init_11d(wlan_private * priv)
|
||||
{
|
||||
priv->adapter->enable11d = 0;
|
||||
memset(&(priv->adapter->parsed_region_chan), 0,
|
||||
sizeof(struct parsed_region_chan_11d));
|
||||
return;
|
||||
}
|
||||
|
||||
static int wlan_enable_11d(wlan_private * priv, u8 flag)
|
||||
{
|
||||
int ret;
|
||||
|
||||
priv->adapter->enable11d = flag;
|
||||
|
||||
/* send cmd to FW to enable/disable 11D function in FW */
|
||||
ret = libertas_prepare_and_send_command(priv,
|
||||
cmd_802_11_snmp_mib,
|
||||
cmd_act_set,
|
||||
cmd_option_waitforrsp,
|
||||
OID_802_11D_ENABLE,
|
||||
&priv->adapter->enable11d);
|
||||
if (ret)
|
||||
lbs_pr_debug(1, "11D: Fail to enable 11D \n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function sets DOMAIN INFO to FW
|
||||
* @param priv pointer to wlan_private
|
||||
* @return 0; -1
|
||||
*/
|
||||
static int set_domain_info_11d(wlan_private * priv)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (!priv->adapter->enable11d) {
|
||||
lbs_pr_debug(1, "11D: dnld domain Info with 11d disabled\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
ret = libertas_prepare_and_send_command(priv, cmd_802_11d_domain_info,
|
||||
cmd_act_set,
|
||||
cmd_option_waitforrsp, 0, NULL);
|
||||
if (ret)
|
||||
lbs_pr_debug(1, "11D: Fail to dnld domain Info\n");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function setups scan channels
|
||||
* @param priv pointer to wlan_private
|
||||
* @param band band
|
||||
* @return 0
|
||||
*/
|
||||
int libertas_set_universaltable(wlan_private * priv, u8 band)
|
||||
{
|
||||
wlan_adapter *adapter = priv->adapter;
|
||||
u16 size = sizeof(struct chan_freq_power);
|
||||
u16 i = 0;
|
||||
|
||||
memset(adapter->universal_channel, 0,
|
||||
sizeof(adapter->universal_channel));
|
||||
|
||||
adapter->universal_channel[i].nrcfp =
|
||||
sizeof(channel_freq_power_UN_BG) / size;
|
||||
lbs_pr_debug(1, "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 = 1;
|
||||
adapter->universal_channel[i].region = UNIVERSAL_REGION_CODE;
|
||||
adapter->universal_channel[i].band = band;
|
||||
i++;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @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 0
|
||||
*/
|
||||
int libertas_cmd_802_11d_domain_info(wlan_private * priv,
|
||||
struct cmd_ds_command *cmd, u16 cmdno,
|
||||
u16 cmdoption)
|
||||
{
|
||||
struct cmd_ds_802_11d_domain_info *pdomaininfo =
|
||||
&cmd->params.domaininfo;
|
||||
struct mrvlietypes_domainparamset *domain = &pdomaininfo->domain;
|
||||
wlan_adapter *adapter = priv->adapter;
|
||||
u8 nr_subband = adapter->domainreg.nr_subband;
|
||||
|
||||
ENTER();
|
||||
|
||||
lbs_pr_debug(1, "nr_subband=%x\n", nr_subband);
|
||||
|
||||
cmd->command = cpu_to_le16(cmdno);
|
||||
pdomaininfo->action = cpu_to_le16(cmdoption);
|
||||
if (cmdoption == cmd_act_get) {
|
||||
cmd->size =
|
||||
cpu_to_le16(sizeof(pdomaininfo->action) + S_DS_GEN);
|
||||
lbs_dbg_hex("11D: 802_11D_DOMAIN_INFO:", (u8 *) cmd,
|
||||
(int)(cmd->size));
|
||||
LEAVE();
|
||||
return 0;
|
||||
}
|
||||
|
||||
domain->header.type = cpu_to_le16(TLV_TYPE_DOMAIN);
|
||||
memcpy(domain->countrycode, adapter->domainreg.countrycode,
|
||||
sizeof(domain->countrycode));
|
||||
|
||||
domain->header.len =
|
||||
cpu_to_le16(nr_subband * sizeof(struct ieeetypes_subbandset) +
|
||||
sizeof(domain->countrycode));
|
||||
|
||||
if (nr_subband) {
|
||||
memcpy(domain->subband, adapter->domainreg.subband,
|
||||
nr_subband * sizeof(struct ieeetypes_subbandset));
|
||||
|
||||
cmd->size = cpu_to_le16(sizeof(pdomaininfo->action) +
|
||||
domain->header.len +
|
||||
sizeof(struct mrvlietypesheader) +
|
||||
S_DS_GEN);
|
||||
} else {
|
||||
cmd->size =
|
||||
cpu_to_le16(sizeof(pdomaininfo->action) + S_DS_GEN);
|
||||
}
|
||||
|
||||
lbs_dbg_hex("11D:802_11D_DOMAIN_INFO:", (u8 *) cmd, (int)(cmd->size));
|
||||
|
||||
LEAVE();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function implements private cmd: enable/disable 11D
|
||||
* @param priv pointer to wlan_private
|
||||
* @param wrq pointer to user data
|
||||
* @return 0 or -1
|
||||
*/
|
||||
int libertas_cmd_enable_11d(wlan_private * priv, struct iwreq *wrq)
|
||||
{
|
||||
int data = 0;
|
||||
int *val;
|
||||
|
||||
ENTER();
|
||||
data = SUBCMD_DATA(wrq);
|
||||
|
||||
lbs_pr_debug(1, "enable 11D: %s\n",
|
||||
(data == 1) ? "enable" : "Disable");
|
||||
|
||||
wlan_enable_11d(priv, data);
|
||||
val = (int *)wrq->u.name;
|
||||
*val = priv->adapter->enable11d;
|
||||
|
||||
LEAVE();
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @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 0; -1
|
||||
*/
|
||||
int libertas_ret_802_11d_domain_info(wlan_private * priv,
|
||||
struct cmd_ds_command *resp)
|
||||
{
|
||||
struct cmd_ds_802_11d_domain_info
|
||||
*domaininfo = &resp->params.domaininforesp;
|
||||
struct mrvlietypes_domainparamset *domain = &domaininfo->domain;
|
||||
u16 action = le16_to_cpu(domaininfo->action);
|
||||
s16 ret = 0;
|
||||
u8 nr_subband = 0;
|
||||
|
||||
ENTER();
|
||||
|
||||
lbs_dbg_hex("11D DOMAIN Info Rsp Data:", (u8 *) resp,
|
||||
(int)le16_to_cpu(resp->size));
|
||||
|
||||
nr_subband = (domain->header.len - 3) / sizeof(struct ieeetypes_subbandset);
|
||||
/* countrycode 3 bytes */
|
||||
|
||||
lbs_pr_debug(1, "11D Domain Info Resp: nr_subband=%d\n", nr_subband);
|
||||
|
||||
if (nr_subband > MRVDRV_MAX_SUBBAND_802_11D) {
|
||||
lbs_pr_debug(1, "Invalid Numrer of Subband returned!!\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
switch (action) {
|
||||
case cmd_act_set: /*Proc Set action */
|
||||
break;
|
||||
|
||||
case cmd_act_get:
|
||||
break;
|
||||
default:
|
||||
lbs_pr_debug(1, "Invalid action:%d\n", domaininfo->action);
|
||||
ret = -1;
|
||||
break;
|
||||
}
|
||||
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function parses countryinfo from AP and download country info to FW
|
||||
* @param priv pointer to wlan_private
|
||||
* @return 0; -1
|
||||
*/
|
||||
int libertas_parse_dnld_countryinfo_11d(wlan_private * priv)
|
||||
{
|
||||
int ret;
|
||||
wlan_adapter *adapter = priv->adapter;
|
||||
|
||||
ENTER();
|
||||
if (priv->adapter->enable11d) {
|
||||
memset(&adapter->parsed_region_chan, 0,
|
||||
sizeof(struct parsed_region_chan_11d));
|
||||
ret = parse_domain_info_11d(&adapter->pattemptedbssdesc->
|
||||
countryinfo, 0,
|
||||
&adapter->parsed_region_chan);
|
||||
|
||||
if (ret == -1) {
|
||||
lbs_pr_debug(1, "11D: Err Parse domain_info from AP..\n");
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
memset(&adapter->domainreg, 0,
|
||||
sizeof(struct wlan_802_11d_domain_reg));
|
||||
generate_domain_info_11d(&adapter->parsed_region_chan,
|
||||
&adapter->domainreg);
|
||||
|
||||
ret = set_domain_info_11d(priv);
|
||||
|
||||
if (ret) {
|
||||
lbs_pr_debug(1, "11D: Err set domainInfo to FW\n");
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
LEAVE();
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function generates 11D info from user specified regioncode and download to FW
|
||||
* @param priv pointer to wlan_private
|
||||
* @return 0; -1
|
||||
*/
|
||||
int libertas_create_dnld_countryinfo_11d(wlan_private * priv)
|
||||
{
|
||||
int ret;
|
||||
wlan_adapter *adapter = priv->adapter;
|
||||
struct region_channel *region_chan;
|
||||
u8 j;
|
||||
|
||||
ENTER();
|
||||
lbs_pr_debug(1, "11D:curbssparams.band[%d]\n", adapter->curbssparams.band);
|
||||
|
||||
if (priv->adapter->enable11d) {
|
||||
/* 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];
|
||||
|
||||
lbs_pr_debug(1, "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])) {
|
||||
lbs_pr_debug(1, "11D:region_chan not found. band[%d]\n",
|
||||
adapter->curbssparams.band);
|
||||
LEAVE();
|
||||
return -1;
|
||||
}
|
||||
|
||||
memset(&adapter->parsed_region_chan, 0,
|
||||
sizeof(struct parsed_region_chan_11d));
|
||||
wlan_generate_parsed_region_chan_11d(region_chan,
|
||||
&adapter->
|
||||
parsed_region_chan);
|
||||
|
||||
memset(&adapter->domainreg, 0,
|
||||
sizeof(struct wlan_802_11d_domain_reg));
|
||||
generate_domain_info_11d(&adapter->parsed_region_chan,
|
||||
&adapter->domainreg);
|
||||
|
||||
ret = set_domain_info_11d(priv);
|
||||
|
||||
if (ret) {
|
||||
lbs_pr_debug(1, "11D: Err set domainInfo to FW\n");
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
LEAVE();
|
||||
return 0;
|
||||
}
|
||||
105
drivers/net/wireless/libertas/11d.h
Normal file
105
drivers/net/wireless/libertas/11d.h
Normal file
|
|
@ -0,0 +1,105 @@
|
|||
/**
|
||||
* This header file contains data structures and
|
||||
* function declarations of 802.11d
|
||||
*/
|
||||
#ifndef _WLAN_11D_
|
||||
#define _WLAN_11D_
|
||||
|
||||
#include "types.h"
|
||||
#include "defs.h"
|
||||
|
||||
#define UNIVERSAL_REGION_CODE 0xff
|
||||
|
||||
/** (Beaconsize(256)-5(IEId,len,contrystr(3))/3(FirstChan,NoOfChan,MaxPwr)
|
||||
*/
|
||||
#define MRVDRV_MAX_SUBBAND_802_11D 83
|
||||
|
||||
#define COUNTRY_CODE_LEN 3
|
||||
#define MAX_NO_OF_CHAN 40
|
||||
|
||||
struct cmd_ds_command;
|
||||
|
||||
/** Data structure for Country IE*/
|
||||
struct ieeetypes_subbandset {
|
||||
u8 firstchan;
|
||||
u8 nrchan;
|
||||
u8 maxtxpwr;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct ieeetypes_countryinfoset {
|
||||
u8 element_id;
|
||||
u8 len;
|
||||
u8 countrycode[COUNTRY_CODE_LEN];
|
||||
struct ieeetypes_subbandset subband[1];
|
||||
};
|
||||
|
||||
struct ieeetypes_countryinfofullset {
|
||||
u8 element_id;
|
||||
u8 len;
|
||||
u8 countrycode[COUNTRY_CODE_LEN];
|
||||
struct ieeetypes_subbandset subband[MRVDRV_MAX_SUBBAND_802_11D];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct mrvlietypes_domainparamset {
|
||||
struct mrvlietypesheader header;
|
||||
u8 countrycode[COUNTRY_CODE_LEN];
|
||||
struct ieeetypes_subbandset subband[1];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct cmd_ds_802_11d_domain_info {
|
||||
u16 action;
|
||||
struct mrvlietypes_domainparamset domain;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/** domain regulatory information */
|
||||
struct wlan_802_11d_domain_reg {
|
||||
/** country Code*/
|
||||
u8 countrycode[COUNTRY_CODE_LEN];
|
||||
/** No. of subband*/
|
||||
u8 nr_subband;
|
||||
struct ieeetypes_subbandset subband[MRVDRV_MAX_SUBBAND_802_11D];
|
||||
};
|
||||
|
||||
struct chan_power_11d {
|
||||
u8 chan;
|
||||
u8 pwr;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct parsed_region_chan_11d {
|
||||
u8 band;
|
||||
u8 region;
|
||||
s8 countrycode[COUNTRY_CODE_LEN];
|
||||
struct chan_power_11d chanpwr[MAX_NO_OF_CHAN];
|
||||
u8 nr_chan;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct region_code_mapping {
|
||||
u8 region[COUNTRY_CODE_LEN];
|
||||
u8 code;
|
||||
};
|
||||
|
||||
u8 libertas_get_scan_type_11d(u8 chan,
|
||||
struct parsed_region_chan_11d *parsed_region_chan);
|
||||
|
||||
u32 libertas_chan_2_freq(u8 chan, u8 band);
|
||||
|
||||
enum state_11d libertas_get_state_11d(wlan_private * priv);
|
||||
|
||||
void libertas_init_11d(wlan_private * priv);
|
||||
|
||||
int libertas_set_universaltable(wlan_private * priv, u8 band);
|
||||
|
||||
int libertas_cmd_802_11d_domain_info(wlan_private * priv,
|
||||
struct cmd_ds_command *cmd, u16 cmdno,
|
||||
u16 cmdOption);
|
||||
|
||||
int libertas_cmd_enable_11d(wlan_private * priv, struct iwreq *wrq);
|
||||
|
||||
int libertas_ret_802_11d_domain_info(wlan_private * priv,
|
||||
struct cmd_ds_command *resp);
|
||||
|
||||
int libertas_parse_dnld_countryinfo_11d(wlan_private * priv);
|
||||
|
||||
int libertas_create_dnld_countryinfo_11d(wlan_private * priv);
|
||||
|
||||
#endif /* _WLAN_11D_ */
|
||||
16
drivers/net/wireless/libertas/LICENSE
Normal file
16
drivers/net/wireless/libertas/LICENSE
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
Copyright (c) 2003-2006, Marvell International Ltd.
|
||||
All Rights Reserved
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of version 2 of the GNU General Public License as
|
||||
published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along with
|
||||
this program; if not, write to the Free Software Foundation, Inc., 59
|
||||
Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
21
drivers/net/wireless/libertas/Makefile
Normal file
21
drivers/net/wireless/libertas/Makefile
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
# EXTRA_CFLAGS += -Wpacked
|
||||
|
||||
usb8xxx-objs := main.o fw.o wext.o \
|
||||
rx.o tx.o cmd.o \
|
||||
cmdresp.o scan.o \
|
||||
join.o 11d.o \
|
||||
ioctl.o debugfs.o \
|
||||
ethtool.o assoc.o
|
||||
|
||||
ifeq ($(CONFIG_LIBERTAS_USB_DEBUG), y)
|
||||
EXTRA_CFLAGS += -DDEBUG -DPROC_DEBUG
|
||||
endif
|
||||
|
||||
|
||||
# This is needed to support the newer boot2 bootloader (v >= 3104)
|
||||
EXTRA_CFLAGS += -DSUPPORT_BOOT_COMMAND
|
||||
usb8xxx-objs += if_bootcmd.o
|
||||
usb8xxx-objs += if_usb.o
|
||||
|
||||
obj-$(CONFIG_LIBERTAS_USB) += usb8xxx.o
|
||||
|
||||
1044
drivers/net/wireless/libertas/README
Normal file
1044
drivers/net/wireless/libertas/README
Normal file
File diff suppressed because it is too large
Load diff
588
drivers/net/wireless/libertas/assoc.c
Normal file
588
drivers/net/wireless/libertas/assoc.c
Normal file
|
|
@ -0,0 +1,588 @@
|
|||
/* Copyright (C) 2006, Red Hat, Inc. */
|
||||
|
||||
#include <linux/bitops.h>
|
||||
#include <net/ieee80211.h>
|
||||
|
||||
#include "assoc.h"
|
||||
#include "join.h"
|
||||
#include "decl.h"
|
||||
#include "hostcmd.h"
|
||||
#include "host.h"
|
||||
|
||||
|
||||
static const u8 bssid_any[ETH_ALEN] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
|
||||
static const u8 bssid_off[ETH_ALEN] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||||
|
||||
static int assoc_helper_essid(wlan_private *priv,
|
||||
struct assoc_request * assoc_req)
|
||||
{
|
||||
wlan_adapter *adapter = priv->adapter;
|
||||
int ret = 0;
|
||||
int i;
|
||||
|
||||
ENTER();
|
||||
|
||||
lbs_pr_debug(1, "New SSID requested: %s\n", assoc_req->ssid.ssid);
|
||||
if (assoc_req->mode == wlan802_11infrastructure) {
|
||||
if (adapter->prescan) {
|
||||
libertas_send_specific_SSID_scan(priv, &assoc_req->ssid, 1);
|
||||
}
|
||||
|
||||
i = libertas_find_SSID_in_list(adapter, &assoc_req->ssid,
|
||||
NULL, wlan802_11infrastructure);
|
||||
if (i >= 0) {
|
||||
lbs_pr_debug(1,
|
||||
"SSID found in scan list ... associating...\n");
|
||||
|
||||
ret = wlan_associate(priv, &adapter->scantable[i]);
|
||||
if (ret == 0) {
|
||||
memcpy(&assoc_req->bssid,
|
||||
&adapter->scantable[i].macaddress,
|
||||
ETH_ALEN);
|
||||
}
|
||||
} else {
|
||||
lbs_pr_debug(1, "SSID '%s' not found; cannot associate\n",
|
||||
assoc_req->ssid.ssid);
|
||||
}
|
||||
} else if (assoc_req->mode == wlan802_11ibss) {
|
||||
/* Scan for the network, do not save previous results. Stale
|
||||
* scan data will cause us to join a non-existant adhoc network
|
||||
*/
|
||||
libertas_send_specific_SSID_scan(priv, &assoc_req->ssid, 0);
|
||||
|
||||
/* Search for the requested SSID in the scan table */
|
||||
i = libertas_find_SSID_in_list(adapter, &assoc_req->ssid, NULL,
|
||||
wlan802_11ibss);
|
||||
if (i >= 0) {
|
||||
lbs_pr_debug(1, "SSID found at %d in List, so join\n", ret);
|
||||
libertas_join_adhoc_network(priv, &adapter->scantable[i]);
|
||||
} else {
|
||||
/* else send START command */
|
||||
lbs_pr_debug(1, "SSID not found in list, so creating adhoc"
|
||||
" with SSID '%s'\n", assoc_req->ssid.ssid);
|
||||
libertas_start_adhoc_network(priv, &assoc_req->ssid);
|
||||
}
|
||||
memcpy(&assoc_req->bssid, &adapter->current_addr, ETH_ALEN);
|
||||
}
|
||||
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static int assoc_helper_bssid(wlan_private *priv,
|
||||
struct assoc_request * assoc_req)
|
||||
{
|
||||
wlan_adapter *adapter = priv->adapter;
|
||||
int i, ret = 0;
|
||||
|
||||
ENTER();
|
||||
|
||||
lbs_pr_debug(1, "ASSOC: WAP: BSSID = " MAC_FMT "\n",
|
||||
MAC_ARG(assoc_req->bssid));
|
||||
|
||||
/* Search for index position in list for requested MAC */
|
||||
i = libertas_find_BSSID_in_list(adapter, assoc_req->bssid,
|
||||
assoc_req->mode);
|
||||
if (i < 0) {
|
||||
lbs_pr_debug(1, "ASSOC: WAP: BSSID " MAC_FMT " not found, "
|
||||
"cannot associate.\n", MAC_ARG(assoc_req->bssid));
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (assoc_req->mode == wlan802_11infrastructure) {
|
||||
ret = wlan_associate(priv, &adapter->scantable[i]);
|
||||
lbs_pr_debug(1, "ASSOC: return from wlan_associate(bssd) was %d\n", ret);
|
||||
} else if (assoc_req->mode == wlan802_11ibss) {
|
||||
libertas_join_adhoc_network(priv, &adapter->scantable[i]);
|
||||
}
|
||||
memcpy(&assoc_req->ssid, &adapter->scantable[i].ssid,
|
||||
sizeof(struct WLAN_802_11_SSID));
|
||||
|
||||
out:
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static int assoc_helper_associate(wlan_private *priv,
|
||||
struct assoc_request * assoc_req)
|
||||
{
|
||||
int ret = 0, done = 0;
|
||||
|
||||
/* If we're given and 'any' BSSID, try associating based on SSID */
|
||||
|
||||
if (test_bit(ASSOC_FLAG_BSSID, &assoc_req->flags)) {
|
||||
if (memcmp(bssid_any, assoc_req->bssid, ETH_ALEN)
|
||||
&& memcmp(bssid_off, assoc_req->bssid, ETH_ALEN)) {
|
||||
ret = assoc_helper_bssid(priv, assoc_req);
|
||||
done = 1;
|
||||
if (ret) {
|
||||
lbs_pr_debug(1, "ASSOC: bssid: ret = %d\n", ret);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!done && test_bit(ASSOC_FLAG_SSID, &assoc_req->flags)) {
|
||||
ret = assoc_helper_essid(priv, assoc_req);
|
||||
if (ret) {
|
||||
lbs_pr_debug(1, "ASSOC: bssid: ret = %d\n", ret);
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static int assoc_helper_mode(wlan_private *priv,
|
||||
struct assoc_request * assoc_req)
|
||||
{
|
||||
wlan_adapter *adapter = priv->adapter;
|
||||
int ret = 0;
|
||||
|
||||
ENTER();
|
||||
|
||||
if (assoc_req->mode == adapter->inframode) {
|
||||
LEAVE();
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (assoc_req->mode == wlan802_11infrastructure) {
|
||||
if (adapter->psstate != PS_STATE_FULL_POWER)
|
||||
libertas_ps_wakeup(priv, cmd_option_waitforrsp);
|
||||
adapter->psmode = wlan802_11powermodecam;
|
||||
}
|
||||
|
||||
adapter->inframode = assoc_req->mode;
|
||||
ret = libertas_prepare_and_send_command(priv,
|
||||
cmd_802_11_snmp_mib,
|
||||
0, cmd_option_waitforrsp,
|
||||
OID_802_11_INFRASTRUCTURE_MODE,
|
||||
(void *) assoc_req->mode);
|
||||
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static int assoc_helper_wep_keys(wlan_private *priv,
|
||||
struct assoc_request * assoc_req)
|
||||
{
|
||||
wlan_adapter *adapter = priv->adapter;
|
||||
int i;
|
||||
int ret = 0;
|
||||
|
||||
ENTER();
|
||||
|
||||
/* Set or remove WEP keys */
|
||||
if ( assoc_req->wep_keys[0].len
|
||||
|| assoc_req->wep_keys[1].len
|
||||
|| assoc_req->wep_keys[2].len
|
||||
|| assoc_req->wep_keys[3].len) {
|
||||
ret = libertas_prepare_and_send_command(priv,
|
||||
cmd_802_11_set_wep,
|
||||
cmd_act_add,
|
||||
cmd_option_waitforrsp,
|
||||
0, assoc_req);
|
||||
} else {
|
||||
ret = libertas_prepare_and_send_command(priv,
|
||||
cmd_802_11_set_wep,
|
||||
cmd_act_remove,
|
||||
cmd_option_waitforrsp,
|
||||
0, NULL);
|
||||
}
|
||||
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
/* enable/disable the MAC's WEP packet filter */
|
||||
if (assoc_req->secinfo.WEPstatus == wlan802_11WEPenabled)
|
||||
adapter->currentpacketfilter |= cmd_act_mac_wep_enable;
|
||||
else
|
||||
adapter->currentpacketfilter &= ~cmd_act_mac_wep_enable;
|
||||
ret = libertas_set_mac_packet_filter(priv);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
mutex_lock(&adapter->lock);
|
||||
|
||||
/* Copy WEP keys into adapter wep key fields */
|
||||
for (i = 0; i < 4; i++) {
|
||||
memcpy(&adapter->wep_keys[i], &assoc_req->wep_keys[i],
|
||||
sizeof(struct WLAN_802_11_KEY));
|
||||
}
|
||||
adapter->wep_tx_keyidx = assoc_req->wep_tx_keyidx;
|
||||
|
||||
mutex_unlock(&adapter->lock);
|
||||
|
||||
out:
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int assoc_helper_secinfo(wlan_private *priv,
|
||||
struct assoc_request * assoc_req)
|
||||
{
|
||||
wlan_adapter *adapter = priv->adapter;
|
||||
int ret = 0;
|
||||
|
||||
ENTER();
|
||||
|
||||
memcpy(&adapter->secinfo, &assoc_req->secinfo,
|
||||
sizeof(struct wlan_802_11_security));
|
||||
|
||||
ret = libertas_set_mac_packet_filter(priv);
|
||||
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static int assoc_helper_wpa_keys(wlan_private *priv,
|
||||
struct assoc_request * assoc_req)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
ENTER();
|
||||
|
||||
/* enable/Disable RSN */
|
||||
ret = libertas_prepare_and_send_command(priv,
|
||||
cmd_802_11_enable_rsn,
|
||||
cmd_act_set,
|
||||
cmd_option_waitforrsp,
|
||||
0, assoc_req);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
ret = libertas_prepare_and_send_command(priv,
|
||||
cmd_802_11_key_material,
|
||||
cmd_act_set,
|
||||
cmd_option_waitforrsp,
|
||||
0, assoc_req);
|
||||
|
||||
out:
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static int assoc_helper_wpa_ie(wlan_private *priv,
|
||||
struct assoc_request * assoc_req)
|
||||
{
|
||||
wlan_adapter *adapter = priv->adapter;
|
||||
int ret = 0;
|
||||
|
||||
ENTER();
|
||||
|
||||
if (assoc_req->secinfo.WPAenabled || assoc_req->secinfo.WPA2enabled) {
|
||||
memcpy(&adapter->wpa_ie, &assoc_req->wpa_ie, assoc_req->wpa_ie_len);
|
||||
adapter->wpa_ie_len = assoc_req->wpa_ie_len;
|
||||
} else {
|
||||
memset(&adapter->wpa_ie, 0, MAX_WPA_IE_LEN);
|
||||
adapter->wpa_ie_len = 0;
|
||||
}
|
||||
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static int should_deauth_infrastructure(wlan_adapter *adapter,
|
||||
struct assoc_request * assoc_req)
|
||||
{
|
||||
if (adapter->connect_status != libertas_connected)
|
||||
return 0;
|
||||
|
||||
if (test_bit(ASSOC_FLAG_SSID, &assoc_req->flags)) {
|
||||
lbs_pr_debug(1, "Deauthenticating due to new SSID in "
|
||||
" configuration request.\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (test_bit(ASSOC_FLAG_SECINFO, &assoc_req->flags)) {
|
||||
if (adapter->secinfo.authmode !=
|
||||
assoc_req->secinfo.authmode) {
|
||||
lbs_pr_debug(1, "Deauthenticating due to updated security "
|
||||
"info in configuration request.\n");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (test_bit(ASSOC_FLAG_BSSID, &assoc_req->flags)) {
|
||||
lbs_pr_debug(1, "Deauthenticating due to new BSSID in "
|
||||
" configuration request.\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* FIXME: deal with 'auto' mode somehow */
|
||||
if (test_bit(ASSOC_FLAG_MODE, &assoc_req->flags)) {
|
||||
if (assoc_req->mode != wlan802_11infrastructure)
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int should_stop_adhoc(wlan_adapter *adapter,
|
||||
struct assoc_request * assoc_req)
|
||||
{
|
||||
if (adapter->connect_status != libertas_connected)
|
||||
return 0;
|
||||
|
||||
if (adapter->curbssparams.ssid.ssidlength != assoc_req->ssid.ssidlength)
|
||||
return 1;
|
||||
if (memcmp(adapter->curbssparams.ssid.ssid, assoc_req->ssid.ssid,
|
||||
sizeof(struct WLAN_802_11_SSID)))
|
||||
return 1;
|
||||
|
||||
/* FIXME: deal with 'auto' mode somehow */
|
||||
if (test_bit(ASSOC_FLAG_MODE, &assoc_req->flags)) {
|
||||
if (assoc_req->mode != wlan802_11ibss)
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void wlan_association_worker(struct work_struct *work)
|
||||
{
|
||||
wlan_private *priv = container_of(work, wlan_private, assoc_work.work);
|
||||
wlan_adapter *adapter = priv->adapter;
|
||||
struct assoc_request * assoc_req = NULL;
|
||||
int ret = 0;
|
||||
int find_any_ssid = 0;
|
||||
|
||||
ENTER();
|
||||
|
||||
mutex_lock(&adapter->lock);
|
||||
assoc_req = adapter->assoc_req;
|
||||
adapter->assoc_req = NULL;
|
||||
mutex_unlock(&adapter->lock);
|
||||
|
||||
if (!assoc_req) {
|
||||
LEAVE();
|
||||
return;
|
||||
}
|
||||
|
||||
lbs_pr_debug(1, "ASSOC: starting new association request: flags = 0x%lX\n",
|
||||
assoc_req->flags);
|
||||
|
||||
/* If 'any' SSID was specified, find an SSID to associate with */
|
||||
if (test_bit(ASSOC_FLAG_SSID, &assoc_req->flags)
|
||||
&& !assoc_req->ssid.ssidlength)
|
||||
find_any_ssid = 1;
|
||||
|
||||
/* But don't use 'any' SSID if there's a valid locked BSSID to use */
|
||||
if (test_bit(ASSOC_FLAG_BSSID, &assoc_req->flags)) {
|
||||
if (memcmp(&assoc_req->bssid, bssid_any, ETH_ALEN)
|
||||
&& memcmp(&assoc_req->bssid, bssid_off, ETH_ALEN))
|
||||
find_any_ssid = 0;
|
||||
}
|
||||
|
||||
if (find_any_ssid) {
|
||||
enum WLAN_802_11_NETWORK_INFRASTRUCTURE new_mode;
|
||||
|
||||
ret = libertas_find_best_network_SSID(priv, &assoc_req->ssid,
|
||||
assoc_req->mode, &new_mode);
|
||||
if (ret) {
|
||||
lbs_pr_debug(1, "Could not find best network\n");
|
||||
ret = -ENETUNREACH;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Ensure we switch to the mode of the AP */
|
||||
if (assoc_req->mode == wlan802_11autounknown) {
|
||||
set_bit(ASSOC_FLAG_MODE, &assoc_req->flags);
|
||||
assoc_req->mode = new_mode;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Check if the attributes being changing require deauthentication
|
||||
* from the currently associated infrastructure access point.
|
||||
*/
|
||||
if (adapter->inframode == wlan802_11infrastructure) {
|
||||
if (should_deauth_infrastructure(adapter, assoc_req)) {
|
||||
ret = libertas_send_deauthentication(priv);
|
||||
if (ret) {
|
||||
lbs_pr_debug(1, "Deauthentication due to new "
|
||||
"configuration request failed: %d\n",
|
||||
ret);
|
||||
}
|
||||
}
|
||||
} else if (adapter->inframode == wlan802_11ibss) {
|
||||
if (should_stop_adhoc(adapter, assoc_req)) {
|
||||
ret = libertas_stop_adhoc_network(priv);
|
||||
if (ret) {
|
||||
lbs_pr_debug(1, "Teardown of AdHoc network due to "
|
||||
"new configuration request failed: %d\n",
|
||||
ret);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/* Send the various configuration bits to the firmware */
|
||||
if (test_bit(ASSOC_FLAG_MODE, &assoc_req->flags)) {
|
||||
ret = assoc_helper_mode(priv, assoc_req);
|
||||
if (ret) {
|
||||
lbs_pr_debug(1, "ASSOC(:%d) mode: ret = %d\n", __LINE__, ret);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
if ( test_bit(ASSOC_FLAG_WEP_KEYS, &assoc_req->flags)
|
||||
|| test_bit(ASSOC_FLAG_WEP_TX_KEYIDX, &assoc_req->flags)) {
|
||||
ret = assoc_helper_wep_keys(priv, assoc_req);
|
||||
if (ret) {
|
||||
lbs_pr_debug(1, "ASSOC(:%d) wep_keys: ret = %d\n", __LINE__, ret);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
if (test_bit(ASSOC_FLAG_SECINFO, &assoc_req->flags)) {
|
||||
ret = assoc_helper_secinfo(priv, assoc_req);
|
||||
if (ret) {
|
||||
lbs_pr_debug(1, "ASSOC(:%d) secinfo: ret = %d\n", __LINE__, ret);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
if (test_bit(ASSOC_FLAG_WPA_IE, &assoc_req->flags)) {
|
||||
ret = assoc_helper_wpa_ie(priv, assoc_req);
|
||||
if (ret) {
|
||||
lbs_pr_debug(1, "ASSOC(:%d) wpa_ie: ret = %d\n", __LINE__, ret);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
if (test_bit(ASSOC_FLAG_WPA_MCAST_KEY, &assoc_req->flags)
|
||||
|| test_bit(ASSOC_FLAG_WPA_UCAST_KEY, &assoc_req->flags)) {
|
||||
ret = assoc_helper_wpa_keys(priv, assoc_req);
|
||||
if (ret) {
|
||||
lbs_pr_debug(1, "ASSOC(:%d) wpa_keys: ret = %d\n", __LINE__, ret);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
/* SSID/BSSID should be the _last_ config option set, because they
|
||||
* trigger the association attempt.
|
||||
*/
|
||||
if (test_bit(ASSOC_FLAG_BSSID, &assoc_req->flags)
|
||||
|| test_bit(ASSOC_FLAG_SSID, &assoc_req->flags)) {
|
||||
int success = 1;
|
||||
|
||||
ret = assoc_helper_associate(priv, assoc_req);
|
||||
if (ret) {
|
||||
lbs_pr_debug(1, "ASSOC: association attempt unsuccessful: %d\n",
|
||||
ret);
|
||||
success = 0;
|
||||
}
|
||||
|
||||
if (adapter->connect_status != libertas_connected) {
|
||||
lbs_pr_debug(1, "ASSOC: assoication attempt unsuccessful, "
|
||||
"not connected.\n");
|
||||
success = 0;
|
||||
}
|
||||
|
||||
if (success) {
|
||||
lbs_pr_debug(1, "ASSOC: association attempt successful. "
|
||||
"Associated to '%s' (" MAC_FMT ")\n",
|
||||
assoc_req->ssid.ssid, MAC_ARG(assoc_req->bssid));
|
||||
libertas_prepare_and_send_command(priv,
|
||||
cmd_802_11_rssi,
|
||||
0, cmd_option_waitforrsp, 0, NULL);
|
||||
|
||||
libertas_prepare_and_send_command(priv,
|
||||
cmd_802_11_get_log,
|
||||
0, cmd_option_waitforrsp, 0, NULL);
|
||||
} else {
|
||||
|
||||
ret = -1;
|
||||
}
|
||||
}
|
||||
|
||||
out:
|
||||
if (ret) {
|
||||
lbs_pr_debug(1, "ASSOC: reconfiguration attempt unsuccessful: %d\n",
|
||||
ret);
|
||||
}
|
||||
kfree(assoc_req);
|
||||
LEAVE();
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Caller MUST hold any necessary locks
|
||||
*/
|
||||
struct assoc_request * wlan_get_association_request(wlan_adapter *adapter)
|
||||
{
|
||||
struct assoc_request * assoc_req;
|
||||
|
||||
if (!adapter->assoc_req) {
|
||||
adapter->assoc_req = kzalloc(sizeof(struct assoc_request), GFP_KERNEL);
|
||||
if (!adapter->assoc_req) {
|
||||
lbs_pr_info("Not enough memory to allocate association"
|
||||
" request!\n");
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/* Copy current configuration attributes to the association request,
|
||||
* but don't overwrite any that are already set.
|
||||
*/
|
||||
assoc_req = adapter->assoc_req;
|
||||
if (!test_bit(ASSOC_FLAG_SSID, &assoc_req->flags)) {
|
||||
memcpy(&assoc_req->ssid, adapter->curbssparams.ssid.ssid,
|
||||
adapter->curbssparams.ssid.ssidlength);
|
||||
}
|
||||
|
||||
if (!test_bit(ASSOC_FLAG_CHANNEL, &assoc_req->flags))
|
||||
assoc_req->channel = adapter->curbssparams.channel;
|
||||
|
||||
if (!test_bit(ASSOC_FLAG_MODE, &assoc_req->flags))
|
||||
assoc_req->mode = adapter->inframode;
|
||||
|
||||
if (!test_bit(ASSOC_FLAG_BSSID, &assoc_req->flags)) {
|
||||
memcpy(&assoc_req->bssid, adapter->curbssparams.bssid,
|
||||
ETH_ALEN);
|
||||
}
|
||||
|
||||
if (!test_bit(ASSOC_FLAG_WEP_KEYS, &assoc_req->flags)) {
|
||||
int i;
|
||||
for (i = 0; i < 4; i++) {
|
||||
memcpy(&assoc_req->wep_keys[i], &adapter->wep_keys[i],
|
||||
sizeof(struct WLAN_802_11_KEY));
|
||||
}
|
||||
}
|
||||
|
||||
if (!test_bit(ASSOC_FLAG_WEP_TX_KEYIDX, &assoc_req->flags))
|
||||
assoc_req->wep_tx_keyidx = adapter->wep_tx_keyidx;
|
||||
|
||||
if (!test_bit(ASSOC_FLAG_WPA_MCAST_KEY, &assoc_req->flags)) {
|
||||
memcpy(&assoc_req->wpa_mcast_key, &adapter->wpa_mcast_key,
|
||||
sizeof(struct WLAN_802_11_KEY));
|
||||
}
|
||||
|
||||
if (!test_bit(ASSOC_FLAG_WPA_UCAST_KEY, &assoc_req->flags)) {
|
||||
memcpy(&assoc_req->wpa_unicast_key, &adapter->wpa_unicast_key,
|
||||
sizeof(struct WLAN_802_11_KEY));
|
||||
}
|
||||
|
||||
if (!test_bit(ASSOC_FLAG_SECINFO, &assoc_req->flags)) {
|
||||
memcpy(&assoc_req->secinfo, &adapter->secinfo,
|
||||
sizeof(struct wlan_802_11_security));
|
||||
}
|
||||
|
||||
if (!test_bit(ASSOC_FLAG_WPA_IE, &assoc_req->flags)) {
|
||||
memcpy(&assoc_req->wpa_ie, &adapter->wpa_ie,
|
||||
MAX_WPA_IE_LEN);
|
||||
assoc_req->wpa_ie_len = adapter->wpa_ie_len;
|
||||
}
|
||||
|
||||
return assoc_req;
|
||||
}
|
||||
|
||||
|
||||
30
drivers/net/wireless/libertas/assoc.h
Normal file
30
drivers/net/wireless/libertas/assoc.h
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
/* Copyright (C) 2006, Red Hat, Inc. */
|
||||
|
||||
#ifndef _WLAN_ASSOC_H_
|
||||
#define _WLAN_ASSOC_H_
|
||||
|
||||
#include "dev.h"
|
||||
|
||||
void wlan_association_worker(struct work_struct *work);
|
||||
|
||||
struct assoc_request * wlan_get_association_request(wlan_adapter *adapter);
|
||||
|
||||
#define ASSOC_DELAY (HZ / 2)
|
||||
static inline void wlan_postpone_association_work(wlan_private *priv)
|
||||
{
|
||||
if (priv->adapter->surpriseremoved)
|
||||
return;
|
||||
cancel_delayed_work(&priv->assoc_work);
|
||||
queue_delayed_work(priv->assoc_thread, &priv->assoc_work, ASSOC_DELAY);
|
||||
}
|
||||
|
||||
static inline void wlan_cancel_association_work(wlan_private *priv)
|
||||
{
|
||||
cancel_delayed_work(&priv->assoc_work);
|
||||
if (priv->adapter->assoc_req) {
|
||||
kfree(priv->adapter->assoc_req);
|
||||
priv->adapter->assoc_req = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* _WLAN_ASSOC_H */
|
||||
1958
drivers/net/wireless/libertas/cmd.c
Normal file
1958
drivers/net/wireless/libertas/cmd.c
Normal file
File diff suppressed because it is too large
Load diff
1031
drivers/net/wireless/libertas/cmdresp.c
Normal file
1031
drivers/net/wireless/libertas/cmdresp.c
Normal file
File diff suppressed because it is too large
Load diff
1968
drivers/net/wireless/libertas/debugfs.c
Normal file
1968
drivers/net/wireless/libertas/debugfs.c
Normal file
File diff suppressed because it is too large
Load diff
6
drivers/net/wireless/libertas/debugfs.h
Normal file
6
drivers/net/wireless/libertas/debugfs.h
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
void libertas_debugfs_init(void);
|
||||
void libertas_debugfs_remove(void);
|
||||
|
||||
void libertas_debugfs_init_one(wlan_private *priv, struct net_device *dev);
|
||||
void libertas_debugfs_remove_one(wlan_private *priv);
|
||||
|
||||
83
drivers/net/wireless/libertas/decl.h
Normal file
83
drivers/net/wireless/libertas/decl.h
Normal file
|
|
@ -0,0 +1,83 @@
|
|||
/**
|
||||
* This file contains declaration referring to
|
||||
* functions defined in other source files
|
||||
*/
|
||||
|
||||
#ifndef _WLAN_DECL_H_
|
||||
#define _WLAN_DECL_H_
|
||||
|
||||
#include "defs.h"
|
||||
|
||||
/** Function Prototype Declaration */
|
||||
struct wlan_private;
|
||||
struct sk_buff;
|
||||
struct net_device;
|
||||
|
||||
extern char *libertas_fw_name;
|
||||
|
||||
void libertas_free_adapter(wlan_private * priv);
|
||||
int libertas_set_mac_packet_filter(wlan_private * priv);
|
||||
|
||||
int libertas_send_null_packet(wlan_private * priv, u8 pwr_mgmt);
|
||||
void libertas_send_tx_feedback(wlan_private * priv);
|
||||
u8 libertas_check_last_packet_indication(wlan_private * priv);
|
||||
|
||||
int libertas_free_cmd_buffer(wlan_private * priv);
|
||||
struct cmd_ctrl_node;
|
||||
struct cmd_ctrl_node *libertas_get_free_cmd_ctrl_node(wlan_private * priv);
|
||||
|
||||
void libertas_set_cmd_ctrl_node(wlan_private * priv,
|
||||
struct cmd_ctrl_node *ptempnode,
|
||||
u32 cmd_oid, u16 wait_option, void *pdata_buf);
|
||||
|
||||
int libertas_prepare_and_send_command(wlan_private * priv,
|
||||
u16 cmd_no,
|
||||
u16 cmd_action,
|
||||
u16 wait_option, u32 cmd_oid, void *pdata_buf);
|
||||
|
||||
void libertas_queue_cmd(wlan_adapter * adapter, struct cmd_ctrl_node *cmdnode, u8 addtail);
|
||||
|
||||
int libertas_allocate_cmd_buffer(wlan_private * priv);
|
||||
int libertas_execute_next_command(wlan_private * priv);
|
||||
int libertas_process_event(wlan_private * priv);
|
||||
void libertas_interrupt(struct net_device *);
|
||||
int libertas_set_radio_control(wlan_private * priv);
|
||||
u32 libertas_index_to_data_rate(u8 index);
|
||||
u8 libertas_data_rate_to_index(u32 rate);
|
||||
void libertas_get_fwversion(wlan_adapter * adapter, char *fwversion, int maxlen);
|
||||
|
||||
int libertas_upload_rx_packet(wlan_private * priv, struct sk_buff *skb);
|
||||
|
||||
/** The proc fs interface */
|
||||
int libertas_process_rx_command(wlan_private * priv);
|
||||
int libertas_process_tx(wlan_private * priv, struct sk_buff *skb);
|
||||
void libertas_cleanup_and_insert_cmd(wlan_private * priv,
|
||||
struct cmd_ctrl_node *ptempcmd);
|
||||
void __libertas_cleanup_and_insert_cmd(wlan_private * priv,
|
||||
struct cmd_ctrl_node *ptempcmd);
|
||||
|
||||
int libertas_set_regiontable(wlan_private * priv, u8 region, u8 band);
|
||||
|
||||
int libertas_process_rxed_packet(wlan_private * priv, struct sk_buff *);
|
||||
|
||||
void libertas_ps_sleep(wlan_private * priv, int wait_option);
|
||||
void libertas_ps_confirm_sleep(wlan_private * priv, u16 psmode);
|
||||
void libertas_ps_wakeup(wlan_private * priv, int wait_option);
|
||||
|
||||
void libertas_tx_runqueue(wlan_private *priv);
|
||||
|
||||
extern struct chan_freq_power *libertas_find_cfp_by_band_and_channel(
|
||||
wlan_adapter * adapter, u8 band, u16 channel);
|
||||
|
||||
extern void libertas_mac_event_disconnected(wlan_private * priv);
|
||||
|
||||
void libertas_send_iwevcustom_event(wlan_private * priv, s8 * str);
|
||||
|
||||
int reset_device(wlan_private *priv);
|
||||
/* main.c */
|
||||
extern struct chan_freq_power *libertas_get_region_cfp_table(u8 region, u8 band,
|
||||
int *cfp_no);
|
||||
wlan_private *wlan_add_card(void *card);
|
||||
int wlan_remove_card(void *card);
|
||||
|
||||
#endif /* _WLAN_DECL_H_ */
|
||||
369
drivers/net/wireless/libertas/defs.h
Normal file
369
drivers/net/wireless/libertas/defs.h
Normal file
|
|
@ -0,0 +1,369 @@
|
|||
/**
|
||||
* This header file contains global constant/enum definitions,
|
||||
* global variable declaration.
|
||||
*/
|
||||
#ifndef _WLAN_DEFS_H_
|
||||
#define _WLAN_DEFS_H_
|
||||
|
||||
#include <linux/spinlock.h>
|
||||
|
||||
extern unsigned int libertas_debug;
|
||||
|
||||
#define DRV_NAME "usb8xxx"
|
||||
|
||||
#define lbs_pr_info(format, args...) \
|
||||
printk(KERN_INFO DRV_NAME": " format, ## args)
|
||||
#define lbs_pr_err(format, args...) \
|
||||
printk(KERN_ERR DRV_NAME": " format, ## args)
|
||||
#define lbs_pr_alert(format, args...) \
|
||||
printk(KERN_ALERT DRV_NAME": " format, ## args)
|
||||
|
||||
#ifdef DEBUG
|
||||
#define lbs_pr_debug(level, format, args...) \
|
||||
do { if (libertas_debug >= level) \
|
||||
printk(KERN_INFO DRV_NAME": " format, ##args); } while (0)
|
||||
#define lbs_dev_dbg(level, device, format, args...) \
|
||||
lbs_pr_debug(level, "%s: " format, \
|
||||
(device)->bus_id , ## args)
|
||||
|
||||
static inline void lbs_dbg_hex(char *prompt, u8 * buf, int len)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
if (!libertas_debug)
|
||||
return;
|
||||
|
||||
printk(KERN_DEBUG "%s: ", prompt);
|
||||
for (i = 1; i <= len; i++) {
|
||||
printk(KERN_DEBUG "%02x ", (u8) * buf);
|
||||
buf++;
|
||||
}
|
||||
printk("\n");
|
||||
}
|
||||
#else
|
||||
#define lbs_pr_debug(level, format, args...) do {} while (0)
|
||||
#define lbs_dev_dbg(level, device, format, args...) do {} while (0)
|
||||
#define lbs_dbg_hex(x,y,z) do {} while (0)
|
||||
#endif
|
||||
|
||||
#define ENTER() lbs_pr_debug(1, "Enter: %s, %s:%i\n", \
|
||||
__FUNCTION__, __FILE__, __LINE__)
|
||||
#define LEAVE() lbs_pr_debug(1, "Leave: %s, %s:%i\n", \
|
||||
__FUNCTION__, __FILE__, __LINE__)
|
||||
|
||||
/** 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_MAX_MULTICAST_LIST_SIZE 32
|
||||
#define MRVDRV_NUM_OF_CMD_BUFFER 10
|
||||
#define MRVDRV_SIZE_OF_CMD_BUFFER (2 * 1024)
|
||||
#define MRVDRV_MAX_CHANNEL_SIZE 14
|
||||
#define MRVDRV_MAX_BSSID_LIST 64
|
||||
#define MRVDRV_ASSOCIATION_TIME_OUT 255
|
||||
#define MRVDRV_SNAP_HEADER_LEN 8
|
||||
|
||||
#define WLAN_UPLD_SIZE 2312
|
||||
#define DEV_NAME_LEN 32
|
||||
|
||||
/** Misc constants */
|
||||
/* This section defines 802.11 specific contants */
|
||||
|
||||
#define MRVDRV_MAX_BSS_DESCRIPTS 16
|
||||
#define MRVDRV_MAX_REGION_CODE 6
|
||||
|
||||
#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_CHANNELS_PER_SCAN 4
|
||||
#define MRVDRV_MAX_CHANNELS_PER_SCAN 14
|
||||
|
||||
#define MRVDRV_DEBUG_RX_PATH 0x00000001
|
||||
#define MRVDRV_DEBUG_TX_PATH 0x00000002
|
||||
|
||||
#define MRVDRV_MIN_BEACON_INTERVAL 20
|
||||
#define MRVDRV_MAX_BEACON_INTERVAL 1000
|
||||
#define MRVDRV_BEACON_INTERVAL 100
|
||||
|
||||
/** 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 mesh flag */
|
||||
/* Currently we are using normal WDS flag as mesh flag.
|
||||
* TODO: change to proper mesh flag when MAC understands it.
|
||||
*/
|
||||
#define TxPD_CONTROL_WDS_FRAME (1<<17)
|
||||
#define TxPD_MESH_FRAME TxPD_CONTROL_WDS_FRAME
|
||||
|
||||
/** RxPD status */
|
||||
|
||||
#define MRVDRV_RXPD_STATUS_OK 0x0001
|
||||
|
||||
/** RxPD status - Received packet types */
|
||||
/** Rx mesh flag */
|
||||
/* Currently we are using normal WDS flag as mesh flag.
|
||||
* TODO: change to proper mesh flag when MAC understands it.
|
||||
*/
|
||||
#define RxPD_CONTROL_WDS_FRAME (0x40)
|
||||
#define RxPD_MESH_FRAME RxPD_CONTROL_WDS_FRAME
|
||||
|
||||
/** 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
|
||||
|
||||
/* This is for firmware specific length */
|
||||
#define EXTRA_LEN 36
|
||||
|
||||
#define MRVDRV_ETH_TX_PACKET_BUFFER_SIZE \
|
||||
(ETH_FRAME_LEN + sizeof(struct txpd) + EXTRA_LEN)
|
||||
|
||||
#define MRVDRV_ETH_RX_PACKET_BUFFER_SIZE \
|
||||
(ETH_FRAME_LEN + sizeof(struct rxpd) \
|
||||
+ MRVDRV_SNAP_HEADER_LEN + EXTRA_LEN)
|
||||
|
||||
#define CMD_F_HOSTCMD (1 << 0)
|
||||
#define FW_CAPINFO_WPA (1 << 0)
|
||||
|
||||
/** WPA key LENGTH*/
|
||||
#define MRVL_MAX_KEY_WPA_KEY_LENGTH 32
|
||||
|
||||
#define KEY_LEN_WPA_AES 16
|
||||
#define KEY_LEN_WPA_TKIP 32
|
||||
#define KEY_LEN_WEP_104 13
|
||||
#define KEY_LEN_WEP_40 5
|
||||
|
||||
#define RF_ANTENNA_1 0x1
|
||||
#define RF_ANTENNA_2 0x2
|
||||
#define RF_ANTENNA_AUTO 0xFFFF
|
||||
|
||||
#define BAND_B (0x01)
|
||||
#define BAND_G (0x02)
|
||||
#define ALL_802_11_BANDS (BAND_B | BAND_G)
|
||||
|
||||
/** 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 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 B_SUPPORTED_RATES 8
|
||||
#define G_SUPPORTED_RATES 14
|
||||
|
||||
#define WLAN_SUPPORTED_RATES 14
|
||||
|
||||
#define MAX_LEDS 8
|
||||
|
||||
#define IS_MESH_FRAME(x) (x->cb[6])
|
||||
#define SET_MESH_FRAME(x) (x->cb[6]=1)
|
||||
#define UNSET_MESH_FRAME(x) (x->cb[6]=0)
|
||||
|
||||
/** Global Variable Declaration */
|
||||
typedef struct _wlan_private wlan_private;
|
||||
typedef struct _wlan_adapter wlan_adapter;
|
||||
extern const char libertas_driver_version[];
|
||||
extern u16 libertas_region_code_to_index[MRVDRV_MAX_REGION_CODE];
|
||||
|
||||
extern u8 libertas_wlan_data_rates[WLAN_SUPPORTED_RATES];
|
||||
|
||||
extern u8 libertas_supported_rates[G_SUPPORTED_RATES];
|
||||
|
||||
extern u8 libertas_adhoc_rates_g[G_SUPPORTED_RATES];
|
||||
|
||||
extern u8 libertas_adhoc_rates_b[4];
|
||||
|
||||
/** ENUM definition*/
|
||||
/** SNRNF_TYPE */
|
||||
enum SNRNF_TYPE {
|
||||
TYPE_BEACON = 0,
|
||||
TYPE_RXPD,
|
||||
MAX_TYPE_B
|
||||
};
|
||||
|
||||
/** SNRNF_DATA*/
|
||||
enum SNRNF_DATA {
|
||||
TYPE_NOAVG = 0,
|
||||
TYPE_AVG,
|
||||
MAX_TYPE_AVG
|
||||
};
|
||||
|
||||
/** WLAN_802_11_AUTH_ALG*/
|
||||
enum WLAN_802_11_AUTH_ALG {
|
||||
AUTH_ALG_OPEN_SYSTEM = 1,
|
||||
AUTH_ALG_SHARED_KEY = 2,
|
||||
AUTH_ALG_NETWORK_EAP = 8,
|
||||
};
|
||||
|
||||
/** WLAN_802_1X_AUTH_ALG */
|
||||
enum WLAN_802_1X_AUTH_ALG {
|
||||
WLAN_1X_AUTH_ALG_NONE = 1,
|
||||
WLAN_1X_AUTH_ALG_LEAP = 2,
|
||||
WLAN_1X_AUTH_ALG_TLS = 4,
|
||||
WLAN_1X_AUTH_ALG_TTLS = 8,
|
||||
WLAN_1X_AUTH_ALG_MD5 = 16,
|
||||
};
|
||||
|
||||
/** WLAN_802_11_ENCRYPTION_MODE */
|
||||
enum WLAN_802_11_ENCRYPTION_MODE {
|
||||
CIPHER_NONE,
|
||||
CIPHER_WEP40,
|
||||
CIPHER_TKIP,
|
||||
CIPHER_CCMP,
|
||||
CIPHER_WEP104,
|
||||
};
|
||||
|
||||
/** WLAN_802_11_POWER_MODE */
|
||||
enum WLAN_802_11_POWER_MODE {
|
||||
wlan802_11powermodecam,
|
||||
wlan802_11powermodemax_psp,
|
||||
wlan802_11Powermodefast_psp,
|
||||
/*not a real mode, defined as an upper bound */
|
||||
wlan802_11powemodemax
|
||||
};
|
||||
|
||||
/** PS_STATE */
|
||||
enum PS_STATE {
|
||||
PS_STATE_FULL_POWER,
|
||||
PS_STATE_AWAKE,
|
||||
PS_STATE_PRE_SLEEP,
|
||||
PS_STATE_SLEEP
|
||||
};
|
||||
|
||||
/** DNLD_STATE */
|
||||
enum DNLD_STATE {
|
||||
DNLD_RES_RECEIVED,
|
||||
DNLD_DATA_SENT,
|
||||
DNLD_CMD_SENT
|
||||
};
|
||||
|
||||
/** WLAN_MEDIA_STATE */
|
||||
enum WLAN_MEDIA_STATE {
|
||||
libertas_connected,
|
||||
libertas_disconnected
|
||||
};
|
||||
|
||||
/** WLAN_802_11_PRIVACY_FILTER */
|
||||
enum WLAN_802_11_PRIVACY_FILTER {
|
||||
wlan802_11privfilteracceptall,
|
||||
wlan802_11privfilter8021xWEP
|
||||
};
|
||||
|
||||
/** mv_ms_type */
|
||||
enum mv_ms_type {
|
||||
MVMS_DAT = 0,
|
||||
MVMS_CMD = 1,
|
||||
MVMS_TXDONE = 2,
|
||||
MVMS_EVENT
|
||||
};
|
||||
|
||||
/** WLAN_802_11_NETWORK_INFRASTRUCTURE */
|
||||
enum WLAN_802_11_NETWORK_INFRASTRUCTURE {
|
||||
wlan802_11ibss,
|
||||
wlan802_11infrastructure,
|
||||
wlan802_11autounknown,
|
||||
/*defined as upper bound */
|
||||
wlan802_11infrastructuremax
|
||||
};
|
||||
|
||||
/** WLAN_802_11_AUTHENTICATION_MODE */
|
||||
enum WLAN_802_11_AUTHENTICATION_MODE {
|
||||
wlan802_11authmodeopen = 0x00,
|
||||
wlan802_11authmodeshared = 0x01,
|
||||
wlan802_11authmodenetworkEAP = 0x80,
|
||||
};
|
||||
|
||||
/** WLAN_802_11_WEP_STATUS */
|
||||
enum WLAN_802_11_WEP_STATUS {
|
||||
wlan802_11WEPenabled,
|
||||
wlan802_11WEPdisabled,
|
||||
};
|
||||
|
||||
/** SNMP_MIB_INDEX_e */
|
||||
enum SNMP_MIB_INDEX_e {
|
||||
desired_bsstype_i = 0,
|
||||
op_rateset_i,
|
||||
bcnperiod_i,
|
||||
dtimperiod_i,
|
||||
assocrsp_timeout_i,
|
||||
rtsthresh_i,
|
||||
short_retrylim_i,
|
||||
long_retrylim_i,
|
||||
fragthresh_i,
|
||||
dot11d_i,
|
||||
dot11h_i,
|
||||
manufid_i,
|
||||
prodID_i,
|
||||
manuf_oui_i,
|
||||
manuf_name_i,
|
||||
manuf_prodname_i,
|
||||
manuf_prodver_i,
|
||||
};
|
||||
|
||||
/** KEY_TYPE_ID */
|
||||
enum KEY_TYPE_ID {
|
||||
KEY_TYPE_ID_WEP = 0,
|
||||
KEY_TYPE_ID_TKIP,
|
||||
KEY_TYPE_ID_AES
|
||||
};
|
||||
|
||||
/** KEY_INFO_WPA (applies to both TKIP and AES/CCMP) */
|
||||
enum KEY_INFO_WPA {
|
||||
KEY_INFO_WPA_MCAST = 0x01,
|
||||
KEY_INFO_WPA_UNICAST = 0x02,
|
||||
KEY_INFO_WPA_ENABLED = 0x04
|
||||
};
|
||||
|
||||
/** SNMP_MIB_VALUE_e */
|
||||
enum SNMP_MIB_VALUE_e {
|
||||
SNMP_MIB_VALUE_INFRA = 1,
|
||||
SNMP_MIB_VALUE_ADHOC
|
||||
};
|
||||
|
||||
/* Default values for fwt commands. */
|
||||
#define FWT_DEFAULT_METRIC 0
|
||||
#define FWT_DEFAULT_DIR 1
|
||||
#define FWT_DEFAULT_SSN 0xffffffff
|
||||
#define FWT_DEFAULT_DSN 0
|
||||
#define FWT_DEFAULT_HOPCOUNT 0
|
||||
#define FWT_DEFAULT_TTL 0
|
||||
#define FWT_DEFAULT_EXPIRATION 0
|
||||
#define FWT_DEFAULT_SLEEPMODE 0
|
||||
#define FWT_DEFAULT_SNR 0
|
||||
|
||||
#endif /* _WLAN_DEFS_H_ */
|
||||
403
drivers/net/wireless/libertas/dev.h
Normal file
403
drivers/net/wireless/libertas/dev.h
Normal file
|
|
@ -0,0 +1,403 @@
|
|||
/**
|
||||
* This file contains definitions and data structures specific
|
||||
* to Marvell 802.11 NIC. It contains the Device Information
|
||||
* structure wlan_adapter.
|
||||
*/
|
||||
#ifndef _WLAN_DEV_H_
|
||||
#define _WLAN_DEV_H_
|
||||
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/wireless.h>
|
||||
#include <linux/ethtool.h>
|
||||
#include <linux/debugfs.h>
|
||||
|
||||
#include "defs.h"
|
||||
#include "scan.h"
|
||||
#include "thread.h"
|
||||
|
||||
extern struct ethtool_ops libertas_ethtool_ops;
|
||||
|
||||
#define MAX_BSSID_PER_CHANNEL 16
|
||||
|
||||
#define NR_TX_QUEUE 3
|
||||
|
||||
/* For the extended Scan */
|
||||
#define MAX_EXTENDED_SCAN_BSSID_LIST MAX_BSSID_PER_CHANNEL * \
|
||||
MRVDRV_MAX_CHANNEL_SIZE + 1
|
||||
|
||||
#define MAX_REGION_CHANNEL_NUM 2
|
||||
|
||||
/** Chan-freq-TxPower mapping table*/
|
||||
struct chan_freq_power {
|
||||
/** channel Number */
|
||||
u16 channel;
|
||||
/** frequency of this channel */
|
||||
u32 freq;
|
||||
/** Max allowed Tx power level */
|
||||
u16 maxtxpower;
|
||||
/** TRUE:channel unsupported; FLASE:supported*/
|
||||
u8 unsupported;
|
||||
};
|
||||
|
||||
/** region-band mapping table*/
|
||||
struct region_channel {
|
||||
/** TRUE if this entry is valid */
|
||||
u8 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*/
|
||||
struct chan_freq_power *CFP;
|
||||
};
|
||||
|
||||
struct wlan_802_11_security {
|
||||
u8 WPAenabled;
|
||||
u8 WPA2enabled;
|
||||
enum WLAN_802_11_WEP_STATUS WEPstatus;
|
||||
enum WLAN_802_11_AUTHENTICATION_MODE authmode;
|
||||
enum WLAN_802_1X_AUTH_ALG auth1xalg;
|
||||
enum WLAN_802_11_ENCRYPTION_MODE Encryptionmode;
|
||||
};
|
||||
|
||||
/** Current Basic Service Set State Structure */
|
||||
struct current_bss_params {
|
||||
struct bss_descriptor bssdescriptor;
|
||||
/** bssid */
|
||||
u8 bssid[ETH_ALEN];
|
||||
/** ssid */
|
||||
struct WLAN_802_11_SSID ssid;
|
||||
|
||||
/** band */
|
||||
u8 band;
|
||||
/** channel */
|
||||
u8 channel;
|
||||
/** number of rates supported */
|
||||
int numofrates;
|
||||
/** supported rates*/
|
||||
u8 datarates[WLAN_SUPPORTED_RATES];
|
||||
};
|
||||
|
||||
/** sleep_params */
|
||||
struct sleep_params {
|
||||
u16 sp_error;
|
||||
u16 sp_offset;
|
||||
u16 sp_stabletime;
|
||||
u8 sp_calcontrol;
|
||||
u8 sp_extsleepclk;
|
||||
u16 sp_reserved;
|
||||
};
|
||||
|
||||
/** Data structure for the Marvell WLAN device */
|
||||
typedef struct _wlan_dev {
|
||||
/** device name */
|
||||
char name[DEV_NAME_LEN];
|
||||
/** card pointer */
|
||||
void *card;
|
||||
/** 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;
|
||||
/* 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;
|
||||
|
||||
/* Mesh statistics */
|
||||
struct wlan_mesh_stats {
|
||||
u32 fwd_bcast_cnt; /* Fwd: Broadcast counter */
|
||||
u32 fwd_unicast_cnt; /* Fwd: Unicast counter */
|
||||
u32 fwd_drop_ttl; /* Fwd: TTL zero */
|
||||
u32 fwd_drop_rbt; /* Fwd: Recently Broadcasted */
|
||||
u32 fwd_drop_noroute; /* Fwd: No route to Destination */
|
||||
u32 fwd_drop_nobuf; /* Fwd: Run out of internal buffers */
|
||||
u32 drop_blind; /* Rx: Dropped by blinding table */
|
||||
};
|
||||
|
||||
/** Private structure for the MV device */
|
||||
struct _wlan_private {
|
||||
int open;
|
||||
int mesh_open;
|
||||
int infra_open;
|
||||
|
||||
wlan_adapter *adapter;
|
||||
wlan_dev_t wlan_dev;
|
||||
|
||||
struct net_device_stats stats;
|
||||
struct net_device *mesh_dev ; /* Virtual device */
|
||||
|
||||
struct iw_statistics wstats;
|
||||
struct wlan_mesh_stats mstats;
|
||||
struct dentry *debugfs_dir;
|
||||
struct dentry *debugfs_debug;
|
||||
struct dentry *debugfs_files[6];
|
||||
|
||||
struct dentry *events_dir;
|
||||
struct dentry *debugfs_events_files[6];
|
||||
|
||||
struct dentry *regs_dir;
|
||||
struct dentry *debugfs_regs_files[6];
|
||||
|
||||
u32 mac_offset;
|
||||
u32 bbp_offset;
|
||||
u32 rf_offset;
|
||||
|
||||
const struct firmware *firmware;
|
||||
struct device *hotplug_device;
|
||||
|
||||
/** thread to service interrupts */
|
||||
struct wlan_thread mainthread;
|
||||
|
||||
struct delayed_work assoc_work;
|
||||
struct workqueue_struct *assoc_thread;
|
||||
};
|
||||
|
||||
/** Association request
|
||||
*
|
||||
* Encapsulates all the options that describe a specific assocation request
|
||||
* or configuration of the wireless card's radio, mode, and security settings.
|
||||
*/
|
||||
struct assoc_request {
|
||||
#define ASSOC_FLAG_SSID 1
|
||||
#define ASSOC_FLAG_CHANNEL 2
|
||||
#define ASSOC_FLAG_MODE 3
|
||||
#define ASSOC_FLAG_BSSID 4
|
||||
#define ASSOC_FLAG_WEP_KEYS 5
|
||||
#define ASSOC_FLAG_WEP_TX_KEYIDX 6
|
||||
#define ASSOC_FLAG_WPA_MCAST_KEY 7
|
||||
#define ASSOC_FLAG_WPA_UCAST_KEY 8
|
||||
#define ASSOC_FLAG_SECINFO 9
|
||||
#define ASSOC_FLAG_WPA_IE 10
|
||||
unsigned long flags;
|
||||
|
||||
struct WLAN_802_11_SSID ssid;
|
||||
u8 channel;
|
||||
enum WLAN_802_11_NETWORK_INFRASTRUCTURE mode;
|
||||
u8 bssid[ETH_ALEN];
|
||||
|
||||
/** WEP keys */
|
||||
struct WLAN_802_11_KEY wep_keys[4];
|
||||
u16 wep_tx_keyidx;
|
||||
|
||||
/** WPA keys */
|
||||
struct WLAN_802_11_KEY wpa_mcast_key;
|
||||
struct WLAN_802_11_KEY wpa_unicast_key;
|
||||
|
||||
struct wlan_802_11_security secinfo;
|
||||
|
||||
/** WPA Information Elements*/
|
||||
#define MAX_WPA_IE_LEN 64
|
||||
u8 wpa_ie[MAX_WPA_IE_LEN];
|
||||
u8 wpa_ie_len;
|
||||
};
|
||||
|
||||
/** Wlan adapter data structure*/
|
||||
struct _wlan_adapter {
|
||||
/** STATUS variables */
|
||||
u32 fwreleasenumber;
|
||||
u32 fwcapinfo;
|
||||
/* protected with big lock */
|
||||
|
||||
struct mutex lock;
|
||||
|
||||
u8 tmptxbuf[WLAN_UPLD_SIZE];
|
||||
/* protected by hard_start_xmit serialization */
|
||||
|
||||
/** command-related variables */
|
||||
u16 seqnum;
|
||||
/* protected by big lock */
|
||||
|
||||
struct cmd_ctrl_node *cmd_array;
|
||||
/** Current command */
|
||||
struct cmd_ctrl_node *cur_cmd;
|
||||
int cur_cmd_retcode;
|
||||
/** command Queues */
|
||||
/** Free command buffers */
|
||||
struct list_head cmdfreeq;
|
||||
/** Pending command buffers */
|
||||
struct list_head cmdpendingq;
|
||||
|
||||
wait_queue_head_t cmd_pending;
|
||||
u8 nr_cmd_pending;
|
||||
/* command related variables protected by adapter->driver_lock */
|
||||
|
||||
/** Async and Sync Event variables */
|
||||
u32 intcounter;
|
||||
u32 eventcause;
|
||||
u8 nodename[16]; /* nickname */
|
||||
|
||||
/** spin locks */
|
||||
spinlock_t driver_lock;
|
||||
|
||||
/** Timers */
|
||||
struct timer_list command_timer;
|
||||
|
||||
/* TX queue used in PS mode */
|
||||
spinlock_t txqueue_lock;
|
||||
struct sk_buff *tx_queue_ps[NR_TX_QUEUE];
|
||||
unsigned int tx_queue_idx;
|
||||
|
||||
u8 hisregcpy;
|
||||
|
||||
/** current ssid/bssid related parameters*/
|
||||
struct current_bss_params curbssparams;
|
||||
|
||||
enum WLAN_802_11_NETWORK_INFRASTRUCTURE inframode;
|
||||
|
||||
struct bss_descriptor *pattemptedbssdesc;
|
||||
|
||||
struct WLAN_802_11_SSID previousssid;
|
||||
u8 previousbssid[ETH_ALEN];
|
||||
|
||||
struct bss_descriptor *scantable;
|
||||
u32 numinscantable;
|
||||
|
||||
u8 scantype;
|
||||
u32 scanmode;
|
||||
|
||||
u16 beaconperiod;
|
||||
u8 adhoccreate;
|
||||
|
||||
/** capability Info used in Association, start, join */
|
||||
struct ieeetypes_capinfo capinfo;
|
||||
|
||||
/** MAC address information */
|
||||
u8 current_addr[ETH_ALEN];
|
||||
u8 multicastlist[MRVDRV_MAX_MULTICAST_LIST_SIZE][ETH_ALEN];
|
||||
u32 nr_of_multicastmacaddr;
|
||||
|
||||
/** 802.11 statistics */
|
||||
// struct cmd_DS_802_11_GET_STAT wlan802_11Stat;
|
||||
|
||||
u16 enablehwauto;
|
||||
u16 ratebitmap;
|
||||
/** control G rates */
|
||||
u8 adhoc_grate_enabled;
|
||||
|
||||
u32 txantenna;
|
||||
u32 rxantenna;
|
||||
|
||||
u8 adhocchannel;
|
||||
u32 fragthsd;
|
||||
u32 rtsthsd;
|
||||
|
||||
u32 datarate;
|
||||
u8 is_datarate_auto;
|
||||
|
||||
u16 listeninterval;
|
||||
u16 prescan;
|
||||
u8 txretrycount;
|
||||
|
||||
/** Tx-related variables (for single packet tx) */
|
||||
struct sk_buff *currenttxskb;
|
||||
u16 TxLockFlag;
|
||||
|
||||
/** NIC Operation characteristics */
|
||||
u16 currentpacketfilter;
|
||||
u32 connect_status;
|
||||
u16 regioncode;
|
||||
u16 regiontableindex;
|
||||
u16 txpowerlevel;
|
||||
|
||||
/** POWER MANAGEMENT AND PnP SUPPORT */
|
||||
u8 surpriseremoved;
|
||||
u16 atimwindow;
|
||||
|
||||
u16 psmode; /* Wlan802_11PowermodeCAM=disable
|
||||
Wlan802_11PowermodeMAX_PSP=enable */
|
||||
u16 multipledtim;
|
||||
u32 psstate;
|
||||
u8 needtowakeup;
|
||||
|
||||
struct PS_CMD_ConfirmSleep libertas_ps_confirm_sleep;
|
||||
u16 locallisteninterval;
|
||||
u16 nullpktinterval;
|
||||
|
||||
struct assoc_request * assoc_req;
|
||||
|
||||
/** Encryption parameter */
|
||||
struct wlan_802_11_security secinfo;
|
||||
|
||||
/** WEP keys */
|
||||
struct WLAN_802_11_KEY wep_keys[4];
|
||||
u16 wep_tx_keyidx;
|
||||
|
||||
/** WPA keys */
|
||||
struct WLAN_802_11_KEY wpa_mcast_key;
|
||||
struct WLAN_802_11_KEY wpa_unicast_key;
|
||||
|
||||
/** WPA Information Elements*/
|
||||
#define MAX_WPA_IE_LEN 64
|
||||
u8 wpa_ie[MAX_WPA_IE_LEN];
|
||||
u8 wpa_ie_len;
|
||||
|
||||
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;
|
||||
u16 rxpd_rate;
|
||||
|
||||
u8 radioon;
|
||||
u32 preamble;
|
||||
|
||||
/** Multi bands Parameter*/
|
||||
u8 libertas_supported_rates[G_SUPPORTED_RATES];
|
||||
|
||||
/** Blue Tooth Co-existence Arbitration */
|
||||
|
||||
/** sleep_params */
|
||||
struct sleep_params sp;
|
||||
|
||||
/** RF calibration data */
|
||||
|
||||
#define MAX_REGION_CHANNEL_NUM 2
|
||||
/** region channel data */
|
||||
struct region_channel region_channel[MAX_REGION_CHANNEL_NUM];
|
||||
|
||||
struct region_channel universal_channel[MAX_REGION_CHANNEL_NUM];
|
||||
|
||||
/** 11D and Domain Regulatory Data */
|
||||
struct wlan_802_11d_domain_reg domainreg;
|
||||
struct parsed_region_chan_11d parsed_region_chan;
|
||||
|
||||
/** FSM variable for 11d support */
|
||||
u32 enable11d;
|
||||
|
||||
/** MISCELLANEOUS */
|
||||
u8 *prdeeprom;
|
||||
struct wlan_offset_value offsetvalue;
|
||||
|
||||
struct cmd_ds_802_11_get_log logmsg;
|
||||
u16 scanprobes;
|
||||
|
||||
u32 pkttxctrl;
|
||||
|
||||
u16 txrate;
|
||||
u32 linkmode;
|
||||
u32 radiomode;
|
||||
u32 debugmode;
|
||||
u8 fw_ready;
|
||||
};
|
||||
|
||||
#endif /* _WLAN_DEV_H_ */
|
||||
184
drivers/net/wireless/libertas/ethtool.c
Normal file
184
drivers/net/wireless/libertas/ethtool.c
Normal file
|
|
@ -0,0 +1,184 @@
|
|||
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/ethtool.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#include "host.h"
|
||||
#include "sbi.h"
|
||||
#include "decl.h"
|
||||
#include "defs.h"
|
||||
#include "dev.h"
|
||||
#include "join.h"
|
||||
#include "wext.h"
|
||||
static const char * mesh_stat_strings[]= {
|
||||
"drop_duplicate_bcast",
|
||||
"drop_ttl_zero",
|
||||
"drop_no_fwd_route",
|
||||
"drop_no_buffers",
|
||||
"fwded_unicast_cnt",
|
||||
"fwded_bcast_cnt",
|
||||
"drop_blind_table"
|
||||
};
|
||||
|
||||
static void libertas_ethtool_get_drvinfo(struct net_device *dev,
|
||||
struct ethtool_drvinfo *info)
|
||||
{
|
||||
wlan_private *priv = (wlan_private *) dev->priv;
|
||||
char fwver[32];
|
||||
|
||||
libertas_get_fwversion(priv->adapter, fwver, sizeof(fwver) - 1);
|
||||
|
||||
strcpy(info->driver, "libertas");
|
||||
strcpy(info->version, libertas_driver_version);
|
||||
strcpy(info->fw_version, fwver);
|
||||
}
|
||||
|
||||
/* All 8388 parts have 16KiB EEPROM size at the time of writing.
|
||||
* In case that changes this needs fixing.
|
||||
*/
|
||||
#define LIBERTAS_EEPROM_LEN 16384
|
||||
|
||||
static int libertas_ethtool_get_eeprom_len(struct net_device *dev)
|
||||
{
|
||||
return LIBERTAS_EEPROM_LEN;
|
||||
}
|
||||
|
||||
static int libertas_ethtool_get_eeprom(struct net_device *dev,
|
||||
struct ethtool_eeprom *eeprom, u8 * bytes)
|
||||
{
|
||||
wlan_private *priv = (wlan_private *) dev->priv;
|
||||
wlan_adapter *adapter = priv->adapter;
|
||||
struct wlan_ioctl_regrdwr regctrl;
|
||||
char *ptr;
|
||||
int ret;
|
||||
|
||||
regctrl.action = 0;
|
||||
regctrl.offset = eeprom->offset;
|
||||
regctrl.NOB = eeprom->len;
|
||||
|
||||
if (eeprom->offset + eeprom->len > LIBERTAS_EEPROM_LEN)
|
||||
return -EINVAL;
|
||||
|
||||
// mutex_lock(&priv->mutex);
|
||||
|
||||
adapter->prdeeprom =
|
||||
(char *)kmalloc(eeprom->len+sizeof(regctrl), GFP_KERNEL);
|
||||
if (!adapter->prdeeprom)
|
||||
return -ENOMEM;
|
||||
memcpy(adapter->prdeeprom, ®ctrl, sizeof(regctrl));
|
||||
|
||||
/* +14 is for action, offset, and NOB in
|
||||
* response */
|
||||
lbs_pr_debug(1, "action:%d offset: %x NOB: %02x\n",
|
||||
regctrl.action, regctrl.offset, regctrl.NOB);
|
||||
|
||||
ret = libertas_prepare_and_send_command(priv,
|
||||
cmd_802_11_eeprom_access,
|
||||
regctrl.action,
|
||||
cmd_option_waitforrsp, 0,
|
||||
®ctrl);
|
||||
|
||||
if (ret) {
|
||||
if (adapter->prdeeprom)
|
||||
kfree(adapter->prdeeprom);
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
mdelay(10);
|
||||
|
||||
ptr = (char *)adapter->prdeeprom;
|
||||
|
||||
/* skip the command header, but include the "value" u32 variable */
|
||||
ptr = ptr + sizeof(struct wlan_ioctl_regrdwr) - 4;
|
||||
|
||||
/*
|
||||
* Return the result back to the user
|
||||
*/
|
||||
memcpy(bytes, ptr, eeprom->len);
|
||||
|
||||
if (adapter->prdeeprom)
|
||||
kfree(adapter->prdeeprom);
|
||||
// mutex_unlock(&priv->mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void libertas_ethtool_get_stats(struct net_device * dev,
|
||||
struct ethtool_stats * stats, u64 * data)
|
||||
{
|
||||
wlan_private *priv = dev->priv;
|
||||
|
||||
ENTER();
|
||||
|
||||
stats->cmd = ETHTOOL_GSTATS;
|
||||
BUG_ON(stats->n_stats != MESH_STATS_NUM);
|
||||
|
||||
data[0] = priv->mstats.fwd_drop_rbt;
|
||||
data[1] = priv->mstats.fwd_drop_ttl;
|
||||
data[2] = priv->mstats.fwd_drop_noroute;
|
||||
data[3] = priv->mstats.fwd_drop_nobuf;
|
||||
data[4] = priv->mstats.fwd_unicast_cnt;
|
||||
data[5] = priv->mstats.fwd_bcast_cnt;
|
||||
data[6] = priv->mstats.drop_blind;
|
||||
|
||||
LEAVE();
|
||||
}
|
||||
|
||||
static int libertas_ethtool_get_stats_count(struct net_device * dev)
|
||||
{
|
||||
int ret;
|
||||
wlan_private *priv = dev->priv;
|
||||
struct cmd_ds_mesh_access mesh_access;
|
||||
|
||||
ENTER();
|
||||
/* Get Mesh Statistics */
|
||||
ret = libertas_prepare_and_send_command(priv,
|
||||
cmd_mesh_access, cmd_act_mesh_get_stats,
|
||||
cmd_option_waitforrsp, 0, &mesh_access);
|
||||
|
||||
if (ret) {
|
||||
LEAVE();
|
||||
return 0;
|
||||
}
|
||||
|
||||
priv->mstats.fwd_drop_rbt = mesh_access.data[0];
|
||||
priv->mstats.fwd_drop_ttl = mesh_access.data[1];
|
||||
priv->mstats.fwd_drop_noroute = mesh_access.data[2];
|
||||
priv->mstats.fwd_drop_nobuf = mesh_access.data[3];
|
||||
priv->mstats.fwd_unicast_cnt = mesh_access.data[4];
|
||||
priv->mstats.fwd_bcast_cnt = mesh_access.data[5];
|
||||
priv->mstats.drop_blind = mesh_access.data[6];
|
||||
|
||||
LEAVE();
|
||||
return MESH_STATS_NUM;
|
||||
}
|
||||
|
||||
static void libertas_ethtool_get_strings (struct net_device * dev,
|
||||
u32 stringset,
|
||||
u8 * s)
|
||||
{
|
||||
int i;
|
||||
|
||||
ENTER();
|
||||
switch (stringset) {
|
||||
case ETH_SS_STATS:
|
||||
for (i=0; i < MESH_STATS_NUM; i++) {
|
||||
memcpy(s + i * ETH_GSTRING_LEN,
|
||||
mesh_stat_strings[i],
|
||||
ETH_GSTRING_LEN);
|
||||
}
|
||||
break;
|
||||
}
|
||||
LEAVE();
|
||||
}
|
||||
|
||||
struct ethtool_ops libertas_ethtool_ops = {
|
||||
.get_drvinfo = libertas_ethtool_get_drvinfo,
|
||||
.get_eeprom = libertas_ethtool_get_eeprom,
|
||||
.get_eeprom_len = libertas_ethtool_get_eeprom_len,
|
||||
.get_stats_count = libertas_ethtool_get_stats_count,
|
||||
.get_ethtool_stats = libertas_ethtool_get_stats,
|
||||
.get_strings = libertas_ethtool_get_strings,
|
||||
};
|
||||
|
||||
361
drivers/net/wireless/libertas/fw.c
Normal file
361
drivers/net/wireless/libertas/fw.c
Normal file
|
|
@ -0,0 +1,361 @@
|
|||
/**
|
||||
* This file contains the initialization for FW and HW
|
||||
*/
|
||||
#include <linux/module.h>
|
||||
#include <linux/moduleparam.h>
|
||||
|
||||
#include <linux/vmalloc.h>
|
||||
#include <linux/firmware.h>
|
||||
#include <linux/version.h>
|
||||
|
||||
#include "host.h"
|
||||
#include "sbi.h"
|
||||
#include "defs.h"
|
||||
#include "decl.h"
|
||||
#include "dev.h"
|
||||
#include "fw.h"
|
||||
#include "wext.h"
|
||||
#include "if_usb.h"
|
||||
|
||||
char *libertas_fw_name = NULL;
|
||||
module_param_named(fw_name, libertas_fw_name, charp, 0644);
|
||||
|
||||
unsigned int libertas_debug = 0;
|
||||
module_param(libertas_debug, int, 0);
|
||||
|
||||
/**
|
||||
* @brief This function checks the validity of Boot2/FW image.
|
||||
*
|
||||
* @param data pointer to image
|
||||
* len image length
|
||||
* @return 0 or -1
|
||||
*/
|
||||
static int check_fwfile_format(u8 *data, u32 totlen)
|
||||
{
|
||||
u8 bincmd, exit;
|
||||
u32 blksize, offset, len;
|
||||
int ret;
|
||||
|
||||
ret = 1;
|
||||
exit = len = 0;
|
||||
|
||||
do {
|
||||
bincmd = *data;
|
||||
blksize = *(u32*)(data + offsetof(struct fwheader, datalength));
|
||||
switch (bincmd) {
|
||||
case FW_HAS_DATA_TO_RECV:
|
||||
offset = sizeof(struct fwheader) + blksize;
|
||||
data += offset;
|
||||
len += offset;
|
||||
if (len >= totlen)
|
||||
exit = 1;
|
||||
break;
|
||||
case FW_HAS_LAST_BLOCK:
|
||||
exit = 1;
|
||||
ret = 0;
|
||||
break;
|
||||
default:
|
||||
exit = 1;
|
||||
break;
|
||||
}
|
||||
} while (!exit);
|
||||
|
||||
if (ret)
|
||||
lbs_pr_err("bin file format check FAIL...\n");
|
||||
else
|
||||
lbs_pr_debug(1, "bin file format check PASS...\n");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @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 0 or -1
|
||||
*/
|
||||
static int wlan_setup_station_hw(wlan_private * priv)
|
||||
{
|
||||
int ret = -1;
|
||||
wlan_adapter *adapter = priv->adapter;
|
||||
|
||||
ENTER();
|
||||
|
||||
if ((ret = request_firmware(&priv->firmware, libertas_fw_name,
|
||||
priv->hotplug_device)) < 0) {
|
||||
lbs_pr_err("request_firmware() failed, error code = %#x\n",
|
||||
ret);
|
||||
lbs_pr_err("%s not found in /lib/firmware\n", libertas_fw_name);
|
||||
goto done;
|
||||
}
|
||||
|
||||
if(check_fwfile_format(priv->firmware->data, priv->firmware->size)) {
|
||||
release_firmware(priv->firmware);
|
||||
goto done;
|
||||
}
|
||||
|
||||
ret = libertas_sbi_prog_firmware(priv);
|
||||
|
||||
release_firmware(priv->firmware);
|
||||
|
||||
if (ret) {
|
||||
lbs_pr_debug(1, "Bootloader in invalid state!\n");
|
||||
ret = -1;
|
||||
goto done;
|
||||
}
|
||||
|
||||
/*
|
||||
* Read MAC address from HW
|
||||
*/
|
||||
memset(adapter->current_addr, 0xff, ETH_ALEN);
|
||||
|
||||
ret = libertas_prepare_and_send_command(priv, cmd_get_hw_spec,
|
||||
0, cmd_option_waitforrsp, 0, NULL);
|
||||
|
||||
if (ret) {
|
||||
ret = -1;
|
||||
goto done;
|
||||
}
|
||||
|
||||
libertas_set_mac_packet_filter(priv);
|
||||
|
||||
/* Get the supported Data rates */
|
||||
ret = libertas_prepare_and_send_command(priv, cmd_802_11_data_rate,
|
||||
cmd_act_get_tx_rate,
|
||||
cmd_option_waitforrsp, 0, NULL);
|
||||
|
||||
if (ret) {
|
||||
ret = -1;
|
||||
goto done;
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
done:
|
||||
LEAVE();
|
||||
|
||||
return (ret);
|
||||
}
|
||||
|
||||
static int wlan_allocate_adapter(wlan_private * priv)
|
||||
{
|
||||
u32 ulbufsize;
|
||||
wlan_adapter *adapter = priv->adapter;
|
||||
|
||||
struct bss_descriptor *ptempscantable;
|
||||
|
||||
/* Allocate buffer to store the BSSID list */
|
||||
ulbufsize = sizeof(struct bss_descriptor) * MRVDRV_MAX_BSSID_LIST;
|
||||
if (!(ptempscantable = kmalloc(ulbufsize, GFP_KERNEL))) {
|
||||
libertas_free_adapter(priv);
|
||||
return -1;
|
||||
}
|
||||
|
||||
adapter->scantable = ptempscantable;
|
||||
memset(adapter->scantable, 0, ulbufsize);
|
||||
|
||||
/* Allocate the command buffers */
|
||||
libertas_allocate_cmd_buffer(priv);
|
||||
|
||||
memset(&adapter->libertas_ps_confirm_sleep, 0, sizeof(struct PS_CMD_ConfirmSleep));
|
||||
adapter->libertas_ps_confirm_sleep.seqnum = cpu_to_le16(++adapter->seqnum);
|
||||
adapter->libertas_ps_confirm_sleep.command =
|
||||
cpu_to_le16(cmd_802_11_ps_mode);
|
||||
adapter->libertas_ps_confirm_sleep.size =
|
||||
cpu_to_le16(sizeof(struct PS_CMD_ConfirmSleep));
|
||||
adapter->libertas_ps_confirm_sleep.result = 0;
|
||||
adapter->libertas_ps_confirm_sleep.action =
|
||||
cpu_to_le16(cmd_subcmd_sleep_confirmed);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
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->connect_status = libertas_disconnected;
|
||||
memset(adapter->current_addr, 0xff, ETH_ALEN);
|
||||
|
||||
/* scan type */
|
||||
adapter->scantype = cmd_scan_type_active;
|
||||
|
||||
/* scan mode */
|
||||
adapter->scanmode = cmd_bss_type_any;
|
||||
|
||||
/* 802.11 specific */
|
||||
adapter->secinfo.WEPstatus = wlan802_11WEPdisabled;
|
||||
for (i = 0; i < sizeof(adapter->wep_keys) / sizeof(adapter->wep_keys[0]);
|
||||
i++)
|
||||
memset(&adapter->wep_keys[i], 0, sizeof(struct WLAN_802_11_KEY));
|
||||
adapter->wep_tx_keyidx = 0;
|
||||
adapter->secinfo.WEPstatus = wlan802_11WEPdisabled;
|
||||
adapter->secinfo.authmode = wlan802_11authmodeopen;
|
||||
adapter->secinfo.auth1xalg = WLAN_1X_AUTH_ALG_NONE;
|
||||
adapter->secinfo.Encryptionmode = CIPHER_NONE;
|
||||
adapter->inframode = wlan802_11infrastructure;
|
||||
|
||||
adapter->assoc_req = NULL;
|
||||
|
||||
adapter->numinscantable = 0;
|
||||
adapter->pattemptedbssdesc = NULL;
|
||||
mutex_init(&adapter->lock);
|
||||
|
||||
adapter->prescan = 1;
|
||||
|
||||
memset(&adapter->curbssparams, 0, sizeof(adapter->curbssparams));
|
||||
|
||||
/* PnP and power profile */
|
||||
adapter->surpriseremoved = 0;
|
||||
|
||||
adapter->currentpacketfilter =
|
||||
cmd_act_mac_rx_on | cmd_act_mac_tx_on;
|
||||
|
||||
adapter->radioon = RADIO_ON;
|
||||
adapter->txantenna = RF_ANTENNA_2;
|
||||
adapter->rxantenna = RF_ANTENNA_AUTO;
|
||||
|
||||
adapter->is_datarate_auto = 1;
|
||||
adapter->beaconperiod = MRVDRV_BEACON_INTERVAL;
|
||||
|
||||
// set default value of capinfo.
|
||||
#define SHORT_PREAMBLE_ALLOWED 1
|
||||
memset(&adapter->capinfo, 0, sizeof(adapter->capinfo));
|
||||
adapter->capinfo.shortpreamble = SHORT_PREAMBLE_ALLOWED;
|
||||
|
||||
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 = 0;
|
||||
adapter->locallisteninterval = 0; /* default value in firmware will be used */
|
||||
|
||||
adapter->datarate = 0; // Initially indicate the rate as auto
|
||||
|
||||
adapter->adhoc_grate_enabled = 0;
|
||||
|
||||
adapter->intcounter = 0;
|
||||
|
||||
adapter->currenttxskb = NULL;
|
||||
adapter->pkttxctrl = 0;
|
||||
|
||||
memset(&adapter->tx_queue_ps, 0, NR_TX_QUEUE*sizeof(struct sk_buff*));
|
||||
adapter->tx_queue_idx = 0;
|
||||
spin_lock_init(&adapter->txqueue_lock);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
static void command_timer_fn(unsigned long data);
|
||||
|
||||
int libertas_init_fw(wlan_private * priv)
|
||||
{
|
||||
int ret = -1;
|
||||
wlan_adapter *adapter = priv->adapter;
|
||||
|
||||
ENTER();
|
||||
|
||||
/* Allocate adapter structure */
|
||||
if ((ret = wlan_allocate_adapter(priv)) != 0)
|
||||
goto done;
|
||||
|
||||
/* init adapter structure */
|
||||
wlan_init_adapter(priv);
|
||||
|
||||
/* init timer etc. */
|
||||
setup_timer(&adapter->command_timer, command_timer_fn,
|
||||
(unsigned long)priv);
|
||||
|
||||
/* download fimrware etc. */
|
||||
if ((ret = wlan_setup_station_hw(priv)) != 0) {
|
||||
del_timer_sync(&adapter->command_timer);
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* init 802.11d */
|
||||
libertas_init_11d(priv);
|
||||
|
||||
ret = 0;
|
||||
done:
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
void libertas_free_adapter(wlan_private * priv)
|
||||
{
|
||||
wlan_adapter *adapter = priv->adapter;
|
||||
|
||||
if (!adapter) {
|
||||
lbs_pr_debug(1, "Why double free adapter?:)\n");
|
||||
return;
|
||||
}
|
||||
|
||||
lbs_pr_debug(1, "Free command buffer\n");
|
||||
libertas_free_cmd_buffer(priv);
|
||||
|
||||
lbs_pr_debug(1, "Free commandTimer\n");
|
||||
del_timer(&adapter->command_timer);
|
||||
|
||||
lbs_pr_debug(1, "Free scantable\n");
|
||||
if (adapter->scantable) {
|
||||
kfree(adapter->scantable);
|
||||
adapter->scantable = NULL;
|
||||
}
|
||||
|
||||
lbs_pr_debug(1, "Free adapter\n");
|
||||
|
||||
/* Free the adapter object itself */
|
||||
kfree(adapter);
|
||||
priv->adapter = NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* This function handles the timeout of command sending.
|
||||
* It will re-send the same command again.
|
||||
*/
|
||||
static void command_timer_fn(unsigned long data)
|
||||
{
|
||||
wlan_private *priv = (wlan_private *)data;
|
||||
wlan_adapter *adapter = priv->adapter;
|
||||
struct cmd_ctrl_node *ptempnode;
|
||||
struct cmd_ds_command *cmd;
|
||||
unsigned long flags;
|
||||
|
||||
ptempnode = adapter->cur_cmd;
|
||||
cmd = (struct cmd_ds_command *)ptempnode->bufvirtualaddr;
|
||||
|
||||
lbs_pr_info("command_timer_fn fired (%x)\n", cmd->command);
|
||||
|
||||
if (!adapter->fw_ready)
|
||||
return;
|
||||
|
||||
if (ptempnode == NULL) {
|
||||
lbs_pr_debug(1, "PTempnode Empty\n");
|
||||
return;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&adapter->driver_lock, flags);
|
||||
adapter->cur_cmd = NULL;
|
||||
spin_unlock_irqrestore(&adapter->driver_lock, flags);
|
||||
|
||||
lbs_pr_debug(1, "Re-sending same command as it timeout...!\n");
|
||||
libertas_queue_cmd(adapter, ptempnode, 0);
|
||||
|
||||
wake_up_interruptible(&priv->mainthread.waitq);
|
||||
|
||||
return;
|
||||
}
|
||||
13
drivers/net/wireless/libertas/fw.h
Normal file
13
drivers/net/wireless/libertas/fw.h
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
/**
|
||||
* This header file contains FW interface related definitions.
|
||||
*/
|
||||
#ifndef _WLAN_FW_H_
|
||||
#define _WLAN_FW_H_
|
||||
|
||||
#ifndef DEV_NAME_LEN
|
||||
#define DEV_NAME_LEN 32
|
||||
#endif
|
||||
|
||||
int libertas_init_fw(wlan_private * priv);
|
||||
|
||||
#endif /* _WLAN_FW_H_ */
|
||||
338
drivers/net/wireless/libertas/host.h
Normal file
338
drivers/net/wireless/libertas/host.h
Normal file
|
|
@ -0,0 +1,338 @@
|
|||
/**
|
||||
* This file contains definitions of WLAN commands.
|
||||
*/
|
||||
|
||||
#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_SSID 0x00008002
|
||||
#define OID_802_11_INFRASTRUCTURE_MODE 0x00008008
|
||||
#define OID_802_11_FRAGMENTATION_THRESHOLD 0x00008009
|
||||
#define OID_802_11_RTS_THRESHOLD 0x0000800A
|
||||
#define OID_802_11_TX_ANTENNA_SELECTED 0x0000800D
|
||||
#define OID_802_11_SUPPORTED_RATES 0x0000800E
|
||||
#define OID_802_11_STATISTICS 0x00008012
|
||||
#define OID_802_11_TX_RETRYCOUNT 0x0000801D
|
||||
#define OID_802_11D_ENABLE 0x00008020
|
||||
|
||||
#define cmd_option_waitforrsp 0x0002
|
||||
|
||||
/** Host command ID */
|
||||
#define cmd_code_dnld 0x0002
|
||||
#define cmd_get_hw_spec 0x0003
|
||||
#define cmd_eeprom_update 0x0004
|
||||
#define cmd_802_11_reset 0x0005
|
||||
#define cmd_802_11_scan 0x0006
|
||||
#define cmd_802_11_get_log 0x000b
|
||||
#define cmd_mac_multicast_adr 0x0010
|
||||
#define cmd_802_11_authenticate 0x0011
|
||||
#define cmd_802_11_eeprom_access 0x0059
|
||||
#define cmd_802_11_associate 0x0050
|
||||
#define cmd_802_11_set_wep 0x0013
|
||||
#define cmd_802_11_get_stat 0x0014
|
||||
#define cmd_802_3_get_stat 0x0015
|
||||
#define cmd_802_11_snmp_mib 0x0016
|
||||
#define cmd_mac_reg_map 0x0017
|
||||
#define cmd_bbp_reg_map 0x0018
|
||||
#define cmd_mac_reg_access 0x0019
|
||||
#define cmd_bbp_reg_access 0x001a
|
||||
#define cmd_rf_reg_access 0x001b
|
||||
#define cmd_802_11_radio_control 0x001c
|
||||
#define cmd_802_11_rf_channel 0x001d
|
||||
#define cmd_802_11_rf_tx_power 0x001e
|
||||
#define cmd_802_11_rssi 0x001f
|
||||
#define cmd_802_11_rf_antenna 0x0020
|
||||
|
||||
#define cmd_802_11_ps_mode 0x0021
|
||||
|
||||
#define cmd_802_11_data_rate 0x0022
|
||||
#define cmd_rf_reg_map 0x0023
|
||||
#define cmd_802_11_deauthenticate 0x0024
|
||||
#define cmd_802_11_reassociate 0x0025
|
||||
#define cmd_802_11_disassociate 0x0026
|
||||
#define cmd_mac_control 0x0028
|
||||
#define cmd_802_11_ad_hoc_start 0x002b
|
||||
#define cmd_802_11_ad_hoc_join 0x002c
|
||||
|
||||
#define cmd_802_11_query_tkip_reply_cntrs 0x002e
|
||||
#define cmd_802_11_enable_rsn 0x002f
|
||||
#define cmd_802_11_pairwise_tsc 0x0036
|
||||
#define cmd_802_11_group_tsc 0x0037
|
||||
#define cmd_802_11_key_material 0x005e
|
||||
|
||||
#define cmd_802_11_set_afc 0x003c
|
||||
#define cmd_802_11_get_afc 0x003d
|
||||
|
||||
#define cmd_802_11_ad_hoc_stop 0x0040
|
||||
|
||||
#define cmd_802_11_beacon_stop 0x0049
|
||||
|
||||
#define cmd_802_11_mac_address 0x004D
|
||||
#define cmd_802_11_eeprom_access 0x0059
|
||||
|
||||
#define cmd_802_11_band_config 0x0058
|
||||
|
||||
#define cmd_802_11d_domain_info 0x005b
|
||||
|
||||
#define cmd_802_11_sleep_params 0x0066
|
||||
|
||||
#define cmd_802_11_inactivity_timeout 0x0067
|
||||
|
||||
#define cmd_802_11_tpc_cfg 0x0072
|
||||
#define cmd_802_11_pwr_cfg 0x0073
|
||||
|
||||
#define cmd_802_11_led_gpio_ctrl 0x004e
|
||||
|
||||
#define cmd_802_11_subscribe_event 0x0075
|
||||
|
||||
#define cmd_802_11_rate_adapt_rateset 0x0076
|
||||
|
||||
#define cmd_802_11_tx_rate_query 0x007f
|
||||
|
||||
#define cmd_get_tsf 0x0080
|
||||
|
||||
#define cmd_bt_access 0x0087
|
||||
#define cmd_ret_bt_access 0x8087
|
||||
|
||||
#define cmd_fwt_access 0x0088
|
||||
#define cmd_ret_fwt_access 0x8088
|
||||
|
||||
#define cmd_mesh_access 0x0090
|
||||
#define cmd_ret_mesh_access 0x8090
|
||||
|
||||
/* For the IEEE Power Save */
|
||||
#define cmd_subcmd_enter_ps 0x0030
|
||||
#define cmd_subcmd_exit_ps 0x0031
|
||||
#define cmd_subcmd_sleep_confirmed 0x0034
|
||||
#define cmd_subcmd_full_powerdown 0x0035
|
||||
#define cmd_subcmd_full_powerup 0x0036
|
||||
|
||||
/* command RET code, MSB is set to 1 */
|
||||
#define cmd_ret_hw_spec_info 0x8003
|
||||
#define cmd_ret_eeprom_update 0x8004
|
||||
#define cmd_ret_802_11_reset 0x8005
|
||||
#define cmd_ret_802_11_scan 0x8006
|
||||
#define cmd_ret_802_11_get_log 0x800b
|
||||
#define cmd_ret_mac_control 0x8028
|
||||
#define cmd_ret_mac_multicast_adr 0x8010
|
||||
#define cmd_ret_802_11_authenticate 0x8011
|
||||
#define cmd_ret_802_11_deauthenticate 0x8024
|
||||
#define cmd_ret_802_11_associate 0x8012
|
||||
#define cmd_ret_802_11_reassociate 0x8025
|
||||
#define cmd_ret_802_11_disassociate 0x8026
|
||||
#define cmd_ret_802_11_set_wep 0x8013
|
||||
#define cmd_ret_802_11_stat 0x8014
|
||||
#define cmd_ret_802_3_stat 0x8015
|
||||
#define cmd_ret_802_11_snmp_mib 0x8016
|
||||
#define cmd_ret_mac_reg_map 0x8017
|
||||
#define cmd_ret_bbp_reg_map 0x8018
|
||||
#define cmd_ret_rf_reg_map 0x8023
|
||||
#define cmd_ret_mac_reg_access 0x8019
|
||||
#define cmd_ret_bbp_reg_access 0x801a
|
||||
#define cmd_ret_rf_reg_access 0x801b
|
||||
#define cmd_ret_802_11_radio_control 0x801c
|
||||
#define cmd_ret_802_11_rf_channel 0x801d
|
||||
#define cmd_ret_802_11_rssi 0x801f
|
||||
#define cmd_ret_802_11_rf_tx_power 0x801e
|
||||
#define cmd_ret_802_11_rf_antenna 0x8020
|
||||
#define cmd_ret_802_11_ps_mode 0x8021
|
||||
#define cmd_ret_802_11_data_rate 0x8022
|
||||
|
||||
#define cmd_ret_802_11_ad_hoc_start 0x802B
|
||||
#define cmd_ret_802_11_ad_hoc_join 0x802C
|
||||
|
||||
#define cmd_ret_802_11_query_tkip_reply_cntrs 0x802e
|
||||
#define cmd_ret_802_11_enable_rsn 0x802f
|
||||
#define cmd_ret_802_11_pairwise_tsc 0x8036
|
||||
#define cmd_ret_802_11_group_tsc 0x8037
|
||||
#define cmd_ret_802_11_key_material 0x805e
|
||||
|
||||
#define cmd_enable_rsn 0x0001
|
||||
#define cmd_disable_rsn 0x0000
|
||||
|
||||
#define cmd_act_set 0x0001
|
||||
#define cmd_act_get 0x0000
|
||||
|
||||
#define cmd_act_get_AES (cmd_act_get + 2)
|
||||
#define cmd_act_set_AES (cmd_act_set + 2)
|
||||
#define cmd_act_remove_aes (cmd_act_set + 3)
|
||||
|
||||
#define cmd_ret_802_11_set_afc 0x803c
|
||||
#define cmd_ret_802_11_get_afc 0x803d
|
||||
|
||||
#define cmd_ret_802_11_ad_hoc_stop 0x8040
|
||||
|
||||
#define cmd_ret_802_11_beacon_stop 0x8049
|
||||
|
||||
#define cmd_ret_802_11_mac_address 0x804D
|
||||
#define cmd_ret_802_11_eeprom_access 0x8059
|
||||
|
||||
#define cmd_ret_802_11_band_config 0x8058
|
||||
|
||||
#define cmd_ret_802_11_sleep_params 0x8066
|
||||
|
||||
#define cmd_ret_802_11_inactivity_timeout 0x8067
|
||||
|
||||
#define cmd_ret_802_11d_domain_info (0x8000 | \
|
||||
cmd_802_11d_domain_info)
|
||||
|
||||
#define cmd_ret_802_11_tpc_cfg (cmd_802_11_tpc_cfg | 0x8000)
|
||||
#define cmd_ret_802_11_pwr_cfg (cmd_802_11_pwr_cfg | 0x8000)
|
||||
|
||||
#define cmd_ret_802_11_led_gpio_ctrl 0x804e
|
||||
|
||||
#define cmd_ret_802_11_subscribe_event (cmd_802_11_subscribe_event | 0x8000)
|
||||
|
||||
#define cmd_ret_802_11_rate_adapt_rateset (cmd_802_11_rate_adapt_rateset | 0x8000)
|
||||
|
||||
#define cmd_rte_802_11_tx_rate_query (cmd_802_11_tx_rate_query | 0x8000)
|
||||
|
||||
#define cmd_ret_get_tsf 0x8080
|
||||
|
||||
/* Define action or option for cmd_802_11_set_wep */
|
||||
#define cmd_act_add 0x0002
|
||||
#define cmd_act_remove 0x0004
|
||||
#define cmd_act_use_default 0x0008
|
||||
|
||||
#define cmd_type_wep_40_bit 0x0001
|
||||
#define cmd_type_wep_104_bit 0x0002
|
||||
|
||||
#define cmd_NUM_OF_WEP_KEYS 4
|
||||
|
||||
#define cmd_WEP_KEY_INDEX_MASK 0x3fff
|
||||
|
||||
/* Define action or option for cmd_802_11_reset */
|
||||
#define cmd_act_halt 0x0003
|
||||
|
||||
/* Define action or option for cmd_802_11_scan */
|
||||
#define cmd_bss_type_bss 0x0001
|
||||
#define cmd_bss_type_ibss 0x0002
|
||||
#define cmd_bss_type_any 0x0003
|
||||
|
||||
/* Define action or option for cmd_802_11_scan */
|
||||
#define cmd_scan_type_active 0x0000
|
||||
#define cmd_scan_type_passive 0x0001
|
||||
|
||||
#define cmd_scan_radio_type_bg 0
|
||||
|
||||
#define cmd_scan_probe_delay_time 0
|
||||
|
||||
/* Define action or option for cmd_mac_control */
|
||||
#define cmd_act_mac_rx_on 0x0001
|
||||
#define cmd_act_mac_tx_on 0x0002
|
||||
#define cmd_act_mac_loopback_on 0x0004
|
||||
#define cmd_act_mac_wep_enable 0x0008
|
||||
#define cmd_act_mac_int_enable 0x0010
|
||||
#define cmd_act_mac_multicast_enable 0x0020
|
||||
#define cmd_act_mac_broadcast_enable 0x0040
|
||||
#define cmd_act_mac_promiscuous_enable 0x0080
|
||||
#define cmd_act_mac_all_multicast_enable 0x0100
|
||||
#define cmd_act_mac_strict_protection_enable 0x0400
|
||||
|
||||
/* Define action or option for cmd_802_11_radio_control */
|
||||
#define cmd_type_auto_preamble 0x0001
|
||||
#define cmd_type_short_preamble 0x0002
|
||||
#define cmd_type_long_preamble 0x0003
|
||||
|
||||
#define TURN_ON_RF 0x01
|
||||
#define RADIO_ON 0x01
|
||||
#define RADIO_OFF 0x00
|
||||
|
||||
#define SET_AUTO_PREAMBLE 0x05
|
||||
#define SET_SHORT_PREAMBLE 0x03
|
||||
#define SET_LONG_PREAMBLE 0x01
|
||||
|
||||
/* Define action or option for CMD_802_11_RF_CHANNEL */
|
||||
#define cmd_opt_802_11_rf_channel_get 0x00
|
||||
#define cmd_opt_802_11_rf_channel_set 0x01
|
||||
|
||||
/* Define action or option for cmd_802_11_rf_tx_power */
|
||||
#define cmd_act_tx_power_opt_get 0x0000
|
||||
#define cmd_act_tx_power_opt_set_high 0x8007
|
||||
#define cmd_act_tx_power_opt_set_mid 0x8004
|
||||
#define cmd_act_tx_power_opt_set_low 0x8000
|
||||
|
||||
#define cmd_act_tx_power_index_high 0x0007
|
||||
#define cmd_act_tx_power_index_mid 0x0004
|
||||
#define cmd_act_tx_power_index_low 0x0000
|
||||
|
||||
/* Define action or option for cmd_802_11_data_rate */
|
||||
#define cmd_act_set_tx_auto 0x0000
|
||||
#define cmd_act_set_tx_fix_rate 0x0001
|
||||
#define cmd_act_get_tx_rate 0x0002
|
||||
|
||||
#define cmd_act_set_rx 0x0001
|
||||
#define cmd_act_set_tx 0x0002
|
||||
#define cmd_act_set_both 0x0003
|
||||
#define cmd_act_get_rx 0x0004
|
||||
#define cmd_act_get_tx 0x0008
|
||||
#define cmd_act_get_both 0x000c
|
||||
|
||||
/* Define action or option for cmd_802_11_ps_mode */
|
||||
#define cmd_type_cam 0x0000
|
||||
#define cmd_type_max_psp 0x0001
|
||||
#define cmd_type_fast_psp 0x0002
|
||||
|
||||
/* Define action or option for cmd_bt_access */
|
||||
enum cmd_bt_access_opts {
|
||||
/* The bt commands start at 5 instead of 1 because the old dft commands
|
||||
* are mapped to 1-4. These old commands are no longer maintained and
|
||||
* should not be called.
|
||||
*/
|
||||
cmd_act_bt_access_add = 5,
|
||||
cmd_act_bt_access_del,
|
||||
cmd_act_bt_access_list,
|
||||
cmd_act_bt_access_reset
|
||||
};
|
||||
|
||||
/* Define action or option for cmd_fwt_access */
|
||||
enum cmd_fwt_access_opts {
|
||||
cmd_act_fwt_access_add = 1,
|
||||
cmd_act_fwt_access_del,
|
||||
cmd_act_fwt_access_lookup,
|
||||
cmd_act_fwt_access_list,
|
||||
cmd_act_fwt_access_list_route,
|
||||
cmd_act_fwt_access_list_neighbor,
|
||||
cmd_act_fwt_access_reset,
|
||||
cmd_act_fwt_access_cleanup,
|
||||
cmd_act_fwt_access_time,
|
||||
};
|
||||
|
||||
/* Define action or option for cmd_mesh_access */
|
||||
enum cmd_mesh_access_opts {
|
||||
cmd_act_mesh_get_ttl = 1,
|
||||
cmd_act_mesh_set_ttl,
|
||||
cmd_act_mesh_get_stats,
|
||||
cmd_act_mesh_get_mpp,
|
||||
cmd_act_mesh_set_mpp,
|
||||
};
|
||||
|
||||
/** Card Event definition */
|
||||
#define MACREG_INT_CODE_TX_PPA_FREE 0x00000000
|
||||
#define MACREG_INT_CODE_TX_DMA_DONE 0x00000001
|
||||
#define MACREG_INT_CODE_LINK_LOSE_W_SCAN 0x00000002
|
||||
#define MACREG_INT_CODE_LINK_LOSE_NO_SCAN 0x00000003
|
||||
#define MACREG_INT_CODE_LINK_SENSED 0x00000004
|
||||
#define MACREG_INT_CODE_CMD_FINISHED 0x00000005
|
||||
#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_ADHOC_BCN_LOST 0x00000011
|
||||
#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
|
||||
|
||||
#endif /* _HOST_H_ */
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue