MA-21977 [Android-14] WCS Q1 release patch integrate

Reason:integrate WCS Q1 CF patch WiFi dirver part
Tested:imx8mq

mxm_wifiex: update to mxm6x17437 release

Corresponding firmware version:
SDIO-UART W8987 Firmware version 16.92.21.p119
PCIE-UART W8997 Firmware version 16.92.21.p119
SDIO-UART W8997 Firmware version 16.92.21.p119
SDIO-UART IW416 Firmware version 16.92.21.p119
SDIO_UART IW612 Firmware version 18.99.2.p66.12
SDIO-UART W8801 Firmware version 14.92.36.p188
SDIO-UART W9098 Firmware version 17.92.1.p149.128
PCIE-UART W9098 Firmware version 17.92.1.p149.128

Change-Id: I4f3e5ff6a2f901807562d38c67044fb0e026e77c
Signed-off-by: Sherry Sun <sherry.sun@nxp.com>
This commit is contained in:
Sherry Sun 2023-12-12 11:26:12 +08:00 committed by yunjie
parent 91f6b99cf0
commit 749db4f4b5
57 changed files with 2130 additions and 4018 deletions

View file

@ -148,6 +148,7 @@ APPDIR= $(shell if test -d "mapp"; then echo mapp; fi)
#############################################################################
ccflags-y += -I$(KERNELDIR)/include
ccflags-y += -DMLAN_RELEASE_VERSION='"437"'
ccflags-y += -DFPNUM='"92"'

View file

@ -9,7 +9,7 @@
Goto source code directory wlan_src/.
make [clean] build
The driver and utility binaries can be found in ../bin_xxxx directory.
The driver code supports Linux kernel from 2.6.32 to 6.5.4.
The driver code supports Linux kernel from 2.6.32 to 6.6.2.
2) FOR DRIVER INSTALL
@ -1066,6 +1066,13 @@
echo "tx_frame=1 0x1102 0xabababab 200" >/proc/mwlan/adapter0/config
OTP Read/Write
Example: Read OTP MAC address.
echo "otp_mac_add_rd_wr=0" > /proc/mwlan/adapter0/config
Example: Write OTP MAC addres.
echo "otp_mac_add_rd_wr=1 AA:BB:CC:DD:EE:FF" > /proc/mwlan/adapter0/config
#endif
#ifdef HS_SUPPORT

View file

@ -1443,12 +1443,7 @@ void wlan_update_11ac_cap(mlan_private *pmpriv)
*/
t_u8 wlan_11ac_bandconfig_allowed(mlan_private *pmpriv, t_u16 bss_band)
{
if (pmpriv->bss_mode == MLAN_BSS_MODE_IBSS) {
if (bss_band & BAND_G)
return (pmpriv->adapter->adhoc_start_band & BAND_GAC);
else if (bss_band & BAND_A)
return (pmpriv->adapter->adhoc_start_band & BAND_AAC);
} else {
{
if (bss_band & BAND_G)
return (pmpriv->config_bands & BAND_GAC);
else if (bss_band & BAND_A)

View file

@ -629,12 +629,7 @@ t_u16 wlan_11ax_bandconfig_allowed(mlan_private *pmpriv,
t_u16 bss_band = pbss_desc->bss_band;
if (pbss_desc->disable_11n)
return MFALSE;
if (pmpriv->bss_mode == MLAN_BSS_MODE_IBSS) {
if (bss_band & BAND_G)
return (pmpriv->adapter->adhoc_start_band & BAND_GAX);
else if (bss_band & BAND_A)
return (pmpriv->adapter->adhoc_start_band & BAND_AAX);
} else {
{
if (bss_band & BAND_G)
return (pmpriv->config_bands & BAND_GAX);
else if (bss_band & BAND_A)

View file

@ -1569,8 +1569,7 @@ mlan_status wlan_11d_cfg_domain_info(pmlan_adapter pmadapter,
else
pmadapter->region_code = 0;
if (wlan_set_regiontable(pmpriv, pmadapter->region_code,
pmadapter->config_bands |
pmadapter->adhoc_start_band)) {
pmadapter->config_bands)) {
PRINTM(MIOCTL, "Fail to set regiontabl\n");
goto done;
}
@ -1625,8 +1624,7 @@ mlan_status wlan_11d_handle_uap_domain_info(mlan_private *pmpriv, t_u16 band,
else
pmadapter->region_code = 0;
if (wlan_set_regiontable(pmpriv, pmadapter->region_code,
pmadapter->config_bands |
pmadapter->adhoc_start_band)) {
pmadapter->config_bands)) {
ret = MLAN_STATUS_FAILURE;
goto done;
}

View file

@ -156,50 +156,6 @@ static t_u32 wlan_11h_get_random_num(pmlan_adapter pmadapter)
return (usec << 16) | sec;
}
/**
* @brief Convert an IEEE formatted IE to 16-bit ID/Len NXP
* proprietary format
*
* @param pmadapter Pointer to mlan_adapter
* @param pout_buf Output parameter: Buffer to output NXP formatted IE
* @param pin_ie Pointer to IEEE IE to be converted to NXP format
*
* @return Number of bytes output to pout_buf parameter return
*/
static t_u32 wlan_11h_convert_ieee_to_mrvl_ie(mlan_adapter *pmadapter,
t_u8 *pout_buf,
const t_u8 *pin_ie)
{
MrvlIEtypesHeader_t mrvl_ie_hdr;
t_u8 *ptmp_buf = pout_buf;
ENTER();
/* Assign the Element Id and Len to the NXP struct attributes */
mrvl_ie_hdr.type = wlan_cpu_to_le16(pin_ie[0]);
mrvl_ie_hdr.len = wlan_cpu_to_le16(pin_ie[1]);
/* If the element ID is zero, return without doing any copying */
if (!mrvl_ie_hdr.type) {
LEAVE();
return 0;
}
/* Copy the header to the buffer pointer */
memcpy_ext(pmadapter, ptmp_buf, &mrvl_ie_hdr, sizeof(mrvl_ie_hdr),
sizeof(mrvl_ie_hdr));
/* Increment the temp buffer pointer by the size appended */
ptmp_buf += sizeof(mrvl_ie_hdr);
/* Append the data section of the IE; length given by the IEEE IE length
*/
memcpy_ext(pmadapter, ptmp_buf, pin_ie + 2, pin_ie[1], pin_ie[1]);
LEAVE();
/* Return the number of bytes appended to pout_buf */
return (t_u32)(sizeof(mrvl_ie_hdr) + pin_ie[1]);
}
/**
* @brief find all bonded channel.
*
@ -311,88 +267,6 @@ t_void wlan_11h_reset_dfs_checking_chan_dfs_state(mlan_private *priv,
LEAVE();
}
#ifdef STA_SUPPORT
/**
* @brief Setup the IBSS DFS element passed to the firmware in adhoc start
* and join commands
*
* The DFS Owner and recovery fields are set to be our MAC address and
* a predetermined constant recovery value. If we are joining an adhoc
* network, these values are replaced with the existing IBSS values.
* They are valid only when starting a new IBSS.
*
* The IBSS DFS Element is variable in size based on the number of
* channels supported in our current region.
*
* @param priv Private driver information structure
* @param pdfs Output parameter: Pointer to the IBSS DFS element setup by
* this function.
*
* @return
* - Length of the returned element in pdfs output parameter
* - 0 if returned element is not setup
*/
static t_u32 wlan_11h_set_ibss_dfs_ie(mlan_private *priv,
IEEEtypes_IBSS_DFS_t *pdfs)
{
t_u8 num_chans = 0;
MeasRptBasicMap_t initial_map;
mlan_adapter *adapter = priv->adapter;
ENTER();
memset(adapter, pdfs, 0x00, sizeof(IEEEtypes_IBSS_DFS_t));
/*
* A basic measurement report is included with each channel in the
* map field. Initial value for the map for each supported channel
* is with only the unmeasured bit set.
*/
memset(adapter, &initial_map, 0x00, sizeof(initial_map));
initial_map.unmeasured = 1;
/* Set the DFS Owner and recovery interval fields */
memcpy_ext(adapter, pdfs->dfs_owner, priv->curr_addr,
sizeof(pdfs->dfs_owner), sizeof(pdfs->dfs_owner));
pdfs->dfs_recovery_interval = WLAN_11H_DEFAULT_DFS_RECOVERY_INTERVAL;
for (; (num_chans < adapter->parsed_region_chan.no_of_chan) &&
(num_chans < WLAN_11H_MAX_IBSS_DFS_CHANNELS);
num_chans++) {
pdfs->channel_map[num_chans].channel_number =
adapter->parsed_region_chan.chan_pwr[num_chans].chan;
/*
* Set the initial map field with a basic measurement
*/
pdfs->channel_map[num_chans].rpt_map = initial_map;
}
/*
* If we have an established channel map, include it and return
* a valid DFS element
*/
if (num_chans) {
PRINTM(MINFO, "11h: Added %d channels to IBSS DFS Map\n",
num_chans);
pdfs->element_id = IBSS_DFS;
pdfs->len = (sizeof(pdfs->dfs_owner) +
sizeof(pdfs->dfs_recovery_interval) +
num_chans * sizeof(IEEEtypes_ChannelMap_t));
LEAVE();
return pdfs->len + sizeof(pdfs->len) + sizeof(pdfs->element_id);
}
/* Ensure the element is zeroed out for an invalid return */
memset(adapter, pdfs, 0x00, sizeof(IEEEtypes_IBSS_DFS_t));
LEAVE();
return 0;
}
#endif
/**
* @brief Setup the Supported Channel IE sent in association requests
*
@ -939,113 +813,7 @@ static t_u32 wlan_11h_process_infra_join(mlan_private *priv, t_u8 **ppbuffer,
return ret_len;
}
/**
* @brief Utility function to process a start or join to an adhoc network
*
* Add the elements to the TLV buffer needed in the start/join adhoc commands:
* - IBSS DFS IE
* - Quiet IE
*
* Also send the local constraint to the firmware in a TPC_INFO command.
*
* @param priv Private driver information structure
* @param ppbuffer Output parameter: Pointer to the TLV output buffer,
* modified on return to point after the appended 11h TLVs
* @param channel Channel on which we are starting/joining the IBSS
* @param p11h_bss_info Pointer to the 11h BSS information for this network
* that was parsed out of the scan response. NULL
* indicates we are starting the adhoc network
*
* @return Integer number of bytes appended to the TLV output
* buffer (ppbuffer)
*/
static t_u32 wlan_11h_process_adhoc(mlan_private *priv, t_u8 **ppbuffer,
t_u32 channel,
wlan_11h_bss_info_t *p11h_bss_info)
{
IEEEtypes_IBSS_DFS_t dfs_elem;
t_u32 size_appended;
t_u32 ret_len = 0;
t_s8 local_constraint = 0;
mlan_adapter *adapter = priv->adapter;
ENTER();
#ifdef STA_SUPPORT
/* Format our own IBSS DFS Element. Include our channel map fields */
wlan_11h_set_ibss_dfs_ie(priv, &dfs_elem);
#endif
if (p11h_bss_info) {
/*
* Copy the DFS Owner/Recovery Interval from the BSS
* we are joining
*/
memcpy_ext(adapter, dfs_elem.dfs_owner,
p11h_bss_info->ibss_dfs.dfs_owner,
sizeof(dfs_elem.dfs_owner),
sizeof(dfs_elem.dfs_owner));
dfs_elem.dfs_recovery_interval =
p11h_bss_info->ibss_dfs.dfs_recovery_interval;
}
/* Append the dfs element to the TLV buffer */
size_appended = wlan_11h_convert_ieee_to_mrvl_ie(
adapter, (t_u8 *)*ppbuffer, (t_u8 *)&dfs_elem);
HEXDUMP("11h: IBSS-DFS", (t_u8 *)*ppbuffer, size_appended);
*ppbuffer += size_appended;
ret_len += size_appended;
/*
* Check to see if we are joining a network. Join is indicated by the
* BSS Info pointer being valid (not NULL)
*/
if (p11h_bss_info) {
/*
* If there was a quiet element, include it in
* adhoc join command
*/
if (p11h_bss_info->quiet.element_id == QUIET) {
size_appended = wlan_11h_convert_ieee_to_mrvl_ie(
adapter, (t_u8 *)*ppbuffer,
(t_u8 *)&p11h_bss_info->quiet);
HEXDUMP("11h: Quiet", (t_u8 *)*ppbuffer, size_appended);
*ppbuffer += size_appended;
ret_len += size_appended;
}
/* Copy the local constraint from the network */
local_constraint =
p11h_bss_info->power_constraint.local_constraint;
} else {
/*
* If we are the adhoc starter, we can add a quiet element
*/
if (adapter->state_11h.quiet_ie.quiet_period) {
size_appended = wlan_11h_convert_ieee_to_mrvl_ie(
adapter, (t_u8 *)*ppbuffer,
(t_u8 *)&adapter->state_11h.quiet_ie);
HEXDUMP("11h: Quiet", (t_u8 *)*ppbuffer, size_appended);
*ppbuffer += size_appended;
ret_len += size_appended;
}
/* Use the local_constraint configured in the driver state */
local_constraint = adapter->state_11h.usr_def_power_constraint;
}
PRINTM(MINFO, "WEILIE 1: ppbuffer = %p\n", *ppbuffer);
ret_len += wlan_11h_set_local_power_constraint_tlv(
ppbuffer, (t_u8)channel, (t_u8)local_constraint,
(t_u8)priv->adapter->state_11h.min_tx_power_capability,
(t_u8)priv->adapter->state_11h.max_tx_power_capability);
PRINTM(MINFO, "WEILIE 2: ppbuffer = %p\n", *ppbuffer);
LEAVE();
return ret_len;
}
#if defined(UAP_SUPPORT)
/**
* @brief Return whether the driver has enabled 11h for the interface
*
@ -1064,6 +832,7 @@ static t_bool wlan_11h_is_enabled(mlan_private *priv)
LEAVE();
return priv->intf_state_11h.is_11h_enabled;
}
#endif
/**
* @brief Return whether the device has activated slave radar detection.
@ -1150,11 +919,6 @@ static t_bool wlan_11h_is_master_active_on_dfs_chan(mlan_private *priv)
ENTER();
if (GET_BSS_ROLE(priv) == MLAN_BSS_ROLE_STA) {
/* Ad-hoc creator */
if (((priv->media_connected == MTRUE) ||
(priv->adhoc_state == ADHOC_STARTING)) &&
(priv->adapter->adhoc_start_band & BAND_A) &&
wlan_11h_radar_detect_required(priv, priv->adhoc_channel))
ret = MTRUE;
} else if (GET_BSS_ROLE(priv) == MLAN_BSS_ROLE_UAP) {
/* UAP */
#ifdef UAP_SUPPORT
@ -1185,13 +949,6 @@ static t_bool wlan_11h_is_dfs_master(mlan_private *priv)
if (GET_BSS_ROLE(priv) == MLAN_BSS_ROLE_UAP)
ret = MTRUE;
/* STA: only ad-hoc creator is master */
else if ((GET_BSS_ROLE(priv) == MLAN_BSS_ROLE_STA) &&
(priv->bss_mode == MLAN_BSS_MODE_IBSS) &&
(priv->adhoc_state == ADHOC_STARTED ||
priv->adhoc_state == ADHOC_STARTING))
ret = MTRUE;
/* all other cases = slave interface */
LEAVE();
return ret;
@ -2366,98 +2123,6 @@ t_void wlan_11h_priv_init(mlan_private *pmpriv)
LEAVE();
}
/**
* @brief Retrieve a randomly selected starting channel if needed for 11h
*
* If 11h is enabled and an A-Band channel start band preference
* configured in the driver, the start channel must be random in order
* to meet with
*
* @param priv Private driver information structure
*
* @return Starting channel
*/
t_u8 wlan_11h_get_adhoc_start_channel(mlan_private *priv)
{
t_u8 start_chn;
mlan_adapter *adapter = priv->adapter;
t_u32 region;
t_u32 rand_entry;
region_chan_t *chn_tbl;
t_u8 rand_tries = 0;
ENTER();
/*
* Set start_chn to the Default. Used if 11h is disabled or the band
* does not require 11h support.
*/
start_chn = DEFAULT_AD_HOC_CHANNEL;
/*
* Check that we are looking for a channel in the A Band
*/
if ((adapter->adhoc_start_band & BAND_A)) {
/*
* Set default to the A Band default.
* Used if random selection fails
* or if 11h is not enabled
*/
start_chn = DEFAULT_AD_HOC_CHANNEL_A;
/*
* Check that 11h is enabled in the driver
*/
if (wlan_11h_is_enabled(priv)) {
/*
* Search the region_channel tables for a channel table
* that is marked for the A Band.
*/
for (region = 0; (region < MAX_REGION_CHANNEL_NUM);
region++) {
chn_tbl = &adapter->region_channel[region];
/* Check if table is valid and marked for A Band
*/
if (chn_tbl->valid &&
chn_tbl->region == adapter->region_code &&
chn_tbl->band & BAND_A) {
/*
* Set the start channel. Get a random
* number and use it to pick an entry
* in the table between 0 and the number
* of channels in the table (NumCFP).
*/
do {
rand_entry =
wlan_11h_get_random_num(
adapter) %
chn_tbl->num_cfp;
start_chn =
(t_u8)chn_tbl
->pcfp[rand_entry]
.channel;
} while (
(wlan_11h_is_channel_under_nop(
adapter, start_chn) ||
((adapter->state_rdh.stage ==
RDH_GET_INFO_CHANNEL) &&
wlan_11h_radar_detect_required(
priv, start_chn))) &&
(++rand_tries <
MAX_RANDOM_CHANNEL_RETRIES));
}
}
}
}
PRINTM(MINFO, "11h: %s: AdHoc Channel set to %u\n",
wlan_11h_is_enabled(priv) ? "Enabled" : "Disabled", start_chn);
LEAVE();
return start_chn;
}
/**
* @brief Retrieve channel closed for operation by Channel Switch Announcement
*
@ -2745,93 +2410,6 @@ mlan_status wlan_11h_check_chan_report(mlan_private *priv, t_u8 chan)
return ret;
}
/**
* @brief Process an TLV buffer for a pending BSS Adhoc start command.
*
* Activate 11h functionality in the firmware if driver has is enabled
* for 11h (configured by the application via IOCTL).
*
* @param priv Private driver information structure
* @param ppbuffer Output parameter: Pointer to the TLV output buffer,
* modified on return to point after the appended 11h TLVs
* @param pcap_info Pointer to the capability info for the BSS to join
* @param channel Channel on which we are starting the IBSS
* @param p11h_bss_info Input/Output parameter: Pointer to the 11h BSS
* information for this network that we are establishing.
* 11h sensed flag set on output if warranted.
*
* @return
* - MLAN_STATUS_SUCCESS if 11h is disabled
* - Integer number of bytes appended to the TLV output buffer (ppbuffer)
* - < 0 for error (e.g. radar detected on channel)
*/
t_s32 wlan_11h_process_start(mlan_private *priv, t_u8 **ppbuffer,
IEEEtypes_CapInfo_t *pcap_info, t_u32 channel,
wlan_11h_bss_info_t *p11h_bss_info)
{
mlan_adapter *adapter = priv->adapter;
t_s32 ret = MLAN_STATUS_SUCCESS;
t_bool is_dfs_chan = MFALSE;
ENTER();
if (wlan_11h_is_enabled(priv) &&
((adapter->adhoc_start_band & BAND_A))) {
if (!wlan_fw_11d_is_enabled(priv)) {
/* No use having 11h enabled without 11d enabled */
if (wlan_11d_enable(priv, MNULL, ENABLE_11D)) {
ret = MLAN_STATUS_FAILURE;
LEAVE();
return ret;
}
#ifdef STA_SUPPORT
if (wlan_11d_create_dnld_countryinfo(
priv, adapter->adhoc_start_band))
PRINTM(MERROR, "Dnld_countryinfo_11d failed\n");
#endif
}
/*
* Activate 11h functions in firmware,
* turns on capability bit
*/
wlan_11h_activate(priv, MNULL, MTRUE);
pcap_info->spectrum_mgmt = MTRUE;
/* If using a DFS channel, enable radar detection. */
is_dfs_chan = wlan_11h_radar_detect_required(priv, channel);
if (is_dfs_chan) {
if (!wlan_11h_is_master_radar_det_active(priv))
wlan_11h_config_master_radar_det(priv, MTRUE);
}
wlan_11h_check_update_radar_det_state(priv);
/* Set flag indicating this BSS we are starting is using 11h */
p11h_bss_info->sensed_11h = MTRUE;
if (is_dfs_chan) {
/* check if this channel is under NOP */
if (wlan_11h_is_channel_under_nop(adapter, channel))
ret = MLAN_STATUS_FAILURE;
/* check last channel report, if this channel is free of
* radar */
if (ret == MLAN_STATUS_SUCCESS)
ret = wlan_11h_check_chan_report(priv, channel);
}
if (ret == MLAN_STATUS_SUCCESS)
ret = wlan_11h_process_adhoc(priv, ppbuffer, channel,
MNULL);
else
ret = MLAN_STATUS_FAILURE;
} else {
/* Deactivate 11h functions in the firmware */
wlan_11h_activate(priv, MNULL, MFALSE);
pcap_info->spectrum_mgmt = MFALSE;
wlan_11h_check_update_radar_det_state(priv);
}
LEAVE();
return ret;
}
/**
* @brief Process an TLV buffer for a pending BSS Join command for
* both adhoc and infra networks
@ -2912,22 +2490,12 @@ t_s32 wlan_11h_process_join(mlan_private *priv, t_u8 **ppbuffer,
}
wlan_11h_check_update_radar_det_state(priv);
if (pcap_info->ibss) {
PRINTM(MINFO, "11h: Adhoc join: Sensed\n");
ret = wlan_11h_process_adhoc(priv, ppbuffer, channel,
p11h_bss_info);
} else {
{
PRINTM(MINFO, "11h: Infra join: Sensed\n");
ret = wlan_11h_process_infra_join(
priv, ppbuffer, band, channel, p11h_bss_info);
}
} else {
if (pcap_info->ibss) {
/* Deactivate 11h functions in the firmware */
wlan_11h_activate(priv, MNULL, MFALSE);
pcap_info->spectrum_mgmt = MFALSE;
wlan_11h_check_update_radar_det_state(priv);
}
}
LEAVE();
@ -3142,17 +2710,6 @@ mlan_status wlan_11h_process_bss_elem(mlan_adapter *pmadapter,
sizeof(IEEEtypes_Header_t)));
break;
case IBSS_DFS:
PRINTM(MINFO, "11h: Ibss Dfs IE Found\n");
p11h_bss_info->sensed_11h = MTRUE;
memcpy_ext(pmadapter, &p11h_bss_info->ibss_dfs, pelement,
element_len + sizeof(IEEEtypes_Header_t),
sizeof(IEEEtypes_IBSS_DFS_t));
p11h_bss_info->ibss_dfs.len =
MIN(element_len, (sizeof(IEEEtypes_IBSS_DFS_t) -
sizeof(IEEEtypes_Header_t)));
break;
case SUPPORTED_CHANNELS:
case TPC_REQUEST:
/*
@ -4205,12 +3762,10 @@ mlan_status wlan_11h_radar_detected_handling(mlan_adapter *pmadapter,
pmpriv->uap_state_chan_cb.bandcfg);
else
#endif
pstate_rdh->new_channel =
wlan_11h_get_adhoc_start_channel(pmpriv);
if (!pstate_rdh->new_channel ||
(pstate_rdh->new_channel ==
pstate_rdh->curr_channel)) { /* report error */
if (!pstate_rdh->new_channel ||
(pstate_rdh->new_channel ==
pstate_rdh->curr_channel)) { /* report error */
PRINTM(MERROR,
"%s(): ERROR - Failed to choose new_chan"
" (!= curr_chan) !!\n",
@ -4294,9 +3849,7 @@ mlan_status wlan_11h_radar_detected_handling(mlan_adapter *pmadapter,
t_u16 bcn_dtim_msec;
/* adhoc creator */
if (wlan_11h_is_dfs_master(pmpriv)) {
bcn_pd_msec = pmpriv->beacon_period;
} else {
{
bcn_pd_msec = pmpriv->curr_bss_params
.bss_descriptor
.beacon_period;
@ -4460,12 +4013,6 @@ mlan_status wlan_11h_radar_detected_handling(mlan_adapter *pmadapter,
#endif
#ifdef STA_SUPPORT
if (GET_BSS_ROLE(pmpriv) == MLAN_BSS_ROLE_STA) {
if (wlan_11h_is_dfs_master(pmpriv)) {
/* Save ad-hoc creator state before stop
* clears it */
pmpriv->adhoc_state_prev =
pmpriv->adhoc_state;
}
if (pmpriv->media_connected == MTRUE) {
wlan_disconnect(pmpriv, MNULL, MNULL);
break; /* leads to exit case */
@ -4567,56 +4114,6 @@ mlan_status wlan_11h_radar_detected_handling(mlan_adapter *pmadapter,
}
#endif
#ifdef STA_SUPPORT
if (GET_BSS_ROLE(pmpriv) == MLAN_BSS_ROLE_STA) {
/* Check previous state to find former
* Ad-hoc creator interface. Set new
* state to Starting, so it'll be seen
* as a DFS master. */
if (pmpriv->adhoc_state_prev == ADHOC_STARTED) {
pmpriv->adhoc_state = ADHOC_STARTING;
pmpriv->adhoc_state_prev = ADHOC_IDLE;
}
if (wlan_11h_is_dfs_master(pmpriv)) {
/* set new adhoc channel here */
pmpriv->adhoc_channel =
pstate_rdh->new_channel;
if (wlan_11h_radar_detect_required(
pmpriv,
pstate_rdh->new_channel)) {
/* Radar detection is required
for this channel, make sure
11h is activated in the
firmware */
ret = wlan_11h_activate(
pmpriv, MNULL, MTRUE);
if (ret)
break;
ret = wlan_11h_config_master_radar_det(
pmpriv, MTRUE);
if (ret)
break;
ret = wlan_11h_check_update_radar_det_state(
pmpriv);
if (ret)
break;
}
ret = wlan_prepare_cmd(
pmpriv,
HostCmd_CMD_802_11_AD_HOC_START,
HostCmd_ACT_GEN_SET, 0, MNULL,
&pmpriv->adhoc_last_start_ssid);
break; /* leads to exit case */
}
/* NOTE: DON'T reconnect slave STA intfs -
* infra/adhoc_joiner Do we want to return to
* same AP/network (on radar channel)? If want
* to connect back, depend on either:
* 1. driver's reassoc thread
* 2. wpa_supplicant, or other user-space
* app
*/
}
#endif
}

View file

@ -94,9 +94,6 @@ extern void wlan_11h_cleanup(mlan_adapter *pmadapter);
/** Initialize the 11h interface structure */
extern void wlan_11h_priv_init(mlan_private *pmpriv);
/** Get an initial random channel to start an adhoc network on */
extern t_u8 wlan_11h_get_adhoc_start_channel(mlan_private *priv);
/** Get channel that has been closed via Channel Switch Announcement */
extern t_u8 wlan_11h_get_csa_closed_channel(mlan_private *priv);

View file

@ -622,75 +622,6 @@ static mlan_status wlan_11n_ioctl_addba_reject(pmlan_adapter pmadapter,
return ret;
}
/**
* @brief Set/get ibss ampdu param
*
* @param pmadapter A pointer to mlan_adapter structure
* @param pioctl_req A pointer to ioctl request buffer
*
* @return MLAN_STATUS_SUCCESS --success, otherwise fail
*/
static mlan_status wlan_11n_ioctl_ibss_ampdu_param(pmlan_adapter pmadapter,
pmlan_ioctl_req pioctl_req)
{
int i = 0;
mlan_status ret = MLAN_STATUS_SUCCESS;
mlan_private *pmpriv = pmadapter->priv[pioctl_req->bss_index];
mlan_ds_11n_cfg *cfg = MNULL;
ENTER();
cfg = (mlan_ds_11n_cfg *)pioctl_req->pbuf;
if (pioctl_req->action == MLAN_ACT_GET) {
PRINTM(MINFO, "Get IBSS AMPDU param\n");
for (i = 0; i < MAX_NUM_TID; i++) {
cfg->param.ibss_ampdu.ampdu[i] = pmpriv->ibss_ampdu[i];
cfg->param.ibss_ampdu.addba_reject[i] =
pmpriv->ibss_addba_reject[i];
}
} else {
for (i = 0; i < MAX_NUM_TID; i++) {
/* For AMPDU RX*/
if (cfg->param.ibss_ampdu.addba_reject[i] >
ADDBA_RSP_STATUS_REJECT) {
pioctl_req->status_code =
MLAN_ERROR_INVALID_PARAMETER;
ret = MLAN_STATUS_FAILURE;
break;
}
pmpriv->ibss_addba_reject[i] =
cfg->param.ibss_ampdu.addba_reject[i];
/* For AMPDU TX*/
if ((cfg->param.ibss_ampdu.ampdu[i] > HIGH_PRIO_TID) &&
(cfg->param.ibss_ampdu.ampdu[i] !=
BA_STREAM_NOT_ALLOWED)) {
pioctl_req->status_code =
MLAN_ERROR_INVALID_PARAMETER;
ret = MLAN_STATUS_FAILURE;
break;
}
pmpriv->ibss_ampdu[i] = cfg->param.ibss_ampdu.ampdu[i];
}
PRINTM(MMSG, "IBSS addba reject: %d %d %d %d %d %d %d %d\n",
pmpriv->ibss_addba_reject[0],
pmpriv->ibss_addba_reject[1],
pmpriv->ibss_addba_reject[2],
pmpriv->ibss_addba_reject[3],
pmpriv->ibss_addba_reject[4],
pmpriv->ibss_addba_reject[5],
pmpriv->ibss_addba_reject[6],
pmpriv->ibss_addba_reject[7]);
PRINTM(MMSG, "IBSS ampdu %d %d %d %d %d %d %d %d\n",
pmpriv->ibss_ampdu[0], pmpriv->ibss_ampdu[1],
pmpriv->ibss_ampdu[2], pmpriv->ibss_ampdu[3],
pmpriv->ibss_ampdu[4], pmpriv->ibss_ampdu[5],
pmpriv->ibss_ampdu[6], pmpriv->ibss_ampdu[7]);
}
LEAVE();
return ret;
}
/**
* @brief Set/Get Minimum BA Threshold
*
@ -2552,10 +2483,7 @@ int wlan_cmd_append_11n_tlv(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc,
else
usr_dot_11n_dev_cap = pmpriv->usr_dot_11n_dev_cap_bg;
if (pmpriv->bss_mode == MLAN_BSS_MODE_IBSS)
usr_dot_11ac_bw = BW_FOLLOW_VHTCAP;
else
usr_dot_11ac_bw = pmpriv->usr_dot_11ac_bw;
usr_dot_11ac_bw = pmpriv->usr_dot_11ac_bw;
if ((pbss_desc->bss_band & (BAND_B | BAND_G | BAND_A)) &&
ISSUPP_CHANWIDTH40(usr_dot_11n_dev_cap) &&
!wlan_check_chan_width_ht40_by_region(pmpriv, pbss_desc)) {
@ -2779,9 +2707,6 @@ mlan_status wlan_11n_cfg_ioctl(pmlan_adapter pmadapter,
case MLAN_OID_11N_CFG_TX_AGGR_CTRL:
status = wlan_11n_ioctl_txaggrctrl(pmadapter, pioctl_req);
break;
case MLAN_OID_11N_CFG_IBSS_AMPDU_PARAM:
status = wlan_11n_ioctl_ibss_ampdu_param(pmadapter, pioctl_req);
break;
case MLAN_OID_11N_CFG_MIN_BA_THRESHOLD:
status = wlan_11n_ioctl_min_ba_threshold_cfg(pmadapter,
pioctl_req);
@ -3239,12 +3164,7 @@ int wlan_get_txbastream_tbl(mlan_private *priv, tx_ba_stream_tbl *buf)
*/
t_u8 wlan_11n_bandconfig_allowed(mlan_private *pmpriv, t_u16 bss_band)
{
if (pmpriv->bss_mode == MLAN_BSS_MODE_IBSS) {
if (bss_band & BAND_G)
return (pmpriv->adapter->adhoc_start_band & BAND_GN);
else if (bss_band & BAND_A)
return (pmpriv->adapter->adhoc_start_band & BAND_AN);
} else {
{
if (bss_band & BAND_G)
return (pmpriv->config_bands & BAND_GN);
else if (bss_band & BAND_A)

View file

@ -319,6 +319,12 @@ mlan_status wlan_11n_deaggregate_pkt(mlan_private *priv, pmlan_buffer pmbuf)
ret = pmadapter->callbacks.moal_recv_amsdu_packet(
pmadapter->pmoal_handle, pmbuf);
if (ret == MLAN_STATUS_PENDING) {
#ifdef USB
if (IS_USB(pmadapter->card_type))
pmadapter->callbacks.moal_recv_complete(
pmadapter->pmoal_handle, MNULL,
pmadapter->rx_data_ep, ret);
#endif
priv->msdu_in_rx_amsdu_cnt += num_subframes;
priv->amsdu_rx_cnt++;
return ret;
@ -507,8 +513,9 @@ int wlan_11n_aggregate_pkt(mlan_private *priv, raListTbl *pra_list,
pmadapter->pmoal_handle, &pra_list->buf_head, MNULL, MNULL);
if (pmbuf_src) {
pmbuf_aggr = wlan_alloc_mlan_buffer(
pmadapter, pmadapter->tx_buf_size, 0,
MOAL_MALLOC_BUFFER | MOAL_MEM_FLAG_ATOMIC);
pmadapter, pmadapter->tx_buf_size, headroom,
MOAL_MEM_FLAG_DIRTY | MOAL_MALLOC_BUFFER |
MOAL_MEM_FLAG_ATOMIC);
if (!pmbuf_aggr) {
PRINTM(MERROR, "Error allocating mlan_buffer\n");
pmadapter->callbacks.moal_spin_unlock(

View file

@ -978,30 +978,6 @@ t_u16 region_code_index[MRVDRV_MAX_REGION_CODE] = {0x00, 0x10, 0x20, 0x30, 0x40,
/** The table to keep CFP code for A */
t_u16 cfp_code_index_a[MRVDRV_MAX_CFP_CODE_A] = {0x1, 0x2, 0x3, 0x4, 0x5};
/**
* The rates supported for ad-hoc B mode
*/
t_u8 AdhocRates_B[B_SUPPORTED_RATES] = {0x82, 0x84, 0x8b, 0x96, 0};
/**
* The rates supported for ad-hoc G mode
*/
t_u8 AdhocRates_G[G_SUPPORTED_RATES] = {0x8c, 0x12, 0x98, 0x24, 0xb0,
0x48, 0x60, 0x6c, 0x00};
/**
* The rates supported for ad-hoc BG mode
*/
t_u8 AdhocRates_BG[BG_SUPPORTED_RATES] = {0x82, 0x84, 0x8b, 0x96, 0x0c,
0x12, 0x18, 0x24, 0x30, 0x48,
0x60, 0x6c, 0x00};
/**
* The rates supported in A mode for ad-hoc
*/
t_u8 AdhocRates_A[A_SUPPORTED_RATES] = {0x8c, 0x12, 0x98, 0x24, 0xb0,
0x48, 0x60, 0x6c, 0x00};
/**
* The rates supported in A mode (used for BAND_A)
*/
@ -2267,30 +2243,6 @@ t_u32 wlan_get_supported_rates(mlan_private *pmpriv, t_u32 bss_mode,
k = wlan_copy_rates(rates, k, SupportedRates_A,
sizeof(SupportedRates_A));
}
} else {
/* Adhoc. mode */
if (bands == BAND_B) {
/* B only */
PRINTM(MINFO, "Band: Adhoc B\n");
k = wlan_copy_rates(rates, k, AdhocRates_B,
sizeof(AdhocRates_B));
} else if (bands == BAND_G) {
/* G only */
PRINTM(MINFO, "Band: Adhoc G\n");
k = wlan_copy_rates(rates, k, AdhocRates_G,
sizeof(AdhocRates_G));
} else if (bands & BAND_A) {
/* support A */
PRINTM(MINFO, "Band: Adhoc A\n");
k = wlan_copy_rates(rates, k, AdhocRates_A,
sizeof(AdhocRates_A));
} else {
PRINTM(MINFO, "Band: Adhoc BG\n");
k = wlan_copy_rates(rates, k, AdhocRates_BG,
sizeof(AdhocRates_BG));
}
}
LEAVE();

View file

@ -169,9 +169,6 @@ static t_u8 wlan_is_cmd_allowed_during_scan(t_u16 cmd_id)
case HostCmd_CMD_802_11_ASSOCIATE:
case HostCmd_CMD_802_11_DEAUTHENTICATE:
case HostCmd_CMD_802_11_DISASSOCIATE:
case HostCmd_CMD_802_11_AD_HOC_START:
case HostCmd_CMD_802_11_AD_HOC_JOIN:
case HostCmd_CMD_802_11_AD_HOC_STOP:
case HostCmd_CMD_11N_ADDBA_REQ:
case HostCmd_CMD_11N_ADDBA_RSP:
case HostCmd_CMD_11N_DELBA:
@ -739,7 +736,9 @@ static t_u8 *wlan_strchr(t_u8 *s, int c)
while (*pos != '\0') {
if (*pos == (t_u8)c)
return pos;
pos++;
if (!wlan_secure_add(pos, 1, pos, TYPE_PTR)) {
PRINTM(MERROR, "pos is invalid\n");
}
}
return MNULL;
}
@ -1201,9 +1200,6 @@ static t_u32 wlan_get_cmd_timeout(t_u16 cmd_id)
case HostCmd_CMD_802_11_ASSOCIATE:
case HostCmd_CMD_802_11_DEAUTHENTICATE:
case HostCmd_CMD_802_11_DISASSOCIATE:
case HostCmd_CMD_802_11_AD_HOC_START:
case HostCmd_CMD_802_11_AD_HOC_JOIN:
case HostCmd_CMD_802_11_AD_HOC_STOP:
case HostCmd_CMD_11N_ADDBA_REQ:
case HostCmd_CMD_11N_ADDBA_RSP:
case HostCmd_CMD_11N_DELBA:
@ -4442,6 +4438,55 @@ mlan_status wlan_cmd_ssu(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
}
#endif
/**
* @brief This function enable/disable CSI support.
*
* @param pmpriv A pointer to mlan_private structure
* @param cmd A pointer to HostCmd_DS_COMMAND structure
* @param cmd_action The action: GET or SET
* @param pdata_buf A pointer to data buffer
*
* @return MLAN_STATUS_SUCCESS
*/
mlan_status wlan_cmd_csi(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
t_u16 cmd_action, t_u16 *pdata_buf)
{
HostCmd_DS_CSI_CFG *csi_cfg_cmd = &cmd->params.csi_params;
mlan_ds_csi_params *csi_params = MNULL;
ENTER();
cmd->command = wlan_cpu_to_le16(HostCmd_CMD_CSI);
cmd->size = sizeof(HostCmd_DS_CSI_CFG) + S_DS_GEN;
csi_cfg_cmd->action = wlan_cpu_to_le16(cmd_action);
switch (cmd_action) {
case CSI_CMD_ENABLE:
csi_params = (mlan_ds_csi_params *)pdata_buf;
csi_cfg_cmd->head_id = wlan_cpu_to_le32(csi_params->head_id);
csi_cfg_cmd->tail_id = wlan_cpu_to_le32(csi_params->tail_id);
csi_cfg_cmd->chip_id = csi_params->chip_id;
csi_cfg_cmd->csi_filter_cnt = csi_params->csi_filter_cnt;
if (csi_cfg_cmd->csi_filter_cnt > CSI_FILTER_MAX)
csi_cfg_cmd->csi_filter_cnt = CSI_FILTER_MAX;
memcpy_ext(pmpriv->adapter, (t_u8 *)csi_cfg_cmd->csi_filter,
(t_u8 *)csi_params->csi_filter,
sizeof(mlan_csi_filter_t) *
csi_cfg_cmd->csi_filter_cnt,
sizeof(csi_cfg_cmd->csi_filter));
DBG_HEXDUMP(MCMD_D, "Enable CSI", csi_cfg_cmd,
sizeof(HostCmd_DS_CSI_CFG));
break;
case CSI_CMD_DISABLE:
DBG_HEXDUMP(MCMD_D, "Disable CSI", csi_cfg_cmd,
sizeof(HostCmd_DS_CSI_CFG));
default:
break;
}
cmd->size = wlan_cpu_to_le16(cmd->size);
LEAVE();
return MLAN_STATUS_SUCCESS;
}
/**
* @brief This function prepares command of dmcs config.
*
@ -5010,7 +5055,6 @@ mlan_status wlan_adapter_init_cmd(pmlan_adapter pmadapter)
}
}
#endif
#ifdef STA_SUPPORT
if (pmpriv_sta && (pmadapter->ps_mode == Wlan802_11PowerModePSP)) {
ret = wlan_prepare_cmd(pmpriv_sta,
@ -5043,6 +5087,18 @@ mlan_status wlan_adapter_init_cmd(pmlan_adapter pmadapter)
goto done;
}
if (pmadapter->init_para.antcfg)
wlan_handle_antcfg(pmpriv, pmadapter->init_para.antcfg);
if (pmadapter->init_para.dmcs) {
mlan_ds_misc_mapping_policy dmcs_policy;
dmcs_policy.subcmd = 0;
dmcs_policy.mapping_policy = pmadapter->init_para.dmcs;
ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_DMCS_CONFIG,
HostCmd_ACT_GEN_SET, 0, (t_void *)MNULL,
&dmcs_policy);
}
#define DEF_AUTO_NULL_PKT_PERIOD 30
if (pmpriv_sta) {
t_u32 value = DEF_AUTO_NULL_PKT_PERIOD;
@ -5348,6 +5404,31 @@ mlan_status wlan_process_vdll_event(pmlan_private pmpriv, pmlan_buffer pevent)
case VDLL_IND_TYPE_SEC_ERR_ID:
PRINTM(MERROR, "VDLL_IND (SECURE ERR).\n");
break;
case VDLL_IND_TYPE_INTF_RESET:
PRINTM(MEVENT, "VDLL_IND (INTF_RESET)\n");
#ifdef PCIE8997
/* For PCIe PFU, need to reset both Tx and Rx rd/wrptr */
if (IS_PCIE8997(pmadapter->card_type)) {
pmadapter->pcard_pcie->txbd_wrptr = 0;
pmadapter->pcard_pcie->txbd_rdptr = 0;
pmadapter->pcard_pcie->rxbd_wrptr =
pmadapter->pcard_pcie->reg
->txrx_rw_ptr_rollover_ind;
pmadapter->pcard_pcie->rxbd_rdptr = 0;
}
#endif
#if defined(SD8997) || defined(SD8987) || defined(SD8978)
/* For SDIO, need to reset wr_port only */
if (IS_SD8997(pmadapter->card_type) ||
IS_SD8987(pmadapter->card_type) ||
IS_SD8978(pmadapter->card_type)) {
pmadapter->pcard_sd->curr_wr_port =
pmadapter->pcard_sd->reg->start_wr_port;
pmadapter->pcard_sd->mpa_tx.start_port =
pmadapter->pcard_sd->reg->start_wr_port;
}
#endif
break;
default:
PRINTM(MERROR, "unknow vdll ind type=%d\n", ind->type);
break;
@ -6119,14 +6200,7 @@ mlan_status wlan_ret_get_hw_spec(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
BAND_GAC;
}
}
pmadapter->adhoc_start_band = BAND_A;
pmpriv->adhoc_channel = DEFAULT_AD_HOC_CHANNEL_A;
} else if (pmadapter->fw_bands & BAND_G) {
pmadapter->adhoc_start_band = BAND_G | BAND_B;
pmpriv->adhoc_channel = DEFAULT_AD_HOC_CHANNEL;
} else if (pmadapter->fw_bands & BAND_B) {
pmadapter->adhoc_start_band = BAND_B;
pmpriv->adhoc_channel = DEFAULT_AD_HOC_CHANNEL;
} else {
}
#endif /* STA_SUPPORT */
@ -6358,6 +6432,12 @@ mlan_status wlan_ret_get_hw_spec(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
tlv = (MrvlIEtypesHeader_t *)((t_u8 *)tlv + tlv_len +
sizeof(MrvlIEtypesHeader_t));
}
#ifdef PCIE
if (IS_PCIE(pmadapter->card_type) &&
IS_FW_SUPPORT_RX_SW_INT(pmadapter)) {
pmadapter->ops.select_host_int(pmadapter);
}
#endif
if (wlan_set_regiontable(pmpriv, (t_u8)pmadapter->region_code,
pmadapter->fw_bands)) {
if (pioctl_req)
@ -9572,7 +9652,11 @@ mlan_status wlan_ret_led_config(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
mlan_led_cfg->enable = resp->params.ledcntrcfg.enable;
left_len = cmdrsp_len - (S_DS_GEN + sizeof(HostCmd_DS_CMD_LED_CFG));
tlv = (t_u8 *)resp + (S_DS_GEN + sizeof(HostCmd_DS_CMD_LED_CFG));
if (!wlan_secure_add(&resp, (S_DS_GEN + sizeof(HostCmd_DS_CMD_LED_CFG)),
&tlv, TYPE_PTR)) {
PRINTM(MERROR, "tlv is invalid\n");
}
for (i = 0; i < MAX_FW_STATES; i++) {
mlan_led_cfg->misc_led_behvr[i].firmwarestate = *tlv;
tlv++;

View file

@ -23,9 +23,6 @@
#ifndef _MLAN_DECL_H_
#define _MLAN_DECL_H_
/** MLAN release version */
#define MLAN_RELEASE_VERSION "423.p6"
/** Re-define generic data types for MLAN/MOAL */
/** Signed char (1-byte) */
typedef signed char t_s8, *t_ps8;
@ -661,6 +658,8 @@ typedef enum {
#define MLAN_MEM_DMA MBIT(0)
/** Memory allocation flag: ATOMIC */
#define MLAN_MEM_FLAG_ATOMIC MBIT(1)
/** Memory allocation flag: DIRTY - do not memset to 0 buffer */
#define MLAN_MEM_FLAG_DIRTY MBIT(2)
/** Default memory allocation flag */
#define MLAN_MEM_DEF 0
@ -781,8 +780,6 @@ typedef enum _mlan_data_frame_type {
typedef enum _mlan_event_id {
/* Event generated by firmware (MSB=0) */
MLAN_EVENT_ID_FW_UNKNOWN = 0x00000001,
MLAN_EVENT_ID_FW_ADHOC_LINK_SENSED = 0x00000002,
MLAN_EVENT_ID_FW_ADHOC_LINK_LOST = 0x00000003,
MLAN_EVENT_ID_FW_DISCONNECTED = 0x00000004,
MLAN_EVENT_ID_FW_MIC_ERR_UNI = 0x00000005,
MLAN_EVENT_ID_FW_MIC_ERR_MUL = 0x00000006,
@ -810,8 +807,6 @@ typedef enum _mlan_event_id {
MLAN_EVENT_ID_FW_RADAR_DETECTED = 0x00000024,
MLAN_EVENT_ID_FW_CHANNEL_REPORT_RDY = 0x00000025,
MLAN_EVENT_ID_FW_BW_CHANGED = 0x00000026,
MLAN_EVENT_ID_FW_IBSS_CONNECT = 0x00000028,
MLAN_EVENT_ID_FW_IBSS_DISCONNECT = 0x00000029,
MLAN_EVENT_ID_FW_REMAIN_ON_CHAN_EXPIRED = 0x0000002B,
#ifdef UAP_SUPPORT
@ -1013,14 +1008,14 @@ typedef enum _dfs_moe_t {
/** Band_Config_t */
typedef MLAN_PACK_START struct _Band_Config_t {
#ifdef BIG_ENDIAN_SUPPORT
/** Channel Width - (00)=20MHz, (10)=40MHz, (11)=80MHz */
t_u8 chanWidth : 2;
/** Band Info - (00)=2.4GHz, (01)=5GHz, (10)=6GHz */
t_u8 chanBand : 2;
/** Channel Selection Mode - (00)=manual, (01)=ACS, (02)=user*/
t_u8 scanMode : 2;
/** Secondary Channel Offset - (00)=None, (01)=Above, (11)=Below */
t_u8 chan2Offset : 2;
/** Channel Width - (00)=20MHz, (10)=40MHz, (11)=80MHz */
t_u8 chanWidth : 2;
/** Band Info - (00)=2.4GHz, (01)=5GHz, (10)=6GHz */
t_u8 chanBand : 2;
#else
/** Band Info - (00)=2.4GHz, (01)=5GHz, (10)=6GHz */
t_u8 chanBand : 2;
@ -1856,7 +1851,6 @@ typedef enum {
typedef enum {
MLAN_INTERFACE_STA = 0,
MLAN_INTERFACE_SOFTAP = 1,
MLAN_INTERFACE_IBSS = 2,
MLAN_INTERFACE_P2P_CLIENT = 3,
MLAN_INTERFACE_P2P_GO = 4,
MLAN_INTERFACE_NAN = 5,
@ -2722,6 +2716,10 @@ typedef struct _mlan_device {
t_u8 second_mac;
/** napi */
t_u8 napi;
/** antcfg */
t_u32 antcfg;
/** dmcs */
t_u8 dmcs;
} mlan_device, *pmlan_device;
/** MLAN API function prototype */

View file

@ -47,9 +47,6 @@ ENUM_ELEMENT(EVENT_DUMMY_HOST_WAKEUP_SIGNAL, 0x0001),
/** Card Event definition : MIC error unicast */
ENUM_ELEMENT(EVENT_MIC_ERR_UNICAST, 0x000e),
/** Card Event definition : Ad-Hoc BCN lost */
ENUM_ELEMENT(EVENT_ADHOC_BCN_LOST, 0x0011),
/** Card Event definition : Stop Tx */
ENUM_ELEMENT(EVENT_STOP_TX, 0x0013),
/** Card Event definition : Start Tx */
@ -79,14 +76,6 @@ ENUM_ELEMENT(EVENT_DUMMY_HOST_WAKEUP_SIGNAL, 0x0001),
/** Card Event definition : Beacon SNR high */
ENUM_ELEMENT(EVENT_SNR_HIGH, 0x001d),
/** Card Event definition : IBSS coalsced */
ENUM_ELEMENT(EVENT_IBSS_COALESCED, 0x001e),
/** Event definition : IBSS station connected */
ENUM_ELEMENT(EVENT_IBSS_STATION_CONNECT, 0x0020),
/** Event definition : IBSS station dis-connected */
ENUM_ELEMENT(EVENT_IBSS_STATION_DISCONNECT, 0x0021),
/** Card Event definition : Data RSSI low */
ENUM_ELEMENT(EVENT_DATA_RSSI_LOW, 0x0024),
/** Card Event definition : Data SNR low */

View file

@ -153,10 +153,6 @@ extern t_u8 SupportedRates_G[G_SUPPORTED_RATES];
extern t_u8 SupportedRates_BG[BG_SUPPORTED_RATES];
extern t_u8 SupportedRates_A[A_SUPPORTED_RATES];
extern t_u8 SupportedRates_N[N_SUPPORTED_RATES];
extern t_u8 AdhocRates_G[G_SUPPORTED_RATES];
extern t_u8 AdhocRates_B[B_SUPPORTED_RATES];
extern t_u8 AdhocRates_BG[BG_SUPPORTED_RATES];
extern t_u8 AdhocRates_A[A_SUPPORTED_RATES];
/** Default auto deep sleep mode */
#define DEFAULT_AUTO_DS_MODE MTRUE
@ -315,8 +311,6 @@ typedef enum _WLAN_802_11_WEP_STATUS {
#define TLV_TYPE_PHY_DS 0x0003
/** TLV type : CF */
#define TLV_TYPE_CF 0x0004
/** TLV type : IBSS */
#define TLV_TYPE_IBSS 0x0006
/** TLV type : Domain */
#define TLV_TYPE_DOMAIN 0x0007
@ -1175,12 +1169,6 @@ enum host_cmd_id {
/** fw_cap_info bit23 for firmware roaming*/
#define FW_ROAMING_SUPPORT MBIT(23)
/** fw_cap_info bit25 for adhoc support*/
#define FW_CAPINFO_ADHOC_SUPPORT MBIT(25)
/** Check if adhoc is supported by firmware */
#define IS_FW_SUPPORT_ADHOC(_adapter) \
(_adapter->fw_cap_info & FW_CAPINFO_ADHOC_SUPPORT)
/** Check if supplicant is supported by firmware */
#define IS_FW_SUPPORT_SUPPLICANT(_adapter) \
(_adapter->fw_cap_info & FW_CAPINFO_SUPPLICANT_SUPPORT)
@ -1223,6 +1211,8 @@ enum host_cmd_id {
#define FW_CAPINFO_EXT_CMD_TX_DATA MBIT(16)
/** FW cap info bit 19: security rgpower table */
#define FW_CAPINFO_EXT_SEC_RG_POWER MBIT(19)
/** FW cap info bit 20: RX_SW_INT */
#define FW_CAPINFO_EXT_RX_SW_INT MBIT(20)
/** Check if 5G 1x1 only is supported by firmware */
#define IS_FW_SUPPORT_5G_1X1_ONLY(_adapter) \
@ -1267,6 +1257,8 @@ enum host_cmd_id {
/** Check if security rgpower table supported by firmware */
#define IS_FW_SUPPORT_SEC_RG_POWER(_adapter) \
(_adapter->fw_cap_ext & FW_CAPINFO_EXT_SEC_RG_POWER)
#define IS_FW_SUPPORT_RX_SW_INT(_adapter) \
(_adapter->fw_cap_ext & FW_CAPINFO_EXT_RX_SW_INT)
/** MrvlIEtypes_PrevBssid_t */
typedef MLAN_PACK_START struct _MrvlIEtypes_PrevBssid_t {
@ -1511,8 +1503,6 @@ typedef enum _ENH_PS_MODES {
#define HostCmd_ACT_MAC_STRICT_PROTECTION_ENABLE 0x0400
/** MAC action : Force 11n protection disable */
#define HostCmd_ACT_MAC_FORCE_11N_PROTECTION_OFF 0x0800
/** MAC action : Ad-Hoc G protection on */
#define HostCmd_ACT_MAC_ADHOC_G_PROTECTION_ON 0x2000
/** MAC action : Static-Dynamic BW enable */
#define HostCmd_ACT_MAC_STATIC_DYNAMIC_BW_ENABLE MBIT(16)
/** MAC action : Dynamic BW */
@ -1521,8 +1511,6 @@ typedef enum _ENH_PS_MODES {
/* Define action or option for HostCmd_CMD_802_11_SCAN */
/** Scan type : BSS */
#define HostCmd_BSS_MODE_BSS 0x0001
/** Scan type : IBSS */
#define HostCmd_BSS_MODE_IBSS 0x0002
/** Scan type : Any */
#define HostCmd_BSS_MODE_ANY 0x0003
@ -2302,12 +2290,6 @@ typedef MLAN_PACK_START struct _CfParamSet_t {
t_u16 cfp_duration_remaining;
} MLAN_PACK_END CfParamSet_t;
/** IbssParamSet_t */
typedef MLAN_PACK_START struct _IbssParamSet_t {
/** ATIM window value */
t_u16 atim_window;
} MLAN_PACK_END IbssParamSet_t;
/** MrvlIEtypes_SsParamSet_t */
typedef MLAN_PACK_START struct _MrvlIEtypes_SsParamSet_t {
/** Header */
@ -2316,8 +2298,6 @@ typedef MLAN_PACK_START struct _MrvlIEtypes_SsParamSet_t {
union {
/** CF parameter set */
CfParamSet_t cf_param_set[1];
/** IBSS parameter set */
IbssParamSet_t ibss_param_set[1];
} cf_ibss;
} MLAN_PACK_END MrvlIEtypes_SsParamSet_t;
@ -2868,8 +2848,7 @@ typedef MLAN_PACK_START struct __ps_param {
t_u16 bcn_miss_timeout;
/** local listen interval */
t_u16 local_listen_interval;
/** Adhoc awake period */
t_u16 adhoc_wake_period;
t_u16 rsrvd;
/** mode - (0x01 - firmware to automatically choose PS_POLL or NULL
* mode, 0x02 - PS_POLL, 0x03 - NULL mode )
*/
@ -3162,13 +3141,15 @@ typedef MLAN_PACK_START struct _HostCmd_DS_MC_AGGR_CFG {
* bit 0 MC aggregation
* bit 1 packet expiry
* bit 2 CTS2Self
* bit 3 CTS2Self duration offset*/
* bit 3 CTS2Self duration offset
* bit 6 UC non aggregation*/
t_u8 enable_bitmap;
/* 1 valid, 0 invalid
* bit 0 MC aggregation
* bit 1 packet expiry
* bit 2 CTS2Self
* bit 3 CTS2Self duration offset*/
* bit 3 CTS2Self duration offset
* bit 6 UC non aggregation*/
t_u8 mask_bitmap;
/** CTS2Self duration offset */
t_u16 cts2self_offset;
@ -3340,88 +3321,6 @@ typedef MLAN_PACK_START struct _HostCmd_DS_802_11_ASSOCIATE_RSP {
IEEEtypes_AssocRsp_t assoc_rsp;
} MLAN_PACK_END HostCmd_DS_802_11_ASSOCIATE_RSP;
/** HostCmd_DS_802_11_AD_HOC_START*/
typedef MLAN_PACK_START struct _HostCmd_DS_802_11_AD_HOC_START {
/** AdHoc SSID */
t_u8 ssid[MLAN_MAX_SSID_LENGTH];
/** BSS mode */
t_u8 bss_mode;
/** Beacon period */
t_u16 beacon_period;
/** DTIM period */
t_u8 dtim_period;
/** SS parameter set */
IEEEtypes_SsParamSet_t ss_param_set;
/** PHY parameter set */
IEEEtypes_PhyParamSet_t phy_param_set;
/** Reserved field */
t_u16 reserved1;
/** Capability information */
IEEEtypes_CapInfo_t cap;
/** Supported data rates */
t_u8 DataRate[HOSTCMD_SUPPORTED_RATES];
} MLAN_PACK_END HostCmd_DS_802_11_AD_HOC_START;
/** HostCmd_CMD_802_11_AD_HOC_START response */
typedef MLAN_PACK_START struct _HostCmd_DS_802_11_AD_HOC_START_RESULT {
/** Padding */
t_u8 pad[3];
/** AdHoc BSSID */
t_u8 bssid[MLAN_MAC_ADDR_LENGTH];
/** Padding to sync with FW structure*/
t_u8 pad2[2];
/** Result */
t_u8 result;
} MLAN_PACK_END HostCmd_DS_802_11_AD_HOC_START_RESULT;
/** HostCmd_CMD_802_11_AD_HOC_START response */
typedef MLAN_PACK_START struct _HostCmd_DS_802_11_AD_HOC_JOIN_RESULT {
/** Result */
t_u8 result;
} MLAN_PACK_END HostCmd_DS_802_11_AD_HOC_JOIN_RESULT;
/** AdHoc_BssDesc_t */
typedef MLAN_PACK_START struct _AdHoc_BssDesc_t {
/** BSSID */
t_u8 bssid[MLAN_MAC_ADDR_LENGTH];
/** SSID */
t_u8 ssid[MLAN_MAX_SSID_LENGTH];
/** BSS mode */
t_u8 bss_mode;
/** Beacon period */
t_u16 beacon_period;
/** DTIM period */
t_u8 dtim_period;
/** Timestamp */
t_u8 time_stamp[8];
/** Local time */
t_u8 local_time[8];
/** PHY parameter set */
IEEEtypes_PhyParamSet_t phy_param_set;
/** SS parameter set */
IEEEtypes_SsParamSet_t ss_param_set;
/** Capability information */
IEEEtypes_CapInfo_t cap;
/** Supported data rates */
t_u8 data_rates[HOSTCMD_SUPPORTED_RATES];
/*
* DO NOT ADD ANY FIELDS TO THIS STRUCTURE.
* It is used in the Adhoc join command and will cause a
* binary layout mismatch with the firmware
*/
} MLAN_PACK_END AdHoc_BssDesc_t;
/** HostCmd_DS_802_11_AD_HOC_JOIN */
typedef MLAN_PACK_START struct _HostCmd_DS_802_11_AD_HOC_JOIN {
/** AdHoc BSS descriptor */
AdHoc_BssDesc_t bss_descriptor;
/** Reserved field */
t_u16 reserved1;
/** Reserved field */
t_u16 reserved2;
} MLAN_PACK_END HostCmd_DS_802_11_AD_HOC_JOIN;
#if defined(SDIO)
/** Interrupt Raising Edge */
#define INT_RASING_EDGE 0
@ -4150,8 +4049,6 @@ typedef MLAN_PACK_START struct _HostCmd_DS_802_11_RF_TX_POWER {
/** Connection type infra */
#define CONNECTION_TYPE_INFRA 0
/** Connection type adhoc */
#define CONNECTION_TYPE_ADHOC 1
#ifdef WIFI_DIRECT_SUPPORT
/** BSS Mode: WIFIDIRECT Client */
#define BSS_MODE_WIFIDIRECT_CLIENT 0
@ -5506,22 +5403,6 @@ typedef MLAN_PACK_START struct _HostCmd_DS_802_11_RF_ANTENNA {
t_u16 rx_antenna_mode;
} MLAN_PACK_END HostCmd_DS_802_11_RF_ANTENNA;
/** HostCmd_DS_802_11_IBSS_STATUS */
typedef MLAN_PACK_START struct _HostCmd_DS_802_11_IBSS_STATUS {
/** Action */
t_u16 action;
/** Enable */
t_u16 enable;
/** BSSID */
t_u8 bssid[MLAN_MAC_ADDR_LENGTH];
/** Beacon interval */
t_u16 beacon_interval;
/** ATIM window interval */
t_u16 atim_window;
/** User G rate protection */
t_u16 use_g_rate_protect;
} MLAN_PACK_END HostCmd_DS_802_11_IBSS_STATUS;
/** HostCmd_DS_MGMT_IE_LIST_CFG */
typedef MLAN_PACK_START struct _HostCmd_DS_MGMT_IE_LIST {
/** Action */
@ -7873,14 +7754,6 @@ typedef struct MLAN_PACK_START _HostCmd_DS_COMMAND {
HostCmd_DS_802_11_ASSOCIATE_RSP associate_rsp;
/** Deauthenticate */
HostCmd_DS_802_11_DEAUTHENTICATE deauth;
/** Ad-Hoc start */
HostCmd_DS_802_11_AD_HOC_START adhoc_start;
/** Ad-Hoc start result */
HostCmd_DS_802_11_AD_HOC_START_RESULT adhoc_start_result;
/** Ad-Hoc join result */
HostCmd_DS_802_11_AD_HOC_JOIN_RESULT adhoc_join_result;
/** Ad-Hoc join */
HostCmd_DS_802_11_AD_HOC_JOIN adhoc_join;
/** Domain information */
HostCmd_DS_802_11D_DOMAIN_INFO domain_info;
/** Domain information response */
@ -7936,8 +7809,6 @@ typedef struct MLAN_PACK_START _HostCmd_DS_COMMAND {
HostCmd_DS_802_11_SUPPLICANT_PROFILE esupplicant_profile;
/** Extended version */
HostCmd_DS_VERSION_EXT verext;
/** Adhoc Coalescing */
HostCmd_DS_802_11_IBSS_STATUS ibss_coalescing;
/** Mgmt IE list configuration */
HostCmd_DS_MGMT_IE_LIST_CFG mgmt_ie_list;
/** TDLS configuration command */
@ -8068,6 +7939,7 @@ typedef struct MLAN_PACK_START _HostCmd_DS_COMMAND {
struct mfg_cmd_tx_frame2 mfg_tx_frame2;
struct mfg_Cmd_HE_TBTx_t mfg_he_power;
mfg_Cmd_IEEEtypes_CtlBasicTrigHdr_t mfg_tx_trigger_config;
mfg_cmd_otp_mac_addr_rd_wr_t mfg_otp_mac_addr_rd_wr;
HostCmd_DS_CMD_ARB_CONFIG arb_cfg;
HostCmd_DS_CMD_DOT11MC_UNASSOC_FTM_CFG dot11mc_unassoc_ftm_cfg;
HostCmd_DS_HAL_PHY_CFG hal_phy_cfg_params;
@ -8126,6 +7998,8 @@ typedef MLAN_PACK_START struct _MrvlIEtypes_Secure_Boot_Uuid_t {
#define VDLL_IND_TYPE_ERR_ID 3
/** notify vdll download error: Secure error */
#define VDLL_IND_TYPE_SEC_ERR_ID 4
/** req host side interface reset */
#define VDLL_IND_TYPE_INTF_RESET 5
/** vdll indicate event structure */
typedef MLAN_PACK_START struct _vdll_ind {

View file

@ -68,16 +68,10 @@ ENUM_ELEMENT(HostCmd_CMD_GET_HW_SPEC, 0x0003),
ENUM_ELEMENT(HostCmd_CMD_802_11_DISASSOCIATE, 0x0026),
/** Host Command ID : MAC control */
ENUM_ELEMENT(HostCmd_CMD_MAC_CONTROL, 0x0028),
/** Host Command ID : 802.11 Ad-Hoc start */
ENUM_ELEMENT(HostCmd_CMD_802_11_AD_HOC_START, 0x002b),
/** Host Command ID : 802.11 Ad-Hoc join */
ENUM_ELEMENT(HostCmd_CMD_802_11_AD_HOC_JOIN, 0x002c),
/** Host Command ID : 802.11 key material */
ENUM_ELEMENT(HostCmd_CMD_802_11_KEY_MATERIAL, 0x005e),
/** Host Command ID : 802.11 Ad-Hoc stop */
ENUM_ELEMENT(HostCmd_CMD_802_11_AD_HOC_STOP, 0x0040),
/** Host Command ID : GPIO Configuration */
ENUM_ELEMENT(HostCmd_CMD_GPIO_CFG, 0x0041),
@ -146,9 +140,6 @@ ENUM_ELEMENT(HostCmd_CMD_GET_HW_SPEC, 0x0003),
/** Host Command ID : KEEP ALIVE command */
ENUM_ELEMENT(HostCmd_CMD_AUTO_TX, 0x0082),
/** Host Command ID : 802.11 IBSS coalescing status */
ENUM_ELEMENT(HostCmd_CMD_802_11_IBSS_COALESCING_STATUS, 0x0083),
/** Host Command ID : Memory access */
ENUM_ELEMENT(HostCmd_CMD_MEM_ACCESS, 0x0086),
@ -461,6 +452,8 @@ ENUM_ELEMENT(HostCmd_CMD_GET_HW_SPEC, 0x0003),
/** Host Command ID: Tx Frame */
ENUM_ELEMENT(HostCmd_CMD_802_11_TX_FRAME, 0x0283),
/** Host Command ID: PCIE ADMA INIT */
ENUM_ELEMENT(HostCmd_CMD_PCIE_ADMA_INIT, 0x0284),
/* Always keep this last */
ENUM_ELEMENT_LAST(__HostCmd_CMD_Last)

View file

@ -80,7 +80,6 @@ typedef MLAN_PACK_START enum _IEEEtypes_ElementId_e {
DS_PARAM_SET = 3,
CF_PARAM_SET = 4,
IBSS_PARAM_SET = 6,
COUNTRY_INFO = 7,
POWER_CONSTRAINT = 32,
POWER_CAPABILITY = 33,
@ -89,7 +88,6 @@ typedef MLAN_PACK_START enum _IEEEtypes_ElementId_e {
CHANNEL_SWITCH_ANN = 37,
EXTEND_CHANNEL_SWITCH_ANN = 60,
QUIET = 40,
IBSS_DFS = 41,
MEASUREMENT_REQUEST = 38,
MEASUREMENT_REPORT = 39,
SUPPORTED_CHANNELS = 36,
@ -391,15 +389,14 @@ typedef MLAN_PACK_START struct _IEEEtypes_CapInfo_t {
t_u8 privacy : 1;
t_u8 cf_poll_rqst : 1;
t_u8 cf_pollable : 1;
t_u8 ibss : 1;
t_u8 rsrvd4 : 1;
t_u8 ess : 1;
} MLAN_PACK_END IEEEtypes_CapInfo_t, *pIEEEtypes_CapInfo_t;
#else
typedef MLAN_PACK_START struct _IEEEtypes_CapInfo_t {
/** Capability Bit Map : ESS */
t_u8 ess : 1;
/** Capability Bit Map : IBSS */
t_u8 ibss : 1;
t_u8 rsrvd4 : 1;
/** Capability Bit Map : CF pollable */
t_u8 cf_pollable : 1;
/** Capability Bit Map : CF poll request */
@ -455,22 +452,10 @@ typedef MLAN_PACK_START struct _IEEEtypes_CfParamSet_t {
t_u16 cfp_duration_remaining;
} MLAN_PACK_END IEEEtypes_CfParamSet_t, *pIEEEtypes_CfParamSet_t;
/** IEEEtypes_IbssParamSet_t */
typedef MLAN_PACK_START struct _IEEEtypes_IbssParamSet_t {
/** Element ID */
t_u8 element_id;
/** Length */
t_u8 len;
/** ATIM window value in milliseconds */
t_u16 atim_window;
} MLAN_PACK_END IEEEtypes_IbssParamSet_t, *pIEEEtypes_IbssParamSet_t;
/** IEEEtypes_SsParamSet_t */
typedef MLAN_PACK_START union _IEEEtypes_SsParamSet_t {
/** SS parameter : CF parameter set */
IEEEtypes_CfParamSet_t cf_param_set;
/** SS parameter : IBSS parameter set */
IEEEtypes_IbssParamSet_t ibss_param_set;
} MLAN_PACK_END IEEEtypes_SsParamSet_t, *pIEEEtypes_SsParamSet_t;
/** IEEEtypes_FhParamSet_t */
@ -1492,8 +1477,6 @@ typedef MLAN_PACK_START struct {
/** Maximum number of subbands in the IEEEtypes_SupportedChannels_t structure */
#define WLAN_11H_MAX_SUBBANDS 6
/** Maximum number of DFS channels configured in IEEEtypes_IBSS_DFS_t */
#define WLAN_11H_MAX_IBSS_DFS_CHANNELS 25
/** IEEE Power Constraint element (7.3.2.15) */
typedef MLAN_PACK_START struct {
@ -1642,24 +1625,6 @@ typedef MLAN_PACK_START struct {
} MLAN_PACK_END IEEEtypes_ChannelMap_t;
/* IEEE IBSS DFS Element (7.3.2.24) */
/**
* IBSS DFS element included in ad hoc beacons and probe responses.
* Provides information regarding the IBSS DFS Owner as well as the
* originating STAs supported channels and basic measurement results.
*/
typedef MLAN_PACK_START struct {
t_u8 element_id; /**< IEEE Element ID = 41 */
t_u8 len; /**< Element length after id and len */
t_u8 dfs_owner[MLAN_MAC_ADDR_LENGTH]; /**< DFS Owner STA Address */
t_u8 dfs_recovery_interval; /**< DFS Recovery time in TBTTs */
/** Variable length map field, one Map entry for each supported channel
*/
IEEEtypes_ChannelMap_t channel_map[WLAN_11H_MAX_IBSS_DFS_CHANNELS];
} MLAN_PACK_END IEEEtypes_IBSS_DFS_t;
/* 802.11h BSS information kept for each BSSID received in scan results */
/**
* IEEE BSS information needed from scan results for later processing in
@ -1676,7 +1641,6 @@ typedef struct {
IEEEtypes_ChanSwitchAnn_t chan_switch_ann; /**< Channel Switch
Announcement IE */
IEEEtypes_Quiet_t quiet; /**< Quiet IE */
IEEEtypes_IBSS_DFS_t ibss_dfs; /**< IBSS DFS Element IE */
} wlan_11h_bss_info_t;

View file

@ -496,14 +496,8 @@ mlan_status wlan_init_priv(pmlan_private priv)
#endif
#ifdef UAP_SUPPORT
priv->num_drop_pkts = 0;
#endif
#if defined(STA_SUPPORT)
priv->adhoc_state_prev = ADHOC_IDLE;
memset(pmadapter, &priv->adhoc_last_start_ssid, 0,
sizeof(priv->adhoc_last_start_ssid));
#endif
priv->atim_window = 0;
priv->adhoc_state = ADHOC_IDLE;
priv->tx_power_level = 0;
priv->max_tx_power_level = 0;
priv->min_tx_power_level = 0;
@ -582,8 +576,6 @@ mlan_status wlan_init_priv(pmlan_private priv)
priv->addba_reject[i] = ADDBA_RSP_STATUS_ACCEPT;
priv->addba_reject[6] = ADDBA_RSP_STATUS_REJECT;
priv->addba_reject[7] = ADDBA_RSP_STATUS_REJECT;
memcpy_ext(priv->adapter, priv->ibss_addba_reject, priv->addba_reject,
sizeof(priv->addba_reject), sizeof(priv->ibss_addba_reject));
priv->max_amsdu = 0;
#ifdef STA_SUPPORT
if (priv->bss_type == MLAN_BSS_TYPE_STA) {
@ -943,7 +935,6 @@ t_void wlan_init_adapter(pmlan_adapter pmadapter)
pmadapter->null_pkt_interval = 0;
pmadapter->fw_bands = 0;
pmadapter->config_bands = 0;
pmadapter->adhoc_start_band = 0;
pmadapter->pscan_channels = MNULL;
pmadapter->fw_release_number = 0;
pmadapter->fw_cap_info = 0;
@ -1576,26 +1567,7 @@ static void wlan_update_hw_spec(pmlan_adapter pmadapter)
BAND_AAC;
}
}
pmadapter->adhoc_start_band = BAND_A;
for (i = 0; i < pmadapter->priv_num; i++) {
if (pmadapter->priv[i])
pmadapter->priv[i]->adhoc_channel =
DEFAULT_AD_HOC_CHANNEL_A;
}
} else if (pmadapter->fw_bands & BAND_G) {
pmadapter->adhoc_start_band = BAND_G | BAND_B;
for (i = 0; i < pmadapter->priv_num; i++) {
if (pmadapter->priv[i])
pmadapter->priv[i]->adhoc_channel =
DEFAULT_AD_HOC_CHANNEL;
}
} else if (pmadapter->fw_bands & BAND_B) {
pmadapter->adhoc_start_band = BAND_B;
for (i = 0; i < pmadapter->priv_num; i++) {
if (pmadapter->priv[i])
pmadapter->priv[i]->adhoc_channel =
DEFAULT_AD_HOC_CHANNEL;
}
} else {
}
#endif /* STA_SUPPORT */
for (i = 0; i < pmadapter->priv_num; i++) {
@ -2122,10 +2094,11 @@ mlan_status wlan_init_fw_complete(pmlan_adapter pmadapter)
if (status == MLAN_STATUS_SUCCESS) {
pmpriv = wlan_get_priv(pmadapter, MLAN_BSS_ROLE_STA);
if (pmpriv) {
status = wlan_prepare_cmd(pmpriv,
HostCmd_CMD_WMM_PARAM_CONFIG,
HostCmd_ACT_GEN_SET, 0, MNULL,
&pmadapter->ac_params);
status =
wlan_prepare_cmd(pmpriv,
HostCmd_CMD_WMM_PARAM_CONFIG,
HostCmd_ACT_GEN_SET_DEFAULT, 0,
MNULL, &pmadapter->ac_params);
if (status != MLAN_STATUS_SUCCESS)
PRINTM(MERROR,
"ERR: wlan_prepare_cmd returned status=0x%x\n",

View file

@ -46,6 +46,8 @@ Change log:
#define FW_CMD_7 0x00000007
/** CMD id for CMD10 */
#define FW_CMD_10 0x0000000a
/** CMD id for CMD21 */
#define FW_CMD_21 0x00000015
/** Firmware data transmit size */
#define FW_DATA_XMIT_SIZE (sizeof(FWHeader) + DataLength + sizeof(t_u32))

View file

@ -205,7 +205,6 @@ enum _mlan_ioctl_req_id {
MLAN_OID_11N_CFG_REJECT_ADDBA_REQ = 0x000C000D,
MLAN_OID_11N_CFG_COEX_RX_WINSIZE = 0x000C000E,
MLAN_OID_11N_CFG_TX_AGGR_CTRL = 0x000C000F,
MLAN_OID_11N_CFG_IBSS_AMPDU_PARAM = 0x000C0010,
MLAN_OID_11N_CFG_MIN_BA_THRESHOLD = 0x000C0011,
/* 802.11d Configuration Group */
@ -381,6 +380,7 @@ enum _mlan_ioctl_req_id {
MLAN_OID_MISC_EDMAC_CONFIG = 0x00200093,
MLAN_OID_MISC_GPIO_CFG = 0x00200094,
MLAN_OID_MISC_REGION_POWER_CFG = 0x00200095,
MLAN_OID_MISC_OTP_MAC_RD_WR = 0x00200097,
};
/** Sub command size */
@ -403,9 +403,8 @@ enum _mlan_act_generic { MLAN_ACT_DISABLE = 0, MLAN_ACT_ENABLE = 1 };
/** Enumeration for scan mode */
enum _mlan_scan_mode {
MLAN_SCAN_MODE_UNCHANGED = 0,
MLAN_SCAN_MODE_BSS,
MLAN_SCAN_MODE_IBSS,
MLAN_SCAN_MODE_ANY
MLAN_SCAN_MODE_BSS = 1,
MLAN_SCAN_MODE_ANY = 3
};
/** Enumeration for scan type */
@ -633,8 +632,8 @@ typedef struct _mlan_ds_scan {
/** Enumeration for BSS mode */
enum _mlan_bss_mode {
MLAN_BSS_MODE_INFRA = 1,
MLAN_BSS_MODE_IBSS,
MLAN_BSS_MODE_AUTO
MLAN_BSS_MODE_IBSS = 2,
MLAN_BSS_MODE_AUTO = 3
};
/** Maximum key length */
@ -1369,6 +1368,7 @@ typedef struct _mlan_ds_bss {
/** STA info for MLAN_OID_UAP_ADD_STATION */
mlan_ds_sta_info sta_info;
#endif
} param;
} mlan_ds_bss, *pmlan_ds_bss;
@ -1425,10 +1425,6 @@ enum _mlan_band_def {
typedef struct _mlan_ds_band_cfg {
/** Infra band */
t_u32 config_bands;
/** Ad-hoc start band */
t_u32 adhoc_start_band;
/** Ad-hoc start channel */
t_u32 adhoc_channel;
/** fw supported band */
t_u32 fw_bands;
} mlan_ds_band_cfg;
@ -1560,13 +1556,6 @@ typedef struct _mlan_ds_snmp_mib {
/** Status Information Group */
/*-----------------------------------------------------------------*/
/** Enumeration for ad-hoc status */
enum _mlan_adhoc_status {
ADHOC_IDLE,
ADHOC_STARTED,
ADHOC_JOINED,
ADHOC_COALESCED,
ADHOC_STARTING
};
typedef struct _mlan_ds_get_stats_org {
/** Statistics counter */
@ -2205,8 +2194,6 @@ typedef struct _mlan_bss_info {
t_s32 max_power_level;
/** Min power level in dBm */
t_s32 min_power_level;
/** Adhoc state */
t_u32 adhoc_state;
/** NF of last beacon */
t_s32 bcn_nf_last;
/** wep status */
@ -3844,14 +3831,6 @@ typedef struct _mlan_ds_reject_addba_req {
t_u32 conditions;
} mlan_ds_reject_addba_req, *pmlan_ds_reject_addba_req;
/** Type definition of mlan_ds_ibss_ampdu_param */
typedef struct _mlan_ds_ibss_ampdu_param {
/** ampdu priority table */
t_u8 ampdu[MAX_NUM_TID];
/** rx amdpdu setting */
t_u8 addba_reject[MAX_NUM_TID];
} mlan_ds_ibss_ampdu_param, *pmlan_ds_ibss_ampdu_param;
/** Type definition of mlan_ds_11n_cfg for MLAN_IOCTL_11N_CFG */
typedef struct _mlan_ds_11n_cfg {
/** Sub-command */
@ -3888,8 +3867,6 @@ typedef struct _mlan_ds_11n_cfg {
t_u32 coex_rx_winsize;
/** Control TX AMPDU configuration */
t_u32 txaggrctrl;
/** aggrprirotity table for MLAN_OID_11N_CFG_IBSS_AMPDU_PARAM */
mlan_ds_ibss_ampdu_param ibss_ampdu;
/** Minimum BA Threshold for MLAN_OID_11N_CFG_MIN_BA_THRESHOLD
*/
t_u8 min_ba_threshold;
@ -4034,6 +4011,7 @@ typedef struct _mlan_ds_11ax_cfg {
#define MRVL_DOT11AX_ENABLE_SR_TLV_ID (PROPRIETARY_TLV_BASE_ID + 322)
#define MRVL_DOT11AX_OBSS_PD_OFFSET_TLV_ID (PROPRIETARY_TLV_BASE_ID + 323)
#define NXP_6E_INBAND_FRAMES_TLV_ID (PROPRIETARY_TLV_BASE_ID + 345) // 0x0159
/** Type definition of mlan_11axcmdcfg_obss_pd_offset for MLAN_OID_11AX_CMD_CFG
*/
@ -5789,6 +5767,8 @@ typedef struct _mlan_ds_misc_chan_trpc_cfg {
#define MFG_CMD_RADIO_MODE_CFG 0x1211
#define MFG_CMD_CONFIG_MAC_HE_TB_TX 0x110A
#define MFG_CMD_CONFIG_TRIGGER_FRAME 0x110C
#define MFG_CMD_OTP_MAC_ADD 0x108C
/** MFG CMD generic cfg */
struct MLAN_PACK_START mfg_cmd_generic_cfg {
/** MFG command code */
@ -6083,6 +6063,19 @@ typedef MLAN_PACK_START struct _mfg_Cmd_IEEEtypes_CtlBasicTrigHdr_t {
mfg_cmd_IEEETypes_BasicHETrigUserInfo_t basic_trig_user_info;
} MLAN_PACK_END mfg_Cmd_IEEEtypes_CtlBasicTrigHdr_t;
typedef MLAN_PACK_START struct _mfg_cmd_otp_mac_addr_rd_wr_t {
/** MFG command code */
t_u32 mfg_cmd;
/** Action */
t_u16 action;
/** Device ID */
t_u16 device_id;
/** MFG Error code */
t_u32 error;
/** Destination MAC Address */
t_u8 mac_addr[MLAN_MAC_ADDR_LENGTH];
} MLAN_PACK_END mfg_cmd_otp_mac_addr_rd_wr_t;
typedef struct _mlan_ds_misc_chnrgpwr_cfg {
/** length */
t_u16 length;
@ -6108,13 +6101,15 @@ typedef struct _mlan_ds_mc_aggr_cfg {
* bit 0 MC aggregation
* bit 1 packet expiry
* bit 2 CTS2Self
* bit 3 CTS2Self duration offset*/
* bit 3 CTS2Self duration offset
* bit 6 UC non aggregation*/
t_u8 enable_bitmap;
/* 1 valid, 0 invalid
* bit 0 MC aggregation
* bit 1 packet expiry
* bit 2 CTS2Self
* bit 3 CTS2Self duration offset*/
* bit 3 CTS2Self duration offset
* bit 6 UC non aggregation*/
t_u8 mask_bitmap;
/** CTS2Self duration offset */
t_u16 cts2self_offset;
@ -6331,6 +6326,7 @@ typedef struct _mlan_ds_misc_cfg {
struct mfg_cmd_tx_frame2 mfg_tx_frame2;
struct mfg_Cmd_HE_TBTx_t mfg_he_power;
mfg_Cmd_IEEEtypes_CtlBasicTrigHdr_t mfg_tx_trigger_config;
mfg_cmd_otp_mac_addr_rd_wr_t mfg_otp_mac_addr_rd_wr;
mlan_ds_misc_arb_cfg arb_cfg;
mlan_ds_misc_cfp_tbl cfp;
t_u8 range_ext_mode;

View file

@ -1642,7 +1642,7 @@ mlan_status wlan_ret_802_11_associate(mlan_private *pmpriv,
hdr = (IEEEtypes_MgmtHdr_t *)&resp->params;
sub_type = IEEE80211_GET_FC_MGMT_FRAME_SUBTYPE(hdr->FrmCtl);
if (!memcmp(pmpriv->adapter, hdr->BssId,
pmpriv->pattempted_bss_desc->mac_address,
pmpriv->curr_bss_params.attemp_bssid,
MLAN_MAC_ADDR_LENGTH) &&
((sub_type == SUBTYPE_ASSOC_RESP) ||
(sub_type == SUBTYPE_REASSOC_RESP))) {
@ -1916,778 +1916,6 @@ done:
return ret;
}
/**
* @brief This function prepares command of ad_hoc_start.
*
* @param pmpriv A pointer to mlan_private structure
* @param cmd A pointer to HostCmd_DS_COMMAND structure
* @param pdata_buf A pointer cast of mlan_802_11_ssid structure
*
* @return MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE
*/
mlan_status wlan_cmd_802_11_ad_hoc_start(mlan_private *pmpriv,
HostCmd_DS_COMMAND *cmd,
t_void *pdata_buf)
{
mlan_status ret = MLAN_STATUS_SUCCESS;
mlan_adapter *pmadapter = pmpriv->adapter;
HostCmd_DS_802_11_AD_HOC_START *padhoc_start = &cmd->params.adhoc_start;
BSSDescriptor_t *pbss_desc;
t_u32 cmd_append_size = 0;
t_u32 i;
t_u16 tmp_cap;
MrvlIEtypes_ChanListParamSet_t *pchan_tlv;
MrvlIEtypes_RsnParamSet_t *prsn_ie_tlv;
/* wpa ie for WPA_NONE AES */
const t_u8 wpa_ie[24] = {0xdd, 0x16, 0x00, 0x50, 0xf2, 0x01,
0x01, 0x00, 0x00, 0x50, 0xf2, 0x04,
0x01, 0x00, 0x00, 0x50, 0xf2, 0x00,
0x01, 0x00, 0x00, 0x50, 0xf2, 0x00};
t_s32 append_size_11h = 0;
t_u8 *pos =
(t_u8 *)padhoc_start + sizeof(HostCmd_DS_802_11_AD_HOC_START);
ENTER();
if (!pmadapter) {
ret = MLAN_STATUS_FAILURE;
goto done;
}
cmd->command = wlan_cpu_to_le16(HostCmd_CMD_802_11_AD_HOC_START);
pbss_desc = &pmpriv->curr_bss_params.bss_descriptor;
pmpriv->pattempted_bss_desc = pbss_desc;
/*
* Fill in the parameters for 2 data structures:
* 1. HostCmd_DS_802_11_AD_HOC_START command
* 2. pbss_desc
* Driver will fill up SSID, bss_mode,IBSS param, Physical Param,
* probe delay, and Cap info.
* Firmware will fill up beacon period, Basic rates
* and operational rates.
*/
memset(pmadapter, padhoc_start->ssid, 0, MLAN_MAX_SSID_LENGTH);
memcpy_ext(pmadapter, padhoc_start->ssid,
((mlan_802_11_ssid *)pdata_buf)->ssid,
((mlan_802_11_ssid *)pdata_buf)->ssid_len,
MLAN_MAX_SSID_LENGTH);
PRINTM(MINFO, "ADHOC_S_CMD: SSID = %s\n", padhoc_start->ssid);
memset(pmadapter, pbss_desc->ssid.ssid, 0, MLAN_MAX_SSID_LENGTH);
memcpy_ext(pmadapter, pbss_desc->ssid.ssid,
((mlan_802_11_ssid *)pdata_buf)->ssid,
((mlan_802_11_ssid *)pdata_buf)->ssid_len,
MLAN_MAX_SSID_LENGTH);
pbss_desc->ssid.ssid_len =
MIN(MLAN_MAX_SSID_LENGTH,
((mlan_802_11_ssid *)pdata_buf)->ssid_len);
/* Set the BSS mode */
padhoc_start->bss_mode = HostCmd_BSS_MODE_IBSS;
pbss_desc->bss_mode = MLAN_BSS_MODE_IBSS;
padhoc_start->beacon_period = wlan_cpu_to_le16(pmpriv->beacon_period);
pbss_desc->beacon_period = pmpriv->beacon_period;
/* Set Physical param set */
/** Parameter IE Id */
#define DS_PARA_IE_ID 3
/** Parameter IE length */
#define DS_PARA_IE_LEN 1
padhoc_start->phy_param_set.ds_param_set.element_id = DS_PARA_IE_ID;
padhoc_start->phy_param_set.ds_param_set.len = DS_PARA_IE_LEN;
if (!wlan_get_cfp_by_band_and_channel(
pmadapter, pmadapter->adhoc_start_band,
(t_u16)pmpriv->adhoc_channel, pmadapter->region_channel)) {
chan_freq_power_t *cfp;
cfp = wlan_get_cfp_by_band_and_channel(
pmadapter, pmadapter->adhoc_start_band,
FIRST_VALID_CHANNEL, pmadapter->region_channel);
if (cfp)
pmpriv->adhoc_channel = (t_u8)cfp->channel;
}
MASSERT(pmpriv->adhoc_channel);
PRINTM(MINFO, "ADHOC_S_CMD: Creating ADHOC on Channel %d\n",
pmpriv->adhoc_channel);
pmpriv->curr_bss_params.bss_descriptor.channel = pmpriv->adhoc_channel;
pmpriv->curr_bss_params.band = pmadapter->adhoc_start_band;
pbss_desc->channel = pmpriv->adhoc_channel;
padhoc_start->phy_param_set.ds_param_set.current_chan =
pmpriv->adhoc_channel;
memcpy_ext(pmadapter, &pbss_desc->phy_param_set,
&padhoc_start->phy_param_set,
sizeof(IEEEtypes_PhyParamSet_t),
sizeof(IEEEtypes_PhyParamSet_t));
pbss_desc->network_type_use = Wlan802_11DS;
/* Set IBSS param set */
/** IBSS parameter IE Id */
#define IBSS_PARA_IE_ID 6
/** IBSS parameter IE length */
#define IBSS_PARA_IE_LEN 2
padhoc_start->ss_param_set.ibss_param_set.element_id = IBSS_PARA_IE_ID;
padhoc_start->ss_param_set.ibss_param_set.len = IBSS_PARA_IE_LEN;
padhoc_start->ss_param_set.ibss_param_set.atim_window =
wlan_cpu_to_le16(pmpriv->atim_window);
pbss_desc->atim_window = pmpriv->atim_window;
memcpy_ext(pmadapter, &pbss_desc->ss_param_set,
&padhoc_start->ss_param_set, sizeof(IEEEtypes_SsParamSet_t),
sizeof(IEEEtypes_SsParamSet_t));
/* Set Capability info */
padhoc_start->cap.ess = 0;
padhoc_start->cap.ibss = 1;
pbss_desc->cap_info.ibss = 1;
/* Set up privacy in pbss_desc */
if (pmpriv->sec_info.wep_status == Wlan802_11WEPEnabled ||
pmpriv->sec_info.wpa_enabled || pmpriv->sec_info.ewpa_enabled) {
/** Ad-Hoc capability privacy on */
#define AD_HOC_CAP_PRIVACY_ON 1
PRINTM(MINFO, "ADHOC_S_CMD: wep_status set, Privacy to WEP\n");
pbss_desc->privacy = Wlan802_11PrivFilter8021xWEP;
padhoc_start->cap.privacy = AD_HOC_CAP_PRIVACY_ON;
} else {
PRINTM(MWARN, "ADHOC_S_CMD: wep_status NOT set, Setting "
"Privacy to ACCEPT ALL\n");
pbss_desc->privacy = Wlan802_11PrivFilterAcceptAll;
}
memset(pmadapter, padhoc_start->DataRate, 0,
sizeof(padhoc_start->DataRate));
if ((pmpriv->adapter->region_code == COUNTRY_CODE_JP_40 ||
pmpriv->adapter->region_code == COUNTRY_CODE_JP_FF) &&
(pbss_desc->phy_param_set.ds_param_set.current_chan == 14)) {
wlan_get_active_data_rates(pmpriv, pmpriv->bss_mode, BAND_B,
padhoc_start->DataRate);
} else {
wlan_get_active_data_rates(pmpriv, pmpriv->bss_mode,
pmadapter->adhoc_start_band,
padhoc_start->DataRate);
}
if ((pmadapter->adhoc_start_band & BAND_G) &&
(pmpriv->curr_pkt_filter & HostCmd_ACT_MAC_ADHOC_G_PROTECTION_ON)) {
ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_MAC_CONTROL,
HostCmd_ACT_GEN_SET, 0, MNULL,
&pmpriv->curr_pkt_filter);
if (ret) {
PRINTM(MERROR,
"ADHOC_S_CMD: G Protection config failed\n");
ret = MLAN_STATUS_FAILURE;
goto done;
}
}
/* Find the last non zero */
for (i = 0;
i < sizeof(padhoc_start->DataRate) && padhoc_start->DataRate[i];
i++)
/* XXX Do not delete no-operation line */
;
pmpriv->curr_bss_params.num_of_rates = i;
/* Copy the ad-hoc creating rates into Current BSS rate structure */
memcpy_ext(pmadapter, &pmpriv->curr_bss_params.data_rates,
&padhoc_start->DataRate,
pmpriv->curr_bss_params.num_of_rates, WLAN_SUPPORTED_RATES);
PRINTM(MINFO, "ADHOC_S_CMD: Rates=%02x %02x %02x %02x\n",
padhoc_start->DataRate[0], padhoc_start->DataRate[1],
padhoc_start->DataRate[2], padhoc_start->DataRate[3]);
PRINTM(MINFO, "ADHOC_S_CMD: AD HOC Start command is ready\n");
if (IS_SUPPORT_MULTI_BANDS(pmadapter)) {
/* Append a channel TLV */
pchan_tlv = (MrvlIEtypes_ChanListParamSet_t *)pos;
pchan_tlv->header.type = wlan_cpu_to_le16(TLV_TYPE_CHANLIST);
pchan_tlv->header.len =
wlan_cpu_to_le16(sizeof(ChanScanParamSet_t));
memset(pmadapter, pchan_tlv->chan_scan_param, 0x00,
sizeof(ChanScanParamSet_t));
pchan_tlv->chan_scan_param[0].chan_number =
(t_u8)pmpriv->curr_bss_params.bss_descriptor.channel;
PRINTM(MINFO, "ADHOC_S_CMD: TLV Chan = %d\n",
pchan_tlv->chan_scan_param[0].chan_number);
pchan_tlv->chan_scan_param[0].bandcfg.chanBand =
wlan_band_to_radio_type(pmpriv->curr_bss_params.band);
PRINTM(MINFO, "ADHOC_S_CMD: TLV Bandcfg = %x\n",
pchan_tlv->chan_scan_param[0].bandcfg);
pos += sizeof(pchan_tlv->header) + sizeof(ChanScanParamSet_t);
cmd_append_size +=
sizeof(pchan_tlv->header) + sizeof(ChanScanParamSet_t);
}
if (wlan_11d_create_dnld_countryinfo(pmpriv,
pmpriv->curr_bss_params.band)) {
PRINTM(MERROR, "ADHOC_S_CMD: dnld_countryinfo_11d failed\n");
ret = MLAN_STATUS_FAILURE;
goto done;
}
/*
* Call 11h start API to add any 11h flags/elements as TLV parameters
*/
append_size_11h =
wlan_11h_process_start(pmpriv, &pos, &padhoc_start->cap,
pmpriv->adhoc_channel,
&pbss_desc->wlan_11h_bss_info);
if (append_size_11h >= 0)
cmd_append_size += append_size_11h;
else {
ret = MLAN_STATUS_FAILURE;
goto done;
}
if (pmpriv->sec_info.ewpa_enabled) {
memcpy_ext(pmadapter, pmpriv->wpa_ie, wpa_ie, sizeof(wpa_ie),
sizeof(pmpriv->wpa_ie));
pmpriv->wpa_ie_len = sizeof(wpa_ie);
}
if (pmpriv->sec_info.wpa_enabled || pmpriv->sec_info.ewpa_enabled) {
prsn_ie_tlv = (MrvlIEtypes_RsnParamSet_t *)pos;
prsn_ie_tlv->header.type = (t_u16)pmpriv->wpa_ie[0];
/* WPA_IE or RSN_IE */
prsn_ie_tlv->header.type = prsn_ie_tlv->header.type & 0x00FF;
prsn_ie_tlv->header.type =
wlan_cpu_to_le16(prsn_ie_tlv->header.type);
prsn_ie_tlv->header.len = (t_u16)pmpriv->wpa_ie[1];
prsn_ie_tlv->header.len = prsn_ie_tlv->header.len & 0x00FF;
if (prsn_ie_tlv->header.len <= (sizeof(pmpriv->wpa_ie) - 2))
memcpy_ext(pmadapter, prsn_ie_tlv->rsn_ie,
&pmpriv->wpa_ie[2], prsn_ie_tlv->header.len,
prsn_ie_tlv->header.len);
else {
ret = MLAN_STATUS_FAILURE;
goto done;
}
DBG_HEXDUMP(MCMD_D, "ADHOC_S_CMD: RSN IE", (t_u8 *)prsn_ie_tlv,
sizeof(prsn_ie_tlv->header) +
prsn_ie_tlv->header.len);
pos += sizeof(prsn_ie_tlv->header) + prsn_ie_tlv->header.len;
cmd_append_size +=
sizeof(prsn_ie_tlv->header) + prsn_ie_tlv->header.len;
prsn_ie_tlv->header.len =
wlan_cpu_to_le16(prsn_ie_tlv->header.len);
}
if (pmpriv->curr_bss_params.host_mlme) {
MrvlIEtypes_HostMlme_t *host_mlme_tlv =
(MrvlIEtypes_HostMlme_t *)pos;
host_mlme_tlv->header.type =
wlan_cpu_to_le16(TLV_TYPE_HOST_MLME);
host_mlme_tlv->header.len = sizeof(host_mlme_tlv->host_mlme);
host_mlme_tlv->host_mlme = MTRUE;
pos += sizeof(host_mlme_tlv->header) +
host_mlme_tlv->header.len;
cmd_append_size += sizeof(MrvlIEtypes_HostMlme_t);
host_mlme_tlv->header.len =
wlan_cpu_to_le16(host_mlme_tlv->header.len);
}
cmd->size = (t_u16)wlan_cpu_to_le16(
(t_u16)(sizeof(HostCmd_DS_802_11_AD_HOC_START) + S_DS_GEN +
cmd_append_size));
memcpy_ext(pmadapter, &tmp_cap, &padhoc_start->cap, sizeof(t_u16),
sizeof(tmp_cap));
if (pmadapter->adhoc_start_band == BAND_B)
SHORT_SLOT_TIME_DISABLED(tmp_cap);
else
SHORT_SLOT_TIME_ENABLED(tmp_cap);
tmp_cap = wlan_cpu_to_le16(tmp_cap);
memcpy_ext(pmadapter, &padhoc_start->cap, &tmp_cap, sizeof(t_u16),
sizeof(padhoc_start->cap));
ret = MLAN_STATUS_SUCCESS;
done:
LEAVE();
return ret;
}
/**
* @brief This function prepares command of ad_hoc_join.
*
* @param pmpriv A pointer to mlan_private structure
* @param cmd A pointer to HostCmd_DS_COMMAND structure
* @param pdata_buf Void cast of BSSDescriptor_t from the
* scan table to join
*
* @return MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE
*/
mlan_status wlan_cmd_802_11_ad_hoc_join(mlan_private *pmpriv,
HostCmd_DS_COMMAND *cmd,
t_void *pdata_buf)
{
mlan_status ret = MLAN_STATUS_SUCCESS;
mlan_adapter *pmadapter = pmpriv->adapter;
HostCmd_DS_802_11_AD_HOC_JOIN *padhoc_join = &cmd->params.adhoc_join;
BSSDescriptor_t *pbss_desc = (BSSDescriptor_t *)pdata_buf;
MrvlIEtypes_ChanListParamSet_t *pchan_tlv;
MrvlIEtypes_RsnParamSet_t *prsn_ie_tlv;
t_u32 cmd_append_size = 0;
t_u16 tmp_cap;
t_u32 i, rates_size = 0;
t_u32 curr_pkt_filter;
t_u8 *pos = (t_u8 *)padhoc_join + sizeof(HostCmd_DS_802_11_AD_HOC_JOIN);
t_s32 append_size_11h = 0;
ENTER();
/** Use G protection */
#define USE_G_PROTECTION 0x02
if (pbss_desc->erp_flags & USE_G_PROTECTION) {
curr_pkt_filter = pmpriv->curr_pkt_filter |
HostCmd_ACT_MAC_ADHOC_G_PROTECTION_ON;
ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_MAC_CONTROL,
HostCmd_ACT_GEN_SET, 0, MNULL,
&curr_pkt_filter);
if (ret) {
PRINTM(MERROR,
"ADHOC_J_CMD: G Protection config failed\n");
ret = MLAN_STATUS_FAILURE;
goto done;
}
}
pmpriv->pattempted_bss_desc = pbss_desc;
cmd->command = wlan_cpu_to_le16(HostCmd_CMD_802_11_AD_HOC_JOIN);
padhoc_join->bss_descriptor.bss_mode = HostCmd_BSS_MODE_IBSS;
padhoc_join->bss_descriptor.beacon_period =
wlan_cpu_to_le16(pbss_desc->beacon_period);
memcpy_ext(pmadapter, &padhoc_join->bss_descriptor.bssid,
&pbss_desc->mac_address, MLAN_MAC_ADDR_LENGTH,
MLAN_MAC_ADDR_LENGTH);
memcpy_ext(pmadapter, &padhoc_join->bss_descriptor.ssid,
&pbss_desc->ssid.ssid, pbss_desc->ssid.ssid_len,
MLAN_MAX_SSID_LENGTH);
memcpy_ext(pmadapter, &padhoc_join->bss_descriptor.phy_param_set,
&pbss_desc->phy_param_set, sizeof(IEEEtypes_PhyParamSet_t),
sizeof(IEEEtypes_PhyParamSet_t));
padhoc_join->bss_descriptor.phy_param_set.fh_param_set.dwell_time =
wlan_cpu_to_le16(padhoc_join->bss_descriptor.phy_param_set
.fh_param_set.dwell_time);
memcpy_ext(pmadapter, &padhoc_join->bss_descriptor.ss_param_set,
&pbss_desc->ss_param_set, sizeof(IEEEtypes_SsParamSet_t),
sizeof(IEEEtypes_SsParamSet_t));
padhoc_join->bss_descriptor.ss_param_set.ibss_param_set.atim_window = 0;
padhoc_join->bss_descriptor.ss_param_set.ibss_param_set.atim_window =
wlan_cpu_to_le16(padhoc_join->bss_descriptor.ss_param_set
.ibss_param_set.atim_window);
memcpy_ext(pmadapter, &tmp_cap, &pbss_desc->cap_info,
sizeof(IEEEtypes_CapInfo_t), sizeof(IEEEtypes_CapInfo_t));
tmp_cap &= CAPINFO_MASK;
PRINTM(MINFO, "ADHOC_J_CMD: tmp_cap=%4X CAPINFO_MASK=%4lX\n", tmp_cap,
CAPINFO_MASK);
memcpy_ext(pmadapter, &padhoc_join->bss_descriptor.cap, &tmp_cap,
sizeof(IEEEtypes_CapInfo_t), sizeof(IEEEtypes_CapInfo_t));
/* Information on BSSID descriptor passed to FW */
PRINTM(MINFO, "ADHOC_J_CMD: BSSID = " MACSTR ", SSID = %s\n",
MAC2STR(padhoc_join->bss_descriptor.bssid),
padhoc_join->bss_descriptor.ssid);
for (i = 0; i < WLAN_SUPPORTED_RATES && pbss_desc->supported_rates[i];
i++)
/* XXX Do not delete no-operation line */
;
rates_size = i;
/* Copy Data Rates from the Rates recorded in scan response */
memset(pmadapter, padhoc_join->bss_descriptor.data_rates, 0,
sizeof(padhoc_join->bss_descriptor.data_rates));
memcpy_ext(pmadapter, padhoc_join->bss_descriptor.data_rates,
pbss_desc->supported_rates, rates_size,
WLAN_SUPPORTED_RATES);
HEXDUMP("Adapted Rates:", padhoc_join->bss_descriptor.data_rates,
rates_size);
/* Copy the adhoc join rates into Current BSS state structure */
pmpriv->curr_bss_params.num_of_rates = rates_size;
memcpy_ext(pmadapter, &pmpriv->curr_bss_params.data_rates,
pbss_desc->supported_rates, rates_size,
WLAN_SUPPORTED_RATES);
/* Copy the channel information */
pmpriv->curr_bss_params.bss_descriptor.channel = pbss_desc->channel;
pmpriv->curr_bss_params.band = pbss_desc->bss_band;
if (pmpriv->sec_info.wep_status == Wlan802_11WEPEnabled ||
pmpriv->sec_info.wpa_enabled || pmpriv->sec_info.ewpa_enabled)
padhoc_join->bss_descriptor.cap.privacy = AD_HOC_CAP_PRIVACY_ON;
if (IS_SUPPORT_MULTI_BANDS(pmadapter)) {
/* Append a channel TLV */
pchan_tlv = (MrvlIEtypes_ChanListParamSet_t *)pos;
pchan_tlv->header.type = wlan_cpu_to_le16(TLV_TYPE_CHANLIST);
pchan_tlv->header.len =
wlan_cpu_to_le16(sizeof(ChanScanParamSet_t));
memset(pmadapter, pchan_tlv->chan_scan_param, 0x00,
sizeof(ChanScanParamSet_t));
pchan_tlv->chan_scan_param[0].chan_number =
(pbss_desc->phy_param_set.ds_param_set.current_chan);
PRINTM(MINFO, "ADHOC_J_CMD: TLV Chan = %d\n",
pchan_tlv->chan_scan_param[0].chan_number);
pchan_tlv->chan_scan_param[0].bandcfg.chanBand =
wlan_band_to_radio_type(pbss_desc->bss_band);
PRINTM(MINFO, "ADHOC_J_CMD: TLV Bandcfg = %x\n",
pchan_tlv->chan_scan_param[0].bandcfg);
pos += sizeof(pchan_tlv->header) + sizeof(ChanScanParamSet_t);
cmd_append_size +=
sizeof(pchan_tlv->header) + sizeof(ChanScanParamSet_t);
}
if (wlan_11d_create_dnld_countryinfo(pmpriv, pbss_desc->bss_band)) {
PRINTM(MERROR, "Dnld_countryinfo_11d failed\n");
ret = MLAN_STATUS_FAILURE;
goto done;
}
if (wlan_11d_parse_dnld_countryinfo(pmpriv,
pmpriv->pattempted_bss_desc)) {
ret = MLAN_STATUS_FAILURE;
goto done;
}
/*
* Call 11h join API after capability bits are set so
* adhoc/infra 11h behavior can be properly triggered.
* pos modified if data is appended
*/
append_size_11h +=
wlan_11h_process_join(pmpriv, &pos,
&padhoc_join->bss_descriptor.cap,
pbss_desc->bss_band, pbss_desc->channel,
&pbss_desc->wlan_11h_bss_info);
if (append_size_11h >= 0)
cmd_append_size += append_size_11h;
else {
ret = MLAN_STATUS_FAILURE;
goto done;
}
if (pmpriv->sec_info.wpa_enabled) {
prsn_ie_tlv = (MrvlIEtypes_RsnParamSet_t *)pos;
/* WPA_IE or RSN_IE */
prsn_ie_tlv->header.type = (t_u16)pmpriv->wpa_ie[0];
prsn_ie_tlv->header.type = prsn_ie_tlv->header.type & 0x00FF;
prsn_ie_tlv->header.type =
wlan_cpu_to_le16(prsn_ie_tlv->header.type);
prsn_ie_tlv->header.len = (t_u16)pmpriv->wpa_ie[1];
prsn_ie_tlv->header.len = prsn_ie_tlv->header.len & 0x00FF;
if (prsn_ie_tlv->header.len <= (sizeof(pmpriv->wpa_ie) - 2))
memcpy_ext(pmadapter, prsn_ie_tlv->rsn_ie,
&pmpriv->wpa_ie[2], prsn_ie_tlv->header.len,
prsn_ie_tlv->header.len);
else {
ret = MLAN_STATUS_FAILURE;
goto done;
}
HEXDUMP("ADHOC_JOIN: RSN IE", (t_u8 *)prsn_ie_tlv,
sizeof(prsn_ie_tlv->header) + prsn_ie_tlv->header.len);
pos += sizeof(prsn_ie_tlv->header) + prsn_ie_tlv->header.len;
cmd_append_size +=
sizeof(prsn_ie_tlv->header) + prsn_ie_tlv->header.len;
prsn_ie_tlv->header.len =
wlan_cpu_to_le16(prsn_ie_tlv->header.len);
} else if (pmpriv->sec_info.ewpa_enabled) {
prsn_ie_tlv = (MrvlIEtypes_RsnParamSet_t *)pos;
if (pbss_desc->pwpa_ie) {
prsn_ie_tlv->header.type =
(t_u16)(*(pbss_desc->pwpa_ie))
.vend_hdr.element_id;
prsn_ie_tlv->header.type =
prsn_ie_tlv->header.type & 0x00FF;
prsn_ie_tlv->header.type =
wlan_cpu_to_le16(prsn_ie_tlv->header.type);
prsn_ie_tlv->header.len =
(t_u16)(*(pbss_desc->pwpa_ie)).vend_hdr.len;
prsn_ie_tlv->header.len =
prsn_ie_tlv->header.len & 0x00FF;
if (prsn_ie_tlv->header.len <=
(sizeof(pmpriv->wpa_ie))) {
memcpy_ext(pmadapter, prsn_ie_tlv->rsn_ie,
&((*(pbss_desc->pwpa_ie))
.vend_hdr.oui[0]),
prsn_ie_tlv->header.len,
prsn_ie_tlv->header.len);
} else {
ret = MLAN_STATUS_FAILURE;
goto done;
}
HEXDUMP("ADHOC_JOIN: RSN IE", (t_u8 *)prsn_ie_tlv,
sizeof(prsn_ie_tlv->header) +
prsn_ie_tlv->header.len);
pos += sizeof(prsn_ie_tlv->header) +
prsn_ie_tlv->header.len;
cmd_append_size += sizeof(prsn_ie_tlv->header) +
prsn_ie_tlv->header.len;
prsn_ie_tlv->header.len =
wlan_cpu_to_le16(prsn_ie_tlv->header.len);
}
if (pbss_desc->prsn_ie) {
prsn_ie_tlv = (MrvlIEtypes_RsnParamSet_t *)pos;
prsn_ie_tlv->header.type =
(t_u16)(*(pbss_desc->prsn_ie))
.ieee_hdr.element_id;
prsn_ie_tlv->header.type =
prsn_ie_tlv->header.type & 0x00FF;
prsn_ie_tlv->header.type =
wlan_cpu_to_le16(prsn_ie_tlv->header.type);
prsn_ie_tlv->header.len =
(t_u16)(*(pbss_desc->prsn_ie)).ieee_hdr.len;
prsn_ie_tlv->header.len =
prsn_ie_tlv->header.len & 0x00FF;
if (prsn_ie_tlv->header.len <=
(sizeof(pmpriv->wpa_ie))) {
memcpy_ext(pmadapter, prsn_ie_tlv->rsn_ie,
&((*(pbss_desc->prsn_ie)).data[0]),
prsn_ie_tlv->header.len,
prsn_ie_tlv->header.len);
} else {
ret = MLAN_STATUS_FAILURE;
goto done;
}
HEXDUMP("ADHOC_JOIN: RSN IE", (t_u8 *)prsn_ie_tlv,
sizeof(prsn_ie_tlv->header) +
prsn_ie_tlv->header.len);
pos += sizeof(prsn_ie_tlv->header) +
prsn_ie_tlv->header.len;
cmd_append_size += sizeof(prsn_ie_tlv->header) +
prsn_ie_tlv->header.len;
prsn_ie_tlv->header.len =
wlan_cpu_to_le16(prsn_ie_tlv->header.len);
}
}
if (pmpriv->curr_bss_params.host_mlme) {
MrvlIEtypes_HostMlme_t *host_mlme_tlv =
(MrvlIEtypes_HostMlme_t *)pos;
host_mlme_tlv->header.type =
wlan_cpu_to_le16(TLV_TYPE_HOST_MLME);
host_mlme_tlv->header.len = sizeof(host_mlme_tlv->host_mlme);
host_mlme_tlv->host_mlme = MTRUE;
pos += sizeof(host_mlme_tlv->header) +
host_mlme_tlv->header.len;
cmd_append_size += sizeof(MrvlIEtypes_HostMlme_t);
host_mlme_tlv->header.len =
wlan_cpu_to_le16(host_mlme_tlv->header.len);
}
cmd->size = (t_u16)wlan_cpu_to_le16(
(t_u16)(sizeof(HostCmd_DS_802_11_AD_HOC_JOIN) + S_DS_GEN +
cmd_append_size));
memcpy_ext(pmadapter, &tmp_cap, &padhoc_join->bss_descriptor.cap,
sizeof(IEEEtypes_CapInfo_t), sizeof(IEEEtypes_CapInfo_t));
tmp_cap = wlan_cpu_to_le16(tmp_cap);
memcpy_ext(pmadapter, &padhoc_join->bss_descriptor.cap, &tmp_cap,
sizeof(IEEEtypes_CapInfo_t), sizeof(IEEEtypes_CapInfo_t));
done:
LEAVE();
return ret;
}
/**
* @brief This function handles the command response of ad_hoc_start and
* ad_hoc_join
*
* @param pmpriv A pointer to mlan_private structure
* @param resp A pointer to HostCmd_DS_COMMAND
* @param pioctl_buf A pointer to mlan_ioctl_req structure
*
* @return MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE
*/
mlan_status wlan_ret_802_11_ad_hoc(mlan_private *pmpriv,
HostCmd_DS_COMMAND *resp, t_void *pioctl_buf)
{
mlan_status ret = MLAN_STATUS_SUCCESS;
mlan_ioctl_req *pioctl_req = (mlan_ioctl_req *)pioctl_buf;
HostCmd_DS_802_11_AD_HOC_START_RESULT *padhoc_start_result =
&resp->params.adhoc_start_result;
HostCmd_DS_802_11_AD_HOC_JOIN_RESULT *padhoc_join_result =
&resp->params.adhoc_join_result;
BSSDescriptor_t *pbss_desc;
t_u16 command = resp->command;
t_u8 result = 0;
t_u8 event_buf[100];
mlan_event *pevent = (mlan_event *)event_buf;
int ie_len = 0;
IEEEtypes_WmmParameter_t *pwmm_param_ie = MNULL;
mlan_adapter *pmadapter = pmpriv->adapter;
const t_u8 wmm_oui[4] = {0x00, 0x50, 0xf2, 0x02};
ENTER();
pmpriv->wmm_enabled = MFALSE;
if (command == HostCmd_CMD_802_11_AD_HOC_START) {
result = padhoc_start_result->result;
ie_len = resp->size -
(sizeof(HostCmd_DS_802_11_AD_HOC_START_RESULT) +
S_DS_GEN);
pwmm_param_ie =
(IEEEtypes_WmmParameter_t
*)((t_u8 *)resp +
(sizeof(HostCmd_DS_802_11_AD_HOC_START_RESULT) +
S_DS_GEN));
} else {
result = padhoc_join_result->result;
ie_len = resp->size -
(sizeof(HostCmd_DS_802_11_AD_HOC_JOIN_RESULT) +
S_DS_GEN);
pwmm_param_ie =
(IEEEtypes_WmmParameter_t
*)((t_u8 *)resp +
(sizeof(HostCmd_DS_802_11_AD_HOC_JOIN_RESULT) +
S_DS_GEN));
}
pbss_desc = pmpriv->pattempted_bss_desc;
/*
* Join result code 0 --> SUCCESS
*/
if (result) {
PRINTM(MERROR, "ADHOC_RESP Failed 0x%x\n", result);
if (pmpriv->media_connected == MTRUE)
wlan_reset_connect_state(pmpriv, MTRUE);
if (pmpriv->adhoc_state == ADHOC_STARTING)
pmpriv->adhoc_state = ADHOC_IDLE;
memset(pmpriv->adapter, &pmpriv->curr_bss_params.bss_descriptor,
0x00, sizeof(BSSDescriptor_t));
ret = MLAN_STATUS_FAILURE;
goto done;
}
/* Send a Media Connected event, according to the Spec */
pmpriv->media_connected = MTRUE;
if (command == HostCmd_CMD_802_11_AD_HOC_START) {
PRINTM(MINFO, "ADHOC_S_RESP %s\n", pbss_desc->ssid.ssid);
/* Update the created network descriptor with the new BSSID */
memcpy_ext(pmpriv->adapter, pbss_desc->mac_address,
padhoc_start_result->bssid, MLAN_MAC_ADDR_LENGTH,
MLAN_MAC_ADDR_LENGTH);
pmpriv->adhoc_state = ADHOC_STARTED;
if (pmpriv->adapter->state_rdh.stage == RDH_RESTART_INTFS)
wlan_11h_radar_detected_callback((t_void *)pmpriv);
} else {
/*
* Now the join cmd should be successful.
* If BSSID has changed use SSID to compare instead of BSSID
*/
PRINTM(MINFO, "ADHOC_J_RESP %s\n", pbss_desc->ssid.ssid);
/*
* Make a copy of current BSSID descriptor, only needed
* for join since the current descriptor is already
* being used for adhoc start
*/
memcpy_ext(pmpriv->adapter,
&pmpriv->curr_bss_params.bss_descriptor, pbss_desc,
sizeof(BSSDescriptor_t), sizeof(BSSDescriptor_t));
pmpriv->adhoc_state = ADHOC_JOINED;
}
/** process wmm ie */
if (ie_len >= (int)sizeof(IEEEtypes_VendorHeader_t)) {
if ((pwmm_param_ie->vend_hdr.element_id ==
VENDOR_SPECIFIC_221) &&
!memcmp(pmadapter, pwmm_param_ie->vend_hdr.oui, wmm_oui,
sizeof(wmm_oui)) &&
(pwmm_param_ie->vend_hdr.len + 2 == ie_len)) {
DBG_HEXDUMP(MCMD_D, "WMM Param", (t_u8 *)pwmm_param_ie,
ie_len);
memcpy_ext(pmpriv->adapter,
(t_u8 *)&pmpriv->curr_bss_params
.bss_descriptor.wmm_ie,
pwmm_param_ie,
(pwmm_param_ie->vend_hdr.len + 2),
sizeof(IEEEtypes_WmmParameter_t));
pmpriv->wmm_enabled = MTRUE;
wlan_wmm_setup_queue_priorities(pmpriv, pwmm_param_ie);
wlan_wmm_setup_ac_downgrade(pmpriv);
}
}
/* Since WMM is not enabled, setup the queues with the defaults */
if (!pmpriv->wmm_enabled)
wlan_wmm_setup_queues(pmpriv);
PRINTM(MINFO, "ADHOC_RESP: Channel = %d\n", pmpriv->adhoc_channel);
PRINTM(MINFO, "ADHOC_RESP: BSSID = " MACSTR "\n",
MAC2STR(pmpriv->curr_bss_params.bss_descriptor.mac_address));
pevent->bss_index = pmpriv->bss_index;
pevent->event_id = MLAN_EVENT_ID_DRV_CONNECTED;
pevent->event_len = MLAN_MAC_ADDR_LENGTH;
memcpy_ext(pmpriv->adapter, (t_u8 *)pevent->event_buf,
(t_u8 *)pmpriv->curr_bss_params.bss_descriptor.mac_address,
MLAN_MAC_ADDR_LENGTH, MLAN_MAC_ADDR_LENGTH);
wlan_recv_event(pmpriv, MLAN_EVENT_ID_DRV_CONNECTED, pevent);
wlan_save_curr_bcn(pmpriv);
done:
/* Need to indicate IOCTL complete */
if (pioctl_req != MNULL) {
if (ret != MLAN_STATUS_SUCCESS)
pioctl_req->status_code = MLAN_ERROR_CMD_ASSOC_FAIL;
else
pioctl_req->status_code = MLAN_ERROR_NO_ERROR;
}
LEAVE();
return ret;
}
/**
* @brief Associated to a specific BSS discovered in a scan
*
@ -2731,117 +1959,6 @@ mlan_status wlan_associate(mlan_private *pmpriv, t_void *pioctl_buf,
return ret;
}
/**
* @brief Start an Adhoc Network
*
* @param pmpriv A pointer to mlan_private structure
* @param pioctl_buf A pointer to MLAN IOCTL Request buffer
* @param padhoc_ssid The ssid of the Adhoc Network
*
* @return MLAN_STATUS_SUCCESS--success, MLAN_STATUS_FAILURE--fail
*/
mlan_status wlan_adhoc_start(mlan_private *pmpriv, t_void *pioctl_buf,
mlan_802_11_ssid *padhoc_ssid)
{
mlan_status ret = MLAN_STATUS_SUCCESS;
wlan_meas_state_t *pmeas_state = &pmpriv->adapter->state_meas;
t_u8 radar = MFALSE;
pmlan_ioctl_req pioctl_req = (mlan_ioctl_req *)pioctl_buf;
ENTER();
/*
* If the report indicates no measurement was done, leave the default
* return value alone.
*/
if (!pmeas_state->meas_rpt_returned.rpt.basic.map.unmeasured) {
radar = pmeas_state->meas_rpt_returned.rpt.basic.map.radar ?
MTRUE :
MFALSE;
}
if (radar) {
if (pioctl_req)
pioctl_req->status_code = MLAN_ERROR_IOCTL_INVALID;
ret = MLAN_STATUS_FAILURE;
LEAVE();
return ret;
}
PRINTM(MINFO, "Adhoc Channel = %d\n", pmpriv->adhoc_channel);
PRINTM(MINFO, "curr_bss_params.channel = %d\n",
pmpriv->curr_bss_params.bss_descriptor.channel);
PRINTM(MINFO, "curr_bss_params.band = %d\n",
pmpriv->curr_bss_params.band);
ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_802_11_AD_HOC_START,
HostCmd_ACT_GEN_SET, 0, pioctl_buf, padhoc_ssid);
#if defined(STA_SUPPORT)
if (ret == MLAN_STATUS_SUCCESS)
memcpy_ext(pmpriv->adapter, &pmpriv->adhoc_last_start_ssid,
padhoc_ssid, sizeof(mlan_802_11_ssid),
sizeof(mlan_802_11_ssid));
#endif
LEAVE();
return ret;
}
/**
* @brief Join an adhoc network found in a previous scan
*
* @param pmpriv A pointer to mlan_private structure
* @param pioctl_buf A pointer to MLAN IOCTL Request buffer
* @param pbss_desc A pointer to the BSS descriptor found in a previous
* scan to attempt to join
*
* @return MLAN_STATUS_SUCCESS--success, MLAN_STATUS_FAILURE--fail
*/
mlan_status wlan_adhoc_join(mlan_private *pmpriv, t_void *pioctl_buf,
BSSDescriptor_t *pbss_desc)
{
pmlan_adapter pmadapter = pmpriv->adapter;
mlan_status ret = MLAN_STATUS_SUCCESS;
pmlan_ioctl_req pioctl_req = (mlan_ioctl_req *)pioctl_buf;
ENTER();
PRINTM(MINFO, "wlan_adhoc_join: CurBss.ssid =%s\n",
pmpriv->curr_bss_params.bss_descriptor.ssid.ssid);
PRINTM(MINFO, "wlan_adhoc_join: CurBss.ssid_len =%u\n",
pmpriv->curr_bss_params.bss_descriptor.ssid.ssid_len);
PRINTM(MINFO, "wlan_adhoc_join: ssid =%s\n", pbss_desc->ssid.ssid);
PRINTM(MINFO, "wlan_adhoc_join: ssid len =%u\n",
pbss_desc->ssid.ssid_len);
/* Check if the requested SSID is already joined */
if (pmpriv->curr_bss_params.bss_descriptor.ssid.ssid_len &&
!wlan_ssid_cmp(pmadapter, &pbss_desc->ssid,
&pmpriv->curr_bss_params.bss_descriptor.ssid) &&
(pmpriv->curr_bss_params.bss_descriptor.bss_mode ==
MLAN_BSS_MODE_IBSS)) {
PRINTM(MINFO,
"ADHOC_J_CMD: New ad-hoc SSID is the same as current, "
"not attempting to re-join\n");
if (pioctl_req)
pioctl_req->status_code = MLAN_ERROR_IOCTL_INVALID;
LEAVE();
return MLAN_STATUS_FAILURE;
}
PRINTM(MINFO, "curr_bss_params.channel = %d\n",
pmpriv->curr_bss_params.bss_descriptor.channel);
PRINTM(MINFO, "curr_bss_params.band = %d\n",
pmpriv->curr_bss_params.band);
ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_802_11_AD_HOC_JOIN,
HostCmd_ACT_GEN_SET, 0, pioctl_buf, pbss_desc);
LEAVE();
return ret;
}
/**
* @brief Send Deauthentication Request or Stop the AdHoc network depending on
* mode
@ -2867,6 +1984,7 @@ mlan_status wlan_disconnect(mlan_private *pmpriv, mlan_ioctl_req *pioctl_req,
memcpy_ext(pmpriv->adapter, &local_param, deauth_param,
sizeof(*deauth_param), sizeof(local_param));
if (pmpriv->media_connected == MTRUE) {
wlan_clean_txrx(pmpriv);
if (pmpriv->bss_mode == MLAN_BSS_MODE_INFRA) {
if (!deauth_param ||
!memcmp(pmpriv->adapter, deauth_param->mac_addr,
@ -2893,15 +2011,6 @@ mlan_status wlan_disconnect(mlan_private *pmpriv, mlan_ioctl_req *pioctl_req,
if (ret == MLAN_STATUS_SUCCESS && pioctl_req)
ret = MLAN_STATUS_PENDING;
} else if (pmpriv->bss_mode == MLAN_BSS_MODE_IBSS) {
ret = wlan_prepare_cmd(pmpriv,
HostCmd_CMD_802_11_AD_HOC_STOP,
HostCmd_ACT_GEN_SET, 0,
(t_void *)pioctl_req, MNULL);
if (ret == MLAN_STATUS_SUCCESS && pioctl_req)
ret = MLAN_STATUS_PENDING;
}
}

View file

@ -1176,18 +1176,6 @@ typedef struct _mlan_private {
/** ATIM window */
t_u16 atim_window;
/** AdHoc channel */
t_u8 adhoc_channel;
/** AdHoc link sensed flag */
t_u8 adhoc_is_link_sensed;
/** AdHoc operating state */
t_u8 adhoc_state;
#if defined(STA_SUPPORT)
/** AdHoc operating state backup */
t_u8 adhoc_state_prev;
/** AdHoc previous ssid used for Start */
mlan_802_11_ssid adhoc_last_start_ssid;
#endif
mlan_ds_11h_chan_rep_req chan_rep_req;
/** FSM variable for 11d support */
wlan_802_11d_state_t state_11d;
@ -1276,10 +1264,6 @@ typedef struct _mlan_private {
tx_aggr_t aggr_prio_tbl[MAX_NUM_TID];
/** Pointer to the priorities for AMSDU/AMPDU table*/
t_u8 addba_reject[MAX_NUM_TID];
/** Pointer to the priorities for AMSDU/AMPDU table*/
t_u8 ibss_ampdu[MAX_NUM_TID];
/** Pointer to the priorities for AMSDU/AMPDU table*/
t_u8 ibss_addba_reject[MAX_NUM_TID];
/** Struct to store ADDBA parameters */
add_ba_param_t add_ba_param;
/** user rx_win_size */
@ -1948,6 +1932,10 @@ typedef struct _mlan_init_para {
#endif
t_u8 ext_scan;
t_u8 mcs32;
/** antcfg */
t_u32 antcfg;
/** dmcs*/
t_u8 dmcs;
} mlan_init_para, *pmlan_init_para;
#ifdef SDIO
@ -2199,7 +2187,7 @@ typedef struct _mlan_pcie_card {
/** rx interrupt pending */
t_u8 rx_pending;
/** pending num of tx ring buffer in firmware */
t_u8 txbd_pending;
t_u16 txbd_pending;
/** Write pointer for TXBD ring */
t_u32 txbd_wrptr;
/** Shadow copy of TXBD read pointer */
@ -2336,6 +2324,8 @@ typedef struct _adapter_operations {
mlan_status (*disable_host_int)(mlan_adapter *pmadapter);
/** enable host interrupt */
mlan_status (*enable_host_int)(mlan_adapter *pmadapter);
/** select host interrupt */
mlan_status (*select_host_int)(mlan_adapter *pmadapter);
/**Interface header length*/
t_u32 intf_header_len;
} mlan_adapter_operations;
@ -2660,8 +2650,6 @@ struct _mlan_adapter {
/** F/W supported bands */
t_u16 fw_bands;
/** User selected band to start adhoc network */
t_u16 adhoc_start_band;
/** User selected bands */
t_u16 config_bands;
/** Pointer to channel list last sent to the firmware for scanning */
@ -3053,6 +3041,8 @@ mlan_status wlan_misc_ssu(pmlan_adapter pmadapter, pmlan_ioctl_req pioctl_req);
#endif
mlan_status wlan_misc_csi(pmlan_adapter pmadapter, pmlan_ioctl_req pioctl_req);
mlan_status wlan_cmd_csi(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
t_u16 cmd_action, t_u16 *pdata_buf);
mlan_status wlan_process_csi_event(pmlan_private pmpriv);
mlan_status wlan_misc_hal_phy_cfg(pmlan_adapter pmadapter,
@ -3222,6 +3212,7 @@ t_u8 wlan_check_last_packet_indication(pmlan_private priv);
#define MOAL_ALLOC_MLAN_BUFFER MBIT(0)
#define MOAL_MALLOC_BUFFER MBIT(1)
#define MOAL_MEM_FLAG_ATOMIC MBIT(2)
#define MOAL_MEM_FLAG_DIRTY MBIT(3)
#ifdef PCIE
/* This defines the direction arg to the DMA mapping routines. */
@ -3376,6 +3367,7 @@ mlan_status wlan_radio_ioctl_radio_ctl(pmlan_adapter pmadapter,
mlan_status wlan_radio_ioctl_ant_cfg(pmlan_adapter pmadapter,
pmlan_ioctl_req pioctl_req);
mlan_status wlan_handle_antcfg(mlan_private *pmpriv, t_u32 init_antcfg);
mlan_status wlan_cmd_tx_rate_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
t_u16 cmd_action, t_void *pdata_buf,
@ -3421,6 +3413,10 @@ mlan_status wlan_ret_dmcs_config(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
mlan_status wlan_cmd_ssu(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
t_u16 cmd_action, t_u16 *pdata_buf);
#endif
#ifdef PCIE
/** Init write pointer */
mlan_status wlan_pcie_init_fw(pmlan_adapter pmadapter);
#endif
/** send get hw spec command to firmware */
mlan_status wlan_adapter_get_hw_spec(pmlan_adapter pmadapter);
@ -3595,29 +3591,6 @@ t_u16 radio_type_to_band(t_u8 chanBand);
mlan_status wlan_disconnect(mlan_private *pmpriv, mlan_ioctl_req *pioctl_req,
mlan_deauth_param *deauth_param);
/** Ad-Hoc start */
mlan_status wlan_adhoc_start(mlan_private *pmpriv, t_void *pioctl_buf,
mlan_802_11_ssid *padhoc_ssid);
/** Ad-Hoc join */
mlan_status wlan_adhoc_join(mlan_private *pmpriv, t_void *pioctl_buf,
BSSDescriptor_t *pBSSDesc);
/** Ad-Hoc start command handler */
mlan_status wlan_cmd_802_11_ad_hoc_start(mlan_private *pmpriv,
HostCmd_DS_COMMAND *cmd,
t_void *pdata_buf);
/** Ad-Hoc command handler */
mlan_status wlan_cmd_802_11_ad_hoc_join(mlan_private *pmpriv,
HostCmd_DS_COMMAND *cmd,
t_void *pdata_buf);
/** Handler for Ad-Hoc commands */
mlan_status wlan_ret_802_11_ad_hoc(mlan_private *pmpriv,
HostCmd_DS_COMMAND *resp,
t_void *pioctl_buf);
/** Handler for bgscan query commands */
mlan_status wlan_cmd_802_11_bg_scan_query(mlan_private *pmpriv,
HostCmd_DS_COMMAND *pcmd,

View file

@ -1063,6 +1063,8 @@ pmlan_buffer wlan_alloc_mlan_buffer(mlan_adapter *pmadapter, t_u32 data_len,
(t_u32)(sizeof(mlan_buffer) + data_len + DMA_ALIGNMENT);
if (malloc_flag & MOAL_MEM_FLAG_ATOMIC)
mem_flags |= MLAN_MEM_FLAG_ATOMIC;
if (malloc_flag & MOAL_MEM_FLAG_DIRTY)
mem_flags |= MLAN_MEM_FLAG_DIRTY;
ret = pcb->moal_malloc(pmadapter->pmoal_handle, buf_size,
mem_flags, (t_u8 **)&pmbuf);
if ((ret != MLAN_STATUS_SUCCESS) || !pmbuf) {
@ -1070,6 +1072,10 @@ pmlan_buffer wlan_alloc_mlan_buffer(mlan_adapter *pmadapter, t_u32 data_len,
goto exit;
}
if (malloc_flag & MOAL_MEM_FLAG_DIRTY)
memset(pmadapter, pmbuf, 0x00,
sizeof(*pmbuf) + head_room);
pmbuf->pdesc = MNULL;
/* Align address */
pmbuf->pbuf = (t_u8 *)ALIGN_ADDR(
@ -1233,7 +1239,8 @@ mlan_status wlan_bss_ioctl_bss_role(pmlan_adapter pmadapter,
#if defined(WIFI_DIRECT_SUPPORT)
t_u8 bss_mode;
#endif
t_u8 i, global_band = 0;
t_u8 i;
t_u16 global_band = 0;
int j;
ENTER();
@ -1293,19 +1300,15 @@ mlan_status wlan_bss_ioctl_bss_role(pmlan_adapter pmadapter,
}
if (global_band != pmadapter->config_bands) {
if (wlan_set_regiontable(
pmpriv, (t_u8)pmadapter->region_code,
global_band |
pmadapter->adhoc_start_band)) {
if (wlan_set_regiontable(pmpriv,
(t_u8)pmadapter->region_code,
global_band)) {
pioctl_req->status_code = MLAN_ERROR_IOCTL_FAIL;
LEAVE();
return MLAN_STATUS_FAILURE;
}
if (wlan_11d_set_universaltable(
pmpriv,
global_band |
pmadapter->adhoc_start_band)) {
if (wlan_11d_set_universaltable(pmpriv, global_band)) {
pioctl_req->status_code = MLAN_ERROR_IOCTL_FAIL;
LEAVE();
return MLAN_STATUS_FAILURE;
@ -3328,11 +3331,17 @@ mlan_status wlan_process_802dot11_mgmt_pkt(mlan_private *priv, t_u8 *payload,
}
#endif
if (priv->bss_role == MLAN_BSS_ROLE_STA) {
/* Igone DeAuth/DisAssoc frame from OLD AP during
* Roaming */
if (priv->curr_bss_params.host_mlme) {
if (memcmp(pmadapter, pieee_pkt_hdr->addr3,
(t_u8 *)priv->curr_bss_params
.bss_descriptor.mac_address,
MLAN_MAC_ADDR_LENGTH)) {
if ((memcmp(pmadapter, pieee_pkt_hdr->addr3,
(t_u8 *)priv->curr_bss_params
.bss_descriptor.mac_address,
MLAN_MAC_ADDR_LENGTH)) ||
!memcmp(pmadapter, pieee_pkt_hdr->addr3,
(t_u8 *)priv->curr_bss_params
.prev_bssid,
MLAN_MAC_ADDR_LENGTH)) {
PRINTM(MCMND,
"Dropping Deauth frame from other bssid: type=%d " MACSTR
"\n",
@ -4283,6 +4292,127 @@ exit:
return ret;
}
/**
* @brief Set antenna configuration
*
* @param pmadapter A pointer to mlan_adapter structure
* @param pioctl_req A pointer to ioctl request buffer
*
* @return MLAN_STATUS_PENDING --success, otherwise fail
*/
mlan_status wlan_handle_antcfg(mlan_private *pmpriv, t_u32 init_antcfg)
{
mlan_ds_ant_cfg ant_cfg;
mlan_ds_ant_cfg_1x1 ant_cfg_1x1;
mlan_status ret = MLAN_STATUS_SUCCESS;
pmlan_adapter pmadapter = pmpriv->adapter;
ENTER();
memset(pmadapter, &ant_cfg, 0, sizeof(ant_cfg));
memset(pmadapter, &ant_cfg_1x1, 0, sizeof(ant_cfg_1x1));
if (IS_STREAM_2X2(pmadapter->feature_control)) {
if (IS_CARD9098(pmadapter->card_type) ||
IS_CARD9097(pmadapter->card_type) ||
IS_CARDIW624(pmadapter->card_type) ||
IS_CARDAW693(pmadapter->card_type)) {
ant_cfg.tx_antenna = ant_cfg.rx_antenna = init_antcfg;
} else {
ant_cfg.tx_antenna = (init_antcfg & 0x0030) >> 4;
ant_cfg.rx_antenna = init_antcfg & 0x0003;
}
} else
ant_cfg_1x1.antenna = init_antcfg;
/* User input validation */
if (IS_STREAM_2X2(pmadapter->feature_control)) {
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097)
if (IS_CARD9098(pmadapter->card_type) ||
IS_CARD9097(pmadapter->card_type) ||
IS_CARDAW693(pmadapter->card_type) ||
IS_CARDIW624(pmadapter->card_type)) {
ant_cfg.tx_antenna &= 0x0303;
ant_cfg.rx_antenna &= 0x0303;
/** 2G antcfg TX */
if (ant_cfg.tx_antenna & 0x00FF) {
pmadapter->user_htstream &= ~0xF0;
pmadapter->user_htstream |=
(bitcount(ant_cfg.tx_antenna & 0x00FF)
<< 4);
}
/* 5G antcfg tx */
if (ant_cfg.tx_antenna & 0xFF00) {
pmadapter->user_htstream &= ~0xF000;
pmadapter->user_htstream |=
(bitcount(ant_cfg.tx_antenna & 0xFF00)
<< 12);
}
/* 2G antcfg RX */
if (ant_cfg.rx_antenna & 0x00FF) {
pmadapter->user_htstream &= ~0xF;
pmadapter->user_htstream |=
bitcount(ant_cfg.rx_antenna & 0x00FF);
}
/* 5G antcfg RX */
if (ant_cfg.rx_antenna & 0xFF00) {
pmadapter->user_htstream &= ~0xF00;
pmadapter->user_htstream |=
(bitcount(ant_cfg.rx_antenna & 0xFF00)
<< 8);
}
PRINTM(MCMND,
"user_htstream=0x%x, tx_antenna=0x%x >rx_antenna=0x%x\n",
pmadapter->user_htstream, ant_cfg.tx_antenna,
ant_cfg.rx_antenna);
} else {
#endif
ant_cfg.tx_antenna &= 0x0003;
ant_cfg.rx_antenna &= 0x0003;
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097)
}
#endif
if (!ant_cfg.tx_antenna ||
bitcount(ant_cfg.tx_antenna & 0x00FF) >
pmadapter->number_of_antenna ||
bitcount(ant_cfg.tx_antenna & 0xFF00) >
pmadapter->number_of_antenna) {
PRINTM(MERROR, "Invalid TX antenna setting: 0x%x\n",
ant_cfg.tx_antenna);
goto exit;
}
if (ant_cfg.rx_antenna) {
if (bitcount(ant_cfg.rx_antenna & 0x00FF) >
pmadapter->number_of_antenna ||
bitcount(ant_cfg.rx_antenna & 0xFF00) >
pmadapter->number_of_antenna) {
PRINTM(MERROR,
"Invalid RX antenna setting: 0x%x\n",
ant_cfg.rx_antenna);
goto exit;
}
} else
ant_cfg.rx_antenna = ant_cfg.tx_antenna;
} else if (!ant_cfg_1x1.antenna ||
((ant_cfg_1x1.antenna != RF_ANTENNA_AUTO) &&
(ant_cfg_1x1.antenna & 0xFFFC))) {
PRINTM(MERROR, "Invalid antenna setting\n");
goto exit;
}
/* Send request to firmware */
ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_802_11_RF_ANTENNA,
HostCmd_ACT_GEN_SET, 0, MNULL,
(IS_STREAM_2X2(pmadapter->feature_control)) ?
(t_void *)&ant_cfg :
(t_void *)&ant_cfg_1x1);
exit:
LEAVE();
return ret;
}
/**
* @brief Get rate bitmap
*
@ -4456,11 +4586,7 @@ static mlan_status wlan_rate_ioctl_set_rate_value(pmlan_adapter pmadapter,
} else {
memset(pmadapter, rates, 0, sizeof(rates));
wlan_get_active_data_rates(pmpriv, pmpriv->bss_mode,
(pmpriv->bss_mode ==
MLAN_BSS_MODE_INFRA) ?
pmpriv->config_bands :
pmadapter->adhoc_start_band,
rates);
pmpriv->config_bands, rates);
rate = rates;
for (i = 0; (rate[i] && i < WLAN_SUPPORTED_RATES); i++) {
PRINTM(MINFO, "Rate=0x%X Wanted=0x%X\n", rate[i],
@ -6154,8 +6280,7 @@ mlan_status wlan_misc_ioctl_region(pmlan_adapter pmadapter,
pmadapter->cfp_code_bg = misc->param.region_code;
pmadapter->cfp_code_a = misc->param.region_code;
if (wlan_set_regiontable(pmpriv, (t_u8)pmadapter->region_code,
pmadapter->config_bands |
pmadapter->adhoc_start_band)) {
pmadapter->config_bands)) {
pioctl_req->status_code = MLAN_ERROR_IOCTL_FAIL;
ret = MLAN_STATUS_FAILURE;
}
@ -6738,8 +6863,6 @@ mlan_status wlan_radio_ioctl_band_cfg(pmlan_adapter pmadapter,
{
t_u32 i, global_band = 0;
t_u32 infra_band = 0;
t_u32 adhoc_band = 0;
t_u32 adhoc_channel = 0;
mlan_ds_radio_cfg *radio_cfg = MNULL;
mlan_private *pmpriv = pmadapter->priv[pioctl_req->bss_index];
@ -6748,8 +6871,6 @@ mlan_status wlan_radio_ioctl_band_cfg(pmlan_adapter pmadapter,
radio_cfg = (mlan_ds_radio_cfg *)pioctl_req->pbuf;
if (pioctl_req->action == MLAN_ACT_SET) {
infra_band = radio_cfg->param.band_cfg.config_bands;
adhoc_band = radio_cfg->param.band_cfg.adhoc_start_band;
adhoc_channel = radio_cfg->param.band_cfg.adhoc_channel;
/* SET Infra band */
if ((infra_band | pmadapter->fw_bands) & ~pmadapter->fw_bands) {
@ -6758,15 +6879,6 @@ mlan_status wlan_radio_ioctl_band_cfg(pmlan_adapter pmadapter,
return MLAN_STATUS_FAILURE;
}
/* SET Ad-hoc Band */
if ((adhoc_band | pmadapter->fw_bands) & ~pmadapter->fw_bands) {
pioctl_req->status_code = MLAN_ERROR_INVALID_PARAMETER;
LEAVE();
return MLAN_STATUS_FAILURE;
}
if (!adhoc_band)
adhoc_band = pmadapter->adhoc_start_band;
for (i = 0; i < pmadapter->priv_num; i++) {
if (pmadapter->priv[i] &&
pmadapter->priv[i] != pmpriv &&
@ -6778,14 +6890,13 @@ mlan_status wlan_radio_ioctl_band_cfg(pmlan_adapter pmadapter,
global_band |= infra_band;
if (wlan_set_regiontable(pmpriv, (t_u8)pmadapter->region_code,
global_band | adhoc_band)) {
global_band)) {
pioctl_req->status_code = MLAN_ERROR_IOCTL_FAIL;
LEAVE();
return MLAN_STATUS_FAILURE;
}
#ifdef STA_SUPPORT
if (wlan_11d_set_universaltable(pmpriv,
global_band | adhoc_band)) {
if (wlan_11d_set_universaltable(pmpriv, global_band)) {
pioctl_req->status_code = MLAN_ERROR_IOCTL_FAIL;
LEAVE();
return MLAN_STATUS_FAILURE;
@ -6794,51 +6905,12 @@ mlan_status wlan_radio_ioctl_band_cfg(pmlan_adapter pmadapter,
pmpriv->config_bands = infra_band;
pmadapter->config_bands = global_band;
pmadapter->adhoc_start_band = adhoc_band;
pmpriv->intf_state_11h.adhoc_auto_sel_chan = MFALSE;
#ifdef STA_SUPPORT
/*
* If no adhoc_channel is supplied verify if the existing
* adhoc channel compiles with new adhoc_band
*/
if (!adhoc_channel) {
if (!wlan_find_cfp_by_band_and_channel(
pmadapter, pmadapter->adhoc_start_band,
pmpriv->adhoc_channel)) {
/* Pass back the default channel */
radio_cfg->param.band_cfg.adhoc_channel =
DEFAULT_AD_HOC_CHANNEL;
if ((pmadapter->adhoc_start_band & BAND_A)) {
radio_cfg->param.band_cfg.adhoc_channel =
DEFAULT_AD_HOC_CHANNEL_A;
}
}
} else {
/* Return error if adhoc_band and adhoc_channel
* combination is invalid
*/
if (!wlan_find_cfp_by_band_and_channel(
pmadapter, pmadapter->adhoc_start_band,
(t_u16)adhoc_channel)) {
pioctl_req->status_code =
MLAN_ERROR_INVALID_PARAMETER;
LEAVE();
return MLAN_STATUS_FAILURE;
}
pmpriv->adhoc_channel = (t_u8)adhoc_channel;
}
#endif
} else {
/* Infra Bands */
radio_cfg->param.band_cfg.config_bands = pmpriv->config_bands;
/* Adhoc Band */
radio_cfg->param.band_cfg.adhoc_start_band =
pmadapter->adhoc_start_band;
/* Adhoc Channel */
radio_cfg->param.band_cfg.adhoc_channel = pmpriv->adhoc_channel;
/* FW support Bands */
radio_cfg->param.band_cfg.fw_bands = pmadapter->fw_bands;
PRINTM(MINFO, "Global config band = %d\n",
@ -7298,6 +7370,21 @@ mlan_status wlan_misc_ioctl_rf_test_cfg(pmlan_adapter pmadapter,
cmd_action, 0, (t_void *)pioctl_req,
&(pmisc->param.mfg_he_power));
break;
case MLAN_OID_MISC_OTP_MAC_RD_WR:
if (pioctl_req->action == MLAN_ACT_SET)
cmd_action = HostCmd_ACT_GEN_SET;
else if (pioctl_req->action == MLAN_ACT_GET)
cmd_action = HostCmd_ACT_GEN_GET;
else {
PRINTM(MERROR, "Unsupported cmd_action\n");
ret = MLAN_STATUS_FAILURE;
goto done;
}
ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_MFG_COMMAND,
cmd_action, 0, (t_void *)pioctl_req,
&(pmisc->param.mfg_otp_mac_addr_rd_wr));
break;
}
if (ret == MLAN_STATUS_SUCCESS)
@ -7581,8 +7668,7 @@ mlan_status wlan_misc_ioctl_country_code(pmlan_adapter pmadapter,
else
pmadapter->region_code = 0;
if (wlan_set_regiontable(pmpriv, pmadapter->region_code,
pmadapter->config_bands |
pmadapter->adhoc_start_band)) {
pmadapter->config_bands)) {
pioctl_req->status_code = MLAN_ERROR_INVALID_PARAMETER;
ret = MLAN_STATUS_FAILURE;
goto done;

View file

@ -104,6 +104,7 @@ static const struct _mlan_pcie_card_reg mlan_reg_pcie8997 = {
.host_intr_upld_rdy = HOST_INTR_UPLD_RDY,
.host_intr_cmd_done = HOST_INTR_CMD_DONE,
.host_intr_event_rdy = HOST_INTR_EVENT_RDY,
.host_intr_cmd_dnld = HOST_INTR_CMD_DNLD,
.txrx_rw_ptr_mask = 0x00000FFF,
.txrx_rw_ptr_wrap_mask = 0x00001FFF,
.txrx_rw_ptr_rollover_ind = MBIT(12),
@ -190,7 +191,9 @@ static const struct _mlan_pcie_card_reg mlan_reg_pcie9098 = {
.use_adma = MTRUE,
.msi_int_wr_clr = MTRUE,
};
#endif
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624)
static const struct _mlan_card_info mlan_card_info_pcie9098 = {
.max_tx_buf_size = MLAN_TX_DATA_BUF_SIZE_4K,
.v16_fw_api = 1,
@ -212,6 +215,138 @@ static mlan_status wlan_pcie_delete_evtbd_ring(pmlan_adapter pmadapter);
static mlan_status wlan_pcie_delete_rxbd_ring(pmlan_adapter pmadapter);
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624)
/**
* @brief This function program dma_cfg/dma_cfg2/dma_cfg3 registers
*
* @param pmadapter A pointer to mlan_adapter structure
* @param q_addr adma queue address
* @param direction adma direction (ADMA_DEVICE_TO_HOST/ADMA_HOST_TO_DEVICE)
* @param dma_mode dma mode (DMA_MODE_DUAL_DESC/DMA_MODE_DIRECT)
* @param size desc num/dma_size
* @param init init flag
*
* @return MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE
*/
static mlan_status wlan_init_dma_cfg_registers(mlan_adapter *pmadapter,
t_u32 q_addr, t_u8 direction,
t_u8 dma_mode, t_u16 size,
t_u8 init)
{
t_u32 dma_cfg, dma_cfg2, dma_cfg3;
pmlan_callbacks pcb = &pmadapter->callbacks;
mlan_status ret = MLAN_STATUS_SUCCESS;
ENTER();
if (init) {
/* Read the dma_cfg2 register */
if (pcb->moal_read_reg(pmadapter->pmoal_handle,
q_addr + ADMA_DMA_CFG2, &dma_cfg2)) {
PRINTM(MERROR, "Fail to read DMA CFG2 register\n");
ret = MLAN_STATUS_FAILURE;
goto done;
}
dma_cfg2 &= ~(ADMA_SRC_DMA_DONE_INT_BYPASS_EN |
ADMA_DST_DMA_DONE_INT_BYPASS_EN |
ADMA_MSI_LEGACY_SRC_DMA_DONE_INT_BYPASS_EN |
ADMA_MSI_LEGACY_DST_DMA_DONE_INT_BYPASS_EN |
ADMA_MSI_LEGACY_ENABLE | ADMA_MSIX_ENABLE |
ADMA_MSIX_INT_SRC_DST_SEL);
if (dma_mode == DMA_MODE_DUAL_DESC) {
if (direction == ADMA_HOST_TO_DEVICE) {
dma_cfg2 |= ADMA_SRC_DMA_DONE_INT_BYPASS_EN;
if (pmadapter->pcard_pcie->pcie_int_mode !=
PCIE_INT_MODE_MSIX)
dma_cfg2 |=
ADMA_MSI_LEGACY_SRC_DMA_DONE_INT_BYPASS_EN;
} else {
/* Read the dma_cfg3 register */
if (pcb->moal_read_reg(pmadapter->pmoal_handle,
q_addr + ADMA_DMA_CFG3,
&dma_cfg3)) {
PRINTM(MERROR,
"Fail to read DMA CFG3 register\n");
ret = MLAN_STATUS_FAILURE;
goto done;
}
dma_cfg3 |= ADMA_Q_PTR_CLR;
if (pcb->moal_write_reg(pmadapter->pmoal_handle,
q_addr + ADMA_DMA_CFG3,
(t_u32)dma_cfg3)) {
PRINTM(MERROR,
"Failed to write ADMA_DMA_CFG3.\n");
ret = MLAN_STATUS_FAILURE;
}
dma_cfg2 |= ADMA_DST_DMA_DONE_INT_BYPASS_EN;
if (pmadapter->pcard_pcie->pcie_int_mode !=
PCIE_INT_MODE_MSIX)
dma_cfg2 |=
ADMA_MSI_LEGACY_DST_DMA_DONE_INT_BYPASS_EN;
}
} else {
if (direction == ADMA_HOST_TO_DEVICE)
dma_cfg2 |= ADMA_SRC_ADDR_IS_HOST;
else
dma_cfg2 |= ADMA_DST_ADDR_IS_HOST;
}
if (pmadapter->pcard_pcie->pcie_int_mode == PCIE_INT_MODE_MSIX)
dma_cfg2 |= ADMA_MSIX_ENABLE;
else
dma_cfg2 |= ADMA_MSI_LEGACY_ENABLE;
PRINTM(MCMND, "dma_cfg2=0x%x\n", dma_cfg2);
/* enable INT_BYPASS_EN in the dma_cfg2 register */
if (pcb->moal_write_reg(pmadapter->pmoal_handle,
q_addr + ADMA_DMA_CFG2,
(t_u32)dma_cfg2)) {
PRINTM(MERROR, "Failed to write DMA CFG2.\n");
ret = MLAN_STATUS_FAILURE;
goto done;
}
}
/* Read the TX ring read pointer set by firmware */
if (pcb->moal_read_reg(pmadapter->pmoal_handle, q_addr + ADMA_DMA_CFG,
&dma_cfg)) {
PRINTM(MERROR, "Fail to read DMA CFG register\n");
ret = MLAN_STATUS_FAILURE;
goto done;
}
if (direction == ADMA_HOST_TO_DEVICE) {
if (dma_mode == DMA_MODE_DUAL_DESC) {
dma_cfg &= ~(DESC_MODE_MASK | DMA_MODE_MASK |
SRC_NUM_DESC_MASK | DMA_SIZE_MASK);
dma_cfg |= (t_u32)size << SRC_NUM_DESC_BIT;
dma_cfg |= DESC_MODE_RING << 2;
} else {
dma_cfg &= ~(DESC_MODE_MASK | DMA_MODE_MASK |
SRC_NUM_DESC_MASK | DST_NUM_DESC_MASK |
DMA_SIZE_MASK);
dma_cfg |= (t_u32)size << DMA_SIZE_BIT;
}
} else {
if (dma_mode == DMA_MODE_DUAL_DESC) {
dma_cfg &= ~(DESC_MODE_MASK | DMA_MODE_MASK |
DST_NUM_DESC_MASK | DMA_SIZE_MASK);
dma_cfg |= (t_u32)size << DST_NUM_DESC_BIT;
dma_cfg |= DESC_MODE_RING << 2;
} else {
dma_cfg &= ~(DESC_MODE_MASK | DMA_MODE_MASK |
SRC_NUM_DESC_MASK | DST_NUM_DESC_MASK);
}
}
dma_cfg |= (t_u32)dma_mode;
PRINTM(MINFO, "dma_cfg=0x%x\n", dma_cfg);
if (pcb->moal_write_reg(pmadapter->pmoal_handle, q_addr + ADMA_DMA_CFG,
dma_cfg)) {
PRINTM(MERROR, "Fail to set DMA CFG register\n");
LEAVE();
return MLAN_STATUS_FAILURE;
}
done:
LEAVE();
return ret;
}
/**
* @brief This function init the adma setting
*
@ -226,7 +361,7 @@ static mlan_status wlan_pcie_delete_rxbd_ring(pmlan_adapter pmadapter);
static mlan_status wlan_init_adma(mlan_adapter *pmadapter, t_u8 type,
t_u64 pbase, t_u16 size, t_u8 init)
{
t_u32 dma_cfg, dma_cfg2, dma_cfg3, int_mapping;
t_u32 int_mapping;
mlan_status ret = MLAN_STATUS_SUCCESS;
t_u32 q_addr = 0;
t_u8 direction = 0;
@ -295,60 +430,6 @@ static mlan_status wlan_init_adma(mlan_adapter *pmadapter, t_u8 type,
goto done;
}
/* Read the dma_cfg2 register */
if (pcb->moal_read_reg(pmadapter->pmoal_handle,
q_addr + ADMA_DMA_CFG2, &dma_cfg2)) {
PRINTM(MERROR, "Fail to read DMA CFG2 register\n");
ret = MLAN_STATUS_FAILURE;
goto done;
}
dma_cfg2 &= ~(ADMA_SRC_DMA_DONE_INT_BYPASS_EN |
ADMA_DST_DMA_DONE_INT_BYPASS_EN |
ADMA_MSI_LEGACY_SRC_DMA_DONE_INT_BYPASS_EN |
ADMA_MSI_LEGACY_DST_DMA_DONE_INT_BYPASS_EN |
ADMA_MSI_LEGACY_ENABLE | ADMA_MSIX_ENABLE |
ADMA_MSIX_INT_SRC_DST_SEL);
if (dma_mode == DMA_MODE_DUAL_DESC) {
if (direction == ADMA_HOST_TO_DEVICE) {
dma_cfg2 |= ADMA_SRC_DMA_DONE_INT_BYPASS_EN;
if (pmadapter->pcard_pcie->pcie_int_mode !=
PCIE_INT_MODE_MSIX)
dma_cfg2 |=
ADMA_MSI_LEGACY_SRC_DMA_DONE_INT_BYPASS_EN;
} else {
/* Read the dma_cfg3 register */
if (pcb->moal_read_reg(pmadapter->pmoal_handle,
q_addr + ADMA_DMA_CFG3,
&dma_cfg3)) {
PRINTM(MERROR,
"Fail to read DMA CFG3 register\n");
ret = MLAN_STATUS_FAILURE;
goto done;
}
dma_cfg3 |= ADMA_Q_PTR_CLR;
if (pcb->moal_write_reg(pmadapter->pmoal_handle,
q_addr + ADMA_DMA_CFG3,
(t_u32)dma_cfg3)) {
PRINTM(MERROR,
"Failed to write ADMA_DMA_CFG3.\n");
ret = MLAN_STATUS_FAILURE;
goto done;
}
dma_cfg2 |= ADMA_DST_DMA_DONE_INT_BYPASS_EN;
if (pmadapter->pcard_pcie->pcie_int_mode !=
PCIE_INT_MODE_MSIX)
dma_cfg2 |=
ADMA_MSI_LEGACY_DST_DMA_DONE_INT_BYPASS_EN;
}
} else {
if (direction == ADMA_HOST_TO_DEVICE)
dma_cfg2 |= ADMA_SRC_ADDR_IS_HOST;
else
dma_cfg2 |= ADMA_DST_ADDR_IS_HOST;
}
if (pmadapter->pcard_pcie->pcie_int_mode ==
PCIE_INT_MODE_MSIX) {
if (pcb->moal_read_reg(pmadapter->pmoal_handle,
@ -374,27 +455,9 @@ static mlan_status wlan_init_adma(mlan_adapter *pmadapter, t_u8 type,
ret = MLAN_STATUS_FAILURE;
goto done;
}
dma_cfg2 |= ADMA_MSIX_ENABLE;
} else
dma_cfg2 |= ADMA_MSI_LEGACY_ENABLE;
PRINTM(MCMND, "dma_cfg2=0x%x\n", dma_cfg2);
/* enable INT_BYPASS_EN in the dma_cfg2 register */
if (pcb->moal_write_reg(pmadapter->pmoal_handle,
q_addr + ADMA_DMA_CFG2,
(t_u32)dma_cfg2)) {
PRINTM(MERROR, "Failed to write DMA CFG2.\n");
ret = MLAN_STATUS_FAILURE;
goto done;
}
}
/* Read the TX ring read pointer set by firmware */
if (pcb->moal_read_reg(pmadapter->pmoal_handle, q_addr + ADMA_DMA_CFG,
&dma_cfg)) {
PRINTM(MERROR, "Fail to read DMA CFG register\n");
ret = MLAN_STATUS_FAILURE;
goto done;
}
if (direction == ADMA_HOST_TO_DEVICE) {
/* Write the lower 32bits of the physical address to
* ADMA_SRC_LOW */
@ -433,17 +496,6 @@ static mlan_status wlan_init_adma(mlan_adapter *pmadapter, t_u8 type,
goto done;
}
}
if (dma_mode == DMA_MODE_DUAL_DESC) {
dma_cfg &= ~(DESC_MODE_MASK | DMA_MODE_MASK |
SRC_NUM_DESC_MASK | DMA_SIZE_MASK);
dma_cfg |= (t_u32)size << SRC_NUM_DESC_BIT;
dma_cfg |= DESC_MODE_RING << 2;
} else {
dma_cfg &= ~(DESC_MODE_MASK | DMA_MODE_MASK |
SRC_NUM_DESC_MASK | DST_NUM_DESC_MASK |
DMA_SIZE_MASK);
dma_cfg |= (t_u32)size << DMA_SIZE_BIT;
}
} else {
/* Write the lower 32bits of the physical address to
* ADMA_DST_LOW */
@ -482,23 +534,14 @@ static mlan_status wlan_init_adma(mlan_adapter *pmadapter, t_u8 type,
goto done;
}
}
if (dma_mode == DMA_MODE_DUAL_DESC) {
dma_cfg &= ~(DESC_MODE_MASK | DMA_MODE_MASK |
DST_NUM_DESC_MASK | DMA_SIZE_MASK);
dma_cfg |= (t_u32)size << DST_NUM_DESC_BIT;
dma_cfg |= DESC_MODE_RING << 2;
} else {
dma_cfg &= ~(DESC_MODE_MASK | DMA_MODE_MASK |
SRC_NUM_DESC_MASK | DST_NUM_DESC_MASK);
}
}
dma_cfg |= (t_u32)dma_mode;
if (pcb->moal_write_reg(pmadapter->pmoal_handle, q_addr + ADMA_DMA_CFG,
dma_cfg)) {
PRINTM(MERROR, "Fail to set DMA CFG register\n");
LEAVE();
return MLAN_STATUS_FAILURE;
if (wlan_init_dma_cfg_registers(pmadapter, q_addr, direction, dma_mode,
size, init)) {
PRINTM(MERROR, "Failed to configure dma_cfg registers\n");
ret = MLAN_STATUS_FAILURE;
goto done;
}
if (type == ADMA_CMD && !init) {
/* Write 1 to src_wr_ptr to trigger direct dma */
if (pcb->moal_write_reg(pmadapter->pmoal_handle,
@ -550,6 +593,7 @@ static void wlan_pcie_init_adma_ring_size(mlan_adapter *pmadapter)
#endif
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624)
/**
* @brief This function enables tx_done interrupt in pending descriptor if
* needed.
@ -593,6 +637,30 @@ static t_u16 wlan_get_adma_buf_flag(mlan_adapter *pmadapter, t_u32 num_tx_buffs,
return flags;
}
/**
* @brief This function set the host interrupt select mask
*
* @param pmadapter A pointer to mlan_adapter structure
*
*
* @return MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE
*/
static mlan_status wlan_pcie_set_host_int_select_reg(mlan_adapter *pmadapter,
t_u32 int_sel_mask)
{
pmlan_callbacks pcb = &pmadapter->callbacks;
ENTER();
/* Simply write the mask to the register */
if (pcb->moal_write_reg(pmadapter->pmoal_handle, PCIE9098_HOST_INT_SEL,
int_sel_mask)) {
PRINTM(MWARN, "Set host interrupt select register failed\n");
LEAVE();
return MLAN_STATUS_FAILURE;
}
LEAVE();
return MLAN_STATUS_SUCCESS;
}
/**
* @brief This function set the host interrupt select mask
*
@ -640,7 +708,101 @@ static mlan_status wlan_pcie_set_host_int_select_mask(mlan_adapter *pmadapter,
}
#endif
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624)
/**
* @brief This function downloads boot command to the card.
*
* @param pmadapter A pointer to mlan_adapter structure
* @param pmbuf A pointer to mlan_buffer
*
* @return MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE
*/
static mlan_status wlan_pcie_send_boot_cmd(mlan_adapter *pmadapter,
mlan_buffer *pmbuf)
{
mlan_status ret = MLAN_STATUS_SUCCESS;
pmlan_callbacks pcb = &pmadapter->callbacks;
ENTER();
if (!pmadapter || !pmbuf) {
PRINTM(MERROR, "NULL Pointer\n");
LEAVE();
return MLAN_STATUS_FAILURE;
}
if (MLAN_STATUS_FAILURE ==
pcb->moal_map_memory(
pmadapter->pmoal_handle, pmbuf->pbuf + pmbuf->data_offset,
&pmbuf->buf_pa, WLAN_UPLD_SIZE, PCI_DMA_TODEVICE)) {
PRINTM(MERROR, "BootCmd: failed to moal_map_memory\n");
LEAVE();
return MLAN_STATUS_FAILURE;
}
if (!(pmbuf->pbuf && pmbuf->data_len && pmbuf->buf_pa)) {
PRINTM(MERROR, "%s: Invalid buffer <%p, %#x:%x, len=%d>\n",
__func__, pmbuf->pbuf,
(t_u32)((t_u64)pmbuf->buf_pa >> 32),
(t_u32)pmbuf->buf_pa, pmbuf->data_len);
ret = MLAN_STATUS_FAILURE;
goto done;
}
/* Write the lower 32bits of the physical address to scratch
* register 0 */
if (pcb->moal_write_reg(pmadapter->pmoal_handle,
pmadapter->pcard_pcie->reg->reg_scratch_0,
(t_u32)pmbuf->buf_pa)) {
PRINTM(MERROR,
"Failed to write download command to boot code\n");
ret = MLAN_STATUS_FAILURE;
goto done;
}
/* Write the upper 32bits of the physical address to scratch
* register 1 */
if (pcb->moal_write_reg(pmadapter->pmoal_handle,
pmadapter->pcard_pcie->reg->reg_scratch_1,
(t_u32)((t_u64)pmbuf->buf_pa >> 32))) {
PRINTM(MERROR,
"Failed to write download command to boot code\n");
ret = MLAN_STATUS_FAILURE;
goto done;
}
/* Write the command length to scratch register 2 */
if (pcb->moal_write_reg(pmadapter->pmoal_handle,
pmadapter->pcard_pcie->reg->reg_scratch_2,
pmbuf->data_len)) {
PRINTM(MERROR,
"Failed to write command length to scratch register 2\n");
ret = MLAN_STATUS_FAILURE;
goto done;
}
/* Ring the door bell */
if (pcb->moal_write_reg(pmadapter->pmoal_handle,
pmadapter->pcard_pcie->reg->reg_cpu_int_event,
CPU_INTR_DOOR_BELL)) {
PRINTM(MERROR, "Failed to assert door-bell interrupt\n");
ret = MLAN_STATUS_FAILURE;
goto done;
}
LEAVE();
return ret;
done:
if (MLAN_STATUS_FAILURE ==
pcb->moal_unmap_memory(
pmadapter->pmoal_handle, pmbuf->pbuf + pmbuf->data_offset,
pmbuf->buf_pa, WLAN_UPLD_SIZE, PCI_DMA_TODEVICE))
PRINTM(MERROR, "BootCmd: failed to moal_unmap_memory\n");
LEAVE();
return ret;
}
#if defined(PCIE8997) || defined(PCIE9098) || defined(PCIE9097) || \
defined(PCIEIW624)
/**
* @brief This function handles command response completion
*
@ -703,10 +865,25 @@ static mlan_status wlan_pcie_send_vdll(mlan_adapter *pmadapter,
goto done;
}
pmadapter->pcard_pcie->vdll_cmd_buf = pmbuf;
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624)
/* issue the DMA */
/* send the VDLL block down to the firmware */
wlan_init_adma(pmadapter, ADMA_CMD, pmbuf->buf_pa, pmbuf->data_len,
MFALSE);
if (pmadapter->pcard_pcie->reg->use_adma) {
/* send the VDLL block down to the firmware */
wlan_init_adma(pmadapter, ADMA_CMD, pmbuf->buf_pa,
pmbuf->data_len, MFALSE);
}
#endif
#ifdef PCIE8997
if (!pmadapter->pcard_pcie->reg->use_adma) {
if (wlan_pcie_send_boot_cmd(pmadapter, pmbuf)) {
PRINTM(MERROR, "Failed to send vdll block to device\n");
ret = MLAN_STATUS_FAILURE;
goto done;
}
}
#endif
PRINTM(MINFO, "PCIE - Download VDLL Block: successful.\n");
done:
@ -1756,6 +1933,10 @@ static mlan_status wlan_pcie_send_data_complete(mlan_adapter *pmadapter)
ENTER();
if (!wlan_is_tx_pending(pmadapter)) {
LEAVE();
return ret;
}
/* Read the TX ring read pointer set by firmware */
if (pcb->moal_read_reg(pmadapter->pmoal_handle,
pmadapter->pcard_pcie->reg->reg_txbd_rdptr,
@ -1849,8 +2030,6 @@ static mlan_status wlan_pcie_send_data_complete(mlan_adapter *pmadapter)
#endif
}
if (unmap_count)
pmadapter->data_sent = MFALSE;
#if defined(PCIE8997) || defined(PCIE8897)
if (pmadapter->pcard_pcie->txbd_flush) {
if (PCIE_TXBD_EMPTY(pmadapter->pcard_pcie->txbd_wrptr,
@ -1865,6 +2044,9 @@ done:
pcb->moal_spin_lock(pmadapter->pmoal_handle,
pmadapter->pmlan_pcie_lock);
pmadapter->pcard_pcie->txbd_pending -= unmap_count;
if (unmap_count) {
pmadapter->data_sent = MFALSE;
}
pcb->moal_spin_unlock(pmadapter->pmoal_handle,
pmadapter->pmlan_pcie_lock);
@ -1959,6 +2141,10 @@ static t_u8 wlan_check_txbd_not_full(mlan_adapter *pmadapter)
return MFALSE;
}
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624)
#endif
/**
* @brief This function downloads data to the card.
*
@ -2126,9 +2312,9 @@ static mlan_status wlan_pcie_send_data(mlan_adapter *pmadapter, t_u8 type,
pmadapter->pcard_pcie->txbd_rdptr,
pmadapter->pcard_pcie->txbd_wrptr);
if (wlan_check_txbd_not_full(pmadapter))
if (wlan_check_txbd_not_full(pmadapter)) {
pmadapter->data_sent = MFALSE;
else
} else
wlan_pcie_process_tx_complete(pmadapter);
if (pmadapter->data_sent)
pmadapter->data_sent_cnt++;
@ -2638,47 +2824,8 @@ static mlan_status wlan_pcie_send_cmd(mlan_adapter *pmadapter,
goto done;
}
}
/* Write the lower 32bits of the physical address to
* REG_CMD_ADDR_LO */
if (pcb->moal_write_reg(
pmadapter->pmoal_handle, REG_CMD_ADDR_LO,
(t_u32)pmadapter->pcard_pcie->cmd_buf->buf_pa)) {
PRINTM(MERROR,
"Failed to write download command to boot code.\n");
ret = MLAN_STATUS_FAILURE;
goto done;
}
/* Write the upper 32bits of the physical address to
* REG_CMD_ADDR_HI */
if (pcb->moal_write_reg(pmadapter->pmoal_handle,
REG_CMD_ADDR_HI,
(t_u32)((t_u64)pmadapter->pcard_pcie
->cmd_buf->buf_pa >>
32))) {
PRINTM(MERROR,
"Failed to write download command to boot code.\n");
ret = MLAN_STATUS_FAILURE;
goto done;
}
/* Write the command length to REG_CMD_SIZE */
if (pcb->moal_write_reg(
pmadapter->pmoal_handle, REG_CMD_SIZE,
pmadapter->pcard_pcie->cmd_buf->data_len)) {
PRINTM(MERROR,
"Failed to write command length to REG_CMD_SIZE\n");
ret = MLAN_STATUS_FAILURE;
goto done;
}
/* Ring the door bell */
if (pcb->moal_write_reg(
pmadapter->pmoal_handle,
pmadapter->pcard_pcie->reg->reg_cpu_int_event,
CPU_INTR_DOOR_BELL)) {
PRINTM(MERROR,
"Failed to assert door-bell interrupt.\n");
if (wlan_pcie_send_boot_cmd(pmadapter, pmbuf)) {
PRINTM(MERROR, "Failed to send hostcmd to device\n");
ret = MLAN_STATUS_FAILURE;
goto done;
}
@ -3264,100 +3411,6 @@ done:
return ret;
}
/**
* @brief This function downloads boot command to the card.
*
* @param pmadapter A pointer to mlan_adapter structure
* @param pmbuf A pointer to mlan_buffer
*
* @return MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE
*/
static mlan_status wlan_pcie_send_boot_cmd(mlan_adapter *pmadapter,
mlan_buffer *pmbuf)
{
mlan_status ret = MLAN_STATUS_SUCCESS;
pmlan_callbacks pcb = &pmadapter->callbacks;
ENTER();
if (!pmadapter || !pmbuf) {
PRINTM(MERROR, "NULL Pointer\n");
LEAVE();
return MLAN_STATUS_FAILURE;
}
if (MLAN_STATUS_FAILURE ==
pcb->moal_map_memory(
pmadapter->pmoal_handle, pmbuf->pbuf + pmbuf->data_offset,
&pmbuf->buf_pa, WLAN_UPLD_SIZE, PCI_DMA_TODEVICE)) {
PRINTM(MERROR, "BootCmd: failed to moal_map_memory\n");
LEAVE();
return MLAN_STATUS_FAILURE;
}
if (!(pmbuf->pbuf && pmbuf->data_len && pmbuf->buf_pa)) {
PRINTM(MERROR, "%s: Invalid buffer <%p, %#x:%x, len=%d>\n",
__func__, pmbuf->pbuf,
(t_u32)((t_u64)pmbuf->buf_pa >> 32),
(t_u32)pmbuf->buf_pa, pmbuf->data_len);
ret = MLAN_STATUS_FAILURE;
goto done;
}
/* Write the lower 32bits of the physical address to scratch
* register 0 */
if (pcb->moal_write_reg(pmadapter->pmoal_handle,
pmadapter->pcard_pcie->reg->reg_scratch_0,
(t_u32)pmbuf->buf_pa)) {
PRINTM(MERROR,
"Failed to write download command to boot code\n");
ret = MLAN_STATUS_FAILURE;
goto done;
}
/* Write the upper 32bits of the physical address to scratch
* register 1 */
if (pcb->moal_write_reg(pmadapter->pmoal_handle,
pmadapter->pcard_pcie->reg->reg_scratch_1,
(t_u32)((t_u64)pmbuf->buf_pa >> 32))) {
PRINTM(MERROR,
"Failed to write download command to boot code\n");
ret = MLAN_STATUS_FAILURE;
goto done;
}
/* Write the command length to scratch register 2 */
if (pcb->moal_write_reg(pmadapter->pmoal_handle,
pmadapter->pcard_pcie->reg->reg_scratch_2,
pmbuf->data_len)) {
PRINTM(MERROR,
"Failed to write command length to scratch register 2\n");
ret = MLAN_STATUS_FAILURE;
goto done;
}
/* Ring the door bell */
if (pcb->moal_write_reg(pmadapter->pmoal_handle,
pmadapter->pcard_pcie->reg->reg_cpu_int_event,
CPU_INTR_DOOR_BELL)) {
PRINTM(MERROR, "Failed to assert door-bell interrupt\n");
ret = MLAN_STATUS_FAILURE;
goto done;
}
LEAVE();
return ret;
done:
if (MLAN_STATUS_FAILURE ==
pcb->moal_unmap_memory(
pmadapter->pmoal_handle, pmbuf->pbuf + pmbuf->data_offset,
pmbuf->buf_pa, WLAN_UPLD_SIZE, PCI_DMA_TODEVICE))
PRINTM(MERROR, "BootCmd: failed to moal_unmap_memory\n");
LEAVE();
return ret;
}
/**
* @brief This function init rx port in firmware
*
@ -3857,6 +3910,10 @@ mlan_status wlan_process_msix_int(mlan_adapter *pmadapter)
pmadapter->pmlan_rx_lock);
wlan_recv_event(wlan_get_priv(pmadapter, MLAN_BSS_ROLE_ANY),
MLAN_EVENT_ID_DRV_DEFER_RX_DATA, MNULL);
if (wlan_is_tx_pending(pmadapter))
wlan_recv_event(
wlan_get_priv(pmadapter, MLAN_BSS_ROLE_ANY),
MLAN_EVENT_ID_DRV_DEFER_TX_COMPLTE, MNULL);
}
if (pcie_ireg & pmadapter->pcard_pcie->reg->host_intr_event_rdy) {
PRINTM(MINFO, "Rx EVENT\n");
@ -3871,7 +3928,8 @@ mlan_status wlan_process_msix_int(mlan_adapter *pmadapter)
wlan_recv_event(wlan_get_priv(pmadapter, MLAN_BSS_ROLE_ANY),
MLAN_EVENT_ID_DRV_DEFER_CMDRESP, MNULL);
}
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624)
#if defined(PCIE8997) || defined(PCIE9098) || defined(PCIE9097) || \
defined(PCIEIW624)
if (pmadapter->pcard_pcie->reg->host_intr_cmd_dnld &&
(pcie_ireg & pmadapter->pcard_pcie->reg->host_intr_cmd_dnld)) {
pmadapter->pcie_cmd_dnld_int = MTRUE;
@ -3975,6 +4033,12 @@ static mlan_status wlan_process_pcie_int_status(mlan_adapter *pmadapter)
wlan_recv_event(wlan_get_priv(pmadapter,
MLAN_BSS_ROLE_ANY),
MLAN_EVENT_ID_DRV_DEFER_RX_DATA, MNULL);
if (wlan_is_tx_pending(pmadapter))
wlan_recv_event(
wlan_get_priv(pmadapter,
MLAN_BSS_ROLE_ANY),
MLAN_EVENT_ID_DRV_DEFER_TX_COMPLTE,
MNULL);
}
if (pcie_ireg &
pmadapter->pcard_pcie->reg->host_intr_event_rdy) {
@ -3998,7 +4062,8 @@ static mlan_status wlan_process_pcie_int_status(mlan_adapter *pmadapter)
MLAN_BSS_ROLE_ANY),
MLAN_EVENT_ID_DRV_DEFER_CMDRESP, MNULL);
}
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624)
#if defined(PCIE8997) || defined(PCIE9098) || defined(PCIE9097) || \
defined(PCIEIW624)
if (pmadapter->pcard_pcie->reg->host_intr_cmd_dnld &&
(pcie_ireg &
pmadapter->pcard_pcie->reg->host_intr_cmd_dnld)) {
@ -4294,7 +4359,8 @@ mlan_status wlan_pcie_host_to_card(pmlan_private pmpriv, t_u8 type,
ret = wlan_pcie_send_data(pmadapter, type, pmbuf, tx_param);
} else if (type == MLAN_TYPE_CMD)
ret = wlan_pcie_send_cmd(pmadapter, pmbuf);
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624)
#if defined(PCIE8997) || defined(PCIE9098) || defined(PCIE9097) || \
defined(PCIEIW624)
else if (type == MLAN_TYPE_VDLL)
ret = wlan_pcie_send_vdll(pmadapter, pmbuf);
#endif
@ -4773,7 +4839,8 @@ static void wlan_pcie_process_cmd_dnld(mlan_adapter *pmadapter)
ENTER();
if (pmadapter->cmd_sent)
pmadapter->cmd_sent = MFALSE;
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624)
#if defined(PCIE8997) || defined(PCIE9098) || defined(PCIE9097) || \
defined(PCIEIW624)
if (pmadapter->pcard_pcie->vdll_cmd_buf)
wlan_pcie_send_vdll_complete(pmadapter);
#endif
@ -4817,6 +4884,32 @@ static mlan_status wlan_process_pcie_int_status_ext(mlan_adapter *pmadapter,
return MLAN_STATUS_SUCCESS;
}
/**
* @brief This function enables rx host interrupts.
*
* @param pmadapter A pointer to mlan_adapter structure
* @param enable 0-disable 1-enable
*
* @return MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE
*/
static mlan_status wlan_pcie_select_host_int(mlan_adapter *pmadapter)
{
mlan_status ret = MLAN_STATUS_SUCCESS;
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624)
t_u32 int_sel_mask =
PCIE9098_HOST_INTR_SEL_MASK & ~PCIE9098_HOST_INTR_UPLD_RDY;
#endif
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624)
if (pmadapter->pcard_pcie->reg->use_adma) {
ret = wlan_pcie_set_host_int_select_reg(pmadapter,
int_sel_mask);
PRINTM(MMSG, "set int_sel_mask=0x%x\n", int_sel_mask);
}
#endif
return ret;
}
mlan_adapter_operations mlan_pcie_ops = {
.dnld_fw = wlan_pcie_dnld_fw,
.interrupt = wlan_pcie_interrupt_ext,
@ -4828,6 +4921,7 @@ mlan_adapter_operations mlan_pcie_ops = {
.data_complete = wlan_pcie_data_complete,
.cmdrsp_complete = wlan_pcie_cmdrsp_complete,
.handle_rx_packet = wlan_handle_rx_packet,
.select_host_int = wlan_pcie_select_host_int,
.debug_dump = wlan_pcie_debug_dump,
.intf_header_len = PCIE_INTF_HEADER_LEN,
};

View file

@ -413,10 +413,13 @@ Change log:
#define HOST_INTR_CMD_DONE MBIT(2)
/** Event ready interrupt for host */
#define HOST_INTR_EVENT_RDY MBIT(3)
/** Command download interrupt for host */
#define HOST_INTR_CMD_DNLD MBIT(7)
/** Interrupt mask for host */
#define HOST_INTR_MASK \
(HOST_INTR_DNLD_DONE | HOST_INTR_UPLD_RDY | HOST_INTR_CMD_DONE | \
HOST_INTR_EVENT_RDY)
HOST_INTR_EVENT_RDY | HOST_INTR_CMD_DNLD)
/** Lower 32bits command address holding register */
#define REG_CMD_ADDR_LO PCIE_SCRATCH_0_REG
@ -470,9 +473,6 @@ mlan_status wlan_get_pcie_device(pmlan_adapter pmadapter);
/** Set PCIE host buffer configurations */
mlan_status wlan_set_pcie_buf_config(mlan_private *pmpriv);
/** Init write pointer */
mlan_status wlan_pcie_init_fw(pmlan_adapter pmadapter);
#if defined(PCIE8997) || defined(PCIE8897)
/** Prepare command PCIE host buffer config */
mlan_status wlan_cmd_pcie_host_buf_cfg(pmlan_private pmpriv,

View file

@ -408,16 +408,6 @@ static t_s32 wlan_find_best_network_in_list(mlan_private *pmpriv)
for (i = 0; i < pmadapter->num_in_scan_table; i++) {
switch (mode) {
case MLAN_BSS_MODE_INFRA:
case MLAN_BSS_MODE_IBSS:
if (wlan_is_network_compatible(pmpriv, i, mode) >= 0) {
if (SCAN_RSSI(pmadapter->pscan_table[i].rssi) >
best_rssi) {
best_rssi = SCAN_RSSI(
pmadapter->pscan_table[i].rssi);
best_net = i;
}
}
break;
case MLAN_BSS_MODE_AUTO:
default:
if (SCAN_RSSI(pmadapter->pscan_table[i].rssi) >
@ -497,12 +487,7 @@ static t_u8 wlan_scan_create_channel_list(
"create_channel_list: region=%d band=%d num_cfp=%d\n",
pscan_region->region, pscan_region->band,
pscan_region->num_cfp);
if ((puser_scan_in &&
(puser_scan_in->bss_mode == MLAN_SCAN_MODE_IBSS)) ||
pmpriv->bss_mode == MLAN_BSS_MODE_IBSS)
band = pmadapter->adhoc_start_band;
else
band = pmpriv->config_bands;
band = pmpriv->config_bands;
if (!wlan_is_band_compatible(band, pscan_region->band))
continue;
@ -1380,12 +1365,8 @@ static mlan_status wlan_scan_setup_scan_config(
/* Append rates tlv */
memset(pmadapter, rates, 0, sizeof(rates));
rates_size = wlan_get_supported_rates(
pmpriv, pmpriv->bss_mode,
(pmpriv->bss_mode == MLAN_BSS_MODE_INFRA) ?
pmpriv->config_bands :
pmadapter->adhoc_start_band,
rates);
rates_size = wlan_get_supported_rates(pmpriv, pmpriv->bss_mode,
pmpriv->config_bands, rates);
prates_tlv = (MrvlIEtypes_RatesParamSet_t *)ptlv_pos;
prates_tlv->header.type = wlan_cpu_to_le16(TLV_TYPE_RATES);
@ -1723,7 +1704,6 @@ static mlan_status wlan_interpret_bss_desc_with_ie(pmlan_adapter pmadapter,
IEEEtypes_FhParamSet_t *pfh_param_set;
IEEEtypes_DsParamSet_t *pds_param_set;
IEEEtypes_CfParamSet_t *pcf_param_set;
IEEEtypes_IbssParamSet_t *pibss_param_set;
IEEEtypes_CapInfo_t *pcap_info;
WLAN_802_11_FIXED_IEs fixed_ie;
t_u8 *pcurrent_ptr;
@ -1856,10 +1836,7 @@ static mlan_status wlan_interpret_bss_desc_with_ie(pmlan_adapter pmadapter,
pbss_entry->privacy = Wlan802_11PrivFilterAcceptAll;
}
if (pcap_info->ibss == 1)
pbss_entry->bss_mode = MLAN_BSS_MODE_IBSS;
else
pbss_entry->bss_mode = MLAN_BSS_MODE_INFRA;
pbss_entry->bss_mode = MLAN_BSS_MODE_INFRA;
if (pcap_info->spectrum_mgmt == 1) {
PRINTM(MINFO, "InterpretIE: 11h- Spectrum Management "
@ -1958,20 +1935,6 @@ static mlan_status wlan_interpret_bss_desc_with_ie(pmlan_adapter pmadapter,
sizeof(IEEEtypes_Header_t)));
break;
case IBSS_PARAM_SET:
pibss_param_set =
(IEEEtypes_IbssParamSet_t *)pcurrent_ptr;
pbss_entry->atim_window =
wlan_le16_to_cpu(pibss_param_set->atim_window);
memcpy_ext(pmadapter,
&pbss_entry->ss_param_set.ibss_param_set,
pibss_param_set, total_ie_len,
sizeof(IEEEtypes_IbssParamSet_t));
pbss_entry->ss_param_set.ibss_param_set.len = MIN(
element_len, (sizeof(IEEEtypes_IbssParamSet_t) -
sizeof(IEEEtypes_Header_t)));
break;
/* Handle Country Info IE */
case COUNTRY_INFO:
pcountry_info =
@ -2009,7 +1972,6 @@ static mlan_status wlan_interpret_bss_desc_with_ie(pmlan_adapter pmadapter,
case TPC_REPORT:
case CHANNEL_SWITCH_ANN:
case QUIET:
case IBSS_DFS:
case SUPPORTED_CHANNELS:
case TPC_REQUEST:
wlan_11h_process_bss_elem(
@ -6199,12 +6161,7 @@ static t_u8 wlan_bgscan_create_channel_list(
if (radio_type && (pscan_region->band != BAND_A))
continue;
}
if ((pbg_scan_in &&
(pbg_scan_in->bss_type == MLAN_SCAN_MODE_IBSS)) ||
pmpriv->bss_mode == MLAN_BSS_MODE_IBSS)
band = pmadapter->adhoc_start_band;
else
band = pmpriv->config_bands;
band = pmpriv->config_bands;
if (!wlan_is_band_compatible(band, pscan_region->band))
continue;
for (next_chan = 0; next_chan < pscan_region->num_cfp;
@ -6463,11 +6420,7 @@ mlan_status wlan_cmd_bgscan_config(mlan_private *pmpriv,
bg_scan_in->chan_list[chan_idx].chan_number;
chan_idx++) {
radio_type = bg_scan_in->chan_list[chan_idx].radio_type;
if (bg_scan_in->bss_type == MLAN_SCAN_MODE_IBSS ||
pmpriv->bss_mode == MLAN_BSS_MODE_IBSS)
band = pmadapter->adhoc_start_band;
else
band = pmpriv->config_bands;
band = pmpriv->config_bands;
if (!wlan_is_band_compatible(
band, radio_type_to_band(radio_type)))
continue;
@ -6869,7 +6822,7 @@ t_s32 wlan_find_ssid_in_list(mlan_private *pmpriv, mlan_802_11_ssid *ssid,
t_u8 *bssid, t_u32 mode)
{
mlan_adapter *pmadapter = pmpriv->adapter;
t_s32 net = -1, j;
t_s32 net = -1;
t_u8 best_rssi = 0;
t_u32 i;
@ -6897,24 +6850,6 @@ t_s32 wlan_find_ssid_in_list(mlan_private *pmpriv, mlan_802_11_ssid *ssid,
switch (mode) {
case MLAN_BSS_MODE_INFRA:
case MLAN_BSS_MODE_IBSS:
j = wlan_is_network_compatible(pmpriv, i, mode);
if (j >= 0) {
if (SCAN_RSSI(pmadapter->pscan_table[i]
.rssi) >
best_rssi) {
best_rssi = SCAN_RSSI(
pmadapter
->pscan_table[i]
.rssi);
net = i;
}
} else {
if (net == -1)
net = j;
}
break;
case MLAN_BSS_MODE_AUTO:
default:
/*
@ -6980,10 +6915,6 @@ t_s32 wlan_find_bssid_in_list(mlan_private *pmpriv, t_u8 *bssid, t_u32 mode)
continue;
switch (mode) {
case MLAN_BSS_MODE_INFRA:
case MLAN_BSS_MODE_IBSS:
net = wlan_is_network_compatible(pmpriv, i,
mode);
break;
default:
net = i;
break;

View file

@ -3013,7 +3013,9 @@ exit:
return ret;
}
#if (defined(SD9098) || defined(SD9097) || defined(SDIW624) || defined(SD9177))
#if defined(SD9098) || defined(SD9097) || defined(SDIW624) || \
defined(SD9177) || defined(SD8997) || defined(SD8987) || \
defined(SD8978)
/**
* @brief This function sends vdll data to the card.
*
@ -3074,7 +3076,9 @@ static mlan_status wlan_sdio_host_to_card_ext(pmlan_private pmpriv, t_u8 type,
mlan_status ret = MLAN_STATUS_SUCCESS;
mlan_adapter *pmadapter = pmpriv->adapter;
#if (defined(SD9098) || defined(SD9097) || defined(SDIW624) || defined(SD9177))
#if defined(SD9098) || defined(SD9097) || defined(SDIW624) || \
defined(SD9177) || defined(SD8997) || defined(SD8987) || \
defined(SD8978)
if (type == MLAN_TYPE_VDLL)
return wlan_sdio_send_vdll(pmadapter, pmbuf);
#endif

View file

@ -326,6 +326,8 @@ mlan_status mlan_register(pmlan_device pmdevice, t_void **ppmlan_adapter)
pmadapter->card_rev = pmdevice->card_rev;
pmadapter->init_para.uap_max_sta = pmdevice->uap_max_sta;
pmadapter->init_para.mcs32 = pmdevice->mcs32;
pmadapter->init_para.antcfg = pmdevice->antcfg;
pmadapter->init_para.dmcs = pmdevice->dmcs;
#ifdef SDIO
if (IS_SD(pmadapter->card_type)) {
@ -1456,6 +1458,8 @@ mlan_status mlan_send_packet(t_void *padapter, pmlan_buffer pmbuf)
(eth_type == MLAN_ETHER_PKT_TYPE_WAPI) ||
(eth_type == MLAN_ETHER_PKT_TYPE_TDLS_ACTION) ||
(pmbuf->buf_type == MLAN_BUF_TYPE_RAW_DATA)
/* Adding the Ucast/Mcast pkt to bypass queue when flag is set*/
|| (pmbuf->flags & MLAN_BUF_FLAG_MC_AGGR_PKT)
) {
if (eth_type == MLAN_ETHER_PKT_TYPE_TDLS_ACTION) {

View file

@ -509,6 +509,42 @@ mlan_status wlan_cmd_mfg_he_tb_tx(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
return MLAN_STATUS_SUCCESS;
}
/**
* @brief This function prepares command of MFG OTP RW.
*
* @param pmpriv A pointer to mlan_private structure
* @param cmd A pointer to HostCmd_DS_COMMAND structure
* @param action The action: GET or SET
* @param pdata_buf A pointer to data buffer
*
* @return MLAN_STATUS_SUCCESS
*/
mlan_status wlan_cmd_mfg_otp_rw(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
t_u16 action, t_void *pdata_buf)
{
mfg_cmd_otp_mac_addr_rd_wr_t *mcmd =
(mfg_cmd_otp_mac_addr_rd_wr_t *)&cmd->params
.mfg_otp_mac_addr_rd_wr;
mfg_cmd_otp_mac_addr_rd_wr_t *cfg =
(mfg_cmd_otp_mac_addr_rd_wr_t *)pdata_buf;
ENTER();
cmd->command = wlan_cpu_to_le16(HostCmd_CMD_MFG_COMMAND);
cmd->size = wlan_cpu_to_le16(sizeof(mfg_cmd_otp_mac_addr_rd_wr_t) +
S_DS_GEN);
mcmd->mfg_cmd = wlan_cpu_to_le32(cfg->mfg_cmd);
mcmd->action = wlan_cpu_to_le16(cfg->action);
if (action == HostCmd_ACT_GEN_SET) {
memcpy_ext(pmpriv->adapter, mcmd->mac_addr, cfg->mac_addr,
MLAN_MAC_ADDR_LENGTH, MLAN_MAC_ADDR_LENGTH);
}
LEAVE();
return MLAN_STATUS_SUCCESS;
}
/**
* @brief This function prepares command of MFG cmd.
*
@ -548,6 +584,9 @@ mlan_status wlan_cmd_mfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
ret = wlan_cmd_mfg_config_trigger_frame(pmpriv, cmd, action,
pdata_buf);
goto cmd_mfg_done;
case MFG_CMD_OTP_MAC_ADD:
ret = wlan_cmd_mfg_otp_rw(pmpriv, cmd, action, pdata_buf);
goto cmd_mfg_done;
case MFG_CMD_SET_TEST_MODE:
case MFG_CMD_UNSET_TEST_MODE:
case MFG_CMD_TX_ANT:
@ -1067,29 +1106,6 @@ static mlan_status wlan_cmd_802_11_deauthenticate(pmlan_private pmpriv,
return MLAN_STATUS_SUCCESS;
}
/**
* @brief This function prepares command of ad_hoc_stop.
*
* @param pmpriv A pointer to mlan_private structure
* @param cmd A pointer to HostCmd_DS_COMMAND structure
*
* @return MLAN_STATUS_SUCCESS
*/
static mlan_status wlan_cmd_802_11_ad_hoc_stop(pmlan_private pmpriv,
HostCmd_DS_COMMAND *cmd)
{
ENTER();
cmd->command = wlan_cpu_to_le16(HostCmd_CMD_802_11_AD_HOC_STOP);
cmd->size = wlan_cpu_to_le16(S_DS_GEN);
if (wlan_11h_is_active(pmpriv))
wlan_11h_activate(pmpriv, MNULL, MFALSE);
LEAVE();
return MLAN_STATUS_SUCCESS;
}
/**
* @brief This function prepares command of key_material.
*
@ -1598,8 +1614,7 @@ static mlan_status wlan_cmd_802_11_rf_channel(pmlan_private pmpriv,
S_DS_GEN);
if (cmd_action == HostCmd_ACT_GEN_SET) {
if ((pmpriv->adapter->adhoc_start_band & BAND_A))
prf_chan->rf_type.bandcfg.chanBand = BAND_5GHZ;
prf_chan->rf_type.bandcfg.chanBand = BAND_5GHZ;
prf_chan->rf_type.bandcfg.chanWidth =
pmpriv->adapter->chan_bandwidth;
prf_chan->current_channel =
@ -1610,51 +1625,6 @@ static mlan_status wlan_cmd_802_11_rf_channel(pmlan_private pmpriv,
return MLAN_STATUS_SUCCESS;
}
/**
* @brief This function prepares command of ibss_coalescing_status.
*
* @param pmpriv A pointer to mlan_private structure
* @param cmd A pointer to HostCmd_DS_COMMAND structure
* @param cmd_action The action: GET or SET
* @param pdata_buf A pointer to data buffer or MNULL
*
* @return MLAN_STATUS_SUCCESS
*/
static mlan_status wlan_cmd_ibss_coalescing_status(pmlan_private pmpriv,
HostCmd_DS_COMMAND *cmd,
t_u16 cmd_action,
t_void *pdata_buf)
{
HostCmd_DS_802_11_IBSS_STATUS *pibss_coal =
&(cmd->params.ibss_coalescing);
t_u16 enable = 0;
ENTER();
cmd->command =
wlan_cpu_to_le16(HostCmd_CMD_802_11_IBSS_COALESCING_STATUS);
cmd->size = wlan_cpu_to_le16(sizeof(HostCmd_DS_802_11_IBSS_STATUS) +
S_DS_GEN);
cmd->result = 0;
pibss_coal->action = wlan_cpu_to_le16(cmd_action);
switch (cmd_action) {
case HostCmd_ACT_GEN_SET:
if (pdata_buf != MNULL)
enable = *(t_u16 *)pdata_buf;
pibss_coal->enable = wlan_cpu_to_le16(enable);
break;
/* In other case.. Nothing to do */
case HostCmd_ACT_GEN_GET:
default:
break;
}
LEAVE();
return MLAN_STATUS_SUCCESS;
}
/**
* @brief This function prepares command of mgmt IE list.
*
@ -3625,73 +3595,11 @@ static mlan_status wlan_is_cmd_allowed(mlan_private *priv, t_u16 cmd_no)
ENTER();
if (priv->adapter->pcard_info->v16_fw_api) {
if (!IS_FW_SUPPORT_ADHOC(priv->adapter)) {
switch (cmd_no) {
case HostCmd_ACT_MAC_ADHOC_G_PROTECTION_ON:
case HostCmd_CMD_802_11_IBSS_COALESCING_STATUS:
case HostCmd_CMD_802_11_AD_HOC_START:
case HostCmd_CMD_802_11_AD_HOC_JOIN:
case HostCmd_CMD_802_11_AD_HOC_STOP:
ret = MLAN_STATUS_FAILURE;
break;
default:
break;
}
}
}
LEAVE();
return ret;
}
/**
* @brief This function enable/disable CSI support.
*
* @param pmpriv A pointer to mlan_private structure
* @param cmd A pointer to HostCmd_DS_COMMAND structure
* @param cmd_action The action: GET or SET
* @param pdata_buf A pointer to data buffer
*
* @return MLAN_STATUS_SUCCESS
*/
static mlan_status wlan_cmd_csi(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
t_u16 cmd_action, t_u16 *pdata_buf)
{
HostCmd_DS_CSI_CFG *csi_cfg_cmd = &cmd->params.csi_params;
mlan_ds_csi_params *csi_params = MNULL;
ENTER();
cmd->command = wlan_cpu_to_le16(HostCmd_CMD_CSI);
cmd->size = sizeof(HostCmd_DS_CSI_CFG) + S_DS_GEN;
csi_cfg_cmd->action = wlan_cpu_to_le16(cmd_action);
switch (cmd_action) {
case CSI_CMD_ENABLE:
csi_params = (mlan_ds_csi_params *)pdata_buf;
csi_cfg_cmd->head_id = wlan_cpu_to_le32(csi_params->head_id);
csi_cfg_cmd->tail_id = wlan_cpu_to_le32(csi_params->tail_id);
csi_cfg_cmd->chip_id = csi_params->chip_id;
csi_cfg_cmd->csi_filter_cnt = csi_params->csi_filter_cnt;
if (csi_cfg_cmd->csi_filter_cnt > CSI_FILTER_MAX)
csi_cfg_cmd->csi_filter_cnt = CSI_FILTER_MAX;
memcpy_ext(pmpriv->adapter, (t_u8 *)csi_cfg_cmd->csi_filter,
(t_u8 *)csi_params->csi_filter,
sizeof(mlan_csi_filter_t) *
csi_cfg_cmd->csi_filter_cnt,
sizeof(csi_cfg_cmd->csi_filter));
DBG_HEXDUMP(MCMD_D, "Enable CSI", csi_cfg_cmd,
sizeof(HostCmd_DS_CSI_CFG));
break;
case CSI_CMD_DISABLE:
DBG_HEXDUMP(MCMD_D, "Disable CSI", csi_cfg_cmd,
sizeof(HostCmd_DS_CSI_CFG));
default:
break;
}
cmd->size = wlan_cpu_to_le16(cmd->size);
LEAVE();
return MLAN_STATUS_SUCCESS;
}
/**
* @brief This function prepare the command before sending to firmware.
*
@ -3819,15 +3727,6 @@ mlan_status wlan_ops_sta_prepare_cmd(t_void *priv, t_u16 cmd_no,
ret = wlan_cmd_802_11_deauthenticate(pmpriv, cmd_no, cmd_ptr,
pdata_buf);
break;
case HostCmd_CMD_802_11_AD_HOC_START:
ret = wlan_cmd_802_11_ad_hoc_start(pmpriv, cmd_ptr, pdata_buf);
break;
case HostCmd_CMD_802_11_AD_HOC_JOIN:
ret = wlan_cmd_802_11_ad_hoc_join(pmpriv, cmd_ptr, pdata_buf);
break;
case HostCmd_CMD_802_11_AD_HOC_STOP:
ret = wlan_cmd_802_11_ad_hoc_stop(pmpriv, cmd_ptr);
break;
case HostCmd_CMD_802_11_GET_LOG:
ret = wlan_cmd_802_11_get_log(pmpriv, cmd_ptr);
break;
@ -3993,10 +3892,6 @@ mlan_status wlan_ops_sta_prepare_cmd(t_void *priv, t_u16 cmd_no,
ret = wlan_cmd_wmm_param_config(pmpriv, cmd_ptr, cmd_action,
pdata_buf);
break;
case HostCmd_CMD_802_11_IBSS_COALESCING_STATUS:
ret = wlan_cmd_ibss_coalescing_status(pmpriv, cmd_ptr,
cmd_action, pdata_buf);
break;
case HostCmd_CMD_MGMT_IE_LIST:
ret = wlan_cmd_mgmt_ie_list(pmpriv, cmd_ptr, cmd_action,
pdata_buf);
@ -4053,10 +3948,7 @@ mlan_status wlan_ops_sta_prepare_cmd(t_void *priv, t_u16 cmd_no,
cmd_ptr->params.bss_mode.con_type = *(t_u8 *)pdata_buf;
} else
#endif
if (pmpriv->bss_mode == MLAN_BSS_MODE_IBSS)
cmd_ptr->params.bss_mode.con_type =
CONNECTION_TYPE_ADHOC;
else if (pmpriv->bss_mode == MLAN_BSS_MODE_INFRA)
if (pmpriv->bss_mode == MLAN_BSS_MODE_INFRA)
cmd_ptr->params.bss_mode.con_type =
CONNECTION_TYPE_INFRA;
cmd_ptr->size = wlan_cpu_to_le16(

View file

@ -174,11 +174,6 @@ static mlan_status wlan_process_cmdresp_error(mlan_private *pmpriv,
/*
* We do not re-try enter-ps command in ad-hoc mode.
*/
if (wlan_le16_to_cpu(pm->action) == EN_AUTO_PS &&
(wlan_le16_to_cpu(pm->params.auto_ps.ps_bitmap) &
BITMAP_STA_PS) &&
pmpriv->bss_mode == MLAN_BSS_MODE_IBSS)
pmadapter->ps_mode = Wlan802_11PowerModeCAM;
} break;
case HostCmd_CMD_802_11_SCAN_EXT:
case HostCmd_CMD_802_11_SCAN:
@ -1269,28 +1264,6 @@ static mlan_status wlan_ret_802_11_deauthenticate(pmlan_private pmpriv,
return MLAN_STATUS_SUCCESS;
}
/**
* @brief This function handles the command response of ad_hoc_stop
*
* @param pmpriv A pointer to mlan_private structure
* @param resp A pointer to HostCmd_DS_COMMAND
* @param pioctl_buf A pointer to mlan_ioctl_req structure
*
* @return MLAN_STATUS_SUCCESS
*/
static mlan_status wlan_ret_802_11_ad_hoc_stop(pmlan_private pmpriv,
HostCmd_DS_COMMAND *resp,
mlan_ioctl_req *pioctl_buf)
{
ENTER();
wlan_reset_connect_state(pmpriv, MTRUE);
if (pmpriv->adapter->state_rdh.stage == RDH_STOP_INTFS)
wlan_11h_radar_detected_callback((t_void *)pmpriv);
LEAVE();
return MLAN_STATUS_SUCCESS;
}
/**
* @brief This function handles the command response of key_material
*
@ -1560,68 +1533,6 @@ static mlan_status wlan_ret_802_11_rf_channel(pmlan_private pmpriv,
return MLAN_STATUS_SUCCESS;
}
/**
* @brief Handle the ibss_coalescing_status resp
*
* @param pmpriv A pointer to mlan_private structure
* @param resp A pointer to HostCmd_DS_COMMAND
*
* @return MLAN_STATUS_SUCCESS
*/
static mlan_status wlan_ret_ibss_coalescing_status(pmlan_private pmpriv,
HostCmd_DS_COMMAND *resp)
{
HostCmd_DS_802_11_IBSS_STATUS *pibss_coal_resp =
&(resp->params.ibss_coalescing);
t_u8 zero_mac[MLAN_MAC_ADDR_LENGTH] = {0, 0, 0, 0, 0, 0};
ENTER();
if (wlan_le16_to_cpu(pibss_coal_resp->action) == HostCmd_ACT_GEN_SET) {
LEAVE();
return MLAN_STATUS_SUCCESS;
}
PRINTM(MINFO, "New BSSID " MACSTR "\n",
MAC2STR(pibss_coal_resp->bssid));
/* If rsp has MNULL BSSID, Just return..... No Action */
if (!memcmp(pmpriv->adapter, pibss_coal_resp->bssid, zero_mac,
MLAN_MAC_ADDR_LENGTH)) {
PRINTM(MMSG, "New BSSID is MNULL\n");
LEAVE();
return MLAN_STATUS_SUCCESS;
}
/* If BSSID is diff, modify current BSS parameters */
if (memcmp(pmpriv->adapter,
pmpriv->curr_bss_params.bss_descriptor.mac_address,
pibss_coal_resp->bssid, MLAN_MAC_ADDR_LENGTH)) {
/* BSSID */
memcpy_ext(pmpriv->adapter,
pmpriv->curr_bss_params.bss_descriptor.mac_address,
pibss_coal_resp->bssid, MLAN_MAC_ADDR_LENGTH,
sizeof(pmpriv->curr_bss_params.bss_descriptor
.mac_address));
/* Beacon Interval and ATIM window */
pmpriv->curr_bss_params.bss_descriptor.beacon_period =
wlan_le16_to_cpu(pibss_coal_resp->beacon_interval);
pmpriv->curr_bss_params.bss_descriptor.atim_window =
wlan_le16_to_cpu(pibss_coal_resp->atim_window);
/* ERP Information */
pmpriv->curr_bss_params.bss_descriptor.erp_flags =
(t_u8)wlan_le16_to_cpu(
pibss_coal_resp->use_g_rate_protect);
pmpriv->adhoc_state = ADHOC_COALESCED;
}
LEAVE();
return MLAN_STATUS_SUCCESS;
}
/**
* @brief This function handles the command response of MGMT_IE_LIST
*
@ -3083,6 +2994,40 @@ static mlan_status wlan_ret_mfg_he_tb_tx(pmlan_private pmpriv,
return MLAN_STATUS_SUCCESS;
}
/**
* @brief This function prepares command resp of MFG CMD OTP RW
*
* @param pmpriv A pointer to mlan_private structure
* @param resp A pointer to HostCmd_DS_COMMAND
* @param pioctl_buf A pointer to mlan_ioctl_req structure
*
* @return MLAN_STATUS_SUCCESS
*/
static mlan_status wlan_ret_mfg_otp_rw(pmlan_private pmpriv,
HostCmd_DS_COMMAND *resp,
mlan_ioctl_req *pioctl_buf)
{
mlan_ds_misc_cfg *misc = MNULL;
mfg_cmd_otp_mac_addr_rd_wr_t *cfg = MNULL;
mfg_cmd_otp_mac_addr_rd_wr_t *mcmd =
(mfg_cmd_otp_mac_addr_rd_wr_t *)&resp->params
.mfg_otp_mac_addr_rd_wr;
ENTER();
if (!pioctl_buf) {
LEAVE();
return MLAN_STATUS_FAILURE;
}
misc = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;
cfg = (mfg_cmd_otp_mac_addr_rd_wr_t *)&misc->param
.mfg_otp_mac_addr_rd_wr;
memcpy_ext(pmpriv->adapter, &(cfg->mac_addr[0]), &(mcmd->mac_addr[0]),
MLAN_MAC_ADDR_LENGTH, MLAN_MAC_ADDR_LENGTH);
LEAVE();
return MLAN_STATUS_SUCCESS;
}
/**
* @brief This function prepares command resp of MFG Cmd
*
@ -3100,9 +3045,8 @@ mlan_status wlan_ret_mfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
(struct mfg_cmd_generic_cfg *)&resp->params.mfg_generic_cfg;
struct mfg_cmd_generic_cfg *cfg = MNULL;
mlan_status ret = MLAN_STATUS_SUCCESS;
#ifdef SD9177
mlan_adapter *pmadapter = pmpriv->adapter;
#endif
t_u16 card_type = pmadapter->card_type;
ENTER();
if (!pioctl_buf) {
@ -3123,6 +3067,9 @@ mlan_status wlan_ret_mfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
ret = wlan_ret_mfg_config_trigger_frame(pmpriv, resp,
pioctl_buf);
goto cmd_mfg_done;
case MFG_CMD_OTP_MAC_ADD:
ret = wlan_ret_mfg_otp_rw(pmpriv, resp, pioctl_buf);
goto cmd_mfg_done;
case MFG_CMD_SET_TEST_MODE:
case MFG_CMD_UNSET_TEST_MODE:
case MFG_CMD_TX_ANT:
@ -3142,19 +3089,17 @@ mlan_status wlan_ret_mfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
cfg = (struct mfg_cmd_generic_cfg *)&misc->param.mfg_generic_cfg;
cfg->error = wlan_le32_to_cpu(mcmd->error);
#ifdef SD9177
if (IS_SD9177(pmadapter->card_type) &&
card_type = card_type & 0xff;
if (((card_type == CARD_TYPE_9098) || (card_type == CARD_TYPE_9097) ||
(card_type == CARD_TYPE_9177) || (card_type == CARD_TYPE_IW624) ||
(card_type == CARD_TYPE_AW693)) &&
(wlan_le32_to_cpu(mcmd->mfg_cmd) == MFG_CMD_RFPWR)) {
//! TX_POWER was multipied by 16 while passing to fw
//! So It is needed to divide by 16 for user vals understanding.
cfg->data1 = (wlan_le32_to_cpu(mcmd->data1) >> 4);
} else {
#endif
cfg->data1 = wlan_le32_to_cpu(mcmd->data1);
#ifdef SD9177
}
#endif
cfg->data2 = wlan_le32_to_cpu(mcmd->data2);
cfg->data3 = wlan_le32_to_cpu(mcmd->data3);
@ -3317,12 +3262,6 @@ mlan_status wlan_ops_sta_process_cmdresp(t_void *priv, t_u16 cmdresp_no,
case HostCmd_CMD_802_11_DISASSOCIATE:
ret = wlan_ret_802_11_deauthenticate(pmpriv, resp, pioctl_buf);
break;
case HostCmd_CMD_802_11_AD_HOC_START:
case HostCmd_CMD_802_11_AD_HOC_JOIN:
ret = wlan_ret_802_11_ad_hoc(pmpriv, resp, pioctl_buf);
break;
case HostCmd_CMD_802_11_AD_HOC_STOP:
ret = wlan_ret_802_11_ad_hoc_stop(pmpriv, resp, pioctl_buf);
break;
case HostCmd_CMD_802_11_GET_LOG:
ret = wlan_ret_get_log(pmpriv, resp, pioctl_buf);
@ -3469,8 +3408,6 @@ mlan_status wlan_ops_sta_process_cmdresp(t_void *priv, t_u16 cmdresp_no,
case HostCmd_CMD_WMM_PARAM_CONFIG:
ret = wlan_ret_wmm_param_config(pmpriv, resp, pioctl_buf);
break;
case HostCmd_CMD_802_11_IBSS_COALESCING_STATUS:
ret = wlan_ret_ibss_coalescing_status(pmpriv, resp);
break;
case HostCmd_CMD_MGMT_IE_LIST:
ret = wlan_ret_mgmt_ie_list(pmpriv, resp, pioctl_buf);

View file

@ -62,49 +62,6 @@ static t_void wlan_handle_disconnect_event(pmlan_private pmpriv)
LEAVE();
}
/**
* @brief This function iterates over station list and notifies
* mac address of each sta to respective event handler.
*
* @param priv A pointer to mlan_private structure
* @event_id A reference to mlan event
* @return N/A
*/
static void wlan_notify_stations(mlan_private *priv, mlan_event_id event_id)
{
sta_node *sta_ptr;
t_u8 event_buf[128];
mlan_event *pevent = (mlan_event *)event_buf;
t_u8 *pbuf;
ENTER();
sta_ptr = (sta_node *)util_peek_list(
priv->adapter->pmoal_handle, &priv->sta_list,
priv->adapter->callbacks.moal_spin_lock,
priv->adapter->callbacks.moal_spin_unlock);
if (!sta_ptr) {
LEAVE();
return;
}
while (sta_ptr != (sta_node *)&priv->sta_list) {
memset(priv->adapter, event_buf, 0, sizeof(event_buf));
pevent->bss_index = priv->bss_index;
pevent->event_id = event_id;
pevent->event_len = MLAN_MAC_ADDR_LENGTH + 2;
pbuf = (t_u8 *)pevent->event_buf;
/* reason field set to 0, Unspecified */
memcpy_ext(priv->adapter, pbuf + 2, sta_ptr->mac_addr,
MLAN_MAC_ADDR_LENGTH, MLAN_MAC_ADDR_LENGTH);
wlan_recv_event(priv, pevent->event_id, pevent);
sta_ptr = sta_ptr->pnext;
}
LEAVE();
return;
}
/**
* @brief This function will parse the TDLS event for further wlan action
*
@ -538,12 +495,6 @@ t_void wlan_reset_connect_state(pmlan_private priv, t_u8 drv_disconnect)
priv->is_data_rate_auto = MTRUE;
priv->data_rate = 0;
if (priv->bss_mode == MLAN_BSS_MODE_IBSS) {
priv->adhoc_state = ADHOC_IDLE;
priv->adhoc_is_link_sensed = MFALSE;
priv->intf_state_11h.adhoc_auto_sel_chan = MTRUE;
}
if (drv_disconnect) {
/* Free Tx and Rx packets, report disconnect to upper layer */
wlan_clean_txrx(priv);
@ -822,9 +773,6 @@ mlan_status wlan_ops_sta_process_event(t_void *priv)
break;
case EVENT_LINK_SENSED:
PRINTM(MEVENT, "EVENT: LINK_SENSED\n");
pmpriv->adhoc_is_link_sensed = MTRUE;
wlan_recv_event(pmpriv, MLAN_EVENT_ID_FW_ADHOC_LINK_SENSED,
MNULL);
break;
case EVENT_DEAUTHENTICATED:
@ -986,15 +934,6 @@ mlan_status wlan_ops_sta_process_event(t_void *priv)
case EVENT_INIT_DONE:
break;
case EVENT_ADHOC_BCN_LOST:
PRINTM(MEVENT, "EVENT: ADHOC_BCN_LOST\n");
pmpriv->adhoc_is_link_sensed = MFALSE;
wlan_clean_txrx(pmpriv);
wlan_recv_event(pmpriv, MLAN_EVENT_ID_FW_ADHOC_LINK_LOST,
MNULL);
/* Notify IBSS disconnect handler to delete stations if any. */
wlan_notify_stations(pmpriv, MLAN_EVENT_ID_FW_IBSS_DISCONNECT);
break;
case EVENT_ASSOC_REQ_IE:
pmpriv->assoc_req_size = pmbuf->data_len - sizeof(eventcause);
evt_buf =
@ -1262,12 +1201,6 @@ mlan_status wlan_ops_sta_process_event(t_void *priv)
PRINTM(MEVENT, "EVENT: Pre-Beacon Lost\n");
wlan_recv_event(pmpriv, MLAN_EVENT_ID_FW_PRE_BCN_LOST, MNULL);
break;
case EVENT_IBSS_COALESCED:
PRINTM(MEVENT, "EVENT: IBSS_COALESCED\n");
ret = wlan_prepare_cmd(
pmpriv, HostCmd_CMD_802_11_IBSS_COALESCING_STATUS,
HostCmd_ACT_GEN_GET, 0, MNULL, MNULL);
break;
case EVENT_ADDBA:
PRINTM(MEVENT, "EVENT: ADDBA Request\n");
if (pmpriv->media_connected == MTRUE &&
@ -1398,24 +1331,6 @@ mlan_status wlan_ops_sta_process_event(t_void *priv)
wlan_process_sta_tx_pause_event(priv, pmbuf);
break;
case EVENT_IBSS_STATION_CONNECT:
pevent->bss_index = pmpriv->bss_index;
pevent->event_id = MLAN_EVENT_ID_FW_IBSS_CONNECT;
pevent->event_len = pmbuf->data_len;
memcpy_ext(pmadapter, (t_u8 *)pevent->event_buf,
pmbuf->pbuf + pmbuf->data_offset, pevent->event_len,
pevent->event_len);
wlan_recv_event(pmpriv, pevent->event_id, pevent);
break;
case EVENT_IBSS_STATION_DISCONNECT:
pevent->bss_index = pmpriv->bss_index;
pevent->event_id = MLAN_EVENT_ID_FW_IBSS_DISCONNECT;
pevent->event_len = pmbuf->data_len;
memcpy_ext(pmadapter, (t_u8 *)pevent->event_buf,
pmbuf->pbuf + pmbuf->data_offset, pevent->event_len,
pevent->event_len);
wlan_recv_event(pmpriv, pevent->event_id, pevent);
break;
case EVENT_SAD_REPORT: {
#ifdef DEBUG_LEVEL1
t_u8 *pevt_dat =

View file

@ -318,9 +318,6 @@ static mlan_status wlan_get_info_bss_info(pmlan_adapter pmadapter,
info->param.bss_info.max_power_level = pmpriv->max_tx_power_level;
info->param.bss_info.min_power_level = pmpriv->min_tx_power_level;
/* AdHoc state */
info->param.bss_info.adhoc_state = pmpriv->adhoc_state;
/* Last beacon NF */
info->param.bss_info.bcn_nf_last = pmpriv->bcn_nf_last;
@ -777,9 +774,7 @@ static mlan_status wlan_bss_ioctl_get_channel_list(pmlan_adapter pmadapter,
return MLAN_STATUS_FAILURE;
}
if ((wlan_11d_is_enabled(pmpriv) && pmpriv->media_connected == MTRUE) &&
((pmpriv->bss_mode == MLAN_BSS_MODE_INFRA) ||
(pmpriv->bss_mode == MLAN_BSS_MODE_IBSS &&
pmpriv->adhoc_state != ADHOC_STARTED))) {
((pmpriv->bss_mode == MLAN_BSS_MODE_INFRA))) {
t_u8 chan_no;
t_u16 band;
@ -902,8 +897,6 @@ static mlan_status wlan_bss_ioctl_channel(pmlan_adapter pmadapter,
LEAVE();
return MLAN_STATUS_FAILURE;
}
if (pmadapter->adhoc_start_band & BAND_A)
pmadapter->adhoc_start_band = BAND_G | BAND_B;
if (bss->param.bss_chan.channel) {
if (bss->param.bss_chan.channel <= MAX_CHANNEL_BAND_B)
cfp = wlan_find_cfp_by_band_and_channel(
@ -914,7 +907,6 @@ static mlan_status wlan_bss_ioctl_channel(pmlan_adapter pmadapter,
pmadapter, BAND_A,
(t_u16)bss->param.bss_chan.channel);
if (cfp) {
pmadapter->adhoc_start_band = BAND_A;
}
}
} else {
@ -925,7 +917,6 @@ static mlan_status wlan_bss_ioctl_channel(pmlan_adapter pmadapter,
cfp = wlan_find_cfp_by_band_and_freq(
pmadapter, BAND_A, bss->param.bss_chan.freq);
if (cfp) {
pmadapter->adhoc_start_band = BAND_A;
}
}
}
@ -936,8 +927,6 @@ static mlan_status wlan_bss_ioctl_channel(pmlan_adapter pmadapter,
LEAVE();
return MLAN_STATUS_FAILURE;
}
pmpriv->adhoc_channel = (t_u8)cfp->channel;
pmpriv->intf_state_11h.adhoc_auto_sel_chan = MFALSE;
bss->param.bss_chan.channel = cfp->channel;
bss->param.bss_chan.freq = cfp->freq;
@ -1105,65 +1094,6 @@ static mlan_status wlan_bss_ioctl_start(pmlan_adapter pmadapter,
goto start_ssid_done;
}
} else {
/* Adhoc mode */
/* If the requested SSID matches current SSID, return */
if (bss->param.ssid_bssid.ssid.ssid_len &&
(!wlan_ssid_cmp(pmadapter,
&pmpriv->curr_bss_params.bss_descriptor.ssid,
&bss->param.ssid_bssid.ssid))) {
ret = MLAN_STATUS_SUCCESS;
goto start_ssid_done;
}
/* Exit Adhoc mode first */
PRINTM(MINFO, "Sending Adhoc Stop\n");
ret = wlan_disconnect(pmpriv, MNULL, MNULL);
if (ret)
goto start_ssid_done;
pmpriv->adhoc_is_link_sensed = MFALSE;
if (!bss->param.ssid_bssid.idx ||
bss->param.ssid_bssid.idx > pmadapter->num_in_scan_table) {
/* Search for the requested network in the scan table */
if (bss->param.ssid_bssid.ssid.ssid_len) {
i = wlan_find_ssid_in_list(
pmpriv, &bss->param.ssid_bssid.ssid,
MNULL, MLAN_BSS_MODE_IBSS);
} else {
i = wlan_find_bssid_in_list(
pmpriv,
(t_u8 *)&bss->param.ssid_bssid.bssid,
MLAN_BSS_MODE_IBSS);
}
} else {
/* use bsslist index number to assoicate */
i = wlan_is_network_compatible(
pmpriv, bss->param.ssid_bssid.idx - 1,
pmpriv->bss_mode);
}
if (i >= 0) {
PRINTM(MINFO,
"Network found in scan list ... joining ...\n");
pmpriv->curr_chan_flags =
bss->param.ssid_bssid.channel_flags;
ret = wlan_adhoc_join(pmpriv, pioctl_req,
&pmadapter->pscan_table[i]);
if (ret)
goto start_ssid_done;
} else { /* i >= 0 */
PRINTM(MINFO,
"Network not found in the list, "
"creating adhoc with ssid = %s\n",
bss->param.ssid_bssid.ssid.ssid);
pmpriv->curr_chan_flags =
bss->param.ssid_bssid.channel_flags;
ret = wlan_adhoc_start(pmpriv, pioctl_req,
&bss->param.ssid_bssid.ssid);
if (ret)
goto start_ssid_done;
}
}
if (ret == MLAN_STATUS_SUCCESS)
@ -1198,50 +1128,6 @@ static mlan_status wlan_bss_ioctl_stop(pmlan_adapter pmadapter,
return ret;
}
/**
* @brief Set/Get IBSS channel
*
* @param pmadapter A pointer to mlan_adapter structure
* @param pioctl_req A pointer to ioctl request buffer
*
* @return MLAN_STATUS_SUCCESS/MLAN_STATUS_PENDING --success,
* otherwise fail
*/
static mlan_status wlan_bss_ioctl_ibss_channel(pmlan_adapter pmadapter,
pmlan_ioctl_req pioctl_req)
{
mlan_private *pmpriv = pmadapter->priv[pioctl_req->bss_index];
mlan_ds_bss *bss = MNULL;
mlan_status ret = MLAN_STATUS_SUCCESS;
t_u16 cmd_action;
ENTER();
bss = (mlan_ds_bss *)pioctl_req->pbuf;
if (pioctl_req->action == MLAN_ACT_GET) {
if (pmpriv->media_connected == MFALSE) {
bss->param.bss_chan.channel = pmpriv->adhoc_channel;
goto exit;
}
cmd_action = HostCmd_ACT_GEN_GET;
} else {
cmd_action = HostCmd_ACT_GEN_SET;
pmpriv->adhoc_channel = (t_u8)bss->param.bss_chan.channel;
pmpriv->intf_state_11h.adhoc_auto_sel_chan = MFALSE;
}
/* Send request to firmware */
ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_802_11_RF_CHANNEL,
cmd_action, 0, (t_void *)pioctl_req,
&bss->param.bss_chan.channel);
if (ret == MLAN_STATUS_SUCCESS)
ret = MLAN_STATUS_PENDING;
exit:
LEAVE();
return ret;
}
/**
* @brief Set/Get Listen Interval
*
@ -1269,65 +1155,6 @@ static mlan_status wlan_bss_ioctl_listen_interval(pmlan_adapter pmadapter,
return MLAN_STATUS_SUCCESS;
}
/*
* @brief Set/Get beacon interval
*
* @param pmadapter A pointer to mlan_adapter structure
* @param pioctl_req A pointer to ioctl request buffer
*
* @return MLAN_STATUS_SUCCESS --success
*/
static mlan_status wlan_bss_ioctl_beacon_interval(pmlan_adapter pmadapter,
pmlan_ioctl_req pioctl_req)
{
mlan_private *pmpriv = pmadapter->priv[pioctl_req->bss_index];
mlan_ds_bss *bss = MNULL;
mlan_status ret = MLAN_STATUS_SUCCESS;
ENTER();
bss = (mlan_ds_bss *)pioctl_req->pbuf;
if (pioctl_req->action == MLAN_ACT_GET) {
bss->param.bcn_interval = pmpriv->beacon_period;
if (pmpriv->media_connected == MTRUE)
bss->param.bcn_interval =
pmpriv->curr_bss_params.bss_descriptor
.beacon_period;
} else
pmpriv->beacon_period = (t_u16)bss->param.bcn_interval;
pioctl_req->data_read_written = sizeof(t_u32) + MLAN_SUB_COMMAND_SIZE;
LEAVE();
return ret;
}
/**
* @brief Set/Get ATIM window
*
* @param pmadapter A pointer to mlan_adapter structure
* @param pioctl_req A pointer to ioctl request buffer
*
* @return MLAN_STATUS_SUCCESS --success
*/
static mlan_status wlan_bss_ioctl_atim_window(pmlan_adapter pmadapter,
pmlan_ioctl_req pioctl_req)
{
mlan_private *pmpriv = pmadapter->priv[pioctl_req->bss_index];
mlan_ds_bss *bss = MNULL;
mlan_status ret = MLAN_STATUS_SUCCESS;
ENTER();
bss = (mlan_ds_bss *)pioctl_req->pbuf;
if (pioctl_req->action == MLAN_ACT_GET) {
bss->param.atim_window = pmpriv->atim_window;
if (pmpriv->media_connected == MTRUE)
bss->param.atim_window =
pmpriv->curr_bss_params.bss_descriptor
.atim_window;
} else
pmpriv->atim_window = (t_u16)bss->param.atim_window;
pioctl_req->data_read_written = sizeof(t_u32) + MLAN_SUB_COMMAND_SIZE;
LEAVE();
return ret;
}
/**
* @brief Query embe
*
@ -1526,6 +1353,10 @@ static mlan_status wlan_bss_ioctl(pmlan_adapter pmadapter,
switch (bss->sub_command) {
case MLAN_OID_BSS_HOST_MLME:
pmpriv->curr_bss_params.host_mlme = MTRUE;
memcpy_ext(pmpriv->adapter,
&pmpriv->curr_bss_params.attemp_bssid,
&bss->param.bssid, MLAN_MAC_ADDR_LENGTH,
MLAN_MAC_ADDR_LENGTH);
break;
case MLAN_OID_BSS_START:
status = wlan_bss_ioctl_start(pmadapter, pioctl_req);
@ -1555,15 +1386,6 @@ static mlan_status wlan_bss_ioctl(pmlan_adapter pmadapter,
case MLAN_OID_BSS_FIND_BSSID:
status = wlan_bss_ioctl_find_bssid(pmadapter, pioctl_req);
break;
case MLAN_OID_IBSS_BCN_INTERVAL:
status = wlan_bss_ioctl_beacon_interval(pmadapter, pioctl_req);
break;
case MLAN_OID_IBSS_ATIM_WINDOW:
status = wlan_bss_ioctl_atim_window(pmadapter, pioctl_req);
break;
case MLAN_OID_IBSS_CHANNEL:
status = wlan_bss_ioctl_ibss_channel(pmadapter, pioctl_req);
break;
#if defined(STA_SUPPORT) && defined(UAP_SUPPORT)
case MLAN_OID_BSS_ROLE:
util_enqueue_list_tail(pmadapter->pmoal_handle,
@ -1634,10 +1456,7 @@ wlan_rate_ioctl_get_supported_rate(pmlan_adapter pmadapter,
rate->param.rates);
else
wlan_get_active_data_rates(pmpriv, pmpriv->bss_mode,
(pmpriv->bss_mode ==
MLAN_BSS_MODE_INFRA) ?
pmpriv->config_bands :
pmadapter->adhoc_start_band,
pmpriv->config_bands,
rate->param.rates);
pioctl_req->data_read_written =
MLAN_SUPPORTED_RATES + MLAN_SUB_COMMAND_SIZE;
@ -3774,7 +3593,6 @@ static mlan_status wlan_11h_channel_check_req(pmlan_adapter pmadapter,
{
pmlan_private pmpriv = MNULL;
mlan_status ret = MLAN_STATUS_FAILURE;
t_u8 chan_width = CHAN_BW_20MHZ;
Band_Config_t bandcfg;
ENTER();
@ -3788,56 +3606,6 @@ static mlan_status wlan_11h_channel_check_req(pmlan_adapter pmadapter,
}
memset(pmadapter, &bandcfg, 0, sizeof(Band_Config_t));
pmpriv->adhoc_state = ADHOC_STARTING;
if ((pmadapter->adhoc_start_band & BAND_A)) {
if (pmpriv->intf_state_11h.adhoc_auto_sel_chan)
pmpriv->adhoc_channel =
wlan_11h_get_adhoc_start_channel(pmpriv);
/*
* Check if the region and channel requires a channel
* availability check.
*/
if (wlan_11h_radar_detect_required(pmpriv,
pmpriv->adhoc_channel) &&
!wlan_11h_is_channel_under_nop(pmadapter,
pmpriv->adhoc_channel)) {
/*
* Radar detection is required for this channel, make
* sure 11h is activated in the firmware
*/
ret = wlan_11h_activate(pmpriv, MNULL, MTRUE);
ret = wlan_11h_config_master_radar_det(pmpriv, MTRUE);
ret = wlan_11h_check_update_radar_det_state(pmpriv);
/* Check for radar on the channel */
if ((pmadapter->chan_bandwidth ==
CHANNEL_BW_40MHZ_ABOVE) ||
(pmadapter->chan_bandwidth ==
CHANNEL_BW_40MHZ_BELOW)) {
chan_width = CHAN_BW_40MHZ;
if (pmadapter->chanrpt_param_bandcfg) {
bandcfg.chan2Offset =
pmadapter->chan_bandwidth;
}
} else if (pmadapter->chan_bandwidth ==
CHANNEL_BW_80MHZ)
chan_width = CHAN_BW_80MHZ;
if (pmadapter->chanrpt_param_bandcfg) {
bandcfg.chanWidth = chan_width;
bandcfg.chanBand = BAND_5GHZ;
} else {
*((t_u8 *)&bandcfg) = chan_width;
}
ret = wlan_11h_issue_radar_detect(pmpriv, pioctl_req,
pmpriv->adhoc_channel,
bandcfg);
if (ret == MLAN_STATUS_SUCCESS)
ret = MLAN_STATUS_PENDING;
}
}
LEAVE();
return ret;
@ -4654,8 +4422,7 @@ static mlan_status wlan_misc_ioctl_cfp_code_cfg(pmlan_adapter pmadapter,
else
pmadapter->region_code = 0;
if (wlan_set_regiontable(pmpriv, (t_u8)pmadapter->region_code,
pmadapter->config_bands |
pmadapter->adhoc_start_band)) {
pmadapter->config_bands)) {
pioctl_req->status_code = MLAN_ERROR_INVALID_PARAMETER;
ret = MLAN_STATUS_FAILURE;
goto done;
@ -5378,6 +5145,7 @@ static mlan_status wlan_misc_cfg_ioctl(pmlan_adapter pmadapter,
case MLAN_OID_MISC_RF_TEST_CONFIG_TRIGGER_FRAME:
case MLAN_OID_MISC_RF_TEST_TX_FRAME:
case MLAN_OID_MISC_RF_TEST_HE_POWER:
case MLAN_OID_MISC_OTP_MAC_RD_WR:
status = wlan_misc_ioctl_rf_test_cfg(pmadapter, pioctl_req);
break;
case MLAN_OID_MISC_ARB_CONFIG:
@ -5513,6 +5281,15 @@ mlan_status wlan_scan_ioctl(pmlan_adapter pmadapter, pmlan_ioctl_req pioctl_req)
LEAVE();
return MLAN_STATUS_FAILURE;
}
if (pmadapter->remain_on_channel
#ifdef WIFI_DIRECT_SUPPORT
&& (pmpriv->bss_type != MLAN_BSS_TYPE_WIFIDIRECT)
#endif
) {
PRINTM(MERROR, "Scan is blocked during remain on channel...\n");
LEAVE();
return MLAN_STATUS_FAILURE;
}
start_config:
/* Set scan */
if (pioctl_req->action == MLAN_ACT_SET) {

View file

@ -661,7 +661,8 @@ done:
#ifdef USB
else if (IS_USB(pmadapter->card_type))
pmadapter->callbacks.moal_recv_complete(pmadapter->pmoal_handle,
MNULL, MLAN_USB_EP_DATA,
MNULL,
pmadapter->rx_data_ep,
MLAN_STATUS_SUCCESS);
#endif
LEAVE();

View file

@ -5121,6 +5121,9 @@ mlan_status wlan_ops_uap_prepare_cmd(t_void *priv, t_u16 cmd_no,
ret = wlan_cmd_edmac_cfg(pmpriv, cmd_ptr, cmd_action,
pdata_buf);
break;
case HostCmd_CMD_CSI:
ret = wlan_cmd_csi(pmpriv, cmd_ptr, cmd_action, pdata_buf);
break;
default:
PRINTM(MERROR, "PREP_CMD: unknown command- %#x\n", cmd_no);
if (pioctl_req)
@ -5546,6 +5549,15 @@ mlan_status wlan_ops_uap_process_cmdresp(t_void *priv, t_u16 cmdresp_no,
break;
case HostCmd_CMD_EDMAC_CFG:
break;
case HostCmd_CMD_CSI:
if (resp->params.csi_params.action == CSI_CMD_ENABLE) {
pmadapter->csi_enabled = 1;
PRINTM(MCMND, "CSI ENABLE cmdresp\n");
} else {
pmadapter->csi_enabled = 0;
PRINTM(MCMND, "CSI DISABLE cmdresp\n");
}
break;
default:
PRINTM(MERROR, "CMD_RESP: Unknown command response %#x\n",
resp->command);

View file

@ -2345,6 +2345,8 @@ mlan_status wlan_ops_uap_ioctl(t_void *adapter, pmlan_ioctl_req pioctl_req)
if (misc->sub_command == MLAN_OID_MISC_EDMAC_CONFIG)
status = wlan_misc_ioctl_edmac_cfg(pmadapter,
pioctl_req);
if (misc->sub_command == MLAN_OID_MISC_CSI)
status = wlan_misc_csi(pmadapter, pioctl_req);
break;
case MLAN_IOCTL_POWER_CFG:
power = (mlan_ds_power_cfg *)pioctl_req->pbuf;

View file

@ -424,6 +424,11 @@ static mlan_status wlan_usb_prog_fw_w_helper(pmlan_adapter pmadapter,
FWSeqNum++;
PRINTM(MINFO, ".\n");
/* Add FW ending check for secure download */
if (((DnldCmd == FW_CMD_21) && (DataLength == 0)) ||
(TotalBytes >= pmfw->fw_len))
break;
} while ((DnldCmd != FW_HAS_LAST_BLOCK) && retries && mic_retry);
cleanup:
@ -581,8 +586,9 @@ wlan_usb_copy_buf_to_aggr(pmlan_adapter pmadapter,
pmlan_buffer pmbuf_aggr = MNULL;
t_u8 i, use_count;
pmlan_buffer pmbuf_curr, pmbuf_next;
pmbuf_aggr = wlan_alloc_mlan_buffer(pmadapter, pusb_tx_aggr->aggr_len,
0, MOAL_MALLOC_BUFFER);
pmbuf_aggr = wlan_alloc_mlan_buffer(
pmadapter, pusb_tx_aggr->aggr_len, 0,
MOAL_MEM_FLAG_DIRTY | MOAL_MALLOC_BUFFER);
if (pmbuf_aggr) {
pmbuf_curr = pusb_tx_aggr->pmbuf_aggr;
pmbuf_aggr->bss_index = pmbuf_curr->bss_index;
@ -1305,7 +1311,8 @@ static mlan_status wlan_usb_host_to_card(pmlan_private pmpriv, t_u8 type,
return MLAN_STATUS_FAILURE;
}
if (type == MLAN_TYPE_CMD
#if (defined(USB9098) || defined(USB9097) || defined(USBIW624))
#if defined(USB9098) || defined(USB9097) || defined(USBIW624) || \
defined(USB8997) || defined(USB8978)
|| type == MLAN_TYPE_VDLL
#endif
) {

View file

@ -1838,8 +1838,6 @@ t_void wlan_wmm_init(pmlan_adapter pmadapter)
priv->aggr_prio_tbl[i].ampdu_ap =
priv->aggr_prio_tbl[i].ampdu_user =
tos_to_tid_inv[i];
priv->ibss_ampdu[i] =
priv->aggr_prio_tbl[i].ampdu_user;
priv->wmm.pkts_queued[i] = 0;
priv->wmm.pkts_paused[i] = 0;
priv->wmm.tid_tbl_ptr[i].ra_list_curr = MNULL;
@ -1851,13 +1849,10 @@ t_void wlan_wmm_init(pmlan_adapter pmadapter)
priv->aggr_prio_tbl[6].ampdu_ap =
priv->aggr_prio_tbl[6].ampdu_user =
BA_STREAM_NOT_ALLOWED;
priv->ibss_ampdu[6] = BA_STREAM_NOT_ALLOWED;
priv->aggr_prio_tbl[7].ampdu_ap =
priv->aggr_prio_tbl[7].ampdu_user =
BA_STREAM_NOT_ALLOWED;
priv->ibss_ampdu[7] = BA_STREAM_NOT_ALLOWED;
priv->add_ba_param.timeout =
MLAN_DEFAULT_BLOCK_ACK_TIMEOUT;
#ifdef STA_SUPPORT

View file

@ -23,9 +23,6 @@
#ifndef _MLAN_DECL_H_
#define _MLAN_DECL_H_
/** MLAN release version */
#define MLAN_RELEASE_VERSION "423.p6"
/** Re-define generic data types for MLAN/MOAL */
/** Signed char (1-byte) */
typedef signed char t_s8, *t_ps8;
@ -661,6 +658,8 @@ typedef enum {
#define MLAN_MEM_DMA MBIT(0)
/** Memory allocation flag: ATOMIC */
#define MLAN_MEM_FLAG_ATOMIC MBIT(1)
/** Memory allocation flag: DIRTY - do not memset to 0 buffer */
#define MLAN_MEM_FLAG_DIRTY MBIT(2)
/** Default memory allocation flag */
#define MLAN_MEM_DEF 0
@ -781,8 +780,6 @@ typedef enum _mlan_data_frame_type {
typedef enum _mlan_event_id {
/* Event generated by firmware (MSB=0) */
MLAN_EVENT_ID_FW_UNKNOWN = 0x00000001,
MLAN_EVENT_ID_FW_ADHOC_LINK_SENSED = 0x00000002,
MLAN_EVENT_ID_FW_ADHOC_LINK_LOST = 0x00000003,
MLAN_EVENT_ID_FW_DISCONNECTED = 0x00000004,
MLAN_EVENT_ID_FW_MIC_ERR_UNI = 0x00000005,
MLAN_EVENT_ID_FW_MIC_ERR_MUL = 0x00000006,
@ -810,8 +807,6 @@ typedef enum _mlan_event_id {
MLAN_EVENT_ID_FW_RADAR_DETECTED = 0x00000024,
MLAN_EVENT_ID_FW_CHANNEL_REPORT_RDY = 0x00000025,
MLAN_EVENT_ID_FW_BW_CHANGED = 0x00000026,
MLAN_EVENT_ID_FW_IBSS_CONNECT = 0x00000028,
MLAN_EVENT_ID_FW_IBSS_DISCONNECT = 0x00000029,
MLAN_EVENT_ID_FW_REMAIN_ON_CHAN_EXPIRED = 0x0000002B,
#ifdef UAP_SUPPORT
@ -1013,14 +1008,14 @@ typedef enum _dfs_moe_t {
/** Band_Config_t */
typedef MLAN_PACK_START struct _Band_Config_t {
#ifdef BIG_ENDIAN_SUPPORT
/** Channel Width - (00)=20MHz, (10)=40MHz, (11)=80MHz */
t_u8 chanWidth : 2;
/** Band Info - (00)=2.4GHz, (01)=5GHz, (10)=6GHz */
t_u8 chanBand : 2;
/** Channel Selection Mode - (00)=manual, (01)=ACS, (02)=user*/
t_u8 scanMode : 2;
/** Secondary Channel Offset - (00)=None, (01)=Above, (11)=Below */
t_u8 chan2Offset : 2;
/** Channel Width - (00)=20MHz, (10)=40MHz, (11)=80MHz */
t_u8 chanWidth : 2;
/** Band Info - (00)=2.4GHz, (01)=5GHz, (10)=6GHz */
t_u8 chanBand : 2;
#else
/** Band Info - (00)=2.4GHz, (01)=5GHz, (10)=6GHz */
t_u8 chanBand : 2;
@ -1856,7 +1851,6 @@ typedef enum {
typedef enum {
MLAN_INTERFACE_STA = 0,
MLAN_INTERFACE_SOFTAP = 1,
MLAN_INTERFACE_IBSS = 2,
MLAN_INTERFACE_P2P_CLIENT = 3,
MLAN_INTERFACE_P2P_GO = 4,
MLAN_INTERFACE_NAN = 5,
@ -2722,6 +2716,10 @@ typedef struct _mlan_device {
t_u8 second_mac;
/** napi */
t_u8 napi;
/** antcfg */
t_u32 antcfg;
/** dmcs */
t_u8 dmcs;
} mlan_device, *pmlan_device;
/** MLAN API function prototype */

View file

@ -80,7 +80,6 @@ typedef MLAN_PACK_START enum _IEEEtypes_ElementId_e {
DS_PARAM_SET = 3,
CF_PARAM_SET = 4,
IBSS_PARAM_SET = 6,
COUNTRY_INFO = 7,
POWER_CONSTRAINT = 32,
POWER_CAPABILITY = 33,
@ -89,7 +88,6 @@ typedef MLAN_PACK_START enum _IEEEtypes_ElementId_e {
CHANNEL_SWITCH_ANN = 37,
EXTEND_CHANNEL_SWITCH_ANN = 60,
QUIET = 40,
IBSS_DFS = 41,
MEASUREMENT_REQUEST = 38,
MEASUREMENT_REPORT = 39,
SUPPORTED_CHANNELS = 36,
@ -391,15 +389,14 @@ typedef MLAN_PACK_START struct _IEEEtypes_CapInfo_t {
t_u8 privacy : 1;
t_u8 cf_poll_rqst : 1;
t_u8 cf_pollable : 1;
t_u8 ibss : 1;
t_u8 rsrvd4 : 1;
t_u8 ess : 1;
} MLAN_PACK_END IEEEtypes_CapInfo_t, *pIEEEtypes_CapInfo_t;
#else
typedef MLAN_PACK_START struct _IEEEtypes_CapInfo_t {
/** Capability Bit Map : ESS */
t_u8 ess : 1;
/** Capability Bit Map : IBSS */
t_u8 ibss : 1;
t_u8 rsrvd4 : 1;
/** Capability Bit Map : CF pollable */
t_u8 cf_pollable : 1;
/** Capability Bit Map : CF poll request */
@ -455,22 +452,10 @@ typedef MLAN_PACK_START struct _IEEEtypes_CfParamSet_t {
t_u16 cfp_duration_remaining;
} MLAN_PACK_END IEEEtypes_CfParamSet_t, *pIEEEtypes_CfParamSet_t;
/** IEEEtypes_IbssParamSet_t */
typedef MLAN_PACK_START struct _IEEEtypes_IbssParamSet_t {
/** Element ID */
t_u8 element_id;
/** Length */
t_u8 len;
/** ATIM window value in milliseconds */
t_u16 atim_window;
} MLAN_PACK_END IEEEtypes_IbssParamSet_t, *pIEEEtypes_IbssParamSet_t;
/** IEEEtypes_SsParamSet_t */
typedef MLAN_PACK_START union _IEEEtypes_SsParamSet_t {
/** SS parameter : CF parameter set */
IEEEtypes_CfParamSet_t cf_param_set;
/** SS parameter : IBSS parameter set */
IEEEtypes_IbssParamSet_t ibss_param_set;
} MLAN_PACK_END IEEEtypes_SsParamSet_t, *pIEEEtypes_SsParamSet_t;
/** IEEEtypes_FhParamSet_t */
@ -1492,8 +1477,6 @@ typedef MLAN_PACK_START struct {
/** Maximum number of subbands in the IEEEtypes_SupportedChannels_t structure */
#define WLAN_11H_MAX_SUBBANDS 6
/** Maximum number of DFS channels configured in IEEEtypes_IBSS_DFS_t */
#define WLAN_11H_MAX_IBSS_DFS_CHANNELS 25
/** IEEE Power Constraint element (7.3.2.15) */
typedef MLAN_PACK_START struct {
@ -1642,24 +1625,6 @@ typedef MLAN_PACK_START struct {
} MLAN_PACK_END IEEEtypes_ChannelMap_t;
/* IEEE IBSS DFS Element (7.3.2.24) */
/**
* IBSS DFS element included in ad hoc beacons and probe responses.
* Provides information regarding the IBSS DFS Owner as well as the
* originating STAs supported channels and basic measurement results.
*/
typedef MLAN_PACK_START struct {
t_u8 element_id; /**< IEEE Element ID = 41 */
t_u8 len; /**< Element length after id and len */
t_u8 dfs_owner[MLAN_MAC_ADDR_LENGTH]; /**< DFS Owner STA Address */
t_u8 dfs_recovery_interval; /**< DFS Recovery time in TBTTs */
/** Variable length map field, one Map entry for each supported channel
*/
IEEEtypes_ChannelMap_t channel_map[WLAN_11H_MAX_IBSS_DFS_CHANNELS];
} MLAN_PACK_END IEEEtypes_IBSS_DFS_t;
/* 802.11h BSS information kept for each BSSID received in scan results */
/**
* IEEE BSS information needed from scan results for later processing in
@ -1676,7 +1641,6 @@ typedef struct {
IEEEtypes_ChanSwitchAnn_t chan_switch_ann; /**< Channel Switch
Announcement IE */
IEEEtypes_Quiet_t quiet; /**< Quiet IE */
IEEEtypes_IBSS_DFS_t ibss_dfs; /**< IBSS DFS Element IE */
} wlan_11h_bss_info_t;

View file

@ -205,7 +205,6 @@ enum _mlan_ioctl_req_id {
MLAN_OID_11N_CFG_REJECT_ADDBA_REQ = 0x000C000D,
MLAN_OID_11N_CFG_COEX_RX_WINSIZE = 0x000C000E,
MLAN_OID_11N_CFG_TX_AGGR_CTRL = 0x000C000F,
MLAN_OID_11N_CFG_IBSS_AMPDU_PARAM = 0x000C0010,
MLAN_OID_11N_CFG_MIN_BA_THRESHOLD = 0x000C0011,
/* 802.11d Configuration Group */
@ -381,6 +380,7 @@ enum _mlan_ioctl_req_id {
MLAN_OID_MISC_EDMAC_CONFIG = 0x00200093,
MLAN_OID_MISC_GPIO_CFG = 0x00200094,
MLAN_OID_MISC_REGION_POWER_CFG = 0x00200095,
MLAN_OID_MISC_OTP_MAC_RD_WR = 0x00200097,
};
/** Sub command size */
@ -403,9 +403,8 @@ enum _mlan_act_generic { MLAN_ACT_DISABLE = 0, MLAN_ACT_ENABLE = 1 };
/** Enumeration for scan mode */
enum _mlan_scan_mode {
MLAN_SCAN_MODE_UNCHANGED = 0,
MLAN_SCAN_MODE_BSS,
MLAN_SCAN_MODE_IBSS,
MLAN_SCAN_MODE_ANY
MLAN_SCAN_MODE_BSS = 1,
MLAN_SCAN_MODE_ANY = 3
};
/** Enumeration for scan type */
@ -633,8 +632,8 @@ typedef struct _mlan_ds_scan {
/** Enumeration for BSS mode */
enum _mlan_bss_mode {
MLAN_BSS_MODE_INFRA = 1,
MLAN_BSS_MODE_IBSS,
MLAN_BSS_MODE_AUTO
MLAN_BSS_MODE_IBSS = 2,
MLAN_BSS_MODE_AUTO = 3
};
/** Maximum key length */
@ -1369,6 +1368,7 @@ typedef struct _mlan_ds_bss {
/** STA info for MLAN_OID_UAP_ADD_STATION */
mlan_ds_sta_info sta_info;
#endif
} param;
} mlan_ds_bss, *pmlan_ds_bss;
@ -1425,10 +1425,6 @@ enum _mlan_band_def {
typedef struct _mlan_ds_band_cfg {
/** Infra band */
t_u32 config_bands;
/** Ad-hoc start band */
t_u32 adhoc_start_band;
/** Ad-hoc start channel */
t_u32 adhoc_channel;
/** fw supported band */
t_u32 fw_bands;
} mlan_ds_band_cfg;
@ -1560,13 +1556,6 @@ typedef struct _mlan_ds_snmp_mib {
/** Status Information Group */
/*-----------------------------------------------------------------*/
/** Enumeration for ad-hoc status */
enum _mlan_adhoc_status {
ADHOC_IDLE,
ADHOC_STARTED,
ADHOC_JOINED,
ADHOC_COALESCED,
ADHOC_STARTING
};
typedef struct _mlan_ds_get_stats_org {
/** Statistics counter */
@ -2205,8 +2194,6 @@ typedef struct _mlan_bss_info {
t_s32 max_power_level;
/** Min power level in dBm */
t_s32 min_power_level;
/** Adhoc state */
t_u32 adhoc_state;
/** NF of last beacon */
t_s32 bcn_nf_last;
/** wep status */
@ -3844,14 +3831,6 @@ typedef struct _mlan_ds_reject_addba_req {
t_u32 conditions;
} mlan_ds_reject_addba_req, *pmlan_ds_reject_addba_req;
/** Type definition of mlan_ds_ibss_ampdu_param */
typedef struct _mlan_ds_ibss_ampdu_param {
/** ampdu priority table */
t_u8 ampdu[MAX_NUM_TID];
/** rx amdpdu setting */
t_u8 addba_reject[MAX_NUM_TID];
} mlan_ds_ibss_ampdu_param, *pmlan_ds_ibss_ampdu_param;
/** Type definition of mlan_ds_11n_cfg for MLAN_IOCTL_11N_CFG */
typedef struct _mlan_ds_11n_cfg {
/** Sub-command */
@ -3888,8 +3867,6 @@ typedef struct _mlan_ds_11n_cfg {
t_u32 coex_rx_winsize;
/** Control TX AMPDU configuration */
t_u32 txaggrctrl;
/** aggrprirotity table for MLAN_OID_11N_CFG_IBSS_AMPDU_PARAM */
mlan_ds_ibss_ampdu_param ibss_ampdu;
/** Minimum BA Threshold for MLAN_OID_11N_CFG_MIN_BA_THRESHOLD
*/
t_u8 min_ba_threshold;
@ -4034,6 +4011,7 @@ typedef struct _mlan_ds_11ax_cfg {
#define MRVL_DOT11AX_ENABLE_SR_TLV_ID (PROPRIETARY_TLV_BASE_ID + 322)
#define MRVL_DOT11AX_OBSS_PD_OFFSET_TLV_ID (PROPRIETARY_TLV_BASE_ID + 323)
#define NXP_6E_INBAND_FRAMES_TLV_ID (PROPRIETARY_TLV_BASE_ID + 345) // 0x0159
/** Type definition of mlan_11axcmdcfg_obss_pd_offset for MLAN_OID_11AX_CMD_CFG
*/
@ -5789,6 +5767,8 @@ typedef struct _mlan_ds_misc_chan_trpc_cfg {
#define MFG_CMD_RADIO_MODE_CFG 0x1211
#define MFG_CMD_CONFIG_MAC_HE_TB_TX 0x110A
#define MFG_CMD_CONFIG_TRIGGER_FRAME 0x110C
#define MFG_CMD_OTP_MAC_ADD 0x108C
/** MFG CMD generic cfg */
struct MLAN_PACK_START mfg_cmd_generic_cfg {
/** MFG command code */
@ -6083,6 +6063,19 @@ typedef MLAN_PACK_START struct _mfg_Cmd_IEEEtypes_CtlBasicTrigHdr_t {
mfg_cmd_IEEETypes_BasicHETrigUserInfo_t basic_trig_user_info;
} MLAN_PACK_END mfg_Cmd_IEEEtypes_CtlBasicTrigHdr_t;
typedef MLAN_PACK_START struct _mfg_cmd_otp_mac_addr_rd_wr_t {
/** MFG command code */
t_u32 mfg_cmd;
/** Action */
t_u16 action;
/** Device ID */
t_u16 device_id;
/** MFG Error code */
t_u32 error;
/** Destination MAC Address */
t_u8 mac_addr[MLAN_MAC_ADDR_LENGTH];
} MLAN_PACK_END mfg_cmd_otp_mac_addr_rd_wr_t;
typedef struct _mlan_ds_misc_chnrgpwr_cfg {
/** length */
t_u16 length;
@ -6108,13 +6101,15 @@ typedef struct _mlan_ds_mc_aggr_cfg {
* bit 0 MC aggregation
* bit 1 packet expiry
* bit 2 CTS2Self
* bit 3 CTS2Self duration offset*/
* bit 3 CTS2Self duration offset
* bit 6 UC non aggregation*/
t_u8 enable_bitmap;
/* 1 valid, 0 invalid
* bit 0 MC aggregation
* bit 1 packet expiry
* bit 2 CTS2Self
* bit 3 CTS2Self duration offset*/
* bit 3 CTS2Self duration offset
* bit 6 UC non aggregation*/
t_u8 mask_bitmap;
/** CTS2Self duration offset */
t_u16 cts2self_offset;
@ -6331,6 +6326,7 @@ typedef struct _mlan_ds_misc_cfg {
struct mfg_cmd_tx_frame2 mfg_tx_frame2;
struct mfg_Cmd_HE_TBTx_t mfg_he_power;
mfg_Cmd_IEEEtypes_CtlBasicTrigHdr_t mfg_tx_trigger_config;
mfg_cmd_otp_mac_addr_rd_wr_t mfg_otp_mac_addr_rd_wr;
mlan_ds_misc_arb_cfg arb_cfg;
mlan_ds_misc_cfp_tbl cfp;
t_u8 range_ext_mode;

View file

@ -3087,6 +3087,7 @@ int woal_cfg80211_mgmt_tx(struct wiphy *wiphy,
* remain_on_channel_cfg in order to receive action frame from peer
* device
*/
if (GET_BSS_ROLE(priv) == MLAN_BSS_ROLE_UAP) {
if (ieee80211_is_probe_resp(
((struct ieee80211_mgmt *)buf)->frame_control)) {

View file

@ -98,14 +98,6 @@ static t_u16 SupportedInfraBand[] = {
BAND_A | BAND_AN | BAND_AAC | BAND_AAX,
};
/** Bands supported in Ad-Hoc mode */
static t_u16 SupportedAdhocBand[] = {
BAND_B,
BAND_B | BAND_G,
BAND_G,
BAND_A,
};
/********************************************************
Global Variables
********************************************************/
@ -723,11 +715,9 @@ static int woal_setget_priv_bandcfg(moal_private *priv, t_u8 *respbuf,
{
int ret = 0;
unsigned int i;
int data[3];
int data[1];
int user_data_len = 0;
t_u32 infra_band = 0;
t_u32 adhoc_band = 0;
t_u32 adhoc_channel = 0;
mlan_ioctl_req *req = NULL;
mlan_ds_radio_cfg *radio_cfg = NULL;
mlan_ds_band_cfg *band_cfg = NULL;
@ -787,35 +777,9 @@ static int woal_setget_priv_bandcfg(moal_private *priv, t_u8 *respbuf,
goto error;
}
/* Set Adhoc band */
if (user_data_len >= 2) {
adhoc_band = data[1];
for (i = 0; i < (sizeof(SupportedAdhocBand) /
sizeof(SupportedAdhocBand[0]));
i++)
if (adhoc_band == SupportedAdhocBand[i])
break;
if (i == sizeof(SupportedAdhocBand)) {
ret = -EINVAL;
goto error;
}
}
/* Set Adhoc channel */
if (user_data_len >= 3) {
adhoc_channel = data[2];
if (adhoc_channel == 0) {
/* Check if specified adhoc channel is non-zero
*/
ret = -EINVAL;
goto error;
}
}
/* Set config_bands and adhoc_start_band values to MLAN */
req->action = MLAN_ACT_SET;
radio_cfg->param.band_cfg.config_bands = infra_band;
radio_cfg->param.band_cfg.adhoc_start_band = adhoc_band;
radio_cfg->param.band_cfg.adhoc_channel = adhoc_channel;
}
status = woal_request_ioctl(priv, req, MOAL_IOCTL_WAIT);
@ -5842,9 +5806,6 @@ static int woal_priv_set_bss_mode(moal_private *priv, t_u8 *respbuf,
case MW_MODE_INFRA:
bss->param.bss_mode = MLAN_BSS_MODE_INFRA;
break;
case MW_MODE_ADHOC:
bss->param.bss_mode = MLAN_BSS_MODE_IBSS;
break;
case MW_MODE_AUTO:
bss->param.bss_mode = MLAN_BSS_MODE_AUTO;
break;
@ -6984,8 +6945,12 @@ static int woal_priv_regrdwr(moal_private *priv, t_u8 *respbuf,
if (*(char *)(space_ind + 1) == '-') {
is_negative_val = MTRUE;
arguments[space_ind + 1 - arguments] = '\0';
strncat(arguments, space_ind + 2,
(strlen(respbuf) * sizeof(char)) - 1);
if (strlen(respbuf) > 1) {
strncat(arguments, space_ind + 2,
(strlen(respbuf) * sizeof(char)) - 1);
} else {
PRINTM(MERROR, "strlen(respbuf) is invalid\n");
}
}
}
parse_arguments(arguments, data, ARRAY_SIZE(data), &user_data_len);
@ -7230,20 +7195,16 @@ static int woal_priv_sdcmd52rw(moal_private *priv, t_u8 *respbuf,
if (!rw) {
#ifdef SDIO_MMC
sdio_claim_host(
((struct sdio_mmc_card *)priv->phandle->card)->func);
sdio_claim_host(((sdio_mmc_card *)priv->phandle->card)->func);
if (func)
data = sdio_readb(
((struct sdio_mmc_card *)priv->phandle->card)
->func,
((sdio_mmc_card *)priv->phandle->card)->func,
reg, &ret);
else
data = sdio_f0_readb(
((struct sdio_mmc_card *)priv->phandle->card)
->func,
((sdio_mmc_card *)priv->phandle->card)->func,
reg, &ret);
sdio_release_host(
((struct sdio_mmc_card *)priv->phandle->card)->func);
sdio_release_host(((sdio_mmc_card *)priv->phandle->card)->func);
if (ret) {
PRINTM(MERROR,
"sdio_readb: reading register 0x%X failed\n",
@ -7262,20 +7223,16 @@ static int woal_priv_sdcmd52rw(moal_private *priv, t_u8 *respbuf,
#endif /* SDIO_MMC */
} else {
#ifdef SDIO_MMC
sdio_claim_host(
((struct sdio_mmc_card *)priv->phandle->card)->func);
sdio_claim_host(((sdio_mmc_card *)priv->phandle->card)->func);
if (func)
sdio_writeb(
((struct sdio_mmc_card *)priv->phandle->card)
->func,
((sdio_mmc_card *)priv->phandle->card)->func,
data, reg, &ret);
else
sdio_f0_writeb(
((struct sdio_mmc_card *)priv->phandle->card)
->func,
((sdio_mmc_card *)priv->phandle->card)->func,
data, reg, &ret);
sdio_release_host(
((struct sdio_mmc_card *)priv->phandle->card)->func);
sdio_release_host(((sdio_mmc_card *)priv->phandle->card)->func);
if (ret) {
PRINTM(MERROR,
"sdio_writeb: writing register 0x%X failed\n",
@ -8149,35 +8106,29 @@ static int woal_priv_wmm_delts_req_ioctl(moal_private *priv, t_u8 *respbuf,
memset(&delts_ioctl, 0x00, sizeof(delts_ioctl));
if ((int)strlen(respbuf) > header_len) {
copy_len = MIN(strlen(data_ptr), sizeof(delts_ioctl));
moal_memcpy_ext(priv->phandle, (t_u8 *)&delts_ioctl, data_ptr,
copy_len, sizeof(delts_ioctl));
moal_memcpy_ext(priv->phandle, (t_u8 *)&delts_ioctl, data_ptr,
sizeof(delts_ioctl), sizeof(delts_ioctl));
cfg->param.delts.status_code = (t_u32)delts_ioctl.ieee_reason_code;
cfg->param.delts.ie_data_len = (t_u8)delts_ioctl.ie_data_len;
cfg->param.delts.status_code =
(t_u32)delts_ioctl.ieee_reason_code;
cfg->param.delts.ie_data_len = (t_u8)delts_ioctl.ie_data_len;
moal_memcpy_ext(priv->phandle, cfg->param.delts.ie_data,
delts_ioctl.ie_data, cfg->param.delts.ie_data_len,
MLAN_WMM_TSPEC_SIZE);
moal_memcpy_ext(priv->phandle, cfg->param.delts.ie_data,
delts_ioctl.ie_data,
cfg->param.delts.ie_data_len,
MLAN_WMM_TSPEC_SIZE);
status = woal_request_ioctl(priv, req, MOAL_IOCTL_WAIT);
if (status != MLAN_STATUS_SUCCESS) {
ret = -EFAULT;
goto done;
}
/* Return the firmware command result back to the application
* layer */
delts_ioctl.cmd_result = cfg->param.delts.result;
copy_len = sizeof(delts_ioctl);
moal_memcpy_ext(priv->phandle, respbuf, (t_u8 *)&delts_ioctl,
copy_len, respbuflen);
ret = copy_len;
status = woal_request_ioctl(priv, req, MOAL_IOCTL_WAIT);
if (status != MLAN_STATUS_SUCCESS) {
ret = -EFAULT;
goto done;
}
/* Return the firmware command result back to the application
* layer */
delts_ioctl.cmd_result = cfg->param.delts.result;
copy_len = sizeof(delts_ioctl);
moal_memcpy_ext(priv->phandle, respbuf, (t_u8 *)&delts_ioctl, copy_len,
respbuflen);
ret = copy_len;
done:
if (status != MLAN_STATUS_PENDING)
kfree(req);
@ -11036,6 +10987,49 @@ done:
LEAVE();
return ret;
}
/**
* @brief Turn on/off the sdio clock
*
* @param priv Pointer to moal_private structure
* @param respbuf Pointer to response buffer
* @param resplen Response buffer length
*
* @return Number of bytes written, negative for failure.
*/
static int woal_priv_sdio_buswidth_ioctl(moal_private *priv, t_u8 *respbuf,
t_u32 respbuflen)
{
int ret = 0;
int data = 0;
int user_data_len = 0, header_len = 0;
ENTER();
header_len = strlen(CMD_NXP) + strlen(PRIV_CMD_SDIO_BUSWIDTH);
if ((int)strlen(respbuf) == header_len) {
PRINTM(MERROR, "Don't support get operation\n");
ret = -EINVAL;
goto done;
} else {
/* SET operation */
parse_arguments(respbuf + header_len, &data, 1, &user_data_len);
if (user_data_len != 1) {
PRINTM(MERROR, "Invalid number of parameters\n");
ret = -EINVAL;
goto done;
}
}
if ((data != SDIO_BUS_WIDTH_1) && (data != SDIO_BUS_WIDTH_4)) {
ret = -EINVAL;
goto done;
}
ret = woal_sdio_set_buswidth(priv->phandle, data);
done:
LEAVE();
return ret;
}
#endif
#ifdef SDIO
@ -13199,6 +13193,12 @@ static int woal_priv_mc_aggr_cfg(moal_private *priv, t_u8 *respbuf,
else
priv->enable_mc_aggr = MFALSE;
}
if (mc_cfg->mask_bitmap & UC_NONAGGR_CTRL) {
if (mc_cfg->enable_bitmap & UC_NONAGGR_CTRL)
priv->enable_uc_nonaggr = MTRUE;
else
priv->enable_uc_nonaggr = MFALSE;
}
done:
if (status != MLAN_STATUS_PENDING)
kfree(ioctl_req);
@ -14263,18 +14263,15 @@ static int woal_priv_cmd53rdwr(moal_private *priv, t_u8 *respbuf,
reg, mode, blklen, blknum);
if (!rw) {
sdio_claim_host(
((struct sdio_mmc_card *)priv->phandle->card)->func);
if (sdio_readsb(
((struct sdio_mmc_card *)priv->phandle->card)->func,
respbuf, reg, total_len)) {
sdio_claim_host(((sdio_mmc_card *)priv->phandle->card)->func);
if (sdio_readsb(((sdio_mmc_card *)priv->phandle->card)->func,
respbuf, reg, total_len)) {
PRINTM(MERROR,
"sdio_readsb: reading memory 0x%x failed\n",
reg);
goto done;
}
sdio_release_host(
((struct sdio_mmc_card *)priv->phandle->card)->func);
sdio_release_host(((sdio_mmc_card *)priv->phandle->card)->func);
ret = total_len;
} else {
int pos = 0;
@ -14285,16 +14282,13 @@ static int woal_priv_cmd53rdwr(moal_private *priv, t_u8 *respbuf,
/* Copy/duplicate the pattern to data buffer */
for (pos = 0; pos < (int)total_len; pos++)
data[pos] = buf[11 + (pos % pattern_len)];
sdio_claim_host(
((struct sdio_mmc_card *)priv->phandle->card)->func);
if (sdio_writesb(
((struct sdio_mmc_card *)priv->phandle->card)->func,
reg, data, total_len))
sdio_claim_host(((sdio_mmc_card *)priv->phandle->card)->func);
if (sdio_writesb(((sdio_mmc_card *)priv->phandle->card)->func,
reg, data, total_len))
PRINTM(MERROR,
"sdio_writesb: writing memory 0x%x failed\n",
reg);
sdio_release_host(
((struct sdio_mmc_card *)priv->phandle->card)->func);
sdio_release_host(((sdio_mmc_card *)priv->phandle->card)->func);
}
done:
@ -14660,8 +14654,8 @@ static int woal_priv_gpiocfg(moal_private *priv, t_u8 *respbuf,
gpio_cfg = (mlan_ds_gpio_cfg_ops *)&misc->param.gpio_cfg_ops;
if (req->action == MLAN_ACT_GET) {
moal_memcpy_ext(priv->phandle, respbuf, gpio_cfg,
sizeof(gpio_cfg), respbuflen);
ret = sizeof(gpio_cfg);
sizeof(*gpio_cfg), respbuflen);
ret = sizeof(*gpio_cfg);
}
done:
@ -20542,6 +20536,13 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req)
len = woal_priv_sdio_clock_ioctl(priv, buf,
priv_cmd.total_len);
goto handled;
} else if (strnicmp(buf + strlen(CMD_NXP),
PRIV_CMD_SDIO_BUSWIDTH,
strlen(PRIV_CMD_SDIO_BUSWIDTH)) == 0) {
/* change sdio buswidth */
len = woal_priv_sdio_buswidth_ioctl(priv, buf,
priv_cmd.total_len);
goto handled;
} else if (strnicmp(buf + strlen(CMD_NXP), PRIV_CMD_MPA_CTRL,
strlen(PRIV_CMD_MPA_CTRL)) == 0) {
/* Set SDIO Multi-point aggregation

View file

@ -215,6 +215,7 @@ typedef struct _chan_stats {
#define PRIV_CMD_TX_BF_CAP "httxbfcap"
#ifdef SDIO
#define PRIV_CMD_SDIO_CLOCK "sdioclock"
#define PRIV_CMD_SDIO_BUSWIDTH "sdiobuswidth"
#endif
#ifdef SDIO
#define PRIV_CMD_MPA_CTRL "mpactrl"
@ -556,6 +557,7 @@ typedef struct woal_priv_addba {
#define ACTION_REMOVE 3
#define MC_AGGR_CTRL MBIT(0)
#define UC_NONAGGR_CTRL MBIT(6)
/* mcast_aggr_group */
typedef struct _mcast_aggr_group {
/** action */

View file

@ -66,6 +66,8 @@ static int beacon_hints;
#endif
static int cfg80211_drcs;
static int dmcs;
#if defined(STA_CFG80211) || defined(UAP_CFG80211)
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
static int host_mlme = 1;
@ -1330,8 +1332,21 @@ static mlan_status parse_cfg_read_block(t_u8 *data, t_u32 size,
moal_extflg_isset(handle, EXT_CFG80211_DRCS) ?
"on" :
"off");
} else if (strncmp(line, "drcs_chantime_mode",
strlen("drcs_chantime_mode")) == 0) {
} else if (strncmp(line, "dmcs", strlen("dmcs")) == 0) {
if (parse_line_read_int(line, &out_data) !=
MLAN_STATUS_SUCCESS)
goto err;
if (out_data)
moal_extflg_set(handle, EXT_DMCS);
else
moal_extflg_clear(handle, EXT_DMCS);
PRINTM(MMSG, "dmcs %s\n",
moal_extflg_isset(handle, EXT_DMCS) ? "on" :
"off");
}
else if (strncmp(line, "drcs_chantime_mode",
strlen("drcs_chantime_mode")) == 0) {
if (parse_line_read_int(line, &out_data) !=
MLAN_STATUS_SUCCESS)
goto err;
@ -1813,6 +1828,9 @@ static void woal_setup_module_param(moal_handle *handle, moal_mod_para *params)
#endif
if (cfg80211_drcs)
moal_extflg_set(handle, EXT_CFG80211_DRCS);
if (dmcs)
moal_extflg_set(handle, EXT_DMCS);
handle->params.drcs_chantime_mode = drcs_chantime_mode;
if (params)
handle->params.drcs_chantime_mode = params->drcs_chantime_mode;
@ -2185,6 +2203,11 @@ void woal_init_from_dev_tree(void)
PRINTM(MIOCTL, "cfg80211_drcs=0x%x\n", data);
cfg80211_drcs = data;
}
} else if (!strncmp(prop->name, "dmcs", strlen("dmcs"))) {
if (!of_property_read_u32(dt_node, prop->name, &data)) {
PRINTM(MIOCTL, "dmcs=0x%x\n", data);
dmcs = data;
}
}
#endif
#endif
@ -2894,6 +2917,9 @@ module_param(cfg80211_drcs, int, 0);
MODULE_PARM_DESC(cfg80211_drcs,
"1: Enable DRCS support; 0: Disable DRCS support");
module_param(dmcs, int, 0);
MODULE_PARM_DESC(dmcs, "1: Enable dynamic mapping; 0: Disable dynamic mapping");
module_param(roamoffload_in_hs, int, 0);
MODULE_PARM_DESC(
roamoffload_in_hs,

View file

@ -3,7 +3,7 @@
* @brief This file contains ioctl function to MLAN
*
*
* Copyright 2008-2022 NXP
* Copyright 2008-2023 NXP
*
* This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991
@ -4146,7 +4146,7 @@ int woal_enable_hs(moal_private *priv)
HS_ACTIVE_TIMEOUT);
#ifdef SDIO_MMC
if (IS_SD(handle->card_type)) {
sdio_claim_host(((struct sdio_mmc_card *)handle->card)->func);
sdio_claim_host(((sdio_mmc_card *)handle->card)->func);
}
#endif
@ -4177,7 +4177,7 @@ int woal_enable_hs(moal_private *priv)
#endif /* SDIO_SUSPEND_RESUME*/
#ifdef SDIO_MMC
if (IS_SD(handle->card_type)) {
sdio_release_host(((struct sdio_mmc_card *)handle->card)->func);
sdio_release_host(((sdio_mmc_card *)handle->card)->func);
}
#endif
if (hs_actived != MTRUE) {
@ -4500,11 +4500,12 @@ int woal_reg_rx_mgmt_ind(moal_private *priv, t_u16 action,
ret = woal_request_ioctl(priv, req, wait_option);
if (req->action == MLAN_ACT_GET)
if ((ret == MLAN_STATUS_SUCCESS) && (req->action == MLAN_ACT_GET)) {
moal_memcpy_ext(priv->phandle, pmgmt_subtype_mask,
&misc->param.mgmt_subtype_mask,
sizeof(misc->param.mgmt_subtype_mask),
sizeof(misc->param.mgmt_subtype_mask));
}
if (ret != MLAN_STATUS_PENDING)
kfree(req);
@ -5400,100 +5401,6 @@ done:
return ret;
}
/**
* @brief Change Adhoc Channel
*
* @param priv A pointer to moal_private structure
* @param channel The channel to be set.
* @param wait_option wait_option
*
* @return MLAN_STATUS_SUCCESS--success, MLAN_STATUS_FAILURE--fail
*/
mlan_status woal_change_adhoc_chan(moal_private *priv, int channel,
t_u8 wait_option)
{
mlan_status ret = MLAN_STATUS_SUCCESS;
mlan_bss_info bss_info;
mlan_ds_bss *bss = NULL;
mlan_ioctl_req *req = NULL;
ENTER();
memset(&bss_info, 0, sizeof(bss_info));
/* Get BSS information */
if (MLAN_STATUS_SUCCESS !=
woal_get_bss_info(priv, wait_option, &bss_info)) {
ret = MLAN_STATUS_FAILURE;
goto done;
}
if (bss_info.bss_mode == MLAN_BSS_MODE_INFRA) {
ret = MLAN_STATUS_SUCCESS;
goto done;
}
/* Allocate an IOCTL request buffer */
req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_bss));
if (req == NULL) {
ret = MLAN_STATUS_FAILURE;
goto done;
}
/* Get current channel */
bss = (mlan_ds_bss *)req->pbuf;
bss->sub_command = MLAN_OID_IBSS_CHANNEL;
req->req_id = MLAN_IOCTL_BSS;
req->action = MLAN_ACT_GET;
/* Send IOCTL request to MLAN */
ret = woal_request_ioctl(priv, req, wait_option);
if (ret != MLAN_STATUS_SUCCESS)
goto done;
if (bss->param.bss_chan.channel == (unsigned int)channel) {
ret = MLAN_STATUS_SUCCESS;
goto done;
}
PRINTM(MINFO, "Updating Channel from %d to %d\n",
(int)bss->param.bss_chan.channel, channel);
if (bss_info.media_connected != MTRUE) {
ret = MLAN_STATUS_SUCCESS;
goto done;
}
/* Do disonnect*/
bss->sub_command = MLAN_OID_BSS_STOP;
memset((t_u8 *)&bss->param.bssid, 0, ETH_ALEN);
/* Send IOCTL request to MLAN */
ret = woal_request_ioctl(priv, req, wait_option);
if (ret != MLAN_STATUS_SUCCESS)
goto done;
/* Do specific SSID scanning */
if (MLAN_STATUS_SUCCESS !=
woal_request_scan(priv, wait_option, &bss_info.ssid)) {
ret = MLAN_STATUS_FAILURE;
goto done;
}
/* Start/Join Adhoc network */
bss->sub_command = MLAN_OID_BSS_START;
memset(&bss->param.ssid_bssid, 0, sizeof(mlan_ssid_bssid));
moal_memcpy_ext(priv->phandle, &bss->param.ssid_bssid.ssid,
&bss_info.ssid, sizeof(mlan_802_11_ssid),
sizeof(mlan_802_11_ssid));
/* Send IOCTL request to MLAN */
ret = woal_request_ioctl(priv, req, wait_option);
done:
if (ret != MLAN_STATUS_PENDING)
kfree(req);
LEAVE();
return ret;
}
/**
* @brief Find the best network to associate
*
@ -7217,7 +7124,6 @@ mlan_status woal_set_band(moal_private *priv, char *pband)
req->action = MLAN_ACT_SET;
memset(&radio_cfg->param.band_cfg, 0, sizeof(mlan_ds_band_cfg));
radio_cfg->param.band_cfg.config_bands = band;
radio_cfg->param.band_cfg.adhoc_start_band = band;
ret = woal_request_ioctl(priv, req, MOAL_IOCTL_WAIT);
done:
@ -8239,6 +8145,7 @@ void woal_ioctl_get_misc_conf(moal_private *priv, mlan_ds_misc_cfg *info)
#define TRIGGER_FRAME_STR_LEN 250
#define HE_TB_TX_STR_LEN 30
#define MAX_RADIO_MODE 21
#define OTP_RDWR_LEN 50
/*
* @brief Parse mfg cmd radio mode string
@ -8942,6 +8849,68 @@ mlan_status woal_process_rf_test_mode(moal_handle *handle, t_u32 mode)
return ret;
}
/*
* @brief Parse mfg cmd otp rdwr
*
* @param handle A pointer to moal_handle structure
* @param s A pointer to user buffer
* @param len Length of user buffer
* @param d A pointer to mfg_cmd_generic_cfg struct
* @return 0 on success, -EINVAL otherwise
*/
static int parse_otp_mac_addr_rd_wr_string(const char *s, size_t len,
mfg_cmd_otp_mac_addr_rd_wr_t *d)
{
int ret = MLAN_STATUS_SUCCESS;
char *string = NULL;
char *tmp = NULL;
char *pos = NULL;
gfp_t flag;
int i = 0;
ENTER();
if (!s || !d) {
LEAVE();
return -EINVAL;
}
flag = (in_atomic() || irqs_disabled()) ? GFP_ATOMIC : GFP_KERNEL;
string = kzalloc(OTP_RDWR_LEN, flag);
if (string == NULL) {
LEAVE();
return -ENOMEM;
}
moal_memcpy_ext(NULL, string, s + strlen("otp_mac_addr_rd_wr="),
len - strlen("otp_mac_addr_rd_wr="), OTP_RDWR_LEN - 1);
tmp = string;
pos = strsep(&string, " \t");
d->action = (t_u16)woal_string_to_number(pos);
if (d->action == MFALSE)
goto done;
pos = strsep(&string, " \t");
if (pos) {
char *begin, *end;
begin = pos;
for (i = 0; i < MLAN_MAC_ADDR_LENGTH; i++) {
end = woal_strsep(&begin, ':', '/');
if (end)
d->mac_addr[i] = woal_atox(end);
}
}
if (d->action > 1)
ret = -EINVAL;
done:
kfree(tmp);
LEAVE();
return ret;
}
/**
* @brief This function sends RF test mode command in firmware
*
@ -9029,6 +8998,13 @@ mlan_status woal_process_rf_test_mode_cmd(moal_handle *handle, t_u32 cmd,
buffer, len, &misc->param.mfg_tx_trigger_config))
err = MTRUE;
break;
case MFG_CMD_OTP_MAC_ADD:
misc->sub_command = MLAN_OID_MISC_OTP_MAC_RD_WR;
if (parse_otp_mac_addr_rd_wr_string(
buffer, len, &misc->param.mfg_otp_mac_addr_rd_wr)) {
err = MTRUE;
}
break;
default:
err = MTRUE;
}
@ -9177,6 +9153,14 @@ mlan_status woal_process_rf_test_mode_cmd(moal_handle *handle, t_u32 cmd,
handle->rf_data->mfg_tx_trigger_config.basic_trig_user_info =
misc->param.mfg_tx_trigger_config.basic_trig_user_info;
break;
case MFG_CMD_OTP_MAC_ADD:
handle->rf_data->mfg_otp_mac_addr_rd_wr.action =
misc->param.mfg_otp_mac_addr_rd_wr.action;
for (i = 0; i < ETH_ALEN; i++) {
handle->rf_data->mfg_otp_mac_addr_rd_wr.mac_addr[i] =
misc->param.mfg_otp_mac_addr_rd_wr.mac_addr[i];
}
break;
}
done:
if (err || ret != MLAN_STATUS_PENDING)

View file

@ -121,6 +121,8 @@ static struct _card_info card_info_SD8801 = {
.func1_reg_end = 0x17,
.fw_reset_reg = 0x64,
.fw_reset_val = 0,
.fw_wakeup_reg = 0,
.fw_wakeup_val = 2,
.slew_rate_reg = 0x8000231C,
.slew_rate_bit_offset = 14,
#endif
@ -158,6 +160,8 @@ static struct _card_info card_info_SD8887 = {
.func1_reg_end = 0x17,
.fw_reset_reg = 0x0B6,
.fw_reset_val = 1,
.fw_wakeup_reg = 0,
.fw_wakeup_val = 2,
.slew_rate_reg = 0x80002328,
.slew_rate_bit_offset = 12,
#endif
@ -195,6 +199,8 @@ static struct _card_info card_info_SD8897 = {
.func1_reg_end = 0x0b,
.fw_reset_reg = 0x0E8,
.fw_reset_val = 1,
.fw_wakeup_reg = 0,
.fw_wakeup_val = 2,
.slew_rate_reg = 0x80002328,
.slew_rate_bit_offset = 12,
#endif
@ -276,6 +282,8 @@ static struct _card_info card_info_SD8977 = {
.func1_reg_end = 0x17,
.fw_reset_reg = 0x0EE,
.fw_reset_val = 0x99,
.fw_wakeup_reg = 0,
.fw_wakeup_val = 2,
.slew_rate_reg = 0x80002328,
.slew_rate_bit_offset = 12,
#endif
@ -316,6 +324,8 @@ static struct _card_info card_info_SD8978 = {
.func1_reg_end = 0x17,
.fw_reset_reg = 0x0EE,
.fw_reset_val = 0x99,
.fw_wakeup_reg = 0,
.fw_wakeup_val = 2,
.slew_rate_reg = 0x80002328,
.slew_rate_bit_offset = 12,
#endif
@ -356,6 +366,8 @@ static struct _card_info card_info_SD8997 = {
.func1_reg_end = 0x17,
.fw_reset_reg = 0x0EE,
.fw_reset_val = 0x99,
.fw_wakeup_reg = 0,
.fw_wakeup_val = 2,
.slew_rate_reg = 0x80002328,
.slew_rate_bit_offset = 12,
#endif
@ -397,6 +409,8 @@ static struct _card_info card_info_SD9098 = {
.func1_reg_end = 0x17,
.fw_reset_reg = 0x0EE,
.fw_reset_val = 0x99,
.fw_wakeup_reg = 0,
.fw_wakeup_val = 2,
.slew_rate_reg = 0x90002328,
.slew_rate_bit_offset = 12,
#endif
@ -438,6 +452,8 @@ static struct _card_info card_info_SD9097 = {
.func1_reg_end = 0x17,
.fw_reset_reg = 0x0EE,
.fw_reset_val = 0x99,
.fw_wakeup_reg = 0,
.fw_wakeup_val = 2,
.slew_rate_reg = 0x90002328,
.slew_rate_bit_offset = 12,
#endif
@ -479,6 +495,8 @@ static struct _card_info card_info_SDIW624 = {
.func1_reg_end = 0x17,
.fw_reset_reg = 0x0EE,
.fw_reset_val = 0x99,
.fw_wakeup_reg = 0,
.fw_wakeup_val = 2,
.slew_rate_reg = 0x90002328,
.slew_rate_bit_offset = 12,
#endif
@ -520,6 +538,8 @@ static struct _card_info card_info_SD9177 = {
.func1_reg_end = 0x17,
.fw_reset_reg = 0x0EE,
.fw_reset_val = 0x99,
.fw_wakeup_reg = 0,
.fw_wakeup_val = 2,
.slew_rate_reg = 0x90002328,
.slew_rate_bit_offset = 12,
#endif
@ -548,6 +568,7 @@ static struct _card_info card_info_PCIE8997 = {
.fw_name_wlan = PCIE8997_DEFAULT_WLAN_FW_NAME,
.fw_reset_reg = 0xcf4,
.fw_reset_val = 0x99,
.fw_wakeup_reg = 0x0c48,
.sniffer_support = 1,
.per_pkt_cfg_support = 1,
.host_mlme_required = 1,
@ -574,6 +595,7 @@ static struct _card_info card_info_PCIE9097 = {
.fw_name_wlan = PCIE9097_DEFAULT_WLAN_FW_NAME,
.fw_reset_reg = 0x1c94,
.fw_reset_val = 0x98,
.fw_wakeup_reg = 0x0,
.sniffer_support = 1,
.per_pkt_cfg_support = 1,
.host_mlme_required = 1,
@ -600,6 +622,7 @@ static struct _card_info card_info_PCIE9098 = {
.fw_name_wlan = PCIE9098_DEFAULT_WLAN_FW_NAME,
.fw_reset_reg = 0x1c94,
.fw_reset_val = 0x98,
.fw_wakeup_reg = 0x0,
.sniffer_support = 1,
.per_pkt_cfg_support = 1,
.host_mlme_required = 1,
@ -627,6 +650,7 @@ static struct _card_info card_info_PCIEIW624 = {
.fw_name_wlan = PCIEIW624_DEFAULT_WLAN_FW_NAME,
.fw_reset_reg = 0x1c94,
.fw_reset_val = 0x98,
.fw_wakeup_reg = 0x0,
.sniffer_support = 1,
.per_pkt_cfg_support = 1,
.host_mlme_required = 1,
@ -788,6 +812,8 @@ static struct _card_info card_info_SD8987 = {
.func1_reg_end = 0x17,
.fw_reset_reg = 0x0EE,
.fw_reset_val = 0x99,
.fw_wakeup_reg = 0,
.fw_wakeup_val = 2,
.slew_rate_reg = 0x80002328,
.slew_rate_bit_offset = 12,
#endif
@ -1026,9 +1052,37 @@ void woal_clean_up(moal_handle *handle)
#endif
}
}
woal_flush_evt_queue(handle);
return;
}
/**
* @brief This function send the auto recovery complete event to kernel
*
* @param handle Pointer to structure moal_handle
*
* @return N/A
*/
void woal_send_auto_recovery_complete_event(moal_handle *handle)
{
moal_private *priv;
priv = woal_get_priv(handle, MLAN_BSS_ROLE_ANY);
if (priv) {
woal_broadcast_event(priv, CUS_EVT_FW_RECOVER_SUCCESS,
strlen(CUS_EVT_FW_RECOVER_SUCCESS));
#ifdef STA_CFG80211
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
if (IS_STA_OR_UAP_CFG80211(handle->params.cfg80211_wext))
woal_cfg80211_vendor_event(
priv, event_fw_reset_success,
CUS_EVT_FW_RECOVER_SUCCESS,
strlen(CUS_EVT_FW_RECOVER_SUCCESS));
#endif
#endif
}
reset_handle = NULL;
}
/**
* @brief This function process FW hang
*
@ -1140,6 +1194,7 @@ static void woal_hang_work_queue(struct work_struct *work)
#endif
#endif
}
if (IS_SD(reset_handle->card_type)) {
PRINTM(MMSG, "WIFI auto_fw_reload: fw_reload=1\n");
ret = woal_request_fw_reload(
@ -1155,55 +1210,13 @@ static void woal_hang_work_queue(struct work_struct *work)
reset_handle,
FW_RELOAD_PCIE_INBAND_RESET);
} else {
reset_handle->init_wait_q_woken = MFALSE;
PRINTM(MMSG,
"WIFI auto_fw_reload: fw_reload=4\n");
ret = woal_request_fw_reload(
reset_handle, FW_RELOAD_PCIE_RESET);
if (!ret) {
/* Wait for FLR to complete */
wait_event_timeout(
reset_handle->init_wait_q,
reset_handle->init_wait_q_woken,
10 * HZ);
if (reset_handle->hardware_status !=
HardwareStatusReady)
ret = -1;
}
}
}
#endif
priv = woal_get_priv(reset_handle, MLAN_BSS_ROLE_ANY);
if (priv) {
if (ret) {
woal_broadcast_event(
priv, CUS_EVT_FW_RECOVER_FAIL,
strlen(CUS_EVT_FW_RECOVER_FAIL));
#ifdef STA_CFG80211
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
if (IS_STA_OR_UAP_CFG80211(cfg80211_wext))
woal_cfg80211_vendor_event(
priv, event_fw_reset_failure,
CUS_EVT_FW_RECOVER_FAIL,
strlen(CUS_EVT_FW_RECOVER_FAIL));
#endif
#endif
} else {
woal_broadcast_event(
priv, CUS_EVT_FW_RECOVER_SUCCESS,
strlen(CUS_EVT_FW_RECOVER_SUCCESS));
#ifdef STA_CFG80211
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
if (IS_STA_OR_UAP_CFG80211(cfg80211_wext))
woal_cfg80211_vendor_event(
priv, event_fw_reset_success,
CUS_EVT_FW_RECOVER_SUCCESS,
strlen(CUS_EVT_FW_RECOVER_SUCCESS));
#endif
#endif
}
}
reset_handle = NULL;
LEAVE();
return;
}
@ -1241,7 +1254,7 @@ static void woal_hang_work_queue(struct work_struct *work)
void woal_process_hang(moal_handle *handle)
{
ENTER();
if (!handle) {
if (!handle || handle->fw_reseting) {
LEAVE();
return;
}
@ -1800,9 +1813,6 @@ t_u32 woal_get_mode(moal_private *priv, t_u8 wait_option)
case MLAN_BSS_MODE_INFRA:
mode = MW_MODE_INFRA;
break;
case MLAN_BSS_MODE_IBSS:
mode = MW_MODE_ADHOC;
break;
default:
mode = MW_MODE_AUTO;
break;
@ -2294,9 +2304,9 @@ mlan_status woal_init_sw(moal_handle *handle)
device.gpio_pin = (t_u32)handle->params.gpiopin;
#ifdef SDIO_MMC
#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 36)
device.max_segs = ((struct sdio_mmc_card *)handle->card)
device.max_segs = ((sdio_mmc_card *)handle->card)
->func->card->host->max_segs;
device.max_seg_size = ((struct sdio_mmc_card *)handle->card)
device.max_seg_size = ((sdio_mmc_card *)handle->card)
->func->card->host->max_seg_size;
#endif
PRINTM(MMSG, "SDIO: max_segs=%d max_seg_size=%d\n",
@ -2354,6 +2364,8 @@ mlan_status woal_init_sw(moal_handle *handle)
device.dfs_offload = moal_extflg_isset(handle, EXT_DFS_OFFLOAD);
#endif
device.second_mac = handle->second_mac;
device.antcfg = handle->params.antcfg;
device.dmcs = moal_extflg_isset(handle, EXT_DMCS);
for (i = 0; i < handle->drv_mode.intf_num; i++) {
device.bss_attr[i].bss_type =
@ -3818,15 +3830,6 @@ static mlan_status woal_add_card_dpc(moal_handle *handle)
}
}
if (handle->params.antcfg) {
if (MLAN_STATUS_SUCCESS !=
woal_set_user_antcfg(handle, MOAL_IOCTL_WAIT)) {
PRINTM(MFATAL, "Set user antcfg data failed\n");
ret = MLAN_STATUS_FAILURE;
goto err;
}
}
#ifdef UAP_SUPPORT
if (handle->params.uap_oper_ctrl)
woal_set_uap_operation_ctrl(handle);
@ -3909,8 +3912,10 @@ static mlan_status woal_req_dpd_data(moal_handle *handle,
int status = MLAN_STATUS_SUCCESS;
ENTER();
if (dpd_data_cfg) {
/* dpd_data_cfg=none is treated as no dpd_data_cfg parameter
* present at module load time.
*/
if (dpd_data_cfg && strncmp(dpd_data_cfg, "none", strlen("none"))) {
PRINTM(MMSG, "Request firmware: %s\n", dpd_data_cfg);
if (req_fw_nowait) {
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 14, 0)
@ -4284,7 +4289,8 @@ static mlan_status woal_init_fw_dpc(moal_handle *handle)
wifi_status = WIFI_STATUS_INIT_FW_FAIL;
goto done;
} else if (ret == MLAN_STATUS_SUCCESS) {
wifi_status = WIFI_STATUS_OK;
if (!handle->fw_reseting)
wifi_status = WIFI_STATUS_OK;
handle->hardware_status = HardwareStatusReady;
goto done;
}
@ -4305,7 +4311,8 @@ static mlan_status woal_init_fw_dpc(moal_handle *handle)
ret = MLAN_STATUS_FAILURE;
goto done;
}
wifi_status = WIFI_STATUS_OK;
if (!handle->fw_reseting)
wifi_status = WIFI_STATUS_OK;
ret = MLAN_STATUS_SUCCESS;
done:
if (handle->dpd_data) {
@ -4594,11 +4601,19 @@ void woal_fill_mlan_buffer(moal_private *priv, mlan_buffer *pmbuf,
}
PRINTM(MDAT_D, "packet %04x prio=%#x\n", eth->h_proto, skb->priority);
if (priv->enable_mc_aggr && priv->num_mcast_addr) {
if ((priv->enable_mc_aggr || priv->enable_uc_nonaggr) &&
priv->num_mcast_addr) {
if (woal_find_mcast_node_tx(priv, skb)) {
mc_txcontrol *tx_ctrl =
(mc_txcontrol *)(skb->data + skb->len -
sizeof(mc_txcontrol));
/* Need to check whether flags field is set to 0xf9
* so that it can be treated as unicast frames
*/
if ((tx_ctrl->mc_pkt_flags & 0xf9) == 0xf9) {
PRINTM(MDAT_D, "Ucast frame seq_num:%d\n",
tx_ctrl->seq_num);
}
moal_memcpy_ext(priv->phandle,
(t_u8 *)&pmbuf->u.mc_tx_info,
(t_u8 *)tx_ctrl, sizeof(mc_txcontrol),
@ -5594,6 +5609,7 @@ void woal_remove_interface(moal_handle *handle, t_u8 bss_index)
unregister_netdev(dev);
woal_sched_timeout(100);
if (priv->mclist_workqueue) {
flush_workqueue(priv->mclist_workqueue);
destroy_workqueue(priv->mclist_workqueue);
@ -5696,70 +5712,6 @@ done:
return status;
}
/**
* @brief Configure antcfg
*
* @param handle A pointer to moal_handle
* @param wait_option Wait option
*
* @return MLAN_STATUS_SUCCESS/MLAN_STATUS_PENDING -- success,
* otherwise fail
*/
mlan_status woal_set_user_antcfg(moal_handle *handle, t_u8 wait_option)
{
moal_private *priv = NULL;
mlan_ioctl_req *req = NULL;
mlan_ds_radio_cfg *radio = NULL;
mlan_status status;
int antcfg;
ENTER();
priv = woal_get_priv(handle, MLAN_BSS_ROLE_ANY);
if (!priv) {
LEAVE();
return MLAN_STATUS_FAILURE;
}
antcfg = handle->params.antcfg;
/* Allocate an IOCTL request buffer */
req = (mlan_ioctl_req *)woal_alloc_mlan_ioctl_req(
sizeof(mlan_ds_radio_cfg));
if (req == NULL) {
status = MLAN_STATUS_FAILURE;
goto done;
}
/* Fill request buffer */
radio = (mlan_ds_radio_cfg *)req->pbuf;
radio->sub_command = MLAN_OID_ANT_CFG;
req->req_id = MLAN_IOCTL_RADIO_CFG;
req->action = MLAN_ACT_SET;
if (handle->feature_control & FEATURE_CTRL_STREAM_2X2) {
if (IS_CARD9098(handle->card_type) ||
IS_CARD9097(handle->card_type) ||
IS_CARDIW624(handle->card_type) ||
IS_CARDAW693(handle->card_type)) {
radio->param.ant_cfg.tx_antenna =
radio->param.ant_cfg.rx_antenna = antcfg;
#if defined(STA_CFG80211) || defined(UAP_CFG80211)
woal_cfg80211_notify_antcfg(priv, priv->phandle->wiphy,
radio);
#endif
} else {
radio->param.ant_cfg.tx_antenna =
(antcfg & 0x0030) >> 4;
radio->param.ant_cfg.rx_antenna = antcfg & 0x0003;
}
} else
radio->param.ant_cfg_1x1.antenna = antcfg;
/* Send IOCTL request to MLAN */
status = woal_request_ioctl(priv, req, wait_option);
done:
kfree(req);
LEAVE();
return status;
}
/**
* @brief Configure MLAN for low power mode
*
@ -5926,7 +5878,7 @@ int woal_hexval(char chr)
*
* @return N/A
*/
static void woal_flush_evt_queue(moal_handle *handle)
void woal_flush_evt_queue(moal_handle *handle)
{
struct woal_event *evt = NULL, *tmp_node;
unsigned long flags;
@ -6918,7 +6870,7 @@ u16 woal_select_queue(struct net_device *dev, struct sk_buff *skb
tid = skb->priority = woal_classify8021d(skb);
#endif
#define NXP_ETH_P_EAPOL 0x888E
#define NXP_ETH_P_WAPI 0x8884
#define NXP_ETH_P_WAPI 0x88B4
switch (skb->protocol) {
case htons(ETH_P_ARP):
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0)
@ -7071,16 +7023,16 @@ t_u8 woal_find_mcast_node_tx(moal_private *priv, struct sk_buff *skb)
ENTER();
moal_memcpy_ext(priv->phandle, ra, skb->data, MLAN_MAC_ADDR_LENGTH,
sizeof(ra));
if (ra[0] & 0x01) {
spin_lock_irqsave(&priv->mcast_lock, flags);
list_for_each_entry (node, &priv->mcast_list, link) {
if (!memcmp(node->mcast_addr, ra, ETH_ALEN)) {
ret = MTRUE;
break;
}
// if (ra[0] & 0x01){
spin_lock_irqsave(&priv->mcast_lock, flags);
list_for_each_entry (node, &priv->mcast_list, link) {
if (!memcmp(node->mcast_addr, ra, ETH_ALEN)) {
ret = MTRUE;
break;
}
spin_unlock_irqrestore(&priv->mcast_lock, flags);
}
spin_unlock_irqrestore(&priv->mcast_lock, flags);
// }
LEAVE();
return ret;
}
@ -9791,6 +9743,7 @@ t_void woal_store_firmware_dump(moal_handle *phandle, mlan_event *pmevent)
t_u16 type = 0;
t_u8 *pos;
moal_private *priv = NULL;
moal_handle *ref_handle = NULL;
ENTER();
@ -9832,6 +9785,16 @@ t_void woal_store_firmware_dump(moal_handle *phandle, mlan_event *pmevent)
}
phandle->fw_dump_len = 0;
PRINTM(MMSG, "==== Start Receive FW dump event ====\n");
ref_handle = (moal_handle *)phandle->pref_mac;
if (ref_handle) {
if (!ref_handle->drv_dump_buf ||
!ref_handle->drv_dump_len)
ref_handle->drv_dump_buf = woal_dump_drv_info(
ref_handle, &ref_handle->drv_dump_len);
}
if (!phandle->drv_dump_buf || !phandle->drv_dump_len)
phandle->drv_dump_buf = woal_dump_drv_info(
phandle, &phandle->drv_dump_len);
} else {
if (!phandle->fw_dump_buf || !phandle->fw_dump_len) {
PRINTM(MERROR,
@ -11196,7 +11159,8 @@ mlan_status woal_request_country_power_table(moal_private *priv, char *country,
memset(file_path, 0, sizeof(file_path));
/* file_path should be Null terminated */
if (fw_name) {
moal_memcpy(handle, file_path, fw_name, sizeof(file_path) - 1);
/* file_path[] needs to be reset to 0 before here */
strncpy(file_path, fw_name, sizeof(file_path) - 1);
last_slash = strrchr(file_path, '/');
if (last_slash)
memset(last_slash + 1, 0,
@ -11361,13 +11325,16 @@ t_void woal_scan_timeout_handler(struct work_struct *work)
if (IS_STA_CFG80211(handle->params.cfg80211_wext)) {
if (handle->scan_request && handle->fake_scan_complete) {
PRINTM(MMSG, "wlan: Send fake scan result\n");
PRINTM(MMSG,
"wlan: Send fake scan result for scan_request %p\n",
handle->scan_request);
if (priv)
woal_inform_bss_from_scan_result(priv, NULL,
MOAL_NO_WAIT);
spin_lock_irqsave(&handle->scan_req_lock, flags);
woal_cfg80211_scan_done(handle->scan_request, MFALSE);
handle->scan_request = NULL;
handle->fake_scan_complete = MFALSE;
spin_unlock_irqrestore(&handle->scan_req_lock, flags);
} else if (handle->scan_request) {
PRINTM(MMSG, "wlan: scan timeout!\n");
@ -12124,7 +12091,6 @@ moal_handle *woal_add_card(void *card, struct device *dev, moal_if_ops *if_ops,
m_handle[index - 1]->pref_mac = (void *)handle;
}
}
/* Init module parameters */
if (woal_init_module_param(handle)) {
PRINTM(MERROR, "Fail to load module parameter file\n");
@ -12870,9 +12836,7 @@ exit_sem_err:
}
#endif
#define FW_POLL_TRIES 100
#ifdef SDIO
/**
* @brief This function reload fw
*
@ -12883,62 +12847,15 @@ exit_sem_err:
*/
static int woal_reset_and_reload_fw(moal_handle *handle, t_u8 mode)
{
int ret = 0, tries = 0;
t_u32 value = 1;
t_u32 reset_reg = handle->card_info->fw_reset_reg;
t_u8 reset_val = handle->card_info->fw_reset_val;
int ret = 0;
ENTER();
#ifdef SDIO_MMC
if (mode == FW_RELOAD_SDIO_HW_RESET) {
PRINTM(MCMND, "woal_sdio_reset_fw...\n");
woal_sdio_reset_hw(handle);
goto reload_fw;
}
#endif
mlan_pm_wakeup_card(handle->pmlan_adapter, MTRUE);
/** wait SOC fully wake up */
for (tries = 0; tries < FW_POLL_TRIES; ++tries) {
ret = handle->ops.write_reg(handle, reset_reg, 0xba);
if (ret == MLAN_STATUS_SUCCESS) {
handle->ops.read_reg(handle, reset_reg, &value);
if (value == 0xba) {
PRINTM(MMSG, "FW wake up\n");
break;
}
}
udelay(1000);
}
/* Write register to notify FW */
if (handle->ops.write_reg(handle, reset_reg, reset_val) !=
MLAN_STATUS_SUCCESS) {
PRINTM(MERROR, "Failed to write register.\n");
ret = -EFAULT;
goto done;
}
#if defined(SD9098) || defined(SD9097) || defined(SDIW624) || defined(SD9177)
if (IS_SD9098(handle->card_type) || IS_SD9097(handle->card_type) ||
IS_SDIW624(handle->card_type) || IS_SD9177(handle->card_type) ||
IS_SDAW693(handle->card_type))
handle->ops.write_reg(handle, 0x00, 0x10);
#endif
/* Poll register around 100 ms */
for (tries = 0; tries < FW_POLL_TRIES; ++tries) {
handle->ops.read_reg(handle, reset_reg, &value);
if (value == 0)
/* FW is ready */
break;
udelay(1000);
}
if (value) {
PRINTM(MERROR, "Failed to poll FW reset register %X=0x%x\n",
reset_reg, value);
ret = -EFAULT;
goto done;
}
mlan_pm_wakeup_card(handle->pmlan_adapter, MFALSE);
reload_fw:
/* Download FW */
ret = woal_request_fw(handle);
if (ret) {
@ -12952,72 +12869,6 @@ done:
}
#endif
#ifdef PCIE
/**
* @brief This function reload fw for pcie
*
* @param handle A pointer to moal_handle structure
*
* @return 0--success, otherwise failure
*/
static int woal_pcie_reset_and_reload_fw(moal_handle *handle)
{
int ret = 0, tries = 0;
t_u32 value = 1;
t_u32 reset_reg = handle->card_info->fw_reset_reg;
t_u8 reset_val = handle->card_info->fw_reset_val;
ENTER();
#if defined(PCIE8997) || defined(PCIE9098) || defined(PCIE9097) || \
defined(PCIEIW62X)
if (!IS_PCIE9098(handle->card_type) &&
!IS_PCIEIW624(handle->card_type) &&
!IS_PCIEAW693(handle->card_type) &&
!IS_PCIE9097(handle->card_type) &&
!IS_PCIE8997(handle->card_type)) {
PRINTM(MERROR, "HW don't support PCIE in-band reset\n");
return -EFAULT;
}
#endif
mlan_pm_wakeup_card(handle->pmlan_adapter, MTRUE);
/* Write register to notify FW */
if (handle->ops.write_reg(handle, reset_reg, reset_val) !=
MLAN_STATUS_SUCCESS) {
PRINTM(MERROR, "Failed to write reregister.\n");
ret = -EFAULT;
goto done;
}
/* Poll register around 100 ms */
for (tries = 0; tries < FW_POLL_TRIES; ++tries) {
handle->ops.read_reg(handle, reset_reg, &value);
if (value == 0)
/* FW is ready */
break;
udelay(1000);
}
if (value) {
PRINTM(MERROR, "Failed to poll FW reset register %X=0x%x\n",
reset_reg, value);
ret = -EFAULT;
goto done;
}
mlan_pm_wakeup_card(handle->pmlan_adapter, MFALSE);
/* Download FW */
ret = woal_request_fw(handle);
if (ret) {
ret = -EFAULT;
goto done;
}
PRINTM(MMSG, "PCIE FW Reload successfully.");
done:
LEAVE();
return ret;
}
#endif
/**
* @brief This function reload fw
*
@ -13317,6 +13168,19 @@ int woal_request_fw_reload(moal_handle *phandle, t_u8 mode)
}
LEAVE();
return ret;
} else if (mode == FW_RELOAD_PCIE_INBAND_RESET) {
if (handle->ops.card_reset)
handle->ops.card_reset(handle);
LEAVE();
return ret;
}
#endif
#ifdef SDIO
if (mode == FW_RELOAD_SDIO_INBAND_RESET) {
if (handle->ops.card_reset)
handle->ops.card_reset(handle);
LEAVE();
return ret;
}
#endif
@ -13354,8 +13218,7 @@ int woal_request_fw_reload(moal_handle *phandle, t_u8 mode)
}
}
#ifdef SDIO
else if ((mode == FW_RELOAD_SDIO_INBAND_RESET ||
mode == FW_RELOAD_SDIO_HW_RESET) &&
else if ((mode == FW_RELOAD_SDIO_HW_RESET) &&
IS_SD(handle->card_type)) {
ret = woal_reset_and_reload_fw(handle, mode);
if (ret) {
@ -13370,23 +13233,6 @@ int woal_request_fw_reload(moal_handle *phandle, t_u8 mode)
}
}
}
#endif
#ifdef PCIE
else if (mode == FW_RELOAD_PCIE_INBAND_RESET &&
IS_PCIE(handle->card_type)) {
ret = woal_pcie_reset_and_reload_fw(handle);
if (ret) {
PRINTM(MERROR, "woal_pcie_reset_and_reload_fw fail\n");
goto done;
}
if (ref_handle) {
ret = woal_reload_fw(ref_handle);
if (ret) {
PRINTM(MERROR, "woal_reload_fw fail\n");
goto done;
}
}
}
#endif
else
ret = -EFAULT;
@ -13593,8 +13439,7 @@ static void woal_cleanup_module(void)
#ifdef MMC_PM_KEEP_POWER
if (handle->is_suspended == MTRUE) {
woal_sdio_resume(
&(((struct sdio_mmc_card *)handle->card)->func)
->dev);
&(((sdio_mmc_card *)handle->card)->func)->dev);
}
#endif /* MMC_PM_KEEP_POWER */
#endif /* SDIO_SUSPEND_RESUME */

View file

@ -164,6 +164,7 @@ Change log:
#define CFG80211_VERSION_CODE MAX(LINUX_VERSION_CODE, COMPAT_VERSION_CODE)
#define IMX_ANDROID_13 0
#define IMX_ANDROID_14 0
#define IMX_ANDROID_12_BACKPORT 0
#if defined(IMX_SUPPORT)
@ -173,6 +174,10 @@ Change log:
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 15, 52)
#undef IMX_ANDROID_13
#define IMX_ANDROID_13 1
#ifdef ANDROID_14_SUPPORT
#undef IMX_ANDROID_14
#define IMX_ANDROID_14 1
#endif
#endif
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 15, 41)
#undef IMX_ANDROID_12_BACKPORT
@ -809,10 +814,6 @@ out:
/** Custom event : OBSS scan parameter */
#define CUS_EVT_OBSS_SCAN_PARAM "EVENT=OBSS_SCAN_PARAM"
/** Custom event : AdHoc link sensed */
#define CUS_EVT_ADHOC_LINK_SENSED "EVENT=ADHOC_LINK_SENSED"
/** Custom event : AdHoc link lost */
#define CUS_EVT_ADHOC_LINK_LOST "EVENT=ADHOC_LINK_LOST"
/** Custom event : MIC failure, unicast */
#define CUS_EVT_MLME_MIC_ERR_UNI "MLME-MICHAELMICFAILURE.indication unicast"
/** Custom event : MIC failure, multicast */
@ -901,11 +902,6 @@ mlan_status woal_do_dfs_cac(moal_private *priv,
/** Custom indiciation message sent to the application layer for WMM changes */
#define WMM_CONFIG_CHANGE_INDICATION "WMM_CONFIG_CHANGE.indication"
/** Custom event : IBSS STA connect attempt */
#define CUS_EVT_IBSS_CONNECT_ATTEMPT "EVENT=IBSS_CONNECT_ATTEMPT_"
/** Custom event : IBSS STA dis-connect attempt */
#define CUS_EVT_IBSS_DISCONNECT_ATTEMPT "EVENT=IBSS_DISCONNECT_ATTEMPT_"
#define CUS_EVT_FW_DUMP_DONE "EVENT=FW_DUMP_DONE"
#ifdef UAP_SUPPORT
@ -1385,6 +1381,8 @@ struct rf_test_mode_data {
t_u8 bssid[ETH_ALEN];
/* Trigger frame config values */
mfg_Cmd_IEEEtypes_CtlBasicTrigHdr_t mfg_tx_trigger_config;
/* OTP frame data */
mfg_cmd_otp_mac_addr_rd_wr_t mfg_otp_mac_addr_rd_wr;
};
/** Number of samples in histogram (/proc/mwlan/adapterX/mlan0/histogram).*/
@ -1808,6 +1806,8 @@ struct _moal_private {
t_u32 num_mcast_addr;
/** enable mc_aggr */
t_u8 enable_mc_aggr;
/** enable uc_nonaggr */
t_u8 enable_uc_nonaggr;
/** tcp list */
struct list_head tdls_list;
/** tdls spin lock */
@ -1935,6 +1935,8 @@ typedef struct _card_info {
#if defined(SDIO) || defined(PCIE)
t_u32 fw_reset_reg;
t_u8 fw_reset_val;
t_u32 fw_wakeup_reg;
t_u8 fw_wakeup_val;
#endif
t_u8 sniffer_support;
t_u8 per_pkt_cfg_support;
@ -2347,6 +2349,7 @@ typedef struct _moal_if_ops {
mlan_status (*get_fw_name)(moal_handle *handle);
void (*dump_fw_info)(moal_handle *handle);
int (*dump_reg_info)(moal_handle *handle, t_u8 *buf);
void (*card_reset)(moal_handle *handle);
void (*reg_dbg)(moal_handle *handle);
t_u8 (*is_second_mac)(moal_handle *handle);
} moal_if_ops;
@ -2399,6 +2402,7 @@ enum ext_mod_params {
EXT_TX_SKB_CLONE,
EXT_PMQOS,
EXT_CHAN_TRACK,
EXT_DMCS,
EXT_MAX_PARAM,
};
@ -2637,6 +2641,7 @@ struct _moal_handle {
/** STATUS variables */
MOAL_HARDWARE_STATUS hardware_status;
BOOLEAN fw_reload;
BOOLEAN fw_reseting;
/** POWER MANAGEMENT AND PnP SUPPORT */
BOOLEAN surprise_removed;
/** Firmware release number */
@ -3671,6 +3676,7 @@ mlan_status woal_set_rgpower_table(moal_handle *handle);
void woal_terminate_workqueue(moal_handle *handle);
void woal_flush_workqueue(moal_handle *handle);
void woal_queue_rx_task(moal_handle *handle);
void woal_flush_evt_queue(moal_handle *handle);
/** initializes firmware */
mlan_status woal_init_fw(moal_handle *handle);
/** frees the structure of moal_handle */
@ -3940,9 +3946,6 @@ mlan_status woal_cancel_scan(moal_private *priv, t_u8 wait_option);
/** Find best network to connect */
mlan_status woal_find_best_network(moal_private *priv, t_u8 wait_option,
mlan_ssid_bssid *ssid_bssid);
/** Set Ad-Hoc channel */
mlan_status woal_change_adhoc_chan(moal_private *priv, int channel,
t_u8 wait_option);
/** Get scan table */
mlan_status woal_get_scan_table(moal_private *priv, t_u8 wait_option,
@ -4112,6 +4115,7 @@ void woal_fill_mlan_buffer(moal_private *priv, mlan_buffer *pmbuf,
moal_private *woal_add_interface(moal_handle *handle, t_u8 bss_num,
t_u8 bss_type);
void woal_clean_up(moal_handle *handle);
void woal_send_auto_recovery_complete_event(moal_handle *handle);
void woal_remove_interface(moal_handle *handle, t_u8 bss_index);
void woal_set_multicast_list(struct net_device *dev);
mlan_status woal_request_fw(moal_handle *handle);

View file

@ -57,6 +57,7 @@ static void woal_pcie_reg_dbg(moal_handle *phandle);
static void woal_pcie_unregister_dev(moal_handle *handle);
static void woal_pcie_cleanup(pcie_service_card *card);
static mlan_status woal_pcie_init(pcie_service_card *card);
static void woal_pcie_work(struct work_struct *work);
/** WLAN IDs */
static const struct pci_device_id wlan_ids[] = {
@ -248,7 +249,9 @@ static mlan_status woal_reset_adma(moal_handle *handle)
t_u32 value;
t_u32 reset_reg = handle->card_info->fw_reset_reg;
t_u8 reset_adma_val = 0x97;
/* wake up device before set the reset reg */
handle->ops.read_reg(handle, handle->card_info->fw_wakeup_reg, &value);
udelay(100);
if (handle->ops.write_reg(handle, reset_reg, reset_adma_val) !=
MLAN_STATUS_SUCCESS) {
PRINTM(MERROR, "Failed to write register.\n");
@ -373,7 +376,16 @@ static mlan_status woal_do_flr(moal_handle *handle, bool prepare, bool flr_flag)
/* Remove interface */
for (i = 0; i < handle->priv_num; i++)
woal_remove_interface(handle, i);
handle->priv_num = 0;
#if defined(STA_CFG80211) || defined(UAP_CFG80211)
/* Unregister wiphy device and free */
if (handle->wiphy) {
wiphy_unregister(handle->wiphy);
woal_cfg80211_free_bands(handle->wiphy);
wiphy_free(handle->wiphy);
handle->wiphy = NULL;
}
#endif
/* Unregister mlan */
if (handle->pmlan_adapter) {
mlan_unregister(handle->pmlan_adapter);
@ -430,6 +442,7 @@ perform_init:
moal_extflg_set(handle, EXT_FW_SERIAL);
goto err_init_fw;
}
if (flr_flag && fw_serial_bkp)
moal_extflg_set(handle, EXT_FW_SERIAL);
if (IS_PCIE9098(handle->card_type))
@ -442,6 +455,10 @@ exit_sem_err:
return status;
err_init_fw:
if (handle->is_fw_dump_timer_set) {
woal_cancel_timer(&handle->fw_dump_timer);
handle->is_fw_dump_timer_set = MFALSE;
}
if ((handle->hardware_status == HardwareStatusFwReady) ||
(handle->hardware_status == HardwareStatusReady)) {
PRINTM(MINFO, "shutdown mlan\n");
@ -472,6 +489,8 @@ err_init_fw:
while (handle->reassoc_thread.pid)
woal_sched_timeout(2);
#endif /* REASSOCIATION */
if (moal_extflg_isset(handle, EXT_NAPI))
netif_napi_del(&handle->napi_rx);
woal_terminate_workqueue(handle);
woal_free_moal_handle(handle);
@ -534,6 +553,7 @@ static int woal_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id)
ret = -EFAULT;
goto err;
}
INIT_WORK(&card->reset_work, woal_pcie_work);
if (woal_add_card(card, &card->dev->dev, &pcie_ops, card_type) ==
NULL) {
@ -577,10 +597,12 @@ static void woal_pcie_remove(struct pci_dev *dev)
LEAVE();
return;
}
cancel_work_sync(&card->reset_work);
handle = card->handle;
if (!handle || !handle->priv_num) {
PRINTM(MINFO, "PCIE card handle removed\n");
woal_pcie_cleanup(card);
kfree(card);
LEAVE();
return;
}
@ -876,6 +898,7 @@ static void woal_pcie_reset_prepare(struct pci_dev *pdev)
}
}
handle->surprise_removed = MTRUE;
handle->fw_reseting = MTRUE;
// TODO: Can add more chips once the related code has been ported to fw
// v18
if (IS_PCIE9097(handle->card_type) || IS_PCIE9098(handle->card_type)) {
@ -885,6 +908,7 @@ static void woal_pcie_reset_prepare(struct pci_dev *pdev)
woal_do_flr(handle, true, true);
if (ref_handle) {
ref_handle->surprise_removed = MTRUE;
ref_handle->fw_reseting = MTRUE;
woal_do_flr(ref_handle, true, true);
}
@ -934,12 +958,18 @@ static void woal_pcie_reset_done(struct pci_dev *pdev)
}
}
handle->surprise_removed = MFALSE;
woal_do_flr(handle, false, true);
if (MLAN_STATUS_SUCCESS == woal_do_flr(handle, false, true))
handle->fw_reseting = MFALSE;
else
handle = NULL;
if (ref_handle) {
ref_handle->surprise_removed = MFALSE;
woal_do_flr(ref_handle, false, true);
if (MLAN_STATUS_SUCCESS == woal_do_flr(ref_handle, false, true))
ref_handle->fw_reseting = MFALSE;
}
wifi_status = WIFI_STATUS_OK;
if (handle)
woal_send_auto_recovery_complete_event(handle);
LEAVE();
}
#else
@ -986,6 +1016,7 @@ static void woal_pcie_reset_notify(struct pci_dev *pdev, bool prepare)
* Note. FW might not be healthy.
*/
handle->surprise_removed = MTRUE;
handle->fw_reseting = MTRUE;
// TODO: Can add more chips once the related code has been
// ported to fw v18
if (IS_PCIE9097(handle->card_type) ||
@ -995,6 +1026,7 @@ static void woal_pcie_reset_notify(struct pci_dev *pdev, bool prepare)
woal_do_flr(handle, prepare, true);
if (ref_handle) {
ref_handle->surprise_removed = MTRUE;
ref_handle->fw_reseting = MTRUE;
woal_do_flr(ref_handle, prepare, true);
}
} else {
@ -1004,11 +1036,19 @@ static void woal_pcie_reset_notify(struct pci_dev *pdev, bool prepare)
* Reconfigure the sw and fw including fw redownload
*/
handle->surprise_removed = MFALSE;
woal_do_flr(handle, prepare, true);
if (MLAN_STATUS_SUCCESS == woal_do_flr(handle, prepare, true))
handle->fw_reseting = MFALSE;
else
handle = NULL;
if (ref_handle) {
ref_handle->surprise_removed = MFALSE;
woal_do_flr(ref_handle, prepare, true);
if (MLAN_STATUS_SUCCESS ==
woal_do_flr(ref_handle, prepare, true))
ref_handle->fw_reseting = MFALSE;
}
wifi_status = WIFI_STATUS_OK;
if (handle)
woal_send_auto_recovery_complete_event(handle);
}
LEAVE();
}
@ -1151,10 +1191,6 @@ static irqreturn_t woal_pcie_interrupt(int irq, void *dev_id)
goto exit;
}
handle = card->handle;
if (handle->surprise_removed == MTRUE) {
ret = MLAN_STATUS_FAILURE;
goto exit;
}
PRINTM(MINFO, "*** IN PCIE IRQ ***\n");
handle->main_state = MOAL_RECV_INT;
if (handle->second_mac)
@ -1395,7 +1431,7 @@ static mlan_status woal_pcie_register_dev(moal_handle *handle)
pdev = card->dev;
/* save adapter pointer in card */
card->handle = handle;
PRINTM(MERROR, "---yunjie--- woal_pcie_register_dev int mode %d\n", pcie_int_mode);
switch (pcie_int_mode) {
case PCIE_INT_MODE_MSIX:
pcie_int_mode = PCIE_INT_MODE_MSIX;
@ -1422,8 +1458,8 @@ static mlan_status woal_pcie_register_dev(moal_handle *handle)
&(card->msix_contexts[i]));
if (ret) {
PRINTM(MFATAL,
"request_irq failed: ret=%d\n",
PRINTM(MERROR,
"---yunjie--- request_irq failed: ret=%d\n",
ret);
for (j = 0; j < i; j++)
free_irq(card->msix_entries[j]
@ -1447,7 +1483,7 @@ static mlan_status woal_pcie_register_dev(moal_handle *handle)
ret = request_irq(pdev->irq, woal_pcie_interrupt, 0,
"mrvl_pcie_msi", pdev);
if (ret) {
PRINTM(MFATAL, "request_irq failed: ret=%d\n",
PRINTM(MERROR, "---yunjie--- request_irq failed: ret=%d\n",
ret);
pci_disable_msi(pdev);
} else {
@ -1462,7 +1498,7 @@ static mlan_status woal_pcie_register_dev(moal_handle *handle)
ret = request_irq(pdev->irq, woal_pcie_interrupt, IRQF_SHARED,
"mrvl_pcie", pdev);
if (ret) {
PRINTM(MFATAL, "request_irq failed: ret=%d\n", ret);
PRINTM(MERROR, "---yunjie--- request_irq failed: ret=%d\n", ret);
ret = MLAN_STATUS_FAILURE;
goto done;
}
@ -1470,7 +1506,7 @@ static mlan_status woal_pcie_register_dev(moal_handle *handle)
break;
default:
PRINTM(MFATAL, "pcie_int_mode %d failed\n", pcie_int_mode);
PRINTM(MERROR, "---yunjie--- pcie_int_mode %d failed\n", pcie_int_mode);
ret = MLAN_STATUS_FAILURE;
goto done;
break;
@ -2521,6 +2557,7 @@ static t_u8 woal_pcie_is_second_mac(moal_handle *handle)
static void woal_pcie_dump_fw_info(moal_handle *phandle)
{
moal_private *priv = NULL;
#ifdef DUMP_TO_PROC
if (phandle->fw_dump_buf) {
PRINTM(MERROR, "FW dump already exist\n");
@ -2553,13 +2590,23 @@ static void woal_pcie_dump_fw_info(moal_handle *phandle)
phandle->fw_dump = MFALSE;
if (!phandle->priv_num)
return;
woal_send_fw_dump_complete_event(
woal_get_priv(phandle, MLAN_BSS_ROLE_ANY));
priv = woal_get_priv(phandle, MLAN_BSS_ROLE_ANY);
if (priv == NULL) {
return;
}
woal_send_fw_dump_complete_event(priv);
mlan_pm_wakeup_card(phandle->pmlan_adapter, MFALSE);
queue_work(phandle->workqueue, &phandle->main_work);
woal_process_hang(phandle);
}
/**
* @brief This function get fw name
*
* @param handle A pointer to moal_handle structure
* @return MLAN_STATUS_SUCCESS
*
*/
static mlan_status woal_pcie_get_fw_name(moal_handle *handle)
{
mlan_status ret = MLAN_STATUS_SUCCESS;
@ -2783,6 +2830,139 @@ done:
return ret;
}
/**
* @brief This function trigger in-band reset to FW
*
* @param handle A pointer to moal_handle structure
* @return 0 or failure
*
*/
static int woal_pcie_reset_fw(moal_handle *handle)
{
int ret = 0, tries = 0;
t_u32 value = 1;
t_u32 reset_reg = handle->card_info->fw_reset_reg;
t_u8 reset_val = handle->card_info->fw_reset_val;
ENTER();
if (IS_PCIE8897(handle->card_type)) {
PRINTM(MERROR, "PCIE8897 don't support PCIE in-band reset\n");
LEAVE();
return -EFAULT;
}
woal_pcie_read_reg(handle, handle->card_info->fw_wakeup_reg, &value);
udelay(100);
/* Write register to notify FW */
if (woal_pcie_write_reg(handle, reset_reg, reset_val) !=
MLAN_STATUS_SUCCESS) {
PRINTM(MERROR, "Failed to write reregister.\n");
ret = -EFAULT;
goto done;
}
/* Poll register around 100 ms */
for (tries = 0; tries < MAX_POLL_TRIES; ++tries) {
woal_pcie_read_reg(handle, reset_reg, &value);
if (value == 0)
/* FW is ready */
break;
udelay(1000);
}
if (value) {
PRINTM(MERROR, "Failed to poll FW reset register %X=0x%x\n",
reset_reg, value);
ret = -EFAULT;
goto done;
}
PRINTM(MMSG, "PCIE Trigger FW In-band Reset success.");
done:
LEAVE();
return ret;
}
/**
* @brief This function handle the pcie work
*
* @param WORK A pointer to work_struct
* @return N/A
*
*/
static void woal_pcie_work(struct work_struct *work)
{
pcie_service_card *card =
container_of(work, pcie_service_card, reset_work);
moal_handle *handle = NULL;
moal_handle *ref_handle = NULL;
PRINTM(MMSG, "========START IN-BAND RESET===========\n");
handle = card->handle;
// handle-> mac0 , ref_handle->second mac
if (handle->pref_mac) {
if (handle->second_mac) {
handle = (moal_handle *)handle->pref_mac;
ref_handle = (moal_handle *)handle->pref_mac;
} else {
ref_handle = (moal_handle *)handle->pref_mac;
}
if (ref_handle) {
ref_handle->surprise_removed = MTRUE;
woal_clean_up(ref_handle);
mlan_ioctl(ref_handle->pmlan_adapter, NULL);
}
}
handle->surprise_removed = MTRUE;
handle->fw_reseting = MTRUE;
// TODO: Can add more chips once the related code has been ported to fw
// v18
if (IS_PCIE9097(handle->card_type) || IS_PCIE9098(handle->card_type)) {
woal_reset_adma(handle);
}
woal_do_flr(handle, true, true);
if (ref_handle) {
ref_handle->surprise_removed = MTRUE;
ref_handle->fw_reseting = MTRUE;
woal_do_flr(ref_handle, true, true);
}
if (woal_pcie_reset_fw(handle)) {
PRINTM(MERROR, "PCIe In-band Reset Fail\n");
goto done;
}
handle->surprise_removed = MFALSE;
if (MLAN_STATUS_SUCCESS == woal_do_flr(handle, false, true))
handle->fw_reseting = MFALSE;
else
handle = NULL;
if (ref_handle) {
ref_handle->surprise_removed = MFALSE;
if (MLAN_STATUS_SUCCESS == woal_do_flr(ref_handle, false, true))
ref_handle->fw_reseting = MFALSE;
}
card->work_flags = MFALSE;
done:
wifi_status = WIFI_STATUS_OK;
if (handle)
woal_send_auto_recovery_complete_event(handle);
PRINTM(MMSG, "========END IN-BAND RESET===========\n");
return;
}
/**
* @brief This function start reset_work
*
* @param handle A pointer to moal_handle structure
* @return MTRUE/MFALSE
*
*/
static void woal_pcie_card_reset(moal_handle *handle)
{
pcie_service_card *card = (pcie_service_card *)handle->card;
if (!card->work_flags) {
card->work_flags = MTRUE;
schedule_work(&card->reset_work);
}
}
static moal_if_ops pcie_ops = {
.register_dev = woal_pcie_register_dev,
.unregister_dev = woal_pcie_unregister_dev,
@ -2794,5 +2974,6 @@ static moal_if_ops pcie_ops = {
.dump_fw_info = woal_pcie_dump_fw_info,
.reg_dbg = woal_pcie_reg_dbg,
.dump_reg_info = woal_pcie_dump_reg_info,
.card_reset = woal_pcie_card_reset,
.is_second_mac = woal_pcie_is_second_mac,
};

View file

@ -150,6 +150,10 @@ typedef struct _pcie_service_card {
struct pci_dev *dev;
/** moal_handle structure pointer */
moal_handle *handle;
/** reset work*/
struct work_struct reset_work;
/** work flag */
t_u8 work_flags;
/** I/O memory regions pointer to the bus */
void __iomem *pci_mmap;
/** I/O memory regions pointer to the bus */

View file

@ -61,14 +61,6 @@ static t_u8 SupportedInfraBand[] = {
BAND_A | BAND_AN | BAND_AAC,
};
/** Bands supported in Ad-Hoc mode */
static t_u8 SupportedAdhocBand[] = {
BAND_B,
BAND_B | BAND_G,
BAND_G,
BAND_A,
};
/********************************************************
Local Functions
********************************************************/
@ -1460,11 +1452,9 @@ static int woal_band_cfg(moal_private *priv, struct iwreq *wrq)
{
int ret = 0;
unsigned int i;
int data[3];
int data[1];
int user_data_len = wrq->u.data.length, copy_len;
t_u32 infra_band = 0;
t_u32 adhoc_band = 0;
t_u32 adhoc_channel = 0;
mlan_ioctl_req *req = NULL;
mlan_ds_radio_cfg *radio_cfg = NULL;
mlan_status status = MLAN_STATUS_SUCCESS;
@ -1505,11 +1495,6 @@ static int woal_band_cfg(moal_private *priv, struct iwreq *wrq)
}
/* Infra Band */
data[0] = radio_cfg->param.band_cfg.config_bands;
/* Adhoc Band */
data[1] = radio_cfg->param.band_cfg.adhoc_start_band;
/* Adhoc Channel */
data[2] = radio_cfg->param.band_cfg.adhoc_channel;
wrq->u.data.length = 3;
if (copy_to_user(wrq->u.data.pointer, data,
sizeof(int) * wrq->u.data.length)) {
@ -1533,33 +1518,9 @@ static int woal_band_cfg(moal_private *priv, struct iwreq *wrq)
goto error;
}
/* Set Adhoc band */
if (user_data_len >= 2) {
adhoc_band = data[1];
for (i = 0; i < sizeof(SupportedAdhocBand); i++)
if (adhoc_band == SupportedAdhocBand[i])
break;
if (i == sizeof(SupportedAdhocBand)) {
ret = -EINVAL;
goto error;
}
}
/* Set Adhoc channel */
if (user_data_len >= 3) {
adhoc_channel = data[2];
if (adhoc_channel == 0) {
/* Check if specified adhoc channel is non-zero
*/
ret = -EINVAL;
goto error;
}
}
/* Set config_bands and adhoc_start_band values to MLAN */
req->action = MLAN_ACT_SET;
radio_cfg->param.band_cfg.config_bands = infra_band;
radio_cfg->param.band_cfg.adhoc_start_band = adhoc_band;
radio_cfg->param.band_cfg.adhoc_channel = adhoc_channel;
status = woal_request_ioctl(priv, req, MOAL_IOCTL_WAIT);
if (status != MLAN_STATUS_SUCCESS) {
ret = -EFAULT;
@ -4911,20 +4872,16 @@ static int woal_cmd52rdwr_ioctl(moal_private *priv, struct iwreq *wrq)
if (!rw) {
#ifdef SDIO_MMC
sdio_claim_host(
((struct sdio_mmc_card *)priv->phandle->card)->func);
sdio_claim_host(((sdio_mmc_card *)priv->phandle->card)->func);
if (func)
data = sdio_readb(
((struct sdio_mmc_card *)priv->phandle->card)
->func,
((sdio_mmc_card *)priv->phandle->card)->func,
reg, &ret);
else
data = sdio_f0_readb(
((struct sdio_mmc_card *)priv->phandle->card)
->func,
((sdio_mmc_card *)priv->phandle->card)->func,
reg, &ret);
sdio_release_host(
((struct sdio_mmc_card *)priv->phandle->card)->func);
sdio_release_host(((sdio_mmc_card *)priv->phandle->card)->func);
if (ret) {
PRINTM(MERROR,
"sdio_readb: reading register 0x%X failed\n",
@ -4943,20 +4900,16 @@ static int woal_cmd52rdwr_ioctl(moal_private *priv, struct iwreq *wrq)
#endif
} else {
#ifdef SDIO_MMC
sdio_claim_host(
((struct sdio_mmc_card *)priv->phandle->card)->func);
sdio_claim_host(((sdio_mmc_card *)priv->phandle->card)->func);
if (func)
sdio_writeb(
((struct sdio_mmc_card *)priv->phandle->card)
->func,
((sdio_mmc_card *)priv->phandle->card)->func,
data, reg, &ret);
else
sdio_f0_writeb(
((struct sdio_mmc_card *)priv->phandle->card)
->func,
((sdio_mmc_card *)priv->phandle->card)->func,
data, reg, &ret);
sdio_release_host(
((struct sdio_mmc_card *)priv->phandle->card)->func);
sdio_release_host(((sdio_mmc_card *)priv->phandle->card)->func);
if (ret) {
PRINTM(MERROR,
"sdio_writeb: writing register 0x%X failed\n",
@ -5018,8 +4971,8 @@ static int woal_cmd53rdwr_ioctl(moal_private *priv, struct iwreq *wrq)
ret = -EFAULT;
goto done;
}
if (wrq->u.data.length > WOAL_2K_BYTES) {
PRINTM(MERROR, "Data lengh is too large!\n");
if (wrq->u.data.length == 0 || wrq->u.data.length > WOAL_2K_BYTES) {
PRINTM(MERROR, "Data lengh is invalid!\n");
ret = -EINVAL;
goto done;
}
@ -5053,16 +5006,13 @@ static int woal_cmd53rdwr_ioctl(moal_private *priv, struct iwreq *wrq)
reg, mode, blklen, blknum);
if (!rw) {
sdio_claim_host(
((struct sdio_mmc_card *)priv->phandle->card)->func);
if (sdio_readsb(
((struct sdio_mmc_card *)priv->phandle->card)->func,
data, reg, total_len))
sdio_claim_host(((sdio_mmc_card *)priv->phandle->card)->func);
if (sdio_readsb(((sdio_mmc_card *)priv->phandle->card)->func,
data, reg, total_len))
PRINTM(MERROR,
"sdio_readsb: reading memory 0x%x failed\n",
reg);
sdio_release_host(
((struct sdio_mmc_card *)priv->phandle->card)->func);
sdio_release_host(((sdio_mmc_card *)priv->phandle->card)->func);
if (copy_to_user(wrq->u.data.pointer, data, total_len)) {
PRINTM(MINFO, "Copy to user failed\n");
@ -5080,16 +5030,13 @@ static int woal_cmd53rdwr_ioctl(moal_private *priv, struct iwreq *wrq)
for (pos = 0; pos < (int)total_len; pos++)
data[pos] = buf[11 + (pos % pattern_len)];
sdio_claim_host(
((struct sdio_mmc_card *)priv->phandle->card)->func);
if (sdio_writesb(
((struct sdio_mmc_card *)priv->phandle->card)->func,
reg, data, total_len))
sdio_claim_host(((sdio_mmc_card *)priv->phandle->card)->func);
if (sdio_writesb(((sdio_mmc_card *)priv->phandle->card)->func,
reg, data, total_len))
PRINTM(MERROR,
"sdio_writesb: writing memory 0x%x failed\n",
reg);
sdio_release_host(
((struct sdio_mmc_card *)priv->phandle->card)->func);
sdio_release_host(((sdio_mmc_card *)priv->phandle->card)->func);
}
done:
@ -7094,8 +7041,6 @@ void woal_ioctl_get_bss_resp(moal_private *priv, mlan_ds_bss *bss)
case MLAN_OID_BSS_MODE:
if (bss->param.bss_mode == MLAN_BSS_MODE_INFRA)
mode = IW_MODE_INFRA;
else if (bss->param.bss_mode == MLAN_BSS_MODE_IBSS)
mode = IW_MODE_ADHOC;
else
mode = IW_MODE_AUTO;
priv->w_stats.status = mode;

View file

@ -805,6 +805,11 @@ static ssize_t woal_config_write(struct file *f, const char __user *buf,
if (!strncmp(databuf, "trigger_frame=", strlen("trigger_frame=")) &&
count > strlen("trigger_frame="))
cmd = MFG_CMD_CONFIG_TRIGGER_FRAME;
if (!strncmp(databuf,
"otp_mac_addr_rd_wr=", strlen("otp_mac_add_rd_wr=")) &&
count > strlen("otp_mac_addr_rd_wr=")) {
cmd = MFG_CMD_OTP_MAC_ADD;
}
if (cmd && handle->rf_test_mode &&
(woal_process_rf_test_mode_cmd(
handle, cmd, (const char *)databuf, (size_t)count,
@ -1049,6 +1054,14 @@ static int woal_config_read(struct seq_file *sfp, void *data)
.basic_trig_user_info.pref_ac);
}
seq_printf(sfp, "\n");
seq_printf(sfp, "otp_mac_add_rd_wr=");
seq_printf(sfp, " %02x:%02x:%02x:%02x:%02x:%02x \n",
handle->rf_data->mfg_otp_mac_addr_rd_wr.mac_addr[0],
handle->rf_data->mfg_otp_mac_addr_rd_wr.mac_addr[1],
handle->rf_data->mfg_otp_mac_addr_rd_wr.mac_addr[2],
handle->rf_data->mfg_otp_mac_addr_rd_wr.mac_addr[3],
handle->rf_data->mfg_otp_mac_addr_rd_wr.mac_addr[4],
handle->rf_data->mfg_otp_mac_addr_rd_wr.mac_addr[5]);
}
// Read current antcfg configuration
woal_priv_get_tx_rx_ant(sfp, priv);

View file

@ -45,6 +45,11 @@ Change log:
#define BYTE_MODE 0
#endif
/** SDIO bus width 1 bit mode */
#define SDIO_BUS_WIDTH_1 1
/** SDIO bus width 4 bit mode */
#define SDIO_BUS_WIDTH_4 4
#ifndef FIXED_ADDRESS
/** Fixed address mode */
#define FIXED_ADDRESS 0
@ -174,6 +179,7 @@ mlan_status woal_sdiommc_bus_register(void);
void woal_sdiommc_bus_unregister(void);
int woal_sdio_set_bus_clock(moal_handle *handle, t_u8 option);
int woal_sdio_set_buswidth(moal_handle *handle, t_u8 bus_width);
#ifdef SDIO_SUSPEND_RESUME
#ifdef MMC_PM_FUNC_SUSPENDED
@ -188,14 +194,18 @@ int woal_sdio_resume(struct device *dev);
#ifdef SDIO_MMC
/** Structure: SDIO MMC card */
struct sdio_mmc_card {
typedef struct _sdio_mmc_card {
/** sdio_func structure pointer */
struct sdio_func *func;
/** moal_handle structure pointer */
moal_handle *handle;
/** reset work*/
struct work_struct reset_work;
/** work flag */
t_u8 work_flags;
/** saved host clock value */
unsigned int host_clock;
};
} sdio_mmc_card;
void woal_sdio_reset_hw(moal_handle *handle);
#endif /* SDIO_MMC */

View file

@ -27,8 +27,15 @@ Change log:
****************************************************/
#include <linux/firmware.h>
#if defined(STA_CFG80211) || defined(UAP_CFG80211)
#include "moal_cfg80211.h"
#endif
#include "moal_sdio.h"
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0)
#if IS_ENABLED(CONFIG_IPV6)
#include <net/addrconf.h>
#endif
#endif
/** define nxp vendor id */
#define NXP_VENDOR_ID 0x0471
@ -133,6 +140,7 @@ MODULE_DEVICE_TABLE(sdio, wlan_ids);
int woal_sdio_probe(struct sdio_func *func, const struct sdio_device_id *id);
void woal_sdio_remove(struct sdio_func *func);
static void woal_sdiommc_work(struct work_struct *work);
#ifdef SDIO
static void woal_sdiommc_reg_dbg(pmoal_handle handle);
#endif
@ -205,7 +213,7 @@ static void woal_dump_sdio_reg(moal_handle *handle)
for (i = 0; i < ARRAY_SIZE(fun0_reg); i++) {
data = sdio_f0_readb(
((struct sdio_mmc_card *)handle->card)->func,
((sdio_mmc_card *)handle->card)->func,
fun0_reg[i], &ret);
PRINTM(MMSG, "fun0: reg 0x%02x=0x%02x ret=%d\n", fun0_reg[i],
data, ret);
@ -223,7 +231,7 @@ static void woal_dump_sdio_reg(moal_handle *handle)
}
#endif
for (i = 0; i < array_size; i++) {
data = sdio_readb(((struct sdio_mmc_card *)handle->card)->func,
data = sdio_readb(((sdio_mmc_card *)handle->card)->func,
fun1_reg[i], &ret);
PRINTM(MMSG, "fun1: reg 0x%02x=0x%02x ret=%d\n", fun1_reg[i],
data, ret);
@ -243,7 +251,7 @@ static void woal_dump_sdio_reg(moal_handle *handle)
static void woal_sdio_interrupt(struct sdio_func *func)
{
moal_handle *handle;
struct sdio_mmc_card *card;
sdio_mmc_card *card;
mlan_status status;
ENTER();
@ -296,7 +304,7 @@ static void woal_sdio_interrupt(struct sdio_func *func)
*/
static t_u16 woal_update_card_type(t_void *card)
{
struct sdio_mmc_card *cardp_sd = (struct sdio_mmc_card *)card;
sdio_mmc_card *cardp_sd = (sdio_mmc_card *)card;
t_u16 card_type = 0;
/* Update card type */
@ -468,7 +476,7 @@ static t_u16 woal_update_card_type(t_void *card)
int woal_sdio_probe(struct sdio_func *func, const struct sdio_device_id *id)
{
int ret = MLAN_STATUS_SUCCESS;
struct sdio_mmc_card *card = NULL;
sdio_mmc_card *card = NULL;
t_u16 card_type = 0;
ENTER();
@ -476,7 +484,7 @@ int woal_sdio_probe(struct sdio_func *func, const struct sdio_device_id *id)
PRINTM(MMSG, "vendor=0x%4.04X device=0x%4.04X class=%d function=%d\n",
func->vendor, func->device, func->class, func->num);
card = kzalloc(sizeof(struct sdio_mmc_card), GFP_KERNEL);
card = kzalloc(sizeof(sdio_mmc_card), GFP_KERNEL);
if (!card) {
PRINTM(MFATAL,
"Failed to allocate memory in probe function!\n");
@ -518,7 +526,7 @@ int woal_sdio_probe(struct sdio_func *func, const struct sdio_device_id *id)
ret = MLAN_STATUS_FAILURE;
goto err;
}
INIT_WORK(&card->reset_work, woal_sdiommc_work);
if (NULL ==
woal_add_card(card, &card->func->dev, &sdiommc_ops, card_type)) {
PRINTM(MMSG, "woal_add_card failed\n");
@ -549,7 +557,7 @@ err:
*/
void woal_sdio_remove(struct sdio_func *func)
{
struct sdio_mmc_card *card;
sdio_mmc_card *card;
ENTER();
@ -603,8 +611,7 @@ void woal_wlan_is_suspended(moal_handle *handle)
ENTER();
if (handle->suspend_notify_req == MTRUE) {
handle->is_suspended = MTRUE;
sdio_func_suspended(
((struct sdio_mmc_card *)handle->card)->func);
sdio_func_suspended(((sdio_mmc_card *)handle->card)->func);
}
LEAVE();
}
@ -619,7 +626,7 @@ void woal_sdio_shutdown(struct device *dev)
{
struct sdio_func *func = dev_to_sdio_func(dev);
moal_handle *handle = NULL;
struct sdio_mmc_card *cardp;
sdio_mmc_card *cardp;
mlan_ds_ps_info pm_info;
int i, retry_num = 8;
@ -702,7 +709,7 @@ int woal_sdio_suspend(struct device *dev)
struct sdio_func *func = dev_to_sdio_func(dev);
mmc_pm_flag_t pm_flags = 0;
moal_handle *handle = NULL;
struct sdio_mmc_card *cardp;
sdio_mmc_card *cardp;
int i, retry_num = 8;
int ret = MLAN_STATUS_SUCCESS;
int hs_actived = 0;
@ -831,7 +838,7 @@ int woal_sdio_resume(struct device *dev)
struct sdio_func *func = dev_to_sdio_func(dev);
mmc_pm_flag_t pm_flags = 0;
moal_handle *handle = NULL;
struct sdio_mmc_card *cardp;
sdio_mmc_card *cardp;
int i;
ENTER();
@ -886,10 +893,10 @@ static mlan_status woal_sdiommc_write_reg(moal_handle *handle, t_u32 reg,
t_u32 data)
{
mlan_status ret = MLAN_STATUS_FAILURE;
sdio_claim_host(((struct sdio_mmc_card *)handle->card)->func);
sdio_writeb(((struct sdio_mmc_card *)handle->card)->func, (t_u8)data,
reg, (int *)&ret);
sdio_release_host(((struct sdio_mmc_card *)handle->card)->func);
sdio_claim_host(((sdio_mmc_card *)handle->card)->func);
sdio_writeb(((sdio_mmc_card *)handle->card)->func, (t_u8)data, reg,
(int *)&ret);
sdio_release_host(((sdio_mmc_card *)handle->card)->func);
return ret;
}
@ -907,10 +914,10 @@ static mlan_status woal_sdiommc_read_reg(moal_handle *handle, t_u32 reg,
{
mlan_status ret = MLAN_STATUS_FAILURE;
t_u8 val;
sdio_claim_host(((struct sdio_mmc_card *)handle->card)->func);
val = sdio_readb(((struct sdio_mmc_card *)handle->card)->func, reg,
sdio_claim_host(((sdio_mmc_card *)handle->card)->func);
val = sdio_readb(((sdio_mmc_card *)handle->card)->func, reg,
(int *)&ret);
sdio_release_host(((struct sdio_mmc_card *)handle->card)->func);
sdio_release_host(((sdio_mmc_card *)handle->card)->func);
*data = val;
return ret;
@ -928,10 +935,10 @@ static mlan_status woal_sdiommc_read_reg(moal_handle *handle, t_u32 reg,
static mlan_status woal_sdio_writeb(moal_handle *handle, t_u32 reg, t_u8 data)
{
mlan_status ret = MLAN_STATUS_FAILURE;
sdio_claim_host(((struct sdio_mmc_card *)handle->card)->func);
sdio_writeb(((struct sdio_mmc_card *)handle->card)->func, (t_u8)data,
reg, (int *)&ret);
sdio_release_host(((struct sdio_mmc_card *)handle->card)->func);
sdio_claim_host(((sdio_mmc_card *)handle->card)->func);
sdio_writeb(((sdio_mmc_card *)handle->card)->func, (t_u8)data, reg,
(int *)&ret);
sdio_release_host(((sdio_mmc_card *)handle->card)->func);
return ret;
}
@ -948,10 +955,10 @@ static mlan_status woal_sdio_readb(moal_handle *handle, t_u32 reg, t_u8 *data)
{
mlan_status ret = MLAN_STATUS_FAILURE;
t_u8 val;
sdio_claim_host(((struct sdio_mmc_card *)handle->card)->func);
val = sdio_readb(((struct sdio_mmc_card *)handle->card)->func, reg,
sdio_claim_host(((sdio_mmc_card *)handle->card)->func);
val = sdio_readb(((sdio_mmc_card *)handle->card)->func, reg,
(int *)&ret);
sdio_release_host(((struct sdio_mmc_card *)handle->card)->func);
sdio_release_host(((sdio_mmc_card *)handle->card)->func);
*data = val;
return ret;
@ -971,10 +978,10 @@ static mlan_status woal_sdio_f0_readb(moal_handle *handle, t_u32 reg,
{
mlan_status ret = MLAN_STATUS_FAILURE;
t_u8 val;
sdio_claim_host(((struct sdio_mmc_card *)handle->card)->func);
val = sdio_f0_readb(((struct sdio_mmc_card *)handle->card)->func, reg,
sdio_claim_host(((sdio_mmc_card *)handle->card)->func);
val = sdio_f0_readb(((sdio_mmc_card *)handle->card)->func, reg,
(int *)&ret);
sdio_release_host(((struct sdio_mmc_card *)handle->card)->func);
sdio_release_host(((sdio_mmc_card *)handle->card)->func);
*data = val;
return ret;
@ -1000,7 +1007,7 @@ static mlan_status woal_sdio_rw_mb(moal_handle *handle, pmlan_buffer pmbuf_list,
struct mmc_request mmc_req;
struct mmc_command mmc_cmd;
struct mmc_data mmc_dat;
struct sdio_func *func = ((struct sdio_mmc_card *)handle->card)->func;
struct sdio_func *func = ((sdio_mmc_card *)handle->card)->func;
t_u32 ioport = (port & MLAN_SDIO_IO_PORT_MASK);
t_u32 blkcnt = pmbuf_list->data_len / MLAN_SDIO_BLOCK_SIZE;
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0)
@ -1042,25 +1049,24 @@ static mlan_status woal_sdio_rw_mb(moal_handle *handle, pmlan_buffer pmbuf_list,
mmc_req.cmd = &mmc_cmd;
mmc_req.data = &mmc_dat;
sdio_claim_host(((struct sdio_mmc_card *)handle->card)->func);
mmc_set_data_timeout(
&mmc_dat, ((struct sdio_mmc_card *)handle->card)->func->card);
mmc_wait_for_req(
((struct sdio_mmc_card *)handle->card)->func->card->host,
&mmc_req);
sdio_claim_host(((sdio_mmc_card *)handle->card)->func);
mmc_set_data_timeout(&mmc_dat,
((sdio_mmc_card *)handle->card)->func->card);
mmc_wait_for_req(((sdio_mmc_card *)handle->card)->func->card->host,
&mmc_req);
if (mmc_cmd.error || mmc_dat.error) {
PRINTM(MERROR, "CMD53 %s cmd_error = %d data_error=%d\n",
write ? "write" : "read", mmc_cmd.error, mmc_dat.error);
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0)
/* issue abort cmd52 command through F0*/
sdio_f0_writeb(((struct sdio_mmc_card *)handle->card)->func,
0x01, SDIO_CCCR_ABORT, &status);
sdio_f0_writeb(((sdio_mmc_card *)handle->card)->func, 0x01,
SDIO_CCCR_ABORT, &status);
#endif
sdio_release_host(((struct sdio_mmc_card *)handle->card)->func);
sdio_release_host(((sdio_mmc_card *)handle->card)->func);
return MLAN_STATUS_FAILURE;
}
sdio_release_host(((struct sdio_mmc_card *)handle->card)->func);
sdio_release_host(((sdio_mmc_card *)handle->card)->func);
return MLAN_STATUS_SUCCESS;
}
@ -1093,20 +1099,20 @@ static mlan_status woal_sdiommc_write_data_sync(moal_handle *handle,
#ifdef SDIO_MMC_DEBUG
handle->cmd53w = 1;
#endif
sdio_claim_host(((struct sdio_mmc_card *)handle->card)->func);
status = sdio_writesb(((struct sdio_mmc_card *)handle->card)->func,
ioport, buffer, blkcnt * blksz);
sdio_claim_host(((sdio_mmc_card *)handle->card)->func);
status = sdio_writesb(((sdio_mmc_card *)handle->card)->func, ioport,
buffer, blkcnt * blksz);
if (!status)
ret = MLAN_STATUS_SUCCESS;
else {
PRINTM(MERROR, "cmd53 write error=%d\n", status);
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0)
/* issue abort cmd52 command through F0*/
sdio_f0_writeb(((struct sdio_mmc_card *)handle->card)->func,
0x01, SDIO_CCCR_ABORT, &status);
sdio_f0_writeb(((sdio_mmc_card *)handle->card)->func, 0x01,
SDIO_CCCR_ABORT, &status);
#endif
}
sdio_release_host(((struct sdio_mmc_card *)handle->card)->func);
sdio_release_host(((sdio_mmc_card *)handle->card)->func);
#ifdef SDIO_MMC_DEBUG
handle->cmd53w = 2;
#endif
@ -1142,20 +1148,20 @@ static mlan_status woal_sdiommc_read_data_sync(moal_handle *handle,
#ifdef SDIO_MMC_DEBUG
handle->cmd53r = 1;
#endif
sdio_claim_host(((struct sdio_mmc_card *)handle->card)->func);
status = sdio_readsb(((struct sdio_mmc_card *)handle->card)->func,
buffer, ioport, blkcnt * blksz);
sdio_claim_host(((sdio_mmc_card *)handle->card)->func);
status = sdio_readsb(((sdio_mmc_card *)handle->card)->func, buffer,
ioport, blkcnt * blksz);
if (!status) {
ret = MLAN_STATUS_SUCCESS;
} else {
PRINTM(MERROR, "cmd53 read error=%d\n", status);
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0)
/* issue abort cmd52 command through F0*/
sdio_f0_writeb(((struct sdio_mmc_card *)handle->card)->func,
0x01, SDIO_CCCR_ABORT, &status);
sdio_f0_writeb(((sdio_mmc_card *)handle->card)->func, 0x01,
SDIO_CCCR_ABORT, &status);
#endif
}
sdio_release_host(((struct sdio_mmc_card *)handle->card)->func);
sdio_release_host(((sdio_mmc_card *)handle->card)->func);
#ifdef SDIO_MMC_DEBUG
handle->cmd53r = 2;
#endif
@ -1209,7 +1215,7 @@ static void woal_sdiommc_unregister_dev(moal_handle *handle)
{
ENTER();
if (handle->card) {
struct sdio_mmc_card *card = handle->card;
sdio_mmc_card *card = handle->card;
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0)
struct sdio_func *func = card->func;
#endif
@ -1245,7 +1251,7 @@ static void woal_sdiommc_unregister_dev(moal_handle *handle)
static mlan_status woal_sdiommc_register_dev(moal_handle *handle)
{
int ret = MLAN_STATUS_SUCCESS;
struct sdio_mmc_card *card = handle->card;
sdio_mmc_card *card = handle->card;
struct sdio_func *func;
ENTER();
@ -1286,6 +1292,44 @@ release_host:
return MLAN_STATUS_FAILURE;
}
/**
* @brief This function set the sdio bus width
*
* @param handle A pointer to moal_handle structure
* @param mode 1--1 bit mode, 4--4 bit mode
* @return MLAN_STATUS_SUCCESS
*/
int woal_sdio_set_buswidth(moal_handle *handle, t_u8 bus_width)
{
sdio_mmc_card *cardp = (sdio_mmc_card *)handle->card;
struct mmc_host *host = cardp->func->card->host;
int ret = 0;
t_u8 val;
ENTER();
if (bus_width != SDIO_BUS_WIDTH_1 && bus_width != SDIO_BUS_WIDTH_4) {
LEAVE();
return -EFAULT;
}
sdio_claim_host(((sdio_mmc_card *)handle->card)->func);
val = sdio_f0_readb(((sdio_mmc_card *)handle->card)->func, SDIO_CCCR_IF,
(int *)&ret);
val &= ~SDIO_BUS_WIDTH_MASK;
if (bus_width == SDIO_BUS_WIDTH_1)
host->ios.bus_width = MMC_BUS_WIDTH_1;
else {
host->ios.bus_width = MMC_BUS_WIDTH_4;
val |= SDIO_BUS_WIDTH_4BIT;
}
sdio_f0_writeb(((sdio_mmc_card *)handle->card)->func, val, SDIO_CCCR_IF,
&ret);
sdio_release_host(cardp->func);
host->ops->set_ios(host, &host->ios);
LEAVE();
return ret;
}
/**
* @brief This function set bus clock on/off
*
@ -1295,7 +1339,7 @@ release_host:
*/
int woal_sdio_set_bus_clock(moal_handle *handle, t_u8 option)
{
struct sdio_mmc_card *cardp = (struct sdio_mmc_card *)handle->card;
sdio_mmc_card *cardp = (sdio_mmc_card *)handle->card;
struct mmc_host *host = cardp->func->card->host;
ENTER();
@ -1328,7 +1372,7 @@ int woal_sdio_set_bus_clock(moal_handle *handle, t_u8 option)
int woal_sdio_read_write_cmd52(moal_handle *handle, int func, int reg, int val)
{
int ret = MLAN_STATUS_SUCCESS;
struct sdio_mmc_card *card = (struct sdio_mmc_card *)handle->card;
sdio_mmc_card *card = (sdio_mmc_card *)handle->card;
ENTER();
/* Save current func and reg for read */
@ -1381,7 +1425,7 @@ int woal_sdio_read_write_cmd52(moal_handle *handle, int func, int reg, int val)
static t_u8 woal_sdiommc_is_second_mac(moal_handle *handle)
{
#if defined(SD9098)
struct sdio_mmc_card *card = (struct sdio_mmc_card *)handle->card;
sdio_mmc_card *card = (sdio_mmc_card *)handle->card;
#endif
#ifdef SD9098
@ -1395,7 +1439,7 @@ static mlan_status woal_sdiommc_get_fw_name(moal_handle *handle)
{
mlan_status ret = MLAN_STATUS_SUCCESS;
#ifdef SD9098
struct sdio_mmc_card *card = (struct sdio_mmc_card *)handle->card;
sdio_mmc_card *card = (sdio_mmc_card *)handle->card;
#endif
t_u32 revision_id = 0;
t_u32 rev_id_reg = handle->card_info->rev_id_reg;
@ -1882,7 +1926,7 @@ void woal_dump_firmware_info(moal_handle *phandle)
#endif
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 32)
sdio_claim_host(((struct sdio_mmc_card *)phandle->card)->func);
sdio_claim_host(((sdio_mmc_card *)phandle->card)->func);
#endif
/* start dump fw memory */
moal_get_system_time(phandle, &sec, &usec);
@ -2064,7 +2108,7 @@ void woal_dump_firmware_info(moal_handle *phandle)
/* end dump fw memory */
done:
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 32)
sdio_release_host(((struct sdio_mmc_card *)phandle->card)->func);
sdio_release_host(((sdio_mmc_card *)phandle->card)->func);
#endif
if (ITCM_Ptr)
moal_vfree(phandle, ITCM_Ptr);
@ -2752,7 +2796,7 @@ static int woal_sdiommc_dump_reg_info(moal_handle *phandle, t_u8 *drv_buf)
*/
void woal_sdio_reset_hw(moal_handle *handle)
{
struct sdio_mmc_card *card = handle->card;
sdio_mmc_card *card = handle->card;
struct sdio_func *func = card->func;
ENTER();
sdio_claim_host(func);
@ -2789,6 +2833,347 @@ void woal_sdio_reset_hw(moal_handle *handle)
return;
}
/**
* @brief This function reload fw
*
* @param handle A pointer to moal_handle structure
*
* @return 0--success, otherwise failure
*/
static int woal_sdiommc_reset_fw(moal_handle *handle)
{
int ret = 0, tries = 0;
t_u32 value = 1;
t_u32 reset_reg = handle->card_info->fw_reset_reg;
t_u8 reset_val = handle->card_info->fw_reset_val;
t_u32 wakeup_reg = handle->card_info->fw_wakeup_reg;
t_u8 wakeup_val = handle->card_info->fw_wakeup_val;
ENTER();
/** write power up bit to wakeu device */
if (handle->ops.write_reg(handle, wakeup_reg, wakeup_val) !=
MLAN_STATUS_SUCCESS) {
PRINTM(MERROR, "Failed to write wakeup register.\n");
ret = -EFAULT;
goto done;
}
/** wait SOC fully wake up */
for (tries = 0; tries < MAX_POLL_TRIES; ++tries) {
ret = handle->ops.write_reg(handle, reset_reg, 0xba);
if (ret == MLAN_STATUS_SUCCESS) {
handle->ops.read_reg(handle, reset_reg, &value);
if (value == 0xba) {
PRINTM(MMSG, "FW wake up\n");
break;
}
}
udelay(1000);
}
/* Write register to notify FW */
if (handle->ops.write_reg(handle, reset_reg, reset_val) !=
MLAN_STATUS_SUCCESS) {
PRINTM(MERROR, "Failed to write reset register.\n");
ret = -EFAULT;
goto done;
}
#if defined(SD9098) || defined(SD9097) || defined(SDIW624) || defined(SD9177)
if (IS_SD9098(handle->card_type) || IS_SD9097(handle->card_type) ||
IS_SDIW624(handle->card_type) || IS_SD9177(handle->card_type) ||
IS_SDAW693(handle->card_type))
handle->ops.write_reg(handle, 0x00, 0x10);
#endif
/* Poll register around 100 ms */
for (tries = 0; tries < MAX_POLL_TRIES; ++tries) {
handle->ops.read_reg(handle, reset_reg, &value);
if (value == 0)
/* FW is ready */
break;
udelay(1000);
}
if (value) {
PRINTM(MERROR, "Failed to poll FW reset register %X=0x%x\n",
reset_reg, value);
ret = -EFAULT;
goto done;
}
PRINTM(MMSG, "SDIO Trigger FW In-band Reset success");
done:
LEAVE();
return ret;
}
/**
* @brief Function to process pre/post SDIO function level reset
*
* @param handle A pointer to moal_handle structure
* @param prepare True :- its a prepare reset
* False :- its a post reset
* @param flr True: flag for wifi-only firmware
*
* Note: This function is mix of woal_switch_drv_mode() and
* remove_card(). Idea is to cleanup the software only.
* post reset: add_card()
*
* @return MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE
*/
static mlan_status woal_do_sdiommc_flr(moal_handle *handle, bool prepare,
bool flr_flag)
{
unsigned int i;
int index = 0;
mlan_status status = MLAN_STATUS_SUCCESS;
moal_private *priv = NULL;
int fw_serial_bkp = 0;
sdio_mmc_card *card = NULL;
ENTER();
if (!handle) {
PRINTM(MINFO, "\n Handle null during prepare=%d\n", prepare);
LEAVE();
return status;
}
card = (sdio_mmc_card *)handle->card;
if (MOAL_ACQ_SEMAPHORE_BLOCK(&AddRemoveCardSem))
goto exit_sem_err;
if (!prepare)
goto perform_init;
/* Reset all interfaces */
priv = woal_get_priv(handle, MLAN_BSS_ROLE_ANY);
mlan_disable_host_int(handle->pmlan_adapter);
woal_reset_intf(priv, MOAL_IOCTL_WAIT, MTRUE);
woal_clean_up(handle);
mlan_ioctl(handle->pmlan_adapter, NULL);
/* Shutdown firmware */
handle->init_wait_q_woken = MFALSE;
status = mlan_shutdown_fw(handle->pmlan_adapter);
if (status == MLAN_STATUS_PENDING)
wait_event_interruptible(handle->init_wait_q,
handle->init_wait_q_woken);
if (atomic_read(&handle->rx_pending) ||
atomic_read(&handle->tx_pending) ||
atomic_read(&handle->ioctl_pending)) {
PRINTM(MERROR,
"ERR: rx_pending=%d,tx_pending=%d,ioctl_pending=%d\n",
atomic_read(&handle->rx_pending),
atomic_read(&handle->tx_pending),
atomic_read(&handle->ioctl_pending));
}
unregister_inetaddr_notifier(&handle->woal_notifier);
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0)
#if IS_ENABLED(CONFIG_IPV6)
unregister_inet6addr_notifier(&handle->woal_inet6_notifier);
#endif
#endif
#ifdef WIFI_DIRECT_SUPPORT
#if defined(STA_CFG80211) && defined(UAP_CFG80211)
#if CFG80211_VERSION_CODE >= WIFI_DIRECT_KERNEL_VERSION
/* Remove virtual interface */
woal_remove_virtual_interface(handle);
#endif
#endif
#endif
/* Remove interface */
for (i = 0; i < handle->priv_num; i++)
woal_remove_interface(handle, i);
handle->priv_num = 0;
#if defined(STA_CFG80211) || defined(UAP_CFG80211)
/* Unregister wiphy device and free */
if (handle->wiphy) {
wiphy_unregister(handle->wiphy);
woal_cfg80211_free_bands(handle->wiphy);
wiphy_free(handle->wiphy);
handle->wiphy = NULL;
}
#endif
/* Unregister mlan */
if (handle->pmlan_adapter) {
mlan_unregister(handle->pmlan_adapter);
if (atomic_read(&handle->lock_count) ||
atomic_read(&handle->malloc_count) ||
atomic_read(&handle->mbufalloc_count)) {
PRINTM(MERROR,
"mlan has memory leak: lock_count=%d,"
" malloc_count=%d, mbufalloc_count=%d\n",
atomic_read(&handle->lock_count),
atomic_read(&handle->malloc_count),
atomic_read(&handle->mbufalloc_count));
}
handle->pmlan_adapter = NULL;
}
goto exit;
perform_init:
handle->priv_num = 0;
/* Init SW */
if (woal_init_sw(handle)) {
PRINTM(MFATAL, "Software Init Failed\n");
goto err_init_fw;
}
/* Init FW and HW */
/* Load wlan only binary */
if (flr_flag) {
fw_serial_bkp = moal_extflg_isset(handle, EXT_FW_SERIAL);
moal_extflg_clear(handle, EXT_FW_SERIAL);
woal_update_firmware_name(handle);
}
if (woal_init_fw(handle)) {
PRINTM(MFATAL, "Firmware Init Failed\n");
woal_sdiommc_reg_dbg(handle);
if (fw_serial_bkp)
moal_extflg_set(handle, EXT_FW_SERIAL);
goto err_init_fw;
}
if (flr_flag && fw_serial_bkp)
moal_extflg_set(handle, EXT_FW_SERIAL);
exit:
MOAL_REL_SEMAPHORE(&AddRemoveCardSem);
exit_sem_err:
LEAVE();
return status;
err_init_fw:
if (handle->is_fw_dump_timer_set) {
woal_cancel_timer(&handle->fw_dump_timer);
handle->is_fw_dump_timer_set = MFALSE;
}
if ((handle->hardware_status == HardwareStatusFwReady) ||
(handle->hardware_status == HardwareStatusReady)) {
PRINTM(MINFO, "shutdown mlan\n");
handle->init_wait_q_woken = MFALSE;
status = mlan_shutdown_fw(handle->pmlan_adapter);
if (status == MLAN_STATUS_PENDING)
wait_event_interruptible(handle->init_wait_q,
handle->init_wait_q_woken);
}
#ifdef ANDROID_KERNEL
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0)
wakeup_source_trash(&handle->ws);
#else
wake_lock_destroy(&handle->wake_lock);
#endif
#endif
#ifdef CONFIG_PROC_FS
woal_proc_exit(handle);
#endif
/* Unregister device */
PRINTM(MINFO, "unregister device\n");
woal_sdiommc_unregister_dev(handle);
handle->surprise_removed = MTRUE;
#ifdef REASSOCIATION
if (handle->reassoc_thread.pid)
wake_up_interruptible(&handle->reassoc_thread.wait_q);
/* waiting for main thread quit */
while (handle->reassoc_thread.pid)
woal_sched_timeout(2);
#endif /* REASSOCIATION */
if (moal_extflg_isset(handle, EXT_NAPI))
netif_napi_del(&handle->napi_rx);
woal_terminate_workqueue(handle);
woal_free_moal_handle(handle);
for (index = 0; index < MAX_MLAN_ADAPTER; index++) {
if (m_handle[index] == handle)
break;
}
if (index < MAX_MLAN_ADAPTER)
m_handle[index] = NULL;
card->handle = NULL;
MOAL_REL_SEMAPHORE(&AddRemoveCardSem);
LEAVE();
return (mlan_status)MLAN_STATUS_FAILURE;
}
/**
* @brief This function handle the sdio work
*
* @param WORK A pointer to work_struct
* @return N/A
*
*/
static void woal_sdiommc_work(struct work_struct *work)
{
sdio_mmc_card *card = container_of(work, sdio_mmc_card, reset_work);
moal_handle *handle = NULL;
moal_handle *ref_handle = NULL;
PRINTM(MMSG, "========START IN-BAND RESET===========\n");
handle = card->handle;
// handle-> mac0 , ref_handle->second mac
if (handle->pref_mac) {
if (handle->second_mac) {
handle = (moal_handle *)handle->pref_mac;
ref_handle = (moal_handle *)handle->pref_mac;
} else {
ref_handle = (moal_handle *)handle->pref_mac;
}
if (ref_handle) {
ref_handle->surprise_removed = MTRUE;
woal_clean_up(ref_handle);
mlan_ioctl(ref_handle->pmlan_adapter, NULL);
}
}
handle->surprise_removed = MTRUE;
handle->fw_reseting = MTRUE;
woal_do_sdiommc_flr(handle, true, true);
if (ref_handle) {
ref_handle->surprise_removed = MTRUE;
ref_handle->fw_reseting = MTRUE;
woal_do_sdiommc_flr(ref_handle, true, true);
}
if (woal_sdiommc_reset_fw(handle)) {
PRINTM(MERROR, "SDIO In-band Reset Fail\n");
goto done;
}
handle->surprise_removed = MFALSE;
if (MLAN_STATUS_SUCCESS == woal_do_sdiommc_flr(handle, false, true))
handle->fw_reseting = MFALSE;
else
handle = NULL;
if (ref_handle) {
ref_handle->surprise_removed = MFALSE;
if (MLAN_STATUS_SUCCESS ==
woal_do_sdiommc_flr(ref_handle, false, true))
ref_handle->fw_reseting = MFALSE;
}
card->work_flags = MFALSE;
done:
wifi_status = WIFI_STATUS_OK;
if (handle)
woal_send_auto_recovery_complete_event(handle);
PRINTM(MMSG, "========END IN-BAND RESET===========\n");
return;
}
/**
* @brief This function start reset_work
*
* @param handle A pointer to moal_handle structure
* @return MTRUE/MFALSE
*
*/
static void woal_sdiommc_card_reset(moal_handle *handle)
{
sdio_mmc_card *card = handle->card;
if (!card->work_flags) {
card->work_flags = MTRUE;
schedule_work(&card->reset_work);
}
}
static moal_if_ops sdiommc_ops = {
.register_dev = woal_sdiommc_register_dev,
.unregister_dev = woal_sdiommc_unregister_dev,
@ -2800,5 +3185,6 @@ static moal_if_ops sdiommc_ops = {
.dump_fw_info = woal_sdiommc_dump_fw_info,
.dump_reg_info = woal_sdiommc_dump_reg_info,
.reg_dbg = woal_sdiommc_reg_dbg,
.card_reset = woal_sdiommc_card_reset,
.is_second_mac = woal_sdiommc_is_second_mac,
};

View file

@ -55,6 +55,8 @@ Change log:
#endif /*defined(PCIE) || defined(SDIO)*/
#define NXP_ETH_P_WAPI 0x88B4
/********************************************************
Local Variables
********************************************************/
@ -107,7 +109,12 @@ mlan_status moal_malloc(t_void *pmoal, t_u32 size, t_u32 flag, t_u8 **ppbuf)
if (flag & MLAN_MEM_DMA)
mem_flag |= GFP_DMA;
}
*ppbuf = kzalloc(size, mem_flag);
if (flag & MLAN_MEM_FLAG_DIRTY)
*ppbuf = kmalloc(size, mem_flag);
else
*ppbuf = kzalloc(size, mem_flag);
if (*ppbuf == NULL) {
PRINTM(MERROR, "%s: allocate memory (%d bytes) failed!\n",
__func__, (int)size);
@ -241,7 +248,6 @@ mlan_status moal_mfree_consistent(t_void *pmoal, t_u32 size, t_u8 *pbuf,
if (!pbuf || !card)
return MLAN_STATUS_FAILURE;
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 18, 0)
dma_free_coherent(&card->dev->dev, size, pbuf, buf_pa);
#else
@ -272,7 +278,6 @@ mlan_status moal_map_memory(t_void *pmoal, t_u8 *pbuf, t_u64 *pbuf_pa,
if (!card)
return MLAN_STATUS_FAILURE;
/* Init memory to device */
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 18, 0)
dma = dma_map_single(&card->dev->dev, pbuf, size, flag);
@ -287,7 +292,6 @@ mlan_status moal_map_memory(t_void *pmoal, t_u8 *pbuf, t_u64 *pbuf_pa,
PRINTM(MERROR, "Tx ring: failed to dma_map_single\n");
return MLAN_STATUS_FAILURE;
}
*pbuf_pa = dma;
return MLAN_STATUS_SUCCESS;
}
@ -311,7 +315,6 @@ mlan_status moal_unmap_memory(t_void *pmoal, t_u8 *pbuf, t_u64 buf_pa,
if (!card)
return MLAN_STATUS_FAILURE;
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 18, 0)
dma_unmap_single(&card->dev->dev, buf_pa, size, flag);
#else
@ -2235,8 +2238,17 @@ mlan_status moal_recv_packet(t_void *pmoal, pmlan_buffer pmbuf)
MAC2STR(ethh->h_source));
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
priv->deauth_evt_cnt = 0;
#endif
} else if (ntohs(ethh->h_proto) == NXP_ETH_P_WAPI) {
PRINTM(MEVENT,
"wlan: %s Rx WAPI pkt from " MACSTR "\n",
priv->netdev->name,
MAC2STR(ethh->h_source));
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
priv->deauth_evt_cnt = 0;
#endif
}
#ifdef UAP_SUPPORT
#if defined(UAP_CFG80211) || defined(STA_CFG80211)
if (pmbuf->flags & MLAN_BUF_FLAG_EASYMESH) {
@ -2715,10 +2727,8 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent)
#if defined(STA_CFG80211)
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 0, 0)
struct station_info *sinfo = NULL;
#endif
#endif
char concat_str[64], peer_mac_str[20];
#if defined(STA_WEXT) || defined(UAP_WEXT)
#if defined(STA_SUPPORT) || defined(UAP_WEXT)
#if defined(UAP_SUPPORT) || defined(STA_WEXT)
@ -2826,33 +2836,6 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent)
#endif
switch (pmevent->event_id) {
#ifdef STA_SUPPORT
case MLAN_EVENT_ID_FW_ADHOC_LINK_SENSED:
priv->is_adhoc_link_sensed = MTRUE;
if (!netif_carrier_ok(priv->netdev))
netif_carrier_on(priv->netdev);
woal_wake_queue(priv->netdev);
#ifdef STA_WEXT
if (IS_STA_WEXT(cfg80211_wext))
woal_send_iwevcustom_event(priv,
CUS_EVT_ADHOC_LINK_SENSED);
#endif
woal_broadcast_event(priv, CUS_EVT_ADHOC_LINK_SENSED,
strlen(CUS_EVT_ADHOC_LINK_SENSED));
break;
case MLAN_EVENT_ID_FW_ADHOC_LINK_LOST:
woal_stop_queue(priv->netdev);
if (netif_carrier_ok(priv->netdev))
netif_carrier_off(priv->netdev);
priv->is_adhoc_link_sensed = MFALSE;
#ifdef STA_WEXT
if (IS_STA_WEXT(cfg80211_wext))
woal_send_iwevcustom_event(priv,
CUS_EVT_ADHOC_LINK_LOST);
#endif
woal_broadcast_event(priv, CUS_EVT_ADHOC_LINK_LOST,
strlen(CUS_EVT_ADHOC_LINK_LOST));
break;
case MLAN_EVENT_ID_DRV_CONNECTED:
#ifdef STA_WEXT
@ -4414,82 +4397,6 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent)
woal_broadcast_event(priv, pmevent->event_buf,
pmevent->event_len);
break;
case MLAN_EVENT_ID_FW_IBSS_CONNECT:
PRINTM(MINFO, "STA Connect attempt\n");
DBG_HEXDUMP(MCMD_D, "IBSS Connect", pmevent->event_buf,
pmevent->event_len);
memset(concat_str, 0, sizeof(concat_str));
snprintf(peer_mac_str, sizeof(peer_mac_str),
"%02x%02x%02x%02x%02x%02x", *(pmevent->event_buf + 6),
*(pmevent->event_buf + 7), *(pmevent->event_buf + 8),
*(pmevent->event_buf + 9), *(pmevent->event_buf + 10),
*(pmevent->event_buf + 11));
peer_mac_str[ETH_ALEN * 2] = '\0';
#if defined(STA_CFG80211)
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 0, 0)
if (IS_STA_CFG80211(cfg80211_wext)) {
sinfo = kzalloc(sizeof(struct station_info),
GFP_KERNEL);
if (sinfo) {
/* Notify user space about new station */
cfg80211_new_sta(priv->netdev,
pmevent->event_buf + 6, sinfo,
GFP_KERNEL);
kfree(sinfo);
} else {
PRINTM(MERROR,
"IBSS:Failed to allocate memory to new station");
}
}
#endif
#endif
snprintf(concat_str, sizeof(concat_str), "%s%s",
CUS_EVT_IBSS_CONNECT_ATTEMPT, peer_mac_str);
woal_broadcast_event(priv, concat_str, strlen(concat_str));
#ifdef STA_WEXT
#ifdef STA_SUPPORT
if (IS_STA_WEXT(cfg80211_wext)) {
woal_send_iwevcustom_event(priv, concat_str);
}
#endif
#endif
break;
case MLAN_EVENT_ID_FW_IBSS_DISCONNECT:
PRINTM(MINFO, "STA Disconnect attempt\n");
DBG_HEXDUMP(MCMD_D, "IBSS DisConnect", pmevent->event_buf,
pmevent->event_len);
memset(concat_str, 0, sizeof(concat_str));
snprintf(peer_mac_str, sizeof(peer_mac_str),
"%02x%02x%02x%02x%02x%02x", *(pmevent->event_buf + 6),
*(pmevent->event_buf + 7), *(pmevent->event_buf + 8),
*(pmevent->event_buf + 9), *(pmevent->event_buf + 10),
*(pmevent->event_buf + 11));
peer_mac_str[ETH_ALEN * 2] = '\0';
snprintf(concat_str, sizeof(concat_str), "%s%s",
CUS_EVT_IBSS_DISCONNECT_ATTEMPT, peer_mac_str);
woal_broadcast_event(priv, concat_str, strlen(concat_str));
#ifdef STA_WEXT
#ifdef STA_SUPPORT
if (IS_STA_WEXT(cfg80211_wext)) {
woal_send_iwevcustom_event(priv, concat_str);
}
#endif
#endif
#if defined(STA_CFG80211)
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 0, 0)
if (IS_STA_CFG80211(cfg80211_wext)) {
cfg80211_del_sta(priv->netdev, pmevent->event_buf + 6,
GFP_KERNEL);
}
#endif
#endif
break;
case MLAN_EVENT_ID_DRV_ASSOC_FAILURE_REPORT:
PRINTM(MINFO, "Assoc result\n");

View file

@ -53,6 +53,38 @@ static const u32 cfg80211_cipher_suites[] = {
#endif
};
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 1, 0)
static const u32 cfg80211_akm_suites[] = {
WLAN_AKM_SUITE_8021X,
WLAN_AKM_SUITE_PSK,
WLAN_AKM_SUITE_SAE,
WLAN_AKM_SUITE_FT_OVER_SAE,
WLAN_AKM_SUITE_8021X_SHA256,
WLAN_AKM_SUITE_PSK_SHA256,
WLAN_AKM_SUITE_TDLS,
WLAN_AKM_SUITE_FT_8021X,
WLAN_AKM_SUITE_FT_PSK,
WLAN_AKM_SUITE_8021X_SUITE_B,
WLAN_AKM_SUITE_8021X_SUITE_B_192,
WLAN_AKM_SUITE_FILS_SHA256,
WLAN_AKM_SUITE_FILS_SHA384,
WLAN_AKM_SUITE_FT_FILS_SHA256,
WLAN_AKM_SUITE_FT_FILS_SHA384,
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 7, 0)
WLAN_AKM_SUITE_OWE,
#endif
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 8, 0)
WLAN_AKM_SUITE_FT_PSK_SHA384,
WLAN_AKM_SUITE_PSK_SHA384,
WLAN_AKM_SUITE_FILS_SHA384,
WLAN_AKM_SUITE_FT_FILS_SHA384,
#endif
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 11, 0)
WLAN_AKM_SUITE_WFA_DPP,
#endif
};
#endif
#ifdef UAP_SUPPORT
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
static int woal_cfg80211_set_monitor_channel(struct wiphy *wiphy,
@ -1373,11 +1405,6 @@ int woal_set_rf_channel(moal_private *priv, struct ieee80211_channel *chan,
else {
config_bands = BAND_AN | BAND_A;
}
if (mode == MLAN_BSS_MODE_IBSS) {
radio_cfg->param.band_cfg.adhoc_start_band = config_bands;
radio_cfg->param.band_cfg.adhoc_channel =
ieee80211_frequency_to_channel(chan->center_freq);
}
status = woal_request_ioctl(priv, req, wait_option);
if (status != MLAN_STATUS_SUCCESS) {
@ -1386,18 +1413,6 @@ int woal_set_rf_channel(moal_private *priv, struct ieee80211_channel *chan,
}
woal_send_domain_info_cmd_fw(priv, wait_option);
PRINTM(MINFO, "Setting band %d, and mode = %d channel=%d\n",
config_bands, mode,
ieee80211_frequency_to_channel(chan->center_freq));
if (MLAN_STATUS_SUCCESS !=
woal_change_adhoc_chan(
priv, ieee80211_frequency_to_channel(chan->center_freq),
wait_option)) {
ret = -EFAULT;
goto done;
}
done:
if (status != MLAN_STATUS_PENDING)
kfree(req);
@ -1677,84 +1692,6 @@ done:
return ret;
}
/**
* @brief Informs the CFG802.11 subsystem of a new IBSS connection.
*
* The following information are sent to the CFG802.11 subsystem
* to register the new IBSS connection. If we do not register the
* new IBSS, a kernel panic will result.
* - MAC address
* - Capabilities
* - Beacon period
* - RSSI value
* - Channel
* - Supported rates IE
* - Extended capabilities IE
* - DS parameter set IE
* - HT Capability IE
* - Vendor Specific IE (221)
* - WPA IE
* - RSN IE
*
* @param priv A pointer to moal_private structure
* @param cahn A pointer to ieee80211_channel structure
* @param beacon_interval Beacon interval
*
* @return MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE
*/
static mlan_status woal_cfg80211_inform_ibss_bss(moal_private *priv,
struct ieee80211_channel *chan,
t_u16 beacon_interval)
{
mlan_status ret = MLAN_STATUS_SUCCESS;
mlan_bss_info bss_info;
mlan_ds_get_signal signal;
t_u8 ie_buf[MLAN_MAX_SSID_LENGTH + sizeof(IEEEtypes_Header_t)];
int ie_len = 0;
struct cfg80211_bss *bss = NULL;
ENTER();
ret = woal_get_bss_info(priv, MOAL_IOCTL_WAIT, &bss_info);
if (ret)
goto done;
memset(ie_buf, 0, sizeof(ie_buf));
ie_buf[0] = WLAN_EID_SSID;
ie_buf[1] = bss_info.ssid.ssid_len;
moal_memcpy_ext(priv->phandle, &ie_buf[sizeof(IEEEtypes_Header_t)],
&bss_info.ssid.ssid, bss_info.ssid.ssid_len,
sizeof(ie_buf) - sizeof(IEEEtypes_Header_t));
ie_len = ie_buf[1] + sizeof(IEEEtypes_Header_t);
/* Get signal information from the firmware */
memset(&signal, 0, sizeof(mlan_ds_get_signal));
if (MLAN_STATUS_SUCCESS !=
woal_get_signal_info(priv, MOAL_IOCTL_WAIT, &signal)) {
PRINTM(MERROR, "Error getting signal information\n");
ret = MLAN_STATUS_FAILURE;
goto done;
}
bss = cfg80211_inform_bss(priv->wdev->wiphy, chan,
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 18, 0)
CFG80211_BSS_FTYPE_UNKNOWN,
#endif
bss_info.bssid, 0, WLAN_CAPABILITY_IBSS,
beacon_interval, ie_buf, ie_len,
signal.bcn_rssi_avg, GFP_KERNEL);
if (bss)
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)
cfg80211_put_bss(priv->wdev->wiphy, bss);
#else
cfg80211_put_bss(bss);
#endif
done:
LEAVE();
return ret;
}
/**
* @brief Process country IE before assoicate
*
@ -2165,7 +2102,7 @@ static int woal_cfg80211_auth_scan(moal_private *priv,
* @return MLAN_STATUS_SUCCESS/MLAN_STATUS_PENDING
* -- success, otherwise fail
*/
mlan_status woal_request_set_host_mlme(moal_private *priv)
static mlan_status woal_request_set_host_mlme(moal_private *priv, t_u8 *bssid)
{
mlan_ioctl_req *req = NULL;
mlan_ds_bss *bss = NULL;
@ -2184,7 +2121,8 @@ mlan_status woal_request_set_host_mlme(moal_private *priv)
bss->sub_command = MLAN_OID_BSS_HOST_MLME;
req->req_id = MLAN_IOCTL_BSS;
req->action = MLAN_ACT_SET;
moal_memcpy_ext(priv->phandle, &bss->param.bssid, bssid,
MLAN_MAC_ADDR_LENGTH, MLAN_MAC_ADDR_LENGTH);
/* Send IOCTL request to MLAN */
status = woal_request_ioctl(priv, req, MOAL_IOCTL_WAIT);
done:
@ -2541,7 +2479,7 @@ static int woal_cfg80211_authenticate(struct wiphy *wiphy,
priv->auth_flag = HOST_MLME_AUTH_PENDING;
priv->auth_alg = woal_cpu_to_le16(auth_alg);
woal_save_auth_params(priv, req);
woal_request_set_host_mlme(priv);
woal_request_set_host_mlme(priv, req->bss->bssid);
PRINTM(MMSG, "wlan: HostMlme %s send auth to bssid " MACSTR "\n",
dev->name, MAC2STR(req->bss->bssid));
@ -2671,7 +2609,11 @@ void woal_host_mlme_process_assoc_resp(moal_private *priv,
struct cfg80211_bss *bss = NULL;
unsigned long flags;
u8 *assoc_req_buf = NULL;
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)
#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 7, 0)) || IMX_ANDROID_14)
struct cfg80211_rx_assoc_resp_data resp = {
.uapsd_queues = -1,
};
#elif ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || IMX_ANDROID_14)
struct cfg80211_rx_assoc_resp resp = {
.uapsd_queues = -1,
};
@ -2728,8 +2670,7 @@ void woal_host_mlme_process_assoc_resp(moal_private *priv,
assoc_req_buf =
assoc_info
->assoc_req_buf;
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)
#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || IMX_ANDROID_14)
resp.links[0].bss = bss;
resp.buf = assoc_info->assoc_resp_buf;
resp.len = assoc_info->assoc_resp_len;
@ -2854,8 +2795,8 @@ static int woal_cfg80211_associate(struct wiphy *wiphy, struct net_device *dev,
PRINTM(MINFO,
"wlan: HostMlme %s can not proceed with this Assoc, as Auth is not done yet \n",
priv->netdev->name);
ret = -EFAULT;
goto done;
LEAVE();
return -EFAULT;
}
priv->cfg_disconnect = MFALSE;
@ -3094,7 +3035,6 @@ done:
int woal_cfg80211_assoc(moal_private *priv, void *sme, t_u8 wait_option,
mlan_ds_misc_assoc_rsp *assoc_rsp)
{
struct cfg80211_ibss_params *ibss_param = NULL;
struct cfg80211_connect_params *conn_param = NULL;
mlan_802_11_ssid req_ssid;
mlan_ssid_bssid *ssid_bssid = NULL;
@ -3109,7 +3049,6 @@ int woal_cfg80211_assoc(moal_private *priv, void *sme, t_u8 wait_option,
t_u8 *ie = NULL;
int ie_len = 0;
struct ieee80211_channel *channel = NULL;
t_u16 beacon_interval = 0;
bool privacy;
struct cfg80211_bss *pub = NULL;
mlan_status status = MLAN_STATUS_SUCCESS;
@ -3128,25 +3067,7 @@ int woal_cfg80211_assoc(moal_private *priv, void *sme, t_u8 wait_option,
mode = woal_nl80211_iftype_to_mode(priv->wdev->iftype);
if (mode == MLAN_BSS_MODE_IBSS) {
ibss_param = (struct cfg80211_ibss_params *)sme;
ssid = (t_u8 *)ibss_param->ssid;
ssid_len = ibss_param->ssid_len;
bssid = (t_u8 *)ibss_param->bssid;
#if CFG80211_VERSION_CODE < KERNEL_VERSION(3, 8, 0)
channel = ibss_param->channel;
#else
channel = ibss_param->chandef.chan;
#endif
if (channel)
priv->phandle->band = channel->band;
if (ibss_param->ie_len)
ie = (t_u8 *)ibss_param->ie;
ie_len = ibss_param->ie_len;
beacon_interval = ibss_param->beacon_interval;
privacy = ibss_param->privacy;
} else {
{
conn_param = (struct cfg80211_connect_params *)sme;
ssid = (t_u8 *)conn_param->ssid;
ssid_len = conn_param->ssid_len;
@ -3344,56 +3265,6 @@ int woal_cfg80211_assoc(moal_private *priv, void *sme, t_u8 wait_option,
}
}
if (mode == MLAN_BSS_MODE_IBSS) {
mlan_ds_bss *bss = NULL;
/* Change beacon interval */
if ((beacon_interval < MLAN_MIN_BEACON_INTERVAL) ||
(beacon_interval > MLAN_MAX_BEACON_INTERVAL)) {
ret = -EINVAL;
goto done;
}
kfree(req);
req = NULL;
req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_bss));
if (req == NULL) {
ret = -ENOMEM;
goto done;
}
bss = (mlan_ds_bss *)req->pbuf;
req->req_id = MLAN_IOCTL_BSS;
req->action = MLAN_ACT_SET;
bss->sub_command = MLAN_OID_IBSS_BCN_INTERVAL;
bss->param.bcn_interval = beacon_interval;
status = woal_request_ioctl(priv, req, wait_option);
if (status != MLAN_STATUS_SUCCESS) {
ret = -EFAULT;
goto done;
}
/* "privacy" is set only for ad-hoc mode */
if (privacy) {
/*
* Keep MLAN_ENCRYPTION_MODE_WEP40 for now so that
* the firmware can find a matching network from the
* scan. cfg80211 does not give us the encryption
* mode at this stage so just setting it to wep here
*/
if (MLAN_STATUS_SUCCESS !=
woal_set_auth_mode(priv, wait_option,
MLAN_AUTH_MODE_OPEN)) {
ret = -EFAULT;
goto done;
}
wpa_enabled = 0;
ret = woal_cfg80211_set_auth(
priv, MLAN_ENCRYPTION_MODE_WEP104, wpa_enabled,
wait_option);
if (ret)
goto done;
}
}
moal_memcpy_ext(priv->phandle, &ssid_bssid->ssid, &req_ssid,
sizeof(mlan_802_11_ssid), sizeof(ssid_bssid->ssid));
if (bssid)
@ -3464,16 +3335,7 @@ int woal_cfg80211_assoc(moal_private *priv, void *sme, t_u8 wait_option,
goto done;
}
/* Inform the IBSS information to kernel, otherwise
* kernel will give a panic after successful assoc */
if (mode == MLAN_BSS_MODE_IBSS) {
if (MLAN_STATUS_SUCCESS !=
woal_cfg80211_inform_ibss_bss(priv, channel,
beacon_interval)) {
ret = -EFAULT;
goto done;
}
} else if (assoc_rsp) {
if (assoc_rsp) {
moal_memcpy_ext(priv->phandle, assoc_rsp,
&ssid_bssid->assoc_rsp,
sizeof(mlan_ds_misc_assoc_rsp),
@ -4202,10 +4064,9 @@ woal_cfg80211_reg_notifier(struct wiphy *wiphy,
t_u8 dfs_region = NXP_DFS_UNKNOWN;
ENTER();
priv = woal_get_priv(handle, MLAN_BSS_ROLE_ANY);
if (!priv) {
PRINTM(MFATAL, "Unable to get priv in %s()\n", __func__);
if (!priv || handle->driver_status || handle->surprise_removed) {
PRINTM(MERROR, "Blocking reg_notifier in %s()\n", __func__);
LEAVE();
#if CFG80211_VERSION_CODE < KERNEL_VERSION(3, 9, 0)
return -EINVAL;
@ -4526,7 +4387,7 @@ static int woal_cfg80211_scan(struct wiphy *wiphy, struct net_device *dev,
ENTER();
PRINTM(MINFO, "Received scan request on %s\n", dev->name);
if (priv->phandle->driver_status) {
if (priv->phandle->driver_status || priv->phandle->surprise_removed) {
PRINTM(MERROR,
"Block woal_cfg80211_scan in abnormal driver state\n");
LEAVE();
@ -4561,7 +4422,9 @@ static int woal_cfg80211_scan(struct wiphy *wiphy, struct net_device *dev,
priv->phandle->fake_scan_complete = priv->fake_scan_complete;
if (priv->fake_scan_complete) {
PRINTM(MEVENT, "fake scan complete flag is on\n");
spin_lock_irqsave(&priv->phandle->scan_req_lock, flags);
priv->phandle->scan_request = request;
spin_unlock_irqrestore(&priv->phandle->scan_req_lock, flags);
queue_delayed_work(priv->phandle->evt_workqueue,
&priv->phandle->scan_timeout_work,
msecs_to_jiffies(1000));
@ -4571,8 +4434,18 @@ static int woal_cfg80211_scan(struct wiphy *wiphy, struct net_device *dev,
if (MLAN_STATUS_SUCCESS ==
woal_get_bss_info(priv, MOAL_IOCTL_WAIT, &bss_info)) {
if (bss_info.scan_block) {
PRINTM(MEVENT, "Block scan in mlan module\n");
return -EAGAIN;
PRINTM(MEVENT,
"Block scan in mlan module for scan_request %p\n",
request);
spin_lock_irqsave(&priv->phandle->scan_req_lock, flags);
priv->phandle->fake_scan_complete = MTRUE;
priv->phandle->scan_request = request;
spin_unlock_irqrestore(&priv->phandle->scan_req_lock,
flags);
queue_delayed_work(priv->phandle->evt_workqueue,
&priv->phandle->scan_timeout_work,
msecs_to_jiffies(1000));
return ret;
}
}
if (priv->phandle->scan_request &&
@ -4583,7 +4456,6 @@ static int woal_cfg80211_scan(struct wiphy *wiphy, struct net_device *dev,
LEAVE();
return -EBUSY;
}
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
/* This check is to prevent the situation where
* new scan request comes while Auth is not completed */
@ -5538,7 +5410,7 @@ static int woal_cfg80211_disconnect(struct wiphy *wiphy, struct net_device *dev,
return 0;
}
#endif
if (priv->phandle->driver_status) {
if (priv->phandle->driver_status || priv->phandle->surprise_removed) {
PRINTM(MERROR,
"Block woal_cfg80211_disconnect in abnormal driver state\n");
LEAVE();
@ -5632,6 +5504,12 @@ static int woal_cfg80211_deauthenticate(struct wiphy *wiphy,
{
int ret = 0;
moal_private *priv = (moal_private *)woal_get_netdev_priv(dev);
if (priv->phandle->driver_status || priv->phandle->surprise_removed) {
PRINTM(MERROR,
"Block woal_cfg80211_deauthenticate in abnormal driver state\n");
return ret;
}
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
if (priv->host_mlme) {
priv->host_mlme = MFALSE;
@ -5673,6 +5551,13 @@ static int woal_cfg80211_disassociate(struct wiphy *wiphy,
{
int ret = 0;
moal_private *priv = (moal_private *)woal_get_netdev_priv(dev);
if (priv->phandle->driver_status || priv->phandle->surprise_removed) {
PRINTM(MERROR,
"Block woal_cfg80211_disassociate in abnormal driver state\n");
return ret;
}
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
if (priv->host_mlme) {
priv->host_mlme = MFALSE;
@ -5982,7 +5867,7 @@ static int woal_cfg80211_set_power_mgmt(struct wiphy *wiphy,
return -EFAULT;
}
if (priv->phandle->driver_status) {
if (priv->phandle->driver_status || priv->phandle->surprise_removed) {
PRINTM(MERROR,
"Block woal_cfg80211_set_power_mgmt in abnormal driver state\n");
LEAVE();
@ -8888,7 +8773,7 @@ int woal_cfg80211_update_ft_ies(struct wiphy *wiphy, struct net_device *dev,
assoc_rsp->assoc_resp_buf;
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(4, 12, 0)
#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || IMX_ANDROID_13 || \
IMX_ANDROID_12_BACKPORT)
IMX_ANDROID_14 || IMX_ANDROID_12_BACKPORT)
roam_info.links[0].bssid = priv->cfg_bssid;
#else
roam_info.bssid = priv->cfg_bssid;
@ -9362,7 +9247,7 @@ void woal_start_roaming(moal_private *priv)
#endif
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(4, 12, 0)
#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || IMX_ANDROID_13 || \
IMX_ANDROID_12_BACKPORT)
IMX_ANDROID_14 || IMX_ANDROID_12_BACKPORT)
roam_info.links[0].bssid = priv->cfg_bssid;
#else
roam_info.bssid = priv->cfg_bssid;
@ -9443,7 +9328,7 @@ int woal_cfg80211_uap_add_station(struct wiphy *wiphy, struct net_device *dev,
if (params->ext_capab_len)
req_len += sizeof(MrvlIEtypesHeader_t) + params->ext_capab_len;
#endif
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)
#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || IMX_ANDROID_14)
if (params->link_sta_params.supported_rates_len)
req_len += sizeof(MrvlIEtypesHeader_t) +
params->link_sta_params.supported_rates_len;
@ -9454,14 +9339,14 @@ int woal_cfg80211_uap_add_station(struct wiphy *wiphy, struct net_device *dev,
#endif
if (params->uapsd_queues || params->max_sp)
req_len += sizeof(MrvlIEtypesHeader_t) + sizeof(qosinfo);
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)
#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || IMX_ANDROID_14)
if (params->link_sta_params.ht_capa)
#else
if (params->ht_capa)
#endif
req_len += sizeof(MrvlIEtypesHeader_t) +
sizeof(struct ieee80211_ht_cap);
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)
#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || IMX_ANDROID_14)
if (params->link_sta_params.vht_capa)
#else
if (params->vht_capa)
@ -9469,7 +9354,7 @@ int woal_cfg80211_uap_add_station(struct wiphy *wiphy, struct net_device *dev,
req_len += sizeof(MrvlIEtypesHeader_t) +
sizeof(struct ieee80211_vht_cap);
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)
#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || IMX_ANDROID_14)
if (params->link_sta_params.opmode_notif_used)
req_len += sizeof(MrvlIEtypesHeader_t) + sizeof(u8);
#else
@ -9479,7 +9364,7 @@ int woal_cfg80211_uap_add_station(struct wiphy *wiphy, struct net_device *dev,
#endif
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(4, 20, 0)
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)
#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || IMX_ANDROID_14)
if (params->link_sta_params.he_capa_len)
req_len += sizeof(MrvlExtIEtypesHeader_t) +
params->link_sta_params.he_capa_len;
@ -9534,20 +9419,20 @@ int woal_cfg80211_uap_add_station(struct wiphy *wiphy, struct net_device *dev,
tlv = (MrvlIEtypes_Data_t *)pos;
}
#endif
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)
#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || IMX_ANDROID_14)
if (params->link_sta_params.supported_rates_len) {
#else
if (params->supported_rates_len) {
#endif
tlv = (MrvlIEtypes_Data_t *)pos;
tlv->header.type = SUPPORTED_RATES;
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)
#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || IMX_ANDROID_14)
tlv->header.len = params->link_sta_params.supported_rates_len;
#else
tlv->header.len = params->supported_rates_len;
#endif
moal_memcpy_ext(priv->phandle, tlv->data,
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)
#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || IMX_ANDROID_14)
params->link_sta_params.supported_rates,
tlv->header.len,
#else
@ -9571,7 +9456,7 @@ int woal_cfg80211_uap_add_station(struct wiphy *wiphy, struct net_device *dev,
sizeof(MrvlIEtypesHeader_t) + tlv->header.len;
tlv = (MrvlIEtypes_Data_t *)pos;
}
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)
#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || IMX_ANDROID_14)
if (params->link_sta_params.ht_capa) {
#else
if (params->ht_capa) {
@ -9579,7 +9464,7 @@ int woal_cfg80211_uap_add_station(struct wiphy *wiphy, struct net_device *dev,
tlv = (MrvlIEtypes_Data_t *)pos;
tlv->header.type = HT_CAPABILITY;
tlv->header.len = sizeof(struct ieee80211_ht_cap);
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)
#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || IMX_ANDROID_14)
moal_memcpy_ext(priv->phandle, tlv->data,
params->link_sta_params.ht_capa,
#else
@ -9591,7 +9476,7 @@ int woal_cfg80211_uap_add_station(struct wiphy *wiphy, struct net_device *dev,
sizeof(MrvlIEtypesHeader_t) + tlv->header.len;
tlv = (MrvlIEtypes_Data_t *)pos;
}
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)
#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || IMX_ANDROID_14)
if (params->link_sta_params.vht_capa) {
#else
if (params->vht_capa) {
@ -9599,7 +9484,7 @@ int woal_cfg80211_uap_add_station(struct wiphy *wiphy, struct net_device *dev,
tlv = (MrvlIEtypes_Data_t *)pos;
tlv->header.type = VHT_CAPABILITY;
tlv->header.len = sizeof(struct ieee80211_vht_cap);
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)
#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || IMX_ANDROID_14)
moal_memcpy_ext(priv->phandle, tlv->data,
params->link_sta_params.vht_capa,
#else
@ -9612,7 +9497,7 @@ int woal_cfg80211_uap_add_station(struct wiphy *wiphy, struct net_device *dev,
tlv = (MrvlIEtypes_Data_t *)pos;
}
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)
#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || IMX_ANDROID_14)
if (params->link_sta_params.opmode_notif_used) {
#else
if (params->opmode_notif_used) {
@ -9620,7 +9505,7 @@ int woal_cfg80211_uap_add_station(struct wiphy *wiphy, struct net_device *dev,
tlv = (MrvlIEtypes_Data_t *)pos;
tlv->header.type = OPER_MODE_NTF;
tlv->header.len = sizeof(u8);
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)
#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || IMX_ANDROID_14)
moal_memcpy_ext(priv->phandle, tlv->data,
&params->link_sta_params.opmode_notif,
#else
@ -9633,7 +9518,7 @@ int woal_cfg80211_uap_add_station(struct wiphy *wiphy, struct net_device *dev,
tlv = (MrvlIEtypes_Data_t *)pos;
}
#endif
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)
#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || IMX_ANDROID_14)
if (params->link_sta_params.he_capa_len) {
ext_tlv = (MrvlExtIEtypes_Data_t *)pos;
ext_tlv->header.type = EXTENSION;
@ -10237,6 +10122,11 @@ mlan_status woal_register_cfg80211(moal_private *priv)
/* Initialize cipher suits */
wiphy->cipher_suites = cfg80211_cipher_suites;
wiphy->n_cipher_suites = ARRAY_SIZE(cfg80211_cipher_suites);
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 1, 0)
wiphy->akm_suites = cfg80211_akm_suites;
wiphy->n_akm_suites = ARRAY_SIZE(cfg80211_akm_suites);
#endif
#ifdef UAP_CFG80211
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
@ -10254,6 +10144,7 @@ mlan_status woal_register_cfg80211(moal_private *priv)
#endif
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 0, 0)
cfg80211_iface_comb_ap_sta.num_different_channels = 1;
if ((moal_extflg_isset(priv->phandle, EXT_CFG80211_DRCS) &&
priv->phandle->card_info->drcs) ||
IS_CARD9098(priv->phandle->card_type) ||
@ -10404,6 +10295,7 @@ mlan_status woal_register_cfg80211(moal_private *priv)
}
#endif
#endif
/* Set struct moal_handle pointer in wiphy_priv */
wdev_priv = wiphy_priv(wiphy);
*(unsigned long *)wdev_priv = (unsigned long)priv->phandle;

View file

@ -662,20 +662,16 @@ static int woal_uap_sdcmd52_rw(struct net_device *dev, struct ifreq *req)
if (!param.action) {
PRINTM(MINFO, "Cmd52 read, func=%d, reg=0x%08X\n", func, reg);
#ifdef SDIO_MMC
sdio_claim_host(
((struct sdio_mmc_card *)priv->phandle->card)->func);
sdio_claim_host(((sdio_mmc_card *)priv->phandle->card)->func);
if (func)
data = sdio_readb(
((struct sdio_mmc_card *)priv->phandle->card)
->func,
((sdio_mmc_card *)priv->phandle->card)->func,
reg, &ret);
else
data = sdio_f0_readb(
((struct sdio_mmc_card *)priv->phandle->card)
->func,
((sdio_mmc_card *)priv->phandle->card)->func,
reg, &ret);
sdio_release_host(
((struct sdio_mmc_card *)priv->phandle->card)->func);
sdio_release_host(((sdio_mmc_card *)priv->phandle->card)->func);
if (ret) {
PRINTM(MERROR,
"sdio_readb: reading register 0x%X failed\n",
@ -698,20 +694,16 @@ static int woal_uap_sdcmd52_rw(struct net_device *dev, struct ifreq *req)
PRINTM(MINFO, "Cmd52 write, func=%d, reg=0x%08X, data=0x%02X\n",
func, reg, data);
#ifdef SDIO_MMC
sdio_claim_host(
((struct sdio_mmc_card *)priv->phandle->card)->func);
sdio_claim_host(((sdio_mmc_card *)priv->phandle->card)->func);
if (func)
sdio_writeb(
((struct sdio_mmc_card *)priv->phandle->card)
->func,
((sdio_mmc_card *)priv->phandle->card)->func,
data, reg, &ret);
else
sdio_f0_writeb(
((struct sdio_mmc_card *)priv->phandle->card)
->func,
((sdio_mmc_card *)priv->phandle->card)->func,
data, reg, &ret);
sdio_release_host(
((struct sdio_mmc_card *)priv->phandle->card)->func);
sdio_release_host(((sdio_mmc_card *)priv->phandle->card)->func);
if (ret) {
PRINTM(MERROR,
"sdio_writeb: writing register 0x%X failed\n",

View file

@ -107,7 +107,15 @@ static int woal_deauth_assoc_station(moal_private *priv, u8 *mac_addr,
LEAVE();
return -EINVAL;
}
#if KERNEL_VERSION(3, 8, 0) <= CFG80211_VERSION_CODE
if (moal_extflg_isset(priv->phandle, EXT_HOST_MLME))
cfg80211_del_sta(priv->netdev, mac_addr, GFP_KERNEL);
#endif
if (priv->media_connected == MFALSE) {
PRINTM(MINFO, "cfg80211: Media not connected!\n");
LEAVE();
return 0;
}
ioctl_req = (mlan_ioctl_req *)woal_alloc_mlan_ioctl_req(
sizeof(mlan_ds_get_info) +
(MAX_STA_LIST_IE_SIZE * MAX_NUM_CLIENTS));
@ -138,11 +146,6 @@ static int woal_deauth_assoc_station(moal_private *priv, u8 *mac_addr,
PRINTM(MMSG, "wlan: deauth station " MACSTR "\n",
MAC2STR(mac_addr));
ret = woal_deauth_station(priv, mac_addr, reason_code);
#if KERNEL_VERSION(3, 8, 0) <= CFG80211_VERSION_CODE
if (moal_extflg_isset(priv->phandle, EXT_HOST_MLME))
cfg80211_del_sta(priv->netdev, mac_addr,
GFP_KERNEL);
#endif
break;
}
}
@ -1741,6 +1744,11 @@ static int woal_cfg80211_add_vlan_vir_if(struct wiphy *wiphy,
struct net_device *ndev = NULL;
ENTER();
if (!priv) {
PRINTM(MFATAL, "Error:woal_get_priv returned NULL\n");
ret = -EFAULT;
goto fail;
}
ASSERT_RTNL();
#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 29)
#ifndef MAX_WMM_QUEUE
@ -2323,6 +2331,8 @@ void woal_remove_virtual_interface(moal_handle *handle)
moal_private *priv = NULL;
int vir_intf = 0;
int i = 0;
moal_handle *ref_handle = NULL;
int ref_vir_intf = 0;
#endif
ENTER();
rtnl_lock();
@ -2352,6 +2362,38 @@ void woal_remove_virtual_interface(moal_handle *handle)
}
}
}
if (handle->pref_mac) {
ref_handle = (moal_handle *)handle->pref_mac;
for (i = 0; i < ref_handle->priv_num; i++) {
priv = ref_handle->priv[i];
if (priv) {
if (priv->bss_virtual &&
priv->wdev->wiphy == handle->wiphy) {
PRINTM(MCMND,
"Remove virtual interfaces from pref mac %s\n",
priv->netdev->name);
#ifdef CONFIG_PROC_FS
/* Remove proc debug */
woal_debug_remove(priv);
woal_proc_remove(priv);
#endif /* CONFIG_PROC_FS */
netif_device_detach(priv->netdev);
if (priv->netdev->reg_state ==
NETREG_REGISTERED)
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)
cfg80211_unregister_netdevice(
priv->netdev);
#else
unregister_netdevice(
priv->netdev);
#endif
ref_handle->priv[i] = NULL;
ref_vir_intf++;
}
}
}
ref_handle->priv_num -= ref_vir_intf;
}
#endif
if (handle->mon_if) {
netif_device_detach(handle->mon_if->mon_ndev);
@ -2726,7 +2768,7 @@ int woal_cfg80211_add_beacon(struct wiphy *wiphy, struct net_device *dev,
ENTER();
PRINTM(MMSG, "wlan: Starting AP\n");
PRINTM(MMSG, "wlan: %s Starting AP\n", dev->name);
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(2, 6, 39)
/* cancel previous remain on channel to avoid firmware hang */
if (priv->phandle->remain_on_channel) {
@ -2859,7 +2901,7 @@ int woal_cfg80211_add_beacon(struct wiphy *wiphy, struct net_device *dev,
goto done;
}
}
PRINTM(MMSG, "wlan: AP started\n");
PRINTM(MMSG, "wlan: %s AP started\n", dev->name);
done:
LEAVE();
return ret;
@ -2969,7 +3011,7 @@ int woal_cfg80211_del_beacon(struct wiphy *wiphy, struct net_device *dev)
ENTER();
if (priv->phandle->driver_status) {
if (priv->phandle->driver_status || priv->phandle->surprise_removed) {
PRINTM(MERROR,
"Block woal_cfg80211_del_beacon in abnormal driver state\n");
LEAVE();
@ -2981,7 +3023,7 @@ int woal_cfg80211_del_beacon(struct wiphy *wiphy, struct net_device *dev)
#endif
#endif
priv->uap_host_based = MFALSE;
PRINTM(MMSG, "wlan: Stoping AP\n");
PRINTM(MMSG, "wlan: %s Stopping AP\n", dev->name);
#ifdef STA_SUPPORT
woal_cancel_scan(priv, MOAL_IOCTL_WAIT);
#endif
@ -3064,7 +3106,7 @@ int woal_cfg80211_del_beacon(struct wiphy *wiphy, struct net_device *dev)
priv->vlan_sta_list[i] = NULL;
}
#endif
PRINTM(MMSG, "wlan: AP stopped\n");
PRINTM(MMSG, "wlan: %s AP stopped\n", dev->name);
done:
LEAVE();
return ret;
@ -3202,12 +3244,6 @@ int woal_cfg80211_del_station(struct wiphy *wiphy, struct net_device *dev,
}
#endif
if (priv->media_connected == MFALSE) {
PRINTM(MINFO, "cfg80211: Media not connected!\n");
LEAVE();
return 0;
}
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)
if (param) {
mac_addr = param->mac;

View file

@ -239,31 +239,6 @@ static const struct iw_priv_args woal_private_args[] = {
Local Functions
********************************************************/
/**
* @brief Compare two SSIDs
*
* @param ssid1 A pointer to ssid to compare
* @param ssid2 A pointer to ssid to compare
*
* @return 0--ssid is same, otherwise is different
*/
static t_s32 woal_ssid_cmp(mlan_802_11_ssid *ssid1, mlan_802_11_ssid *ssid2)
{
ENTER();
if (!ssid1 || !ssid2) {
LEAVE();
return -1;
}
if (ssid1->ssid_len != ssid2->ssid_len) {
LEAVE();
return -1;
}
LEAVE();
return memcmp(ssid1->ssid, ssid2->ssid, ssid1->ssid_len);
}
/**
* @brief Sort Channels
*
@ -466,10 +441,6 @@ static int woal_set_freq(struct net_device *dev, struct iw_request_info *info,
ret = -EFAULT;
goto done;
}
if (MLAN_STATUS_SUCCESS !=
woal_change_adhoc_chan(priv, bss->param.bss_chan.channel,
MOAL_IOCTL_WAIT))
ret = -EFAULT;
done:
if (status != MLAN_STATUS_PENDING)
@ -562,9 +533,6 @@ static int woal_set_bss_mode(struct net_device *dev,
case IW_MODE_INFRA:
bss->param.bss_mode = MLAN_BSS_MODE_INFRA;
break;
case IW_MODE_ADHOC:
bss->param.bss_mode = MLAN_BSS_MODE_IBSS;
break;
case IW_MODE_AUTO:
bss->param.bss_mode = MLAN_BSS_MODE_AUTO;
break;
@ -2984,7 +2952,6 @@ static int woal_get_scan(struct net_device *dev, struct iw_request_info *info,
mlan_scan_resp scan_resp;
mlan_bss_info bss_info;
BSSDescriptor_t *scan_table;
mlan_ds_get_signal rssi;
t_u16 buf_size = 16 + 256 * 2;
char *buf = NULL;
char *ptr;
@ -3090,9 +3057,7 @@ static int woal_get_scan(struct net_device *dev, struct iw_request_info *info,
/* Add mode */
iwe.cmd = SIOCGIWMODE;
if (scan_table[i].bss_mode == MLAN_BSS_MODE_IBSS)
iwe.u.mode = IW_MODE_ADHOC;
else if (scan_table[i].bss_mode == MLAN_BSS_MODE_INFRA)
if (scan_table[i].bss_mode == MLAN_BSS_MODE_INFRA)
iwe.u.mode = IW_MODE_MASTER;
else
iwe.u.mode = IW_MODE_AUTO;
@ -3119,18 +3084,6 @@ static int woal_get_scan(struct net_device *dev, struct iw_request_info *info,
else
iwe.u.qual.noise = bss_info.bcn_nf_last;
if ((bss_info.bss_mode == MLAN_BSS_MODE_IBSS) &&
!woal_ssid_cmp(&bss_info.ssid, &scan_table[i].ssid) &&
bss_info.adhoc_state == ADHOC_STARTED) {
memset(&rssi, 0, sizeof(mlan_ds_get_signal));
if (MLAN_STATUS_SUCCESS !=
woal_get_signal_info(priv, MOAL_IOCTL_WAIT,
&rssi)) {
ret = -EFAULT;
break;
}
iwe.u.qual.level = rssi.data_rssi_avg;
}
iwe.u.qual.qual =
woal_rssi_to_quality((t_s16)(iwe.u.qual.level - 0x100));
iwe.len = IW_EV_QUAL_LEN;
@ -3170,15 +3123,6 @@ static int woal_get_scan(struct net_device *dev, struct iw_request_info *info,
current_val, end_buf,
&iwe, iwe.len);
}
if ((bss_info.bss_mode == MLAN_BSS_MODE_IBSS) &&
!woal_ssid_cmp(&bss_info.ssid, &scan_table[i].ssid) &&
bss_info.adhoc_state == ADHOC_STARTED) {
iwe.u.bitrate.value = 22 * 500000;
iwe.len = IW_EV_PARAM_LEN;
current_val = IWE_STREAM_ADD_VALUE(info, current_ev,
current_val, end_buf,
&iwe, iwe.len);
}
/* Check if an event is added */
if ((unsigned int)(current_val - current_ev) >= IW_EV_PARAM_LEN)