From: wlanfae <wlanfae@realtek.com>
[PATCH 1/8] rtl8192e: Import new version of driver from realtek Signed-off-by: wlanfae <wlanfae@realtek.com> Signed-off-by: Mike McCormack <mikem@ring3k.org> Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net> ---
This commit is contained in:
parent
8cfcabf80c
commit
94a799425e
76 changed files with 59867 additions and 14253 deletions
|
|
@ -1,38 +1,46 @@
|
|||
NIC_SELECT = RTL8192E
|
||||
|
||||
ccflags-y := -DRTL8192E
|
||||
ccflags-y += -std=gnu89
|
||||
ccflags-y += -O2
|
||||
ccflags-y += -DTHOMAS_TURBO
|
||||
ccflags-y += -DRTL8192E
|
||||
ccflags-y += -DEEPROM_OLD_FORMAT_SUPPORT=1
|
||||
ccflags-y += -DUSE_FW_SOURCE_IMG_FILE
|
||||
ccflags-y += -DENABLE_GPIO_RADIO_CTL
|
||||
ccflags-y += -DCONFIG_PM_RTL
|
||||
ccflags-y += -DCONFIG_PM
|
||||
ccflags-y += -DENABLE_DOT11D
|
||||
ccflags-y += -DHAVE_NET_DEVICE_OPS
|
||||
ccflags-y += -DENABLE_DOT11D
|
||||
|
||||
ccflags-y += -DENABLE_IPS
|
||||
ccflags-y += -DENABLE_LPS
|
||||
|
||||
r8192e_pci-objs := \
|
||||
r8192E_core.o \
|
||||
r8180_93cx6.o \
|
||||
r8192E_wx.o \
|
||||
r8190_rtl8256.o \
|
||||
r819xE_phy.o \
|
||||
r819xE_firmware.o \
|
||||
r819xE_cmdpkt.o \
|
||||
r8192E_dm.o \
|
||||
r8192_pm.o \
|
||||
ieee80211/ieee80211_rx.o \
|
||||
ieee80211/ieee80211_softmac.o \
|
||||
ieee80211/ieee80211_tx.o \
|
||||
ieee80211/ieee80211_wx.o \
|
||||
ieee80211/ieee80211_module.o \
|
||||
ieee80211/ieee80211_softmac_wx.o \
|
||||
ieee80211/rtl819x_HTProc.o \
|
||||
ieee80211/rtl819x_TSProc.o \
|
||||
ieee80211/rtl819x_BAProc.o \
|
||||
ieee80211/dot11d.o \
|
||||
ieee80211/ieee80211_crypt.o \
|
||||
ieee80211/ieee80211_crypt_tkip.o \
|
||||
ieee80211/ieee80211_crypt_ccmp.o \
|
||||
ieee80211/ieee80211_crypt_wep.o
|
||||
rtl_core.o \
|
||||
rtl_eeprom.o \
|
||||
rtl_ps.o \
|
||||
rtl_wx.o \
|
||||
rtl_cam.o \
|
||||
rtl_dm.o \
|
||||
rtl_pm.o \
|
||||
rtl_pci.o \
|
||||
rtl_debug.o \
|
||||
rtl_ethtool.o \
|
||||
r8192E_dev.o \
|
||||
r8192E_phy.o \
|
||||
r8192E_firmware.o \
|
||||
r8192E_cmdpkt.o \
|
||||
r8192E_hwimg.o \
|
||||
r8190P_rtl8256.o \
|
||||
rtllib_rx.o \
|
||||
rtllib_softmac.o \
|
||||
rtllib_tx.o \
|
||||
rtllib_wx.o \
|
||||
rtllib_module.o \
|
||||
rtllib_softmac_wx.o \
|
||||
rtl819x_HTProc.o \
|
||||
rtl819x_TSProc.o \
|
||||
rtl819x_BAProc.o \
|
||||
dot11d.o \
|
||||
rtllib_crypt.o \
|
||||
rtllib_crypt_tkip.o \
|
||||
rtllib_crypt_ccmp.o \
|
||||
rtllib_crypt_wep.o
|
||||
|
||||
obj-$(CONFIG_RTL8192E) += r8192e_pci.o
|
||||
|
||||
|
|
|
|||
216
drivers/staging/rtl8192e/dot11d.c
Normal file
216
drivers/staging/rtl8192e/dot11d.c
Normal file
|
|
@ -0,0 +1,216 @@
|
|||
/******************************************************************************
|
||||
* Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
|
||||
*
|
||||
* The full GNU General Public License is included in this distribution in the
|
||||
* file called LICENSE.
|
||||
*
|
||||
* Contact Information:
|
||||
* wlanfae <wlanfae@realtek.com>
|
||||
******************************************************************************/
|
||||
#include "dot11d.h"
|
||||
|
||||
struct channel_list {
|
||||
u8 Channel[32];
|
||||
u8 Len;
|
||||
};
|
||||
|
||||
static struct channel_list ChannelPlan[] = {
|
||||
{{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 *pDot11dInfo = GET_DOT11D_INFO(ieee);
|
||||
pDot11dInfo->bEnabled = false;
|
||||
|
||||
pDot11dInfo->State = DOT11D_STATE_NONE;
|
||||
pDot11dInfo->CountryIeLen = 0;
|
||||
memset(pDot11dInfo->channel_map, 0, MAX_CHANNEL_NUMBER+1);
|
||||
memset(pDot11dInfo->MaxTxPwrDbmList, 0xFF, MAX_CHANNEL_NUMBER+1);
|
||||
RESET_CIE_WATCHDOG(ieee);
|
||||
|
||||
}
|
||||
|
||||
void Dot11d_Channelmap(u8 channel_plan, struct rtllib_device *ieee)
|
||||
{
|
||||
int i, max_chan = 14, min_chan = 1;
|
||||
|
||||
ieee->bGlobalDomain = false;
|
||||
|
||||
if (ChannelPlan[channel_plan].Len != 0) {
|
||||
memset(GET_DOT11D_INFO(ieee)->channel_map, 0,
|
||||
sizeof(GET_DOT11D_INFO(ieee)->channel_map));
|
||||
for (i = 0; i < ChannelPlan[channel_plan].Len; i++) {
|
||||
if (ChannelPlan[channel_plan].Channel[i] < min_chan ||
|
||||
ChannelPlan[channel_plan].Channel[i] > max_chan)
|
||||
break;
|
||||
GET_DOT11D_INFO(ieee)->channel_map[ChannelPlan
|
||||
[channel_plan].Channel[i]] = 1;
|
||||
}
|
||||
}
|
||||
|
||||
switch (channel_plan) {
|
||||
case COUNTRY_CODE_GLOBAL_DOMAIN:
|
||||
ieee->bGlobalDomain = true;
|
||||
for (i = 12; i <= 14; i++)
|
||||
GET_DOT11D_INFO(ieee)->channel_map[i] = 2;
|
||||
ieee->IbssStartChnl = 10;
|
||||
ieee->ibss_maxjoin_chal = 11;
|
||||
break;
|
||||
|
||||
case COUNTRY_CODE_WORLD_WIDE_13:
|
||||
for (i = 12; i <= 13; i++)
|
||||
GET_DOT11D_INFO(ieee)->channel_map[i] = 2;
|
||||
ieee->IbssStartChnl = 10;
|
||||
ieee->ibss_maxjoin_chal = 11;
|
||||
break;
|
||||
|
||||
default:
|
||||
ieee->IbssStartChnl = 1;
|
||||
ieee->ibss_maxjoin_chal = 14;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Dot11d_Reset(struct rtllib_device *ieee)
|
||||
{
|
||||
struct rt_dot11d_info *pDot11dInfo = GET_DOT11D_INFO(ieee);
|
||||
u32 i;
|
||||
|
||||
memset(pDot11dInfo->channel_map, 0, MAX_CHANNEL_NUMBER+1);
|
||||
memset(pDot11dInfo->MaxTxPwrDbmList, 0xFF, MAX_CHANNEL_NUMBER+1);
|
||||
for (i = 1; i <= 11; i++)
|
||||
(pDot11dInfo->channel_map)[i] = 1;
|
||||
for (i = 12; i <= 14; i++)
|
||||
(pDot11dInfo->channel_map)[i] = 2;
|
||||
pDot11dInfo->State = DOT11D_STATE_NONE;
|
||||
pDot11dInfo->CountryIeLen = 0;
|
||||
RESET_CIE_WATCHDOG(ieee);
|
||||
}
|
||||
|
||||
void Dot11d_UpdateCountryIe(struct rtllib_device *dev, u8 *pTaddr,
|
||||
u16 CoutryIeLen, u8 *pCoutryIe)
|
||||
{
|
||||
struct rt_dot11d_info *pDot11dInfo = GET_DOT11D_INFO(dev);
|
||||
u8 i, j, NumTriples, MaxChnlNum;
|
||||
struct chnl_txpow_triple *pTriple;
|
||||
|
||||
memset(pDot11dInfo->channel_map, 0, MAX_CHANNEL_NUMBER+1);
|
||||
memset(pDot11dInfo->MaxTxPwrDbmList, 0xFF, MAX_CHANNEL_NUMBER+1);
|
||||
MaxChnlNum = 0;
|
||||
NumTriples = (CoutryIeLen - 3) / 3;
|
||||
pTriple = (struct chnl_txpow_triple *)(pCoutryIe + 3);
|
||||
for (i = 0; i < NumTriples; i++) {
|
||||
if (MaxChnlNum >= pTriple->FirstChnl) {
|
||||
printk(KERN_INFO "Dot11d_UpdateCountryIe(): Invalid"
|
||||
" country IE, skip it........1\n");
|
||||
return;
|
||||
}
|
||||
if (MAX_CHANNEL_NUMBER < (pTriple->FirstChnl +
|
||||
pTriple->NumChnls)) {
|
||||
printk(KERN_INFO "Dot11d_UpdateCountryIe(): Invalid "
|
||||
"country IE, skip it........2\n");
|
||||
return;
|
||||
}
|
||||
|
||||
for (j = 0 ; j < pTriple->NumChnls; j++) {
|
||||
pDot11dInfo->channel_map[pTriple->FirstChnl + j] = 1;
|
||||
pDot11dInfo->MaxTxPwrDbmList[pTriple->FirstChnl + j] =
|
||||
pTriple->MaxTxPowerInDbm;
|
||||
MaxChnlNum = pTriple->FirstChnl + j;
|
||||
}
|
||||
|
||||
pTriple = (struct chnl_txpow_triple *)((u8*)pTriple + 3);
|
||||
}
|
||||
|
||||
UPDATE_CIE_SRC(dev, pTaddr);
|
||||
|
||||
pDot11dInfo->CountryIeLen = CoutryIeLen;
|
||||
memcpy(pDot11dInfo->CountryIeBuf, pCoutryIe, CoutryIeLen);
|
||||
pDot11dInfo->State = DOT11D_STATE_LEARNED;
|
||||
}
|
||||
|
||||
u8 DOT11D_GetMaxTxPwrInDbm(struct rtllib_device *dev, u8 Channel)
|
||||
{
|
||||
struct rt_dot11d_info *pDot11dInfo = GET_DOT11D_INFO(dev);
|
||||
u8 MaxTxPwrInDbm = 255;
|
||||
|
||||
if (MAX_CHANNEL_NUMBER < Channel) {
|
||||
printk(KERN_INFO "DOT11D_GetMaxTxPwrInDbm(): Invalid "
|
||||
"Channel\n");
|
||||
return MaxTxPwrInDbm;
|
||||
}
|
||||
if (pDot11dInfo->channel_map[Channel])
|
||||
MaxTxPwrInDbm = pDot11dInfo->MaxTxPwrDbmList[Channel];
|
||||
|
||||
return MaxTxPwrInDbm;
|
||||
}
|
||||
|
||||
void DOT11D_ScanComplete(struct rtllib_device *dev)
|
||||
{
|
||||
struct rt_dot11d_info *pDot11dInfo = GET_DOT11D_INFO(dev);
|
||||
|
||||
switch (pDot11dInfo->State) {
|
||||
case DOT11D_STATE_LEARNED:
|
||||
pDot11dInfo->State = DOT11D_STATE_DONE;
|
||||
break;
|
||||
case DOT11D_STATE_DONE:
|
||||
Dot11d_Reset(dev);
|
||||
break;
|
||||
case DOT11D_STATE_NONE:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
int ToLegalChannel(struct rtllib_device *dev, u8 channel)
|
||||
{
|
||||
struct rt_dot11d_info *pDot11dInfo = GET_DOT11D_INFO(dev);
|
||||
u8 default_chn = 0;
|
||||
u32 i;
|
||||
|
||||
for (i = 1; i <= MAX_CHANNEL_NUMBER; i++) {
|
||||
if (pDot11dInfo->channel_map[i] > 0) {
|
||||
default_chn = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (MAX_CHANNEL_NUMBER < channel) {
|
||||
printk(KERN_ERR "%s(): Invalid Channel\n", __func__);
|
||||
return default_chn;
|
||||
}
|
||||
|
||||
if (pDot11dInfo->channel_map[channel] > 0)
|
||||
return channel;
|
||||
|
||||
return default_chn;
|
||||
}
|
||||
|
|
@ -1,24 +1,42 @@
|
|||
#ifndef INC_DOT11D_H
|
||||
#define INC_DOT11D_H
|
||||
/******************************************************************************
|
||||
* Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
|
||||
*
|
||||
* The full GNU General Public License is included in this distribution in the
|
||||
* file called LICENSE.
|
||||
*
|
||||
* Contact Information:
|
||||
* wlanfae <wlanfae@realtek.com>
|
||||
******************************************************************************/
|
||||
#ifndef __INC_DOT11D_H
|
||||
#define __INC_DOT11D_H
|
||||
|
||||
#ifdef ENABLE_DOT11D
|
||||
#include "ieee80211.h"
|
||||
#include "rtllib.h"
|
||||
|
||||
struct _CHNL_TXPOWER_TRIPLE {
|
||||
|
||||
|
||||
struct chnl_txpow_triple {
|
||||
u8 FirstChnl;
|
||||
u8 NumChnls;
|
||||
u8 MaxTxPowerInDbm;
|
||||
};
|
||||
|
||||
enum _DOT11D_STATE {
|
||||
enum dot11d_state {
|
||||
DOT11D_STATE_NONE = 0,
|
||||
DOT11D_STATE_LEARNED,
|
||||
DOT11D_STATE_DONE,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct _RT_DOT11D_INFO
|
||||
* @CountryIeLen: value greater than 0 if @CountryIeBuf contains
|
||||
* struct rt_dot11d_info * @CountryIeLen: value greater than 0 if @CountryIeBuf contains
|
||||
* valid country information element.
|
||||
* @chanell_map: holds channel values
|
||||
* 0 - invalid,
|
||||
|
|
@ -27,18 +45,19 @@ enum _DOT11D_STATE {
|
|||
* @CountryIeSrcAddr - Source AP of the country IE
|
||||
*/
|
||||
|
||||
struct _RT_DOT11D_INFO {
|
||||
struct rt_dot11d_info {
|
||||
|
||||
bool bEnabled;
|
||||
|
||||
u16 CountryIeLen;
|
||||
u8 CountryIeBuf[MAX_IE_LEN];
|
||||
u8 CountryIeSrcAddr[6];
|
||||
u8 CountryIeWatchdog;
|
||||
u8 CountryIeBuf[MAX_IE_LEN];
|
||||
u8 CountryIeSrcAddr[6];
|
||||
u8 CountryIeWatchdog;
|
||||
|
||||
u8 channel_map[MAX_CHANNEL_NUMBER+1];
|
||||
u8 MaxTxPwrDbmList[MAX_CHANNEL_NUMBER+1];
|
||||
u8 channel_map[MAX_CHANNEL_NUMBER+1];
|
||||
u8 MaxTxPwrDbmList[MAX_CHANNEL_NUMBER+1];
|
||||
|
||||
DOT11D_STATE State;
|
||||
enum dot11d_state State;
|
||||
};
|
||||
|
||||
static inline void cpMacAddr(unsigned char *des, unsigned char *src)
|
||||
|
|
@ -46,49 +65,41 @@ static inline void cpMacAddr(unsigned char *des, unsigned char *src)
|
|||
memcpy(des, src, 6);
|
||||
}
|
||||
|
||||
#define GET_DOT11D_INFO(__pIeeeDev) ((PRT_DOT11D_INFO) \
|
||||
((__pIeeeDev)->pDot11dInfo))
|
||||
#define GET_DOT11D_INFO(__pIeeeDev) \
|
||||
((struct rt_dot11d_info *)((__pIeeeDev)->pDot11dInfo))
|
||||
|
||||
#define IS_DOT11D_ENABLE(__pIeeeDev) (GET_DOT11D_INFO(__pIeeeDev)->bEnabled)
|
||||
#define IS_COUNTRY_IE_VALID(__pIeeeDev) \
|
||||
(GET_DOT11D_INFO(__pIeeeDev)->CountryIeLen > 0)
|
||||
#define IS_DOT11D_ENABLE(__pIeeeDev) \
|
||||
(GET_DOT11D_INFO(__pIeeeDev)->bEnabled)
|
||||
#define IS_COUNTRY_IE_VALID(__pIeeeDev) \
|
||||
(GET_DOT11D_INFO(__pIeeeDev)->CountryIeLen > 0)
|
||||
|
||||
#define IS_EQUAL_CIE_SRC(__pIeeeDev, __pTa) \
|
||||
eqMacAddr(GET_DOT11D_INFO(__pIeeeDev)->CountryIeSrcAddr, __pTa)
|
||||
|
||||
#define UPDATE_CIE_SRC(__pIeeeDev, __pTa) \
|
||||
cpMacAddr(GET_DOT11D_INFO(__pIeeeDev)->CountryIeSrcAddr, __pTa)
|
||||
#define IS_EQUAL_CIE_SRC(__pIeeeDev, __pTa) \
|
||||
eqMacAddr(GET_DOT11D_INFO(__pIeeeDev)->CountryIeSrcAddr, __pTa)
|
||||
#define UPDATE_CIE_SRC(__pIeeeDev, __pTa) \
|
||||
cpMacAddr(GET_DOT11D_INFO(__pIeeeDev)->CountryIeSrcAddr, __pTa)
|
||||
|
||||
#define IS_COUNTRY_IE_CHANGED(__pIeeeDev, __Ie) \
|
||||
(((__Ie).Length == 0 || (__Ie).Length != \
|
||||
GET_DOT11D_INFO(__pIeeeDev)->CountryIeLen) ? FALSE : \
|
||||
(!memcmp(GET_DOT11D_INFO(__pIeeeDev)->CountryIeBuf, \
|
||||
(((__Ie).Length == 0 || (__Ie).Length != \
|
||||
GET_DOT11D_INFO(__pIeeeDev)->CountryIeLen) ? \
|
||||
false : (!memcmp(GET_DOT11D_INFO(__pIeeeDev)->CountryIeBuf, \
|
||||
(__Ie).Octet, (__Ie).Length)))
|
||||
|
||||
#define CIE_WATCHDOG_TH 1
|
||||
#define GET_CIE_WATCHDOG(__pIeeeDev) (GET_DOT11D_INFO(__pIeeeDev)-> \
|
||||
CountryIeWatchdog)
|
||||
#define GET_CIE_WATCHDOG(__pIeeeDev) \
|
||||
(GET_DOT11D_INFO(__pIeeeDev)->CountryIeWatchdog)
|
||||
#define RESET_CIE_WATCHDOG(__pIeeeDev) GET_CIE_WATCHDOG(__pIeeeDev) = 0
|
||||
#define UPDATE_CIE_WATCHDOG(__pIeeeDev) (++GET_CIE_WATCHDOG(__pIeeeDev))
|
||||
|
||||
#define IS_DOT11D_STATE_DONE(__pIeeeDev) \
|
||||
(GET_DOT11D_INFO(__pIeeeDev)->State == DOT11D_STATE_DONE)
|
||||
#define IS_DOT11D_STATE_DONE(__pIeeeDev) \
|
||||
(GET_DOT11D_INFO(__pIeeeDev)->State == DOT11D_STATE_DONE)
|
||||
|
||||
void Dot11d_Init(struct rtllib_device *dev);
|
||||
void Dot11d_Channelmap(u8 channel_plan, struct rtllib_device *ieee);
|
||||
void Dot11d_Reset(struct rtllib_device *dev);
|
||||
void Dot11d_UpdateCountryIe(struct rtllib_device *dev, u8 *pTaddr,
|
||||
u16 CoutryIeLen, u8 *pCoutryIe);
|
||||
u8 DOT11D_GetMaxTxPwrInDbm(struct rtllib_device *dev, u8 Channel);
|
||||
void DOT11D_ScanComplete(struct rtllib_device *dev);
|
||||
int ToLegalChannel(struct rtllib_device *dev, u8 channel);
|
||||
|
||||
void Dot11d_Init(struct ieee80211_device *dev);
|
||||
|
||||
void Dot11d_Reset(struct ieee80211_device *dev);
|
||||
|
||||
void Dot11d_UpdateCountryIe(struct ieee80211_device *dev, u8 *pTaddr,
|
||||
u16 CoutryIeLen, u8 *pCoutryIe);
|
||||
|
||||
u8 DOT11D_GetMaxTxPwrInDbm(struct ieee80211_device *dev, u8 channel);
|
||||
|
||||
void DOT11D_ScanComplete(struct ieee80211_device *dev);
|
||||
|
||||
int IsLegalChannel(struct ieee80211_device *dev, u8 channel);
|
||||
|
||||
int ToLegalChannel(struct ieee80211_device *dev, u8 channel);
|
||||
|
||||
#endif /* ENABLE_DOT11D */
|
||||
#endif /* INC_DOT11D_H */
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1,218 +0,0 @@
|
|||
#ifdef ENABLE_DOT11D
|
||||
//-----------------------------------------------------------------------------
|
||||
// File:
|
||||
// Dot11d.c
|
||||
//
|
||||
// Description:
|
||||
// Implement 802.11d.
|
||||
//
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#include "dot11d.h"
|
||||
|
||||
void
|
||||
Dot11d_Init(struct ieee80211_device *ieee)
|
||||
{
|
||||
PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(ieee);
|
||||
|
||||
pDot11dInfo->bEnabled = 0;
|
||||
|
||||
pDot11dInfo->State = DOT11D_STATE_NONE;
|
||||
pDot11dInfo->CountryIeLen = 0;
|
||||
memset(pDot11dInfo->channel_map, 0, MAX_CHANNEL_NUMBER+1);
|
||||
memset(pDot11dInfo->MaxTxPwrDbmList, 0xFF, MAX_CHANNEL_NUMBER+1);
|
||||
RESET_CIE_WATCHDOG(ieee);
|
||||
|
||||
printk("Dot11d_Init()\n");
|
||||
}
|
||||
|
||||
//
|
||||
// Description:
|
||||
// Reset to the state as we are just entering a regulatory domain.
|
||||
//
|
||||
void
|
||||
Dot11d_Reset(struct ieee80211_device *ieee)
|
||||
{
|
||||
u32 i;
|
||||
PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(ieee);
|
||||
#if 0
|
||||
if(!pDot11dInfo->bEnabled)
|
||||
return;
|
||||
#endif
|
||||
// Clear old channel map
|
||||
memset(pDot11dInfo->channel_map, 0, MAX_CHANNEL_NUMBER+1);
|
||||
memset(pDot11dInfo->MaxTxPwrDbmList, 0xFF, MAX_CHANNEL_NUMBER+1);
|
||||
// Set new channel map
|
||||
for (i=1; i<=11; i++) {
|
||||
(pDot11dInfo->channel_map)[i] = 1;
|
||||
}
|
||||
for (i=12; i<=14; i++) {
|
||||
(pDot11dInfo->channel_map)[i] = 2;
|
||||
}
|
||||
|
||||
pDot11dInfo->State = DOT11D_STATE_NONE;
|
||||
pDot11dInfo->CountryIeLen = 0;
|
||||
RESET_CIE_WATCHDOG(ieee);
|
||||
}
|
||||
|
||||
//
|
||||
// Description:
|
||||
// Update country IE from Beacon or Probe Resopnse
|
||||
// and configure PHY for operation in the regulatory domain.
|
||||
//
|
||||
// TODO:
|
||||
// Configure Tx power.
|
||||
//
|
||||
// Assumption:
|
||||
// 1. IS_DOT11D_ENABLE() is TRUE.
|
||||
// 2. Input IE is an valid one.
|
||||
//
|
||||
void
|
||||
Dot11d_UpdateCountryIe(
|
||||
struct ieee80211_device *dev,
|
||||
u8 * pTaddr,
|
||||
u16 CoutryIeLen,
|
||||
u8 * pCoutryIe
|
||||
)
|
||||
{
|
||||
PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(dev);
|
||||
u8 i, j, NumTriples, MaxChnlNum;
|
||||
PCHNL_TXPOWER_TRIPLE pTriple;
|
||||
|
||||
memset(pDot11dInfo->channel_map, 0, MAX_CHANNEL_NUMBER+1);
|
||||
memset(pDot11dInfo->MaxTxPwrDbmList, 0xFF, MAX_CHANNEL_NUMBER+1);
|
||||
MaxChnlNum = 0;
|
||||
NumTriples = (CoutryIeLen - 3) / 3; // skip 3-byte country string.
|
||||
pTriple = (PCHNL_TXPOWER_TRIPLE)(pCoutryIe + 3);
|
||||
for(i = 0; i < NumTriples; i++)
|
||||
{
|
||||
if(MaxChnlNum >= pTriple->FirstChnl)
|
||||
{ // It is not in a monotonically increasing order, so stop processing.
|
||||
printk("Dot11d_UpdateCountryIe(): Invalid country IE, skip it........1\n");
|
||||
return;
|
||||
}
|
||||
if(MAX_CHANNEL_NUMBER < (pTriple->FirstChnl + pTriple->NumChnls))
|
||||
{ // It is not a valid set of channel id, so stop processing.
|
||||
printk("Dot11d_UpdateCountryIe(): Invalid country IE, skip it........2\n");
|
||||
return;
|
||||
}
|
||||
|
||||
for(j = 0 ; j < pTriple->NumChnls; j++)
|
||||
{
|
||||
pDot11dInfo->channel_map[pTriple->FirstChnl + j] = 1;
|
||||
pDot11dInfo->MaxTxPwrDbmList[pTriple->FirstChnl + j] = pTriple->MaxTxPowerInDbm;
|
||||
MaxChnlNum = pTriple->FirstChnl + j;
|
||||
}
|
||||
|
||||
pTriple = (PCHNL_TXPOWER_TRIPLE)((u8*)pTriple + 3);
|
||||
}
|
||||
#if 1
|
||||
printk("Channel List:");
|
||||
for(i=1; i<= MAX_CHANNEL_NUMBER; i++)
|
||||
if(pDot11dInfo->channel_map[i] > 0)
|
||||
printk(" %d", i);
|
||||
printk("\n");
|
||||
#endif
|
||||
|
||||
UPDATE_CIE_SRC(dev, pTaddr);
|
||||
|
||||
pDot11dInfo->CountryIeLen = CoutryIeLen;
|
||||
memcpy(pDot11dInfo->CountryIeBuf, pCoutryIe,CoutryIeLen);
|
||||
pDot11dInfo->State = DOT11D_STATE_LEARNED;
|
||||
}
|
||||
|
||||
|
||||
u8
|
||||
DOT11D_GetMaxTxPwrInDbm(
|
||||
struct ieee80211_device *dev,
|
||||
u8 Channel
|
||||
)
|
||||
{
|
||||
PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(dev);
|
||||
u8 MaxTxPwrInDbm = 255;
|
||||
|
||||
if(MAX_CHANNEL_NUMBER < Channel)
|
||||
{
|
||||
printk("DOT11D_GetMaxTxPwrInDbm(): Invalid Channel\n");
|
||||
return MaxTxPwrInDbm;
|
||||
}
|
||||
if(pDot11dInfo->channel_map[Channel])
|
||||
{
|
||||
MaxTxPwrInDbm = pDot11dInfo->MaxTxPwrDbmList[Channel];
|
||||
}
|
||||
|
||||
return MaxTxPwrInDbm;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
DOT11D_ScanComplete(
|
||||
struct ieee80211_device * dev
|
||||
)
|
||||
{
|
||||
PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(dev);
|
||||
|
||||
switch(pDot11dInfo->State)
|
||||
{
|
||||
case DOT11D_STATE_LEARNED:
|
||||
pDot11dInfo->State = DOT11D_STATE_DONE;
|
||||
break;
|
||||
|
||||
case DOT11D_STATE_DONE:
|
||||
if( GET_CIE_WATCHDOG(dev) == 0 )
|
||||
{ // Reset country IE if previous one is gone.
|
||||
Dot11d_Reset(dev);
|
||||
}
|
||||
break;
|
||||
case DOT11D_STATE_NONE:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
int IsLegalChannel(
|
||||
struct ieee80211_device * dev,
|
||||
u8 channel
|
||||
)
|
||||
{
|
||||
PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(dev);
|
||||
|
||||
if(MAX_CHANNEL_NUMBER < channel)
|
||||
{
|
||||
printk("IsLegalChannel(): Invalid Channel\n");
|
||||
return 0;
|
||||
}
|
||||
if(pDot11dInfo->channel_map[channel] > 0)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ToLegalChannel(
|
||||
struct ieee80211_device * dev,
|
||||
u8 channel
|
||||
)
|
||||
{
|
||||
PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(dev);
|
||||
u8 default_chn = 0;
|
||||
u32 i = 0;
|
||||
|
||||
for (i=1; i<= MAX_CHANNEL_NUMBER; i++)
|
||||
{
|
||||
if(pDot11dInfo->channel_map[i] > 0)
|
||||
{
|
||||
default_chn = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(MAX_CHANNEL_NUMBER < channel)
|
||||
{
|
||||
printk("IsLegalChannel(): Invalid Channel\n");
|
||||
return default_chn;
|
||||
}
|
||||
|
||||
if(pDot11dInfo->channel_map[channel] > 0)
|
||||
return channel;
|
||||
|
||||
return default_chn;
|
||||
}
|
||||
#endif
|
||||
|
|
@ -1,102 +0,0 @@
|
|||
#ifndef __INC_DOT11D_H
|
||||
#define __INC_DOT11D_H
|
||||
|
||||
#ifdef ENABLE_DOT11D
|
||||
#include "ieee80211.h"
|
||||
|
||||
//#define ENABLE_DOT11D
|
||||
|
||||
//#define DOT11D_MAX_CHNL_NUM 83
|
||||
|
||||
typedef struct _CHNL_TXPOWER_TRIPLE {
|
||||
u8 FirstChnl;
|
||||
u8 NumChnls;
|
||||
u8 MaxTxPowerInDbm;
|
||||
}CHNL_TXPOWER_TRIPLE, *PCHNL_TXPOWER_TRIPLE;
|
||||
|
||||
typedef enum _DOT11D_STATE {
|
||||
DOT11D_STATE_NONE = 0,
|
||||
DOT11D_STATE_LEARNED,
|
||||
DOT11D_STATE_DONE,
|
||||
}DOT11D_STATE;
|
||||
|
||||
typedef struct _RT_DOT11D_INFO {
|
||||
//DECLARE_RT_OBJECT(RT_DOT11D_INFO);
|
||||
|
||||
bool bEnabled; // dot11MultiDomainCapabilityEnabled
|
||||
|
||||
u16 CountryIeLen; // > 0 if CountryIeBuf[] contains valid country information element.
|
||||
u8 CountryIeBuf[MAX_IE_LEN];
|
||||
u8 CountryIeSrcAddr[6]; // Source AP of the country IE.
|
||||
u8 CountryIeWatchdog;
|
||||
|
||||
u8 channel_map[MAX_CHANNEL_NUMBER+1]; //!!!Value 0: Invalid, 1: Valid (active scan), 2: Valid (passive scan)
|
||||
//u8 ChnlListLen; // #Bytes valid in ChnlList[].
|
||||
//u8 ChnlList[DOT11D_MAX_CHNL_NUM];
|
||||
u8 MaxTxPwrDbmList[MAX_CHANNEL_NUMBER+1];
|
||||
|
||||
DOT11D_STATE State;
|
||||
}RT_DOT11D_INFO, *PRT_DOT11D_INFO;
|
||||
#define eqMacAddr(a,b) ( ((a)[0]==(b)[0] && (a)[1]==(b)[1] && (a)[2]==(b)[2] && (a)[3]==(b)[3] && (a)[4]==(b)[4] && (a)[5]==(b)[5]) ? 1:0 )
|
||||
#define cpMacAddr(des,src) ((des)[0]=(src)[0],(des)[1]=(src)[1],(des)[2]=(src)[2],(des)[3]=(src)[3],(des)[4]=(src)[4],(des)[5]=(src)[5])
|
||||
#define GET_DOT11D_INFO(__pIeeeDev) ((PRT_DOT11D_INFO)((__pIeeeDev)->pDot11dInfo))
|
||||
|
||||
#define IS_DOT11D_ENABLE(__pIeeeDev) GET_DOT11D_INFO(__pIeeeDev)->bEnabled
|
||||
#define IS_COUNTRY_IE_VALID(__pIeeeDev) (GET_DOT11D_INFO(__pIeeeDev)->CountryIeLen > 0)
|
||||
|
||||
#define IS_EQUAL_CIE_SRC(__pIeeeDev, __pTa) eqMacAddr(GET_DOT11D_INFO(__pIeeeDev)->CountryIeSrcAddr, __pTa)
|
||||
#define UPDATE_CIE_SRC(__pIeeeDev, __pTa) cpMacAddr(GET_DOT11D_INFO(__pIeeeDev)->CountryIeSrcAddr, __pTa)
|
||||
|
||||
#define IS_COUNTRY_IE_CHANGED(__pIeeeDev, __Ie) \
|
||||
(((__Ie).Length == 0 || (__Ie).Length != GET_DOT11D_INFO(__pIeeeDev)->CountryIeLen) ? \
|
||||
FALSE : \
|
||||
(!memcmp(GET_DOT11D_INFO(__pIeeeDev)->CountryIeBuf, (__Ie).Octet, (__Ie).Length)))
|
||||
|
||||
#define CIE_WATCHDOG_TH 1
|
||||
#define GET_CIE_WATCHDOG(__pIeeeDev) GET_DOT11D_INFO(__pIeeeDev)->CountryIeWatchdog
|
||||
#define RESET_CIE_WATCHDOG(__pIeeeDev) GET_CIE_WATCHDOG(__pIeeeDev) = 0
|
||||
#define UPDATE_CIE_WATCHDOG(__pIeeeDev) ++GET_CIE_WATCHDOG(__pIeeeDev)
|
||||
|
||||
#define IS_DOT11D_STATE_DONE(__pIeeeDev) (GET_DOT11D_INFO(__pIeeeDev)->State == DOT11D_STATE_DONE)
|
||||
|
||||
|
||||
void
|
||||
Dot11d_Init(
|
||||
struct ieee80211_device *dev
|
||||
);
|
||||
|
||||
void
|
||||
Dot11d_Reset(
|
||||
struct ieee80211_device *dev
|
||||
);
|
||||
|
||||
void
|
||||
Dot11d_UpdateCountryIe(
|
||||
struct ieee80211_device *dev,
|
||||
u8 * pTaddr,
|
||||
u16 CoutryIeLen,
|
||||
u8 * pCoutryIe
|
||||
);
|
||||
|
||||
u8
|
||||
DOT11D_GetMaxTxPwrInDbm(
|
||||
struct ieee80211_device *dev,
|
||||
u8 Channel
|
||||
);
|
||||
|
||||
void
|
||||
DOT11D_ScanComplete(
|
||||
struct ieee80211_device * dev
|
||||
);
|
||||
|
||||
int IsLegalChannel(
|
||||
struct ieee80211_device * dev,
|
||||
u8 channel
|
||||
);
|
||||
|
||||
int ToLegalChannel(
|
||||
struct ieee80211_device * dev,
|
||||
u8 channel
|
||||
);
|
||||
#endif //ENABLE_DOT11D
|
||||
#endif // #ifndef __INC_DOT11D_H
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,352 +0,0 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Copyright(c) 2004 Intel Corporation. All rights reserved.
|
||||
|
||||
Portions of this file are based on the WEP enablement code provided by the
|
||||
Host AP project hostap-drivers v0.1.3
|
||||
Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen
|
||||
<jkmaline@cc.hut.fi>
|
||||
Copyright (c) 2002-2003, Jouni Malinen <jkmaline@cc.hut.fi>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of version 2 of the GNU General Public License as
|
||||
published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along with
|
||||
this program; if not, write to the Free Software Foundation, Inc., 59
|
||||
Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
The full GNU General Public License is included in this distribution in the
|
||||
file called LICENSE.
|
||||
|
||||
Contact Information:
|
||||
James P. Ketrenos <ipw2100-admin@linux.intel.com>
|
||||
Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
|
||||
|
||||
*******************************************************************************/
|
||||
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/if_arp.h>
|
||||
#include <linux/in6.h>
|
||||
#include <linux/in.h>
|
||||
#include <linux/ip.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/tcp.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/wireless.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <net/arp.h>
|
||||
|
||||
#include "ieee80211.h"
|
||||
|
||||
MODULE_DESCRIPTION("802.11 data/management/control stack");
|
||||
MODULE_AUTHOR("Copyright (C) 2004 Intel Corporation <jketreno@linux.intel.com>");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
#define DRV_NAME "ieee80211"
|
||||
|
||||
static inline int ieee80211_networks_allocate(struct ieee80211_device *ieee)
|
||||
{
|
||||
if (ieee->networks)
|
||||
return 0;
|
||||
|
||||
ieee->networks = kcalloc(
|
||||
MAX_NETWORK_COUNT, sizeof(struct ieee80211_network),
|
||||
GFP_KERNEL);
|
||||
if (!ieee->networks) {
|
||||
printk(KERN_WARNING "%s: Out of memory allocating beacons\n",
|
||||
ieee->dev->name);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void ieee80211_networks_free(struct ieee80211_device *ieee)
|
||||
{
|
||||
if (!ieee->networks)
|
||||
return;
|
||||
kfree(ieee->networks);
|
||||
ieee->networks = NULL;
|
||||
}
|
||||
|
||||
static inline void ieee80211_networks_initialize(struct ieee80211_device *ieee)
|
||||
{
|
||||
int i;
|
||||
|
||||
INIT_LIST_HEAD(&ieee->network_free_list);
|
||||
INIT_LIST_HEAD(&ieee->network_list);
|
||||
for (i = 0; i < MAX_NETWORK_COUNT; i++)
|
||||
list_add_tail(&ieee->networks[i].list, &ieee->network_free_list);
|
||||
}
|
||||
|
||||
|
||||
struct net_device *alloc_ieee80211(int sizeof_priv)
|
||||
{
|
||||
struct ieee80211_device *ieee;
|
||||
struct net_device *dev;
|
||||
int i, err;
|
||||
|
||||
IEEE80211_DEBUG_INFO("Initializing...\n");
|
||||
|
||||
dev = alloc_etherdev(sizeof(struct ieee80211_device) + sizeof_priv);
|
||||
if (!dev) {
|
||||
IEEE80211_ERROR("Unable to network device.\n");
|
||||
goto failed;
|
||||
}
|
||||
|
||||
ieee = netdev_priv(dev);
|
||||
|
||||
memset(ieee, 0, sizeof(struct ieee80211_device) + sizeof_priv);
|
||||
ieee->dev = dev;
|
||||
|
||||
err = ieee80211_networks_allocate(ieee);
|
||||
if (err) {
|
||||
IEEE80211_ERROR("Unable to allocate beacon storage: %d\n",
|
||||
err);
|
||||
goto failed;
|
||||
}
|
||||
ieee80211_networks_initialize(ieee);
|
||||
|
||||
|
||||
/* Default fragmentation threshold is maximum payload size */
|
||||
ieee->fts = DEFAULT_FTS;
|
||||
ieee->scan_age = DEFAULT_MAX_SCAN_AGE;
|
||||
ieee->open_wep = 1;
|
||||
|
||||
/* Default to enabling full open WEP with host based encrypt/decrypt */
|
||||
ieee->host_encrypt = 1;
|
||||
ieee->host_decrypt = 1;
|
||||
ieee->ieee802_1x = 1; /* Default to supporting 802.1x */
|
||||
|
||||
INIT_LIST_HEAD(&ieee->crypt_deinit_list);
|
||||
init_timer(&ieee->crypt_deinit_timer);
|
||||
ieee->crypt_deinit_timer.data = (unsigned long)ieee;
|
||||
ieee->crypt_deinit_timer.function = ieee80211_crypt_deinit_handler;
|
||||
|
||||
spin_lock_init(&ieee->lock);
|
||||
spin_lock_init(&ieee->wpax_suitlist_lock);
|
||||
spin_lock_init(&ieee->bw_spinlock);
|
||||
spin_lock_init(&ieee->reorder_spinlock);
|
||||
|
||||
/* added by WB */
|
||||
atomic_set(&(ieee->atm_chnlop), 0);
|
||||
atomic_set(&(ieee->atm_swbw), 0);
|
||||
|
||||
ieee->wpax_type_set = 0;
|
||||
ieee->wpa_enabled = 0;
|
||||
ieee->tkip_countermeasures = 0;
|
||||
ieee->drop_unencrypted = 0;
|
||||
ieee->privacy_invoked = 0;
|
||||
ieee->ieee802_1x = 1;
|
||||
ieee->raw_tx = 0;
|
||||
/* ieee->hwsec_support = 1; default support hw security: use module_param instead */
|
||||
ieee->hwsec_active = 0; /* disable hwsec, switch it on when necessary */
|
||||
|
||||
ieee80211_softmac_init(ieee);
|
||||
|
||||
ieee->pHTInfo = kzalloc(sizeof(RT_HIGH_THROUGHPUT), GFP_KERNEL);
|
||||
if (ieee->pHTInfo == NULL)
|
||||
{
|
||||
IEEE80211_DEBUG(IEEE80211_DL_ERR, "can't alloc memory for HTInfo\n");
|
||||
return NULL;
|
||||
}
|
||||
HTUpdateDefaultSetting(ieee);
|
||||
HTInitializeHTInfo(ieee); /* may move to other place */
|
||||
TSInitialize(ieee);
|
||||
for (i = 0; i < IEEE_IBSS_MAC_HASH_SIZE; i++)
|
||||
INIT_LIST_HEAD(&ieee->ibss_mac_hash[i]);
|
||||
|
||||
for (i = 0; i < 17; i++) {
|
||||
ieee->last_rxseq_num[i] = -1;
|
||||
ieee->last_rxfrag_num[i] = -1;
|
||||
ieee->last_packet_time[i] = 0;
|
||||
}
|
||||
|
||||
/* Functions to load crypt module automatically */
|
||||
ieee80211_tkip_null();
|
||||
ieee80211_wep_null();
|
||||
ieee80211_ccmp_null();
|
||||
|
||||
return dev;
|
||||
|
||||
failed:
|
||||
if (dev)
|
||||
free_netdev(dev);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
void free_ieee80211(struct net_device *dev)
|
||||
{
|
||||
struct ieee80211_device *ieee = netdev_priv(dev);
|
||||
int i;
|
||||
kfree(ieee->pHTInfo);
|
||||
ieee->pHTInfo = NULL;
|
||||
RemoveAllTS(ieee);
|
||||
ieee80211_softmac_free(ieee);
|
||||
del_timer_sync(&ieee->crypt_deinit_timer);
|
||||
ieee80211_crypt_deinit_entries(ieee, 1);
|
||||
|
||||
for (i = 0; i < WEP_KEYS; i++) {
|
||||
struct ieee80211_crypt_data *crypt = ieee->crypt[i];
|
||||
if (crypt) {
|
||||
if (crypt->ops)
|
||||
crypt->ops->deinit(crypt->priv);
|
||||
kfree(crypt);
|
||||
ieee->crypt[i] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
ieee80211_networks_free(ieee);
|
||||
free_netdev(dev);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_IEEE80211_DEBUG
|
||||
|
||||
u32 ieee80211_debug_level = 0;
|
||||
static int debug =
|
||||
/* IEEE80211_DL_INFO | */
|
||||
/* IEEE80211_DL_WX | */
|
||||
/* IEEE80211_DL_SCAN | */
|
||||
/* IEEE80211_DL_STATE | */
|
||||
/* IEEE80211_DL_MGMT | */
|
||||
/* IEEE80211_DL_FRAG | */
|
||||
/* IEEE80211_DL_EAP | */
|
||||
/* IEEE80211_DL_DROP | */
|
||||
/* IEEE80211_DL_TX | */
|
||||
/* IEEE80211_DL_RX | */
|
||||
/* IEEE80211_DL_QOS | */
|
||||
/* IEEE80211_DL_HT | */
|
||||
/* IEEE80211_DL_TS | */
|
||||
/* IEEE80211_DL_BA | */
|
||||
/* IEEE80211_DL_REORDER | */
|
||||
/* IEEE80211_DL_TRACE | */
|
||||
/* IEEE80211_DL_DATA | */
|
||||
IEEE80211_DL_ERR /* always open this flag to show error out */
|
||||
;
|
||||
struct proc_dir_entry *ieee80211_proc = NULL;
|
||||
|
||||
static int show_debug_level(char *page, char **start, off_t offset,
|
||||
int count, int *eof, void *data)
|
||||
{
|
||||
return snprintf(page, count, "0x%08X\n", ieee80211_debug_level);
|
||||
}
|
||||
|
||||
static int store_debug_level(struct file *file, const char *buffer,
|
||||
unsigned long count, void *data)
|
||||
{
|
||||
char buf[] = "0x00000000";
|
||||
unsigned long len = min(sizeof(buf) - 1, (u32)count);
|
||||
char *p = (char *)buf;
|
||||
unsigned long val;
|
||||
|
||||
if (copy_from_user(buf, buffer, len))
|
||||
return count;
|
||||
buf[len] = 0;
|
||||
if (p[1] == 'x' || p[1] == 'X' || p[0] == 'x' || p[0] == 'X') {
|
||||
p++;
|
||||
if (p[0] == 'x' || p[0] == 'X')
|
||||
p++;
|
||||
val = simple_strtoul(p, &p, 16);
|
||||
} else
|
||||
val = simple_strtoul(p, &p, 10);
|
||||
if (p == buf)
|
||||
printk(KERN_INFO DRV_NAME
|
||||
": %s is not in hex or decimal form.\n", buf);
|
||||
else
|
||||
ieee80211_debug_level = val;
|
||||
|
||||
return strnlen(buf, count);
|
||||
}
|
||||
|
||||
extern int ieee80211_crypto_init(void);
|
||||
extern void ieee80211_crypto_deinit(void);
|
||||
extern int ieee80211_crypto_tkip_init(void);
|
||||
extern void ieee80211_crypto_tkip_exit(void);
|
||||
extern int ieee80211_crypto_ccmp_init(void);
|
||||
extern void ieee80211_crypto_ccmp_exit(void);
|
||||
extern int ieee80211_crypto_wep_init(void);
|
||||
extern void ieee80211_crypto_wep_exit(void);
|
||||
|
||||
int __init ieee80211_rtl_init(void)
|
||||
{
|
||||
struct proc_dir_entry *e;
|
||||
int retval;
|
||||
|
||||
retval = ieee80211_crypto_init();
|
||||
if (retval)
|
||||
return retval;
|
||||
retval = ieee80211_crypto_tkip_init();
|
||||
if (retval) {
|
||||
ieee80211_crypto_deinit();
|
||||
return retval;
|
||||
}
|
||||
retval = ieee80211_crypto_ccmp_init();
|
||||
if (retval) {
|
||||
ieee80211_crypto_tkip_exit();
|
||||
ieee80211_crypto_deinit();
|
||||
return retval;
|
||||
}
|
||||
retval = ieee80211_crypto_wep_init();
|
||||
if (retval) {
|
||||
ieee80211_crypto_ccmp_exit();
|
||||
ieee80211_crypto_tkip_exit();
|
||||
ieee80211_crypto_deinit();
|
||||
return retval;
|
||||
}
|
||||
|
||||
ieee80211_debug_level = debug;
|
||||
ieee80211_proc = proc_mkdir(DRV_NAME, init_net.proc_net);
|
||||
if (ieee80211_proc == NULL) {
|
||||
IEEE80211_ERROR("Unable to create " DRV_NAME
|
||||
" proc directory\n");
|
||||
return -EIO;
|
||||
}
|
||||
e = create_proc_entry("debug_level", S_IFREG | S_IRUGO | S_IWUSR,
|
||||
ieee80211_proc);
|
||||
if (!e) {
|
||||
remove_proc_entry(DRV_NAME, init_net.proc_net);
|
||||
ieee80211_proc = NULL;
|
||||
return -EIO;
|
||||
}
|
||||
e->read_proc = show_debug_level;
|
||||
e->write_proc = store_debug_level;
|
||||
e->data = NULL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void __exit ieee80211_rtl_exit(void)
|
||||
{
|
||||
if (ieee80211_proc) {
|
||||
remove_proc_entry("debug_level", ieee80211_proc);
|
||||
remove_proc_entry(DRV_NAME, init_net.proc_net);
|
||||
ieee80211_proc = NULL;
|
||||
}
|
||||
ieee80211_crypto_wep_exit();
|
||||
ieee80211_crypto_ccmp_exit();
|
||||
ieee80211_crypto_tkip_exit();
|
||||
ieee80211_crypto_deinit();
|
||||
}
|
||||
|
||||
#include <linux/moduleparam.h>
|
||||
module_param(debug, int, 0444);
|
||||
MODULE_PARM_DESC(debug, "debug output mask");
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
|
@ -1,676 +0,0 @@
|
|||
/*
|
||||
* This file is created to process BA Action Frame. According to 802.11 spec,
|
||||
* there are 3 BA action types at all. And as BA is related to TS, this part
|
||||
* need some struture defined in QOS side code. Also TX RX is going to be
|
||||
* resturctured, so how to send ADDBAREQ ADDBARSP and DELBA packet is still
|
||||
* on consideration. Temporarily use MANAGE QUEUE instead of Normal Queue.
|
||||
*/
|
||||
#include "ieee80211.h"
|
||||
#include "rtl819x_BA.h"
|
||||
|
||||
/*
|
||||
* Activate BA entry. And if Time is nozero, start timer.
|
||||
*/
|
||||
void ActivateBAEntry(struct ieee80211_device* ieee, PBA_RECORD pBA, u16 Time)
|
||||
{
|
||||
pBA->bValid = true;
|
||||
if(Time != 0)
|
||||
mod_timer(&pBA->Timer, jiffies + MSECS(Time));
|
||||
}
|
||||
|
||||
/*
|
||||
* deactivate BA entry, including its timer.
|
||||
*/
|
||||
void DeActivateBAEntry( struct ieee80211_device* ieee, PBA_RECORD pBA)
|
||||
{
|
||||
pBA->bValid = false;
|
||||
del_timer_sync(&pBA->Timer);
|
||||
}
|
||||
|
||||
/*
|
||||
* deactivete BA entry in Tx Ts, and send DELBA.
|
||||
*/
|
||||
u8 TxTsDeleteBA( struct ieee80211_device* ieee, PTX_TS_RECORD pTxTs)
|
||||
{
|
||||
PBA_RECORD pAdmittedBa = &pTxTs->TxAdmittedBARecord; //These two BA entries must exist in TS structure
|
||||
PBA_RECORD pPendingBa = &pTxTs->TxPendingBARecord;
|
||||
u8 bSendDELBA = false;
|
||||
|
||||
// Delete pending BA
|
||||
if(pPendingBa->bValid)
|
||||
{
|
||||
DeActivateBAEntry(ieee, pPendingBa);
|
||||
bSendDELBA = true;
|
||||
}
|
||||
|
||||
// Delete admitted BA
|
||||
if(pAdmittedBa->bValid)
|
||||
{
|
||||
DeActivateBAEntry(ieee, pAdmittedBa);
|
||||
bSendDELBA = true;
|
||||
}
|
||||
|
||||
return bSendDELBA;
|
||||
}
|
||||
|
||||
/*
|
||||
* deactivete BA entry in Tx Ts, and send DELBA.
|
||||
*/
|
||||
u8 RxTsDeleteBA( struct ieee80211_device* ieee, PRX_TS_RECORD pRxTs)
|
||||
{
|
||||
PBA_RECORD pBa = &pRxTs->RxAdmittedBARecord;
|
||||
u8 bSendDELBA = false;
|
||||
|
||||
if(pBa->bValid)
|
||||
{
|
||||
DeActivateBAEntry(ieee, pBa);
|
||||
bSendDELBA = true;
|
||||
}
|
||||
|
||||
return bSendDELBA;
|
||||
}
|
||||
|
||||
/*
|
||||
* reset BA entry
|
||||
*/
|
||||
void ResetBaEntry( PBA_RECORD pBA)
|
||||
{
|
||||
pBA->bValid = false;
|
||||
pBA->BaParamSet.shortData = 0;
|
||||
pBA->BaTimeoutValue = 0;
|
||||
pBA->DialogToken = 0;
|
||||
pBA->BaStartSeqCtrl.ShortData = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* construct ADDBAREQ and ADDBARSP frame here together.
|
||||
* return constructed skb to xmit
|
||||
*/
|
||||
static struct sk_buff* ieee80211_ADDBA(struct ieee80211_device* ieee, u8* Dst, PBA_RECORD pBA, u16 StatusCode, u8 type)
|
||||
{
|
||||
struct sk_buff *skb = NULL;
|
||||
struct ieee80211_hdr_3addr* BAReq = NULL;
|
||||
u8* tag = NULL;
|
||||
u16 tmp = 0;
|
||||
u16 len = ieee->tx_headroom + 9;
|
||||
//category(1) + action field(1) + Dialog Token(1) + BA Parameter Set(2) + BA Timeout Value(2) + BA Start SeqCtrl(2)(or StatusCode(2))
|
||||
IEEE80211_DEBUG(IEEE80211_DL_TRACE | IEEE80211_DL_BA, "========>%s(), frame(%d) sentd to:%pM, ieee->dev:%p\n", __FUNCTION__, type, Dst, ieee->dev);
|
||||
if (pBA == NULL||ieee == NULL)
|
||||
{
|
||||
IEEE80211_DEBUG(IEEE80211_DL_ERR, "pBA(%p) is NULL or ieee(%p) is NULL\n", pBA, ieee);
|
||||
return NULL;
|
||||
}
|
||||
skb = dev_alloc_skb(len + sizeof( struct ieee80211_hdr_3addr)); //need to add something others? FIXME
|
||||
if (skb == NULL)
|
||||
{
|
||||
IEEE80211_DEBUG(IEEE80211_DL_ERR, "can't alloc skb for ADDBA_REQ\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
memset(skb->data, 0, sizeof( struct ieee80211_hdr_3addr)); //I wonder whether it's necessary. Apparently kernel will not do it when alloc a skb.
|
||||
skb_reserve(skb, ieee->tx_headroom);
|
||||
|
||||
BAReq = ( struct ieee80211_hdr_3addr *) skb_put(skb,sizeof( struct ieee80211_hdr_3addr));
|
||||
|
||||
memcpy(BAReq->addr1, Dst, ETH_ALEN);
|
||||
memcpy(BAReq->addr2, ieee->dev->dev_addr, ETH_ALEN);
|
||||
|
||||
memcpy(BAReq->addr3, ieee->current_network.bssid, ETH_ALEN);
|
||||
|
||||
BAReq->frame_ctl = cpu_to_le16(IEEE80211_STYPE_MANAGE_ACT); //action frame
|
||||
|
||||
//tag += sizeof( struct ieee80211_hdr_3addr); //move to action field
|
||||
tag = (u8*)skb_put(skb, 9);
|
||||
*tag ++= ACT_CAT_BA;
|
||||
*tag ++= type;
|
||||
// Dialog Token
|
||||
*tag ++= pBA->DialogToken;
|
||||
|
||||
if (ACT_ADDBARSP == type)
|
||||
{
|
||||
// Status Code
|
||||
printk("=====>to send ADDBARSP\n");
|
||||
tmp = cpu_to_le16(StatusCode);
|
||||
memcpy(tag, (u8*)&tmp, 2);
|
||||
tag += 2;
|
||||
}
|
||||
// BA Parameter Set
|
||||
tmp = cpu_to_le16(pBA->BaParamSet.shortData);
|
||||
memcpy(tag, (u8*)&tmp, 2);
|
||||
tag += 2;
|
||||
// BA Timeout Value
|
||||
tmp = cpu_to_le16(pBA->BaTimeoutValue);
|
||||
memcpy(tag, (u8*)&tmp, 2);
|
||||
tag += 2;
|
||||
|
||||
if (ACT_ADDBAREQ == type)
|
||||
{
|
||||
// BA Start SeqCtrl
|
||||
memcpy(tag,(u8*)&(pBA->BaStartSeqCtrl), 2);
|
||||
tag += 2;
|
||||
}
|
||||
|
||||
IEEE80211_DEBUG_DATA(IEEE80211_DL_DATA|IEEE80211_DL_BA, skb->data, skb->len);
|
||||
return skb;
|
||||
//return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* construct DELBA frame
|
||||
*/
|
||||
static struct sk_buff* ieee80211_DELBA(
|
||||
struct ieee80211_device* ieee,
|
||||
u8* dst,
|
||||
PBA_RECORD pBA,
|
||||
TR_SELECT TxRxSelect,
|
||||
u16 ReasonCode
|
||||
)
|
||||
{
|
||||
DELBA_PARAM_SET DelbaParamSet;
|
||||
struct sk_buff *skb = NULL;
|
||||
struct ieee80211_hdr_3addr* Delba = NULL;
|
||||
u8* tag = NULL;
|
||||
u16 tmp = 0;
|
||||
//len = head len + DELBA Parameter Set(2) + Reason Code(2)
|
||||
u16 len = 6 + ieee->tx_headroom;
|
||||
|
||||
if (net_ratelimit())
|
||||
IEEE80211_DEBUG(IEEE80211_DL_TRACE | IEEE80211_DL_BA, "========>%s(), ReasonCode(%d) sentd to:%pM\n", __FUNCTION__, ReasonCode, dst);
|
||||
|
||||
memset(&DelbaParamSet, 0, 2);
|
||||
|
||||
DelbaParamSet.field.Initiator = (TxRxSelect==TX_DIR)?1:0;
|
||||
DelbaParamSet.field.TID = pBA->BaParamSet.field.TID;
|
||||
|
||||
skb = dev_alloc_skb(len + sizeof( struct ieee80211_hdr_3addr)); //need to add something others? FIXME
|
||||
if (skb == NULL)
|
||||
{
|
||||
IEEE80211_DEBUG(IEEE80211_DL_ERR, "can't alloc skb for ADDBA_REQ\n");
|
||||
return NULL;
|
||||
}
|
||||
// memset(skb->data, 0, len+sizeof( struct ieee80211_hdr_3addr));
|
||||
skb_reserve(skb, ieee->tx_headroom);
|
||||
|
||||
Delba = ( struct ieee80211_hdr_3addr *) skb_put(skb,sizeof( struct ieee80211_hdr_3addr));
|
||||
|
||||
memcpy(Delba->addr1, dst, ETH_ALEN);
|
||||
memcpy(Delba->addr2, ieee->dev->dev_addr, ETH_ALEN);
|
||||
memcpy(Delba->addr3, ieee->current_network.bssid, ETH_ALEN);
|
||||
Delba->frame_ctl = cpu_to_le16(IEEE80211_STYPE_MANAGE_ACT); //action frame
|
||||
|
||||
tag = (u8*)skb_put(skb, 6);
|
||||
|
||||
*tag ++= ACT_CAT_BA;
|
||||
*tag ++= ACT_DELBA;
|
||||
|
||||
// DELBA Parameter Set
|
||||
tmp = cpu_to_le16(DelbaParamSet.shortData);
|
||||
memcpy(tag, (u8*)&tmp, 2);
|
||||
tag += 2;
|
||||
// Reason Code
|
||||
tmp = cpu_to_le16(ReasonCode);
|
||||
memcpy(tag, (u8*)&tmp, 2);
|
||||
tag += 2;
|
||||
|
||||
IEEE80211_DEBUG_DATA(IEEE80211_DL_DATA|IEEE80211_DL_BA, skb->data, skb->len);
|
||||
if (net_ratelimit())
|
||||
IEEE80211_DEBUG(IEEE80211_DL_TRACE | IEEE80211_DL_BA, "<=====%s()\n", __FUNCTION__);
|
||||
return skb;
|
||||
}
|
||||
|
||||
/*
|
||||
* send ADDBAReq frame out
|
||||
* If any possible, please hide pBA in ieee.
|
||||
* And temporarily use Manage Queue as softmac_mgmt_xmit() usually does
|
||||
*/
|
||||
void ieee80211_send_ADDBAReq(struct ieee80211_device* ieee, u8* dst, PBA_RECORD pBA)
|
||||
{
|
||||
struct sk_buff *skb = NULL;
|
||||
skb = ieee80211_ADDBA(ieee, dst, pBA, 0, ACT_ADDBAREQ); //construct ACT_ADDBAREQ frames so set statuscode zero.
|
||||
|
||||
if (skb)
|
||||
{
|
||||
softmac_mgmt_xmit(skb, ieee);
|
||||
//add statistic needed here.
|
||||
//and skb will be freed in softmac_mgmt_xmit(), so omit all dev_kfree_skb_any() outside softmac_mgmt_xmit()
|
||||
//WB
|
||||
}
|
||||
else
|
||||
{
|
||||
IEEE80211_DEBUG(IEEE80211_DL_ERR, "alloc skb error in function %s()\n", __FUNCTION__);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* send ADDBARSP frame out
|
||||
* If any possible, please hide pBA in ieee.
|
||||
* And temporarily use Manage Queue as softmac_mgmt_xmit() usually does
|
||||
*/
|
||||
void ieee80211_send_ADDBARsp(struct ieee80211_device* ieee, u8* dst, PBA_RECORD pBA, u16 StatusCode)
|
||||
{
|
||||
struct sk_buff *skb = NULL;
|
||||
skb = ieee80211_ADDBA(ieee, dst, pBA, StatusCode, ACT_ADDBARSP); //construct ACT_ADDBARSP frames
|
||||
if (skb)
|
||||
{
|
||||
softmac_mgmt_xmit(skb, ieee);
|
||||
//same above
|
||||
}
|
||||
else
|
||||
{
|
||||
IEEE80211_DEBUG(IEEE80211_DL_ERR, "alloc skb error in function %s()\n", __FUNCTION__);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* send ADDBARSP frame out
|
||||
* If any possible, please hide pBA in ieee.
|
||||
* And temporarily use Manage Queue as softmac_mgmt_xmit() usually does
|
||||
*/
|
||||
void ieee80211_send_DELBA(struct ieee80211_device* ieee, u8* dst, PBA_RECORD pBA, TR_SELECT TxRxSelect, u16 ReasonCode)
|
||||
{
|
||||
struct sk_buff *skb = NULL;
|
||||
skb = ieee80211_DELBA(ieee, dst, pBA, TxRxSelect, ReasonCode); //construct ACT_ADDBARSP frames
|
||||
if (skb)
|
||||
{
|
||||
softmac_mgmt_xmit(skb, ieee);
|
||||
//same above
|
||||
}
|
||||
else
|
||||
{
|
||||
IEEE80211_DEBUG(IEEE80211_DL_ERR, "alloc skb error in function %s()\n", __FUNCTION__);
|
||||
}
|
||||
return ;
|
||||
}
|
||||
|
||||
int ieee80211_rx_ADDBAReq( struct ieee80211_device* ieee, struct sk_buff *skb)
|
||||
{
|
||||
struct ieee80211_hdr_3addr* req = NULL;
|
||||
u16 rc = 0;
|
||||
u8 * dst = NULL, *pDialogToken = NULL, *tag = NULL;
|
||||
PBA_RECORD pBA = NULL;
|
||||
PBA_PARAM_SET pBaParamSet = NULL;
|
||||
u16* pBaTimeoutVal = NULL;
|
||||
PSEQUENCE_CONTROL pBaStartSeqCtrl = NULL;
|
||||
PRX_TS_RECORD pTS = NULL;
|
||||
|
||||
if (skb->len < sizeof( struct ieee80211_hdr_3addr) + 9)
|
||||
{
|
||||
IEEE80211_DEBUG(IEEE80211_DL_ERR, " Invalid skb len in BAREQ(%d / %zu)\n", skb->len, (sizeof( struct ieee80211_hdr_3addr) + 9));
|
||||
return -1;
|
||||
}
|
||||
|
||||
IEEE80211_DEBUG_DATA(IEEE80211_DL_DATA|IEEE80211_DL_BA, skb->data, skb->len);
|
||||
|
||||
req = ( struct ieee80211_hdr_3addr*) skb->data;
|
||||
tag = (u8*)req;
|
||||
dst = (u8*)(&req->addr2[0]);
|
||||
tag += sizeof( struct ieee80211_hdr_3addr);
|
||||
pDialogToken = tag + 2; //category+action
|
||||
pBaParamSet = (PBA_PARAM_SET)(tag + 3); //+DialogToken
|
||||
pBaTimeoutVal = (u16*)(tag + 5);
|
||||
pBaStartSeqCtrl = (PSEQUENCE_CONTROL)(req + 7);
|
||||
|
||||
printk("====================>rx ADDBAREQ from :%pM\n", dst);
|
||||
//some other capability is not ready now.
|
||||
if( (ieee->current_network.qos_data.active == 0) ||
|
||||
(ieee->pHTInfo->bCurrentHTSupport == false)) //||
|
||||
// (ieee->pStaQos->bEnableRxImmBA == false) )
|
||||
{
|
||||
rc = ADDBA_STATUS_REFUSED;
|
||||
IEEE80211_DEBUG(IEEE80211_DL_ERR, "Failed to reply on ADDBA_REQ as some capability is not ready(%d, %d)\n", ieee->current_network.qos_data.active, ieee->pHTInfo->bCurrentHTSupport);
|
||||
goto OnADDBAReq_Fail;
|
||||
}
|
||||
// Search for related traffic stream.
|
||||
// If there is no matched TS, reject the ADDBA request.
|
||||
if( !GetTs(
|
||||
ieee,
|
||||
(PTS_COMMON_INFO*)(&pTS),
|
||||
dst,
|
||||
(u8)(pBaParamSet->field.TID),
|
||||
RX_DIR,
|
||||
true) )
|
||||
{
|
||||
rc = ADDBA_STATUS_REFUSED;
|
||||
IEEE80211_DEBUG(IEEE80211_DL_ERR, "can't get TS in %s()\n", __FUNCTION__);
|
||||
goto OnADDBAReq_Fail;
|
||||
}
|
||||
pBA = &pTS->RxAdmittedBARecord;
|
||||
// To Determine the ADDBA Req content
|
||||
// We can do much more check here, including BufferSize, AMSDU_Support, Policy, StartSeqCtrl...
|
||||
// I want to check StartSeqCtrl to make sure when we start aggregation!!!
|
||||
//
|
||||
if(pBaParamSet->field.BAPolicy == BA_POLICY_DELAYED)
|
||||
{
|
||||
rc = ADDBA_STATUS_INVALID_PARAM;
|
||||
IEEE80211_DEBUG(IEEE80211_DL_ERR, "BA Policy is not correct in %s()\n", __FUNCTION__);
|
||||
goto OnADDBAReq_Fail;
|
||||
}
|
||||
// Admit the ADDBA Request
|
||||
//
|
||||
DeActivateBAEntry(ieee, pBA);
|
||||
pBA->DialogToken = *pDialogToken;
|
||||
pBA->BaParamSet = *pBaParamSet;
|
||||
pBA->BaTimeoutValue = *pBaTimeoutVal;
|
||||
pBA->BaStartSeqCtrl = *pBaStartSeqCtrl;
|
||||
//for half N mode we only aggregate 1 frame
|
||||
if (ieee->GetHalfNmodeSupportByAPsHandler(ieee))
|
||||
pBA->BaParamSet.field.BufferSize = 1;
|
||||
else
|
||||
pBA->BaParamSet.field.BufferSize = 32;
|
||||
ActivateBAEntry(ieee, pBA, pBA->BaTimeoutValue);
|
||||
ieee80211_send_ADDBARsp(ieee, dst, pBA, ADDBA_STATUS_SUCCESS);
|
||||
|
||||
// End of procedure.
|
||||
return 0;
|
||||
|
||||
OnADDBAReq_Fail:
|
||||
{
|
||||
BA_RECORD BA;
|
||||
BA.BaParamSet = *pBaParamSet;
|
||||
BA.BaTimeoutValue = *pBaTimeoutVal;
|
||||
BA.DialogToken = *pDialogToken;
|
||||
BA.BaParamSet.field.BAPolicy = BA_POLICY_IMMEDIATE;
|
||||
ieee80211_send_ADDBARsp(ieee, dst, &BA, rc);
|
||||
return 0; //we send RSP out.
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
int ieee80211_rx_ADDBARsp( struct ieee80211_device* ieee, struct sk_buff *skb)
|
||||
{
|
||||
struct ieee80211_hdr_3addr* rsp = NULL;
|
||||
PBA_RECORD pPendingBA, pAdmittedBA;
|
||||
PTX_TS_RECORD pTS = NULL;
|
||||
u8* dst = NULL, *pDialogToken = NULL, *tag = NULL;
|
||||
u16* pStatusCode = NULL, *pBaTimeoutVal = NULL;
|
||||
PBA_PARAM_SET pBaParamSet = NULL;
|
||||
u16 ReasonCode;
|
||||
|
||||
if (skb->len < sizeof( struct ieee80211_hdr_3addr) + 9)
|
||||
{
|
||||
IEEE80211_DEBUG(IEEE80211_DL_ERR, " Invalid skb len in BARSP(%d / %zu)\n", skb->len, (sizeof( struct ieee80211_hdr_3addr) + 9));
|
||||
return -1;
|
||||
}
|
||||
rsp = ( struct ieee80211_hdr_3addr*)skb->data;
|
||||
tag = (u8*)rsp;
|
||||
dst = (u8*)(&rsp->addr2[0]);
|
||||
tag += sizeof( struct ieee80211_hdr_3addr);
|
||||
pDialogToken = tag + 2;
|
||||
pStatusCode = (u16*)(tag + 3);
|
||||
pBaParamSet = (PBA_PARAM_SET)(tag + 5);
|
||||
pBaTimeoutVal = (u16*)(tag + 7);
|
||||
|
||||
// Check the capability
|
||||
// Since we can always receive A-MPDU, we just check if it is under HT mode.
|
||||
if( ieee->current_network.qos_data.active == 0 ||
|
||||
ieee->pHTInfo->bCurrentHTSupport == false ||
|
||||
ieee->pHTInfo->bCurrentAMPDUEnable == false )
|
||||
{
|
||||
IEEE80211_DEBUG(IEEE80211_DL_ERR, "reject to ADDBA_RSP as some capability is not ready(%d, %d, %d)\n",ieee->current_network.qos_data.active, ieee->pHTInfo->bCurrentHTSupport, ieee->pHTInfo->bCurrentAMPDUEnable);
|
||||
ReasonCode = DELBA_REASON_UNKNOWN_BA;
|
||||
goto OnADDBARsp_Reject;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Search for related TS.
|
||||
// If there is no TS found, we wil reject ADDBA Rsp by sending DELBA frame.
|
||||
//
|
||||
if (!GetTs(
|
||||
ieee,
|
||||
(PTS_COMMON_INFO*)(&pTS),
|
||||
dst,
|
||||
(u8)(pBaParamSet->field.TID),
|
||||
TX_DIR,
|
||||
false) )
|
||||
{
|
||||
IEEE80211_DEBUG(IEEE80211_DL_ERR, "can't get TS in %s()\n", __FUNCTION__);
|
||||
ReasonCode = DELBA_REASON_UNKNOWN_BA;
|
||||
goto OnADDBARsp_Reject;
|
||||
}
|
||||
|
||||
pTS->bAddBaReqInProgress = false;
|
||||
pPendingBA = &pTS->TxPendingBARecord;
|
||||
pAdmittedBA = &pTS->TxAdmittedBARecord;
|
||||
|
||||
|
||||
//
|
||||
// Check if related BA is waiting for setup.
|
||||
// If not, reject by sending DELBA frame.
|
||||
//
|
||||
if((pAdmittedBA->bValid==true))
|
||||
{
|
||||
// Since BA is already setup, we ignore all other ADDBA Response.
|
||||
IEEE80211_DEBUG(IEEE80211_DL_BA, "OnADDBARsp(): Recv ADDBA Rsp. Drop because already admit it! \n");
|
||||
return -1;
|
||||
}
|
||||
else if((pPendingBA->bValid == false) ||(*pDialogToken != pPendingBA->DialogToken))
|
||||
{
|
||||
IEEE80211_DEBUG(IEEE80211_DL_ERR, "OnADDBARsp(): Recv ADDBA Rsp. BA invalid, DELBA! \n");
|
||||
ReasonCode = DELBA_REASON_UNKNOWN_BA;
|
||||
goto OnADDBARsp_Reject;
|
||||
}
|
||||
else
|
||||
{
|
||||
IEEE80211_DEBUG(IEEE80211_DL_BA, "OnADDBARsp(): Recv ADDBA Rsp. BA is admitted! Status code:%X\n", *pStatusCode);
|
||||
DeActivateBAEntry(ieee, pPendingBA);
|
||||
}
|
||||
|
||||
|
||||
if(*pStatusCode == ADDBA_STATUS_SUCCESS)
|
||||
{
|
||||
//
|
||||
// Determine ADDBA Rsp content here.
|
||||
// We can compare the value of BA parameter set that Peer returned and Self sent.
|
||||
// If it is OK, then admitted. Or we can send DELBA to cancel BA mechanism.
|
||||
//
|
||||
if(pBaParamSet->field.BAPolicy == BA_POLICY_DELAYED)
|
||||
{
|
||||
// Since this is a kind of ADDBA failed, we delay next ADDBA process.
|
||||
pTS->bAddBaReqDelayed = true;
|
||||
DeActivateBAEntry(ieee, pAdmittedBA);
|
||||
ReasonCode = DELBA_REASON_END_BA;
|
||||
goto OnADDBARsp_Reject;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Admitted condition
|
||||
//
|
||||
pAdmittedBA->DialogToken = *pDialogToken;
|
||||
pAdmittedBA->BaTimeoutValue = *pBaTimeoutVal;
|
||||
pAdmittedBA->BaStartSeqCtrl = pPendingBA->BaStartSeqCtrl;
|
||||
pAdmittedBA->BaParamSet = *pBaParamSet;
|
||||
DeActivateBAEntry(ieee, pAdmittedBA);
|
||||
ActivateBAEntry(ieee, pAdmittedBA, *pBaTimeoutVal);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Delay next ADDBA process.
|
||||
pTS->bAddBaReqDelayed = true;
|
||||
}
|
||||
|
||||
// End of procedure
|
||||
return 0;
|
||||
|
||||
OnADDBARsp_Reject:
|
||||
{
|
||||
BA_RECORD BA;
|
||||
BA.BaParamSet = *pBaParamSet;
|
||||
ieee80211_send_DELBA(ieee, dst, &BA, TX_DIR, ReasonCode);
|
||||
return 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
int ieee80211_rx_DELBA(struct ieee80211_device* ieee,struct sk_buff *skb)
|
||||
{
|
||||
struct ieee80211_hdr_3addr* delba = NULL;
|
||||
PDELBA_PARAM_SET pDelBaParamSet = NULL;
|
||||
u16* pReasonCode = NULL;
|
||||
u8* dst = NULL;
|
||||
|
||||
if (skb->len < sizeof( struct ieee80211_hdr_3addr) + 6)
|
||||
{
|
||||
IEEE80211_DEBUG(IEEE80211_DL_ERR, " Invalid skb len in DELBA(%d / %zu)\n", skb->len, (sizeof( struct ieee80211_hdr_3addr) + 6));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(ieee->current_network.qos_data.active == 0 ||
|
||||
ieee->pHTInfo->bCurrentHTSupport == false )
|
||||
{
|
||||
IEEE80211_DEBUG(IEEE80211_DL_ERR, "received DELBA while QOS or HT is not supported(%d, %d)\n",ieee->current_network.qos_data.active, ieee->pHTInfo->bCurrentHTSupport);
|
||||
return -1;
|
||||
}
|
||||
|
||||
IEEE80211_DEBUG_DATA(IEEE80211_DL_DATA|IEEE80211_DL_BA, skb->data, skb->len);
|
||||
delba = ( struct ieee80211_hdr_3addr*)skb->data;
|
||||
dst = (u8*)(&delba->addr2[0]);
|
||||
delba += sizeof( struct ieee80211_hdr_3addr);
|
||||
pDelBaParamSet = (PDELBA_PARAM_SET)(delba+2);
|
||||
pReasonCode = (u16*)(delba+4);
|
||||
|
||||
if(pDelBaParamSet->field.Initiator == 1)
|
||||
{
|
||||
PRX_TS_RECORD pRxTs;
|
||||
|
||||
if( !GetTs(
|
||||
ieee,
|
||||
(PTS_COMMON_INFO*)&pRxTs,
|
||||
dst,
|
||||
(u8)pDelBaParamSet->field.TID,
|
||||
RX_DIR,
|
||||
false) )
|
||||
{
|
||||
IEEE80211_DEBUG(IEEE80211_DL_ERR, "can't get TS for RXTS in %s()\n", __FUNCTION__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
RxTsDeleteBA(ieee, pRxTs);
|
||||
}
|
||||
else
|
||||
{
|
||||
PTX_TS_RECORD pTxTs;
|
||||
|
||||
if(!GetTs(
|
||||
ieee,
|
||||
(PTS_COMMON_INFO*)&pTxTs,
|
||||
dst,
|
||||
(u8)pDelBaParamSet->field.TID,
|
||||
TX_DIR,
|
||||
false) )
|
||||
{
|
||||
IEEE80211_DEBUG(IEEE80211_DL_ERR, "can't get TS for TXTS in %s()\n", __FUNCTION__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
pTxTs->bUsingBa = false;
|
||||
pTxTs->bAddBaReqInProgress = false;
|
||||
pTxTs->bAddBaReqDelayed = false;
|
||||
del_timer_sync(&pTxTs->TsAddBaTimer);
|
||||
//PlatformCancelTimer(Adapter, &pTxTs->TsAddBaTimer);
|
||||
TxTsDeleteBA(ieee, pTxTs);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* ADDBA initiate. This can only be called by TX side. */
|
||||
void
|
||||
TsInitAddBA(
|
||||
struct ieee80211_device* ieee,
|
||||
PTX_TS_RECORD pTS,
|
||||
u8 Policy,
|
||||
u8 bOverwritePending
|
||||
)
|
||||
{
|
||||
PBA_RECORD pBA = &pTS->TxPendingBARecord;
|
||||
|
||||
if(pBA->bValid==true && bOverwritePending==false)
|
||||
return;
|
||||
|
||||
// Set parameters to "Pending" variable set
|
||||
DeActivateBAEntry(ieee, pBA);
|
||||
|
||||
pBA->DialogToken++; // DialogToken: Only keep the latest dialog token
|
||||
pBA->BaParamSet.field.AMSDU_Support = 0; // Do not support A-MSDU with A-MPDU now!!
|
||||
pBA->BaParamSet.field.BAPolicy = Policy; // Policy: Delayed or Immediate
|
||||
pBA->BaParamSet.field.TID = pTS->TsCommonInfo.TSpec.f.TSInfo.field.ucTSID; // TID
|
||||
// BufferSize: This need to be set according to A-MPDU vector
|
||||
pBA->BaParamSet.field.BufferSize = 32; // BufferSize: This need to be set according to A-MPDU vector
|
||||
pBA->BaTimeoutValue = 0; // Timeout value: Set 0 to disable Timer
|
||||
pBA->BaStartSeqCtrl.field.SeqNum = (pTS->TxCurSeq + 3) % 4096; // Block Ack will start after 3 packets later.
|
||||
|
||||
ActivateBAEntry(ieee, pBA, BA_SETUP_TIMEOUT);
|
||||
|
||||
ieee80211_send_ADDBAReq(ieee, pTS->TsCommonInfo.Addr, pBA);
|
||||
}
|
||||
|
||||
void
|
||||
TsInitDelBA( struct ieee80211_device* ieee, PTS_COMMON_INFO pTsCommonInfo, TR_SELECT TxRxSelect)
|
||||
{
|
||||
|
||||
if(TxRxSelect == TX_DIR)
|
||||
{
|
||||
PTX_TS_RECORD pTxTs = (PTX_TS_RECORD)pTsCommonInfo;
|
||||
|
||||
if(TxTsDeleteBA(ieee, pTxTs))
|
||||
ieee80211_send_DELBA(
|
||||
ieee,
|
||||
pTsCommonInfo->Addr,
|
||||
(pTxTs->TxAdmittedBARecord.bValid)?(&pTxTs->TxAdmittedBARecord):(&pTxTs->TxPendingBARecord),
|
||||
TxRxSelect,
|
||||
DELBA_REASON_END_BA);
|
||||
}
|
||||
else if(TxRxSelect == RX_DIR)
|
||||
{
|
||||
PRX_TS_RECORD pRxTs = (PRX_TS_RECORD)pTsCommonInfo;
|
||||
if(RxTsDeleteBA(ieee, pRxTs))
|
||||
ieee80211_send_DELBA(
|
||||
ieee,
|
||||
pTsCommonInfo->Addr,
|
||||
&pRxTs->RxAdmittedBARecord,
|
||||
TxRxSelect,
|
||||
DELBA_REASON_END_BA );
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* BA setup timer
|
||||
* acturally we send TX_TS_RECORD or RX_TS_RECORD to these timer
|
||||
*/
|
||||
void BaSetupTimeOut(unsigned long data)
|
||||
{
|
||||
PTX_TS_RECORD pTxTs = (PTX_TS_RECORD)data;
|
||||
|
||||
pTxTs->bAddBaReqInProgress = false;
|
||||
pTxTs->bAddBaReqDelayed = true;
|
||||
pTxTs->TxPendingBARecord.bValid = false;
|
||||
}
|
||||
|
||||
void TxBaInactTimeout(unsigned long data)
|
||||
{
|
||||
PTX_TS_RECORD pTxTs = (PTX_TS_RECORD)data;
|
||||
struct ieee80211_device *ieee = container_of(pTxTs, struct ieee80211_device, TxTsRecord[pTxTs->num]);
|
||||
TxTsDeleteBA(ieee, pTxTs);
|
||||
ieee80211_send_DELBA(
|
||||
ieee,
|
||||
pTxTs->TsCommonInfo.Addr,
|
||||
&pTxTs->TxAdmittedBARecord,
|
||||
TX_DIR,
|
||||
DELBA_REASON_TIMEOUT);
|
||||
}
|
||||
|
||||
void RxBaInactTimeout(unsigned long data)
|
||||
{
|
||||
PRX_TS_RECORD pRxTs = (PRX_TS_RECORD)data;
|
||||
struct ieee80211_device *ieee = container_of(pRxTs, struct ieee80211_device, RxTsRecord[pRxTs->num]);
|
||||
|
||||
RxTsDeleteBA(ieee, pRxTs);
|
||||
ieee80211_send_DELBA(
|
||||
ieee,
|
||||
pRxTs->TsCommonInfo.Addr,
|
||||
&pRxTs->RxAdmittedBARecord,
|
||||
RX_DIR,
|
||||
DELBA_REASON_TIMEOUT);
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,582 +0,0 @@
|
|||
#ifndef __INC_QOS_TYPE_H
|
||||
#define __INC_QOS_TYPE_H
|
||||
|
||||
#define BIT0 0x00000001
|
||||
#define BIT1 0x00000002
|
||||
#define BIT2 0x00000004
|
||||
#define BIT3 0x00000008
|
||||
#define BIT4 0x00000010
|
||||
#define BIT5 0x00000020
|
||||
#define BIT6 0x00000040
|
||||
#define BIT7 0x00000080
|
||||
#define BIT8 0x00000100
|
||||
#define BIT9 0x00000200
|
||||
#define BIT10 0x00000400
|
||||
#define BIT11 0x00000800
|
||||
#define BIT12 0x00001000
|
||||
#define BIT13 0x00002000
|
||||
#define BIT14 0x00004000
|
||||
#define BIT15 0x00008000
|
||||
#define BIT16 0x00010000
|
||||
#define BIT17 0x00020000
|
||||
#define BIT18 0x00040000
|
||||
#define BIT19 0x00080000
|
||||
#define BIT20 0x00100000
|
||||
#define BIT21 0x00200000
|
||||
#define BIT22 0x00400000
|
||||
#define BIT23 0x00800000
|
||||
#define BIT24 0x01000000
|
||||
#define BIT25 0x02000000
|
||||
#define BIT26 0x04000000
|
||||
#define BIT27 0x08000000
|
||||
#define BIT28 0x10000000
|
||||
#define BIT29 0x20000000
|
||||
#define BIT30 0x40000000
|
||||
#define BIT31 0x80000000
|
||||
|
||||
#define MAX_WMMELE_LENGTH 64
|
||||
|
||||
//
|
||||
// QoS mode.
|
||||
// enum 0, 1, 2, 4: since we can use the OR(|) operation.
|
||||
//
|
||||
// QOS_MODE is redefined for enum can't be ++, | under C++ compiler, 2006.05.17, by rcnjko.
|
||||
//typedef enum _QOS_MODE{
|
||||
// QOS_DISABLE = 0,
|
||||
// QOS_WMM = 1,
|
||||
// QOS_EDCA = 2,
|
||||
// QOS_HCCA = 4,
|
||||
//}QOS_MODE,*PQOS_MODE;
|
||||
//
|
||||
typedef u32 QOS_MODE, *PQOS_MODE;
|
||||
#define QOS_DISABLE 0
|
||||
#define QOS_WMM 1
|
||||
#define QOS_WMMSA 2
|
||||
#define QOS_EDCA 4
|
||||
#define QOS_HCCA 8
|
||||
#define QOS_WMM_UAPSD 16 //WMM Power Save, 2006-06-14 Isaiah
|
||||
|
||||
#define AC_PARAM_SIZE 4
|
||||
#define WMM_PARAM_ELE_BODY_LEN 18
|
||||
|
||||
//
|
||||
// QoS ACK Policy Field Values
|
||||
// Ref: WMM spec 2.1.6: QoS Control Field, p.10.
|
||||
//
|
||||
typedef enum _ACK_POLICY{
|
||||
eAckPlc0_ACK = 0x00,
|
||||
eAckPlc1_NoACK = 0x01,
|
||||
}ACK_POLICY,*PACK_POLICY;
|
||||
|
||||
#define WMM_PARAM_ELEMENT_SIZE (8+(4*AC_PARAM_SIZE))
|
||||
|
||||
//
|
||||
// QoS Control Field
|
||||
// Ref:
|
||||
// 1. WMM spec 2.1.6: QoS Control Field, p.9.
|
||||
// 2. 802.11e/D13.0 7.1.3.5, p.26.
|
||||
//
|
||||
typedef union _QOS_CTRL_FIELD{
|
||||
u8 charData[2];
|
||||
u16 shortData;
|
||||
|
||||
// WMM spec
|
||||
struct
|
||||
{
|
||||
u8 UP:3;
|
||||
u8 usRsvd1:1;
|
||||
u8 EOSP:1;
|
||||
u8 AckPolicy:2;
|
||||
u8 usRsvd2:1;
|
||||
u8 ucRsvdByte;
|
||||
}WMM;
|
||||
|
||||
// 802.11e: QoS data type frame sent by non-AP QSTAs.
|
||||
struct
|
||||
{
|
||||
u8 TID:4;
|
||||
u8 bIsQsize:1;// 0: BIT[8:15] is TXOP Duration Requested, 1: BIT[8:15] is Queue Size.
|
||||
u8 AckPolicy:2;
|
||||
u8 usRsvd:1;
|
||||
u8 TxopOrQsize; // (BIT4=0)TXOP Duration Requested or (BIT4=1)Queue Size.
|
||||
}BySta;
|
||||
|
||||
// 802.11e: QoS data, QoS Null, and QoS Data+CF-Ack frames sent by HC.
|
||||
struct
|
||||
{
|
||||
u8 TID:4;
|
||||
u8 EOSP:1;
|
||||
u8 AckPolicy:2;
|
||||
u8 usRsvd:1;
|
||||
u8 PSBufState; // QAP PS Buffer State.
|
||||
}ByHc_Data;
|
||||
|
||||
// 802.11e: QoS (+) CF-Poll frames sent by HC.
|
||||
struct
|
||||
{
|
||||
u8 TID:4;
|
||||
u8 EOSP:1;
|
||||
u8 AckPolicy:2;
|
||||
u8 usRsvd:1;
|
||||
u8 TxopLimit; // TXOP Limit.
|
||||
}ByHc_CFP;
|
||||
|
||||
}QOS_CTRL_FIELD, *PQOS_CTRL_FIELD;
|
||||
|
||||
|
||||
//
|
||||
// QoS Info Field
|
||||
// Ref:
|
||||
// 1. WMM spec 2.2.1: WME Information Element, p.11.
|
||||
// 2. 8185 QoS code: QOS_INFO [def. in QoS_mp.h]
|
||||
//
|
||||
typedef union _QOS_INFO_FIELD{
|
||||
u8 charData;
|
||||
|
||||
struct
|
||||
{
|
||||
u8 ucParameterSetCount:4;
|
||||
u8 ucReserved:4;
|
||||
}WMM;
|
||||
|
||||
struct
|
||||
{
|
||||
//Ref WMM_Specification_1-1.pdf, 2006-06-13 Isaiah
|
||||
u8 ucAC_VO_UAPSD:1;
|
||||
u8 ucAC_VI_UAPSD:1;
|
||||
u8 ucAC_BE_UAPSD:1;
|
||||
u8 ucAC_BK_UAPSD:1;
|
||||
u8 ucReserved1:1;
|
||||
u8 ucMaxSPLen:2;
|
||||
u8 ucReserved2:1;
|
||||
|
||||
}ByWmmPsSta;
|
||||
|
||||
struct
|
||||
{
|
||||
//Ref WMM_Specification_1-1.pdf, 2006-06-13 Isaiah
|
||||
u8 ucParameterSetCount:4;
|
||||
u8 ucReserved:3;
|
||||
u8 ucApUapsd:1;
|
||||
}ByWmmPsAp;
|
||||
|
||||
struct
|
||||
{
|
||||
u8 ucAC3_UAPSD:1;
|
||||
u8 ucAC2_UAPSD:1;
|
||||
u8 ucAC1_UAPSD:1;
|
||||
u8 ucAC0_UAPSD:1;
|
||||
u8 ucQAck:1;
|
||||
u8 ucMaxSPLen:2;
|
||||
u8 ucMoreDataAck:1;
|
||||
} By11eSta;
|
||||
|
||||
struct
|
||||
{
|
||||
u8 ucParameterSetCount:4;
|
||||
u8 ucQAck:1;
|
||||
u8 ucQueueReq:1;
|
||||
u8 ucTXOPReq:1;
|
||||
u8 ucReserved:1;
|
||||
} By11eAp;
|
||||
|
||||
struct
|
||||
{
|
||||
u8 ucReserved1:4;
|
||||
u8 ucQAck:1;
|
||||
u8 ucReserved2:2;
|
||||
u8 ucMoreDataAck:1;
|
||||
} ByWmmsaSta;
|
||||
|
||||
struct
|
||||
{
|
||||
u8 ucReserved1:4;
|
||||
u8 ucQAck:1;
|
||||
u8 ucQueueReq:1;
|
||||
u8 ucTXOPReq:1;
|
||||
u8 ucReserved2:1;
|
||||
} ByWmmsaAp;
|
||||
|
||||
struct
|
||||
{
|
||||
u8 ucAC3_UAPSD:1;
|
||||
u8 ucAC2_UAPSD:1;
|
||||
u8 ucAC1_UAPSD:1;
|
||||
u8 ucAC0_UAPSD:1;
|
||||
u8 ucQAck:1;
|
||||
u8 ucMaxSPLen:2;
|
||||
u8 ucMoreDataAck:1;
|
||||
} ByAllSta;
|
||||
|
||||
struct
|
||||
{
|
||||
u8 ucParameterSetCount:4;
|
||||
u8 ucQAck:1;
|
||||
u8 ucQueueReq:1;
|
||||
u8 ucTXOPReq:1;
|
||||
u8 ucApUapsd:1;
|
||||
} ByAllAp;
|
||||
|
||||
}QOS_INFO_FIELD, *PQOS_INFO_FIELD;
|
||||
|
||||
//
|
||||
// ACI to AC coding.
|
||||
// Ref: WMM spec 2.2.2: WME Parameter Element, p.13.
|
||||
//
|
||||
// AC_CODING is redefined for enum can't be ++, | under C++ compiler, 2006.05.17, by rcnjko.
|
||||
//typedef enum _AC_CODING{
|
||||
// AC0_BE = 0, // ACI: 0x00 // Best Effort
|
||||
// AC1_BK = 1, // ACI: 0x01 // Background
|
||||
// AC2_VI = 2, // ACI: 0x10 // Video
|
||||
// AC3_VO = 3, // ACI: 0x11 // Voice
|
||||
// AC_MAX = 4, // Max: define total number; Should not to be used as a real enum.
|
||||
//}AC_CODING,*PAC_CODING;
|
||||
//
|
||||
typedef u32 AC_CODING;
|
||||
#define AC0_BE 0 // ACI: 0x00 // Best Effort
|
||||
#define AC1_BK 1 // ACI: 0x01 // Background
|
||||
#define AC2_VI 2 // ACI: 0x10 // Video
|
||||
#define AC3_VO 3 // ACI: 0x11 // Voice
|
||||
#define AC_MAX 4 // Max: define total number; Should not to be used as a real enum.
|
||||
|
||||
//
|
||||
// ACI/AIFSN Field.
|
||||
// Ref: WMM spec 2.2.2: WME Parameter Element, p.12.
|
||||
//
|
||||
typedef union _ACI_AIFSN{
|
||||
u8 charData;
|
||||
|
||||
struct
|
||||
{
|
||||
u8 AIFSN:4;
|
||||
u8 ACM:1;
|
||||
u8 ACI:2;
|
||||
u8 Reserved:1;
|
||||
}f; // Field
|
||||
}ACI_AIFSN, *PACI_AIFSN;
|
||||
|
||||
//
|
||||
// ECWmin/ECWmax field.
|
||||
// Ref: WMM spec 2.2.2: WME Parameter Element, p.13.
|
||||
//
|
||||
typedef union _ECW{
|
||||
u8 charData;
|
||||
struct
|
||||
{
|
||||
u8 ECWmin:4;
|
||||
u8 ECWmax:4;
|
||||
}f; // Field
|
||||
}ECW, *PECW;
|
||||
|
||||
//
|
||||
// AC Parameters Record Format.
|
||||
// Ref: WMM spec 2.2.2: WME Parameter Element, p.12.
|
||||
//
|
||||
typedef union _AC_PARAM{
|
||||
u32 longData;
|
||||
u8 charData[4];
|
||||
|
||||
struct
|
||||
{
|
||||
ACI_AIFSN AciAifsn;
|
||||
ECW Ecw;
|
||||
u16 TXOPLimit;
|
||||
}f; // Field
|
||||
}AC_PARAM, *PAC_PARAM;
|
||||
|
||||
|
||||
|
||||
//
|
||||
// QoS element subtype
|
||||
//
|
||||
typedef enum _QOS_ELE_SUBTYPE{
|
||||
QOSELE_TYPE_INFO = 0x00, // 0x00: Information element
|
||||
QOSELE_TYPE_PARAM = 0x01, // 0x01: parameter element
|
||||
}QOS_ELE_SUBTYPE,*PQOS_ELE_SUBTYPE;
|
||||
|
||||
|
||||
//
|
||||
// Direction Field Values.
|
||||
// Ref: WMM spec 2.2.11: WME TSPEC Element, p.18.
|
||||
//
|
||||
typedef enum _DIRECTION_VALUE{
|
||||
DIR_UP = 0, // 0x00 // UpLink
|
||||
DIR_DOWN = 1, // 0x01 // DownLink
|
||||
DIR_DIRECT = 2, // 0x10 // DirectLink
|
||||
DIR_BI_DIR = 3, // 0x11 // Bi-Direction
|
||||
}DIRECTION_VALUE,*PDIRECTION_VALUE;
|
||||
|
||||
|
||||
//
|
||||
// TS Info field in WMM TSPEC Element.
|
||||
// Ref:
|
||||
// 1. WMM spec 2.2.11: WME TSPEC Element, p.18.
|
||||
// 2. 8185 QoS code: QOS_TSINFO [def. in QoS_mp.h]
|
||||
//
|
||||
typedef union _QOS_TSINFO{
|
||||
u8 charData[3];
|
||||
struct {
|
||||
u8 ucTrafficType:1; //WMM is reserved
|
||||
u8 ucTSID:4;
|
||||
u8 ucDirection:2;
|
||||
u8 ucAccessPolicy:2; //WMM: bit8=0, bit7=1
|
||||
u8 ucAggregation:1; //WMM is reserved
|
||||
u8 ucPSB:1; //WMMSA is APSD
|
||||
u8 ucUP:3;
|
||||
u8 ucTSInfoAckPolicy:2; //WMM is reserved
|
||||
u8 ucSchedule:1; //WMM is reserved
|
||||
u8 ucReserved:7;
|
||||
}field;
|
||||
}QOS_TSINFO, *PQOS_TSINFO;
|
||||
|
||||
//
|
||||
// WMM TSPEC Body.
|
||||
// Ref: WMM spec 2.2.11: WME TSPEC Element, p.16.
|
||||
//
|
||||
typedef union _TSPEC_BODY{
|
||||
u8 charData[55];
|
||||
|
||||
struct
|
||||
{
|
||||
QOS_TSINFO TSInfo; //u8 TSInfo[3];
|
||||
u16 NominalMSDUsize;
|
||||
u16 MaxMSDUsize;
|
||||
u32 MinServiceItv;
|
||||
u32 MaxServiceItv;
|
||||
u32 InactivityItv;
|
||||
u32 SuspenItv;
|
||||
u32 ServiceStartTime;
|
||||
u32 MinDataRate;
|
||||
u32 MeanDataRate;
|
||||
u32 PeakDataRate;
|
||||
u32 MaxBurstSize;
|
||||
u32 DelayBound;
|
||||
u32 MinPhyRate;
|
||||
u16 SurplusBandwidthAllowance;
|
||||
u16 MediumTime;
|
||||
} f; // Field
|
||||
}TSPEC_BODY, *PTSPEC_BODY;
|
||||
|
||||
|
||||
//
|
||||
// WMM TSPEC Element.
|
||||
// Ref: WMM spec 2.2.11: WME TSPEC Element, p.16.
|
||||
//
|
||||
typedef struct _WMM_TSPEC{
|
||||
u8 ID;
|
||||
u8 Length;
|
||||
u8 OUI[3];
|
||||
u8 OUI_Type;
|
||||
u8 OUI_SubType;
|
||||
u8 Version;
|
||||
TSPEC_BODY Body;
|
||||
} WMM_TSPEC, *PWMM_TSPEC;
|
||||
|
||||
//
|
||||
// ACM implementation method.
|
||||
// Annie, 2005-12-13.
|
||||
//
|
||||
typedef enum _ACM_METHOD{
|
||||
eAcmWay0_SwAndHw = 0, // By SW and HW.
|
||||
eAcmWay1_HW = 1, // By HW.
|
||||
eAcmWay2_SW = 2, // By SW.
|
||||
}ACM_METHOD,*PACM_METHOD;
|
||||
|
||||
|
||||
typedef struct _ACM{
|
||||
// u8 RegEnableACM;
|
||||
u64 UsedTime;
|
||||
u64 MediumTime;
|
||||
u8 HwAcmCtl; // TRUE: UsedTime exceed => Do NOT USE this AC. It wll be written to ACM_CONTROL(0xBF BIT 0/1/2 in 8185B).
|
||||
}ACM, *PACM;
|
||||
|
||||
typedef u8 AC_UAPSD, *PAC_UAPSD;
|
||||
|
||||
#define GET_VO_UAPSD(_apsd) ((_apsd) & BIT0)
|
||||
#define SET_VO_UAPSD(_apsd) ((_apsd) |= BIT0)
|
||||
|
||||
#define GET_VI_UAPSD(_apsd) ((_apsd) & BIT1)
|
||||
#define SET_VI_UAPSD(_apsd) ((_apsd) |= BIT1)
|
||||
|
||||
#define GET_BK_UAPSD(_apsd) ((_apsd) & BIT2)
|
||||
#define SET_BK_UAPSD(_apsd) ((_apsd) |= BIT2)
|
||||
|
||||
#define GET_BE_UAPSD(_apsd) ((_apsd) & BIT3)
|
||||
#define SET_BE_UAPSD(_apsd) ((_apsd) |= BIT3)
|
||||
|
||||
|
||||
//typedef struct _TCLASS{
|
||||
// TODO
|
||||
//} TCLASS, *PTCLASS;
|
||||
typedef union _QOS_TCLAS{
|
||||
|
||||
struct _TYPE_GENERAL{
|
||||
u8 Priority;
|
||||
u8 ClassifierType;
|
||||
u8 Mask;
|
||||
} TYPE_GENERAL;
|
||||
|
||||
struct _TYPE0_ETH{
|
||||
u8 Priority;
|
||||
u8 ClassifierType;
|
||||
u8 Mask;
|
||||
u8 SrcAddr[6];
|
||||
u8 DstAddr[6];
|
||||
u16 Type;
|
||||
} TYPE0_ETH;
|
||||
|
||||
struct _TYPE1_IPV4{
|
||||
u8 Priority;
|
||||
u8 ClassifierType;
|
||||
u8 Mask;
|
||||
u8 Version;
|
||||
u8 SrcIP[4];
|
||||
u8 DstIP[4];
|
||||
u16 SrcPort;
|
||||
u16 DstPort;
|
||||
u8 DSCP;
|
||||
u8 Protocol;
|
||||
u8 Reserved;
|
||||
} TYPE1_IPV4;
|
||||
|
||||
struct _TYPE1_IPV6{
|
||||
u8 Priority;
|
||||
u8 ClassifierType;
|
||||
u8 Mask;
|
||||
u8 Version;
|
||||
u8 SrcIP[16];
|
||||
u8 DstIP[16];
|
||||
u16 SrcPort;
|
||||
u16 DstPort;
|
||||
u8 FlowLabel[3];
|
||||
} TYPE1_IPV6;
|
||||
|
||||
struct _TYPE2_8021Q{
|
||||
u8 Priority;
|
||||
u8 ClassifierType;
|
||||
u8 Mask;
|
||||
u16 TagType;
|
||||
} TYPE2_8021Q;
|
||||
} QOS_TCLAS, *PQOS_TCLAS;
|
||||
|
||||
//typedef struct _WMM_TSTREAM{
|
||||
//
|
||||
//- TSPEC
|
||||
//- AC (which to mapping)
|
||||
//} WMM_TSTREAM, *PWMM_TSTREAM;
|
||||
typedef struct _QOS_TSTREAM{
|
||||
u8 AC;
|
||||
WMM_TSPEC TSpec;
|
||||
QOS_TCLAS TClass;
|
||||
} QOS_TSTREAM, *PQOS_TSTREAM;
|
||||
|
||||
//typedef struct _U_APSD{
|
||||
//- TriggerEnable [4]
|
||||
//- MaxSPLength
|
||||
//- HighestAcBuffered
|
||||
//} U_APSD, *PU_APSD;
|
||||
|
||||
//joseph TODO:
|
||||
// UAPSD function should be implemented by 2 data structure
|
||||
// "Qos control field" and "Qos info field"
|
||||
//typedef struct _QOS_UAPSD{
|
||||
// u8 bTriggerEnable[4];
|
||||
// u8 MaxSPLength;
|
||||
// u8 HighestBufAC;
|
||||
//} QOS_UAPSD, *PQOS_APSD;
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// 802.11 Management frame Status Code field
|
||||
//----------------------------------------------------------------------------
|
||||
typedef struct _OCTET_STRING{
|
||||
u8 *Octet;
|
||||
u16 Length;
|
||||
}OCTET_STRING, *POCTET_STRING;
|
||||
|
||||
//
|
||||
// STA QoS data.
|
||||
// Ref: DOT11_QOS in 8185 code. [def. in QoS_mp.h]
|
||||
//
|
||||
typedef struct _STA_QOS{
|
||||
//DECLARE_RT_OBJECT(STA_QOS);
|
||||
u8 WMMIEBuf[MAX_WMMELE_LENGTH];
|
||||
u8* WMMIE;
|
||||
|
||||
// Part 1. Self QoS Mode.
|
||||
QOS_MODE QosCapability; //QoS Capability, 2006-06-14 Isaiah
|
||||
QOS_MODE CurrentQosMode;
|
||||
|
||||
// For WMM Power Save Mode :
|
||||
// ACs are trigger/delivery enabled or legacy power save enabled. 2006-06-13 Isaiah
|
||||
AC_UAPSD b4ac_Uapsd; //VoUapsd(bit0), ViUapsd(bit1), BkUapsd(bit2), BeUapsd(bit3),
|
||||
AC_UAPSD Curr4acUapsd;
|
||||
u8 bInServicePeriod;
|
||||
u8 MaxSPLength;
|
||||
int NumBcnBeforeTrigger;
|
||||
|
||||
// Part 2. EDCA Parameter (perAC)
|
||||
u8 * pWMMInfoEle;
|
||||
u8 WMMParamEle[WMM_PARAM_ELEMENT_SIZE];
|
||||
u8 WMMPELength;
|
||||
|
||||
// <Bruce_Note>
|
||||
//2 ToDo: remove the Qos Info Field and replace it by the above WMM Info element.
|
||||
// By Bruce, 2008-01-30.
|
||||
// Part 2. EDCA Parameter (perAC)
|
||||
QOS_INFO_FIELD QosInfoField_STA; // Maintained by STA
|
||||
QOS_INFO_FIELD QosInfoField_AP; // Retrieved from AP
|
||||
|
||||
AC_PARAM CurAcParameters[4];
|
||||
|
||||
// Part 3. ACM
|
||||
ACM acm[4];
|
||||
ACM_METHOD AcmMethod;
|
||||
|
||||
// Part 4. Per TID (Part 5: TCLASS will be described by TStream)
|
||||
QOS_TSTREAM TStream[16];
|
||||
WMM_TSPEC TSpec;
|
||||
|
||||
u32 QBssWirelessMode;
|
||||
|
||||
// No Ack Setting
|
||||
u8 bNoAck;
|
||||
|
||||
// Enable/Disable Rx immediate BA capability.
|
||||
u8 bEnableRxImmBA;
|
||||
|
||||
}STA_QOS, *PSTA_QOS;
|
||||
|
||||
//
|
||||
// BSS QOS data.
|
||||
// Ref: BssDscr in 8185 code. [def. in BssDscr.h]
|
||||
//
|
||||
typedef struct _BSS_QOS{
|
||||
QOS_MODE bdQoSMode;
|
||||
|
||||
u8 bdWMMIEBuf[MAX_WMMELE_LENGTH];
|
||||
u8* bdWMMIE;
|
||||
|
||||
QOS_ELE_SUBTYPE EleSubType;
|
||||
|
||||
u8 * pWMMInfoEle;
|
||||
u8 * pWMMParamEle;
|
||||
|
||||
QOS_INFO_FIELD QosInfoField;
|
||||
AC_PARAM AcParameter[4];
|
||||
}BSS_QOS, *PBSS_QOS;
|
||||
|
||||
|
||||
//
|
||||
// Ref: sQoSCtlLng and QoSCtl definition in 8185 QoS code.
|
||||
//#define QoSCtl (( (Adapter->bRegQoS) && (Adapter->dot11QoS.QoSMode &(QOS_EDCA|QOS_HCCA)) ) ?sQoSCtlLng:0)
|
||||
//
|
||||
#define sQoSCtlLng 2
|
||||
#define QOS_CTRL_LEN(_QosMode) ((_QosMode > QOS_DISABLE)? sQoSCtlLng : 0)
|
||||
|
||||
|
||||
//Added by joseph
|
||||
//UP Mapping to AC, using in MgntQuery_SequenceNumber() and maybe for DSCP
|
||||
//#define UP2AC(up) ((up<3)?((up==0)?1:0):(up>>1))
|
||||
#define IsACValid(ac) ((ac<=7 )?true:false )
|
||||
|
||||
#endif // #ifndef __INC_QOS_TYPE_H
|
||||
|
|
@ -1,627 +0,0 @@
|
|||
#include "ieee80211.h"
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/slab.h>
|
||||
#include "rtl819x_TS.h"
|
||||
|
||||
void TsSetupTimeOut(unsigned long data)
|
||||
{
|
||||
// Not implement yet
|
||||
// This is used for WMMSA and ACM , that would send ADDTSReq frame.
|
||||
}
|
||||
|
||||
void TsInactTimeout(unsigned long data)
|
||||
{
|
||||
// Not implement yet
|
||||
// This is used for WMMSA and ACM.
|
||||
// This function would be call when TS is no Tx/Rx for some period of time.
|
||||
}
|
||||
|
||||
/********************************************************************************************************************
|
||||
*function: I still not understand this function, so wait for further implementation
|
||||
* input: unsigned long data //acturally we send TX_TS_RECORD or RX_TS_RECORD to these timer
|
||||
* return: NULL
|
||||
* notice:
|
||||
********************************************************************************************************************/
|
||||
void RxPktPendingTimeout(unsigned long data)
|
||||
{
|
||||
PRX_TS_RECORD pRxTs = (PRX_TS_RECORD)data;
|
||||
struct ieee80211_device *ieee = container_of(pRxTs, struct ieee80211_device, RxTsRecord[pRxTs->num]);
|
||||
|
||||
PRX_REORDER_ENTRY pReorderEntry = NULL;
|
||||
|
||||
//u32 flags = 0;
|
||||
unsigned long flags = 0;
|
||||
struct ieee80211_rxb *stats_IndicateArray[REORDER_WIN_SIZE];
|
||||
u8 index = 0;
|
||||
bool bPktInBuf = false;
|
||||
|
||||
|
||||
spin_lock_irqsave(&(ieee->reorder_spinlock), flags);
|
||||
//PlatformAcquireSpinLock(Adapter, RT_RX_SPINLOCK);
|
||||
IEEE80211_DEBUG(IEEE80211_DL_REORDER,"==================>%s()\n",__FUNCTION__);
|
||||
if(pRxTs->RxTimeoutIndicateSeq != 0xffff)
|
||||
{
|
||||
// Indicate the pending packets sequentially according to SeqNum until meet the gap.
|
||||
while(!list_empty(&pRxTs->RxPendingPktList))
|
||||
{
|
||||
pReorderEntry = (PRX_REORDER_ENTRY)list_entry(pRxTs->RxPendingPktList.prev,RX_REORDER_ENTRY,List);
|
||||
if(index == 0)
|
||||
pRxTs->RxIndicateSeq = pReorderEntry->SeqNum;
|
||||
|
||||
if( SN_LESS(pReorderEntry->SeqNum, pRxTs->RxIndicateSeq) ||
|
||||
SN_EQUAL(pReorderEntry->SeqNum, pRxTs->RxIndicateSeq) )
|
||||
{
|
||||
list_del_init(&pReorderEntry->List);
|
||||
|
||||
if(SN_EQUAL(pReorderEntry->SeqNum, pRxTs->RxIndicateSeq))
|
||||
pRxTs->RxIndicateSeq = (pRxTs->RxIndicateSeq + 1) % 4096;
|
||||
|
||||
IEEE80211_DEBUG(IEEE80211_DL_REORDER,"RxPktPendingTimeout(): IndicateSeq: %d\n", pReorderEntry->SeqNum);
|
||||
stats_IndicateArray[index] = pReorderEntry->prxb;
|
||||
index++;
|
||||
|
||||
list_add_tail(&pReorderEntry->List, &ieee->RxReorder_Unused_List);
|
||||
}
|
||||
else
|
||||
{
|
||||
bPktInBuf = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(index>0)
|
||||
{
|
||||
// Set RxTimeoutIndicateSeq to 0xffff to indicate no pending packets in buffer now.
|
||||
pRxTs->RxTimeoutIndicateSeq = 0xffff;
|
||||
|
||||
// Indicate packets
|
||||
if(index > REORDER_WIN_SIZE){
|
||||
IEEE80211_DEBUG(IEEE80211_DL_ERR, "RxReorderIndicatePacket(): Rx Reorer buffer full!! \n");
|
||||
spin_unlock_irqrestore(&(ieee->reorder_spinlock), flags);
|
||||
return;
|
||||
}
|
||||
ieee80211_indicate_packets(ieee, stats_IndicateArray, index);
|
||||
}
|
||||
|
||||
if(bPktInBuf && (pRxTs->RxTimeoutIndicateSeq==0xffff))
|
||||
{
|
||||
pRxTs->RxTimeoutIndicateSeq = pRxTs->RxIndicateSeq;
|
||||
mod_timer(&pRxTs->RxPktPendingTimer, jiffies + MSECS(ieee->pHTInfo->RxReorderPendingTime));
|
||||
}
|
||||
spin_unlock_irqrestore(&(ieee->reorder_spinlock), flags);
|
||||
//PlatformReleaseSpinLock(Adapter, RT_RX_SPINLOCK);
|
||||
}
|
||||
|
||||
/********************************************************************************************************************
|
||||
*function: Add BA timer function
|
||||
* input: unsigned long data //acturally we send TX_TS_RECORD or RX_TS_RECORD to these timer
|
||||
* return: NULL
|
||||
* notice:
|
||||
********************************************************************************************************************/
|
||||
void TsAddBaProcess(unsigned long data)
|
||||
{
|
||||
PTX_TS_RECORD pTxTs = (PTX_TS_RECORD)data;
|
||||
u8 num = pTxTs->num;
|
||||
struct ieee80211_device *ieee = container_of(pTxTs, struct ieee80211_device, TxTsRecord[num]);
|
||||
|
||||
TsInitAddBA(ieee, pTxTs, BA_POLICY_IMMEDIATE, false);
|
||||
IEEE80211_DEBUG(IEEE80211_DL_BA, "TsAddBaProcess(): ADDBA Req is started!! \n");
|
||||
}
|
||||
|
||||
|
||||
void ResetTsCommonInfo(PTS_COMMON_INFO pTsCommonInfo)
|
||||
{
|
||||
memset(pTsCommonInfo->Addr, 0, 6);
|
||||
memset(&pTsCommonInfo->TSpec, 0, sizeof(TSPEC_BODY));
|
||||
memset(&pTsCommonInfo->TClass, 0, sizeof(QOS_TCLAS)*TCLAS_NUM);
|
||||
pTsCommonInfo->TClasProc = 0;
|
||||
pTsCommonInfo->TClasNum = 0;
|
||||
}
|
||||
|
||||
void ResetTxTsEntry(PTX_TS_RECORD pTS)
|
||||
{
|
||||
ResetTsCommonInfo(&pTS->TsCommonInfo);
|
||||
pTS->TxCurSeq = 0;
|
||||
pTS->bAddBaReqInProgress = false;
|
||||
pTS->bAddBaReqDelayed = false;
|
||||
pTS->bUsingBa = false;
|
||||
ResetBaEntry(&pTS->TxAdmittedBARecord); //For BA Originator
|
||||
ResetBaEntry(&pTS->TxPendingBARecord);
|
||||
}
|
||||
|
||||
void ResetRxTsEntry(PRX_TS_RECORD pTS)
|
||||
{
|
||||
ResetTsCommonInfo(&pTS->TsCommonInfo);
|
||||
pTS->RxIndicateSeq = 0xffff; // This indicate the RxIndicateSeq is not used now!!
|
||||
pTS->RxTimeoutIndicateSeq = 0xffff; // This indicate the RxTimeoutIndicateSeq is not used now!!
|
||||
ResetBaEntry(&pTS->RxAdmittedBARecord); // For BA Recipient
|
||||
}
|
||||
|
||||
void TSInitialize(struct ieee80211_device *ieee)
|
||||
{
|
||||
PTX_TS_RECORD pTxTS = ieee->TxTsRecord;
|
||||
PRX_TS_RECORD pRxTS = ieee->RxTsRecord;
|
||||
PRX_REORDER_ENTRY pRxReorderEntry = ieee->RxReorderEntry;
|
||||
u8 count = 0;
|
||||
IEEE80211_DEBUG(IEEE80211_DL_TS, "==========>%s()\n", __FUNCTION__);
|
||||
// Initialize Tx TS related info.
|
||||
INIT_LIST_HEAD(&ieee->Tx_TS_Admit_List);
|
||||
INIT_LIST_HEAD(&ieee->Tx_TS_Pending_List);
|
||||
INIT_LIST_HEAD(&ieee->Tx_TS_Unused_List);
|
||||
|
||||
for(count = 0; count < TOTAL_TS_NUM; count++)
|
||||
{
|
||||
//
|
||||
pTxTS->num = count;
|
||||
// The timers for the operation of Traffic Stream and Block Ack.
|
||||
// DLS related timer will be add here in the future!!
|
||||
init_timer(&pTxTS->TsCommonInfo.SetupTimer);
|
||||
pTxTS->TsCommonInfo.SetupTimer.data = (unsigned long)pTxTS;
|
||||
pTxTS->TsCommonInfo.SetupTimer.function = TsSetupTimeOut;
|
||||
|
||||
init_timer(&pTxTS->TsCommonInfo.InactTimer);
|
||||
pTxTS->TsCommonInfo.InactTimer.data = (unsigned long)pTxTS;
|
||||
pTxTS->TsCommonInfo.InactTimer.function = TsInactTimeout;
|
||||
|
||||
init_timer(&pTxTS->TsAddBaTimer);
|
||||
pTxTS->TsAddBaTimer.data = (unsigned long)pTxTS;
|
||||
pTxTS->TsAddBaTimer.function = TsAddBaProcess;
|
||||
|
||||
init_timer(&pTxTS->TxPendingBARecord.Timer);
|
||||
pTxTS->TxPendingBARecord.Timer.data = (unsigned long)pTxTS;
|
||||
pTxTS->TxPendingBARecord.Timer.function = BaSetupTimeOut;
|
||||
|
||||
init_timer(&pTxTS->TxAdmittedBARecord.Timer);
|
||||
pTxTS->TxAdmittedBARecord.Timer.data = (unsigned long)pTxTS;
|
||||
pTxTS->TxAdmittedBARecord.Timer.function = TxBaInactTimeout;
|
||||
|
||||
ResetTxTsEntry(pTxTS);
|
||||
list_add_tail(&pTxTS->TsCommonInfo.List, &ieee->Tx_TS_Unused_List);
|
||||
pTxTS++;
|
||||
}
|
||||
|
||||
// Initialize Rx TS related info.
|
||||
INIT_LIST_HEAD(&ieee->Rx_TS_Admit_List);
|
||||
INIT_LIST_HEAD(&ieee->Rx_TS_Pending_List);
|
||||
INIT_LIST_HEAD(&ieee->Rx_TS_Unused_List);
|
||||
for(count = 0; count < TOTAL_TS_NUM; count++)
|
||||
{
|
||||
pRxTS->num = count;
|
||||
INIT_LIST_HEAD(&pRxTS->RxPendingPktList);
|
||||
|
||||
init_timer(&pRxTS->TsCommonInfo.SetupTimer);
|
||||
pRxTS->TsCommonInfo.SetupTimer.data = (unsigned long)pRxTS;
|
||||
pRxTS->TsCommonInfo.SetupTimer.function = TsSetupTimeOut;
|
||||
|
||||
init_timer(&pRxTS->TsCommonInfo.InactTimer);
|
||||
pRxTS->TsCommonInfo.InactTimer.data = (unsigned long)pRxTS;
|
||||
pRxTS->TsCommonInfo.InactTimer.function = TsInactTimeout;
|
||||
|
||||
init_timer(&pRxTS->RxAdmittedBARecord.Timer);
|
||||
pRxTS->RxAdmittedBARecord.Timer.data = (unsigned long)pRxTS;
|
||||
pRxTS->RxAdmittedBARecord.Timer.function = RxBaInactTimeout;
|
||||
|
||||
init_timer(&pRxTS->RxPktPendingTimer);
|
||||
pRxTS->RxPktPendingTimer.data = (unsigned long)pRxTS;
|
||||
pRxTS->RxPktPendingTimer.function = RxPktPendingTimeout;
|
||||
|
||||
ResetRxTsEntry(pRxTS);
|
||||
list_add_tail(&pRxTS->TsCommonInfo.List, &ieee->Rx_TS_Unused_List);
|
||||
pRxTS++;
|
||||
}
|
||||
// Initialize unused Rx Reorder List.
|
||||
INIT_LIST_HEAD(&ieee->RxReorder_Unused_List);
|
||||
//#ifdef TO_DO_LIST
|
||||
for(count = 0; count < REORDER_ENTRY_NUM; count++)
|
||||
{
|
||||
list_add_tail( &pRxReorderEntry->List,&ieee->RxReorder_Unused_List);
|
||||
if(count == (REORDER_ENTRY_NUM-1))
|
||||
break;
|
||||
pRxReorderEntry = &ieee->RxReorderEntry[count+1];
|
||||
}
|
||||
//#endif
|
||||
|
||||
}
|
||||
|
||||
void AdmitTS(struct ieee80211_device *ieee, PTS_COMMON_INFO pTsCommonInfo, u32 InactTime)
|
||||
{
|
||||
del_timer_sync(&pTsCommonInfo->SetupTimer);
|
||||
del_timer_sync(&pTsCommonInfo->InactTimer);
|
||||
|
||||
if(InactTime!=0)
|
||||
mod_timer(&pTsCommonInfo->InactTimer, jiffies + MSECS(InactTime));
|
||||
}
|
||||
|
||||
|
||||
PTS_COMMON_INFO SearchAdmitTRStream(struct ieee80211_device *ieee, u8* Addr, u8 TID, TR_SELECT TxRxSelect)
|
||||
{
|
||||
//DIRECTION_VALUE dir;
|
||||
u8 dir;
|
||||
bool search_dir[4] = {0, 0, 0, 0};
|
||||
struct list_head* psearch_list; //FIXME
|
||||
PTS_COMMON_INFO pRet = NULL;
|
||||
if(ieee->iw_mode == IW_MODE_MASTER) //ap mode
|
||||
{
|
||||
if(TxRxSelect == TX_DIR)
|
||||
{
|
||||
search_dir[DIR_DOWN] = true;
|
||||
search_dir[DIR_BI_DIR]= true;
|
||||
}
|
||||
else
|
||||
{
|
||||
search_dir[DIR_UP] = true;
|
||||
search_dir[DIR_BI_DIR]= true;
|
||||
}
|
||||
}
|
||||
else if(ieee->iw_mode == IW_MODE_ADHOC)
|
||||
{
|
||||
if(TxRxSelect == TX_DIR)
|
||||
search_dir[DIR_UP] = true;
|
||||
else
|
||||
search_dir[DIR_DOWN] = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(TxRxSelect == TX_DIR)
|
||||
{
|
||||
search_dir[DIR_UP] = true;
|
||||
search_dir[DIR_BI_DIR]= true;
|
||||
search_dir[DIR_DIRECT]= true;
|
||||
}
|
||||
else
|
||||
{
|
||||
search_dir[DIR_DOWN] = true;
|
||||
search_dir[DIR_BI_DIR]= true;
|
||||
search_dir[DIR_DIRECT]= true;
|
||||
}
|
||||
}
|
||||
|
||||
if(TxRxSelect == TX_DIR)
|
||||
psearch_list = &ieee->Tx_TS_Admit_List;
|
||||
else
|
||||
psearch_list = &ieee->Rx_TS_Admit_List;
|
||||
|
||||
//for(dir = DIR_UP; dir <= DIR_BI_DIR; dir++)
|
||||
for(dir = 0; dir <= DIR_BI_DIR; dir++)
|
||||
{
|
||||
if(search_dir[dir] ==false )
|
||||
continue;
|
||||
list_for_each_entry(pRet, psearch_list, List){
|
||||
// IEEE80211_DEBUG(IEEE80211_DL_TS, "ADD:%pM, TID:%d, dir:%d\n", pRet->Addr, pRet->TSpec.f.TSInfo.field.ucTSID, pRet->TSpec.f.TSInfo.field.ucDirection);
|
||||
if (memcmp(pRet->Addr, Addr, 6) == 0)
|
||||
if (pRet->TSpec.f.TSInfo.field.ucTSID == TID)
|
||||
if(pRet->TSpec.f.TSInfo.field.ucDirection == dir)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
if(&pRet->List != psearch_list)
|
||||
break;
|
||||
}
|
||||
|
||||
if(&pRet->List != psearch_list){
|
||||
return pRet ;
|
||||
}
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void MakeTSEntry(
|
||||
PTS_COMMON_INFO pTsCommonInfo,
|
||||
u8* Addr,
|
||||
PTSPEC_BODY pTSPEC,
|
||||
PQOS_TCLAS pTCLAS,
|
||||
u8 TCLAS_Num,
|
||||
u8 TCLAS_Proc
|
||||
)
|
||||
{
|
||||
u8 count;
|
||||
|
||||
if(pTsCommonInfo == NULL)
|
||||
return;
|
||||
|
||||
memcpy(pTsCommonInfo->Addr, Addr, 6);
|
||||
|
||||
if(pTSPEC != NULL)
|
||||
memcpy((u8*)(&(pTsCommonInfo->TSpec)), (u8*)pTSPEC, sizeof(TSPEC_BODY));
|
||||
|
||||
for(count = 0; count < TCLAS_Num; count++)
|
||||
memcpy((u8*)(&(pTsCommonInfo->TClass[count])), (u8*)pTCLAS, sizeof(QOS_TCLAS));
|
||||
|
||||
pTsCommonInfo->TClasProc = TCLAS_Proc;
|
||||
pTsCommonInfo->TClasNum = TCLAS_Num;
|
||||
}
|
||||
|
||||
|
||||
bool GetTs(
|
||||
struct ieee80211_device* ieee,
|
||||
PTS_COMMON_INFO *ppTS,
|
||||
u8* Addr,
|
||||
u8 TID,
|
||||
TR_SELECT TxRxSelect, //Rx:1, Tx:0
|
||||
bool bAddNewTs
|
||||
)
|
||||
{
|
||||
u8 UP = 0;
|
||||
//
|
||||
// We do not build any TS for Broadcast or Multicast stream.
|
||||
// So reject these kinds of search here.
|
||||
//
|
||||
if(is_broadcast_ether_addr(Addr) || is_multicast_ether_addr(Addr))
|
||||
{
|
||||
IEEE80211_DEBUG(IEEE80211_DL_ERR, "get TS for Broadcast or Multicast\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (ieee->current_network.qos_data.supported == 0)
|
||||
UP = 0;
|
||||
else
|
||||
{
|
||||
// In WMM case: we use 4 TID only
|
||||
if (!IsACValid(TID))
|
||||
{
|
||||
IEEE80211_DEBUG(IEEE80211_DL_ERR, " in %s(), TID(%d) is not valid\n", __FUNCTION__, TID);
|
||||
return false;
|
||||
}
|
||||
|
||||
switch(TID)
|
||||
{
|
||||
case 0:
|
||||
case 3:
|
||||
UP = 0;
|
||||
break;
|
||||
|
||||
case 1:
|
||||
case 2:
|
||||
UP = 2;
|
||||
break;
|
||||
|
||||
case 4:
|
||||
case 5:
|
||||
UP = 5;
|
||||
break;
|
||||
|
||||
case 6:
|
||||
case 7:
|
||||
UP = 7;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
*ppTS = SearchAdmitTRStream(
|
||||
ieee,
|
||||
Addr,
|
||||
UP,
|
||||
TxRxSelect);
|
||||
if(*ppTS != NULL)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(bAddNewTs == false)
|
||||
{
|
||||
IEEE80211_DEBUG(IEEE80211_DL_TS, "add new TS failed(tid:%d)\n", UP);
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
//
|
||||
// Create a new Traffic stream for current Tx/Rx
|
||||
// This is for EDCA and WMM to add a new TS.
|
||||
// For HCCA or WMMSA, TS cannot be addmit without negotiation.
|
||||
//
|
||||
TSPEC_BODY TSpec;
|
||||
PQOS_TSINFO pTSInfo = &TSpec.f.TSInfo;
|
||||
struct list_head* pUnusedList =
|
||||
(TxRxSelect == TX_DIR)?
|
||||
(&ieee->Tx_TS_Unused_List):
|
||||
(&ieee->Rx_TS_Unused_List);
|
||||
|
||||
struct list_head* pAddmitList =
|
||||
(TxRxSelect == TX_DIR)?
|
||||
(&ieee->Tx_TS_Admit_List):
|
||||
(&ieee->Rx_TS_Admit_List);
|
||||
|
||||
DIRECTION_VALUE Dir = (ieee->iw_mode == IW_MODE_MASTER)?
|
||||
((TxRxSelect==TX_DIR)?DIR_DOWN:DIR_UP):
|
||||
((TxRxSelect==TX_DIR)?DIR_UP:DIR_DOWN);
|
||||
IEEE80211_DEBUG(IEEE80211_DL_TS, "to add Ts\n");
|
||||
if(!list_empty(pUnusedList))
|
||||
{
|
||||
(*ppTS) = list_entry(pUnusedList->next, TS_COMMON_INFO, List);
|
||||
list_del_init(&(*ppTS)->List);
|
||||
if(TxRxSelect==TX_DIR)
|
||||
{
|
||||
PTX_TS_RECORD tmp = container_of(*ppTS, TX_TS_RECORD, TsCommonInfo);
|
||||
ResetTxTsEntry(tmp);
|
||||
}
|
||||
else{
|
||||
PRX_TS_RECORD tmp = container_of(*ppTS, RX_TS_RECORD, TsCommonInfo);
|
||||
ResetRxTsEntry(tmp);
|
||||
}
|
||||
|
||||
IEEE80211_DEBUG(IEEE80211_DL_TS, "to init current TS, UP:%d, Dir:%d, addr:%pM\n", UP, Dir, Addr);
|
||||
// Prepare TS Info releated field
|
||||
pTSInfo->field.ucTrafficType = 0; // Traffic type: WMM is reserved in this field
|
||||
pTSInfo->field.ucTSID = UP; // TSID
|
||||
pTSInfo->field.ucDirection = Dir; // Direction: if there is DirectLink, this need additional consideration.
|
||||
pTSInfo->field.ucAccessPolicy = 1; // Access policy
|
||||
pTSInfo->field.ucAggregation = 0; // Aggregation
|
||||
pTSInfo->field.ucPSB = 0; // Aggregation
|
||||
pTSInfo->field.ucUP = UP; // User priority
|
||||
pTSInfo->field.ucTSInfoAckPolicy = 0; // Ack policy
|
||||
pTSInfo->field.ucSchedule = 0; // Schedule
|
||||
|
||||
MakeTSEntry(*ppTS, Addr, &TSpec, NULL, 0, 0);
|
||||
AdmitTS(ieee, *ppTS, 0);
|
||||
list_add_tail(&((*ppTS)->List), pAddmitList);
|
||||
// if there is DirectLink, we need to do additional operation here!!
|
||||
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
IEEE80211_DEBUG(IEEE80211_DL_ERR, "in function %s() There is not enough TS record to be used!!", __FUNCTION__);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void RemoveTsEntry(
|
||||
struct ieee80211_device* ieee,
|
||||
PTS_COMMON_INFO pTs,
|
||||
TR_SELECT TxRxSelect
|
||||
)
|
||||
{
|
||||
//u32 flags = 0;
|
||||
unsigned long flags = 0;
|
||||
del_timer_sync(&pTs->SetupTimer);
|
||||
del_timer_sync(&pTs->InactTimer);
|
||||
TsInitDelBA(ieee, pTs, TxRxSelect);
|
||||
|
||||
if(TxRxSelect == RX_DIR)
|
||||
{
|
||||
//#ifdef TO_DO_LIST
|
||||
PRX_REORDER_ENTRY pRxReorderEntry;
|
||||
PRX_TS_RECORD pRxTS = (PRX_TS_RECORD)pTs;
|
||||
if(timer_pending(&pRxTS->RxPktPendingTimer))
|
||||
del_timer_sync(&pRxTS->RxPktPendingTimer);
|
||||
|
||||
while(!list_empty(&pRxTS->RxPendingPktList))
|
||||
{
|
||||
// PlatformAcquireSpinLock(Adapter, RT_RX_SPINLOCK);
|
||||
spin_lock_irqsave(&(ieee->reorder_spinlock), flags);
|
||||
//pRxReorderEntry = list_entry(&pRxTS->RxPendingPktList.prev,RX_REORDER_ENTRY,List);
|
||||
pRxReorderEntry = (PRX_REORDER_ENTRY)list_entry(pRxTS->RxPendingPktList.prev,RX_REORDER_ENTRY,List);
|
||||
list_del_init(&pRxReorderEntry->List);
|
||||
{
|
||||
int i = 0;
|
||||
struct ieee80211_rxb * prxb = pRxReorderEntry->prxb;
|
||||
if (unlikely(!prxb))
|
||||
{
|
||||
spin_unlock_irqrestore(&(ieee->reorder_spinlock), flags);
|
||||
return;
|
||||
}
|
||||
for(i =0; i < prxb->nr_subframes; i++) {
|
||||
dev_kfree_skb(prxb->subframes[i]);
|
||||
}
|
||||
kfree(prxb);
|
||||
prxb = NULL;
|
||||
}
|
||||
list_add_tail(&pRxReorderEntry->List,&ieee->RxReorder_Unused_List);
|
||||
//PlatformReleaseSpinLock(Adapter, RT_RX_SPINLOCK);
|
||||
spin_unlock_irqrestore(&(ieee->reorder_spinlock), flags);
|
||||
}
|
||||
|
||||
//#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
PTX_TS_RECORD pTxTS = (PTX_TS_RECORD)pTs;
|
||||
del_timer_sync(&pTxTS->TsAddBaTimer);
|
||||
}
|
||||
}
|
||||
|
||||
void RemovePeerTS(struct ieee80211_device* ieee, u8* Addr)
|
||||
{
|
||||
PTS_COMMON_INFO pTS, pTmpTS;
|
||||
|
||||
printk("===========>RemovePeerTS,%pM\n", Addr);
|
||||
list_for_each_entry_safe(pTS, pTmpTS, &ieee->Tx_TS_Pending_List, List)
|
||||
{
|
||||
if (memcmp(pTS->Addr, Addr, 6) == 0)
|
||||
{
|
||||
RemoveTsEntry(ieee, pTS, TX_DIR);
|
||||
list_del_init(&pTS->List);
|
||||
list_add_tail(&pTS->List, &ieee->Tx_TS_Unused_List);
|
||||
}
|
||||
}
|
||||
|
||||
list_for_each_entry_safe(pTS, pTmpTS, &ieee->Tx_TS_Admit_List, List)
|
||||
{
|
||||
if (memcmp(pTS->Addr, Addr, 6) == 0)
|
||||
{
|
||||
printk("====>remove Tx_TS_admin_list\n");
|
||||
RemoveTsEntry(ieee, pTS, TX_DIR);
|
||||
list_del_init(&pTS->List);
|
||||
list_add_tail(&pTS->List, &ieee->Tx_TS_Unused_List);
|
||||
}
|
||||
}
|
||||
|
||||
list_for_each_entry_safe(pTS, pTmpTS, &ieee->Rx_TS_Pending_List, List)
|
||||
{
|
||||
if (memcmp(pTS->Addr, Addr, 6) == 0)
|
||||
{
|
||||
RemoveTsEntry(ieee, pTS, RX_DIR);
|
||||
list_del_init(&pTS->List);
|
||||
list_add_tail(&pTS->List, &ieee->Rx_TS_Unused_List);
|
||||
}
|
||||
}
|
||||
|
||||
list_for_each_entry_safe(pTS, pTmpTS, &ieee->Rx_TS_Admit_List, List)
|
||||
{
|
||||
if (memcmp(pTS->Addr, Addr, 6) == 0)
|
||||
{
|
||||
RemoveTsEntry(ieee, pTS, RX_DIR);
|
||||
list_del_init(&pTS->List);
|
||||
list_add_tail(&pTS->List, &ieee->Rx_TS_Unused_List);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void RemoveAllTS(struct ieee80211_device* ieee)
|
||||
{
|
||||
PTS_COMMON_INFO pTS, pTmpTS;
|
||||
|
||||
list_for_each_entry_safe(pTS, pTmpTS, &ieee->Tx_TS_Pending_List, List)
|
||||
{
|
||||
RemoveTsEntry(ieee, pTS, TX_DIR);
|
||||
list_del_init(&pTS->List);
|
||||
list_add_tail(&pTS->List, &ieee->Tx_TS_Unused_List);
|
||||
}
|
||||
|
||||
list_for_each_entry_safe(pTS, pTmpTS, &ieee->Tx_TS_Admit_List, List)
|
||||
{
|
||||
RemoveTsEntry(ieee, pTS, TX_DIR);
|
||||
list_del_init(&pTS->List);
|
||||
list_add_tail(&pTS->List, &ieee->Tx_TS_Unused_List);
|
||||
}
|
||||
|
||||
list_for_each_entry_safe(pTS, pTmpTS, &ieee->Rx_TS_Pending_List, List)
|
||||
{
|
||||
RemoveTsEntry(ieee, pTS, RX_DIR);
|
||||
list_del_init(&pTS->List);
|
||||
list_add_tail(&pTS->List, &ieee->Rx_TS_Unused_List);
|
||||
}
|
||||
|
||||
list_for_each_entry_safe(pTS, pTmpTS, &ieee->Rx_TS_Admit_List, List)
|
||||
{
|
||||
RemoveTsEntry(ieee, pTS, RX_DIR);
|
||||
list_del_init(&pTS->List);
|
||||
list_add_tail(&pTS->List, &ieee->Rx_TS_Unused_List);
|
||||
}
|
||||
}
|
||||
|
||||
void TsStartAddBaProcess(struct ieee80211_device* ieee, PTX_TS_RECORD pTxTS)
|
||||
{
|
||||
if(pTxTS->bAddBaReqInProgress == false)
|
||||
{
|
||||
pTxTS->bAddBaReqInProgress = true;
|
||||
if(pTxTS->bAddBaReqDelayed)
|
||||
{
|
||||
IEEE80211_DEBUG(IEEE80211_DL_BA, "TsStartAddBaProcess(): Delayed Start ADDBA after 60 sec!!\n");
|
||||
mod_timer(&pTxTS->TsAddBaTimer, jiffies + MSECS(TS_ADDBA_DELAY));
|
||||
}
|
||||
else
|
||||
{
|
||||
IEEE80211_DEBUG(IEEE80211_DL_BA,"TsStartAddBaProcess(): Immediately Start ADDBA now!!\n");
|
||||
mod_timer(&pTxTS->TsAddBaTimer, jiffies+10); //set 10 ticks
|
||||
}
|
||||
}
|
||||
else
|
||||
IEEE80211_DEBUG(IEEE80211_DL_ERR, "%s()==>BA timer is already added\n", __FUNCTION__);
|
||||
}
|
||||
129
drivers/staging/rtl8192e/internal.h
Normal file
129
drivers/staging/rtl8192e/internal.h
Normal file
|
|
@ -0,0 +1,129 @@
|
|||
/*
|
||||
* Cryptographic API.
|
||||
*
|
||||
* Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation; either version 2 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
*/
|
||||
#ifndef _CRYPTO_INTERNAL_H
|
||||
#define _CRYPTO_INTERNAL_H
|
||||
|
||||
|
||||
#include <linux/version.h>
|
||||
#include "rtl_crypto.h"
|
||||
#include <linux/mm.h>
|
||||
#include <linux/highmem.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,12))
|
||||
#include <asm/hardirq.h>
|
||||
#else
|
||||
#include <linux/hardirq.h>
|
||||
#include <linux/sched.h>
|
||||
#endif
|
||||
#include <asm/kmap_types.h>
|
||||
|
||||
#ifdef BUILT_IN_CRYPTO
|
||||
#ifdef CONFIG_CRYPTO_HMAC
|
||||
#undef CONFIG_CRYPTO_HMAC
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_KMOD
|
||||
#undef CONFIG_KMOD
|
||||
#endif
|
||||
#endif /* BUILT_IN_CRYPTO */
|
||||
|
||||
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,20))
|
||||
#define list_for_each_entry(pos, head, member) \
|
||||
for (pos = list_entry((head)->next, typeof(*pos), member), \
|
||||
prefetch(pos->member.next); \
|
||||
&pos->member != (head); \
|
||||
pos = list_entry(pos->member.next, typeof(*pos), member), \
|
||||
prefetch(pos->member.next))
|
||||
|
||||
static inline void cond_resched(void)
|
||||
{
|
||||
if (need_resched()) {
|
||||
set_current_state(TASK_RUNNING);
|
||||
schedule();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
extern enum km_type crypto_km_types[];
|
||||
|
||||
static inline enum km_type crypto_kmap_type(int out)
|
||||
{
|
||||
return crypto_km_types[(in_softirq() ? 2 : 0) + out];
|
||||
}
|
||||
|
||||
static inline void *crypto_kmap(struct page *page, int out)
|
||||
{
|
||||
return kmap_atomic(page, crypto_kmap_type(out));
|
||||
}
|
||||
|
||||
static inline void crypto_kunmap(void *vaddr, int out)
|
||||
{
|
||||
kunmap_atomic(vaddr, crypto_kmap_type(out));
|
||||
}
|
||||
|
||||
static inline void crypto_yield(struct crypto_tfm *tfm)
|
||||
{
|
||||
if (!in_softirq())
|
||||
cond_resched();
|
||||
}
|
||||
|
||||
static inline void *crypto_tfm_ctx(struct crypto_tfm *tfm)
|
||||
{
|
||||
return (void *)&tfm[1];
|
||||
}
|
||||
|
||||
struct crypto_alg *crypto_alg_lookup(const char *name);
|
||||
|
||||
#ifdef CONFIG_KMOD
|
||||
void crypto_alg_autoload(const char *name);
|
||||
struct crypto_alg *crypto_alg_mod_lookup(const char *name);
|
||||
#else
|
||||
static inline struct crypto_alg *crypto_alg_mod_lookup(const char *name)
|
||||
{
|
||||
return crypto_alg_lookup(name);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_CRYPTO_HMAC
|
||||
int crypto_alloc_hmac_block(struct crypto_tfm *tfm);
|
||||
void crypto_free_hmac_block(struct crypto_tfm *tfm);
|
||||
#else
|
||||
static inline int crypto_alloc_hmac_block(struct crypto_tfm *tfm)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void crypto_free_hmac_block(struct crypto_tfm *tfm)
|
||||
{ }
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
void __init crypto_init_proc(void);
|
||||
#else
|
||||
static inline void crypto_init_proc(void)
|
||||
{ }
|
||||
#endif
|
||||
|
||||
int crypto_init_digest_flags(struct crypto_tfm *tfm, u32 flags);
|
||||
int crypto_init_cipher_flags(struct crypto_tfm *tfm, u32 flags);
|
||||
int crypto_init_compress_flags(struct crypto_tfm *tfm, u32 flags);
|
||||
|
||||
int crypto_init_digest_ops(struct crypto_tfm *tfm);
|
||||
int crypto_init_cipher_ops(struct crypto_tfm *tfm);
|
||||
int crypto_init_compress_ops(struct crypto_tfm *tfm);
|
||||
|
||||
void crypto_exit_digest_ops(struct crypto_tfm *tfm);
|
||||
void crypto_exit_cipher_ops(struct crypto_tfm *tfm);
|
||||
void crypto_exit_compress_ops(struct crypto_tfm *tfm);
|
||||
|
||||
#endif /* _CRYPTO_INTERNAL_H */
|
||||
20
drivers/staging/rtl8192e/kmap_types.h
Normal file
20
drivers/staging/rtl8192e/kmap_types.h
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
#ifndef __KMAP_TYPES_H
|
||||
|
||||
#define __KMAP_TYPES_H
|
||||
|
||||
|
||||
enum km_type {
|
||||
KM_BOUNCE_READ,
|
||||
KM_SKB_SUNRPC_DATA,
|
||||
KM_SKB_DATA_SOFTIRQ,
|
||||
KM_USER0,
|
||||
KM_USER1,
|
||||
KM_BH_IRQ,
|
||||
KM_SOFTIRQ0,
|
||||
KM_SOFTIRQ1,
|
||||
KM_TYPE_NR
|
||||
};
|
||||
|
||||
#define _ASM_KMAP_TYPES_H
|
||||
|
||||
#endif
|
||||
339
drivers/staging/rtl8192e/license
Normal file
339
drivers/staging/rtl8192e/license
Normal file
|
|
@ -0,0 +1,339 @@
|
|||
|
||||
"This software program is licensed subject to the GNU General Public License
|
||||
(GPL). Version 2, June 1991, available at
|
||||
<http:
|
||||
|
||||
GNU General Public License
|
||||
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim copies of this license
|
||||
document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your freedom to
|
||||
share and change it. By contrast, the GNU General Public License is intended
|
||||
to guarantee your freedom to share and change free software--to make sure
|
||||
the software is free for all its users. This General Public License applies
|
||||
to most of the Free Software Foundation's software and to any other program
|
||||
whose authors commit to using it. (Some other Free Software Foundation
|
||||
software is covered by the GNU Library General Public License instead.) You
|
||||
can apply it to your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not price. Our
|
||||
General Public Licenses are designed to make sure that you have the freedom
|
||||
to distribute copies of free software (and charge for this service if you
|
||||
wish), that you receive source code or can get it if you want it, that you
|
||||
can change the software or use pieces of it in new free programs; and that
|
||||
you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid anyone to
|
||||
deny you these rights or to ask you to surrender the rights. These
|
||||
restrictions translate to certain responsibilities for you if you distribute
|
||||
copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether gratis or
|
||||
for a fee, you must give the recipients all the rights that you have. You
|
||||
must make sure that they, too, receive or can get the source code. And you
|
||||
must show them these terms so they know their rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and (2)
|
||||
offer you this license which gives you legal permission to copy, distribute
|
||||
and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain that
|
||||
everyone understands that there is no warranty for this free software. If
|
||||
the software is modified by someone else and passed on, we want its
|
||||
recipients to know that what they have is not the original, so that any
|
||||
problems introduced by others will not reflect on the original authors'
|
||||
reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software patents. We
|
||||
wish to avoid the danger that redistributors of a free program will
|
||||
individually obtain patent licenses, in effect making the program
|
||||
proprietary. To prevent this, we have made it clear that any patent must be
|
||||
licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and modification
|
||||
follow.
|
||||
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains a notice
|
||||
placed by the copyright holder saying it may be distributed under the
|
||||
terms of this General Public License. The "Program", below, refers to any
|
||||
such program or work, and a "work based on the Program" means either the
|
||||
Program or any derivative work under copyright law: that is to say, a
|
||||
work containing the Program or a portion of it, either verbatim or with
|
||||
modifications and/or translated into another language. (Hereinafter,
|
||||
translation is included without limitation in the term "modification".)
|
||||
Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of running
|
||||
the Program is not restricted, and the output from the Program is covered
|
||||
only if its contents constitute a work based on the Program (independent
|
||||
of having been made by running the Program). Whether that is true depends
|
||||
on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's source code
|
||||
as you receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice and
|
||||
disclaimer of warranty; keep intact all the notices that refer to this
|
||||
License and to the absence of any warranty; and give any other recipients
|
||||
of the Program a copy of this License along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and you
|
||||
may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion of it,
|
||||
thus forming a work based on the Program, and copy and distribute such
|
||||
modifications or work under the terms of Section 1 above, provided that
|
||||
you also meet all of these conditions:
|
||||
|
||||
* a) You must cause the modified files to carry prominent notices stating
|
||||
that you changed the files and the date of any change.
|
||||
|
||||
* b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any part
|
||||
thereof, to be licensed as a whole at no charge to all third parties
|
||||
under the terms of this License.
|
||||
|
||||
* c) If the modified program normally reads commands interactively when
|
||||
run, you must cause it, when started running for such interactive
|
||||
use in the most ordinary way, to print or display an announcement
|
||||
including an appropriate copyright notice and a notice that there is
|
||||
no warranty (or else, saying that you provide a warranty) and that
|
||||
users may redistribute the program under these conditions, and
|
||||
telling the user how to view a copy of this License. (Exception: if
|
||||
the Program itself is interactive but does not normally print such
|
||||
an announcement, your work based on the Program is not required to
|
||||
print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If identifiable
|
||||
sections of that work are not derived from the Program, and can be
|
||||
reasonably considered independent and separate works in themselves, then
|
||||
this License, and its terms, do not apply to those sections when you
|
||||
distribute them as separate works. But when you distribute the same
|
||||
sections as part of a whole which is a work based on the Program, the
|
||||
distribution of the whole must be on the terms of this License, whose
|
||||
permissions for other licensees extend to the entire whole, and thus to
|
||||
each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of a
|
||||
storage or distribution medium does not bring the other work under the
|
||||
scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it, under
|
||||
Section 2) in object code or executable form under the terms of Sections
|
||||
1 and 2 above provided that you also do one of the following:
|
||||
|
||||
* a) Accompany it with the complete corresponding machine-readable source
|
||||
code, which must be distributed under the terms of Sections 1 and 2
|
||||
above on a medium customarily used for software interchange; or,
|
||||
|
||||
* b) Accompany it with a written offer, valid for at least three years,
|
||||
to give any third party, for a charge no more than your cost of
|
||||
physically performing source distribution, a complete machine-
|
||||
readable copy of the corresponding source code, to be distributed
|
||||
under the terms of Sections 1 and 2 above on a medium customarily
|
||||
used for software interchange; or,
|
||||
|
||||
* c) Accompany it with the information you received as to the offer to
|
||||
distribute corresponding source code. (This alternative is allowed
|
||||
only for noncommercial distribution and only if you received the
|
||||
program in object code or executable form with such an offer, in
|
||||
accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source code
|
||||
means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to control
|
||||
compilation and installation of the executable. However, as a special
|
||||
exception, the source code distributed need not include anything that is
|
||||
normally distributed (in either source or binary form) with the major
|
||||
components (compiler, kernel, and so on) of the operating system on which
|
||||
the executable runs, unless that component itself accompanies the
|
||||
executable.
|
||||
|
||||
If distribution of executable or object code is made by offering access
|
||||
to copy from a designated place, then offering equivalent access to copy
|
||||
the source code from the same place counts as distribution of the source
|
||||
code, even though third parties are not compelled to copy the source
|
||||
along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program except as
|
||||
expressly provided under this License. Any attempt otherwise to copy,
|
||||
modify, sublicense or distribute the Program is void, and will
|
||||
automatically terminate your rights under this License. However, parties
|
||||
who have received copies, or rights, from you under this License will not
|
||||
have their licenses terminated so long as such parties remain in full
|
||||
compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not signed
|
||||
it. However, nothing else grants you permission to modify or distribute
|
||||
the Program or its derivative works. These actions are prohibited by law
|
||||
if you do not accept this License. Therefore, by modifying or
|
||||
distributing the Program (or any work based on the Program), you
|
||||
indicate your acceptance of this License to do so, and all its terms and
|
||||
conditions for copying, distributing or modifying the Program or works
|
||||
based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further restrictions
|
||||
on the recipients' exercise of the rights granted herein. You are not
|
||||
responsible for enforcing compliance by third parties to this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot distribute
|
||||
so as to satisfy simultaneously your obligations under this License and
|
||||
any other pertinent obligations, then as a consequence you may not
|
||||
distribute the Program at all. For example, if a patent license would
|
||||
not permit royalty-free redistribution of the Program by all those who
|
||||
receive copies directly or indirectly through you, then the only way you
|
||||
could satisfy both it and this License would be to refrain entirely from
|
||||
distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under any
|
||||
particular circumstance, the balance of the section is intended to apply
|
||||
and the section as a whole is intended to apply in other circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is implemented
|
||||
by public license practices. Many people have made generous contributions
|
||||
to the wide range of software distributed through that system in
|
||||
reliance on consistent application of that system; it is up to the
|
||||
author/donor to decide if he or she is willing to distribute software
|
||||
through any other system and a licensee cannot impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to be
|
||||
a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in certain
|
||||
countries either by patents or by copyrighted interfaces, the original
|
||||
copyright holder who places the Program under this License may add an
|
||||
explicit geographical distribution limitation excluding those countries,
|
||||
so that distribution is permitted only in or among countries not thus
|
||||
excluded. In such case, this License incorporates the limitation as if
|
||||
written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions of
|
||||
the General Public License from time to time. Such new versions will be
|
||||
similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and
|
||||
conditions either of that version or of any later version published by
|
||||
the Free Software Foundation. If the Program does not specify a version
|
||||
number of this License, you may choose any version ever published by the
|
||||
Free Software Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free programs
|
||||
whose distribution conditions are different, write to the author to ask
|
||||
for permission. For software which is copyrighted by the Free Software
|
||||
Foundation, write to the Free Software Foundation; we sometimes make
|
||||
exceptions for this. Our decision will be guided by the two goals of
|
||||
preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
|
||||
EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
|
||||
ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH
|
||||
YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
|
||||
NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR
|
||||
DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL
|
||||
DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM
|
||||
(INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED
|
||||
INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF
|
||||
THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR
|
||||
OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it free
|
||||
software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest to
|
||||
attach them to the start of each source file to most effectively convey the
|
||||
exclusion of warranty; and each file should have at least the "copyright"
|
||||
line and a pointer to where the full notice is found.
|
||||
|
||||
one line to give the program's name and an idea of what it does.
|
||||
Copyright (C) yyyy name of author
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the Free
|
||||
Software Foundation; either version 2 of the License, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along with
|
||||
this program; if not, write to the Free Software Foundation, Inc., 59
|
||||
Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this when
|
||||
it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author Gnomovision comes
|
||||
with ABSOLUTELY NO WARRANTY; for details type 'show w'. This is free
|
||||
software, and you are welcome to redistribute it under certain conditions;
|
||||
type 'show c' for details.
|
||||
|
||||
The hypothetical commands 'show w' and 'show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may be
|
||||
called something other than 'show w' and 'show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
'Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
signature of Ty Coon, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Library General Public
|
||||
License instead of this License.
|
||||
415
drivers/staging/rtl8192e/r8190P_def.h
Normal file
415
drivers/staging/rtl8192e/r8190P_def.h
Normal file
|
|
@ -0,0 +1,415 @@
|
|||
/******************************************************************************
|
||||
* Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
|
||||
*
|
||||
* The full GNU General Public License is included in this distribution in the
|
||||
* file called LICENSE.
|
||||
*
|
||||
* Contact Information:
|
||||
* wlanfae <wlanfae@realtek.com>
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
#ifndef R8190P_DEF_H
|
||||
#define R8190P_DEF_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
#define MAX_SILENT_RESET_RX_SLOT_NUM 10
|
||||
|
||||
#define RX_MPDU_QUEUE 0
|
||||
#define RX_CMD_QUEUE 1
|
||||
|
||||
|
||||
typedef enum _rtl819x_loopback{
|
||||
RTL819X_NO_LOOPBACK = 0,
|
||||
RTL819X_MAC_LOOPBACK = 1,
|
||||
RTL819X_DMA_LOOPBACK = 2,
|
||||
RTL819X_CCK_LOOPBACK = 3,
|
||||
}rtl819x_loopback_e;
|
||||
|
||||
|
||||
#define RESET_DELAY_8185 20
|
||||
|
||||
#define RT_IBSS_INT_MASKS (IMR_BcnInt | IMR_BcnInt | IMR_TBDOK | IMR_TBDER)
|
||||
|
||||
#define DESC90_RATE1M 0x00
|
||||
#define DESC90_RATE2M 0x01
|
||||
#define DESC90_RATE5_5M 0x02
|
||||
#define DESC90_RATE11M 0x03
|
||||
#define DESC90_RATE6M 0x04
|
||||
#define DESC90_RATE9M 0x05
|
||||
#define DESC90_RATE12M 0x06
|
||||
#define DESC90_RATE18M 0x07
|
||||
#define DESC90_RATE24M 0x08
|
||||
#define DESC90_RATE36M 0x09
|
||||
#define DESC90_RATE48M 0x0a
|
||||
#define DESC90_RATE54M 0x0b
|
||||
#define DESC90_RATEMCS0 0x00
|
||||
#define DESC90_RATEMCS1 0x01
|
||||
#define DESC90_RATEMCS2 0x02
|
||||
#define DESC90_RATEMCS3 0x03
|
||||
#define DESC90_RATEMCS4 0x04
|
||||
#define DESC90_RATEMCS5 0x05
|
||||
#define DESC90_RATEMCS6 0x06
|
||||
#define DESC90_RATEMCS7 0x07
|
||||
#define DESC90_RATEMCS8 0x08
|
||||
#define DESC90_RATEMCS9 0x09
|
||||
#define DESC90_RATEMCS10 0x0a
|
||||
#define DESC90_RATEMCS11 0x0b
|
||||
#define DESC90_RATEMCS12 0x0c
|
||||
#define DESC90_RATEMCS13 0x0d
|
||||
#define DESC90_RATEMCS14 0x0e
|
||||
#define DESC90_RATEMCS15 0x0f
|
||||
#define DESC90_RATEMCS32 0x20
|
||||
|
||||
#define SHORT_SLOT_TIME 9
|
||||
#define NON_SHORT_SLOT_TIME 20
|
||||
|
||||
|
||||
#define MAX_LINES_HWCONFIG_TXT 1000
|
||||
#define MAX_BYTES_LINE_HWCONFIG_TXT 128
|
||||
|
||||
#define SW_THREE_WIRE 0
|
||||
#define HW_THREE_WIRE 2
|
||||
|
||||
#define BT_DEMO_BOARD 0
|
||||
#define BT_QA_BOARD 1
|
||||
#define BT_FPGA 2
|
||||
|
||||
#define Rx_Smooth_Factor 20
|
||||
|
||||
#define QSLT_BK 0x1
|
||||
#define QSLT_BE 0x0
|
||||
#define QSLT_VI 0x4
|
||||
#define QSLT_VO 0x6
|
||||
#define QSLT_BEACON 0x10
|
||||
#define QSLT_HIGH 0x11
|
||||
#define QSLT_MGNT 0x12
|
||||
#define QSLT_CMD 0x13
|
||||
|
||||
#define NUM_OF_FIRMWARE_QUEUE 10
|
||||
#define NUM_OF_PAGES_IN_FW 0x100
|
||||
#define NUM_OF_PAGE_IN_FW_QUEUE_BK 0x007
|
||||
#define NUM_OF_PAGE_IN_FW_QUEUE_BE 0x0aa
|
||||
#define NUM_OF_PAGE_IN_FW_QUEUE_VI 0x024
|
||||
#define NUM_OF_PAGE_IN_FW_QUEUE_VO 0x007
|
||||
#define NUM_OF_PAGE_IN_FW_QUEUE_HCCA 0
|
||||
#define NUM_OF_PAGE_IN_FW_QUEUE_CMD 0x2
|
||||
#define NUM_OF_PAGE_IN_FW_QUEUE_MGNT 0x10
|
||||
#define NUM_OF_PAGE_IN_FW_QUEUE_HIGH 0
|
||||
#define NUM_OF_PAGE_IN_FW_QUEUE_BCN 0x4
|
||||
#define NUM_OF_PAGE_IN_FW_QUEUE_PUB 0xd
|
||||
|
||||
#define NUM_OF_PAGE_IN_FW_QUEUE_BK_DTM 0x026
|
||||
#define NUM_OF_PAGE_IN_FW_QUEUE_BE_DTM 0x048
|
||||
#define NUM_OF_PAGE_IN_FW_QUEUE_VI_DTM 0x048
|
||||
#define NUM_OF_PAGE_IN_FW_QUEUE_VO_DTM 0x026
|
||||
#define NUM_OF_PAGE_IN_FW_QUEUE_PUB_DTM 0x00
|
||||
|
||||
#define APPLIED_RESERVED_QUEUE_IN_FW 0x80000000
|
||||
#define RSVD_FW_QUEUE_PAGE_BK_SHIFT 0x00
|
||||
#define RSVD_FW_QUEUE_PAGE_BE_SHIFT 0x08
|
||||
#define RSVD_FW_QUEUE_PAGE_VI_SHIFT 0x10
|
||||
#define RSVD_FW_QUEUE_PAGE_VO_SHIFT 0x18
|
||||
#define RSVD_FW_QUEUE_PAGE_MGNT_SHIFT 0x10
|
||||
#define RSVD_FW_QUEUE_PAGE_BCN_SHIFT 0x00
|
||||
#define RSVD_FW_QUEUE_PAGE_PUB_SHIFT 0x08
|
||||
|
||||
#define HAL_PRIME_CHNL_OFFSET_DONT_CARE 0
|
||||
#define HAL_PRIME_CHNL_OFFSET_LOWER 1
|
||||
#define HAL_PRIME_CHNL_OFFSET_UPPER 2
|
||||
|
||||
|
||||
typedef enum _VERSION_8190{
|
||||
VERSION_8190_BD=0x3,
|
||||
VERSION_8190_BE
|
||||
}VERSION_8190,*PVERSION_8190;
|
||||
|
||||
#define IC_VersionCut_C 0x2
|
||||
#define IC_VersionCut_D 0x3
|
||||
#define IC_VersionCut_E 0x4
|
||||
|
||||
typedef enum tag_Rf_OpType
|
||||
{
|
||||
RF_OP_By_SW_3wire = 0,
|
||||
RF_OP_By_FW,
|
||||
RF_OP_MAX
|
||||
}RF_OpType_E;
|
||||
|
||||
|
||||
typedef enum _POWER_SAVE_MODE
|
||||
{
|
||||
POWER_SAVE_MODE_ACTIVE,
|
||||
POWER_SAVE_MODE_SAVE,
|
||||
}POWER_SAVE_MODE;
|
||||
|
||||
typedef enum _INTERFACE_SELECT_8190PCI{
|
||||
INTF_SEL1_MINICARD = 0,
|
||||
INTF_SEL0_PCIE = 1,
|
||||
INTF_SEL2_RSV = 2,
|
||||
INTF_SEL3_RSV = 3,
|
||||
} INTERFACE_SELECT_8190PCI, *PINTERFACE_SELECT_8190PCI;
|
||||
|
||||
typedef struct _BB_REGISTER_DEFINITION{
|
||||
u32 rfintfs;
|
||||
u32 rfintfi;
|
||||
u32 rfintfo;
|
||||
u32 rfintfe;
|
||||
u32 rf3wireOffset;
|
||||
u32 rfLSSI_Select;
|
||||
u32 rfTxGainStage;
|
||||
u32 rfHSSIPara1;
|
||||
u32 rfHSSIPara2;
|
||||
u32 rfSwitchControl;
|
||||
u32 rfAGCControl1;
|
||||
u32 rfAGCControl2;
|
||||
u32 rfRxIQImbalance;
|
||||
u32 rfRxAFE;
|
||||
u32 rfTxIQImbalance;
|
||||
u32 rfTxAFE;
|
||||
u32 rfLSSIReadBack;
|
||||
u32 rfLSSIReadBackPi;
|
||||
}BB_REGISTER_DEFINITION_T, *PBB_REGISTER_DEFINITION_T;
|
||||
|
||||
typedef struct _TX_FWINFO_STRUCUTRE{
|
||||
u8 TxRate:7;
|
||||
u8 CtsEnable:1;
|
||||
u8 RtsRate:7;
|
||||
u8 RtsEnable:1;
|
||||
u8 TxHT:1;
|
||||
u8 Short:1;
|
||||
u8 TxBandwidth:1;
|
||||
u8 TxSubCarrier:2;
|
||||
u8 STBC:2;
|
||||
u8 AllowAggregation:1;
|
||||
u8 RtsHT:1;
|
||||
u8 RtsShort:1;
|
||||
u8 RtsBandwidth:1;
|
||||
u8 RtsSubcarrier:2;
|
||||
u8 RtsSTBC:2;
|
||||
u8 EnableCPUDur:1;
|
||||
|
||||
u32 RxMF:2;
|
||||
u32 RxAMD:3;
|
||||
u32 Reserved1:3;
|
||||
u32 TxAGCOffset:4;
|
||||
u32 TxAGCSign:1;
|
||||
u32 Tx_INFO_RSVD:6;
|
||||
u32 PacketID:13;
|
||||
}TX_FWINFO_T;
|
||||
|
||||
typedef struct _TX_FWINFO_8190PCI{
|
||||
u8 TxRate:7;
|
||||
u8 CtsEnable:1;
|
||||
u8 RtsRate:7;
|
||||
u8 RtsEnable:1;
|
||||
u8 TxHT:1;
|
||||
u8 Short:1;
|
||||
u8 TxBandwidth:1;
|
||||
u8 TxSubCarrier:2;
|
||||
u8 STBC:2;
|
||||
u8 AllowAggregation:1;
|
||||
u8 RtsHT:1;
|
||||
u8 RtsShort:1;
|
||||
u8 RtsBandwidth:1;
|
||||
u8 RtsSubcarrier:2;
|
||||
u8 RtsSTBC:2;
|
||||
u8 EnableCPUDur:1;
|
||||
|
||||
u32 RxMF:2;
|
||||
u32 RxAMD:3;
|
||||
u32 TxPerPktInfoFeedback:1;
|
||||
u32 Reserved1:2;
|
||||
u32 TxAGCOffset:4;
|
||||
u32 TxAGCSign:1;
|
||||
u32 RAW_TXD:1;
|
||||
u32 Retry_Limit:4;
|
||||
u32 Reserved2:1;
|
||||
u32 PacketID:13;
|
||||
|
||||
|
||||
}TX_FWINFO_8190PCI, *PTX_FWINFO_8190PCI;
|
||||
|
||||
|
||||
#define TX_DESC_SIZE 32
|
||||
|
||||
#define TX_DESC_CMD_SIZE 32
|
||||
|
||||
|
||||
#define TX_STATUS_DESC_SIZE 32
|
||||
|
||||
#define TX_FWINFO_SIZE 8
|
||||
|
||||
|
||||
#define RX_DESC_SIZE 16
|
||||
|
||||
#define RX_STATUS_DESC_SIZE 16
|
||||
|
||||
#define RX_DRIVER_INFO_SIZE 8
|
||||
|
||||
typedef struct _LOG_INTERRUPT_8190
|
||||
{
|
||||
u32 nIMR_COMDOK;
|
||||
u32 nIMR_MGNTDOK;
|
||||
u32 nIMR_HIGH;
|
||||
u32 nIMR_VODOK;
|
||||
u32 nIMR_VIDOK;
|
||||
u32 nIMR_BEDOK;
|
||||
u32 nIMR_BKDOK;
|
||||
u32 nIMR_ROK;
|
||||
u32 nIMR_RCOK;
|
||||
u32 nIMR_TBDOK;
|
||||
u32 nIMR_BDOK;
|
||||
u32 nIMR_RXFOVW;
|
||||
} LOG_INTERRUPT_8190_T, *PLOG_INTERRUPT_8190_T;
|
||||
|
||||
typedef struct _phy_ofdm_rx_status_rxsc_sgien_exintfflag{
|
||||
u8 reserved:4;
|
||||
u8 rxsc:2;
|
||||
u8 sgi_en:1;
|
||||
u8 ex_intf_flag:1;
|
||||
}phy_ofdm_rx_status_rxsc_sgien_exintfflag;
|
||||
|
||||
typedef struct _phy_ofdm_rx_status_report_819xpci
|
||||
{
|
||||
u8 trsw_gain_X[4];
|
||||
u8 pwdb_all;
|
||||
u8 cfosho_X[4];
|
||||
u8 cfotail_X[4];
|
||||
u8 rxevm_X[2];
|
||||
u8 rxsnr_X[4];
|
||||
u8 pdsnr_X[2];
|
||||
u8 csi_current_X[2];
|
||||
u8 csi_target_X[2];
|
||||
u8 sigevm;
|
||||
u8 max_ex_pwr;
|
||||
u8 sgi_en;
|
||||
u8 rxsc_sgien_exflg;
|
||||
}phy_sts_ofdm_819xpci_t;
|
||||
|
||||
typedef struct _phy_cck_rx_status_report_819xpci
|
||||
{
|
||||
u8 adc_pwdb_X[4];
|
||||
u8 sq_rpt;
|
||||
u8 cck_agc_rpt;
|
||||
}phy_sts_cck_819xpci_t, phy_sts_cck_8192s_t;
|
||||
|
||||
|
||||
#define PHY_RSSI_SLID_WIN_MAX 100
|
||||
#define PHY_Beacon_RSSI_SLID_WIN_MAX 10
|
||||
|
||||
typedef struct _tx_desc_819x_pci {
|
||||
u16 PktSize;
|
||||
u8 Offset;
|
||||
u8 Reserved1:3;
|
||||
u8 CmdInit:1;
|
||||
u8 LastSeg:1;
|
||||
u8 FirstSeg:1;
|
||||
u8 LINIP:1;
|
||||
u8 OWN:1;
|
||||
|
||||
u8 TxFWInfoSize;
|
||||
u8 RATid:3;
|
||||
u8 DISFB:1;
|
||||
u8 USERATE:1;
|
||||
u8 MOREFRAG:1;
|
||||
u8 NoEnc:1;
|
||||
u8 PIFS:1;
|
||||
u8 QueueSelect:5;
|
||||
u8 NoACM:1;
|
||||
u8 Resv:2;
|
||||
u8 SecCAMID:5;
|
||||
u8 SecDescAssign:1;
|
||||
u8 SecType:2;
|
||||
|
||||
u16 TxBufferSize;
|
||||
u8 PktId:7;
|
||||
u8 Resv1:1;
|
||||
u8 Reserved2;
|
||||
|
||||
u32 TxBuffAddr;
|
||||
|
||||
u32 NextDescAddress;
|
||||
|
||||
u32 Reserved5;
|
||||
u32 Reserved6;
|
||||
u32 Reserved7;
|
||||
}tx_desc, *ptx_desc;
|
||||
|
||||
|
||||
typedef struct _tx_desc_cmd_819x_pci {
|
||||
u16 PktSize;
|
||||
u8 Reserved1;
|
||||
u8 CmdType:3;
|
||||
u8 CmdInit:1;
|
||||
u8 LastSeg:1;
|
||||
u8 FirstSeg:1;
|
||||
u8 LINIP:1;
|
||||
u8 OWN:1;
|
||||
|
||||
u16 ElementReport;
|
||||
u16 Reserved2;
|
||||
|
||||
u16 TxBufferSize;
|
||||
u16 Reserved3;
|
||||
|
||||
u32 TxBuffAddr;
|
||||
u32 NextDescAddress;
|
||||
u32 Reserved4;
|
||||
u32 Reserved5;
|
||||
u32 Reserved6;
|
||||
}tx_desc_cmd, *ptx_desc_cmd;
|
||||
|
||||
typedef struct _rx_desc_819x_pci{
|
||||
u16 Length:14;
|
||||
u16 CRC32:1;
|
||||
u16 ICV:1;
|
||||
u8 RxDrvInfoSize;
|
||||
u8 Shift:2;
|
||||
u8 PHYStatus:1;
|
||||
u8 SWDec:1;
|
||||
u8 LastSeg:1;
|
||||
u8 FirstSeg:1;
|
||||
u8 EOR:1;
|
||||
u8 OWN:1;
|
||||
|
||||
u32 Reserved2;
|
||||
|
||||
u32 Reserved3;
|
||||
|
||||
u32 BufferAddress;
|
||||
|
||||
}rx_desc, *prx_desc;
|
||||
|
||||
|
||||
typedef struct _rx_fwinfo_819x_pci{
|
||||
u16 Reserved1:12;
|
||||
u16 PartAggr:1;
|
||||
u16 FirstAGGR:1;
|
||||
u16 Reserved2:2;
|
||||
|
||||
u8 RxRate:7;
|
||||
u8 RxHT:1;
|
||||
|
||||
u8 BW:1;
|
||||
u8 SPLCP:1;
|
||||
u8 Reserved3:2;
|
||||
u8 PAM:1;
|
||||
u8 Mcast:1;
|
||||
u8 Bcast:1;
|
||||
u8 Reserved4:1;
|
||||
|
||||
u32 TSFL;
|
||||
|
||||
}rx_fwinfo, *prx_fwinfo;
|
||||
|
||||
#endif
|
||||
4538
drivers/staging/rtl8192e/r8190P_hwimg.c
Normal file
4538
drivers/staging/rtl8192e/r8190P_hwimg.c
Normal file
File diff suppressed because it is too large
Load diff
51
drivers/staging/rtl8192e/r8190P_hwimg.h
Normal file
51
drivers/staging/rtl8192e/r8190P_hwimg.h
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
/******************************************************************************
|
||||
* Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
|
||||
*
|
||||
* The full GNU General Public License is included in this distribution in the
|
||||
* file called LICENSE.
|
||||
*
|
||||
* Contact Information:
|
||||
* wlanfae <wlanfae@realtek.com>
|
||||
******************************************************************************/
|
||||
#ifndef __INC_HAL8190Pci_FW_IMG_H
|
||||
#define __INC_HAL8190Pci_FW_IMG_H
|
||||
|
||||
/*Created on 2008/12/ 3, 3:26*/
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
#define BootArrayLengthPci 344
|
||||
extern u8 Rtl8190PciFwBootArray[BootArrayLengthPci];
|
||||
#define MainArrayLengthPci 55388
|
||||
extern u8 Rtl8190PciFwMainArray[MainArrayLengthPci];
|
||||
#define DataArrayLengthPci 2960
|
||||
extern u8 Rtl8190PciFwDataArray[DataArrayLengthPci];
|
||||
#define PHY_REGArrayLengthPci 280
|
||||
extern u32 Rtl8190PciPHY_REGArray[PHY_REGArrayLengthPci];
|
||||
#define PHY_REG_1T2RArrayLengthPci 280
|
||||
extern u32 Rtl8190PciPHY_REG_1T2RArray[PHY_REG_1T2RArrayLengthPci];
|
||||
#define RadioA_ArrayLengthPci 246
|
||||
extern u32 Rtl8190PciRadioA_Array[RadioA_ArrayLengthPci] ;
|
||||
#define RadioB_ArrayLengthPci 78
|
||||
extern u32 Rtl8190PciRadioB_Array[RadioB_ArrayLengthPci] ;
|
||||
#define RadioC_ArrayLengthPci 246
|
||||
extern u32 Rtl8190PciRadioC_Array[RadioC_ArrayLengthPci] ;
|
||||
#define RadioD_ArrayLengthPci 78
|
||||
extern u32 Rtl8190PciRadioD_Array[RadioD_ArrayLengthPci] ;
|
||||
#define MACPHY_ArrayLengthPci 18
|
||||
extern u32 Rtl8190PciMACPHY_Array[MACPHY_ArrayLengthPci] ;
|
||||
#define MACPHY_Array_PGLengthPci 21
|
||||
extern u32 Rtl8190PciMACPHY_Array_PG[MACPHY_Array_PGLengthPci] ;
|
||||
#define AGCTAB_ArrayLengthPci 384
|
||||
extern u32 Rtl8190PciAGCTAB_Array[AGCTAB_ArrayLengthPci] ;
|
||||
|
||||
#endif
|
||||
366
drivers/staging/rtl8192e/r8190P_rtl8256.c
Normal file
366
drivers/staging/rtl8192e/r8190P_rtl8256.c
Normal file
|
|
@ -0,0 +1,366 @@
|
|||
/******************************************************************************
|
||||
* Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
|
||||
*
|
||||
* The full GNU General Public License is included in this distribution in the
|
||||
* file called LICENSE.
|
||||
*
|
||||
* Contact Information:
|
||||
* wlanfae <wlanfae@realtek.com>
|
||||
******************************************************************************/
|
||||
|
||||
#include "rtl_core.h"
|
||||
#ifdef RTL8192SE
|
||||
#include "rtl8192s/r8192S_phyreg.h"
|
||||
#include "rtl8192s/r8192S_phy.h"
|
||||
#else
|
||||
#include "r8192E_phyreg.h"
|
||||
#include "r8192E_phy.h"
|
||||
#endif
|
||||
#include "r8190P_rtl8256.h"
|
||||
|
||||
void PHY_SetRF8256Bandwidth(struct net_device* dev , HT_CHANNEL_WIDTH Bandwidth)
|
||||
{
|
||||
u8 eRFPath;
|
||||
struct r8192_priv *priv = rtllib_priv(dev);
|
||||
|
||||
for (eRFPath = 0; eRFPath <priv->NumTotalRFPath; eRFPath++) {
|
||||
if (!rtl8192_phy_CheckIsLegalRFPath(dev, eRFPath))
|
||||
continue;
|
||||
|
||||
switch (Bandwidth) {
|
||||
case HT_CHANNEL_WIDTH_20:
|
||||
if (priv->card_8192_version == VERSION_8190_BD || priv->card_8192_version == VERSION_8190_BE) {
|
||||
rtl8192_phy_SetRFReg(dev, (RF90_RADIO_PATH_E)eRFPath, 0x0b, bMask12Bits, 0x100);
|
||||
rtl8192_phy_SetRFReg(dev, (RF90_RADIO_PATH_E)eRFPath, 0x2c, bMask12Bits, 0x3d7);
|
||||
rtl8192_phy_SetRFReg(dev, (RF90_RADIO_PATH_E)eRFPath, 0x0e, bMask12Bits, 0x021);
|
||||
|
||||
} else {
|
||||
RT_TRACE(COMP_ERR, "PHY_SetRF8256Bandwidth(): unknown hardware version\n");
|
||||
}
|
||||
|
||||
break;
|
||||
case HT_CHANNEL_WIDTH_20_40:
|
||||
if (priv->card_8192_version == VERSION_8190_BD ||priv->card_8192_version == VERSION_8190_BE) {
|
||||
rtl8192_phy_SetRFReg(dev, (RF90_RADIO_PATH_E)eRFPath, 0x0b, bMask12Bits, 0x300);
|
||||
rtl8192_phy_SetRFReg(dev, (RF90_RADIO_PATH_E)eRFPath, 0x2c, bMask12Bits, 0x3ff);
|
||||
rtl8192_phy_SetRFReg(dev, (RF90_RADIO_PATH_E)eRFPath, 0x0e, bMask12Bits, 0x0e1);
|
||||
|
||||
} else {
|
||||
RT_TRACE(COMP_ERR, "PHY_SetRF8256Bandwidth(): unknown hardware version\n");
|
||||
}
|
||||
|
||||
|
||||
break;
|
||||
default:
|
||||
RT_TRACE(COMP_ERR, "PHY_SetRF8256Bandwidth(): unknown Bandwidth: %#X\n",Bandwidth );
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
bool PHY_RF8256_Config(struct net_device* dev)
|
||||
{
|
||||
struct r8192_priv *priv = rtllib_priv(dev);
|
||||
bool rtStatus = true;
|
||||
priv->NumTotalRFPath = RTL819X_TOTAL_RF_PATH;
|
||||
rtStatus = phy_RF8256_Config_ParaFile(dev);
|
||||
|
||||
return rtStatus;
|
||||
}
|
||||
|
||||
bool phy_RF8256_Config_ParaFile(struct net_device* dev)
|
||||
{
|
||||
u32 u4RegValue = 0;
|
||||
u8 eRFPath;
|
||||
bool rtStatus = true;
|
||||
BB_REGISTER_DEFINITION_T *pPhyReg;
|
||||
struct r8192_priv *priv = rtllib_priv(dev);
|
||||
u32 RegOffSetToBeCheck = 0x3;
|
||||
u32 RegValueToBeCheck = 0x7f1;
|
||||
u32 RF3_Final_Value = 0;
|
||||
u8 ConstRetryTimes = 5, RetryTimes = 5;
|
||||
u8 ret = 0;
|
||||
|
||||
for (eRFPath = (RF90_RADIO_PATH_E)RF90_PATH_A; eRFPath <priv->NumTotalRFPath; eRFPath++) {
|
||||
if (!rtl8192_phy_CheckIsLegalRFPath(dev, eRFPath))
|
||||
continue;
|
||||
|
||||
pPhyReg = &priv->PHYRegDef[eRFPath];
|
||||
|
||||
|
||||
switch (eRFPath) {
|
||||
case RF90_PATH_A:
|
||||
case RF90_PATH_C:
|
||||
u4RegValue = rtl8192_QueryBBReg(dev, pPhyReg->rfintfs, bRFSI_RFENV);
|
||||
break;
|
||||
case RF90_PATH_B :
|
||||
case RF90_PATH_D:
|
||||
u4RegValue = rtl8192_QueryBBReg(dev, pPhyReg->rfintfs, bRFSI_RFENV<<16);
|
||||
break;
|
||||
}
|
||||
|
||||
rtl8192_setBBreg(dev, pPhyReg->rfintfe, bRFSI_RFENV<<16, 0x1);
|
||||
|
||||
rtl8192_setBBreg(dev, pPhyReg->rfintfo, bRFSI_RFENV, 0x1);
|
||||
|
||||
rtl8192_setBBreg(dev, pPhyReg->rfHSSIPara2, b3WireAddressLength, 0x0);
|
||||
rtl8192_setBBreg(dev, pPhyReg->rfHSSIPara2, b3WireDataLength, 0x0);
|
||||
|
||||
rtl8192_phy_SetRFReg(dev, (RF90_RADIO_PATH_E) eRFPath, 0x0, bMask12Bits, 0xbf);
|
||||
|
||||
rtStatus = rtl8192_phy_checkBBAndRF(dev, HW90_BLOCK_RF, (RF90_RADIO_PATH_E)eRFPath);
|
||||
if (rtStatus!= true) {
|
||||
RT_TRACE(COMP_ERR, "PHY_RF8256_Config():Check Radio[%d] Fail!!\n", eRFPath);
|
||||
goto phy_RF8256_Config_ParaFile_Fail;
|
||||
}
|
||||
|
||||
RetryTimes = ConstRetryTimes;
|
||||
RF3_Final_Value = 0;
|
||||
switch (eRFPath) {
|
||||
case RF90_PATH_A:
|
||||
while (RF3_Final_Value!=RegValueToBeCheck && RetryTimes != 0) {
|
||||
ret = rtl8192_phy_ConfigRFWithHeaderFile(dev,(RF90_RADIO_PATH_E)eRFPath);
|
||||
RF3_Final_Value = rtl8192_phy_QueryRFReg(dev, (RF90_RADIO_PATH_E)eRFPath, RegOffSetToBeCheck, bMask12Bits);
|
||||
RT_TRACE(COMP_RF, "RF %d %d register final value: %x\n", eRFPath, RegOffSetToBeCheck, RF3_Final_Value);
|
||||
RetryTimes--;
|
||||
}
|
||||
break;
|
||||
case RF90_PATH_B:
|
||||
while (RF3_Final_Value!=RegValueToBeCheck && RetryTimes != 0) {
|
||||
ret = rtl8192_phy_ConfigRFWithHeaderFile(dev,(RF90_RADIO_PATH_E)eRFPath);
|
||||
RF3_Final_Value = rtl8192_phy_QueryRFReg(dev, (RF90_RADIO_PATH_E)eRFPath, RegOffSetToBeCheck, bMask12Bits);
|
||||
RT_TRACE(COMP_RF, "RF %d %d register final value: %x\n", eRFPath, RegOffSetToBeCheck, RF3_Final_Value);
|
||||
RetryTimes--;
|
||||
}
|
||||
break;
|
||||
case RF90_PATH_C:
|
||||
while (RF3_Final_Value!=RegValueToBeCheck && RetryTimes != 0) {
|
||||
ret = rtl8192_phy_ConfigRFWithHeaderFile(dev,(RF90_RADIO_PATH_E)eRFPath);
|
||||
RF3_Final_Value = rtl8192_phy_QueryRFReg(dev, (RF90_RADIO_PATH_E)eRFPath, RegOffSetToBeCheck, bMask12Bits);
|
||||
RT_TRACE(COMP_RF, "RF %d %d register final value: %x\n", eRFPath, RegOffSetToBeCheck, RF3_Final_Value);
|
||||
RetryTimes--;
|
||||
}
|
||||
break;
|
||||
case RF90_PATH_D:
|
||||
while (RF3_Final_Value!=RegValueToBeCheck && RetryTimes != 0) {
|
||||
ret = rtl8192_phy_ConfigRFWithHeaderFile(dev,(RF90_RADIO_PATH_E)eRFPath);
|
||||
RF3_Final_Value = rtl8192_phy_QueryRFReg(dev, (RF90_RADIO_PATH_E)eRFPath, RegOffSetToBeCheck, bMask12Bits);
|
||||
RT_TRACE(COMP_RF, "RF %d %d register final value: %x\n", eRFPath, RegOffSetToBeCheck, RF3_Final_Value);
|
||||
RetryTimes--;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
switch (eRFPath) {
|
||||
case RF90_PATH_A:
|
||||
case RF90_PATH_C:
|
||||
rtl8192_setBBreg(dev, pPhyReg->rfintfs, bRFSI_RFENV, u4RegValue);
|
||||
break;
|
||||
case RF90_PATH_B :
|
||||
case RF90_PATH_D:
|
||||
rtl8192_setBBreg(dev, pPhyReg->rfintfs, bRFSI_RFENV<<16, u4RegValue);
|
||||
break;
|
||||
}
|
||||
|
||||
if (ret) {
|
||||
RT_TRACE(COMP_ERR, "phy_RF8256_Config_ParaFile():Radio[%d] Fail!!", eRFPath);
|
||||
goto phy_RF8256_Config_ParaFile_Fail;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
RT_TRACE(COMP_PHY, "PHY Initialization Success\n") ;
|
||||
return true;
|
||||
|
||||
phy_RF8256_Config_ParaFile_Fail:
|
||||
RT_TRACE(COMP_ERR, "PHY Initialization failed\n") ;
|
||||
return false;
|
||||
}
|
||||
|
||||
#ifndef RTL8192SE
|
||||
void PHY_SetRF8256CCKTxPower(struct net_device* dev, u8 powerlevel)
|
||||
{
|
||||
u32 TxAGC=0;
|
||||
struct r8192_priv *priv = rtllib_priv(dev);
|
||||
#ifdef RTL8190P
|
||||
u8 byte0, byte1;
|
||||
|
||||
TxAGC |= ((powerlevel<<8)|powerlevel);
|
||||
TxAGC += priv->CCKTxPowerLevelOriginalOffset;
|
||||
|
||||
if (priv->bDynamicTxLowPower == true
|
||||
/*pMgntInfo->bScanInProgress == true*/ )
|
||||
{
|
||||
if (priv->CustomerID == RT_CID_819x_Netcore)
|
||||
TxAGC = 0x2222;
|
||||
else
|
||||
TxAGC += ((priv->CckPwEnl<<8)|priv->CckPwEnl);
|
||||
}
|
||||
|
||||
byte0 = (u8)(TxAGC & 0xff);
|
||||
byte1 = (u8)((TxAGC & 0xff00)>>8);
|
||||
if (byte0 > 0x24)
|
||||
byte0 = 0x24;
|
||||
if (byte1 > 0x24)
|
||||
byte1 = 0x24;
|
||||
if (priv->rf_type == RF_2T4R)
|
||||
{
|
||||
if (priv->RF_C_TxPwDiff > 0)
|
||||
{
|
||||
if ( (byte0 + (u8)priv->RF_C_TxPwDiff) > 0x24)
|
||||
byte0 = 0x24 - priv->RF_C_TxPwDiff;
|
||||
if ( (byte1 + (u8)priv->RF_C_TxPwDiff) > 0x24)
|
||||
byte1 = 0x24 - priv->RF_C_TxPwDiff;
|
||||
}
|
||||
}
|
||||
TxAGC = (byte1<<8) |byte0;
|
||||
write_nic_dword(dev, CCK_TXAGC, TxAGC);
|
||||
#else
|
||||
#ifdef RTL8192E
|
||||
|
||||
TxAGC = powerlevel;
|
||||
if (priv->bDynamicTxLowPower == true)
|
||||
{
|
||||
if (priv->CustomerID == RT_CID_819x_Netcore)
|
||||
TxAGC = 0x22;
|
||||
else
|
||||
TxAGC += priv->CckPwEnl;
|
||||
}
|
||||
if (TxAGC > 0x24)
|
||||
TxAGC = 0x24;
|
||||
rtl8192_setBBreg(dev, rTxAGC_CCK_Mcs32, bTxAGCRateCCK, TxAGC);
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
void PHY_SetRF8256OFDMTxPower(struct net_device* dev, u8 powerlevel)
|
||||
{
|
||||
struct r8192_priv *priv = rtllib_priv(dev);
|
||||
#ifdef RTL8190P
|
||||
u32 TxAGC1=0, TxAGC2=0, TxAGC2_tmp = 0;
|
||||
u8 i, byteVal1[4], byteVal2[4], byteVal3[4];
|
||||
|
||||
if (priv->bDynamicTxHighPower == true)
|
||||
{
|
||||
TxAGC1 |= ((powerlevel<<24)|(powerlevel<<16)|(powerlevel<<8)|powerlevel);
|
||||
TxAGC2_tmp = TxAGC1;
|
||||
|
||||
TxAGC1 += priv->MCSTxPowerLevelOriginalOffset[0];
|
||||
TxAGC2 =0x03030303;
|
||||
|
||||
TxAGC2_tmp += priv->MCSTxPowerLevelOriginalOffset[1];
|
||||
}
|
||||
else
|
||||
{
|
||||
TxAGC1 |= ((powerlevel<<24)|(powerlevel<<16)|(powerlevel<<8)|powerlevel);
|
||||
TxAGC2 = TxAGC1;
|
||||
|
||||
TxAGC1 += priv->MCSTxPowerLevelOriginalOffset[0];
|
||||
TxAGC2 += priv->MCSTxPowerLevelOriginalOffset[1];
|
||||
|
||||
TxAGC2_tmp = TxAGC2;
|
||||
|
||||
}
|
||||
for (i=0; i<4; i++)
|
||||
{
|
||||
byteVal1[i] = (u8)( (TxAGC1 & (0xff<<(i*8))) >>(i*8) );
|
||||
if (byteVal1[i] > 0x24)
|
||||
byteVal1[i] = 0x24;
|
||||
byteVal2[i] = (u8)( (TxAGC2 & (0xff<<(i*8))) >>(i*8) );
|
||||
if (byteVal2[i] > 0x24)
|
||||
byteVal2[i] = 0x24;
|
||||
|
||||
byteVal3[i] = (u8)( (TxAGC2_tmp & (0xff<<(i*8))) >>(i*8) );
|
||||
if (byteVal3[i] > 0x24)
|
||||
byteVal3[i] = 0x24;
|
||||
}
|
||||
|
||||
if (priv->rf_type == RF_2T4R)
|
||||
{
|
||||
if (priv->RF_C_TxPwDiff > 0)
|
||||
{
|
||||
for (i=0; i<4; i++)
|
||||
{
|
||||
if ( (byteVal1[i] + (u8)priv->RF_C_TxPwDiff) > 0x24)
|
||||
byteVal1[i] = 0x24 - priv->RF_C_TxPwDiff;
|
||||
if ( (byteVal2[i] + (u8)priv->RF_C_TxPwDiff) > 0x24)
|
||||
byteVal2[i] = 0x24 - priv->RF_C_TxPwDiff;
|
||||
if ( (byteVal3[i] + (u8)priv->RF_C_TxPwDiff) > 0x24)
|
||||
byteVal3[i] = 0x24 - priv->RF_C_TxPwDiff;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TxAGC1 = (byteVal1[3]<<24) | (byteVal1[2]<<16) |(byteVal1[1]<<8) |byteVal1[0];
|
||||
TxAGC2 = (byteVal2[3]<<24) | (byteVal2[2]<<16) |(byteVal2[1]<<8) |byteVal2[0];
|
||||
|
||||
TxAGC2_tmp = (byteVal3[3]<<24) | (byteVal3[2]<<16) |(byteVal3[1]<<8) |byteVal3[0];
|
||||
priv->Pwr_Track = TxAGC2_tmp;
|
||||
|
||||
write_nic_dword(dev, MCS_TXAGC, TxAGC1);
|
||||
write_nic_dword(dev, MCS_TXAGC+4, TxAGC2);
|
||||
#else
|
||||
#ifdef RTL8192E
|
||||
u32 writeVal, powerBase0, powerBase1, writeVal_tmp;
|
||||
u8 index = 0;
|
||||
u16 RegOffset[6] = {0xe00, 0xe04, 0xe10, 0xe14, 0xe18, 0xe1c};
|
||||
u8 byte0, byte1, byte2, byte3;
|
||||
|
||||
powerBase0 = powerlevel + priv->LegacyHTTxPowerDiff;
|
||||
powerBase0 = (powerBase0<<24) | (powerBase0<<16) |(powerBase0<<8) |powerBase0;
|
||||
powerBase1 = powerlevel;
|
||||
powerBase1 = (powerBase1<<24) | (powerBase1<<16) |(powerBase1<<8) |powerBase1;
|
||||
|
||||
for (index=0; index<6; index++)
|
||||
{
|
||||
writeVal = (u32)(priv->MCSTxPowerLevelOriginalOffset[index] + ((index<2)?powerBase0:powerBase1));
|
||||
byte0 = (u8)(writeVal & 0x7f);
|
||||
byte1 = (u8)((writeVal & 0x7f00)>>8);
|
||||
byte2 = (u8)((writeVal & 0x7f0000)>>16);
|
||||
byte3 = (u8)((writeVal & 0x7f000000)>>24);
|
||||
if (byte0 > 0x24)
|
||||
byte0 = 0x24;
|
||||
if (byte1 > 0x24)
|
||||
byte1 = 0x24;
|
||||
if (byte2 > 0x24)
|
||||
byte2 = 0x24;
|
||||
if (byte3 > 0x24)
|
||||
byte3 = 0x24;
|
||||
|
||||
if (index == 3)
|
||||
{
|
||||
writeVal_tmp = (byte3<<24) | (byte2<<16) |(byte1<<8) |byte0;
|
||||
priv->Pwr_Track = writeVal_tmp;
|
||||
}
|
||||
|
||||
if (priv->bDynamicTxHighPower == true)
|
||||
{
|
||||
writeVal = 0x03030303;
|
||||
}
|
||||
else
|
||||
{
|
||||
writeVal = (byte3<<24) | (byte2<<16) |(byte1<<8) |byte0;
|
||||
}
|
||||
rtl8192_setBBreg(dev, RegOffset[index], 0x7f7f7f7f, writeVal);
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue