mirror of
https://github.com/torvalds/linux.git
synced 2024-11-21 11:31:31 +00:00
Staging driver changes for 6.8-rc1
Here is the "big" set of staging driver changes for 6.8-rc1. It's not really that big this release cycle, not much happened except for 186 patches of coding style cleanups. The majority was in the rtl8192e driver, but there are other smaller changes in a few other staging drivers, full details in the shortlog. All of these have been in linux-next for a while with no reported issues. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- iG0EABECAC0WIQT0tgzFv3jCIUoxPcsxR9QN2y37KQUCZaeSDA8cZ3JlZ0Brcm9h aC5jb20ACgkQMUfUDdst+ynrUwCdH3CCHL2IxeW2/qPMKU/cE8KWYWcAmwZe7Rvi Jdfezr0N6ObpYaNWWndv =4kLy -----END PGP SIGNATURE----- Merge tag 'staging-6.8-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging Pull staging driver updates from Greg KH: "Here is the "big" set of staging driver changes for 6.8-rc1. It's not really that big this release cycle, not much happened except for 186 patches of coding style cleanups. The majority was in the rtl8192e driver, but there are other smaller changes in a few other staging drivers, full details in the shortlog. All of these have been in linux-next for a while with no reported issues" * tag 'staging-6.8-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging: (186 commits) Staging: rtl8192e: Rename variable OpMode Staging: rtl8192e: Rename variable bIsAggregateFrame Staging: rtl8192e: Rename function rtllib_EnableNetMonitorMode() Staging: rtl8192e: Rename variable NumRxOkInPeriod Staging: rtl8192e: Rename variable NumTxOkInPeriod Staging: rtl8192e: Rename variable bUsed staging: vme_user: print more detailed infomation when an error occurs Staging: rtl8192e: Rename function rtllib_DisableNetMonitorMode() Staging: rtl8192e: Rename variable bInitState Staging: rtl8192e: Rename variable skb_waitQ Staging: rtl8192e: Rename variable BasicRate Staging: rtl8192e: Rename variable QueryRate Staging: rtl8192e: Rename function rtllib_TURBO_Info() Staging: rtl8192e: Rename function rtllib_WMM_Info() Staging: rtl8192e: Rename function rtllib_MFIE_Grate() Staging: rtl8192e: Rename function rtllib_MFIE_Brate() Staging: rtl8192e: Fixup statement broken across 2 lines in rtllib_softmac_new_net() Staging: rtl8192e: Fixup statement broken across 2 lines in rtllib_softmac_xmit() Staging: rtl8192e: Fix function definition broken across multiple lines Staging: rtl8192e: Fix statement broken across 2 lines in rtllib_rx_assoc_resp() ...
This commit is contained in:
commit
e38f734add
8
CREDITS
8
CREDITS
@ -3950,6 +3950,10 @@ S: 21513 Conradia Ct
|
||||
S: Cupertino, CA 95014
|
||||
S: USA
|
||||
|
||||
N: Manohar Vanga
|
||||
E: manohar.vanga@gmail.com
|
||||
D: VME subsystem maintainer
|
||||
|
||||
N: Thibaut Varène
|
||||
E: hacks+kernel@slashdirt.org
|
||||
W: http://hacks.slashdirt.org/
|
||||
@ -4050,6 +4054,10 @@ D: Fixes for the NE/2-driver
|
||||
D: Miscellaneous MCA-support
|
||||
D: Cleanup of the Config-files
|
||||
|
||||
N: Martyn Welch
|
||||
E: martyn@welchs.me.uk
|
||||
D: VME subsystem maintainer
|
||||
|
||||
N: Matt Welsh
|
||||
E: mdw@metalab.unc.edu
|
||||
W: http://www.cs.berkeley.edu/~mdw
|
||||
|
@ -23407,11 +23407,8 @@ F: include/linux/vmalloc.h
|
||||
F: mm/vmalloc.c
|
||||
|
||||
VME SUBSYSTEM
|
||||
M: Martyn Welch <martyn@welchs.me.uk>
|
||||
M: Manohar Vanga <manohar.vanga@gmail.com>
|
||||
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Odd fixes
|
||||
S: Orphan
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git
|
||||
F: Documentation/driver-api/vme.rst
|
||||
F: drivers/staging/vme_user/
|
||||
|
@ -1,6 +1,5 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
rtllib-objs := \
|
||||
dot11d.o \
|
||||
rtllib_module.o \
|
||||
rtllib_rx.o \
|
||||
rtllib_tx.o \
|
||||
|
@ -1,165 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/******************************************************************************
|
||||
* Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
|
||||
*
|
||||
* Contact Information:
|
||||
* wlanfae <wlanfae@realtek.com>
|
||||
******************************************************************************/
|
||||
#include "dot11d.h"
|
||||
|
||||
struct channel_list {
|
||||
u8 channel[32];
|
||||
u8 len;
|
||||
};
|
||||
|
||||
static struct channel_list channel_array[] = {
|
||||
{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 36, 40, 44, 48, 52, 56, 60, 64,
|
||||
149, 153, 157, 161, 165}, 24},
|
||||
{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}, 11},
|
||||
{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 36, 40, 44, 48, 52, 56,
|
||||
60, 64}, 21},
|
||||
{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}, 13},
|
||||
{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}, 13},
|
||||
{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 36, 40, 44, 48, 52,
|
||||
56, 60, 64}, 22},
|
||||
{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 36, 40, 44, 48, 52,
|
||||
56, 60, 64}, 22},
|
||||
{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}, 13},
|
||||
{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 36, 40, 44, 48, 52,
|
||||
56, 60, 64}, 22},
|
||||
{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 36, 40, 44, 48, 52,
|
||||
56, 60, 64}, 22},
|
||||
{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}, 14},
|
||||
{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}, 13},
|
||||
{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 36, 40, 44, 48, 52,
|
||||
56, 60, 64}, 21}
|
||||
};
|
||||
|
||||
void dot11d_init(struct rtllib_device *ieee)
|
||||
{
|
||||
struct rt_dot11d_info *dot11d_info = GET_DOT11D_INFO(ieee);
|
||||
|
||||
dot11d_info->enabled = false;
|
||||
|
||||
dot11d_info->state = DOT11D_STATE_NONE;
|
||||
dot11d_info->country_len = 0;
|
||||
memset(dot11d_info->channel_map, 0, MAX_CHANNEL_NUMBER + 1);
|
||||
memset(dot11d_info->max_tx_power_list, 0xFF, MAX_CHANNEL_NUMBER + 1);
|
||||
RESET_CIE_WATCHDOG(ieee);
|
||||
}
|
||||
EXPORT_SYMBOL(dot11d_init);
|
||||
|
||||
void dot11d_channel_map(u8 channel_plan, struct rtllib_device *ieee)
|
||||
{
|
||||
int i, max_chan = 14, min_chan = 1;
|
||||
|
||||
ieee->global_domain = false;
|
||||
|
||||
if (channel_array[channel_plan].len != 0) {
|
||||
memset(GET_DOT11D_INFO(ieee)->channel_map, 0,
|
||||
sizeof(GET_DOT11D_INFO(ieee)->channel_map));
|
||||
for (i = 0; i < channel_array[channel_plan].len; i++) {
|
||||
if (channel_array[channel_plan].channel[i] < min_chan ||
|
||||
channel_array[channel_plan].channel[i] > max_chan)
|
||||
break;
|
||||
GET_DOT11D_INFO(ieee)->channel_map[channel_array
|
||||
[channel_plan].channel[i]] = 1;
|
||||
}
|
||||
}
|
||||
|
||||
switch (channel_plan) {
|
||||
case COUNTRY_CODE_GLOBAL_DOMAIN:
|
||||
ieee->global_domain = true;
|
||||
for (i = 12; i <= 14; i++)
|
||||
GET_DOT11D_INFO(ieee)->channel_map[i] = 2;
|
||||
ieee->bss_start_channel = 10;
|
||||
break;
|
||||
|
||||
case COUNTRY_CODE_WORLD_WIDE_13:
|
||||
for (i = 12; i <= 13; i++)
|
||||
GET_DOT11D_INFO(ieee)->channel_map[i] = 2;
|
||||
ieee->bss_start_channel = 10;
|
||||
break;
|
||||
|
||||
default:
|
||||
ieee->bss_start_channel = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(dot11d_channel_map);
|
||||
|
||||
void dot11d_reset(struct rtllib_device *ieee)
|
||||
{
|
||||
struct rt_dot11d_info *dot11d_info = GET_DOT11D_INFO(ieee);
|
||||
u32 i;
|
||||
|
||||
memset(dot11d_info->channel_map, 0, MAX_CHANNEL_NUMBER + 1);
|
||||
memset(dot11d_info->max_tx_power_list, 0xFF, MAX_CHANNEL_NUMBER + 1);
|
||||
for (i = 1; i <= 11; i++)
|
||||
(dot11d_info->channel_map)[i] = 1;
|
||||
for (i = 12; i <= 14; i++)
|
||||
(dot11d_info->channel_map)[i] = 2;
|
||||
dot11d_info->state = DOT11D_STATE_NONE;
|
||||
dot11d_info->country_len = 0;
|
||||
RESET_CIE_WATCHDOG(ieee);
|
||||
}
|
||||
|
||||
void dot11d_update_country(struct rtllib_device *dev, u8 *address,
|
||||
u16 country_len, u8 *country)
|
||||
{
|
||||
struct rt_dot11d_info *dot11d_info = GET_DOT11D_INFO(dev);
|
||||
u8 i, j, number_of_triples, max_channel_number;
|
||||
struct chnl_txpow_triple *triple;
|
||||
|
||||
memset(dot11d_info->channel_map, 0, MAX_CHANNEL_NUMBER + 1);
|
||||
memset(dot11d_info->max_tx_power_list, 0xFF, MAX_CHANNEL_NUMBER + 1);
|
||||
max_channel_number = 0;
|
||||
number_of_triples = (country_len - 3) / 3;
|
||||
triple = (struct chnl_txpow_triple *)(country + 3);
|
||||
for (i = 0; i < number_of_triples; i++) {
|
||||
if (max_channel_number >= triple->first_channel) {
|
||||
netdev_info(dev->dev,
|
||||
"%s: Invalid country IE, skip it......1\n",
|
||||
__func__);
|
||||
return;
|
||||
}
|
||||
if (MAX_CHANNEL_NUMBER < (triple->first_channel +
|
||||
triple->num_channels)) {
|
||||
netdev_info(dev->dev,
|
||||
"%s: Invalid country IE, skip it......2\n",
|
||||
__func__);
|
||||
return;
|
||||
}
|
||||
|
||||
for (j = 0; j < triple->num_channels; j++) {
|
||||
dot11d_info->channel_map[triple->first_channel + j] = 1;
|
||||
dot11d_info->max_tx_power_list[triple->first_channel + j] =
|
||||
triple->max_tx_power;
|
||||
max_channel_number = triple->first_channel + j;
|
||||
}
|
||||
|
||||
triple = (struct chnl_txpow_triple *)((u8 *)triple + 3);
|
||||
}
|
||||
|
||||
UPDATE_CIE_SRC(dev, address);
|
||||
|
||||
dot11d_info->country_len = country_len;
|
||||
memcpy(dot11d_info->country_buffer, country, country_len);
|
||||
dot11d_info->state = DOT11D_STATE_LEARNED;
|
||||
}
|
||||
|
||||
void dot11d_scan_complete(struct rtllib_device *dev)
|
||||
{
|
||||
struct rt_dot11d_info *dot11d_info = GET_DOT11D_INFO(dev);
|
||||
|
||||
switch (dot11d_info->state) {
|
||||
case DOT11D_STATE_LEARNED:
|
||||
dot11d_info->state = DOT11D_STATE_DONE;
|
||||
break;
|
||||
case DOT11D_STATE_DONE:
|
||||
dot11d_reset(dev);
|
||||
break;
|
||||
case DOT11D_STATE_NONE:
|
||||
break;
|
||||
}
|
||||
}
|
@ -1,84 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/******************************************************************************
|
||||
* Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
|
||||
*
|
||||
* Contact Information:
|
||||
* wlanfae <wlanfae@realtek.com>
|
||||
******************************************************************************/
|
||||
#ifndef __INC_DOT11D_H
|
||||
#define __INC_DOT11D_H
|
||||
|
||||
#include "rtllib.h"
|
||||
|
||||
struct chnl_txpow_triple {
|
||||
u8 first_channel;
|
||||
u8 num_channels;
|
||||
u8 max_tx_power;
|
||||
};
|
||||
|
||||
enum dot11d_state {
|
||||
DOT11D_STATE_NONE = 0,
|
||||
DOT11D_STATE_LEARNED,
|
||||
DOT11D_STATE_DONE,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct rt_dot11d_info * @country_len: value greater than 0 if
|
||||
* @country_buffer contains valid country information element.
|
||||
* @channel_map: holds channel values
|
||||
* 0 - invalid,
|
||||
* 1 - valid (active scan),
|
||||
* 2 - valid (passive scan)
|
||||
* @country_src_addr - Source AP of the country IE
|
||||
*/
|
||||
|
||||
struct rt_dot11d_info {
|
||||
bool enabled;
|
||||
|
||||
u16 country_len;
|
||||
u8 country_buffer[MAX_IE_LEN];
|
||||
u8 country_src_addr[6];
|
||||
u8 country_watchdog;
|
||||
|
||||
u8 channel_map[MAX_CHANNEL_NUMBER + 1];
|
||||
u8 max_tx_power_list[MAX_CHANNEL_NUMBER + 1];
|
||||
|
||||
enum dot11d_state state;
|
||||
};
|
||||
|
||||
static inline void copy_mac_addr(unsigned char *des, unsigned char *src)
|
||||
{
|
||||
memcpy(des, src, 6);
|
||||
}
|
||||
|
||||
#define GET_DOT11D_INFO(__ieee_dev) \
|
||||
((struct rt_dot11d_info *)((__ieee_dev)->dot11d_info))
|
||||
|
||||
#define IS_DOT11D_ENABLE(__ieee_dev) \
|
||||
(GET_DOT11D_INFO(__ieee_dev)->enabled)
|
||||
#define IS_COUNTRY_IE_VALID(__ieee_dev) \
|
||||
(GET_DOT11D_INFO(__ieee_dev)->country_len > 0)
|
||||
|
||||
#define IS_EQUAL_CIE_SRC(__ieee_dev, __address) \
|
||||
ether_addr_equal_unaligned( \
|
||||
GET_DOT11D_INFO(__ieee_dev)->country_src_addr, __address)
|
||||
#define UPDATE_CIE_SRC(__ieee_dev, __address) \
|
||||
copy_mac_addr(GET_DOT11D_INFO(__ieee_dev)->country_src_addr, __address)
|
||||
|
||||
#define GET_CIE_WATCHDOG(__ieee_dev) \
|
||||
(GET_DOT11D_INFO(__ieee_dev)->country_watchdog)
|
||||
static inline void RESET_CIE_WATCHDOG(struct rtllib_device *__ieee_dev)
|
||||
{
|
||||
GET_CIE_WATCHDOG(__ieee_dev) = 0;
|
||||
}
|
||||
|
||||
#define UPDATE_CIE_WATCHDOG(__ieee_dev) (++GET_CIE_WATCHDOG(__ieee_dev))
|
||||
|
||||
void dot11d_init(struct rtllib_device *dev);
|
||||
void dot11d_channel_map(u8 channel_plan, struct rtllib_device *ieee);
|
||||
void dot11d_reset(struct rtllib_device *dev);
|
||||
void dot11d_update_country(struct rtllib_device *dev, u8 *address,
|
||||
u16 country_len, u8 *country);
|
||||
void dot11d_scan_complete(struct rtllib_device *dev);
|
||||
|
||||
#endif
|
@ -63,9 +63,9 @@ bool rtl92e_send_cmd_pkt(struct net_device *dev, u32 type, const void *data,
|
||||
|
||||
if (type == DESC_PACKET_TYPE_INIT &&
|
||||
(!priv->rtllib->check_nic_enough_desc(dev, TXCMD_QUEUE) ||
|
||||
(!skb_queue_empty(&priv->rtllib->skb_waitQ[TXCMD_QUEUE])) ||
|
||||
(!skb_queue_empty(&priv->rtllib->skb_waitq[TXCMD_QUEUE])) ||
|
||||
(priv->rtllib->queue_stop))) {
|
||||
skb_queue_tail(&priv->rtllib->skb_waitQ[TXCMD_QUEUE],
|
||||
skb_queue_tail(&priv->rtllib->skb_waitq[TXCMD_QUEUE],
|
||||
skb);
|
||||
} else {
|
||||
priv->rtllib->softmac_hard_start_xmit(skb, dev);
|
||||
|
@ -51,12 +51,12 @@ void rtl92e_set_reg(struct net_device *dev, u8 variable, u8 *val)
|
||||
|
||||
case HW_VAR_MEDIA_STATUS:
|
||||
{
|
||||
enum rt_op_mode OpMode = *((enum rt_op_mode *)(val));
|
||||
enum rt_op_mode op_mode = *((enum rt_op_mode *)(val));
|
||||
u8 btMsr = rtl92e_readb(dev, MSR);
|
||||
|
||||
btMsr &= 0xfc;
|
||||
|
||||
switch (OpMode) {
|
||||
switch (op_mode) {
|
||||
case RT_OP_MODE_INFRASTRUCTURE:
|
||||
btMsr |= MSR_INFRA;
|
||||
break;
|
||||
@ -261,7 +261,6 @@ static void _rtl92e_read_eeprom_info(struct net_device *dev)
|
||||
priv->eeprom_customer_id = usValue & 0xff;
|
||||
usValue = rtl92e_eeprom_read(dev,
|
||||
EEPROM_ICVersion_ChannelPlan >> 1);
|
||||
priv->eeprom_chnl_plan = usValue & 0xff;
|
||||
IC_Version = (usValue & 0xff00) >> 8;
|
||||
|
||||
ICVer8192 = IC_Version & 0xf;
|
||||
@ -283,7 +282,6 @@ static void _rtl92e_read_eeprom_info(struct net_device *dev)
|
||||
priv->eeprom_vid = 0;
|
||||
priv->eeprom_did = 0;
|
||||
priv->eeprom_customer_id = 0;
|
||||
priv->eeprom_chnl_plan = 0;
|
||||
}
|
||||
|
||||
if (!priv->autoload_fail_flag) {
|
||||
@ -387,25 +385,15 @@ static void _rtl92e_read_eeprom_info(struct net_device *dev)
|
||||
|
||||
rtl92e_init_adaptive_rate(dev);
|
||||
|
||||
priv->chnl_plan = priv->eeprom_chnl_plan;
|
||||
|
||||
switch (priv->eeprom_customer_id) {
|
||||
case EEPROM_CID_NetCore:
|
||||
priv->customer_id = RT_CID_819X_NETCORE;
|
||||
break;
|
||||
case EEPROM_CID_TOSHIBA:
|
||||
priv->customer_id = RT_CID_TOSHIBA;
|
||||
if (priv->eeprom_chnl_plan & 0x80)
|
||||
priv->chnl_plan = priv->eeprom_chnl_plan & 0x7f;
|
||||
else
|
||||
priv->chnl_plan = 0x0;
|
||||
break;
|
||||
}
|
||||
|
||||
if (priv->chnl_plan > CHANNEL_PLAN_LEN - 1)
|
||||
priv->chnl_plan = 0;
|
||||
priv->chnl_plan = COUNTRY_CODE_WORLD_WIDE_13;
|
||||
|
||||
if (priv->eeprom_vid == 0x1186 && priv->eeprom_did == 0x3304)
|
||||
priv->rtllib->bSupportRemoteWakeUp = true;
|
||||
else
|
||||
@ -891,11 +879,11 @@ void rtl92e_fill_tx_desc(struct net_device *dev, struct tx_desc *pdesc,
|
||||
memset(pTxFwInfo, 0, sizeof(struct tx_fwinfo_8190pci));
|
||||
pTxFwInfo->TxHT = (cb_desc->data_rate & 0x80) ? 1 : 0;
|
||||
pTxFwInfo->TxRate = _rtl92e_rate_mgn_to_hw(cb_desc->data_rate);
|
||||
pTxFwInfo->EnableCPUDur = cb_desc->bTxEnableFwCalcDur;
|
||||
pTxFwInfo->EnableCPUDur = cb_desc->tx_enable_fw_calc_dur;
|
||||
pTxFwInfo->Short = _rtl92e_query_is_short(pTxFwInfo->TxHT,
|
||||
pTxFwInfo->TxRate, cb_desc);
|
||||
|
||||
if (cb_desc->bAMPDUEnable) {
|
||||
if (cb_desc->ampdu_enable) {
|
||||
pTxFwInfo->AllowAggregation = 1;
|
||||
pTxFwInfo->RxMF = cb_desc->ampdu_factor;
|
||||
pTxFwInfo->RxAMD = cb_desc->ampdu_density;
|
||||
@ -1685,8 +1673,6 @@ bool rtl92e_get_rx_stats(struct net_device *dev, struct rtllib_rx_stats *stats,
|
||||
stats->TimeStampLow = pDrvInfo->TSFL;
|
||||
stats->TimeStampHigh = rtl92e_readl(dev, TSFR + 4);
|
||||
|
||||
rtl92e_update_rx_pkt_timestamp(dev, stats);
|
||||
|
||||
if ((stats->RxBufShift + stats->RxDrvInfoSize) > 0)
|
||||
stats->bShift = 1;
|
||||
|
||||
@ -1707,12 +1693,12 @@ void rtl92e_stop_adapter(struct net_device *dev, bool reset)
|
||||
{
|
||||
struct r8192_priv *priv = rtllib_priv(dev);
|
||||
int i;
|
||||
u8 OpMode;
|
||||
u8 op_mode;
|
||||
u8 u1bTmp;
|
||||
u32 ulRegRead;
|
||||
|
||||
OpMode = RT_OP_MODE_NO_LINK;
|
||||
priv->rtllib->SetHwRegHandler(dev, HW_VAR_MEDIA_STATUS, &OpMode);
|
||||
op_mode = RT_OP_MODE_NO_LINK;
|
||||
priv->rtllib->SetHwRegHandler(dev, HW_VAR_MEDIA_STATUS, &op_mode);
|
||||
|
||||
if (!priv->rtllib->bSupportRemoteWakeUp) {
|
||||
u1bTmp = 0x0;
|
||||
@ -1742,7 +1728,7 @@ void rtl92e_stop_adapter(struct net_device *dev, bool reset)
|
||||
}
|
||||
|
||||
for (i = 0; i < MAX_QUEUE_SIZE; i++)
|
||||
skb_queue_purge(&priv->rtllib->skb_waitQ[i]);
|
||||
skb_queue_purge(&priv->rtllib->skb_waitq[i]);
|
||||
|
||||
skb_queue_purge(&priv->skb_queue);
|
||||
}
|
||||
@ -1767,20 +1753,17 @@ void rtl92e_update_ratr_table(struct net_device *dev)
|
||||
ratr_value &= 0x00000FF7;
|
||||
break;
|
||||
case WIRELESS_MODE_N_24G:
|
||||
if (ieee->ht_info->peer_mimo_ps == 0)
|
||||
ratr_value &= 0x0007F007;
|
||||
else
|
||||
ratr_value &= 0x000FF007;
|
||||
ratr_value &= 0x000FF007;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
ratr_value &= 0x0FFFFFFF;
|
||||
if (ieee->ht_info->cur_tx_bw40mhz &&
|
||||
ieee->ht_info->bCurShortGI40MHz)
|
||||
ieee->ht_info->cur_short_gi_40mhz)
|
||||
ratr_value |= 0x80000000;
|
||||
else if (!ieee->ht_info->cur_tx_bw40mhz &&
|
||||
ieee->ht_info->bCurShortGI20MHz)
|
||||
ieee->ht_info->cur_short_gi_20mhz)
|
||||
ratr_value |= 0x80000000;
|
||||
rtl92e_writel(dev, RATR0 + rate_index * 4, ratr_value);
|
||||
rtl92e_writeb(dev, UFWP, 1);
|
||||
@ -1814,7 +1797,7 @@ rtl92e_init_variables(struct net_device *dev)
|
||||
IMR_MGNTDOK | IMR_COMDOK | IMR_HIGHDOK |
|
||||
IMR_BDOK | IMR_RXCMDOK | IMR_TIMEOUT0 |
|
||||
IMR_RDU | IMR_RXFOVW | IMR_TXFOVW |
|
||||
IMR_BcnInt | IMR_TBDOK | IMR_TBDER);
|
||||
IMR_TBDOK | IMR_TBDER);
|
||||
|
||||
priv->bfirst_after_down = false;
|
||||
}
|
||||
|
@ -671,16 +671,16 @@ static void _rtl92e_phy_switch_channel_work_item(struct net_device *dev)
|
||||
_rtl92e_phy_switch_channel(dev, priv->chan);
|
||||
}
|
||||
|
||||
u8 rtl92e_set_channel(struct net_device *dev, u8 channel)
|
||||
void rtl92e_set_channel(struct net_device *dev, u8 channel)
|
||||
{
|
||||
struct r8192_priv *priv = rtllib_priv(dev);
|
||||
|
||||
if (!priv->up) {
|
||||
netdev_err(dev, "%s(): Driver is not initialized\n", __func__);
|
||||
return false;
|
||||
return;
|
||||
}
|
||||
if (priv->sw_chnl_in_progress)
|
||||
return false;
|
||||
return;
|
||||
|
||||
switch (priv->rtllib->mode) {
|
||||
case WIRELESS_MODE_B:
|
||||
@ -688,7 +688,7 @@ u8 rtl92e_set_channel(struct net_device *dev, u8 channel)
|
||||
netdev_warn(dev,
|
||||
"Channel %d not available in 802.11b.\n",
|
||||
channel);
|
||||
return false;
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case WIRELESS_MODE_G:
|
||||
@ -697,7 +697,7 @@ u8 rtl92e_set_channel(struct net_device *dev, u8 channel)
|
||||
netdev_warn(dev,
|
||||
"Channel %d not available in 802.11g.\n",
|
||||
channel);
|
||||
return false;
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -714,7 +714,7 @@ u8 rtl92e_set_channel(struct net_device *dev, u8 channel)
|
||||
if (priv->up)
|
||||
_rtl92e_phy_switch_channel_work_item(dev);
|
||||
priv->sw_chnl_in_progress = false;
|
||||
return true;
|
||||
return;
|
||||
}
|
||||
|
||||
static void _rtl92e_cck_tx_power_track_bw_switch_tssi(struct net_device *dev)
|
||||
|
@ -41,7 +41,7 @@ void rtl92e_get_tx_power(struct net_device *dev);
|
||||
void rtl92e_set_tx_power(struct net_device *dev, u8 channel);
|
||||
u8 rtl92e_config_rf_path(struct net_device *dev, enum rf90_radio_path eRFPath);
|
||||
|
||||
u8 rtl92e_set_channel(struct net_device *dev, u8 channel);
|
||||
void rtl92e_set_channel(struct net_device *dev, u8 channel);
|
||||
void rtl92e_set_bw_mode(struct net_device *dev,
|
||||
enum ht_channel_width bandwidth,
|
||||
enum ht_extchnl_offset Offset);
|
||||
|
@ -226,16 +226,6 @@ static void _rtl92e_tx_timeout(struct net_device *dev, unsigned int txqueue)
|
||||
netdev_info(dev, "TXTIMEOUT");
|
||||
}
|
||||
|
||||
static void _rtl92e_set_chan(struct net_device *dev, short ch)
|
||||
{
|
||||
struct r8192_priv *priv = rtllib_priv(dev);
|
||||
|
||||
priv->chan = ch;
|
||||
|
||||
if (priv->rf_set_chan)
|
||||
priv->rf_set_chan(dev, priv->chan);
|
||||
}
|
||||
|
||||
static void _rtl92e_update_cap(struct net_device *dev, u16 cap)
|
||||
{
|
||||
struct r8192_priv *priv = rtllib_priv(dev);
|
||||
@ -297,7 +287,6 @@ static void _rtl92e_update_beacon(void *data)
|
||||
if (ieee->ht_info->current_ht_support)
|
||||
HT_update_self_and_peer_setting(ieee, net);
|
||||
ieee->ht_info->current_rt2rt_long_slot_time = net->bssht.bd_rt2rt_long_slot_time;
|
||||
ieee->ht_info->RT2RT_HT_Mode = net->bssht.rt2rt_ht_mode;
|
||||
_rtl92e_update_cap(dev, net->capability);
|
||||
}
|
||||
|
||||
@ -426,38 +415,6 @@ static int _rtl92e_handle_assoc_response(struct net_device *dev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void _rtl92e_prepare_beacon(struct tasklet_struct *t)
|
||||
{
|
||||
struct r8192_priv *priv = from_tasklet(priv, t,
|
||||
irq_prepare_beacon_tasklet);
|
||||
struct net_device *dev = priv->rtllib->dev;
|
||||
struct sk_buff *pskb = NULL, *pnewskb = NULL;
|
||||
struct cb_desc *tcb_desc = NULL;
|
||||
struct rtl8192_tx_ring *ring = NULL;
|
||||
struct tx_desc *pdesc = NULL;
|
||||
|
||||
ring = &priv->tx_ring[BEACON_QUEUE];
|
||||
pskb = __skb_dequeue(&ring->queue);
|
||||
kfree_skb(pskb);
|
||||
|
||||
pnewskb = rtllib_get_beacon(priv->rtllib);
|
||||
if (!pnewskb)
|
||||
return;
|
||||
|
||||
tcb_desc = (struct cb_desc *)(pnewskb->cb + 8);
|
||||
tcb_desc->queue_index = BEACON_QUEUE;
|
||||
tcb_desc->data_rate = 2;
|
||||
tcb_desc->ratr_index = 7;
|
||||
tcb_desc->tx_dis_rate_fallback = 1;
|
||||
tcb_desc->tx_use_drv_assinged_rate = 1;
|
||||
skb_push(pnewskb, priv->rtllib->tx_headroom);
|
||||
|
||||
pdesc = &ring->desc[0];
|
||||
rtl92e_fill_tx_desc(dev, pdesc, tcb_desc, pnewskb);
|
||||
__skb_queue_tail(&ring->queue, pnewskb);
|
||||
pdesc->OWN = 1;
|
||||
}
|
||||
|
||||
void rtl92e_config_rate(struct net_device *dev, u16 *rate_config)
|
||||
{
|
||||
struct r8192_priv *priv = rtllib_priv(dev);
|
||||
@ -685,7 +642,7 @@ static void _rtl92e_init_priv_handler(struct net_device *dev)
|
||||
struct r8192_priv *priv = rtllib_priv(dev);
|
||||
|
||||
priv->rtllib->softmac_hard_start_xmit = _rtl92e_hard_start_xmit;
|
||||
priv->rtllib->set_chan = _rtl92e_set_chan;
|
||||
priv->rtllib->set_chan = rtl92e_set_channel;
|
||||
priv->rtllib->link_change = rtl92e_link_change;
|
||||
priv->rtllib->softmac_data_hard_start_xmit = _rtl92e_hard_data_xmit;
|
||||
priv->rtllib->check_nic_enough_desc = _rtl92e_check_nic_enough_desc;
|
||||
@ -694,7 +651,6 @@ static void _rtl92e_init_priv_handler(struct net_device *dev)
|
||||
priv->rtllib->set_wireless_mode = rtl92e_set_wireless_mode;
|
||||
priv->rtllib->leisure_ps_leave = rtl92e_leisure_ps_leave;
|
||||
priv->rtllib->set_bw_mode_handler = rtl92e_set_bw_mode;
|
||||
priv->rf_set_chan = rtl92e_set_channel;
|
||||
|
||||
priv->rtllib->sta_wake_up = rtl92e_hw_wakeup;
|
||||
priv->rtllib->enter_sleep_state = rtl92e_enter_sleep;
|
||||
@ -767,7 +723,7 @@ static void _rtl92e_init_priv_variable(struct net_device *dev)
|
||||
skb_queue_head_init(&priv->skb_queue);
|
||||
|
||||
for (i = 0; i < MAX_QUEUE_SIZE; i++)
|
||||
skb_queue_head_init(&priv->rtllib->skb_waitQ[i]);
|
||||
skb_queue_head_init(&priv->rtllib->skb_waitq[i]);
|
||||
}
|
||||
|
||||
static void _rtl92e_init_priv_lock(struct r8192_priv *priv)
|
||||
@ -796,8 +752,6 @@ static void _rtl92e_init_priv_task(struct net_device *dev)
|
||||
INIT_DELAYED_WORK(&priv->rtllib->hw_sleep_wq, (void *)rtl92e_hw_sleep_wq);
|
||||
tasklet_setup(&priv->irq_rx_tasklet, _rtl92e_irq_rx_tasklet);
|
||||
tasklet_setup(&priv->irq_tx_tasklet, _rtl92e_irq_tx_tasklet);
|
||||
tasklet_setup(&priv->irq_prepare_beacon_tasklet,
|
||||
_rtl92e_prepare_beacon);
|
||||
}
|
||||
|
||||
static short _rtl92e_get_channel_map(struct net_device *dev)
|
||||
@ -806,13 +760,6 @@ static short _rtl92e_get_channel_map(struct net_device *dev)
|
||||
|
||||
struct r8192_priv *priv = rtllib_priv(dev);
|
||||
|
||||
if (priv->chnl_plan >= COUNTRY_CODE_MAX) {
|
||||
netdev_info(dev,
|
||||
"rtl819x_init:Error channel plan! Set to default.\n");
|
||||
priv->chnl_plan = COUNTRY_CODE_FCC;
|
||||
}
|
||||
dot11d_init(priv->rtllib);
|
||||
dot11d_channel_map(priv->chnl_plan, priv->rtllib);
|
||||
for (i = 1; i <= 11; i++)
|
||||
(priv->rtllib->active_channel_map)[i] = 1;
|
||||
(priv->rtllib->active_channel_map)[12] = 2;
|
||||
@ -1024,21 +971,21 @@ static void _rtl92e_watchdog_wq_cb(void *data)
|
||||
}
|
||||
}
|
||||
if ((ieee->link_state == MAC80211_LINKED) && (ieee->iw_mode == IW_MODE_INFRA)) {
|
||||
if (ieee->link_detect_info.NumRxOkInPeriod > 100 ||
|
||||
ieee->link_detect_info.NumTxOkInPeriod > 100)
|
||||
if (ieee->link_detect_info.num_rx_ok_in_period > 100 ||
|
||||
ieee->link_detect_info.num_tx_ok_in_period > 100)
|
||||
bBusyTraffic = true;
|
||||
|
||||
if (ieee->link_detect_info.NumRxOkInPeriod > 4000 ||
|
||||
ieee->link_detect_info.NumTxOkInPeriod > 4000) {
|
||||
if (ieee->link_detect_info.num_rx_ok_in_period > 4000 ||
|
||||
ieee->link_detect_info.num_tx_ok_in_period > 4000) {
|
||||
bHigherBusyTraffic = true;
|
||||
if (ieee->link_detect_info.NumRxOkInPeriod > 5000)
|
||||
if (ieee->link_detect_info.num_rx_ok_in_period > 5000)
|
||||
bHigherBusyRxTraffic = true;
|
||||
else
|
||||
bHigherBusyRxTraffic = false;
|
||||
}
|
||||
|
||||
if (((ieee->link_detect_info.NumRxUnicastOkInPeriod +
|
||||
ieee->link_detect_info.NumTxOkInPeriod) > 8) ||
|
||||
ieee->link_detect_info.num_tx_ok_in_period) > 8) ||
|
||||
(ieee->link_detect_info.NumRxUnicastOkInPeriod > 2))
|
||||
bEnterPS = false;
|
||||
else
|
||||
@ -1056,8 +1003,8 @@ static void _rtl92e_watchdog_wq_cb(void *data)
|
||||
rtl92e_leisure_ps_leave(dev);
|
||||
}
|
||||
|
||||
ieee->link_detect_info.NumRxOkInPeriod = 0;
|
||||
ieee->link_detect_info.NumTxOkInPeriod = 0;
|
||||
ieee->link_detect_info.num_rx_ok_in_period = 0;
|
||||
ieee->link_detect_info.num_tx_ok_in_period = 0;
|
||||
ieee->link_detect_info.NumRxUnicastOkInPeriod = 0;
|
||||
ieee->link_detect_info.bBusyTraffic = bBusyTraffic;
|
||||
|
||||
@ -1240,7 +1187,7 @@ static int _rtl92e_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
tcb_desc->ratr_index = 7;
|
||||
tcb_desc->tx_dis_rate_fallback = 1;
|
||||
tcb_desc->tx_use_drv_assinged_rate = 1;
|
||||
tcb_desc->bTxEnableFwCalcDur = 1;
|
||||
tcb_desc->tx_enable_fw_calc_dur = 1;
|
||||
skb_push(skb, priv->rtllib->tx_headroom);
|
||||
ret = _rtl92e_tx(dev, skb);
|
||||
if (ret != 0)
|
||||
@ -1484,17 +1431,6 @@ void rtl92e_reset_desc_ring(struct net_device *dev)
|
||||
spin_unlock_irqrestore(&priv->irq_th_lock, flags);
|
||||
}
|
||||
|
||||
void rtl92e_update_rx_pkt_timestamp(struct net_device *dev,
|
||||
struct rtllib_rx_stats *stats)
|
||||
{
|
||||
struct r8192_priv *priv = rtllib_priv(dev);
|
||||
|
||||
if (stats->bIsAMPDU && !stats->bFirstMPDU)
|
||||
stats->mac_time = priv->last_rx_desc_tsf;
|
||||
else
|
||||
priv->last_rx_desc_tsf = stats->mac_time;
|
||||
}
|
||||
|
||||
long rtl92e_translate_to_dbm(struct r8192_priv *priv, u8 signal_strength_index)
|
||||
{
|
||||
long signal_power;
|
||||
@ -1638,9 +1574,9 @@ static void _rtl92e_tx_resume(struct net_device *dev)
|
||||
|
||||
for (queue_index = BK_QUEUE;
|
||||
queue_index < MAX_QUEUE_SIZE; queue_index++) {
|
||||
while ((!skb_queue_empty(&ieee->skb_waitQ[queue_index])) &&
|
||||
while ((!skb_queue_empty(&ieee->skb_waitq[queue_index])) &&
|
||||
(priv->rtllib->check_nic_enough_desc(dev, queue_index) > 0)) {
|
||||
skb = skb_dequeue(&ieee->skb_waitQ[queue_index]);
|
||||
skb = skb_dequeue(&ieee->skb_waitq[queue_index]);
|
||||
ieee->softmac_data_hard_start_xmit(skb, dev, 0);
|
||||
}
|
||||
}
|
||||
@ -1827,9 +1763,6 @@ static irqreturn_t _rtl92e_irq(int irq, void *netdev)
|
||||
if (inta & IMR_ROK)
|
||||
tasklet_schedule(&priv->irq_rx_tasklet);
|
||||
|
||||
if (inta & IMR_BcnInt)
|
||||
tasklet_schedule(&priv->irq_prepare_beacon_tasklet);
|
||||
|
||||
if (inta & IMR_RDU) {
|
||||
rtl92e_writel(dev, INTA_MASK,
|
||||
rtl92e_readl(dev, INTA_MASK) & ~IMR_RDU);
|
||||
@ -1840,22 +1773,22 @@ static irqreturn_t _rtl92e_irq(int irq, void *netdev)
|
||||
tasklet_schedule(&priv->irq_rx_tasklet);
|
||||
|
||||
if (inta & IMR_BKDOK) {
|
||||
priv->rtllib->link_detect_info.NumTxOkInPeriod++;
|
||||
priv->rtllib->link_detect_info.num_tx_ok_in_period++;
|
||||
_rtl92e_tx_isr(dev, BK_QUEUE);
|
||||
}
|
||||
|
||||
if (inta & IMR_BEDOK) {
|
||||
priv->rtllib->link_detect_info.NumTxOkInPeriod++;
|
||||
priv->rtllib->link_detect_info.num_tx_ok_in_period++;
|
||||
_rtl92e_tx_isr(dev, BE_QUEUE);
|
||||
}
|
||||
|
||||
if (inta & IMR_VIDOK) {
|
||||
priv->rtllib->link_detect_info.NumTxOkInPeriod++;
|
||||
priv->rtllib->link_detect_info.num_tx_ok_in_period++;
|
||||
_rtl92e_tx_isr(dev, VI_QUEUE);
|
||||
}
|
||||
|
||||
if (inta & IMR_VODOK) {
|
||||
priv->rtllib->link_detect_info.NumTxOkInPeriod++;
|
||||
priv->rtllib->link_detect_info.num_tx_ok_in_period++;
|
||||
_rtl92e_tx_isr(dev, VO_QUEUE);
|
||||
}
|
||||
|
||||
|
@ -34,8 +34,6 @@
|
||||
|
||||
#include "../rtllib.h"
|
||||
|
||||
#include "../dot11d.h"
|
||||
|
||||
#include "r8192E_firmware.h"
|
||||
#include "r8192E_hw.h"
|
||||
|
||||
@ -219,7 +217,6 @@ struct r8192_priv {
|
||||
|
||||
struct tasklet_struct irq_rx_tasklet;
|
||||
struct tasklet_struct irq_tx_tasklet;
|
||||
struct tasklet_struct irq_prepare_beacon_tasklet;
|
||||
|
||||
struct mutex wx_mutex;
|
||||
struct mutex rf_mutex;
|
||||
@ -228,8 +225,6 @@ struct r8192_priv {
|
||||
struct rt_stats stats;
|
||||
struct iw_statistics wstats;
|
||||
|
||||
u8 (*rf_set_chan)(struct net_device *dev, u8 ch);
|
||||
|
||||
struct rx_desc *rx_ring;
|
||||
struct sk_buff *rx_buf[MAX_RX_COUNT];
|
||||
dma_addr_t rx_ring_dma;
|
||||
@ -237,8 +232,6 @@ struct r8192_priv {
|
||||
int rxringcount;
|
||||
u16 rxbuffersize;
|
||||
|
||||
u64 last_rx_desc_tsf;
|
||||
|
||||
u32 receive_config;
|
||||
u8 retry_data;
|
||||
u8 retry_rts;
|
||||
@ -286,7 +279,6 @@ struct r8192_priv {
|
||||
u16 eeprom_vid;
|
||||
u16 eeprom_did;
|
||||
u8 eeprom_customer_id;
|
||||
u16 eeprom_chnl_plan;
|
||||
|
||||
u8 eeprom_tx_pwr_level_cck[14];
|
||||
u8 eeprom_tx_pwr_level_ofdm24g[14];
|
||||
@ -312,7 +304,6 @@ struct r8192_priv {
|
||||
|
||||
bool tx_pwr_data_read_from_eeprom;
|
||||
|
||||
u16 chnl_plan;
|
||||
u8 hw_rf_off_action;
|
||||
|
||||
bool rf_change_in_progress;
|
||||
@ -396,8 +387,6 @@ void rtl92e_irq_enable(struct net_device *dev);
|
||||
void rtl92e_config_rate(struct net_device *dev, u16 *rate_config);
|
||||
void rtl92e_irq_disable(struct net_device *dev);
|
||||
|
||||
void rtl92e_update_rx_pkt_timestamp(struct net_device *dev,
|
||||
struct rtllib_rx_stats *stats);
|
||||
long rtl92e_translate_to_dbm(struct r8192_priv *priv, u8 signal_strength_index);
|
||||
void rtl92e_update_rx_statistics(struct r8192_priv *priv,
|
||||
struct rtllib_rx_stats *pprevious_stats);
|
||||
|
@ -287,9 +287,9 @@ static void _rtl92e_dm_check_rate_adaptive(struct net_device *dev)
|
||||
|
||||
if (priv->rtllib->link_state == MAC80211_LINKED) {
|
||||
bshort_gi_enabled = (ht_info->cur_tx_bw40mhz &&
|
||||
ht_info->bCurShortGI40MHz) ||
|
||||
ht_info->cur_short_gi_40mhz) ||
|
||||
(!ht_info->cur_tx_bw40mhz &&
|
||||
ht_info->bCurShortGI20MHz);
|
||||
ht_info->cur_short_gi_20mhz);
|
||||
|
||||
pra->upper_rssi_threshold_ratr =
|
||||
(pra->upper_rssi_threshold_ratr & (~BIT(31))) |
|
||||
@ -1142,7 +1142,7 @@ static void _rtl92e_dm_check_edca_turbo(struct net_device *dev)
|
||||
if (priv->bis_cur_rdlstate ||
|
||||
!priv->bcurrent_turbo_EDCA) {
|
||||
rtl92e_writel(dev, EDCAPARA_BE,
|
||||
edca_setting_UL[ht_info->IOTPeer]);
|
||||
edca_setting_UL[ht_info->iot_peer]);
|
||||
priv->bis_cur_rdlstate = false;
|
||||
}
|
||||
} else {
|
||||
@ -1150,10 +1150,10 @@ static void _rtl92e_dm_check_edca_turbo(struct net_device *dev)
|
||||
!priv->bcurrent_turbo_EDCA) {
|
||||
if (priv->rtllib->mode == WIRELESS_MODE_G)
|
||||
rtl92e_writel(dev, EDCAPARA_BE,
|
||||
edca_setting_DL_GMode[ht_info->IOTPeer]);
|
||||
edca_setting_DL_GMode[ht_info->iot_peer]);
|
||||
else
|
||||
rtl92e_writel(dev, EDCAPARA_BE,
|
||||
edca_setting_DL[ht_info->IOTPeer]);
|
||||
edca_setting_DL[ht_info->iot_peer]);
|
||||
priv->bis_cur_rdlstate = true;
|
||||
}
|
||||
}
|
||||
@ -1164,17 +1164,17 @@ static void _rtl92e_dm_check_edca_turbo(struct net_device *dev)
|
||||
!priv->bcurrent_turbo_EDCA) {
|
||||
if (priv->rtllib->mode == WIRELESS_MODE_G)
|
||||
rtl92e_writel(dev, EDCAPARA_BE,
|
||||
edca_setting_DL_GMode[ht_info->IOTPeer]);
|
||||
edca_setting_DL_GMode[ht_info->iot_peer]);
|
||||
else
|
||||
rtl92e_writel(dev, EDCAPARA_BE,
|
||||
edca_setting_DL[ht_info->IOTPeer]);
|
||||
edca_setting_DL[ht_info->iot_peer]);
|
||||
priv->bis_cur_rdlstate = true;
|
||||
}
|
||||
} else {
|
||||
if (priv->bis_cur_rdlstate ||
|
||||
!priv->bcurrent_turbo_EDCA) {
|
||||
rtl92e_writel(dev, EDCAPARA_BE,
|
||||
edca_setting_UL[ht_info->IOTPeer]);
|
||||
edca_setting_UL[ht_info->iot_peer]);
|
||||
priv->bis_cur_rdlstate = false;
|
||||
}
|
||||
}
|
||||
@ -1217,7 +1217,7 @@ static void _rtl92e_dm_cts_to_self(struct net_device *dev)
|
||||
ht_info->iot_action &= ~HT_IOT_ACT_FORCED_CTS2SELF;
|
||||
return;
|
||||
}
|
||||
if (ht_info->IOTPeer == HT_IOT_PEER_BROADCOM) {
|
||||
if (ht_info->iot_peer == HT_IOT_PEER_BROADCOM) {
|
||||
curTxOkCnt = priv->stats.txbytesunicast - lastTxOkCnt;
|
||||
curRxOkCnt = priv->stats.rxbytesunicast - lastRxOkCnt;
|
||||
if (curRxOkCnt > 4 * curTxOkCnt)
|
||||
@ -1713,7 +1713,7 @@ static void _rtl92e_dm_check_fsync(struct net_device *dev)
|
||||
static u8 reg_c38_State = RegC38_Default;
|
||||
|
||||
if (priv->rtllib->link_state == MAC80211_LINKED &&
|
||||
priv->rtllib->ht_info->IOTPeer == HT_IOT_PEER_BROADCOM) {
|
||||
priv->rtllib->ht_info->iot_peer == HT_IOT_PEER_BROADCOM) {
|
||||
if (priv->rtllib->bfsync_enable == 0) {
|
||||
switch (priv->rtllib->fsync_state) {
|
||||
case Default_Fsync:
|
||||
@ -1819,7 +1819,7 @@ static void _rtl92e_dm_dynamic_tx_power(struct net_device *dev)
|
||||
priv->dynamic_tx_low_pwr = false;
|
||||
return;
|
||||
}
|
||||
if ((priv->rtllib->ht_info->IOTPeer == HT_IOT_PEER_ATHEROS) &&
|
||||
if ((priv->rtllib->ht_info->iot_peer == HT_IOT_PEER_ATHEROS) &&
|
||||
(priv->rtllib->mode == WIRELESS_MODE_G)) {
|
||||
txhipower_threshold = TX_POWER_ATHEROAP_THRESH_HIGH;
|
||||
txlowpower_threshold = TX_POWER_ATHEROAP_THRESH_LOW;
|
||||
|
@ -158,28 +158,6 @@ static int _rtl92e_wx_set_mode(struct net_device *dev,
|
||||
return ret;
|
||||
}
|
||||
|
||||
struct iw_range_with_scan_capa {
|
||||
/* Informative stuff (to choose between different interface) */
|
||||
__u32 throughput; /* To give an idea... */
|
||||
/* In theory this value should be the maximum benchmarked
|
||||
* TCP/IP throughput, because with most of these devices the
|
||||
* bit rate is meaningless (overhead an co) to estimate how
|
||||
* fast the connection will go and pick the fastest one.
|
||||
* I suggest people to play with Netperf or any benchmark...
|
||||
*/
|
||||
|
||||
/* NWID (or domain id) */
|
||||
__u32 min_nwid; /* Minimal NWID we are able to set */
|
||||
__u32 max_nwid; /* Maximal NWID we are able to set */
|
||||
|
||||
/* Old Frequency (backward compat - moved lower ) */
|
||||
__u16 old_num_channels;
|
||||
__u8 old_num_frequency;
|
||||
|
||||
/* Scan capabilities */
|
||||
__u8 scan_capa;
|
||||
};
|
||||
|
||||
static int _rtl92e_wx_get_range(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
union iwreq_data *wrqu, char *extra)
|
||||
|
@ -23,35 +23,35 @@ static void deactivate_ba_entry(struct rtllib_device *ieee, struct ba_record *ba
|
||||
del_timer_sync(&ba->timer);
|
||||
}
|
||||
|
||||
static u8 tx_ts_delete_ba(struct rtllib_device *ieee, struct tx_ts_record *pTxTs)
|
||||
static u8 tx_ts_delete_ba(struct rtllib_device *ieee, struct tx_ts_record *ts)
|
||||
{
|
||||
struct ba_record *admitted_ba = &pTxTs->TxAdmittedBARecord;
|
||||
struct ba_record *pending_ba = &pTxTs->TxPendingBARecord;
|
||||
u8 bSendDELBA = false;
|
||||
struct ba_record *admitted_ba = &ts->tx_admitted_ba_record;
|
||||
struct ba_record *pending_ba = &ts->tx_pending_ba_record;
|
||||
u8 send_del_ba = false;
|
||||
|
||||
if (pending_ba->b_valid) {
|
||||
deactivate_ba_entry(ieee, pending_ba);
|
||||
bSendDELBA = true;
|
||||
send_del_ba = true;
|
||||
}
|
||||
|
||||
if (admitted_ba->b_valid) {
|
||||
deactivate_ba_entry(ieee, admitted_ba);
|
||||
bSendDELBA = true;
|
||||
send_del_ba = true;
|
||||
}
|
||||
return bSendDELBA;
|
||||
return send_del_ba;
|
||||
}
|
||||
|
||||
static u8 rx_ts_delete_ba(struct rtllib_device *ieee, struct rx_ts_record *ts)
|
||||
{
|
||||
struct ba_record *ba = &ts->rx_admitted_ba_record;
|
||||
u8 bSendDELBA = false;
|
||||
u8 send_del_ba = false;
|
||||
|
||||
if (ba->b_valid) {
|
||||
deactivate_ba_entry(ieee, ba);
|
||||
bSendDELBA = true;
|
||||
send_del_ba = true;
|
||||
}
|
||||
|
||||
return bSendDELBA;
|
||||
return send_del_ba;
|
||||
}
|
||||
|
||||
void rtllib_reset_ba_entry(struct ba_record *ba)
|
||||
@ -68,7 +68,7 @@ static struct sk_buff *rtllib_ADDBA(struct rtllib_device *ieee, u8 *dst,
|
||||
u16 status_code, u8 type)
|
||||
{
|
||||
struct sk_buff *skb = NULL;
|
||||
struct ieee80211_hdr_3addr *BAReq = NULL;
|
||||
struct ieee80211_hdr_3addr *ba_req = NULL;
|
||||
u8 *tag = NULL;
|
||||
u16 len = ieee->tx_headroom + 9;
|
||||
|
||||
@ -87,13 +87,13 @@ static struct sk_buff *rtllib_ADDBA(struct rtllib_device *ieee, u8 *dst,
|
||||
|
||||
skb_reserve(skb, ieee->tx_headroom);
|
||||
|
||||
BAReq = skb_put(skb, sizeof(struct ieee80211_hdr_3addr));
|
||||
ba_req = skb_put(skb, sizeof(struct ieee80211_hdr_3addr));
|
||||
|
||||
ether_addr_copy(BAReq->addr1, dst);
|
||||
ether_addr_copy(BAReq->addr2, ieee->dev->dev_addr);
|
||||
ether_addr_copy(ba_req->addr1, dst);
|
||||
ether_addr_copy(ba_req->addr2, ieee->dev->dev_addr);
|
||||
|
||||
ether_addr_copy(BAReq->addr3, ieee->current_network.bssid);
|
||||
BAReq->frame_control = cpu_to_le16(IEEE80211_STYPE_ACTION);
|
||||
ether_addr_copy(ba_req->addr3, ieee->current_network.bssid);
|
||||
ba_req->frame_control = cpu_to_le16(IEEE80211_STYPE_ACTION);
|
||||
|
||||
tag = skb_put(skb, 9);
|
||||
*tag++ = ACT_CAT_BA;
|
||||
@ -127,9 +127,9 @@ static struct sk_buff *rtllib_DELBA(struct rtllib_device *ieee, u8 *dst,
|
||||
struct ba_record *ba,
|
||||
enum tr_select TxRxSelect, u16 reason_code)
|
||||
{
|
||||
union delba_param_set DelbaParamSet;
|
||||
union delba_param_set del_ba_param_set;
|
||||
struct sk_buff *skb = NULL;
|
||||
struct ieee80211_hdr_3addr *Delba = NULL;
|
||||
struct ieee80211_hdr_3addr *del_ba = NULL;
|
||||
u8 *tag = NULL;
|
||||
u16 len = 6 + ieee->tx_headroom;
|
||||
|
||||
@ -137,10 +137,10 @@ static struct sk_buff *rtllib_DELBA(struct rtllib_device *ieee, u8 *dst,
|
||||
netdev_dbg(ieee->dev, "%s(): reason_code(%d) sentd to: %pM\n",
|
||||
__func__, reason_code, dst);
|
||||
|
||||
memset(&DelbaParamSet, 0, 2);
|
||||
memset(&del_ba_param_set, 0, 2);
|
||||
|
||||
DelbaParamSet.field.initiator = (TxRxSelect == TX_DIR) ? 1 : 0;
|
||||
DelbaParamSet.field.tid = ba->ba_param_set.field.tid;
|
||||
del_ba_param_set.field.initiator = (TxRxSelect == TX_DIR) ? 1 : 0;
|
||||
del_ba_param_set.field.tid = ba->ba_param_set.field.tid;
|
||||
|
||||
skb = dev_alloc_skb(len + sizeof(struct ieee80211_hdr_3addr));
|
||||
if (!skb)
|
||||
@ -148,19 +148,19 @@ static struct sk_buff *rtllib_DELBA(struct rtllib_device *ieee, u8 *dst,
|
||||
|
||||
skb_reserve(skb, ieee->tx_headroom);
|
||||
|
||||
Delba = skb_put(skb, sizeof(struct ieee80211_hdr_3addr));
|
||||
del_ba = skb_put(skb, sizeof(struct ieee80211_hdr_3addr));
|
||||
|
||||
ether_addr_copy(Delba->addr1, dst);
|
||||
ether_addr_copy(Delba->addr2, ieee->dev->dev_addr);
|
||||
ether_addr_copy(Delba->addr3, ieee->current_network.bssid);
|
||||
Delba->frame_control = cpu_to_le16(IEEE80211_STYPE_ACTION);
|
||||
ether_addr_copy(del_ba->addr1, dst);
|
||||
ether_addr_copy(del_ba->addr2, ieee->dev->dev_addr);
|
||||
ether_addr_copy(del_ba->addr3, ieee->current_network.bssid);
|
||||
del_ba->frame_control = cpu_to_le16(IEEE80211_STYPE_ACTION);
|
||||
|
||||
tag = skb_put(skb, 6);
|
||||
|
||||
*tag++ = ACT_CAT_BA;
|
||||
*tag++ = ACT_DELBA;
|
||||
|
||||
put_unaligned_le16(DelbaParamSet.short_data, tag);
|
||||
put_unaligned_le16(del_ba_param_set.short_data, tag);
|
||||
tag += 2;
|
||||
|
||||
put_unaligned_le16(reason_code, tag);
|
||||
@ -215,11 +215,11 @@ int rtllib_rx_ADDBAReq(struct rtllib_device *ieee, struct sk_buff *skb)
|
||||
{
|
||||
struct ieee80211_hdr_3addr *req = NULL;
|
||||
u16 rc = 0;
|
||||
u8 *dst = NULL, *pDialogToken = NULL, *tag = NULL;
|
||||
u8 *dst = NULL, *dialog_token = NULL, *tag = NULL;
|
||||
struct ba_record *ba = NULL;
|
||||
union ba_param_set *pBaParamSet = NULL;
|
||||
u16 *pBaTimeoutVal = NULL;
|
||||
union sequence_control *pBaStartSeqCtrl = NULL;
|
||||
union ba_param_set *ba_param_set = NULL;
|
||||
u16 *ba_timeout_value = NULL;
|
||||
union sequence_control *ba_start_seq_ctrl = NULL;
|
||||
struct rx_ts_record *ts = NULL;
|
||||
|
||||
if (skb->len < sizeof(struct ieee80211_hdr_3addr) + 9) {
|
||||
@ -238,10 +238,10 @@ int rtllib_rx_ADDBAReq(struct rtllib_device *ieee, struct sk_buff *skb)
|
||||
tag = (u8 *)req;
|
||||
dst = (u8 *)(&req->addr2[0]);
|
||||
tag += sizeof(struct ieee80211_hdr_3addr);
|
||||
pDialogToken = tag + 2;
|
||||
pBaParamSet = (union ba_param_set *)(tag + 3);
|
||||
pBaTimeoutVal = (u16 *)(tag + 5);
|
||||
pBaStartSeqCtrl = (union sequence_control *)(req + 7);
|
||||
dialog_token = tag + 2;
|
||||
ba_param_set = (union ba_param_set *)(tag + 3);
|
||||
ba_timeout_value = (u16 *)(tag + 5);
|
||||
ba_start_seq_ctrl = (union sequence_control *)(req + 7);
|
||||
|
||||
if (!ieee->current_network.qos_data.active ||
|
||||
!ieee->ht_info->current_ht_support ||
|
||||
@ -254,14 +254,14 @@ int rtllib_rx_ADDBAReq(struct rtllib_device *ieee, struct sk_buff *skb)
|
||||
goto OnADDBAReq_Fail;
|
||||
}
|
||||
if (!rtllib_get_ts(ieee, (struct ts_common_info **)&ts, dst,
|
||||
(u8)(pBaParamSet->field.tid), RX_DIR, true)) {
|
||||
(u8)(ba_param_set->field.tid), RX_DIR, true)) {
|
||||
rc = ADDBA_STATUS_REFUSED;
|
||||
netdev_warn(ieee->dev, "%s(): can't get TS\n", __func__);
|
||||
goto OnADDBAReq_Fail;
|
||||
}
|
||||
ba = &ts->rx_admitted_ba_record;
|
||||
|
||||
if (pBaParamSet->field.ba_policy == BA_POLICY_DELAYED) {
|
||||
if (ba_param_set->field.ba_policy == BA_POLICY_DELAYED) {
|
||||
rc = ADDBA_STATUS_INVALID_PARAM;
|
||||
netdev_warn(ieee->dev, "%s(): BA Policy is not correct\n",
|
||||
__func__);
|
||||
@ -271,10 +271,10 @@ int rtllib_rx_ADDBAReq(struct rtllib_device *ieee, struct sk_buff *skb)
|
||||
rtllib_FlushRxTsPendingPkts(ieee, ts);
|
||||
|
||||
deactivate_ba_entry(ieee, ba);
|
||||
ba->dialog_token = *pDialogToken;
|
||||
ba->ba_param_set = *pBaParamSet;
|
||||
ba->ba_timeout_value = *pBaTimeoutVal;
|
||||
ba->ba_start_seq_ctrl = *pBaStartSeqCtrl;
|
||||
ba->dialog_token = *dialog_token;
|
||||
ba->ba_param_set = *ba_param_set;
|
||||
ba->ba_timeout_value = *ba_timeout_value;
|
||||
ba->ba_start_seq_ctrl = *ba_start_seq_ctrl;
|
||||
|
||||
if (ieee->GetHalfNmodeSupportByAPsHandler(ieee->dev) ||
|
||||
(ieee->ht_info->iot_action & HT_IOT_ACT_ALLOW_PEER_AGG_ONE_PKT))
|
||||
@ -291,9 +291,9 @@ OnADDBAReq_Fail:
|
||||
{
|
||||
struct ba_record BA;
|
||||
|
||||
BA.ba_param_set = *pBaParamSet;
|
||||
BA.ba_timeout_value = *pBaTimeoutVal;
|
||||
BA.dialog_token = *pDialogToken;
|
||||
BA.ba_param_set = *ba_param_set;
|
||||
BA.ba_timeout_value = *ba_timeout_value;
|
||||
BA.dialog_token = *dialog_token;
|
||||
BA.ba_param_set.field.ba_policy = BA_POLICY_IMMEDIATE;
|
||||
rtllib_send_ADDBARsp(ieee, dst, &BA, rc);
|
||||
return 0;
|
||||
@ -303,11 +303,11 @@ OnADDBAReq_Fail:
|
||||
int rtllib_rx_ADDBARsp(struct rtllib_device *ieee, struct sk_buff *skb)
|
||||
{
|
||||
struct ieee80211_hdr_3addr *rsp = NULL;
|
||||
struct ba_record *pending_ba, *pAdmittedBA;
|
||||
struct ba_record *pending_ba, *admitted_ba;
|
||||
struct tx_ts_record *ts = NULL;
|
||||
u8 *dst = NULL, *pDialogToken = NULL, *tag = NULL;
|
||||
u16 *status_code = NULL, *pBaTimeoutVal = NULL;
|
||||
union ba_param_set *pBaParamSet = NULL;
|
||||
u8 *dst = NULL, *dialog_token = NULL, *tag = NULL;
|
||||
u16 *status_code = NULL, *ba_timeout_value = NULL;
|
||||
union ba_param_set *ba_param_set = NULL;
|
||||
u16 reason_code;
|
||||
|
||||
if (skb->len < sizeof(struct ieee80211_hdr_3addr) + 9) {
|
||||
@ -320,40 +320,40 @@ int rtllib_rx_ADDBARsp(struct rtllib_device *ieee, struct sk_buff *skb)
|
||||
tag = (u8 *)rsp;
|
||||
dst = (u8 *)(&rsp->addr2[0]);
|
||||
tag += sizeof(struct ieee80211_hdr_3addr);
|
||||
pDialogToken = tag + 2;
|
||||
dialog_token = tag + 2;
|
||||
status_code = (u16 *)(tag + 3);
|
||||
pBaParamSet = (union ba_param_set *)(tag + 5);
|
||||
pBaTimeoutVal = (u16 *)(tag + 7);
|
||||
ba_param_set = (union ba_param_set *)(tag + 5);
|
||||
ba_timeout_value = (u16 *)(tag + 7);
|
||||
|
||||
if (!ieee->current_network.qos_data.active ||
|
||||
!ieee->ht_info->current_ht_support ||
|
||||
!ieee->ht_info->bCurrentAMPDUEnable) {
|
||||
!ieee->ht_info->current_ampdu_enable) {
|
||||
netdev_warn(ieee->dev,
|
||||
"reject to ADDBA_RSP as some capability is not ready(%d, %d, %d)\n",
|
||||
ieee->current_network.qos_data.active,
|
||||
ieee->ht_info->current_ht_support,
|
||||
ieee->ht_info->bCurrentAMPDUEnable);
|
||||
ieee->ht_info->current_ampdu_enable);
|
||||
reason_code = DELBA_REASON_UNKNOWN_BA;
|
||||
goto OnADDBARsp_Reject;
|
||||
}
|
||||
|
||||
if (!rtllib_get_ts(ieee, (struct ts_common_info **)&ts, dst,
|
||||
(u8)(pBaParamSet->field.tid), TX_DIR, false)) {
|
||||
(u8)(ba_param_set->field.tid), TX_DIR, false)) {
|
||||
netdev_warn(ieee->dev, "%s(): can't get TS\n", __func__);
|
||||
reason_code = DELBA_REASON_UNKNOWN_BA;
|
||||
goto OnADDBARsp_Reject;
|
||||
}
|
||||
|
||||
ts->bAddBaReqInProgress = false;
|
||||
pending_ba = &ts->TxPendingBARecord;
|
||||
pAdmittedBA = &ts->TxAdmittedBARecord;
|
||||
ts->add_ba_req_in_progress = false;
|
||||
pending_ba = &ts->tx_pending_ba_record;
|
||||
admitted_ba = &ts->tx_admitted_ba_record;
|
||||
|
||||
if (pAdmittedBA->b_valid) {
|
||||
if (admitted_ba->b_valid) {
|
||||
netdev_dbg(ieee->dev, "%s(): ADDBA response already admitted\n",
|
||||
__func__);
|
||||
return -1;
|
||||
} else if (!pending_ba->b_valid ||
|
||||
(*pDialogToken != pending_ba->dialog_token)) {
|
||||
(*dialog_token != pending_ba->dialog_token)) {
|
||||
netdev_warn(ieee->dev,
|
||||
"%s(): ADDBA Rsp. BA invalid, DELBA!\n",
|
||||
__func__);
|
||||
@ -367,22 +367,22 @@ int rtllib_rx_ADDBARsp(struct rtllib_device *ieee, struct sk_buff *skb)
|
||||
}
|
||||
|
||||
if (*status_code == ADDBA_STATUS_SUCCESS) {
|
||||
if (pBaParamSet->field.ba_policy == BA_POLICY_DELAYED) {
|
||||
ts->bAddBaReqDelayed = true;
|
||||
deactivate_ba_entry(ieee, pAdmittedBA);
|
||||
if (ba_param_set->field.ba_policy == BA_POLICY_DELAYED) {
|
||||
ts->add_ba_req_delayed = true;
|
||||
deactivate_ba_entry(ieee, admitted_ba);
|
||||
reason_code = DELBA_REASON_END_BA;
|
||||
goto OnADDBARsp_Reject;
|
||||
}
|
||||
|
||||
pAdmittedBA->dialog_token = *pDialogToken;
|
||||
pAdmittedBA->ba_timeout_value = *pBaTimeoutVal;
|
||||
pAdmittedBA->ba_start_seq_ctrl = pending_ba->ba_start_seq_ctrl;
|
||||
pAdmittedBA->ba_param_set = *pBaParamSet;
|
||||
deactivate_ba_entry(ieee, pAdmittedBA);
|
||||
activate_ba_entry(pAdmittedBA, *pBaTimeoutVal);
|
||||
admitted_ba->dialog_token = *dialog_token;
|
||||
admitted_ba->ba_timeout_value = *ba_timeout_value;
|
||||
admitted_ba->ba_start_seq_ctrl = pending_ba->ba_start_seq_ctrl;
|
||||
admitted_ba->ba_param_set = *ba_param_set;
|
||||
deactivate_ba_entry(ieee, admitted_ba);
|
||||
activate_ba_entry(admitted_ba, *ba_timeout_value);
|
||||
} else {
|
||||
ts->bAddBaReqDelayed = true;
|
||||
ts->bDisable_AddBa = true;
|
||||
ts->add_ba_req_delayed = true;
|
||||
ts->disable_add_ba = true;
|
||||
reason_code = DELBA_REASON_END_BA;
|
||||
goto OnADDBARsp_Reject;
|
||||
}
|
||||
@ -393,7 +393,7 @@ OnADDBARsp_Reject:
|
||||
{
|
||||
struct ba_record BA;
|
||||
|
||||
BA.ba_param_set = *pBaParamSet;
|
||||
BA.ba_param_set = *ba_param_set;
|
||||
rtllib_send_DELBA(ieee, dst, &BA, TX_DIR, reason_code);
|
||||
return 0;
|
||||
}
|
||||
@ -402,7 +402,7 @@ OnADDBARsp_Reject:
|
||||
int rtllib_rx_DELBA(struct rtllib_device *ieee, struct sk_buff *skb)
|
||||
{
|
||||
struct ieee80211_hdr_3addr *delba = NULL;
|
||||
union delba_param_set *pDelBaParamSet = NULL;
|
||||
union delba_param_set *del_ba_param_set = NULL;
|
||||
u8 *dst = NULL;
|
||||
|
||||
if (skb->len < sizeof(struct ieee80211_hdr_3addr) + 6) {
|
||||
@ -427,46 +427,46 @@ int rtllib_rx_DELBA(struct rtllib_device *ieee, struct sk_buff *skb)
|
||||
#endif
|
||||
delba = (struct ieee80211_hdr_3addr *)skb->data;
|
||||
dst = (u8 *)(&delba->addr2[0]);
|
||||
pDelBaParamSet = (union delba_param_set *)&delba->seq_ctrl + 2;
|
||||
del_ba_param_set = (union delba_param_set *)&delba->seq_ctrl + 2;
|
||||
|
||||
if (pDelBaParamSet->field.initiator == 1) {
|
||||
if (del_ba_param_set->field.initiator == 1) {
|
||||
struct rx_ts_record *ts;
|
||||
|
||||
if (!rtllib_get_ts(ieee, (struct ts_common_info **)&ts, dst,
|
||||
(u8)pDelBaParamSet->field.tid, RX_DIR, false)) {
|
||||
(u8)del_ba_param_set->field.tid, RX_DIR, false)) {
|
||||
netdev_warn(ieee->dev,
|
||||
"%s(): can't get TS for RXTS. dst:%pM TID:%d\n",
|
||||
__func__, dst,
|
||||
(u8)pDelBaParamSet->field.tid);
|
||||
(u8)del_ba_param_set->field.tid);
|
||||
return -1;
|
||||
}
|
||||
|
||||
rx_ts_delete_ba(ieee, ts);
|
||||
} else {
|
||||
struct tx_ts_record *pTxTs;
|
||||
struct tx_ts_record *ts;
|
||||
|
||||
if (!rtllib_get_ts(ieee, (struct ts_common_info **)&pTxTs, dst,
|
||||
(u8)pDelBaParamSet->field.tid, TX_DIR, false)) {
|
||||
if (!rtllib_get_ts(ieee, (struct ts_common_info **)&ts, dst,
|
||||
(u8)del_ba_param_set->field.tid, TX_DIR, false)) {
|
||||
netdev_warn(ieee->dev, "%s(): can't get TS for TXTS\n",
|
||||
__func__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
pTxTs->bUsingBa = false;
|
||||
pTxTs->bAddBaReqInProgress = false;
|
||||
pTxTs->bAddBaReqDelayed = false;
|
||||
del_timer_sync(&pTxTs->TsAddBaTimer);
|
||||
tx_ts_delete_ba(ieee, pTxTs);
|
||||
ts->using_ba = false;
|
||||
ts->add_ba_req_in_progress = false;
|
||||
ts->add_ba_req_delayed = false;
|
||||
del_timer_sync(&ts->ts_add_ba_timer);
|
||||
tx_ts_delete_ba(ieee, ts);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void rtllib_ts_init_add_ba(struct rtllib_device *ieee, struct tx_ts_record *ts,
|
||||
u8 policy, u8 bOverwritePending)
|
||||
u8 policy, u8 overwrite_pending)
|
||||
{
|
||||
struct ba_record *ba = &ts->TxPendingBARecord;
|
||||
struct ba_record *ba = &ts->tx_pending_ba_record;
|
||||
|
||||
if (ba->b_valid && !bOverwritePending)
|
||||
if (ba->b_valid && !overwrite_pending)
|
||||
return;
|
||||
|
||||
deactivate_ba_entry(ieee, ba);
|
||||
@ -474,35 +474,35 @@ void rtllib_ts_init_add_ba(struct rtllib_device *ieee, struct tx_ts_record *ts,
|
||||
ba->dialog_token++;
|
||||
ba->ba_param_set.field.amsdu_support = 0;
|
||||
ba->ba_param_set.field.ba_policy = policy;
|
||||
ba->ba_param_set.field.tid = ts->TsCommonInfo.TSpec.ucTSID;
|
||||
ba->ba_param_set.field.tid = ts->ts_common_info.tspec.ts_id;
|
||||
ba->ba_param_set.field.buffer_size = 32;
|
||||
ba->ba_timeout_value = 0;
|
||||
ba->ba_start_seq_ctrl.field.seq_num = (ts->TxCurSeq + 3) % 4096;
|
||||
ba->ba_start_seq_ctrl.field.seq_num = (ts->tx_cur_seq + 3) % 4096;
|
||||
|
||||
activate_ba_entry(ba, BA_SETUP_TIMEOUT);
|
||||
|
||||
rtllib_send_ADDBAReq(ieee, ts->TsCommonInfo.addr, ba);
|
||||
rtllib_send_ADDBAReq(ieee, ts->ts_common_info.addr, ba);
|
||||
}
|
||||
|
||||
void rtllib_ts_init_del_ba(struct rtllib_device *ieee,
|
||||
struct ts_common_info *pTsCommonInfo,
|
||||
struct ts_common_info *ts_common_info,
|
||||
enum tr_select TxRxSelect)
|
||||
{
|
||||
if (TxRxSelect == TX_DIR) {
|
||||
struct tx_ts_record *pTxTs =
|
||||
(struct tx_ts_record *)pTsCommonInfo;
|
||||
struct tx_ts_record *ts =
|
||||
(struct tx_ts_record *)ts_common_info;
|
||||
|
||||
if (tx_ts_delete_ba(ieee, pTxTs))
|
||||
rtllib_send_DELBA(ieee, pTsCommonInfo->addr,
|
||||
(pTxTs->TxAdmittedBARecord.b_valid) ?
|
||||
(&pTxTs->TxAdmittedBARecord) :
|
||||
(&pTxTs->TxPendingBARecord),
|
||||
if (tx_ts_delete_ba(ieee, ts))
|
||||
rtllib_send_DELBA(ieee, ts_common_info->addr,
|
||||
(ts->tx_admitted_ba_record.b_valid) ?
|
||||
(&ts->tx_admitted_ba_record) :
|
||||
(&ts->tx_pending_ba_record),
|
||||
TxRxSelect, DELBA_REASON_END_BA);
|
||||
} else if (TxRxSelect == RX_DIR) {
|
||||
struct rx_ts_record *ts =
|
||||
(struct rx_ts_record *)pTsCommonInfo;
|
||||
(struct rx_ts_record *)ts_common_info;
|
||||
if (rx_ts_delete_ba(ieee, ts))
|
||||
rtllib_send_DELBA(ieee, pTsCommonInfo->addr,
|
||||
rtllib_send_DELBA(ieee, ts_common_info->addr,
|
||||
&ts->rx_admitted_ba_record,
|
||||
TxRxSelect, DELBA_REASON_END_BA);
|
||||
}
|
||||
@ -510,23 +510,23 @@ void rtllib_ts_init_del_ba(struct rtllib_device *ieee,
|
||||
|
||||
void rtllib_ba_setup_timeout(struct timer_list *t)
|
||||
{
|
||||
struct tx_ts_record *pTxTs = from_timer(pTxTs, t,
|
||||
TxPendingBARecord.timer);
|
||||
struct tx_ts_record *ts = from_timer(ts, t,
|
||||
tx_pending_ba_record.timer);
|
||||
|
||||
pTxTs->bAddBaReqInProgress = false;
|
||||
pTxTs->bAddBaReqDelayed = true;
|
||||
pTxTs->TxPendingBARecord.b_valid = false;
|
||||
ts->add_ba_req_in_progress = false;
|
||||
ts->add_ba_req_delayed = true;
|
||||
ts->tx_pending_ba_record.b_valid = false;
|
||||
}
|
||||
|
||||
void rtllib_tx_ba_inact_timeout(struct timer_list *t)
|
||||
{
|
||||
struct tx_ts_record *pTxTs = from_timer(pTxTs, t,
|
||||
TxAdmittedBARecord.timer);
|
||||
struct rtllib_device *ieee = container_of(pTxTs, struct rtllib_device,
|
||||
TxTsRecord[pTxTs->num]);
|
||||
tx_ts_delete_ba(ieee, pTxTs);
|
||||
rtllib_send_DELBA(ieee, pTxTs->TsCommonInfo.addr,
|
||||
&pTxTs->TxAdmittedBARecord, TX_DIR,
|
||||
struct tx_ts_record *ts = from_timer(ts, t,
|
||||
tx_admitted_ba_record.timer);
|
||||
struct rtllib_device *ieee = container_of(ts, struct rtllib_device,
|
||||
tx_ts_records[ts->num]);
|
||||
tx_ts_delete_ba(ieee, ts);
|
||||
rtllib_send_DELBA(ieee, ts->ts_common_info.addr,
|
||||
&ts->tx_admitted_ba_record, TX_DIR,
|
||||
DELBA_REASON_TIMEOUT);
|
||||
}
|
||||
|
||||
@ -535,7 +535,7 @@ void rtllib_rx_ba_inact_timeout(struct timer_list *t)
|
||||
struct rx_ts_record *ts = from_timer(ts, t,
|
||||
rx_admitted_ba_record.timer);
|
||||
struct rtllib_device *ieee = container_of(ts, struct rtllib_device,
|
||||
RxTsRecord[ts->num]);
|
||||
rx_ts_records[ts->num]);
|
||||
|
||||
rx_ts_delete_ba(ieee, ts);
|
||||
rtllib_send_DELBA(ieee, ts->ts_common_info.addr,
|
||||
|
@ -94,51 +94,32 @@ enum ht_aggre_mode {
|
||||
struct rt_hi_throughput {
|
||||
u8 enable_ht;
|
||||
u8 current_ht_support;
|
||||
u8 bRegBW40MHz;
|
||||
u8 bCurBW40MHz;
|
||||
u8 bRegShortGI40MHz;
|
||||
u8 bCurShortGI40MHz;
|
||||
u8 bRegShortGI20MHz;
|
||||
u8 bCurShortGI20MHz;
|
||||
u8 bRegSuppCCK;
|
||||
u8 bCurSuppCCK;
|
||||
enum ht_spec_ver ePeerHTSpecVer;
|
||||
u8 cur_bw_40mhz;
|
||||
u8 cur_short_gi_40mhz;
|
||||
u8 cur_short_gi_20mhz;
|
||||
enum ht_spec_ver peer_ht_spec_ver;
|
||||
struct ht_capab_ele SelfHTCap;
|
||||
struct ht_info_ele SelfHTInfo;
|
||||
u8 PeerHTCapBuf[32];
|
||||
u8 PeerHTInfoBuf[32];
|
||||
u8 bAMSDU_Support;
|
||||
u16 nAMSDU_MaxSize;
|
||||
u8 bCurrent_AMSDU_Support;
|
||||
u16 nCurrent_AMSDU_MaxSize;
|
||||
u8 bAMPDUEnable;
|
||||
u8 bCurrentAMPDUEnable;
|
||||
u8 AMPDU_Factor;
|
||||
u8 ampdu_enable;
|
||||
u8 current_ampdu_enable;
|
||||
u8 ampdu_factor;
|
||||
u8 CurrentAMPDUFactor;
|
||||
u8 MPDU_Density;
|
||||
u8 current_mpdu_density;
|
||||
enum ht_aggre_mode ForcedAMPDUMode;
|
||||
u8 forced_ampdu_factor;
|
||||
u8 forced_mpdu_density;
|
||||
enum ht_aggre_mode ForcedAMSDUMode;
|
||||
u8 forced_short_gi;
|
||||
u8 current_op_mode;
|
||||
u8 self_mimo_ps;
|
||||
u8 peer_mimo_ps;
|
||||
enum ht_extchnl_offset CurSTAExtChnlOffset;
|
||||
u8 cur_tx_bw40mhz;
|
||||
u8 sw_bw_in_progress;
|
||||
u8 reg_rt2rt_aggregation;
|
||||
u8 RT2RT_HT_Mode;
|
||||
u8 current_rt2rt_aggregation;
|
||||
u8 current_rt2rt_long_slot_time;
|
||||
u8 sz_rt2rt_agg_buf[10];
|
||||
u8 reg_rx_reorder_enable;
|
||||
u8 cur_rx_reorder_enable;
|
||||
u8 rx_reorder_win_size;
|
||||
u8 rx_reorder_pending_time;
|
||||
u16 rx_reorder_drop_counter;
|
||||
u8 IOTPeer;
|
||||
u8 iot_peer;
|
||||
u32 iot_action;
|
||||
u8 iot_ra_func;
|
||||
} __packed;
|
||||
|
@ -71,75 +71,55 @@ void ht_update_default_setting(struct rtllib_device *ieee)
|
||||
{
|
||||
struct rt_hi_throughput *ht_info = ieee->ht_info;
|
||||
|
||||
ht_info->bRegShortGI20MHz = 1;
|
||||
ht_info->bRegShortGI40MHz = 1;
|
||||
ht_info->ampdu_enable = 1;
|
||||
ht_info->ampdu_factor = 2;
|
||||
|
||||
ht_info->bRegBW40MHz = 1;
|
||||
|
||||
if (ht_info->bRegBW40MHz)
|
||||
ht_info->bRegSuppCCK = 1;
|
||||
else
|
||||
ht_info->bRegSuppCCK = true;
|
||||
|
||||
ht_info->nAMSDU_MaxSize = 7935UL;
|
||||
ht_info->bAMSDU_Support = 0;
|
||||
|
||||
ht_info->bAMPDUEnable = 1;
|
||||
ht_info->AMPDU_Factor = 2;
|
||||
ht_info->MPDU_Density = 0;
|
||||
|
||||
ht_info->self_mimo_ps = 3;
|
||||
if (ht_info->self_mimo_ps == 2)
|
||||
ht_info->self_mimo_ps = 3;
|
||||
ieee->tx_dis_rate_fallback = 0;
|
||||
ieee->tx_use_drv_assinged_rate = 0;
|
||||
|
||||
ieee->bTxEnableFwCalcDur = 1;
|
||||
ieee->tx_enable_fw_calc_dur = 1;
|
||||
|
||||
ht_info->reg_rt2rt_aggregation = 1;
|
||||
|
||||
ht_info->reg_rx_reorder_enable = 1;
|
||||
ht_info->rx_reorder_win_size = 64;
|
||||
ht_info->rx_reorder_pending_time = 30;
|
||||
}
|
||||
|
||||
static u16 HTMcsToDataRate(struct rtllib_device *ieee, u8 nMcsRate)
|
||||
static u16 ht_mcs_to_data_rate(struct rtllib_device *ieee, u8 mcs_rate)
|
||||
{
|
||||
struct rt_hi_throughput *ht_info = ieee->ht_info;
|
||||
|
||||
u8 is40MHz = (ht_info->bCurBW40MHz) ? 1 : 0;
|
||||
u8 isShortGI = (ht_info->bCurBW40MHz) ?
|
||||
((ht_info->bCurShortGI40MHz) ? 1 : 0) :
|
||||
((ht_info->bCurShortGI20MHz) ? 1 : 0);
|
||||
return MCS_DATA_RATE[is40MHz][isShortGI][(nMcsRate & 0x7f)];
|
||||
u8 is40MHz = (ht_info->cur_bw_40mhz) ? 1 : 0;
|
||||
u8 isShortGI = (ht_info->cur_bw_40mhz) ?
|
||||
((ht_info->cur_short_gi_40mhz) ? 1 : 0) :
|
||||
((ht_info->cur_short_gi_20mhz) ? 1 : 0);
|
||||
return MCS_DATA_RATE[is40MHz][isShortGI][(mcs_rate & 0x7f)];
|
||||
}
|
||||
|
||||
u16 TxCountToDataRate(struct rtllib_device *ieee, u8 nDataRate)
|
||||
u16 tx_count_to_data_rate(struct rtllib_device *ieee, u8 data_rate)
|
||||
{
|
||||
u16 CCKOFDMRate[12] = {0x02, 0x04, 0x0b, 0x16, 0x0c, 0x12, 0x18,
|
||||
u16 cck_of_dm_rate[12] = {0x02, 0x04, 0x0b, 0x16, 0x0c, 0x12, 0x18,
|
||||
0x24, 0x30, 0x48, 0x60, 0x6c};
|
||||
u8 is40MHz = 0;
|
||||
u8 isShortGI = 0;
|
||||
|
||||
if (nDataRate < 12)
|
||||
return CCKOFDMRate[nDataRate];
|
||||
if (nDataRate >= 0x10 && nDataRate <= 0x1f) {
|
||||
if (data_rate < 12)
|
||||
return cck_of_dm_rate[data_rate];
|
||||
if (data_rate >= 0x10 && data_rate <= 0x1f) {
|
||||
is40MHz = 0;
|
||||
isShortGI = 0;
|
||||
} else if (nDataRate >= 0x20 && nDataRate <= 0x2f) {
|
||||
} else if (data_rate >= 0x20 && data_rate <= 0x2f) {
|
||||
is40MHz = 1;
|
||||
isShortGI = 0;
|
||||
} else if (nDataRate >= 0x30 && nDataRate <= 0x3f) {
|
||||
} else if (data_rate >= 0x30 && data_rate <= 0x3f) {
|
||||
is40MHz = 0;
|
||||
isShortGI = 1;
|
||||
} else if (nDataRate >= 0x40 && nDataRate <= 0x4f) {
|
||||
} else if (data_rate >= 0x40 && data_rate <= 0x4f) {
|
||||
is40MHz = 1;
|
||||
isShortGI = 1;
|
||||
}
|
||||
return MCS_DATA_RATE[is40MHz][isShortGI][nDataRate & 0xf];
|
||||
return MCS_DATA_RATE[is40MHz][isShortGI][data_rate & 0xf];
|
||||
}
|
||||
|
||||
bool IsHTHalfNmodeAPs(struct rtllib_device *ieee)
|
||||
bool is_ht_half_nmode_aps(struct rtllib_device *ieee)
|
||||
{
|
||||
bool retValue = false;
|
||||
struct rtllib_network *net = &ieee->current_network;
|
||||
@ -164,187 +144,171 @@ bool IsHTHalfNmodeAPs(struct rtllib_device *ieee)
|
||||
return retValue;
|
||||
}
|
||||
|
||||
static void HTIOTPeerDetermine(struct rtllib_device *ieee)
|
||||
static void ht_iot_peer_determine(struct rtllib_device *ieee)
|
||||
{
|
||||
struct rt_hi_throughput *ht_info = ieee->ht_info;
|
||||
struct rtllib_network *net = &ieee->current_network;
|
||||
|
||||
if (net->bssht.bd_rt2rt_aggregation) {
|
||||
ht_info->IOTPeer = HT_IOT_PEER_REALTEK;
|
||||
ht_info->iot_peer = HT_IOT_PEER_REALTEK;
|
||||
if (net->bssht.rt2rt_ht_mode & RT_HT_CAP_USE_92SE)
|
||||
ht_info->IOTPeer = HT_IOT_PEER_REALTEK_92SE;
|
||||
ht_info->iot_peer = HT_IOT_PEER_REALTEK_92SE;
|
||||
if (net->bssht.rt2rt_ht_mode & RT_HT_CAP_USE_SOFTAP)
|
||||
ht_info->IOTPeer = HT_IOT_PEER_92U_SOFTAP;
|
||||
ht_info->iot_peer = HT_IOT_PEER_92U_SOFTAP;
|
||||
} else if (net->broadcom_cap_exist) {
|
||||
ht_info->IOTPeer = HT_IOT_PEER_BROADCOM;
|
||||
ht_info->iot_peer = HT_IOT_PEER_BROADCOM;
|
||||
} else if (!memcmp(net->bssid, UNKNOWN_BORADCOM, 3) ||
|
||||
!memcmp(net->bssid, LINKSYSWRT330_LINKSYSWRT300_BROADCOM, 3) ||
|
||||
!memcmp(net->bssid, LINKSYSWRT350_LINKSYSWRT150_BROADCOM, 3)) {
|
||||
ht_info->IOTPeer = HT_IOT_PEER_BROADCOM;
|
||||
ht_info->iot_peer = HT_IOT_PEER_BROADCOM;
|
||||
} else if ((memcmp(net->bssid, BELKINF5D8233V1_RALINK, 3) == 0) ||
|
||||
(memcmp(net->bssid, BELKINF5D82334V3_RALINK, 3) == 0) ||
|
||||
(memcmp(net->bssid, PCI_RALINK, 3) == 0) ||
|
||||
(memcmp(net->bssid, EDIMAX_RALINK, 3) == 0) ||
|
||||
(memcmp(net->bssid, AIRLINK_RALINK, 3) == 0) ||
|
||||
net->ralink_cap_exist) {
|
||||
ht_info->IOTPeer = HT_IOT_PEER_RALINK;
|
||||
ht_info->iot_peer = HT_IOT_PEER_RALINK;
|
||||
} else if ((net->atheros_cap_exist) ||
|
||||
(memcmp(net->bssid, DLINK_ATHEROS_1, 3) == 0) ||
|
||||
(memcmp(net->bssid, DLINK_ATHEROS_2, 3) == 0)) {
|
||||
ht_info->IOTPeer = HT_IOT_PEER_ATHEROS;
|
||||
ht_info->iot_peer = HT_IOT_PEER_ATHEROS;
|
||||
} else if ((memcmp(net->bssid, CISCO_BROADCOM, 3) == 0) ||
|
||||
net->cisco_cap_exist) {
|
||||
ht_info->IOTPeer = HT_IOT_PEER_CISCO;
|
||||
ht_info->iot_peer = HT_IOT_PEER_CISCO;
|
||||
} else if ((memcmp(net->bssid, LINKSYS_MARVELL_4400N, 3) == 0) ||
|
||||
net->marvell_cap_exist) {
|
||||
ht_info->IOTPeer = HT_IOT_PEER_MARVELL;
|
||||
ht_info->iot_peer = HT_IOT_PEER_MARVELL;
|
||||
} else if (net->airgo_cap_exist) {
|
||||
ht_info->IOTPeer = HT_IOT_PEER_AIRGO;
|
||||
ht_info->iot_peer = HT_IOT_PEER_AIRGO;
|
||||
} else {
|
||||
ht_info->IOTPeer = HT_IOT_PEER_UNKNOWN;
|
||||
ht_info->iot_peer = HT_IOT_PEER_UNKNOWN;
|
||||
}
|
||||
|
||||
netdev_dbg(ieee->dev, "IOTPEER: %x\n", ht_info->IOTPeer);
|
||||
netdev_dbg(ieee->dev, "IOTPEER: %x\n", ht_info->iot_peer);
|
||||
}
|
||||
|
||||
static u8 HTIOTActIsMgntUseCCK6M(struct rtllib_device *ieee,
|
||||
static u8 ht_iot_act_is_mgnt_use_cck_6m(struct rtllib_device *ieee,
|
||||
struct rtllib_network *network)
|
||||
{
|
||||
u8 retValue = 0;
|
||||
|
||||
if (ieee->ht_info->IOTPeer == HT_IOT_PEER_BROADCOM)
|
||||
if (ieee->ht_info->iot_peer == HT_IOT_PEER_BROADCOM)
|
||||
retValue = 1;
|
||||
|
||||
return retValue;
|
||||
}
|
||||
|
||||
static u8 HTIOTActIsCCDFsync(struct rtllib_device *ieee)
|
||||
static u8 ht_iot_act_is_ccd_fsync(struct rtllib_device *ieee)
|
||||
{
|
||||
u8 retValue = 0;
|
||||
|
||||
if (ieee->ht_info->IOTPeer == HT_IOT_PEER_BROADCOM)
|
||||
if (ieee->ht_info->iot_peer == HT_IOT_PEER_BROADCOM)
|
||||
retValue = 1;
|
||||
return retValue;
|
||||
}
|
||||
|
||||
static void HTIOTActDetermineRaFunc(struct rtllib_device *ieee, bool bPeerRx2ss)
|
||||
static void ht_iot_act_determine_ra_func(struct rtllib_device *ieee, bool bPeerRx2ss)
|
||||
{
|
||||
struct rt_hi_throughput *ht_info = ieee->ht_info;
|
||||
|
||||
ht_info->iot_ra_func &= HT_IOT_RAFUNC_DISABLE_ALL;
|
||||
|
||||
if (ht_info->IOTPeer == HT_IOT_PEER_RALINK && !bPeerRx2ss)
|
||||
if (ht_info->iot_peer == HT_IOT_PEER_RALINK && !bPeerRx2ss)
|
||||
ht_info->iot_ra_func |= HT_IOT_RAFUNC_PEER_1R;
|
||||
|
||||
if (ht_info->iot_action & HT_IOT_ACT_AMSDU_ENABLE)
|
||||
ht_info->iot_ra_func |= HT_IOT_RAFUNC_TX_AMSDU;
|
||||
}
|
||||
|
||||
void HTResetIOTSetting(struct rt_hi_throughput *ht_info)
|
||||
void ht_reset_iot_setting(struct rt_hi_throughput *ht_info)
|
||||
{
|
||||
ht_info->iot_action = 0;
|
||||
ht_info->IOTPeer = HT_IOT_PEER_UNKNOWN;
|
||||
ht_info->iot_peer = HT_IOT_PEER_UNKNOWN;
|
||||
ht_info->iot_ra_func = 0;
|
||||
}
|
||||
|
||||
void HTConstructCapabilityElement(struct rtllib_device *ieee, u8 *posHTCap,
|
||||
u8 *len, u8 IsEncrypt, bool bAssoc)
|
||||
void ht_construct_capability_element(struct rtllib_device *ieee, u8 *pos_ht_cap,
|
||||
u8 *len, u8 is_encrypt, bool assoc)
|
||||
{
|
||||
struct rt_hi_throughput *pHT = ieee->ht_info;
|
||||
struct ht_capab_ele *pCapELE = NULL;
|
||||
struct rt_hi_throughput *ht = ieee->ht_info;
|
||||
struct ht_capab_ele *cap_ele = NULL;
|
||||
|
||||
if (!posHTCap || !pHT) {
|
||||
if (!pos_ht_cap || !ht) {
|
||||
netdev_warn(ieee->dev,
|
||||
"%s(): posHTCap and ht_info are null\n", __func__);
|
||||
return;
|
||||
}
|
||||
memset(posHTCap, 0, *len);
|
||||
memset(pos_ht_cap, 0, *len);
|
||||
|
||||
if ((bAssoc) && (pHT->ePeerHTSpecVer == HT_SPEC_VER_EWC)) {
|
||||
if ((assoc) && (ht->peer_ht_spec_ver == HT_SPEC_VER_EWC)) {
|
||||
static const u8 EWC11NHTCap[] = { 0x00, 0x90, 0x4c, 0x33 };
|
||||
|
||||
memcpy(posHTCap, EWC11NHTCap, sizeof(EWC11NHTCap));
|
||||
pCapELE = (struct ht_capab_ele *)&posHTCap[4];
|
||||
memcpy(pos_ht_cap, EWC11NHTCap, sizeof(EWC11NHTCap));
|
||||
cap_ele = (struct ht_capab_ele *)&pos_ht_cap[4];
|
||||
*len = 30 + 2;
|
||||
} else {
|
||||
pCapELE = (struct ht_capab_ele *)posHTCap;
|
||||
cap_ele = (struct ht_capab_ele *)pos_ht_cap;
|
||||
*len = 26 + 2;
|
||||
}
|
||||
|
||||
pCapELE->AdvCoding = 0;
|
||||
cap_ele->AdvCoding = 0;
|
||||
if (ieee->GetHalfNmodeSupportByAPsHandler(ieee->dev))
|
||||
pCapELE->ChlWidth = 0;
|
||||
cap_ele->ChlWidth = 0;
|
||||
else
|
||||
pCapELE->ChlWidth = (pHT->bRegBW40MHz ? 1 : 0);
|
||||
cap_ele->ChlWidth = 1;
|
||||
|
||||
pCapELE->MimoPwrSave = pHT->self_mimo_ps;
|
||||
pCapELE->GreenField = 0;
|
||||
pCapELE->ShortGI20Mhz = 1;
|
||||
pCapELE->ShortGI40Mhz = 1;
|
||||
cap_ele->MimoPwrSave = 3;
|
||||
cap_ele->GreenField = 0;
|
||||
cap_ele->ShortGI20Mhz = 1;
|
||||
cap_ele->ShortGI40Mhz = 1;
|
||||
|
||||
pCapELE->TxSTBC = 1;
|
||||
pCapELE->RxSTBC = 0;
|
||||
pCapELE->DelayBA = 0;
|
||||
pCapELE->MaxAMSDUSize = (MAX_RECEIVE_BUFFER_SIZE >= 7935) ? 1 : 0;
|
||||
pCapELE->DssCCk = ((pHT->bRegBW40MHz) ? (pHT->bRegSuppCCK ? 1 : 0) : 0);
|
||||
pCapELE->PSMP = 0;
|
||||
pCapELE->LSigTxopProtect = 0;
|
||||
cap_ele->TxSTBC = 1;
|
||||
cap_ele->RxSTBC = 0;
|
||||
cap_ele->DelayBA = 0;
|
||||
cap_ele->MaxAMSDUSize = (MAX_RECEIVE_BUFFER_SIZE >= 7935) ? 1 : 0;
|
||||
cap_ele->DssCCk = 1;
|
||||
cap_ele->PSMP = 0;
|
||||
cap_ele->LSigTxopProtect = 0;
|
||||
|
||||
netdev_dbg(ieee->dev,
|
||||
"TX HT cap/info ele BW=%d MaxAMSDUSize:%d DssCCk:%d\n",
|
||||
pCapELE->ChlWidth, pCapELE->MaxAMSDUSize, pCapELE->DssCCk);
|
||||
cap_ele->ChlWidth, cap_ele->MaxAMSDUSize, cap_ele->DssCCk);
|
||||
|
||||
if (IsEncrypt) {
|
||||
pCapELE->MPDUDensity = 7;
|
||||
pCapELE->MaxRxAMPDUFactor = 2;
|
||||
if (is_encrypt) {
|
||||
cap_ele->MPDUDensity = 7;
|
||||
cap_ele->MaxRxAMPDUFactor = 2;
|
||||
} else {
|
||||
pCapELE->MaxRxAMPDUFactor = 3;
|
||||
pCapELE->MPDUDensity = 0;
|
||||
cap_ele->MaxRxAMPDUFactor = 3;
|
||||
cap_ele->MPDUDensity = 0;
|
||||
}
|
||||
|
||||
memcpy(pCapELE->MCS, ieee->reg_dot11ht_oper_rate_set, 16);
|
||||
memset(&pCapELE->ExtHTCapInfo, 0, 2);
|
||||
memset(pCapELE->TxBFCap, 0, 4);
|
||||
memcpy(cap_ele->MCS, ieee->reg_dot11ht_oper_rate_set, 16);
|
||||
memset(&cap_ele->ExtHTCapInfo, 0, 2);
|
||||
memset(cap_ele->TxBFCap, 0, 4);
|
||||
|
||||
pCapELE->ASCap = 0;
|
||||
cap_ele->ASCap = 0;
|
||||
|
||||
if (bAssoc) {
|
||||
if (pHT->iot_action & HT_IOT_ACT_DISABLE_MCS15)
|
||||
pCapELE->MCS[1] &= 0x7f;
|
||||
if (assoc) {
|
||||
if (ht->iot_action & HT_IOT_ACT_DISABLE_MCS15)
|
||||
cap_ele->MCS[1] &= 0x7f;
|
||||
|
||||
if (pHT->iot_action & HT_IOT_ACT_DISABLE_MCS14)
|
||||
pCapELE->MCS[1] &= 0xbf;
|
||||
if (ht->iot_action & HT_IOT_ACT_DISABLE_MCS14)
|
||||
cap_ele->MCS[1] &= 0xbf;
|
||||
|
||||
if (pHT->iot_action & HT_IOT_ACT_DISABLE_ALL_2SS)
|
||||
pCapELE->MCS[1] &= 0x00;
|
||||
if (ht->iot_action & HT_IOT_ACT_DISABLE_ALL_2SS)
|
||||
cap_ele->MCS[1] &= 0x00;
|
||||
|
||||
if (pHT->iot_action & HT_IOT_ACT_DISABLE_RX_40MHZ_SHORT_GI)
|
||||
pCapELE->ShortGI40Mhz = 0;
|
||||
if (ht->iot_action & HT_IOT_ACT_DISABLE_RX_40MHZ_SHORT_GI)
|
||||
cap_ele->ShortGI40Mhz = 0;
|
||||
|
||||
if (ieee->GetHalfNmodeSupportByAPsHandler(ieee->dev)) {
|
||||
pCapELE->ChlWidth = 0;
|
||||
pCapELE->MCS[1] = 0;
|
||||
cap_ele->ChlWidth = 0;
|
||||
cap_ele->MCS[1] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void HTConstructInfoElement(struct rtllib_device *ieee, u8 *posHTInfo,
|
||||
u8 *len, u8 IsEncrypt)
|
||||
{
|
||||
struct ht_info_ele *pHTInfoEle = (struct ht_info_ele *)posHTInfo;
|
||||
|
||||
if (!posHTInfo || !pHTInfoEle) {
|
||||
netdev_warn(ieee->dev,
|
||||
"%s(): posHTInfo and pHTInfoEle are null\n",
|
||||
__func__);
|
||||
return;
|
||||
}
|
||||
|
||||
memset(posHTInfo, 0, *len);
|
||||
*len = 0;
|
||||
}
|
||||
|
||||
void HTConstructRT2RTAggElement(struct rtllib_device *ieee, u8 *posRT2RTAgg,
|
||||
void ht_construct_rt2rt_agg_element(struct rtllib_device *ieee, u8 *posRT2RTAgg,
|
||||
u8 *len)
|
||||
{
|
||||
if (!posRT2RTAgg) {
|
||||
@ -366,7 +330,7 @@ void HTConstructRT2RTAggElement(struct rtllib_device *ieee, u8 *posRT2RTAgg,
|
||||
*len = 6 + 2;
|
||||
}
|
||||
|
||||
static u8 HT_PickMCSRate(struct rtllib_device *ieee, u8 *pOperateMCS)
|
||||
static u8 ht_pick_mcs_rate(struct rtllib_device *ieee, u8 *pOperateMCS)
|
||||
{
|
||||
u8 i;
|
||||
|
||||
@ -393,7 +357,7 @@ static u8 HT_PickMCSRate(struct rtllib_device *ieee, u8 *pOperateMCS)
|
||||
return true;
|
||||
}
|
||||
|
||||
u8 HTGetHighestMCSRate(struct rtllib_device *ieee, u8 *pMCSRateSet,
|
||||
u8 ht_get_highest_mcs_rate(struct rtllib_device *ieee, u8 *pMCSRateSet,
|
||||
u8 *pMCSFilter)
|
||||
{
|
||||
u8 i, j;
|
||||
@ -422,8 +386,8 @@ u8 HTGetHighestMCSRate(struct rtllib_device *ieee, u8 *pMCSRateSet,
|
||||
bitMap = availableMcsRate[i];
|
||||
for (j = 0; j < 8; j++) {
|
||||
if ((bitMap % 2) != 0) {
|
||||
if (HTMcsToDataRate(ieee, (8 * i + j)) >
|
||||
HTMcsToDataRate(ieee, mcsRate))
|
||||
if (ht_mcs_to_data_rate(ieee, (8 * i + j)) >
|
||||
ht_mcs_to_data_rate(ieee, mcsRate))
|
||||
mcsRate = 8 * i + j;
|
||||
}
|
||||
bitMap >>= 1;
|
||||
@ -433,7 +397,7 @@ u8 HTGetHighestMCSRate(struct rtllib_device *ieee, u8 *pMCSRateSet,
|
||||
return mcsRate | 0x80;
|
||||
}
|
||||
|
||||
static u8 HTFilterMCSRate(struct rtllib_device *ieee, u8 *pSupportMCS,
|
||||
static u8 ht_filter_mcs_rate(struct rtllib_device *ieee, u8 *pSupportMCS,
|
||||
u8 *pOperateMCS)
|
||||
{
|
||||
u8 i;
|
||||
@ -442,7 +406,7 @@ static u8 HTFilterMCSRate(struct rtllib_device *ieee, u8 *pSupportMCS,
|
||||
pOperateMCS[i] = ieee->reg_dot11tx_ht_oper_rate_set[i] &
|
||||
pSupportMCS[i];
|
||||
|
||||
HT_PickMCSRate(ieee, pOperateMCS);
|
||||
ht_pick_mcs_rate(ieee, pOperateMCS);
|
||||
|
||||
if (ieee->GetHalfNmodeSupportByAPsHandler(ieee->dev))
|
||||
pOperateMCS[1] = 0;
|
||||
@ -453,16 +417,15 @@ static u8 HTFilterMCSRate(struct rtllib_device *ieee, u8 *pSupportMCS,
|
||||
return true;
|
||||
}
|
||||
|
||||
void HTSetConnectBwMode(struct rtllib_device *ieee,
|
||||
void ht_set_connect_bw_mode(struct rtllib_device *ieee,
|
||||
enum ht_channel_width bandwidth,
|
||||
enum ht_extchnl_offset Offset);
|
||||
|
||||
void HTOnAssocRsp(struct rtllib_device *ieee)
|
||||
void ht_on_assoc_rsp(struct rtllib_device *ieee)
|
||||
{
|
||||
struct rt_hi_throughput *ht_info = ieee->ht_info;
|
||||
struct ht_capab_ele *pPeerHTCap = NULL;
|
||||
struct ht_info_ele *pPeerHTInfo = NULL;
|
||||
u16 nMaxAMSDUSize = 0;
|
||||
u8 *pMcsFilter = NULL;
|
||||
|
||||
static const u8 EWC11NHTCap[] = { 0x00, 0x90, 0x4c, 0x33 };
|
||||
@ -489,79 +452,48 @@ void HTOnAssocRsp(struct rtllib_device *ieee)
|
||||
print_hex_dump_bytes("%s: ", __func__, DUMP_PREFIX_NONE,
|
||||
pPeerHTCap, sizeof(struct ht_capab_ele));
|
||||
#endif
|
||||
HTSetConnectBwMode(ieee, (enum ht_channel_width)(pPeerHTCap->ChlWidth),
|
||||
ht_set_connect_bw_mode(ieee, (enum ht_channel_width)(pPeerHTCap->ChlWidth),
|
||||
(enum ht_extchnl_offset)(pPeerHTInfo->ExtChlOffset));
|
||||
ht_info->cur_tx_bw40mhz = ((pPeerHTInfo->RecommemdedTxWidth == 1) ?
|
||||
true : false);
|
||||
|
||||
ht_info->bCurShortGI20MHz = ((ht_info->bRegShortGI20MHz) ?
|
||||
((pPeerHTCap->ShortGI20Mhz == 1) ?
|
||||
true : false) : false);
|
||||
ht_info->bCurShortGI40MHz = ((ht_info->bRegShortGI40MHz) ?
|
||||
((pPeerHTCap->ShortGI40Mhz == 1) ?
|
||||
true : false) : false);
|
||||
ht_info->cur_short_gi_20mhz = ((pPeerHTCap->ShortGI20Mhz == 1) ? true : false);
|
||||
ht_info->cur_short_gi_40mhz = ((pPeerHTCap->ShortGI40Mhz == 1) ? true : false);
|
||||
|
||||
ht_info->bCurSuppCCK = ((ht_info->bRegSuppCCK) ?
|
||||
((pPeerHTCap->DssCCk == 1) ? true :
|
||||
false) : false);
|
||||
|
||||
ht_info->bCurrent_AMSDU_Support = ht_info->bAMSDU_Support;
|
||||
|
||||
nMaxAMSDUSize = (pPeerHTCap->MaxAMSDUSize == 0) ? 3839 : 7935;
|
||||
|
||||
if (ht_info->nAMSDU_MaxSize > nMaxAMSDUSize)
|
||||
ht_info->nCurrent_AMSDU_MaxSize = nMaxAMSDUSize;
|
||||
else
|
||||
ht_info->nCurrent_AMSDU_MaxSize = ht_info->nAMSDU_MaxSize;
|
||||
|
||||
ht_info->bCurrentAMPDUEnable = ht_info->bAMPDUEnable;
|
||||
ht_info->current_ampdu_enable = ht_info->ampdu_enable;
|
||||
if (ieee->rtllib_ap_sec_type &&
|
||||
(ieee->rtllib_ap_sec_type(ieee) & (SEC_ALG_WEP | SEC_ALG_TKIP))) {
|
||||
if ((ht_info->IOTPeer == HT_IOT_PEER_ATHEROS) ||
|
||||
(ht_info->IOTPeer == HT_IOT_PEER_UNKNOWN))
|
||||
ht_info->bCurrentAMPDUEnable = false;
|
||||
if ((ht_info->iot_peer == HT_IOT_PEER_ATHEROS) ||
|
||||
(ht_info->iot_peer == HT_IOT_PEER_UNKNOWN))
|
||||
ht_info->current_ampdu_enable = false;
|
||||
}
|
||||
|
||||
if (!ht_info->reg_rt2rt_aggregation) {
|
||||
if (ht_info->AMPDU_Factor > pPeerHTCap->MaxRxAMPDUFactor)
|
||||
if (ieee->current_network.bssht.bd_rt2rt_aggregation) {
|
||||
if (ieee->pairwise_key_type != KEY_TYPE_NA)
|
||||
ht_info->CurrentAMPDUFactor =
|
||||
pPeerHTCap->MaxRxAMPDUFactor;
|
||||
pPeerHTCap->MaxRxAMPDUFactor;
|
||||
else
|
||||
ht_info->CurrentAMPDUFactor = ht_info->AMPDU_Factor;
|
||||
|
||||
ht_info->CurrentAMPDUFactor = HT_AGG_SIZE_64K;
|
||||
} else {
|
||||
if (ieee->current_network.bssht.bd_rt2rt_aggregation) {
|
||||
if (ieee->pairwise_key_type != KEY_TYPE_NA)
|
||||
ht_info->CurrentAMPDUFactor =
|
||||
pPeerHTCap->MaxRxAMPDUFactor;
|
||||
else
|
||||
ht_info->CurrentAMPDUFactor = HT_AGG_SIZE_64K;
|
||||
} else {
|
||||
ht_info->CurrentAMPDUFactor = min_t(u32, pPeerHTCap->MaxRxAMPDUFactor,
|
||||
HT_AGG_SIZE_32K);
|
||||
}
|
||||
ht_info->CurrentAMPDUFactor = min_t(u32, pPeerHTCap->MaxRxAMPDUFactor,
|
||||
HT_AGG_SIZE_32K);
|
||||
}
|
||||
ht_info->current_mpdu_density = max_t(u8, ht_info->MPDU_Density,
|
||||
pPeerHTCap->MPDUDensity);
|
||||
|
||||
ht_info->current_mpdu_density = pPeerHTCap->MPDUDensity;
|
||||
if (ht_info->iot_action & HT_IOT_ACT_TX_USE_AMSDU_8K) {
|
||||
ht_info->bCurrentAMPDUEnable = false;
|
||||
ht_info->ForcedAMSDUMode = HT_AGG_FORCE_ENABLE;
|
||||
ht_info->current_ampdu_enable = false;
|
||||
}
|
||||
ht_info->cur_rx_reorder_enable = ht_info->reg_rx_reorder_enable;
|
||||
ht_info->cur_rx_reorder_enable = 1;
|
||||
|
||||
if (pPeerHTCap->MCS[0] == 0)
|
||||
pPeerHTCap->MCS[0] = 0xff;
|
||||
|
||||
HTIOTActDetermineRaFunc(ieee, ((pPeerHTCap->MCS[1]) != 0));
|
||||
ht_iot_act_determine_ra_func(ieee, ((pPeerHTCap->MCS[1]) != 0));
|
||||
|
||||
HTFilterMCSRate(ieee, pPeerHTCap->MCS, ieee->dot11ht_oper_rate_set);
|
||||
ht_filter_mcs_rate(ieee, pPeerHTCap->MCS, ieee->dot11ht_oper_rate_set);
|
||||
|
||||
ht_info->peer_mimo_ps = pPeerHTCap->MimoPwrSave;
|
||||
if (ht_info->peer_mimo_ps == MIMO_PS_STATIC)
|
||||
pMcsFilter = MCS_FILTER_1SS;
|
||||
else
|
||||
pMcsFilter = MCS_FILTER_ALL;
|
||||
ieee->HTHighestOperaRate = HTGetHighestMCSRate(ieee,
|
||||
pMcsFilter = MCS_FILTER_ALL;
|
||||
ieee->HTHighestOperaRate = ht_get_highest_mcs_rate(ieee,
|
||||
ieee->dot11ht_oper_rate_set,
|
||||
pMcsFilter);
|
||||
ieee->HTCurrentOperaRate = ieee->HTHighestOperaRate;
|
||||
@ -569,30 +501,23 @@ void HTOnAssocRsp(struct rtllib_device *ieee)
|
||||
ht_info->current_op_mode = pPeerHTInfo->OptMode;
|
||||
}
|
||||
|
||||
void HTInitializeHTInfo(struct rtllib_device *ieee)
|
||||
void ht_initialize_ht_info(struct rtllib_device *ieee)
|
||||
{
|
||||
struct rt_hi_throughput *ht_info = ieee->ht_info;
|
||||
|
||||
ht_info->current_ht_support = false;
|
||||
|
||||
ht_info->bCurBW40MHz = false;
|
||||
ht_info->cur_bw_40mhz = false;
|
||||
ht_info->cur_tx_bw40mhz = false;
|
||||
|
||||
ht_info->bCurShortGI20MHz = false;
|
||||
ht_info->bCurShortGI40MHz = false;
|
||||
ht_info->forced_short_gi = false;
|
||||
ht_info->cur_short_gi_20mhz = false;
|
||||
ht_info->cur_short_gi_40mhz = false;
|
||||
|
||||
ht_info->bCurSuppCCK = true;
|
||||
|
||||
ht_info->bCurrent_AMSDU_Support = false;
|
||||
ht_info->nCurrent_AMSDU_MaxSize = ht_info->nAMSDU_MaxSize;
|
||||
ht_info->current_mpdu_density = ht_info->MPDU_Density;
|
||||
ht_info->CurrentAMPDUFactor = ht_info->AMPDU_Factor;
|
||||
ht_info->current_mpdu_density = 0;
|
||||
ht_info->CurrentAMPDUFactor = ht_info->ampdu_factor;
|
||||
|
||||
memset((void *)(&ht_info->SelfHTCap), 0,
|
||||
sizeof(ht_info->SelfHTCap));
|
||||
memset((void *)(&ht_info->SelfHTInfo), 0,
|
||||
sizeof(ht_info->SelfHTInfo));
|
||||
memset((void *)(&ht_info->PeerHTCapBuf), 0,
|
||||
sizeof(ht_info->PeerHTCapBuf));
|
||||
memset((void *)(&ht_info->PeerHTInfoBuf), 0,
|
||||
@ -600,13 +525,12 @@ void HTInitializeHTInfo(struct rtllib_device *ieee)
|
||||
|
||||
ht_info->sw_bw_in_progress = false;
|
||||
|
||||
ht_info->ePeerHTSpecVer = HT_SPEC_VER_IEEE;
|
||||
ht_info->peer_ht_spec_ver = HT_SPEC_VER_IEEE;
|
||||
|
||||
ht_info->current_rt2rt_aggregation = false;
|
||||
ht_info->current_rt2rt_long_slot_time = false;
|
||||
ht_info->RT2RT_HT_Mode = (enum rt_ht_capability)0;
|
||||
|
||||
ht_info->IOTPeer = 0;
|
||||
ht_info->iot_peer = 0;
|
||||
ht_info->iot_action = 0;
|
||||
ht_info->iot_ra_func = 0;
|
||||
|
||||
@ -619,7 +543,7 @@ void HTInitializeHTInfo(struct rtllib_device *ieee)
|
||||
}
|
||||
}
|
||||
|
||||
void HTInitializeBssDesc(struct bss_ht *pBssHT)
|
||||
void ht_initialize_bss_desc(struct bss_ht *pBssHT)
|
||||
{
|
||||
pBssHT->bd_support_ht = false;
|
||||
memset(pBssHT->bd_ht_cap_buf, 0, sizeof(pBssHT->bd_ht_cap_buf));
|
||||
@ -634,7 +558,7 @@ void HTInitializeBssDesc(struct bss_ht *pBssHT)
|
||||
pBssHT->rt2rt_ht_mode = (enum rt_ht_capability)0;
|
||||
}
|
||||
|
||||
void HTResetSelfAndSavePeerSetting(struct rtllib_device *ieee,
|
||||
void ht_reset_self_and_save_peer_setting(struct rtllib_device *ieee,
|
||||
struct rtllib_network *pNetwork)
|
||||
{
|
||||
struct rt_hi_throughput *ht_info = ieee->ht_info;
|
||||
@ -645,7 +569,7 @@ void HTResetSelfAndSavePeerSetting(struct rtllib_device *ieee,
|
||||
*/
|
||||
if (pNetwork->bssht.bd_support_ht) {
|
||||
ht_info->current_ht_support = true;
|
||||
ht_info->ePeerHTSpecVer = pNetwork->bssht.bd_ht_spec_ver;
|
||||
ht_info->peer_ht_spec_ver = pNetwork->bssht.bd_ht_spec_ver;
|
||||
|
||||
if (pNetwork->bssht.bd_ht_cap_len > 0 &&
|
||||
pNetwork->bssht.bd_ht_cap_len <= sizeof(ht_info->PeerHTCapBuf))
|
||||
@ -660,32 +584,24 @@ void HTResetSelfAndSavePeerSetting(struct rtllib_device *ieee,
|
||||
pNetwork->bssht.bd_ht_info_buf,
|
||||
pNetwork->bssht.bd_ht_info_len);
|
||||
|
||||
if (ht_info->reg_rt2rt_aggregation) {
|
||||
ht_info->current_rt2rt_aggregation =
|
||||
pNetwork->bssht.bd_rt2rt_aggregation;
|
||||
ht_info->current_rt2rt_long_slot_time =
|
||||
pNetwork->bssht.bd_rt2rt_long_slot_time;
|
||||
ht_info->RT2RT_HT_Mode = pNetwork->bssht.rt2rt_ht_mode;
|
||||
} else {
|
||||
ht_info->current_rt2rt_aggregation = false;
|
||||
ht_info->current_rt2rt_long_slot_time = false;
|
||||
ht_info->RT2RT_HT_Mode = (enum rt_ht_capability)0;
|
||||
}
|
||||
ht_info->current_rt2rt_aggregation =
|
||||
pNetwork->bssht.bd_rt2rt_aggregation;
|
||||
ht_info->current_rt2rt_long_slot_time =
|
||||
pNetwork->bssht.bd_rt2rt_long_slot_time;
|
||||
|
||||
HTIOTPeerDetermine(ieee);
|
||||
ht_iot_peer_determine(ieee);
|
||||
|
||||
ht_info->iot_action = 0;
|
||||
bIOTAction = HTIOTActIsMgntUseCCK6M(ieee, pNetwork);
|
||||
bIOTAction = ht_iot_act_is_mgnt_use_cck_6m(ieee, pNetwork);
|
||||
if (bIOTAction)
|
||||
ht_info->iot_action |= HT_IOT_ACT_MGNT_USE_CCK_6M;
|
||||
bIOTAction = HTIOTActIsCCDFsync(ieee);
|
||||
bIOTAction = ht_iot_act_is_ccd_fsync(ieee);
|
||||
if (bIOTAction)
|
||||
ht_info->iot_action |= HT_IOT_ACT_CDD_FSYNC;
|
||||
} else {
|
||||
ht_info->current_ht_support = false;
|
||||
ht_info->current_rt2rt_aggregation = false;
|
||||
ht_info->current_rt2rt_long_slot_time = false;
|
||||
ht_info->RT2RT_HT_Mode = (enum rt_ht_capability)0;
|
||||
|
||||
ht_info->iot_action = 0;
|
||||
ht_info->iot_ra_func = 0;
|
||||
@ -706,7 +622,7 @@ void HT_update_self_and_peer_setting(struct rtllib_device *ieee,
|
||||
}
|
||||
EXPORT_SYMBOL(HT_update_self_and_peer_setting);
|
||||
|
||||
u8 HTCCheck(struct rtllib_device *ieee, u8 *pFrame)
|
||||
u8 ht_c_check(struct rtllib_device *ieee, u8 *pFrame)
|
||||
{
|
||||
if (ieee->ht_info->current_ht_support) {
|
||||
if ((IsQoSDataFrame(pFrame) && Frame_Order(pFrame)) == 1) {
|
||||
@ -717,11 +633,11 @@ u8 HTCCheck(struct rtllib_device *ieee, u8 *pFrame)
|
||||
return false;
|
||||
}
|
||||
|
||||
static void HTSetConnectBwModeCallback(struct rtllib_device *ieee)
|
||||
static void ht_set_connect_bw_mode_callback(struct rtllib_device *ieee)
|
||||
{
|
||||
struct rt_hi_throughput *ht_info = ieee->ht_info;
|
||||
|
||||
if (ht_info->bCurBW40MHz) {
|
||||
if (ht_info->cur_bw_40mhz) {
|
||||
if (ht_info->CurSTAExtChnlOffset == HT_EXTCHNL_OFFSET_UPPER)
|
||||
ieee->set_chan(ieee->dev,
|
||||
ieee->current_network.channel + 2);
|
||||
@ -744,15 +660,12 @@ static void HTSetConnectBwModeCallback(struct rtllib_device *ieee)
|
||||
ht_info->sw_bw_in_progress = false;
|
||||
}
|
||||
|
||||
void HTSetConnectBwMode(struct rtllib_device *ieee,
|
||||
void ht_set_connect_bw_mode(struct rtllib_device *ieee,
|
||||
enum ht_channel_width bandwidth,
|
||||
enum ht_extchnl_offset Offset)
|
||||
{
|
||||
struct rt_hi_throughput *ht_info = ieee->ht_info;
|
||||
|
||||
if (!ht_info->bRegBW40MHz)
|
||||
return;
|
||||
|
||||
if (ieee->GetHalfNmodeSupportByAPsHandler(ieee->dev))
|
||||
bandwidth = HT_CHANNEL_WIDTH_20;
|
||||
|
||||
@ -766,21 +679,21 @@ void HTSetConnectBwMode(struct rtllib_device *ieee,
|
||||
Offset = HT_EXTCHNL_OFFSET_NO_EXT;
|
||||
if (Offset == HT_EXTCHNL_OFFSET_UPPER ||
|
||||
Offset == HT_EXTCHNL_OFFSET_LOWER) {
|
||||
ht_info->bCurBW40MHz = true;
|
||||
ht_info->cur_bw_40mhz = true;
|
||||
ht_info->CurSTAExtChnlOffset = Offset;
|
||||
} else {
|
||||
ht_info->bCurBW40MHz = false;
|
||||
ht_info->cur_bw_40mhz = false;
|
||||
ht_info->CurSTAExtChnlOffset = HT_EXTCHNL_OFFSET_NO_EXT;
|
||||
}
|
||||
} else {
|
||||
ht_info->bCurBW40MHz = false;
|
||||
ht_info->cur_bw_40mhz = false;
|
||||
ht_info->CurSTAExtChnlOffset = HT_EXTCHNL_OFFSET_NO_EXT;
|
||||
}
|
||||
|
||||
netdev_dbg(ieee->dev, "%s():ht_info->bCurBW40MHz:%x\n", __func__,
|
||||
ht_info->bCurBW40MHz);
|
||||
ht_info->cur_bw_40mhz);
|
||||
|
||||
ht_info->sw_bw_in_progress = true;
|
||||
|
||||
HTSetConnectBwModeCallback(ieee);
|
||||
ht_set_connect_bw_mode_callback(ieee);
|
||||
}
|
||||
|
@ -8,7 +8,7 @@
|
||||
#define __INC_QOS_TYPE_H
|
||||
|
||||
struct qos_tsinfo {
|
||||
u8 ucTSID:4;
|
||||
u8 ts_id:4;
|
||||
u8 ucDirection:2;
|
||||
};
|
||||
|
||||
|
@ -17,21 +17,21 @@ enum tr_select {
|
||||
};
|
||||
|
||||
struct ts_common_info {
|
||||
struct list_head List;
|
||||
struct list_head list;
|
||||
u8 addr[ETH_ALEN];
|
||||
struct qos_tsinfo TSpec;
|
||||
struct qos_tsinfo tspec;
|
||||
};
|
||||
|
||||
struct tx_ts_record {
|
||||
struct ts_common_info TsCommonInfo;
|
||||
u16 TxCurSeq;
|
||||
struct ba_record TxPendingBARecord;
|
||||
struct ba_record TxAdmittedBARecord;
|
||||
u8 bAddBaReqInProgress;
|
||||
u8 bAddBaReqDelayed;
|
||||
u8 bUsingBa;
|
||||
u8 bDisable_AddBa;
|
||||
struct timer_list TsAddBaTimer;
|
||||
struct ts_common_info ts_common_info;
|
||||
u16 tx_cur_seq;
|
||||
struct ba_record tx_pending_ba_record;
|
||||
struct ba_record tx_admitted_ba_record;
|
||||
u8 add_ba_req_in_progress;
|
||||
u8 add_ba_req_delayed;
|
||||
u8 using_ba;
|
||||
u8 disable_add_ba;
|
||||
struct timer_list ts_add_ba_timer;
|
||||
u8 num;
|
||||
};
|
||||
|
||||
|
@ -12,7 +12,7 @@ static void RxPktPendingTimeout(struct timer_list *t)
|
||||
{
|
||||
struct rx_ts_record *ts = from_timer(ts, t, rx_pkt_pending_timer);
|
||||
struct rtllib_device *ieee = container_of(ts, struct rtllib_device,
|
||||
RxTsRecord[ts->num]);
|
||||
rx_ts_records[ts->num]);
|
||||
|
||||
struct rx_reorder_entry *pReorderEntry = NULL;
|
||||
|
||||
@ -25,7 +25,7 @@ static void RxPktPendingTimeout(struct timer_list *t)
|
||||
while (!list_empty(&ts->rx_pending_pkt_list)) {
|
||||
pReorderEntry = (struct rx_reorder_entry *)
|
||||
list_entry(ts->rx_pending_pkt_list.prev,
|
||||
struct rx_reorder_entry, List);
|
||||
struct rx_reorder_entry, list);
|
||||
if (index == 0)
|
||||
ts->rx_indicate_seq = pReorderEntry->SeqNum;
|
||||
|
||||
@ -33,7 +33,7 @@ static void RxPktPendingTimeout(struct timer_list *t)
|
||||
ts->rx_indicate_seq) ||
|
||||
SN_EQUAL(pReorderEntry->SeqNum,
|
||||
ts->rx_indicate_seq)) {
|
||||
list_del_init(&pReorderEntry->List);
|
||||
list_del_init(&pReorderEntry->list);
|
||||
|
||||
if (SN_EQUAL(pReorderEntry->SeqNum,
|
||||
ts->rx_indicate_seq))
|
||||
@ -47,7 +47,7 @@ static void RxPktPendingTimeout(struct timer_list *t)
|
||||
pReorderEntry->prxb;
|
||||
index++;
|
||||
|
||||
list_add_tail(&pReorderEntry->List,
|
||||
list_add_tail(&pReorderEntry->list,
|
||||
&ieee->RxReorder_Unused_List);
|
||||
} else {
|
||||
bPktInBuf = true;
|
||||
@ -82,31 +82,31 @@ static void RxPktPendingTimeout(struct timer_list *t)
|
||||
|
||||
static void TsAddBaProcess(struct timer_list *t)
|
||||
{
|
||||
struct tx_ts_record *pTxTs = from_timer(pTxTs, t, TsAddBaTimer);
|
||||
u8 num = pTxTs->num;
|
||||
struct rtllib_device *ieee = container_of(pTxTs, struct rtllib_device,
|
||||
TxTsRecord[num]);
|
||||
struct tx_ts_record *ts = from_timer(ts, t, ts_add_ba_timer);
|
||||
u8 num = ts->num;
|
||||
struct rtllib_device *ieee = container_of(ts, struct rtllib_device,
|
||||
tx_ts_records[num]);
|
||||
|
||||
rtllib_ts_init_add_ba(ieee, pTxTs, BA_POLICY_IMMEDIATE, false);
|
||||
rtllib_ts_init_add_ba(ieee, ts, BA_POLICY_IMMEDIATE, false);
|
||||
netdev_dbg(ieee->dev, "%s(): ADDBA Req is started\n", __func__);
|
||||
}
|
||||
|
||||
static void ResetTsCommonInfo(struct ts_common_info *pTsCommonInfo)
|
||||
static void ResetTsCommonInfo(struct ts_common_info *ts_common_info)
|
||||
{
|
||||
eth_zero_addr(pTsCommonInfo->addr);
|
||||
memset(&pTsCommonInfo->TSpec, 0, sizeof(struct qos_tsinfo));
|
||||
eth_zero_addr(ts_common_info->addr);
|
||||
memset(&ts_common_info->tspec, 0, sizeof(struct qos_tsinfo));
|
||||
}
|
||||
|
||||
static void ResetTxTsEntry(struct tx_ts_record *ts)
|
||||
{
|
||||
ResetTsCommonInfo(&ts->TsCommonInfo);
|
||||
ts->TxCurSeq = 0;
|
||||
ts->bAddBaReqInProgress = false;
|
||||
ts->bAddBaReqDelayed = false;
|
||||
ts->bUsingBa = false;
|
||||
ts->bDisable_AddBa = false;
|
||||
rtllib_reset_ba_entry(&ts->TxAdmittedBARecord);
|
||||
rtllib_reset_ba_entry(&ts->TxPendingBARecord);
|
||||
ResetTsCommonInfo(&ts->ts_common_info);
|
||||
ts->tx_cur_seq = 0;
|
||||
ts->add_ba_req_in_progress = false;
|
||||
ts->add_ba_req_delayed = false;
|
||||
ts->using_ba = false;
|
||||
ts->disable_add_ba = false;
|
||||
rtllib_reset_ba_entry(&ts->tx_admitted_ba_record);
|
||||
rtllib_reset_ba_entry(&ts->tx_pending_ba_record);
|
||||
}
|
||||
|
||||
static void ResetRxTsEntry(struct rx_ts_record *ts)
|
||||
@ -119,8 +119,8 @@ static void ResetRxTsEntry(struct rx_ts_record *ts)
|
||||
|
||||
void rtllib_ts_init(struct rtllib_device *ieee)
|
||||
{
|
||||
struct tx_ts_record *pTxTS = ieee->TxTsRecord;
|
||||
struct rx_ts_record *rxts = ieee->RxTsRecord;
|
||||
struct tx_ts_record *pTxTS = ieee->tx_ts_records;
|
||||
struct rx_ts_record *rxts = ieee->rx_ts_records;
|
||||
struct rx_reorder_entry *pRxReorderEntry = ieee->RxReorderEntry;
|
||||
u8 count = 0;
|
||||
|
||||
@ -130,15 +130,15 @@ void rtllib_ts_init(struct rtllib_device *ieee)
|
||||
|
||||
for (count = 0; count < TOTAL_TS_NUM; count++) {
|
||||
pTxTS->num = count;
|
||||
timer_setup(&pTxTS->TsAddBaTimer, TsAddBaProcess, 0);
|
||||
timer_setup(&pTxTS->ts_add_ba_timer, TsAddBaProcess, 0);
|
||||
|
||||
timer_setup(&pTxTS->TxPendingBARecord.timer, rtllib_ba_setup_timeout,
|
||||
timer_setup(&pTxTS->tx_pending_ba_record.timer, rtllib_ba_setup_timeout,
|
||||
0);
|
||||
timer_setup(&pTxTS->TxAdmittedBARecord.timer,
|
||||
timer_setup(&pTxTS->tx_admitted_ba_record.timer,
|
||||
rtllib_tx_ba_inact_timeout, 0);
|
||||
|
||||
ResetTxTsEntry(pTxTS);
|
||||
list_add_tail(&pTxTS->TsCommonInfo.List,
|
||||
list_add_tail(&pTxTS->ts_common_info.list,
|
||||
&ieee->Tx_TS_Unused_List);
|
||||
pTxTS++;
|
||||
}
|
||||
@ -155,13 +155,13 @@ void rtllib_ts_init(struct rtllib_device *ieee)
|
||||
timer_setup(&rxts->rx_pkt_pending_timer, RxPktPendingTimeout, 0);
|
||||
|
||||
ResetRxTsEntry(rxts);
|
||||
list_add_tail(&rxts->ts_common_info.List,
|
||||
list_add_tail(&rxts->ts_common_info.list,
|
||||
&ieee->Rx_TS_Unused_List);
|
||||
rxts++;
|
||||
}
|
||||
INIT_LIST_HEAD(&ieee->RxReorder_Unused_List);
|
||||
for (count = 0; count < REORDER_ENTRY_NUM; count++) {
|
||||
list_add_tail(&pRxReorderEntry->List,
|
||||
list_add_tail(&pRxReorderEntry->list,
|
||||
&ieee->RxReorder_Unused_List);
|
||||
if (count == (REORDER_ENTRY_NUM - 1))
|
||||
break;
|
||||
@ -196,31 +196,31 @@ static struct ts_common_info *SearchAdmitTRStream(struct rtllib_device *ieee,
|
||||
for (dir = 0; dir <= DIR_BI_DIR; dir++) {
|
||||
if (!search_dir[dir])
|
||||
continue;
|
||||
list_for_each_entry(pRet, psearch_list, List) {
|
||||
list_for_each_entry(pRet, psearch_list, list) {
|
||||
if (memcmp(pRet->addr, addr, 6) == 0 &&
|
||||
pRet->TSpec.ucTSID == TID &&
|
||||
pRet->TSpec.ucDirection == dir)
|
||||
pRet->tspec.ts_id == TID &&
|
||||
pRet->tspec.ucDirection == dir)
|
||||
break;
|
||||
}
|
||||
if (&pRet->List != psearch_list)
|
||||
if (&pRet->list != psearch_list)
|
||||
break;
|
||||
}
|
||||
|
||||
if (pRet && &pRet->List != psearch_list)
|
||||
if (pRet && &pRet->list != psearch_list)
|
||||
return pRet;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void MakeTSEntry(struct ts_common_info *pTsCommonInfo, u8 *addr,
|
||||
static void MakeTSEntry(struct ts_common_info *ts_common_info, u8 *addr,
|
||||
struct qos_tsinfo *pTSPEC)
|
||||
{
|
||||
if (!pTsCommonInfo)
|
||||
if (!ts_common_info)
|
||||
return;
|
||||
|
||||
memcpy(pTsCommonInfo->addr, addr, 6);
|
||||
memcpy(ts_common_info->addr, addr, 6);
|
||||
|
||||
if (pTSPEC)
|
||||
memcpy((u8 *)(&(pTsCommonInfo->TSpec)), (u8 *)pTSPEC,
|
||||
memcpy((u8 *)(&(ts_common_info->tspec)), (u8 *)pTSPEC,
|
||||
sizeof(struct qos_tsinfo));
|
||||
}
|
||||
|
||||
@ -228,8 +228,8 @@ bool rtllib_get_ts(struct rtllib_device *ieee, struct ts_common_info **ppTS,
|
||||
u8 *addr, u8 TID, enum tr_select TxRxSelect, bool bAddNewTs)
|
||||
{
|
||||
u8 UP = 0;
|
||||
struct qos_tsinfo TSpec;
|
||||
struct qos_tsinfo *ts_info = &TSpec;
|
||||
struct qos_tsinfo tspec;
|
||||
struct qos_tsinfo *ts_info = &tspec;
|
||||
struct list_head *pUnusedList;
|
||||
struct list_head *pAddmitList;
|
||||
enum direction_value Dir;
|
||||
@ -286,13 +286,13 @@ bool rtllib_get_ts(struct rtllib_device *ieee, struct ts_common_info **ppTS,
|
||||
|
||||
if (!list_empty(pUnusedList)) {
|
||||
(*ppTS) = list_entry(pUnusedList->next,
|
||||
struct ts_common_info, List);
|
||||
list_del_init(&(*ppTS)->List);
|
||||
struct ts_common_info, list);
|
||||
list_del_init(&(*ppTS)->list);
|
||||
if (TxRxSelect == TX_DIR) {
|
||||
struct tx_ts_record *tmp =
|
||||
container_of(*ppTS,
|
||||
struct tx_ts_record,
|
||||
TsCommonInfo);
|
||||
ts_common_info);
|
||||
ResetTxTsEntry(tmp);
|
||||
} else {
|
||||
struct rx_ts_record *ts =
|
||||
@ -305,11 +305,11 @@ bool rtllib_get_ts(struct rtllib_device *ieee, struct ts_common_info **ppTS,
|
||||
netdev_dbg(ieee->dev,
|
||||
"to init current TS, UP:%d, Dir:%d, addr: %pM ppTs=%p\n",
|
||||
UP, Dir, addr, *ppTS);
|
||||
ts_info->ucTSID = UP;
|
||||
ts_info->ts_id = UP;
|
||||
ts_info->ucDirection = Dir;
|
||||
|
||||
MakeTSEntry(*ppTS, addr, &TSpec);
|
||||
list_add_tail(&((*ppTS)->List), pAddmitList);
|
||||
MakeTSEntry(*ppTS, addr, &tspec);
|
||||
list_add_tail(&((*ppTS)->list), pAddmitList);
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -335,10 +335,10 @@ static void RemoveTsEntry(struct rtllib_device *ieee,
|
||||
while (!list_empty(&ts->rx_pending_pkt_list)) {
|
||||
pRxReorderEntry = (struct rx_reorder_entry *)
|
||||
list_entry(ts->rx_pending_pkt_list.prev,
|
||||
struct rx_reorder_entry, List);
|
||||
struct rx_reorder_entry, list);
|
||||
netdev_dbg(ieee->dev, "%s(): Delete SeqNum %d!\n",
|
||||
__func__, pRxReorderEntry->SeqNum);
|
||||
list_del_init(&pRxReorderEntry->List);
|
||||
list_del_init(&pRxReorderEntry->list);
|
||||
{
|
||||
int i = 0;
|
||||
struct rtllib_rxb *prxb = pRxReorderEntry->prxb;
|
||||
@ -350,13 +350,13 @@ static void RemoveTsEntry(struct rtllib_device *ieee,
|
||||
kfree(prxb);
|
||||
prxb = NULL;
|
||||
}
|
||||
list_add_tail(&pRxReorderEntry->List,
|
||||
list_add_tail(&pRxReorderEntry->list,
|
||||
&ieee->RxReorder_Unused_List);
|
||||
}
|
||||
} else {
|
||||
struct tx_ts_record *pTxTS = (struct tx_ts_record *)pTs;
|
||||
|
||||
del_timer_sync(&pTxTS->TsAddBaTimer);
|
||||
del_timer_sync(&pTxTS->ts_add_ba_timer);
|
||||
}
|
||||
}
|
||||
|
||||
@ -366,37 +366,37 @@ void RemovePeerTS(struct rtllib_device *ieee, u8 *addr)
|
||||
|
||||
netdev_info(ieee->dev, "===========>%s, %pM\n", __func__, addr);
|
||||
|
||||
list_for_each_entry_safe(ts, pTmpTS, &ieee->Tx_TS_Pending_List, List) {
|
||||
list_for_each_entry_safe(ts, pTmpTS, &ieee->Tx_TS_Pending_List, list) {
|
||||
if (memcmp(ts->addr, addr, 6) == 0) {
|
||||
RemoveTsEntry(ieee, ts, TX_DIR);
|
||||
list_del_init(&ts->List);
|
||||
list_add_tail(&ts->List, &ieee->Tx_TS_Unused_List);
|
||||
list_del_init(&ts->list);
|
||||
list_add_tail(&ts->list, &ieee->Tx_TS_Unused_List);
|
||||
}
|
||||
}
|
||||
|
||||
list_for_each_entry_safe(ts, pTmpTS, &ieee->Tx_TS_Admit_List, List) {
|
||||
list_for_each_entry_safe(ts, pTmpTS, &ieee->Tx_TS_Admit_List, list) {
|
||||
if (memcmp(ts->addr, addr, 6) == 0) {
|
||||
netdev_info(ieee->dev,
|
||||
"====>remove Tx_TS_admin_list\n");
|
||||
RemoveTsEntry(ieee, ts, TX_DIR);
|
||||
list_del_init(&ts->List);
|
||||
list_add_tail(&ts->List, &ieee->Tx_TS_Unused_List);
|
||||
list_del_init(&ts->list);
|
||||
list_add_tail(&ts->list, &ieee->Tx_TS_Unused_List);
|
||||
}
|
||||
}
|
||||
|
||||
list_for_each_entry_safe(ts, pTmpTS, &ieee->Rx_TS_Pending_List, List) {
|
||||
list_for_each_entry_safe(ts, pTmpTS, &ieee->Rx_TS_Pending_List, list) {
|
||||
if (memcmp(ts->addr, addr, 6) == 0) {
|
||||
RemoveTsEntry(ieee, ts, RX_DIR);
|
||||
list_del_init(&ts->List);
|
||||
list_add_tail(&ts->List, &ieee->Rx_TS_Unused_List);
|
||||
list_del_init(&ts->list);
|
||||
list_add_tail(&ts->list, &ieee->Rx_TS_Unused_List);
|
||||
}
|
||||
}
|
||||
|
||||
list_for_each_entry_safe(ts, pTmpTS, &ieee->Rx_TS_Admit_List, List) {
|
||||
list_for_each_entry_safe(ts, pTmpTS, &ieee->Rx_TS_Admit_List, list) {
|
||||
if (memcmp(ts->addr, addr, 6) == 0) {
|
||||
RemoveTsEntry(ieee, ts, RX_DIR);
|
||||
list_del_init(&ts->List);
|
||||
list_add_tail(&ts->List, &ieee->Rx_TS_Unused_List);
|
||||
list_del_init(&ts->list);
|
||||
list_add_tail(&ts->list, &ieee->Rx_TS_Unused_List);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -406,43 +406,43 @@ void RemoveAllTS(struct rtllib_device *ieee)
|
||||
{
|
||||
struct ts_common_info *ts, *pTmpTS;
|
||||
|
||||
list_for_each_entry_safe(ts, pTmpTS, &ieee->Tx_TS_Pending_List, List) {
|
||||
list_for_each_entry_safe(ts, pTmpTS, &ieee->Tx_TS_Pending_List, list) {
|
||||
RemoveTsEntry(ieee, ts, TX_DIR);
|
||||
list_del_init(&ts->List);
|
||||
list_add_tail(&ts->List, &ieee->Tx_TS_Unused_List);
|
||||
list_del_init(&ts->list);
|
||||
list_add_tail(&ts->list, &ieee->Tx_TS_Unused_List);
|
||||
}
|
||||
|
||||
list_for_each_entry_safe(ts, pTmpTS, &ieee->Tx_TS_Admit_List, List) {
|
||||
list_for_each_entry_safe(ts, pTmpTS, &ieee->Tx_TS_Admit_List, list) {
|
||||
RemoveTsEntry(ieee, ts, TX_DIR);
|
||||
list_del_init(&ts->List);
|
||||
list_add_tail(&ts->List, &ieee->Tx_TS_Unused_List);
|
||||
list_del_init(&ts->list);
|
||||
list_add_tail(&ts->list, &ieee->Tx_TS_Unused_List);
|
||||
}
|
||||
|
||||
list_for_each_entry_safe(ts, pTmpTS, &ieee->Rx_TS_Pending_List, List) {
|
||||
list_for_each_entry_safe(ts, pTmpTS, &ieee->Rx_TS_Pending_List, list) {
|
||||
RemoveTsEntry(ieee, ts, RX_DIR);
|
||||
list_del_init(&ts->List);
|
||||
list_add_tail(&ts->List, &ieee->Rx_TS_Unused_List);
|
||||
list_del_init(&ts->list);
|
||||
list_add_tail(&ts->list, &ieee->Rx_TS_Unused_List);
|
||||
}
|
||||
|
||||
list_for_each_entry_safe(ts, pTmpTS, &ieee->Rx_TS_Admit_List, List) {
|
||||
list_for_each_entry_safe(ts, pTmpTS, &ieee->Rx_TS_Admit_List, list) {
|
||||
RemoveTsEntry(ieee, ts, RX_DIR);
|
||||
list_del_init(&ts->List);
|
||||
list_add_tail(&ts->List, &ieee->Rx_TS_Unused_List);
|
||||
list_del_init(&ts->list);
|
||||
list_add_tail(&ts->list, &ieee->Rx_TS_Unused_List);
|
||||
}
|
||||
}
|
||||
|
||||
void TsStartAddBaProcess(struct rtllib_device *ieee, struct tx_ts_record *pTxTS)
|
||||
{
|
||||
if (pTxTS->bAddBaReqInProgress == false) {
|
||||
pTxTS->bAddBaReqInProgress = true;
|
||||
if (pTxTS->add_ba_req_in_progress == false) {
|
||||
pTxTS->add_ba_req_in_progress = true;
|
||||
|
||||
if (pTxTS->bAddBaReqDelayed) {
|
||||
if (pTxTS->add_ba_req_delayed) {
|
||||
netdev_dbg(ieee->dev, "Start ADDBA after 60 sec!!\n");
|
||||
mod_timer(&pTxTS->TsAddBaTimer, jiffies +
|
||||
mod_timer(&pTxTS->ts_add_ba_timer, jiffies +
|
||||
msecs_to_jiffies(TS_ADDBA_DELAY));
|
||||
} else {
|
||||
netdev_dbg(ieee->dev, "Immediately Start ADDBA\n");
|
||||
mod_timer(&pTxTS->TsAddBaTimer, jiffies + 10);
|
||||
mod_timer(&pTxTS->ts_add_ba_timer, jiffies + 10);
|
||||
}
|
||||
} else {
|
||||
netdev_dbg(ieee->dev, "BA timer is already added\n");
|
||||
|
@ -103,9 +103,6 @@ struct cb_desc {
|
||||
/* Tx Desc Related flags (8-9) */
|
||||
u8 bLastIniPkt:1;
|
||||
u8 bCmdOrInit:1;
|
||||
u8 bFirstSeg:1;
|
||||
u8 bLastSeg:1;
|
||||
u8 bEncrypt:1;
|
||||
u8 tx_dis_rate_fallback:1;
|
||||
u8 tx_use_drv_assinged_rate:1;
|
||||
u8 bHwSec:1;
|
||||
@ -117,8 +114,8 @@ struct cb_desc {
|
||||
u8 bRTSEnable:1;
|
||||
u8 bUseShortGI:1;
|
||||
u8 bUseShortPreamble:1;
|
||||
u8 bTxEnableFwCalcDur:1;
|
||||
u8 bAMPDUEnable:1;
|
||||
u8 tx_enable_fw_calc_dur:1;
|
||||
u8 ampdu_enable:1;
|
||||
u8 bRTSSTBC:1;
|
||||
u8 RTSSC:1;
|
||||
|
||||
@ -139,7 +136,6 @@ struct cb_desc {
|
||||
u8 bAMSDU:1;
|
||||
u8 bFromAggrQ:1;
|
||||
u8 reserved6:6;
|
||||
u8 macId;
|
||||
u8 priority;
|
||||
|
||||
/* Tx firmware related element(20-27) */
|
||||
@ -471,7 +467,6 @@ enum _REG_PREAMBLE_MODE {
|
||||
* any adverse affects.
|
||||
*/
|
||||
struct rtllib_rx_stats {
|
||||
u64 mac_time;
|
||||
s8 rssi;
|
||||
u8 signal;
|
||||
u8 noise;
|
||||
@ -1047,7 +1042,7 @@ struct bandwidth_autoswitch {
|
||||
#define REORDER_WIN_SIZE 128
|
||||
#define REORDER_ENTRY_NUM 128
|
||||
struct rx_reorder_entry {
|
||||
struct list_head List;
|
||||
struct list_head list;
|
||||
u16 SeqNum;
|
||||
struct rtllib_rxb *prxb;
|
||||
};
|
||||
@ -1123,8 +1118,8 @@ struct rt_link_detect {
|
||||
u16 SlotNum;
|
||||
u16 SlotIndex;
|
||||
|
||||
u32 NumTxOkInPeriod;
|
||||
u32 NumRxOkInPeriod;
|
||||
u32 num_tx_ok_in_period;
|
||||
u32 num_rx_ok_in_period;
|
||||
u32 NumRxUnicastOkInPeriod;
|
||||
bool bBusyTraffic;
|
||||
bool bHigherBusyTraffic;
|
||||
@ -1169,7 +1164,7 @@ struct rt_pmkid_list {
|
||||
u8 Bssid[ETH_ALEN];
|
||||
u8 PMKID[16];
|
||||
u8 SsidBuf[33];
|
||||
u8 bUsed;
|
||||
u8 used;
|
||||
};
|
||||
|
||||
/*************** DRIVER STATUS *****/
|
||||
@ -1192,7 +1187,7 @@ struct rtllib_device {
|
||||
unsigned long status;
|
||||
u8 CntAfterLink;
|
||||
|
||||
enum rt_op_mode OpMode;
|
||||
enum rt_op_mode op_mode;
|
||||
|
||||
/* The last AssocReq/Resp IEs */
|
||||
u8 *assocreq_ies, *assocresp_ies;
|
||||
@ -1224,17 +1219,17 @@ struct rtllib_device {
|
||||
u8 HTHighestOperaRate;
|
||||
u8 tx_dis_rate_fallback;
|
||||
u8 tx_use_drv_assinged_rate;
|
||||
u8 bTxEnableFwCalcDur;
|
||||
u8 tx_enable_fw_calc_dur;
|
||||
atomic_t atm_swbw;
|
||||
|
||||
struct list_head Tx_TS_Admit_List;
|
||||
struct list_head Tx_TS_Pending_List;
|
||||
struct list_head Tx_TS_Unused_List;
|
||||
struct tx_ts_record TxTsRecord[TOTAL_TS_NUM];
|
||||
struct tx_ts_record tx_ts_records[TOTAL_TS_NUM];
|
||||
struct list_head Rx_TS_Admit_List;
|
||||
struct list_head Rx_TS_Pending_List;
|
||||
struct list_head Rx_TS_Unused_List;
|
||||
struct rx_ts_record RxTsRecord[TOTAL_TS_NUM];
|
||||
struct rx_ts_record rx_ts_records[TOTAL_TS_NUM];
|
||||
struct rx_reorder_entry RxReorderEntry[128];
|
||||
struct list_head RxReorder_Unused_List;
|
||||
|
||||
@ -1321,12 +1316,8 @@ struct rtllib_device {
|
||||
u16 scan_watch_dog;
|
||||
|
||||
/* map of allowed channels. 0 is dummy */
|
||||
void *dot11d_info;
|
||||
bool global_domain;
|
||||
u8 active_channel_map[MAX_CHANNEL_NUMBER+1];
|
||||
|
||||
u8 bss_start_channel;
|
||||
|
||||
int rate; /* current rate */
|
||||
int basic_rate;
|
||||
|
||||
@ -1391,7 +1382,7 @@ struct rtllib_device {
|
||||
int mgmt_queue_head;
|
||||
int mgmt_queue_tail;
|
||||
u8 AsocRetryCount;
|
||||
struct sk_buff_head skb_waitQ[MAX_QUEUE_SIZE];
|
||||
struct sk_buff_head skb_waitq[MAX_QUEUE_SIZE];
|
||||
|
||||
bool bdynamic_txpower_enable;
|
||||
|
||||
@ -1411,7 +1402,7 @@ struct rtllib_device {
|
||||
bool FwRWRF;
|
||||
|
||||
struct rt_link_detect link_detect_info;
|
||||
bool bIsAggregateFrame;
|
||||
bool is_aggregate_frame;
|
||||
struct rt_pwr_save_ctrl pwr_save_ctrl;
|
||||
|
||||
/* used if IEEE_SOFTMAC_TX_QUEUE is set */
|
||||
@ -1421,7 +1412,6 @@ struct rtllib_device {
|
||||
struct timer_list associate_timer;
|
||||
|
||||
/* used if IEEE_SOFTMAC_BEACONS is set */
|
||||
struct timer_list beacon_timer;
|
||||
u8 need_sw_enc;
|
||||
struct work_struct associate_complete_wq;
|
||||
struct work_struct ips_leave_wq;
|
||||
@ -1469,7 +1459,7 @@ struct rtllib_device {
|
||||
* This function can sleep. the driver should ensure
|
||||
* the radio has been switched before return.
|
||||
*/
|
||||
void (*set_chan)(struct net_device *dev, short ch);
|
||||
void (*set_chan)(struct net_device *dev, u8 ch);
|
||||
|
||||
/* indicate the driver that the link state is changed
|
||||
* for example it may indicate the card is associated now.
|
||||
@ -1687,8 +1677,8 @@ void rtllib_sta_ps_send_pspoll_frame(struct rtllib_device *ieee);
|
||||
void rtllib_start_protocol(struct rtllib_device *ieee);
|
||||
void rtllib_stop_protocol(struct rtllib_device *ieee);
|
||||
|
||||
void rtllib_EnableNetMonitorMode(struct net_device *dev, bool bInitState);
|
||||
void rtllib_DisableNetMonitorMode(struct net_device *dev, bool bInitState);
|
||||
void rtllib_enable_net_monitor_mode(struct net_device *dev, bool init_state);
|
||||
void rtllib_disable_net_monitor_mode(struct net_device *dev, bool init_state);
|
||||
|
||||
void rtllib_softmac_stop_protocol(struct rtllib_device *ieee);
|
||||
void rtllib_softmac_start_protocol(struct rtllib_device *ieee);
|
||||
@ -1696,7 +1686,6 @@ void rtllib_softmac_start_protocol(struct rtllib_device *ieee);
|
||||
void rtllib_reset_queue(struct rtllib_device *ieee);
|
||||
void rtllib_wake_all_queues(struct rtllib_device *ieee);
|
||||
void rtllib_stop_all_queues(struct rtllib_device *ieee);
|
||||
struct sk_buff *rtllib_get_beacon(struct rtllib_device *ieee);
|
||||
|
||||
void notify_wx_assoc_event(struct rtllib_device *ieee);
|
||||
void rtllib_ps_tx_ack(struct rtllib_device *ieee, short success);
|
||||
@ -1758,39 +1747,37 @@ int rtllib_wx_get_rts(struct rtllib_device *ieee, struct iw_request_info *info,
|
||||
union iwreq_data *wrqu, char *extra);
|
||||
#define MAX_RECEIVE_BUFFER_SIZE 9100
|
||||
|
||||
void HTSetConnectBwMode(struct rtllib_device *ieee,
|
||||
void ht_set_connect_bw_mode(struct rtllib_device *ieee,
|
||||
enum ht_channel_width bandwidth,
|
||||
enum ht_extchnl_offset Offset);
|
||||
void ht_update_default_setting(struct rtllib_device *ieee);
|
||||
void HTConstructCapabilityElement(struct rtllib_device *ieee,
|
||||
void ht_construct_capability_element(struct rtllib_device *ieee,
|
||||
u8 *posHTCap, u8 *len,
|
||||
u8 isEncrypt, bool bAssoc);
|
||||
void HTConstructInfoElement(struct rtllib_device *ieee,
|
||||
u8 *posHTInfo, u8 *len, u8 isEncrypt);
|
||||
void HTConstructRT2RTAggElement(struct rtllib_device *ieee,
|
||||
void ht_construct_rt2rt_agg_element(struct rtllib_device *ieee,
|
||||
u8 *posRT2RTAgg, u8 *len);
|
||||
void HTOnAssocRsp(struct rtllib_device *ieee);
|
||||
void HTInitializeHTInfo(struct rtllib_device *ieee);
|
||||
void HTInitializeBssDesc(struct bss_ht *pBssHT);
|
||||
void HTResetSelfAndSavePeerSetting(struct rtllib_device *ieee,
|
||||
void ht_on_assoc_rsp(struct rtllib_device *ieee);
|
||||
void ht_initialize_ht_info(struct rtllib_device *ieee);
|
||||
void ht_initialize_bss_desc(struct bss_ht *pBssHT);
|
||||
void ht_reset_self_and_save_peer_setting(struct rtllib_device *ieee,
|
||||
struct rtllib_network *pNetwork);
|
||||
void HT_update_self_and_peer_setting(struct rtllib_device *ieee,
|
||||
struct rtllib_network *pNetwork);
|
||||
u8 HTGetHighestMCSRate(struct rtllib_device *ieee, u8 *pMCSRateSet,
|
||||
u8 ht_get_highest_mcs_rate(struct rtllib_device *ieee, u8 *pMCSRateSet,
|
||||
u8 *pMCSFilter);
|
||||
extern u8 MCS_FILTER_ALL[];
|
||||
extern u16 MCS_DATA_RATE[2][2][77];
|
||||
u8 HTCCheck(struct rtllib_device *ieee, u8 *pFrame);
|
||||
void HTResetIOTSetting(struct rt_hi_throughput *ht_info);
|
||||
bool IsHTHalfNmodeAPs(struct rtllib_device *ieee);
|
||||
u16 TxCountToDataRate(struct rtllib_device *ieee, u8 nDataRate);
|
||||
u8 ht_c_check(struct rtllib_device *ieee, u8 *pFrame);
|
||||
void ht_reset_iot_setting(struct rt_hi_throughput *ht_info);
|
||||
bool is_ht_half_nmode_aps(struct rtllib_device *ieee);
|
||||
u16 tx_count_to_data_rate(struct rtllib_device *ieee, u8 nDataRate);
|
||||
int rtllib_rx_ADDBAReq(struct rtllib_device *ieee, struct sk_buff *skb);
|
||||
int rtllib_rx_ADDBARsp(struct rtllib_device *ieee, struct sk_buff *skb);
|
||||
int rtllib_rx_DELBA(struct rtllib_device *ieee, struct sk_buff *skb);
|
||||
void rtllib_ts_init_add_ba(struct rtllib_device *ieee, struct tx_ts_record *ts,
|
||||
u8 policy, u8 bOverwritePending);
|
||||
u8 policy, u8 overwrite_pending);
|
||||
void rtllib_ts_init_del_ba(struct rtllib_device *ieee,
|
||||
struct ts_common_info *pTsCommonInfo,
|
||||
struct ts_common_info *ts_common_info,
|
||||
enum tr_select TxRxSelect);
|
||||
void rtllib_ba_setup_timeout(struct timer_list *t);
|
||||
void rtllib_tx_ba_inact_timeout(struct timer_list *t);
|
||||
|
@ -123,7 +123,7 @@ struct net_device *alloc_rtllib(int sizeof_priv)
|
||||
goto free_softmac;
|
||||
|
||||
ht_update_default_setting(ieee);
|
||||
HTInitializeHTInfo(ieee);
|
||||
ht_initialize_ht_info(ieee);
|
||||
rtllib_ts_init(ieee);
|
||||
for (i = 0; i < IEEE_IBSS_MAC_HASH_SIZE; i++)
|
||||
INIT_LIST_HEAD(&ieee->ibss_mac_hash[i]);
|
||||
|
@ -34,7 +34,6 @@
|
||||
#include <linux/ctype.h>
|
||||
|
||||
#include "rtllib.h"
|
||||
#include "dot11d.h"
|
||||
|
||||
static void rtllib_rx_mgt(struct rtllib_device *ieee, struct sk_buff *skb,
|
||||
struct rtllib_rx_stats *stats);
|
||||
@ -412,19 +411,19 @@ static bool AddReorderEntry(struct rx_ts_record *ts,
|
||||
while (pList->next != &ts->rx_pending_pkt_list) {
|
||||
if (SN_LESS(pReorderEntry->SeqNum, ((struct rx_reorder_entry *)
|
||||
list_entry(pList->next, struct rx_reorder_entry,
|
||||
List))->SeqNum))
|
||||
list))->SeqNum))
|
||||
pList = pList->next;
|
||||
else if (SN_EQUAL(pReorderEntry->SeqNum,
|
||||
((struct rx_reorder_entry *)list_entry(pList->next,
|
||||
struct rx_reorder_entry, List))->SeqNum))
|
||||
struct rx_reorder_entry, list))->SeqNum))
|
||||
return false;
|
||||
else
|
||||
break;
|
||||
}
|
||||
pReorderEntry->List.next = pList->next;
|
||||
pReorderEntry->List.next->prev = &pReorderEntry->List;
|
||||
pReorderEntry->List.prev = pList;
|
||||
pList->next = &pReorderEntry->List;
|
||||
pReorderEntry->list.next = pList->next;
|
||||
pReorderEntry->list.next->prev = &pReorderEntry->list;
|
||||
pReorderEntry->list.prev = pList;
|
||||
pList->next = &pReorderEntry->list;
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -505,15 +504,15 @@ void rtllib_FlushRxTsPendingPkts(struct rtllib_device *ieee,
|
||||
|
||||
pRxReorderEntry = (struct rx_reorder_entry *)
|
||||
list_entry(ts->rx_pending_pkt_list.prev,
|
||||
struct rx_reorder_entry, List);
|
||||
struct rx_reorder_entry, list);
|
||||
netdev_dbg(ieee->dev, "%s(): Indicate SeqNum %d!\n", __func__,
|
||||
pRxReorderEntry->SeqNum);
|
||||
list_del_init(&pRxReorderEntry->List);
|
||||
list_del_init(&pRxReorderEntry->list);
|
||||
|
||||
ieee->RfdArray[RfdCnt] = pRxReorderEntry->prxb;
|
||||
|
||||
RfdCnt = RfdCnt + 1;
|
||||
list_add_tail(&pRxReorderEntry->List,
|
||||
list_add_tail(&pRxReorderEntry->list,
|
||||
&ieee->RxReorder_Unused_List);
|
||||
}
|
||||
rtllib_indicate_packets(ieee, ieee->RfdArray, RfdCnt);
|
||||
@ -602,8 +601,8 @@ static void RxReorderIndicatePacket(struct rtllib_device *ieee,
|
||||
if (!list_empty(&ieee->RxReorder_Unused_List)) {
|
||||
pReorderEntry = (struct rx_reorder_entry *)
|
||||
list_entry(ieee->RxReorder_Unused_List.next,
|
||||
struct rx_reorder_entry, List);
|
||||
list_del_init(&pReorderEntry->List);
|
||||
struct rx_reorder_entry, list);
|
||||
list_del_init(&pReorderEntry->list);
|
||||
|
||||
/* Make a reorder entry and insert
|
||||
* into a the packet list.
|
||||
@ -618,7 +617,7 @@ static void RxReorderIndicatePacket(struct rtllib_device *ieee,
|
||||
"%s(): Duplicate packet is dropped. IndicateSeq: %d, NewSeq: %d\n",
|
||||
__func__, ts->rx_indicate_seq,
|
||||
SeqNum);
|
||||
list_add_tail(&pReorderEntry->List,
|
||||
list_add_tail(&pReorderEntry->list,
|
||||
&ieee->RxReorder_Unused_List);
|
||||
|
||||
for (i = 0; i < prxb->nr_subframes; i++)
|
||||
@ -658,7 +657,7 @@ static void RxReorderIndicatePacket(struct rtllib_device *ieee,
|
||||
pReorderEntry = (struct rx_reorder_entry *)
|
||||
list_entry(ts->rx_pending_pkt_list.prev,
|
||||
struct rx_reorder_entry,
|
||||
List);
|
||||
list);
|
||||
if (SN_LESS(pReorderEntry->SeqNum, ts->rx_indicate_seq) ||
|
||||
SN_EQUAL(pReorderEntry->SeqNum, ts->rx_indicate_seq)) {
|
||||
/* This protect struct buffer from overflow. */
|
||||
@ -670,7 +669,7 @@ static void RxReorderIndicatePacket(struct rtllib_device *ieee,
|
||||
break;
|
||||
}
|
||||
|
||||
list_del_init(&pReorderEntry->List);
|
||||
list_del_init(&pReorderEntry->list);
|
||||
|
||||
if (SN_EQUAL(pReorderEntry->SeqNum, ts->rx_indicate_seq))
|
||||
ts->rx_indicate_seq = (ts->rx_indicate_seq + 1) %
|
||||
@ -681,7 +680,7 @@ static void RxReorderIndicatePacket(struct rtllib_device *ieee,
|
||||
__func__, pReorderEntry->SeqNum);
|
||||
index++;
|
||||
|
||||
list_add_tail(&pReorderEntry->List,
|
||||
list_add_tail(&pReorderEntry->list,
|
||||
&ieee->RxReorder_Unused_List);
|
||||
} else {
|
||||
bPktInBuf = true;
|
||||
@ -731,7 +730,7 @@ static u8 parse_subframe(struct rtllib_device *ieee, struct sk_buff *skb,
|
||||
|
||||
u16 LLCOffset = sizeof(struct ieee80211_hdr_3addr);
|
||||
u16 ChkLength;
|
||||
bool bIsAggregateFrame = false;
|
||||
bool is_aggregate_frame = false;
|
||||
u16 nSubframe_Length;
|
||||
u8 nPadding_Length = 0;
|
||||
u16 SeqNum = 0;
|
||||
@ -740,7 +739,7 @@ static u8 parse_subframe(struct rtllib_device *ieee, struct sk_buff *skb,
|
||||
SeqNum = WLAN_GET_SEQ_SEQ(le16_to_cpu(hdr->seq_ctrl));
|
||||
if ((RTLLIB_QOS_HAS_SEQ(fc)) &&
|
||||
(((union frameqos *)(skb->data + RTLLIB_3ADDR_LEN))->field.reserved))
|
||||
bIsAggregateFrame = true;
|
||||
is_aggregate_frame = true;
|
||||
|
||||
if (RTLLIB_QOS_HAS_SEQ(fc))
|
||||
LLCOffset += 2;
|
||||
@ -753,8 +752,8 @@ static u8 parse_subframe(struct rtllib_device *ieee, struct sk_buff *skb,
|
||||
return 0;
|
||||
|
||||
skb_pull(skb, LLCOffset);
|
||||
ieee->bIsAggregateFrame = bIsAggregateFrame;
|
||||
if (!bIsAggregateFrame) {
|
||||
ieee->is_aggregate_frame = is_aggregate_frame;
|
||||
if (!is_aggregate_frame) {
|
||||
rxb->nr_subframes = 1;
|
||||
|
||||
/* altered by clark 3/30/2010
|
||||
@ -858,7 +857,7 @@ static size_t rtllib_rx_get_hdrlen(struct rtllib_device *ieee,
|
||||
size_t hdrlen;
|
||||
|
||||
hdrlen = rtllib_get_hdrlen(fc);
|
||||
if (HTCCheck(ieee, skb->data)) {
|
||||
if (ht_c_check(ieee, skb->data)) {
|
||||
if (net_ratelimit())
|
||||
netdev_info(ieee->dev, "%s: find HTCControl!\n",
|
||||
__func__);
|
||||
@ -1151,7 +1150,7 @@ static void rtllib_rx_check_leave_lps(struct rtllib_device *ieee, u8 unicast,
|
||||
if (unicast) {
|
||||
if (ieee->link_state == MAC80211_LINKED) {
|
||||
if (((ieee->link_detect_info.NumRxUnicastOkInPeriod +
|
||||
ieee->link_detect_info.NumTxOkInPeriod) > 8) ||
|
||||
ieee->link_detect_info.num_tx_ok_in_period) > 8) ||
|
||||
(ieee->link_detect_info.NumRxUnicastOkInPeriod > 2)) {
|
||||
ieee->leisure_ps_leave(ieee->dev);
|
||||
}
|
||||
@ -1286,7 +1285,7 @@ static int rtllib_rx_InfraAdhoc(struct rtllib_device *ieee, struct sk_buff *skb,
|
||||
|
||||
/* Update statstics for AP roaming */
|
||||
ieee->link_detect_info.NumRecvDataInPeriod++;
|
||||
ieee->link_detect_info.NumRxOkInPeriod++;
|
||||
ieee->link_detect_info.num_rx_ok_in_period++;
|
||||
|
||||
/* Data frame - extract src/dst addresses */
|
||||
rtllib_rx_extract_addr(ieee, hdr, dst, src, bssid);
|
||||
@ -1359,7 +1358,7 @@ static int rtllib_rx_InfraAdhoc(struct rtllib_device *ieee, struct sk_buff *skb,
|
||||
/* Update WAPI PN */
|
||||
|
||||
/* Check if leave LPS */
|
||||
if (ieee->bIsAggregateFrame)
|
||||
if (ieee->is_aggregate_frame)
|
||||
nr_subframes = rxb->nr_subframes;
|
||||
else
|
||||
nr_subframes = 1;
|
||||
@ -1402,7 +1401,7 @@ static int rtllib_rx_Monitor(struct rtllib_device *ieee, struct sk_buff *skb,
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (HTCCheck(ieee, skb->data)) {
|
||||
if (ht_c_check(ieee, skb->data)) {
|
||||
if (net_ratelimit())
|
||||
netdev_info(ieee->dev, "%s: Find HTCControl!\n",
|
||||
__func__);
|
||||
@ -1663,35 +1662,6 @@ static const char *get_info_element_string(u16 id)
|
||||
}
|
||||
}
|
||||
|
||||
static inline void rtllib_extract_country_ie(
|
||||
struct rtllib_device *ieee,
|
||||
struct rtllib_info_element *info_element,
|
||||
struct rtllib_network *network,
|
||||
u8 *addr2)
|
||||
{
|
||||
if (IS_DOT11D_ENABLE(ieee)) {
|
||||
if (info_element->len != 0) {
|
||||
memcpy(network->CountryIeBuf, info_element->data,
|
||||
info_element->len);
|
||||
network->CountryIeLen = info_element->len;
|
||||
|
||||
if (!IS_COUNTRY_IE_VALID(ieee)) {
|
||||
if (rtllib_act_scanning(ieee, false) &&
|
||||
ieee->FirstIe_InScan)
|
||||
netdev_info(ieee->dev,
|
||||
"Received beacon CountryIE, SSID: <%s>\n",
|
||||
network->ssid);
|
||||
dot11d_update_country(ieee, addr2,
|
||||
info_element->len,
|
||||
info_element->data);
|
||||
}
|
||||
}
|
||||
|
||||
if (IS_EQUAL_CIE_SRC(ieee, addr2))
|
||||
UPDATE_CIE_WATCHDOG(ieee);
|
||||
}
|
||||
}
|
||||
|
||||
static void rtllib_parse_mife_generic(struct rtllib_device *ieee,
|
||||
struct rtllib_info_element *info_element,
|
||||
struct rtllib_network *network,
|
||||
@ -2146,8 +2116,6 @@ int rtllib_parse_info_param(struct rtllib_device *ieee,
|
||||
case MFIE_TYPE_COUNTRY:
|
||||
netdev_dbg(ieee->dev, "MFIE_TYPE_COUNTRY: %d bytes\n",
|
||||
info_element->len);
|
||||
rtllib_extract_country_ie(ieee, info_element, network,
|
||||
network->bssid);
|
||||
break;
|
||||
/* TODO */
|
||||
default:
|
||||
@ -2221,7 +2189,7 @@ static inline int rtllib_network_init(
|
||||
network->RSSI = stats->SignalStrength;
|
||||
network->CountryIeLen = 0;
|
||||
memset(network->CountryIeBuf, 0, MAX_IE_LEN);
|
||||
HTInitializeBssDesc(&network->bssht);
|
||||
ht_initialize_bss_desc(&network->bssht);
|
||||
network->flags |= NETWORK_HAS_CCK;
|
||||
|
||||
network->wpa_ie_len = 0;
|
||||
|
@ -18,7 +18,6 @@
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/ieee80211.h>
|
||||
#include "dot11d.h"
|
||||
|
||||
static void rtllib_sta_wakeup(struct rtllib_device *ieee, short nl);
|
||||
|
||||
@ -45,7 +44,7 @@ static unsigned int rtllib_MFIE_rate_len(struct rtllib_device *ieee)
|
||||
* Then it updates the pointer so that
|
||||
* it points after the new MFIE tag added.
|
||||
*/
|
||||
static void rtllib_MFIE_Brate(struct rtllib_device *ieee, u8 **tag_p)
|
||||
static void rtllib_mfie_brate(struct rtllib_device *ieee, u8 **tag_p)
|
||||
{
|
||||
u8 *tag = *tag_p;
|
||||
|
||||
@ -62,7 +61,7 @@ static void rtllib_MFIE_Brate(struct rtllib_device *ieee, u8 **tag_p)
|
||||
*tag_p = tag;
|
||||
}
|
||||
|
||||
static void rtllib_MFIE_Grate(struct rtllib_device *ieee, u8 **tag_p)
|
||||
static void rtllib_mfie_grate(struct rtllib_device *ieee, u8 **tag_p)
|
||||
{
|
||||
u8 *tag = *tag_p;
|
||||
|
||||
@ -83,7 +82,7 @@ static void rtllib_MFIE_Grate(struct rtllib_device *ieee, u8 **tag_p)
|
||||
*tag_p = tag;
|
||||
}
|
||||
|
||||
static void rtllib_WMM_Info(struct rtllib_device *ieee, u8 **tag_p)
|
||||
static void rtllib_wmm_info(struct rtllib_device *ieee, u8 **tag_p)
|
||||
{
|
||||
u8 *tag = *tag_p;
|
||||
|
||||
@ -99,7 +98,7 @@ static void rtllib_WMM_Info(struct rtllib_device *ieee, u8 **tag_p)
|
||||
*tag_p = tag;
|
||||
}
|
||||
|
||||
static void rtllib_TURBO_Info(struct rtllib_device *ieee, u8 **tag_p)
|
||||
static void rtllib_turbo_info(struct rtllib_device *ieee, u8 **tag_p)
|
||||
{
|
||||
u8 *tag = *tag_p;
|
||||
|
||||
@ -135,32 +134,33 @@ static void enqueue_mgmt(struct rtllib_device *ieee, struct sk_buff *skb)
|
||||
|
||||
static void init_mgmt_queue(struct rtllib_device *ieee)
|
||||
{
|
||||
ieee->mgmt_queue_tail = ieee->mgmt_queue_head = 0;
|
||||
ieee->mgmt_queue_tail = 0;
|
||||
ieee->mgmt_queue_head = 0;
|
||||
}
|
||||
|
||||
u8 MgntQuery_TxRateExcludeCCKRates(struct rtllib_device *ieee)
|
||||
{
|
||||
u16 i;
|
||||
u8 QueryRate = 0;
|
||||
u8 BasicRate;
|
||||
u8 query_rate = 0;
|
||||
u8 basic_rate;
|
||||
|
||||
for (i = 0; i < ieee->current_network.rates_len; i++) {
|
||||
BasicRate = ieee->current_network.rates[i] & 0x7F;
|
||||
if (!rtllib_is_cck_rate(BasicRate)) {
|
||||
if (QueryRate == 0) {
|
||||
QueryRate = BasicRate;
|
||||
basic_rate = ieee->current_network.rates[i] & 0x7F;
|
||||
if (!rtllib_is_cck_rate(basic_rate)) {
|
||||
if (query_rate == 0) {
|
||||
query_rate = basic_rate;
|
||||
} else {
|
||||
if (BasicRate < QueryRate)
|
||||
QueryRate = BasicRate;
|
||||
if (basic_rate < query_rate)
|
||||
query_rate = basic_rate;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (QueryRate == 0) {
|
||||
QueryRate = 12;
|
||||
netdev_info(ieee->dev, "No BasicRate found!!\n");
|
||||
if (query_rate == 0) {
|
||||
query_rate = 12;
|
||||
netdev_info(ieee->dev, "No basic_rate found!!\n");
|
||||
}
|
||||
return QueryRate;
|
||||
return query_rate;
|
||||
}
|
||||
|
||||
static u8 MgntQuery_MgntFrameTxRate(struct rtllib_device *ieee)
|
||||
@ -173,12 +173,8 @@ static u8 MgntQuery_MgntFrameTxRate(struct rtllib_device *ieee)
|
||||
else
|
||||
rate = ieee->basic_rate & 0x7f;
|
||||
|
||||
if (rate == 0) {
|
||||
if (ieee->mode == WIRELESS_MODE_N_24G && !ht_info->bCurSuppCCK)
|
||||
rate = 0x0c;
|
||||
else
|
||||
rate = 0x02;
|
||||
}
|
||||
if (rate == 0)
|
||||
rate = 0x02;
|
||||
|
||||
return rate;
|
||||
}
|
||||
@ -240,7 +236,7 @@ inline void softmac_mgmt_xmit(struct sk_buff *skb, struct rtllib_device *ieee)
|
||||
/* check whether the managed packet queued greater than 5 */
|
||||
if (!ieee->check_nic_enough_desc(ieee->dev,
|
||||
tcb_desc->queue_index) ||
|
||||
skb_queue_len(&ieee->skb_waitQ[tcb_desc->queue_index]) ||
|
||||
skb_queue_len(&ieee->skb_waitq[tcb_desc->queue_index]) ||
|
||||
ieee->queue_stop) {
|
||||
/* insert the skb packet to the management queue
|
||||
*
|
||||
@ -250,7 +246,7 @@ inline void softmac_mgmt_xmit(struct sk_buff *skb, struct rtllib_device *ieee)
|
||||
netdev_info(ieee->dev,
|
||||
"%s():insert to waitqueue, queue_index:%d!\n",
|
||||
__func__, tcb_desc->queue_index);
|
||||
skb_queue_tail(&ieee->skb_waitQ[tcb_desc->queue_index],
|
||||
skb_queue_tail(&ieee->skb_waitq[tcb_desc->queue_index],
|
||||
skb);
|
||||
} else {
|
||||
ieee->softmac_hard_start_xmit(skb, ieee->dev);
|
||||
@ -345,65 +341,34 @@ static inline struct sk_buff *rtllib_probe_req(struct rtllib_device *ieee)
|
||||
memcpy(tag, ieee->current_network.ssid, len);
|
||||
tag += len;
|
||||
|
||||
rtllib_MFIE_Brate(ieee, &tag);
|
||||
rtllib_MFIE_Grate(ieee, &tag);
|
||||
rtllib_mfie_brate(ieee, &tag);
|
||||
rtllib_mfie_grate(ieee, &tag);
|
||||
|
||||
return skb;
|
||||
}
|
||||
|
||||
static struct sk_buff *rtllib_get_beacon_(struct rtllib_device *ieee);
|
||||
|
||||
static void rtllib_send_beacon(struct rtllib_device *ieee)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
|
||||
if (!ieee->ieee_up)
|
||||
return;
|
||||
skb = rtllib_get_beacon_(ieee);
|
||||
|
||||
if (skb) {
|
||||
softmac_mgmt_xmit(skb, ieee);
|
||||
ieee->softmac_stats.tx_beacons++;
|
||||
}
|
||||
|
||||
if (ieee->beacon_txing && ieee->ieee_up)
|
||||
mod_timer(&ieee->beacon_timer, jiffies +
|
||||
(msecs_to_jiffies(ieee->current_network.beacon_interval - 5)));
|
||||
}
|
||||
|
||||
static void rtllib_send_beacon_cb(struct timer_list *t)
|
||||
{
|
||||
struct rtllib_device *ieee =
|
||||
from_timer(ieee, t, beacon_timer);
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&ieee->beacon_lock, flags);
|
||||
rtllib_send_beacon(ieee);
|
||||
spin_unlock_irqrestore(&ieee->beacon_lock, flags);
|
||||
}
|
||||
|
||||
/* Enables network monitor mode, all rx packets will be received. */
|
||||
void rtllib_EnableNetMonitorMode(struct net_device *dev,
|
||||
bool bInitState)
|
||||
void rtllib_enable_net_monitor_mode(struct net_device *dev,
|
||||
bool init_state)
|
||||
{
|
||||
struct rtllib_device *ieee = netdev_priv_rsl(dev);
|
||||
|
||||
netdev_info(dev, "========>Enter Monitor Mode\n");
|
||||
|
||||
ieee->AllowAllDestAddrHandler(dev, true, !bInitState);
|
||||
ieee->AllowAllDestAddrHandler(dev, true, !init_state);
|
||||
}
|
||||
|
||||
/* Disables network monitor mode. Only packets destinated to
|
||||
* us will be received.
|
||||
*/
|
||||
void rtllib_DisableNetMonitorMode(struct net_device *dev,
|
||||
bool bInitState)
|
||||
void rtllib_disable_net_monitor_mode(struct net_device *dev,
|
||||
bool init_state)
|
||||
{
|
||||
struct rtllib_device *ieee = netdev_priv_rsl(dev);
|
||||
|
||||
netdev_info(dev, "========>Exit Monitor Mode\n");
|
||||
|
||||
ieee->AllowAllDestAddrHandler(dev, false, !bInitState);
|
||||
ieee->AllowAllDestAddrHandler(dev, false, !init_state);
|
||||
}
|
||||
|
||||
static void rtllib_send_probe(struct rtllib_device *ieee)
|
||||
@ -425,12 +390,6 @@ static void rtllib_send_probe_requests(struct rtllib_device *ieee)
|
||||
}
|
||||
}
|
||||
|
||||
static void rtllib_update_active_chan_map(struct rtllib_device *ieee)
|
||||
{
|
||||
memcpy(ieee->active_channel_map, GET_DOT11D_INFO(ieee)->channel_map,
|
||||
MAX_CHANNEL_NUMBER + 1);
|
||||
}
|
||||
|
||||
/* this performs syncro scan blocking the caller until all channels
|
||||
* in the allowed channel map has been checked.
|
||||
*/
|
||||
@ -439,8 +398,6 @@ static void rtllib_softmac_scan_syncro(struct rtllib_device *ieee)
|
||||
union iwreq_data wrqu;
|
||||
short ch = 0;
|
||||
|
||||
rtllib_update_active_chan_map(ieee);
|
||||
|
||||
ieee->be_scan_inprogress = true;
|
||||
|
||||
mutex_lock(&ieee->scan_mutex);
|
||||
@ -492,10 +449,6 @@ out:
|
||||
ieee->actscanning = false;
|
||||
ieee->sync_scan_hurryup = 0;
|
||||
|
||||
if (ieee->link_state >= MAC80211_LINKED) {
|
||||
if (IS_DOT11D_ENABLE(ieee))
|
||||
dot11d_scan_complete(ieee);
|
||||
}
|
||||
mutex_unlock(&ieee->scan_mutex);
|
||||
|
||||
ieee->be_scan_inprogress = false;
|
||||
@ -510,8 +463,6 @@ static void rtllib_softmac_scan_wq(void *data)
|
||||
struct rtllib_device, softmac_scan_wq);
|
||||
u8 last_channel = ieee->current_network.channel;
|
||||
|
||||
rtllib_update_active_chan_map(ieee);
|
||||
|
||||
if (!ieee->ieee_up)
|
||||
return;
|
||||
if (rtllib_act_scanning(ieee, true))
|
||||
@ -552,8 +503,6 @@ static void rtllib_softmac_scan_wq(void *data)
|
||||
return;
|
||||
|
||||
out:
|
||||
if (IS_DOT11D_ENABLE(ieee))
|
||||
dot11d_scan_complete(ieee);
|
||||
ieee->current_network.channel = last_channel;
|
||||
|
||||
out1:
|
||||
@ -609,10 +558,6 @@ static void rtllib_start_scan(struct rtllib_device *ieee)
|
||||
{
|
||||
ieee->rtllib_ips_leave_wq(ieee->dev);
|
||||
|
||||
if (IS_DOT11D_ENABLE(ieee)) {
|
||||
if (IS_COUNTRY_IE_VALID(ieee))
|
||||
RESET_CIE_WATCHDOG(ieee);
|
||||
}
|
||||
if (ieee->softmac_features & IEEE_SOFTMAC_SCAN) {
|
||||
if (ieee->scanning_continue == 0) {
|
||||
ieee->actscanning = true;
|
||||
@ -625,10 +570,6 @@ static void rtllib_start_scan(struct rtllib_device *ieee)
|
||||
/* called with wx_mutex held */
|
||||
void rtllib_start_scan_syncro(struct rtllib_device *ieee)
|
||||
{
|
||||
if (IS_DOT11D_ENABLE(ieee)) {
|
||||
if (IS_COUNTRY_IE_VALID(ieee))
|
||||
RESET_CIE_WATCHDOG(ieee);
|
||||
}
|
||||
ieee->sync_scan_hurryup = 0;
|
||||
if (ieee->softmac_features & IEEE_SOFTMAC_SCAN)
|
||||
rtllib_softmac_scan_syncro(ieee);
|
||||
@ -677,152 +618,6 @@ rtllib_authentication_req(struct rtllib_network *beacon,
|
||||
return skb;
|
||||
}
|
||||
|
||||
static struct sk_buff *rtllib_probe_resp(struct rtllib_device *ieee,
|
||||
const u8 *dest)
|
||||
{
|
||||
u8 *tag;
|
||||
int beacon_size;
|
||||
struct rtllib_probe_response *beacon_buf;
|
||||
struct sk_buff *skb = NULL;
|
||||
int encrypt;
|
||||
int atim_len, erp_len;
|
||||
struct lib80211_crypt_data *crypt;
|
||||
|
||||
char *ssid = ieee->current_network.ssid;
|
||||
int ssid_len = ieee->current_network.ssid_len;
|
||||
int rate_len = ieee->current_network.rates_len + 2;
|
||||
int rate_ex_len = ieee->current_network.rates_ex_len;
|
||||
int wpa_ie_len = ieee->wpa_ie_len;
|
||||
u8 erpinfo_content = 0;
|
||||
|
||||
u8 *tmp_ht_cap_buf = NULL;
|
||||
u8 tmp_ht_cap_len = 0;
|
||||
u8 *tmp_ht_info_buf = NULL;
|
||||
u8 tmp_ht_info_len = 0;
|
||||
struct rt_hi_throughput *ht_info = ieee->ht_info;
|
||||
u8 *tmp_generic_ie_buf = NULL;
|
||||
u8 tmp_generic_ie_len = 0;
|
||||
|
||||
if (rate_ex_len > 0)
|
||||
rate_ex_len += 2;
|
||||
|
||||
if (ieee->current_network.capability & WLAN_CAPABILITY_IBSS)
|
||||
atim_len = 4;
|
||||
else
|
||||
atim_len = 0;
|
||||
|
||||
if ((ieee->current_network.mode == WIRELESS_MODE_G) ||
|
||||
(ieee->current_network.mode == WIRELESS_MODE_N_24G &&
|
||||
ieee->ht_info->bCurSuppCCK)) {
|
||||
erp_len = 3;
|
||||
erpinfo_content = 0;
|
||||
if (ieee->current_network.buseprotection)
|
||||
erpinfo_content |= ERP_UseProtection;
|
||||
} else {
|
||||
erp_len = 0;
|
||||
}
|
||||
|
||||
crypt = ieee->crypt_info.crypt[ieee->crypt_info.tx_keyidx];
|
||||
encrypt = crypt && crypt->ops &&
|
||||
((strcmp(crypt->ops->name, "R-WEP") == 0 || wpa_ie_len));
|
||||
if (ieee->ht_info->current_ht_support) {
|
||||
tmp_ht_cap_buf = (u8 *)&(ieee->ht_info->SelfHTCap);
|
||||
tmp_ht_cap_len = sizeof(ieee->ht_info->SelfHTCap);
|
||||
tmp_ht_info_buf = (u8 *)&(ieee->ht_info->SelfHTInfo);
|
||||
tmp_ht_info_len = sizeof(ieee->ht_info->SelfHTInfo);
|
||||
HTConstructCapabilityElement(ieee, tmp_ht_cap_buf,
|
||||
&tmp_ht_cap_len, encrypt, false);
|
||||
HTConstructInfoElement(ieee, tmp_ht_info_buf, &tmp_ht_info_len,
|
||||
encrypt);
|
||||
|
||||
if (ht_info->reg_rt2rt_aggregation) {
|
||||
tmp_generic_ie_buf = ieee->ht_info->sz_rt2rt_agg_buf;
|
||||
tmp_generic_ie_len =
|
||||
sizeof(ieee->ht_info->sz_rt2rt_agg_buf);
|
||||
HTConstructRT2RTAggElement(ieee, tmp_generic_ie_buf,
|
||||
&tmp_generic_ie_len);
|
||||
}
|
||||
}
|
||||
|
||||
beacon_size = sizeof(struct rtllib_probe_response) + 2 +
|
||||
ssid_len + 3 + rate_len + rate_ex_len + atim_len + erp_len
|
||||
+ wpa_ie_len + ieee->tx_headroom;
|
||||
skb = dev_alloc_skb(beacon_size);
|
||||
if (!skb)
|
||||
return NULL;
|
||||
|
||||
skb_reserve(skb, ieee->tx_headroom);
|
||||
|
||||
beacon_buf = skb_put(skb, (beacon_size - ieee->tx_headroom));
|
||||
ether_addr_copy(beacon_buf->header.addr1, dest);
|
||||
ether_addr_copy(beacon_buf->header.addr2, ieee->dev->dev_addr);
|
||||
ether_addr_copy(beacon_buf->header.addr3, ieee->current_network.bssid);
|
||||
|
||||
beacon_buf->header.duration_id = 0;
|
||||
beacon_buf->beacon_interval =
|
||||
cpu_to_le16(ieee->current_network.beacon_interval);
|
||||
beacon_buf->capability =
|
||||
cpu_to_le16(ieee->current_network.capability &
|
||||
WLAN_CAPABILITY_IBSS);
|
||||
beacon_buf->capability |=
|
||||
cpu_to_le16(ieee->current_network.capability &
|
||||
WLAN_CAPABILITY_SHORT_PREAMBLE);
|
||||
|
||||
if (ieee->current_network.capability & WLAN_CAPABILITY_SHORT_SLOT_TIME)
|
||||
beacon_buf->capability |=
|
||||
cpu_to_le16(WLAN_CAPABILITY_SHORT_SLOT_TIME);
|
||||
|
||||
crypt = ieee->crypt_info.crypt[ieee->crypt_info.tx_keyidx];
|
||||
if (encrypt)
|
||||
beacon_buf->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY);
|
||||
|
||||
beacon_buf->header.frame_control = cpu_to_le16(IEEE80211_STYPE_PROBE_RESP);
|
||||
beacon_buf->info_element[0].id = MFIE_TYPE_SSID;
|
||||
beacon_buf->info_element[0].len = ssid_len;
|
||||
|
||||
tag = (u8 *)beacon_buf->info_element[0].data;
|
||||
|
||||
memcpy(tag, ssid, ssid_len);
|
||||
|
||||
tag += ssid_len;
|
||||
|
||||
*(tag++) = MFIE_TYPE_RATES;
|
||||
*(tag++) = rate_len - 2;
|
||||
memcpy(tag, ieee->current_network.rates, rate_len - 2);
|
||||
tag += rate_len - 2;
|
||||
|
||||
*(tag++) = MFIE_TYPE_DS_SET;
|
||||
*(tag++) = 1;
|
||||
*(tag++) = ieee->current_network.channel;
|
||||
|
||||
if (atim_len) {
|
||||
u16 val16;
|
||||
*(tag++) = MFIE_TYPE_IBSS_SET;
|
||||
*(tag++) = 2;
|
||||
val16 = ieee->current_network.atim_window;
|
||||
memcpy((u8 *)tag, (u8 *)&val16, 2);
|
||||
tag += 2;
|
||||
}
|
||||
|
||||
if (erp_len) {
|
||||
*(tag++) = MFIE_TYPE_ERP;
|
||||
*(tag++) = 1;
|
||||
*(tag++) = erpinfo_content;
|
||||
}
|
||||
if (rate_ex_len) {
|
||||
*(tag++) = MFIE_TYPE_RATES_EX;
|
||||
*(tag++) = rate_ex_len - 2;
|
||||
memcpy(tag, ieee->current_network.rates_ex, rate_ex_len - 2);
|
||||
tag += rate_ex_len - 2;
|
||||
}
|
||||
|
||||
if (wpa_ie_len) {
|
||||
memcpy(tag, ieee->wpa_ie, ieee->wpa_ie_len);
|
||||
tag += ieee->wpa_ie_len;
|
||||
}
|
||||
return skb;
|
||||
}
|
||||
|
||||
static struct sk_buff *rtllib_null_func(struct rtllib_device *ieee, short pwr)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
@ -875,7 +670,7 @@ static inline int SecIsInPMKIDList(struct rtllib_device *ieee, u8 *bssid)
|
||||
int i = 0;
|
||||
|
||||
do {
|
||||
if ((ieee->PMKIDList[i].bUsed) &&
|
||||
if ((ieee->PMKIDList[i].used) &&
|
||||
(memcmp(ieee->PMKIDList[i].Bssid, bssid, ETH_ALEN) == 0))
|
||||
break;
|
||||
i++;
|
||||
@ -933,15 +728,15 @@ rtllib_association_req(struct rtllib_network *beacon,
|
||||
}
|
||||
|
||||
if (ieee->ht_info->current_ht_support && ieee->ht_info->enable_ht) {
|
||||
ht_cap_buf = (u8 *)&(ieee->ht_info->SelfHTCap);
|
||||
ht_cap_buf = (u8 *)&ieee->ht_info->SelfHTCap;
|
||||
ht_cap_len = sizeof(ieee->ht_info->SelfHTCap);
|
||||
HTConstructCapabilityElement(ieee, ht_cap_buf, &ht_cap_len,
|
||||
ht_construct_capability_element(ieee, ht_cap_buf, &ht_cap_len,
|
||||
encrypt, true);
|
||||
if (ieee->ht_info->current_rt2rt_aggregation) {
|
||||
realtek_ie_buf = ieee->ht_info->sz_rt2rt_agg_buf;
|
||||
realtek_ie_len =
|
||||
sizeof(ieee->ht_info->sz_rt2rt_agg_buf);
|
||||
HTConstructRT2RTAggElement(ieee, realtek_ie_buf,
|
||||
ht_construct_rt2rt_agg_element(ieee, realtek_ie_buf,
|
||||
&realtek_ie_len);
|
||||
}
|
||||
}
|
||||
@ -1071,7 +866,7 @@ rtllib_association_req(struct rtllib_network *beacon,
|
||||
tag += osCcxVerNum.Length;
|
||||
}
|
||||
if (ieee->ht_info->current_ht_support && ieee->ht_info->enable_ht) {
|
||||
if (ieee->ht_info->ePeerHTSpecVer != HT_SPEC_VER_EWC) {
|
||||
if (ieee->ht_info->peer_ht_spec_ver != HT_SPEC_VER_EWC) {
|
||||
tag = skb_put(skb, ht_cap_len);
|
||||
*tag++ = MFIE_TYPE_HT_CAP;
|
||||
*tag++ = ht_cap_len - 2;
|
||||
@ -1093,7 +888,7 @@ rtllib_association_req(struct rtllib_network *beacon,
|
||||
}
|
||||
if (wmm_info_len) {
|
||||
tag = skb_put(skb, wmm_info_len);
|
||||
rtllib_WMM_Info(ieee, &tag);
|
||||
rtllib_wmm_info(ieee, &tag);
|
||||
}
|
||||
|
||||
if (wps_ie_len && ieee->wps_ie)
|
||||
@ -1101,11 +896,11 @@ rtllib_association_req(struct rtllib_network *beacon,
|
||||
|
||||
if (turbo_info_len) {
|
||||
tag = skb_put(skb, turbo_info_len);
|
||||
rtllib_TURBO_Info(ieee, &tag);
|
||||
rtllib_turbo_info(ieee, &tag);
|
||||
}
|
||||
|
||||
if (ieee->ht_info->current_ht_support && ieee->ht_info->enable_ht) {
|
||||
if (ieee->ht_info->ePeerHTSpecVer == HT_SPEC_VER_EWC) {
|
||||
if (ieee->ht_info->peer_ht_spec_ver == HT_SPEC_VER_EWC) {
|
||||
tag = skb_put(skb, ht_cap_len);
|
||||
*tag++ = MFIE_TYPE_GENERIC;
|
||||
*tag++ = ht_cap_len - 2;
|
||||
@ -1123,7 +918,7 @@ rtllib_association_req(struct rtllib_network *beacon,
|
||||
|
||||
kfree(ieee->assocreq_ies);
|
||||
ieee->assocreq_ies = NULL;
|
||||
ies = &(hdr->info_element[0].id);
|
||||
ies = &hdr->info_element[0].id;
|
||||
ieee->assocreq_ies_len = (skb->data + skb->len) - ies;
|
||||
ieee->assocreq_ies = kmemdup(ies, ieee->assocreq_ies_len, GFP_ATOMIC);
|
||||
if (!ieee->assocreq_ies)
|
||||
@ -1269,7 +1064,7 @@ static void rtllib_associate_complete_wq(void *data)
|
||||
}
|
||||
if (ieee->ht_info->current_ht_support && ieee->ht_info->enable_ht) {
|
||||
netdev_info(ieee->dev, "Successfully associated, ht enabled\n");
|
||||
HTOnAssocRsp(ieee);
|
||||
ht_on_assoc_rsp(ieee);
|
||||
} else {
|
||||
netdev_info(ieee->dev,
|
||||
"Successfully associated, ht not enabled(%d, %d)\n",
|
||||
@ -1314,7 +1109,7 @@ static void rtllib_associate_procedure_wq(void *data)
|
||||
mutex_lock(&ieee->wx_mutex);
|
||||
|
||||
rtllib_stop_scan(ieee);
|
||||
HTSetConnectBwMode(ieee, HT_CHANNEL_WIDTH_20, HT_EXTCHNL_OFFSET_NO_EXT);
|
||||
ht_set_connect_bw_mode(ieee, HT_CHANNEL_WIDTH_20, HT_EXTCHNL_OFFSET_NO_EXT);
|
||||
if (ieee->rf_power_state == rf_off) {
|
||||
ieee->rtllib_ips_leave_wq(ieee->dev);
|
||||
mutex_unlock(&ieee->wx_mutex);
|
||||
@ -1417,21 +1212,20 @@ inline void rtllib_softmac_new_net(struct rtllib_device *ieee,
|
||||
!(ieee->softmac_features & IEEE_SOFTMAC_SCAN))
|
||||
rtllib_stop_scan_syncro(ieee);
|
||||
|
||||
HTResetIOTSetting(ieee->ht_info);
|
||||
ht_reset_iot_setting(ieee->ht_info);
|
||||
ieee->wmm_acm = 0;
|
||||
if (ieee->iw_mode == IW_MODE_INFRA) {
|
||||
/* Join the network for the first time */
|
||||
ieee->AsocRetryCount = 0;
|
||||
if ((ieee->current_network.qos_data.supported == 1) &&
|
||||
ieee->current_network.bssht.bd_support_ht)
|
||||
HTResetSelfAndSavePeerSetting(ieee,
|
||||
ht_reset_self_and_save_peer_setting(ieee,
|
||||
&(ieee->current_network));
|
||||
else
|
||||
ieee->ht_info->current_ht_support = false;
|
||||
|
||||
ieee->link_state = RTLLIB_ASSOCIATING;
|
||||
schedule_delayed_work(
|
||||
&ieee->associate_procedure_wq, 0);
|
||||
schedule_delayed_work(&ieee->associate_procedure_wq, 0);
|
||||
} else {
|
||||
if (rtllib_is_54g(&ieee->current_network)) {
|
||||
ieee->rate = 108;
|
||||
@ -1825,7 +1619,7 @@ rtllib_rx_assoc_resp(struct rtllib_device *ieee, struct sk_buff *skb,
|
||||
|
||||
kfree(ieee->assocresp_ies);
|
||||
ieee->assocresp_ies = NULL;
|
||||
ies = &(assoc_resp->info_element[0].id);
|
||||
ies = &assoc_resp->info_element[0].id;
|
||||
ieee->assocresp_ies_len = (skb->data + skb->len) - ies;
|
||||
ieee->assocresp_ies = kmemdup(ies,
|
||||
ieee->assocresp_ies_len,
|
||||
@ -1841,8 +1635,7 @@ rtllib_rx_assoc_resp(struct rtllib_device *ieee, struct sk_buff *skb,
|
||||
"Association response status code 0x%x\n",
|
||||
errcode);
|
||||
if (ieee->AsocRetryCount < RT_ASOC_RETRY_LIMIT)
|
||||
schedule_delayed_work(
|
||||
&ieee->associate_procedure_wq, 0);
|
||||
schedule_delayed_work(&ieee->associate_procedure_wq, 0);
|
||||
else
|
||||
rtllib_associate_abort(ieee);
|
||||
}
|
||||
@ -1872,7 +1665,7 @@ static void rtllib_rx_auth_resp(struct rtllib_device *ieee, struct sk_buff *skb)
|
||||
ieee->softmac_stats.rx_auth_rs_ok++;
|
||||
if (!(ieee->ht_info->iot_action & HT_IOT_ACT_PURE_N_MODE)) {
|
||||
if (!ieee->GetNmodeSupportBySecCfg(ieee->dev)) {
|
||||
if (IsHTHalfNmodeAPs(ieee)) {
|
||||
if (is_ht_half_nmode_aps(ieee)) {
|
||||
bSupportNmode = true;
|
||||
bHalfSupportNmode = true;
|
||||
} else {
|
||||
@ -2030,7 +1823,7 @@ void rtllib_softmac_xmit(struct rtllib_txb *txb, struct rtllib_device *ieee)
|
||||
* the wait queue
|
||||
*/
|
||||
for (i = 0; i < txb->nr_frags; i++) {
|
||||
queue_len = skb_queue_len(&ieee->skb_waitQ[queue_index]);
|
||||
queue_len = skb_queue_len(&ieee->skb_waitq[queue_index]);
|
||||
if ((queue_len != 0) ||
|
||||
(!ieee->check_nic_enough_desc(ieee->dev, queue_index)) ||
|
||||
(ieee->queue_stop)) {
|
||||
@ -2039,13 +1832,12 @@ void rtllib_softmac_xmit(struct rtllib_txb *txb, struct rtllib_device *ieee)
|
||||
* to check it any more.
|
||||
*/
|
||||
if (queue_len < 200)
|
||||
skb_queue_tail(&ieee->skb_waitQ[queue_index],
|
||||
skb_queue_tail(&ieee->skb_waitq[queue_index],
|
||||
txb->fragments[i]);
|
||||
else
|
||||
kfree_skb(txb->fragments[i]);
|
||||
} else {
|
||||
ieee->softmac_data_hard_start_xmit(
|
||||
txb->fragments[i],
|
||||
ieee->softmac_data_hard_start_xmit(txb->fragments[i],
|
||||
ieee->dev, ieee->rate);
|
||||
}
|
||||
}
|
||||
@ -2090,10 +1882,6 @@ static void rtllib_start_bss(struct rtllib_device *ieee)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
if (IS_DOT11D_ENABLE(ieee) && !IS_COUNTRY_IE_VALID(ieee)) {
|
||||
if (!ieee->global_domain)
|
||||
return;
|
||||
}
|
||||
/* check if we have already found the net we
|
||||
* are interested in (if any).
|
||||
* if not (we are disassociated and we are not
|
||||
@ -2121,6 +1909,7 @@ static void rtllib_link_change_wq(void *data)
|
||||
struct rtllib_device, link_change_wq);
|
||||
ieee->link_change(ieee->dev);
|
||||
}
|
||||
|
||||
/* called only in userspace context */
|
||||
void rtllib_disassociate(struct rtllib_device *ieee)
|
||||
{
|
||||
@ -2128,8 +1917,6 @@ void rtllib_disassociate(struct rtllib_device *ieee)
|
||||
if (ieee->softmac_features & IEEE_SOFTMAC_TX_QUEUE)
|
||||
rtllib_reset_queue(ieee);
|
||||
|
||||
if (IS_DOT11D_ENABLE(ieee))
|
||||
dot11d_reset(ieee);
|
||||
ieee->link_state = MAC80211_NOLINK;
|
||||
ieee->is_set_key = false;
|
||||
ieee->wap_set = 0;
|
||||
@ -2181,46 +1968,6 @@ exit:
|
||||
mutex_unlock(&ieee->wx_mutex);
|
||||
}
|
||||
|
||||
static struct sk_buff *rtllib_get_beacon_(struct rtllib_device *ieee)
|
||||
{
|
||||
static const u8 broadcast_addr[] = {
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff
|
||||
};
|
||||
struct sk_buff *skb;
|
||||
struct rtllib_probe_response *b;
|
||||
|
||||
skb = rtllib_probe_resp(ieee, broadcast_addr);
|
||||
|
||||
if (!skb)
|
||||
return NULL;
|
||||
|
||||
b = (struct rtllib_probe_response *)skb->data;
|
||||
b->header.frame_control = cpu_to_le16(IEEE80211_STYPE_BEACON);
|
||||
|
||||
return skb;
|
||||
}
|
||||
|
||||
struct sk_buff *rtllib_get_beacon(struct rtllib_device *ieee)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
struct rtllib_probe_response *b;
|
||||
|
||||
skb = rtllib_get_beacon_(ieee);
|
||||
if (!skb)
|
||||
return NULL;
|
||||
|
||||
b = (struct rtllib_probe_response *)skb->data;
|
||||
b->header.seq_ctrl = cpu_to_le16(ieee->seq_ctrl[0] << 4);
|
||||
|
||||
if (ieee->seq_ctrl[0] == 0xFFF)
|
||||
ieee->seq_ctrl[0] = 0;
|
||||
else
|
||||
ieee->seq_ctrl[0]++;
|
||||
|
||||
return skb;
|
||||
}
|
||||
EXPORT_SYMBOL(rtllib_get_beacon);
|
||||
|
||||
void rtllib_softmac_stop_protocol(struct rtllib_device *ieee)
|
||||
{
|
||||
rtllib_stop_scan_syncro(ieee);
|
||||
@ -2279,8 +2026,6 @@ void rtllib_start_protocol(struct rtllib_device *ieee)
|
||||
short ch = 0;
|
||||
int i = 0;
|
||||
|
||||
rtllib_update_active_chan_map(ieee);
|
||||
|
||||
if (ieee->proto_started)
|
||||
return;
|
||||
|
||||
@ -2326,18 +2071,15 @@ int rtllib_softmac_init(struct rtllib_device *ieee)
|
||||
ieee->link_state = MAC80211_NOLINK;
|
||||
for (i = 0; i < 5; i++)
|
||||
ieee->seq_ctrl[i] = 0;
|
||||
ieee->dot11d_info = kzalloc(sizeof(struct rt_dot11d_info), GFP_ATOMIC);
|
||||
if (!ieee->dot11d_info)
|
||||
return -ENOMEM;
|
||||
|
||||
ieee->link_detect_info.SlotIndex = 0;
|
||||
ieee->link_detect_info.SlotNum = 2;
|
||||
ieee->link_detect_info.NumRecvBcnInPeriod = 0;
|
||||
ieee->link_detect_info.NumRecvDataInPeriod = 0;
|
||||
ieee->link_detect_info.NumTxOkInPeriod = 0;
|
||||
ieee->link_detect_info.NumRxOkInPeriod = 0;
|
||||
ieee->link_detect_info.num_tx_ok_in_period = 0;
|
||||
ieee->link_detect_info.num_rx_ok_in_period = 0;
|
||||
ieee->link_detect_info.NumRxUnicastOkInPeriod = 0;
|
||||
ieee->bIsAggregateFrame = false;
|
||||
ieee->is_aggregate_frame = false;
|
||||
ieee->assoc_id = 0;
|
||||
ieee->queue_stop = 0;
|
||||
ieee->scanning_continue = 0;
|
||||
@ -2369,8 +2111,6 @@ int rtllib_softmac_init(struct rtllib_device *ieee)
|
||||
|
||||
timer_setup(&ieee->associate_timer, rtllib_associate_abort_cb, 0);
|
||||
|
||||
timer_setup(&ieee->beacon_timer, rtllib_send_beacon_cb, 0);
|
||||
|
||||
INIT_DELAYED_WORK(&ieee->link_change_wq, (void *)rtllib_link_change_wq);
|
||||
INIT_WORK(&ieee->associate_complete_wq, (void *)rtllib_associate_complete_wq);
|
||||
INIT_DELAYED_WORK(&ieee->associate_procedure_wq, (void *)rtllib_associate_procedure_wq);
|
||||
@ -2404,9 +2144,6 @@ void rtllib_softmac_free(struct rtllib_device *ieee)
|
||||
cancel_work_sync(&ieee->ips_leave_wq);
|
||||
cancel_work_sync(&ieee->wx_sync_scan_wq);
|
||||
cancel_work_sync(&ieee->ps_task);
|
||||
|
||||
kfree(ieee->dot11d_info);
|
||||
ieee->dot11d_info = NULL;
|
||||
}
|
||||
|
||||
static inline struct sk_buff *
|
||||
@ -2493,7 +2230,7 @@ u8 rtllib_ap_sec_type(struct rtllib_device *ieee)
|
||||
return SEC_ALG_WEP;
|
||||
} else if ((wpa_ie_len != 0)) {
|
||||
if (((ieee->wpa_ie[0] == 0xdd) &&
|
||||
(!memcmp(&(ieee->wpa_ie[14]), ccmp_ie, 4))) ||
|
||||
(!memcmp(&ieee->wpa_ie[14], ccmp_ie, 4))) ||
|
||||
((ieee->wpa_ie[0] == 0x30) &&
|
||||
(!memcmp(&ieee->wpa_ie[10], ccmp_rsn_ie, 4))))
|
||||
return SEC_ALG_CCMP;
|
||||
@ -2508,7 +2245,7 @@ static void rtllib_MlmeDisassociateRequest(struct rtllib_device *rtllib,
|
||||
u8 *asSta, u8 asRsn)
|
||||
{
|
||||
u8 i;
|
||||
u8 OpMode;
|
||||
u8 op_mode;
|
||||
|
||||
RemovePeerTS(rtllib, asSta);
|
||||
|
||||
@ -2517,10 +2254,10 @@ static void rtllib_MlmeDisassociateRequest(struct rtllib_device *rtllib,
|
||||
|
||||
for (i = 0; i < 6; i++)
|
||||
rtllib->current_network.bssid[i] = 0x22;
|
||||
OpMode = RT_OP_MODE_NO_LINK;
|
||||
rtllib->OpMode = RT_OP_MODE_NO_LINK;
|
||||
op_mode = RT_OP_MODE_NO_LINK;
|
||||
rtllib->op_mode = RT_OP_MODE_NO_LINK;
|
||||
rtllib->SetHwRegHandler(rtllib->dev, HW_VAR_MEDIA_STATUS,
|
||||
(u8 *)(&OpMode));
|
||||
(u8 *)(&op_mode));
|
||||
rtllib_disassociate(rtllib);
|
||||
|
||||
rtllib->SetHwRegHandler(rtllib->dev, HW_VAR_BSSID,
|
||||
@ -2528,11 +2265,7 @@ static void rtllib_MlmeDisassociateRequest(struct rtllib_device *rtllib,
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
rtllib_MgntDisconnectAP(
|
||||
struct rtllib_device *rtllib,
|
||||
u8 asRsn
|
||||
)
|
||||
static void rtllib_MgntDisconnectAP(struct rtllib_device *rtllib, u8 asRsn)
|
||||
{
|
||||
bool bFilterOutNonAssociatedBSSID = false;
|
||||
|
||||
|
@ -14,7 +14,6 @@
|
||||
#include <linux/etherdevice.h>
|
||||
|
||||
#include "rtllib.h"
|
||||
#include "dot11d.h"
|
||||
|
||||
int rtllib_wx_set_freq(struct rtllib_device *ieee, struct iw_request_info *a,
|
||||
union iwreq_data *wrqu, char *b)
|
||||
@ -208,7 +207,7 @@ int rtllib_wx_get_rate(struct rtllib_device *ieee,
|
||||
{
|
||||
u32 tmp_rate;
|
||||
|
||||
tmp_rate = TxCountToDataRate(ieee,
|
||||
tmp_rate = tx_count_to_data_rate(ieee,
|
||||
ieee->softmac_stats.CurrentShowTxate);
|
||||
wrqu->bitrate.value = tmp_rate * 500000;
|
||||
|
||||
@ -267,11 +266,11 @@ int rtllib_wx_set_mode(struct rtllib_device *ieee, struct iw_request_info *a,
|
||||
|
||||
if (wrqu->mode == IW_MODE_MONITOR) {
|
||||
ieee->dev->type = ARPHRD_IEEE80211;
|
||||
rtllib_EnableNetMonitorMode(ieee->dev, false);
|
||||
rtllib_enable_net_monitor_mode(ieee->dev, false);
|
||||
} else {
|
||||
ieee->dev->type = ARPHRD_ETHER;
|
||||
if (ieee->iw_mode == IW_MODE_MONITOR)
|
||||
rtllib_DisableNetMonitorMode(ieee->dev, false);
|
||||
rtllib_disable_net_monitor_mode(ieee->dev, false);
|
||||
}
|
||||
|
||||
if (!ieee->proto_started) {
|
||||
@ -318,10 +317,10 @@ void rtllib_wx_sync_scan_wq(void *data)
|
||||
ieee->ScanOperationBackupHandler(ieee->dev, SCAN_OPT_BACKUP);
|
||||
|
||||
if (ieee->ht_info->current_ht_support && ieee->ht_info->enable_ht &&
|
||||
ieee->ht_info->bCurBW40MHz) {
|
||||
ieee->ht_info->cur_bw_40mhz) {
|
||||
b40M = 1;
|
||||
chan_offset = ieee->ht_info->CurSTAExtChnlOffset;
|
||||
bandwidth = (enum ht_channel_width)ieee->ht_info->bCurBW40MHz;
|
||||
bandwidth = (enum ht_channel_width)ieee->ht_info->cur_bw_40mhz;
|
||||
ieee->set_bw_mode_handler(ieee->dev, HT_CHANNEL_WIDTH_20,
|
||||
HT_EXTCHNL_OFFSET_NO_EXT);
|
||||
}
|
||||
|
@ -267,7 +267,7 @@ static void rtllib_tx_query_agg_cap(struct rtllib_device *ieee,
|
||||
struct cb_desc *tcb_desc)
|
||||
{
|
||||
struct rt_hi_throughput *ht_info = ieee->ht_info;
|
||||
struct tx_ts_record *pTxTs = NULL;
|
||||
struct tx_ts_record *ts = NULL;
|
||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
|
||||
|
||||
if (rtllib_act_scanning(ieee, false))
|
||||
@ -288,52 +288,35 @@ static void rtllib_tx_query_agg_cap(struct rtllib_device *ieee,
|
||||
|
||||
if (!ieee->GetNmodeSupportBySecCfg(ieee->dev))
|
||||
return;
|
||||
if (ht_info->bCurrentAMPDUEnable) {
|
||||
if (!rtllib_get_ts(ieee, (struct ts_common_info **)(&pTxTs), hdr->addr1,
|
||||
if (ht_info->current_ampdu_enable) {
|
||||
if (!rtllib_get_ts(ieee, (struct ts_common_info **)(&ts), hdr->addr1,
|
||||
skb->priority, TX_DIR, true)) {
|
||||
netdev_info(ieee->dev, "%s: can't get TS\n", __func__);
|
||||
return;
|
||||
}
|
||||
if (!pTxTs->TxAdmittedBARecord.b_valid) {
|
||||
if (!ts->tx_admitted_ba_record.b_valid) {
|
||||
if (ieee->wpa_ie_len && (ieee->pairwise_key_type ==
|
||||
KEY_TYPE_NA)) {
|
||||
;
|
||||
} else if (tcb_desc->bdhcp == 1) {
|
||||
;
|
||||
} else if (!pTxTs->bDisable_AddBa) {
|
||||
TsStartAddBaProcess(ieee, pTxTs);
|
||||
} else if (!ts->disable_add_ba) {
|
||||
TsStartAddBaProcess(ieee, ts);
|
||||
}
|
||||
goto FORCED_AGG_SETTING;
|
||||
} else if (!pTxTs->bUsingBa) {
|
||||
if (SN_LESS(pTxTs->TxAdmittedBARecord.ba_start_seq_ctrl.field.seq_num,
|
||||
(pTxTs->TxCurSeq + 1) % 4096))
|
||||
pTxTs->bUsingBa = true;
|
||||
return;
|
||||
} else if (!ts->using_ba) {
|
||||
if (SN_LESS(ts->tx_admitted_ba_record.ba_start_seq_ctrl.field.seq_num,
|
||||
(ts->tx_cur_seq + 1) % 4096))
|
||||
ts->using_ba = true;
|
||||
else
|
||||
goto FORCED_AGG_SETTING;
|
||||
return;
|
||||
}
|
||||
if (ieee->iw_mode == IW_MODE_INFRA) {
|
||||
tcb_desc->bAMPDUEnable = true;
|
||||
tcb_desc->ampdu_enable = true;
|
||||
tcb_desc->ampdu_factor = ht_info->CurrentAMPDUFactor;
|
||||
tcb_desc->ampdu_density = ht_info->current_mpdu_density;
|
||||
}
|
||||
}
|
||||
FORCED_AGG_SETTING:
|
||||
switch (ht_info->ForcedAMPDUMode) {
|
||||
case HT_AGG_AUTO:
|
||||
break;
|
||||
|
||||
case HT_AGG_FORCE_ENABLE:
|
||||
tcb_desc->bAMPDUEnable = true;
|
||||
tcb_desc->ampdu_density = ht_info->forced_mpdu_density;
|
||||
tcb_desc->ampdu_factor = ht_info->forced_ampdu_factor;
|
||||
break;
|
||||
|
||||
case HT_AGG_FORCE_DISABLE:
|
||||
tcb_desc->bAMPDUEnable = false;
|
||||
tcb_desc->ampdu_density = 0;
|
||||
tcb_desc->ampdu_factor = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void rtllib_query_ShortPreambleMode(struct rtllib_device *ieee,
|
||||
@ -357,14 +340,9 @@ static void rtllib_query_HTCapShortGI(struct rtllib_device *ieee,
|
||||
if (!ht_info->current_ht_support || !ht_info->enable_ht)
|
||||
return;
|
||||
|
||||
if (ht_info->forced_short_gi) {
|
||||
if (ht_info->cur_bw_40mhz && ht_info->cur_short_gi_40mhz)
|
||||
tcb_desc->bUseShortGI = true;
|
||||
return;
|
||||
}
|
||||
|
||||
if (ht_info->bCurBW40MHz && ht_info->bCurShortGI40MHz)
|
||||
tcb_desc->bUseShortGI = true;
|
||||
else if (!ht_info->bCurBW40MHz && ht_info->bCurShortGI20MHz)
|
||||
else if (!ht_info->cur_bw_40mhz && ht_info->cur_short_gi_20mhz)
|
||||
tcb_desc->bUseShortGI = true;
|
||||
}
|
||||
|
||||
@ -383,7 +361,7 @@ static void rtllib_query_BandwidthMode(struct rtllib_device *ieee,
|
||||
|
||||
if ((tcb_desc->data_rate & 0x80) == 0)
|
||||
return;
|
||||
if (ht_info->bCurBW40MHz && ht_info->cur_tx_bw40mhz &&
|
||||
if (ht_info->cur_bw_40mhz && ht_info->cur_tx_bw40mhz &&
|
||||
!ieee->bandwidth_auto_switch.bforced_tx20Mhz)
|
||||
tcb_desc->bPacketBW = true;
|
||||
}
|
||||
@ -441,9 +419,9 @@ static void rtllib_query_protectionmode(struct rtllib_device *ieee,
|
||||
if (ht_info->current_ht_support && ht_info->enable_ht) {
|
||||
u8 HTOpMode = ht_info->current_op_mode;
|
||||
|
||||
if ((ht_info->bCurBW40MHz && (HTOpMode == 2 ||
|
||||
if ((ht_info->cur_bw_40mhz && (HTOpMode == 2 ||
|
||||
HTOpMode == 3)) ||
|
||||
(!ht_info->bCurBW40MHz && HTOpMode == 3)) {
|
||||
(!ht_info->cur_bw_40mhz && HTOpMode == 3)) {
|
||||
tcb_desc->rts_rate = MGN_24M;
|
||||
tcb_desc->bRTSEnable = true;
|
||||
break;
|
||||
@ -454,7 +432,7 @@ static void rtllib_query_protectionmode(struct rtllib_device *ieee,
|
||||
tcb_desc->bRTSEnable = true;
|
||||
break;
|
||||
}
|
||||
if (tcb_desc->bAMPDUEnable) {
|
||||
if (tcb_desc->ampdu_enable) {
|
||||
tcb_desc->rts_rate = MGN_24M;
|
||||
tcb_desc->bRTSEnable = false;
|
||||
break;
|
||||
@ -500,8 +478,8 @@ static u16 rtllib_query_seqnum(struct rtllib_device *ieee, struct sk_buff *skb,
|
||||
if (!rtllib_get_ts(ieee, (struct ts_common_info **)(&ts), dst,
|
||||
skb->priority, TX_DIR, true))
|
||||
return 0;
|
||||
seqnum = ts->TxCurSeq;
|
||||
ts->TxCurSeq = (ts->TxCurSeq + 1) % 4096;
|
||||
seqnum = ts->tx_cur_seq;
|
||||
ts->tx_cur_seq = (ts->tx_cur_seq + 1) % 4096;
|
||||
return seqnum;
|
||||
}
|
||||
return 0;
|
||||
@ -847,7 +825,7 @@ static int rtllib_xmit_inter(struct sk_buff *skb, struct net_device *dev)
|
||||
if (txb) {
|
||||
tcb_desc = (struct cb_desc *)
|
||||
(txb->fragments[0]->cb + MAX_DEV_ADDR_SIZE);
|
||||
tcb_desc->bTxEnableFwCalcDur = 1;
|
||||
tcb_desc->tx_enable_fw_calc_dur = 1;
|
||||
tcb_desc->priority = skb->priority;
|
||||
|
||||
if (ether_type == ETH_P_PAE) {
|
||||
|
@ -134,7 +134,7 @@ static inline char *rtl819x_translate_scan(struct rtllib_device *ieee,
|
||||
((ht_cap->ShortGI40Mhz) ? 1 : 0) :
|
||||
((ht_cap->ShortGI20Mhz) ? 1 : 0);
|
||||
|
||||
max_mcs = HTGetHighestMCSRate(ieee, ht_cap->MCS,
|
||||
max_mcs = ht_get_highest_mcs_rate(ieee, ht_cap->MCS,
|
||||
MCS_FILTER_ALL);
|
||||
rate = MCS_DATA_RATE[is40M][isShortGI][max_mcs & 0x7f];
|
||||
if (rate > max_rate)
|
||||
|
@ -221,8 +221,7 @@ struct net_device *r8712_init_netdev(void)
|
||||
|
||||
static u32 start_drv_threads(struct _adapter *padapter)
|
||||
{
|
||||
padapter->cmd_thread = kthread_run(r8712_cmd_thread, padapter, "%s",
|
||||
padapter->pnetdev->name);
|
||||
padapter->cmd_thread = kthread_run(r8712_cmd_thread, padapter, "%s", padapter->pnetdev->name);
|
||||
if (IS_ERR(padapter->cmd_thread))
|
||||
return _FAIL;
|
||||
return _SUCCESS;
|
||||
|
@ -213,8 +213,8 @@ u16 r8712_efuse_get_current_size(struct _adapter *adapter)
|
||||
u8 hworden = 0;
|
||||
u8 efuse_data, word_cnts = 0;
|
||||
|
||||
while (bContinual && efuse_one_byte_read(adapter, efuse_addr,
|
||||
&efuse_data) && (efuse_addr < efuse_available_max_size)) {
|
||||
while (bContinual && efuse_one_byte_read(adapter, efuse_addr, &efuse_data) &&
|
||||
(efuse_addr < efuse_available_max_size)) {
|
||||
if (efuse_data != 0xFF) {
|
||||
hworden = efuse_data & 0x0F;
|
||||
word_cnts = calculate_word_cnts(hworden);
|
||||
@ -252,9 +252,8 @@ u8 r8712_efuse_pg_packet_read(struct _adapter *adapter, u8 offset, u8 *data)
|
||||
memset(tmpdata, 0xFF, PGPKT_DATA_SIZE);
|
||||
for (tmpidx = 0; tmpidx < word_cnts * 2;
|
||||
tmpidx++) {
|
||||
if (efuse_one_byte_read(adapter,
|
||||
efuse_addr + 1 + tmpidx,
|
||||
&efuse_data)) {
|
||||
if (efuse_one_byte_read(adapter, efuse_addr + 1 + tmpidx,
|
||||
&efuse_data)) {
|
||||
tmpdata[tmpidx] = efuse_data;
|
||||
} else {
|
||||
ret = false;
|
||||
|
@ -267,8 +267,7 @@ union recv_frame *r8712_recvframe_chk_defrag(struct _adapter *padapter,
|
||||
/*the first fragment*/
|
||||
if (!list_empty(&pdefrag_q->queue)) {
|
||||
/*free current defrag_q */
|
||||
r8712_free_recvframe_queue(pdefrag_q,
|
||||
pfree_recv_queue);
|
||||
r8712_free_recvframe_queue(pdefrag_q, pfree_recv_queue);
|
||||
}
|
||||
}
|
||||
/* Then enqueue the 0~(n-1) fragment to the defrag_q */
|
||||
|
@ -147,9 +147,8 @@ static u32 get_ff_hwaddr(struct xmit_frame *pxmitframe)
|
||||
}
|
||||
|
||||
static struct xmit_frame *dequeue_one_xmitframe(struct xmit_priv *pxmitpriv,
|
||||
struct hw_xmit *phwxmit,
|
||||
struct tx_servq *ptxservq,
|
||||
struct __queue *pframe_queue)
|
||||
struct hw_xmit *phwxmit, struct tx_servq *ptxservq,
|
||||
struct __queue *pframe_queue)
|
||||
{
|
||||
struct list_head *xmitframe_plist, *xmitframe_phead;
|
||||
struct xmit_frame *pxmitframe = NULL;
|
||||
@ -167,7 +166,7 @@ static struct xmit_frame *dequeue_one_xmitframe(struct xmit_priv *pxmitpriv,
|
||||
}
|
||||
|
||||
static struct xmit_frame *dequeue_xframe_ex(struct xmit_priv *pxmitpriv,
|
||||
struct hw_xmit *phwxmit_i, sint entry)
|
||||
struct hw_xmit *phwxmit_i, sint entry)
|
||||
{
|
||||
unsigned long irqL0;
|
||||
struct list_head *sta_plist, *sta_phead;
|
||||
@ -197,11 +196,10 @@ static struct xmit_frame *dequeue_xframe_ex(struct xmit_priv *pxmitpriv,
|
||||
sta_phead = &phwxmit->sta_queue->queue;
|
||||
sta_plist = sta_phead->next;
|
||||
while (!end_of_queue_search(sta_phead, sta_plist)) {
|
||||
ptxservq = container_of(sta_plist, struct tx_servq,
|
||||
tx_pending);
|
||||
ptxservq = container_of(sta_plist, struct tx_servq, tx_pending);
|
||||
pframe_queue = &ptxservq->sta_pending;
|
||||
pxmitframe = dequeue_one_xmitframe(pxmitpriv, phwxmit,
|
||||
ptxservq, pframe_queue);
|
||||
pxmitframe = dequeue_one_xmitframe(pxmitpriv, phwxmit, ptxservq,
|
||||
pframe_queue);
|
||||
if (pxmitframe) {
|
||||
phwxmit->accnt--;
|
||||
goto exit_dequeue_xframe_ex;
|
||||
@ -221,8 +219,7 @@ exit_dequeue_xframe_ex:
|
||||
return pxmitframe;
|
||||
}
|
||||
|
||||
void r8712_do_queue_select(struct _adapter *padapter,
|
||||
struct pkt_attrib *pattrib)
|
||||
void r8712_do_queue_select(struct _adapter *padapter, struct pkt_attrib *pattrib)
|
||||
{
|
||||
unsigned int qsel = 0;
|
||||
struct dvobj_priv *pdvobj = &padapter->dvobjpriv;
|
||||
@ -292,14 +289,12 @@ void r8712_append_mpdu_unit(struct xmit_buf *pxmitbuf,
|
||||
r8712_xmit_complete(padapter, pxmitframe);
|
||||
if (pxmitframe->attrib.ether_type != 0x0806) {
|
||||
if ((pxmitframe->attrib.ether_type != 0x888e) &&
|
||||
(pxmitframe->attrib.dhcp_pkt != 1)) {
|
||||
r8712_issue_addbareq_cmd(padapter,
|
||||
pxmitframe->attrib.priority);
|
||||
(pxmitframe->attrib.dhcp_pkt != 1)) {
|
||||
r8712_issue_addbareq_cmd(padapter, pxmitframe->attrib.priority);
|
||||
}
|
||||
}
|
||||
pxmitframe->last[0] = 1;
|
||||
update_txdesc(pxmitframe, (uint *)(pxmitframe->buf_addr),
|
||||
pxmitframe->attrib.last_txcmdsz);
|
||||
update_txdesc(pxmitframe, (uint *)(pxmitframe->buf_addr), pxmitframe->attrib.last_txcmdsz);
|
||||
/*padding zero */
|
||||
last_txcmdsz = pxmitframe->attrib.last_txcmdsz;
|
||||
padding_sz = (8 - (last_txcmdsz % 8));
|
||||
@ -333,8 +328,7 @@ void r8712_xmitframe_aggr_1st(struct xmit_buf *pxmitbuf,
|
||||
pxmitbuf->aggr_nr = 1;
|
||||
}
|
||||
|
||||
u16 r8712_xmitframe_aggr_next(struct xmit_buf *pxmitbuf,
|
||||
struct xmit_frame *pxmitframe)
|
||||
u16 r8712_xmitframe_aggr_next(struct xmit_buf *pxmitbuf, struct xmit_frame *pxmitframe)
|
||||
{
|
||||
pxmitframe->pxmitbuf = pxmitbuf;
|
||||
pxmitbuf->priv_data = pxmitframe;
|
||||
@ -374,9 +368,9 @@ void r8712_dump_aggr_xframe(struct xmit_buf *pxmitbuf,
|
||||
pxmitframe->bpending[0] = false;
|
||||
pxmitframe->mem_addr = pxmitbuf->pbuf;
|
||||
|
||||
if ((pdvobj->ishighspeed && ((total_length + TXDESC_SIZE) % 0x200) ==
|
||||
0) || ((!pdvobj->ishighspeed && ((total_length + TXDESC_SIZE) %
|
||||
0x40) == 0))) {
|
||||
if ((pdvobj->ishighspeed && ((total_length + TXDESC_SIZE) % 0x200) == 0) ||
|
||||
((!pdvobj->ishighspeed && ((total_length + TXDESC_SIZE) %
|
||||
0x40) == 0))) {
|
||||
ptxdesc->txdw0 |= cpu_to_le32
|
||||
(((TXDESC_SIZE + OFFSET_SZ + 8) << OFFSET_SHT) &
|
||||
0x00ff0000);
|
||||
@ -387,8 +381,8 @@ void r8712_dump_aggr_xframe(struct xmit_buf *pxmitbuf,
|
||||
0x00ff0000);
|
||||
/*default = 32 bytes for TX Desc*/
|
||||
}
|
||||
r8712_write_port(pxmitframe->padapter, RTL8712_DMA_H2CCMD,
|
||||
total_length + TXDESC_SIZE, (u8 *)pxmitframe);
|
||||
r8712_write_port(pxmitframe->padapter, RTL8712_DMA_H2CCMD, total_length + TXDESC_SIZE,
|
||||
(u8 *)pxmitframe);
|
||||
}
|
||||
|
||||
#endif
|
||||
@ -618,14 +612,12 @@ int r8712_xmitframe_complete(struct _adapter *padapter,
|
||||
pxmitframe = dequeue_xframe_ex(pxmitpriv, phwxmits, hwentry);
|
||||
/* need to remember the 1st frame */
|
||||
if (pxmitframe) {
|
||||
|
||||
#ifdef CONFIG_R8712_TX_AGGR
|
||||
/* 1. dequeue 2nd frame
|
||||
* 2. aggr if 2nd xframe is dequeued, else dump directly
|
||||
*/
|
||||
if (AGGR_NR_HIGH_BOUND > 1)
|
||||
p2ndxmitframe = dequeue_xframe_ex(pxmitpriv, phwxmits,
|
||||
hwentry);
|
||||
p2ndxmitframe = dequeue_xframe_ex(pxmitpriv, phwxmits, hwentry);
|
||||
if (pxmitframe->frame_tag != DATA_FRAMETAG) {
|
||||
r8712_free_xmitbuf(pxmitpriv, pxmitbuf);
|
||||
return false;
|
||||
@ -639,16 +631,12 @@ int r8712_xmitframe_complete(struct _adapter *padapter,
|
||||
if (p2ndxmitframe) {
|
||||
u16 total_length;
|
||||
|
||||
total_length = r8712_xmitframe_aggr_next(
|
||||
pxmitbuf, p2ndxmitframe);
|
||||
total_length = r8712_xmitframe_aggr_next(pxmitbuf, p2ndxmitframe);
|
||||
do {
|
||||
p2ndxmitframe = dequeue_xframe_ex(
|
||||
pxmitpriv, phwxmits, hwentry);
|
||||
p2ndxmitframe = dequeue_xframe_ex(pxmitpriv, phwxmits, hwentry);
|
||||
if (p2ndxmitframe)
|
||||
total_length =
|
||||
r8712_xmitframe_aggr_next(
|
||||
pxmitbuf,
|
||||
p2ndxmitframe);
|
||||
r8712_xmitframe_aggr_next(pxmitbuf, p2ndxmitframe);
|
||||
else
|
||||
break;
|
||||
} while (total_length <= 0x1800 &&
|
||||
@ -662,8 +650,8 @@ int r8712_xmitframe_complete(struct _adapter *padapter,
|
||||
xmitframe_xmitbuf_attach(pxmitframe, pxmitbuf);
|
||||
if (pxmitframe->frame_tag == DATA_FRAMETAG) {
|
||||
if (pxmitframe->attrib.priority <= 15)
|
||||
res = r8712_xmitframe_coalesce(padapter,
|
||||
pxmitframe->pkt, pxmitframe);
|
||||
res = r8712_xmitframe_coalesce(padapter, pxmitframe->pkt,
|
||||
pxmitframe);
|
||||
/* always return ndis_packet after
|
||||
* r8712_xmitframe_coalesce
|
||||
*/
|
||||
@ -714,10 +702,10 @@ static void dump_xframe(struct _adapter *padapter,
|
||||
ff_hwaddr = get_ff_hwaddr(pxmitframe);
|
||||
#ifdef CONFIG_R8712_TX_AGGR
|
||||
r8712_write_port(padapter, RTL8712_DMA_H2CCMD, w_sz,
|
||||
(unsigned char *)pxmitframe);
|
||||
(unsigned char *)pxmitframe);
|
||||
#else
|
||||
r8712_write_port(padapter, ff_hwaddr, w_sz,
|
||||
(unsigned char *)pxmitframe);
|
||||
(unsigned char *)pxmitframe);
|
||||
#endif
|
||||
mem_addr += w_sz;
|
||||
mem_addr = (u8 *)RND4(((addr_t)(mem_addr)));
|
||||
|
@ -242,8 +242,7 @@ void r8712_set_chplan_cmd(struct _adapter *padapter, int chplan)
|
||||
kfree(ph2c);
|
||||
return;
|
||||
}
|
||||
init_h2fwcmd_w_parm_no_rsp(ph2c, psetchplanpara,
|
||||
GEN_CMD_CODE(_SetChannelPlan));
|
||||
init_h2fwcmd_w_parm_no_rsp(ph2c, psetchplanpara, GEN_CMD_CODE(_SetChannelPlan));
|
||||
psetchplanpara->ChannelPlan = chplan;
|
||||
r8712_enqueue_cmd(pcmdpriv, ph2c);
|
||||
}
|
||||
@ -302,8 +301,7 @@ void r8712_getbbrfreg_cmdrsp_callback(struct _adapter *padapter,
|
||||
padapter->mppriv.workparam.bcompleted = true;
|
||||
}
|
||||
|
||||
void r8712_readtssi_cmdrsp_callback(struct _adapter *padapter,
|
||||
struct cmd_obj *pcmd)
|
||||
void r8712_readtssi_cmdrsp_callback(struct _adapter *padapter, struct cmd_obj *pcmd)
|
||||
{
|
||||
kfree(pcmd->parmbuf);
|
||||
kfree(pcmd);
|
||||
@ -374,11 +372,10 @@ int r8712_joinbss_cmd(struct _adapter *padapter, struct wlan_network *pnetwork)
|
||||
psecuritypriv->authenticator_ie[0] = (unsigned char)
|
||||
psecnetwork->IELength;
|
||||
if ((psecnetwork->IELength - 12) < (256 - 1))
|
||||
memcpy(&psecuritypriv->authenticator_ie[1],
|
||||
&psecnetwork->IEs[12], psecnetwork->IELength - 12);
|
||||
memcpy(&psecuritypriv->authenticator_ie[1], &psecnetwork->IEs[12],
|
||||
psecnetwork->IELength - 12);
|
||||
else
|
||||
memcpy(&psecuritypriv->authenticator_ie[1],
|
||||
&psecnetwork->IEs[12], (256 - 1));
|
||||
memcpy(&psecuritypriv->authenticator_ie[1], &psecnetwork->IEs[12], (256 - 1));
|
||||
psecnetwork->IELength = 0;
|
||||
/*
|
||||
* If the driver wants to use the bssid to create the connection.
|
||||
@ -388,19 +385,15 @@ int r8712_joinbss_cmd(struct _adapter *padapter, struct wlan_network *pnetwork)
|
||||
if (!pmlmepriv->assoc_by_bssid)
|
||||
ether_addr_copy(&pmlmepriv->assoc_bssid[0],
|
||||
&pnetwork->network.MacAddress[0]);
|
||||
psecnetwork->IELength = r8712_restruct_sec_ie(padapter,
|
||||
&pnetwork->network.IEs[0],
|
||||
&psecnetwork->IEs[0],
|
||||
pnetwork->network.IELength);
|
||||
psecnetwork->IELength = r8712_restruct_sec_ie(padapter, &pnetwork->network.IEs[0],
|
||||
&psecnetwork->IEs[0], pnetwork->network.IELength);
|
||||
pqospriv->qos_option = 0;
|
||||
if (pregistrypriv->wmm_enable) {
|
||||
u32 tmp_len;
|
||||
|
||||
tmp_len = r8712_restruct_wmm_ie(padapter,
|
||||
&pnetwork->network.IEs[0],
|
||||
&psecnetwork->IEs[0],
|
||||
pnetwork->network.IELength,
|
||||
psecnetwork->IELength);
|
||||
tmp_len = r8712_restruct_wmm_ie(padapter, &pnetwork->network.IEs[0],
|
||||
&psecnetwork->IEs[0], pnetwork->network.IELength,
|
||||
psecnetwork->IELength);
|
||||
if (psecnetwork->IELength != tmp_len) {
|
||||
psecnetwork->IELength = tmp_len;
|
||||
pqospriv->qos_option = 1; /* WMM IE in beacon */
|
||||
@ -427,39 +420,28 @@ int r8712_joinbss_cmd(struct _adapter *padapter, struct wlan_network *pnetwork)
|
||||
psecuritypriv->supplicant_ie[0] = (u8)psecnetwork->IELength;
|
||||
if (psecnetwork->IELength < 255)
|
||||
memcpy(&psecuritypriv->supplicant_ie[1], &psecnetwork->IEs[0],
|
||||
psecnetwork->IELength);
|
||||
psecnetwork->IELength);
|
||||
else
|
||||
memcpy(&psecuritypriv->supplicant_ie[1], &psecnetwork->IEs[0],
|
||||
255);
|
||||
255);
|
||||
/* get cmdsz before endian conversion */
|
||||
pcmd->cmdsz = r8712_get_wlan_bssid_ex_sz(psecnetwork);
|
||||
#ifdef __BIG_ENDIAN
|
||||
/* wlan_network endian conversion */
|
||||
psecnetwork->Length = cpu_to_le32(psecnetwork->Length);
|
||||
psecnetwork->Ssid.SsidLength = cpu_to_le32(
|
||||
psecnetwork->Ssid.SsidLength);
|
||||
psecnetwork->Ssid.SsidLength = cpu_to_le32(psecnetwork->Ssid.SsidLength);
|
||||
psecnetwork->Privacy = cpu_to_le32(psecnetwork->Privacy);
|
||||
psecnetwork->Rssi = cpu_to_le32(psecnetwork->Rssi);
|
||||
psecnetwork->NetworkTypeInUse = cpu_to_le32(
|
||||
psecnetwork->NetworkTypeInUse);
|
||||
psecnetwork->Configuration.ATIMWindow = cpu_to_le32(
|
||||
psecnetwork->Configuration.ATIMWindow);
|
||||
psecnetwork->Configuration.BeaconPeriod = cpu_to_le32(
|
||||
psecnetwork->Configuration.BeaconPeriod);
|
||||
psecnetwork->Configuration.DSConfig = cpu_to_le32(
|
||||
psecnetwork->Configuration.DSConfig);
|
||||
psecnetwork->Configuration.FHConfig.DwellTime = cpu_to_le32(
|
||||
psecnetwork->Configuration.FHConfig.DwellTime);
|
||||
psecnetwork->Configuration.FHConfig.HopPattern = cpu_to_le32(
|
||||
psecnetwork->Configuration.FHConfig.HopPattern);
|
||||
psecnetwork->Configuration.FHConfig.HopSet = cpu_to_le32(
|
||||
psecnetwork->Configuration.FHConfig.HopSet);
|
||||
psecnetwork->Configuration.FHConfig.Length = cpu_to_le32(
|
||||
psecnetwork->Configuration.FHConfig.Length);
|
||||
psecnetwork->Configuration.Length = cpu_to_le32(
|
||||
psecnetwork->Configuration.Length);
|
||||
psecnetwork->InfrastructureMode = cpu_to_le32(
|
||||
psecnetwork->InfrastructureMode);
|
||||
psecnetwork->NetworkTypeInUse = cpu_to_le32(psecnetwork->NetworkTypeInUse);
|
||||
psecnetwork->Configuration.ATIMWindow = cpu_to_le32(psecnetwork->Configuration.ATIMWindow);
|
||||
psecnetwork->Configuration.BeaconPeriod = cpu_to_le32(psecnetwork->Configuration.BeaconPeriod);
|
||||
psecnetwork->Configuration.DSConfig = cpu_to_le32(psecnetwork->Configuration.DSConfig);
|
||||
psecnetwork->Configuration.FHConfig.DwellTime = cpu_to_le32(psecnetwork->Configuration.FHConfig.DwellTime);
|
||||
psecnetwork->Configuration.FHConfig.HopPattern = cpu_to_le32(psecnetwork->Configuration.FHConfig.HopPattern);
|
||||
psecnetwork->Configuration.FHConfig.HopSet = cpu_to_le32(psecnetwork->Configuration.FHConfig.HopSet);
|
||||
psecnetwork->Configuration.FHConfig.Length = cpu_to_le32(psecnetwork->Configuration.FHConfig.Length);
|
||||
psecnetwork->Configuration.Length = cpu_to_le32(psecnetwork->Configuration.Length);
|
||||
psecnetwork->InfrastructureMode = cpu_to_le32(psecnetwork->InfrastructureMode);
|
||||
psecnetwork->IELength = cpu_to_le32(psecnetwork->IELength);
|
||||
#endif
|
||||
INIT_LIST_HEAD(&pcmd->list);
|
||||
@ -485,13 +467,12 @@ void r8712_disassoc_cmd(struct _adapter *padapter) /* for sta_mode */
|
||||
kfree(pdisconnect_cmd);
|
||||
return;
|
||||
}
|
||||
init_h2fwcmd_w_parm_no_rsp(pdisconnect_cmd, pdisconnect,
|
||||
_DisConnect_CMD_);
|
||||
init_h2fwcmd_w_parm_no_rsp(pdisconnect_cmd, pdisconnect, _DisConnect_CMD_);
|
||||
r8712_enqueue_cmd(pcmdpriv, pdisconnect_cmd);
|
||||
}
|
||||
|
||||
void r8712_setopmode_cmd(struct _adapter *padapter,
|
||||
enum NDIS_802_11_NETWORK_INFRASTRUCTURE networktype)
|
||||
enum NDIS_802_11_NETWORK_INFRASTRUCTURE networktype)
|
||||
{
|
||||
struct cmd_obj *ph2c;
|
||||
struct setopmode_parm *psetop;
|
||||
@ -543,14 +524,12 @@ void r8712_setstakey_cmd(struct _adapter *padapter, u8 *psta, u8 unicast_key)
|
||||
psetstakey_para->algorithm = (unsigned char)
|
||||
psecuritypriv->PrivacyAlgrthm;
|
||||
else
|
||||
GET_ENCRY_ALGO(psecuritypriv, sta,
|
||||
psetstakey_para->algorithm, false);
|
||||
GET_ENCRY_ALGO(psecuritypriv, sta, psetstakey_para->algorithm, false);
|
||||
if (unicast_key)
|
||||
memcpy(&psetstakey_para->key, &sta->x_UncstKey, 16);
|
||||
else
|
||||
memcpy(&psetstakey_para->key,
|
||||
&psecuritypriv->XGrpKey[
|
||||
psecuritypriv->XGrpKeyid - 1]. skey, 16);
|
||||
memcpy(&psetstakey_para->key, &psecuritypriv->XGrpKey[psecuritypriv->XGrpKeyid - 1].
|
||||
skey, 16);
|
||||
r8712_enqueue_cmd(pcmdpriv, ph2c);
|
||||
}
|
||||
|
||||
@ -568,8 +547,7 @@ void r8712_setMacAddr_cmd(struct _adapter *padapter, const u8 *mac_addr)
|
||||
kfree(ph2c);
|
||||
return;
|
||||
}
|
||||
init_h2fwcmd_w_parm_no_rsp(ph2c, psetMacAddr_para,
|
||||
_SetMacAddress_CMD_);
|
||||
init_h2fwcmd_w_parm_no_rsp(ph2c, psetMacAddr_para, _SetMacAddress_CMD_);
|
||||
ether_addr_copy(psetMacAddr_para->MacAddr, mac_addr);
|
||||
r8712_enqueue_cmd(pcmdpriv, ph2c);
|
||||
}
|
||||
@ -589,8 +567,7 @@ void r8712_addbareq_cmd(struct _adapter *padapter, u8 tid)
|
||||
return;
|
||||
}
|
||||
paddbareq_parm->tid = tid;
|
||||
init_h2fwcmd_w_parm_no_rsp(ph2c, paddbareq_parm,
|
||||
GEN_CMD_CODE(_AddBAReq));
|
||||
init_h2fwcmd_w_parm_no_rsp(ph2c, paddbareq_parm, GEN_CMD_CODE(_AddBAReq));
|
||||
r8712_enqueue_cmd_ex(pcmdpriv, ph2c);
|
||||
}
|
||||
|
||||
@ -644,13 +621,11 @@ void r8712_joinbss_cmd_callback(struct _adapter *padapter, struct cmd_obj *pcmd)
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
|
||||
if (pcmd->res != H2C_SUCCESS)
|
||||
mod_timer(&pmlmepriv->assoc_timer,
|
||||
jiffies + msecs_to_jiffies(1));
|
||||
mod_timer(&pmlmepriv->assoc_timer, jiffies + msecs_to_jiffies(1));
|
||||
r8712_free_cmd_obj(pcmd);
|
||||
}
|
||||
|
||||
void r8712_createbss_cmd_callback(struct _adapter *padapter,
|
||||
struct cmd_obj *pcmd)
|
||||
void r8712_createbss_cmd_callback(struct _adapter *padapter, struct cmd_obj *pcmd)
|
||||
{
|
||||
unsigned long irqL;
|
||||
struct sta_info *psta = NULL;
|
||||
@ -660,8 +635,7 @@ void r8712_createbss_cmd_callback(struct _adapter *padapter,
|
||||
struct wlan_network *tgt_network = &(pmlmepriv->cur_network);
|
||||
|
||||
if (pcmd->res != H2C_SUCCESS)
|
||||
mod_timer(&pmlmepriv->assoc_timer,
|
||||
jiffies + msecs_to_jiffies(1));
|
||||
mod_timer(&pmlmepriv->assoc_timer, jiffies + msecs_to_jiffies(1));
|
||||
del_timer(&pmlmepriv->assoc_timer);
|
||||
#ifdef __BIG_ENDIAN
|
||||
/* endian_convert */
|
||||
@ -670,31 +644,21 @@ void r8712_createbss_cmd_callback(struct _adapter *padapter,
|
||||
pnetwork->Privacy = le32_to_cpu(pnetwork->Privacy);
|
||||
pnetwork->Rssi = le32_to_cpu(pnetwork->Rssi);
|
||||
pnetwork->NetworkTypeInUse = le32_to_cpu(pnetwork->NetworkTypeInUse);
|
||||
pnetwork->Configuration.ATIMWindow =
|
||||
le32_to_cpu(pnetwork->Configuration.ATIMWindow);
|
||||
pnetwork->Configuration.DSConfig =
|
||||
le32_to_cpu(pnetwork->Configuration.DSConfig);
|
||||
pnetwork->Configuration.FHConfig.DwellTime =
|
||||
le32_to_cpu(pnetwork->Configuration.FHConfig.DwellTime);
|
||||
pnetwork->Configuration.FHConfig.HopPattern =
|
||||
le32_to_cpu(pnetwork->Configuration.FHConfig.HopPattern);
|
||||
pnetwork->Configuration.FHConfig.HopSet =
|
||||
le32_to_cpu(pnetwork->Configuration.FHConfig.HopSet);
|
||||
pnetwork->Configuration.FHConfig.Length =
|
||||
le32_to_cpu(pnetwork->Configuration.FHConfig.Length);
|
||||
pnetwork->Configuration.Length =
|
||||
le32_to_cpu(pnetwork->Configuration.Length);
|
||||
pnetwork->InfrastructureMode =
|
||||
le32_to_cpu(pnetwork->InfrastructureMode);
|
||||
pnetwork->Configuration.ATIMWindow = le32_to_cpu(pnetwork->Configuration.ATIMWindow);
|
||||
pnetwork->Configuration.DSConfig = le32_to_cpu(pnetwork->Configuration.DSConfig);
|
||||
pnetwork->Configuration.FHConfig.DwellTime = le32_to_cpu(pnetwork->Configuration.FHConfig.DwellTime);
|
||||
pnetwork->Configuration.FHConfig.HopPattern = le32_to_cpu(pnetwork->Configuration.FHConfig.HopPattern);
|
||||
pnetwork->Configuration.FHConfig.HopSet = le32_to_cpu(pnetwork->Configuration.FHConfig.HopSet);
|
||||
pnetwork->Configuration.FHConfig.Length = le32_to_cpu(pnetwork->Configuration.FHConfig.Length);
|
||||
pnetwork->Configuration.Length = le32_to_cpu(pnetwork->Configuration.Length);
|
||||
pnetwork->InfrastructureMode = le32_to_cpu(pnetwork->InfrastructureMode);
|
||||
pnetwork->IELength = le32_to_cpu(pnetwork->IELength);
|
||||
#endif
|
||||
spin_lock_irqsave(&pmlmepriv->lock, irqL);
|
||||
if ((pmlmepriv->fw_state) & WIFI_AP_STATE) {
|
||||
psta = r8712_get_stainfo(&padapter->stapriv,
|
||||
pnetwork->MacAddress);
|
||||
psta = r8712_get_stainfo(&padapter->stapriv, pnetwork->MacAddress);
|
||||
if (!psta) {
|
||||
psta = r8712_alloc_stainfo(&padapter->stapriv,
|
||||
pnetwork->MacAddress);
|
||||
psta = r8712_alloc_stainfo(&padapter->stapriv, pnetwork->MacAddress);
|
||||
if (!psta)
|
||||
goto createbss_cmd_fail;
|
||||
}
|
||||
@ -702,20 +666,17 @@ void r8712_createbss_cmd_callback(struct _adapter *padapter,
|
||||
} else {
|
||||
pwlan = _r8712_alloc_network(pmlmepriv);
|
||||
if (!pwlan) {
|
||||
pwlan = r8712_get_oldest_wlan_network(
|
||||
&pmlmepriv->scanned_queue);
|
||||
pwlan = r8712_get_oldest_wlan_network(&pmlmepriv->scanned_queue);
|
||||
if (!pwlan)
|
||||
goto createbss_cmd_fail;
|
||||
pwlan->last_scanned = jiffies;
|
||||
} else {
|
||||
list_add_tail(&(pwlan->list),
|
||||
&pmlmepriv->scanned_queue.queue);
|
||||
list_add_tail(&(pwlan->list), &pmlmepriv->scanned_queue.queue);
|
||||
}
|
||||
pnetwork->Length = r8712_get_wlan_bssid_ex_sz(pnetwork);
|
||||
memcpy(&(pwlan->network), pnetwork, pnetwork->Length);
|
||||
pwlan->fixed = true;
|
||||
memcpy(&tgt_network->network, pnetwork,
|
||||
(r8712_get_wlan_bssid_ex_sz(pnetwork)));
|
||||
memcpy(&tgt_network->network, pnetwork, (r8712_get_wlan_bssid_ex_sz(pnetwork)));
|
||||
if (pmlmepriv->fw_state & _FW_UNDER_LINKING)
|
||||
pmlmepriv->fw_state ^= _FW_UNDER_LINKING;
|
||||
/*
|
||||
@ -728,14 +689,11 @@ createbss_cmd_fail:
|
||||
r8712_free_cmd_obj(pcmd);
|
||||
}
|
||||
|
||||
void r8712_setstaKey_cmdrsp_callback(struct _adapter *padapter,
|
||||
struct cmd_obj *pcmd)
|
||||
void r8712_setstaKey_cmdrsp_callback(struct _adapter *padapter, struct cmd_obj *pcmd)
|
||||
{
|
||||
struct sta_priv *pstapriv = &padapter->stapriv;
|
||||
struct set_stakey_rsp *psetstakey_rsp = (struct set_stakey_rsp *)
|
||||
(pcmd->rsp);
|
||||
struct sta_info *psta = r8712_get_stainfo(pstapriv,
|
||||
psetstakey_rsp->addr);
|
||||
struct set_stakey_rsp *psetstakey_rsp = (struct set_stakey_rsp *) (pcmd->rsp);
|
||||
struct sta_info *psta = r8712_get_stainfo(pstapriv, psetstakey_rsp->addr);
|
||||
|
||||
if (!psta)
|
||||
goto exit;
|
||||
@ -750,27 +708,23 @@ void r8712_setassocsta_cmdrsp_callback(struct _adapter *padapter,
|
||||
unsigned long irqL;
|
||||
struct sta_priv *pstapriv = &padapter->stapriv;
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
struct set_assocsta_parm *passocsta_parm =
|
||||
(struct set_assocsta_parm *)(pcmd->parmbuf);
|
||||
struct set_assocsta_rsp *passocsta_rsp =
|
||||
(struct set_assocsta_rsp *) (pcmd->rsp);
|
||||
struct sta_info *psta = r8712_get_stainfo(pstapriv,
|
||||
passocsta_parm->addr);
|
||||
struct set_assocsta_parm *passocsta_parm = (struct set_assocsta_parm *)(pcmd->parmbuf);
|
||||
struct set_assocsta_rsp *passocsta_rsp = (struct set_assocsta_rsp *) (pcmd->rsp);
|
||||
struct sta_info *psta = r8712_get_stainfo(pstapriv, passocsta_parm->addr);
|
||||
|
||||
if (!psta)
|
||||
return;
|
||||
psta->aid = psta->mac_id = passocsta_rsp->cam_id;
|
||||
spin_lock_irqsave(&pmlmepriv->lock, irqL);
|
||||
if ((check_fwstate(pmlmepriv, WIFI_MP_STATE)) &&
|
||||
(check_fwstate(pmlmepriv, _FW_UNDER_LINKING)))
|
||||
if ((check_fwstate(pmlmepriv, WIFI_MP_STATE)) && (check_fwstate(pmlmepriv, _FW_UNDER_LINKING)))
|
||||
pmlmepriv->fw_state ^= _FW_UNDER_LINKING;
|
||||
set_fwstate(pmlmepriv, _FW_LINKED);
|
||||
spin_unlock_irqrestore(&pmlmepriv->lock, irqL);
|
||||
r8712_free_cmd_obj(pcmd);
|
||||
}
|
||||
|
||||
void r8712_disconnectCtrlEx_cmd(struct _adapter *adapter, u32 enableDrvCtrl,
|
||||
u32 tryPktCnt, u32 tryPktInterval, u32 firstStageTO)
|
||||
void r8712_disconnectCtrlEx_cmd(struct _adapter *adapter, u32 enableDrvCtrl, u32 tryPktCnt,
|
||||
u32 tryPktInterval, u32 firstStageTO)
|
||||
{
|
||||
struct cmd_obj *ph2c;
|
||||
struct DisconnectCtrlEx_param *param;
|
||||
@ -790,7 +744,6 @@ void r8712_disconnectCtrlEx_cmd(struct _adapter *adapter, u32 enableDrvCtrl,
|
||||
param->TryPktInterval = (unsigned char)tryPktInterval;
|
||||
param->FirstStageTO = (unsigned int)firstStageTO;
|
||||
|
||||
init_h2fwcmd_w_parm_no_rsp(ph2c, param,
|
||||
GEN_CMD_CODE(_DisconnectCtrlEx));
|
||||
init_h2fwcmd_w_parm_no_rsp(ph2c, param, GEN_CMD_CODE(_DisconnectCtrlEx));
|
||||
r8712_enqueue_cmd(pcmdpriv, ph2c);
|
||||
}
|
||||
|
@ -716,39 +716,28 @@ struct DisconnectCtrlEx_param {
|
||||
#define H2C_RESERVED 0x07
|
||||
|
||||
void r8712_setMacAddr_cmd(struct _adapter *padapter, const u8 *mac_addr);
|
||||
u8 r8712_sitesurvey_cmd(struct _adapter *padapter,
|
||||
struct ndis_802_11_ssid *pssid);
|
||||
u8 r8712_sitesurvey_cmd(struct _adapter *padapter, struct ndis_802_11_ssid *pssid);
|
||||
int r8712_createbss_cmd(struct _adapter *padapter);
|
||||
void r8712_setstakey_cmd(struct _adapter *padapter, u8 *psta, u8 unicast_key);
|
||||
int r8712_joinbss_cmd(struct _adapter *padapter,
|
||||
struct wlan_network *pnetwork);
|
||||
int r8712_joinbss_cmd(struct _adapter *padapter, struct wlan_network *pnetwork);
|
||||
void r8712_disassoc_cmd(struct _adapter *padapter);
|
||||
void r8712_setopmode_cmd(struct _adapter *padapter,
|
||||
enum NDIS_802_11_NETWORK_INFRASTRUCTURE networktype);
|
||||
void r8712_setopmode_cmd(struct _adapter *padapter, enum NDIS_802_11_NETWORK_INFRASTRUCTURE networktype);
|
||||
int r8712_setdatarate_cmd(struct _adapter *padapter, u8 *rateset);
|
||||
void r8712_set_chplan_cmd(struct _adapter *padapter, int chplan);
|
||||
int r8712_getrfreg_cmd(struct _adapter *padapter, u8 offset, u8 *pval);
|
||||
int r8712_setrfreg_cmd(struct _adapter *padapter, u8 offset, u32 val);
|
||||
void r8712_addbareq_cmd(struct _adapter *padapter, u8 tid);
|
||||
void r8712_wdg_wk_cmd(struct _adapter *padapter);
|
||||
void r8712_survey_cmd_callback(struct _adapter *padapter,
|
||||
struct cmd_obj *pcmd);
|
||||
void r8712_disassoc_cmd_callback(struct _adapter *padapter,
|
||||
struct cmd_obj *pcmd);
|
||||
void r8712_joinbss_cmd_callback(struct _adapter *padapter,
|
||||
struct cmd_obj *pcmd);
|
||||
void r8712_createbss_cmd_callback(struct _adapter *padapter,
|
||||
struct cmd_obj *pcmd);
|
||||
void r8712_getbbrfreg_cmdrsp_callback(struct _adapter *padapter,
|
||||
struct cmd_obj *pcmd);
|
||||
void r8712_readtssi_cmdrsp_callback(struct _adapter *padapter,
|
||||
struct cmd_obj *pcmd);
|
||||
void r8712_setstaKey_cmdrsp_callback(struct _adapter *padapter,
|
||||
struct cmd_obj *pcmd);
|
||||
void r8712_setassocsta_cmdrsp_callback(struct _adapter *padapter,
|
||||
struct cmd_obj *pcmd);
|
||||
void r8712_disconnectCtrlEx_cmd(struct _adapter *adapter, u32 enableDrvCtrl,
|
||||
u32 tryPktCnt, u32 tryPktInterval, u32 firstStageTO);
|
||||
void r8712_survey_cmd_callback(struct _adapter *padapter, struct cmd_obj *pcmd);
|
||||
void r8712_disassoc_cmd_callback(struct _adapter *padapter, struct cmd_obj *pcmd);
|
||||
void r8712_joinbss_cmd_callback(struct _adapter *padapter, struct cmd_obj *pcmd);
|
||||
void r8712_createbss_cmd_callback(struct _adapter *padapter, struct cmd_obj *pcmd);
|
||||
void r8712_getbbrfreg_cmdrsp_callback(struct _adapter *padapter, struct cmd_obj *pcmd);
|
||||
void r8712_readtssi_cmdrsp_callback(struct _adapter *padapter, struct cmd_obj *pcmd);
|
||||
void r8712_setstaKey_cmdrsp_callback(struct _adapter *padapter, struct cmd_obj *pcmd);
|
||||
void r8712_setassocsta_cmdrsp_callback(struct _adapter *padapter, struct cmd_obj *pcmd);
|
||||
void r8712_disconnectCtrlEx_cmd(struct _adapter *adapter, u32 enableDrvCtrl, u32 tryPktCnt,
|
||||
u32 tryPktInterval, u32 firstStageTO);
|
||||
|
||||
struct _cmd_callback {
|
||||
u32 cmd_code;
|
||||
|
@ -59,8 +59,7 @@ void r8712_indicate_wx_assoc_event(struct _adapter *padapter)
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
|
||||
wrqu.ap_addr.sa_family = ARPHRD_ETHER;
|
||||
memcpy(wrqu.ap_addr.sa_data, pmlmepriv->cur_network.network.MacAddress,
|
||||
ETH_ALEN);
|
||||
memcpy(wrqu.ap_addr.sa_data, pmlmepriv->cur_network.network.MacAddress, ETH_ALEN);
|
||||
wireless_send_event(padapter->pnetdev, SIOCGIWAP, &wrqu, NULL);
|
||||
}
|
||||
|
||||
@ -111,11 +110,9 @@ static inline void handle_group_key(struct ieee_param *param,
|
||||
memcpy(grk[param->u.crypt.idx - 1].skey,
|
||||
¶m->u.crypt.key[24], 8);
|
||||
padapter->securitypriv.binstallGrpkey = true;
|
||||
r8712_set_key(padapter, &padapter->securitypriv,
|
||||
param->u.crypt.idx);
|
||||
r8712_set_key(padapter, &padapter->securitypriv, param->u.crypt.idx);
|
||||
if (padapter->registrypriv.power_mgnt > PS_MODE_ACTIVE) {
|
||||
if (padapter->registrypriv.power_mgnt !=
|
||||
padapter->pwrctrlpriv.pwr_mode)
|
||||
if (padapter->registrypriv.power_mgnt != padapter->pwrctrlpriv.pwr_mode)
|
||||
mod_timer(&padapter->mlmepriv.dhcp_timer,
|
||||
jiffies + msecs_to_jiffies(60000));
|
||||
}
|
||||
@ -148,13 +145,11 @@ static noinline_for_stack char *translate_scan_wpa(struct iw_request_info *info,
|
||||
memset(iwe, 0, sizeof(*iwe));
|
||||
iwe->cmd = IWEVCUSTOM;
|
||||
iwe->u.data.length = (u16)strlen(buf);
|
||||
start = iwe_stream_add_point(info, start, stop,
|
||||
iwe, buf);
|
||||
start = iwe_stream_add_point(info, start, stop, iwe, buf);
|
||||
memset(iwe, 0, sizeof(*iwe));
|
||||
iwe->cmd = IWEVGENIE;
|
||||
iwe->u.data.length = (u16)wpa_len;
|
||||
start = iwe_stream_add_point(info, start, stop,
|
||||
iwe, wpa_ie);
|
||||
start = iwe_stream_add_point(info, start, stop, iwe, wpa_ie);
|
||||
}
|
||||
if (rsn_len > 0) {
|
||||
memset(buf, 0, MAX_WPA_IE_LEN);
|
||||
@ -168,13 +163,11 @@ static noinline_for_stack char *translate_scan_wpa(struct iw_request_info *info,
|
||||
memset(iwe, 0, sizeof(*iwe));
|
||||
iwe->cmd = IWEVCUSTOM;
|
||||
iwe->u.data.length = strlen(buf);
|
||||
start = iwe_stream_add_point(info, start, stop,
|
||||
iwe, buf);
|
||||
start = iwe_stream_add_point(info, start, stop, iwe, buf);
|
||||
memset(iwe, 0, sizeof(*iwe));
|
||||
iwe->cmd = IWEVGENIE;
|
||||
iwe->u.data.length = rsn_len;
|
||||
start = iwe_stream_add_point(info, start, stop, iwe,
|
||||
rsn_ie);
|
||||
start = iwe_stream_add_point(info, start, stop, iwe, rsn_ie);
|
||||
}
|
||||
|
||||
return start;
|
||||
@ -189,14 +182,11 @@ static noinline_for_stack char *translate_scan_wps(struct iw_request_info *info,
|
||||
u8 wps_ie[512];
|
||||
uint wps_ielen;
|
||||
|
||||
if (r8712_get_wps_ie(pnetwork->network.IEs,
|
||||
pnetwork->network.IELength,
|
||||
wps_ie, &wps_ielen)) {
|
||||
if (r8712_get_wps_ie(pnetwork->network.IEs, pnetwork->network.IELength, wps_ie, &wps_ielen)) {
|
||||
if (wps_ielen > 2) {
|
||||
iwe->cmd = IWEVGENIE;
|
||||
iwe->u.data.length = (u16)wps_ielen;
|
||||
start = iwe_stream_add_point(info, start, stop,
|
||||
iwe, wps_ie);
|
||||
start = iwe_stream_add_point(info, start, stop, iwe, wps_ie);
|
||||
}
|
||||
}
|
||||
|
||||
@ -259,16 +249,14 @@ static char *translate_scan(struct _adapter *padapter,
|
||||
start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_CHAR_LEN);
|
||||
/* Add mode */
|
||||
iwe.cmd = SIOCGIWMODE;
|
||||
memcpy((u8 *)&cap, r8712_get_capability_from_ie(pnetwork->network.IEs),
|
||||
2);
|
||||
memcpy((u8 *)&cap, r8712_get_capability_from_ie(pnetwork->network.IEs), 2);
|
||||
le16_to_cpus(&cap);
|
||||
if (cap & (WLAN_CAPABILITY_IBSS | WLAN_CAPABILITY_ESS)) {
|
||||
if (cap & WLAN_CAPABILITY_ESS)
|
||||
iwe.u.mode = (u32)IW_MODE_MASTER;
|
||||
else
|
||||
iwe.u.mode = (u32)IW_MODE_ADHOC;
|
||||
start = iwe_stream_add_event(info, start, stop, &iwe,
|
||||
IW_EV_UINT_LEN);
|
||||
start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_UINT_LEN);
|
||||
}
|
||||
/* Add frequency/channel */
|
||||
iwe.cmd = SIOCGIWFREQ;
|
||||
@ -276,28 +264,23 @@ static char *translate_scan(struct _adapter *padapter,
|
||||
/* check legal index */
|
||||
u8 dsconfig = pnetwork->network.Configuration.DSConfig;
|
||||
|
||||
if (dsconfig >= 1 && dsconfig <= sizeof(
|
||||
ieee80211_wlan_frequencies) / sizeof(long))
|
||||
iwe.u.freq.m =
|
||||
(s32)(ieee80211_wlan_frequencies
|
||||
[dsconfig - 1] * 100000);
|
||||
if (dsconfig >= 1 && dsconfig <= sizeof(ieee80211_wlan_frequencies) / sizeof(long))
|
||||
iwe.u.freq.m = (s32)(ieee80211_wlan_frequencies[dsconfig - 1] * 100000);
|
||||
else
|
||||
iwe.u.freq.m = 0;
|
||||
}
|
||||
iwe.u.freq.e = (s16)1;
|
||||
iwe.u.freq.i = (u8)pnetwork->network.Configuration.DSConfig;
|
||||
start = iwe_stream_add_event(info, start, stop, &iwe,
|
||||
IW_EV_FREQ_LEN);
|
||||
IW_EV_FREQ_LEN);
|
||||
/* Add encryption capability */
|
||||
iwe.cmd = SIOCGIWENCODE;
|
||||
if (cap & WLAN_CAPABILITY_PRIVACY)
|
||||
iwe.u.data.flags = (u16)(IW_ENCODE_ENABLED |
|
||||
IW_ENCODE_NOKEY);
|
||||
iwe.u.data.flags = (u16)(IW_ENCODE_ENABLED | IW_ENCODE_NOKEY);
|
||||
else
|
||||
iwe.u.data.flags = (u16)(IW_ENCODE_DISABLED);
|
||||
iwe.u.data.length = (u16)0;
|
||||
start = iwe_stream_add_point(info, start, stop, &iwe,
|
||||
pnetwork->network.Ssid.Ssid);
|
||||
start = iwe_stream_add_point(info, start, stop, &iwe, pnetwork->network.Ssid.Ssid);
|
||||
/*Add basic and extended rates */
|
||||
current_val = start + iwe_stream_lcp_len(info);
|
||||
iwe.cmd = SIOCGIWRATE;
|
||||
@ -307,10 +290,9 @@ static char *translate_scan(struct _adapter *padapter,
|
||||
i = 0;
|
||||
while (pnetwork->network.rates[i] != 0) {
|
||||
/* Bit rate given in 500 kb/s units */
|
||||
iwe.u.bitrate.value = (pnetwork->network.rates[i++] &
|
||||
0x7F) * 500000;
|
||||
current_val = iwe_stream_add_value(info, start, current_val,
|
||||
stop, &iwe, IW_EV_PARAM_LEN);
|
||||
iwe.u.bitrate.value = (pnetwork->network.rates[i++] & 0x7F) * 500000;
|
||||
current_val = iwe_stream_add_value(info, start, current_val, stop, &iwe,
|
||||
IW_EV_PARAM_LEN);
|
||||
}
|
||||
/* Check if we added any event */
|
||||
if ((current_val - start) > iwe_stream_lcp_len(info))
|
||||
@ -324,8 +306,7 @@ static char *translate_scan(struct _adapter *padapter,
|
||||
iwe.cmd = IWEVQUAL;
|
||||
rssi = r8712_signal_scale_mapping(pnetwork->network.Rssi);
|
||||
/* we only update signal_level (signal strength) that is rssi. */
|
||||
iwe.u.qual.updated = (u8)(IW_QUAL_QUAL_INVALID | IW_QUAL_LEVEL_UPDATED |
|
||||
IW_QUAL_NOISE_INVALID);
|
||||
iwe.u.qual.updated = (u8)(IW_QUAL_QUAL_INVALID | IW_QUAL_LEVEL_UPDATED | IW_QUAL_NOISE_INVALID);
|
||||
iwe.u.qual.level = rssi; /* signal strength */
|
||||
iwe.u.qual.qual = 0; /* signal quality */
|
||||
iwe.u.qual.noise = 0; /* noise level */
|
||||
@ -490,71 +471,59 @@ static int r871x_set_wpa_ie(struct _adapter *padapter, char *pie,
|
||||
goto exit;
|
||||
}
|
||||
if (r8712_parse_wpa_ie(buf, ielen, &group_cipher,
|
||||
&pairwise_cipher) == 0) {
|
||||
&pairwise_cipher) == 0) {
|
||||
padapter->securitypriv.AuthAlgrthm = 2;
|
||||
padapter->securitypriv.ndisauthtype =
|
||||
Ndis802_11AuthModeWPAPSK;
|
||||
}
|
||||
if (r8712_parse_wpa2_ie(buf, ielen, &group_cipher,
|
||||
&pairwise_cipher) == 0) {
|
||||
&pairwise_cipher) == 0) {
|
||||
padapter->securitypriv.AuthAlgrthm = 2;
|
||||
padapter->securitypriv.ndisauthtype =
|
||||
Ndis802_11AuthModeWPA2PSK;
|
||||
}
|
||||
switch (group_cipher) {
|
||||
case WPA_CIPHER_NONE:
|
||||
padapter->securitypriv.XGrpPrivacy =
|
||||
_NO_PRIVACY_;
|
||||
padapter->securitypriv.ndisencryptstatus =
|
||||
Ndis802_11EncryptionDisabled;
|
||||
padapter->securitypriv.XGrpPrivacy = _NO_PRIVACY_;
|
||||
padapter->securitypriv.ndisencryptstatus = Ndis802_11EncryptionDisabled;
|
||||
break;
|
||||
case WPA_CIPHER_WEP40:
|
||||
padapter->securitypriv.XGrpPrivacy = _WEP40_;
|
||||
padapter->securitypriv.ndisencryptstatus =
|
||||
Ndis802_11Encryption1Enabled;
|
||||
padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled;
|
||||
break;
|
||||
case WPA_CIPHER_TKIP:
|
||||
padapter->securitypriv.XGrpPrivacy = _TKIP_;
|
||||
padapter->securitypriv.ndisencryptstatus =
|
||||
Ndis802_11Encryption2Enabled;
|
||||
padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption2Enabled;
|
||||
break;
|
||||
case WPA_CIPHER_CCMP:
|
||||
padapter->securitypriv.XGrpPrivacy = _AES_;
|
||||
padapter->securitypriv.ndisencryptstatus =
|
||||
Ndis802_11Encryption3Enabled;
|
||||
padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption3Enabled;
|
||||
break;
|
||||
case WPA_CIPHER_WEP104:
|
||||
padapter->securitypriv.XGrpPrivacy = _WEP104_;
|
||||
padapter->securitypriv.ndisencryptstatus =
|
||||
Ndis802_11Encryption1Enabled;
|
||||
padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled;
|
||||
break;
|
||||
}
|
||||
switch (pairwise_cipher) {
|
||||
case WPA_CIPHER_NONE:
|
||||
padapter->securitypriv.PrivacyAlgrthm =
|
||||
_NO_PRIVACY_;
|
||||
padapter->securitypriv.ndisencryptstatus =
|
||||
Ndis802_11EncryptionDisabled;
|
||||
padapter->securitypriv.PrivacyAlgrthm = _NO_PRIVACY_;
|
||||
padapter->securitypriv.ndisencryptstatus = Ndis802_11EncryptionDisabled;
|
||||
break;
|
||||
case WPA_CIPHER_WEP40:
|
||||
padapter->securitypriv.PrivacyAlgrthm = _WEP40_;
|
||||
padapter->securitypriv.ndisencryptstatus =
|
||||
Ndis802_11Encryption1Enabled;
|
||||
padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled;
|
||||
break;
|
||||
case WPA_CIPHER_TKIP:
|
||||
padapter->securitypriv.PrivacyAlgrthm = _TKIP_;
|
||||
padapter->securitypriv.ndisencryptstatus =
|
||||
Ndis802_11Encryption2Enabled;
|
||||
padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption2Enabled;
|
||||
break;
|
||||
case WPA_CIPHER_CCMP:
|
||||
padapter->securitypriv.PrivacyAlgrthm = _AES_;
|
||||
padapter->securitypriv.ndisencryptstatus =
|
||||
Ndis802_11Encryption3Enabled;
|
||||
padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption3Enabled;
|
||||
break;
|
||||
case WPA_CIPHER_WEP104:
|
||||
padapter->securitypriv.PrivacyAlgrthm = _WEP104_;
|
||||
padapter->securitypriv.ndisencryptstatus =
|
||||
Ndis802_11Encryption1Enabled;
|
||||
padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled;
|
||||
break;
|
||||
}
|
||||
padapter->securitypriv.wps_phase = false;
|
||||
@ -574,8 +543,8 @@ static int r871x_set_wpa_ie(struct _adapter *padapter, char *pie,
|
||||
(buf[cnt + 1] + 2) :
|
||||
(MAX_WPA_IE_LEN << 2);
|
||||
memcpy(padapter->securitypriv.wps_ie,
|
||||
&buf[cnt],
|
||||
padapter->securitypriv.wps_ie_len);
|
||||
&buf[cnt],
|
||||
padapter->securitypriv.wps_ie_len);
|
||||
padapter->securitypriv.wps_phase =
|
||||
true;
|
||||
netdev_info(padapter->pnetdev, "r8712u: SET WPS_IE, wps_phase==true\n");
|
||||
@ -592,8 +561,7 @@ exit:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int r8711_wx_get_name(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
static int r8711_wx_get_name(struct net_device *dev, struct iw_request_info *info,
|
||||
union iwreq_data *wrqu, char *extra)
|
||||
{
|
||||
struct _adapter *padapter = netdev_priv(dev);
|
||||
@ -604,8 +572,7 @@ static int r8711_wx_get_name(struct net_device *dev,
|
||||
struct wlan_bssid_ex *pcur_bss = &pmlmepriv->cur_network.network;
|
||||
u8 *prates;
|
||||
|
||||
if (check_fwstate(pmlmepriv, _FW_LINKED | WIFI_ADHOC_MASTER_STATE) ==
|
||||
true) {
|
||||
if (check_fwstate(pmlmepriv, _FW_LINKED | WIFI_ADHOC_MASTER_STATE) == true) {
|
||||
/* parsing HT_CAP_IE */
|
||||
p = r8712_get_ie(&pcur_bss->IEs[12], WLAN_EID_HT_CAPABILITY,
|
||||
&ht_ielen, pcur_bss->IELength - 12);
|
||||
@ -658,9 +625,7 @@ static int r8711_wx_set_freq(struct net_device *dev,
|
||||
int rc = 0;
|
||||
|
||||
/* If setting by frequency, convert to a channel */
|
||||
if ((fwrq->e == 1) &&
|
||||
(fwrq->m >= 241200000) &&
|
||||
(fwrq->m <= 248700000)) {
|
||||
if ((fwrq->e == 1) && (fwrq->m >= 241200000) && (fwrq->m <= 248700000)) {
|
||||
int f = fwrq->m / 100000;
|
||||
int c = 0;
|
||||
|
||||
@ -685,8 +650,7 @@ static int r8711_wx_set_freq(struct net_device *dev,
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int r8711_wx_get_freq(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
static int r8711_wx_get_freq(struct net_device *dev, struct iw_request_info *info,
|
||||
union iwreq_data *wrqu, char *extra)
|
||||
{
|
||||
struct _adapter *padapter = netdev_priv(dev);
|
||||
@ -745,7 +709,7 @@ static int r8711_wx_get_mode(struct net_device *dev, struct iw_request_info *a,
|
||||
if (check_fwstate(pmlmepriv, WIFI_STATION_STATE))
|
||||
wrqu->mode = IW_MODE_INFRA;
|
||||
else if (check_fwstate(pmlmepriv,
|
||||
WIFI_ADHOC_MASTER_STATE | WIFI_ADHOC_STATE))
|
||||
WIFI_ADHOC_MASTER_STATE | WIFI_ADHOC_STATE))
|
||||
wrqu->mode = IW_MODE_ADHOC;
|
||||
else if (check_fwstate(pmlmepriv, WIFI_AP_STATE))
|
||||
wrqu->mode = IW_MODE_MASTER;
|
||||
@ -754,9 +718,8 @@ static int r8711_wx_get_mode(struct net_device *dev, struct iw_request_info *a,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int r871x_wx_set_pmkid(struct net_device *dev,
|
||||
struct iw_request_info *a,
|
||||
union iwreq_data *wrqu, char *extra)
|
||||
static int r871x_wx_set_pmkid(struct net_device *dev, struct iw_request_info *a,
|
||||
union iwreq_data *wrqu, char *extra)
|
||||
{
|
||||
struct _adapter *padapter = netdev_priv(dev);
|
||||
struct security_priv *psecuritypriv = &padapter->securitypriv;
|
||||
@ -828,7 +791,7 @@ static int r871x_wx_set_pmkid(struct net_device *dev,
|
||||
break;
|
||||
case IW_PMKSA_FLUSH:
|
||||
memset(psecuritypriv->PMKIDList, 0,
|
||||
sizeof(struct RT_PMKID_LIST) * NUM_PMKID_CACHE);
|
||||
sizeof(struct RT_PMKID_LIST) * NUM_PMKID_CACHE);
|
||||
psecuritypriv->PMKIDIndex = 0;
|
||||
intReturn = true;
|
||||
break;
|
||||
@ -850,9 +813,8 @@ static int r8711_wx_get_sens(struct net_device *dev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int r8711_wx_get_range(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
union iwreq_data *wrqu, char *extra)
|
||||
static int r8711_wx_get_range(struct net_device *dev, struct iw_request_info *info,
|
||||
union iwreq_data *wrqu, char *extra)
|
||||
{
|
||||
struct iw_range *range = (struct iw_range *)extra;
|
||||
u16 val;
|
||||
@ -912,9 +874,9 @@ static int r8711_wx_get_rate(struct net_device *dev,
|
||||
union iwreq_data *wrqu, char *extra);
|
||||
|
||||
static int r871x_wx_set_priv(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
union iwreq_data *awrq,
|
||||
char *extra)
|
||||
struct iw_request_info *info,
|
||||
union iwreq_data *awrq,
|
||||
char *extra)
|
||||
{
|
||||
int ret = 0, len = 0;
|
||||
char *ext;
|
||||
@ -995,12 +957,10 @@ static int r871x_wx_set_priv(struct net_device *dev,
|
||||
);
|
||||
sprintf(ext, "OK");
|
||||
} else {
|
||||
netdev_info(dev, "r8712u: %s: unknown Command %s.\n",
|
||||
__func__, ext);
|
||||
netdev_info(dev, "r8712u: %s: unknown Command %s.\n", __func__, ext);
|
||||
goto FREE_EXT;
|
||||
}
|
||||
if (copy_to_user(dwrq->pointer, ext,
|
||||
min(dwrq->length, (__u16)(strlen(ext) + 1))))
|
||||
if (copy_to_user(dwrq->pointer, ext, min(dwrq->length, (__u16)(strlen(ext) + 1))))
|
||||
ret = -EFAULT;
|
||||
|
||||
FREE_EXT:
|
||||
@ -1021,10 +981,8 @@ FREE_EXT:
|
||||
* For this operation to succeed, there is no need for the interface to be up.
|
||||
*
|
||||
*/
|
||||
static int r8711_wx_set_wap(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
union iwreq_data *awrq,
|
||||
char *extra)
|
||||
static int r8711_wx_set_wap(struct net_device *dev, struct iw_request_info *info,
|
||||
union iwreq_data *awrq, char *extra)
|
||||
{
|
||||
int ret = -EINPROGRESS;
|
||||
struct _adapter *padapter = netdev_priv(dev);
|
||||
@ -1072,17 +1030,15 @@ static int r8711_wx_set_wap(struct net_device *dev,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int r8711_wx_get_wap(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
union iwreq_data *wrqu, char *extra)
|
||||
static int r8711_wx_get_wap(struct net_device *dev, struct iw_request_info *info,
|
||||
union iwreq_data *wrqu, char *extra)
|
||||
{
|
||||
struct _adapter *padapter = netdev_priv(dev);
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
struct wlan_bssid_ex *pcur_bss = &pmlmepriv->cur_network.network;
|
||||
|
||||
wrqu->ap_addr.sa_family = ARPHRD_ETHER;
|
||||
if (check_fwstate(pmlmepriv, _FW_LINKED | WIFI_ADHOC_MASTER_STATE |
|
||||
WIFI_AP_STATE))
|
||||
if (check_fwstate(pmlmepriv, _FW_LINKED | WIFI_ADHOC_MASTER_STATE | WIFI_AP_STATE))
|
||||
ether_addr_copy(wrqu->ap_addr.sa_data, pcur_bss->MacAddress);
|
||||
else
|
||||
eth_zero_addr(wrqu->ap_addr.sa_data);
|
||||
@ -1122,9 +1078,8 @@ static int r871x_wx_set_mlme(struct net_device *dev,
|
||||
* For this operation to succeed, the interface is brought Up beforehand.
|
||||
*
|
||||
*/
|
||||
static int r8711_wx_set_scan(struct net_device *dev,
|
||||
struct iw_request_info *a,
|
||||
union iwreq_data *wrqu, char *extra)
|
||||
static int r8711_wx_set_scan(struct net_device *dev, struct iw_request_info *a,
|
||||
union iwreq_data *wrqu, char *extra)
|
||||
{
|
||||
struct _adapter *padapter = netdev_priv(dev);
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
@ -1150,8 +1105,7 @@ static int r8711_wx_set_scan(struct net_device *dev,
|
||||
unsigned long irqL;
|
||||
u32 len = min_t(u8, req->essid_len, IW_ESSID_MAX_SIZE);
|
||||
|
||||
memset((unsigned char *)&ssid, 0,
|
||||
sizeof(struct ndis_802_11_ssid));
|
||||
memset((unsigned char *)&ssid, 0, sizeof(struct ndis_802_11_ssid));
|
||||
memcpy(ssid.Ssid, req->essid, len);
|
||||
ssid.SsidLength = len;
|
||||
spin_lock_irqsave(&pmlmepriv->lock, irqL);
|
||||
@ -1173,9 +1127,8 @@ static int r8711_wx_set_scan(struct net_device *dev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int r8711_wx_get_scan(struct net_device *dev,
|
||||
struct iw_request_info *a,
|
||||
union iwreq_data *wrqu, char *extra)
|
||||
static int r8711_wx_get_scan(struct net_device *dev, struct iw_request_info *a,
|
||||
union iwreq_data *wrqu, char *extra)
|
||||
{
|
||||
struct _adapter *padapter = netdev_priv(dev);
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
@ -1189,8 +1142,7 @@ static int r8711_wx_get_scan(struct net_device *dev,
|
||||
|
||||
if (padapter->driver_stopped)
|
||||
return -EINVAL;
|
||||
while (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY |
|
||||
_FW_UNDER_LINKING)) {
|
||||
while (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY | _FW_UNDER_LINKING)) {
|
||||
msleep(30);
|
||||
cnt++;
|
||||
if (cnt > 100)
|
||||
@ -1228,9 +1180,8 @@ static int r8711_wx_get_scan(struct net_device *dev,
|
||||
* For this operation to succeed, there is no need for the interface to be Up.
|
||||
*
|
||||
*/
|
||||
static int r8711_wx_set_essid(struct net_device *dev,
|
||||
struct iw_request_info *a,
|
||||
union iwreq_data *wrqu, char *extra)
|
||||
static int r8711_wx_set_essid(struct net_device *dev, struct iw_request_info *a,
|
||||
union iwreq_data *wrqu, char *extra)
|
||||
{
|
||||
struct _adapter *padapter = netdev_priv(dev);
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
@ -1268,8 +1219,7 @@ static int r8711_wx_set_essid(struct net_device *dev,
|
||||
if ((!memcmp(dst_ssid, src_ssid, ndis_ssid.SsidLength))
|
||||
&& (pnetwork->network.Ssid.SsidLength ==
|
||||
ndis_ssid.SsidLength)) {
|
||||
if (check_fwstate(pmlmepriv,
|
||||
WIFI_ADHOC_STATE)) {
|
||||
if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)) {
|
||||
if (pnetwork->network.
|
||||
InfrastructureMode
|
||||
!=
|
||||
@ -1291,9 +1241,8 @@ static int r8711_wx_set_essid(struct net_device *dev,
|
||||
return -EINPROGRESS;
|
||||
}
|
||||
|
||||
static int r8711_wx_get_essid(struct net_device *dev,
|
||||
struct iw_request_info *a,
|
||||
union iwreq_data *wrqu, char *extra)
|
||||
static int r8711_wx_get_essid(struct net_device *dev, struct iw_request_info *a,
|
||||
union iwreq_data *wrqu, char *extra)
|
||||
{
|
||||
struct _adapter *padapter = netdev_priv(dev);
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
@ -1311,9 +1260,8 @@ static int r8711_wx_get_essid(struct net_device *dev,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int r8711_wx_set_rate(struct net_device *dev,
|
||||
struct iw_request_info *a,
|
||||
union iwreq_data *wrqu, char *extra)
|
||||
static int r8711_wx_set_rate(struct net_device *dev, struct iw_request_info *a,
|
||||
union iwreq_data *wrqu, char *extra)
|
||||
{
|
||||
struct _adapter *padapter = netdev_priv(dev);
|
||||
u32 target_rate = wrqu->bitrate.value;
|
||||
@ -1382,8 +1330,7 @@ set_rate:
|
||||
return r8712_setdatarate_cmd(padapter, datarates);
|
||||
}
|
||||
|
||||
static int r8711_wx_get_rate(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
static int r8711_wx_get_rate(struct net_device *dev, struct iw_request_info *info,
|
||||
union iwreq_data *wrqu, char *extra)
|
||||
{
|
||||
struct _adapter *padapter = netdev_priv(dev);
|
||||
@ -1437,9 +1384,8 @@ static int r8711_wx_get_rate(struct net_device *dev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int r8711_wx_get_rts(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
union iwreq_data *wrqu, char *extra)
|
||||
static int r8711_wx_get_rts(struct net_device *dev, struct iw_request_info *info,
|
||||
union iwreq_data *wrqu, char *extra)
|
||||
{
|
||||
struct _adapter *padapter = netdev_priv(dev);
|
||||
|
||||
@ -1448,9 +1394,8 @@ static int r8711_wx_get_rts(struct net_device *dev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int r8711_wx_set_frag(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
union iwreq_data *wrqu, char *extra)
|
||||
static int r8711_wx_set_frag(struct net_device *dev, struct iw_request_info *info,
|
||||
union iwreq_data *wrqu, char *extra)
|
||||
{
|
||||
struct _adapter *padapter = netdev_priv(dev);
|
||||
|
||||
|
@ -126,7 +126,7 @@
|
||||
#define rFPGA0_AnalogParameter3 0x888 /* Useless now */
|
||||
#define rFPGA0_AnalogParameter4 0x88c
|
||||
|
||||
#define rFPGA0_XA_LSSIReadBack 0x8a0 /* Tranceiver LSSI Readback */
|
||||
#define rFPGA0_XA_LSSIReadBack 0x8a0 /* Transceiver LSSI Readback */
|
||||
#define rFPGA0_XB_LSSIReadBack 0x8a4
|
||||
#define rFPGA0_XC_LSSIReadBack 0x8a8
|
||||
#define rFPGA0_XD_LSSIReadBack 0x8ac
|
||||
|
@ -23,11 +23,6 @@ should properly handle a module unload. This also includes that all
|
||||
resources must be freed (kthreads, debugfs entries, ...) and global
|
||||
variables avoided.
|
||||
|
||||
* Cleanup logging mechanism
|
||||
|
||||
The driver should probably be using the standard kernel logging mechanisms
|
||||
such as dev_info, dev_dbg, and friends.
|
||||
|
||||
* Documentation
|
||||
|
||||
A short top-down description of this driver's architecture (function of
|
||||
|
@ -255,8 +255,7 @@ create_pagelist(struct vchiq_instance *instance, char *buf, char __user *ubuf,
|
||||
pagelist = dma_alloc_coherent(instance->state->dev, pagelist_size, &dma_addr,
|
||||
GFP_KERNEL);
|
||||
|
||||
vchiq_log_trace(instance->state->dev, VCHIQ_ARM,
|
||||
"%s - %pK", __func__, pagelist);
|
||||
dev_dbg(instance->state->dev, "arm: %pK\n", pagelist);
|
||||
|
||||
if (!pagelist)
|
||||
return NULL;
|
||||
@ -311,9 +310,8 @@ create_pagelist(struct vchiq_instance *instance, char *buf, char __user *ubuf,
|
||||
type == PAGELIST_READ, pages);
|
||||
|
||||
if (actual_pages != num_pages) {
|
||||
vchiq_log_debug(instance->state->dev, VCHIQ_ARM,
|
||||
"%s - only %d/%d pages locked",
|
||||
__func__, actual_pages, num_pages);
|
||||
dev_dbg(instance->state->dev, "arm: Only %d/%d pages locked\n",
|
||||
actual_pages, num_pages);
|
||||
|
||||
/* This is probably due to the process being killed */
|
||||
if (actual_pages > 0)
|
||||
@ -407,8 +405,7 @@ free_pagelist(struct vchiq_instance *instance, struct vchiq_pagelist_info *pagel
|
||||
struct page **pages = pagelistinfo->pages;
|
||||
unsigned int num_pages = pagelistinfo->num_pages;
|
||||
|
||||
vchiq_log_trace(instance->state->dev, VCHIQ_ARM,
|
||||
"%s - %pK, %d", __func__, pagelistinfo->pagelist, actual);
|
||||
dev_dbg(instance->state->dev, "arm: %pK, %d\n", pagelistinfo->pagelist, actual);
|
||||
|
||||
/*
|
||||
* NOTE: dma_unmap_sg must be called before the
|
||||
@ -556,8 +553,8 @@ static int vchiq_platform_init(struct platform_device *pdev, struct vchiq_state
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
vchiq_log_debug(&pdev->dev, VCHIQ_ARM, "vchiq_init - done (slots %pK, phys %pad)",
|
||||
vchiq_slot_zero, &slot_phys);
|
||||
dev_dbg(&pdev->dev, "arm: vchiq_init - done (slots %pK, phys %pad)\n",
|
||||
vchiq_slot_zero, &slot_phys);
|
||||
|
||||
vchiq_call_connected_callbacks();
|
||||
|
||||
@ -659,13 +656,9 @@ vchiq_complete_bulk(struct vchiq_instance *instance, struct vchiq_bulk *bulk)
|
||||
bulk->actual);
|
||||
}
|
||||
|
||||
int vchiq_dump_platform_state(void *dump_context)
|
||||
void vchiq_dump_platform_state(struct seq_file *f)
|
||||
{
|
||||
char buf[80];
|
||||
int len;
|
||||
|
||||
len = snprintf(buf, sizeof(buf), " Platform: 2835 (VC master)");
|
||||
return vchiq_dump(dump_context, buf, len + 1);
|
||||
seq_puts(f, " Platform: 2835 (VC master)\n");
|
||||
}
|
||||
|
||||
#define VCHIQ_INIT_RETRIES 10
|
||||
@ -687,19 +680,17 @@ int vchiq_initialise(struct vchiq_instance **instance_out)
|
||||
usleep_range(500, 600);
|
||||
}
|
||||
if (i == VCHIQ_INIT_RETRIES) {
|
||||
vchiq_log_error(state->dev, VCHIQ_CORE, "%s: videocore not initialized\n",
|
||||
__func__);
|
||||
dev_err(state->dev, "core: %s: Videocore not initialized\n", __func__);
|
||||
ret = -ENOTCONN;
|
||||
goto failed;
|
||||
} else if (i > 0) {
|
||||
vchiq_log_warning(state->dev, VCHIQ_CORE,
|
||||
"%s: videocore initialized after %d retries\n", __func__, i);
|
||||
dev_warn(state->dev, "core: %s: videocore initialized after %d retries\n",
|
||||
__func__, i);
|
||||
}
|
||||
|
||||
instance = kzalloc(sizeof(*instance), GFP_KERNEL);
|
||||
if (!instance) {
|
||||
vchiq_log_error(state->dev, VCHIQ_CORE,
|
||||
"%s: error allocating vchiq instance\n", __func__);
|
||||
dev_err(state->dev, "core: %s: Cannot allocate vchiq instance\n", __func__);
|
||||
ret = -ENOMEM;
|
||||
goto failed;
|
||||
}
|
||||
@ -714,8 +705,7 @@ int vchiq_initialise(struct vchiq_instance **instance_out)
|
||||
ret = 0;
|
||||
|
||||
failed:
|
||||
vchiq_log_trace(state->dev, VCHIQ_CORE,
|
||||
"%s(%p): returning %d", __func__, instance, ret);
|
||||
dev_dbg(state->dev, "core: (%p): returning %d\n", instance, ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -728,9 +718,9 @@ void free_bulk_waiter(struct vchiq_instance *instance)
|
||||
list_for_each_entry_safe(waiter, next,
|
||||
&instance->bulk_waiter_list, list) {
|
||||
list_del(&waiter->list);
|
||||
vchiq_log_debug(instance->state->dev, VCHIQ_ARM,
|
||||
"bulk_waiter - cleaned up %pK for pid %d",
|
||||
waiter, waiter->pid);
|
||||
dev_dbg(instance->state->dev,
|
||||
"arm: bulk_waiter - cleaned up %pK for pid %d\n",
|
||||
waiter, waiter->pid);
|
||||
kfree(waiter);
|
||||
}
|
||||
}
|
||||
@ -748,8 +738,7 @@ int vchiq_shutdown(struct vchiq_instance *instance)
|
||||
|
||||
mutex_unlock(&state->mutex);
|
||||
|
||||
vchiq_log_trace(state->dev, VCHIQ_CORE,
|
||||
"%s(%p): returning %d", __func__, instance, status);
|
||||
dev_dbg(state->dev, "core: (%p): returning %d\n", instance, status);
|
||||
|
||||
free_bulk_waiter(instance);
|
||||
kfree(instance);
|
||||
@ -769,8 +758,8 @@ int vchiq_connect(struct vchiq_instance *instance)
|
||||
struct vchiq_state *state = instance->state;
|
||||
|
||||
if (mutex_lock_killable(&state->mutex)) {
|
||||
vchiq_log_trace(state->dev, VCHIQ_CORE,
|
||||
"%s: call to mutex_lock failed", __func__);
|
||||
dev_dbg(state->dev,
|
||||
"core: call to mutex_lock failed\n");
|
||||
status = -EAGAIN;
|
||||
goto failed;
|
||||
}
|
||||
@ -782,8 +771,7 @@ int vchiq_connect(struct vchiq_instance *instance)
|
||||
mutex_unlock(&state->mutex);
|
||||
|
||||
failed:
|
||||
vchiq_log_trace(state->dev, VCHIQ_CORE,
|
||||
"%s(%p): returning %d", __func__, instance, status);
|
||||
dev_dbg(state->dev, "core: (%p): returning %d\n", instance, status);
|
||||
|
||||
return status;
|
||||
}
|
||||
@ -814,8 +802,7 @@ vchiq_add_service(struct vchiq_instance *instance,
|
||||
status = -EINVAL;
|
||||
}
|
||||
|
||||
vchiq_log_trace(state->dev, VCHIQ_CORE,
|
||||
"%s(%p): returning %d", __func__, instance, status);
|
||||
dev_dbg(state->dev, "core: (%p): returning %d\n", instance, status);
|
||||
|
||||
return status;
|
||||
}
|
||||
@ -846,8 +833,7 @@ vchiq_open_service(struct vchiq_instance *instance,
|
||||
}
|
||||
|
||||
failed:
|
||||
vchiq_log_trace(state->dev, VCHIQ_CORE,
|
||||
"%s(%p): returning %d", __func__, instance, status);
|
||||
dev_dbg(state->dev, "core: (%p): returning %d\n", instance, status);
|
||||
|
||||
return status;
|
||||
}
|
||||
@ -971,8 +957,7 @@ vchiq_blocking_bulk_transfer(struct vchiq_instance *instance, unsigned int handl
|
||||
} else {
|
||||
waiter = kzalloc(sizeof(*waiter), GFP_KERNEL);
|
||||
if (!waiter) {
|
||||
vchiq_log_error(service->state->dev, VCHIQ_CORE,
|
||||
"%s - out of memory", __func__);
|
||||
dev_err(service->state->dev, "core: %s: - Out of memory\n", __func__);
|
||||
return -ENOMEM;
|
||||
}
|
||||
}
|
||||
@ -995,9 +980,8 @@ vchiq_blocking_bulk_transfer(struct vchiq_instance *instance, unsigned int handl
|
||||
mutex_lock(&instance->bulk_waiter_list_mutex);
|
||||
list_add(&waiter->list, &instance->bulk_waiter_list);
|
||||
mutex_unlock(&instance->bulk_waiter_list_mutex);
|
||||
vchiq_log_debug(instance->state->dev, VCHIQ_ARM,
|
||||
"saved bulk_waiter %pK for pid %d", waiter,
|
||||
current->pid);
|
||||
dev_dbg(instance->state->dev, "arm: saved bulk_waiter %pK for pid %d\n",
|
||||
waiter, current->pid);
|
||||
}
|
||||
|
||||
return status;
|
||||
@ -1017,16 +1001,13 @@ add_completion(struct vchiq_instance *instance, enum vchiq_reason reason,
|
||||
while ((insert - instance->completion_remove) >= MAX_COMPLETIONS) {
|
||||
/* Out of space - wait for the client */
|
||||
DEBUG_TRACE(SERVICE_CALLBACK_LINE);
|
||||
vchiq_log_trace(instance->state->dev, VCHIQ_CORE,
|
||||
"%s - completion queue full", __func__);
|
||||
dev_dbg(instance->state->dev, "core: completion queue full\n");
|
||||
DEBUG_COUNT(COMPLETION_QUEUE_FULL_COUNT);
|
||||
if (wait_for_completion_interruptible(&instance->remove_event)) {
|
||||
vchiq_log_debug(instance->state->dev, VCHIQ_ARM,
|
||||
"service_callback interrupted");
|
||||
dev_dbg(instance->state->dev, "arm: service_callback interrupted\n");
|
||||
return -EAGAIN;
|
||||
} else if (instance->closing) {
|
||||
vchiq_log_debug(instance->state->dev, VCHIQ_ARM,
|
||||
"service_callback closing");
|
||||
dev_dbg(instance->state->dev, "arm: service_callback closing\n");
|
||||
return 0;
|
||||
}
|
||||
DEBUG_TRACE(SERVICE_CALLBACK_LINE);
|
||||
@ -1106,11 +1087,10 @@ service_callback(struct vchiq_instance *instance, enum vchiq_reason reason,
|
||||
vchiq_service_get(service);
|
||||
rcu_read_unlock();
|
||||
|
||||
vchiq_log_trace(service->state->dev, VCHIQ_ARM,
|
||||
"%s - service %lx(%d,%p), reason %d, header %lx, instance %lx, bulk_userdata %lx",
|
||||
__func__, (unsigned long)user_service, service->localport,
|
||||
user_service->userdata, reason, (unsigned long)header,
|
||||
(unsigned long)instance, (unsigned long)bulk_userdata);
|
||||
dev_dbg(service->state->dev,
|
||||
"arm: service %p(%d,%p), reason %d, header %p, instance %p, bulk_userdata %p\n",
|
||||
user_service, service->localport, user_service->userdata,
|
||||
reason, header, instance, bulk_userdata);
|
||||
|
||||
if (header && user_service->is_vchi) {
|
||||
spin_lock(&msg_queue_spinlock);
|
||||
@ -1119,8 +1099,7 @@ service_callback(struct vchiq_instance *instance, enum vchiq_reason reason,
|
||||
spin_unlock(&msg_queue_spinlock);
|
||||
DEBUG_TRACE(SERVICE_CALLBACK_LINE);
|
||||
DEBUG_COUNT(MSG_QUEUE_FULL_COUNT);
|
||||
vchiq_log_trace(service->state->dev, VCHIQ_ARM,
|
||||
"%s - msg queue full", __func__);
|
||||
dev_dbg(service->state->dev, "arm: msg queue full\n");
|
||||
/*
|
||||
* If there is no MESSAGE_AVAILABLE in the completion
|
||||
* queue, add one
|
||||
@ -1129,8 +1108,8 @@ service_callback(struct vchiq_instance *instance, enum vchiq_reason reason,
|
||||
instance->completion_remove) < 0) {
|
||||
int status;
|
||||
|
||||
vchiq_log_debug(instance->state->dev, VCHIQ_ARM,
|
||||
"Inserting extra MESSAGE_AVAILABLE");
|
||||
dev_dbg(instance->state->dev,
|
||||
"arm: Inserting extra MESSAGE_AVAILABLE\n");
|
||||
DEBUG_TRACE(SERVICE_CALLBACK_LINE);
|
||||
status = add_completion(instance, reason, NULL, user_service,
|
||||
bulk_userdata);
|
||||
@ -1143,14 +1122,12 @@ service_callback(struct vchiq_instance *instance, enum vchiq_reason reason,
|
||||
|
||||
DEBUG_TRACE(SERVICE_CALLBACK_LINE);
|
||||
if (wait_for_completion_interruptible(&user_service->remove_event)) {
|
||||
vchiq_log_debug(instance->state->dev, VCHIQ_ARM,
|
||||
"%s interrupted", __func__);
|
||||
dev_dbg(instance->state->dev, "arm: interrupted\n");
|
||||
DEBUG_TRACE(SERVICE_CALLBACK_LINE);
|
||||
vchiq_service_put(service);
|
||||
return -EAGAIN;
|
||||
} else if (instance->closing) {
|
||||
vchiq_log_debug(instance->state->dev, VCHIQ_ARM,
|
||||
"%s closing", __func__);
|
||||
dev_dbg(instance->state->dev, "arm: closing\n");
|
||||
DEBUG_TRACE(SERVICE_CALLBACK_LINE);
|
||||
vchiq_service_put(service);
|
||||
return -EINVAL;
|
||||
@ -1190,56 +1167,13 @@ service_callback(struct vchiq_instance *instance, enum vchiq_reason reason,
|
||||
bulk_userdata);
|
||||
}
|
||||
|
||||
int vchiq_dump(void *dump_context, const char *str, int len)
|
||||
{
|
||||
struct dump_context *context = (struct dump_context *)dump_context;
|
||||
int copy_bytes;
|
||||
|
||||
if (context->actual >= context->space)
|
||||
return 0;
|
||||
|
||||
if (context->offset > 0) {
|
||||
int skip_bytes = min_t(int, len, context->offset);
|
||||
|
||||
str += skip_bytes;
|
||||
len -= skip_bytes;
|
||||
context->offset -= skip_bytes;
|
||||
if (context->offset > 0)
|
||||
return 0;
|
||||
}
|
||||
copy_bytes = min_t(int, len, context->space - context->actual);
|
||||
if (copy_bytes == 0)
|
||||
return 0;
|
||||
if (copy_to_user(context->buf + context->actual, str,
|
||||
copy_bytes))
|
||||
return -EFAULT;
|
||||
context->actual += copy_bytes;
|
||||
len -= copy_bytes;
|
||||
|
||||
/*
|
||||
* If the terminating NUL is included in the length, then it
|
||||
* marks the end of a line and should be replaced with a
|
||||
* carriage return.
|
||||
*/
|
||||
if ((len == 0) && (str[copy_bytes - 1] == '\0')) {
|
||||
char cr = '\n';
|
||||
|
||||
if (copy_to_user(context->buf + context->actual - 1,
|
||||
&cr, 1))
|
||||
return -EFAULT;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int vchiq_dump_platform_instances(void *dump_context)
|
||||
void vchiq_dump_platform_instances(struct seq_file *f)
|
||||
{
|
||||
struct vchiq_state *state = vchiq_get_state();
|
||||
char buf[80];
|
||||
int len;
|
||||
int i;
|
||||
|
||||
if (!state)
|
||||
return -ENOTCONN;
|
||||
return;
|
||||
|
||||
/*
|
||||
* There is no list of instances, so instead scan all services,
|
||||
@ -1264,7 +1198,6 @@ int vchiq_dump_platform_instances(void *dump_context)
|
||||
for (i = 0; i < state->unused_service; i++) {
|
||||
struct vchiq_service *service;
|
||||
struct vchiq_instance *instance;
|
||||
int err;
|
||||
|
||||
rcu_read_lock();
|
||||
service = rcu_dereference(state->services[i]);
|
||||
@ -1280,43 +1213,35 @@ int vchiq_dump_platform_instances(void *dump_context)
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
len = snprintf(buf, sizeof(buf),
|
||||
"Instance %pK: pid %d,%s completions %d/%d",
|
||||
instance, instance->pid,
|
||||
instance->connected ? " connected, " :
|
||||
"",
|
||||
instance->completion_insert -
|
||||
instance->completion_remove,
|
||||
MAX_COMPLETIONS);
|
||||
err = vchiq_dump(dump_context, buf, len + 1);
|
||||
if (err)
|
||||
return err;
|
||||
seq_printf(f, "Instance %pK: pid %d,%s completions %d/%d\n",
|
||||
instance, instance->pid,
|
||||
instance->connected ? " connected, " :
|
||||
"",
|
||||
instance->completion_insert -
|
||||
instance->completion_remove,
|
||||
MAX_COMPLETIONS);
|
||||
instance->mark = 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int vchiq_dump_platform_service_state(void *dump_context,
|
||||
struct vchiq_service *service)
|
||||
void vchiq_dump_platform_service_state(struct seq_file *f,
|
||||
struct vchiq_service *service)
|
||||
{
|
||||
struct user_service *user_service =
|
||||
(struct user_service *)service->base.userdata;
|
||||
char buf[80];
|
||||
int len;
|
||||
|
||||
len = scnprintf(buf, sizeof(buf), " instance %pK", service->instance);
|
||||
seq_printf(f, " instance %pK", service->instance);
|
||||
|
||||
if ((service->base.callback == service_callback) && user_service->is_vchi) {
|
||||
len += scnprintf(buf + len, sizeof(buf) - len, ", %d/%d messages",
|
||||
user_service->msg_insert - user_service->msg_remove,
|
||||
MSG_QUEUE_SIZE);
|
||||
seq_printf(f, ", %d/%d messages",
|
||||
user_service->msg_insert - user_service->msg_remove,
|
||||
MSG_QUEUE_SIZE);
|
||||
|
||||
if (user_service->dequeue_pending)
|
||||
len += scnprintf(buf + len, sizeof(buf) - len,
|
||||
" (dequeue pending)");
|
||||
seq_puts(f, " (dequeue pending)");
|
||||
}
|
||||
|
||||
return vchiq_dump(dump_context, buf, len + 1);
|
||||
seq_puts(f, "\n");
|
||||
}
|
||||
|
||||
struct vchiq_state *
|
||||
@ -1346,8 +1271,8 @@ vchiq_keepalive_vchiq_callback(struct vchiq_instance *instance,
|
||||
struct vchiq_header *header,
|
||||
unsigned int service_user, void *bulk_user)
|
||||
{
|
||||
vchiq_log_error(instance->state->dev, VCHIQ_SUSPEND,
|
||||
"%s callback reason %d", __func__, reason);
|
||||
dev_err(instance->state->dev, "suspend: %s: callback reason %d\n",
|
||||
__func__, reason);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1371,22 +1296,20 @@ vchiq_keepalive_thread_func(void *v)
|
||||
|
||||
ret = vchiq_initialise(&instance);
|
||||
if (ret) {
|
||||
vchiq_log_error(state->dev, VCHIQ_SUSPEND,
|
||||
"%s vchiq_initialise failed %d", __func__, ret);
|
||||
dev_err(state->dev, "suspend: %s: vchiq_initialise failed %d\n", __func__, ret);
|
||||
goto exit;
|
||||
}
|
||||
|
||||
status = vchiq_connect(instance);
|
||||
if (status) {
|
||||
vchiq_log_error(state->dev, VCHIQ_SUSPEND,
|
||||
"%s vchiq_connect failed %d", __func__, status);
|
||||
dev_err(state->dev, "suspend: %s: vchiq_connect failed %d\n", __func__, status);
|
||||
goto shutdown;
|
||||
}
|
||||
|
||||
status = vchiq_add_service(instance, ¶ms, &ka_handle);
|
||||
if (status) {
|
||||
vchiq_log_error(state->dev, VCHIQ_SUSPEND,
|
||||
"%s vchiq_open_service failed %d", __func__, status);
|
||||
dev_err(state->dev, "suspend: %s: vchiq_open_service failed %d\n",
|
||||
__func__, status);
|
||||
goto shutdown;
|
||||
}
|
||||
|
||||
@ -1394,8 +1317,7 @@ vchiq_keepalive_thread_func(void *v)
|
||||
long rc = 0, uc = 0;
|
||||
|
||||
if (wait_for_completion_interruptible(&arm_state->ka_evt)) {
|
||||
vchiq_log_error(state->dev, VCHIQ_SUSPEND,
|
||||
"%s interrupted", __func__);
|
||||
dev_err(state->dev, "suspend: %s: interrupted\n", __func__);
|
||||
flush_signals(current);
|
||||
continue;
|
||||
}
|
||||
@ -1415,16 +1337,15 @@ vchiq_keepalive_thread_func(void *v)
|
||||
atomic_inc(&arm_state->ka_use_ack_count);
|
||||
status = vchiq_use_service(instance, ka_handle);
|
||||
if (status) {
|
||||
vchiq_log_error(state->dev, VCHIQ_SUSPEND,
|
||||
"%s vchiq_use_service error %d", __func__, status);
|
||||
dev_err(state->dev, "suspend: %s: vchiq_use_service error %d\n",
|
||||
__func__, status);
|
||||
}
|
||||
}
|
||||
while (rc--) {
|
||||
status = vchiq_release_service(instance, ka_handle);
|
||||
if (status) {
|
||||
vchiq_log_error(state->dev, VCHIQ_SUSPEND,
|
||||
"%s vchiq_release_service error %d", __func__,
|
||||
status);
|
||||
dev_err(state->dev, "suspend: %s: vchiq_release_service error %d\n",
|
||||
__func__, status);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1459,7 +1380,7 @@ vchiq_use_internal(struct vchiq_state *state, struct vchiq_service *service,
|
||||
service->client_id);
|
||||
entity_uc = &service->service_use_count;
|
||||
} else {
|
||||
vchiq_log_error(state->dev, VCHIQ_SUSPEND, "%s null service ptr", __func__);
|
||||
dev_err(state->dev, "suspend: %s: null service ptr\n", __func__);
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
@ -1468,8 +1389,8 @@ vchiq_use_internal(struct vchiq_state *state, struct vchiq_service *service,
|
||||
local_uc = ++arm_state->videocore_use_count;
|
||||
++(*entity_uc);
|
||||
|
||||
vchiq_log_trace(state->dev, VCHIQ_SUSPEND, "%s %s count %d, state count %d",
|
||||
__func__, entity, *entity_uc, local_uc);
|
||||
dev_dbg(state->dev, "suspend: %s count %d, state count %d\n",
|
||||
entity, *entity_uc, local_uc);
|
||||
|
||||
write_unlock_bh(&arm_state->susp_res_lock);
|
||||
|
||||
@ -1488,7 +1409,7 @@ vchiq_use_internal(struct vchiq_state *state, struct vchiq_service *service,
|
||||
}
|
||||
|
||||
out:
|
||||
vchiq_log_trace(state->dev, VCHIQ_SUSPEND, "%s exit %d", __func__, ret);
|
||||
dev_dbg(state->dev, "suspend: exit %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -1526,14 +1447,14 @@ vchiq_release_internal(struct vchiq_state *state, struct vchiq_service *service)
|
||||
--arm_state->videocore_use_count;
|
||||
--(*entity_uc);
|
||||
|
||||
vchiq_log_trace(state->dev, VCHIQ_SUSPEND, "%s %s count %d, state count %d",
|
||||
__func__, entity, *entity_uc, arm_state->videocore_use_count);
|
||||
dev_dbg(state->dev, "suspend: %s count %d, state count %d\n",
|
||||
entity, *entity_uc, arm_state->videocore_use_count);
|
||||
|
||||
unlock:
|
||||
write_unlock_bh(&arm_state->susp_res_lock);
|
||||
|
||||
out:
|
||||
vchiq_log_trace(state->dev, VCHIQ_SUSPEND, "%s exit %d", __func__, ret);
|
||||
dev_dbg(state->dev, "suspend: exit %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -1707,20 +1628,19 @@ vchiq_dump_service_use_state(struct vchiq_state *state)
|
||||
read_unlock_bh(&arm_state->susp_res_lock);
|
||||
|
||||
if (only_nonzero)
|
||||
vchiq_log_warning(state->dev, VCHIQ_SUSPEND,
|
||||
"Too many active services (%d). Only dumping up to first %d services with non-zero use-count",
|
||||
active_services, found);
|
||||
dev_warn(state->dev,
|
||||
"suspend: Too many active services (%d). Only dumping up to first %d services with non-zero use-count\n",
|
||||
active_services, found);
|
||||
|
||||
for (i = 0; i < found; i++) {
|
||||
vchiq_log_warning(state->dev, VCHIQ_SUSPEND,
|
||||
"%p4cc:%d service count %d %s",
|
||||
&service_data[i].fourcc,
|
||||
service_data[i].clientid, service_data[i].use_count,
|
||||
service_data[i].use_count ? nz : "");
|
||||
dev_warn(state->dev,
|
||||
"suspend: %p4cc:%d service count %d %s\n",
|
||||
&service_data[i].fourcc,
|
||||
service_data[i].clientid, service_data[i].use_count,
|
||||
service_data[i].use_count ? nz : "");
|
||||
}
|
||||
vchiq_log_warning(state->dev, VCHIQ_SUSPEND, "VCHIQ use count %d", peer_count);
|
||||
vchiq_log_warning(state->dev, VCHIQ_SUSPEND, "Overall vchiq instance use count %d",
|
||||
vc_use_count);
|
||||
dev_warn(state->dev, "suspend: VCHIQ use count %d\n", peer_count);
|
||||
dev_warn(state->dev, "suspend: Overall vchiq instance use count %d\n", vc_use_count);
|
||||
|
||||
kfree(service_data);
|
||||
}
|
||||
@ -1742,10 +1662,10 @@ vchiq_check_service(struct vchiq_service *service)
|
||||
read_unlock_bh(&arm_state->susp_res_lock);
|
||||
|
||||
if (ret) {
|
||||
vchiq_log_error(service->state->dev, VCHIQ_SUSPEND,
|
||||
"%s ERROR - %p4cc:%d service count %d, state count %d", __func__,
|
||||
&service->base.fourcc, service->client_id,
|
||||
service->service_use_count, arm_state->videocore_use_count);
|
||||
dev_err(service->state->dev,
|
||||
"suspend: %s: %p4cc:%d service count %d, state count %d\n",
|
||||
__func__, &service->base.fourcc, service->client_id,
|
||||
service->service_use_count, arm_state->videocore_use_count);
|
||||
vchiq_dump_service_use_state(service->state);
|
||||
}
|
||||
out:
|
||||
@ -1759,8 +1679,8 @@ void vchiq_platform_conn_state_changed(struct vchiq_state *state,
|
||||
struct vchiq_arm_state *arm_state = vchiq_platform_get_arm_state(state);
|
||||
char threadname[16];
|
||||
|
||||
vchiq_log_debug(state->dev, VCHIQ_SUSPEND, "%d: %s->%s", state->id,
|
||||
get_conn_state_name(oldstate), get_conn_state_name(newstate));
|
||||
dev_dbg(state->dev, "suspend: %d: %s->%s\n",
|
||||
state->id, get_conn_state_name(oldstate), get_conn_state_name(newstate));
|
||||
if (state->conn_state != VCHIQ_CONNSTATE_CONNECTED)
|
||||
return;
|
||||
|
||||
@ -1778,9 +1698,8 @@ void vchiq_platform_conn_state_changed(struct vchiq_state *state,
|
||||
(void *)state,
|
||||
threadname);
|
||||
if (IS_ERR(arm_state->ka_thread)) {
|
||||
vchiq_log_error(state->dev, VCHIQ_SUSPEND,
|
||||
"vchiq: FATAL: couldn't create thread %s",
|
||||
threadname);
|
||||
dev_err(state->dev, "suspend: Couldn't create thread %s\n",
|
||||
threadname);
|
||||
} else {
|
||||
wake_up_process(arm_state->ka_thread);
|
||||
}
|
||||
@ -1825,9 +1744,8 @@ static int vchiq_probe(struct platform_device *pdev)
|
||||
|
||||
vchiq_debugfs_init();
|
||||
|
||||
vchiq_log_debug(&pdev->dev, VCHIQ_ARM,
|
||||
"vchiq: platform initialised - version %d (min %d)",
|
||||
VCHIQ_VERSION, VCHIQ_VERSION_MIN);
|
||||
dev_dbg(&pdev->dev, "arm: platform initialised - version %d (min %d)\n",
|
||||
VCHIQ_VERSION, VCHIQ_VERSION_MIN);
|
||||
|
||||
/*
|
||||
* Simply exit on error since the function handles cleanup in
|
||||
@ -1835,8 +1753,7 @@ static int vchiq_probe(struct platform_device *pdev)
|
||||
*/
|
||||
err = vchiq_register_chrdev(&pdev->dev);
|
||||
if (err) {
|
||||
vchiq_log_warning(&pdev->dev, VCHIQ_ARM,
|
||||
"Failed to initialize vchiq cdev");
|
||||
dev_warn(&pdev->dev, "arm: Failed to initialize vchiq cdev\n");
|
||||
goto error_exit;
|
||||
}
|
||||
|
||||
@ -1846,7 +1763,7 @@ static int vchiq_probe(struct platform_device *pdev)
|
||||
return 0;
|
||||
|
||||
failed_platform_init:
|
||||
vchiq_log_warning(&pdev->dev, VCHIQ_ARM, "could not initialize vchiq platform");
|
||||
dev_warn(&pdev->dev, "arm: Could not initialize vchiq platform\n");
|
||||
error_exit:
|
||||
return err;
|
||||
}
|
||||
|
@ -69,13 +69,6 @@ struct vchiq_instance {
|
||||
struct vchiq_debugfs_node debugfs_node;
|
||||
};
|
||||
|
||||
struct dump_context {
|
||||
char __user *buf;
|
||||
size_t actual;
|
||||
size_t space;
|
||||
loff_t offset;
|
||||
};
|
||||
|
||||
extern spinlock_t msg_queue_spinlock;
|
||||
extern struct vchiq_state g_state;
|
||||
|
||||
|
@ -27,7 +27,7 @@ static void connected_init(void)
|
||||
* be made immediately, otherwise it will be deferred until
|
||||
* vchiq_call_connected_callbacks is called.
|
||||
*/
|
||||
void vchiq_add_connected_callback(void (*callback)(void))
|
||||
void vchiq_add_connected_callback(struct vchiq_device *device, void (*callback)(void))
|
||||
{
|
||||
connected_init();
|
||||
|
||||
@ -39,9 +39,9 @@ void vchiq_add_connected_callback(void (*callback)(void))
|
||||
callback();
|
||||
} else {
|
||||
if (g_num_deferred_callbacks >= MAX_CALLBACKS) {
|
||||
vchiq_log_error(NULL, VCHIQ_CORE,
|
||||
"There already %d callback registered - please increase MAX_CALLBACKS",
|
||||
g_num_deferred_callbacks);
|
||||
dev_err(&device->dev,
|
||||
"core: There already %d callback registered - please increase MAX_CALLBACKS\n",
|
||||
g_num_deferred_callbacks);
|
||||
} else {
|
||||
g_deferred_callback[g_num_deferred_callbacks] =
|
||||
callback;
|
||||
|
@ -1,10 +1,12 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
|
||||
/* Copyright (c) 2010-2012 Broadcom. All rights reserved. */
|
||||
|
||||
#include "vchiq_bus.h"
|
||||
|
||||
#ifndef VCHIQ_CONNECTED_H
|
||||
#define VCHIQ_CONNECTED_H
|
||||
|
||||
void vchiq_add_connected_callback(void (*callback)(void));
|
||||
void vchiq_add_connected_callback(struct vchiq_device *device, void (*callback)(void));
|
||||
void vchiq_call_connected_callbacks(void);
|
||||
|
||||
#endif /* VCHIQ_CONNECTED_H */
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -6,6 +6,7 @@
|
||||
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/completion.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/dev_printk.h>
|
||||
#include <linux/kthread.h>
|
||||
#include <linux/kref.h>
|
||||
@ -31,44 +32,6 @@
|
||||
#define VCHIQ_SLOT_SIZE 4096
|
||||
#define VCHIQ_MAX_MSG_SIZE (VCHIQ_SLOT_SIZE - sizeof(struct vchiq_header))
|
||||
|
||||
enum vchiq_log_category {
|
||||
VCHIQ_ARM,
|
||||
VCHIQ_CORE,
|
||||
VCHIQ_CORE_MSG,
|
||||
VCHIQ_SYNC,
|
||||
VCHIQ_SUSPEND,
|
||||
};
|
||||
|
||||
static inline const char *log_category_str(enum vchiq_log_category c)
|
||||
{
|
||||
static const char * const strings[] = {
|
||||
"vchiq_arm",
|
||||
"vchiq_core",
|
||||
"vchiq_core_msg",
|
||||
"vchiq_sync",
|
||||
"vchiq_suspend",
|
||||
};
|
||||
|
||||
return strings[c];
|
||||
};
|
||||
|
||||
#ifndef vchiq_log_error
|
||||
#define vchiq_log_error(dev, cat, fmt, ...) \
|
||||
do { dev_dbg(dev, "%s error: " fmt, log_category_str(cat), ##__VA_ARGS__); } while (0)
|
||||
#endif
|
||||
#ifndef vchiq_log_warning
|
||||
#define vchiq_log_warning(dev, cat, fmt, ...) \
|
||||
do { dev_dbg(dev, "%s warning: " fmt, log_category_str(cat), ##__VA_ARGS__); } while (0)
|
||||
#endif
|
||||
#ifndef vchiq_log_debug
|
||||
#define vchiq_log_debug(dev, cat, fmt, ...) \
|
||||
do { dev_dbg(dev, "%s debug: " fmt, log_category_str(cat), ##__VA_ARGS__); } while (0)
|
||||
#endif
|
||||
#ifndef vchiq_log_trace
|
||||
#define vchiq_log_trace(dev, cat, fmt, ...) \
|
||||
do { dev_dbg(dev, "%s trace: " fmt, log_category_str(cat), ##__VA_ARGS__); } while (0)
|
||||
#endif
|
||||
|
||||
#define VCHIQ_SLOT_MASK (VCHIQ_SLOT_SIZE - 1)
|
||||
#define VCHIQ_SLOT_QUEUE_MASK (VCHIQ_MAX_SLOTS_PER_SIDE - 1)
|
||||
#define VCHIQ_SLOT_ZERO_SLOTS DIV_ROUND_UP(sizeof(struct vchiq_slot_zero), \
|
||||
@ -504,11 +467,8 @@ vchiq_bulk_transfer(struct vchiq_instance *instance, unsigned int handle, void *
|
||||
void __user *uoffset, int size, void *userdata, enum vchiq_bulk_mode mode,
|
||||
enum vchiq_bulk_dir dir);
|
||||
|
||||
extern int
|
||||
vchiq_dump_state(void *dump_context, struct vchiq_state *state);
|
||||
|
||||
extern int
|
||||
vchiq_dump_service_state(void *dump_context, struct vchiq_service *service);
|
||||
extern void
|
||||
vchiq_dump_state(struct seq_file *f, struct vchiq_state *state);
|
||||
|
||||
extern void
|
||||
vchiq_loud_error_header(void);
|
||||
@ -564,13 +524,11 @@ void vchiq_complete_bulk(struct vchiq_instance *instance, struct vchiq_bulk *bul
|
||||
|
||||
void remote_event_signal(struct remote_event *event);
|
||||
|
||||
int vchiq_dump(void *dump_context, const char *str, int len);
|
||||
void vchiq_dump_platform_state(struct seq_file *f);
|
||||
|
||||
int vchiq_dump_platform_state(void *dump_context);
|
||||
void vchiq_dump_platform_instances(struct seq_file *f);
|
||||
|
||||
int vchiq_dump_platform_instances(void *dump_context);
|
||||
|
||||
int vchiq_dump_platform_service_state(void *dump_context, struct vchiq_service *service);
|
||||
void vchiq_dump_platform_service_state(struct seq_file *f, struct vchiq_service *service);
|
||||
|
||||
int vchiq_use_service_internal(struct vchiq_service *service);
|
||||
|
||||
|
@ -40,6 +40,13 @@ static int debugfs_trace_show(struct seq_file *f, void *offset)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int vchiq_dump_show(struct seq_file *f, void *offset)
|
||||
{
|
||||
vchiq_dump_state(f, &g_state);
|
||||
return 0;
|
||||
}
|
||||
DEFINE_SHOW_ATTRIBUTE(vchiq_dump);
|
||||
|
||||
static int debugfs_trace_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, debugfs_trace_show, inode->i_private);
|
||||
@ -115,6 +122,9 @@ void vchiq_debugfs_init(void)
|
||||
{
|
||||
vchiq_dbg_dir = debugfs_create_dir("vchiq", NULL);
|
||||
vchiq_dbg_clients = debugfs_create_dir("clients", vchiq_dbg_dir);
|
||||
|
||||
debugfs_create_file("state", S_IFREG | 0444, vchiq_dbg_dir, NULL,
|
||||
&vchiq_dump_fops);
|
||||
}
|
||||
|
||||
/* remove all the debugfs entries */
|
||||
|
@ -47,9 +47,8 @@ user_service_free(void *userdata)
|
||||
|
||||
static void close_delivered(struct user_service *user_service)
|
||||
{
|
||||
vchiq_log_debug(user_service->service->state->dev, VCHIQ_ARM,
|
||||
"%s(handle=%x)",
|
||||
__func__, user_service->service->handle);
|
||||
dev_dbg(user_service->service->state->dev,
|
||||
"arm: (handle=%x)\n", user_service->service->handle);
|
||||
|
||||
if (user_service->close_pending) {
|
||||
/* Allow the underlying service to be culled */
|
||||
@ -235,8 +234,7 @@ static int vchiq_ioc_dequeue_message(struct vchiq_instance *instance,
|
||||
spin_unlock(&msg_queue_spinlock);
|
||||
DEBUG_TRACE(DEQUEUE_MESSAGE_LINE);
|
||||
if (wait_for_completion_interruptible(&user_service->insert_event)) {
|
||||
vchiq_log_debug(service->state->dev, VCHIQ_ARM,
|
||||
"DEQUEUE_MESSAGE interrupted");
|
||||
dev_dbg(service->state->dev, "arm: DEQUEUE_MESSAGE interrupted\n");
|
||||
ret = -EINTR;
|
||||
break;
|
||||
}
|
||||
@ -271,9 +269,9 @@ static int vchiq_ioc_dequeue_message(struct vchiq_instance *instance,
|
||||
ret = -EFAULT;
|
||||
}
|
||||
} else {
|
||||
vchiq_log_error(service->state->dev, VCHIQ_ARM,
|
||||
"header %pK: bufsize %x < size %x",
|
||||
header, args->bufsize, header->size);
|
||||
dev_err(service->state->dev,
|
||||
"arm: header %pK: bufsize %x < size %x\n",
|
||||
header, args->bufsize, header->size);
|
||||
WARN(1, "invalid size\n");
|
||||
ret = -EMSGSIZE;
|
||||
}
|
||||
@ -318,13 +316,13 @@ static int vchiq_irq_queue_bulk_tx_rx(struct vchiq_instance *instance,
|
||||
}
|
||||
mutex_unlock(&instance->bulk_waiter_list_mutex);
|
||||
if (!waiter) {
|
||||
vchiq_log_error(service->state->dev, VCHIQ_ARM,
|
||||
"no bulk_waiter found for pid %d", current->pid);
|
||||
dev_err(service->state->dev,
|
||||
"arm: no bulk_waiter found for pid %d\n", current->pid);
|
||||
ret = -ESRCH;
|
||||
goto out;
|
||||
}
|
||||
vchiq_log_debug(service->state->dev, VCHIQ_ARM,
|
||||
"found bulk_waiter %pK for pid %d", waiter, current->pid);
|
||||
dev_dbg(service->state->dev, "arm: found bulk_waiter %pK for pid %d\n",
|
||||
waiter, current->pid);
|
||||
userdata = &waiter->bulk_waiter;
|
||||
} else {
|
||||
userdata = args->userdata;
|
||||
@ -355,8 +353,8 @@ static int vchiq_irq_queue_bulk_tx_rx(struct vchiq_instance *instance,
|
||||
mutex_lock(&instance->bulk_waiter_list_mutex);
|
||||
list_add(&waiter->list, &instance->bulk_waiter_list);
|
||||
mutex_unlock(&instance->bulk_waiter_list_mutex);
|
||||
vchiq_log_debug(service->state->dev, VCHIQ_ARM,
|
||||
"saved bulk_waiter %pK for pid %d", waiter, current->pid);
|
||||
dev_dbg(service->state->dev, "arm: saved bulk_waiter %pK for pid %d\n",
|
||||
waiter, current->pid);
|
||||
|
||||
ret = put_user(mode_waiting, mode);
|
||||
}
|
||||
@ -455,8 +453,7 @@ static int vchiq_ioc_await_completion(struct vchiq_instance *instance,
|
||||
mutex_lock(&instance->completion_mutex);
|
||||
if (rc) {
|
||||
DEBUG_TRACE(AWAIT_COMPLETION_LINE);
|
||||
vchiq_log_debug(instance->state->dev, VCHIQ_ARM,
|
||||
"AWAIT_COMPLETION interrupted");
|
||||
dev_dbg(instance->state->dev, "arm: AWAIT_COMPLETION interrupted\n");
|
||||
ret = -EINTR;
|
||||
goto out;
|
||||
}
|
||||
@ -501,10 +498,10 @@ static int vchiq_ioc_await_completion(struct vchiq_instance *instance,
|
||||
msglen = header->size + sizeof(struct vchiq_header);
|
||||
/* This must be a VCHIQ-style service */
|
||||
if (args->msgbufsize < msglen) {
|
||||
vchiq_log_error(service->state->dev, VCHIQ_ARM,
|
||||
"header %pK: msgbufsize %x < msglen %x",
|
||||
header, args->msgbufsize, msglen);
|
||||
WARN(1, "invalid message size\n");
|
||||
dev_err(service->state->dev,
|
||||
"arm: header %pK: msgbufsize %x < msglen %x\n",
|
||||
header, args->msgbufsize, msglen);
|
||||
WARN(1, "invalid message size\n");
|
||||
if (ret == 0)
|
||||
ret = -EMSGSIZE;
|
||||
break;
|
||||
@ -582,10 +579,9 @@ vchiq_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
long ret = 0;
|
||||
int i, rc;
|
||||
|
||||
vchiq_log_trace(instance->state->dev, VCHIQ_ARM,
|
||||
"%s - instance %pK, cmd %s, arg %lx", __func__, instance,
|
||||
((_IOC_TYPE(cmd) == VCHIQ_IOC_MAGIC) && (_IOC_NR(cmd) <= VCHIQ_IOC_MAX)) ?
|
||||
ioctl_names[_IOC_NR(cmd)] : "<invalid>", arg);
|
||||
dev_dbg(instance->state->dev, "arm: instance %pK, cmd %s, arg %lx\n", instance,
|
||||
((_IOC_TYPE(cmd) == VCHIQ_IOC_MAGIC) && (_IOC_NR(cmd) <= VCHIQ_IOC_MAX)) ?
|
||||
ioctl_names[_IOC_NR(cmd)] : "<invalid>", arg);
|
||||
|
||||
switch (cmd) {
|
||||
case VCHIQ_IOC_SHUTDOWN:
|
||||
@ -618,9 +614,9 @@ vchiq_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
}
|
||||
rc = mutex_lock_killable(&instance->state->mutex);
|
||||
if (rc) {
|
||||
vchiq_log_error(instance->state->dev, VCHIQ_ARM,
|
||||
"vchiq: connect: could not lock mutex for state %d: %d",
|
||||
instance->state->id, rc);
|
||||
dev_err(instance->state->dev,
|
||||
"arm: vchiq: connect: could not lock mutex for state %d: %d\n",
|
||||
instance->state->id, rc);
|
||||
ret = -EINTR;
|
||||
break;
|
||||
}
|
||||
@ -630,8 +626,8 @@ vchiq_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
if (!status)
|
||||
instance->connected = 1;
|
||||
else
|
||||
vchiq_log_error(instance->state->dev, VCHIQ_ARM,
|
||||
"vchiq: could not connect: %d", status);
|
||||
dev_err(instance->state->dev,
|
||||
"arm: vchiq: could not connect: %d\n", status);
|
||||
break;
|
||||
|
||||
case VCHIQ_IOC_CREATE_SERVICE: {
|
||||
@ -700,13 +696,13 @@ vchiq_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
vchiq_use_service_internal(service) :
|
||||
vchiq_release_service_internal(service);
|
||||
if (ret) {
|
||||
vchiq_log_error(instance->state->dev, VCHIQ_SUSPEND,
|
||||
"%s: cmd %s returned error %ld for service %p4cc:%03d",
|
||||
__func__, (cmd == VCHIQ_IOC_USE_SERVICE) ?
|
||||
"VCHIQ_IOC_USE_SERVICE" :
|
||||
"VCHIQ_IOC_RELEASE_SERVICE",
|
||||
ret, &service->base.fourcc,
|
||||
service->client_id);
|
||||
dev_err(instance->state->dev,
|
||||
"suspend: cmd %s returned error %ld for service %p4cc:%03d\n",
|
||||
(cmd == VCHIQ_IOC_USE_SERVICE) ?
|
||||
"VCHIQ_IOC_USE_SERVICE" :
|
||||
"VCHIQ_IOC_RELEASE_SERVICE",
|
||||
ret, &service->base.fourcc,
|
||||
service->client_id);
|
||||
}
|
||||
} else {
|
||||
ret = -EINVAL;
|
||||
@ -868,15 +864,15 @@ vchiq_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
}
|
||||
|
||||
if (!status && (ret < 0) && (ret != -EINTR) && (ret != -EWOULDBLOCK)) {
|
||||
vchiq_log_debug(instance->state->dev, VCHIQ_ARM,
|
||||
" ioctl instance %pK, cmd %s -> status %d, %ld",
|
||||
instance, (_IOC_NR(cmd) <= VCHIQ_IOC_MAX) ?
|
||||
ioctl_names[_IOC_NR(cmd)] : "<invalid>", status, ret);
|
||||
dev_dbg(instance->state->dev,
|
||||
"arm: ioctl instance %pK, cmd %s -> status %d, %ld\n",
|
||||
instance, (_IOC_NR(cmd) <= VCHIQ_IOC_MAX) ?
|
||||
ioctl_names[_IOC_NR(cmd)] : "<invalid>", status, ret);
|
||||
} else {
|
||||
vchiq_log_trace(instance->state->dev, VCHIQ_ARM,
|
||||
" ioctl instance %pK, cmd %s -> status %d, %ld",
|
||||
instance, (_IOC_NR(cmd) <= VCHIQ_IOC_MAX) ?
|
||||
ioctl_names[_IOC_NR(cmd)] : "<invalid>", status, ret);
|
||||
dev_dbg(instance->state->dev,
|
||||
"arm: ioctl instance %pK, cmd %s -> status %d\n, %ld\n",
|
||||
instance, (_IOC_NR(cmd) <= VCHIQ_IOC_MAX) ?
|
||||
ioctl_names[_IOC_NR(cmd)] : "<invalid>", status, ret);
|
||||
}
|
||||
|
||||
return ret;
|
||||
@ -1170,11 +1166,10 @@ static int vchiq_open(struct inode *inode, struct file *file)
|
||||
struct vchiq_state *state = vchiq_get_state();
|
||||
struct vchiq_instance *instance;
|
||||
|
||||
vchiq_log_debug(state->dev, VCHIQ_ARM, "vchiq_open");
|
||||
dev_dbg(state->dev, "arm: vchiq open\n");
|
||||
|
||||
if (!state) {
|
||||
vchiq_log_error(state->dev, VCHIQ_ARM,
|
||||
"vchiq has no connection to VideoCore");
|
||||
dev_err(state->dev, "arm: vchiq has no connection to VideoCore\n");
|
||||
return -ENOTCONN;
|
||||
}
|
||||
|
||||
@ -1206,8 +1201,7 @@ static int vchiq_release(struct inode *inode, struct file *file)
|
||||
int ret = 0;
|
||||
int i;
|
||||
|
||||
vchiq_log_debug(state->dev, VCHIQ_ARM, "%s: instance=%lx", __func__,
|
||||
(unsigned long)instance);
|
||||
dev_dbg(state->dev, "arm: instance=%p\n", instance);
|
||||
|
||||
if (!state) {
|
||||
ret = -EPERM;
|
||||
@ -1306,26 +1300,6 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
vchiq_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
|
||||
{
|
||||
struct dump_context context;
|
||||
int err;
|
||||
|
||||
context.buf = buf;
|
||||
context.actual = 0;
|
||||
context.space = count;
|
||||
context.offset = *ppos;
|
||||
|
||||
err = vchiq_dump_state(&context, &g_state);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
*ppos += context.actual;
|
||||
|
||||
return context.actual;
|
||||
}
|
||||
|
||||
static const struct file_operations
|
||||
vchiq_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
@ -1335,7 +1309,6 @@ vchiq_fops = {
|
||||
#endif
|
||||
.open = vchiq_open,
|
||||
.release = vchiq_release,
|
||||
.read = vchiq_read
|
||||
};
|
||||
|
||||
static struct miscdevice vchiq_miscdev = {
|
||||
|
@ -3,18 +3,32 @@ menuconfig VME_BUS
|
||||
bool "VME bridge support"
|
||||
depends on PCI
|
||||
help
|
||||
If you say Y here you get support for the VME bridge Framework.
|
||||
Enable support for VME (VersaModular Eurocard bus) bridge modules.
|
||||
The bridge allows connecting VME devices to systems with existing
|
||||
interfaces (like USB or PCI) by means of translating VME protocol
|
||||
operations.
|
||||
|
||||
Note that this only enables the bridge framework. You'll also
|
||||
likely want to enable driver for specific bridge device you have
|
||||
to actually use it. If unsure, say N.
|
||||
|
||||
if VME_BUS
|
||||
|
||||
comment "VME Bridge Drivers"
|
||||
|
||||
config VME_TSI148
|
||||
tristate "Tempe"
|
||||
tristate "Tundra TSI148 VME bridge support"
|
||||
depends on HAS_DMA
|
||||
help
|
||||
If you say Y here you get support for the Tundra TSI148 VME bridge
|
||||
chip.
|
||||
If you say Y here you get support for the Tundra TSI148 VME-to-PCI/X
|
||||
bridge chip (and pin-compatible clones).
|
||||
|
||||
TSI148 is a high-performant, 2eSST and VME64-compliant VME-to-PCI/X
|
||||
interconnect bridge with support for PCI and PCI-X bus interface.
|
||||
It is primarily used in industrial and embedded systems.
|
||||
|
||||
To compile this driver as a module, say M - the module will be
|
||||
called vme_tsi148. If unsure, say N.
|
||||
|
||||
config VME_FAKE
|
||||
tristate "Fake"
|
||||
|
@ -340,8 +340,8 @@ int vme_slave_set(struct vme_resource *resource, int enabled,
|
||||
image = list_entry(resource->entry, struct vme_slave_resource, list);
|
||||
|
||||
if (!bridge->slave_set) {
|
||||
dev_err(bridge->parent, "Function not supported\n");
|
||||
return -ENOSYS;
|
||||
dev_err(bridge->parent, "%s not supported\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!(((image->address_attr & aspace) == aspace) &&
|
||||
|
@ -10,12 +10,12 @@
|
||||
* CARDvUpdateBasicTopRate - Update BasicTopRate
|
||||
* CARDbAddBasicRate - Add to BasicRateSet
|
||||
* CARDbIsOFDMinBasicRate - Check if any OFDM rate is in BasicRateSet
|
||||
* CARDqGetTSFOffset - Calculate TSFOffset
|
||||
* card_get_tsf_offset - Calculate TSFOffset
|
||||
* vt6655_get_current_tsf - Read Current NIC TSF counter
|
||||
* CARDqGetNextTBTT - Calculate Next Beacon TSF counter
|
||||
* card_get_next_tbtt - Calculate Next Beacon TSF counter
|
||||
* CARDvSetFirstNextTBTT - Set NIC Beacon time
|
||||
* CARDvUpdateNextTBTT - Sync. NIC Beacon time
|
||||
* CARDbRadioPowerOff - Turn Off NIC Radio Power
|
||||
* card_radio_power_off - Turn Off NIC Radio Power
|
||||
*
|
||||
* Revision History:
|
||||
* 06-10-2003 Bryan YC Fan: Re-write codes to support VT3253 spec.
|
||||
@ -280,7 +280,7 @@ bool card_set_phy_parameter(struct vnt_private *priv, u8 bb_type)
|
||||
* In:
|
||||
* priv - The adapter to be sync.
|
||||
* rx_rate - data rate of receive beacon
|
||||
* qwBSSTimestamp - Rx BCN's TSF
|
||||
* bss_timestamp - Rx BCN's TSF
|
||||
* qwLocalTSF - Local TSF
|
||||
* Out:
|
||||
* none
|
||||
@ -288,20 +288,20 @@ bool card_set_phy_parameter(struct vnt_private *priv, u8 bb_type)
|
||||
* Return Value: none
|
||||
*/
|
||||
bool card_update_tsf(struct vnt_private *priv, unsigned char rx_rate,
|
||||
u64 qwBSSTimestamp)
|
||||
u64 bss_timestamp)
|
||||
{
|
||||
u64 local_tsf;
|
||||
u64 qwTSFOffset = 0;
|
||||
u64 tsf_offset = 0;
|
||||
|
||||
local_tsf = vt6655_get_current_tsf(priv);
|
||||
|
||||
if (qwBSSTimestamp != local_tsf) {
|
||||
qwTSFOffset = CARDqGetTSFOffset(rx_rate, qwBSSTimestamp,
|
||||
if (bss_timestamp != local_tsf) {
|
||||
tsf_offset = card_get_tsf_offset(rx_rate, bss_timestamp,
|
||||
local_tsf);
|
||||
/* adjust TSF, HW's TSF add TSF Offset reg */
|
||||
qwTSFOffset = le64_to_cpu(qwTSFOffset);
|
||||
iowrite32((u32)qwTSFOffset, priv->port_offset + MAC_REG_TSFOFST);
|
||||
iowrite32((u32)(qwTSFOffset >> 32), priv->port_offset + MAC_REG_TSFOFST + 4);
|
||||
tsf_offset = le64_to_cpu(tsf_offset);
|
||||
iowrite32((u32)tsf_offset, priv->port_offset + MAC_REG_TSFOFST);
|
||||
iowrite32((u32)(tsf_offset >> 32), priv->port_offset + MAC_REG_TSFOFST + 4);
|
||||
vt6655_mac_reg_bits_on(priv->port_offset, MAC_REG_TFTCTL, TFTCTL_TSFSYNCEN);
|
||||
}
|
||||
return true;
|
||||
@ -314,28 +314,28 @@ bool card_update_tsf(struct vnt_private *priv, unsigned char rx_rate,
|
||||
* Parameters:
|
||||
* In:
|
||||
* priv - The adapter to be set.
|
||||
* wBeaconInterval - Beacon Interval
|
||||
* beacon_interval - Beacon Interval
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: true if succeed; otherwise false
|
||||
*/
|
||||
bool CARDbSetBeaconPeriod(struct vnt_private *priv,
|
||||
unsigned short wBeaconInterval)
|
||||
bool card_set_beacon_period(struct vnt_private *priv,
|
||||
unsigned short beacon_interval)
|
||||
{
|
||||
u64 qwNextTBTT;
|
||||
u64 next_tbtt;
|
||||
|
||||
qwNextTBTT = vt6655_get_current_tsf(priv); /* Get Local TSF counter */
|
||||
next_tbtt = vt6655_get_current_tsf(priv); /* Get Local TSF counter */
|
||||
|
||||
qwNextTBTT = CARDqGetNextTBTT(qwNextTBTT, wBeaconInterval);
|
||||
next_tbtt = card_get_next_tbtt(next_tbtt, beacon_interval);
|
||||
|
||||
/* set HW beacon interval */
|
||||
iowrite16(wBeaconInterval, priv->port_offset + MAC_REG_BI);
|
||||
priv->wBeaconInterval = wBeaconInterval;
|
||||
iowrite16(beacon_interval, priv->port_offset + MAC_REG_BI);
|
||||
priv->beacon_interval = beacon_interval;
|
||||
/* Set NextTBTT */
|
||||
qwNextTBTT = le64_to_cpu(qwNextTBTT);
|
||||
iowrite32((u32)qwNextTBTT, priv->port_offset + MAC_REG_NEXTTBTT);
|
||||
iowrite32((u32)(qwNextTBTT >> 32), priv->port_offset + MAC_REG_NEXTTBTT + 4);
|
||||
next_tbtt = le64_to_cpu(next_tbtt);
|
||||
iowrite32((u32)next_tbtt, priv->port_offset + MAC_REG_NEXTTBTT);
|
||||
iowrite32((u32)(next_tbtt >> 32), priv->port_offset + MAC_REG_NEXTTBTT + 4);
|
||||
vt6655_mac_reg_bits_on(priv->port_offset, MAC_REG_TFTCTL, TFTCTL_TBTTSYNCEN);
|
||||
|
||||
return true;
|
||||
@ -351,7 +351,7 @@ bool CARDbSetBeaconPeriod(struct vnt_private *priv,
|
||||
* none
|
||||
*
|
||||
*/
|
||||
void CARDbRadioPowerOff(struct vnt_private *priv)
|
||||
void card_radio_power_off(struct vnt_private *priv)
|
||||
{
|
||||
if (priv->radio_off)
|
||||
return;
|
||||
@ -382,29 +382,29 @@ void CARDbRadioPowerOff(struct vnt_private *priv)
|
||||
vt6655_mac_reg_bits_on(priv->port_offset, MAC_REG_GPIOCTL0, LED_ACTSET); /* LED issue */
|
||||
}
|
||||
|
||||
void CARDvSafeResetTx(struct vnt_private *priv)
|
||||
void card_safe_reset_tx(struct vnt_private *priv)
|
||||
{
|
||||
unsigned int uu;
|
||||
struct vnt_tx_desc *pCurrTD;
|
||||
struct vnt_tx_desc *curr_td;
|
||||
|
||||
/* initialize TD index */
|
||||
priv->apTailTD[0] = &priv->apTD0Rings[0];
|
||||
priv->tail_td[0] = &priv->apTD0Rings[0];
|
||||
priv->apCurrTD[0] = &priv->apTD0Rings[0];
|
||||
|
||||
priv->apTailTD[1] = &priv->apTD1Rings[0];
|
||||
priv->tail_td[1] = &priv->apTD1Rings[0];
|
||||
priv->apCurrTD[1] = &priv->apTD1Rings[0];
|
||||
|
||||
for (uu = 0; uu < TYPE_MAXTD; uu++)
|
||||
priv->iTDUsed[uu] = 0;
|
||||
|
||||
for (uu = 0; uu < priv->opts.tx_descs[0]; uu++) {
|
||||
pCurrTD = &priv->apTD0Rings[uu];
|
||||
pCurrTD->td0.owner = OWNED_BY_HOST;
|
||||
curr_td = &priv->apTD0Rings[uu];
|
||||
curr_td->td0.owner = OWNED_BY_HOST;
|
||||
/* init all Tx Packet pointer to NULL */
|
||||
}
|
||||
for (uu = 0; uu < priv->opts.tx_descs[1]; uu++) {
|
||||
pCurrTD = &priv->apTD1Rings[uu];
|
||||
pCurrTD->td0.owner = OWNED_BY_HOST;
|
||||
curr_td = &priv->apTD1Rings[uu];
|
||||
curr_td->td0.owner = OWNED_BY_HOST;
|
||||
/* init all Tx Packet pointer to NULL */
|
||||
}
|
||||
|
||||
@ -708,7 +708,7 @@ unsigned char card_get_pkt_type(struct vnt_private *priv)
|
||||
*
|
||||
* Return Value: TSF Offset value
|
||||
*/
|
||||
u64 CARDqGetTSFOffset(unsigned char rx_rate, u64 qwTSF1, u64 qwTSF2)
|
||||
u64 card_get_tsf_offset(unsigned char rx_rate, u64 qwTSF1, u64 qwTSF2)
|
||||
{
|
||||
unsigned short wRxBcnTSFOffst;
|
||||
|
||||
@ -764,11 +764,11 @@ u64 vt6655_get_current_tsf(struct vnt_private *priv)
|
||||
*
|
||||
* Return Value: TSF value of next Beacon
|
||||
*/
|
||||
u64 CARDqGetNextTBTT(u64 qwTSF, unsigned short wBeaconInterval)
|
||||
u64 card_get_next_tbtt(u64 qwTSF, unsigned short beacon_interval)
|
||||
{
|
||||
u32 beacon_int;
|
||||
|
||||
beacon_int = wBeaconInterval * 1024;
|
||||
beacon_int = beacon_interval * 1024;
|
||||
if (beacon_int) {
|
||||
do_div(qwTSF, beacon_int);
|
||||
qwTSF += 1;
|
||||
@ -785,25 +785,25 @@ u64 CARDqGetNextTBTT(u64 qwTSF, unsigned short wBeaconInterval)
|
||||
* Parameters:
|
||||
* In:
|
||||
* iobase - IO Base
|
||||
* wBeaconInterval - Beacon Interval
|
||||
* beacon_interval - Beacon Interval
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: none
|
||||
*/
|
||||
void CARDvSetFirstNextTBTT(struct vnt_private *priv,
|
||||
unsigned short wBeaconInterval)
|
||||
unsigned short beacon_interval)
|
||||
{
|
||||
void __iomem *iobase = priv->port_offset;
|
||||
u64 qwNextTBTT;
|
||||
u64 next_tbtt;
|
||||
|
||||
qwNextTBTT = vt6655_get_current_tsf(priv); /* Get Local TSF counter */
|
||||
next_tbtt = vt6655_get_current_tsf(priv); /* Get Local TSF counter */
|
||||
|
||||
qwNextTBTT = CARDqGetNextTBTT(qwNextTBTT, wBeaconInterval);
|
||||
next_tbtt = card_get_next_tbtt(next_tbtt, beacon_interval);
|
||||
/* Set NextTBTT */
|
||||
qwNextTBTT = le64_to_cpu(qwNextTBTT);
|
||||
iowrite32((u32)qwNextTBTT, iobase + MAC_REG_NEXTTBTT);
|
||||
iowrite32((u32)(qwNextTBTT >> 32), iobase + MAC_REG_NEXTTBTT + 4);
|
||||
next_tbtt = le64_to_cpu(next_tbtt);
|
||||
iowrite32((u32)next_tbtt, iobase + MAC_REG_NEXTTBTT);
|
||||
iowrite32((u32)(next_tbtt >> 32), iobase + MAC_REG_NEXTTBTT + 4);
|
||||
vt6655_mac_reg_bits_on(iobase, MAC_REG_TFTCTL, TFTCTL_TBTTSYNCEN);
|
||||
}
|
||||
|
||||
@ -815,18 +815,18 @@ void CARDvSetFirstNextTBTT(struct vnt_private *priv,
|
||||
* In:
|
||||
* priv - The adapter to be set
|
||||
* qwTSF - Current TSF counter
|
||||
* wBeaconInterval - Beacon Interval
|
||||
* beacon_interval - Beacon Interval
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: none
|
||||
*/
|
||||
void CARDvUpdateNextTBTT(struct vnt_private *priv, u64 qwTSF,
|
||||
unsigned short wBeaconInterval)
|
||||
unsigned short beacon_interval)
|
||||
{
|
||||
void __iomem *iobase = priv->port_offset;
|
||||
|
||||
qwTSF = CARDqGetNextTBTT(qwTSF, wBeaconInterval);
|
||||
qwTSF = card_get_next_tbtt(qwTSF, beacon_interval);
|
||||
/* Set NextTBTT */
|
||||
qwTSF = le64_to_cpu(qwTSF);
|
||||
iowrite32((u32)qwTSF, iobase + MAC_REG_NEXTTBTT);
|
||||
|
@ -43,20 +43,20 @@ void card_set_rspinf(struct vnt_private *priv, u8 bb_type);
|
||||
void CARDvUpdateBasicTopRate(struct vnt_private *priv);
|
||||
bool CARDbIsOFDMinBasicRate(struct vnt_private *priv);
|
||||
void CARDvSetFirstNextTBTT(struct vnt_private *priv,
|
||||
unsigned short wBeaconInterval);
|
||||
unsigned short beacon_interval);
|
||||
void CARDvUpdateNextTBTT(struct vnt_private *priv, u64 qwTSF,
|
||||
unsigned short wBeaconInterval);
|
||||
unsigned short beacon_interval);
|
||||
u64 vt6655_get_current_tsf(struct vnt_private *priv);
|
||||
u64 CARDqGetNextTBTT(u64 qwTSF, unsigned short wBeaconInterval);
|
||||
u64 CARDqGetTSFOffset(unsigned char rx_rate, u64 qwTSF1, u64 qwTSF2);
|
||||
u64 card_get_next_tbtt(u64 qwTSF, unsigned short beacon_interval);
|
||||
u64 card_get_tsf_offset(unsigned char rx_rate, u64 qwTSF1, u64 qwTSF2);
|
||||
unsigned char card_get_pkt_type(struct vnt_private *priv);
|
||||
void CARDvSafeResetTx(struct vnt_private *priv);
|
||||
void card_safe_reset_tx(struct vnt_private *priv);
|
||||
void CARDvSafeResetRx(struct vnt_private *priv);
|
||||
void CARDbRadioPowerOff(struct vnt_private *priv);
|
||||
void card_radio_power_off(struct vnt_private *priv);
|
||||
bool card_set_phy_parameter(struct vnt_private *priv, u8 bb_type);
|
||||
bool card_update_tsf(struct vnt_private *priv, unsigned char rx_rate,
|
||||
u64 qwBSSTimestamp);
|
||||
bool CARDbSetBeaconPeriod(struct vnt_private *priv,
|
||||
unsigned short wBeaconInterval);
|
||||
u64 bss_timestamp);
|
||||
bool card_set_beacon_period(struct vnt_private *priv,
|
||||
unsigned short beacon_interval);
|
||||
|
||||
#endif /* __CARD_H__ */
|
||||
|
@ -133,7 +133,7 @@ struct vnt_private {
|
||||
volatile int iTDUsed[TYPE_MAXTD];
|
||||
|
||||
struct vnt_tx_desc *apCurrTD[TYPE_MAXTD];
|
||||
struct vnt_tx_desc *apTailTD[TYPE_MAXTD];
|
||||
struct vnt_tx_desc *tail_td[TYPE_MAXTD];
|
||||
|
||||
struct vnt_tx_desc *apTD0Rings;
|
||||
struct vnt_tx_desc *apTD1Rings;
|
||||
@ -281,7 +281,7 @@ struct vnt_private {
|
||||
|
||||
unsigned char abyEEPROM[EEP_MAX_CONTEXT_SIZE]; /* unsigned long alignment */
|
||||
|
||||
unsigned short wBeaconInterval;
|
||||
unsigned short beacon_interval;
|
||||
u16 wake_up_count;
|
||||
|
||||
struct work_struct interrupt_work;
|
||||
|
@ -454,7 +454,7 @@ static void device_init_registers(struct vnt_private *priv)
|
||||
}
|
||||
|
||||
if (priv->hw_radio_off || priv->bRadioControlOff)
|
||||
CARDbRadioPowerOff(priv);
|
||||
card_radio_power_off(priv);
|
||||
|
||||
/* get Permanent network address */
|
||||
SROMvReadEtherAddress(priv->port_offset, priv->abyCurrentNetAddr);
|
||||
@ -463,7 +463,7 @@ static void device_init_registers(struct vnt_private *priv)
|
||||
/* reset Tx pointer */
|
||||
CARDvSafeResetRx(priv);
|
||||
/* reset Rx pointer */
|
||||
CARDvSafeResetTx(priv);
|
||||
card_safe_reset_tx(priv);
|
||||
|
||||
if (priv->local_id <= REV_ID_VT3253_A1)
|
||||
vt6655_mac_reg_bits_on(priv->port_offset, MAC_REG_RCR, RCR_WPAERR);
|
||||
@ -737,7 +737,7 @@ static int device_init_td0_ring(struct vnt_private *priv)
|
||||
|
||||
if (i > 0)
|
||||
priv->apTD0Rings[i - 1].next_desc = cpu_to_le32(priv->td0_pool_dma);
|
||||
priv->apTailTD[0] = priv->apCurrTD[0] = &priv->apTD0Rings[0];
|
||||
priv->tail_td[0] = priv->apCurrTD[0] = &priv->apTD0Rings[0];
|
||||
|
||||
return 0;
|
||||
|
||||
@ -777,7 +777,7 @@ static int device_init_td1_ring(struct vnt_private *priv)
|
||||
|
||||
if (i > 0)
|
||||
priv->apTD1Rings[i - 1].next_desc = cpu_to_le32(priv->td1_pool_dma);
|
||||
priv->apTailTD[1] = priv->apCurrTD[1] = &priv->apTD1Rings[0];
|
||||
priv->tail_td[1] = priv->apCurrTD[1] = &priv->apTD1Rings[0];
|
||||
|
||||
return 0;
|
||||
|
||||
@ -969,7 +969,7 @@ static int device_tx_srv(struct vnt_private *priv, unsigned int idx)
|
||||
unsigned char byTsr0;
|
||||
unsigned char byTsr1;
|
||||
|
||||
for (desc = priv->apTailTD[idx]; priv->iTDUsed[idx] > 0; desc = desc->next) {
|
||||
for (desc = priv->tail_td[idx]; priv->iTDUsed[idx] > 0; desc = desc->next) {
|
||||
if (desc->td0.owner == OWNED_BY_NIC)
|
||||
break;
|
||||
if (works++ > 15)
|
||||
@ -1007,7 +1007,7 @@ static int device_tx_srv(struct vnt_private *priv, unsigned int idx)
|
||||
}
|
||||
}
|
||||
|
||||
priv->apTailTD[idx] = desc;
|
||||
priv->tail_td[idx] = desc;
|
||||
|
||||
return works;
|
||||
}
|
||||
@ -1349,7 +1349,7 @@ static void vnt_stop(struct ieee80211_hw *hw)
|
||||
|
||||
MACbShutdown(priv);
|
||||
MACbSoftwareReset(priv);
|
||||
CARDbRadioPowerOff(priv);
|
||||
card_radio_power_off(priv);
|
||||
|
||||
device_free_td0_ring(priv);
|
||||
device_free_td1_ring(priv);
|
||||
@ -1537,7 +1537,7 @@ static void vnt_bss_info_changed(struct ieee80211_hw *hw,
|
||||
card_update_tsf(priv, conf->beacon_rate->hw_value,
|
||||
conf->sync_tsf);
|
||||
|
||||
CARDbSetBeaconPeriod(priv, conf->beacon_int);
|
||||
card_set_beacon_period(priv, conf->beacon_int);
|
||||
|
||||
CARDvSetFirstNextTBTT(priv, conf->beacon_int);
|
||||
} else {
|
||||
@ -1712,7 +1712,7 @@ static int vnt_init(struct vnt_private *priv)
|
||||
|
||||
priv->mac_hw = true;
|
||||
|
||||
CARDbRadioPowerOff(priv);
|
||||
card_radio_power_off(priv);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1456,7 +1456,7 @@ int vnt_beacon_enable(struct vnt_private *priv, struct ieee80211_vif *vif,
|
||||
|
||||
CARDvSetFirstNextTBTT(priv, conf->beacon_int);
|
||||
|
||||
CARDbSetBeaconPeriod(priv, conf->beacon_int);
|
||||
card_set_beacon_period(priv, conf->beacon_int);
|
||||
|
||||
return vnt_beacon_make(priv, vif);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user