Commit 66cd8d6e authored by Bartlomiej Zolnierkiewicz's avatar Bartlomiej Zolnierkiewicz Committed by Greg Kroah-Hartman

Staging: rt28x0: run *.c files through Lindent

Signed-off-by: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 460bb8df
...@@ -39,12 +39,10 @@ ...@@ -39,12 +39,10 @@
#include "../rt_config.h" #include "../rt_config.h"
#ifndef RTMP_RF_RW_SUPPORT #ifndef RTMP_RF_RW_SUPPORT
#error "You Should Enable compile flag RTMP_RF_RW_SUPPORT for this chip" #error "You Should Enable compile flag RTMP_RF_RW_SUPPORT for this chip"
#endif // RTMP_RF_RW_SUPPORT // #endif // RTMP_RF_RW_SUPPORT //
VOID NICInitRT3070RFRegisters(IN PRTMP_ADAPTER pAd) VOID NICInitRT3070RFRegisters(IN PRTMP_ADAPTER pAd)
{ {
INT i; INT i;
...@@ -52,61 +50,55 @@ VOID NICInitRT3070RFRegisters(IN PRTMP_ADAPTER pAd) ...@@ -52,61 +50,55 @@ VOID NICInitRT3070RFRegisters(IN PRTMP_ADAPTER pAd)
// Driver must read EEPROM to get RfIcType before initial RF registers // Driver must read EEPROM to get RfIcType before initial RF registers
// Initialize RF register to default value // Initialize RF register to default value
if (IS_RT3070(pAd) || IS_RT3071(pAd)) if (IS_RT3070(pAd) || IS_RT3071(pAd)) {
{
// Init RF calibration // Init RF calibration
// Driver should toggle RF R30 bit7 before init RF registers // Driver should toggle RF R30 bit7 before init RF registers
UINT32 RfReg = 0; UINT32 RfReg = 0;
UINT32 data; UINT32 data;
RT30xxReadRFRegister(pAd, RF_R30, (PUCHAR)&RfReg); RT30xxReadRFRegister(pAd, RF_R30, (PUCHAR) & RfReg);
RfReg |= 0x80; RfReg |= 0x80;
RT30xxWriteRFRegister(pAd, RF_R30, (UCHAR)RfReg); RT30xxWriteRFRegister(pAd, RF_R30, (UCHAR) RfReg);
RTMPusecDelay(1000); RTMPusecDelay(1000);
RfReg &= 0x7F; RfReg &= 0x7F;
RT30xxWriteRFRegister(pAd, RF_R30, (UCHAR)RfReg); RT30xxWriteRFRegister(pAd, RF_R30, (UCHAR) RfReg);
// Initialize RF register to default value // Initialize RF register to default value
for (i = 0; i < NUM_RF_REG_PARMS; i++) for (i = 0; i < NUM_RF_REG_PARMS; i++) {
{ RT30xxWriteRFRegister(pAd,
RT30xxWriteRFRegister(pAd, RT30xx_RFRegTable[i].Register, RT30xx_RFRegTable[i].Value); RT30xx_RFRegTable[i].Register,
RT30xx_RFRegTable[i].Value);
} }
// add by johnli // add by johnli
if (IS_RT3070(pAd)) if (IS_RT3070(pAd)) {
{
// //
// The DAC issue(LDO_CFG0) has been fixed in RT3070(F). // The DAC issue(LDO_CFG0) has been fixed in RT3070(F).
// The voltage raising patch is no longer needed for RT3070(F) // The voltage raising patch is no longer needed for RT3070(F)
// //
if ((pAd->MACVersion & 0xffff) < 0x0201) if ((pAd->MACVersion & 0xffff) < 0x0201) {
{
// Update MAC 0x05D4 from 01xxxxxx to 0Dxxxxxx (voltage 1.2V to 1.35V) for RT3070 to improve yield rate // Update MAC 0x05D4 from 01xxxxxx to 0Dxxxxxx (voltage 1.2V to 1.35V) for RT3070 to improve yield rate
RTUSBReadMACRegister(pAd, LDO_CFG0, &data); RTUSBReadMACRegister(pAd, LDO_CFG0, &data);
data = ((data & 0xF0FFFFFF) | 0x0D000000); data = ((data & 0xF0FFFFFF) | 0x0D000000);
RTUSBWriteMACRegister(pAd, LDO_CFG0, data); RTUSBWriteMACRegister(pAd, LDO_CFG0, data);
} }
} } else if (IS_RT3071(pAd)) {
else if (IS_RT3071(pAd))
{
// Driver should set RF R6 bit6 on before init RF registers // Driver should set RF R6 bit6 on before init RF registers
RT30xxReadRFRegister(pAd, RF_R06, (PUCHAR)&RfReg); RT30xxReadRFRegister(pAd, RF_R06, (PUCHAR) & RfReg);
RfReg |= 0x40; RfReg |= 0x40;
RT30xxWriteRFRegister(pAd, RF_R06, (UCHAR)RfReg); RT30xxWriteRFRegister(pAd, RF_R06, (UCHAR) RfReg);
// init R31 // init R31
RT30xxWriteRFRegister(pAd, RF_R31, 0x14); RT30xxWriteRFRegister(pAd, RF_R31, 0x14);
// RT3071 version E has fixed this issue // RT3071 version E has fixed this issue
if ((pAd->NicConfig2.field.DACTestBit == 1) && ((pAd->MACVersion & 0xffff) < 0x0211)) if ((pAd->NicConfig2.field.DACTestBit == 1)
{ && ((pAd->MACVersion & 0xffff) < 0x0211)) {
// patch tx EVM issue temporarily // patch tx EVM issue temporarily
RTUSBReadMACRegister(pAd, LDO_CFG0, &data); RTUSBReadMACRegister(pAd, LDO_CFG0, &data);
data = ((data & 0xE0FFFFFF) | 0x0D000000); data = ((data & 0xE0FFFFFF) | 0x0D000000);
RTUSBWriteMACRegister(pAd, LDO_CFG0, data); RTUSBWriteMACRegister(pAd, LDO_CFG0, data);
} } else {
else
{
RTMP_IO_READ32(pAd, LDO_CFG0, &data); RTMP_IO_READ32(pAd, LDO_CFG0, &data);
data = ((data & 0xE0FFFFFF) | 0x01000000); data = ((data & 0xE0FFFFFF) | 0x01000000);
RTMP_IO_WRITE32(pAd, LDO_CFG0, data); RTMP_IO_WRITE32(pAd, LDO_CFG0, data);
...@@ -117,7 +109,6 @@ VOID NICInitRT3070RFRegisters(IN PRTMP_ADAPTER pAd) ...@@ -117,7 +109,6 @@ VOID NICInitRT3070RFRegisters(IN PRTMP_ADAPTER pAd)
data &= ~(0x20); data &= ~(0x20);
RTUSBWriteMACRegister(pAd, GPIO_SWITCH, data); RTUSBWriteMACRegister(pAd, GPIO_SWITCH, data);
} }
//For RF filter Calibration //For RF filter Calibration
RTMPFilterCalibration(pAd); RTMPFilterCalibration(pAd);
...@@ -126,15 +117,12 @@ VOID NICInitRT3070RFRegisters(IN PRTMP_ADAPTER pAd) ...@@ -126,15 +117,12 @@ VOID NICInitRT3070RFRegisters(IN PRTMP_ADAPTER pAd)
// TX to RX IQ glitch(RF_R27) has been fixed in RT3070(F). // TX to RX IQ glitch(RF_R27) has been fixed in RT3070(F).
// Raising RF voltage is no longer needed for RT3070(F) // Raising RF voltage is no longer needed for RT3070(F)
// //
if ((IS_RT3070(pAd)) && ((pAd->MACVersion & 0xffff) < 0x0201)) if ((IS_RT3070(pAd)) && ((pAd->MACVersion & 0xffff) < 0x0201)) {
{
RT30xxWriteRFRegister(pAd, RF_R27, 0x3); RT30xxWriteRFRegister(pAd, RF_R27, 0x3);
} } else if ((IS_RT3071(pAd))
else if ((IS_RT3071(pAd)) && ((pAd->MACVersion & 0xffff) < 0x0211)) && ((pAd->MACVersion & 0xffff) < 0x0211)) {
{
RT30xxWriteRFRegister(pAd, RF_R27, 0x3); RT30xxWriteRFRegister(pAd, RF_R27, 0x3);
} }
// set led open drain enable // set led open drain enable
RTUSBReadMACRegister(pAd, OPT_14, &data); RTUSBReadMACRegister(pAd, OPT_14, &data);
data |= 0x01; data |= 0x01;
...@@ -145,29 +133,25 @@ VOID NICInitRT3070RFRegisters(IN PRTMP_ADAPTER pAd) ...@@ -145,29 +133,25 @@ VOID NICInitRT3070RFRegisters(IN PRTMP_ADAPTER pAd)
RT30xxReadRFRegister(pAd, RF_R17, &RFValue); RT30xxReadRFRegister(pAd, RF_R17, &RFValue);
RFValue &= (~0x08); RFValue &= (~0x08);
// to fix rx long range issue // to fix rx long range issue
if (pAd->NicConfig2.field.ExternalLNAForG == 0) if (pAd->NicConfig2.field.ExternalLNAForG == 0) {
{ if ((IS_RT3071(pAd)
if ((IS_RT3071(pAd) && ((pAd->MACVersion & 0xffff) >= 0x0211)) || IS_RT3070(pAd)) && ((pAd->MACVersion & 0xffff) >= 0x0211))
{ || IS_RT3070(pAd)) {
RFValue |= 0x20; RFValue |= 0x20;
} }
} }
// set RF_R17_bit[2:0] equal to EEPROM setting at 0x48h // set RF_R17_bit[2:0] equal to EEPROM setting at 0x48h
if (pAd->TxMixerGain24G >= 1) if (pAd->TxMixerGain24G >= 1) {
{
RFValue &= (~0x7); // clean bit [2:0] RFValue &= (~0x7); // clean bit [2:0]
RFValue |= pAd->TxMixerGain24G; RFValue |= pAd->TxMixerGain24G;
} }
RT30xxWriteRFRegister(pAd, RF_R17, RFValue); RT30xxWriteRFRegister(pAd, RF_R17, RFValue);
if (IS_RT3071(pAd)) if (IS_RT3071(pAd)) {
{
// add by johnli, RF power sequence setup, load RF normal operation-mode setup // add by johnli, RF power sequence setup, load RF normal operation-mode setup
RT30xxLoadRFNormalModeSetup(pAd); RT30xxLoadRFNormalModeSetup(pAd);
} } else if (IS_RT3070(pAd)) {
else if (IS_RT3070(pAd)) /* add by johnli, reset RF_R27 when interface down & up to fix throughput problem */
{
/* add by johnli, reset RF_R27 when interface down & up to fix throughput problem*/
// LDORF_VC, RF R27 register Bit 2 to 0 // LDORF_VC, RF R27 register Bit 2 to 0
RT30xxReadRFRegister(pAd, RF_R27, &RFValue); RT30xxReadRFRegister(pAd, RF_R27, &RFValue);
// TX to RX IQ glitch(RF_R27) has been fixed in RT3070(F). // TX to RX IQ glitch(RF_R27) has been fixed in RT3070(F).
......
...@@ -39,44 +39,39 @@ ...@@ -39,44 +39,39 @@
#include "../rt_config.h" #include "../rt_config.h"
#ifndef RTMP_RF_RW_SUPPORT #ifndef RTMP_RF_RW_SUPPORT
#error "You Should Enable compile flag RTMP_RF_RW_SUPPORT for this chip" #error "You Should Enable compile flag RTMP_RF_RW_SUPPORT for this chip"
#endif // RTMP_RF_RW_SUPPORT // #endif // RTMP_RF_RW_SUPPORT //
VOID NICInitRT3090RFRegisters(IN PRTMP_ADAPTER pAd) VOID NICInitRT3090RFRegisters(IN PRTMP_ADAPTER pAd)
{ {
INT i; INT i;
// Driver must read EEPROM to get RfIcType before initial RF registers // Driver must read EEPROM to get RfIcType before initial RF registers
// Initialize RF register to default value // Initialize RF register to default value
if (IS_RT3090(pAd)) if (IS_RT3090(pAd)) {
{
// Init RF calibration // Init RF calibration
// Driver should toggle RF R30 bit7 before init RF registers // Driver should toggle RF R30 bit7 before init RF registers
UINT32 RfReg = 0, data; UINT32 RfReg = 0, data;
RT30xxReadRFRegister(pAd, RF_R30, (PUCHAR)&RfReg); RT30xxReadRFRegister(pAd, RF_R30, (PUCHAR) & RfReg);
RfReg |= 0x80; RfReg |= 0x80;
RT30xxWriteRFRegister(pAd, RF_R30, (UCHAR)RfReg); RT30xxWriteRFRegister(pAd, RF_R30, (UCHAR) RfReg);
RTMPusecDelay(1000); RTMPusecDelay(1000);
RfReg &= 0x7F; RfReg &= 0x7F;
RT30xxWriteRFRegister(pAd, RF_R30, (UCHAR)RfReg); RT30xxWriteRFRegister(pAd, RF_R30, (UCHAR) RfReg);
// init R24, R31 // init R24, R31
RT30xxWriteRFRegister(pAd, RF_R24, 0x0F); RT30xxWriteRFRegister(pAd, RF_R24, 0x0F);
RT30xxWriteRFRegister(pAd, RF_R31, 0x0F); RT30xxWriteRFRegister(pAd, RF_R31, 0x0F);
// RT309x version E has fixed this issue // RT309x version E has fixed this issue
if ((pAd->NicConfig2.field.DACTestBit == 1) && ((pAd->MACVersion & 0xffff) < 0x0211)) if ((pAd->NicConfig2.field.DACTestBit == 1)
{ && ((pAd->MACVersion & 0xffff) < 0x0211)) {
// patch tx EVM issue temporarily // patch tx EVM issue temporarily
RTMP_IO_READ32(pAd, LDO_CFG0, &data); RTMP_IO_READ32(pAd, LDO_CFG0, &data);
data = ((data & 0xE0FFFFFF) | 0x0D000000); data = ((data & 0xE0FFFFFF) | 0x0D000000);
RTMP_IO_WRITE32(pAd, LDO_CFG0, data); RTMP_IO_WRITE32(pAd, LDO_CFG0, data);
} } else {
else
{
RTMP_IO_READ32(pAd, LDO_CFG0, &data); RTMP_IO_READ32(pAd, LDO_CFG0, &data);
data = ((data & 0xE0FFFFFF) | 0x01000000); data = ((data & 0xE0FFFFFF) | 0x01000000);
RTMP_IO_WRITE32(pAd, LDO_CFG0, data); RTMP_IO_WRITE32(pAd, LDO_CFG0, data);
...@@ -88,15 +83,16 @@ VOID NICInitRT3090RFRegisters(IN PRTMP_ADAPTER pAd) ...@@ -88,15 +83,16 @@ VOID NICInitRT3090RFRegisters(IN PRTMP_ADAPTER pAd)
RTMP_IO_WRITE32(pAd, GPIO_SWITCH, data); RTMP_IO_WRITE32(pAd, GPIO_SWITCH, data);
// Initialize RF register to default value // Initialize RF register to default value
for (i = 0; i < NUM_RF_REG_PARMS; i++) for (i = 0; i < NUM_RF_REG_PARMS; i++) {
{ RT30xxWriteRFRegister(pAd,
RT30xxWriteRFRegister(pAd, RT30xx_RFRegTable[i].Register, RT30xx_RFRegTable[i].Value); RT30xx_RFRegTable[i].Register,
RT30xx_RFRegTable[i].Value);
} }
// Driver should set RF R6 bit6 on before calibration // Driver should set RF R6 bit6 on before calibration
RT30xxReadRFRegister(pAd, RF_R06, (PUCHAR)&RfReg); RT30xxReadRFRegister(pAd, RF_R06, (PUCHAR) & RfReg);
RfReg |= 0x40; RfReg |= 0x40;
RT30xxWriteRFRegister(pAd, RF_R06, (UCHAR)RfReg); RT30xxWriteRFRegister(pAd, RF_R06, (UCHAR) RfReg);
//For RF filter Calibration //For RF filter Calibration
RTMPFilterCalibration(pAd); RTMPFilterCalibration(pAd);
......
...@@ -35,55 +35,67 @@ ...@@ -35,55 +35,67 @@
-------- ---------- ---------------------------------------------- -------- ---------- ----------------------------------------------
*/ */
#ifdef RT30xx #ifdef RT30xx
#ifndef RTMP_RF_RW_SUPPORT #ifndef RTMP_RF_RW_SUPPORT
#error "You Should Enable compile flag RTMP_RF_RW_SUPPORT for this chip" #error "You Should Enable compile flag RTMP_RF_RW_SUPPORT for this chip"
#endif // RTMP_RF_RW_SUPPORT // #endif // RTMP_RF_RW_SUPPORT //
#include "../rt_config.h" #include "../rt_config.h"
// //
// RF register initialization set // RF register initialization set
// //
REG_PAIR RT30xx_RFRegTable[] = { REG_PAIR RT30xx_RFRegTable[] = {
{RF_R04, 0x40}, {RF_R04, 0x40}
{RF_R05, 0x03}, ,
{RF_R06, 0x02}, {RF_R05, 0x03}
{RF_R07, 0x70}, ,
{RF_R09, 0x0F}, {RF_R06, 0x02}
{RF_R10, 0x41}, ,
{RF_R11, 0x21}, {RF_R07, 0x70}
{RF_R12, 0x7B}, ,
{RF_R14, 0x90}, {RF_R09, 0x0F}
{RF_R15, 0x58}, ,
{RF_R16, 0xB3}, {RF_R10, 0x41}
{RF_R17, 0x92}, ,
{RF_R18, 0x2C}, {RF_R11, 0x21}
{RF_R19, 0x02}, ,
{RF_R20, 0xBA}, {RF_R12, 0x7B}
{RF_R21, 0xDB}, ,
{RF_R24, 0x16}, {RF_R14, 0x90}
{RF_R25, 0x01}, ,
{RF_R29, 0x1F}, {RF_R15, 0x58}
,
{RF_R16, 0xB3}
,
{RF_R17, 0x92}
,
{RF_R18, 0x2C}
,
{RF_R19, 0x02}
,
{RF_R20, 0xBA}
,
{RF_R21, 0xDB}
,
{RF_R24, 0x16}
,
{RF_R25, 0x01}
,
{RF_R29, 0x1F}
,
}; };
UCHAR NUM_RF_REG_PARMS = (sizeof(RT30xx_RFRegTable) / sizeof(REG_PAIR)); UCHAR NUM_RF_REG_PARMS = (sizeof(RT30xx_RFRegTable) / sizeof(REG_PAIR));
// Antenna divesity use GPIO3 and EESK pin for control // Antenna divesity use GPIO3 and EESK pin for control
// Antenna and EEPROM access are both using EESK pin, // Antenna and EEPROM access are both using EESK pin,
// Therefor we should avoid accessing EESK at the same time // Therefor we should avoid accessing EESK at the same time
// Then restore antenna after EEPROM access // Then restore antenna after EEPROM access
// The original name of this function is AsicSetRxAnt(), now change to // The original name of this function is AsicSetRxAnt(), now change to
//VOID AsicSetRxAnt( //VOID AsicSetRxAnt(
VOID RT30xxSetRxAnt( VOID RT30xxSetRxAnt(IN PRTMP_ADAPTER pAd, IN UCHAR Ant)
IN PRTMP_ADAPTER pAd,
IN UCHAR Ant)
{ {
UINT32 Value; UINT32 Value;
#ifdef RTMP_MAC_PCI #ifdef RTMP_MAC_PCI
...@@ -94,14 +106,11 @@ VOID RT30xxSetRxAnt( ...@@ -94,14 +106,11 @@ VOID RT30xxSetRxAnt(
(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) || (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) ||
(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) || (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) ||
(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF)) || (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF)) ||
(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))) (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))) {
{
return; return;
} }
// the antenna selection is through firmware and MAC register(GPIO3) // the antenna selection is through firmware and MAC register(GPIO3)
if (Ant == 0) if (Ant == 0) {
{
// Main antenna // Main antenna
#ifdef RTMP_MAC_PCI #ifdef RTMP_MAC_PCI
RTMP_IO_READ32(pAd, E2PROM_CSR, &x); RTMP_IO_READ32(pAd, E2PROM_CSR, &x);
...@@ -114,10 +123,9 @@ VOID RT30xxSetRxAnt( ...@@ -114,10 +123,9 @@ VOID RT30xxSetRxAnt(
RTMP_IO_READ32(pAd, GPIO_CTRL_CFG, &Value); RTMP_IO_READ32(pAd, GPIO_CTRL_CFG, &Value);
Value &= ~(0x0808); Value &= ~(0x0808);
RTMP_IO_WRITE32(pAd, GPIO_CTRL_CFG, Value); RTMP_IO_WRITE32(pAd, GPIO_CTRL_CFG, Value);
DBGPRINT_RAW(RT_DEBUG_TRACE, ("AsicSetRxAnt, switch to main antenna\n")); DBGPRINT_RAW(RT_DEBUG_TRACE,
} ("AsicSetRxAnt, switch to main antenna\n"));
else } else {
{
// Aux antenna // Aux antenna
#ifdef RTMP_MAC_PCI #ifdef RTMP_MAC_PCI
RTMP_IO_READ32(pAd, E2PROM_CSR, &x); RTMP_IO_READ32(pAd, E2PROM_CSR, &x);
...@@ -130,11 +138,11 @@ VOID RT30xxSetRxAnt( ...@@ -130,11 +138,11 @@ VOID RT30xxSetRxAnt(
Value &= ~(0x0808); Value &= ~(0x0808);
Value |= 0x08; Value |= 0x08;
RTMP_IO_WRITE32(pAd, GPIO_CTRL_CFG, Value); RTMP_IO_WRITE32(pAd, GPIO_CTRL_CFG, Value);
DBGPRINT_RAW(RT_DEBUG_TRACE, ("AsicSetRxAnt, switch to aux antenna\n")); DBGPRINT_RAW(RT_DEBUG_TRACE,
("AsicSetRxAnt, switch to aux antenna\n"));
} }
} }
/* /*
======================================================================== ========================================================================
...@@ -151,10 +159,9 @@ VOID RT30xxSetRxAnt( ...@@ -151,10 +159,9 @@ VOID RT30xxSetRxAnt(
======================================================================== ========================================================================
*/ */
VOID RTMPFilterCalibration( VOID RTMPFilterCalibration(IN PRTMP_ADAPTER pAd)
IN PRTMP_ADAPTER pAd)
{ {
UCHAR R55x = 0, value, FilterTarget = 0x1E, BBPValue=0; UCHAR R55x = 0, value, FilterTarget = 0x1E, BBPValue = 0;
UINT loop = 0, count = 0, loopcnt = 0, ReTry = 0; UINT loop = 0, count = 0, loopcnt = 0, ReTry = 0;
UCHAR RF_R24_Value = 0; UCHAR RF_R24_Value = 0;
...@@ -162,35 +169,33 @@ VOID RTMPFilterCalibration( ...@@ -162,35 +169,33 @@ VOID RTMPFilterCalibration(
pAd->Mlme.CaliBW20RfR24 = 0x1F; pAd->Mlme.CaliBW20RfR24 = 0x1F;
pAd->Mlme.CaliBW40RfR24 = 0x2F; //Bit[5] must be 1 for BW 40 pAd->Mlme.CaliBW40RfR24 = 0x2F; //Bit[5] must be 1 for BW 40
do do {
{
if (loop == 1) //BandWidth = 40 MHz if (loop == 1) //BandWidth = 40 MHz
{ {
// Write 0x27 to RF_R24 to program filter // Write 0x27 to RF_R24 to program filter
RF_R24_Value = 0x27; RF_R24_Value = 0x27;
RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value); RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value);
if (IS_RT3090(pAd) || IS_RT3572(pAd)|| IS_RT3390(pAd)) if (IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd))
FilterTarget = 0x15; FilterTarget = 0x15;
else else
FilterTarget = 0x19; FilterTarget = 0x19;
// when calibrate BW40, BBP mask must set to BW40. // when calibrate BW40, BBP mask must set to BW40.
RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue); RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue);
BBPValue&= (~0x18); BBPValue &= (~0x18);
BBPValue|= (0x10); BBPValue |= (0x10);
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue); RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue);
// set to BW40 // set to BW40
RT30xxReadRFRegister(pAd, RF_R31, &value); RT30xxReadRFRegister(pAd, RF_R31, &value);
value |= 0x20; value |= 0x20;
RT30xxWriteRFRegister(pAd, RF_R31, value); RT30xxWriteRFRegister(pAd, RF_R31, value);
} } else //BandWidth = 20 MHz
else //BandWidth = 20 MHz
{ {
// Write 0x07 to RF_R24 to program filter // Write 0x07 to RF_R24 to program filter
RF_R24_Value = 0x07; RF_R24_Value = 0x07;
RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value); RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value);
if (IS_RT3090(pAd) || IS_RT3572(pAd)|| IS_RT3390(pAd)) if (IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd))
FilterTarget = 0x13; FilterTarget = 0x13;
else else
FilterTarget = 0x16; FilterTarget = 0x16;
...@@ -209,8 +214,7 @@ VOID RTMPFilterCalibration( ...@@ -209,8 +214,7 @@ VOID RTMPFilterCalibration(
// Write 0x00 to BBP_R24 to set power & frequency of passband test tone // Write 0x00 to BBP_R24 to set power & frequency of passband test tone
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R24, 0); RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R24, 0);
do do {
{
// Write 0x90 to BBP_R25 to transmit test tone // Write 0x90 to BBP_R25 to transmit test tone
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R25, 0x90); RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R25, 0x90);
...@@ -224,8 +228,7 @@ VOID RTMPFilterCalibration( ...@@ -224,8 +228,7 @@ VOID RTMPFilterCalibration(
// Write 0x06 to BBP_R24 to set power & frequency of stopband test tone // Write 0x06 to BBP_R24 to set power & frequency of stopband test tone
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R24, 0x06); RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R24, 0x06);
while(TRUE) while (TRUE) {
{
// Write 0x90 to BBP_R25 to transmit test tone // Write 0x90 to BBP_R25 to transmit test tone
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R25, 0x90); RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R25, 0x90);
...@@ -233,59 +236,47 @@ VOID RTMPFilterCalibration( ...@@ -233,59 +236,47 @@ VOID RTMPFilterCalibration(
RTMPusecDelay(1000); RTMPusecDelay(1000);
RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R55, &value); RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R55, &value);
value &= 0xFF; value &= 0xFF;
if ((R55x - value) < FilterTarget) if ((R55x - value) < FilterTarget) {
{ RF_R24_Value++;
RF_R24_Value ++; } else if ((R55x - value) == FilterTarget) {
} RF_R24_Value++;
else if ((R55x - value) == FilterTarget) count++;
{ } else {
RF_R24_Value ++;
count ++;
}
else
{
break; break;
} }
// prevent infinite loop cause driver hang. // prevent infinite loop cause driver hang.
if (loopcnt++ > 100) if (loopcnt++ > 100) {
{ DBGPRINT(RT_DEBUG_ERROR,
DBGPRINT(RT_DEBUG_ERROR, ("RTMPFilterCalibration - can't find a valid value, loopcnt=%d stop calibrating", loopcnt)); ("RTMPFilterCalibration - can't find a valid value, loopcnt=%d stop calibrating",
loopcnt));
break; break;
} }
// Write RF_R24 to program filter // Write RF_R24 to program filter
RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value); RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value);
} }
if (count > 0) if (count > 0) {
{
RF_R24_Value = RF_R24_Value - ((count) ? (1) : (0)); RF_R24_Value = RF_R24_Value - ((count) ? (1) : (0));
} }
// Store for future usage // Store for future usage
if (loopcnt < 100) if (loopcnt < 100) {
{ if (loop++ == 0) {
if (loop++ == 0)
{
//BandWidth = 20 MHz //BandWidth = 20 MHz
pAd->Mlme.CaliBW20RfR24 = (UCHAR)RF_R24_Value; pAd->Mlme.CaliBW20RfR24 = (UCHAR) RF_R24_Value;
} } else {
else
{
//BandWidth = 40 MHz //BandWidth = 40 MHz
pAd->Mlme.CaliBW40RfR24 = (UCHAR)RF_R24_Value; pAd->Mlme.CaliBW40RfR24 = (UCHAR) RF_R24_Value;
break; break;
} }
} } else
else
break; break;
RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value); RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value);
// reset count // reset count
count = 0; count = 0;
} while(TRUE); } while (TRUE);
// //
// Set back to initial state // Set back to initial state
...@@ -298,13 +289,14 @@ VOID RTMPFilterCalibration( ...@@ -298,13 +289,14 @@ VOID RTMPFilterCalibration(
// set BBP back to BW20 // set BBP back to BW20
RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue); RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue);
BBPValue&= (~0x18); BBPValue &= (~0x18);
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue); RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue);
DBGPRINT(RT_DEBUG_TRACE, ("RTMPFilterCalibration - CaliBW20RfR24=0x%x, CaliBW40RfR24=0x%x\n", pAd->Mlme.CaliBW20RfR24, pAd->Mlme.CaliBW40RfR24)); DBGPRINT(RT_DEBUG_TRACE,
("RTMPFilterCalibration - CaliBW20RfR24=0x%x, CaliBW40RfR24=0x%x\n",
pAd->Mlme.CaliBW20RfR24, pAd->Mlme.CaliBW40RfR24));
} }
// add by johnli, RF power sequence setup // add by johnli, RF power sequence setup
/* /*
========================================================================== ==========================================================================
...@@ -314,8 +306,7 @@ VOID RTMPFilterCalibration( ...@@ -314,8 +306,7 @@ VOID RTMPFilterCalibration(
========================================================================== ==========================================================================
*/ */
VOID RT30xxLoadRFNormalModeSetup( VOID RT30xxLoadRFNormalModeSetup(IN PRTMP_ADAPTER pAd)
IN PRTMP_ADAPTER pAd)
{ {
UCHAR RFValue; UCHAR RFValue;
...@@ -357,7 +348,7 @@ VOID RT30xxLoadRFNormalModeSetup( ...@@ -357,7 +348,7 @@ VOID RT30xxLoadRFNormalModeSetup(
RFValue &= (~0x08); RFValue &= (~0x08);
RT30xxWriteRFRegister(pAd, RF_R21, RFValue); RT30xxWriteRFRegister(pAd, RF_R21, RFValue);
/* add by johnli, reset RF_R27 when interface down & up to fix throughput problem*/ /* add by johnli, reset RF_R27 when interface down & up to fix throughput problem */
// LDORF_VC, RF R27 register Bit 2 to 0 // LDORF_VC, RF R27 register Bit 2 to 0
RT30xxReadRFRegister(pAd, RF_R27, &RFValue); RT30xxReadRFRegister(pAd, RF_R27, &RFValue);
// TX to RX IQ glitch(RF_R27) has been fixed in RT3070(F). // TX to RX IQ glitch(RF_R27) has been fixed in RT3070(F).
...@@ -381,15 +372,13 @@ VOID RT30xxLoadRFNormalModeSetup( ...@@ -381,15 +372,13 @@ VOID RT30xxLoadRFNormalModeSetup(
========================================================================== ==========================================================================
*/ */
VOID RT30xxLoadRFSleepModeSetup( VOID RT30xxLoadRFSleepModeSetup(IN PRTMP_ADAPTER pAd)
IN PRTMP_ADAPTER pAd)
{ {
UCHAR RFValue; UCHAR RFValue;
UINT32 MACValue; UINT32 MACValue;
#ifdef RTMP_MAC_USB #ifdef RTMP_MAC_USB
if(!IS_RT3572(pAd)) if (!IS_RT3572(pAd))
#endif // RTMP_MAC_USB // #endif // RTMP_MAC_USB //
{ {
// RF_BLOCK_en. RF R1 register Bit 0 to 0 // RF_BLOCK_en. RF R1 register Bit 0 to 0
...@@ -415,8 +404,7 @@ VOID RT30xxLoadRFSleepModeSetup( ...@@ -415,8 +404,7 @@ VOID RT30xxLoadRFSleepModeSetup(
if (IS_RT3090(pAd) || // IS_RT3090 including RT309x and RT3071/72 if (IS_RT3090(pAd) || // IS_RT3090 including RT309x and RT3071/72
IS_RT3572(pAd) || IS_RT3572(pAd) ||
(IS_RT3070(pAd) && ((pAd->MACVersion & 0xffff) < 0x0201))) (IS_RT3070(pAd) && ((pAd->MACVersion & 0xffff) < 0x0201))) {
{
#ifdef RTMP_MAC_USB #ifdef RTMP_MAC_USB
if (!IS_RT3572(pAd)) if (!IS_RT3572(pAd))
#endif // RTMP_MAC_USB // #endif // RTMP_MAC_USB //
...@@ -440,14 +428,13 @@ VOID RT30xxLoadRFSleepModeSetup( ...@@ -440,14 +428,13 @@ VOID RT30xxLoadRFSleepModeSetup(
========================================================================== ==========================================================================
*/ */
VOID RT30xxReverseRFSleepModeSetup( VOID RT30xxReverseRFSleepModeSetup(IN PRTMP_ADAPTER pAd)
IN PRTMP_ADAPTER pAd)
{ {
UCHAR RFValue; UCHAR RFValue;
UINT32 MACValue; UINT32 MACValue;
#ifdef RTMP_MAC_USB #ifdef RTMP_MAC_USB
if(!IS_RT3572(pAd)) if (!IS_RT3572(pAd))
#endif // RTMP_MAC_USB // #endif // RTMP_MAC_USB //
{ {
// RF_BLOCK_en, RF R1 register Bit 0 to 1 // RF_BLOCK_en, RF R1 register Bit 0 to 1
...@@ -474,8 +461,7 @@ VOID RT30xxReverseRFSleepModeSetup( ...@@ -474,8 +461,7 @@ VOID RT30xxReverseRFSleepModeSetup(
if (IS_RT3090(pAd) || // IS_RT3090 including RT309x and RT3071/72 if (IS_RT3090(pAd) || // IS_RT3090 including RT309x and RT3071/72
IS_RT3572(pAd) || IS_RT3572(pAd) ||
IS_RT3390(pAd) || IS_RT3390(pAd) ||
(IS_RT3070(pAd) && ((pAd->MACVersion & 0xffff) < 0x0201))) (IS_RT3070(pAd) && ((pAd->MACVersion & 0xffff) < 0x0201))) {
{
#ifdef RTMP_MAC_USB #ifdef RTMP_MAC_USB
if (!IS_RT3572(pAd)) if (!IS_RT3572(pAd))
#endif // RTMP_MAC_USB // #endif // RTMP_MAC_USB //
...@@ -487,48 +473,41 @@ VOID RT30xxReverseRFSleepModeSetup( ...@@ -487,48 +473,41 @@ VOID RT30xxReverseRFSleepModeSetup(
RFValue = (RFValue & (~0x77)); RFValue = (RFValue & (~0x77));
RT30xxWriteRFRegister(pAd, RF_R27, RFValue); RT30xxWriteRFRegister(pAd, RF_R27, RFValue);
} }
// RT3071 version E has fixed this issue // RT3071 version E has fixed this issue
if ((pAd->NicConfig2.field.DACTestBit == 1) && ((pAd->MACVersion & 0xffff) < 0x0211)) if ((pAd->NicConfig2.field.DACTestBit == 1)
{ && ((pAd->MACVersion & 0xffff) < 0x0211)) {
// patch tx EVM issue temporarily // patch tx EVM issue temporarily
RTMP_IO_READ32(pAd, LDO_CFG0, &MACValue); RTMP_IO_READ32(pAd, LDO_CFG0, &MACValue);
MACValue = ((MACValue & 0xE0FFFFFF) | 0x0D000000); MACValue = ((MACValue & 0xE0FFFFFF) | 0x0D000000);
RTMP_IO_WRITE32(pAd, LDO_CFG0, MACValue); RTMP_IO_WRITE32(pAd, LDO_CFG0, MACValue);
} } else {
else
{
RTMP_IO_READ32(pAd, LDO_CFG0, &MACValue); RTMP_IO_READ32(pAd, LDO_CFG0, &MACValue);
MACValue = ((MACValue & 0xE0FFFFFF) | 0x01000000); MACValue = ((MACValue & 0xE0FFFFFF) | 0x01000000);
RTMP_IO_WRITE32(pAd, LDO_CFG0, MACValue); RTMP_IO_WRITE32(pAd, LDO_CFG0, MACValue);
} }
} }
if(IS_RT3572(pAd)) if (IS_RT3572(pAd))
RT30xxWriteRFRegister(pAd, RF_R08, 0x80); RT30xxWriteRFRegister(pAd, RF_R08, 0x80);
} }
// end johnli // end johnli
VOID RT30xxHaltAction( VOID RT30xxHaltAction(IN PRTMP_ADAPTER pAd)
IN PRTMP_ADAPTER pAd)
{ {
UINT32 TxPinCfg = 0x00050F0F; UINT32 TxPinCfg = 0x00050F0F;
// //
// Turn off LNA_PE or TRSW_POL // Turn off LNA_PE or TRSW_POL
// //
if (IS_RT3070(pAd) || IS_RT3071(pAd) || IS_RT3572(pAd)) if (IS_RT3070(pAd) || IS_RT3071(pAd) || IS_RT3572(pAd)) {
{
if ((IS_RT3071(pAd) || IS_RT3572(pAd)) if ((IS_RT3071(pAd) || IS_RT3572(pAd))
#ifdef RTMP_EFUSE_SUPPORT #ifdef RTMP_EFUSE_SUPPORT
&& (pAd->bUseEfuse) && (pAd->bUseEfuse)
#endif // RTMP_EFUSE_SUPPORT // #endif // RTMP_EFUSE_SUPPORT //
) ) {
{
TxPinCfg &= 0xFFFBF0F0; // bit18 off TxPinCfg &= 0xFFFBF0F0; // bit18 off
} } else {
else
{
TxPinCfg &= 0xFFFFF0F0; TxPinCfg &= 0xFFFFF0F0;
} }
......
...@@ -53,12 +53,12 @@ extern int rt28xx_close(IN struct net_device *net_dev); ...@@ -53,12 +53,12 @@ extern int rt28xx_close(IN struct net_device *net_dev);
extern int rt28xx_open(struct net_device *net_dev); extern int rt28xx_open(struct net_device *net_dev);
static VOID __devexit rt2860_remove_one(struct pci_dev *pci_dev); static VOID __devexit rt2860_remove_one(struct pci_dev *pci_dev);
static INT __devinit rt2860_probe(struct pci_dev *pci_dev, const struct pci_device_id *ent); static INT __devinit rt2860_probe(struct pci_dev *pci_dev,
const struct pci_device_id *ent);
static void __exit rt2860_cleanup_module(void); static void __exit rt2860_cleanup_module(void);
static int __init rt2860_init_module(void); static int __init rt2860_init_module(void);
static VOID RTMPInitPCIeDevice( static VOID RTMPInitPCIeDevice(IN struct pci_dev *pci_dev,
IN struct pci_dev *pci_dev,
IN PRTMP_ADAPTER pAd); IN PRTMP_ADAPTER pAd);
#ifdef CONFIG_PM #ifdef CONFIG_PM
...@@ -69,8 +69,7 @@ static int rt2860_resume(struct pci_dev *pci_dev); ...@@ -69,8 +69,7 @@ static int rt2860_resume(struct pci_dev *pci_dev);
// //
// Ralink PCI device table, include all supported chipsets // Ralink PCI device table, include all supported chipsets
// //
static struct pci_device_id rt2860_pci_tbl[] __devinitdata = static struct pci_device_id rt2860_pci_tbl[] __devinitdata = {
{
#ifdef RT2860 #ifdef RT2860
{PCI_DEVICE(NIC_PCI_VENDOR_ID, NIC2860_PCI_DEVICE_ID)}, //RT28602.4G {PCI_DEVICE(NIC_PCI_VENDOR_ID, NIC2860_PCI_DEVICE_ID)}, //RT28602.4G
{PCI_DEVICE(NIC_PCI_VENDOR_ID, NIC2860_PCIe_DEVICE_ID)}, {PCI_DEVICE(NIC_PCI_VENDOR_ID, NIC2860_PCIe_DEVICE_ID)},
...@@ -103,23 +102,20 @@ MODULE_DEVICE_TABLE(pci, rt2860_pci_tbl); ...@@ -103,23 +102,20 @@ MODULE_DEVICE_TABLE(pci, rt2860_pci_tbl);
MODULE_VERSION(STA_DRIVER_VERSION); MODULE_VERSION(STA_DRIVER_VERSION);
#endif #endif
// //
// Our PCI driver structure // Our PCI driver structure
// //
static struct pci_driver rt2860_driver = static struct pci_driver rt2860_driver = {
{ name: "rt2860",
name: "rt2860", id_table:rt2860_pci_tbl,
id_table: rt2860_pci_tbl, probe: rt2860_probe,
probe: rt2860_probe, remove:__devexit_p(rt2860_remove_one),
remove: __devexit_p(rt2860_remove_one),
#ifdef CONFIG_PM #ifdef CONFIG_PM
suspend: rt2860_suspend, suspend:rt2860_suspend,
resume: rt2860_resume, resume:rt2860_resume,
#endif #endif
}; };
/*************************************************************************** /***************************************************************************
* *
* PCI device initialization related procedures. * PCI device initialization related procedures.
...@@ -127,37 +123,29 @@ static struct pci_driver rt2860_driver = ...@@ -127,37 +123,29 @@ static struct pci_driver rt2860_driver =
***************************************************************************/ ***************************************************************************/
#ifdef CONFIG_PM #ifdef CONFIG_PM
VOID RT2860RejectPendingPackets( VOID RT2860RejectPendingPackets(IN PRTMP_ADAPTER pAd)
IN PRTMP_ADAPTER pAd)
{ {
// clear PS packets // clear PS packets
// clear TxSw packets // clear TxSw packets
} }
static int rt2860_suspend( static int rt2860_suspend(struct pci_dev *pci_dev, pm_message_t state)
struct pci_dev *pci_dev,
pm_message_t state)
{ {
struct net_device *net_dev = pci_get_drvdata(pci_dev); struct net_device *net_dev = pci_get_drvdata(pci_dev);
PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)NULL; PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) NULL;
INT32 retval = 0; INT32 retval = 0;
DBGPRINT(RT_DEBUG_TRACE, ("===> rt2860_suspend()\n")); DBGPRINT(RT_DEBUG_TRACE, ("===> rt2860_suspend()\n"));
if (net_dev == NULL) if (net_dev == NULL) {
{
DBGPRINT(RT_DEBUG_ERROR, ("net_dev == NULL!\n")); DBGPRINT(RT_DEBUG_ERROR, ("net_dev == NULL!\n"));
} } else {
else
{
GET_PAD_FROM_NET_DEV(pAd, net_dev); GET_PAD_FROM_NET_DEV(pAd, net_dev);
/* we can not use IFF_UP because ra0 down but ra1 up */ /* we can not use IFF_UP because ra0 down but ra1 up */
/* and 1 suspend/resume function for 1 module, not for each interface */ /* and 1 suspend/resume function for 1 module, not for each interface */
/* so Linux will call suspend/resume function once */ /* so Linux will call suspend/resume function once */
if (VIRTUAL_IF_NUM(pAd) > 0) if (VIRTUAL_IF_NUM(pAd) > 0) {
{
// avoid users do suspend after interface is down // avoid users do suspend after interface is down
// stop interface // stop interface
...@@ -172,7 +160,7 @@ static int rt2860_suspend( ...@@ -172,7 +160,7 @@ static int rt2860_suspend(
RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF); RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);
// take down the device // take down the device
rt28xx_close((PNET_DEV)net_dev); rt28xx_close((PNET_DEV) net_dev);
RT_MOD_DEC_USE_COUNT(); RT_MOD_DEC_USE_COUNT();
} }
...@@ -193,14 +181,12 @@ static int rt2860_suspend( ...@@ -193,14 +181,12 @@ static int rt2860_suspend(
return retval; return retval;
} }
static int rt2860_resume( static int rt2860_resume(struct pci_dev *pci_dev)
struct pci_dev *pci_dev)
{ {
struct net_device *net_dev = pci_get_drvdata(pci_dev); struct net_device *net_dev = pci_get_drvdata(pci_dev);
PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)NULL; PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) NULL;
INT32 retval; INT32 retval;
// set the power state of a PCI device // set the power state of a PCI device
// PCI has 4 power states, DO (normal) ~ D3(less power) // PCI has 4 power states, DO (normal) ~ D3(less power)
// in include/linux/pci.h, you can find that // in include/linux/pci.h, you can find that
...@@ -217,38 +203,32 @@ static int rt2860_resume( ...@@ -217,38 +203,32 @@ static int rt2860_resume(
pci_restore_state(pci_dev); pci_restore_state(pci_dev);
// initialize device before it's used by a driver // initialize device before it's used by a driver
if (pci_enable_device(pci_dev)) if (pci_enable_device(pci_dev)) {
{
printk("pci enable fail!\n"); printk("pci enable fail!\n");
return 0; return 0;
} }
DBGPRINT(RT_DEBUG_TRACE, ("===> rt2860_resume()\n")); DBGPRINT(RT_DEBUG_TRACE, ("===> rt2860_resume()\n"));
if (net_dev == NULL) if (net_dev == NULL) {
{
DBGPRINT(RT_DEBUG_ERROR, ("net_dev == NULL!\n")); DBGPRINT(RT_DEBUG_ERROR, ("net_dev == NULL!\n"));
} } else
else
GET_PAD_FROM_NET_DEV(pAd, net_dev); GET_PAD_FROM_NET_DEV(pAd, net_dev);
if (pAd != NULL) if (pAd != NULL) {
{
/* we can not use IFF_UP because ra0 down but ra1 up */ /* we can not use IFF_UP because ra0 down but ra1 up */
/* and 1 suspend/resume function for 1 module, not for each interface */ /* and 1 suspend/resume function for 1 module, not for each interface */
/* so Linux will call suspend/resume function once */ /* so Linux will call suspend/resume function once */
if (VIRTUAL_IF_NUM(pAd) > 0) if (VIRTUAL_IF_NUM(pAd) > 0) {
{
// mark device as attached from system and restart if needed // mark device as attached from system and restart if needed
netif_device_attach(net_dev); netif_device_attach(net_dev);
if (rt28xx_open((PNET_DEV)net_dev) != 0) if (rt28xx_open((PNET_DEV) net_dev) != 0) {
{
// open fail // open fail
DBGPRINT(RT_DEBUG_TRACE, ("<=== rt2860_resume()\n")); DBGPRINT(RT_DEBUG_TRACE,
("<=== rt2860_resume()\n"));
return 0; return 0;
} }
// increase MODULE use count // increase MODULE use count
RT_MOD_INC_USE_COUNT(); RT_MOD_INC_USE_COUNT();
...@@ -266,13 +246,11 @@ static int rt2860_resume( ...@@ -266,13 +246,11 @@ static int rt2860_resume(
} }
#endif // CONFIG_PM // #endif // CONFIG_PM //
static INT __init rt2860_init_module(VOID) static INT __init rt2860_init_module(VOID)
{ {
return pci_register_driver(&rt2860_driver); return pci_register_driver(&rt2860_driver);
} }
// //
// Driver module unload function // Driver module unload function
// //
...@@ -284,15 +262,13 @@ static VOID __exit rt2860_cleanup_module(VOID) ...@@ -284,15 +262,13 @@ static VOID __exit rt2860_cleanup_module(VOID)
module_init(rt2860_init_module); module_init(rt2860_init_module);
module_exit(rt2860_cleanup_module); module_exit(rt2860_cleanup_module);
// //
// PCI device probe & initialization function // PCI device probe & initialization function
// //
static INT __devinit rt2860_probe( static INT __devinit rt2860_probe(IN struct pci_dev *pci_dev,
IN struct pci_dev *pci_dev,
IN const struct pci_device_id *pci_id) IN const struct pci_device_id *pci_id)
{ {
PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)NULL; PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) NULL;
struct net_device *net_dev; struct net_device *net_dev;
PVOID handle; PVOID handle;
PSTRING print_name; PSTRING print_name;
...@@ -304,58 +280,61 @@ static INT __devinit rt2860_probe( ...@@ -304,58 +280,61 @@ static INT __devinit rt2860_probe(
//PCIDevInit============================================== //PCIDevInit==============================================
// wake up and enable device // wake up and enable device
if ((rv = pci_enable_device(pci_dev))!= 0) if ((rv = pci_enable_device(pci_dev)) != 0) {
{ DBGPRINT(RT_DEBUG_ERROR,
DBGPRINT(RT_DEBUG_ERROR, ("Enable PCI device failed, errno=%d!\n", rv)); ("Enable PCI device failed, errno=%d!\n", rv));
return rv; return rv;
} }
print_name = (PSTRING)pci_name(pci_dev); print_name = (PSTRING) pci_name(pci_dev);
if ((rv = pci_request_regions(pci_dev, print_name)) != 0) if ((rv = pci_request_regions(pci_dev, print_name)) != 0) {
{ DBGPRINT(RT_DEBUG_ERROR,
DBGPRINT(RT_DEBUG_ERROR, ("Request PCI resource failed, errno=%d!\n", rv)); ("Request PCI resource failed, errno=%d!\n", rv));
goto err_out; goto err_out;
} }
// map physical address to virtual address for accessing register // map physical address to virtual address for accessing register
csr_addr = (unsigned long) ioremap(pci_resource_start(pci_dev, 0), pci_resource_len(pci_dev, 0)); csr_addr =
if (!csr_addr) (unsigned long)ioremap(pci_resource_start(pci_dev, 0),
{ pci_resource_len(pci_dev, 0));
DBGPRINT(RT_DEBUG_ERROR, ("ioremap failed for device %s, region 0x%lX @ 0x%lX\n", if (!csr_addr) {
print_name, (ULONG)pci_resource_len(pci_dev, 0), (ULONG)pci_resource_start(pci_dev, 0))); DBGPRINT(RT_DEBUG_ERROR,
("ioremap failed for device %s, region 0x%lX @ 0x%lX\n",
print_name, (ULONG) pci_resource_len(pci_dev, 0),
(ULONG) pci_resource_start(pci_dev, 0)));
goto err_out_free_res; goto err_out_free_res;
} } else {
else DBGPRINT(RT_DEBUG_TRACE,
{ ("%s: at 0x%lx, VA 0x%lx, IRQ %d. \n", print_name,
DBGPRINT(RT_DEBUG_TRACE, ("%s: at 0x%lx, VA 0x%lx, IRQ %d. \n", print_name, (ULONG) pci_resource_start(pci_dev, 0),
(ULONG)pci_resource_start(pci_dev, 0), (ULONG)csr_addr, pci_dev->irq)); (ULONG) csr_addr, pci_dev->irq));
} }
// Set DMA master // Set DMA master
pci_set_master(pci_dev); pci_set_master(pci_dev);
//RtmpDevInit============================================== //RtmpDevInit==============================================
// Allocate RTMP_ADAPTER adapter structure // Allocate RTMP_ADAPTER adapter structure
handle = kmalloc(sizeof(struct os_cookie), GFP_KERNEL); handle = kmalloc(sizeof(struct os_cookie), GFP_KERNEL);
if (handle == NULL) if (handle == NULL) {
{ DBGPRINT(RT_DEBUG_ERROR,
DBGPRINT(RT_DEBUG_ERROR, ("%s(): Allocate memory for os handle failed!\n", __func__)); ("%s(): Allocate memory for os handle failed!\n",
__func__));
goto err_out_iounmap; goto err_out_iounmap;
} }
((POS_COOKIE)handle)->pci_dev = pci_dev; ((POS_COOKIE) handle)->pci_dev = pci_dev;
rv = RTMPAllocAdapterBlock(handle, &pAd); //shiang: we may need the pci_dev for allocate structure of "RTMP_ADAPTER" rv = RTMPAllocAdapterBlock(handle, &pAd); //shiang: we may need the pci_dev for allocate structure of "RTMP_ADAPTER"
if (rv != NDIS_STATUS_SUCCESS) if (rv != NDIS_STATUS_SUCCESS)
goto err_out_iounmap; goto err_out_iounmap;
// Here are the RTMP_ADAPTER structure with pci-bus specific parameters. // Here are the RTMP_ADAPTER structure with pci-bus specific parameters.
pAd->CSRBaseAddress = (PUCHAR)csr_addr; pAd->CSRBaseAddress = (PUCHAR) csr_addr;
DBGPRINT(RT_DEBUG_ERROR, ("pAd->CSRBaseAddress =0x%lx, csr_addr=0x%lx!\n", (ULONG)pAd->CSRBaseAddress, csr_addr)); DBGPRINT(RT_DEBUG_ERROR,
("pAd->CSRBaseAddress =0x%lx, csr_addr=0x%lx!\n",
(ULONG) pAd->CSRBaseAddress, csr_addr));
RtmpRaDevCtrlInit(pAd, RTMP_DEV_INF_PCI); RtmpRaDevCtrlInit(pAd, RTMP_DEV_INF_PCI);
//NetDevInit============================================== //NetDevInit==============================================
net_dev = RtmpPhyNetDevInit(pAd, &netDevHook); net_dev = RtmpPhyNetDevInit(pAd, &netDevHook);
if (net_dev == NULL) if (net_dev == NULL)
...@@ -372,7 +351,6 @@ static INT __devinit rt2860_probe( ...@@ -372,7 +351,6 @@ static INT __devinit rt2860_probe(
*/ */
SET_NETDEV_DEV(net_dev, &(pci_dev->dev)); SET_NETDEV_DEV(net_dev, &(pci_dev->dev));
//All done, it's time to register the net device to linux kernel. //All done, it's time to register the net device to linux kernel.
// Register this device // Register this device
rv = RtmpOSNetDevAttach(net_dev, &netDevHook); rv = RtmpOSNetDevAttach(net_dev, &netDevHook);
...@@ -386,18 +364,18 @@ static INT __devinit rt2860_probe( ...@@ -386,18 +364,18 @@ static INT __devinit rt2860_probe(
return 0; // probe ok return 0; // probe ok
/* --------------------------- ERROR HANDLE --------------------------- */ /* --------------------------- ERROR HANDLE --------------------------- */
err_out_free_netdev: err_out_free_netdev:
RtmpOSNetDevFree(net_dev); RtmpOSNetDevFree(net_dev);
err_out_free_radev: err_out_free_radev:
/* free RTMP_ADAPTER strcuture and os_cookie*/ /* free RTMP_ADAPTER strcuture and os_cookie */
RTMPFreeAdapter(pAd); RTMPFreeAdapter(pAd);
err_out_iounmap: err_out_iounmap:
iounmap((void *)(csr_addr)); iounmap((void *)(csr_addr));
release_mem_region(pci_resource_start(pci_dev, 0), pci_resource_len(pci_dev, 0)); release_mem_region(pci_resource_start(pci_dev, 0),
pci_resource_len(pci_dev, 0));
err_out_free_res: err_out_free_res:
pci_release_regions(pci_dev); pci_release_regions(pci_dev);
...@@ -405,14 +383,13 @@ static INT __devinit rt2860_probe( ...@@ -405,14 +383,13 @@ static INT __devinit rt2860_probe(
err_out: err_out:
pci_disable_device(pci_dev); pci_disable_device(pci_dev);
DBGPRINT(RT_DEBUG_ERROR, ("<=== rt2860_probe failed with rv = %d!\n", rv)); DBGPRINT(RT_DEBUG_ERROR,
("<=== rt2860_probe failed with rv = %d!\n", rv));
return -ENODEV; /* probe fail */ return -ENODEV; /* probe fail */
} }
static VOID __devexit rt2860_remove_one(IN struct pci_dev *pci_dev)
static VOID __devexit rt2860_remove_one(
IN struct pci_dev *pci_dev)
{ {
PNET_DEV net_dev = pci_get_drvdata(pci_dev); PNET_DEV net_dev = pci_get_drvdata(pci_dev);
RTMP_ADAPTER *pAd = NULL; RTMP_ADAPTER *pAd = NULL;
...@@ -422,8 +399,7 @@ static VOID __devexit rt2860_remove_one( ...@@ -422,8 +399,7 @@ static VOID __devexit rt2860_remove_one(
DBGPRINT(RT_DEBUG_TRACE, ("===> rt2860_remove_one\n")); DBGPRINT(RT_DEBUG_TRACE, ("===> rt2860_remove_one\n"));
if (pAd != NULL) if (pAd != NULL) {
{
// Unregister/Free all allocated net_device. // Unregister/Free all allocated net_device.
RtmpPhyNetDevExit(pAd, net_dev); RtmpPhyNetDevExit(pAd, net_dev);
...@@ -431,14 +407,13 @@ static VOID __devexit rt2860_remove_one( ...@@ -431,14 +407,13 @@ static VOID __devexit rt2860_remove_one(
iounmap((char *)(csr_addr)); iounmap((char *)(csr_addr));
// release memory region // release memory region
release_mem_region(pci_resource_start(pci_dev, 0), pci_resource_len(pci_dev, 0)); release_mem_region(pci_resource_start(pci_dev, 0),
pci_resource_len(pci_dev, 0));
// Free RTMP_ADAPTER related structures. // Free RTMP_ADAPTER related structures.
RtmpRaDevCtrlExit(pAd); RtmpRaDevCtrlExit(pAd);
} } else {
else
{
// Unregister network device // Unregister network device
RtmpOSNetDevDetach(net_dev); RtmpOSNetDevDetach(net_dev);
...@@ -446,7 +421,8 @@ static VOID __devexit rt2860_remove_one( ...@@ -446,7 +421,8 @@ static VOID __devexit rt2860_remove_one(
iounmap((char *)(net_dev->base_addr)); iounmap((char *)(net_dev->base_addr));
// release memory region // release memory region
release_mem_region(pci_resource_start(pci_dev, 0), pci_resource_len(pci_dev, 0)); release_mem_region(pci_resource_start(pci_dev, 0),
pci_resource_len(pci_dev, 0));
} }
// Free the root net_device // Free the root net_device
...@@ -454,7 +430,6 @@ static VOID __devexit rt2860_remove_one( ...@@ -454,7 +430,6 @@ static VOID __devexit rt2860_remove_one(
} }
/* /*
======================================================================== ========================================================================
Routine Description: Routine Description:
...@@ -470,22 +445,18 @@ Return Value: ...@@ -470,22 +445,18 @@ Return Value:
Note: Note:
======================================================================== ========================================================================
*/ */
BOOLEAN RT28XXChipsetCheck( BOOLEAN RT28XXChipsetCheck(IN void *_dev_p)
IN void *_dev_p)
{ {
/* always TRUE */ /* always TRUE */
return TRUE; return TRUE;
} }
/*************************************************************************** /***************************************************************************
* *
* PCIe device initialization related procedures. * PCIe device initialization related procedures.
* *
***************************************************************************/ ***************************************************************************/
static VOID RTMPInitPCIeDevice( static VOID RTMPInitPCIeDevice(IN struct pci_dev *pci_dev, IN PRTMP_ADAPTER pAd)
IN struct pci_dev *pci_dev,
IN PRTMP_ADAPTER pAd)
{ {
USHORT device_id; USHORT device_id;
POS_COOKIE pObj; POS_COOKIE pObj;
...@@ -505,11 +476,9 @@ BOOLEAN RT28XXChipsetCheck( ...@@ -505,11 +476,9 @@ BOOLEAN RT28XXChipsetCheck(
(device_id == NIC3091_PCIe_DEVICE_ID) || (device_id == NIC3091_PCIe_DEVICE_ID) ||
(device_id == NIC3092_PCIe_DEVICE_ID) || (device_id == NIC3092_PCIe_DEVICE_ID) ||
#endif // RT3090 // #endif // RT3090 //
0) 0) {
{ UINT32 MacCsr0 = 0, Index = 0;
UINT32 MacCsr0 = 0, Index= 0; do {
do
{
RTMP_IO_READ32(pAd, MAC_CSR0, &MacCsr0); RTMP_IO_READ32(pAd, MAC_CSR0, &MacCsr0);
if ((MacCsr0 != 0x00) && (MacCsr0 != 0xFFFFFFFF)) if ((MacCsr0 != 0x00) && (MacCsr0 != 0xFFFFFFFF))
...@@ -520,16 +489,13 @@ BOOLEAN RT28XXChipsetCheck( ...@@ -520,16 +489,13 @@ BOOLEAN RT28XXChipsetCheck(
// Support advanced power save after 2892/2790. // Support advanced power save after 2892/2790.
// MAC version at offset 0x1000 is 0x2872XXXX/0x2870XXXX(PCIe, USB, SDIO). // MAC version at offset 0x1000 is 0x2872XXXX/0x2870XXXX(PCIe, USB, SDIO).
if ((MacCsr0&0xffff0000) != 0x28600000) if ((MacCsr0 & 0xffff0000) != 0x28600000) {
{
OPSTATUS_SET_FLAG(pAd, fOP_STATUS_PCIE_DEVICE); OPSTATUS_SET_FLAG(pAd, fOP_STATUS_PCIE_DEVICE);
} }
} }
} }
VOID RTMPInitPCIeLinkCtrlValue(IN PRTMP_ADAPTER pAd)
VOID RTMPInitPCIeLinkCtrlValue(
IN PRTMP_ADAPTER pAd)
{ {
INT pos; INT pos;
USHORT reg16, data2, PCIePowerSaveLevel, Configuration; USHORT reg16, data2, PCIePowerSaveLevel, Configuration;
...@@ -544,36 +510,37 @@ VOID RTMPInitPCIeLinkCtrlValue( ...@@ -544,36 +510,37 @@ VOID RTMPInitPCIeLinkCtrlValue(
DBGPRINT(RT_DEBUG_TRACE, ("%s.===>\n", __func__)); DBGPRINT(RT_DEBUG_TRACE, ("%s.===>\n", __func__));
// Init EEPROM, and save settings // Init EEPROM, and save settings
if (!(IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd))) if (!(IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd))) {
{
RT28xx_EEPROM_READ16(pAd, 0x22, PCIePowerSaveLevel); RT28xx_EEPROM_READ16(pAd, 0x22, PCIePowerSaveLevel);
pAd->PCIePowerSaveLevel = PCIePowerSaveLevel & 0xff; pAd->PCIePowerSaveLevel = PCIePowerSaveLevel & 0xff;
pAd->LnkCtrlBitMask = 0; pAd->LnkCtrlBitMask = 0;
if ((PCIePowerSaveLevel&0xff) == 0xff) if ((PCIePowerSaveLevel & 0xff) == 0xff) {
{
OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_PCIE_DEVICE); OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_PCIE_DEVICE);
DBGPRINT(RT_DEBUG_TRACE, ("====> PCIePowerSaveLevel = 0x%x.\n", PCIePowerSaveLevel)); DBGPRINT(RT_DEBUG_TRACE,
("====> PCIePowerSaveLevel = 0x%x.\n",
PCIePowerSaveLevel));
return; return;
} } else {
else
{
PCIePowerSaveLevel &= 0x3; PCIePowerSaveLevel &= 0x3;
RT28xx_EEPROM_READ16(pAd, 0x24, data2); RT28xx_EEPROM_READ16(pAd, 0x24, data2);
if( !(((data2&0xff00) == 0x9200) && ((data2&0x80) !=0)) ) if (!
{ (((data2 & 0xff00) == 0x9200)
if (PCIePowerSaveLevel > 1 ) && ((data2 & 0x80) != 0))) {
if (PCIePowerSaveLevel > 1)
PCIePowerSaveLevel = 1; PCIePowerSaveLevel = 1;
} }
DBGPRINT(RT_DEBUG_TRACE, ("====> Write 0x83 = 0x%x.\n", PCIePowerSaveLevel)); DBGPRINT(RT_DEBUG_TRACE,
AsicSendCommandToMcu(pAd, 0x83, 0xff, (UCHAR)PCIePowerSaveLevel, 0x00); ("====> Write 0x83 = 0x%x.\n",
PCIePowerSaveLevel));
AsicSendCommandToMcu(pAd, 0x83, 0xff,
(UCHAR) PCIePowerSaveLevel, 0x00);
RT28xx_EEPROM_READ16(pAd, 0x22, PCIePowerSaveLevel); RT28xx_EEPROM_READ16(pAd, 0x22, PCIePowerSaveLevel);
PCIePowerSaveLevel &= 0xff; PCIePowerSaveLevel &= 0xff;
PCIePowerSaveLevel = PCIePowerSaveLevel >> 6; PCIePowerSaveLevel = PCIePowerSaveLevel >> 6;
switch(PCIePowerSaveLevel) switch (PCIePowerSaveLevel) {
{
case 0: // Only support L0 case 0: // Only support L0
pAd->LnkCtrlBitMask = 0; pAd->LnkCtrlBitMask = 0;
break; break;
...@@ -588,33 +555,36 @@ VOID RTMPInitPCIeLinkCtrlValue( ...@@ -588,33 +555,36 @@ VOID RTMPInitPCIeLinkCtrlValue(
break; break;
} }
RT28xx_EEPROM_READ16(pAd, 0x24, data2); RT28xx_EEPROM_READ16(pAd, 0x24, data2);
if ((PCIePowerSaveLevel&0xff) != 0xff) if ((PCIePowerSaveLevel & 0xff) != 0xff) {
{
PCIePowerSaveLevel &= 0x3; PCIePowerSaveLevel &= 0x3;
if( !(((data2&0xff00) == 0x9200) && ((data2&0x80) !=0)) ) if (!
{ (((data2 & 0xff00) == 0x9200)
if (PCIePowerSaveLevel > 1 ) && ((data2 & 0x80) != 0))) {
if (PCIePowerSaveLevel > 1)
PCIePowerSaveLevel = 1; PCIePowerSaveLevel = 1;
} }
DBGPRINT(RT_DEBUG_TRACE, ("====> rt28xx Write 0x83 Command = 0x%x.\n", PCIePowerSaveLevel)); DBGPRINT(RT_DEBUG_TRACE,
("====> rt28xx Write 0x83 Command = 0x%x.\n",
PCIePowerSaveLevel));
AsicSendCommandToMcu(pAd, 0x83, 0xff, (UCHAR)PCIePowerSaveLevel, 0x00); AsicSendCommandToMcu(pAd, 0x83, 0xff,
} (UCHAR) PCIePowerSaveLevel,
DBGPRINT(RT_DEBUG_TRACE, ("====> LnkCtrlBitMask = 0x%x.\n", pAd->LnkCtrlBitMask)); 0x00);
} }
DBGPRINT(RT_DEBUG_TRACE,
("====> LnkCtrlBitMask = 0x%x.\n",
pAd->LnkCtrlBitMask));
} }
else if (IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd)) } else if (IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd)) {
{
UCHAR LinkCtrlSetting = 0; UCHAR LinkCtrlSetting = 0;
// Check 3090E special setting chip. // Check 3090E special setting chip.
RT28xx_EEPROM_READ16(pAd, 0x24, data2); RT28xx_EEPROM_READ16(pAd, 0x24, data2);
if ((data2 == 0x9280) && ((pAd->MACVersion&0xffff) == 0x0211)) if ((data2 == 0x9280) && ((pAd->MACVersion & 0xffff) == 0x0211)) {
{
pAd->b3090ESpecialChip = TRUE; pAd->b3090ESpecialChip = TRUE;
DBGPRINT_RAW(RT_DEBUG_ERROR,("Special 3090E chip \n")); DBGPRINT_RAW(RT_DEBUG_ERROR, ("Special 3090E chip \n"));
} }
RTMP_IO_READ32(pAd, AUX_CTRL, &MacValue); RTMP_IO_READ32(pAd, AUX_CTRL, &MacValue);
...@@ -622,130 +592,148 @@ VOID RTMPInitPCIeLinkCtrlValue( ...@@ -622,130 +592,148 @@ VOID RTMPInitPCIeLinkCtrlValue(
//Force PCIE 125MHz CLK to toggle //Force PCIE 125MHz CLK to toggle
MacValue |= 0x402; MacValue |= 0x402;
RTMP_IO_WRITE32(pAd, AUX_CTRL, MacValue); RTMP_IO_WRITE32(pAd, AUX_CTRL, MacValue);
DBGPRINT_RAW(RT_DEBUG_ERROR,(" AUX_CTRL = 0x%32x\n", MacValue)); DBGPRINT_RAW(RT_DEBUG_ERROR,
(" AUX_CTRL = 0x%32x\n", MacValue));
// for RT30xx F and after, PCIe infterface, and for power solution 3 // for RT30xx F and after, PCIe infterface, and for power solution 3
if ((IS_VERSION_AFTER_F(pAd)) if ((IS_VERSION_AFTER_F(pAd))
&& (pAd->StaCfg.PSControl.field.rt30xxPowerMode >= 2) && (pAd->StaCfg.PSControl.field.rt30xxPowerMode >= 2)
&& (pAd->StaCfg.PSControl.field.rt30xxPowerMode <= 3)) && (pAd->StaCfg.PSControl.field.rt30xxPowerMode <= 3)) {
{
RTMP_IO_READ32(pAd, AUX_CTRL, &MacValue); RTMP_IO_READ32(pAd, AUX_CTRL, &MacValue);
DBGPRINT_RAW(RT_DEBUG_ERROR,(" Read AUX_CTRL = 0x%x\n", MacValue)); DBGPRINT_RAW(RT_DEBUG_ERROR,
(" Read AUX_CTRL = 0x%x\n", MacValue));
// turn on bit 12. // turn on bit 12.
//enable 32KHz clock mode for power saving //enable 32KHz clock mode for power saving
MacValue |= 0x1000; MacValue |= 0x1000;
if (MacValue != 0xffffffff) if (MacValue != 0xffffffff) {
{
RTMP_IO_WRITE32(pAd, AUX_CTRL, MacValue); RTMP_IO_WRITE32(pAd, AUX_CTRL, MacValue);
DBGPRINT_RAW(RT_DEBUG_ERROR,(" Write AUX_CTRL = 0x%x\n", MacValue)); DBGPRINT_RAW(RT_DEBUG_ERROR,
(" Write AUX_CTRL = 0x%x\n",
MacValue));
// 1. if use PCIePowerSetting is 2 or 3, need to program OSC_CTRL to 0x3ff11. // 1. if use PCIePowerSetting is 2 or 3, need to program OSC_CTRL to 0x3ff11.
MacValue = 0x3ff11; MacValue = 0x3ff11;
RTMP_IO_WRITE32(pAd, OSC_CTRL, MacValue); RTMP_IO_WRITE32(pAd, OSC_CTRL, MacValue);
DBGPRINT_RAW(RT_DEBUG_ERROR,(" OSC_CTRL = 0x%x\n", MacValue)); DBGPRINT_RAW(RT_DEBUG_ERROR,
(" OSC_CTRL = 0x%x\n", MacValue));
// 2. Write PCI register Clk ref bit // 2. Write PCI register Clk ref bit
RTMPrt3xSetPCIePowerLinkCtrl(pAd); RTMPrt3xSetPCIePowerLinkCtrl(pAd);
} } else {
else
{
// Error read Aux_Ctrl value. Force to use solution 1 // Error read Aux_Ctrl value. Force to use solution 1
DBGPRINT(RT_DEBUG_ERROR,(" Error Value in AUX_CTRL = 0x%x\n", MacValue)); DBGPRINT(RT_DEBUG_ERROR,
(" Error Value in AUX_CTRL = 0x%x\n",
MacValue));
pAd->StaCfg.PSControl.field.rt30xxPowerMode = 1; pAd->StaCfg.PSControl.field.rt30xxPowerMode = 1;
DBGPRINT(RT_DEBUG_ERROR,(" Force to use power solution1 \n")); DBGPRINT(RT_DEBUG_ERROR,
(" Force to use power solution1 \n"));
} }
} }
// 1. read setting from inf file. // 1. read setting from inf file.
PCIePowerSaveLevel = (USHORT)pAd->StaCfg.PSControl.field.rt30xxPowerMode; PCIePowerSaveLevel =
DBGPRINT(RT_DEBUG_ERROR, ("====> rt30xx Read PowerLevelMode = 0x%x.\n", PCIePowerSaveLevel)); (USHORT) pAd->StaCfg.PSControl.field.rt30xxPowerMode;
DBGPRINT(RT_DEBUG_ERROR,
("====> rt30xx Read PowerLevelMode = 0x%x.\n",
PCIePowerSaveLevel));
// 2. Check EnableNewPS. // 2. Check EnableNewPS.
if (pAd->StaCfg.PSControl.field.EnableNewPS == FALSE) if (pAd->StaCfg.PSControl.field.EnableNewPS == FALSE)
PCIePowerSaveLevel = 1; PCIePowerSaveLevel = 1;
if (IS_VERSION_BEFORE_F(pAd) && (pAd->b3090ESpecialChip == FALSE)) if (IS_VERSION_BEFORE_F(pAd)
{ && (pAd->b3090ESpecialChip == FALSE)) {
// Chip Version E only allow 1, So force set 1. // Chip Version E only allow 1, So force set 1.
PCIePowerSaveLevel &= 0x1; PCIePowerSaveLevel &= 0x1;
pAd->PCIePowerSaveLevel = (USHORT)PCIePowerSaveLevel; pAd->PCIePowerSaveLevel = (USHORT) PCIePowerSaveLevel;
DBGPRINT(RT_DEBUG_TRACE, ("====> rt30xx E Write 0x83 Command = 0x%x.\n", PCIePowerSaveLevel)); DBGPRINT(RT_DEBUG_TRACE,
("====> rt30xx E Write 0x83 Command = 0x%x.\n",
PCIePowerSaveLevel));
AsicSendCommandToMcu(pAd, 0x83, 0xff, (UCHAR)PCIePowerSaveLevel, 0x00); AsicSendCommandToMcu(pAd, 0x83, 0xff,
} (UCHAR) PCIePowerSaveLevel, 0x00);
else } else {
{
// Chip Version F and after only allow 1 or 2 or 3. This might be modified after new chip version come out. // Chip Version F and after only allow 1 or 2 or 3. This might be modified after new chip version come out.
if (!((PCIePowerSaveLevel == 1) || (PCIePowerSaveLevel == 3))) if (!
((PCIePowerSaveLevel == 1)
|| (PCIePowerSaveLevel == 3)))
PCIePowerSaveLevel = 1; PCIePowerSaveLevel = 1;
DBGPRINT(RT_DEBUG_ERROR, ("====> rt30xx F Write 0x83 Command = 0x%x.\n", PCIePowerSaveLevel)); DBGPRINT(RT_DEBUG_ERROR,
pAd->PCIePowerSaveLevel = (USHORT)PCIePowerSaveLevel; ("====> rt30xx F Write 0x83 Command = 0x%x.\n",
PCIePowerSaveLevel));
pAd->PCIePowerSaveLevel = (USHORT) PCIePowerSaveLevel;
// for 3090F , we need to add high-byte arg for 0x83 command to indicate the link control setting in // for 3090F , we need to add high-byte arg for 0x83 command to indicate the link control setting in
// PCI Configuration Space. Because firmware can't read PCI Configuration Space // PCI Configuration Space. Because firmware can't read PCI Configuration Space
if ((pAd->Rt3xxRalinkLinkCtrl & 0x2) && (pAd->Rt3xxHostLinkCtrl & 0x2)) if ((pAd->Rt3xxRalinkLinkCtrl & 0x2)
{ && (pAd->Rt3xxHostLinkCtrl & 0x2)) {
LinkCtrlSetting = 1; LinkCtrlSetting = 1;
} }
DBGPRINT(RT_DEBUG_TRACE, ("====> rt30xxF LinkCtrlSetting = 0x%x.\n", LinkCtrlSetting)); DBGPRINT(RT_DEBUG_TRACE,
AsicSendCommandToMcu(pAd, 0x83, 0xff, (UCHAR)PCIePowerSaveLevel, LinkCtrlSetting); ("====> rt30xxF LinkCtrlSetting = 0x%x.\n",
LinkCtrlSetting));
AsicSendCommandToMcu(pAd, 0x83, 0xff,
(UCHAR) PCIePowerSaveLevel,
LinkCtrlSetting);
} }
} }
// Find Ralink PCIe Device's Express Capability Offset // Find Ralink PCIe Device's Express Capability Offset
pos = pci_find_capability(pObj->pci_dev, PCI_CAP_ID_EXP); pos = pci_find_capability(pObj->pci_dev, PCI_CAP_ID_EXP);
if (pos != 0) if (pos != 0) {
{
// Ralink PCIe Device's Link Control Register Offset // Ralink PCIe Device's Link Control Register Offset
pAd->RLnkCtrlOffset = pos + PCI_EXP_LNKCTL; pAd->RLnkCtrlOffset = pos + PCI_EXP_LNKCTL;
pci_read_config_word(pObj->pci_dev, pAd->RLnkCtrlOffset, &reg16); pci_read_config_word(pObj->pci_dev, pAd->RLnkCtrlOffset,
&reg16);
Configuration = le2cpu16(reg16); Configuration = le2cpu16(reg16);
DBGPRINT(RT_DEBUG_TRACE, ("Read (Ralink PCIe Link Control Register) offset 0x%x = 0x%x\n", DBGPRINT(RT_DEBUG_TRACE,
("Read (Ralink PCIe Link Control Register) offset 0x%x = 0x%x\n",
pAd->RLnkCtrlOffset, Configuration)); pAd->RLnkCtrlOffset, Configuration));
pAd->RLnkCtrlConfiguration = (Configuration & 0x103); pAd->RLnkCtrlConfiguration = (Configuration & 0x103);
Configuration &= 0xfefc; Configuration &= 0xfefc;
Configuration |= (0x0); Configuration |= (0x0);
#ifdef RT2860 #ifdef RT2860
if ((pObj->DeviceID == NIC2860_PCIe_DEVICE_ID) if ((pObj->DeviceID == NIC2860_PCIe_DEVICE_ID)
||(pObj->DeviceID == NIC2790_PCIe_DEVICE_ID)) || (pObj->DeviceID == NIC2790_PCIe_DEVICE_ID)) {
{
reg16 = cpu2le16(Configuration); reg16 = cpu2le16(Configuration);
pci_write_config_word(pObj->pci_dev, pAd->RLnkCtrlOffset, reg16); pci_write_config_word(pObj->pci_dev,
DBGPRINT(RT_DEBUG_TRACE, ("Write (Ralink PCIe Link Control Register) offset 0x%x = 0x%x\n", pAd->RLnkCtrlOffset, reg16);
DBGPRINT(RT_DEBUG_TRACE,
("Write (Ralink PCIe Link Control Register) offset 0x%x = 0x%x\n",
pos + PCI_EXP_LNKCTL, Configuration)); pos + PCI_EXP_LNKCTL, Configuration));
} }
#endif // RT2860 // #endif // RT2860 //
RTMPFindHostPCIDev(pAd); RTMPFindHostPCIDev(pAd);
if (pObj->parent_pci_dev) if (pObj->parent_pci_dev) {
{
USHORT vendor_id; USHORT vendor_id;
pci_read_config_word(pObj->parent_pci_dev, PCI_VENDOR_ID, &vendor_id); pci_read_config_word(pObj->parent_pci_dev,
PCI_VENDOR_ID, &vendor_id);
vendor_id = le2cpu16(vendor_id); vendor_id = le2cpu16(vendor_id);
if (vendor_id == PCIBUS_INTEL_VENDOR) if (vendor_id == PCIBUS_INTEL_VENDOR) {
{
bFindIntel = TRUE; bFindIntel = TRUE;
RTMP_SET_PSFLAG(pAd, fRTMP_PS_TOGGLE_L1); RTMP_SET_PSFLAG(pAd, fRTMP_PS_TOGGLE_L1);
} }
// Find PCI-to-PCI Bridge Express Capability Offset // Find PCI-to-PCI Bridge Express Capability Offset
pos = pci_find_capability(pObj->parent_pci_dev, PCI_CAP_ID_EXP); pos =
pci_find_capability(pObj->parent_pci_dev,
PCI_CAP_ID_EXP);
if (pos != 0) if (pos != 0) {
{
BOOLEAN bChange = FALSE; BOOLEAN bChange = FALSE;
// PCI-to-PCI Bridge Link Control Register Offset // PCI-to-PCI Bridge Link Control Register Offset
pAd->HostLnkCtrlOffset = pos + PCI_EXP_LNKCTL; pAd->HostLnkCtrlOffset = pos + PCI_EXP_LNKCTL;
pci_read_config_word(pObj->parent_pci_dev, pAd->HostLnkCtrlOffset, &reg16); pci_read_config_word(pObj->parent_pci_dev,
pAd->HostLnkCtrlOffset,
&reg16);
Configuration = le2cpu16(reg16); Configuration = le2cpu16(reg16);
DBGPRINT(RT_DEBUG_TRACE, ("Read (Host PCI-to-PCI Bridge Link Control Register) offset 0x%x = 0x%x\n", DBGPRINT(RT_DEBUG_TRACE,
pAd->HostLnkCtrlOffset, Configuration)); ("Read (Host PCI-to-PCI Bridge Link Control Register) offset 0x%x = 0x%x\n",
pAd->HostLnkCtrlConfiguration = (Configuration & 0x103); pAd->HostLnkCtrlOffset,
Configuration));
pAd->HostLnkCtrlConfiguration =
(Configuration & 0x103);
Configuration &= 0xfefc; Configuration &= 0xfefc;
Configuration |= (0x0); Configuration |= (0x0);
switch (pObj->DeviceID) switch (pObj->DeviceID) {
{
#ifdef RT2860 #ifdef RT2860
case NIC2860_PCIe_DEVICE_ID: case NIC2860_PCIe_DEVICE_ID:
case NIC2790_PCIe_DEVICE_ID: case NIC2790_PCIe_DEVICE_ID:
...@@ -764,58 +752,65 @@ VOID RTMPInitPCIeLinkCtrlValue( ...@@ -764,58 +752,65 @@ VOID RTMPInitPCIeLinkCtrlValue(
break; break;
} }
if (bChange) if (bChange) {
{
reg16 = cpu2le16(Configuration); reg16 = cpu2le16(Configuration);
pci_write_config_word(pObj->parent_pci_dev, pAd->HostLnkCtrlOffset, reg16); pci_write_config_word(pObj->
DBGPRINT(RT_DEBUG_TRACE, ("Write (Host PCI-to-PCI Bridge Link Control Register) offset 0x%x = 0x%x\n", parent_pci_dev,
pAd->HostLnkCtrlOffset, Configuration)); pAd->
} HostLnkCtrlOffset,
reg16);
DBGPRINT(RT_DEBUG_TRACE,
("Write (Host PCI-to-PCI Bridge Link Control Register) offset 0x%x = 0x%x\n",
pAd->HostLnkCtrlOffset,
Configuration));
} }
else } else {
{
pAd->HostLnkCtrlOffset = 0; pAd->HostLnkCtrlOffset = 0;
DBGPRINT(RT_DEBUG_ERROR, ("%s: cannot find PCI-to-PCI Bridge PCI Express Capability!\n", __func__)); DBGPRINT(RT_DEBUG_ERROR,
} ("%s: cannot find PCI-to-PCI Bridge PCI Express Capability!\n",
__func__));
} }
} }
else } else {
{
pAd->RLnkCtrlOffset = 0; pAd->RLnkCtrlOffset = 0;
pAd->HostLnkCtrlOffset = 0; pAd->HostLnkCtrlOffset = 0;
DBGPRINT(RT_DEBUG_ERROR, ("%s: cannot find Ralink PCIe Device's PCI Express Capability!\n", __func__)); DBGPRINT(RT_DEBUG_ERROR,
("%s: cannot find Ralink PCIe Device's PCI Express Capability!\n",
__func__));
} }
if (bFindIntel == FALSE) if (bFindIntel == FALSE) {
{ DBGPRINT(RT_DEBUG_TRACE,
DBGPRINT(RT_DEBUG_TRACE, ("Doesn't find Intel PCI host controller. \n")); ("Doesn't find Intel PCI host controller. \n"));
// Doesn't switch L0, L1, So set PCIePowerSaveLevel to 0xff // Doesn't switch L0, L1, So set PCIePowerSaveLevel to 0xff
pAd->PCIePowerSaveLevel = 0xff; pAd->PCIePowerSaveLevel = 0xff;
if ((pAd->RLnkCtrlOffset != 0) if ((pAd->RLnkCtrlOffset != 0)
#ifdef RT3090 #ifdef RT3090
&& ((pObj->DeviceID == NIC3090_PCIe_DEVICE_ID) && ((pObj->DeviceID == NIC3090_PCIe_DEVICE_ID)
||(pObj->DeviceID == NIC3091_PCIe_DEVICE_ID) || (pObj->DeviceID == NIC3091_PCIe_DEVICE_ID)
||(pObj->DeviceID == NIC3092_PCIe_DEVICE_ID)) || (pObj->DeviceID == NIC3092_PCIe_DEVICE_ID))
#endif // RT3090 // #endif // RT3090 //
) ) {
{ pci_read_config_word(pObj->pci_dev, pAd->RLnkCtrlOffset,
pci_read_config_word(pObj->pci_dev, pAd->RLnkCtrlOffset, &reg16); &reg16);
Configuration = le2cpu16(reg16); Configuration = le2cpu16(reg16);
DBGPRINT(RT_DEBUG_TRACE, ("Read (Ralink 30xx PCIe Link Control Register) offset 0x%x = 0x%x\n", DBGPRINT(RT_DEBUG_TRACE,
("Read (Ralink 30xx PCIe Link Control Register) offset 0x%x = 0x%x\n",
pAd->RLnkCtrlOffset, Configuration)); pAd->RLnkCtrlOffset, Configuration));
pAd->RLnkCtrlConfiguration = (Configuration & 0x103); pAd->RLnkCtrlConfiguration = (Configuration & 0x103);
Configuration &= 0xfefc; Configuration &= 0xfefc;
Configuration |= (0x0); Configuration |= (0x0);
reg16 = cpu2le16(Configuration); reg16 = cpu2le16(Configuration);
pci_write_config_word(pObj->pci_dev, pAd->RLnkCtrlOffset, reg16); pci_write_config_word(pObj->pci_dev,
DBGPRINT(RT_DEBUG_TRACE, ("Write (Ralink PCIe Link Control Register) offset 0x%x = 0x%x\n", pAd->RLnkCtrlOffset, reg16);
DBGPRINT(RT_DEBUG_TRACE,
("Write (Ralink PCIe Link Control Register) offset 0x%x = 0x%x\n",
pos + PCI_EXP_LNKCTL, Configuration)); pos + PCI_EXP_LNKCTL, Configuration));
} }
} }
} }
VOID RTMPFindHostPCIDev( VOID RTMPFindHostPCIDev(IN PRTMP_ADAPTER pAd)
IN PRTMP_ADAPTER pAd)
{ {
USHORT reg16; USHORT reg16;
UCHAR reg8; UCHAR reg8;
...@@ -831,19 +826,18 @@ VOID RTMPFindHostPCIDev( ...@@ -831,19 +826,18 @@ VOID RTMPFindHostPCIDev(
DBGPRINT(RT_DEBUG_TRACE, ("%s.===>\n", __func__)); DBGPRINT(RT_DEBUG_TRACE, ("%s.===>\n", __func__));
pObj->parent_pci_dev = NULL; pObj->parent_pci_dev = NULL;
if (pObj->pci_dev->bus->parent) if (pObj->pci_dev->bus->parent) {
{ for (DevFn = 0; DevFn < 255; DevFn++) {
for (DevFn = 0; DevFn < 255; DevFn++) pPci_dev =
{ pci_get_slot(pObj->pci_dev->bus->parent, DevFn);
pPci_dev = pci_get_slot(pObj->pci_dev->bus->parent, DevFn); if (pPci_dev) {
if (pPci_dev) pci_read_config_word(pPci_dev, PCI_CLASS_DEVICE,
{ &reg16);
pci_read_config_word(pPci_dev, PCI_CLASS_DEVICE, &reg16);
reg16 = le2cpu16(reg16); reg16 = le2cpu16(reg16);
pci_read_config_byte(pPci_dev, PCI_CB_CARD_BUS, &reg8); pci_read_config_byte(pPci_dev, PCI_CB_CARD_BUS,
if ((reg16 == PCI_CLASS_BRIDGE_PCI) && &reg8);
(reg8 == pObj->pci_dev->bus->number)) if ((reg16 == PCI_CLASS_BRIDGE_PCI)
{ && (reg8 == pObj->pci_dev->bus->number)) {
pObj->parent_pci_dev = pPci_dev; pObj->parent_pci_dev = pPci_dev;
} }
} }
...@@ -862,9 +856,7 @@ VOID RTMPFindHostPCIDev( ...@@ -862,9 +856,7 @@ VOID RTMPFindHostPCIDev(
======================================================================== ========================================================================
*/ */
VOID RTMPPCIeLinkCtrlValueRestore( VOID RTMPPCIeLinkCtrlValueRestore(IN PRTMP_ADAPTER pAd, IN UCHAR Level)
IN PRTMP_ADAPTER pAd,
IN UCHAR Level)
{ {
USHORT PCIePowerSaveLevel, reg16; USHORT PCIePowerSaveLevel, reg16;
USHORT Configuration; USHORT Configuration;
...@@ -877,7 +869,7 @@ VOID RTMPPCIeLinkCtrlValueRestore( ...@@ -877,7 +869,7 @@ VOID RTMPPCIeLinkCtrlValueRestore(
#ifdef RT2860 #ifdef RT2860
if (!((pObj->DeviceID == NIC2860_PCIe_DEVICE_ID) if (!((pObj->DeviceID == NIC2860_PCIe_DEVICE_ID)
||(pObj->DeviceID == NIC2790_PCIe_DEVICE_ID))) || (pObj->DeviceID == NIC2790_PCIe_DEVICE_ID)))
return; return;
#endif // RT2860 // #endif // RT2860 //
// Check PSControl Configuration // Check PSControl Configuration
...@@ -889,60 +881,62 @@ VOID RTMPPCIeLinkCtrlValueRestore( ...@@ -889,60 +881,62 @@ VOID RTMPPCIeLinkCtrlValueRestore(
#ifdef RT3090 #ifdef RT3090
if ((pObj->DeviceID == NIC3090_PCIe_DEVICE_ID) if ((pObj->DeviceID == NIC3090_PCIe_DEVICE_ID)
||(pObj->DeviceID == NIC3091_PCIe_DEVICE_ID) || (pObj->DeviceID == NIC3091_PCIe_DEVICE_ID)
||(pObj->DeviceID == NIC3092_PCIe_DEVICE_ID)) || (pObj->DeviceID == NIC3092_PCIe_DEVICE_ID))
return; return;
#endif // RT3090 // #endif // RT3090 //
DBGPRINT(RT_DEBUG_TRACE, ("%s.===>\n", __func__)); DBGPRINT(RT_DEBUG_TRACE, ("%s.===>\n", __func__));
PCIePowerSaveLevel = pAd->PCIePowerSaveLevel; PCIePowerSaveLevel = pAd->PCIePowerSaveLevel;
if ((PCIePowerSaveLevel&0xff) == 0xff) if ((PCIePowerSaveLevel & 0xff) == 0xff) {
{ DBGPRINT(RT_DEBUG_TRACE, ("return \n"));
DBGPRINT(RT_DEBUG_TRACE,("return \n"));
return; return;
} }
if (pObj->parent_pci_dev && (pAd->HostLnkCtrlOffset != 0)) if (pObj->parent_pci_dev && (pAd->HostLnkCtrlOffset != 0)) {
{ PCI_REG_READ_WORD(pObj->parent_pci_dev, pAd->HostLnkCtrlOffset,
PCI_REG_READ_WORD(pObj->parent_pci_dev, pAd->HostLnkCtrlOffset, Configuration); Configuration);
if ((Configuration != 0) && if ((Configuration != 0) && (Configuration != 0xFFFF)) {
(Configuration != 0xFFFF))
{
Configuration &= 0xfefc; Configuration &= 0xfefc;
// If call from interface down, restore to orginial setting. // If call from interface down, restore to orginial setting.
if (Level == RESTORE_CLOSE) if (Level == RESTORE_CLOSE) {
{
Configuration |= pAd->HostLnkCtrlConfiguration; Configuration |= pAd->HostLnkCtrlConfiguration;
} } else
else
Configuration |= 0x0; Configuration |= 0x0;
PCI_REG_WIRTE_WORD(pObj->parent_pci_dev, pAd->HostLnkCtrlOffset, Configuration); PCI_REG_WIRTE_WORD(pObj->parent_pci_dev,
DBGPRINT(RT_DEBUG_TRACE, ("Restore PCI host : offset 0x%x = 0x%x\n", pAd->HostLnkCtrlOffset, Configuration)); pAd->HostLnkCtrlOffset,
} Configuration);
else DBGPRINT(RT_DEBUG_TRACE,
DBGPRINT(RT_DEBUG_ERROR, ("Restore PCI host : PCI_REG_READ_WORD failed (Configuration = 0x%x)\n", Configuration)); ("Restore PCI host : offset 0x%x = 0x%x\n",
pAd->HostLnkCtrlOffset, Configuration));
} else
DBGPRINT(RT_DEBUG_ERROR,
("Restore PCI host : PCI_REG_READ_WORD failed (Configuration = 0x%x)\n",
Configuration));
} }
if (pObj->pci_dev && (pAd->RLnkCtrlOffset != 0)) if (pObj->pci_dev && (pAd->RLnkCtrlOffset != 0)) {
{ PCI_REG_READ_WORD(pObj->pci_dev, pAd->RLnkCtrlOffset,
PCI_REG_READ_WORD(pObj->pci_dev, pAd->RLnkCtrlOffset, Configuration); Configuration);
if ((Configuration != 0) && if ((Configuration != 0) && (Configuration != 0xFFFF)) {
(Configuration != 0xFFFF))
{
Configuration &= 0xfefc; Configuration &= 0xfefc;
// If call from interface down, restore to orginial setting. // If call from interface down, restore to orginial setting.
if (Level == RESTORE_CLOSE) if (Level == RESTORE_CLOSE)
Configuration |= pAd->RLnkCtrlConfiguration; Configuration |= pAd->RLnkCtrlConfiguration;
else else
Configuration |= 0x0; Configuration |= 0x0;
PCI_REG_WIRTE_WORD(pObj->pci_dev, pAd->RLnkCtrlOffset, Configuration); PCI_REG_WIRTE_WORD(pObj->pci_dev, pAd->RLnkCtrlOffset,
DBGPRINT(RT_DEBUG_TRACE, ("Restore Ralink : offset 0x%x = 0x%x\n", pAd->RLnkCtrlOffset, Configuration)); Configuration);
} DBGPRINT(RT_DEBUG_TRACE,
else ("Restore Ralink : offset 0x%x = 0x%x\n",
DBGPRINT(RT_DEBUG_ERROR, ("Restore Ralink : PCI_REG_READ_WORD failed (Configuration = 0x%x)\n", Configuration)); pAd->RLnkCtrlOffset, Configuration));
} else
DBGPRINT(RT_DEBUG_ERROR,
("Restore Ralink : PCI_REG_READ_WORD failed (Configuration = 0x%x)\n",
Configuration));
} }
DBGPRINT(RT_DEBUG_TRACE,("%s <===\n", __func__)); DBGPRINT(RT_DEBUG_TRACE, ("%s <===\n", __func__));
} }
/* /*
...@@ -956,9 +950,7 @@ VOID RTMPPCIeLinkCtrlValueRestore( ...@@ -956,9 +950,7 @@ VOID RTMPPCIeLinkCtrlValueRestore(
======================================================================== ========================================================================
*/ */
VOID RTMPPCIeLinkCtrlSetting( VOID RTMPPCIeLinkCtrlSetting(IN PRTMP_ADAPTER pAd, IN USHORT Max)
IN PRTMP_ADAPTER pAd,
IN USHORT Max)
{ {
USHORT PCIePowerSaveLevel, reg16; USHORT PCIePowerSaveLevel, reg16;
USHORT Configuration; USHORT Configuration;
...@@ -971,7 +963,7 @@ VOID RTMPPCIeLinkCtrlSetting( ...@@ -971,7 +963,7 @@ VOID RTMPPCIeLinkCtrlSetting(
#ifdef RT2860 #ifdef RT2860
if (!((pObj->DeviceID == NIC2860_PCIe_DEVICE_ID) if (!((pObj->DeviceID == NIC2860_PCIe_DEVICE_ID)
||(pObj->DeviceID == NIC2790_PCIe_DEVICE_ID))) || (pObj->DeviceID == NIC2790_PCIe_DEVICE_ID)))
return; return;
#endif // RT2860 // #endif // RT2860 //
// Check PSControl Configuration // Check PSControl Configuration
...@@ -983,31 +975,29 @@ VOID RTMPPCIeLinkCtrlSetting( ...@@ -983,31 +975,29 @@ VOID RTMPPCIeLinkCtrlSetting(
#ifdef RT3090 #ifdef RT3090
if ((pObj->DeviceID == NIC3090_PCIe_DEVICE_ID) if ((pObj->DeviceID == NIC3090_PCIe_DEVICE_ID)
||(pObj->DeviceID == NIC3091_PCIe_DEVICE_ID) || (pObj->DeviceID == NIC3091_PCIe_DEVICE_ID)
||(pObj->DeviceID == NIC3092_PCIe_DEVICE_ID)) || (pObj->DeviceID == NIC3092_PCIe_DEVICE_ID))
return; return;
#endif // RT3090 // #endif // RT3090 //
if (!RTMP_TEST_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP)) if (!RTMP_TEST_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP)) {
{ DBGPRINT(RT_DEBUG_INFO,
DBGPRINT(RT_DEBUG_INFO, ("RTMPPCIePowerLinkCtrl return on fRTMP_PS_CAN_GO_SLEEP flag\n")); ("RTMPPCIePowerLinkCtrl return on fRTMP_PS_CAN_GO_SLEEP flag\n"));
return; return;
} }
DBGPRINT(RT_DEBUG_TRACE,("%s===>\n", __func__)); DBGPRINT(RT_DEBUG_TRACE, ("%s===>\n", __func__));
PCIePowerSaveLevel = pAd->PCIePowerSaveLevel; PCIePowerSaveLevel = pAd->PCIePowerSaveLevel;
if ((PCIePowerSaveLevel&0xff) == 0xff) if ((PCIePowerSaveLevel & 0xff) == 0xff) {
{ DBGPRINT(RT_DEBUG_TRACE, ("return \n"));
DBGPRINT(RT_DEBUG_TRACE,("return \n"));
return; return;
} }
PCIePowerSaveLevel = PCIePowerSaveLevel>>6; PCIePowerSaveLevel = PCIePowerSaveLevel >> 6;
// Skip non-exist deice right away // Skip non-exist deice right away
if (pObj->parent_pci_dev && (pAd->HostLnkCtrlOffset != 0)) if (pObj->parent_pci_dev && (pAd->HostLnkCtrlOffset != 0)) {
{ PCI_REG_READ_WORD(pObj->parent_pci_dev, pAd->HostLnkCtrlOffset,
PCI_REG_READ_WORD(pObj->parent_pci_dev, pAd->HostLnkCtrlOffset, Configuration); Configuration);
switch (PCIePowerSaveLevel) switch (PCIePowerSaveLevel) {
{
case 0: case 0:
// Set b0 and b1 of LinkControl (both 2892 and PCIe bridge) to 00 // Set b0 and b1 of LinkControl (both 2892 and PCIe bridge) to 00
Configuration &= 0xfefc; Configuration &= 0xfefc;
...@@ -1028,19 +1018,21 @@ VOID RTMPPCIeLinkCtrlSetting( ...@@ -1028,19 +1018,21 @@ VOID RTMPPCIeLinkCtrlSetting(
Configuration |= 0x103; Configuration |= 0x103;
break; break;
} }
PCI_REG_WIRTE_WORD(pObj->parent_pci_dev, pAd->HostLnkCtrlOffset, Configuration); PCI_REG_WIRTE_WORD(pObj->parent_pci_dev, pAd->HostLnkCtrlOffset,
DBGPRINT(RT_DEBUG_TRACE, ("Write PCI host offset 0x%x = 0x%x\n", pAd->HostLnkCtrlOffset, Configuration)); Configuration);
DBGPRINT(RT_DEBUG_TRACE,
("Write PCI host offset 0x%x = 0x%x\n",
pAd->HostLnkCtrlOffset, Configuration));
} }
if (pObj->pci_dev && (pAd->RLnkCtrlOffset != 0)) if (pObj->pci_dev && (pAd->RLnkCtrlOffset != 0)) {
{
// first 2892 chip not allow to frequently set mode 3. will cause hang problem. // first 2892 chip not allow to frequently set mode 3. will cause hang problem.
if (PCIePowerSaveLevel > Max) if (PCIePowerSaveLevel > Max)
PCIePowerSaveLevel = Max; PCIePowerSaveLevel = Max;
PCI_REG_READ_WORD(pObj->pci_dev, pAd->RLnkCtrlOffset, Configuration); PCI_REG_READ_WORD(pObj->pci_dev, pAd->RLnkCtrlOffset,
switch (PCIePowerSaveLevel) Configuration);
{ switch (PCIePowerSaveLevel) {
case 0: case 0:
// No PCI power safe // No PCI power safe
// Set b0 and b1 of LinkControl (both 2892 and PCIe bridge) to 00 . // Set b0 and b1 of LinkControl (both 2892 and PCIe bridge) to 00 .
...@@ -1066,11 +1058,14 @@ VOID RTMPPCIeLinkCtrlSetting( ...@@ -1066,11 +1058,14 @@ VOID RTMPPCIeLinkCtrlSetting(
pAd->bPCIclkOff = TRUE; pAd->bPCIclkOff = TRUE;
break; break;
} }
PCI_REG_WIRTE_WORD(pObj->pci_dev, pAd->RLnkCtrlOffset, Configuration); PCI_REG_WIRTE_WORD(pObj->pci_dev, pAd->RLnkCtrlOffset,
DBGPRINT(RT_DEBUG_TRACE, ("Write Ralink device : offset 0x%x = 0x%x\n", pAd->RLnkCtrlOffset, Configuration)); Configuration);
DBGPRINT(RT_DEBUG_TRACE,
("Write Ralink device : offset 0x%x = 0x%x\n",
pAd->RLnkCtrlOffset, Configuration));
} }
DBGPRINT(RT_DEBUG_TRACE,("RTMPPCIePowerLinkCtrl <==============\n")); DBGPRINT(RT_DEBUG_TRACE, ("RTMPPCIePowerLinkCtrl <==============\n"));
} }
/* /*
...@@ -1081,8 +1076,7 @@ VOID RTMPPCIeLinkCtrlSetting( ...@@ -1081,8 +1076,7 @@ VOID RTMPPCIeLinkCtrlSetting(
======================================================================== ========================================================================
*/ */
VOID RTMPrt3xSetPCIePowerLinkCtrl( VOID RTMPrt3xSetPCIePowerLinkCtrl(IN PRTMP_ADAPTER pAd)
IN PRTMP_ADAPTER pAd)
{ {
ULONG HostConfiguration = 0; ULONG HostConfiguration = 0;
...@@ -1101,28 +1095,28 @@ VOID RTMPrt3xSetPCIePowerLinkCtrl( ...@@ -1101,28 +1095,28 @@ VOID RTMPrt3xSetPCIePowerLinkCtrl(
if (pAd->StaCfg.PSControl.field.EnableNewPS == FALSE) if (pAd->StaCfg.PSControl.field.EnableNewPS == FALSE)
return; return;
RTMPFindHostPCIDev(pAd); RTMPFindHostPCIDev(pAd);
if (pObj->parent_pci_dev) if (pObj->parent_pci_dev) {
{
// Find PCI-to-PCI Bridge Express Capability Offset // Find PCI-to-PCI Bridge Express Capability Offset
pos = pci_find_capability(pObj->parent_pci_dev, PCI_CAP_ID_EXP); pos = pci_find_capability(pObj->parent_pci_dev, PCI_CAP_ID_EXP);
if (pos != 0) if (pos != 0) {
{
pAd->HostLnkCtrlOffset = pos + PCI_EXP_LNKCTL; pAd->HostLnkCtrlOffset = pos + PCI_EXP_LNKCTL;
} }
// If configurared to turn on L1. // If configurared to turn on L1.
HostConfiguration = 0; HostConfiguration = 0;
if (pAd->StaCfg.PSControl.field.rt30xxForceASPMTest == 1) if (pAd->StaCfg.PSControl.field.rt30xxForceASPMTest == 1) {
{
DBGPRINT(RT_DEBUG_TRACE, ("Enter,PSM : Force ASPM \n")); DBGPRINT(RT_DEBUG_TRACE, ("Enter,PSM : Force ASPM \n"));
// Skip non-exist deice right away // Skip non-exist deice right away
if ((pAd->HostLnkCtrlOffset != 0)) if ((pAd->HostLnkCtrlOffset != 0)) {
{ PCI_REG_READ_WORD(pObj->parent_pci_dev,
PCI_REG_READ_WORD(pObj->parent_pci_dev, pAd->HostLnkCtrlOffset, HostConfiguration); pAd->HostLnkCtrlOffset,
HostConfiguration);
// Prepare Configuration to write to Host // Prepare Configuration to write to Host
HostConfiguration |= 0x3; HostConfiguration |= 0x3;
PCI_REG_WIRTE_WORD(pObj->parent_pci_dev, pAd->HostLnkCtrlOffset, HostConfiguration); PCI_REG_WIRTE_WORD(pObj->parent_pci_dev,
pAd->HostLnkCtrlOffset,
HostConfiguration);
pAd->Rt3xxHostLinkCtrl = HostConfiguration; pAd->Rt3xxHostLinkCtrl = HostConfiguration;
// Because in rt30xxForceASPMTest Mode, Force turn on L0s, L1. // Because in rt30xxForceASPMTest Mode, Force turn on L0s, L1.
// Fix HostConfiguration bit0:1 = 0x3 for later use. // Fix HostConfiguration bit0:1 = 0x3 for later use.
...@@ -1132,14 +1126,14 @@ VOID RTMPrt3xSetPCIePowerLinkCtrl( ...@@ -1132,14 +1126,14 @@ VOID RTMPrt3xSetPCIePowerLinkCtrl(
"Host device L1/L0s Value = 0x%lx\n", "Host device L1/L0s Value = 0x%lx\n",
HostConfiguration)); HostConfiguration));
} }
} } else if (pAd->StaCfg.PSControl.field.rt30xxFollowHostASPM ==
else if (pAd->StaCfg.PSControl.field.rt30xxFollowHostASPM == 1) 1) {
{
// Skip non-exist deice right away // Skip non-exist deice right away
if ((pAd->HostLnkCtrlOffset != 0)) if ((pAd->HostLnkCtrlOffset != 0)) {
{ PCI_REG_READ_WORD(pObj->parent_pci_dev,
PCI_REG_READ_WORD(pObj->parent_pci_dev, pAd->HostLnkCtrlOffset, HostConfiguration); pAd->HostLnkCtrlOffset,
HostConfiguration);
pAd->Rt3xxHostLinkCtrl = HostConfiguration; pAd->Rt3xxHostLinkCtrl = HostConfiguration;
HostConfiguration &= 0x3; HostConfiguration &= 0x3;
DBGPRINT(RT_DEBUG_TRACE, DBGPRINT(RT_DEBUG_TRACE,
...@@ -1153,11 +1147,11 @@ VOID RTMPrt3xSetPCIePowerLinkCtrl( ...@@ -1153,11 +1147,11 @@ VOID RTMPrt3xSetPCIePowerLinkCtrl(
// Find Ralink PCIe Device's Express Capability Offset // Find Ralink PCIe Device's Express Capability Offset
pos = pci_find_capability(pObj->pci_dev, PCI_CAP_ID_EXP); pos = pci_find_capability(pObj->pci_dev, PCI_CAP_ID_EXP);
if (pos != 0) if (pos != 0) {
{
// Ralink PCIe Device's Link Control Register Offset // Ralink PCIe Device's Link Control Register Offset
pAd->RLnkCtrlOffset = pos + PCI_EXP_LNKCTL; pAd->RLnkCtrlOffset = pos + PCI_EXP_LNKCTL;
pci_read_config_word(pObj->pci_dev, pAd->RLnkCtrlOffset, &reg16); pci_read_config_word(pObj->pci_dev, pAd->RLnkCtrlOffset,
&reg16);
Configuration = le2cpu16(reg16); Configuration = le2cpu16(reg16);
DBGPRINT(RT_DEBUG_TRACE, DBGPRINT(RT_DEBUG_TRACE,
("Read (Ralink PCIe Link Control Register) " ("Read (Ralink PCIe Link Control Register) "
...@@ -1165,10 +1159,8 @@ VOID RTMPrt3xSetPCIePowerLinkCtrl( ...@@ -1165,10 +1159,8 @@ VOID RTMPrt3xSetPCIePowerLinkCtrl(
pAd->RLnkCtrlOffset, Configuration)); pAd->RLnkCtrlOffset, Configuration));
Configuration |= 0x100; Configuration |= 0x100;
if ((pAd->StaCfg.PSControl.field.rt30xxFollowHostASPM == 1) if ((pAd->StaCfg.PSControl.field.rt30xxFollowHostASPM == 1)
|| (pAd->StaCfg.PSControl.field.rt30xxForceASPMTest == 1)) || (pAd->StaCfg.PSControl.field.rt30xxForceASPMTest == 1)) {
{ switch (HostConfiguration) {
switch(HostConfiguration)
{
case 0: case 0:
Configuration &= 0xffffffc; Configuration &= 0xffffffc;
break; break;
...@@ -1186,11 +1178,13 @@ VOID RTMPrt3xSetPCIePowerLinkCtrl( ...@@ -1186,11 +1178,13 @@ VOID RTMPrt3xSetPCIePowerLinkCtrl(
} }
} }
reg16 = cpu2le16(Configuration); reg16 = cpu2le16(Configuration);
pci_write_config_word(pObj->pci_dev, pAd->RLnkCtrlOffset, reg16); pci_write_config_word(pObj->pci_dev, pAd->RLnkCtrlOffset,
reg16);
pAd->Rt3xxRalinkLinkCtrl = Configuration; pAd->Rt3xxRalinkLinkCtrl = Configuration;
DBGPRINT(RT_DEBUG_TRACE, DBGPRINT(RT_DEBUG_TRACE,
("PSM :Write Ralink device L1/L0s Value = 0x%lx\n", ("PSM :Write Ralink device L1/L0s Value = 0x%lx\n",
Configuration)); Configuration));
} }
DBGPRINT(RT_DEBUG_INFO,("PSM :RTMPrt3xSetPCIePowerLinkCtrl <==============\n")); DBGPRINT(RT_DEBUG_INFO,
("PSM :RTMPrt3xSetPCIePowerLinkCtrl <==============\n"));
} }
...@@ -30,7 +30,6 @@ ...@@ -30,7 +30,6 @@
ULONG RTDebugLevel = RT_DEBUG_ERROR; ULONG RTDebugLevel = RT_DEBUG_ERROR;
// for wireless system event message // for wireless system event message
char const *pWirelessSysEventText[IW_SYS_EVENT_TYPE_NUM] = { char const *pWirelessSysEventText[IW_SYS_EVENT_TYPE_NUM] = {
// system status event // system status event
...@@ -53,7 +52,7 @@ char const *pWirelessSysEventText[IW_SYS_EVENT_TYPE_NUM] = { ...@@ -53,7 +52,7 @@ char const *pWirelessSysEventText[IW_SYS_EVENT_TYPE_NUM] = {
"disconnects with our wireless client", /* IW_STA_LINKDOWN_EVENT_FLAG */ "disconnects with our wireless client", /* IW_STA_LINKDOWN_EVENT_FLAG */
"scan completed" /* IW_SCAN_COMPLETED_EVENT_FLAG */ "scan completed" /* IW_SCAN_COMPLETED_EVENT_FLAG */
"scan terminate!! Busy!! Enqueue fail!!" /* IW_SCAN_ENQUEUE_FAIL_EVENT_FLAG */ "scan terminate!! Busy!! Enqueue fail!!" /* IW_SCAN_ENQUEUE_FAIL_EVENT_FLAG */
}; };
// for wireless IDS_spoof_attack event message // for wireless IDS_spoof_attack event message
char const *pWirelessSpoofEventText[IW_SPOOF_EVENT_TYPE_NUM] = { char const *pWirelessSpoofEventText[IW_SPOOF_EVENT_TYPE_NUM] = {
...@@ -67,7 +66,7 @@ char const *pWirelessSpoofEventText[IW_SPOOF_EVENT_TYPE_NUM] = { ...@@ -67,7 +66,7 @@ char const *pWirelessSpoofEventText[IW_SPOOF_EVENT_TYPE_NUM] = {
"detected spoofed deauthentication", /* IW_SPOOF_DEAUTH_EVENT_FLAG */ "detected spoofed deauthentication", /* IW_SPOOF_DEAUTH_EVENT_FLAG */
"detected spoofed unknown management frame", /* IW_SPOOF_UNKNOWN_MGMT_EVENT_FLAG */ "detected spoofed unknown management frame", /* IW_SPOOF_UNKNOWN_MGMT_EVENT_FLAG */
"detected replay attack" /* IW_REPLAY_ATTACK_EVENT_FLAG */ "detected replay attack" /* IW_REPLAY_ATTACK_EVENT_FLAG */
}; };
// for wireless IDS_flooding_attack event message // for wireless IDS_flooding_attack event message
char const *pWirelessFloodEventText[IW_FLOOD_EVENT_TYPE_NUM] = { char const *pWirelessFloodEventText[IW_FLOOD_EVENT_TYPE_NUM] = {
...@@ -78,76 +77,63 @@ char const *pWirelessFloodEventText[IW_FLOOD_EVENT_TYPE_NUM] = { ...@@ -78,76 +77,63 @@ char const *pWirelessFloodEventText[IW_FLOOD_EVENT_TYPE_NUM] = {
"detected disassociation flooding", /* IW_FLOOD_DISASSOC_EVENT_FLAG */ "detected disassociation flooding", /* IW_FLOOD_DISASSOC_EVENT_FLAG */
"detected deauthentication flooding", /* IW_FLOOD_DEAUTH_EVENT_FLAG */ "detected deauthentication flooding", /* IW_FLOOD_DEAUTH_EVENT_FLAG */
"detected 802.1x eap-request flooding" /* IW_FLOOD_EAP_REQ_EVENT_FLAG */ "detected 802.1x eap-request flooding" /* IW_FLOOD_EAP_REQ_EVENT_FLAG */
}; };
/* timeout -- ms */ /* timeout -- ms */
VOID RTMP_SetPeriodicTimer( VOID RTMP_SetPeriodicTimer(IN NDIS_MINIPORT_TIMER * pTimer,
IN NDIS_MINIPORT_TIMER *pTimer,
IN unsigned long timeout) IN unsigned long timeout)
{ {
timeout = ((timeout*OS_HZ) / 1000); timeout = ((timeout * OS_HZ) / 1000);
pTimer->expires = jiffies + timeout; pTimer->expires = jiffies + timeout;
add_timer(pTimer); add_timer(pTimer);
} }
/* convert NdisMInitializeTimer --> RTMP_OS_Init_Timer */ /* convert NdisMInitializeTimer --> RTMP_OS_Init_Timer */
VOID RTMP_OS_Init_Timer( VOID RTMP_OS_Init_Timer(IN PRTMP_ADAPTER pAd,
IN PRTMP_ADAPTER pAd, IN NDIS_MINIPORT_TIMER * pTimer,
IN NDIS_MINIPORT_TIMER *pTimer, IN TIMER_FUNCTION function, IN PVOID data)
IN TIMER_FUNCTION function,
IN PVOID data)
{ {
init_timer(pTimer); init_timer(pTimer);
pTimer->data = (unsigned long)data; pTimer->data = (unsigned long)data;
pTimer->function = function; pTimer->function = function;
} }
VOID RTMP_OS_Add_Timer(IN NDIS_MINIPORT_TIMER * pTimer,
VOID RTMP_OS_Add_Timer(
IN NDIS_MINIPORT_TIMER *pTimer,
IN unsigned long timeout) IN unsigned long timeout)
{ {
if (timer_pending(pTimer)) if (timer_pending(pTimer))
return; return;
timeout = ((timeout*OS_HZ) / 1000); timeout = ((timeout * OS_HZ) / 1000);
pTimer->expires = jiffies + timeout; pTimer->expires = jiffies + timeout;
add_timer(pTimer); add_timer(pTimer);
} }
VOID RTMP_OS_Mod_Timer( VOID RTMP_OS_Mod_Timer(IN NDIS_MINIPORT_TIMER * pTimer,
IN NDIS_MINIPORT_TIMER *pTimer,
IN unsigned long timeout) IN unsigned long timeout)
{ {
timeout = ((timeout*OS_HZ) / 1000); timeout = ((timeout * OS_HZ) / 1000);
mod_timer(pTimer, jiffies + timeout); mod_timer(pTimer, jiffies + timeout);
} }
VOID RTMP_OS_Del_Timer( VOID RTMP_OS_Del_Timer(IN NDIS_MINIPORT_TIMER * pTimer,
IN NDIS_MINIPORT_TIMER *pTimer, OUT BOOLEAN * pCancelled)
OUT BOOLEAN *pCancelled)
{ {
if (timer_pending(pTimer)) if (timer_pending(pTimer)) {
{
*pCancelled = del_timer_sync(pTimer); *pCancelled = del_timer_sync(pTimer);
} } else {
else
{
*pCancelled = TRUE; *pCancelled = TRUE;
} }
} }
VOID RTMP_OS_Release_Packet( VOID RTMP_OS_Release_Packet(IN PRTMP_ADAPTER pAd, IN PQUEUE_ENTRY pEntry)
IN PRTMP_ADAPTER pAd,
IN PQUEUE_ENTRY pEntry)
{ {
//RTMPFreeNdisPacket(pAd, (struct sk_buff *)pEntry); //RTMPFreeNdisPacket(pAd, (struct sk_buff *)pEntry);
} }
// Unify all delay routine by using udelay // Unify all delay routine by using udelay
VOID RTMPusecDelay( VOID RTMPusecDelay(IN ULONG usec)
IN ULONG usec)
{ {
ULONG i; ULONG i;
...@@ -158,16 +144,13 @@ VOID RTMPusecDelay( ...@@ -158,16 +144,13 @@ VOID RTMPusecDelay(
udelay(usec % 50); udelay(usec % 50);
} }
void RTMP_GetCurrentSystemTime(LARGE_INTEGER *time) void RTMP_GetCurrentSystemTime(LARGE_INTEGER * time)
{ {
time->u.LowPart = jiffies; time->u.LowPart = jiffies;
} }
// pAd MUST allow to be NULL // pAd MUST allow to be NULL
NDIS_STATUS os_alloc_mem( NDIS_STATUS os_alloc_mem(IN RTMP_ADAPTER * pAd, OUT UCHAR ** mem, IN ULONG size)
IN RTMP_ADAPTER *pAd,
OUT UCHAR **mem,
IN ULONG size)
{ {
*mem = (PUCHAR) kmalloc(size, GFP_ATOMIC); *mem = (PUCHAR) kmalloc(size, GFP_ATOMIC);
if (*mem) if (*mem)
...@@ -177,9 +160,7 @@ NDIS_STATUS os_alloc_mem( ...@@ -177,9 +160,7 @@ NDIS_STATUS os_alloc_mem(
} }
// pAd MUST allow to be NULL // pAd MUST allow to be NULL
NDIS_STATUS os_free_mem( NDIS_STATUS os_free_mem(IN PRTMP_ADAPTER pAd, IN PVOID mem)
IN PRTMP_ADAPTER pAd,
IN PVOID mem)
{ {
ASSERT(mem); ASSERT(mem);
...@@ -187,77 +168,61 @@ NDIS_STATUS os_free_mem( ...@@ -187,77 +168,61 @@ NDIS_STATUS os_free_mem(
return (NDIS_STATUS_SUCCESS); return (NDIS_STATUS_SUCCESS);
} }
PNDIS_PACKET RtmpOSNetPktAlloc(IN RTMP_ADAPTER * pAd, IN int size)
PNDIS_PACKET RtmpOSNetPktAlloc(
IN RTMP_ADAPTER *pAd,
IN int size)
{ {
struct sk_buff *skb; struct sk_buff *skb;
/* Add 2 more bytes for ip header alignment*/ /* Add 2 more bytes for ip header alignment */
skb = dev_alloc_skb(size+2); skb = dev_alloc_skb(size + 2);
return ((PNDIS_PACKET)skb); return ((PNDIS_PACKET) skb);
} }
PNDIS_PACKET RTMP_AllocateFragPacketBuffer(IN PRTMP_ADAPTER pAd,
PNDIS_PACKET RTMP_AllocateFragPacketBuffer(
IN PRTMP_ADAPTER pAd,
IN ULONG Length) IN ULONG Length)
{ {
struct sk_buff *pkt; struct sk_buff *pkt;
pkt = dev_alloc_skb(Length); pkt = dev_alloc_skb(Length);
if (pkt == NULL) if (pkt == NULL) {
{ DBGPRINT(RT_DEBUG_ERROR,
DBGPRINT(RT_DEBUG_ERROR, ("can't allocate frag rx %ld size packet\n",Length)); ("can't allocate frag rx %ld size packet\n", Length));
} }
if (pkt) if (pkt) {
{
RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS); RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS);
} }
return (PNDIS_PACKET) pkt; return (PNDIS_PACKET) pkt;
} }
PNDIS_PACKET RTMP_AllocateTxPacketBuffer(IN PRTMP_ADAPTER pAd,
PNDIS_PACKET RTMP_AllocateTxPacketBuffer(
IN PRTMP_ADAPTER pAd,
IN ULONG Length, IN ULONG Length,
IN BOOLEAN Cached, IN BOOLEAN Cached,
OUT PVOID *VirtualAddress) OUT PVOID * VirtualAddress)
{ {
struct sk_buff *pkt; struct sk_buff *pkt;
pkt = dev_alloc_skb(Length); pkt = dev_alloc_skb(Length);
if (pkt == NULL) if (pkt == NULL) {
{ DBGPRINT(RT_DEBUG_ERROR,
DBGPRINT(RT_DEBUG_ERROR, ("can't allocate tx %ld size packet\n",Length)); ("can't allocate tx %ld size packet\n", Length));
} }
if (pkt) if (pkt) {
{
RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS); RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS);
*VirtualAddress = (PVOID) pkt->data; *VirtualAddress = (PVOID) pkt->data;
} } else {
else
{
*VirtualAddress = (PVOID) NULL; *VirtualAddress = (PVOID) NULL;
} }
return (PNDIS_PACKET) pkt; return (PNDIS_PACKET) pkt;
} }
VOID build_tx_packet(IN PRTMP_ADAPTER pAd,
VOID build_tx_packet(
IN PRTMP_ADAPTER pAd,
IN PNDIS_PACKET pPacket, IN PNDIS_PACKET pPacket,
IN PUCHAR pFrame, IN PUCHAR pFrame, IN ULONG FrameLen)
IN ULONG FrameLen)
{ {
struct sk_buff *pTxPkt; struct sk_buff *pTxPkt;
...@@ -268,29 +233,26 @@ VOID build_tx_packet( ...@@ -268,29 +233,26 @@ VOID build_tx_packet(
NdisMoveMemory(skb_put(pTxPkt, FrameLen), pFrame, FrameLen); NdisMoveMemory(skb_put(pTxPkt, FrameLen), pFrame, FrameLen);
} }
VOID RTMPFreeAdapter( VOID RTMPFreeAdapter(IN PRTMP_ADAPTER pAd)
IN PRTMP_ADAPTER pAd)
{ {
POS_COOKIE os_cookie; POS_COOKIE os_cookie;
int index; int index;
os_cookie=(POS_COOKIE)pAd->OS_Cookie; os_cookie = (POS_COOKIE) pAd->OS_Cookie;
if (pAd->BeaconBuf) if (pAd->BeaconBuf)
kfree(pAd->BeaconBuf); kfree(pAd->BeaconBuf);
NdisFreeSpinLock(&pAd->MgmtRingLock); NdisFreeSpinLock(&pAd->MgmtRingLock);
#ifdef RTMP_MAC_PCI #ifdef RTMP_MAC_PCI
NdisFreeSpinLock(&pAd->RxRingLock); NdisFreeSpinLock(&pAd->RxRingLock);
#ifdef RT3090 #ifdef RT3090
NdisFreeSpinLock(&pAd->McuCmdLock); NdisFreeSpinLock(&pAd->McuCmdLock);
#endif // RT3090 // #endif // RT3090 //
#endif // RTMP_MAC_PCI // #endif // RTMP_MAC_PCI //
for (index =0 ; index < NUM_OF_TX_RING; index++) for (index = 0; index < NUM_OF_TX_RING; index++) {
{
NdisFreeSpinLock(&pAd->TxSwQueueLock[index]); NdisFreeSpinLock(&pAd->TxSwQueueLock[index]);
NdisFreeSpinLock(&pAd->DeQueueLock[index]); NdisFreeSpinLock(&pAd->DeQueueLock[index]);
pAd->DeQueueRunning[index] = FALSE; pAd->DeQueueRunning[index] = FALSE;
...@@ -298,7 +260,6 @@ NdisFreeSpinLock(&pAd->McuCmdLock); ...@@ -298,7 +260,6 @@ NdisFreeSpinLock(&pAd->McuCmdLock);
NdisFreeSpinLock(&pAd->irq_lock); NdisFreeSpinLock(&pAd->irq_lock);
vfree(pAd); // pci_free_consistent(os_cookie->pci_dev,sizeof(RTMP_ADAPTER),pAd,os_cookie->pAd_pa); vfree(pAd); // pci_free_consistent(os_cookie->pci_dev,sizeof(RTMP_ADAPTER),pAd,os_cookie->pAd_pa);
if (os_cookie) if (os_cookie)
kfree(os_cookie); kfree(os_cookie);
...@@ -309,8 +270,6 @@ BOOLEAN OS_Need_Clone_Packet(void) ...@@ -309,8 +270,6 @@ BOOLEAN OS_Need_Clone_Packet(void)
return (FALSE); return (FALSE);
} }
/* /*
======================================================================== ========================================================================
...@@ -333,11 +292,10 @@ BOOLEAN OS_Need_Clone_Packet(void) ...@@ -333,11 +292,10 @@ BOOLEAN OS_Need_Clone_Packet(void)
======================================================================== ========================================================================
*/ */
NDIS_STATUS RTMPCloneNdisPacket( NDIS_STATUS RTMPCloneNdisPacket(IN PRTMP_ADAPTER pAd,
IN PRTMP_ADAPTER pAd,
IN BOOLEAN pInsAMSDUHdr, IN BOOLEAN pInsAMSDUHdr,
IN PNDIS_PACKET pInPacket, IN PNDIS_PACKET pInPacket,
OUT PNDIS_PACKET *ppOutPacket) OUT PNDIS_PACKET * ppOutPacket)
{ {
struct sk_buff *pkt; struct sk_buff *pkt;
...@@ -348,16 +306,15 @@ NDIS_STATUS RTMPCloneNdisPacket( ...@@ -348,16 +306,15 @@ NDIS_STATUS RTMPCloneNdisPacket(
// 1. Allocate a packet // 1. Allocate a packet
pkt = dev_alloc_skb(2048); pkt = dev_alloc_skb(2048);
if (pkt == NULL) if (pkt == NULL) {
{
return NDIS_STATUS_FAILURE; return NDIS_STATUS_FAILURE;
} }
skb_put(pkt, GET_OS_PKT_LEN(pInPacket)); skb_put(pkt, GET_OS_PKT_LEN(pInPacket));
NdisMoveMemory(pkt->data, GET_OS_PKT_DATAPTR(pInPacket), GET_OS_PKT_LEN(pInPacket)); NdisMoveMemory(pkt->data, GET_OS_PKT_DATAPTR(pInPacket),
GET_OS_PKT_LEN(pInPacket));
*ppOutPacket = OSPKT_TO_RTPKT(pkt); *ppOutPacket = OSPKT_TO_RTPKT(pkt);
RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS); RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS);
printk("###Clone###\n"); printk("###Clone###\n");
...@@ -365,39 +322,37 @@ NDIS_STATUS RTMPCloneNdisPacket( ...@@ -365,39 +322,37 @@ NDIS_STATUS RTMPCloneNdisPacket(
return NDIS_STATUS_SUCCESS; return NDIS_STATUS_SUCCESS;
} }
// the allocated NDIS PACKET must be freed via RTMPFreeNdisPacket() // the allocated NDIS PACKET must be freed via RTMPFreeNdisPacket()
NDIS_STATUS RTMPAllocateNdisPacket( NDIS_STATUS RTMPAllocateNdisPacket(IN PRTMP_ADAPTER pAd,
IN PRTMP_ADAPTER pAd, OUT PNDIS_PACKET * ppPacket,
OUT PNDIS_PACKET *ppPacket,
IN PUCHAR pHeader, IN PUCHAR pHeader,
IN UINT HeaderLen, IN UINT HeaderLen,
IN PUCHAR pData, IN PUCHAR pData, IN UINT DataLen)
IN UINT DataLen)
{ {
PNDIS_PACKET pPacket; PNDIS_PACKET pPacket;
ASSERT(pData); ASSERT(pData);
ASSERT(DataLen); ASSERT(DataLen);
// 1. Allocate a packet // 1. Allocate a packet
pPacket = (PNDIS_PACKET *) dev_alloc_skb(HeaderLen + DataLen + RTMP_PKT_TAIL_PADDING); pPacket =
if (pPacket == NULL) (PNDIS_PACKET *) dev_alloc_skb(HeaderLen + DataLen +
{ RTMP_PKT_TAIL_PADDING);
if (pPacket == NULL) {
*ppPacket = NULL; *ppPacket = NULL;
#ifdef DEBUG #ifdef DEBUG
printk("RTMPAllocateNdisPacket Fail\n\n"); printk("RTMPAllocateNdisPacket Fail\n\n");
#endif #endif
return NDIS_STATUS_FAILURE; return NDIS_STATUS_FAILURE;
} }
// 2. clone the frame content // 2. clone the frame content
if (HeaderLen > 0) if (HeaderLen > 0)
NdisMoveMemory(GET_OS_PKT_DATAPTR(pPacket), pHeader, HeaderLen); NdisMoveMemory(GET_OS_PKT_DATAPTR(pPacket), pHeader, HeaderLen);
if (DataLen > 0) if (DataLen > 0)
NdisMoveMemory(GET_OS_PKT_DATAPTR(pPacket) + HeaderLen, pData, DataLen); NdisMoveMemory(GET_OS_PKT_DATAPTR(pPacket) + HeaderLen, pData,
DataLen);
// 3. update length of packet // 3. update length of packet
skb_put(GET_OS_PKT_TYPE(pPacket), HeaderLen+DataLen); skb_put(GET_OS_PKT_TYPE(pPacket), HeaderLen + DataLen);
RTMP_SET_PACKET_SOURCE(pPacket, PKTSRC_NDIS); RTMP_SET_PACKET_SOURCE(pPacket, PKTSRC_NDIS);
// printk("%s : pPacket = %p, len = %d\n", __func__, pPacket, GET_OS_PKT_LEN(pPacket)); // printk("%s : pPacket = %p, len = %d\n", __func__, pPacket, GET_OS_PKT_LEN(pPacket));
...@@ -412,38 +367,30 @@ NDIS_STATUS RTMPAllocateNdisPacket( ...@@ -412,38 +367,30 @@ NDIS_STATUS RTMPAllocateNdisPacket(
corresponding NDIS_BUFFER and allocated memory. corresponding NDIS_BUFFER and allocated memory.
======================================================================== ========================================================================
*/ */
VOID RTMPFreeNdisPacket( VOID RTMPFreeNdisPacket(IN PRTMP_ADAPTER pAd, IN PNDIS_PACKET pPacket)
IN PRTMP_ADAPTER pAd,
IN PNDIS_PACKET pPacket)
{ {
dev_kfree_skb_any(RTPKT_TO_OSPKT(pPacket)); dev_kfree_skb_any(RTPKT_TO_OSPKT(pPacket));
} }
// IRQL = DISPATCH_LEVEL // IRQL = DISPATCH_LEVEL
// NOTE: we do have an assumption here, that Byte0 and Byte1 always reasid at the same // NOTE: we do have an assumption here, that Byte0 and Byte1 always reasid at the same
// scatter gather buffer // scatter gather buffer
NDIS_STATUS Sniff2BytesFromNdisBuffer( NDIS_STATUS Sniff2BytesFromNdisBuffer(IN PNDIS_BUFFER pFirstBuffer,
IN PNDIS_BUFFER pFirstBuffer,
IN UCHAR DesiredOffset, IN UCHAR DesiredOffset,
OUT PUCHAR pByte0, OUT PUCHAR pByte0, OUT PUCHAR pByte1)
OUT PUCHAR pByte1)
{ {
*pByte0 = *(PUCHAR)(pFirstBuffer + DesiredOffset); *pByte0 = *(PUCHAR) (pFirstBuffer + DesiredOffset);
*pByte1 = *(PUCHAR)(pFirstBuffer + DesiredOffset + 1); *pByte1 = *(PUCHAR) (pFirstBuffer + DesiredOffset + 1);
return NDIS_STATUS_SUCCESS; return NDIS_STATUS_SUCCESS;
} }
void RTMP_QueryPacketInfo(IN PNDIS_PACKET pPacket,
void RTMP_QueryPacketInfo( OUT PACKET_INFO * pPacketInfo,
IN PNDIS_PACKET pPacket, OUT PUCHAR * pSrcBufVA, OUT UINT * pSrcBufLen)
OUT PACKET_INFO *pPacketInfo,
OUT PUCHAR *pSrcBufVA,
OUT UINT *pSrcBufLen)
{ {
pPacketInfo->BufferCount = 1; pPacketInfo->BufferCount = 1;
pPacketInfo->pFirstBuffer = (PNDIS_BUFFER)GET_OS_PKT_DATAPTR(pPacket); pPacketInfo->pFirstBuffer = (PNDIS_BUFFER) GET_OS_PKT_DATAPTR(pPacket);
pPacketInfo->PhysicalBufferCount = 1; pPacketInfo->PhysicalBufferCount = 1;
pPacketInfo->TotalPacketLength = GET_OS_PKT_LEN(pPacket); pPacketInfo->TotalPacketLength = GET_OS_PKT_LEN(pPacket);
...@@ -451,30 +398,26 @@ void RTMP_QueryPacketInfo( ...@@ -451,30 +398,26 @@ void RTMP_QueryPacketInfo(
*pSrcBufLen = GET_OS_PKT_LEN(pPacket); *pSrcBufLen = GET_OS_PKT_LEN(pPacket);
} }
void RTMP_QueryNextPacketInfo( void RTMP_QueryNextPacketInfo(IN PNDIS_PACKET * ppPacket,
IN PNDIS_PACKET *ppPacket, OUT PACKET_INFO * pPacketInfo,
OUT PACKET_INFO *pPacketInfo, OUT PUCHAR * pSrcBufVA, OUT UINT * pSrcBufLen)
OUT PUCHAR *pSrcBufVA,
OUT UINT *pSrcBufLen)
{ {
PNDIS_PACKET pPacket = NULL; PNDIS_PACKET pPacket = NULL;
if (*ppPacket) if (*ppPacket)
pPacket = GET_OS_PKT_NEXT(*ppPacket); pPacket = GET_OS_PKT_NEXT(*ppPacket);
if (pPacket) if (pPacket) {
{
pPacketInfo->BufferCount = 1; pPacketInfo->BufferCount = 1;
pPacketInfo->pFirstBuffer = (PNDIS_BUFFER)GET_OS_PKT_DATAPTR(pPacket); pPacketInfo->pFirstBuffer =
(PNDIS_BUFFER) GET_OS_PKT_DATAPTR(pPacket);
pPacketInfo->PhysicalBufferCount = 1; pPacketInfo->PhysicalBufferCount = 1;
pPacketInfo->TotalPacketLength = GET_OS_PKT_LEN(pPacket); pPacketInfo->TotalPacketLength = GET_OS_PKT_LEN(pPacket);
*pSrcBufVA = GET_OS_PKT_DATAPTR(pPacket); *pSrcBufVA = GET_OS_PKT_DATAPTR(pPacket);
*pSrcBufLen = GET_OS_PKT_LEN(pPacket); *pSrcBufLen = GET_OS_PKT_LEN(pPacket);
*ppPacket = GET_OS_PKT_NEXT(pPacket); *ppPacket = GET_OS_PKT_NEXT(pPacket);
} } else {
else
{
pPacketInfo->BufferCount = 0; pPacketInfo->BufferCount = 0;
pPacketInfo->pFirstBuffer = NULL; pPacketInfo->pFirstBuffer = NULL;
pPacketInfo->PhysicalBufferCount = 0; pPacketInfo->PhysicalBufferCount = 0;
...@@ -486,11 +429,8 @@ void RTMP_QueryNextPacketInfo( ...@@ -486,11 +429,8 @@ void RTMP_QueryNextPacketInfo(
} }
} }
PNDIS_PACKET DuplicatePacket(IN PRTMP_ADAPTER pAd,
PNDIS_PACKET DuplicatePacket( IN PNDIS_PACKET pPacket, IN UCHAR FromWhichBSSID)
IN PRTMP_ADAPTER pAd,
IN PNDIS_PACKET pPacket,
IN UCHAR FromWhichBSSID)
{ {
struct sk_buff *skb; struct sk_buff *skb;
PNDIS_PACKET pRetPacket = NULL; PNDIS_PACKET pRetPacket = NULL;
...@@ -500,10 +440,8 @@ PNDIS_PACKET DuplicatePacket( ...@@ -500,10 +440,8 @@ PNDIS_PACKET DuplicatePacket(
DataSize = (USHORT) GET_OS_PKT_LEN(pPacket); DataSize = (USHORT) GET_OS_PKT_LEN(pPacket);
pData = (PUCHAR) GET_OS_PKT_DATAPTR(pPacket); pData = (PUCHAR) GET_OS_PKT_DATAPTR(pPacket);
skb = skb_clone(RTPKT_TO_OSPKT(pPacket), MEM_ALLOC_FLAG); skb = skb_clone(RTPKT_TO_OSPKT(pPacket), MEM_ALLOC_FLAG);
if (skb) if (skb) {
{
skb->dev = get_netdev_from_bssid(pAd, FromWhichBSSID); skb->dev = get_netdev_from_bssid(pAd, FromWhichBSSID);
pRetPacket = OSPKT_TO_RTPKT(skb); pRetPacket = OSPKT_TO_RTPKT(skb);
} }
...@@ -512,20 +450,17 @@ PNDIS_PACKET DuplicatePacket( ...@@ -512,20 +450,17 @@ PNDIS_PACKET DuplicatePacket(
} }
PNDIS_PACKET duplicate_pkt( PNDIS_PACKET duplicate_pkt(IN PRTMP_ADAPTER pAd,
IN PRTMP_ADAPTER pAd,
IN PUCHAR pHeader802_3, IN PUCHAR pHeader802_3,
IN UINT HdrLen, IN UINT HdrLen,
IN PUCHAR pData, IN PUCHAR pData,
IN ULONG DataSize, IN ULONG DataSize, IN UCHAR FromWhichBSSID)
IN UCHAR FromWhichBSSID)
{ {
struct sk_buff *skb; struct sk_buff *skb;
PNDIS_PACKET pPacket = NULL; PNDIS_PACKET pPacket = NULL;
if ((skb =
if ((skb = __dev_alloc_skb(HdrLen + DataSize + 2, MEM_ALLOC_FLAG)) != NULL) __dev_alloc_skb(HdrLen + DataSize + 2, MEM_ALLOC_FLAG)) != NULL) {
{
skb_reserve(skb, 2); skb_reserve(skb, 2);
NdisMoveMemory(skb->tail, pHeader802_3, HdrLen); NdisMoveMemory(skb->tail, pHeader802_3, HdrLen);
skb_put(skb, HdrLen); skb_put(skb, HdrLen);
...@@ -538,24 +473,22 @@ PNDIS_PACKET duplicate_pkt( ...@@ -538,24 +473,22 @@ PNDIS_PACKET duplicate_pkt(
return pPacket; return pPacket;
} }
#define TKIP_TX_MIC_SIZE 8 #define TKIP_TX_MIC_SIZE 8
PNDIS_PACKET duplicate_pkt_with_TKIP_MIC( PNDIS_PACKET duplicate_pkt_with_TKIP_MIC(IN PRTMP_ADAPTER pAd,
IN PRTMP_ADAPTER pAd,
IN PNDIS_PACKET pPacket) IN PNDIS_PACKET pPacket)
{ {
struct sk_buff *skb, *newskb; struct sk_buff *skb, *newskb;
skb = RTPKT_TO_OSPKT(pPacket); skb = RTPKT_TO_OSPKT(pPacket);
if (skb_tailroom(skb) < TKIP_TX_MIC_SIZE) if (skb_tailroom(skb) < TKIP_TX_MIC_SIZE) {
{
// alloc a new skb and copy the packet // alloc a new skb and copy the packet
newskb = skb_copy_expand(skb, skb_headroom(skb), TKIP_TX_MIC_SIZE, GFP_ATOMIC); newskb =
skb_copy_expand(skb, skb_headroom(skb), TKIP_TX_MIC_SIZE,
GFP_ATOMIC);
dev_kfree_skb_any(skb); dev_kfree_skb_any(skb);
if (newskb == NULL) if (newskb == NULL) {
{ DBGPRINT(RT_DEBUG_ERROR,
DBGPRINT(RT_DEBUG_ERROR, ("Extend Tx.MIC for packet failed!, dropping packet!\n")); ("Extend Tx.MIC for packet failed!, dropping packet!\n"));
return NULL; return NULL;
} }
skb = newskb; skb = newskb;
...@@ -564,14 +497,9 @@ PNDIS_PACKET duplicate_pkt_with_TKIP_MIC( ...@@ -564,14 +497,9 @@ PNDIS_PACKET duplicate_pkt_with_TKIP_MIC(
return OSPKT_TO_RTPKT(skb); return OSPKT_TO_RTPKT(skb);
} }
PNDIS_PACKET ClonePacket(IN PRTMP_ADAPTER pAd,
PNDIS_PACKET ClonePacket(
IN PRTMP_ADAPTER pAd,
IN PNDIS_PACKET pPacket, IN PNDIS_PACKET pPacket,
IN PUCHAR pData, IN PUCHAR pData, IN ULONG DataSize)
IN ULONG DataSize)
{ {
struct sk_buff *pRxPkt; struct sk_buff *pRxPkt;
struct sk_buff *pClonedPkt; struct sk_buff *pClonedPkt;
...@@ -582,8 +510,7 @@ PNDIS_PACKET ClonePacket( ...@@ -582,8 +510,7 @@ PNDIS_PACKET ClonePacket(
// clone the packet // clone the packet
pClonedPkt = skb_clone(pRxPkt, MEM_ALLOC_FLAG); pClonedPkt = skb_clone(pRxPkt, MEM_ALLOC_FLAG);
if (pClonedPkt) if (pClonedPkt) {
{
// set the correct dataptr and data len // set the correct dataptr and data len
pClonedPkt->dev = pRxPkt->dev; pClonedPkt->dev = pRxPkt->dev;
pClonedPkt->data = pData; pClonedPkt->data = pData;
...@@ -597,10 +524,8 @@ PNDIS_PACKET ClonePacket( ...@@ -597,10 +524,8 @@ PNDIS_PACKET ClonePacket(
// //
// change OS packet DataPtr and DataLen // change OS packet DataPtr and DataLen
// //
void update_os_packet_info( void update_os_packet_info(IN PRTMP_ADAPTER pAd,
IN PRTMP_ADAPTER pAd, IN RX_BLK * pRxBlk, IN UCHAR FromWhichBSSID)
IN RX_BLK *pRxBlk,
IN UCHAR FromWhichBSSID)
{ {
struct sk_buff *pOSPkt; struct sk_buff *pOSPkt;
...@@ -613,10 +538,8 @@ void update_os_packet_info( ...@@ -613,10 +538,8 @@ void update_os_packet_info(
pOSPkt->tail = pOSPkt->data + pOSPkt->len; pOSPkt->tail = pOSPkt->data + pOSPkt->len;
} }
void wlan_802_11_to_802_3_packet(IN PRTMP_ADAPTER pAd,
void wlan_802_11_to_802_3_packet( IN RX_BLK * pRxBlk,
IN PRTMP_ADAPTER pAd,
IN RX_BLK *pRxBlk,
IN PUCHAR pHeader802_3, IN PUCHAR pHeader802_3,
IN UCHAR FromWhichBSSID) IN UCHAR FromWhichBSSID)
{ {
...@@ -637,14 +560,11 @@ void wlan_802_11_to_802_3_packet( ...@@ -637,14 +560,11 @@ void wlan_802_11_to_802_3_packet(
// //
// //
NdisMoveMemory(skb_push(pOSPkt, LENGTH_802_3), pHeader802_3, LENGTH_802_3); NdisMoveMemory(skb_push(pOSPkt, LENGTH_802_3), pHeader802_3,
} LENGTH_802_3);
}
void announce_802_3_packet( void announce_802_3_packet(IN PRTMP_ADAPTER pAd, IN PNDIS_PACKET pPacket)
IN PRTMP_ADAPTER pAd,
IN PNDIS_PACKET pPacket)
{ {
struct sk_buff *pRxPkt; struct sk_buff *pRxPkt;
...@@ -659,9 +579,8 @@ void announce_802_3_packet( ...@@ -659,9 +579,8 @@ void announce_802_3_packet(
netif_rx(pRxPkt); netif_rx(pRxPkt);
} }
PRTMP_SCATTER_GATHER_LIST PRTMP_SCATTER_GATHER_LIST
rt_get_sg_list_from_packet(PNDIS_PACKET pPacket, RTMP_SCATTER_GATHER_LIST *sg) rt_get_sg_list_from_packet(PNDIS_PACKET pPacket, RTMP_SCATTER_GATHER_LIST * sg)
{ {
sg->NumberOfElements = 1; sg->NumberOfElements = 1;
sg->Elements[0].Address = GET_OS_PKT_DATAPTR(pPacket); sg->Elements[0].Address = GET_OS_PKT_DATAPTR(pPacket);
...@@ -678,13 +597,13 @@ void hex_dump(char *str, unsigned char *pSrcBufVA, unsigned int SrcBufLen) ...@@ -678,13 +597,13 @@ void hex_dump(char *str, unsigned char *pSrcBufVA, unsigned int SrcBufLen)
return; return;
pt = pSrcBufVA; pt = pSrcBufVA;
printk("%s: %p, len = %d\n",str, pSrcBufVA, SrcBufLen); printk("%s: %p, len = %d\n", str, pSrcBufVA, SrcBufLen);
for (x=0; x<SrcBufLen; x++) for (x = 0; x < SrcBufLen; x++) {
{
if (x % 16 == 0) if (x % 16 == 0)
printk("0x%04x : ", x); printk("0x%04x : ", x);
printk("%02x ", ((unsigned char)pt[x])); printk("%02x ", ((unsigned char)pt[x]));
if (x%16 == 15) printk("\n"); if (x % 16 == 15)
printk("\n");
} }
printk("\n"); printk("\n");
} }
...@@ -709,12 +628,9 @@ void hex_dump(char *str, unsigned char *pSrcBufVA, unsigned int SrcBufLen) ...@@ -709,12 +628,9 @@ void hex_dump(char *str, unsigned char *pSrcBufVA, unsigned int SrcBufLen)
======================================================================== ========================================================================
*/ */
VOID RTMPSendWirelessEvent( VOID RTMPSendWirelessEvent(IN PRTMP_ADAPTER pAd,
IN PRTMP_ADAPTER pAd,
IN USHORT Event_flag, IN USHORT Event_flag,
IN PUCHAR pAddr, IN PUCHAR pAddr, IN UCHAR BssIdx, IN CHAR Rssi)
IN UCHAR BssIdx,
IN CHAR Rssi)
{ {
//union iwreq_data wrqu; //union iwreq_data wrqu;
...@@ -725,8 +641,7 @@ VOID RTMPSendWirelessEvent( ...@@ -725,8 +641,7 @@ VOID RTMPSendWirelessEvent(
type = Event_flag & 0xFF00; type = Event_flag & 0xFF00;
event = Event_flag & 0x00FF; event = Event_flag & 0x00FF;
switch (type) switch (type) {
{
case IW_SYS_EVENT_FLAG_START: case IW_SYS_EVENT_FLAG_START:
event_table_len = IW_SYS_EVENT_TYPE_NUM; event_table_len = IW_SYS_EVENT_TYPE_NUM;
break; break;
...@@ -740,86 +655,105 @@ VOID RTMPSendWirelessEvent( ...@@ -740,86 +655,105 @@ VOID RTMPSendWirelessEvent(
break; break;
} }
if (event_table_len == 0) if (event_table_len == 0) {
{ DBGPRINT(RT_DEBUG_ERROR,
DBGPRINT(RT_DEBUG_ERROR, ("%s : The type(%0x02x) is not valid.\n", __func__, type)); ("%s : The type(%0x02x) is not valid.\n", __func__,
type));
return; return;
} }
if (event >= event_table_len) if (event >= event_table_len) {
{ DBGPRINT(RT_DEBUG_ERROR,
DBGPRINT(RT_DEBUG_ERROR, ("%s : The event(%0x02x) is not valid.\n", __func__, event)); ("%s : The event(%0x02x) is not valid.\n", __func__,
event));
return; return;
} }
//Allocate memory and copy the msg. //Allocate memory and copy the msg.
if((pBuf = kmalloc(IW_CUSTOM_MAX_LEN, GFP_ATOMIC)) != NULL) if ((pBuf = kmalloc(IW_CUSTOM_MAX_LEN, GFP_ATOMIC)) != NULL) {
{
//Prepare the payload //Prepare the payload
memset(pBuf, 0, IW_CUSTOM_MAX_LEN); memset(pBuf, 0, IW_CUSTOM_MAX_LEN);
pBufPtr = pBuf; pBufPtr = pBuf;
if (pAddr) if (pAddr)
pBufPtr += sprintf(pBufPtr, "(RT2860) STA(%02x:%02x:%02x:%02x:%02x:%02x) ", PRINT_MAC(pAddr)); pBufPtr +=
sprintf(pBufPtr,
"(RT2860) STA(%02x:%02x:%02x:%02x:%02x:%02x) ",
PRINT_MAC(pAddr));
else if (BssIdx < MAX_MBSSID_NUM) else if (BssIdx < MAX_MBSSID_NUM)
pBufPtr += sprintf(pBufPtr, "(RT2860) BSS(wlan%d) ", BssIdx); pBufPtr +=
sprintf(pBufPtr, "(RT2860) BSS(wlan%d) ", BssIdx);
else else
pBufPtr += sprintf(pBufPtr, "(RT2860) "); pBufPtr += sprintf(pBufPtr, "(RT2860) ");
if (type == IW_SYS_EVENT_FLAG_START) if (type == IW_SYS_EVENT_FLAG_START)
pBufPtr += sprintf(pBufPtr, "%s", pWirelessSysEventText[event]); pBufPtr +=
sprintf(pBufPtr, "%s",
pWirelessSysEventText[event]);
else if (type == IW_SPOOF_EVENT_FLAG_START) else if (type == IW_SPOOF_EVENT_FLAG_START)
pBufPtr += sprintf(pBufPtr, "%s (RSSI=%d)", pWirelessSpoofEventText[event], Rssi); pBufPtr +=
sprintf(pBufPtr, "%s (RSSI=%d)",
pWirelessSpoofEventText[event], Rssi);
else if (type == IW_FLOOD_EVENT_FLAG_START) else if (type == IW_FLOOD_EVENT_FLAG_START)
pBufPtr += sprintf(pBufPtr, "%s", pWirelessFloodEventText[event]); pBufPtr +=
sprintf(pBufPtr, "%s",
pWirelessFloodEventText[event]);
else else
pBufPtr += sprintf(pBufPtr, "%s", "unknown event"); pBufPtr += sprintf(pBufPtr, "%s", "unknown event");
pBufPtr[pBufPtr - pBuf] = '\0'; pBufPtr[pBufPtr - pBuf] = '\0';
BufLen = pBufPtr - pBuf; BufLen = pBufPtr - pBuf;
RtmpOSWrielessEventSend(pAd, IWEVCUSTOM, Event_flag, NULL, (PUCHAR)pBuf, BufLen); RtmpOSWrielessEventSend(pAd, IWEVCUSTOM, Event_flag, NULL,
(PUCHAR) pBuf, BufLen);
//DBGPRINT(RT_DEBUG_TRACE, ("%s : %s\n", __func__, pBuf)); //DBGPRINT(RT_DEBUG_TRACE, ("%s : %s\n", __func__, pBuf));
kfree(pBuf); kfree(pBuf);
} } else
else DBGPRINT(RT_DEBUG_ERROR,
DBGPRINT(RT_DEBUG_ERROR, ("%s : Can't allocate memory for wireless event.\n", __func__)); ("%s : Can't allocate memory for wireless event.\n",
__func__));
} }
void send_monitor_packets( void send_monitor_packets(IN PRTMP_ADAPTER pAd, IN RX_BLK * pRxBlk)
IN PRTMP_ADAPTER pAd,
IN RX_BLK *pRxBlk)
{ {
struct sk_buff *pOSPkt; struct sk_buff *pOSPkt;
wlan_ng_prism2_header *ph; wlan_ng_prism2_header *ph;
int rate_index = 0; int rate_index = 0;
USHORT header_len = 0; USHORT header_len = 0;
UCHAR temp_header[40] = {0}; UCHAR temp_header[40] = { 0 };
u_int32_t ralinkrate[256] = {2,4,11,22, 12,18,24,36,48,72,96, 108, 109, 110, 111, 112, 13, 26, 39, 52,78,104, 117, 130, 26, 52, 78,104, 156, 208, 234, 260, 27, 54,81,108,162, 216, 243, 270, // Last 38 u_int32_t ralinkrate[256] = { 2, 4, 11, 22, 12, 18, 24, 36, 48, 72, 96, 108, 109, 110, 111, 112, 13, 26, 39, 52, 78, 104, 117, 130, 26, 52, 78, 104, 156, 208, 234, 260, 27, 54, 81, 108, 162, 216, 243, 270, // Last 38
54, 108, 162, 216, 324, 432, 486, 540, 14, 29, 43, 57, 87, 115, 130, 144, 29, 59,87,115, 173, 230,260, 288, 30, 60,90,120,180,240,270,300,60,120,180,240,360,480,540,600, 0,1,2,3,4,5,6,7,8,9,10, 54, 108, 162, 216, 324, 432, 486, 540, 14, 29, 43, 57, 87, 115,
11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80}; 130, 144, 29, 59, 87, 115, 173, 230, 260, 288, 30, 60, 90,
120, 180, 240, 270, 300, 60, 120, 180, 240, 360, 480, 540,
600, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41,
42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71,
72, 73, 74, 75, 76, 77, 78, 79, 80
};
ASSERT(pRxBlk->pRxPacket); ASSERT(pRxBlk->pRxPacket);
if (pRxBlk->DataSize < 10) if (pRxBlk->DataSize < 10) {
{ DBGPRINT(RT_DEBUG_ERROR,
DBGPRINT(RT_DEBUG_ERROR, ("%s : Size is too small! (%d)\n", __func__, pRxBlk->DataSize)); ("%s : Size is too small! (%d)\n", __func__,
pRxBlk->DataSize));
goto err_free_sk_buff; goto err_free_sk_buff;
} }
if (pRxBlk->DataSize + sizeof(wlan_ng_prism2_header) > RX_BUFFER_AGGRESIZE) if (pRxBlk->DataSize + sizeof(wlan_ng_prism2_header) >
{ RX_BUFFER_AGGRESIZE) {
DBGPRINT(RT_DEBUG_ERROR, ("%s : Size is too large! (%zu)\n", __func__, pRxBlk->DataSize + sizeof(wlan_ng_prism2_header))); DBGPRINT(RT_DEBUG_ERROR,
("%s : Size is too large! (%zu)\n", __func__,
pRxBlk->DataSize + sizeof(wlan_ng_prism2_header)));
goto err_free_sk_buff; goto err_free_sk_buff;
} }
pOSPkt = RTPKT_TO_OSPKT(pRxBlk->pRxPacket); pOSPkt = RTPKT_TO_OSPKT(pRxBlk->pRxPacket);
pOSPkt->dev = get_netdev_from_bssid(pAd, BSS0); pOSPkt->dev = get_netdev_from_bssid(pAd, BSS0);
if (pRxBlk->pHeader->FC.Type == BTYPE_DATA) if (pRxBlk->pHeader->FC.Type == BTYPE_DATA) {
{
pRxBlk->DataSize -= LENGTH_802_11; pRxBlk->DataSize -= LENGTH_802_11;
if ((pRxBlk->pHeader->FC.ToDs == 1) && if ((pRxBlk->pHeader->FC.ToDs == 1) &&
(pRxBlk->pHeader->FC.FrDs == 1)) (pRxBlk->pHeader->FC.FrDs == 1))
...@@ -828,21 +762,17 @@ void send_monitor_packets( ...@@ -828,21 +762,17 @@ void send_monitor_packets(
header_len = LENGTH_802_11; header_len = LENGTH_802_11;
// QOS // QOS
if (pRxBlk->pHeader->FC.SubType & 0x08) if (pRxBlk->pHeader->FC.SubType & 0x08) {
{
header_len += 2; header_len += 2;
// Data skip QOS contorl field // Data skip QOS contorl field
pRxBlk->DataSize -=2; pRxBlk->DataSize -= 2;
} }
// Order bit: A-Ralink or HTC+ // Order bit: A-Ralink or HTC+
if (pRxBlk->pHeader->FC.Order) if (pRxBlk->pHeader->FC.Order) {
{
header_len += 4; header_len += 4;
// Data skip HTC contorl field // Data skip HTC contorl field
pRxBlk->DataSize -= 4; pRxBlk->DataSize -= 4;
} }
// Copy Header // Copy Header
if (header_len <= 40) if (header_len <= 40)
NdisMoveMemory(temp_header, pRxBlk->pData, header_len); NdisMoveMemory(temp_header, pRxBlk->pData, header_len);
...@@ -854,29 +784,34 @@ void send_monitor_packets( ...@@ -854,29 +784,34 @@ void send_monitor_packets(
pRxBlk->pData += header_len; pRxBlk->pData += header_len;
} //end if } //end if
if (pRxBlk->DataSize < pOSPkt->len) { if (pRxBlk->DataSize < pOSPkt->len) {
skb_trim(pOSPkt,pRxBlk->DataSize); skb_trim(pOSPkt, pRxBlk->DataSize);
} else { } else {
skb_put(pOSPkt,(pRxBlk->DataSize - pOSPkt->len)); skb_put(pOSPkt, (pRxBlk->DataSize - pOSPkt->len));
} //end if } //end if
if ((pRxBlk->pData - pOSPkt->data) > 0) { if ((pRxBlk->pData - pOSPkt->data) > 0) {
skb_put(pOSPkt,(pRxBlk->pData - pOSPkt->data)); skb_put(pOSPkt, (pRxBlk->pData - pOSPkt->data));
skb_pull(pOSPkt,(pRxBlk->pData - pOSPkt->data)); skb_pull(pOSPkt, (pRxBlk->pData - pOSPkt->data));
} //end if } //end if
if (skb_headroom(pOSPkt) < (sizeof(wlan_ng_prism2_header)+ header_len)) { if (skb_headroom(pOSPkt) < (sizeof(wlan_ng_prism2_header) + header_len)) {
if (pskb_expand_head(pOSPkt, (sizeof(wlan_ng_prism2_header) + header_len), 0, GFP_ATOMIC)) { if (pskb_expand_head
DBGPRINT(RT_DEBUG_ERROR, ("%s : Reallocate header size of sk_buff fail!\n", __func__)); (pOSPkt, (sizeof(wlan_ng_prism2_header) + header_len), 0,
GFP_ATOMIC)) {
DBGPRINT(RT_DEBUG_ERROR,
("%s : Reallocate header size of sk_buff fail!\n",
__func__));
goto err_free_sk_buff; goto err_free_sk_buff;
} //end if } //end if
} //end if } //end if
if (header_len > 0) if (header_len > 0)
NdisMoveMemory(skb_push(pOSPkt, header_len), temp_header, header_len); NdisMoveMemory(skb_push(pOSPkt, header_len), temp_header,
header_len);
ph = (wlan_ng_prism2_header *) skb_push(pOSPkt, sizeof(wlan_ng_prism2_header)); ph = (wlan_ng_prism2_header *) skb_push(pOSPkt,
sizeof(wlan_ng_prism2_header));
NdisZeroMemory(ph, sizeof(wlan_ng_prism2_header)); NdisZeroMemory(ph, sizeof(wlan_ng_prism2_header));
ph->msgcode = DIDmsg_lnxind_wlansniffrm; ph->msgcode = DIDmsg_lnxind_wlansniffrm;
...@@ -902,12 +837,21 @@ void send_monitor_packets( ...@@ -902,12 +837,21 @@ void send_monitor_packets(
ph->channel.status = 0; ph->channel.status = 0;
ph->channel.len = 4; ph->channel.len = 4;
ph->channel.data = (u_int32_t)pAd->CommonCfg.Channel; ph->channel.data = (u_int32_t) pAd->CommonCfg.Channel;
ph->rssi.did = DIDmsg_lnxind_wlansniffrm_rssi; ph->rssi.did = DIDmsg_lnxind_wlansniffrm_rssi;
ph->rssi.status = 0; ph->rssi.status = 0;
ph->rssi.len = 4; ph->rssi.len = 4;
ph->rssi.data = (u_int32_t)RTMPMaxRssi(pAd, ConvertToRssi(pAd, pRxBlk->pRxWI->RSSI0, RSSI_0), ConvertToRssi(pAd, pRxBlk->pRxWI->RSSI1, RSSI_1), ConvertToRssi(pAd, pRxBlk->pRxWI->RSSI2, RSSI_2));; ph->rssi.data =
(u_int32_t) RTMPMaxRssi(pAd,
ConvertToRssi(pAd, pRxBlk->pRxWI->RSSI0,
RSSI_0), ConvertToRssi(pAd,
pRxBlk->
pRxWI->
RSSI1,
RSSI_1),
ConvertToRssi(pAd, pRxBlk->pRxWI->RSSI2,
RSSI_2));;
ph->signal.did = DIDmsg_lnxind_wlansniffrm_signal; ph->signal.did = DIDmsg_lnxind_wlansniffrm_signal;
ph->signal.status = 0; ph->signal.status = 0;
...@@ -919,15 +863,15 @@ void send_monitor_packets( ...@@ -919,15 +863,15 @@ void send_monitor_packets(
ph->noise.len = 4; ph->noise.len = 4;
ph->noise.data = 0; ph->noise.data = 0;
if (pRxBlk->pRxWI->PHYMODE >= MODE_HTMIX) if (pRxBlk->pRxWI->PHYMODE >= MODE_HTMIX) {
{ rate_index =
rate_index = 16 + ((UCHAR)pRxBlk->pRxWI->BW *16) + ((UCHAR)pRxBlk->pRxWI->ShortGI *32) + ((UCHAR)pRxBlk->pRxWI->MCS); 16 + ((UCHAR) pRxBlk->pRxWI->BW * 16) +
} ((UCHAR) pRxBlk->pRxWI->ShortGI * 32) +
else ((UCHAR) pRxBlk->pRxWI->MCS);
if (pRxBlk->pRxWI->PHYMODE == MODE_OFDM) } else if (pRxBlk->pRxWI->PHYMODE == MODE_OFDM)
rate_index = (UCHAR)(pRxBlk->pRxWI->MCS) + 4; rate_index = (UCHAR) (pRxBlk->pRxWI->MCS) + 4;
else else
rate_index = (UCHAR)(pRxBlk->pRxWI->MCS); rate_index = (UCHAR) (pRxBlk->pRxWI->MCS);
if (rate_index < 0) if (rate_index < 0)
rate_index = 0; rate_index = 0;
if (rate_index > 255) if (rate_index > 255)
...@@ -941,8 +885,7 @@ void send_monitor_packets( ...@@ -941,8 +885,7 @@ void send_monitor_packets(
ph->frmlen.did = DIDmsg_lnxind_wlansniffrm_frmlen; ph->frmlen.did = DIDmsg_lnxind_wlansniffrm_frmlen;
ph->frmlen.status = 0; ph->frmlen.status = 0;
ph->frmlen.len = 4; ph->frmlen.len = 4;
ph->frmlen.data = (u_int32_t)pRxBlk->DataSize; ph->frmlen.data = (u_int32_t) pRxBlk->DataSize;
pOSPkt->pkt_type = PACKET_OTHERHOST; pOSPkt->pkt_type = PACKET_OTHERHOST;
pOSPkt->protocol = eth_type_trans(pOSPkt, pOSPkt->dev); pOSPkt->protocol = eth_type_trans(pOSPkt, pOSPkt->dev);
...@@ -957,7 +900,6 @@ void send_monitor_packets( ...@@ -957,7 +900,6 @@ void send_monitor_packets(
} }
/******************************************************************************* /*******************************************************************************
Device IRQ related functions. Device IRQ related functions.
...@@ -974,11 +916,12 @@ int RtmpOSIRQRequest(IN PNET_DEV pNetDev) ...@@ -974,11 +916,12 @@ int RtmpOSIRQRequest(IN PNET_DEV pNetDev)
ASSERT(pAd); ASSERT(pAd);
if (pAd->infType == RTMP_DEV_INF_PCI) if (pAd->infType == RTMP_DEV_INF_PCI) {
{ POS_COOKIE _pObj = (POS_COOKIE) (pAd->OS_Cookie);
POS_COOKIE _pObj = (POS_COOKIE)(pAd->OS_Cookie);
RTMP_MSI_ENABLE(pAd); RTMP_MSI_ENABLE(pAd);
retval = request_irq(_pObj->pci_dev->irq, rt2860_interrupt, SA_SHIRQ, (net_dev)->name, (net_dev)); retval =
request_irq(_pObj->pci_dev->irq, rt2860_interrupt, SA_SHIRQ,
(net_dev)->name, (net_dev));
if (retval != 0) if (retval != 0)
printk("RT2860: request_irq ERROR(%d)\n", retval); printk("RT2860: request_irq ERROR(%d)\n", retval);
} }
...@@ -999,20 +942,17 @@ int RtmpOSIRQRelease(IN PNET_DEV pNetDev) ...@@ -999,20 +942,17 @@ int RtmpOSIRQRelease(IN PNET_DEV pNetDev)
ASSERT(pAd); ASSERT(pAd);
#ifdef RTMP_PCI_SUPPORT #ifdef RTMP_PCI_SUPPORT
if (pAd->infType == RTMP_DEV_INF_PCI) if (pAd->infType == RTMP_DEV_INF_PCI) {
{ POS_COOKIE pObj = (POS_COOKIE) (pAd->OS_Cookie);
POS_COOKIE pObj = (POS_COOKIE)(pAd->OS_Cookie);
synchronize_irq(pObj->pci_dev->irq); synchronize_irq(pObj->pci_dev->irq);
free_irq(pObj->pci_dev->irq, (net_dev)); free_irq(pObj->pci_dev->irq, (net_dev));
RTMP_MSI_DISABLE(pAd); RTMP_MSI_DISABLE(pAd);
} }
#endif // RTMP_PCI_SUPPORT // #endif // RTMP_PCI_SUPPORT //
return 0; return 0;
} }
/******************************************************************************* /*******************************************************************************
File open/close related functions. File open/close related functions.
...@@ -1023,12 +963,13 @@ RTMP_OS_FD RtmpOSFileOpen(char *pPath, int flag, int mode) ...@@ -1023,12 +963,13 @@ RTMP_OS_FD RtmpOSFileOpen(char *pPath, int flag, int mode)
struct file *filePtr; struct file *filePtr;
filePtr = filp_open(pPath, flag, 0); filePtr = filp_open(pPath, flag, 0);
if (IS_ERR(filePtr)) if (IS_ERR(filePtr)) {
{ DBGPRINT(RT_DEBUG_ERROR,
DBGPRINT(RT_DEBUG_ERROR, ("%s(): Error %ld opening %s\n", __func__, -PTR_ERR(filePtr), pPath)); ("%s(): Error %ld opening %s\n", __func__,
-PTR_ERR(filePtr), pPath));
} }
return (RTMP_OS_FD)filePtr; return (RTMP_OS_FD) filePtr;
} }
int RtmpOSFileClose(RTMP_OS_FD osfd) int RtmpOSFileClose(RTMP_OS_FD osfd)
...@@ -1037,31 +978,26 @@ int RtmpOSFileClose(RTMP_OS_FD osfd) ...@@ -1037,31 +978,26 @@ int RtmpOSFileClose(RTMP_OS_FD osfd)
return 0; return 0;
} }
void RtmpOSFileSeek(RTMP_OS_FD osfd, int offset) void RtmpOSFileSeek(RTMP_OS_FD osfd, int offset)
{ {
osfd->f_pos = offset; osfd->f_pos = offset;
} }
int RtmpOSFileRead(RTMP_OS_FD osfd, char *pDataPtr, int readLen) int RtmpOSFileRead(RTMP_OS_FD osfd, char *pDataPtr, int readLen)
{ {
// The object must have a read method // The object must have a read method
if (osfd->f_op && osfd->f_op->read) if (osfd->f_op && osfd->f_op->read) {
{
return osfd->f_op->read(osfd, pDataPtr, readLen, &osfd->f_pos); return osfd->f_op->read(osfd, pDataPtr, readLen, &osfd->f_pos);
} } else {
else
{
DBGPRINT(RT_DEBUG_ERROR, ("no file read method\n")); DBGPRINT(RT_DEBUG_ERROR, ("no file read method\n"));
return -1; return -1;
} }
} }
int RtmpOSFileWrite(RTMP_OS_FD osfd, char *pDataPtr, int writeLen) int RtmpOSFileWrite(RTMP_OS_FD osfd, char *pDataPtr, int writeLen)
{ {
return osfd->f_op->write(osfd, pDataPtr, (size_t)writeLen, &osfd->f_pos); return osfd->f_op->write(osfd, pDataPtr, (size_t) writeLen,
&osfd->f_pos);
} }
/******************************************************************************* /*******************************************************************************
...@@ -1069,35 +1005,32 @@ int RtmpOSFileWrite(RTMP_OS_FD osfd, char *pDataPtr, int writeLen) ...@@ -1069,35 +1005,32 @@ int RtmpOSFileWrite(RTMP_OS_FD osfd, char *pDataPtr, int writeLen)
Task create/management/kill related functions. Task create/management/kill related functions.
*******************************************************************************/ *******************************************************************************/
NDIS_STATUS RtmpOSTaskKill( NDIS_STATUS RtmpOSTaskKill(IN RTMP_OS_TASK * pTask)
IN RTMP_OS_TASK *pTask)
{ {
RTMP_ADAPTER *pAd; RTMP_ADAPTER *pAd;
int ret = NDIS_STATUS_FAILURE; int ret = NDIS_STATUS_FAILURE;
pAd = (RTMP_ADAPTER *)pTask->priv; pAd = (RTMP_ADAPTER *) pTask->priv;
#ifdef KTHREAD_SUPPORT #ifdef KTHREAD_SUPPORT
if (pTask->kthread_task) if (pTask->kthread_task) {
{
kthread_stop(pTask->kthread_task); kthread_stop(pTask->kthread_task);
ret = NDIS_STATUS_SUCCESS; ret = NDIS_STATUS_SUCCESS;
} }
#else #else
CHECK_PID_LEGALITY(pTask->taskPID) CHECK_PID_LEGALITY(pTask->taskPID) {
{ printk("Terminate the task(%s) with pid(%d)!\n",
printk("Terminate the task(%s) with pid(%d)!\n", pTask->taskName, GET_PID_NUMBER(pTask->taskPID)); pTask->taskName, GET_PID_NUMBER(pTask->taskPID));
mb(); mb();
pTask->task_killed = 1; pTask->task_killed = 1;
mb(); mb();
ret = KILL_THREAD_PID(pTask->taskPID, SIGTERM, 1); ret = KILL_THREAD_PID(pTask->taskPID, SIGTERM, 1);
if (ret) if (ret) {
{ printk(KERN_WARNING
printk(KERN_WARNING "kill task(%s) with pid(%d) failed(retVal=%d)!\n", "kill task(%s) with pid(%d) failed(retVal=%d)!\n",
pTask->taskName, GET_PID_NUMBER(pTask->taskPID), ret); pTask->taskName, GET_PID_NUMBER(pTask->taskPID),
} ret);
else } else {
{
wait_for_completion(&pTask->taskComplete); wait_for_completion(&pTask->taskComplete);
pTask->taskPID = THREAD_PID_INIT_VALUE; pTask->taskPID = THREAD_PID_INIT_VALUE;
pTask->task_killed = 0; pTask->task_killed = 0;
...@@ -1110,9 +1043,7 @@ NDIS_STATUS RtmpOSTaskKill( ...@@ -1110,9 +1043,7 @@ NDIS_STATUS RtmpOSTaskKill(
} }
INT RtmpOSTaskNotifyToExit(IN RTMP_OS_TASK * pTask)
INT RtmpOSTaskNotifyToExit(
IN RTMP_OS_TASK *pTask)
{ {
#ifndef KTHREAD_SUPPORT #ifndef KTHREAD_SUPPORT
...@@ -1122,14 +1053,12 @@ INT RtmpOSTaskNotifyToExit( ...@@ -1122,14 +1053,12 @@ INT RtmpOSTaskNotifyToExit(
return 0; return 0;
} }
void RtmpOSTaskCustomize(IN RTMP_OS_TASK * pTask)
void RtmpOSTaskCustomize(
IN RTMP_OS_TASK *pTask)
{ {
#ifndef KTHREAD_SUPPORT #ifndef KTHREAD_SUPPORT
daemonize((PSTRING)&pTask->taskName[0]/*"%s",pAd->net_dev->name*/); daemonize((PSTRING) & pTask->taskName[0] /*"%s",pAd->net_dev->name */ );
allow_signal(SIGTERM); allow_signal(SIGTERM);
allow_signal(SIGKILL); allow_signal(SIGKILL);
...@@ -1141,11 +1070,8 @@ void RtmpOSTaskCustomize( ...@@ -1141,11 +1070,8 @@ void RtmpOSTaskCustomize(
#endif #endif
} }
NDIS_STATUS RtmpOSTaskAttach(IN RTMP_OS_TASK * pTask,
NDIS_STATUS RtmpOSTaskAttach( IN int (*fn) (void *), IN void *arg)
IN RTMP_OS_TASK *pTask,
IN int (*fn)(void *),
IN void *arg)
{ {
NDIS_STATUS status = NDIS_STATUS_SUCCESS; NDIS_STATUS status = NDIS_STATUS_SUCCESS;
...@@ -1157,13 +1083,11 @@ NDIS_STATUS RtmpOSTaskAttach( ...@@ -1157,13 +1083,11 @@ NDIS_STATUS RtmpOSTaskAttach(
status = NDIS_STATUS_FAILURE; status = NDIS_STATUS_FAILURE;
#else #else
pid_number = kernel_thread(fn, arg, RTMP_OS_MGMT_TASK_FLAGS); pid_number = kernel_thread(fn, arg, RTMP_OS_MGMT_TASK_FLAGS);
if (pid_number < 0) if (pid_number < 0) {
{ DBGPRINT(RT_DEBUG_ERROR,
DBGPRINT (RT_DEBUG_ERROR, ("Attach task(%s) failed!\n", pTask->taskName)); ("Attach task(%s) failed!\n", pTask->taskName));
status = NDIS_STATUS_FAILURE; status = NDIS_STATUS_FAILURE;
} } else {
else
{
pTask->taskPID = GET_PID(pid_number); pTask->taskPID = GET_PID(pid_number);
// Wait for the thread to start // Wait for the thread to start
...@@ -1174,22 +1098,21 @@ NDIS_STATUS RtmpOSTaskAttach( ...@@ -1174,22 +1098,21 @@ NDIS_STATUS RtmpOSTaskAttach(
return status; return status;
} }
NDIS_STATUS RtmpOSTaskInit(IN RTMP_OS_TASK * pTask,
NDIS_STATUS RtmpOSTaskInit( IN PSTRING pTaskName, IN VOID * pPriv)
IN RTMP_OS_TASK *pTask,
IN PSTRING pTaskName,
IN VOID *pPriv)
{ {
int len; int len;
ASSERT(pTask); ASSERT(pTask);
#ifndef KTHREAD_SUPPORT #ifndef KTHREAD_SUPPORT
NdisZeroMemory((PUCHAR)(pTask), sizeof(RTMP_OS_TASK)); NdisZeroMemory((PUCHAR) (pTask), sizeof(RTMP_OS_TASK));
#endif #endif
len = strlen(pTaskName); len = strlen(pTaskName);
len = len > (RTMP_OS_TASK_NAME_LEN -1) ? (RTMP_OS_TASK_NAME_LEN-1) : len; len =
len >
(RTMP_OS_TASK_NAME_LEN - 1) ? (RTMP_OS_TASK_NAME_LEN - 1) : len;
NdisMoveMemory(&pTask->taskName[0], pTaskName, len); NdisMoveMemory(&pTask->taskName[0], pTaskName, len);
pTask->priv = pPriv; pTask->priv = pPriv;
...@@ -1197,58 +1120,51 @@ NDIS_STATUS RtmpOSTaskInit( ...@@ -1197,58 +1120,51 @@ NDIS_STATUS RtmpOSTaskInit(
RTMP_SEM_EVENT_INIT_LOCKED(&(pTask->taskSema)); RTMP_SEM_EVENT_INIT_LOCKED(&(pTask->taskSema));
pTask->taskPID = THREAD_PID_INIT_VALUE; pTask->taskPID = THREAD_PID_INIT_VALUE;
init_completion (&pTask->taskComplete); init_completion(&pTask->taskComplete);
#endif #endif
return NDIS_STATUS_SUCCESS; return NDIS_STATUS_SUCCESS;
} }
void RTMP_IndicateMediaState(IN PRTMP_ADAPTER pAd)
void RTMP_IndicateMediaState(
IN PRTMP_ADAPTER pAd)
{ {
if (pAd->CommonCfg.bWirelessEvent) if (pAd->CommonCfg.bWirelessEvent) {
{ if (pAd->IndicateMediaState == NdisMediaStateConnected) {
if (pAd->IndicateMediaState == NdisMediaStateConnected) RTMPSendWirelessEvent(pAd, IW_STA_LINKUP_EVENT_FLAG,
{ pAd->MacTab.Content[BSSID_WCID].
RTMPSendWirelessEvent(pAd, IW_STA_LINKUP_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0); Addr, BSS0, 0);
} } else {
else RTMPSendWirelessEvent(pAd, IW_STA_LINKDOWN_EVENT_FLAG,
{ pAd->MacTab.Content[BSSID_WCID].
RTMPSendWirelessEvent(pAd, IW_STA_LINKDOWN_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0); Addr, BSS0, 0);
} }
} }
} }
int RtmpOSWrielessEventSend( int RtmpOSWrielessEventSend(IN RTMP_ADAPTER * pAd,
IN RTMP_ADAPTER *pAd,
IN UINT32 eventType, IN UINT32 eventType,
IN INT flags, IN INT flags,
IN PUCHAR pSrcMac, IN PUCHAR pSrcMac,
IN PUCHAR pData, IN PUCHAR pData, IN UINT32 dataLen)
IN UINT32 dataLen)
{ {
union iwreq_data wrqu; union iwreq_data wrqu;
memset(&wrqu, 0, sizeof(wrqu)); memset(&wrqu, 0, sizeof(wrqu));
if (flags>-1) if (flags > -1)
wrqu.data.flags = flags; wrqu.data.flags = flags;
if (pSrcMac) if (pSrcMac)
memcpy(wrqu.ap_addr.sa_data, pSrcMac, MAC_ADDR_LEN); memcpy(wrqu.ap_addr.sa_data, pSrcMac, MAC_ADDR_LEN);
if ((pData!= NULL) && (dataLen > 0)) if ((pData != NULL) && (dataLen > 0))
wrqu.data.length = dataLen; wrqu.data.length = dataLen;
wireless_send_event(pAd->net_dev, eventType, &wrqu, (char *)pData); wireless_send_event(pAd->net_dev, eventType, &wrqu, (char *)pData);
return 0; return 0;
} }
int RtmpOSNetDevAddrSet(IN PNET_DEV pNetDev, IN PUCHAR pMacAddr)
int RtmpOSNetDevAddrSet(
IN PNET_DEV pNetDev,
IN PUCHAR pMacAddr)
{ {
struct net_device *net_dev; struct net_device *net_dev;
RTMP_ADAPTER *pAd; RTMP_ADAPTER *pAd;
...@@ -1259,7 +1175,8 @@ int RtmpOSNetDevAddrSet( ...@@ -1259,7 +1175,8 @@ int RtmpOSNetDevAddrSet(
// work-around for the SuSE due to it has it's own interface name management system. // work-around for the SuSE due to it has it's own interface name management system.
{ {
NdisZeroMemory(pAd->StaCfg.dev_name, 16); NdisZeroMemory(pAd->StaCfg.dev_name, 16);
NdisMoveMemory(pAd->StaCfg.dev_name, net_dev->name, strlen(net_dev->name)); NdisMoveMemory(pAd->StaCfg.dev_name, net_dev->name,
strlen(net_dev->name));
} }
NdisMoveMemory(net_dev->dev_addr, pMacAddr, 6); NdisMoveMemory(net_dev->dev_addr, pMacAddr, 6);
...@@ -1267,16 +1184,12 @@ int RtmpOSNetDevAddrSet( ...@@ -1267,16 +1184,12 @@ int RtmpOSNetDevAddrSet(
return 0; return 0;
} }
/* /*
* Assign the network dev name for created Ralink WiFi interface. * Assign the network dev name for created Ralink WiFi interface.
*/ */
static int RtmpOSNetDevRequestName( static int RtmpOSNetDevRequestName(IN RTMP_ADAPTER * pAd,
IN RTMP_ADAPTER *pAd,
IN PNET_DEV dev, IN PNET_DEV dev,
IN PSTRING pPrefixStr, IN PSTRING pPrefixStr, IN INT devIdx)
IN INT devIdx)
{ {
PNET_DEV existNetDev; PNET_DEV existNetDev;
STRING suffixName[IFNAMSIZ]; STRING suffixName[IFNAMSIZ];
...@@ -1284,12 +1197,10 @@ static int RtmpOSNetDevRequestName( ...@@ -1284,12 +1197,10 @@ static int RtmpOSNetDevRequestName(
int ifNameIdx, prefixLen, slotNameLen; int ifNameIdx, prefixLen, slotNameLen;
int Status; int Status;
prefixLen = strlen(pPrefixStr); prefixLen = strlen(pPrefixStr);
ASSERT((prefixLen < IFNAMSIZ)); ASSERT((prefixLen < IFNAMSIZ));
for (ifNameIdx = devIdx; ifNameIdx < 32; ifNameIdx++) for (ifNameIdx = devIdx; ifNameIdx < 32; ifNameIdx++) {
{
memset(suffixName, 0, IFNAMSIZ); memset(suffixName, 0, IFNAMSIZ);
memset(desiredName, 0, IFNAMSIZ); memset(desiredName, 0, IFNAMSIZ);
strncpy(&desiredName[0], pPrefixStr, prefixLen); strncpy(&desiredName[0], pPrefixStr, prefixLen);
...@@ -1307,29 +1218,24 @@ static int RtmpOSNetDevRequestName( ...@@ -1307,29 +1218,24 @@ static int RtmpOSNetDevRequestName(
RtmpOSNetDeviceRefPut(existNetDev); RtmpOSNetDeviceRefPut(existNetDev);
} }
if(ifNameIdx < 32) if (ifNameIdx < 32) {
{
strcpy(&dev->name[0], &desiredName[0]); strcpy(&dev->name[0], &desiredName[0]);
Status = NDIS_STATUS_SUCCESS; Status = NDIS_STATUS_SUCCESS;
} } else {
else
{
DBGPRINT(RT_DEBUG_ERROR, DBGPRINT(RT_DEBUG_ERROR,
("Cannot request DevName with preifx(%s) and in range(0~32) as suffix from OS!\n", pPrefixStr)); ("Cannot request DevName with preifx(%s) and in range(0~32) as suffix from OS!\n",
pPrefixStr));
Status = NDIS_STATUS_FAILURE; Status = NDIS_STATUS_FAILURE;
} }
return Status; return Status;
} }
void RtmpOSNetDevClose(IN PNET_DEV pNetDev)
void RtmpOSNetDevClose(
IN PNET_DEV pNetDev)
{ {
dev_close(pNetDev); dev_close(pNetDev);
} }
void RtmpOSNetDevFree(PNET_DEV pNetDev) void RtmpOSNetDevFree(PNET_DEV pNetDev)
{ {
ASSERT(pNetDev); ASSERT(pNetDev);
...@@ -1337,15 +1243,14 @@ void RtmpOSNetDevFree(PNET_DEV pNetDev) ...@@ -1337,15 +1243,14 @@ void RtmpOSNetDevFree(PNET_DEV pNetDev)
free_netdev(pNetDev); free_netdev(pNetDev);
} }
INT RtmpOSNetDevAlloc(IN PNET_DEV * new_dev_p, IN UINT32 privDataSize)
INT RtmpOSNetDevAlloc(
IN PNET_DEV *new_dev_p,
IN UINT32 privDataSize)
{ {
// assign it as null first. // assign it as null first.
*new_dev_p = NULL; *new_dev_p = NULL;
DBGPRINT(RT_DEBUG_TRACE, ("Allocate a net device with private data size=%d!\n", privDataSize)); DBGPRINT(RT_DEBUG_TRACE,
("Allocate a net device with private data size=%d!\n",
privDataSize));
*new_dev_p = alloc_etherdev(privDataSize); *new_dev_p = alloc_etherdev(privDataSize);
if (*new_dev_p) if (*new_dev_p)
return NDIS_STATUS_SUCCESS; return NDIS_STATUS_SUCCESS;
...@@ -1353,7 +1258,6 @@ INT RtmpOSNetDevAlloc( ...@@ -1353,7 +1258,6 @@ INT RtmpOSNetDevAlloc(
return NDIS_STATUS_FAILURE; return NDIS_STATUS_FAILURE;
} }
PNET_DEV RtmpOSNetDevGetByName(PNET_DEV pNetDev, PSTRING pDevName) PNET_DEV RtmpOSNetDevGetByName(PNET_DEV pNetDev, PSTRING pDevName)
{ {
PNET_DEV pTargetNetDev = NULL; PNET_DEV pTargetNetDev = NULL;
...@@ -1363,7 +1267,6 @@ PNET_DEV RtmpOSNetDevGetByName(PNET_DEV pNetDev, PSTRING pDevName) ...@@ -1363,7 +1267,6 @@ PNET_DEV RtmpOSNetDevGetByName(PNET_DEV pNetDev, PSTRING pDevName)
return pTargetNetDev; return pTargetNetDev;
} }
void RtmpOSNetDeviceRefPut(PNET_DEV pNetDev) void RtmpOSNetDeviceRefPut(PNET_DEV pNetDev)
{ {
/* /*
...@@ -1371,14 +1274,11 @@ void RtmpOSNetDeviceRefPut(PNET_DEV pNetDev) ...@@ -1371,14 +1274,11 @@ void RtmpOSNetDeviceRefPut(PNET_DEV pNetDev)
net_device*, dev_put should be called afterwards, because otherwise the net_device*, dev_put should be called afterwards, because otherwise the
machine hangs when the device is unregistered (since dev->refcnt > 1). machine hangs when the device is unregistered (since dev->refcnt > 1).
*/ */
if(pNetDev) if (pNetDev)
dev_put(pNetDev); dev_put(pNetDev);
} }
INT RtmpOSNetDevDestory(IN RTMP_ADAPTER * pAd, IN PNET_DEV pNetDev)
INT RtmpOSNetDevDestory(
IN RTMP_ADAPTER *pAd,
IN PNET_DEV pNetDev)
{ {
// TODO: Need to fix this // TODO: Need to fix this
...@@ -1386,23 +1286,19 @@ INT RtmpOSNetDevDestory( ...@@ -1386,23 +1286,19 @@ INT RtmpOSNetDevDestory(
return 0; return 0;
} }
void RtmpOSNetDevDetach(PNET_DEV pNetDev) void RtmpOSNetDevDetach(PNET_DEV pNetDev)
{ {
unregister_netdev(pNetDev); unregister_netdev(pNetDev);
} }
int RtmpOSNetDevAttach(IN PNET_DEV pNetDev,
int RtmpOSNetDevAttach( IN RTMP_OS_NETDEV_OP_HOOK * pDevOpHook)
IN PNET_DEV pNetDev,
IN RTMP_OS_NETDEV_OP_HOOK *pDevOpHook)
{ {
int ret, rtnl_locked = FALSE; int ret, rtnl_locked = FALSE;
DBGPRINT(RT_DEBUG_TRACE, ("RtmpOSNetDevAttach()--->\n")); DBGPRINT(RT_DEBUG_TRACE, ("RtmpOSNetDevAttach()--->\n"));
// If we need hook some callback function to the net device structrue, now do it. // If we need hook some callback function to the net device structrue, now do it.
if (pDevOpHook) if (pDevOpHook) {
{
PRTMP_ADAPTER pAd = NULL; PRTMP_ADAPTER pAd = NULL;
GET_PAD_FROM_NET_DEV(pAd, pNetDev); GET_PAD_FROM_NET_DEV(pAd, pNetDev);
...@@ -1412,15 +1308,13 @@ int RtmpOSNetDevAttach( ...@@ -1412,15 +1308,13 @@ int RtmpOSNetDevAttach(
/* OS specific flags, here we used to indicate if we are virtual interface */ /* OS specific flags, here we used to indicate if we are virtual interface */
pNetDev->priv_flags = pDevOpHook->priv_flags; pNetDev->priv_flags = pDevOpHook->priv_flags;
if (pAd->OpMode == OPMODE_STA) {
if (pAd->OpMode == OPMODE_STA)
{
pNetDev->wireless_handlers = &rt28xx_iw_handler_def; pNetDev->wireless_handlers = &rt28xx_iw_handler_def;
} }
// copy the net device mac address to the net_device structure. // copy the net device mac address to the net_device structure.
NdisMoveMemory(pNetDev->dev_addr, &pDevOpHook->devAddr[0], MAC_ADDR_LEN); NdisMoveMemory(pNetDev->dev_addr, &pDevOpHook->devAddr[0],
MAC_ADDR_LEN);
rtnl_locked = pDevOpHook->needProtcted; rtnl_locked = pDevOpHook->needProtcted;
} }
...@@ -1437,41 +1331,38 @@ int RtmpOSNetDevAttach( ...@@ -1437,41 +1331,38 @@ int RtmpOSNetDevAttach(
return NDIS_STATUS_FAILURE; return NDIS_STATUS_FAILURE;
} }
PNET_DEV RtmpOSNetDevCreate(IN RTMP_ADAPTER * pAd,
PNET_DEV RtmpOSNetDevCreate(
IN RTMP_ADAPTER *pAd,
IN INT devType, IN INT devType,
IN INT devNum, IN INT devNum,
IN INT privMemSize, IN INT privMemSize, IN PSTRING pNamePrefix)
IN PSTRING pNamePrefix)
{ {
struct net_device *pNetDev = NULL; struct net_device *pNetDev = NULL;
int status; int status;
/* allocate a new network device */ /* allocate a new network device */
status = RtmpOSNetDevAlloc(&pNetDev, 0 /*privMemSize*/); status = RtmpOSNetDevAlloc(&pNetDev, 0 /*privMemSize */ );
if (status != NDIS_STATUS_SUCCESS) if (status != NDIS_STATUS_SUCCESS) {
{
/* allocation fail, exit */ /* allocation fail, exit */
DBGPRINT(RT_DEBUG_ERROR, ("Allocate network device fail (%s)...\n", pNamePrefix)); DBGPRINT(RT_DEBUG_ERROR,
("Allocate network device fail (%s)...\n",
pNamePrefix));
return NULL; return NULL;
} }
/* find a available interface name, max 32 interfaces */ /* find a available interface name, max 32 interfaces */
status = RtmpOSNetDevRequestName(pAd, pNetDev, pNamePrefix, devNum); status = RtmpOSNetDevRequestName(pAd, pNetDev, pNamePrefix, devNum);
if (status != NDIS_STATUS_SUCCESS) if (status != NDIS_STATUS_SUCCESS) {
{
/* error! no any available ra name can be used! */ /* error! no any available ra name can be used! */
DBGPRINT(RT_DEBUG_ERROR, ("Assign interface name (%s with suffix 0~32) failed...\n", pNamePrefix)); DBGPRINT(RT_DEBUG_ERROR,
("Assign interface name (%s with suffix 0~32) failed...\n",
pNamePrefix));
RtmpOSNetDevFree(pNetDev); RtmpOSNetDevFree(pNetDev);
return NULL; return NULL;
} } else {
else DBGPRINT(RT_DEBUG_TRACE,
{ ("The name of the new %s interface is %s...\n",
DBGPRINT(RT_DEBUG_TRACE, ("The name of the new %s interface is %s...\n", pNamePrefix, pNetDev->name)); pNamePrefix, pNetDev->name));
} }
return pNetDev; return pNetDev;
......
...@@ -37,17 +37,14 @@ ...@@ -37,17 +37,14 @@
#include "rt_config.h" #include "rt_config.h"
/*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/
/* Private Variables Used */ /* Private Variables Used */
/*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/
PSTRING mac = ""; // default 00:00:00:00:00:00 PSTRING mac = ""; // default 00:00:00:00:00:00
PSTRING hostname = ""; // default CMPC PSTRING hostname = ""; // default CMPC
module_param (mac, charp, 0); module_param(mac, charp, 0);
MODULE_PARM_DESC (mac, "rt28xx: wireless mac addr"); MODULE_PARM_DESC(mac, "rt28xx: wireless mac addr");
/*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/
/* Prototypes of Functions Used */ /* Prototypes of Functions Used */
...@@ -58,12 +55,12 @@ int rt28xx_close(IN struct net_device *net_dev); ...@@ -58,12 +55,12 @@ int rt28xx_close(IN struct net_device *net_dev);
int rt28xx_open(struct net_device *net_dev); int rt28xx_open(struct net_device *net_dev);
// private function prototype // private function prototype
static INT rt28xx_send_packets(IN struct sk_buff *skb_p, IN struct net_device *net_dev); static INT rt28xx_send_packets(IN struct sk_buff *skb_p,
static struct net_device_stats *RT28xx_get_ether_stats(
IN struct net_device *net_dev); IN struct net_device *net_dev);
static struct net_device_stats *RT28xx_get_ether_stats(IN struct net_device
*net_dev);
/* /*
======================================================================== ========================================================================
Routine Description: Routine Description:
...@@ -101,26 +98,33 @@ int MainVirtualIF_close(IN struct net_device *net_dev) ...@@ -101,26 +98,33 @@ int MainVirtualIF_close(IN struct net_device *net_dev)
BOOLEAN Cancelled; BOOLEAN Cancelled;
if (INFRA_ON(pAd) && if (INFRA_ON(pAd) &&
(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))) (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))) {
{
MLME_DISASSOC_REQ_STRUCT DisReq; MLME_DISASSOC_REQ_STRUCT DisReq;
MLME_QUEUE_ELEM *MsgElem = (MLME_QUEUE_ELEM *) kmalloc(sizeof(MLME_QUEUE_ELEM), MEM_ALLOC_FLAG); MLME_QUEUE_ELEM *MsgElem =
(MLME_QUEUE_ELEM *) kmalloc(sizeof(MLME_QUEUE_ELEM),
MEM_ALLOC_FLAG);
if (MsgElem) if (MsgElem) {
{ COPY_MAC_ADDR(DisReq.Addr,
COPY_MAC_ADDR(DisReq.Addr, pAd->CommonCfg.Bssid); pAd->CommonCfg.Bssid);
DisReq.Reason = REASON_DEAUTH_STA_LEAVING; DisReq.Reason = REASON_DEAUTH_STA_LEAVING;
MsgElem->Machine = ASSOC_STATE_MACHINE; MsgElem->Machine = ASSOC_STATE_MACHINE;
MsgElem->MsgType = MT2_MLME_DISASSOC_REQ; MsgElem->MsgType = MT2_MLME_DISASSOC_REQ;
MsgElem->MsgLen = sizeof(MLME_DISASSOC_REQ_STRUCT); MsgElem->MsgLen =
NdisMoveMemory(MsgElem->Msg, &DisReq, sizeof(MLME_DISASSOC_REQ_STRUCT)); sizeof(MLME_DISASSOC_REQ_STRUCT);
NdisMoveMemory(MsgElem->Msg, &DisReq,
sizeof
(MLME_DISASSOC_REQ_STRUCT));
// Prevent to connect AP again in STAMlmePeriodicExec // Prevent to connect AP again in STAMlmePeriodicExec
pAd->MlmeAux.AutoReconnectSsidLen= 32; pAd->MlmeAux.AutoReconnectSsidLen = 32;
NdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.AutoReconnectSsidLen); NdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid,
pAd->MlmeAux.
AutoReconnectSsidLen);
pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_DISASSOC; pAd->Mlme.CntlMachine.CurrState =
CNTL_WAIT_OID_DISASSOC;
MlmeDisassocReqAction(pAd, MsgElem); MlmeDisassocReqAction(pAd, MsgElem);
kfree(MsgElem); kfree(MsgElem);
} }
...@@ -128,8 +132,10 @@ int MainVirtualIF_close(IN struct net_device *net_dev) ...@@ -128,8 +132,10 @@ int MainVirtualIF_close(IN struct net_device *net_dev)
RTMPusecDelay(1000); RTMPusecDelay(1000);
} }
RTMPCancelTimer(&pAd->StaCfg.StaQuickResponeForRateUpTimer, &Cancelled); RTMPCancelTimer(&pAd->StaCfg.StaQuickResponeForRateUpTimer,
RTMPCancelTimer(&pAd->StaCfg.WpaDisassocAndBlockAssocTimer, &Cancelled); &Cancelled);
RTMPCancelTimer(&pAd->StaCfg.WpaDisassocAndBlockAssocTimer,
&Cancelled);
} }
VIRTUAL_IF_DOWN(pAd); VIRTUAL_IF_DOWN(pAd);
...@@ -204,7 +210,7 @@ Return Value: ...@@ -204,7 +210,7 @@ Return Value:
*/ */
int rt28xx_close(IN PNET_DEV dev) int rt28xx_close(IN PNET_DEV dev)
{ {
struct net_device * net_dev = (struct net_device *)dev; struct net_device *net_dev = (struct net_device *)dev;
RTMP_ADAPTER *pAd = NULL; RTMP_ADAPTER *pAd = NULL;
BOOLEAN Cancelled; BOOLEAN Cancelled;
UINT32 i = 0; UINT32 i = 0;
...@@ -230,11 +236,9 @@ int rt28xx_close(IN PNET_DEV dev) ...@@ -230,11 +236,9 @@ int rt28xx_close(IN PNET_DEV dev)
// If dirver doesn't wake up firmware here, // If dirver doesn't wake up firmware here,
// NICLoadFirmware will hang forever when interface is up again. // NICLoadFirmware will hang forever when interface is up again.
if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)) if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)) {
{
AsicForceWakeup(pAd, TRUE); AsicForceWakeup(pAd, TRUE);
} }
#ifdef RTMP_MAC_USB #ifdef RTMP_MAC_USB
RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_REMOVE_IN_PROGRESS); RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_REMOVE_IN_PROGRESS);
#endif // RTMP_MAC_USB // #endif // RTMP_MAC_USB //
...@@ -247,30 +251,28 @@ int rt28xx_close(IN PNET_DEV dev) ...@@ -247,30 +251,28 @@ int rt28xx_close(IN PNET_DEV dev)
RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS); RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS);
for (i = 0 ; i < NUM_OF_TX_RING; i++) for (i = 0; i < NUM_OF_TX_RING; i++) {
{ while (pAd->DeQueueRunning[i] == TRUE) {
while (pAd->DeQueueRunning[i] == TRUE) DBGPRINT(RT_DEBUG_TRACE,
{ ("Waiting for TxQueue[%d] done..........\n",
DBGPRINT(RT_DEBUG_TRACE, ("Waiting for TxQueue[%d] done..........\n", i)); i));
RTMPusecDelay(1000); RTMPusecDelay(1000);
} }
} }
#ifdef RTMP_MAC_USB #ifdef RTMP_MAC_USB
// ensure there are no more active urbs. // ensure there are no more active urbs.
add_wait_queue (&unlink_wakeup, &wait); add_wait_queue(&unlink_wakeup, &wait);
pAd->wait = &unlink_wakeup; pAd->wait = &unlink_wakeup;
// maybe wait for deletions to finish. // maybe wait for deletions to finish.
i = 0; i = 0;
//while((i < 25) && atomic_read(&pAd->PendingRx) > 0) //while((i < 25) && atomic_read(&pAd->PendingRx) > 0)
while(i < 25) while (i < 25) {
{
unsigned long IrqFlags; unsigned long IrqFlags;
RTMP_IRQ_LOCK(&pAd->BulkInLock, IrqFlags); RTMP_IRQ_LOCK(&pAd->BulkInLock, IrqFlags);
if (pAd->PendingRx == 0) if (pAd->PendingRx == 0) {
{
RTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags); RTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags);
break; break;
} }
...@@ -280,7 +282,7 @@ int rt28xx_close(IN PNET_DEV dev) ...@@ -280,7 +282,7 @@ int rt28xx_close(IN PNET_DEV dev)
i++; i++;
} }
pAd->wait = NULL; pAd->wait = NULL;
remove_wait_queue (&unlink_wakeup, &wait); remove_wait_queue(&unlink_wakeup, &wait);
#endif // RTMP_MAC_USB // #endif // RTMP_MAC_USB //
// Stop Mlme state machine // Stop Mlme state machine
...@@ -293,11 +295,9 @@ int rt28xx_close(IN PNET_DEV dev) ...@@ -293,11 +295,9 @@ int rt28xx_close(IN PNET_DEV dev)
MacTableReset(pAd); MacTableReset(pAd);
} }
MeasureReqTabExit(pAd); MeasureReqTabExit(pAd);
TpcReqTabExit(pAd); TpcReqTabExit(pAd);
// Close kernel threads // Close kernel threads
RtmpMgmtTaskExit(pAd); RtmpMgmtTaskExit(pAd);
...@@ -306,29 +306,26 @@ int rt28xx_close(IN PNET_DEV dev) ...@@ -306,29 +306,26 @@ int rt28xx_close(IN PNET_DEV dev)
BOOLEAN brc; BOOLEAN brc;
// ULONG Value; // ULONG Value;
if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_ACTIVE)) if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_ACTIVE)) {
{
RTMP_ASIC_INTERRUPT_DISABLE(pAd); RTMP_ASIC_INTERRUPT_DISABLE(pAd);
} }
// Receive packets to clear DMA index after disable interrupt. // Receive packets to clear DMA index after disable interrupt.
//RTMPHandleRxDoneInterrupt(pAd); //RTMPHandleRxDoneInterrupt(pAd);
// put to radio off to save power when driver unload. After radiooff, can't write /read register. So need to finish all // put to radio off to save power when driver unload. After radiooff, can't write /read register. So need to finish all
// register access before Radio off. // register access before Radio off.
brc = RT28xxPciAsicRadioOff(pAd, RTMP_HALT, 0);
brc=RT28xxPciAsicRadioOff(pAd, RTMP_HALT, 0);
//In solution 3 of 3090F, the bPCIclkOff will be set to TRUE after calling RT28xxPciAsicRadioOff //In solution 3 of 3090F, the bPCIclkOff will be set to TRUE after calling RT28xxPciAsicRadioOff
pAd->bPCIclkOff = FALSE; pAd->bPCIclkOff = FALSE;
if (brc==FALSE) if (brc == FALSE) {
{ DBGPRINT(RT_DEBUG_ERROR,
DBGPRINT(RT_DEBUG_ERROR,("%s call RT28xxPciAsicRadioOff fail !!\n", __func__)); ("%s call RT28xxPciAsicRadioOff fail !!\n",
__func__));
} }
} }
/* /*
if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_ACTIVE)) if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_ACTIVE))
{ {
...@@ -341,15 +338,13 @@ int rt28xx_close(IN PNET_DEV dev) ...@@ -341,15 +338,13 @@ int rt28xx_close(IN PNET_DEV dev)
#endif // RTMP_MAC_PCI // #endif // RTMP_MAC_PCI //
// Free IRQ // Free IRQ
if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) {
{
#ifdef RTMP_MAC_PCI #ifdef RTMP_MAC_PCI
// Deregister interrupt function // Deregister interrupt function
RtmpOSIRQRelease(net_dev); RtmpOSIRQRelease(net_dev);
#endif // RTMP_MAC_PCI // #endif // RTMP_MAC_PCI //
RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE); RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE);
} }
// Free Ring or USB buffers // Free Ring or USB buffers
RTMPFreeTxRxRingMemory(pAd); RTMPFreeTxRxRingMemory(pAd);
...@@ -358,7 +353,6 @@ int rt28xx_close(IN PNET_DEV dev) ...@@ -358,7 +353,6 @@ int rt28xx_close(IN PNET_DEV dev)
// Free BA reorder resource // Free BA reorder resource
ba_reordering_resource_release(pAd); ba_reordering_resource_release(pAd);
RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_START_UP); RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_START_UP);
/*+++Modify by woody to solve the bulk fail+++*/ /*+++Modify by woody to solve the bulk fail+++*/
...@@ -369,7 +363,6 @@ int rt28xx_close(IN PNET_DEV dev) ...@@ -369,7 +363,6 @@ int rt28xx_close(IN PNET_DEV dev)
return 0; // close ok return 0; // close ok
} /* End of rt28xx_close */ } /* End of rt28xx_close */
/* /*
======================================================================== ========================================================================
Routine Description: Routine Description:
...@@ -387,7 +380,7 @@ Return Value: ...@@ -387,7 +380,7 @@ Return Value:
*/ */
int rt28xx_open(IN PNET_DEV dev) int rt28xx_open(IN PNET_DEV dev)
{ {
struct net_device * net_dev = (struct net_device *)dev; struct net_device *net_dev = (struct net_device *)dev;
PRTMP_ADAPTER pAd = NULL; PRTMP_ADAPTER pAd = NULL;
int retval = 0; int retval = 0;
//POS_COOKIE pObj; //POS_COOKIE pObj;
...@@ -395,24 +388,21 @@ int rt28xx_open(IN PNET_DEV dev) ...@@ -395,24 +388,21 @@ int rt28xx_open(IN PNET_DEV dev)
GET_PAD_FROM_NET_DEV(pAd, net_dev); GET_PAD_FROM_NET_DEV(pAd, net_dev);
// Sanity check for pAd // Sanity check for pAd
if (pAd == NULL) if (pAd == NULL) {
{
/* if 1st open fail, pAd will be free; /* if 1st open fail, pAd will be free;
So the net_dev->ml_priv will be NULL in 2rd open */ So the net_dev->ml_priv will be NULL in 2rd open */
return -1; return -1;
} }
if (net_dev->priv_flags == INT_MAIN) if (net_dev->priv_flags == INT_MAIN) {
{
if (pAd->OpMode == OPMODE_STA) if (pAd->OpMode == OPMODE_STA)
net_dev->wireless_handlers = (struct iw_handler_def *) &rt28xx_iw_handler_def; net_dev->wireless_handlers =
(struct iw_handler_def *)&rt28xx_iw_handler_def;
} }
// Request interrupt service routine for PCI device // Request interrupt service routine for PCI device
// register the interrupt routine with the os // register the interrupt routine with the os
RtmpOSIRQRequest(net_dev); RtmpOSIRQRequest(net_dev);
// Init IRQ parameters stored in pAd // Init IRQ parameters stored in pAd
RTMP_IRQ_INIT(pAd); RTMP_IRQ_INIT(pAd);
...@@ -420,7 +410,6 @@ int rt28xx_open(IN PNET_DEV dev) ...@@ -420,7 +410,6 @@ int rt28xx_open(IN PNET_DEV dev)
if (rt28xx_init(pAd, mac, hostname) == FALSE) if (rt28xx_init(pAd, mac, hostname) == FALSE)
goto err; goto err;
// Enable Interrupt // Enable Interrupt
RTMP_IRQ_ENABLE(pAd); RTMP_IRQ_ENABLE(pAd);
...@@ -470,26 +459,28 @@ static const struct net_device_ops rt2860_netdev_ops = { ...@@ -470,26 +459,28 @@ static const struct net_device_ops rt2860_netdev_ops = {
.ndo_start_xmit = rt28xx_send_packets, .ndo_start_xmit = rt28xx_send_packets,
}; };
PNET_DEV RtmpPhyNetDevInit( PNET_DEV RtmpPhyNetDevInit(IN RTMP_ADAPTER * pAd,
IN RTMP_ADAPTER *pAd, IN RTMP_OS_NETDEV_OP_HOOK * pNetDevHook)
IN RTMP_OS_NETDEV_OP_HOOK *pNetDevHook)
{ {
struct net_device *net_dev = NULL; struct net_device *net_dev = NULL;
// NDIS_STATUS Status; // NDIS_STATUS Status;
net_dev = RtmpOSNetDevCreate(pAd, INT_MAIN, 0, sizeof(PRTMP_ADAPTER), INF_MAIN_DEV_NAME); net_dev =
if (net_dev == NULL) RtmpOSNetDevCreate(pAd, INT_MAIN, 0, sizeof(PRTMP_ADAPTER),
{ INF_MAIN_DEV_NAME);
printk("RtmpPhyNetDevInit(): creation failed for main physical net device!\n"); if (net_dev == NULL) {
printk
("RtmpPhyNetDevInit(): creation failed for main physical net device!\n");
return NULL; return NULL;
} }
NdisZeroMemory((unsigned char *)pNetDevHook, sizeof(RTMP_OS_NETDEV_OP_HOOK)); NdisZeroMemory((unsigned char *)pNetDevHook,
sizeof(RTMP_OS_NETDEV_OP_HOOK));
pNetDevHook->netdev_ops = &rt2860_netdev_ops; pNetDevHook->netdev_ops = &rt2860_netdev_ops;
pNetDevHook->priv_flags = INT_MAIN; pNetDevHook->priv_flags = INT_MAIN;
pNetDevHook->needProtcted = FALSE; pNetDevHook->needProtcted = FALSE;
net_dev->ml_priv = (PVOID)pAd; net_dev->ml_priv = (PVOID) pAd;
pAd->net_dev = net_dev; pAd->net_dev = net_dev;
netif_stop_queue(net_dev); netif_stop_queue(net_dev);
...@@ -498,7 +489,6 @@ PNET_DEV RtmpPhyNetDevInit( ...@@ -498,7 +489,6 @@ PNET_DEV RtmpPhyNetDevInit(
} }
/* /*
======================================================================== ========================================================================
Routine Description: Routine Description:
...@@ -529,16 +519,14 @@ int rt28xx_packet_xmit(struct sk_buff *skb) ...@@ -529,16 +519,14 @@ int rt28xx_packet_xmit(struct sk_buff *skb)
{ {
// Drop send request since we are in monitor mode // Drop send request since we are in monitor mode
if (MONITOR_ON(pAd)) if (MONITOR_ON(pAd)) {
{
RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE); RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);
goto done; goto done;
} }
} }
// EapolStart size is 18 // EapolStart size is 18
if (skb->len < 14) if (skb->len < 14) {
{
//printk("bad packet size: %d\n", pkt->len); //printk("bad packet size: %d\n", pkt->len);
hex_dump("bad packet", skb->data, skb->len); hex_dump("bad packet", skb->data, skb->len);
RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE); RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);
...@@ -546,7 +534,7 @@ int rt28xx_packet_xmit(struct sk_buff *skb) ...@@ -546,7 +534,7 @@ int rt28xx_packet_xmit(struct sk_buff *skb)
} }
RTMP_SET_PACKET_5VT(pPacket, 0); RTMP_SET_PACKET_5VT(pPacket, 0);
STASendPackets((NDIS_HANDLE)pAd, (PPNDIS_PACKET) &pPacket, 1); STASendPackets((NDIS_HANDLE) pAd, (PPNDIS_PACKET) & pPacket, 1);
status = NETDEV_TX_OK; status = NETDEV_TX_OK;
done: done:
...@@ -554,7 +542,6 @@ int rt28xx_packet_xmit(struct sk_buff *skb) ...@@ -554,7 +542,6 @@ int rt28xx_packet_xmit(struct sk_buff *skb)
return status; return status;
} }
/* /*
======================================================================== ========================================================================
Routine Description: Routine Description:
...@@ -571,30 +558,27 @@ Return Value: ...@@ -571,30 +558,27 @@ Return Value:
Note: Note:
======================================================================== ========================================================================
*/ */
static int rt28xx_send_packets( static int rt28xx_send_packets(IN struct sk_buff *skb_p,
IN struct sk_buff *skb_p,
IN struct net_device *net_dev) IN struct net_device *net_dev)
{ {
RTMP_ADAPTER *pAd = NULL; RTMP_ADAPTER *pAd = NULL;
GET_PAD_FROM_NET_DEV(pAd, net_dev); GET_PAD_FROM_NET_DEV(pAd, net_dev);
if (!(net_dev->flags & IFF_UP)) if (!(net_dev->flags & IFF_UP)) {
{ RELEASE_NDIS_PACKET(pAd, (PNDIS_PACKET) skb_p,
RELEASE_NDIS_PACKET(pAd, (PNDIS_PACKET)skb_p, NDIS_STATUS_FAILURE); NDIS_STATUS_FAILURE);
return NETDEV_TX_OK; return NETDEV_TX_OK;
} }
NdisZeroMemory((PUCHAR)&skb_p->cb[CB_OFF], 15); NdisZeroMemory((PUCHAR) & skb_p->cb[CB_OFF], 15);
RTMP_SET_PACKET_NET_DEVICE_MBSSID(skb_p, MAIN_MBSSID); RTMP_SET_PACKET_NET_DEVICE_MBSSID(skb_p, MAIN_MBSSID);
return rt28xx_packet_xmit(skb_p); return rt28xx_packet_xmit(skb_p);
} }
// This function will be called when query /proc // This function will be called when query /proc
struct iw_statistics *rt28xx_get_wireless_stats( struct iw_statistics *rt28xx_get_wireless_stats(IN struct net_device *net_dev)
IN struct net_device *net_dev)
{ {
PRTMP_ADAPTER pAd = NULL; PRTMP_ADAPTER pAd = NULL;
...@@ -606,13 +590,13 @@ struct iw_statistics *rt28xx_get_wireless_stats( ...@@ -606,13 +590,13 @@ struct iw_statistics *rt28xx_get_wireless_stats(
// link quality // link quality
if (pAd->OpMode == OPMODE_STA) if (pAd->OpMode == OPMODE_STA)
pAd->iw_stats.qual.qual = ((pAd->Mlme.ChannelQuality * 12)/10 + 10); pAd->iw_stats.qual.qual =
((pAd->Mlme.ChannelQuality * 12) / 10 + 10);
if(pAd->iw_stats.qual.qual > 100) if (pAd->iw_stats.qual.qual > 100)
pAd->iw_stats.qual.qual = 100; pAd->iw_stats.qual.qual = 100;
if (pAd->OpMode == OPMODE_STA) if (pAd->OpMode == OPMODE_STA) {
{
pAd->iw_stats.qual.level = pAd->iw_stats.qual.level =
RTMPMaxRssi(pAd, pAd->StaCfg.RssiSample.LastRssi0, RTMPMaxRssi(pAd, pAd->StaCfg.RssiSample.LastRssi0,
pAd->StaCfg.RssiSample.LastRssi1, pAd->StaCfg.RssiSample.LastRssi1,
...@@ -634,7 +618,6 @@ struct iw_statistics *rt28xx_get_wireless_stats( ...@@ -634,7 +618,6 @@ struct iw_statistics *rt28xx_get_wireless_stats(
return &pAd->iw_stats; return &pAd->iw_stats;
} }
void tbtt_tasklet(unsigned long data) void tbtt_tasklet(unsigned long data)
{ {
//#define MAX_TX_IN_TBTT (16) //#define MAX_TX_IN_TBTT (16)
...@@ -657,19 +640,20 @@ void tbtt_tasklet(unsigned long data) ...@@ -657,19 +640,20 @@ void tbtt_tasklet(unsigned long data)
======================================================================== ========================================================================
*/ */
static struct net_device_stats *RT28xx_get_ether_stats( static struct net_device_stats *RT28xx_get_ether_stats(IN struct net_device
IN struct net_device *net_dev) *net_dev)
{ {
RTMP_ADAPTER *pAd = NULL; RTMP_ADAPTER *pAd = NULL;
if (net_dev) if (net_dev)
GET_PAD_FROM_NET_DEV(pAd, net_dev); GET_PAD_FROM_NET_DEV(pAd, net_dev);
if (pAd) if (pAd) {
{
pAd->stats.rx_packets = pAd->WlanCounters.ReceivedFragmentCount.QuadPart; pAd->stats.rx_packets =
pAd->stats.tx_packets = pAd->WlanCounters.TransmittedFragmentCount.QuadPart; pAd->WlanCounters.ReceivedFragmentCount.QuadPart;
pAd->stats.tx_packets =
pAd->WlanCounters.TransmittedFragmentCount.QuadPart;
pAd->stats.rx_bytes = pAd->RalinkCounters.ReceivedByteCount; pAd->stats.rx_bytes = pAd->RalinkCounters.ReceivedByteCount;
pAd->stats.tx_bytes = pAd->RalinkCounters.TransmittedByteCount; pAd->stats.tx_bytes = pAd->RalinkCounters.TransmittedByteCount;
...@@ -685,7 +669,7 @@ static struct net_device_stats *RT28xx_get_ether_stats( ...@@ -685,7 +669,7 @@ static struct net_device_stats *RT28xx_get_ether_stats(
pAd->stats.rx_length_errors = 0; pAd->stats.rx_length_errors = 0;
pAd->stats.rx_over_errors = pAd->Counters8023.RxNoBuffer; // receiver ring buff overflow pAd->stats.rx_over_errors = pAd->Counters8023.RxNoBuffer; // receiver ring buff overflow
pAd->stats.rx_crc_errors = 0;//pAd->WlanCounters.FCSErrorCount; // recved pkt with crc error pAd->stats.rx_crc_errors = 0; //pAd->WlanCounters.FCSErrorCount; // recved pkt with crc error
pAd->stats.rx_frame_errors = pAd->Counters8023.RcvAlignmentErrors; // recv'd frame alignment error pAd->stats.rx_frame_errors = pAd->Counters8023.RcvAlignmentErrors; // recv'd frame alignment error
pAd->stats.rx_fifo_errors = pAd->Counters8023.RxNoBuffer; // recv'r fifo overrun pAd->stats.rx_fifo_errors = pAd->Counters8023.RxNoBuffer; // recv'r fifo overrun
pAd->stats.rx_missed_errors = 0; // receiver missed packet pAd->stats.rx_missed_errors = 0; // receiver missed packet
...@@ -702,23 +686,18 @@ static struct net_device_stats *RT28xx_get_ether_stats( ...@@ -702,23 +686,18 @@ static struct net_device_stats *RT28xx_get_ether_stats(
pAd->stats.tx_compressed = 0; pAd->stats.tx_compressed = 0;
return &pAd->stats; return &pAd->stats;
} } else
else
return NULL; return NULL;
} }
BOOLEAN RtmpPhyNetDevExit(IN RTMP_ADAPTER * pAd, IN PNET_DEV net_dev)
BOOLEAN RtmpPhyNetDevExit(
IN RTMP_ADAPTER *pAd,
IN PNET_DEV net_dev)
{ {
// Unregister network device // Unregister network device
if (net_dev != NULL) if (net_dev != NULL) {
{ printk
printk("RtmpOSNetDevDetach(): RtmpOSNetDeviceDetach(), dev->name=%s!\n", net_dev->name); ("RtmpOSNetDevDetach(): RtmpOSNetDeviceDetach(), dev->name=%s!\n",
net_dev->name);
RtmpOSNetDevDetach(net_dev); RtmpOSNetDevDetach(net_dev);
} }
...@@ -726,7 +705,6 @@ BOOLEAN RtmpPhyNetDevExit( ...@@ -726,7 +705,6 @@ BOOLEAN RtmpPhyNetDevExit(
} }
/* /*
======================================================================== ========================================================================
Routine Description: Routine Description:
...@@ -743,17 +721,14 @@ Return Value: ...@@ -743,17 +721,14 @@ Return Value:
Note: Note:
======================================================================== ========================================================================
*/ */
NDIS_STATUS AdapterBlockAllocateMemory( NDIS_STATUS AdapterBlockAllocateMemory(IN PVOID handle, OUT PVOID * ppAd)
IN PVOID handle,
OUT PVOID *ppAd)
{ {
*ppAd = (PVOID)vmalloc(sizeof(RTMP_ADAPTER)); //pci_alloc_consistent(pci_dev, sizeof(RTMP_ADAPTER), phy_addr); *ppAd = (PVOID) vmalloc(sizeof(RTMP_ADAPTER)); //pci_alloc_consistent(pci_dev, sizeof(RTMP_ADAPTER), phy_addr);
if (*ppAd) if (*ppAd) {
{
NdisZeroMemory(*ppAd, sizeof(RTMP_ADAPTER)); NdisZeroMemory(*ppAd, sizeof(RTMP_ADAPTER));
((PRTMP_ADAPTER)*ppAd)->OS_Cookie = handle; ((PRTMP_ADAPTER) * ppAd)->OS_Cookie = handle;
return (NDIS_STATUS_SUCCESS); return (NDIS_STATUS_SUCCESS);
} else { } else {
return (NDIS_STATUS_FAILURE); return (NDIS_STATUS_FAILURE);
......
...@@ -48,8 +48,6 @@ static void ac2_dma_done_tasklet(unsigned long data); ...@@ -48,8 +48,6 @@ static void ac2_dma_done_tasklet(unsigned long data);
static void ac3_dma_done_tasklet(unsigned long data); static void ac3_dma_done_tasklet(unsigned long data);
static void fifo_statistic_full_tasklet(unsigned long data); static void fifo_statistic_full_tasklet(unsigned long data);
/*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/
/* Symbol & Macro Definitions */ /* Symbol & Macro Definitions */
/*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/
...@@ -72,7 +70,6 @@ static void fifo_statistic_full_tasklet(unsigned long data); ...@@ -72,7 +70,6 @@ static void fifo_statistic_full_tasklet(unsigned long data);
#define INT_HCCA_DLY (RT2860_INT_HCCA_DMA_DONE) //| RT2860_INT_TX_DLY) #define INT_HCCA_DLY (RT2860_INT_HCCA_DMA_DONE) //| RT2860_INT_TX_DLY)
#define INT_MGMT_DLY RT2860_INT_MGMT_DONE #define INT_MGMT_DLY RT2860_INT_MGMT_DONE
/*************************************************************************** /***************************************************************************
* *
* Interface-depended memory allocation/Free related procedures. * Interface-depended memory allocation/Free related procedures.
...@@ -80,92 +77,90 @@ static void fifo_statistic_full_tasklet(unsigned long data); ...@@ -80,92 +77,90 @@ static void fifo_statistic_full_tasklet(unsigned long data);
* *
**************************************************************************/ **************************************************************************/
// Function for TxDesc Memory allocation. // Function for TxDesc Memory allocation.
void RTMP_AllocateTxDescMemory( void RTMP_AllocateTxDescMemory(IN PRTMP_ADAPTER pAd,
IN PRTMP_ADAPTER pAd,
IN UINT Index, IN UINT Index,
IN ULONG Length, IN ULONG Length,
IN BOOLEAN Cached, IN BOOLEAN Cached,
OUT PVOID *VirtualAddress, OUT PVOID * VirtualAddress,
OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress) OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress)
{ {
POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
*VirtualAddress = (PVOID)pci_alloc_consistent(pObj->pci_dev,sizeof(char)*Length, PhysicalAddress); *VirtualAddress =
(PVOID) pci_alloc_consistent(pObj->pci_dev, sizeof(char) * Length,
PhysicalAddress);
} }
// Function for MgmtDesc Memory allocation. // Function for MgmtDesc Memory allocation.
void RTMP_AllocateMgmtDescMemory( void RTMP_AllocateMgmtDescMemory(IN PRTMP_ADAPTER pAd,
IN PRTMP_ADAPTER pAd,
IN ULONG Length, IN ULONG Length,
IN BOOLEAN Cached, IN BOOLEAN Cached,
OUT PVOID *VirtualAddress, OUT PVOID * VirtualAddress,
OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress) OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress)
{ {
POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
*VirtualAddress = (PVOID)pci_alloc_consistent(pObj->pci_dev,sizeof(char)*Length, PhysicalAddress); *VirtualAddress =
(PVOID) pci_alloc_consistent(pObj->pci_dev, sizeof(char) * Length,
PhysicalAddress);
} }
// Function for RxDesc Memory allocation. // Function for RxDesc Memory allocation.
void RTMP_AllocateRxDescMemory( void RTMP_AllocateRxDescMemory(IN PRTMP_ADAPTER pAd,
IN PRTMP_ADAPTER pAd,
IN ULONG Length, IN ULONG Length,
IN BOOLEAN Cached, IN BOOLEAN Cached,
OUT PVOID *VirtualAddress, OUT PVOID * VirtualAddress,
OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress) OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress)
{ {
POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
*VirtualAddress = (PVOID)pci_alloc_consistent(pObj->pci_dev,sizeof(char)*Length, PhysicalAddress); *VirtualAddress =
(PVOID) pci_alloc_consistent(pObj->pci_dev, sizeof(char) * Length,
PhysicalAddress);
} }
// Function for free allocated Desc Memory. // Function for free allocated Desc Memory.
void RTMP_FreeDescMemory( void RTMP_FreeDescMemory(IN PRTMP_ADAPTER pAd,
IN PRTMP_ADAPTER pAd,
IN ULONG Length, IN ULONG Length,
IN PVOID VirtualAddress, IN PVOID VirtualAddress,
IN NDIS_PHYSICAL_ADDRESS PhysicalAddress) IN NDIS_PHYSICAL_ADDRESS PhysicalAddress)
{ {
POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
pci_free_consistent(pObj->pci_dev, Length, VirtualAddress, PhysicalAddress); pci_free_consistent(pObj->pci_dev, Length, VirtualAddress,
PhysicalAddress);
} }
// Function for TxData DMA Memory allocation. // Function for TxData DMA Memory allocation.
void RTMP_AllocateFirstTxBuffer( void RTMP_AllocateFirstTxBuffer(IN PRTMP_ADAPTER pAd,
IN PRTMP_ADAPTER pAd,
IN UINT Index, IN UINT Index,
IN ULONG Length, IN ULONG Length,
IN BOOLEAN Cached, IN BOOLEAN Cached,
OUT PVOID *VirtualAddress, OUT PVOID * VirtualAddress,
OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress) OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress)
{ {
POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
*VirtualAddress = (PVOID)pci_alloc_consistent(pObj->pci_dev,sizeof(char)*Length, PhysicalAddress); *VirtualAddress =
(PVOID) pci_alloc_consistent(pObj->pci_dev, sizeof(char) * Length,
PhysicalAddress);
} }
void RTMP_FreeFirstTxBuffer(IN PRTMP_ADAPTER pAd,
void RTMP_FreeFirstTxBuffer(
IN PRTMP_ADAPTER pAd,
IN ULONG Length, IN ULONG Length,
IN BOOLEAN Cached, IN BOOLEAN Cached,
IN PVOID VirtualAddress, IN PVOID VirtualAddress,
IN NDIS_PHYSICAL_ADDRESS PhysicalAddress) IN NDIS_PHYSICAL_ADDRESS PhysicalAddress)
{ {
POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
pci_free_consistent(pObj->pci_dev, Length, VirtualAddress, PhysicalAddress); pci_free_consistent(pObj->pci_dev, Length, VirtualAddress,
PhysicalAddress);
} }
/* /*
* FUNCTION: Allocate a common buffer for DMA * FUNCTION: Allocate a common buffer for DMA
* ARGUMENTS: * ARGUMENTS:
...@@ -175,19 +170,19 @@ void RTMP_FreeFirstTxBuffer( ...@@ -175,19 +170,19 @@ void RTMP_FreeFirstTxBuffer(
* VirtualAddress: Pointer to memory is returned here * VirtualAddress: Pointer to memory is returned here
* PhysicalAddress: Physical address corresponding to virtual address * PhysicalAddress: Physical address corresponding to virtual address
*/ */
void RTMP_AllocateSharedMemory( void RTMP_AllocateSharedMemory(IN PRTMP_ADAPTER pAd,
IN PRTMP_ADAPTER pAd,
IN ULONG Length, IN ULONG Length,
IN BOOLEAN Cached, IN BOOLEAN Cached,
OUT PVOID *VirtualAddress, OUT PVOID * VirtualAddress,
OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress) OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress)
{ {
POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
*VirtualAddress = (PVOID)pci_alloc_consistent(pObj->pci_dev,sizeof(char)*Length, PhysicalAddress); *VirtualAddress =
(PVOID) pci_alloc_consistent(pObj->pci_dev, sizeof(char) * Length,
PhysicalAddress);
} }
/* /*
* FUNCTION: Allocate a packet buffer for DMA * FUNCTION: Allocate a packet buffer for DMA
* ARGUMENTS: * ARGUMENTS:
...@@ -199,25 +194,28 @@ void RTMP_AllocateSharedMemory( ...@@ -199,25 +194,28 @@ void RTMP_AllocateSharedMemory(
* Notes: * Notes:
* Cached is ignored: always cached memory * Cached is ignored: always cached memory
*/ */
PNDIS_PACKET RTMP_AllocateRxPacketBuffer( PNDIS_PACKET RTMP_AllocateRxPacketBuffer(IN PRTMP_ADAPTER pAd,
IN PRTMP_ADAPTER pAd,
IN ULONG Length, IN ULONG Length,
IN BOOLEAN Cached, IN BOOLEAN Cached,
OUT PVOID *VirtualAddress, OUT PVOID * VirtualAddress,
OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress) OUT PNDIS_PHYSICAL_ADDRESS
PhysicalAddress)
{ {
struct sk_buff *pkt; struct sk_buff *pkt;
pkt = dev_alloc_skb(Length); pkt = dev_alloc_skb(Length);
if (pkt == NULL) { if (pkt == NULL) {
DBGPRINT(RT_DEBUG_ERROR, ("can't allocate rx %ld size packet\n",Length)); DBGPRINT(RT_DEBUG_ERROR,
("can't allocate rx %ld size packet\n", Length));
} }
if (pkt) { if (pkt) {
RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS); RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS);
*VirtualAddress = (PVOID) pkt->data; *VirtualAddress = (PVOID) pkt->data;
*PhysicalAddress = PCI_MAP_SINGLE(pAd, *VirtualAddress, Length, -1, PCI_DMA_FROMDEVICE); *PhysicalAddress =
PCI_MAP_SINGLE(pAd, *VirtualAddress, Length, -1,
PCI_DMA_FROMDEVICE);
} else { } else {
*VirtualAddress = (PVOID) NULL; *VirtualAddress = (PVOID) NULL;
*PhysicalAddress = (NDIS_PHYSICAL_ADDRESS) NULL; *PhysicalAddress = (NDIS_PHYSICAL_ADDRESS) NULL;
...@@ -226,36 +224,40 @@ PNDIS_PACKET RTMP_AllocateRxPacketBuffer( ...@@ -226,36 +224,40 @@ PNDIS_PACKET RTMP_AllocateRxPacketBuffer(
return (PNDIS_PACKET) pkt; return (PNDIS_PACKET) pkt;
} }
VOID Invalid_Remaining_Packet(IN PRTMP_ADAPTER pAd, IN ULONG VirtualAddress)
VOID Invalid_Remaining_Packet(
IN PRTMP_ADAPTER pAd,
IN ULONG VirtualAddress)
{ {
NDIS_PHYSICAL_ADDRESS PhysicalAddress; NDIS_PHYSICAL_ADDRESS PhysicalAddress;
PhysicalAddress = PCI_MAP_SINGLE(pAd, (void *)(VirtualAddress+1600), RX_BUFFER_NORMSIZE-1600, -1, PCI_DMA_FROMDEVICE); PhysicalAddress =
PCI_MAP_SINGLE(pAd, (void *)(VirtualAddress + 1600),
RX_BUFFER_NORMSIZE - 1600, -1, PCI_DMA_FROMDEVICE);
} }
NDIS_STATUS RtmpNetTaskInit(IN RTMP_ADAPTER *pAd) NDIS_STATUS RtmpNetTaskInit(IN RTMP_ADAPTER * pAd)
{ {
POS_COOKIE pObj; POS_COOKIE pObj;
pObj = (POS_COOKIE) pAd->OS_Cookie; pObj = (POS_COOKIE) pAd->OS_Cookie;
tasklet_init(&pObj->rx_done_task, rx_done_tasklet, (unsigned long)pAd); tasklet_init(&pObj->rx_done_task, rx_done_tasklet, (unsigned long)pAd);
tasklet_init(&pObj->mgmt_dma_done_task, mgmt_dma_done_tasklet, (unsigned long)pAd); tasklet_init(&pObj->mgmt_dma_done_task, mgmt_dma_done_tasklet,
tasklet_init(&pObj->ac0_dma_done_task, ac0_dma_done_tasklet, (unsigned long)pAd); (unsigned long)pAd);
tasklet_init(&pObj->ac1_dma_done_task, ac1_dma_done_tasklet, (unsigned long)pAd); tasklet_init(&pObj->ac0_dma_done_task, ac0_dma_done_tasklet,
tasklet_init(&pObj->ac2_dma_done_task, ac2_dma_done_tasklet, (unsigned long)pAd); (unsigned long)pAd);
tasklet_init(&pObj->ac3_dma_done_task, ac3_dma_done_tasklet, (unsigned long)pAd); tasklet_init(&pObj->ac1_dma_done_task, ac1_dma_done_tasklet,
(unsigned long)pAd);
tasklet_init(&pObj->ac2_dma_done_task, ac2_dma_done_tasklet,
(unsigned long)pAd);
tasklet_init(&pObj->ac3_dma_done_task, ac3_dma_done_tasklet,
(unsigned long)pAd);
tasklet_init(&pObj->tbtt_task, tbtt_tasklet, (unsigned long)pAd); tasklet_init(&pObj->tbtt_task, tbtt_tasklet, (unsigned long)pAd);
tasklet_init(&pObj->fifo_statistic_full_task, fifo_statistic_full_tasklet, (unsigned long)pAd); tasklet_init(&pObj->fifo_statistic_full_task,
fifo_statistic_full_tasklet, (unsigned long)pAd);
return NDIS_STATUS_SUCCESS; return NDIS_STATUS_SUCCESS;
} }
void RtmpNetTaskExit(IN RTMP_ADAPTER * pAd)
void RtmpNetTaskExit(IN RTMP_ADAPTER *pAd)
{ {
POS_COOKIE pObj; POS_COOKIE pObj;
...@@ -271,15 +273,12 @@ void RtmpNetTaskExit(IN RTMP_ADAPTER *pAd) ...@@ -271,15 +273,12 @@ void RtmpNetTaskExit(IN RTMP_ADAPTER *pAd)
tasklet_kill(&pObj->fifo_statistic_full_task); tasklet_kill(&pObj->fifo_statistic_full_task);
} }
NDIS_STATUS RtmpMgmtTaskInit(IN RTMP_ADAPTER * pAd)
NDIS_STATUS RtmpMgmtTaskInit(IN RTMP_ADAPTER *pAd)
{ {
return NDIS_STATUS_SUCCESS; return NDIS_STATUS_SUCCESS;
} }
/* /*
======================================================================== ========================================================================
Routine Description: Routine Description:
...@@ -294,15 +293,12 @@ Return Value: ...@@ -294,15 +293,12 @@ Return Value:
Note: Note:
======================================================================== ========================================================================
*/ */
VOID RtmpMgmtTaskExit( VOID RtmpMgmtTaskExit(IN RTMP_ADAPTER * pAd)
IN RTMP_ADAPTER *pAd)
{ {
return; return;
} }
static inline void rt2860_int_enable(PRTMP_ADAPTER pAd, unsigned int mode) static inline void rt2860_int_enable(PRTMP_ADAPTER pAd, unsigned int mode)
{ {
u32 regValue; u32 regValue;
...@@ -320,7 +316,6 @@ static inline void rt2860_int_enable(PRTMP_ADAPTER pAd, unsigned int mode) ...@@ -320,7 +316,6 @@ static inline void rt2860_int_enable(PRTMP_ADAPTER pAd, unsigned int mode)
RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_ACTIVE); RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_ACTIVE);
} }
static inline void rt2860_int_disable(PRTMP_ADAPTER pAd, unsigned int mode) static inline void rt2860_int_disable(PRTMP_ADAPTER pAd, unsigned int mode)
{ {
u32 regValue; u32 regValue;
...@@ -329,13 +324,11 @@ static inline void rt2860_int_disable(PRTMP_ADAPTER pAd, unsigned int mode) ...@@ -329,13 +324,11 @@ static inline void rt2860_int_disable(PRTMP_ADAPTER pAd, unsigned int mode)
regValue = pAd->int_enable_reg & ~(pAd->int_disable_mask); regValue = pAd->int_enable_reg & ~(pAd->int_disable_mask);
RTMP_IO_WRITE32(pAd, INT_MASK_CSR, regValue); // 0: disable RTMP_IO_WRITE32(pAd, INT_MASK_CSR, regValue); // 0: disable
if (regValue == 0) if (regValue == 0) {
{
RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_ACTIVE); RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_ACTIVE);
} }
} }
/*************************************************************************** /***************************************************************************
* *
* tasklet related procedures. * tasklet related procedures.
...@@ -350,7 +343,8 @@ static void mgmt_dma_done_tasklet(unsigned long data) ...@@ -350,7 +343,8 @@ static void mgmt_dma_done_tasklet(unsigned long data)
// Do nothing if the driver is starting halt state. // Do nothing if the driver is starting halt state.
// This might happen when timer already been fired before cancel timer with mlmehalt // This might happen when timer already been fired before cancel timer with mlmehalt
if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)) if (RTMP_TEST_FLAG
(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST))
return; return;
pObj = (POS_COOKIE) pAd->OS_Cookie; pObj = (POS_COOKIE) pAd->OS_Cookie;
...@@ -368,8 +362,7 @@ static void mgmt_dma_done_tasklet(unsigned long data) ...@@ -368,8 +362,7 @@ static void mgmt_dma_done_tasklet(unsigned long data)
/* /*
* double check to avoid lose of interrupts * double check to avoid lose of interrupts
*/ */
if (pAd->int_pending & INT_MGMT_DLY) if (pAd->int_pending & INT_MGMT_DLY) {
{
tasklet_hi_schedule(&pObj->mgmt_dma_done_task); tasklet_hi_schedule(&pObj->mgmt_dma_done_task);
RTMP_INT_UNLOCK(&pAd->irq_lock, flags); RTMP_INT_UNLOCK(&pAd->irq_lock, flags);
return; return;
...@@ -380,7 +373,6 @@ static void mgmt_dma_done_tasklet(unsigned long data) ...@@ -380,7 +373,6 @@ static void mgmt_dma_done_tasklet(unsigned long data)
RTMP_INT_UNLOCK(&pAd->irq_lock, flags); RTMP_INT_UNLOCK(&pAd->irq_lock, flags);
} }
static void rx_done_tasklet(unsigned long data) static void rx_done_tasklet(unsigned long data)
{ {
unsigned long flags; unsigned long flags;
...@@ -390,7 +382,8 @@ static void rx_done_tasklet(unsigned long data) ...@@ -390,7 +382,8 @@ static void rx_done_tasklet(unsigned long data)
// Do nothing if the driver is starting halt state. // Do nothing if the driver is starting halt state.
// This might happen when timer already been fired before cancel timer with mlmehalt // This might happen when timer already been fired before cancel timer with mlmehalt
if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)) if (RTMP_TEST_FLAG
(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST))
return; return;
pObj = (POS_COOKIE) pAd->OS_Cookie; pObj = (POS_COOKIE) pAd->OS_Cookie;
...@@ -402,8 +395,7 @@ static void rx_done_tasklet(unsigned long data) ...@@ -402,8 +395,7 @@ static void rx_done_tasklet(unsigned long data)
/* /*
* double check to avoid rotting packet * double check to avoid rotting packet
*/ */
if (pAd->int_pending & INT_RX || bReschedule) if (pAd->int_pending & INT_RX || bReschedule) {
{
tasklet_hi_schedule(&pObj->rx_done_task); tasklet_hi_schedule(&pObj->rx_done_task);
RTMP_INT_UNLOCK(&pAd->irq_lock, flags); RTMP_INT_UNLOCK(&pAd->irq_lock, flags);
return; return;
...@@ -415,7 +407,6 @@ static void rx_done_tasklet(unsigned long data) ...@@ -415,7 +407,6 @@ static void rx_done_tasklet(unsigned long data)
} }
void fifo_statistic_full_tasklet(unsigned long data) void fifo_statistic_full_tasklet(unsigned long data)
{ {
unsigned long flags; unsigned long flags;
...@@ -424,7 +415,8 @@ void fifo_statistic_full_tasklet(unsigned long data) ...@@ -424,7 +415,8 @@ void fifo_statistic_full_tasklet(unsigned long data)
// Do nothing if the driver is starting halt state. // Do nothing if the driver is starting halt state.
// This might happen when timer already been fired before cancel timer with mlmehalt // This might happen when timer already been fired before cancel timer with mlmehalt
if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)) if (RTMP_TEST_FLAG
(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST))
return; return;
pObj = (POS_COOKIE) pAd->OS_Cookie; pObj = (POS_COOKIE) pAd->OS_Cookie;
...@@ -436,8 +428,7 @@ void fifo_statistic_full_tasklet(unsigned long data) ...@@ -436,8 +428,7 @@ void fifo_statistic_full_tasklet(unsigned long data)
/* /*
* double check to avoid rotting packet * double check to avoid rotting packet
*/ */
if (pAd->int_pending & FifoStaFullInt) if (pAd->int_pending & FifoStaFullInt) {
{
tasklet_hi_schedule(&pObj->fifo_statistic_full_task); tasklet_hi_schedule(&pObj->fifo_statistic_full_task);
RTMP_INT_UNLOCK(&pAd->irq_lock, flags); RTMP_INT_UNLOCK(&pAd->irq_lock, flags);
return; return;
...@@ -460,7 +451,8 @@ static void ac3_dma_done_tasklet(unsigned long data) ...@@ -460,7 +451,8 @@ static void ac3_dma_done_tasklet(unsigned long data)
// Do nothing if the driver is starting halt state. // Do nothing if the driver is starting halt state.
// This might happen when timer already been fired before cancel timer with mlmehalt // This might happen when timer already been fired before cancel timer with mlmehalt
if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)) if (RTMP_TEST_FLAG
(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST))
return; return;
pObj = (POS_COOKIE) pAd->OS_Cookie; pObj = (POS_COOKIE) pAd->OS_Cookie;
...@@ -476,8 +468,7 @@ static void ac3_dma_done_tasklet(unsigned long data) ...@@ -476,8 +468,7 @@ static void ac3_dma_done_tasklet(unsigned long data)
/* /*
* double check to avoid lose of interrupts * double check to avoid lose of interrupts
*/ */
if ((pAd->int_pending & INT_AC3_DLY) || bReschedule) if ((pAd->int_pending & INT_AC3_DLY) || bReschedule) {
{
tasklet_hi_schedule(&pObj->ac3_dma_done_task); tasklet_hi_schedule(&pObj->ac3_dma_done_task);
RTMP_INT_UNLOCK(&pAd->irq_lock, flags); RTMP_INT_UNLOCK(&pAd->irq_lock, flags);
return; return;
...@@ -488,7 +479,6 @@ static void ac3_dma_done_tasklet(unsigned long data) ...@@ -488,7 +479,6 @@ static void ac3_dma_done_tasklet(unsigned long data)
RTMP_INT_UNLOCK(&pAd->irq_lock, flags); RTMP_INT_UNLOCK(&pAd->irq_lock, flags);
} }
static void ac2_dma_done_tasklet(unsigned long data) static void ac2_dma_done_tasklet(unsigned long data)
{ {
unsigned long flags; unsigned long flags;
...@@ -499,7 +489,8 @@ static void ac2_dma_done_tasklet(unsigned long data) ...@@ -499,7 +489,8 @@ static void ac2_dma_done_tasklet(unsigned long data)
// Do nothing if the driver is starting halt state. // Do nothing if the driver is starting halt state.
// This might happen when timer already been fired before cancel timer with mlmehalt // This might happen when timer already been fired before cancel timer with mlmehalt
if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)) if (RTMP_TEST_FLAG
(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST))
return; return;
pObj = (POS_COOKIE) pAd->OS_Cookie; pObj = (POS_COOKIE) pAd->OS_Cookie;
...@@ -515,8 +506,7 @@ static void ac2_dma_done_tasklet(unsigned long data) ...@@ -515,8 +506,7 @@ static void ac2_dma_done_tasklet(unsigned long data)
/* /*
* double check to avoid lose of interrupts * double check to avoid lose of interrupts
*/ */
if ((pAd->int_pending & INT_AC2_DLY) || bReschedule) if ((pAd->int_pending & INT_AC2_DLY) || bReschedule) {
{
tasklet_hi_schedule(&pObj->ac2_dma_done_task); tasklet_hi_schedule(&pObj->ac2_dma_done_task);
RTMP_INT_UNLOCK(&pAd->irq_lock, flags); RTMP_INT_UNLOCK(&pAd->irq_lock, flags);
return; return;
...@@ -527,7 +517,6 @@ static void ac2_dma_done_tasklet(unsigned long data) ...@@ -527,7 +517,6 @@ static void ac2_dma_done_tasklet(unsigned long data)
RTMP_INT_UNLOCK(&pAd->irq_lock, flags); RTMP_INT_UNLOCK(&pAd->irq_lock, flags);
} }
static void ac1_dma_done_tasklet(unsigned long data) static void ac1_dma_done_tasklet(unsigned long data)
{ {
unsigned long flags; unsigned long flags;
...@@ -538,7 +527,8 @@ static void ac1_dma_done_tasklet(unsigned long data) ...@@ -538,7 +527,8 @@ static void ac1_dma_done_tasklet(unsigned long data)
// Do nothing if the driver is starting halt state. // Do nothing if the driver is starting halt state.
// This might happen when timer already been fired before cancel timer with mlmehalt // This might happen when timer already been fired before cancel timer with mlmehalt
if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)) if (RTMP_TEST_FLAG
(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST))
return; return;
pObj = (POS_COOKIE) pAd->OS_Cookie; pObj = (POS_COOKIE) pAd->OS_Cookie;
...@@ -554,8 +544,7 @@ static void ac1_dma_done_tasklet(unsigned long data) ...@@ -554,8 +544,7 @@ static void ac1_dma_done_tasklet(unsigned long data)
/* /*
* double check to avoid lose of interrupts * double check to avoid lose of interrupts
*/ */
if ((pAd->int_pending & INT_AC1_DLY) || bReschedule) if ((pAd->int_pending & INT_AC1_DLY) || bReschedule) {
{
tasklet_hi_schedule(&pObj->ac1_dma_done_task); tasklet_hi_schedule(&pObj->ac1_dma_done_task);
RTMP_INT_UNLOCK(&pAd->irq_lock, flags); RTMP_INT_UNLOCK(&pAd->irq_lock, flags);
return; return;
...@@ -566,7 +555,6 @@ static void ac1_dma_done_tasklet(unsigned long data) ...@@ -566,7 +555,6 @@ static void ac1_dma_done_tasklet(unsigned long data)
RTMP_INT_UNLOCK(&pAd->irq_lock, flags); RTMP_INT_UNLOCK(&pAd->irq_lock, flags);
} }
static void ac0_dma_done_tasklet(unsigned long data) static void ac0_dma_done_tasklet(unsigned long data)
{ {
unsigned long flags; unsigned long flags;
...@@ -577,7 +565,8 @@ static void ac0_dma_done_tasklet(unsigned long data) ...@@ -577,7 +565,8 @@ static void ac0_dma_done_tasklet(unsigned long data)
// Do nothing if the driver is starting halt state. // Do nothing if the driver is starting halt state.
// This might happen when timer already been fired before cancel timer with mlmehalt // This might happen when timer already been fired before cancel timer with mlmehalt
if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)) if (RTMP_TEST_FLAG
(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST))
return; return;
pObj = (POS_COOKIE) pAd->OS_Cookie; pObj = (POS_COOKIE) pAd->OS_Cookie;
...@@ -594,8 +583,7 @@ static void ac0_dma_done_tasklet(unsigned long data) ...@@ -594,8 +583,7 @@ static void ac0_dma_done_tasklet(unsigned long data)
/* /*
* double check to avoid lose of interrupts * double check to avoid lose of interrupts
*/ */
if ((pAd->int_pending & INT_AC0_DLY) || bReschedule) if ((pAd->int_pending & INT_AC0_DLY) || bReschedule) {
{
tasklet_hi_schedule(&pObj->ac0_dma_done_task); tasklet_hi_schedule(&pObj->ac0_dma_done_task);
RTMP_INT_UNLOCK(&pAd->irq_lock, flags); RTMP_INT_UNLOCK(&pAd->irq_lock, flags);
return; return;
...@@ -606,9 +594,6 @@ static void ac0_dma_done_tasklet(unsigned long data) ...@@ -606,9 +594,6 @@ static void ac0_dma_done_tasklet(unsigned long data)
RTMP_INT_UNLOCK(&pAd->irq_lock, flags); RTMP_INT_UNLOCK(&pAd->irq_lock, flags);
} }
/*************************************************************************** /***************************************************************************
* *
* interrupt handler related procedures. * interrupt handler related procedures.
...@@ -618,7 +603,7 @@ int print_int_count; ...@@ -618,7 +603,7 @@ int print_int_count;
IRQ_HANDLE_TYPE rt2860_interrupt(int irq, void *dev_instance) IRQ_HANDLE_TYPE rt2860_interrupt(int irq, void *dev_instance)
{ {
struct net_device *net_dev = (struct net_device *) dev_instance; struct net_device *net_dev = (struct net_device *)dev_instance;
PRTMP_ADAPTER pAd = NULL; PRTMP_ADAPTER pAd = NULL;
INT_SOURCE_CSR_STRUC IntSource; INT_SOURCE_CSR_STRUC IntSource;
POS_COOKIE pObj; POS_COOKIE pObj;
...@@ -627,13 +612,11 @@ IRQ_HANDLE_TYPE rt2860_interrupt(int irq, void *dev_instance) ...@@ -627,13 +612,11 @@ IRQ_HANDLE_TYPE rt2860_interrupt(int irq, void *dev_instance)
pObj = (POS_COOKIE) pAd->OS_Cookie; pObj = (POS_COOKIE) pAd->OS_Cookie;
/* Note 03312008: we can not return here before /* Note 03312008: we can not return here before
RTMP_IO_READ32(pAd, INT_SOURCE_CSR, &IntSource.word); RTMP_IO_READ32(pAd, INT_SOURCE_CSR, &IntSource.word);
RTMP_IO_WRITE32(pAd, INT_SOURCE_CSR, IntSource.word); RTMP_IO_WRITE32(pAd, INT_SOURCE_CSR, IntSource.word);
Or kernel will panic after ifconfig ra0 down sometimes */ Or kernel will panic after ifconfig ra0 down sometimes */
// //
// Inital the Interrupt source. // Inital the Interrupt source.
// //
...@@ -669,11 +652,12 @@ IRQ_HANDLE_TYPE rt2860_interrupt(int irq, void *dev_instance) ...@@ -669,11 +652,12 @@ IRQ_HANDLE_TYPE rt2860_interrupt(int irq, void *dev_instance)
// IntSource.word, McuIntSource.word, IsrAfterClear, McuIsrAfterClear)); // IntSource.word, McuIntSource.word, IsrAfterClear, McuIsrAfterClear));
// Do nothing if Reset in progress // Do nothing if Reset in progress
if (RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |fRTMP_ADAPTER_HALT_IN_PROGRESS))) if (RTMP_TEST_FLAG
{ (pAd,
(fRTMP_ADAPTER_RESET_IN_PROGRESS |
fRTMP_ADAPTER_HALT_IN_PROGRESS))) {
return IRQ_HANDLED; return IRQ_HANDLED;
} }
// //
// Handle interrupt, walk through all bits // Handle interrupt, walk through all bits
// Should start from highest priority interrupt // Should start from highest priority interrupt
...@@ -684,7 +668,6 @@ IRQ_HANDLE_TYPE rt2860_interrupt(int irq, void *dev_instance) ...@@ -684,7 +668,6 @@ IRQ_HANDLE_TYPE rt2860_interrupt(int irq, void *dev_instance)
#endif #endif
pAd->bPCIclkOff = FALSE; pAd->bPCIclkOff = FALSE;
// If required spinlock, each interrupt service routine has to acquire // If required spinlock, each interrupt service routine has to acquire
...@@ -692,28 +675,25 @@ IRQ_HANDLE_TYPE rt2860_interrupt(int irq, void *dev_instance) ...@@ -692,28 +675,25 @@ IRQ_HANDLE_TYPE rt2860_interrupt(int irq, void *dev_instance)
// //
// Do nothing if NIC doesn't exist // Do nothing if NIC doesn't exist
if (IntSource.word == 0xffffffff) if (IntSource.word == 0xffffffff) {
{ RTMP_SET_FLAG(pAd,
RTMP_SET_FLAG(pAd, (fRTMP_ADAPTER_NIC_NOT_EXIST | fRTMP_ADAPTER_HALT_IN_PROGRESS)); (fRTMP_ADAPTER_NIC_NOT_EXIST |
fRTMP_ADAPTER_HALT_IN_PROGRESS));
return IRQ_HANDLED; return IRQ_HANDLED;
} }
if (IntSource.word & TxCoherent) if (IntSource.word & TxCoherent) {
{
DBGPRINT(RT_DEBUG_ERROR, (">>>TxCoherent<<<\n")); DBGPRINT(RT_DEBUG_ERROR, (">>>TxCoherent<<<\n"));
RTMPHandleRxCoherentInterrupt(pAd); RTMPHandleRxCoherentInterrupt(pAd);
} }
if (IntSource.word & RxCoherent) if (IntSource.word & RxCoherent) {
{
DBGPRINT(RT_DEBUG_ERROR, (">>>RxCoherent<<<\n")); DBGPRINT(RT_DEBUG_ERROR, (">>>RxCoherent<<<\n"));
RTMPHandleRxCoherentInterrupt(pAd); RTMPHandleRxCoherentInterrupt(pAd);
} }
if (IntSource.word & FifoStaFullInt) if (IntSource.word & FifoStaFullInt) {
{ if ((pAd->int_disable_mask & FifoStaFullInt) == 0) {
if ((pAd->int_disable_mask & FifoStaFullInt) == 0)
{
/* mask FifoStaFullInt */ /* mask FifoStaFullInt */
rt2860_int_disable(pAd, FifoStaFullInt); rt2860_int_disable(pAd, FifoStaFullInt);
tasklet_hi_schedule(&pObj->fifo_statistic_full_task); tasklet_hi_schedule(&pObj->fifo_statistic_full_task);
...@@ -721,20 +701,16 @@ IRQ_HANDLE_TYPE rt2860_interrupt(int irq, void *dev_instance) ...@@ -721,20 +701,16 @@ IRQ_HANDLE_TYPE rt2860_interrupt(int irq, void *dev_instance)
pAd->int_pending |= FifoStaFullInt; pAd->int_pending |= FifoStaFullInt;
} }
if (IntSource.word & INT_MGMT_DLY) if (IntSource.word & INT_MGMT_DLY) {
{ if ((pAd->int_disable_mask & INT_MGMT_DLY) == 0) {
if ((pAd->int_disable_mask & INT_MGMT_DLY) ==0 )
{
rt2860_int_disable(pAd, INT_MGMT_DLY); rt2860_int_disable(pAd, INT_MGMT_DLY);
tasklet_hi_schedule(&pObj->mgmt_dma_done_task); tasklet_hi_schedule(&pObj->mgmt_dma_done_task);
} }
pAd->int_pending |= INT_MGMT_DLY ; pAd->int_pending |= INT_MGMT_DLY;
} }
if (IntSource.word & INT_RX) if (IntSource.word & INT_RX) {
{ if ((pAd->int_disable_mask & INT_RX) == 0) {
if ((pAd->int_disable_mask & INT_RX) == 0)
{
/* mask RxINT */ /* mask RxINT */
rt2860_int_disable(pAd, INT_RX); rt2860_int_disable(pAd, INT_RX);
...@@ -743,11 +719,9 @@ IRQ_HANDLE_TYPE rt2860_interrupt(int irq, void *dev_instance) ...@@ -743,11 +719,9 @@ IRQ_HANDLE_TYPE rt2860_interrupt(int irq, void *dev_instance)
pAd->int_pending |= INT_RX; pAd->int_pending |= INT_RX;
} }
if (IntSource.word & INT_AC3_DLY) if (IntSource.word & INT_AC3_DLY) {
{
if ((pAd->int_disable_mask & INT_AC3_DLY) == 0) if ((pAd->int_disable_mask & INT_AC3_DLY) == 0) {
{
/* mask TxDataInt */ /* mask TxDataInt */
rt2860_int_disable(pAd, INT_AC3_DLY); rt2860_int_disable(pAd, INT_AC3_DLY);
tasklet_hi_schedule(&pObj->ac3_dma_done_task); tasklet_hi_schedule(&pObj->ac3_dma_done_task);
...@@ -755,11 +729,9 @@ IRQ_HANDLE_TYPE rt2860_interrupt(int irq, void *dev_instance) ...@@ -755,11 +729,9 @@ IRQ_HANDLE_TYPE rt2860_interrupt(int irq, void *dev_instance)
pAd->int_pending |= INT_AC3_DLY; pAd->int_pending |= INT_AC3_DLY;
} }
if (IntSource.word & INT_AC2_DLY) if (IntSource.word & INT_AC2_DLY) {
{
if ((pAd->int_disable_mask & INT_AC2_DLY) == 0) if ((pAd->int_disable_mask & INT_AC2_DLY) == 0) {
{
/* mask TxDataInt */ /* mask TxDataInt */
rt2860_int_disable(pAd, INT_AC2_DLY); rt2860_int_disable(pAd, INT_AC2_DLY);
tasklet_hi_schedule(&pObj->ac2_dma_done_task); tasklet_hi_schedule(&pObj->ac2_dma_done_task);
...@@ -767,13 +739,11 @@ IRQ_HANDLE_TYPE rt2860_interrupt(int irq, void *dev_instance) ...@@ -767,13 +739,11 @@ IRQ_HANDLE_TYPE rt2860_interrupt(int irq, void *dev_instance)
pAd->int_pending |= INT_AC2_DLY; pAd->int_pending |= INT_AC2_DLY;
} }
if (IntSource.word & INT_AC1_DLY) if (IntSource.word & INT_AC1_DLY) {
{
pAd->int_pending |= INT_AC1_DLY; pAd->int_pending |= INT_AC1_DLY;
if ((pAd->int_disable_mask & INT_AC1_DLY) == 0) if ((pAd->int_disable_mask & INT_AC1_DLY) == 0) {
{
/* mask TxDataInt */ /* mask TxDataInt */
rt2860_int_disable(pAd, INT_AC1_DLY); rt2860_int_disable(pAd, INT_AC1_DLY);
tasklet_hi_schedule(&pObj->ac1_dma_done_task); tasklet_hi_schedule(&pObj->ac1_dma_done_task);
...@@ -781,8 +751,7 @@ IRQ_HANDLE_TYPE rt2860_interrupt(int irq, void *dev_instance) ...@@ -781,8 +751,7 @@ IRQ_HANDLE_TYPE rt2860_interrupt(int irq, void *dev_instance)
} }
if (IntSource.word & INT_AC0_DLY) if (IntSource.word & INT_AC0_DLY) {
{
/* /*
if (IntSource.word & 0x2) { if (IntSource.word & 0x2) {
...@@ -793,8 +762,7 @@ IRQ_HANDLE_TYPE rt2860_interrupt(int irq, void *dev_instance) ...@@ -793,8 +762,7 @@ IRQ_HANDLE_TYPE rt2860_interrupt(int irq, void *dev_instance)
*/ */
pAd->int_pending |= INT_AC0_DLY; pAd->int_pending |= INT_AC0_DLY;
if ((pAd->int_disable_mask & INT_AC0_DLY) == 0) if ((pAd->int_disable_mask & INT_AC0_DLY) == 0) {
{
/* mask TxDataInt */ /* mask TxDataInt */
rt2860_int_disable(pAd, INT_AC0_DLY); rt2860_int_disable(pAd, INT_AC0_DLY);
tasklet_hi_schedule(&pObj->ac0_dma_done_task); tasklet_hi_schedule(&pObj->ac0_dma_done_task);
...@@ -802,14 +770,11 @@ IRQ_HANDLE_TYPE rt2860_interrupt(int irq, void *dev_instance) ...@@ -802,14 +770,11 @@ IRQ_HANDLE_TYPE rt2860_interrupt(int irq, void *dev_instance)
} }
if (IntSource.word & PreTBTTInt) {
if (IntSource.word & PreTBTTInt)
{
RTMPHandlePreTBTTInterrupt(pAd); RTMPHandlePreTBTTInterrupt(pAd);
} }
if (IntSource.word & TBTTInt) if (IntSource.word & TBTTInt) {
{
RTMPHandleTBTTInterrupt(pAd); RTMPHandleTBTTInterrupt(pAd);
} }
...@@ -825,7 +790,8 @@ IRQ_HANDLE_TYPE rt2860_interrupt(int irq, void *dev_instance) ...@@ -825,7 +790,8 @@ IRQ_HANDLE_TYPE rt2860_interrupt(int irq, void *dev_instance)
* invaild or writeback cache * invaild or writeback cache
* and convert virtual address to physical address * and convert virtual address to physical address
*/ */
dma_addr_t linux_pci_map_single(void *handle, void *ptr, size_t size, int sd_idx, int direction) dma_addr_t linux_pci_map_single(void *handle, void *ptr, size_t size,
int sd_idx, int direction)
{ {
PRTMP_ADAPTER pAd; PRTMP_ADAPTER pAd;
POS_COOKIE pObj; POS_COOKIE pObj;
...@@ -846,29 +812,28 @@ dma_addr_t linux_pci_map_single(void *handle, void *ptr, size_t size, int sd_idx ...@@ -846,29 +812,28 @@ dma_addr_t linux_pci_map_single(void *handle, void *ptr, size_t size, int sd_idx
sd_idx = -1 sd_idx = -1
*/ */
pAd = (PRTMP_ADAPTER)handle; pAd = (PRTMP_ADAPTER) handle;
pObj = (POS_COOKIE)pAd->OS_Cookie; pObj = (POS_COOKIE) pAd->OS_Cookie;
if (sd_idx == 1) if (sd_idx == 1) {
{
PTX_BLK pTxBlk; PTX_BLK pTxBlk;
pTxBlk = (PTX_BLK)ptr; pTxBlk = (PTX_BLK) ptr;
return pci_map_single(pObj->pci_dev, pTxBlk->pSrcBufData, pTxBlk->SrcBufLen, direction); return pci_map_single(pObj->pci_dev, pTxBlk->pSrcBufData,
} pTxBlk->SrcBufLen, direction);
else } else {
{
return pci_map_single(pObj->pci_dev, ptr, size, direction); return pci_map_single(pObj->pci_dev, ptr, size, direction);
} }
} }
void linux_pci_unmap_single(void *handle, dma_addr_t dma_addr, size_t size, int direction) void linux_pci_unmap_single(void *handle, dma_addr_t dma_addr, size_t size,
int direction)
{ {
PRTMP_ADAPTER pAd; PRTMP_ADAPTER pAd;
POS_COOKIE pObj; POS_COOKIE pObj;
pAd=(PRTMP_ADAPTER)handle; pAd = (PRTMP_ADAPTER) handle;
pObj = (POS_COOKIE)pAd->OS_Cookie; pObj = (POS_COOKIE) pAd->OS_Cookie;
pci_unmap_single(pObj->pci_dev, dma_addr, size, direction); pci_unmap_single(pObj->pci_dev, dma_addr, size, direction);
......
...@@ -38,7 +38,7 @@ ...@@ -38,7 +38,7 @@
#include "rt_config.h" #include "rt_config.h"
void dump_urb(struct urb* purb) void dump_urb(struct urb *purb)
{ {
printk("urb :0x%08lx\n", (unsigned long)purb); printk("urb :0x%08lx\n", (unsigned long)purb);
printk("\tdev :0x%08lx\n", (unsigned long)purb->dev); printk("\tdev :0x%08lx\n", (unsigned long)purb->dev);
...@@ -46,16 +46,20 @@ ...@@ -46,16 +46,20 @@
printk("\tpipe :0x%08x\n", purb->pipe); printk("\tpipe :0x%08x\n", purb->pipe);
printk("\tstatus :%d\n", purb->status); printk("\tstatus :%d\n", purb->status);
printk("\ttransfer_flags :0x%08x\n", purb->transfer_flags); printk("\ttransfer_flags :0x%08x\n", purb->transfer_flags);
printk("\ttransfer_buffer :0x%08lx\n", (unsigned long)purb->transfer_buffer); printk("\ttransfer_buffer :0x%08lx\n",
(unsigned long)purb->transfer_buffer);
printk("\ttransfer_buffer_length:%d\n", purb->transfer_buffer_length); printk("\ttransfer_buffer_length:%d\n", purb->transfer_buffer_length);
printk("\tactual_length :%d\n", purb->actual_length); printk("\tactual_length :%d\n", purb->actual_length);
printk("\tsetup_packet :0x%08lx\n", (unsigned long)purb->setup_packet); printk("\tsetup_packet :0x%08lx\n",
(unsigned long)purb->setup_packet);
printk("\tstart_frame :%d\n", purb->start_frame); printk("\tstart_frame :%d\n", purb->start_frame);
printk("\tnumber_of_packets :%d\n", purb->number_of_packets); printk("\tnumber_of_packets :%d\n", purb->number_of_packets);
printk("\tinterval :%d\n", purb->interval); printk("\tinterval :%d\n", purb->interval);
printk("\terror_count :%d\n", purb->error_count); printk("\terror_count :%d\n", purb->error_count);
printk("\tcontext :0x%08lx\n", (unsigned long)purb->context); printk("\tcontext :0x%08lx\n",
printk("\tcomplete :0x%08lx\n\n", (unsigned long)purb->complete); (unsigned long)purb->context);
printk("\tcomplete :0x%08lx\n\n",
(unsigned long)purb->complete);
} }
/* /*
...@@ -73,8 +77,7 @@ Return Value: ...@@ -73,8 +77,7 @@ Return Value:
Note: Note:
======================================================================== ========================================================================
*/ */
NDIS_STATUS RtmpMgmtTaskInit( NDIS_STATUS RtmpMgmtTaskInit(IN RTMP_ADAPTER * pAd)
IN RTMP_ADAPTER *pAd)
{ {
RTMP_OS_TASK *pTask; RTMP_OS_TASK *pTask;
NDIS_STATUS status; NDIS_STATUS status;
...@@ -87,9 +90,9 @@ NDIS_STATUS RtmpMgmtTaskInit( ...@@ -87,9 +90,9 @@ NDIS_STATUS RtmpMgmtTaskInit(
pTask = &pAd->timerTask; pTask = &pAd->timerTask;
RtmpOSTaskInit(pTask, "RtmpTimerTask", pAd); RtmpOSTaskInit(pTask, "RtmpTimerTask", pAd);
status = RtmpOSTaskAttach(pTask, RtmpTimerQThread, pTask); status = RtmpOSTaskAttach(pTask, RtmpTimerQThread, pTask);
if (status == NDIS_STATUS_FAILURE) if (status == NDIS_STATUS_FAILURE) {
{ printk(KERN_WARNING "%s: unable to start RtmpTimerQThread\n",
printk (KERN_WARNING "%s: unable to start RtmpTimerQThread\n", RTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev)); RTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev));
return NDIS_STATUS_FAILURE; return NDIS_STATUS_FAILURE;
} }
...@@ -97,9 +100,9 @@ NDIS_STATUS RtmpMgmtTaskInit( ...@@ -97,9 +100,9 @@ NDIS_STATUS RtmpMgmtTaskInit(
pTask = &pAd->mlmeTask; pTask = &pAd->mlmeTask;
RtmpOSTaskInit(pTask, "RtmpMlmeTask", pAd); RtmpOSTaskInit(pTask, "RtmpMlmeTask", pAd);
status = RtmpOSTaskAttach(pTask, MlmeThread, pTask); status = RtmpOSTaskAttach(pTask, MlmeThread, pTask);
if (status == NDIS_STATUS_FAILURE) if (status == NDIS_STATUS_FAILURE) {
{ printk(KERN_WARNING "%s: unable to start MlmeThread\n",
printk (KERN_WARNING "%s: unable to start MlmeThread\n", RTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev)); RTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev));
return NDIS_STATUS_FAILURE; return NDIS_STATUS_FAILURE;
} }
...@@ -107,18 +110,15 @@ NDIS_STATUS RtmpMgmtTaskInit( ...@@ -107,18 +110,15 @@ NDIS_STATUS RtmpMgmtTaskInit(
pTask = &pAd->cmdQTask; pTask = &pAd->cmdQTask;
RtmpOSTaskInit(pTask, "RtmpCmdQTask", pAd); RtmpOSTaskInit(pTask, "RtmpCmdQTask", pAd);
status = RtmpOSTaskAttach(pTask, RTUSBCmdThread, pTask); status = RtmpOSTaskAttach(pTask, RTUSBCmdThread, pTask);
if (status == NDIS_STATUS_FAILURE) if (status == NDIS_STATUS_FAILURE) {
{ printk(KERN_WARNING "%s: unable to start RTUSBCmdThread\n",
printk (KERN_WARNING "%s: unable to start RTUSBCmdThread\n", RTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev)); RTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev));
return NDIS_STATUS_FAILURE; return NDIS_STATUS_FAILURE;
} }
return NDIS_STATUS_SUCCESS; return NDIS_STATUS_SUCCESS;
} }
/* /*
======================================================================== ========================================================================
Routine Description: Routine Description:
...@@ -133,8 +133,7 @@ Return Value: ...@@ -133,8 +133,7 @@ Return Value:
Note: Note:
======================================================================== ========================================================================
*/ */
VOID RtmpMgmtTaskExit( VOID RtmpMgmtTaskExit(IN RTMP_ADAPTER * pAd)
IN RTMP_ADAPTER *pAd)
{ {
INT ret; INT ret;
RTMP_OS_TASK *pTask; RTMP_OS_TASK *pTask;
...@@ -153,10 +152,11 @@ VOID RtmpMgmtTaskExit( ...@@ -153,10 +152,11 @@ VOID RtmpMgmtTaskExit(
/* Terminate Mlme Thread */ /* Terminate Mlme Thread */
pTask = &pAd->mlmeTask; pTask = &pAd->mlmeTask;
ret = RtmpOSTaskKill(pTask); ret = RtmpOSTaskKill(pTask);
if (ret == NDIS_STATUS_FAILURE) if (ret == NDIS_STATUS_FAILURE) {
{
DBGPRINT(RT_DEBUG_ERROR, ("%s: kill task(%s) failed!\n", DBGPRINT(RT_DEBUG_ERROR, ("%s: kill task(%s) failed!\n",
RTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev), pTask->taskName)); RTMP_OS_NETDEV_GET_DEVNAME(pAd->
net_dev),
pTask->taskName));
} }
/* Terminate cmdQ thread */ /* Terminate cmdQ thread */
...@@ -174,10 +174,11 @@ VOID RtmpMgmtTaskExit( ...@@ -174,10 +174,11 @@ VOID RtmpMgmtTaskExit(
mb(); mb();
//RTUSBCMDUp(pAd); //RTUSBCMDUp(pAd);
ret = RtmpOSTaskKill(pTask); ret = RtmpOSTaskKill(pTask);
if (ret == NDIS_STATUS_FAILURE) if (ret == NDIS_STATUS_FAILURE) {
{
DBGPRINT(RT_DEBUG_ERROR, ("%s: kill task(%s) failed!\n", DBGPRINT(RT_DEBUG_ERROR, ("%s: kill task(%s) failed!\n",
RTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev), pTask->taskName)); RTMP_OS_NETDEV_GET_DEVNAME
(pAd->net_dev),
pTask->taskName));
} }
pAd->CmdQ.CmdQState = RTMP_TASK_STAT_UNKNOWN; pAd->CmdQ.CmdQState = RTMP_TASK_STAT_UNKNOWN;
} }
...@@ -185,16 +186,15 @@ VOID RtmpMgmtTaskExit( ...@@ -185,16 +186,15 @@ VOID RtmpMgmtTaskExit(
/* Terminate timer thread */ /* Terminate timer thread */
pTask = &pAd->timerTask; pTask = &pAd->timerTask;
ret = RtmpOSTaskKill(pTask); ret = RtmpOSTaskKill(pTask);
if (ret == NDIS_STATUS_FAILURE) if (ret == NDIS_STATUS_FAILURE) {
{
DBGPRINT(RT_DEBUG_ERROR, ("%s: kill task(%s) failed!\n", DBGPRINT(RT_DEBUG_ERROR, ("%s: kill task(%s) failed!\n",
RTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev), pTask->taskName)); RTMP_OS_NETDEV_GET_DEVNAME(pAd->
net_dev),
pTask->taskName));
} }
} }
static void rtusb_dataout_complete(unsigned long data) static void rtusb_dataout_complete(unsigned long data)
{ {
PRTMP_ADAPTER pAd; PRTMP_ADAPTER pAd;
...@@ -205,9 +205,8 @@ static void rtusb_dataout_complete(unsigned long data) ...@@ -205,9 +205,8 @@ static void rtusb_dataout_complete(unsigned long data)
NTSTATUS Status; NTSTATUS Status;
unsigned long IrqFlags; unsigned long IrqFlags;
pUrb = (purbb_t) data;
pUrb = (purbb_t)data; pHTTXContext = (PHT_TX_CONTEXT) pUrb->context;
pHTTXContext = (PHT_TX_CONTEXT)pUrb->context;
pAd = pHTTXContext->pAd; pAd = pHTTXContext->pAd;
pObj = (POS_COOKIE) pAd->OS_Cookie; pObj = (POS_COOKIE) pAd->OS_Cookie;
Status = pUrb->status; Status = pUrb->status;
...@@ -224,8 +223,7 @@ static void rtusb_dataout_complete(unsigned long data) ...@@ -224,8 +223,7 @@ static void rtusb_dataout_complete(unsigned long data)
pHTTXContext->IRPPending = FALSE; pHTTXContext->IRPPending = FALSE;
pAd->watchDogTxPendingCnt[BulkOutPipeId] = 0; pAd->watchDogTxPendingCnt[BulkOutPipeId] = 0;
if (Status == USB_ST_NOERROR) if (Status == USB_ST_NOERROR) {
{
pAd->BulkOutComplete++; pAd->BulkOutComplete++;
RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags); RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
...@@ -235,30 +233,37 @@ static void rtusb_dataout_complete(unsigned long data) ...@@ -235,30 +233,37 @@ static void rtusb_dataout_complete(unsigned long data)
FREE_HTTX_RING(pAd, BulkOutPipeId, pHTTXContext); FREE_HTTX_RING(pAd, BulkOutPipeId, pHTTXContext);
//RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags); //RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags);
} else // STATUS_OTHER
}
else // STATUS_OTHER
{ {
PUCHAR pBuf; PUCHAR pBuf;
pAd->BulkOutCompleteOther++; pAd->BulkOutCompleteOther++;
pBuf = &pHTTXContext->TransferBuffer->field.WirelessPacket[pHTTXContext->NextBulkOutPosition]; pBuf =
&pHTTXContext->TransferBuffer->field.
WirelessPacket[pHTTXContext->NextBulkOutPosition];
if (!RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS | if (!RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |
fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_HALT_IN_PROGRESS |
fRTMP_ADAPTER_NIC_NOT_EXIST | fRTMP_ADAPTER_NIC_NOT_EXIST |
fRTMP_ADAPTER_BULKOUT_RESET))) fRTMP_ADAPTER_BULKOUT_RESET))) {
{
RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET); RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);
pAd->bulkResetPipeid = BulkOutPipeId; pAd->bulkResetPipeid = BulkOutPipeId;
pAd->bulkResetReq[BulkOutPipeId] = pAd->BulkOutReq; pAd->bulkResetReq[BulkOutPipeId] = pAd->BulkOutReq;
} }
RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags); RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
DBGPRINT_RAW(RT_DEBUG_ERROR, ("BulkOutDataPacket failed: ReasonCode=%d!\n", Status)); DBGPRINT_RAW(RT_DEBUG_ERROR,
DBGPRINT_RAW(RT_DEBUG_ERROR, ("\t>>BulkOut Req=0x%lx, Complete=0x%lx, Other=0x%lx\n", pAd->BulkOutReq, pAd->BulkOutComplete, pAd->BulkOutCompleteOther)); ("BulkOutDataPacket failed: ReasonCode=%d!\n",
DBGPRINT_RAW(RT_DEBUG_ERROR, ("\t>>BulkOut Header:%x %x %x %x %x %x %x %x\n", pBuf[0], pBuf[1], pBuf[2], pBuf[3], pBuf[4], pBuf[5], pBuf[6], pBuf[7])); Status));
DBGPRINT_RAW(RT_DEBUG_ERROR,
("\t>>BulkOut Req=0x%lx, Complete=0x%lx, Other=0x%lx\n",
pAd->BulkOutReq, pAd->BulkOutComplete,
pAd->BulkOutCompleteOther));
DBGPRINT_RAW(RT_DEBUG_ERROR,
("\t>>BulkOut Header:%x %x %x %x %x %x %x %x\n",
pBuf[0], pBuf[1], pBuf[2], pBuf[3], pBuf[4],
pBuf[5], pBuf[6], pBuf[7]));
//DBGPRINT_RAW(RT_DEBUG_ERROR, (">>BulkOutCompleteCancel=0x%x, BulkOutCompleteOther=0x%x\n", pAd->BulkOutCompleteCancel, pAd->BulkOutCompleteOther)); //DBGPRINT_RAW(RT_DEBUG_ERROR, (">>BulkOutCompleteCancel=0x%x, BulkOutCompleteOther=0x%x\n", pAd->BulkOutCompleteCancel, pAd->BulkOutCompleteOther));
} }
...@@ -268,12 +273,17 @@ static void rtusb_dataout_complete(unsigned long data) ...@@ -268,12 +273,17 @@ static void rtusb_dataout_complete(unsigned long data)
// bWaitingBulkOut = TRUE, means the TX data are waiting for bulk out. // bWaitingBulkOut = TRUE, means the TX data are waiting for bulk out.
// //
//RTMP_IRQ_LOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags); //RTMP_IRQ_LOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags);
if ((pHTTXContext->ENextBulkOutPosition != pHTTXContext->CurWritePosition) && if ((pHTTXContext->ENextBulkOutPosition !=
(pHTTXContext->ENextBulkOutPosition != (pHTTXContext->CurWritePosition+8)) && pHTTXContext->CurWritePosition)
!RTUSB_TEST_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_FRAG << BulkOutPipeId))) && (pHTTXContext->ENextBulkOutPosition !=
{ (pHTTXContext->CurWritePosition + 8))
&& !RTUSB_TEST_BULK_FLAG(pAd,
(fRTUSB_BULK_OUT_DATA_FRAG <<
BulkOutPipeId))) {
// Indicate There is data avaliable // Indicate There is data avaliable
RTUSB_SET_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_NORMAL << BulkOutPipeId)); RTUSB_SET_BULK_FLAG(pAd,
(fRTUSB_BULK_OUT_DATA_NORMAL <<
BulkOutPipeId));
} }
//RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags); //RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags);
...@@ -282,7 +292,6 @@ static void rtusb_dataout_complete(unsigned long data) ...@@ -282,7 +292,6 @@ static void rtusb_dataout_complete(unsigned long data)
RTUSBKickBulkOut(pAd); RTUSBKickBulkOut(pAd);
} }
static void rtusb_null_frame_done_tasklet(unsigned long data) static void rtusb_null_frame_done_tasklet(unsigned long data)
{ {
PRTMP_ADAPTER pAd; PRTMP_ADAPTER pAd;
...@@ -291,9 +300,8 @@ static void rtusb_null_frame_done_tasklet(unsigned long data) ...@@ -291,9 +300,8 @@ static void rtusb_null_frame_done_tasklet(unsigned long data)
NTSTATUS Status; NTSTATUS Status;
unsigned long irqFlag; unsigned long irqFlag;
pUrb = (purbb_t) data;
pUrb = (purbb_t)data; pNullContext = (PTX_CONTEXT) pUrb->context;
pNullContext = (PTX_CONTEXT)pUrb->context;
pAd = pNullContext->pAd; pAd = pNullContext->pAd;
Status = pUrb->status; Status = pUrb->status;
...@@ -304,27 +312,26 @@ static void rtusb_null_frame_done_tasklet(unsigned long data) ...@@ -304,27 +312,26 @@ static void rtusb_null_frame_done_tasklet(unsigned long data)
pAd->BulkOutPending[0] = FALSE; pAd->BulkOutPending[0] = FALSE;
pAd->watchDogTxPendingCnt[0] = 0; pAd->watchDogTxPendingCnt[0] = 0;
if (Status == USB_ST_NOERROR) if (Status == USB_ST_NOERROR) {
{
RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag); RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag);
RTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS); RTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);
} } else // STATUS_OTHER
else // STATUS_OTHER
{ {
if ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) && if ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&
(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&
(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) &&
(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET))) (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET))) {
{ DBGPRINT_RAW(RT_DEBUG_ERROR,
DBGPRINT_RAW(RT_DEBUG_ERROR, ("Bulk Out Null Frame Failed, ReasonCode=%d!\n", Status)); ("Bulk Out Null Frame Failed, ReasonCode=%d!\n",
Status));
RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET); RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);
pAd->bulkResetPipeid = (MGMTPIPEIDX | BULKOUT_MGMT_RESET_FLAG); pAd->bulkResetPipeid =
(MGMTPIPEIDX | BULKOUT_MGMT_RESET_FLAG);
RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag); RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag);
RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0); RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT,
} NULL, 0);
else } else {
{
RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag); RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag);
} }
} }
...@@ -334,7 +341,6 @@ static void rtusb_null_frame_done_tasklet(unsigned long data) ...@@ -334,7 +341,6 @@ static void rtusb_null_frame_done_tasklet(unsigned long data)
RTUSBKickBulkOut(pAd); RTUSBKickBulkOut(pAd);
} }
static void rtusb_rts_frame_done_tasklet(unsigned long data) static void rtusb_rts_frame_done_tasklet(unsigned long data)
{ {
PRTMP_ADAPTER pAd; PRTMP_ADAPTER pAd;
...@@ -343,9 +349,8 @@ static void rtusb_rts_frame_done_tasklet(unsigned long data) ...@@ -343,9 +349,8 @@ static void rtusb_rts_frame_done_tasklet(unsigned long data)
NTSTATUS Status; NTSTATUS Status;
unsigned long irqFlag; unsigned long irqFlag;
pUrb = (purbb_t) data;
pUrb = (purbb_t)data; pRTSContext = (PTX_CONTEXT) pUrb->context;
pRTSContext = (PTX_CONTEXT)pUrb->context;
pAd = pRTSContext->pAd; pAd = pRTSContext->pAd;
Status = pUrb->status; Status = pUrb->status;
...@@ -354,26 +359,24 @@ static void rtusb_rts_frame_done_tasklet(unsigned long data) ...@@ -354,26 +359,24 @@ static void rtusb_rts_frame_done_tasklet(unsigned long data)
pRTSContext->IRPPending = FALSE; pRTSContext->IRPPending = FALSE;
pRTSContext->InUse = FALSE; pRTSContext->InUse = FALSE;
if (Status == USB_ST_NOERROR) if (Status == USB_ST_NOERROR) {
{
RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag); RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag);
RTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS); RTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);
} } else // STATUS_OTHER
else // STATUS_OTHER
{ {
if ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) && if ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&
(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&
(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) &&
(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET))) (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET))) {
{ DBGPRINT_RAW(RT_DEBUG_ERROR,
DBGPRINT_RAW(RT_DEBUG_ERROR, ("Bulk Out RTS Frame Failed\n")); ("Bulk Out RTS Frame Failed\n"));
RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET); RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);
pAd->bulkResetPipeid = (MGMTPIPEIDX | BULKOUT_MGMT_RESET_FLAG); pAd->bulkResetPipeid =
(MGMTPIPEIDX | BULKOUT_MGMT_RESET_FLAG);
RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag); RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag);
RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0); RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT,
} NULL, 0);
else } else {
{
RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag); RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag);
} }
} }
...@@ -386,10 +389,8 @@ static void rtusb_rts_frame_done_tasklet(unsigned long data) ...@@ -386,10 +389,8 @@ static void rtusb_rts_frame_done_tasklet(unsigned long data)
// The protectioon of rest bulk should be in BulkOut routine // The protectioon of rest bulk should be in BulkOut routine
RTUSBKickBulkOut(pAd); RTUSBKickBulkOut(pAd);
} }
static void rtusb_pspoll_frame_done_tasklet(unsigned long data) static void rtusb_pspoll_frame_done_tasklet(unsigned long data)
{ {
PRTMP_ADAPTER pAd; PRTMP_ADAPTER pAd;
...@@ -397,10 +398,8 @@ static void rtusb_pspoll_frame_done_tasklet(unsigned long data) ...@@ -397,10 +398,8 @@ static void rtusb_pspoll_frame_done_tasklet(unsigned long data)
purbb_t pUrb; purbb_t pUrb;
NTSTATUS Status; NTSTATUS Status;
pUrb = (purbb_t) data;
pPsPollContext = (PTX_CONTEXT) pUrb->context;
pUrb = (purbb_t)data;
pPsPollContext = (PTX_CONTEXT)pUrb->context;
pAd = pPsPollContext->pAd; pAd = pPsPollContext->pAd;
Status = pUrb->status; Status = pUrb->status;
...@@ -409,21 +408,21 @@ static void rtusb_pspoll_frame_done_tasklet(unsigned long data) ...@@ -409,21 +408,21 @@ static void rtusb_pspoll_frame_done_tasklet(unsigned long data)
pPsPollContext->InUse = FALSE; pPsPollContext->InUse = FALSE;
pAd->watchDogTxPendingCnt[0] = 0; pAd->watchDogTxPendingCnt[0] = 0;
if (Status == USB_ST_NOERROR) if (Status == USB_ST_NOERROR) {
{
RTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS); RTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);
} } else // STATUS_OTHER
else // STATUS_OTHER
{ {
if ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) && if ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&
(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&
(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) &&
(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET))) (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET))) {
{ DBGPRINT_RAW(RT_DEBUG_ERROR,
DBGPRINT_RAW(RT_DEBUG_ERROR, ("Bulk Out PSPoll Failed\n")); ("Bulk Out PSPoll Failed\n"));
RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET); RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);
pAd->bulkResetPipeid = (MGMTPIPEIDX | BULKOUT_MGMT_RESET_FLAG); pAd->bulkResetPipeid =
RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0); (MGMTPIPEIDX | BULKOUT_MGMT_RESET_FLAG);
RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT,
NULL, 0);
} }
} }
...@@ -437,7 +436,6 @@ static void rtusb_pspoll_frame_done_tasklet(unsigned long data) ...@@ -437,7 +436,6 @@ static void rtusb_pspoll_frame_done_tasklet(unsigned long data)
} }
/* /*
======================================================================== ========================================================================
Routine Description: Routine Description:
...@@ -460,12 +458,11 @@ static void rx_done_tasklet(unsigned long data) ...@@ -460,12 +458,11 @@ static void rx_done_tasklet(unsigned long data)
NTSTATUS Status; NTSTATUS Status;
unsigned int IrqFlags; unsigned int IrqFlags;
pUrb = (purbb_t)data; pUrb = (purbb_t) data;
pRxContext = (PRX_CONTEXT)pUrb->context; pRxContext = (PRX_CONTEXT) pUrb->context;
pAd = pRxContext->pAd; pAd = pRxContext->pAd;
Status = pUrb->status; Status = pUrb->status;
RTMP_IRQ_LOCK(&pAd->BulkInLock, IrqFlags); RTMP_IRQ_LOCK(&pAd->BulkInLock, IrqFlags);
pRxContext->InUse = FALSE; pRxContext->InUse = FALSE;
pRxContext->IRPPending = FALSE; pRxContext->IRPPending = FALSE;
...@@ -473,8 +470,7 @@ static void rx_done_tasklet(unsigned long data) ...@@ -473,8 +470,7 @@ static void rx_done_tasklet(unsigned long data)
//NdisInterlockedDecrement(&pAd->PendingRx); //NdisInterlockedDecrement(&pAd->PendingRx);
pAd->PendingRx--; pAd->PendingRx--;
if (Status == USB_ST_NOERROR) if (Status == USB_ST_NOERROR) {
{
pAd->BulkInComplete++; pAd->BulkInComplete++;
pAd->NextRxBulkInPosition = 0; pAd->NextRxBulkInPosition = 0;
if (pRxContext->BulkInOffset) // As jan's comment, it may bulk-in success but size is zero. if (pRxContext->BulkInOffset) // As jan's comment, it may bulk-in success but size is zero.
...@@ -483,8 +479,7 @@ static void rx_done_tasklet(unsigned long data) ...@@ -483,8 +479,7 @@ static void rx_done_tasklet(unsigned long data)
INC_RING_INDEX(pAd->NextRxBulkInIndex, RX_RING_SIZE); INC_RING_INDEX(pAd->NextRxBulkInIndex, RX_RING_SIZE);
} }
RTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags); RTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags);
} } else // STATUS_OTHER
else // STATUS_OTHER
{ {
pAd->BulkInCompleteFail++; pAd->BulkInCompleteFail++;
// Still read this packet although it may comtain wrong bytes. // Still read this packet although it may comtain wrong bytes.
...@@ -495,14 +490,17 @@ static void rx_done_tasklet(unsigned long data) ...@@ -495,14 +490,17 @@ static void rx_done_tasklet(unsigned long data)
if ((!RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS | if ((!RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |
fRTMP_ADAPTER_BULKIN_RESET | fRTMP_ADAPTER_BULKIN_RESET |
fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_HALT_IN_PROGRESS |
fRTMP_ADAPTER_NIC_NOT_EXIST)))) fRTMP_ADAPTER_NIC_NOT_EXIST)))) {
{
DBGPRINT_RAW(RT_DEBUG_ERROR, ("Bulk In Failed. Status=%d, BIIdx=0x%x, BIRIdx=0x%x, actual_length= 0x%x\n", DBGPRINT_RAW(RT_DEBUG_ERROR,
Status, pAd->NextRxBulkInIndex, pAd->NextRxBulkInReadIndex, pRxContext->pUrb->actual_length)); ("Bulk In Failed. Status=%d, BIIdx=0x%x, BIRIdx=0x%x, actual_length= 0x%x\n",
Status, pAd->NextRxBulkInIndex,
pAd->NextRxBulkInReadIndex,
pRxContext->pUrb->actual_length));
RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKIN_RESET); RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKIN_RESET);
RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_IN, NULL, 0); RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_IN,
NULL, 0);
} }
} }
...@@ -510,12 +508,10 @@ static void rx_done_tasklet(unsigned long data) ...@@ -510,12 +508,10 @@ static void rx_done_tasklet(unsigned long data)
RTUSBBulkReceive(pAd); RTUSBBulkReceive(pAd);
return; return;
} }
static void rtusb_mgmt_dma_done_tasklet(unsigned long data) static void rtusb_mgmt_dma_done_tasklet(unsigned long data)
{ {
PRTMP_ADAPTER pAd; PRTMP_ADAPTER pAd;
...@@ -526,9 +522,8 @@ static void rtusb_mgmt_dma_done_tasklet(unsigned long data) ...@@ -526,9 +522,8 @@ static void rtusb_mgmt_dma_done_tasklet(unsigned long data)
NTSTATUS Status; NTSTATUS Status;
unsigned long IrqFlags; unsigned long IrqFlags;
pUrb = (purbb_t) data;
pUrb = (purbb_t)data; pMLMEContext = (PTX_CONTEXT) pUrb->context;
pMLMEContext = (PTX_CONTEXT)pUrb->context;
pAd = pMLMEContext->pAd; pAd = pMLMEContext->pAd;
Status = pUrb->status; Status = pUrb->status;
index = pMLMEContext->SelfIdx; index = pMLMEContext->SelfIdx;
...@@ -537,19 +532,19 @@ static void rtusb_mgmt_dma_done_tasklet(unsigned long data) ...@@ -537,19 +532,19 @@ static void rtusb_mgmt_dma_done_tasklet(unsigned long data)
RTMP_IRQ_LOCK(&pAd->BulkOutLock[MGMTPIPEIDX], IrqFlags); RTMP_IRQ_LOCK(&pAd->BulkOutLock[MGMTPIPEIDX], IrqFlags);
if (Status != USB_ST_NOERROR) {
if (Status != USB_ST_NOERROR)
{
//Bulk-Out fail status handle //Bulk-Out fail status handle
if ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) && if ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&
(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&
(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) &&
(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET))) (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET))) {
{ DBGPRINT_RAW(RT_DEBUG_ERROR,
DBGPRINT_RAW(RT_DEBUG_ERROR, ("Bulk Out MLME Failed, Status=%d!\n", Status)); ("Bulk Out MLME Failed, Status=%d!\n",
Status));
// TODO: How to handle about the MLMEBulkOut failed issue. Need to resend the mgmt pkt? // TODO: How to handle about the MLMEBulkOut failed issue. Need to resend the mgmt pkt?
RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET); RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);
pAd->bulkResetPipeid = (MGMTPIPEIDX | BULKOUT_MGMT_RESET_FLAG); pAd->bulkResetPipeid =
(MGMTPIPEIDX | BULKOUT_MGMT_RESET_FLAG);
} }
} }
...@@ -577,31 +572,25 @@ static void rtusb_mgmt_dma_done_tasklet(unsigned long data) ...@@ -577,31 +572,25 @@ static void rtusb_mgmt_dma_done_tasklet(unsigned long data)
if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS | if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |
fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_HALT_IN_PROGRESS |
fRTMP_ADAPTER_NIC_NOT_EXIST)))) fRTMP_ADAPTER_NIC_NOT_EXIST)))) {
{
// do nothing and return directly. // do nothing and return directly.
} } else {
else if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET) && ((pAd->bulkResetPipeid & BULKOUT_MGMT_RESET_FLAG) == BULKOUT_MGMT_RESET_FLAG)) { // For Mgmt Bulk-Out failed, ignore it now.
{ RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT,
if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET) && NULL, 0);
((pAd->bulkResetPipeid & BULKOUT_MGMT_RESET_FLAG) == BULKOUT_MGMT_RESET_FLAG)) } else {
{ // For Mgmt Bulk-Out failed, ignore it now.
RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0);
}
else
{
// Always call Bulk routine, even reset bulk. // Always call Bulk routine, even reset bulk.
// The protectioon of rest bulk should be in BulkOut routine // The protectioon of rest bulk should be in BulkOut routine
if (pAd->MgmtRing.TxSwFreeIdx < MGMT_RING_SIZE /* pMLMEContext->bWaitingBulkOut == TRUE */) if (pAd->MgmtRing.TxSwFreeIdx <
{ MGMT_RING_SIZE
/* pMLMEContext->bWaitingBulkOut == TRUE */ ) {
RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_MLME); RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_MLME);
} }
RTUSBKickBulkOut(pAd); RTUSBKickBulkOut(pAd);
} }
} }
} }
static void rtusb_ac3_dma_done_tasklet(unsigned long data) static void rtusb_ac3_dma_done_tasklet(unsigned long data)
...@@ -611,45 +600,39 @@ static void rtusb_ac3_dma_done_tasklet(unsigned long data) ...@@ -611,45 +600,39 @@ static void rtusb_ac3_dma_done_tasklet(unsigned long data)
UCHAR BulkOutPipeId = 3; UCHAR BulkOutPipeId = 3;
purbb_t pUrb; purbb_t pUrb;
pUrb = (purbb_t) data;
pUrb = (purbb_t)data; pHTTXContext = (PHT_TX_CONTEXT) pUrb->context;
pHTTXContext = (PHT_TX_CONTEXT)pUrb->context;
pAd = pHTTXContext->pAd; pAd = pHTTXContext->pAd;
rtusb_dataout_complete((unsigned long)pUrb); rtusb_dataout_complete((unsigned long)pUrb);
if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS | if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |
fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_HALT_IN_PROGRESS |
fRTMP_ADAPTER_NIC_NOT_EXIST)))) fRTMP_ADAPTER_NIC_NOT_EXIST)))) {
{
// do nothing and return directly. // do nothing and return directly.
} } else {
else if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET)) {
{ RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT,
if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET)) NULL, 0);
{ } else {
RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0); pHTTXContext = &pAd->TxContext[BulkOutPipeId];
}
else
{ pHTTXContext = &pAd->TxContext[BulkOutPipeId];
if ((pAd->TxSwQueue[BulkOutPipeId].Number > 0) && if ((pAd->TxSwQueue[BulkOutPipeId].Number > 0) &&
/*((pHTTXContext->CurWritePosition > (pHTTXContext->NextBulkOutPosition + 0x6000)) || (pHTTXContext->NextBulkOutPosition > pHTTXContext->CurWritePosition + 0x6000)) && */ /*((pHTTXContext->CurWritePosition > (pHTTXContext->NextBulkOutPosition + 0x6000)) || (pHTTXContext->NextBulkOutPosition > pHTTXContext->CurWritePosition + 0x6000)) && */
(pAd->DeQueueRunning[BulkOutPipeId] == FALSE) && (pAd->DeQueueRunning[BulkOutPipeId] == FALSE) &&
(pHTTXContext->bCurWriting == FALSE)) (pHTTXContext->bCurWriting == FALSE)) {
{ RTMPDeQueuePacket(pAd, FALSE, BulkOutPipeId,
RTMPDeQueuePacket(pAd, FALSE, BulkOutPipeId, MAX_TX_PROCESS); MAX_TX_PROCESS);
} }
RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL<<3); RTUSB_SET_BULK_FLAG(pAd,
fRTUSB_BULK_OUT_DATA_NORMAL << 3);
RTUSBKickBulkOut(pAd); RTUSBKickBulkOut(pAd);
} }
} }
return; return;
} }
static void rtusb_ac2_dma_done_tasklet(unsigned long data) static void rtusb_ac2_dma_done_tasklet(unsigned long data)
{ {
PRTMP_ADAPTER pAd; PRTMP_ADAPTER pAd;
...@@ -657,45 +640,39 @@ static void rtusb_ac2_dma_done_tasklet(unsigned long data) ...@@ -657,45 +640,39 @@ static void rtusb_ac2_dma_done_tasklet(unsigned long data)
UCHAR BulkOutPipeId = 2; UCHAR BulkOutPipeId = 2;
purbb_t pUrb; purbb_t pUrb;
pUrb = (purbb_t) data;
pUrb = (purbb_t)data; pHTTXContext = (PHT_TX_CONTEXT) pUrb->context;
pHTTXContext = (PHT_TX_CONTEXT)pUrb->context;
pAd = pHTTXContext->pAd; pAd = pHTTXContext->pAd;
rtusb_dataout_complete((unsigned long)pUrb); rtusb_dataout_complete((unsigned long)pUrb);
if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS | if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |
fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_HALT_IN_PROGRESS |
fRTMP_ADAPTER_NIC_NOT_EXIST)))) fRTMP_ADAPTER_NIC_NOT_EXIST)))) {
{
// do nothing and return directly. // do nothing and return directly.
} } else {
else if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET)) {
{ RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT,
if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET)) NULL, 0);
{ } else {
RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0); pHTTXContext = &pAd->TxContext[BulkOutPipeId];
}
else
{ pHTTXContext = &pAd->TxContext[BulkOutPipeId];
if ((pAd->TxSwQueue[BulkOutPipeId].Number > 0) && if ((pAd->TxSwQueue[BulkOutPipeId].Number > 0) &&
/*((pHTTXContext->CurWritePosition > (pHTTXContext->NextBulkOutPosition + 0x6000)) || (pHTTXContext->NextBulkOutPosition > pHTTXContext->CurWritePosition + 0x6000)) && */ /*((pHTTXContext->CurWritePosition > (pHTTXContext->NextBulkOutPosition + 0x6000)) || (pHTTXContext->NextBulkOutPosition > pHTTXContext->CurWritePosition + 0x6000)) && */
(pAd->DeQueueRunning[BulkOutPipeId] == FALSE) && (pAd->DeQueueRunning[BulkOutPipeId] == FALSE) &&
(pHTTXContext->bCurWriting == FALSE)) (pHTTXContext->bCurWriting == FALSE)) {
{ RTMPDeQueuePacket(pAd, FALSE, BulkOutPipeId,
RTMPDeQueuePacket(pAd, FALSE, BulkOutPipeId, MAX_TX_PROCESS); MAX_TX_PROCESS);
} }
RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL<<2); RTUSB_SET_BULK_FLAG(pAd,
fRTUSB_BULK_OUT_DATA_NORMAL << 2);
RTUSBKickBulkOut(pAd); RTUSBKickBulkOut(pAd);
} }
} }
return; return;
} }
static void rtusb_ac1_dma_done_tasklet(unsigned long data) static void rtusb_ac1_dma_done_tasklet(unsigned long data)
{ {
PRTMP_ADAPTER pAd; PRTMP_ADAPTER pAd;
...@@ -703,36 +680,32 @@ static void rtusb_ac1_dma_done_tasklet(unsigned long data) ...@@ -703,36 +680,32 @@ static void rtusb_ac1_dma_done_tasklet(unsigned long data)
UCHAR BulkOutPipeId = 1; UCHAR BulkOutPipeId = 1;
purbb_t pUrb; purbb_t pUrb;
pUrb = (purbb_t) data;
pUrb = (purbb_t)data; pHTTXContext = (PHT_TX_CONTEXT) pUrb->context;
pHTTXContext = (PHT_TX_CONTEXT)pUrb->context;
pAd = pHTTXContext->pAd; pAd = pHTTXContext->pAd;
rtusb_dataout_complete((unsigned long)pUrb); rtusb_dataout_complete((unsigned long)pUrb);
if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS | if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |
fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_HALT_IN_PROGRESS |
fRTMP_ADAPTER_NIC_NOT_EXIST)))) fRTMP_ADAPTER_NIC_NOT_EXIST)))) {
{
// do nothing and return directly. // do nothing and return directly.
} } else {
else if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET)) {
{ RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT,
if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET)) NULL, 0);
{ } else {
RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0); pHTTXContext = &pAd->TxContext[BulkOutPipeId];
}
else
{ pHTTXContext = &pAd->TxContext[BulkOutPipeId];
if ((pAd->TxSwQueue[BulkOutPipeId].Number > 0) && if ((pAd->TxSwQueue[BulkOutPipeId].Number > 0) &&
/*((pHTTXContext->CurWritePosition > (pHTTXContext->NextBulkOutPosition + 0x6000)) || (pHTTXContext->NextBulkOutPosition > pHTTXContext->CurWritePosition + 0x6000)) && */ /*((pHTTXContext->CurWritePosition > (pHTTXContext->NextBulkOutPosition + 0x6000)) || (pHTTXContext->NextBulkOutPosition > pHTTXContext->CurWritePosition + 0x6000)) && */
(pAd->DeQueueRunning[BulkOutPipeId] == FALSE) && (pAd->DeQueueRunning[BulkOutPipeId] == FALSE) &&
(pHTTXContext->bCurWriting == FALSE)) (pHTTXContext->bCurWriting == FALSE)) {
{ RTMPDeQueuePacket(pAd, FALSE, BulkOutPipeId,
RTMPDeQueuePacket(pAd, FALSE, BulkOutPipeId, MAX_TX_PROCESS); MAX_TX_PROCESS);
} }
RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL<<1); RTUSB_SET_BULK_FLAG(pAd,
fRTUSB_BULK_OUT_DATA_NORMAL << 1);
RTUSBKickBulkOut(pAd); RTUSBKickBulkOut(pAd);
} }
} }
...@@ -740,7 +713,6 @@ static void rtusb_ac1_dma_done_tasklet(unsigned long data) ...@@ -740,7 +713,6 @@ static void rtusb_ac1_dma_done_tasklet(unsigned long data)
} }
static void rtusb_ac0_dma_done_tasklet(unsigned long data) static void rtusb_ac0_dma_done_tasklet(unsigned long data)
{ {
PRTMP_ADAPTER pAd; PRTMP_ADAPTER pAd;
...@@ -748,33 +720,28 @@ static void rtusb_ac0_dma_done_tasklet(unsigned long data) ...@@ -748,33 +720,28 @@ static void rtusb_ac0_dma_done_tasklet(unsigned long data)
UCHAR BulkOutPipeId = 0; UCHAR BulkOutPipeId = 0;
purbb_t pUrb; purbb_t pUrb;
pUrb = (purbb_t) data;
pUrb = (purbb_t)data; pHTTXContext = (PHT_TX_CONTEXT) pUrb->context;
pHTTXContext = (PHT_TX_CONTEXT)pUrb->context;
pAd = pHTTXContext->pAd; pAd = pHTTXContext->pAd;
rtusb_dataout_complete((unsigned long)pUrb); rtusb_dataout_complete((unsigned long)pUrb);
if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS | if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |
fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_HALT_IN_PROGRESS |
fRTMP_ADAPTER_NIC_NOT_EXIST)))) fRTMP_ADAPTER_NIC_NOT_EXIST)))) {
{
// do nothing and return directly. // do nothing and return directly.
} } else {
else if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET)) {
{ RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT,
if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET)) NULL, 0);
{ } else {
RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0); pHTTXContext = &pAd->TxContext[BulkOutPipeId];
}
else
{ pHTTXContext = &pAd->TxContext[BulkOutPipeId];
if ((pAd->TxSwQueue[BulkOutPipeId].Number > 0) && if ((pAd->TxSwQueue[BulkOutPipeId].Number > 0) &&
/* ((pHTTXContext->CurWritePosition > (pHTTXContext->NextBulkOutPosition + 0x6000)) || (pHTTXContext->NextBulkOutPosition > pHTTXContext->CurWritePosition + 0x6000)) && */ /* ((pHTTXContext->CurWritePosition > (pHTTXContext->NextBulkOutPosition + 0x6000)) || (pHTTXContext->NextBulkOutPosition > pHTTXContext->CurWritePosition + 0x6000)) && */
(pAd->DeQueueRunning[BulkOutPipeId] == FALSE) && (pAd->DeQueueRunning[BulkOutPipeId] == FALSE) &&
(pHTTXContext->bCurWriting == FALSE)) (pHTTXContext->bCurWriting == FALSE)) {
{ RTMPDeQueuePacket(pAd, FALSE, BulkOutPipeId,
RTMPDeQueuePacket(pAd, FALSE, BulkOutPipeId, MAX_TX_PROCESS); MAX_TX_PROCESS);
} }
RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL); RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL);
...@@ -782,34 +749,38 @@ static void rtusb_ac0_dma_done_tasklet(unsigned long data) ...@@ -782,34 +749,38 @@ static void rtusb_ac0_dma_done_tasklet(unsigned long data)
} }
} }
return; return;
} }
NDIS_STATUS RtmpNetTaskInit(IN RTMP_ADAPTER * pAd)
NDIS_STATUS RtmpNetTaskInit(
IN RTMP_ADAPTER *pAd)
{ {
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie; POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
// Create receive tasklet // Create receive tasklet
tasklet_init(&pObj->rx_done_task, rx_done_tasklet, (ULONG)pAd); tasklet_init(&pObj->rx_done_task, rx_done_tasklet, (ULONG) pAd);
tasklet_init(&pObj->mgmt_dma_done_task, rtusb_mgmt_dma_done_tasklet, (unsigned long)pAd); tasklet_init(&pObj->mgmt_dma_done_task, rtusb_mgmt_dma_done_tasklet,
tasklet_init(&pObj->ac0_dma_done_task, rtusb_ac0_dma_done_tasklet, (unsigned long)pAd); (unsigned long)pAd);
tasklet_init(&pObj->ac1_dma_done_task, rtusb_ac1_dma_done_tasklet, (unsigned long)pAd); tasklet_init(&pObj->ac0_dma_done_task, rtusb_ac0_dma_done_tasklet,
tasklet_init(&pObj->ac2_dma_done_task, rtusb_ac2_dma_done_tasklet, (unsigned long)pAd); (unsigned long)pAd);
tasklet_init(&pObj->ac3_dma_done_task, rtusb_ac3_dma_done_tasklet, (unsigned long)pAd); tasklet_init(&pObj->ac1_dma_done_task, rtusb_ac1_dma_done_tasklet,
(unsigned long)pAd);
tasklet_init(&pObj->ac2_dma_done_task, rtusb_ac2_dma_done_tasklet,
(unsigned long)pAd);
tasklet_init(&pObj->ac3_dma_done_task, rtusb_ac3_dma_done_tasklet,
(unsigned long)pAd);
tasklet_init(&pObj->tbtt_task, tbtt_tasklet, (unsigned long)pAd); tasklet_init(&pObj->tbtt_task, tbtt_tasklet, (unsigned long)pAd);
tasklet_init(&pObj->null_frame_complete_task, rtusb_null_frame_done_tasklet, (unsigned long)pAd); tasklet_init(&pObj->null_frame_complete_task,
tasklet_init(&pObj->rts_frame_complete_task, rtusb_rts_frame_done_tasklet, (unsigned long)pAd); rtusb_null_frame_done_tasklet, (unsigned long)pAd);
tasklet_init(&pObj->pspoll_frame_complete_task, rtusb_pspoll_frame_done_tasklet, (unsigned long)pAd); tasklet_init(&pObj->rts_frame_complete_task,
rtusb_rts_frame_done_tasklet, (unsigned long)pAd);
tasklet_init(&pObj->pspoll_frame_complete_task,
rtusb_pspoll_frame_done_tasklet, (unsigned long)pAd);
return NDIS_STATUS_SUCCESS; return NDIS_STATUS_SUCCESS;
} }
void RtmpNetTaskExit(IN RTMP_ADAPTER * pAd)
void RtmpNetTaskExit(IN RTMP_ADAPTER *pAd)
{ {
POS_COOKIE pObj; POS_COOKIE pObj;
......
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -26,7 +26,6 @@ ...@@ -26,7 +26,6 @@
#include "rt_config.h" #include "rt_config.h"
// Following information will be show when you run 'modinfo' // Following information will be show when you run 'modinfo'
// *** If you have a solution for the bug in current version of driver, please mail to me. // *** If you have a solution for the bug in current version of driver, please mail to me.
// Otherwise post to forum in ralinktech's web site(www.ralinktech.com) and let all users help you. *** // Otherwise post to forum in ralinktech's web site(www.ralinktech.com) and let all users help you. ***
...@@ -37,141 +36,135 @@ MODULE_LICENSE("GPL"); ...@@ -37,141 +36,135 @@ MODULE_LICENSE("GPL");
MODULE_VERSION(STA_DRIVER_VERSION); MODULE_VERSION(STA_DRIVER_VERSION);
#endif #endif
/* module table */ /* module table */
struct usb_device_id rtusb_usb_id[] = { struct usb_device_id rtusb_usb_id[] = {
#ifdef RT2870 #ifdef RT2870
{USB_DEVICE(0x148F,0x2770)}, /* Ralink */ {USB_DEVICE(0x148F, 0x2770)}, /* Ralink */
{USB_DEVICE(0x148F,0x2870)}, /* Ralink */ {USB_DEVICE(0x148F, 0x2870)}, /* Ralink */
{USB_DEVICE(0x07B8,0x2870)}, /* AboCom */ {USB_DEVICE(0x07B8, 0x2870)}, /* AboCom */
{USB_DEVICE(0x07B8,0x2770)}, /* AboCom */ {USB_DEVICE(0x07B8, 0x2770)}, /* AboCom */
{USB_DEVICE(0x0DF6,0x0039)}, /* Sitecom 2770 */ {USB_DEVICE(0x0DF6, 0x0039)}, /* Sitecom 2770 */
{USB_DEVICE(0x083A,0x7512)}, /* Arcadyan 2770 */ {USB_DEVICE(0x083A, 0x7512)}, /* Arcadyan 2770 */
{USB_DEVICE(0x0789,0x0162)}, /* Logitec 2870 */ {USB_DEVICE(0x0789, 0x0162)}, /* Logitec 2870 */
{USB_DEVICE(0x0789,0x0163)}, /* Logitec 2870 */ {USB_DEVICE(0x0789, 0x0163)}, /* Logitec 2870 */
{USB_DEVICE(0x0789,0x0164)}, /* Logitec 2870 */ {USB_DEVICE(0x0789, 0x0164)}, /* Logitec 2870 */
{USB_DEVICE(0x177f,0x0302)}, /* lsusb */ {USB_DEVICE(0x177f, 0x0302)}, /* lsusb */
{USB_DEVICE(0x0B05,0x1731)}, /* Asus */ {USB_DEVICE(0x0B05, 0x1731)}, /* Asus */
{USB_DEVICE(0x0B05,0x1732)}, /* Asus */ {USB_DEVICE(0x0B05, 0x1732)}, /* Asus */
{USB_DEVICE(0x0B05,0x1742)}, /* Asus */ {USB_DEVICE(0x0B05, 0x1742)}, /* Asus */
{USB_DEVICE(0x0DF6,0x0017)}, /* Sitecom */ {USB_DEVICE(0x0DF6, 0x0017)}, /* Sitecom */
{USB_DEVICE(0x0DF6,0x002B)}, /* Sitecom */ {USB_DEVICE(0x0DF6, 0x002B)}, /* Sitecom */
{USB_DEVICE(0x0DF6,0x002C)}, /* Sitecom */ {USB_DEVICE(0x0DF6, 0x002C)}, /* Sitecom */
{USB_DEVICE(0x0DF6,0x002D)}, /* Sitecom */ {USB_DEVICE(0x0DF6, 0x002D)}, /* Sitecom */
{USB_DEVICE(0x14B2,0x3C06)}, /* Conceptronic */ {USB_DEVICE(0x14B2, 0x3C06)}, /* Conceptronic */
{USB_DEVICE(0x14B2,0x3C28)}, /* Conceptronic */ {USB_DEVICE(0x14B2, 0x3C28)}, /* Conceptronic */
{USB_DEVICE(0x2019,0xED06)}, /* Planex Communications, Inc. */ {USB_DEVICE(0x2019, 0xED06)}, /* Planex Communications, Inc. */
{USB_DEVICE(0x07D1,0x3C09)}, /* D-Link */ {USB_DEVICE(0x07D1, 0x3C09)}, /* D-Link */
{USB_DEVICE(0x07D1,0x3C11)}, /* D-Link */ {USB_DEVICE(0x07D1, 0x3C11)}, /* D-Link */
{USB_DEVICE(0x14B2,0x3C07)}, /* AL */ {USB_DEVICE(0x14B2, 0x3C07)}, /* AL */
{USB_DEVICE(0x050D,0x8053)}, /* Belkin */ {USB_DEVICE(0x050D, 0x8053)}, /* Belkin */
{USB_DEVICE(0x14B2,0x3C23)}, /* Airlink */ {USB_DEVICE(0x14B2, 0x3C23)}, /* Airlink */
{USB_DEVICE(0x14B2,0x3C27)}, /* Airlink */ {USB_DEVICE(0x14B2, 0x3C27)}, /* Airlink */
{USB_DEVICE(0x07AA,0x002F)}, /* Corega */ {USB_DEVICE(0x07AA, 0x002F)}, /* Corega */
{USB_DEVICE(0x07AA,0x003C)}, /* Corega */ {USB_DEVICE(0x07AA, 0x003C)}, /* Corega */
{USB_DEVICE(0x07AA,0x003F)}, /* Corega */ {USB_DEVICE(0x07AA, 0x003F)}, /* Corega */
{USB_DEVICE(0x1044,0x800B)}, /* Gigabyte */ {USB_DEVICE(0x1044, 0x800B)}, /* Gigabyte */
{USB_DEVICE(0x15A9,0x0006)}, /* Sparklan */ {USB_DEVICE(0x15A9, 0x0006)}, /* Sparklan */
{USB_DEVICE(0x083A,0xB522)}, /* SMC */ {USB_DEVICE(0x083A, 0xB522)}, /* SMC */
{USB_DEVICE(0x083A,0xA618)}, /* SMC */ {USB_DEVICE(0x083A, 0xA618)}, /* SMC */
{USB_DEVICE(0x083A,0x8522)}, /* Arcadyan */ {USB_DEVICE(0x083A, 0x8522)}, /* Arcadyan */
{USB_DEVICE(0x083A,0x7522)}, /* Arcadyan */ {USB_DEVICE(0x083A, 0x7522)}, /* Arcadyan */
{USB_DEVICE(0x0CDE,0x0022)}, /* ZCOM */ {USB_DEVICE(0x0CDE, 0x0022)}, /* ZCOM */
{USB_DEVICE(0x0586,0x3416)}, /* Zyxel */ {USB_DEVICE(0x0586, 0x3416)}, /* Zyxel */
{USB_DEVICE(0x0CDE,0x0025)}, /* Zyxel */ {USB_DEVICE(0x0CDE, 0x0025)}, /* Zyxel */
{USB_DEVICE(0x1740,0x9701)}, /* EnGenius */ {USB_DEVICE(0x1740, 0x9701)}, /* EnGenius */
{USB_DEVICE(0x1740,0x9702)}, /* EnGenius */ {USB_DEVICE(0x1740, 0x9702)}, /* EnGenius */
{USB_DEVICE(0x0471,0x200f)}, /* Philips */ {USB_DEVICE(0x0471, 0x200f)}, /* Philips */
{USB_DEVICE(0x14B2,0x3C25)}, /* Draytek */ {USB_DEVICE(0x14B2, 0x3C25)}, /* Draytek */
{USB_DEVICE(0x13D3,0x3247)}, /* AzureWave */ {USB_DEVICE(0x13D3, 0x3247)}, /* AzureWave */
{USB_DEVICE(0x083A,0x6618)}, /* Accton */ {USB_DEVICE(0x083A, 0x6618)}, /* Accton */
{USB_DEVICE(0x15c5,0x0008)}, /* Amit */ {USB_DEVICE(0x15c5, 0x0008)}, /* Amit */
{USB_DEVICE(0x0E66,0x0001)}, /* Hawking */ {USB_DEVICE(0x0E66, 0x0001)}, /* Hawking */
{USB_DEVICE(0x0E66,0x0003)}, /* Hawking */ {USB_DEVICE(0x0E66, 0x0003)}, /* Hawking */
{USB_DEVICE(0x129B,0x1828)}, /* Siemens */ {USB_DEVICE(0x129B, 0x1828)}, /* Siemens */
{USB_DEVICE(0x157E,0x300E)}, /* U-Media */ {USB_DEVICE(0x157E, 0x300E)}, /* U-Media */
{USB_DEVICE(0x050d,0x805c)}, {USB_DEVICE(0x050d, 0x805c)},
{USB_DEVICE(0x050d,0x815c)}, {USB_DEVICE(0x050d, 0x815c)},
{USB_DEVICE(0x1482,0x3C09)}, /* Abocom*/ {USB_DEVICE(0x1482, 0x3C09)}, /* Abocom */
{USB_DEVICE(0x14B2,0x3C09)}, /* Alpha */ {USB_DEVICE(0x14B2, 0x3C09)}, /* Alpha */
{USB_DEVICE(0x04E8,0x2018)}, /* samsung */ {USB_DEVICE(0x04E8, 0x2018)}, /* samsung */
{USB_DEVICE(0x5A57,0x0280)}, /* Zinwell */ {USB_DEVICE(0x5A57, 0x0280)}, /* Zinwell */
{USB_DEVICE(0x5A57,0x0282)}, /* Zinwell */ {USB_DEVICE(0x5A57, 0x0282)}, /* Zinwell */
{USB_DEVICE(0x7392,0x7718)}, {USB_DEVICE(0x7392, 0x7718)},
{USB_DEVICE(0x7392,0x7717)}, {USB_DEVICE(0x7392, 0x7717)},
{USB_DEVICE(0x1737,0x0070)}, /* Linksys WUSB100 */ {USB_DEVICE(0x1737, 0x0070)}, /* Linksys WUSB100 */
{USB_DEVICE(0x1737,0x0071)}, /* Linksys WUSB600N */ {USB_DEVICE(0x1737, 0x0071)}, /* Linksys WUSB600N */
{USB_DEVICE(0x0411,0x00e8)}, /* Buffalo WLI-UC-G300N*/ {USB_DEVICE(0x0411, 0x00e8)}, /* Buffalo WLI-UC-G300N */
{USB_DEVICE(0x050d,0x815c)}, /* Belkin F5D8053 */ {USB_DEVICE(0x050d, 0x815c)}, /* Belkin F5D8053 */
#endif // RT2870 // #endif // RT2870 //
#ifdef RT3070 #ifdef RT3070
{USB_DEVICE(0x148F,0x3070)}, /* Ralink 3070 */ {USB_DEVICE(0x148F, 0x3070)}, /* Ralink 3070 */
{USB_DEVICE(0x148F,0x3071)}, /* Ralink 3071 */ {USB_DEVICE(0x148F, 0x3071)}, /* Ralink 3071 */
{USB_DEVICE(0x148F,0x3072)}, /* Ralink 3072 */ {USB_DEVICE(0x148F, 0x3072)}, /* Ralink 3072 */
{USB_DEVICE(0x0DB0,0x3820)}, /* Ralink 3070 */ {USB_DEVICE(0x0DB0, 0x3820)}, /* Ralink 3070 */
{USB_DEVICE(0x0DF6,0x003E)}, /* Sitecom 3070 */ {USB_DEVICE(0x0DF6, 0x003E)}, /* Sitecom 3070 */
{USB_DEVICE(0x0DF6,0x0042)}, /* Sitecom 3072 */ {USB_DEVICE(0x0DF6, 0x0042)}, /* Sitecom 3072 */
{USB_DEVICE(0x14B2,0x3C12)}, /* AL 3070 */ {USB_DEVICE(0x14B2, 0x3C12)}, /* AL 3070 */
{USB_DEVICE(0x18C5,0x0012)}, /* Corega 3070 */ {USB_DEVICE(0x18C5, 0x0012)}, /* Corega 3070 */
{USB_DEVICE(0x083A,0x7511)}, /* Arcadyan 3070 */ {USB_DEVICE(0x083A, 0x7511)}, /* Arcadyan 3070 */
{USB_DEVICE(0x1740,0x9703)}, /* EnGenius 3070 */ {USB_DEVICE(0x1740, 0x9703)}, /* EnGenius 3070 */
{USB_DEVICE(0x1740,0x9705)}, /* EnGenius 3071 */ {USB_DEVICE(0x1740, 0x9705)}, /* EnGenius 3071 */
{USB_DEVICE(0x1740,0x9706)}, /* EnGenius 3072 */ {USB_DEVICE(0x1740, 0x9706)}, /* EnGenius 3072 */
{USB_DEVICE(0x13D3,0x3273)}, /* AzureWave 3070*/ {USB_DEVICE(0x13D3, 0x3273)}, /* AzureWave 3070 */
{USB_DEVICE(0x1044,0x800D)}, /* Gigabyte GN-WB32L 3070 */ {USB_DEVICE(0x1044, 0x800D)}, /* Gigabyte GN-WB32L 3070 */
{USB_DEVICE(0x2019,0xAB25)}, /* Planex Communications, Inc. RT3070 */ {USB_DEVICE(0x2019, 0xAB25)}, /* Planex Communications, Inc. RT3070 */
{USB_DEVICE(0x07B8,0x3070)}, /* AboCom 3070 */ {USB_DEVICE(0x07B8, 0x3070)}, /* AboCom 3070 */
{USB_DEVICE(0x07B8,0x3071)}, /* AboCom 3071 */ {USB_DEVICE(0x07B8, 0x3071)}, /* AboCom 3071 */
{USB_DEVICE(0x07B8,0x3072)}, /* Abocom 3072 */ {USB_DEVICE(0x07B8, 0x3072)}, /* Abocom 3072 */
{USB_DEVICE(0x7392,0x7711)}, /* Edimax 3070 */ {USB_DEVICE(0x7392, 0x7711)}, /* Edimax 3070 */
{USB_DEVICE(0x1A32,0x0304)}, /* Quanta 3070 */ {USB_DEVICE(0x1A32, 0x0304)}, /* Quanta 3070 */
{USB_DEVICE(0x1EDA,0x2310)}, /* AirTies 3070 */ {USB_DEVICE(0x1EDA, 0x2310)}, /* AirTies 3070 */
{USB_DEVICE(0x07D1,0x3C0A)}, /* D-Link 3072 */ {USB_DEVICE(0x07D1, 0x3C0A)}, /* D-Link 3072 */
{USB_DEVICE(0x07D1,0x3C0D)}, /* D-Link 3070 */ {USB_DEVICE(0x07D1, 0x3C0D)}, /* D-Link 3070 */
{USB_DEVICE(0x07D1,0x3C0E)}, /* D-Link 3070 */ {USB_DEVICE(0x07D1, 0x3C0E)}, /* D-Link 3070 */
{USB_DEVICE(0x07D1,0x3C0F)}, /* D-Link 3070 */ {USB_DEVICE(0x07D1, 0x3C0F)}, /* D-Link 3070 */
{USB_DEVICE(0x1D4D,0x000C)}, /* Pegatron Corporation 3070 */ {USB_DEVICE(0x1D4D, 0x000C)}, /* Pegatron Corporation 3070 */
{USB_DEVICE(0x1D4D,0x000E)}, /* Pegatron Corporation 3070 */ {USB_DEVICE(0x1D4D, 0x000E)}, /* Pegatron Corporation 3070 */
{USB_DEVICE(0x5A57,0x5257)}, /* Zinwell 3070 */ {USB_DEVICE(0x5A57, 0x5257)}, /* Zinwell 3070 */
{USB_DEVICE(0x5A57,0x0283)}, /* Zinwell 3072 */ {USB_DEVICE(0x5A57, 0x0283)}, /* Zinwell 3072 */
{USB_DEVICE(0x04BB,0x0945)}, /* I-O DATA 3072 */ {USB_DEVICE(0x04BB, 0x0945)}, /* I-O DATA 3072 */
{USB_DEVICE(0x203D,0x1480)}, /* Encore 3070 */ {USB_DEVICE(0x203D, 0x1480)}, /* Encore 3070 */
#endif // RT3070 // #endif // RT3070 //
{ USB_DEVICE(0x0DF6, 0x003F) }, /* Sitecom WL-608 */ {USB_DEVICE(0x0DF6, 0x003F)}, /* Sitecom WL-608 */
{ USB_DEVICE(0x1737, 0x0077) }, /* Linksys WUSB54GC-EU v3 */ {USB_DEVICE(0x1737, 0x0077)}, /* Linksys WUSB54GC-EU v3 */
{ USB_DEVICE(0x2001, 0x3C09) }, /* D-Link */ {USB_DEVICE(0x2001, 0x3C09)}, /* D-Link */
{ USB_DEVICE(0x2001, 0x3C0A) }, /* D-Link 3072*/ {USB_DEVICE(0x2001, 0x3C0A)}, /* D-Link 3072 */
{ USB_DEVICE(0x2019, 0xED14) }, /* Planex Communications, Inc. */ {USB_DEVICE(0x2019, 0xED14)}, /* Planex Communications, Inc. */
{ }/* Terminating entry */ {} /* Terminating entry */
}; };
INT const rtusb_usb_id_len = sizeof(rtusb_usb_id) / sizeof(struct usb_device_id); INT const rtusb_usb_id_len =
sizeof(rtusb_usb_id) / sizeof(struct usb_device_id);
MODULE_DEVICE_TABLE(usb, rtusb_usb_id); MODULE_DEVICE_TABLE(usb, rtusb_usb_id);
static void rt2870_disconnect( static void rt2870_disconnect(IN struct usb_device *dev, IN PRTMP_ADAPTER pAd);
IN struct usb_device *dev,
IN PRTMP_ADAPTER pAd);
static int __devinit rt2870_probe( static int __devinit rt2870_probe(IN struct usb_interface *intf,
IN struct usb_interface *intf,
IN struct usb_device *usb_dev, IN struct usb_device *usb_dev,
IN const struct usb_device_id *dev_id, IN const struct usb_device_id *dev_id,
IN RTMP_ADAPTER **ppAd); IN RTMP_ADAPTER ** ppAd);
#ifndef PF_NOFREEZE #ifndef PF_NOFREEZE
#define PF_NOFREEZE 0 #define PF_NOFREEZE 0
#endif #endif
extern int rt28xx_close(IN struct net_device *net_dev); extern int rt28xx_close(IN struct net_device *net_dev);
extern int rt28xx_open(struct net_device *net_dev); extern int rt28xx_open(struct net_device *net_dev);
static BOOLEAN USBDevConfigInit( static BOOLEAN USBDevConfigInit(IN struct usb_device *dev,
IN struct usb_device *dev,
IN struct usb_interface *intf, IN struct usb_interface *intf,
IN RTMP_ADAPTER *pAd); IN RTMP_ADAPTER * pAd);
/* /*
======================================================================== ========================================================================
...@@ -188,27 +181,23 @@ Return Value: ...@@ -188,27 +181,23 @@ Return Value:
Note: Note:
======================================================================== ========================================================================
*/ */
BOOLEAN RT28XXChipsetCheck( BOOLEAN RT28XXChipsetCheck(IN void *_dev_p)
IN void *_dev_p)
{ {
struct usb_interface *intf = (struct usb_interface *)_dev_p; struct usb_interface *intf = (struct usb_interface *)_dev_p;
struct usb_device *dev_p = interface_to_usbdev(intf); struct usb_device *dev_p = interface_to_usbdev(intf);
UINT32 i; UINT32 i;
for (i = 0; i < rtusb_usb_id_len; i++) {
for(i=0; i<rtusb_usb_id_len; i++)
{
if (dev_p->descriptor.idVendor == rtusb_usb_id[i].idVendor && if (dev_p->descriptor.idVendor == rtusb_usb_id[i].idVendor &&
dev_p->descriptor.idProduct == rtusb_usb_id[i].idProduct) dev_p->descriptor.idProduct == rtusb_usb_id[i].idProduct) {
{
printk("rt2870: idVendor = 0x%x, idProduct = 0x%x\n", printk("rt2870: idVendor = 0x%x, idProduct = 0x%x\n",
dev_p->descriptor.idVendor, dev_p->descriptor.idProduct); dev_p->descriptor.idVendor,
dev_p->descriptor.idProduct);
break; break;
} }
} }
if (i == rtusb_usb_id_len) if (i == rtusb_usb_id_len) {
{
printk("rt2870: Error! Device Descriptor not matching!\n"); printk("rt2870: Error! Device Descriptor not matching!\n");
return FALSE; return FALSE;
} }
...@@ -227,61 +216,76 @@ static int rt2870_suspend(struct usb_interface *intf, pm_message_t state); ...@@ -227,61 +216,76 @@ static int rt2870_suspend(struct usb_interface *intf, pm_message_t state);
static int rt2870_resume(struct usb_interface *intf); static int rt2870_resume(struct usb_interface *intf);
#endif // CONFIG_PM // #endif // CONFIG_PM //
static int rtusb_probe (struct usb_interface *intf, static int rtusb_probe(struct usb_interface *intf,
const struct usb_device_id *id); const struct usb_device_id *id);
static void rtusb_disconnect(struct usb_interface *intf); static void rtusb_disconnect(struct usb_interface *intf);
static BOOLEAN USBDevConfigInit( static BOOLEAN USBDevConfigInit(IN struct usb_device *dev,
IN struct usb_device *dev,
IN struct usb_interface *intf, IN struct usb_interface *intf,
IN RTMP_ADAPTER *pAd) IN RTMP_ADAPTER * pAd)
{ {
struct usb_host_interface *iface_desc; struct usb_host_interface *iface_desc;
ULONG BulkOutIdx; ULONG BulkOutIdx;
UINT32 i; UINT32 i;
/* get the active interface descriptor */ /* get the active interface descriptor */
iface_desc = intf->cur_altsetting; iface_desc = intf->cur_altsetting;
/* get # of enpoints */ /* get # of enpoints */
pAd->NumberOfPipes = iface_desc->desc.bNumEndpoints; pAd->NumberOfPipes = iface_desc->desc.bNumEndpoints;
DBGPRINT(RT_DEBUG_TRACE, ("NumEndpoints=%d\n", iface_desc->desc.bNumEndpoints)); DBGPRINT(RT_DEBUG_TRACE,
("NumEndpoints=%d\n", iface_desc->desc.bNumEndpoints));
/* Configure Pipes */ /* Configure Pipes */
BulkOutIdx = 0; BulkOutIdx = 0;
for(i=0; i<pAd->NumberOfPipes; i++) for (i = 0; i < pAd->NumberOfPipes; i++) {
{
if ((iface_desc->endpoint[i].desc.bmAttributes == if ((iface_desc->endpoint[i].desc.bmAttributes ==
USB_ENDPOINT_XFER_BULK) && USB_ENDPOINT_XFER_BULK) &&
((iface_desc->endpoint[i].desc.bEndpointAddress & ((iface_desc->endpoint[i].desc.bEndpointAddress &
USB_ENDPOINT_DIR_MASK) == USB_DIR_IN)) USB_ENDPOINT_DIR_MASK) == USB_DIR_IN)) {
{ pAd->BulkInEpAddr =
pAd->BulkInEpAddr = iface_desc->endpoint[i].desc.bEndpointAddress; iface_desc->endpoint[i].desc.bEndpointAddress;
pAd->BulkInMaxPacketSize = le2cpu16(iface_desc->endpoint[i].desc.wMaxPacketSize); pAd->BulkInMaxPacketSize =
le2cpu16(iface_desc->endpoint[i].desc.
DBGPRINT_RAW(RT_DEBUG_TRACE, ("BULK IN MaxPacketSize = %d\n", pAd->BulkInMaxPacketSize)); wMaxPacketSize);
DBGPRINT_RAW(RT_DEBUG_TRACE, ("EP address = 0x%2x\n", iface_desc->endpoint[i].desc.bEndpointAddress));
} DBGPRINT_RAW(RT_DEBUG_TRACE,
else if ((iface_desc->endpoint[i].desc.bmAttributes == ("BULK IN MaxPacketSize = %d\n",
USB_ENDPOINT_XFER_BULK) && pAd->BulkInMaxPacketSize));
((iface_desc->endpoint[i].desc.bEndpointAddress & DBGPRINT_RAW(RT_DEBUG_TRACE,
USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT)) ("EP address = 0x%2x\n",
{ iface_desc->endpoint[i].desc.
bEndpointAddress));
} else
if ((iface_desc->endpoint[i].desc.bmAttributes ==
USB_ENDPOINT_XFER_BULK)
&&
((iface_desc->endpoint[i].desc.
bEndpointAddress & USB_ENDPOINT_DIR_MASK) ==
USB_DIR_OUT)) {
// there are 6 bulk out EP. EP6 highest priority. // there are 6 bulk out EP. EP6 highest priority.
// EP1-4 is EDCA. EP5 is HCCA. // EP1-4 is EDCA. EP5 is HCCA.
pAd->BulkOutEpAddr[BulkOutIdx++] = iface_desc->endpoint[i].desc.bEndpointAddress; pAd->BulkOutEpAddr[BulkOutIdx++] =
pAd->BulkOutMaxPacketSize = le2cpu16(iface_desc->endpoint[i].desc.wMaxPacketSize); iface_desc->endpoint[i].desc.bEndpointAddress;
pAd->BulkOutMaxPacketSize =
DBGPRINT_RAW(RT_DEBUG_TRACE, ("BULK OUT MaxPacketSize = %d\n", pAd->BulkOutMaxPacketSize)); le2cpu16(iface_desc->endpoint[i].desc.
DBGPRINT_RAW(RT_DEBUG_TRACE, ("EP address = 0x%2x \n", iface_desc->endpoint[i].desc.bEndpointAddress)); wMaxPacketSize);
}
} DBGPRINT_RAW(RT_DEBUG_TRACE,
("BULK OUT MaxPacketSize = %d\n",
if (!(pAd->BulkInEpAddr && pAd->BulkOutEpAddr[0])) pAd->BulkOutMaxPacketSize));
{ DBGPRINT_RAW(RT_DEBUG_TRACE,
printk("%s: Could not find both bulk-in and bulk-out endpoints\n", __FUNCTION__); ("EP address = 0x%2x \n",
iface_desc->endpoint[i].desc.
bEndpointAddress));
}
}
if (!(pAd->BulkInEpAddr && pAd->BulkOutEpAddr[0])) {
printk
("%s: Could not find both bulk-in and bulk-out endpoints\n",
__FUNCTION__);
return FALSE; return FALSE;
} }
...@@ -292,9 +296,7 @@ static BOOLEAN USBDevConfigInit( ...@@ -292,9 +296,7 @@ static BOOLEAN USBDevConfigInit(
} }
static int rtusb_probe(struct usb_interface *intf,
static int rtusb_probe (struct usb_interface *intf,
const struct usb_device_id *id) const struct usb_device_id *id)
{ {
RTMP_ADAPTER *pAd; RTMP_ADAPTER *pAd;
...@@ -311,49 +313,42 @@ static int rtusb_probe (struct usb_interface *intf, ...@@ -311,49 +313,42 @@ static int rtusb_probe (struct usb_interface *intf,
return rv; return rv;
} }
static void rtusb_disconnect(struct usb_interface *intf) static void rtusb_disconnect(struct usb_interface *intf)
{ {
struct usb_device *dev = interface_to_usbdev(intf); struct usb_device *dev = interface_to_usbdev(intf);
PRTMP_ADAPTER pAd; PRTMP_ADAPTER pAd;
pAd = usb_get_intfdata(intf); pAd = usb_get_intfdata(intf);
usb_set_intfdata(intf, NULL); usb_set_intfdata(intf, NULL);
rt2870_disconnect(dev, pAd); rt2870_disconnect(dev, pAd);
} }
struct usb_driver rtusb_driver = { struct usb_driver rtusb_driver = {
.name="rt2870", .name = "rt2870",
.probe=rtusb_probe, .probe = rtusb_probe,
.disconnect=rtusb_disconnect, .disconnect = rtusb_disconnect,
.id_table=rtusb_usb_id, .id_table = rtusb_usb_id,
#ifdef CONFIG_PM #ifdef CONFIG_PM
suspend: rt2870_suspend, suspend:rt2870_suspend,
resume: rt2870_resume, resume:rt2870_resume,
#endif #endif
}; };
#ifdef CONFIG_PM #ifdef CONFIG_PM
VOID RT2870RejectPendingPackets( VOID RT2870RejectPendingPackets(IN PRTMP_ADAPTER pAd)
IN PRTMP_ADAPTER pAd)
{ {
// clear PS packets // clear PS packets
// clear TxSw packets // clear TxSw packets
} }
static int rt2870_suspend( static int rt2870_suspend(struct usb_interface *intf, pm_message_t state)
struct usb_interface *intf,
pm_message_t state)
{ {
struct net_device *net_dev; struct net_device *net_dev;
PRTMP_ADAPTER pAd = usb_get_intfdata(intf); PRTMP_ADAPTER pAd = usb_get_intfdata(intf);
DBGPRINT(RT_DEBUG_TRACE, ("===> rt2870_suspend()\n")); DBGPRINT(RT_DEBUG_TRACE, ("===> rt2870_suspend()\n"));
net_dev = pAd->net_dev; net_dev = pAd->net_dev;
netif_device_detach(net_dev); netif_device_detach(net_dev);
...@@ -367,13 +362,11 @@ static int rt2870_suspend( ...@@ -367,13 +362,11 @@ static int rt2870_suspend(
return 0; return 0;
} }
static int rt2870_resume( static int rt2870_resume(struct usb_interface *intf)
struct usb_interface *intf)
{ {
struct net_device *net_dev; struct net_device *net_dev;
PRTMP_ADAPTER pAd = usb_get_intfdata(intf); PRTMP_ADAPTER pAd = usb_get_intfdata(intf);
DBGPRINT(RT_DEBUG_TRACE, ("===> rt2870_resume()\n")); DBGPRINT(RT_DEBUG_TRACE, ("===> rt2870_resume()\n"));
pAd->PM_FlgSuspend = 0; pAd->PM_FlgSuspend = 0;
...@@ -405,9 +398,6 @@ VOID __exit rtusb_exit(void) ...@@ -405,9 +398,6 @@ VOID __exit rtusb_exit(void)
module_init(rtusb_init); module_init(rtusb_init);
module_exit(rtusb_exit); module_exit(rtusb_exit);
/*--------------------------------------------------------------------- */ /*--------------------------------------------------------------------- */
/* function declarations */ /* function declarations */
/*--------------------------------------------------------------------- */ /*--------------------------------------------------------------------- */
...@@ -426,35 +416,32 @@ Return Value: ...@@ -426,35 +416,32 @@ Return Value:
Note: Note:
======================================================================== ========================================================================
*/ */
INT MlmeThread( INT MlmeThread(IN void *Context)
IN void *Context)
{ {
RTMP_ADAPTER *pAd; RTMP_ADAPTER *pAd;
RTMP_OS_TASK *pTask; RTMP_OS_TASK *pTask;
int status; int status;
status = 0; status = 0;
pTask = (RTMP_OS_TASK *)Context; pTask = (RTMP_OS_TASK *) Context;
pAd = (PRTMP_ADAPTER)pTask->priv; pAd = (PRTMP_ADAPTER) pTask->priv;
RtmpOSTaskCustomize(pTask); RtmpOSTaskCustomize(pTask);
while(!pTask->task_killed) while (!pTask->task_killed) {
{
#ifdef KTHREAD_SUPPORT #ifdef KTHREAD_SUPPORT
RTMP_WAIT_EVENT_INTERRUPTIBLE(pAd, pTask); RTMP_WAIT_EVENT_INTERRUPTIBLE(pAd, pTask);
#else #else
RTMP_SEM_EVENT_WAIT(&(pTask->taskSema), status); RTMP_SEM_EVENT_WAIT(&(pTask->taskSema), status);
/* unlock the device pointers */ /* unlock the device pointers */
if (status != 0) if (status != 0) {
{
RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS); RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS);
break; break;
} }
#endif #endif
/* lock the device pointers , need to check if required*/ /* lock the device pointers , need to check if required */
//down(&(pAd->usbdev_semaphore)); //down(&(pAd->usbdev_semaphore));
if (!pAd->PM_FlgSuspend) if (!pAd->PM_FlgSuspend)
...@@ -475,16 +462,15 @@ INT MlmeThread( ...@@ -475,16 +462,15 @@ INT MlmeThread(
* This is important in preemption kernels, which transfer the flow * This is important in preemption kernels, which transfer the flow
* of execution immediately upon a complete(). * of execution immediately upon a complete().
*/ */
DBGPRINT(RT_DEBUG_TRACE,( "<---%s\n",__FUNCTION__)); DBGPRINT(RT_DEBUG_TRACE, ("<---%s\n", __FUNCTION__));
#ifndef KTHREAD_SUPPORT #ifndef KTHREAD_SUPPORT
pTask->taskPID = THREAD_PID_INIT_VALUE; pTask->taskPID = THREAD_PID_INIT_VALUE;
complete_and_exit (&pTask->taskComplete, 0); complete_and_exit(&pTask->taskComplete, 0);
#endif #endif
return 0; return 0;
} }
/* /*
======================================================================== ========================================================================
Routine Description: Routine Description:
...@@ -499,16 +485,15 @@ Return Value: ...@@ -499,16 +485,15 @@ Return Value:
Note: Note:
======================================================================== ========================================================================
*/ */
INT RTUSBCmdThread( INT RTUSBCmdThread(IN void *Context)
IN void * Context)
{ {
RTMP_ADAPTER *pAd; RTMP_ADAPTER *pAd;
RTMP_OS_TASK *pTask; RTMP_OS_TASK *pTask;
int status; int status;
status = 0; status = 0;
pTask = (RTMP_OS_TASK *)Context; pTask = (RTMP_OS_TASK *) Context;
pAd = (PRTMP_ADAPTER)pTask->priv; pAd = (PRTMP_ADAPTER) pTask->priv;
RtmpOSTaskCustomize(pTask); RtmpOSTaskCustomize(pTask);
...@@ -516,16 +501,14 @@ INT RTUSBCmdThread( ...@@ -516,16 +501,14 @@ INT RTUSBCmdThread(
pAd->CmdQ.CmdQState = RTMP_TASK_STAT_RUNNING; pAd->CmdQ.CmdQState = RTMP_TASK_STAT_RUNNING;
NdisReleaseSpinLock(&pAd->CmdQLock); NdisReleaseSpinLock(&pAd->CmdQLock);
while (pAd && pAd->CmdQ.CmdQState == RTMP_TASK_STAT_RUNNING) while (pAd && pAd->CmdQ.CmdQState == RTMP_TASK_STAT_RUNNING) {
{
#ifdef KTHREAD_SUPPORT #ifdef KTHREAD_SUPPORT
RTMP_WAIT_EVENT_INTERRUPTIBLE(pAd, pTask); RTMP_WAIT_EVENT_INTERRUPTIBLE(pAd, pTask);
#else #else
/* lock the device pointers */ /* lock the device pointers */
RTMP_SEM_EVENT_WAIT(&(pTask->taskSema), status); RTMP_SEM_EVENT_WAIT(&(pTask->taskSema), status);
if (status != 0) if (status != 0) {
{
RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS); RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS);
break; break;
} }
...@@ -538,28 +521,25 @@ INT RTUSBCmdThread( ...@@ -538,28 +521,25 @@ INT RTUSBCmdThread(
CMDHandler(pAd); CMDHandler(pAd);
} }
if (pAd && !pAd->PM_FlgSuspend) if (pAd && !pAd->PM_FlgSuspend) { // Clear the CmdQElements.
{ // Clear the CmdQElements.
CmdQElmt *pCmdQElmt = NULL; CmdQElmt *pCmdQElmt = NULL;
NdisAcquireSpinLock(&pAd->CmdQLock); NdisAcquireSpinLock(&pAd->CmdQLock);
pAd->CmdQ.CmdQState = RTMP_TASK_STAT_STOPED; pAd->CmdQ.CmdQState = RTMP_TASK_STAT_STOPED;
while(pAd->CmdQ.size) while (pAd->CmdQ.size) {
{
RTUSBDequeueCmd(&pAd->CmdQ, &pCmdQElmt); RTUSBDequeueCmd(&pAd->CmdQ, &pCmdQElmt);
if (pCmdQElmt) if (pCmdQElmt) {
{ if (pCmdQElmt->CmdFromNdis == TRUE) {
if (pCmdQElmt->CmdFromNdis == TRUE)
{
if (pCmdQElmt->buffer != NULL) if (pCmdQElmt->buffer != NULL)
os_free_mem(pAd, pCmdQElmt->buffer); os_free_mem(pAd,
os_free_mem(pAd, (PUCHAR)pCmdQElmt); pCmdQElmt->buffer);
} os_free_mem(pAd, (PUCHAR) pCmdQElmt);
else } else {
{ if ((pCmdQElmt->buffer != NULL)
if ((pCmdQElmt->buffer != NULL) && (pCmdQElmt->bufferlength != 0)) && (pCmdQElmt->bufferlength != 0))
os_free_mem(pAd, pCmdQElmt->buffer); os_free_mem(pAd,
os_free_mem(pAd, (PUCHAR)pCmdQElmt); pCmdQElmt->buffer);
os_free_mem(pAd, (PUCHAR) pCmdQElmt);
} }
} }
} }
...@@ -580,18 +560,17 @@ INT RTUSBCmdThread( ...@@ -580,18 +560,17 @@ INT RTUSBCmdThread(
* This is important in preemption kernels, which transfer the flow * This is important in preemption kernels, which transfer the flow
* of execution immediately upon a complete(). * of execution immediately upon a complete().
*/ */
DBGPRINT(RT_DEBUG_TRACE,( "<---RTUSBCmdThread\n")); DBGPRINT(RT_DEBUG_TRACE, ("<---RTUSBCmdThread\n"));
#ifndef KTHREAD_SUPPORT #ifndef KTHREAD_SUPPORT
pTask->taskPID = THREAD_PID_INIT_VALUE; pTask->taskPID = THREAD_PID_INIT_VALUE;
complete_and_exit (&pTask->taskComplete, 0); complete_and_exit(&pTask->taskComplete, 0);
#endif #endif
return 0; return 0;
} }
VOID RTUSBWatchDog(IN RTMP_ADAPTER * pAd)
VOID RTUSBWatchDog(IN RTMP_ADAPTER *pAd)
{ {
PHT_TX_CONTEXT pHTTXContext; PHT_TX_CONTEXT pHTTXContext;
int idx; int idx;
...@@ -603,29 +582,32 @@ VOID RTUSBWatchDog(IN RTMP_ADAPTER *pAd) ...@@ -603,29 +582,32 @@ VOID RTUSBWatchDog(IN RTMP_ADAPTER *pAd)
idx = 0; idx = 0;
RTMP_IO_READ32(pAd, TXRXQ_PCNT, &MACValue); RTMP_IO_READ32(pAd, TXRXQ_PCNT, &MACValue);
if ((MACValue & 0xff) !=0 ) if ((MACValue & 0xff) != 0) {
{ DBGPRINT(RT_DEBUG_TRACE,
DBGPRINT(RT_DEBUG_TRACE, ("TX QUEUE 0 Not EMPTY(Value=0x%0x). !!!!!!!!!!!!!!!\n", MACValue)); ("TX QUEUE 0 Not EMPTY(Value=0x%0x). !!!!!!!!!!!!!!!\n",
MACValue));
RTMP_IO_WRITE32(pAd, PBF_CFG, 0xf40012); RTMP_IO_WRITE32(pAd, PBF_CFG, 0xf40012);
while((MACValue &0xff) != 0 && (idx++ < 10)) while ((MACValue & 0xff) != 0 && (idx++ < 10)) {
{
RTMP_IO_READ32(pAd, TXRXQ_PCNT, &MACValue); RTMP_IO_READ32(pAd, TXRXQ_PCNT, &MACValue);
RTMPusecDelay(1); RTMPusecDelay(1);
} }
RTMP_IO_WRITE32(pAd, PBF_CFG, 0xf40006); RTMP_IO_WRITE32(pAd, PBF_CFG, 0xf40006);
} }
if (pAd->watchDogRxOverFlowCnt >= 2) if (pAd->watchDogRxOverFlowCnt >= 2) {
{ DBGPRINT(RT_DEBUG_TRACE,
DBGPRINT(RT_DEBUG_TRACE, ("Maybe the Rx Bulk-In hanged! Cancel the pending Rx bulks request!\n")); ("Maybe the Rx Bulk-In hanged! Cancel the pending Rx bulks request!\n"));
if ((!RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS | if ((!RTMP_TEST_FLAG
(pAd,
(fRTMP_ADAPTER_RESET_IN_PROGRESS |
fRTMP_ADAPTER_BULKIN_RESET | fRTMP_ADAPTER_BULKIN_RESET |
fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_HALT_IN_PROGRESS |
fRTMP_ADAPTER_NIC_NOT_EXIST)))) fRTMP_ADAPTER_NIC_NOT_EXIST)))) {
{ DBGPRINT(RT_DEBUG_TRACE,
DBGPRINT(RT_DEBUG_TRACE, ("Call CMDTHREAD_RESET_BULK_IN to cancel the pending Rx Bulk!\n")); ("Call CMDTHREAD_RESET_BULK_IN to cancel the pending Rx Bulk!\n"));
RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKIN_RESET); RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKIN_RESET);
RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_IN, NULL, 0); RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_IN,
NULL, 0);
needDumpSeq = TRUE; needDumpSeq = TRUE;
} }
pAd->watchDogRxOverFlowCnt = 0; pAd->watchDogRxOverFlowCnt = 0;
...@@ -633,105 +615,114 @@ VOID RTUSBWatchDog(IN RTMP_ADAPTER *pAd) ...@@ -633,105 +615,114 @@ VOID RTUSBWatchDog(IN RTMP_ADAPTER *pAd)
RTUSBReadMACRegister(pAd, 0x438, &TxRxQ_Pcnt); RTUSBReadMACRegister(pAd, 0x438, &TxRxQ_Pcnt);
for (idx = 0; idx < NUM_OF_TX_RING; idx++) for (idx = 0; idx < NUM_OF_TX_RING; idx++) {
{
pUrb = NULL; pUrb = NULL;
RTMP_IRQ_LOCK(&pAd->BulkOutLock[idx], irqFlags); RTMP_IRQ_LOCK(&pAd->BulkOutLock[idx], irqFlags);
if ((pAd->BulkOutPending[idx] == TRUE) && pAd->watchDogTxPendingCnt) if ((pAd->BulkOutPending[idx] == TRUE)
{ && pAd->watchDogTxPendingCnt) {
INT actual_length=0,transfer_buffer_length=0; INT actual_length = 0, transfer_buffer_length = 0;
BOOLEAN isDataPacket=FALSE; BOOLEAN isDataPacket = FALSE;
pAd->watchDogTxPendingCnt[idx]++; pAd->watchDogTxPendingCnt[idx]++;
if ((pAd->watchDogTxPendingCnt[idx] > 2) && if ((pAd->watchDogTxPendingCnt[idx] > 2) &&
(!RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS | fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST | fRTMP_ADAPTER_BULKOUT_RESET))) (!RTMP_TEST_FLAG
) (pAd,
{ (fRTMP_ADAPTER_RESET_IN_PROGRESS |
fRTMP_ADAPTER_HALT_IN_PROGRESS |
fRTMP_ADAPTER_NIC_NOT_EXIST |
fRTMP_ADAPTER_BULKOUT_RESET)))
) {
// FIXME: Following code just support single bulk out. If you wanna support multiple bulk out. Modify it! // FIXME: Following code just support single bulk out. If you wanna support multiple bulk out. Modify it!
pHTTXContext = (PHT_TX_CONTEXT)(&pAd->TxContext[idx]); pHTTXContext =
if (pHTTXContext->IRPPending) (PHT_TX_CONTEXT) (&pAd->TxContext[idx]);
{ // Check TxContext. if (pHTTXContext->IRPPending) { // Check TxContext.
pUrb = pHTTXContext->pUrb; pUrb = pHTTXContext->pUrb;
actual_length=pUrb->actual_length; actual_length = pUrb->actual_length;
transfer_buffer_length=pUrb->transfer_buffer_length; transfer_buffer_length =
isDataPacket=TRUE; pUrb->transfer_buffer_length;
} isDataPacket = TRUE;
else if (idx == MGMTPIPEIDX) } else if (idx == MGMTPIPEIDX) {
{ PTX_CONTEXT pMLMEContext, pNULLContext,
PTX_CONTEXT pMLMEContext, pNULLContext, pPsPollContext; pPsPollContext;
//Check MgmtContext. //Check MgmtContext.
pMLMEContext = (PTX_CONTEXT)(pAd->MgmtRing.Cell[pAd->MgmtRing.TxDmaIdx].AllocVa); pMLMEContext =
pPsPollContext = (PTX_CONTEXT)(&pAd->PsPollContext); (PTX_CONTEXT) (pAd->MgmtRing.
pNULLContext = (PTX_CONTEXT)(&pAd->NullContext); Cell[pAd->MgmtRing.
TxDmaIdx].
if (pMLMEContext->IRPPending) AllocVa);
{ pPsPollContext =
ASSERT(pMLMEContext->IRPPending); (PTX_CONTEXT) (&pAd->PsPollContext);
pNULLContext =
(PTX_CONTEXT) (&pAd->NullContext);
if (pMLMEContext->IRPPending) {
ASSERT(pMLMEContext->
IRPPending);
pUrb = pMLMEContext->pUrb; pUrb = pMLMEContext->pUrb;
} } else if (pNULLContext->IRPPending) {
else if (pNULLContext->IRPPending) ASSERT(pNULLContext->
{ IRPPending);
ASSERT(pNULLContext->IRPPending);
pUrb = pNULLContext->pUrb; pUrb = pNULLContext->pUrb;
} } else if (pPsPollContext->IRPPending) {
else if (pPsPollContext->IRPPending) ASSERT(pPsPollContext->
{ IRPPending);
ASSERT(pPsPollContext->IRPPending);
pUrb = pPsPollContext->pUrb; pUrb = pPsPollContext->pUrb;
} }
} }
RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[idx], irqFlags); RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[idx],
irqFlags);
printk(KERN_INFO "%d:%lu LTL=%d , TL=%d L:%d\n", printk(KERN_INFO "%d:%lu LTL=%d , TL=%d L:%d\n",
idx, pAd->watchDogTxPendingCnt[idx], idx, pAd->watchDogTxPendingCnt[idx],
pAd->TransferedLength[idx], pAd->TransferedLength[idx],
actual_length, transfer_buffer_length); actual_length, transfer_buffer_length);
if (pUrb) if (pUrb) {
{
if ((isDataPacket if ((isDataPacket
&& pAd->TransferedLength[idx]==actual_length && pAd->TransferedLength[idx] ==
&& pAd->TransferedLength[idx]<transfer_buffer_length actual_length
&& actual_length!=0 && pAd->TransferedLength[idx] <
transfer_buffer_length
&& actual_length != 0
// && TxRxQ_Pcnt==0 // && TxRxQ_Pcnt==0
&& pAd->watchDogTxPendingCnt[idx]>3) && pAd->watchDogTxPendingCnt[idx] >
|| isDataPacket==FALSE || pAd->watchDogTxPendingCnt[idx]>6) 3)
{ || isDataPacket == FALSE
DBGPRINT(RT_DEBUG_TRACE, ("Maybe the Tx Bulk-Out hanged! Cancel the pending Tx bulks request of idx(%d)!\n", idx)); || pAd->watchDogTxPendingCnt[idx] >
DBGPRINT(RT_DEBUG_TRACE, ("Unlink the pending URB!\n")); 6) {
DBGPRINT(RT_DEBUG_TRACE,
("Maybe the Tx Bulk-Out hanged! Cancel the pending Tx bulks request of idx(%d)!\n",
idx));
DBGPRINT(RT_DEBUG_TRACE,
("Unlink the pending URB!\n"));
// unlink it now // unlink it now
RTUSB_UNLINK_URB(pUrb); RTUSB_UNLINK_URB(pUrb);
// Sleep 200 microseconds to give cancellation time to work // Sleep 200 microseconds to give cancellation time to work
//RTMPusecDelay(200); //RTMPusecDelay(200);
needDumpSeq = TRUE; needDumpSeq = TRUE;
} }
} else {
DBGPRINT(RT_DEBUG_ERROR,
("Unkonw bulkOut URB maybe hanged!!!!!!!!!!!!\n"));
} }
else } else {
{ RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[idx],
DBGPRINT(RT_DEBUG_ERROR, ("Unkonw bulkOut URB maybe hanged!!!!!!!!!!!!\n")); irqFlags);
}
}
else
{
RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[idx], irqFlags);
} }
if (isDataPacket==TRUE) if (isDataPacket == TRUE)
pAd->TransferedLength[idx]=actual_length; pAd->TransferedLength[idx] = actual_length;
} } else {
else
{
RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[idx], irqFlags); RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[idx], irqFlags);
} }
} }
// For Sigma debug, dump the ba_reordering sequence. // For Sigma debug, dump the ba_reordering sequence.
if((needDumpSeq == TRUE) && (pAd->CommonCfg.bDisableReordering == 0)) if ((needDumpSeq == TRUE) && (pAd->CommonCfg.bDisableReordering == 0)) {
{
USHORT Idx; USHORT Idx;
PBA_REC_ENTRY pBAEntry = NULL; PBA_REC_ENTRY pBAEntry = NULL;
UCHAR count = 0; UCHAR count = 0;
...@@ -740,19 +731,23 @@ VOID RTUSBWatchDog(IN RTMP_ADAPTER *pAd) ...@@ -740,19 +731,23 @@ VOID RTUSBWatchDog(IN RTMP_ADAPTER *pAd)
Idx = pAd->MacTab.Content[BSSID_WCID].BARecWcidArray[0]; Idx = pAd->MacTab.Content[BSSID_WCID].BARecWcidArray[0];
pBAEntry = &pAd->BATable.BARecEntry[Idx]; pBAEntry = &pAd->BATable.BARecEntry[Idx];
if((pBAEntry->list.qlen > 0) && (pBAEntry->list.next != NULL)) if ((pBAEntry->list.qlen > 0) && (pBAEntry->list.next != NULL)) {
{ DBGPRINT(RT_DEBUG_TRACE,
DBGPRINT(RT_DEBUG_TRACE, ("NICUpdateRawCounters():The Queueing pkt in reordering buffer:\n")); ("NICUpdateRawCounters():The Queueing pkt in reordering buffer:\n"));
NdisAcquireSpinLock(&pBAEntry->RxReRingLock); NdisAcquireSpinLock(&pBAEntry->RxReRingLock);
mpdu_blk = pBAEntry->list.next; mpdu_blk = pBAEntry->list.next;
while (mpdu_blk) while (mpdu_blk) {
{ DBGPRINT(RT_DEBUG_TRACE,
DBGPRINT(RT_DEBUG_TRACE, ("\t%d:Seq-%d, bAMSDU-%d!\n", count, mpdu_blk->Sequence, mpdu_blk->bAMSDU)); ("\t%d:Seq-%d, bAMSDU-%d!\n", count,
mpdu_blk->Sequence,
mpdu_blk->bAMSDU));
mpdu_blk = mpdu_blk->next; mpdu_blk = mpdu_blk->next;
count++; count++;
} }
DBGPRINT(RT_DEBUG_TRACE, ("\npBAEntry->LastIndSeq=%d!\n", pBAEntry->LastIndSeq)); DBGPRINT(RT_DEBUG_TRACE,
("\npBAEntry->LastIndSeq=%d!\n",
pBAEntry->LastIndSeq));
NdisReleaseSpinLock(&pBAEntry->RxReRingLock); NdisReleaseSpinLock(&pBAEntry->RxReRingLock);
} }
} }
...@@ -775,10 +770,10 @@ Return Value: ...@@ -775,10 +770,10 @@ Return Value:
*/ */
static void rt2870_disconnect(struct usb_device *dev, PRTMP_ADAPTER pAd) static void rt2870_disconnect(struct usb_device *dev, PRTMP_ADAPTER pAd)
{ {
DBGPRINT(RT_DEBUG_ERROR, ("rtusb_disconnect: unregister usbnet usb-%s-%s\n", DBGPRINT(RT_DEBUG_ERROR,
("rtusb_disconnect: unregister usbnet usb-%s-%s\n",
dev->bus->bus_name, dev->devpath)); dev->bus->bus_name, dev->devpath));
if (!pAd) if (!pAd) {
{
usb_put_dev(dev); usb_put_dev(dev);
printk("rtusb_disconnect: pAd == NULL!\n"); printk("rtusb_disconnect: pAd == NULL!\n");
return; return;
...@@ -788,7 +783,6 @@ static void rt2870_disconnect(struct usb_device *dev, PRTMP_ADAPTER pAd) ...@@ -788,7 +783,6 @@ static void rt2870_disconnect(struct usb_device *dev, PRTMP_ADAPTER pAd)
// for debug, wait to show some messages to /proc system // for debug, wait to show some messages to /proc system
udelay(1); udelay(1);
RtmpPhyNetDevExit(pAd, pAd->net_dev); RtmpPhyNetDevExit(pAd, pAd->net_dev);
// FIXME: Shall we need following delay and flush the schedule?? // FIXME: Shall we need following delay and flush the schedule??
...@@ -808,12 +802,10 @@ static void rt2870_disconnect(struct usb_device *dev, PRTMP_ADAPTER pAd) ...@@ -808,12 +802,10 @@ static void rt2870_disconnect(struct usb_device *dev, PRTMP_ADAPTER pAd)
DBGPRINT(RT_DEBUG_ERROR, (" RTUSB disconnect successfully\n")); DBGPRINT(RT_DEBUG_ERROR, (" RTUSB disconnect successfully\n"));
} }
static int __devinit rt2870_probe(IN struct usb_interface *intf,
static int __devinit rt2870_probe(
IN struct usb_interface *intf,
IN struct usb_device *usb_dev, IN struct usb_device *usb_dev,
IN const struct usb_device_id *dev_id, IN const struct usb_device_id *dev_id,
IN RTMP_ADAPTER **ppAd) IN RTMP_ADAPTER ** ppAd)
{ {
struct net_device *net_dev = NULL; struct net_device *net_dev = NULL;
RTMP_ADAPTER *pAd = (RTMP_ADAPTER *) NULL; RTMP_ADAPTER *pAd = (RTMP_ADAPTER *) NULL;
...@@ -821,7 +813,6 @@ static int __devinit rt2870_probe( ...@@ -821,7 +813,6 @@ static int __devinit rt2870_probe(
PVOID handle; PVOID handle;
RTMP_OS_NETDEV_OP_HOOK netDevHook; RTMP_OS_NETDEV_OP_HOOK netDevHook;
DBGPRINT(RT_DEBUG_TRACE, ("===>rt2870_probe()!\n")); DBGPRINT(RT_DEBUG_TRACE, ("===>rt2870_probe()!\n"));
// Check chipset vendor/product ID // Check chipset vendor/product ID
...@@ -831,20 +822,18 @@ static int __devinit rt2870_probe( ...@@ -831,20 +822,18 @@ static int __devinit rt2870_probe(
//RtmpDevInit============================================= //RtmpDevInit=============================================
// Allocate RTMP_ADAPTER adapter structure // Allocate RTMP_ADAPTER adapter structure
handle = kmalloc(sizeof(struct os_cookie), GFP_KERNEL); handle = kmalloc(sizeof(struct os_cookie), GFP_KERNEL);
if (handle == NULL) if (handle == NULL) {
{ printk
printk("rt2870_probe(): Allocate memory for os handle failed!\n"); ("rt2870_probe(): Allocate memory for os handle failed!\n");
return -ENOMEM; return -ENOMEM;
} }
((POS_COOKIE)handle)->pUsb_Dev = usb_dev; ((POS_COOKIE) handle)->pUsb_Dev = usb_dev;
rv = RTMPAllocAdapterBlock(handle, &pAd); rv = RTMPAllocAdapterBlock(handle, &pAd);
if (rv != NDIS_STATUS_SUCCESS) if (rv != NDIS_STATUS_SUCCESS) {
{
kfree(handle); kfree(handle);
goto err_out; goto err_out;
} }
//USBDevInit============================================== //USBDevInit==============================================
if (USBDevConfigInit(usb_dev, intf, pAd) == FALSE) if (USBDevConfigInit(usb_dev, intf, pAd) == FALSE)
goto err_out_free_radev; goto err_out_free_radev;
......
...@@ -39,31 +39,28 @@ ...@@ -39,31 +39,28 @@
#ifdef RTMP_MAC_USB #ifdef RTMP_MAC_USB
#include "../rt_config.h" #include "../rt_config.h"
// Match total 6 bulkout endpoint to corresponding queue. // Match total 6 bulkout endpoint to corresponding queue.
UCHAR EpToQueue[6]={FIFO_EDCA, FIFO_EDCA, FIFO_EDCA, FIFO_EDCA, FIFO_EDCA, FIFO_MGMT}; UCHAR EpToQueue[6] =
{ FIFO_EDCA, FIFO_EDCA, FIFO_EDCA, FIFO_EDCA, FIFO_EDCA, FIFO_MGMT };
//static BOOLEAN SingleBulkOut = FALSE; //static BOOLEAN SingleBulkOut = FALSE;
void RTUSB_FILL_BULK_URB (struct urb *pUrb, void RTUSB_FILL_BULK_URB(struct urb *pUrb,
struct usb_device *pUsb_Dev, struct usb_device *pUsb_Dev,
unsigned int bulkpipe, unsigned int bulkpipe,
void *pTransferBuf, void *pTransferBuf,
int BufSize, int BufSize, usb_complete_t Complete, void *pContext)
usb_complete_t Complete,
void *pContext)
{ {
usb_fill_bulk_urb(pUrb, pUsb_Dev, bulkpipe, pTransferBuf, BufSize, (usb_complete_t)Complete, pContext); usb_fill_bulk_urb(pUrb, pUsb_Dev, bulkpipe, pTransferBuf, BufSize,
(usb_complete_t) Complete, pContext);
} }
VOID RTUSBInitTxDesc( VOID RTUSBInitTxDesc(IN PRTMP_ADAPTER pAd,
IN PRTMP_ADAPTER pAd,
IN PTX_CONTEXT pTxContext, IN PTX_CONTEXT pTxContext,
IN UCHAR BulkOutPipeId, IN UCHAR BulkOutPipeId, IN usb_complete_t Func)
IN usb_complete_t Func)
{ {
PURB pUrb; PURB pUrb;
PUCHAR pSrc = NULL; PUCHAR pSrc = NULL;
...@@ -75,27 +72,23 @@ VOID RTUSBInitTxDesc( ...@@ -75,27 +72,23 @@ VOID RTUSBInitTxDesc(
// Store BulkOut PipeId // Store BulkOut PipeId
pTxContext->BulkOutPipeId = BulkOutPipeId; pTxContext->BulkOutPipeId = BulkOutPipeId;
if (pTxContext->bAggregatible) if (pTxContext->bAggregatible) {
{
pSrc = &pTxContext->TransferBuffer->Aggregation[2]; pSrc = &pTxContext->TransferBuffer->Aggregation[2];
} else {
pSrc =
(PUCHAR) pTxContext->TransferBuffer->field.WirelessPacket;
} }
else
{
pSrc = (PUCHAR) pTxContext->TransferBuffer->field.WirelessPacket;
}
//Initialize a tx bulk urb //Initialize a tx bulk urb
RTUSB_FILL_BULK_URB(pUrb, RTUSB_FILL_BULK_URB(pUrb,
pObj->pUsb_Dev, pObj->pUsb_Dev,
usb_sndbulkpipe(pObj->pUsb_Dev, pAd->BulkOutEpAddr[BulkOutPipeId]), usb_sndbulkpipe(pObj->pUsb_Dev,
pSrc, pAd->BulkOutEpAddr[BulkOutPipeId]),
pTxContext->BulkOutSize, pSrc, pTxContext->BulkOutSize, Func, pTxContext);
Func,
pTxContext);
if (pTxContext->bAggregatible) if (pTxContext->bAggregatible)
pUrb->transfer_dma = (pTxContext->data_dma + TX_BUFFER_NORMSIZE + 2); pUrb->transfer_dma =
(pTxContext->data_dma + TX_BUFFER_NORMSIZE + 2);
else else
pUrb->transfer_dma = pTxContext->data_dma; pUrb->transfer_dma = pTxContext->data_dma;
...@@ -103,12 +96,10 @@ VOID RTUSBInitTxDesc( ...@@ -103,12 +96,10 @@ VOID RTUSBInitTxDesc(
} }
VOID RTUSBInitHTTxDesc( VOID RTUSBInitHTTxDesc(IN PRTMP_ADAPTER pAd,
IN PRTMP_ADAPTER pAd,
IN PHT_TX_CONTEXT pTxContext, IN PHT_TX_CONTEXT pTxContext,
IN UCHAR BulkOutPipeId, IN UCHAR BulkOutPipeId,
IN ULONG BulkOutSize, IN ULONG BulkOutSize, IN usb_complete_t Func)
IN usb_complete_t Func)
{ {
PURB pUrb; PURB pUrb;
PUCHAR pSrc = NULL; PUCHAR pSrc = NULL;
...@@ -120,36 +111,33 @@ VOID RTUSBInitHTTxDesc( ...@@ -120,36 +111,33 @@ VOID RTUSBInitHTTxDesc(
// Store BulkOut PipeId // Store BulkOut PipeId
pTxContext->BulkOutPipeId = BulkOutPipeId; pTxContext->BulkOutPipeId = BulkOutPipeId;
pSrc = &pTxContext->TransferBuffer->field.WirelessPacket[pTxContext->NextBulkOutPosition]; pSrc =
&pTxContext->TransferBuffer->field.WirelessPacket[pTxContext->
NextBulkOutPosition];
//Initialize a tx bulk urb //Initialize a tx bulk urb
RTUSB_FILL_BULK_URB(pUrb, RTUSB_FILL_BULK_URB(pUrb,
pObj->pUsb_Dev, pObj->pUsb_Dev,
usb_sndbulkpipe(pObj->pUsb_Dev, pAd->BulkOutEpAddr[BulkOutPipeId]), usb_sndbulkpipe(pObj->pUsb_Dev,
pSrc, pAd->BulkOutEpAddr[BulkOutPipeId]),
BulkOutSize, pSrc, BulkOutSize, Func, pTxContext);
Func,
pTxContext);
pUrb->transfer_dma = (pTxContext->data_dma + pTxContext->NextBulkOutPosition); pUrb->transfer_dma =
(pTxContext->data_dma + pTxContext->NextBulkOutPosition);
pUrb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; pUrb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
} }
VOID RTUSBInitRxDesc( VOID RTUSBInitRxDesc(IN PRTMP_ADAPTER pAd, IN PRX_CONTEXT pRxContext)
IN PRTMP_ADAPTER pAd,
IN PRX_CONTEXT pRxContext)
{ {
PURB pUrb; PURB pUrb;
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie; POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
ULONG RX_bulk_size; ULONG RX_bulk_size;
pUrb = pRxContext->pUrb; pUrb = pRxContext->pUrb;
ASSERT(pUrb); ASSERT(pUrb);
if ( pAd->BulkInMaxPacketSize == 64) if (pAd->BulkInMaxPacketSize == 64)
RX_bulk_size = 4096; RX_bulk_size = 4096;
else else
RX_bulk_size = MAX_RXBULK_SIZE; RX_bulk_size = MAX_RXBULK_SIZE;
...@@ -158,15 +146,15 @@ VOID RTUSBInitRxDesc( ...@@ -158,15 +146,15 @@ VOID RTUSBInitRxDesc(
RTUSB_FILL_BULK_URB(pUrb, RTUSB_FILL_BULK_URB(pUrb,
pObj->pUsb_Dev, pObj->pUsb_Dev,
usb_rcvbulkpipe(pObj->pUsb_Dev, pAd->BulkInEpAddr), usb_rcvbulkpipe(pObj->pUsb_Dev, pAd->BulkInEpAddr),
&(pRxContext->TransferBuffer[pAd->NextRxBulkInPosition]), &(pRxContext->
TransferBuffer[pAd->NextRxBulkInPosition]),
RX_bulk_size - (pAd->NextRxBulkInPosition), RX_bulk_size - (pAd->NextRxBulkInPosition),
(usb_complete_t)RTUSBBulkRxComplete, (usb_complete_t) RTUSBBulkRxComplete,
(void *)pRxContext); (void *)pRxContext);
pUrb->transfer_dma = pRxContext->data_dma + pAd->NextRxBulkInPosition; pUrb->transfer_dma = pRxContext->data_dma + pAd->NextRxBulkInPosition;
pUrb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; pUrb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
} }
/* /*
...@@ -191,11 +179,8 @@ VOID RTUSBInitRxDesc( ...@@ -191,11 +179,8 @@ VOID RTUSBInitRxDesc(
if(1 /*!(in_interrupt() & 0xffff0000)*/) \ if(1 /*!(in_interrupt() & 0xffff0000)*/) \
RTMP_IRQ_UNLOCK((pLock), IrqFlags); RTMP_IRQ_UNLOCK((pLock), IrqFlags);
VOID RTUSBBulkOutDataPacket(IN PRTMP_ADAPTER pAd,
VOID RTUSBBulkOutDataPacket( IN UCHAR BulkOutPipeId, IN UCHAR Index)
IN PRTMP_ADAPTER pAd,
IN UCHAR BulkOutPipeId,
IN UCHAR Index)
{ {
PHT_TX_CONTEXT pHTTXContext; PHT_TX_CONTEXT pHTTXContext;
...@@ -207,48 +192,53 @@ VOID RTUSBBulkOutDataPacket( ...@@ -207,48 +192,53 @@ VOID RTUSBBulkOutDataPacket(
unsigned long IrqFlags = 0, IrqFlags2 = 0; unsigned long IrqFlags = 0, IrqFlags2 = 0;
PUCHAR pWirelessPkt, pAppendant; PUCHAR pWirelessPkt, pAppendant;
BOOLEAN bTxQLastRound = FALSE; BOOLEAN bTxQLastRound = FALSE;
UCHAR allzero[4]= {0x0,0x0,0x0,0x0}; UCHAR allzero[4] = { 0x0, 0x0, 0x0, 0x0 };
BULK_OUT_LOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags); BULK_OUT_LOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
if ((pAd->BulkOutPending[BulkOutPipeId] == TRUE) || RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NEED_STOP_TX)) if ((pAd->BulkOutPending[BulkOutPipeId] == TRUE)
{ || RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NEED_STOP_TX)) {
BULK_OUT_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags); BULK_OUT_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
return; return;
} }
pAd->BulkOutPending[BulkOutPipeId] = TRUE; pAd->BulkOutPending[BulkOutPipeId] = TRUE;
if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)
) ) {
{
pAd->BulkOutPending[BulkOutPipeId] = FALSE; pAd->BulkOutPending[BulkOutPipeId] = FALSE;
BULK_OUT_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags); BULK_OUT_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
return; return;
} }
BULK_OUT_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags); BULK_OUT_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
pHTTXContext = &(pAd->TxContext[BulkOutPipeId]); pHTTXContext = &(pAd->TxContext[BulkOutPipeId]);
BULK_OUT_LOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags2); BULK_OUT_LOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags2);
if ((pHTTXContext->ENextBulkOutPosition == pHTTXContext->CurWritePosition) if ((pHTTXContext->ENextBulkOutPosition ==
|| ((pHTTXContext->ENextBulkOutPosition-8) == pHTTXContext->CurWritePosition)) pHTTXContext->CurWritePosition)
{ || ((pHTTXContext->ENextBulkOutPosition - 8) ==
BULK_OUT_UNLOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags2); pHTTXContext->CurWritePosition)) {
BULK_OUT_UNLOCK(&pAd->TxContextQueueLock[BulkOutPipeId],
IrqFlags2);
BULK_OUT_LOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags); BULK_OUT_LOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
pAd->BulkOutPending[BulkOutPipeId] = FALSE; pAd->BulkOutPending[BulkOutPipeId] = FALSE;
// Clear Data flag // Clear Data flag
RTUSB_CLEAR_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_FRAG << BulkOutPipeId)); RTUSB_CLEAR_BULK_FLAG(pAd,
RTUSB_CLEAR_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_NORMAL << BulkOutPipeId)); (fRTUSB_BULK_OUT_DATA_FRAG <<
BulkOutPipeId));
RTUSB_CLEAR_BULK_FLAG(pAd,
(fRTUSB_BULK_OUT_DATA_NORMAL <<
BulkOutPipeId));
BULK_OUT_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags); BULK_OUT_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
return; return;
} }
// Clear Data flag // Clear Data flag
RTUSB_CLEAR_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_FRAG << BulkOutPipeId)); RTUSB_CLEAR_BULK_FLAG(pAd,
RTUSB_CLEAR_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_NORMAL << BulkOutPipeId)); (fRTUSB_BULK_OUT_DATA_FRAG << BulkOutPipeId));
RTUSB_CLEAR_BULK_FLAG(pAd,
(fRTUSB_BULK_OUT_DATA_NORMAL << BulkOutPipeId));
//DBGPRINT(RT_DEBUG_TRACE,("BulkOut-B:I=0x%lx, CWPos=%ld, CWRPos=%ld, NBPos=%ld, ENBPos=%ld, bCopy=%d!\n", in_interrupt(), //DBGPRINT(RT_DEBUG_TRACE,("BulkOut-B:I=0x%lx, CWPos=%ld, CWRPos=%ld, NBPos=%ld, ENBPos=%ld, bCopy=%d!\n", in_interrupt(),
// pHTTXContext->CurWritePosition, pHTTXContext->CurWriteRealPos, pHTTXContext->NextBulkOutPosition, // pHTTXContext->CurWritePosition, pHTTXContext->CurWriteRealPos, pHTTXContext->NextBulkOutPosition,
...@@ -258,112 +248,146 @@ VOID RTUSBBulkOutDataPacket( ...@@ -258,112 +248,146 @@ VOID RTUSBBulkOutDataPacket(
TmpBulkEndPos = pHTTXContext->NextBulkOutPosition; TmpBulkEndPos = pHTTXContext->NextBulkOutPosition;
pWirelessPkt = &pHTTXContext->TransferBuffer->field.WirelessPacket[0]; pWirelessPkt = &pHTTXContext->TransferBuffer->field.WirelessPacket[0];
if ((pHTTXContext->bCopySavePad == TRUE)) if ((pHTTXContext->bCopySavePad == TRUE)) {
{ if (RTMPEqualMemory(pHTTXContext->SavedPad, allzero, 4)) {
if (RTMPEqualMemory(pHTTXContext->SavedPad, allzero,4)) DBGPRINT_RAW(RT_DEBUG_ERROR,
{ ("e1, allzero : %x %x %x %x %x %x %x %x \n",
DBGPRINT_RAW(RT_DEBUG_ERROR,("e1, allzero : %x %x %x %x %x %x %x %x \n", pHTTXContext->SavedPad[0],
pHTTXContext->SavedPad[0], pHTTXContext->SavedPad[1], pHTTXContext->SavedPad[2],pHTTXContext->SavedPad[3] pHTTXContext->SavedPad[1],
,pHTTXContext->SavedPad[4], pHTTXContext->SavedPad[5], pHTTXContext->SavedPad[6],pHTTXContext->SavedPad[7])); pHTTXContext->SavedPad[2],
pHTTXContext->SavedPad[3]
, pHTTXContext->SavedPad[4],
pHTTXContext->SavedPad[5],
pHTTXContext->SavedPad[6],
pHTTXContext->SavedPad[7]));
} }
NdisMoveMemory(&pWirelessPkt[TmpBulkEndPos], pHTTXContext->SavedPad, 8); NdisMoveMemory(&pWirelessPkt[TmpBulkEndPos],
pHTTXContext->SavedPad, 8);
pHTTXContext->bCopySavePad = FALSE; pHTTXContext->bCopySavePad = FALSE;
if (pAd->bForcePrintTX == TRUE) if (pAd->bForcePrintTX == TRUE)
DBGPRINT(RT_DEBUG_TRACE,("RTUSBBulkOutDataPacket --> COPY PAD. CurWrite = %ld, NextBulk = %ld. ENextBulk = %ld.\n", pHTTXContext->CurWritePosition, pHTTXContext->NextBulkOutPosition, pHTTXContext->ENextBulkOutPosition)); DBGPRINT(RT_DEBUG_TRACE,
("RTUSBBulkOutDataPacket --> COPY PAD. CurWrite = %ld, NextBulk = %ld. ENextBulk = %ld.\n",
pHTTXContext->CurWritePosition,
pHTTXContext->NextBulkOutPosition,
pHTTXContext->ENextBulkOutPosition));
} }
do do {
{ pTxInfo = (PTXINFO_STRUC) & pWirelessPkt[TmpBulkEndPos];
pTxInfo = (PTXINFO_STRUC)&pWirelessPkt[TmpBulkEndPos]; pTxWI =
pTxWI = (PTXWI_STRUC)&pWirelessPkt[TmpBulkEndPos + TXINFO_SIZE]; (PTXWI_STRUC) & pWirelessPkt[TmpBulkEndPos + TXINFO_SIZE];
if (pAd->bForcePrintTX == TRUE) if (pAd->bForcePrintTX == TRUE)
DBGPRINT(RT_DEBUG_TRACE, ("RTUSBBulkOutDataPacket AMPDU = %d.\n", pTxWI->AMPDU)); DBGPRINT(RT_DEBUG_TRACE,
("RTUSBBulkOutDataPacket AMPDU = %d.\n",
pTxWI->AMPDU));
// add by Iverson, limit BulkOut size to 4k to pass WMM b mode 2T1R test items // add by Iverson, limit BulkOut size to 4k to pass WMM b mode 2T1R test items
//if ((ThisBulkSize != 0) && (pTxWI->AMPDU == 0)) //if ((ThisBulkSize != 0) && (pTxWI->AMPDU == 0))
if ((ThisBulkSize != 0) && (pTxWI->PHYMODE == MODE_CCK)) if ((ThisBulkSize != 0) && (pTxWI->PHYMODE == MODE_CCK)) {
{ if (((ThisBulkSize & 0xffff8000) != 0)
if (((ThisBulkSize&0xffff8000) != 0) || ((ThisBulkSize&0x1000) == 0x1000)) || ((ThisBulkSize & 0x1000) == 0x1000)) {
{
// Limit BulkOut size to about 4k bytes. // Limit BulkOut size to about 4k bytes.
pHTTXContext->ENextBulkOutPosition = TmpBulkEndPos; pHTTXContext->ENextBulkOutPosition =
TmpBulkEndPos;
break; break;
} } else
else if (((pAd->BulkOutMaxPacketSize < 512) && ((ThisBulkSize&0xfffff800) != 0) ) /*|| ( (ThisBulkSize != 0) && (pTxWI->AMPDU == 0))*/) if (((pAd->BulkOutMaxPacketSize < 512)
{ && ((ThisBulkSize & 0xfffff800) !=
0))
/*|| ( (ThisBulkSize != 0) && (pTxWI->AMPDU == 0)) */
) {
// For USB 1.1 or peer which didn't support AMPDU, limit the BulkOut size. // For USB 1.1 or peer which didn't support AMPDU, limit the BulkOut size.
// For performence in b/g mode, now just check for USB 1.1 and didn't care about the APMDU or not! 2008/06/04. // For performence in b/g mode, now just check for USB 1.1 and didn't care about the APMDU or not! 2008/06/04.
pHTTXContext->ENextBulkOutPosition = TmpBulkEndPos; pHTTXContext->ENextBulkOutPosition =
TmpBulkEndPos;
break; break;
} }
} }
// end Iverson // end Iverson
else else {
{ if (((ThisBulkSize & 0xffff8000) != 0) || ((ThisBulkSize & 0x6000) == 0x6000)) { // Limit BulkOut size to about 24k bytes.
if (((ThisBulkSize&0xffff8000) != 0) || ((ThisBulkSize&0x6000) == 0x6000)) pHTTXContext->ENextBulkOutPosition =
{ // Limit BulkOut size to about 24k bytes. TmpBulkEndPos;
pHTTXContext->ENextBulkOutPosition = TmpBulkEndPos;
break; break;
} } else if (((pAd->BulkOutMaxPacketSize < 512) && ((ThisBulkSize & 0xfffff800) != 0)) /*|| ( (ThisBulkSize != 0) && (pTxWI->AMPDU == 0)) */ ) { // For USB 1.1 or peer which didn't support AMPDU, limit the BulkOut size.
else if (((pAd->BulkOutMaxPacketSize < 512) && ((ThisBulkSize&0xfffff800) != 0) ) /*|| ( (ThisBulkSize != 0) && (pTxWI->AMPDU == 0))*/)
{ // For USB 1.1 or peer which didn't support AMPDU, limit the BulkOut size.
// For performence in b/g mode, now just check for USB 1.1 and didn't care about the APMDU or not! 2008/06/04. // For performence in b/g mode, now just check for USB 1.1 and didn't care about the APMDU or not! 2008/06/04.
pHTTXContext->ENextBulkOutPosition = TmpBulkEndPos; pHTTXContext->ENextBulkOutPosition =
TmpBulkEndPos;
break; break;
} }
} }
if (TmpBulkEndPos == pHTTXContext->CurWritePosition) if (TmpBulkEndPos == pHTTXContext->CurWritePosition) {
{
pHTTXContext->ENextBulkOutPosition = TmpBulkEndPos; pHTTXContext->ENextBulkOutPosition = TmpBulkEndPos;
break; break;
} }
if (pTxInfo->QSEL != FIFO_EDCA) if (pTxInfo->QSEL != FIFO_EDCA) {
{ DBGPRINT(RT_DEBUG_ERROR,
DBGPRINT(RT_DEBUG_ERROR, ("%s(): ====> pTxInfo->QueueSel(%d)!= FIFO_EDCA!!!!\n", ("%s(): ====> pTxInfo->QueueSel(%d)!= FIFO_EDCA!!!!\n",
__FUNCTION__, pTxInfo->QSEL)); __FUNCTION__, pTxInfo->QSEL));
DBGPRINT(RT_DEBUG_ERROR, ("\tCWPos=%ld, NBPos=%ld, ENBPos=%ld, bCopy=%d!\n", DBGPRINT(RT_DEBUG_ERROR,
pHTTXContext->CurWritePosition, pHTTXContext->NextBulkOutPosition, ("\tCWPos=%ld, NBPos=%ld, ENBPos=%ld, bCopy=%d!\n",
pHTTXContext->ENextBulkOutPosition, pHTTXContext->bCopySavePad)); pHTTXContext->CurWritePosition,
hex_dump("Wrong QSel Pkt:", (PUCHAR)&pWirelessPkt[TmpBulkEndPos], (pHTTXContext->CurWritePosition - pHTTXContext->NextBulkOutPosition)); pHTTXContext->NextBulkOutPosition,
pHTTXContext->ENextBulkOutPosition,
pHTTXContext->bCopySavePad));
hex_dump("Wrong QSel Pkt:",
(PUCHAR) & pWirelessPkt[TmpBulkEndPos],
(pHTTXContext->CurWritePosition -
pHTTXContext->NextBulkOutPosition));
} }
if (pTxInfo->USBDMATxPktLen <= 8) if (pTxInfo->USBDMATxPktLen <= 8) {
{ BULK_OUT_UNLOCK(&pAd->TxContextQueueLock[BulkOutPipeId],
BULK_OUT_UNLOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags2); IrqFlags2);
DBGPRINT(RT_DEBUG_ERROR /*RT_DEBUG_TRACE*/,("e2, USBDMATxPktLen==0, Size=%ld, bCSPad=%d, CWPos=%ld, NBPos=%ld, CWRPos=%ld!\n", DBGPRINT(RT_DEBUG_ERROR /*RT_DEBUG_TRACE */ ,
pHTTXContext->BulkOutSize, pHTTXContext->bCopySavePad, pHTTXContext->CurWritePosition, pHTTXContext->NextBulkOutPosition, pHTTXContext->CurWriteRealPos)); ("e2, USBDMATxPktLen==0, Size=%ld, bCSPad=%d, CWPos=%ld, NBPos=%ld, CWRPos=%ld!\n",
pHTTXContext->BulkOutSize,
pHTTXContext->bCopySavePad,
pHTTXContext->CurWritePosition,
pHTTXContext->NextBulkOutPosition,
pHTTXContext->CurWriteRealPos));
{ {
DBGPRINT_RAW(RT_DEBUG_ERROR /*RT_DEBUG_TRACE*/,("%x %x %x %x %x %x %x %x \n", DBGPRINT_RAW(RT_DEBUG_ERROR /*RT_DEBUG_TRACE */
pHTTXContext->SavedPad[0], pHTTXContext->SavedPad[1], pHTTXContext->SavedPad[2],pHTTXContext->SavedPad[3] ,
,pHTTXContext->SavedPad[4], pHTTXContext->SavedPad[5], pHTTXContext->SavedPad[6],pHTTXContext->SavedPad[7])); ("%x %x %x %x %x %x %x %x \n",
pHTTXContext->SavedPad[0],
pHTTXContext->SavedPad[1],
pHTTXContext->SavedPad[2],
pHTTXContext->SavedPad[3]
, pHTTXContext->SavedPad[4],
pHTTXContext->SavedPad[5],
pHTTXContext->SavedPad[6],
pHTTXContext->SavedPad[7]));
} }
pAd->bForcePrintTX = TRUE; pAd->bForcePrintTX = TRUE;
BULK_OUT_LOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags); BULK_OUT_LOCK(&pAd->BulkOutLock[BulkOutPipeId],
IrqFlags);
pAd->BulkOutPending[BulkOutPipeId] = FALSE; pAd->BulkOutPending[BulkOutPipeId] = FALSE;
BULK_OUT_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags); BULK_OUT_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId],
IrqFlags);
//DBGPRINT(RT_DEBUG_LOUD,("Out:pTxInfo->USBDMATxPktLen=%d!\n", pTxInfo->USBDMATxPktLen)); //DBGPRINT(RT_DEBUG_LOUD,("Out:pTxInfo->USBDMATxPktLen=%d!\n", pTxInfo->USBDMATxPktLen));
return; return;
} }
// Increase Total transmit byte counter // Increase Total transmit byte counter
pAd->RalinkCounters.OneSecTransmittedByteCount += pTxWI->MPDUtotalByteCount; pAd->RalinkCounters.OneSecTransmittedByteCount +=
pAd->RalinkCounters.TransmittedByteCount += pTxWI->MPDUtotalByteCount; pTxWI->MPDUtotalByteCount;
pAd->RalinkCounters.TransmittedByteCount +=
pTxWI->MPDUtotalByteCount;
pLastTxInfo = pTxInfo; pLastTxInfo = pTxInfo;
// Make sure we use EDCA QUEUE. // Make sure we use EDCA QUEUE.
pTxInfo->QSEL = FIFO_EDCA; pTxInfo->QSEL = FIFO_EDCA;
ThisBulkSize += (pTxInfo->USBDMATxPktLen+4); ThisBulkSize += (pTxInfo->USBDMATxPktLen + 4);
TmpBulkEndPos += (pTxInfo->USBDMATxPktLen+4); TmpBulkEndPos += (pTxInfo->USBDMATxPktLen + 4);
if (TmpBulkEndPos != pHTTXContext->CurWritePosition) if (TmpBulkEndPos != pHTTXContext->CurWritePosition)
pTxInfo->USBDMANextVLD = 1; pTxInfo->USBDMANextVLD = 1;
if (pTxInfo->SwUseLastRound == 1) if (pTxInfo->SwUseLastRound == 1) {
{
if (pHTTXContext->CurWritePosition == 8) if (pHTTXContext->CurWritePosition == 8)
pTxInfo->USBDMANextVLD = 0; pTxInfo->USBDMANextVLD = 0;
pTxInfo->SwUseLastRound = 0; pTxInfo->SwUseLastRound = 0;
...@@ -371,16 +395,13 @@ VOID RTUSBBulkOutDataPacket( ...@@ -371,16 +395,13 @@ VOID RTUSBBulkOutDataPacket(
bTxQLastRound = TRUE; bTxQLastRound = TRUE;
pHTTXContext->ENextBulkOutPosition = 8; pHTTXContext->ENextBulkOutPosition = 8;
break; break;
} }
} while (TRUE);
}while (TRUE);
// adjust the pTxInfo->USBDMANextVLD value of last pTxInfo. // adjust the pTxInfo->USBDMANextVLD value of last pTxInfo.
if (pLastTxInfo) if (pLastTxInfo) {
{
pLastTxInfo->USBDMANextVLD = 0; pLastTxInfo->USBDMANextVLD = 0;
} }
...@@ -396,27 +417,45 @@ VOID RTUSBBulkOutDataPacket( ...@@ -396,27 +417,45 @@ VOID RTUSBBulkOutDataPacket(
=>(ENextBulkOutPosition != CurWritePosition) =>(ENextBulkOutPosition != CurWritePosition)
*/ */
if ((bTxQLastRound == FALSE) && if ((bTxQLastRound == FALSE) &&
(((pHTTXContext->ENextBulkOutPosition == pHTTXContext->CurWritePosition) && (pHTTXContext->CurWriteRealPos > pHTTXContext->CurWritePosition)) || (((pHTTXContext->ENextBulkOutPosition ==
(pHTTXContext->ENextBulkOutPosition != pHTTXContext->CurWritePosition)) pHTTXContext->CurWritePosition)
) && (pHTTXContext->CurWriteRealPos >
{ pHTTXContext->CurWritePosition))
NdisMoveMemory(pHTTXContext->SavedPad, &pWirelessPkt[pHTTXContext->ENextBulkOutPosition], 8); || (pHTTXContext->ENextBulkOutPosition !=
pHTTXContext->CurWritePosition))
) {
NdisMoveMemory(pHTTXContext->SavedPad,
&pWirelessPkt[pHTTXContext->
ENextBulkOutPosition], 8);
pHTTXContext->bCopySavePad = TRUE; pHTTXContext->bCopySavePad = TRUE;
if (RTMPEqualMemory(pHTTXContext->SavedPad, allzero,4)) if (RTMPEqualMemory(pHTTXContext->SavedPad, allzero, 4)) {
{
PUCHAR pBuf = &pHTTXContext->SavedPad[0]; PUCHAR pBuf = &pHTTXContext->SavedPad[0];
DBGPRINT_RAW(RT_DEBUG_ERROR,("WARNING-Zero-3:%02x%02x%02x%02x%02x%02x%02x%02x,CWPos=%ld, CWRPos=%ld, bCW=%d, NBPos=%ld, TBPos=%ld, TBSize=%ld\n", DBGPRINT_RAW(RT_DEBUG_ERROR,
pBuf[0], pBuf[1], pBuf[2],pBuf[3],pBuf[4], pBuf[5], pBuf[6],pBuf[7], pHTTXContext->CurWritePosition, pHTTXContext->CurWriteRealPos, ("WARNING-Zero-3:%02x%02x%02x%02x%02x%02x%02x%02x,CWPos=%ld, CWRPos=%ld, bCW=%d, NBPos=%ld, TBPos=%ld, TBSize=%ld\n",
pHTTXContext->bCurWriting, pHTTXContext->NextBulkOutPosition, TmpBulkEndPos, ThisBulkSize)); pBuf[0], pBuf[1], pBuf[2], pBuf[3],
pBuf[4], pBuf[5], pBuf[6], pBuf[7],
pHTTXContext->CurWritePosition,
pHTTXContext->CurWriteRealPos,
pHTTXContext->bCurWriting,
pHTTXContext->NextBulkOutPosition,
TmpBulkEndPos, ThisBulkSize));
pBuf = &pWirelessPkt[pHTTXContext->CurWritePosition]; pBuf = &pWirelessPkt[pHTTXContext->CurWritePosition];
DBGPRINT_RAW(RT_DEBUG_ERROR,("\tCWPos=%02x%02x%02x%02x%02x%02x%02x%02x\n", pBuf[0], pBuf[1], pBuf[2],pBuf[3],pBuf[4], pBuf[5], pBuf[6],pBuf[7])); DBGPRINT_RAW(RT_DEBUG_ERROR,
("\tCWPos=%02x%02x%02x%02x%02x%02x%02x%02x\n",
pBuf[0], pBuf[1], pBuf[2], pBuf[3],
pBuf[4], pBuf[5], pBuf[6], pBuf[7]));
} }
//DBGPRINT(RT_DEBUG_LOUD,("ENPos==CWPos=%ld, CWRPos=%ld, bCSPad=%d!\n", pHTTXContext->CurWritePosition, pHTTXContext->CurWriteRealPos, pHTTXContext->bCopySavePad)); //DBGPRINT(RT_DEBUG_LOUD,("ENPos==CWPos=%ld, CWRPos=%ld, bCSPad=%d!\n", pHTTXContext->CurWritePosition, pHTTXContext->CurWriteRealPos, pHTTXContext->bCopySavePad));
} }
if (pAd->bForcePrintTX == TRUE) if (pAd->bForcePrintTX == TRUE)
DBGPRINT(RT_DEBUG_TRACE,("BulkOut-A:Size=%ld, CWPos=%ld, NBPos=%ld, ENBPos=%ld, bCopy=%d!\n", ThisBulkSize, pHTTXContext->CurWritePosition, pHTTXContext->NextBulkOutPosition, pHTTXContext->ENextBulkOutPosition, pHTTXContext->bCopySavePad)); DBGPRINT(RT_DEBUG_TRACE,
("BulkOut-A:Size=%ld, CWPos=%ld, NBPos=%ld, ENBPos=%ld, bCopy=%d!\n",
ThisBulkSize, pHTTXContext->CurWritePosition,
pHTTXContext->NextBulkOutPosition,
pHTTXContext->ENextBulkOutPosition,
pHTTXContext->bCopySavePad));
//DBGPRINT(RT_DEBUG_LOUD,("BulkOut-A:Size=%ld, CWPos=%ld, CWRPos=%ld, NBPos=%ld, ENBPos=%ld, bCopy=%d, bLRound=%d!\n", ThisBulkSize, pHTTXContext->CurWritePosition, pHTTXContext->CurWriteRealPos, pHTTXContext->NextBulkOutPosition, pHTTXContext->ENextBulkOutPosition, pHTTXContext->bCopySavePad, bTxQLastRound)); //DBGPRINT(RT_DEBUG_LOUD,("BulkOut-A:Size=%ld, CWPos=%ld, CWRPos=%ld, NBPos=%ld, ENBPos=%ld, bCopy=%d, bLRound=%d!\n", ThisBulkSize, pHTTXContext->CurWritePosition, pHTTXContext->CurWriteRealPos, pHTTXContext->NextBulkOutPosition, pHTTXContext->ENextBulkOutPosition, pHTTXContext->bCopySavePad, bTxQLastRound));
// USB DMA engine requires to pad extra 4 bytes. This pad doesn't count into real bulkoutsize. // USB DMA engine requires to pad extra 4 bytes. This pad doesn't count into real bulkoutsize.
...@@ -432,12 +471,14 @@ VOID RTUSBBulkOutDataPacket( ...@@ -432,12 +471,14 @@ VOID RTUSBBulkOutDataPacket(
BULK_OUT_UNLOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags2); BULK_OUT_UNLOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags2);
// Init Tx context descriptor // Init Tx context descriptor
RTUSBInitHTTxDesc(pAd, pHTTXContext, BulkOutPipeId, ThisBulkSize, (usb_complete_t)RTUSBBulkOutDataPacketComplete); RTUSBInitHTTxDesc(pAd, pHTTXContext, BulkOutPipeId, ThisBulkSize,
(usb_complete_t) RTUSBBulkOutDataPacketComplete);
pUrb = pHTTXContext->pUrb; pUrb = pHTTXContext->pUrb;
if((ret = RTUSB_SUBMIT_URB(pUrb))!=0) if ((ret = RTUSB_SUBMIT_URB(pUrb)) != 0) {
{ DBGPRINT(RT_DEBUG_ERROR,
DBGPRINT(RT_DEBUG_ERROR, ("RTUSBBulkOutDataPacket: Submit Tx URB failed %d\n", ret)); ("RTUSBBulkOutDataPacket: Submit Tx URB failed %d\n",
ret));
BULK_OUT_LOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags); BULK_OUT_LOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
pAd->BulkOutPending[BulkOutPipeId] = FALSE; pAd->BulkOutPending[BulkOutPipeId] = FALSE;
...@@ -454,16 +495,14 @@ VOID RTUSBBulkOutDataPacket( ...@@ -454,16 +495,14 @@ VOID RTUSBBulkOutDataPacket(
} }
VOID RTUSBBulkOutDataPacketComplete(purbb_t pUrb, struct pt_regs * pt_regs)
VOID RTUSBBulkOutDataPacketComplete(purbb_t pUrb, struct pt_regs *pt_regs)
{ {
PHT_TX_CONTEXT pHTTXContext; PHT_TX_CONTEXT pHTTXContext;
PRTMP_ADAPTER pAd; PRTMP_ADAPTER pAd;
POS_COOKIE pObj; POS_COOKIE pObj;
UCHAR BulkOutPipeId; UCHAR BulkOutPipeId;
pHTTXContext = (PHT_TX_CONTEXT) pUrb->context;
pHTTXContext = (PHT_TX_CONTEXT)pUrb->context;
pAd = pHTTXContext->pAd; pAd = pHTTXContext->pAd;
pObj = (POS_COOKIE) pAd->OS_Cookie; pObj = (POS_COOKIE) pAd->OS_Cookie;
...@@ -471,8 +510,7 @@ VOID RTUSBBulkOutDataPacketComplete(purbb_t pUrb, struct pt_regs *pt_regs) ...@@ -471,8 +510,7 @@ VOID RTUSBBulkOutDataPacketComplete(purbb_t pUrb, struct pt_regs *pt_regs)
BulkOutPipeId = pHTTXContext->BulkOutPipeId; BulkOutPipeId = pHTTXContext->BulkOutPipeId;
pAd->BulkOutDataOneSecCount++; pAd->BulkOutDataOneSecCount++;
switch (BulkOutPipeId) switch (BulkOutPipeId) {
{
case 0: case 0:
pObj->ac0_dma_done_task.data = (unsigned long)pUrb; pObj->ac0_dma_done_task.data = (unsigned long)pUrb;
tasklet_hi_schedule(&pObj->ac0_dma_done_task); tasklet_hi_schedule(&pObj->ac0_dma_done_task);
...@@ -491,10 +529,8 @@ VOID RTUSBBulkOutDataPacketComplete(purbb_t pUrb, struct pt_regs *pt_regs) ...@@ -491,10 +529,8 @@ VOID RTUSBBulkOutDataPacketComplete(purbb_t pUrb, struct pt_regs *pt_regs)
break; break;
} }
} }
/* /*
======================================================================== ========================================================================
...@@ -508,8 +544,7 @@ VOID RTUSBBulkOutDataPacketComplete(purbb_t pUrb, struct pt_regs *pt_regs) ...@@ -508,8 +544,7 @@ VOID RTUSBBulkOutDataPacketComplete(purbb_t pUrb, struct pt_regs *pt_regs)
======================================================================== ========================================================================
*/ */
VOID RTUSBBulkOutNullFrame( VOID RTUSBBulkOutNullFrame(IN PRTMP_ADAPTER pAd)
IN PRTMP_ADAPTER pAd)
{ {
PTX_CONTEXT pNullContext = &(pAd->NullContext); PTX_CONTEXT pNullContext = &(pAd->NullContext);
PURB pUrb; PURB pUrb;
...@@ -517,8 +552,8 @@ VOID RTUSBBulkOutNullFrame( ...@@ -517,8 +552,8 @@ VOID RTUSBBulkOutNullFrame(
unsigned long IrqFlags; unsigned long IrqFlags;
RTMP_IRQ_LOCK(&pAd->BulkOutLock[0], IrqFlags); RTMP_IRQ_LOCK(&pAd->BulkOutLock[0], IrqFlags);
if ((pAd->BulkOutPending[0] == TRUE) || RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NEED_STOP_TX)) if ((pAd->BulkOutPending[0] == TRUE)
{ || RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NEED_STOP_TX)) {
RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], IrqFlags); RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], IrqFlags);
return; return;
} }
...@@ -530,38 +565,38 @@ VOID RTUSBBulkOutNullFrame( ...@@ -530,38 +565,38 @@ VOID RTUSBBulkOutNullFrame(
// Increase Total transmit byte counter // Increase Total transmit byte counter
pAd->RalinkCounters.TransmittedByteCount += pNullContext->BulkOutSize; pAd->RalinkCounters.TransmittedByteCount += pNullContext->BulkOutSize;
// Clear Null frame bulk flag // Clear Null frame bulk flag
RTUSB_CLEAR_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NULL); RTUSB_CLEAR_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NULL);
// Init Tx context descriptor // Init Tx context descriptor
RTUSBInitTxDesc(pAd, pNullContext, 0, (usb_complete_t)RTUSBBulkOutNullFrameComplete); RTUSBInitTxDesc(pAd, pNullContext, 0,
(usb_complete_t) RTUSBBulkOutNullFrameComplete);
pUrb = pNullContext->pUrb; pUrb = pNullContext->pUrb;
if((ret = RTUSB_SUBMIT_URB(pUrb))!=0) if ((ret = RTUSB_SUBMIT_URB(pUrb)) != 0) {
{
RTMP_IRQ_LOCK(&pAd->BulkOutLock[0], IrqFlags); RTMP_IRQ_LOCK(&pAd->BulkOutLock[0], IrqFlags);
pAd->BulkOutPending[0] = FALSE; pAd->BulkOutPending[0] = FALSE;
pAd->watchDogTxPendingCnt[0] = 0; pAd->watchDogTxPendingCnt[0] = 0;
pNullContext->IRPPending = FALSE; pNullContext->IRPPending = FALSE;
RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], IrqFlags); RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], IrqFlags);
DBGPRINT(RT_DEBUG_ERROR, ("RTUSBBulkOutNullFrame: Submit Tx URB failed %d\n", ret)); DBGPRINT(RT_DEBUG_ERROR,
("RTUSBBulkOutNullFrame: Submit Tx URB failed %d\n",
ret));
return; return;
} }
} }
// NULL frame use BulkOutPipeId = 0 // NULL frame use BulkOutPipeId = 0
VOID RTUSBBulkOutNullFrameComplete(purbb_t pUrb, struct pt_regs *pt_regs) VOID RTUSBBulkOutNullFrameComplete(purbb_t pUrb, struct pt_regs * pt_regs)
{ {
PRTMP_ADAPTER pAd; PRTMP_ADAPTER pAd;
PTX_CONTEXT pNullContext; PTX_CONTEXT pNullContext;
NTSTATUS Status; NTSTATUS Status;
POS_COOKIE pObj; POS_COOKIE pObj;
pNullContext = (PTX_CONTEXT) pUrb->context;
pNullContext = (PTX_CONTEXT)pUrb->context;
pAd = pNullContext->pAd; pAd = pNullContext->pAd;
Status = pUrb->status; Status = pUrb->status;
...@@ -583,23 +618,20 @@ VOID RTUSBBulkOutNullFrameComplete(purbb_t pUrb, struct pt_regs *pt_regs) ...@@ -583,23 +618,20 @@ VOID RTUSBBulkOutNullFrameComplete(purbb_t pUrb, struct pt_regs *pt_regs)
======================================================================== ========================================================================
*/ */
VOID RTUSBBulkOutMLMEPacket( VOID RTUSBBulkOutMLMEPacket(IN PRTMP_ADAPTER pAd, IN UCHAR Index)
IN PRTMP_ADAPTER pAd,
IN UCHAR Index)
{ {
PTX_CONTEXT pMLMEContext; PTX_CONTEXT pMLMEContext;
PURB pUrb; PURB pUrb;
int ret = 0; int ret = 0;
unsigned long IrqFlags; unsigned long IrqFlags;
pMLMEContext = (PTX_CONTEXT)pAd->MgmtRing.Cell[pAd->MgmtRing.TxDmaIdx].AllocVa; pMLMEContext =
(PTX_CONTEXT) pAd->MgmtRing.Cell[pAd->MgmtRing.TxDmaIdx].AllocVa;
pUrb = pMLMEContext->pUrb; pUrb = pMLMEContext->pUrb;
if ((pAd->MgmtRing.TxSwFreeIdx >= MGMT_RING_SIZE) || if ((pAd->MgmtRing.TxSwFreeIdx >= MGMT_RING_SIZE) ||
(pMLMEContext->InUse == FALSE) || (pMLMEContext->InUse == FALSE) ||
(pMLMEContext->bWaitingBulkOut == FALSE)) (pMLMEContext->bWaitingBulkOut == FALSE)) {
{
// Clear MLME bulk flag // Clear MLME bulk flag
RTUSB_CLEAR_BULK_FLAG(pAd, fRTUSB_BULK_OUT_MLME); RTUSB_CLEAR_BULK_FLAG(pAd, fRTUSB_BULK_OUT_MLME);
...@@ -607,10 +639,9 @@ VOID RTUSBBulkOutMLMEPacket( ...@@ -607,10 +639,9 @@ VOID RTUSBBulkOutMLMEPacket(
return; return;
} }
RTMP_IRQ_LOCK(&pAd->BulkOutLock[MGMTPIPEIDX], IrqFlags); RTMP_IRQ_LOCK(&pAd->BulkOutLock[MGMTPIPEIDX], IrqFlags);
if ((pAd->BulkOutPending[MGMTPIPEIDX] == TRUE) || RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NEED_STOP_TX)) if ((pAd->BulkOutPending[MGMTPIPEIDX] == TRUE)
{ || RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NEED_STOP_TX)) {
RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[MGMTPIPEIDX], IrqFlags); RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[MGMTPIPEIDX], IrqFlags);
return; return;
} }
...@@ -628,16 +659,18 @@ VOID RTUSBBulkOutMLMEPacket( ...@@ -628,16 +659,18 @@ VOID RTUSBBulkOutMLMEPacket(
RTUSB_CLEAR_BULK_FLAG(pAd, fRTUSB_BULK_OUT_MLME); RTUSB_CLEAR_BULK_FLAG(pAd, fRTUSB_BULK_OUT_MLME);
// Init Tx context descriptor // Init Tx context descriptor
RTUSBInitTxDesc(pAd, pMLMEContext, MGMTPIPEIDX, (usb_complete_t)RTUSBBulkOutMLMEPacketComplete); RTUSBInitTxDesc(pAd, pMLMEContext, MGMTPIPEIDX,
(usb_complete_t) RTUSBBulkOutMLMEPacketComplete);
//For mgmt urb buffer, because we use sk_buff, so we need to notify the USB controller do dma mapping. //For mgmt urb buffer, because we use sk_buff, so we need to notify the USB controller do dma mapping.
pUrb->transfer_dma = 0; pUrb->transfer_dma = 0;
pUrb->transfer_flags &= (~URB_NO_TRANSFER_DMA_MAP); pUrb->transfer_flags &= (~URB_NO_TRANSFER_DMA_MAP);
pUrb = pMLMEContext->pUrb; pUrb = pMLMEContext->pUrb;
if((ret = RTUSB_SUBMIT_URB(pUrb))!=0) if ((ret = RTUSB_SUBMIT_URB(pUrb)) != 0) {
{ DBGPRINT(RT_DEBUG_ERROR,
DBGPRINT(RT_DEBUG_ERROR, ("RTUSBBulkOutMLMEPacket: Submit MLME URB failed %d\n", ret)); ("RTUSBBulkOutMLMEPacket: Submit MLME URB failed %d\n",
ret));
RTMP_IRQ_LOCK(&pAd->BulkOutLock[MGMTPIPEIDX], IrqFlags); RTMP_IRQ_LOCK(&pAd->BulkOutLock[MGMTPIPEIDX], IrqFlags);
pAd->BulkOutPending[MGMTPIPEIDX] = FALSE; pAd->BulkOutPending[MGMTPIPEIDX] = FALSE;
pAd->watchDogTxPendingCnt[MGMTPIPEIDX] = 0; pAd->watchDogTxPendingCnt[MGMTPIPEIDX] = 0;
...@@ -647,13 +680,11 @@ VOID RTUSBBulkOutMLMEPacket( ...@@ -647,13 +680,11 @@ VOID RTUSBBulkOutMLMEPacket(
return; return;
} }
//DBGPRINT_RAW(RT_DEBUG_INFO, ("<---RTUSBBulkOutMLMEPacket \n")); //DBGPRINT_RAW(RT_DEBUG_INFO, ("<---RTUSBBulkOutMLMEPacket \n"));
// printk("<---RTUSBBulkOutMLMEPacket,Cpu=%d!, Dma=%d, SwIdx=%d!\n", pAd->MgmtRing.TxCpuIdx, pAd->MgmtRing.TxDmaIdx, pAd->MgmtRing.TxSwFreeIdx); // printk("<---RTUSBBulkOutMLMEPacket,Cpu=%d!, Dma=%d, SwIdx=%d!\n", pAd->MgmtRing.TxCpuIdx, pAd->MgmtRing.TxDmaIdx, pAd->MgmtRing.TxSwFreeIdx);
} }
VOID RTUSBBulkOutMLMEPacketComplete(purbb_t pUrb, struct pt_regs * pt_regs)
VOID RTUSBBulkOutMLMEPacketComplete(purbb_t pUrb, struct pt_regs *pt_regs)
{ {
PTX_CONTEXT pMLMEContext; PTX_CONTEXT pMLMEContext;
PRTMP_ADAPTER pAd; PRTMP_ADAPTER pAd;
...@@ -662,9 +693,9 @@ VOID RTUSBBulkOutMLMEPacketComplete(purbb_t pUrb, struct pt_regs *pt_regs) ...@@ -662,9 +693,9 @@ VOID RTUSBBulkOutMLMEPacketComplete(purbb_t pUrb, struct pt_regs *pt_regs)
int index; int index;
//DBGPRINT_RAW(RT_DEBUG_INFO, ("--->RTUSBBulkOutMLMEPacketComplete\n")); //DBGPRINT_RAW(RT_DEBUG_INFO, ("--->RTUSBBulkOutMLMEPacketComplete\n"));
pMLMEContext = (PTX_CONTEXT)pUrb->context; pMLMEContext = (PTX_CONTEXT) pUrb->context;
pAd = pMLMEContext->pAd; pAd = pMLMEContext->pAd;
pObj = (POS_COOKIE)pAd->OS_Cookie; pObj = (POS_COOKIE) pAd->OS_Cookie;
Status = pUrb->status; Status = pUrb->status;
index = pMLMEContext->SelfIdx; index = pMLMEContext->SelfIdx;
...@@ -672,7 +703,6 @@ VOID RTUSBBulkOutMLMEPacketComplete(purbb_t pUrb, struct pt_regs *pt_regs) ...@@ -672,7 +703,6 @@ VOID RTUSBBulkOutMLMEPacketComplete(purbb_t pUrb, struct pt_regs *pt_regs)
tasklet_hi_schedule(&pObj->mgmt_dma_done_task); tasklet_hi_schedule(&pObj->mgmt_dma_done_task);
} }
/* /*
======================================================================== ========================================================================
...@@ -686,8 +716,7 @@ VOID RTUSBBulkOutMLMEPacketComplete(purbb_t pUrb, struct pt_regs *pt_regs) ...@@ -686,8 +716,7 @@ VOID RTUSBBulkOutMLMEPacketComplete(purbb_t pUrb, struct pt_regs *pt_regs)
======================================================================== ========================================================================
*/ */
VOID RTUSBBulkOutPsPoll( VOID RTUSBBulkOutPsPoll(IN PRTMP_ADAPTER pAd)
IN PRTMP_ADAPTER pAd)
{ {
PTX_CONTEXT pPsPollContext = &(pAd->PsPollContext); PTX_CONTEXT pPsPollContext = &(pAd->PsPollContext);
PURB pUrb; PURB pUrb;
...@@ -695,8 +724,8 @@ VOID RTUSBBulkOutPsPoll( ...@@ -695,8 +724,8 @@ VOID RTUSBBulkOutPsPoll(
unsigned long IrqFlags; unsigned long IrqFlags;
RTMP_IRQ_LOCK(&pAd->BulkOutLock[0], IrqFlags); RTMP_IRQ_LOCK(&pAd->BulkOutLock[0], IrqFlags);
if ((pAd->BulkOutPending[0] == TRUE) || RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NEED_STOP_TX)) if ((pAd->BulkOutPending[0] == TRUE)
{ || RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NEED_STOP_TX)) {
RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], IrqFlags); RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], IrqFlags);
return; return;
} }
...@@ -705,38 +734,38 @@ VOID RTUSBBulkOutPsPoll( ...@@ -705,38 +734,38 @@ VOID RTUSBBulkOutPsPoll(
pPsPollContext->IRPPending = TRUE; pPsPollContext->IRPPending = TRUE;
RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], IrqFlags); RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], IrqFlags);
// Clear PS-Poll bulk flag // Clear PS-Poll bulk flag
RTUSB_CLEAR_BULK_FLAG(pAd, fRTUSB_BULK_OUT_PSPOLL); RTUSB_CLEAR_BULK_FLAG(pAd, fRTUSB_BULK_OUT_PSPOLL);
// Init Tx context descriptor // Init Tx context descriptor
RTUSBInitTxDesc(pAd, pPsPollContext, MGMTPIPEIDX, (usb_complete_t)RTUSBBulkOutPsPollComplete); RTUSBInitTxDesc(pAd, pPsPollContext, MGMTPIPEIDX,
(usb_complete_t) RTUSBBulkOutPsPollComplete);
pUrb = pPsPollContext->pUrb; pUrb = pPsPollContext->pUrb;
if((ret = RTUSB_SUBMIT_URB(pUrb))!=0) if ((ret = RTUSB_SUBMIT_URB(pUrb)) != 0) {
{
RTMP_IRQ_LOCK(&pAd->BulkOutLock[0], IrqFlags); RTMP_IRQ_LOCK(&pAd->BulkOutLock[0], IrqFlags);
pAd->BulkOutPending[0] = FALSE; pAd->BulkOutPending[0] = FALSE;
pAd->watchDogTxPendingCnt[0] = 0; pAd->watchDogTxPendingCnt[0] = 0;
pPsPollContext->IRPPending = FALSE; pPsPollContext->IRPPending = FALSE;
RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], IrqFlags); RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], IrqFlags);
DBGPRINT(RT_DEBUG_ERROR, ("RTUSBBulkOutPsPoll: Submit Tx URB failed %d\n", ret)); DBGPRINT(RT_DEBUG_ERROR,
("RTUSBBulkOutPsPoll: Submit Tx URB failed %d\n",
ret));
return; return;
} }
} }
// PS-Poll frame use BulkOutPipeId = 0 // PS-Poll frame use BulkOutPipeId = 0
VOID RTUSBBulkOutPsPollComplete(purbb_t pUrb,struct pt_regs *pt_regs) VOID RTUSBBulkOutPsPollComplete(purbb_t pUrb, struct pt_regs * pt_regs)
{ {
PRTMP_ADAPTER pAd; PRTMP_ADAPTER pAd;
PTX_CONTEXT pPsPollContext; PTX_CONTEXT pPsPollContext;
NTSTATUS Status; NTSTATUS Status;
POS_COOKIE pObj; POS_COOKIE pObj;
pPsPollContext = (PTX_CONTEXT) pUrb->context;
pPsPollContext= (PTX_CONTEXT)pUrb->context;
pAd = pPsPollContext->pAd; pAd = pPsPollContext->pAd;
Status = pUrb->status; Status = pUrb->status;
...@@ -745,7 +774,7 @@ VOID RTUSBBulkOutPsPollComplete(purbb_t pUrb,struct pt_regs *pt_regs) ...@@ -745,7 +774,7 @@ VOID RTUSBBulkOutPsPollComplete(purbb_t pUrb,struct pt_regs *pt_regs)
tasklet_hi_schedule(&pObj->pspoll_frame_complete_task); tasklet_hi_schedule(&pObj->pspoll_frame_complete_task);
} }
VOID DoBulkIn(IN RTMP_ADAPTER *pAd) VOID DoBulkIn(IN RTMP_ADAPTER * pAd)
{ {
PRX_CONTEXT pRxContext; PRX_CONTEXT pRxContext;
PURB pUrb; PURB pUrb;
...@@ -754,8 +783,8 @@ VOID DoBulkIn(IN RTMP_ADAPTER *pAd) ...@@ -754,8 +783,8 @@ VOID DoBulkIn(IN RTMP_ADAPTER *pAd)
RTMP_IRQ_LOCK(&pAd->BulkInLock, IrqFlags); RTMP_IRQ_LOCK(&pAd->BulkInLock, IrqFlags);
pRxContext = &(pAd->RxContext[pAd->NextRxBulkInIndex]); pRxContext = &(pAd->RxContext[pAd->NextRxBulkInIndex]);
if ((pAd->PendingRx > 0) || (pRxContext->Readable == TRUE) || (pRxContext->InUse == TRUE)) if ((pAd->PendingRx > 0) || (pRxContext->Readable == TRUE)
{ || (pRxContext->InUse == TRUE)) {
RTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags); RTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags);
return; return;
} }
...@@ -770,8 +799,7 @@ VOID DoBulkIn(IN RTMP_ADAPTER *pAd) ...@@ -770,8 +799,7 @@ VOID DoBulkIn(IN RTMP_ADAPTER *pAd)
RTUSBInitRxDesc(pAd, pRxContext); RTUSBInitRxDesc(pAd, pRxContext);
pUrb = pRxContext->pUrb; pUrb = pRxContext->pUrb;
if ((ret = RTUSB_SUBMIT_URB(pUrb))!=0) if ((ret = RTUSB_SUBMIT_URB(pUrb)) != 0) { // fail
{ // fail
RTMP_IRQ_LOCK(&pAd->BulkInLock, IrqFlags); RTMP_IRQ_LOCK(&pAd->BulkInLock, IrqFlags);
pRxContext->InUse = FALSE; pRxContext->InUse = FALSE;
...@@ -779,16 +807,14 @@ VOID DoBulkIn(IN RTMP_ADAPTER *pAd) ...@@ -779,16 +807,14 @@ VOID DoBulkIn(IN RTMP_ADAPTER *pAd)
pAd->PendingRx--; pAd->PendingRx--;
pAd->BulkInReq--; pAd->BulkInReq--;
RTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags); RTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags);
DBGPRINT(RT_DEBUG_ERROR, ("RTUSBBulkReceive: Submit Rx URB failed %d\n", ret)); DBGPRINT(RT_DEBUG_ERROR,
} ("RTUSBBulkReceive: Submit Rx URB failed %d\n", ret));
else } else { // success
{ // success
ASSERT((pRxContext->InUse == pRxContext->IRPPending)); ASSERT((pRxContext->InUse == pRxContext->IRPPending));
//printk("BIDone, Pend=%d,BIIdx=%d,BIRIdx=%d!\n", pAd->PendingRx, pAd->NextRxBulkInIndex, pAd->NextRxBulkInReadIndex); //printk("BIDone, Pend=%d,BIIdx=%d,BIRIdx=%d!\n", pAd->PendingRx, pAd->NextRxBulkInIndex, pAd->NextRxBulkInReadIndex);
} }
} }
/* /*
======================================================================== ========================================================================
...@@ -819,25 +845,22 @@ VOID DoBulkIn(IN RTMP_ADAPTER *pAd) ...@@ -819,25 +845,22 @@ VOID DoBulkIn(IN RTMP_ADAPTER *pAd)
fRTMP_ADAPTER_RADIO_OFF | fRTMP_ADAPTER_RESET_IN_PROGRESS | \ fRTMP_ADAPTER_RADIO_OFF | fRTMP_ADAPTER_RESET_IN_PROGRESS | \
fRTMP_ADAPTER_REMOVE_IN_PROGRESS) fRTMP_ADAPTER_REMOVE_IN_PROGRESS)
VOID RTUSBBulkReceive( VOID RTUSBBulkReceive(IN PRTMP_ADAPTER pAd)
IN PRTMP_ADAPTER pAd)
{ {
PRX_CONTEXT pRxContext; PRX_CONTEXT pRxContext;
unsigned long IrqFlags; unsigned long IrqFlags;
/* sanity check */ /* sanity check */
if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NEED_STOP_HANDLE_RX)) if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NEED_STOP_HANDLE_RX))
return; return;
while(1) while (1) {
{
RTMP_IRQ_LOCK(&pAd->BulkInLock, IrqFlags); RTMP_IRQ_LOCK(&pAd->BulkInLock, IrqFlags);
pRxContext = &(pAd->RxContext[pAd->NextRxBulkInReadIndex]); pRxContext = &(pAd->RxContext[pAd->NextRxBulkInReadIndex]);
if (((pRxContext->InUse == FALSE) && (pRxContext->Readable == TRUE)) && if (((pRxContext->InUse == FALSE)
(pRxContext->bRxHandling == FALSE)) && (pRxContext->Readable == TRUE))
{ && (pRxContext->bRxHandling == FALSE)) {
pRxContext->bRxHandling = TRUE; pRxContext->bRxHandling = TRUE;
RTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags); RTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags);
...@@ -851,12 +874,11 @@ VOID RTUSBBulkReceive( ...@@ -851,12 +874,11 @@ VOID RTUSBBulkReceive(
pRxContext->bRxHandling = FALSE; pRxContext->bRxHandling = FALSE;
pAd->ReadPosition = 0; pAd->ReadPosition = 0;
pAd->TransferBufferLength = 0; pAd->TransferBufferLength = 0;
INC_RING_INDEX(pAd->NextRxBulkInReadIndex, RX_RING_SIZE); INC_RING_INDEX(pAd->NextRxBulkInReadIndex,
RX_RING_SIZE);
RTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags); RTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags);
} } else {
else
{
RTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags); RTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags);
break; break;
} }
...@@ -867,7 +889,6 @@ VOID RTUSBBulkReceive( ...@@ -867,7 +889,6 @@ VOID RTUSBBulkReceive(
} }
/* /*
======================================================================== ========================================================================
...@@ -900,8 +921,7 @@ VOID RTUSBBulkRxComplete(purbb_t pUrb, struct pt_regs *pt_regs) ...@@ -900,8 +921,7 @@ VOID RTUSBBulkRxComplete(purbb_t pUrb, struct pt_regs *pt_regs)
PRTMP_ADAPTER pAd; PRTMP_ADAPTER pAd;
POS_COOKIE pObj; POS_COOKIE pObj;
pRxContext = (PRX_CONTEXT) pUrb->context;
pRxContext = (PRX_CONTEXT)pUrb->context;
pAd = pRxContext->pAd; pAd = pRxContext->pAd;
pObj = (POS_COOKIE) pAd->OS_Cookie; pObj = (POS_COOKIE) pAd->OS_Cookie;
...@@ -910,8 +930,6 @@ VOID RTUSBBulkRxComplete(purbb_t pUrb, struct pt_regs *pt_regs) ...@@ -910,8 +930,6 @@ VOID RTUSBBulkRxComplete(purbb_t pUrb, struct pt_regs *pt_regs)
} }
/* /*
======================================================================== ========================================================================
...@@ -925,76 +943,78 @@ VOID RTUSBBulkRxComplete(purbb_t pUrb, struct pt_regs *pt_regs) ...@@ -925,76 +943,78 @@ VOID RTUSBBulkRxComplete(purbb_t pUrb, struct pt_regs *pt_regs)
======================================================================== ========================================================================
*/ */
VOID RTUSBKickBulkOut( VOID RTUSBKickBulkOut(IN PRTMP_ADAPTER pAd)
IN PRTMP_ADAPTER pAd)
{ {
// BulkIn Reset will reset whole USB PHY. So we need to make sure fRTMP_ADAPTER_BULKIN_RESET not flaged. // BulkIn Reset will reset whole USB PHY. So we need to make sure fRTMP_ADAPTER_BULKIN_RESET not flaged.
if (!RTMP_TEST_FLAG(pAd ,fRTMP_ADAPTER_NEED_STOP_TX) if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NEED_STOP_TX)
) ) {
{
// 2. PS-Poll frame is next // 2. PS-Poll frame is next
if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_PSPOLL)) if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_PSPOLL)) {
{
RTUSBBulkOutPsPoll(pAd); RTUSBBulkOutPsPoll(pAd);
} }
// 5. Mlme frame is next // 5. Mlme frame is next
else if ((RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_MLME)) || else if ((RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_MLME)) ||
(pAd->MgmtRing.TxSwFreeIdx < MGMT_RING_SIZE)) (pAd->MgmtRing.TxSwFreeIdx < MGMT_RING_SIZE)) {
{
RTUSBBulkOutMLMEPacket(pAd, pAd->MgmtRing.TxDmaIdx); RTUSBBulkOutMLMEPacket(pAd, pAd->MgmtRing.TxDmaIdx);
} }
// 6. Data frame normal is next // 6. Data frame normal is next
if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL)) if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL)) {
{ if (((!RTMP_TEST_FLAG
if (((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) || (pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))
(!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)) ||
)) (!OPSTATUS_TEST_FLAG
{ (pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))
RTUSBBulkOutDataPacket(pAd, 0, pAd->NextBulkOutIndex[0]); )) {
RTUSBBulkOutDataPacket(pAd, 0,
pAd->
NextBulkOutIndex[0]);
} }
} }
if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL_2)) if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL_2)) {
{ if (((!RTMP_TEST_FLAG
if (((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) || (pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))
(!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)) ||
)) (!OPSTATUS_TEST_FLAG
{ (pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))
RTUSBBulkOutDataPacket(pAd, 1, pAd->NextBulkOutIndex[1]); )) {
RTUSBBulkOutDataPacket(pAd, 1,
pAd->
NextBulkOutIndex[1]);
} }
} }
if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL_3)) if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL_3)) {
{ if (((!RTMP_TEST_FLAG
if (((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) || (pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))
(!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)) ||
)) (!OPSTATUS_TEST_FLAG
{ (pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))
RTUSBBulkOutDataPacket(pAd, 2, pAd->NextBulkOutIndex[2]); )) {
RTUSBBulkOutDataPacket(pAd, 2,
pAd->
NextBulkOutIndex[2]);
} }
} }
if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL_4)) if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL_4)) {
{ if (((!RTMP_TEST_FLAG
if (((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) || (pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))
(!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)) ||
)) (!OPSTATUS_TEST_FLAG
{ (pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))
RTUSBBulkOutDataPacket(pAd, 3, pAd->NextBulkOutIndex[3]); )) {
RTUSBBulkOutDataPacket(pAd, 3,
pAd->
NextBulkOutIndex[3]);
} }
} }
// 7. Null frame is the last // 7. Null frame is the last
else if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NULL)) else if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NULL)) {
{ if (!RTMP_TEST_FLAG
if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) (pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) {
{
RTUSBBulkOutNullFrame(pAd); RTUSBBulkOutNullFrame(pAd);
} }
} }
// 8. No data avaliable // 8. No data avaliable
else else {
{
} }
} }
...@@ -1013,16 +1033,14 @@ VOID RTUSBKickBulkOut( ...@@ -1013,16 +1033,14 @@ VOID RTUSBKickBulkOut(
======================================================================== ========================================================================
*/ */
VOID RTUSBCleanUpDataBulkOutQueue( VOID RTUSBCleanUpDataBulkOutQueue(IN PRTMP_ADAPTER pAd)
IN PRTMP_ADAPTER pAd)
{ {
UCHAR Idx; UCHAR Idx;
PHT_TX_CONTEXT pTxContext; PHT_TX_CONTEXT pTxContext;
DBGPRINT(RT_DEBUG_TRACE, ("--->CleanUpDataBulkOutQueue\n")); DBGPRINT(RT_DEBUG_TRACE, ("--->CleanUpDataBulkOutQueue\n"));
for (Idx = 0; Idx < 4; Idx++) for (Idx = 0; Idx < 4; Idx++) {
{
pTxContext = &pAd->TxContext[Idx]; pTxContext = &pAd->TxContext[Idx];
pTxContext->CurWritePosition = pTxContext->NextBulkOutPosition; pTxContext->CurWritePosition = pTxContext->NextBulkOutPosition;
...@@ -1048,14 +1066,12 @@ VOID RTUSBCleanUpDataBulkOutQueue( ...@@ -1048,14 +1066,12 @@ VOID RTUSBCleanUpDataBulkOutQueue(
======================================================================== ========================================================================
*/ */
VOID RTUSBCleanUpMLMEBulkOutQueue( VOID RTUSBCleanUpMLMEBulkOutQueue(IN PRTMP_ADAPTER pAd)
IN PRTMP_ADAPTER pAd)
{ {
DBGPRINT(RT_DEBUG_TRACE, ("--->CleanUpMLMEBulkOutQueue\n")); DBGPRINT(RT_DEBUG_TRACE, ("--->CleanUpMLMEBulkOutQueue\n"));
DBGPRINT(RT_DEBUG_TRACE, ("<---CleanUpMLMEBulkOutQueue\n")); DBGPRINT(RT_DEBUG_TRACE, ("<---CleanUpMLMEBulkOutQueue\n"));
} }
/* /*
======================================================================== ========================================================================
...@@ -1065,13 +1081,11 @@ VOID RTUSBCleanUpMLMEBulkOutQueue( ...@@ -1065,13 +1081,11 @@ VOID RTUSBCleanUpMLMEBulkOutQueue(
Return Value: Return Value:
Note: Note:
======================================================================== ========================================================================
*/ */
VOID RTUSBCancelPendingIRPs( VOID RTUSBCancelPendingIRPs(IN PRTMP_ADAPTER pAd)
IN PRTMP_ADAPTER pAd)
{ {
RTUSBCancelPendingBulkInIRP(pAd); RTUSBCancelPendingBulkInIRP(pAd);
RTUSBCancelPendingBulkOutIRP(pAd); RTUSBCancelPendingBulkOutIRP(pAd);
...@@ -1090,18 +1104,15 @@ VOID RTUSBCancelPendingIRPs( ...@@ -1090,18 +1104,15 @@ VOID RTUSBCancelPendingIRPs(
======================================================================== ========================================================================
*/ */
VOID RTUSBCancelPendingBulkInIRP( VOID RTUSBCancelPendingBulkInIRP(IN PRTMP_ADAPTER pAd)
IN PRTMP_ADAPTER pAd)
{ {
PRX_CONTEXT pRxContext; PRX_CONTEXT pRxContext;
UINT i; UINT i;
DBGPRINT_RAW(RT_DEBUG_TRACE, ("--->RTUSBCancelPendingBulkInIRP\n")); DBGPRINT_RAW(RT_DEBUG_TRACE, ("--->RTUSBCancelPendingBulkInIRP\n"));
for ( i = 0; i < (RX_RING_SIZE); i++) for (i = 0; i < (RX_RING_SIZE); i++) {
{
pRxContext = &(pAd->RxContext[i]); pRxContext = &(pAd->RxContext[i]);
if(pRxContext->IRPPending == TRUE) if (pRxContext->IRPPending == TRUE) {
{
RTUSB_UNLINK_URB(pRxContext->pUrb); RTUSB_UNLINK_URB(pRxContext->pUrb);
pRxContext->IRPPending = FALSE; pRxContext->IRPPending = FALSE;
pRxContext->InUse = FALSE; pRxContext->InUse = FALSE;
...@@ -1112,7 +1123,6 @@ VOID RTUSBCancelPendingBulkInIRP( ...@@ -1112,7 +1123,6 @@ VOID RTUSBCancelPendingBulkInIRP(
DBGPRINT_RAW(RT_DEBUG_TRACE, ("<---RTUSBCancelPendingBulkInIRP\n")); DBGPRINT_RAW(RT_DEBUG_TRACE, ("<---RTUSBCancelPendingBulkInIRP\n"));
} }
/* /*
======================================================================== ========================================================================
...@@ -1126,8 +1136,7 @@ VOID RTUSBCancelPendingBulkInIRP( ...@@ -1126,8 +1136,7 @@ VOID RTUSBCancelPendingBulkInIRP(
======================================================================== ========================================================================
*/ */
VOID RTUSBCancelPendingBulkOutIRP( VOID RTUSBCancelPendingBulkOutIRP(IN PRTMP_ADAPTER pAd)
IN PRTMP_ADAPTER pAd)
{ {
PHT_TX_CONTEXT pHTTXContext; PHT_TX_CONTEXT pHTTXContext;
PTX_CONTEXT pMLMEContext; PTX_CONTEXT pMLMEContext;
...@@ -1140,16 +1149,13 @@ VOID RTUSBCancelPendingBulkOutIRP( ...@@ -1140,16 +1149,13 @@ VOID RTUSBCancelPendingBulkOutIRP(
// NDIS_SPIN_LOCK *pLock; // NDIS_SPIN_LOCK *pLock;
// BOOLEAN *pPending; // BOOLEAN *pPending;
// pLock = &pAd->BulkOutLock[MGMTPIPEIDX]; // pLock = &pAd->BulkOutLock[MGMTPIPEIDX];
// pPending = &pAd->BulkOutPending[MGMTPIPEIDX]; // pPending = &pAd->BulkOutPending[MGMTPIPEIDX];
for (Idx = 0; Idx < 4; Idx++) for (Idx = 0; Idx < 4; Idx++) {
{
pHTTXContext = &(pAd->TxContext[Idx]); pHTTXContext = &(pAd->TxContext[Idx]);
if (pHTTXContext->IRPPending == TRUE) if (pHTTXContext->IRPPending == TRUE) {
{
// Get the USB_CONTEXT and cancel it's IRP; the completion routine will itself // Get the USB_CONTEXT and cancel it's IRP; the completion routine will itself
// remove it from the HeadPendingSendList and NULL out HeadPendingSendList // remove it from the HeadPendingSendList and NULL out HeadPendingSendList
...@@ -1166,11 +1172,9 @@ VOID RTUSBCancelPendingBulkOutIRP( ...@@ -1166,11 +1172,9 @@ VOID RTUSBCancelPendingBulkOutIRP(
} }
//RTMP_IRQ_LOCK(pLock, IrqFlags); //RTMP_IRQ_LOCK(pLock, IrqFlags);
for (i = 0; i < MGMT_RING_SIZE; i++) for (i = 0; i < MGMT_RING_SIZE; i++) {
{ pMLMEContext = (PTX_CONTEXT) pAd->MgmtRing.Cell[i].AllocVa;
pMLMEContext = (PTX_CONTEXT)pAd->MgmtRing.Cell[i].AllocVa; if (pMLMEContext && (pMLMEContext->IRPPending == TRUE)) {
if(pMLMEContext && (pMLMEContext->IRPPending == TRUE))
{
// Get the USB_CONTEXT and cancel it's IRP; the completion routine will itself // Get the USB_CONTEXT and cancel it's IRP; the completion routine will itself
// remove it from the HeadPendingSendList and NULL out HeadPendingSendList // remove it from the HeadPendingSendList and NULL out HeadPendingSendList
...@@ -1187,13 +1191,10 @@ VOID RTUSBCancelPendingBulkOutIRP( ...@@ -1187,13 +1191,10 @@ VOID RTUSBCancelPendingBulkOutIRP(
pAd->BulkOutPending[MGMTPIPEIDX] = FALSE; pAd->BulkOutPending[MGMTPIPEIDX] = FALSE;
//RTMP_IRQ_UNLOCK(pLock, IrqFlags); //RTMP_IRQ_UNLOCK(pLock, IrqFlags);
for (i = 0; i < BEACON_RING_SIZE; i++) {
for (i = 0; i < BEACON_RING_SIZE; i++)
{
pBeaconContext = &(pAd->BeaconContext[i]); pBeaconContext = &(pAd->BeaconContext[i]);
if(pBeaconContext->IRPPending == TRUE) if (pBeaconContext->IRPPending == TRUE) {
{
// Get the USB_CONTEXT and cancel it's IRP; the completion routine will itself // Get the USB_CONTEXT and cancel it's IRP; the completion routine will itself
// remove it from the HeadPendingSendList and NULL out HeadPendingSendList // remove it from the HeadPendingSendList and NULL out HeadPendingSendList
...@@ -1219,8 +1220,7 @@ VOID RTUSBCancelPendingBulkOutIRP( ...@@ -1219,8 +1220,7 @@ VOID RTUSBCancelPendingBulkOutIRP(
if (pPsPollContext->IRPPending == TRUE) if (pPsPollContext->IRPPending == TRUE)
RTUSB_UNLINK_URB(pPsPollContext->pUrb); RTUSB_UNLINK_URB(pPsPollContext->pUrb);
for (Idx = 0; Idx < 4; Idx++) for (Idx = 0; Idx < 4; Idx++) {
{
NdisAcquireSpinLock(&pAd->BulkOutLock[Idx]); NdisAcquireSpinLock(&pAd->BulkOutLock[Idx]);
pAd->BulkOutPending[Idx] = FALSE; pAd->BulkOutPending[Idx] = FALSE;
NdisReleaseSpinLock(&pAd->BulkOutLock[Idx]); NdisReleaseSpinLock(&pAd->BulkOutLock[Idx]);
......
...@@ -39,16 +39,13 @@ ...@@ -39,16 +39,13 @@
#ifdef RTMP_MAC_USB #ifdef RTMP_MAC_USB
#include "../rt_config.h" #include "../rt_config.h"
extern UCHAR Phy11BGNextRateUpward[]; // defined in mlme.c extern UCHAR Phy11BGNextRateUpward[]; // defined in mlme.c
extern UCHAR EpToQueue[]; extern UCHAR EpToQueue[];
VOID REPORT_AMSDU_FRAMES_TO_LLC( VOID REPORT_AMSDU_FRAMES_TO_LLC(IN PRTMP_ADAPTER pAd,
IN PRTMP_ADAPTER pAd, IN PUCHAR pData, IN ULONG DataSize)
IN PUCHAR pData,
IN ULONG DataSize)
{ {
PNDIS_PACKET pPacket; PNDIS_PACKET pPacket;
UINT nMSDU; UINT nMSDU;
...@@ -57,22 +54,18 @@ VOID REPORT_AMSDU_FRAMES_TO_LLC( ...@@ -57,22 +54,18 @@ VOID REPORT_AMSDU_FRAMES_TO_LLC(
nMSDU = 0; nMSDU = 0;
/* allocate a rx packet */ /* allocate a rx packet */
pSkb = dev_alloc_skb(RX_BUFFER_AGGRESIZE); pSkb = dev_alloc_skb(RX_BUFFER_AGGRESIZE);
pPacket = (PNDIS_PACKET)OSPKT_TO_RTPKT(pSkb); pPacket = (PNDIS_PACKET) OSPKT_TO_RTPKT(pSkb);
if (pSkb) if (pSkb) {
{
/* convert 802.11 to 802.3 packet */ /* convert 802.11 to 802.3 packet */
pSkb->dev = get_netdev_from_bssid(pAd, BSS0); pSkb->dev = get_netdev_from_bssid(pAd, BSS0);
RTMP_SET_PACKET_SOURCE(pPacket, PKTSRC_NDIS); RTMP_SET_PACKET_SOURCE(pPacket, PKTSRC_NDIS);
deaggregate_AMSDU_announce(pAd, pPacket, pData, DataSize); deaggregate_AMSDU_announce(pAd, pPacket, pData, DataSize);
} } else {
else DBGPRINT(RT_DEBUG_ERROR, ("Can't allocate skb\n"));
{
DBGPRINT(RT_DEBUG_ERROR,("Can't allocate skb\n"));
} }
} }
/* /*
======================================================================== ========================================================================
...@@ -92,8 +85,7 @@ VOID REPORT_AMSDU_FRAMES_TO_LLC( ...@@ -92,8 +85,7 @@ VOID REPORT_AMSDU_FRAMES_TO_LLC(
======================================================================== ========================================================================
*/ */
NDIS_STATUS RTUSBFreeDescriptorRequest( NDIS_STATUS RTUSBFreeDescriptorRequest(IN PRTMP_ADAPTER pAd,
IN PRTMP_ADAPTER pAd,
IN UCHAR BulkOutPipeId, IN UCHAR BulkOutPipeId,
IN UINT32 NumberRequired) IN UINT32 NumberRequired)
{ {
...@@ -103,35 +95,39 @@ NDIS_STATUS RTUSBFreeDescriptorRequest( ...@@ -103,35 +95,39 @@ NDIS_STATUS RTUSBFreeDescriptorRequest(
unsigned long IrqFlags; unsigned long IrqFlags;
HT_TX_CONTEXT *pHTTXContext; HT_TX_CONTEXT *pHTTXContext;
pHTTXContext = &pAd->TxContext[BulkOutPipeId]; pHTTXContext = &pAd->TxContext[BulkOutPipeId];
RTMP_IRQ_LOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags); RTMP_IRQ_LOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags);
if ((pHTTXContext->CurWritePosition < pHTTXContext->NextBulkOutPosition) && ((pHTTXContext->CurWritePosition + NumberRequired + LOCAL_TXBUF_SIZE) > pHTTXContext->NextBulkOutPosition)) if ((pHTTXContext->CurWritePosition < pHTTXContext->NextBulkOutPosition)
{ &&
((pHTTXContext->CurWritePosition + NumberRequired +
RTUSB_SET_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_NORMAL << BulkOutPipeId)); LOCAL_TXBUF_SIZE) > pHTTXContext->NextBulkOutPosition)) {
}
else if ((pHTTXContext->CurWritePosition == 8) && (pHTTXContext->NextBulkOutPosition < (NumberRequired + LOCAL_TXBUF_SIZE))) RTUSB_SET_BULK_FLAG(pAd,
{ (fRTUSB_BULK_OUT_DATA_NORMAL <<
RTUSB_SET_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_NORMAL << BulkOutPipeId)); BulkOutPipeId));
} } else if ((pHTTXContext->CurWritePosition == 8)
else if (pHTTXContext->bCurWriting == TRUE) && (pHTTXContext->NextBulkOutPosition <
{ (NumberRequired + LOCAL_TXBUF_SIZE))) {
DBGPRINT(RT_DEBUG_TRACE,("RTUSBFreeD c3 --> QueIdx=%d, CWPos=%ld, NBOutPos=%ld!\n", BulkOutPipeId, pHTTXContext->CurWritePosition, pHTTXContext->NextBulkOutPosition)); RTUSB_SET_BULK_FLAG(pAd,
RTUSB_SET_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_NORMAL << BulkOutPipeId)); (fRTUSB_BULK_OUT_DATA_NORMAL <<
} BulkOutPipeId));
else } else if (pHTTXContext->bCurWriting == TRUE) {
{ DBGPRINT(RT_DEBUG_TRACE,
("RTUSBFreeD c3 --> QueIdx=%d, CWPos=%ld, NBOutPos=%ld!\n",
BulkOutPipeId, pHTTXContext->CurWritePosition,
pHTTXContext->NextBulkOutPosition));
RTUSB_SET_BULK_FLAG(pAd,
(fRTUSB_BULK_OUT_DATA_NORMAL <<
BulkOutPipeId));
} else {
Status = NDIS_STATUS_SUCCESS; Status = NDIS_STATUS_SUCCESS;
} }
RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags); RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags);
return (Status); return (Status);
} }
NDIS_STATUS RTUSBFreeDescriptorRelease( NDIS_STATUS RTUSBFreeDescriptorRelease(IN RTMP_ADAPTER * pAd,
IN RTMP_ADAPTER *pAd,
IN UCHAR BulkOutPipeId) IN UCHAR BulkOutPipeId)
{ {
unsigned long IrqFlags; unsigned long IrqFlags;
...@@ -145,10 +141,7 @@ NDIS_STATUS RTUSBFreeDescriptorRelease( ...@@ -145,10 +141,7 @@ NDIS_STATUS RTUSBFreeDescriptorRelease(
return (NDIS_STATUS_SUCCESS); return (NDIS_STATUS_SUCCESS);
} }
BOOLEAN RTUSBNeedQueueBackForAgg(IN RTMP_ADAPTER * pAd, IN UCHAR BulkOutPipeId)
BOOLEAN RTUSBNeedQueueBackForAgg(
IN RTMP_ADAPTER *pAd,
IN UCHAR BulkOutPipeId)
{ {
unsigned long IrqFlags; unsigned long IrqFlags;
HT_TX_CONTEXT *pHTTXContext; HT_TX_CONTEXT *pHTTXContext;
...@@ -157,16 +150,23 @@ BOOLEAN RTUSBNeedQueueBackForAgg( ...@@ -157,16 +150,23 @@ BOOLEAN RTUSBNeedQueueBackForAgg(
pHTTXContext = &pAd->TxContext[BulkOutPipeId]; pHTTXContext = &pAd->TxContext[BulkOutPipeId];
RTMP_IRQ_LOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags); RTMP_IRQ_LOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags);
if ((pHTTXContext->IRPPending == TRUE) /*&& (pAd->TxSwQueue[BulkOutPipeId].Number == 0) */) if ((pHTTXContext->IRPPending ==
{ TRUE) /*&& (pAd->TxSwQueue[BulkOutPipeId].Number == 0) */ ) {
if ((pHTTXContext->CurWritePosition < pHTTXContext->ENextBulkOutPosition) && if ((pHTTXContext->CurWritePosition <
(((pHTTXContext->ENextBulkOutPosition+MAX_AGGREGATION_SIZE) < MAX_TXBULK_LIMIT) || (pHTTXContext->CurWritePosition > MAX_AGGREGATION_SIZE))) pHTTXContext->ENextBulkOutPosition)
{ &&
(((pHTTXContext->ENextBulkOutPosition +
MAX_AGGREGATION_SIZE) < MAX_TXBULK_LIMIT)
|| (pHTTXContext->CurWritePosition >
MAX_AGGREGATION_SIZE))) {
needQueBack = TRUE; needQueBack = TRUE;
} } else
else if ((pHTTXContext->CurWritePosition > pHTTXContext->ENextBulkOutPosition) && if ((pHTTXContext->CurWritePosition >
((pHTTXContext->ENextBulkOutPosition + MAX_AGGREGATION_SIZE) < pHTTXContext->CurWritePosition)) pHTTXContext->ENextBulkOutPosition)
{ &&
((pHTTXContext->ENextBulkOutPosition +
MAX_AGGREGATION_SIZE) <
pHTTXContext->CurWritePosition)) {
needQueBack = TRUE; needQueBack = TRUE;
} }
} }
...@@ -176,7 +176,6 @@ BOOLEAN RTUSBNeedQueueBackForAgg( ...@@ -176,7 +176,6 @@ BOOLEAN RTUSBNeedQueueBackForAgg(
} }
/* /*
======================================================================== ========================================================================
...@@ -192,21 +191,17 @@ BOOLEAN RTUSBNeedQueueBackForAgg( ...@@ -192,21 +191,17 @@ BOOLEAN RTUSBNeedQueueBackForAgg(
======================================================================== ========================================================================
*/ */
VOID RTUSBRejectPendingPackets( VOID RTUSBRejectPendingPackets(IN PRTMP_ADAPTER pAd)
IN PRTMP_ADAPTER pAd)
{ {
UCHAR Index; UCHAR Index;
PQUEUE_ENTRY pEntry; PQUEUE_ENTRY pEntry;
PNDIS_PACKET pPacket; PNDIS_PACKET pPacket;
PQUEUE_HEADER pQueue; PQUEUE_HEADER pQueue;
for (Index = 0; Index < 4; Index++) {
for (Index = 0; Index < 4; Index++)
{
NdisAcquireSpinLock(&pAd->TxSwQueueLock[Index]); NdisAcquireSpinLock(&pAd->TxSwQueueLock[Index]);
while (pAd->TxSwQueue[Index].Head != NULL) while (pAd->TxSwQueue[Index].Head != NULL) {
{ pQueue = (PQUEUE_HEADER) & (pAd->TxSwQueue[Index]);
pQueue = (PQUEUE_HEADER) &(pAd->TxSwQueue[Index]);
pEntry = RemoveHeadQueue(pQueue); pEntry = RemoveHeadQueue(pQueue);
pPacket = QUEUE_ENTRY_TO_PACKET(pEntry); pPacket = QUEUE_ENTRY_TO_PACKET(pEntry);
RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE); RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);
...@@ -217,7 +212,6 @@ VOID RTUSBRejectPendingPackets( ...@@ -217,7 +212,6 @@ VOID RTUSBRejectPendingPackets(
} }
/* /*
======================================================================== ========================================================================
...@@ -246,20 +240,17 @@ VOID RTUSBRejectPendingPackets( ...@@ -246,20 +240,17 @@ VOID RTUSBRejectPendingPackets(
======================================================================== ========================================================================
*/ */
VOID RTMPWriteTxInfo(IN PRTMP_ADAPTER pAd,
VOID RTMPWriteTxInfo(
IN PRTMP_ADAPTER pAd,
IN PTXINFO_STRUC pTxInfo, IN PTXINFO_STRUC pTxInfo,
IN USHORT USBDMApktLen, IN USHORT USBDMApktLen,
IN BOOLEAN bWiv, IN BOOLEAN bWiv,
IN UCHAR QueueSel, IN UCHAR QueueSel, IN UCHAR NextValid, IN UCHAR TxBurst)
IN UCHAR NextValid,
IN UCHAR TxBurst)
{ {
pTxInfo->USBDMATxPktLen = USBDMApktLen; pTxInfo->USBDMATxPktLen = USBDMApktLen;
pTxInfo->QSEL = QueueSel; pTxInfo->QSEL = QueueSel;
if (QueueSel != FIFO_EDCA) if (QueueSel != FIFO_EDCA)
DBGPRINT(RT_DEBUG_TRACE, ("====> QueueSel != FIFO_EDCA<============\n")); DBGPRINT(RT_DEBUG_TRACE,
("====> QueueSel != FIFO_EDCA<============\n"));
pTxInfo->USBDMANextVLD = FALSE; //NextValid; // Need to check with Jan about this. pTxInfo->USBDMANextVLD = FALSE; //NextValid; // Need to check with Jan about this.
pTxInfo->USBDMATxburst = TxBurst; pTxInfo->USBDMATxburst = TxBurst;
pTxInfo->WIV = bWiv; pTxInfo->WIV = bWiv;
......
...@@ -38,10 +38,8 @@ ...@@ -38,10 +38,8 @@
#ifdef RTMP_MAC_USB #ifdef RTMP_MAC_USB
#include "../rt_config.h" #include "../rt_config.h"
/* /*
======================================================================== ========================================================================
...@@ -58,26 +56,18 @@ ...@@ -58,26 +56,18 @@
======================================================================== ========================================================================
*/ */
static NTSTATUS RTUSBFirmwareRun( static NTSTATUS RTUSBFirmwareRun(IN PRTMP_ADAPTER pAd)
IN PRTMP_ADAPTER pAd)
{ {
NTSTATUS Status; NTSTATUS Status;
Status = RTUSB_VendorRequest( Status = RTUSB_VendorRequest(pAd,
pAd,
USBD_TRANSFER_DIRECTION_OUT, USBD_TRANSFER_DIRECTION_OUT,
DEVICE_VENDOR_REQUEST_OUT, DEVICE_VENDOR_REQUEST_OUT,
0x01, 0x01, 0x8, 0, NULL, 0);
0x8,
0,
NULL,
0);
return Status; return Status;
} }
/* /*
======================================================================== ========================================================================
...@@ -93,10 +83,8 @@ static NTSTATUS RTUSBFirmwareRun( ...@@ -93,10 +83,8 @@ static NTSTATUS RTUSBFirmwareRun(
======================================================================== ========================================================================
*/ */
NTSTATUS RTUSBFirmwareWrite( NTSTATUS RTUSBFirmwareWrite(IN PRTMP_ADAPTER pAd,
IN PRTMP_ADAPTER pAd, IN PUCHAR pFwImage, IN ULONG FwLen)
IN PUCHAR pFwImage,
IN ULONG FwLen)
{ {
UINT32 MacReg; UINT32 MacReg;
NTSTATUS Status; NTSTATUS Status;
...@@ -105,7 +93,6 @@ NTSTATUS RTUSBFirmwareWrite( ...@@ -105,7 +93,6 @@ NTSTATUS RTUSBFirmwareWrite(
Status = RTUSBReadMACRegister(pAd, MAC_CSR0, &MacReg); Status = RTUSBReadMACRegister(pAd, MAC_CSR0, &MacReg);
writeLen = FwLen; writeLen = FwLen;
RTUSBMultiWrite(pAd, FIRMWARE_IMAGE_BASE, pFwImage, writeLen); RTUSBMultiWrite(pAd, FIRMWARE_IMAGE_BASE, pFwImage, writeLen);
...@@ -115,32 +102,26 @@ NTSTATUS RTUSBFirmwareWrite( ...@@ -115,32 +102,26 @@ NTSTATUS RTUSBFirmwareWrite(
//2008/11/28:KH add to fix the dead rf frequency offset bug<-- //2008/11/28:KH add to fix the dead rf frequency offset bug<--
RTMPusecDelay(10000); RTMPusecDelay(10000);
RTUSBWriteMACRegister(pAd,H2M_MAILBOX_CSR,0); RTUSBWriteMACRegister(pAd, H2M_MAILBOX_CSR, 0);
AsicSendCommandToMcu(pAd, 0x72, 0x00, 0x00, 0x00); //reset rf by MCU supported by new firmware AsicSendCommandToMcu(pAd, 0x72, 0x00, 0x00, 0x00); //reset rf by MCU supported by new firmware
//2008/11/28:KH add to fix the dead rf frequency offset bug--> //2008/11/28:KH add to fix the dead rf frequency offset bug-->
return Status; return Status;
} }
NTSTATUS RTUSBVenderReset(IN PRTMP_ADAPTER pAd)
NTSTATUS RTUSBVenderReset(
IN PRTMP_ADAPTER pAd)
{ {
NTSTATUS Status; NTSTATUS Status;
DBGPRINT_RAW(RT_DEBUG_ERROR, ("-->RTUSBVenderReset\n")); DBGPRINT_RAW(RT_DEBUG_ERROR, ("-->RTUSBVenderReset\n"));
Status = RTUSB_VendorRequest( Status = RTUSB_VendorRequest(pAd,
pAd,
USBD_TRANSFER_DIRECTION_OUT, USBD_TRANSFER_DIRECTION_OUT,
DEVICE_VENDOR_REQUEST_OUT, DEVICE_VENDOR_REQUEST_OUT,
0x01, 0x01, 0x1, 0, NULL, 0);
0x1,
0,
NULL,
0);
DBGPRINT_RAW(RT_DEBUG_ERROR, ("<--RTUSBVenderReset\n")); DBGPRINT_RAW(RT_DEBUG_ERROR, ("<--RTUSBVenderReset\n"));
return Status; return Status;
} }
/* /*
======================================================================== ========================================================================
...@@ -156,23 +137,16 @@ NTSTATUS RTUSBVenderReset( ...@@ -156,23 +137,16 @@ NTSTATUS RTUSBVenderReset(
======================================================================== ========================================================================
*/ */
NTSTATUS RTUSBMultiRead( NTSTATUS RTUSBMultiRead(IN PRTMP_ADAPTER pAd,
IN PRTMP_ADAPTER pAd, IN USHORT Offset, OUT PUCHAR pData, IN USHORT length)
IN USHORT Offset,
OUT PUCHAR pData,
IN USHORT length)
{ {
NTSTATUS Status; NTSTATUS Status;
Status = RTUSB_VendorRequest( Status = RTUSB_VendorRequest(pAd,
pAd, (USBD_TRANSFER_DIRECTION_IN |
(USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK), USBD_SHORT_TRANSFER_OK),
DEVICE_VENDOR_REQUEST_IN, DEVICE_VENDOR_REQUEST_IN, 0x7, 0, Offset,
0x7, pData, length);
0,
Offset,
pData,
length);
return Status; return Status;
} }
...@@ -192,77 +166,56 @@ NTSTATUS RTUSBMultiRead( ...@@ -192,77 +166,56 @@ NTSTATUS RTUSBMultiRead(
======================================================================== ========================================================================
*/ */
NTSTATUS RTUSBMultiWrite_OneByte( NTSTATUS RTUSBMultiWrite_OneByte(IN PRTMP_ADAPTER pAd,
IN PRTMP_ADAPTER pAd, IN USHORT Offset, IN PUCHAR pData)
IN USHORT Offset,
IN PUCHAR pData)
{ {
NTSTATUS Status; NTSTATUS Status;
// TODO: In 2870, use this funciton carefully cause it's not stable. // TODO: In 2870, use this funciton carefully cause it's not stable.
Status = RTUSB_VendorRequest( Status = RTUSB_VendorRequest(pAd,
pAd,
USBD_TRANSFER_DIRECTION_OUT, USBD_TRANSFER_DIRECTION_OUT,
DEVICE_VENDOR_REQUEST_OUT, DEVICE_VENDOR_REQUEST_OUT,
0x6, 0x6, 0, Offset, pData, 1);
0,
Offset,
pData,
1);
return Status; return Status;
} }
NTSTATUS RTUSBMultiWrite( NTSTATUS RTUSBMultiWrite(IN PRTMP_ADAPTER pAd,
IN PRTMP_ADAPTER pAd, IN USHORT Offset, IN PUCHAR pData, IN USHORT length)
IN USHORT Offset,
IN PUCHAR pData,
IN USHORT length)
{ {
NTSTATUS Status; NTSTATUS Status;
USHORT index = 0, Value;
USHORT index = 0,Value;
PUCHAR pSrc = pData; PUCHAR pSrc = pData;
USHORT resude = 0; USHORT resude = 0;
resude = length % 2; resude = length % 2;
length += resude; length += resude;
do do {
{ Value = (USHORT) (*pSrc | (*(pSrc + 1) << 8));
Value =(USHORT)( *pSrc | (*(pSrc + 1) << 8)); Status = RTUSBSingleWrite(pAd, Offset + index, Value);
Status = RTUSBSingleWrite(pAd,Offset + index,Value); index += 2;
index +=2;
length -= 2; length -= 2;
pSrc = pSrc + 2; pSrc = pSrc + 2;
}while(length > 0); } while (length > 0);
return Status; return Status;
} }
NTSTATUS RTUSBSingleWrite(IN RTMP_ADAPTER * pAd,
NTSTATUS RTUSBSingleWrite( IN USHORT Offset, IN USHORT Value)
IN RTMP_ADAPTER *pAd,
IN USHORT Offset,
IN USHORT Value)
{ {
NTSTATUS Status; NTSTATUS Status;
Status = RTUSB_VendorRequest( Status = RTUSB_VendorRequest(pAd,
pAd,
USBD_TRANSFER_DIRECTION_OUT, USBD_TRANSFER_DIRECTION_OUT,
DEVICE_VENDOR_REQUEST_OUT, DEVICE_VENDOR_REQUEST_OUT,
0x2, 0x2, Value, Offset, NULL, 0);
Value,
Offset,
NULL,
0);
return Status; return Status;
} }
/* /*
======================================================================== ========================================================================
...@@ -278,34 +231,26 @@ NTSTATUS RTUSBSingleWrite( ...@@ -278,34 +231,26 @@ NTSTATUS RTUSBSingleWrite(
======================================================================== ========================================================================
*/ */
NTSTATUS RTUSBReadMACRegister( NTSTATUS RTUSBReadMACRegister(IN PRTMP_ADAPTER pAd,
IN PRTMP_ADAPTER pAd, IN USHORT Offset, OUT PUINT32 pValue)
IN USHORT Offset,
OUT PUINT32 pValue)
{ {
NTSTATUS Status = 0; NTSTATUS Status = 0;
UINT32 localVal; UINT32 localVal;
Status = RTUSB_VendorRequest( Status = RTUSB_VendorRequest(pAd,
pAd, (USBD_TRANSFER_DIRECTION_IN |
(USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK), USBD_SHORT_TRANSFER_OK),
DEVICE_VENDOR_REQUEST_IN, DEVICE_VENDOR_REQUEST_IN, 0x7, 0, Offset,
0x7, &localVal, 4);
0,
Offset,
&localVal,
4);
*pValue = le2cpu32(localVal); *pValue = le2cpu32(localVal);
if (Status < 0) if (Status < 0)
*pValue = 0xffffffff; *pValue = 0xffffffff;
return Status; return Status;
} }
/* /*
======================================================================== ========================================================================
...@@ -321,24 +266,22 @@ NTSTATUS RTUSBReadMACRegister( ...@@ -321,24 +266,22 @@ NTSTATUS RTUSBReadMACRegister(
======================================================================== ========================================================================
*/ */
NTSTATUS RTUSBWriteMACRegister( NTSTATUS RTUSBWriteMACRegister(IN PRTMP_ADAPTER pAd,
IN PRTMP_ADAPTER pAd, IN USHORT Offset, IN UINT32 Value)
IN USHORT Offset,
IN UINT32 Value)
{ {
NTSTATUS Status; NTSTATUS Status;
UINT32 localVal; UINT32 localVal;
localVal = Value; localVal = Value;
Status = RTUSBSingleWrite(pAd, Offset, (USHORT)(localVal & 0xffff)); Status = RTUSBSingleWrite(pAd, Offset, (USHORT) (localVal & 0xffff));
Status = RTUSBSingleWrite(pAd, Offset + 2, (USHORT)((localVal & 0xffff0000) >> 16)); Status =
RTUSBSingleWrite(pAd, Offset + 2,
(USHORT) ((localVal & 0xffff0000) >> 16));
return Status; return Status;
} }
/* /*
======================================================================== ========================================================================
...@@ -354,39 +297,38 @@ NTSTATUS RTUSBWriteMACRegister( ...@@ -354,39 +297,38 @@ NTSTATUS RTUSBWriteMACRegister(
======================================================================== ========================================================================
*/ */
NTSTATUS RTUSBReadBBPRegister( NTSTATUS RTUSBReadBBPRegister(IN PRTMP_ADAPTER pAd,
IN PRTMP_ADAPTER pAd, IN UCHAR Id, IN PUCHAR pValue)
IN UCHAR Id,
IN PUCHAR pValue)
{ {
BBP_CSR_CFG_STRUC BbpCsr; BBP_CSR_CFG_STRUC BbpCsr;
UINT i = 0; UINT i = 0;
NTSTATUS status; NTSTATUS status;
// Verify the busy condition // Verify the busy condition
do do {
{
status = RTUSBReadMACRegister(pAd, BBP_CSR_CFG, &BbpCsr.word); status = RTUSBReadMACRegister(pAd, BBP_CSR_CFG, &BbpCsr.word);
if(status >= 0) if (status >= 0) {
{
if (!(BbpCsr.field.Busy == BUSY)) if (!(BbpCsr.field.Busy == BUSY))
break; break;
} }
DBGPRINT(RT_DEBUG_TRACE, ("RTUSBReadBBPRegister(BBP_CSR_CFG_1):retry count=%d!\n", i)); DBGPRINT(RT_DEBUG_TRACE,
("RTUSBReadBBPRegister(BBP_CSR_CFG_1):retry count=%d!\n",
i));
i++; i++;
}while ((i < RETRY_LIMIT) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))); } while ((i < RETRY_LIMIT)
&& (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)));
if ((i == RETRY_LIMIT) || (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))) if ((i == RETRY_LIMIT)
{ || (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))) {
// //
// Read failed then Return Default value. // Read failed then Return Default value.
// //
*pValue = pAd->BbpWriteLatch[Id]; *pValue = pAd->BbpWriteLatch[Id];
DBGPRINT_RAW(RT_DEBUG_ERROR, ("Retry count exhausted or device removed!!!\n")); DBGPRINT_RAW(RT_DEBUG_ERROR,
("Retry count exhausted or device removed!!!\n"));
return STATUS_UNSUCCESSFUL; return STATUS_UNSUCCESSFUL;
} }
// Prepare for write material // Prepare for write material
BbpCsr.word = 0; BbpCsr.word = 0;
BbpCsr.field.fRead = 1; BbpCsr.field.fRead = 1;
...@@ -396,36 +338,36 @@ NTSTATUS RTUSBReadBBPRegister( ...@@ -396,36 +338,36 @@ NTSTATUS RTUSBReadBBPRegister(
i = 0; i = 0;
// Verify the busy condition // Verify the busy condition
do do {
{
status = RTUSBReadMACRegister(pAd, BBP_CSR_CFG, &BbpCsr.word); status = RTUSBReadMACRegister(pAd, BBP_CSR_CFG, &BbpCsr.word);
if (status >= 0) if (status >= 0) {
{ if (!(BbpCsr.field.Busy == BUSY)) {
if (!(BbpCsr.field.Busy == BUSY)) *pValue = (UCHAR) BbpCsr.field.Value;
{
*pValue = (UCHAR)BbpCsr.field.Value;
break; break;
} }
} }
DBGPRINT(RT_DEBUG_TRACE, ("RTUSBReadBBPRegister(BBP_CSR_CFG_2):retry count=%d!\n", i)); DBGPRINT(RT_DEBUG_TRACE,
("RTUSBReadBBPRegister(BBP_CSR_CFG_2):retry count=%d!\n",
i));
i++; i++;
}while ((i < RETRY_LIMIT) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))); } while ((i < RETRY_LIMIT)
&& (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)));
if ((i == RETRY_LIMIT) || (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))) if ((i == RETRY_LIMIT)
{ || (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))) {
// //
// Read failed then Return Default value. // Read failed then Return Default value.
// //
*pValue = pAd->BbpWriteLatch[Id]; *pValue = pAd->BbpWriteLatch[Id];
DBGPRINT_RAW(RT_DEBUG_ERROR, ("Retry count exhausted or device removed!!!\n")); DBGPRINT_RAW(RT_DEBUG_ERROR,
("Retry count exhausted or device removed!!!\n"));
return STATUS_UNSUCCESSFUL; return STATUS_UNSUCCESSFUL;
} }
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
/* /*
======================================================================== ========================================================================
...@@ -441,34 +383,33 @@ NTSTATUS RTUSBReadBBPRegister( ...@@ -441,34 +383,33 @@ NTSTATUS RTUSBReadBBPRegister(
======================================================================== ========================================================================
*/ */
NTSTATUS RTUSBWriteBBPRegister( NTSTATUS RTUSBWriteBBPRegister(IN PRTMP_ADAPTER pAd,
IN PRTMP_ADAPTER pAd, IN UCHAR Id, IN UCHAR Value)
IN UCHAR Id,
IN UCHAR Value)
{ {
BBP_CSR_CFG_STRUC BbpCsr; BBP_CSR_CFG_STRUC BbpCsr;
UINT i = 0; UINT i = 0;
NTSTATUS status; NTSTATUS status;
// Verify the busy condition // Verify the busy condition
do do {
{
status = RTUSBReadMACRegister(pAd, BBP_CSR_CFG, &BbpCsr.word); status = RTUSBReadMACRegister(pAd, BBP_CSR_CFG, &BbpCsr.word);
if (status >= 0) if (status >= 0) {
{
if (!(BbpCsr.field.Busy == BUSY)) if (!(BbpCsr.field.Busy == BUSY))
break; break;
} }
DBGPRINT(RT_DEBUG_TRACE, ("RTUSBWriteBBPRegister(BBP_CSR_CFG):retry count=%d!\n", i)); DBGPRINT(RT_DEBUG_TRACE,
("RTUSBWriteBBPRegister(BBP_CSR_CFG):retry count=%d!\n",
i));
i++; i++;
} }
while ((i < RETRY_LIMIT) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))); while ((i < RETRY_LIMIT)
&& (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)));
if ((i == RETRY_LIMIT) || (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))) if ((i == RETRY_LIMIT)
{ || (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))) {
DBGPRINT_RAW(RT_DEBUG_ERROR, ("Retry count exhausted or device removed!!!\n")); DBGPRINT_RAW(RT_DEBUG_ERROR,
("Retry count exhausted or device removed!!!\n"));
return STATUS_UNSUCCESSFUL; return STATUS_UNSUCCESSFUL;
} }
// Prepare for write material // Prepare for write material
BbpCsr.word = 0; BbpCsr.word = 0;
BbpCsr.field.fRead = 0; BbpCsr.field.fRead = 0;
...@@ -481,6 +422,7 @@ NTSTATUS RTUSBWriteBBPRegister( ...@@ -481,6 +422,7 @@ NTSTATUS RTUSBWriteBBPRegister(
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
/* /*
======================================================================== ========================================================================
...@@ -496,31 +438,31 @@ NTSTATUS RTUSBWriteBBPRegister( ...@@ -496,31 +438,31 @@ NTSTATUS RTUSBWriteBBPRegister(
======================================================================== ========================================================================
*/ */
NTSTATUS RTUSBWriteRFRegister( NTSTATUS RTUSBWriteRFRegister(IN PRTMP_ADAPTER pAd, IN UINT32 Value)
IN PRTMP_ADAPTER pAd,
IN UINT32 Value)
{ {
PHY_CSR4_STRUC PhyCsr4; PHY_CSR4_STRUC PhyCsr4;
UINT i = 0; UINT i = 0;
NTSTATUS status; NTSTATUS status;
NdisZeroMemory(&PhyCsr4, sizeof(PHY_CSR4_STRUC)); NdisZeroMemory(&PhyCsr4, sizeof(PHY_CSR4_STRUC));
do do {
{
status = RTUSBReadMACRegister(pAd, RF_CSR_CFG0, &PhyCsr4.word); status = RTUSBReadMACRegister(pAd, RF_CSR_CFG0, &PhyCsr4.word);
if (status >= 0) if (status >= 0) {
{
if (!(PhyCsr4.field.Busy)) if (!(PhyCsr4.field.Busy))
break; break;
} }
DBGPRINT(RT_DEBUG_TRACE, ("RTUSBWriteRFRegister(RF_CSR_CFG0):retry count=%d!\n", i)); DBGPRINT(RT_DEBUG_TRACE,
("RTUSBWriteRFRegister(RF_CSR_CFG0):retry count=%d!\n",
i));
i++; i++;
} }
while ((i < RETRY_LIMIT) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))); while ((i < RETRY_LIMIT)
&& (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)));
if ((i == RETRY_LIMIT) || (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))) if ((i == RETRY_LIMIT)
{ || (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))) {
DBGPRINT_RAW(RT_DEBUG_ERROR, ("Retry count exhausted or device removed!!!\n")); DBGPRINT_RAW(RT_DEBUG_ERROR,
("Retry count exhausted or device removed!!!\n"));
return STATUS_UNSUCCESSFUL; return STATUS_UNSUCCESSFUL;
} }
...@@ -529,7 +471,6 @@ NTSTATUS RTUSBWriteRFRegister( ...@@ -529,7 +471,6 @@ NTSTATUS RTUSBWriteRFRegister(
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
/* /*
======================================================================== ========================================================================
...@@ -545,23 +486,16 @@ NTSTATUS RTUSBWriteRFRegister( ...@@ -545,23 +486,16 @@ NTSTATUS RTUSBWriteRFRegister(
======================================================================== ========================================================================
*/ */
NTSTATUS RTUSBReadEEPROM( NTSTATUS RTUSBReadEEPROM(IN PRTMP_ADAPTER pAd,
IN PRTMP_ADAPTER pAd, IN USHORT Offset, OUT PUCHAR pData, IN USHORT length)
IN USHORT Offset,
OUT PUCHAR pData,
IN USHORT length)
{ {
NTSTATUS Status = STATUS_SUCCESS; NTSTATUS Status = STATUS_SUCCESS;
Status = RTUSB_VendorRequest( Status = RTUSB_VendorRequest(pAd,
pAd, (USBD_TRANSFER_DIRECTION_IN |
(USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK), USBD_SHORT_TRANSFER_OK),
DEVICE_VENDOR_REQUEST_IN, DEVICE_VENDOR_REQUEST_IN, 0x9, 0, Offset,
0x9, pData, length);
0,
Offset,
pData,
length);
return Status; return Status;
} }
...@@ -581,37 +515,26 @@ NTSTATUS RTUSBReadEEPROM( ...@@ -581,37 +515,26 @@ NTSTATUS RTUSBReadEEPROM(
======================================================================== ========================================================================
*/ */
NTSTATUS RTUSBWriteEEPROM( NTSTATUS RTUSBWriteEEPROM(IN PRTMP_ADAPTER pAd,
IN PRTMP_ADAPTER pAd, IN USHORT Offset, IN PUCHAR pData, IN USHORT length)
IN USHORT Offset,
IN PUCHAR pData,
IN USHORT length)
{ {
NTSTATUS Status = STATUS_SUCCESS; NTSTATUS Status = STATUS_SUCCESS;
Status = RTUSB_VendorRequest( Status = RTUSB_VendorRequest(pAd,
pAd,
USBD_TRANSFER_DIRECTION_OUT, USBD_TRANSFER_DIRECTION_OUT,
DEVICE_VENDOR_REQUEST_OUT, DEVICE_VENDOR_REQUEST_OUT,
0x8, 0x8, 0, Offset, pData, length);
0,
Offset,
pData,
length);
return Status; return Status;
} }
NTSTATUS RTUSBReadEEPROM16(IN PRTMP_ADAPTER pAd,
NTSTATUS RTUSBReadEEPROM16( IN USHORT offset, OUT PUSHORT pData)
IN PRTMP_ADAPTER pAd,
IN USHORT offset,
OUT PUSHORT pData)
{ {
NTSTATUS status; NTSTATUS status;
USHORT localData; USHORT localData;
status = RTUSBReadEEPROM(pAd, offset, (PUCHAR)(&localData), 2); status = RTUSBReadEEPROM(pAd, offset, (PUCHAR) (&localData), 2);
if (status == STATUS_SUCCESS) if (status == STATUS_SUCCESS)
*pData = le2cpu16(localData); *pData = le2cpu16(localData);
...@@ -634,13 +557,12 @@ NTSTATUS RTUSBReadEEPROM16( ...@@ -634,13 +557,12 @@ NTSTATUS RTUSBReadEEPROM16(
======================================================================== ========================================================================
*/ */
VOID RTUSBPutToSleep( VOID RTUSBPutToSleep(IN PRTMP_ADAPTER pAd)
IN PRTMP_ADAPTER pAd)
{ {
UINT32 value; UINT32 value;
// Timeout 0x40 x 50us // Timeout 0x40 x 50us
value = (SLEEPCID<<16)+(OWNERMCU<<24)+ (0x40<<8)+1; value = (SLEEPCID << 16) + (OWNERMCU << 24) + (0x40 << 8) + 1;
RTUSBWriteMACRegister(pAd, 0x7010, value); RTUSBWriteMACRegister(pAd, 0x7010, value);
RTUSBWriteMACRegister(pAd, 0x404, 0x30); RTUSBWriteMACRegister(pAd, 0x404, 0x30);
//RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS); //RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS);
...@@ -663,20 +585,14 @@ VOID RTUSBPutToSleep( ...@@ -663,20 +585,14 @@ VOID RTUSBPutToSleep(
======================================================================== ========================================================================
*/ */
NTSTATUS RTUSBWakeUp( NTSTATUS RTUSBWakeUp(IN PRTMP_ADAPTER pAd)
IN PRTMP_ADAPTER pAd)
{ {
NTSTATUS Status; NTSTATUS Status;
Status = RTUSB_VendorRequest( Status = RTUSB_VendorRequest(pAd,
pAd,
USBD_TRANSFER_DIRECTION_OUT, USBD_TRANSFER_DIRECTION_OUT,
DEVICE_VENDOR_REQUEST_OUT, DEVICE_VENDOR_REQUEST_OUT,
0x01, 0x01, 0x09, 0, NULL, 0);
0x09,
0,
NULL,
0);
return Status; return Status;
} }
...@@ -696,8 +612,7 @@ NTSTATUS RTUSBWakeUp( ...@@ -696,8 +612,7 @@ NTSTATUS RTUSBWakeUp(
======================================================================== ========================================================================
*/ */
VOID RTUSBInitializeCmdQ( VOID RTUSBInitializeCmdQ(IN PCmdQ cmdq)
IN PCmdQ cmdq)
{ {
cmdq->head = NULL; cmdq->head = NULL;
cmdq->tail = NULL; cmdq->tail = NULL;
...@@ -720,8 +635,7 @@ VOID RTUSBInitializeCmdQ( ...@@ -720,8 +635,7 @@ VOID RTUSBInitializeCmdQ(
======================================================================== ========================================================================
*/ */
NDIS_STATUS RTUSBEnqueueCmdFromNdis( NDIS_STATUS RTUSBEnqueueCmdFromNdis(IN PRTMP_ADAPTER pAd,
IN PRTMP_ADAPTER pAd,
IN NDIS_OID Oid, IN NDIS_OID Oid,
IN BOOLEAN SetInformation, IN BOOLEAN SetInformation,
IN PVOID pInformationBuffer, IN PVOID pInformationBuffer,
...@@ -734,33 +648,31 @@ NDIS_STATUS RTUSBEnqueueCmdFromNdis( ...@@ -734,33 +648,31 @@ NDIS_STATUS RTUSBEnqueueCmdFromNdis(
#ifdef KTHREAD_SUPPORT #ifdef KTHREAD_SUPPORT
if (pTask->kthread_task == NULL) if (pTask->kthread_task == NULL)
#else #else
CHECK_PID_LEGALITY(pTask->taskPID) CHECK_PID_LEGALITY(pTask->taskPID) {
{
} }
else else
#endif #endif
return (NDIS_STATUS_RESOURCES); return (NDIS_STATUS_RESOURCES);
status = os_alloc_mem(pAd, (PUCHAR *)(&cmdqelmt), sizeof(CmdQElmt)); status = os_alloc_mem(pAd, (PUCHAR *) (&cmdqelmt), sizeof(CmdQElmt));
if ((status != NDIS_STATUS_SUCCESS) || (cmdqelmt == NULL)) if ((status != NDIS_STATUS_SUCCESS) || (cmdqelmt == NULL))
return (NDIS_STATUS_RESOURCES); return (NDIS_STATUS_RESOURCES);
cmdqelmt->buffer = NULL; cmdqelmt->buffer = NULL;
if (pInformationBuffer != NULL) if (pInformationBuffer != NULL) {
{ status =
status = os_alloc_mem(pAd, (PUCHAR *)&cmdqelmt->buffer, InformationBufferLength); os_alloc_mem(pAd, (PUCHAR *) & cmdqelmt->buffer,
if ((status != NDIS_STATUS_SUCCESS) || (cmdqelmt->buffer == NULL)) InformationBufferLength);
{ if ((status != NDIS_STATUS_SUCCESS)
|| (cmdqelmt->buffer == NULL)) {
kfree(cmdqelmt); kfree(cmdqelmt);
return (NDIS_STATUS_RESOURCES); return (NDIS_STATUS_RESOURCES);
} } else {
else NdisMoveMemory(cmdqelmt->buffer, pInformationBuffer,
{ InformationBufferLength);
NdisMoveMemory(cmdqelmt->buffer, pInformationBuffer, InformationBufferLength);
cmdqelmt->bufferlength = InformationBufferLength; cmdqelmt->bufferlength = InformationBufferLength;
} }
} } else
else
cmdqelmt->bufferlength = 0; cmdqelmt->bufferlength = 0;
cmdqelmt->command = Oid; cmdqelmt->command = Oid;
...@@ -771,28 +683,22 @@ NDIS_STATUS RTUSBEnqueueCmdFromNdis( ...@@ -771,28 +683,22 @@ NDIS_STATUS RTUSBEnqueueCmdFromNdis(
cmdqelmt->SetOperation = FALSE; cmdqelmt->SetOperation = FALSE;
NdisAcquireSpinLock(&pAd->CmdQLock); NdisAcquireSpinLock(&pAd->CmdQLock);
if (pAd->CmdQ.CmdQState & RTMP_TASK_CAN_DO_INSERT) if (pAd->CmdQ.CmdQState & RTMP_TASK_CAN_DO_INSERT) {
{
EnqueueCmd((&pAd->CmdQ), cmdqelmt); EnqueueCmd((&pAd->CmdQ), cmdqelmt);
status = NDIS_STATUS_SUCCESS; status = NDIS_STATUS_SUCCESS;
} } else {
else
{
status = NDIS_STATUS_FAILURE; status = NDIS_STATUS_FAILURE;
} }
NdisReleaseSpinLock(&pAd->CmdQLock); NdisReleaseSpinLock(&pAd->CmdQLock);
if (status == NDIS_STATUS_FAILURE) if (status == NDIS_STATUS_FAILURE) {
{
if (cmdqelmt->buffer) if (cmdqelmt->buffer)
os_free_mem(pAd, cmdqelmt->buffer); os_free_mem(pAd, cmdqelmt->buffer);
os_free_mem(pAd, cmdqelmt); os_free_mem(pAd, cmdqelmt);
} } else
else
RTUSBCMDUp(pAd); RTUSBCMDUp(pAd);
return (NDIS_STATUS_SUCCESS);
return(NDIS_STATUS_SUCCESS);
} }
/* /*
...@@ -810,8 +716,7 @@ NDIS_STATUS RTUSBEnqueueCmdFromNdis( ...@@ -810,8 +716,7 @@ NDIS_STATUS RTUSBEnqueueCmdFromNdis(
======================================================================== ========================================================================
*/ */
NDIS_STATUS RTUSBEnqueueInternalCmd( NDIS_STATUS RTUSBEnqueueInternalCmd(IN PRTMP_ADAPTER pAd,
IN PRTMP_ADAPTER pAd,
IN NDIS_OID Oid, IN NDIS_OID Oid,
IN PVOID pInformationBuffer, IN PVOID pInformationBuffer,
IN UINT32 InformationBufferLength) IN UINT32 InformationBufferLength)
...@@ -819,28 +724,25 @@ NDIS_STATUS RTUSBEnqueueInternalCmd( ...@@ -819,28 +724,25 @@ NDIS_STATUS RTUSBEnqueueInternalCmd(
NDIS_STATUS status; NDIS_STATUS status;
PCmdQElmt cmdqelmt = NULL; PCmdQElmt cmdqelmt = NULL;
status = os_alloc_mem(pAd, (PUCHAR *) & cmdqelmt, sizeof(CmdQElmt));
status = os_alloc_mem(pAd, (PUCHAR *)&cmdqelmt, sizeof(CmdQElmt));
if ((status != NDIS_STATUS_SUCCESS) || (cmdqelmt == NULL)) if ((status != NDIS_STATUS_SUCCESS) || (cmdqelmt == NULL))
return (NDIS_STATUS_RESOURCES); return (NDIS_STATUS_RESOURCES);
NdisZeroMemory(cmdqelmt, sizeof(CmdQElmt)); NdisZeroMemory(cmdqelmt, sizeof(CmdQElmt));
if(InformationBufferLength > 0) if (InformationBufferLength > 0) {
{ status =
status = os_alloc_mem(pAd, (PUCHAR *)&cmdqelmt->buffer, InformationBufferLength); os_alloc_mem(pAd, (PUCHAR *) & cmdqelmt->buffer,
if ((status != NDIS_STATUS_SUCCESS) || (cmdqelmt->buffer == NULL)) InformationBufferLength);
{ if ((status != NDIS_STATUS_SUCCESS)
|| (cmdqelmt->buffer == NULL)) {
os_free_mem(pAd, cmdqelmt); os_free_mem(pAd, cmdqelmt);
return (NDIS_STATUS_RESOURCES); return (NDIS_STATUS_RESOURCES);
} } else {
else NdisMoveMemory(cmdqelmt->buffer, pInformationBuffer,
{ InformationBufferLength);
NdisMoveMemory(cmdqelmt->buffer, pInformationBuffer, InformationBufferLength);
cmdqelmt->bufferlength = InformationBufferLength; cmdqelmt->bufferlength = InformationBufferLength;
} }
} } else {
else
{
cmdqelmt->buffer = NULL; cmdqelmt->buffer = NULL;
cmdqelmt->bufferlength = 0; cmdqelmt->bufferlength = 0;
} }
...@@ -848,30 +750,24 @@ NDIS_STATUS RTUSBEnqueueInternalCmd( ...@@ -848,30 +750,24 @@ NDIS_STATUS RTUSBEnqueueInternalCmd(
cmdqelmt->command = Oid; cmdqelmt->command = Oid;
cmdqelmt->CmdFromNdis = FALSE; cmdqelmt->CmdFromNdis = FALSE;
if (cmdqelmt != NULL) if (cmdqelmt != NULL) {
{
NdisAcquireSpinLock(&pAd->CmdQLock); NdisAcquireSpinLock(&pAd->CmdQLock);
if (pAd->CmdQ.CmdQState & RTMP_TASK_CAN_DO_INSERT) if (pAd->CmdQ.CmdQState & RTMP_TASK_CAN_DO_INSERT) {
{
EnqueueCmd((&pAd->CmdQ), cmdqelmt); EnqueueCmd((&pAd->CmdQ), cmdqelmt);
status = NDIS_STATUS_SUCCESS; status = NDIS_STATUS_SUCCESS;
} } else {
else
{
status = NDIS_STATUS_FAILURE; status = NDIS_STATUS_FAILURE;
} }
NdisReleaseSpinLock(&pAd->CmdQLock); NdisReleaseSpinLock(&pAd->CmdQLock);
if (status == NDIS_STATUS_FAILURE) if (status == NDIS_STATUS_FAILURE) {
{
if (cmdqelmt->buffer) if (cmdqelmt->buffer)
os_free_mem(pAd, cmdqelmt->buffer); os_free_mem(pAd, cmdqelmt->buffer);
os_free_mem(pAd, cmdqelmt); os_free_mem(pAd, cmdqelmt);
} } else
else
RTUSBCMDUp(pAd); RTUSBCMDUp(pAd);
} }
return(NDIS_STATUS_SUCCESS); return (NDIS_STATUS_SUCCESS);
} }
/* /*
...@@ -889,14 +785,11 @@ NDIS_STATUS RTUSBEnqueueInternalCmd( ...@@ -889,14 +785,11 @@ NDIS_STATUS RTUSBEnqueueInternalCmd(
======================================================================== ========================================================================
*/ */
VOID RTUSBDequeueCmd( VOID RTUSBDequeueCmd(IN PCmdQ cmdq, OUT PCmdQElmt * pcmdqelmt)
IN PCmdQ cmdq,
OUT PCmdQElmt *pcmdqelmt)
{ {
*pcmdqelmt = cmdq->head; *pcmdqelmt = cmdq->head;
if (*pcmdqelmt != NULL) if (*pcmdqelmt != NULL) {
{
cmdq->head = cmdq->head->next; cmdq->head = cmdq->head->next;
cmdq->size--; cmdq->size--;
if (cmdq->size == 0) if (cmdq->size == 0)
...@@ -930,7 +823,6 @@ VOID RTUSBDequeueCmd( ...@@ -930,7 +823,6 @@ VOID RTUSBDequeueCmd(
method can wait for it to complete. Since you don't have a handle on method can wait for it to complete. Since you don't have a handle on
the URB used, you can't cancel the request. the URB used, you can't cancel the request.
Routine Description: Routine Description:
Arguments: Arguments:
...@@ -941,8 +833,7 @@ VOID RTUSBDequeueCmd( ...@@ -941,8 +833,7 @@ VOID RTUSBDequeueCmd(
======================================================================== ========================================================================
*/ */
NTSTATUS RTUSB_VendorRequest( NTSTATUS RTUSB_VendorRequest(IN PRTMP_ADAPTER pAd,
IN PRTMP_ADAPTER pAd,
IN UINT32 TransferFlags, IN UINT32 TransferFlags,
IN UCHAR RequestType, IN UCHAR RequestType,
IN UCHAR Request, IN UCHAR Request,
...@@ -954,44 +845,58 @@ NTSTATUS RTUSB_VendorRequest( ...@@ -954,44 +845,58 @@ NTSTATUS RTUSB_VendorRequest(
int ret = 0; int ret = 0;
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie; POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) {
{
DBGPRINT(RT_DEBUG_ERROR, ("device disconnected\n")); DBGPRINT(RT_DEBUG_ERROR, ("device disconnected\n"));
return -1; return -1;
} } else if (in_interrupt()) {
else if (in_interrupt()) DBGPRINT(RT_DEBUG_ERROR,
{ ("in_interrupt, RTUSB_VendorRequest Request%02x Value%04x Offset%04x\n",
DBGPRINT(RT_DEBUG_ERROR, ("in_interrupt, RTUSB_VendorRequest Request%02x Value%04x Offset%04x\n",Request,Value,Index)); Request, Value, Index));
return -1; return -1;
} } else {
else
{
#define MAX_RETRY_COUNT 10 #define MAX_RETRY_COUNT 10
int retryCount = 0; int retryCount = 0;
void *tmpBuf = TransferBuffer; void *tmpBuf = TransferBuffer;
ret = down_interruptible(&(pAd->UsbVendorReq_semaphore)); ret = down_interruptible(&(pAd->UsbVendorReq_semaphore));
if (pAd->UsbVendorReqBuf) if (pAd->UsbVendorReqBuf) {
{ ASSERT(TransferBufferLength < MAX_PARAM_BUFFER_SIZE);
ASSERT(TransferBufferLength <MAX_PARAM_BUFFER_SIZE);
tmpBuf = (void *)pAd->UsbVendorReqBuf; tmpBuf = (void *)pAd->UsbVendorReqBuf;
NdisZeroMemory(pAd->UsbVendorReqBuf, TransferBufferLength); NdisZeroMemory(pAd->UsbVendorReqBuf,
TransferBufferLength);
if (RequestType == DEVICE_VENDOR_REQUEST_OUT) if (RequestType == DEVICE_VENDOR_REQUEST_OUT)
NdisMoveMemory(tmpBuf, TransferBuffer, TransferBufferLength); NdisMoveMemory(tmpBuf, TransferBuffer,
TransferBufferLength);
} }
do { do {
if( RequestType == DEVICE_VENDOR_REQUEST_OUT) if (RequestType == DEVICE_VENDOR_REQUEST_OUT)
ret=usb_control_msg(pObj->pUsb_Dev, usb_sndctrlpipe( pObj->pUsb_Dev, 0 ), Request, RequestType, Value,Index, tmpBuf, TransferBufferLength, CONTROL_TIMEOUT_JIFFIES); ret =
else if(RequestType == DEVICE_VENDOR_REQUEST_IN) usb_control_msg(pObj->pUsb_Dev,
ret=usb_control_msg(pObj->pUsb_Dev, usb_rcvctrlpipe( pObj->pUsb_Dev, 0 ), Request, RequestType, Value,Index, tmpBuf, TransferBufferLength, CONTROL_TIMEOUT_JIFFIES); usb_sndctrlpipe(pObj->
else pUsb_Dev,
{ 0), Request,
DBGPRINT(RT_DEBUG_ERROR, ("vendor request direction is failed\n")); RequestType, Value, Index,
tmpBuf,
TransferBufferLength,
CONTROL_TIMEOUT_JIFFIES);
else if (RequestType == DEVICE_VENDOR_REQUEST_IN)
ret =
usb_control_msg(pObj->pUsb_Dev,
usb_rcvctrlpipe(pObj->
pUsb_Dev,
0), Request,
RequestType, Value, Index,
tmpBuf,
TransferBufferLength,
CONTROL_TIMEOUT_JIFFIES);
else {
DBGPRINT(RT_DEBUG_ERROR,
("vendor request direction is failed\n"));
ret = -1; ret = -1;
} }
...@@ -1000,23 +905,31 @@ NTSTATUS RTUSB_VendorRequest( ...@@ -1000,23 +905,31 @@ NTSTATUS RTUSB_VendorRequest(
DBGPRINT(RT_DEBUG_OFF, ("#\n")); DBGPRINT(RT_DEBUG_OFF, ("#\n"));
RTMPusecDelay(5000); RTMPusecDelay(5000);
} }
} while((ret < 0) && (retryCount < MAX_RETRY_COUNT)); } while ((ret < 0) && (retryCount < MAX_RETRY_COUNT));
if ((pAd->UsbVendorReqBuf) && (RequestType == DEVICE_VENDOR_REQUEST_IN)) if ((pAd->UsbVendorReqBuf)
NdisMoveMemory(TransferBuffer, tmpBuf, TransferBufferLength); && (RequestType == DEVICE_VENDOR_REQUEST_IN))
NdisMoveMemory(TransferBuffer, tmpBuf,
TransferBufferLength);
up(&(pAd->UsbVendorReq_semaphore)); up(&(pAd->UsbVendorReq_semaphore));
if (ret < 0) { if (ret < 0) {
DBGPRINT(RT_DEBUG_ERROR, ("RTUSB_VendorRequest failed(%d),TxFlags=0x%x, ReqType=%s, Req=0x%x, Index=0x%x\n", DBGPRINT(RT_DEBUG_ERROR,
ret, TransferFlags, (RequestType == DEVICE_VENDOR_REQUEST_OUT ? "OUT" : "IN"), Request, Index)); ("RTUSB_VendorRequest failed(%d),TxFlags=0x%x, ReqType=%s, Req=0x%x, Index=0x%x\n",
ret, TransferFlags,
(RequestType ==
DEVICE_VENDOR_REQUEST_OUT ? "OUT" : "IN"),
Request, Index));
if (Request == 0x2) if (Request == 0x2)
DBGPRINT(RT_DEBUG_ERROR, ("\tRequest Value=0x%04x!\n", Value)); DBGPRINT(RT_DEBUG_ERROR,
("\tRequest Value=0x%04x!\n", Value));
if ((TransferBuffer!= NULL) && (TransferBufferLength > 0)) if ((TransferBuffer != NULL)
hex_dump("Failed TransferBuffer value", TransferBuffer, TransferBufferLength); && (TransferBufferLength > 0))
hex_dump("Failed TransferBuffer value",
TransferBuffer, TransferBufferLength);
} }
} }
if (ret != -1) if (ret != -1)
...@@ -1041,8 +954,7 @@ NTSTATUS RTUSB_VendorRequest( ...@@ -1041,8 +954,7 @@ NTSTATUS RTUSB_VendorRequest(
======================================================================== ========================================================================
*/ */
NTSTATUS RTUSB_ResetDevice( NTSTATUS RTUSB_ResetDevice(IN PRTMP_ADAPTER pAd)
IN PRTMP_ADAPTER pAd)
{ {
NTSTATUS Status = TRUE; NTSTATUS Status = TRUE;
...@@ -1051,8 +963,7 @@ NTSTATUS RTUSB_ResetDevice( ...@@ -1051,8 +963,7 @@ NTSTATUS RTUSB_ResetDevice(
return Status; return Status;
} }
VOID CMDHandler( VOID CMDHandler(IN PRTMP_ADAPTER pAd)
IN PRTMP_ADAPTER pAd)
{ {
PCmdQElmt cmdqelmt; PCmdQElmt cmdqelmt;
PUCHAR pData; PUCHAR pData;
...@@ -1061,8 +972,7 @@ VOID CMDHandler( ...@@ -1061,8 +972,7 @@ VOID CMDHandler(
NTSTATUS ntStatus; NTSTATUS ntStatus;
// unsigned long IrqFlags; // unsigned long IrqFlags;
while (pAd && pAd->CmdQ.size > 0) while (pAd && pAd->CmdQ.size > 0) {
{
NdisStatus = NDIS_STATUS_SUCCESS; NdisStatus = NDIS_STATUS_SUCCESS;
NdisAcquireSpinLock(&pAd->CmdQLock); NdisAcquireSpinLock(&pAd->CmdQLock);
...@@ -1074,10 +984,10 @@ VOID CMDHandler( ...@@ -1074,10 +984,10 @@ VOID CMDHandler(
pData = cmdqelmt->buffer; pData = cmdqelmt->buffer;
if(!(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST) || RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS))) if (!
{ (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)
switch (cmdqelmt->command) || RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS))) {
{ switch (cmdqelmt->command) {
case CMDTHREAD_CHECK_GPIO: case CMDTHREAD_CHECK_GPIO:
{ {
UINT32 data; UINT32 data;
...@@ -1085,35 +995,47 @@ VOID CMDHandler( ...@@ -1085,35 +995,47 @@ VOID CMDHandler(
{ {
// Read GPIO pin2 as Hardware controlled radio state // Read GPIO pin2 as Hardware controlled radio state
RTUSBReadMACRegister( pAd, GPIO_CTRL_CFG, &data); RTUSBReadMACRegister(pAd,
GPIO_CTRL_CFG,
if (data & 0x04) &data);
{
pAd->StaCfg.bHwRadio = TRUE; if (data & 0x04) {
} pAd->StaCfg.bHwRadio =
else TRUE;
{ } else {
pAd->StaCfg.bHwRadio = FALSE; pAd->StaCfg.bHwRadio =
} FALSE;
}
if(pAd->StaCfg.bRadio != (pAd->StaCfg.bHwRadio && pAd->StaCfg.bSwRadio))
{ if (pAd->StaCfg.bRadio !=
pAd->StaCfg.bRadio = (pAd->StaCfg.bHwRadio && pAd->StaCfg.bSwRadio); (pAd->StaCfg.bHwRadio
if(pAd->StaCfg.bRadio == TRUE) && pAd->StaCfg.bSwRadio)) {
{ pAd->StaCfg.bRadio =
DBGPRINT_RAW(RT_DEBUG_ERROR, ("!!! Radio On !!!\n")); (pAd->StaCfg.
bHwRadio
MlmeRadioOn(pAd); && pAd->StaCfg.
bSwRadio);
if (pAd->StaCfg.
bRadio == TRUE) {
DBGPRINT_RAW
(RT_DEBUG_ERROR,
("!!! Radio On !!!\n"));
MlmeRadioOn
(pAd);
// Update extra information // Update extra information
pAd->ExtraInfo = EXTRA_INFO_CLEAR; pAd->ExtraInfo =
} EXTRA_INFO_CLEAR;
else } else {
{ DBGPRINT_RAW
DBGPRINT_RAW(RT_DEBUG_ERROR, ("!!! Radio Off !!!\n")); (RT_DEBUG_ERROR,
("!!! Radio Off !!!\n"));
MlmeRadioOff(pAd);
MlmeRadioOff
(pAd);
// Update extra information // Update extra information
pAd->ExtraInfo = HW_RADIO_OFF; pAd->ExtraInfo =
HW_RADIO_OFF;
} }
} }
} }
...@@ -1122,7 +1044,9 @@ VOID CMDHandler( ...@@ -1122,7 +1044,9 @@ VOID CMDHandler(
case CMDTHREAD_QKERIODIC_EXECUT: case CMDTHREAD_QKERIODIC_EXECUT:
{ {
StaQuickResponeForRateUpExec(NULL, pAd, NULL, NULL); StaQuickResponeForRateUpExec(NULL, pAd,
NULL,
NULL);
} }
break; break;
...@@ -1130,136 +1054,310 @@ VOID CMDHandler( ...@@ -1130,136 +1054,310 @@ VOID CMDHandler(
{ {
UINT32 MACValue; UINT32 MACValue;
UCHAR Index; UCHAR Index;
int ret=0; int ret = 0;
PHT_TX_CONTEXT pHTTXContext; PHT_TX_CONTEXT pHTTXContext;
// RTMP_TX_RING *pTxRing; // RTMP_TX_RING *pTxRing;
unsigned long IrqFlags; unsigned long IrqFlags;
DBGPRINT_RAW(RT_DEBUG_TRACE, ("CmdThread : CMDTHREAD_RESET_BULK_OUT(ResetPipeid=0x%0x)===>\n", pAd->bulkResetPipeid)); DBGPRINT_RAW(RT_DEBUG_TRACE,
("CmdThread : CMDTHREAD_RESET_BULK_OUT(ResetPipeid=0x%0x)===>\n",
pAd->bulkResetPipeid));
// All transfers must be aborted or cancelled before attempting to reset the pipe. // All transfers must be aborted or cancelled before attempting to reset the pipe.
//RTUSBCancelPendingBulkOutIRP(pAd); //RTUSBCancelPendingBulkOutIRP(pAd);
// Wait 10ms to let previous packet that are already in HW FIFO to clear. by MAXLEE 12-25-2007 // Wait 10ms to let previous packet that are already in HW FIFO to clear. by MAXLEE 12-25-2007
Index = 0; Index = 0;
do do {
{ RTUSBReadMACRegister(pAd,
RTUSBReadMACRegister(pAd, TXRXQ_PCNT, &MACValue); TXRXQ_PCNT,
if ((MACValue & 0xf00000/*0x800000*/) == 0) &MACValue);
if ((MACValue & 0xf00000
/*0x800000 */ ) == 0)
break; break;
Index++; Index++;
RTMPusecDelay(10000); RTMPusecDelay(10000);
}while(Index < 100); } while (Index < 100);
MACValue = 0; MACValue = 0;
RTUSBReadMACRegister(pAd, USB_DMA_CFG, &MACValue); RTUSBReadMACRegister(pAd, USB_DMA_CFG,
&MACValue);
// To prevent Read Register error, we 2nd check the validity. // To prevent Read Register error, we 2nd check the validity.
if ((MACValue & 0xc00000) == 0) if ((MACValue & 0xc00000) == 0)
RTUSBReadMACRegister(pAd, USB_DMA_CFG, &MACValue); RTUSBReadMACRegister(pAd,
USB_DMA_CFG,
&MACValue);
// To prevent Read Register error, we 3rd check the validity. // To prevent Read Register error, we 3rd check the validity.
if ((MACValue & 0xc00000) == 0) if ((MACValue & 0xc00000) == 0)
RTUSBReadMACRegister(pAd, USB_DMA_CFG, &MACValue); RTUSBReadMACRegister(pAd,
USB_DMA_CFG,
&MACValue);
MACValue |= 0x80000; MACValue |= 0x80000;
RTUSBWriteMACRegister(pAd, USB_DMA_CFG, MACValue); RTUSBWriteMACRegister(pAd, USB_DMA_CFG,
MACValue);
// Wait 1ms to prevent next URB to bulkout before HW reset. by MAXLEE 12-25-2007 // Wait 1ms to prevent next URB to bulkout before HW reset. by MAXLEE 12-25-2007
RTMPusecDelay(1000); RTMPusecDelay(1000);
MACValue &= (~0x80000); MACValue &= (~0x80000);
RTUSBWriteMACRegister(pAd, USB_DMA_CFG, MACValue); RTUSBWriteMACRegister(pAd, USB_DMA_CFG,
DBGPRINT_RAW(RT_DEBUG_TRACE, ("\tSet 0x2a0 bit19. Clear USB DMA TX path\n")); MACValue);
DBGPRINT_RAW(RT_DEBUG_TRACE,
("\tSet 0x2a0 bit19. Clear USB DMA TX path\n"));
// Wait 5ms to prevent next URB to bulkout before HW reset. by MAXLEE 12-25-2007 // Wait 5ms to prevent next URB to bulkout before HW reset. by MAXLEE 12-25-2007
//RTMPusecDelay(5000); //RTMPusecDelay(5000);
if ((pAd->bulkResetPipeid & BULKOUT_MGMT_RESET_FLAG) == BULKOUT_MGMT_RESET_FLAG) if ((pAd->
{ bulkResetPipeid &
RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET); BULKOUT_MGMT_RESET_FLAG) ==
if (pAd->MgmtRing.TxSwFreeIdx < MGMT_RING_SIZE /* pMLMEContext->bWaitingBulkOut == TRUE */) BULKOUT_MGMT_RESET_FLAG) {
{ RTMP_CLEAR_FLAG(pAd,
RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_MLME); fRTMP_ADAPTER_BULKOUT_RESET);
if (pAd->MgmtRing.TxSwFreeIdx <
MGMT_RING_SIZE
/* pMLMEContext->bWaitingBulkOut == TRUE */
) {
RTUSB_SET_BULK_FLAG(pAd,
fRTUSB_BULK_OUT_MLME);
} }
RTUSBKickBulkOut(pAd); RTUSBKickBulkOut(pAd);
DBGPRINT_RAW(RT_DEBUG_TRACE, ("\tTX MGMT RECOVER Done!\n")); DBGPRINT_RAW(RT_DEBUG_TRACE,
} ("\tTX MGMT RECOVER Done!\n"));
else } else {
{ pHTTXContext =
pHTTXContext = &(pAd->TxContext[pAd->bulkResetPipeid]); &(pAd->
TxContext[pAd->
bulkResetPipeid]);
//NdisAcquireSpinLock(&pAd->BulkOutLock[pAd->bulkResetPipeid]); //NdisAcquireSpinLock(&pAd->BulkOutLock[pAd->bulkResetPipeid]);
RTMP_INT_LOCK(&pAd->BulkOutLock[pAd->bulkResetPipeid], IrqFlags); RTMP_INT_LOCK(&pAd->
if ( pAd->BulkOutPending[pAd->bulkResetPipeid] == FALSE) BulkOutLock[pAd->
{ bulkResetPipeid],
pAd->BulkOutPending[pAd->bulkResetPipeid] = TRUE; IrqFlags);
pHTTXContext->IRPPending = TRUE; if (pAd->
pAd->watchDogTxPendingCnt[pAd->bulkResetPipeid] = 1; BulkOutPending[pAd->
bulkResetPipeid]
== FALSE) {
pAd->
BulkOutPending[pAd->
bulkResetPipeid]
= TRUE;
pHTTXContext->
IRPPending = TRUE;
pAd->
watchDogTxPendingCnt
[pAd->
bulkResetPipeid] =
1;
// no matter what, clean the flag // no matter what, clean the flag
RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET); RTMP_CLEAR_FLAG(pAd,
fRTMP_ADAPTER_BULKOUT_RESET);
//NdisReleaseSpinLock(&pAd->BulkOutLock[pAd->bulkResetPipeid]); //NdisReleaseSpinLock(&pAd->BulkOutLock[pAd->bulkResetPipeid]);
RTMP_INT_UNLOCK(&pAd->BulkOutLock[pAd->bulkResetPipeid], IrqFlags); RTMP_INT_UNLOCK(&pAd->
{ BulkOutLock
RTUSBInitHTTxDesc(pAd, pHTTXContext, pAd->bulkResetPipeid, pHTTXContext->BulkOutSize, (usb_complete_t)RTUSBBulkOutDataPacketComplete); [pAd->
bulkResetPipeid],
if((ret = RTUSB_SUBMIT_URB(pHTTXContext->pUrb))!=0) IrqFlags);
{ {
RTMP_INT_LOCK(&pAd->BulkOutLock[pAd->bulkResetPipeid], IrqFlags); RTUSBInitHTTxDesc
pAd->BulkOutPending[pAd->bulkResetPipeid] = FALSE; (pAd,
pHTTXContext->IRPPending = FALSE; pHTTXContext,
pAd->watchDogTxPendingCnt[pAd->bulkResetPipeid] = 0; pAd->
RTMP_INT_UNLOCK(&pAd->BulkOutLock[pAd->bulkResetPipeid], IrqFlags); bulkResetPipeid,
pHTTXContext->
DBGPRINT(RT_DEBUG_ERROR, ("CmdThread : CMDTHREAD_RESET_BULK_OUT: Submit Tx URB failed %d\n", ret)); BulkOutSize,
} (usb_complete_t)
else RTUSBBulkOutDataPacketComplete);
{
RTMP_IRQ_LOCK(&pAd->BulkOutLock[pAd->bulkResetPipeid], IrqFlags); if ((ret =
DBGPRINT_RAW(RT_DEBUG_TRACE,("\tCMDTHREAD_RESET_BULK_OUT: TxContext[%d]:CWPos=%ld, NBPos=%ld, ENBPos=%ld, bCopy=%d, pending=%d!\n", RTUSB_SUBMIT_URB
pAd->bulkResetPipeid, pHTTXContext->CurWritePosition, pHTTXContext->NextBulkOutPosition, (pHTTXContext->
pHTTXContext->ENextBulkOutPosition, pHTTXContext->bCopySavePad, pAd->BulkOutPending[pAd->bulkResetPipeid])); pUrb)) !=
DBGPRINT_RAW(RT_DEBUG_TRACE,("\t\tBulkOut Req=0x%lx, Complete=0x%lx, Other=0x%lx\n", 0) {
pAd->BulkOutReq, pAd->BulkOutComplete, pAd->BulkOutCompleteOther)); RTMP_INT_LOCK
RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[pAd->bulkResetPipeid], IrqFlags); (&pAd->
DBGPRINT_RAW(RT_DEBUG_TRACE, ("\tCMDTHREAD_RESET_BULK_OUT: Submit Tx DATA URB for failed BulkReq(0x%lx) Done, status=%d!\n", pAd->bulkResetReq[pAd->bulkResetPipeid], pHTTXContext->pUrb->status)); BulkOutLock
[pAd->
} bulkResetPipeid],
} IrqFlags);
} pAd->
else BulkOutPending
{ [pAd->
bulkResetPipeid]
=
FALSE;
pHTTXContext->
IRPPending
=
FALSE;
pAd->
watchDogTxPendingCnt
[pAd->
bulkResetPipeid]
= 0;
RTMP_INT_UNLOCK
(&pAd->
BulkOutLock
[pAd->
bulkResetPipeid],
IrqFlags);
DBGPRINT
(RT_DEBUG_ERROR,
("CmdThread : CMDTHREAD_RESET_BULK_OUT: Submit Tx URB failed %d\n",
ret));
} else {
RTMP_IRQ_LOCK
(&pAd->
BulkOutLock
[pAd->
bulkResetPipeid],
IrqFlags);
DBGPRINT_RAW
(RT_DEBUG_TRACE,
("\tCMDTHREAD_RESET_BULK_OUT: TxContext[%d]:CWPos=%ld, NBPos=%ld, ENBPos=%ld, bCopy=%d, pending=%d!\n",
pAd->
bulkResetPipeid,
pHTTXContext->
CurWritePosition,
pHTTXContext->
NextBulkOutPosition,
pHTTXContext->
ENextBulkOutPosition,
pHTTXContext->
bCopySavePad,
pAd->
BulkOutPending
[pAd->
bulkResetPipeid]));
DBGPRINT_RAW
(RT_DEBUG_TRACE,
("\t\tBulkOut Req=0x%lx, Complete=0x%lx, Other=0x%lx\n",
pAd->
BulkOutReq,
pAd->
BulkOutComplete,
pAd->
BulkOutCompleteOther));
RTMP_IRQ_UNLOCK
(&pAd->
BulkOutLock
[pAd->
bulkResetPipeid],
IrqFlags);
DBGPRINT_RAW
(RT_DEBUG_TRACE,
("\tCMDTHREAD_RESET_BULK_OUT: Submit Tx DATA URB for failed BulkReq(0x%lx) Done, status=%d!\n",
pAd->
bulkResetReq
[pAd->
bulkResetPipeid],
pHTTXContext->
pUrb->
status));
}
}
} else {
//NdisReleaseSpinLock(&pAd->BulkOutLock[pAd->bulkResetPipeid]); //NdisReleaseSpinLock(&pAd->BulkOutLock[pAd->bulkResetPipeid]);
//RTMP_INT_UNLOCK(&pAd->BulkOutLock[pAd->bulkResetPipeid], IrqFlags); //RTMP_INT_UNLOCK(&pAd->BulkOutLock[pAd->bulkResetPipeid], IrqFlags);
DBGPRINT_RAW(RT_DEBUG_ERROR, ("CmdThread : TX DATA RECOVER FAIL for BulkReq(0x%lx) because BulkOutPending[%d] is TRUE!\n", pAd->bulkResetReq[pAd->bulkResetPipeid], pAd->bulkResetPipeid)); DBGPRINT_RAW
if (pAd->bulkResetPipeid == 0) (RT_DEBUG_ERROR,
{ ("CmdThread : TX DATA RECOVER FAIL for BulkReq(0x%lx) because BulkOutPending[%d] is TRUE!\n",
UCHAR pendingContext = 0; pAd->
PHT_TX_CONTEXT pHTTXContext = (PHT_TX_CONTEXT)(&pAd->TxContext[pAd->bulkResetPipeid ]); bulkResetReq[pAd->
PTX_CONTEXT pMLMEContext = (PTX_CONTEXT)(pAd->MgmtRing.Cell[pAd->MgmtRing.TxDmaIdx].AllocVa); bulkResetPipeid],
PTX_CONTEXT pNULLContext = (PTX_CONTEXT)(&pAd->PsPollContext); pAd->
PTX_CONTEXT pPsPollContext = (PTX_CONTEXT)(&pAd->NullContext); bulkResetPipeid));
if (pAd->
bulkResetPipeid ==
0) {
UCHAR
pendingContext
= 0;
PHT_TX_CONTEXT
pHTTXContext
=
(PHT_TX_CONTEXT)
(&pAd->
TxContext
[pAd->
bulkResetPipeid]);
PTX_CONTEXT
pMLMEContext
=
(PTX_CONTEXT)
(pAd->
MgmtRing.
Cell[pAd->
MgmtRing.
TxDmaIdx].
AllocVa);
PTX_CONTEXT
pNULLContext
=
(PTX_CONTEXT)
(&pAd->
PsPollContext);
PTX_CONTEXT
pPsPollContext
=
(PTX_CONTEXT)
(&pAd->
NullContext);
if (pHTTXContext->IRPPending) if (pHTTXContext->IRPPending)
pendingContext |= 1; pendingContext
else if (pMLMEContext->IRPPending) |=
pendingContext |= 2; 1;
else if (pNULLContext->IRPPending) else if
pendingContext |= 4; (pMLMEContext->
else if (pPsPollContext->IRPPending) IRPPending)
pendingContext |= 8; pendingContext
|=
2;
else if
(pNULLContext->
IRPPending)
pendingContext
|=
4;
else if
(pPsPollContext->
IRPPending)
pendingContext
|=
8;
else else
pendingContext = 0; pendingContext
= 0;
DBGPRINT_RAW(RT_DEBUG_ERROR, ("\tTX Occupied by %d!\n", pendingContext)); DBGPRINT_RAW
(RT_DEBUG_ERROR,
("\tTX Occupied by %d!\n",
pendingContext));
} }
// no matter what, clean the flag // no matter what, clean the flag
RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET); RTMP_CLEAR_FLAG(pAd,
fRTMP_ADAPTER_BULKOUT_RESET);
RTMP_INT_UNLOCK(&pAd->BulkOutLock[pAd->bulkResetPipeid], IrqFlags); RTMP_INT_UNLOCK(&pAd->
BulkOutLock
[pAd->
bulkResetPipeid],
IrqFlags);
RTUSB_SET_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_NORMAL << pAd->bulkResetPipeid)); RTUSB_SET_BULK_FLAG(pAd,
(fRTUSB_BULK_OUT_DATA_NORMAL
<<
pAd->
bulkResetPipeid));
} }
RTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS); RTMPDeQueuePacket(pAd, FALSE,
NUM_OF_TX_RING,
MAX_TX_PROCESS);
//RTUSBKickBulkOut(pAd); //RTUSBKickBulkOut(pAd);
} }
...@@ -1296,12 +1394,14 @@ VOID CMDHandler( ...@@ -1296,12 +1394,14 @@ VOID CMDHandler(
} }
RTUSBBulkReceive(pAd); RTUSBBulkReceive(pAd);
DBGPRINT_RAW(RT_DEBUG_ERROR, ("RTUSBBulkReceive\n")); DBGPRINT_RAW(RT_DEBUG_ERROR, ("RTUSBBulkReceive\n"));
}*/ } */
DBGPRINT_RAW(RT_DEBUG_TRACE, ("CmdThread : CMDTHREAD_RESET_BULK_OUT<===\n")); DBGPRINT_RAW(RT_DEBUG_TRACE,
("CmdThread : CMDTHREAD_RESET_BULK_OUT<===\n"));
break; break;
case CMDTHREAD_RESET_BULK_IN: case CMDTHREAD_RESET_BULK_IN:
DBGPRINT_RAW(RT_DEBUG_TRACE, ("CmdThread : CMDTHREAD_RESET_BULK_IN === >\n")); DBGPRINT_RAW(RT_DEBUG_TRACE,
("CmdThread : CMDTHREAD_RESET_BULK_IN === >\n"));
// All transfers must be aborted or cancelled before attempting to reset the pipe. // All transfers must be aborted or cancelled before attempting to reset the pipe.
{ {
...@@ -1309,10 +1409,17 @@ VOID CMDHandler( ...@@ -1309,10 +1409,17 @@ VOID CMDHandler(
{ {
//while ((atomic_read(&pAd->PendingRx) > 0) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))) //while ((atomic_read(&pAd->PendingRx) > 0) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)))
if((pAd->PendingRx > 0) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))) if ((pAd->PendingRx > 0)
{ &&
DBGPRINT_RAW(RT_DEBUG_ERROR, ("BulkIn IRP Pending!!!\n")); (!RTMP_TEST_FLAG
RTUSBCancelPendingBulkInIRP(pAd); (pAd,
fRTMP_ADAPTER_NIC_NOT_EXIST)))
{
DBGPRINT_RAW
(RT_DEBUG_ERROR,
("BulkIn IRP Pending!!!\n"));
RTUSBCancelPendingBulkInIRP
(pAd);
RTMPusecDelay(100000); RTMPusecDelay(100000);
pAd->PendingRx = 0; pAd->PendingRx = 0;
} }
...@@ -1320,24 +1427,60 @@ VOID CMDHandler( ...@@ -1320,24 +1427,60 @@ VOID CMDHandler(
// Wait 10ms before reading register. // Wait 10ms before reading register.
RTMPusecDelay(10000); RTMPusecDelay(10000);
ntStatus = RTUSBReadMACRegister(pAd, MAC_CSR0, &MACValue); ntStatus =
RTUSBReadMACRegister(pAd, MAC_CSR0,
&MACValue);
if ((NT_SUCCESS(ntStatus) == TRUE) && if ((NT_SUCCESS(ntStatus) == TRUE) &&
(!(RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS | fRTMP_ADAPTER_RADIO_OFF | (!(RTMP_TEST_FLAG
fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST))))) (pAd,
(fRTMP_ADAPTER_RESET_IN_PROGRESS
| fRTMP_ADAPTER_RADIO_OFF |
fRTMP_ADAPTER_HALT_IN_PROGRESS
|
fRTMP_ADAPTER_NIC_NOT_EXIST)))))
{ {
UCHAR i; UCHAR i;
if (RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS | fRTMP_ADAPTER_RADIO_OFF | if (RTMP_TEST_FLAG
fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST))) (pAd,
(fRTMP_ADAPTER_RESET_IN_PROGRESS
| fRTMP_ADAPTER_RADIO_OFF
|
fRTMP_ADAPTER_HALT_IN_PROGRESS
|
fRTMP_ADAPTER_NIC_NOT_EXIST)))
break; break;
pAd->NextRxBulkInPosition = pAd->RxContext[pAd->NextRxBulkInIndex].BulkInOffset; pAd->NextRxBulkInPosition =
DBGPRINT(RT_DEBUG_TRACE, ("BULK_IN_RESET: NBIIdx=0x%x,NBIRIdx=0x%x, BIRPos=0x%lx. BIReq=x%lx, BIComplete=0x%lx, BICFail0x%lx\n", pAd->RxContext[pAd->
pAd->NextRxBulkInIndex, pAd->NextRxBulkInReadIndex, pAd->NextRxBulkInPosition, pAd->BulkInReq, pAd->BulkInComplete, pAd->BulkInCompleteFail)); NextRxBulkInIndex].
for (i = 0; i < RX_RING_SIZE; i++) BulkInOffset;
{ DBGPRINT(RT_DEBUG_TRACE,
DBGPRINT(RT_DEBUG_TRACE, ("\tRxContext[%d]: IRPPending=%d, InUse=%d, Readable=%d!\n" ("BULK_IN_RESET: NBIIdx=0x%x,NBIRIdx=0x%x, BIRPos=0x%lx. BIReq=x%lx, BIComplete=0x%lx, BICFail0x%lx\n",
, i, pAd->RxContext[i].IRPPending, pAd->RxContext[i].InUse, pAd->RxContext[i].Readable)); pAd->
NextRxBulkInIndex,
pAd->
NextRxBulkInReadIndex,
pAd->
NextRxBulkInPosition,
pAd->BulkInReq,
pAd->BulkInComplete,
pAd->
BulkInCompleteFail));
for (i = 0; i < RX_RING_SIZE;
i++) {
DBGPRINT(RT_DEBUG_TRACE,
("\tRxContext[%d]: IRPPending=%d, InUse=%d, Readable=%d!\n",
i,
pAd->
RxContext[i].
IRPPending,
pAd->
RxContext[i].
InUse,
pAd->
RxContext[i].
Readable));
} }
/* /*
...@@ -1355,69 +1498,110 @@ VOID CMDHandler( ...@@ -1355,69 +1498,110 @@ VOID CMDHandler(
pRxContext->Readable = FALSE; pRxContext->Readable = FALSE;
pRxContext->ReorderInUse = FALSE; pRxContext->ReorderInUse = FALSE;
}*/ } */
RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BULKIN_RESET); RTMP_CLEAR_FLAG(pAd,
for (i = 0; i < pAd->CommonCfg.NumOfBulkInIRP; i++) fRTMP_ADAPTER_BULKIN_RESET);
{ for (i = 0;
i <
pAd->CommonCfg.
NumOfBulkInIRP; i++) {
//RTUSBBulkReceive(pAd); //RTUSBBulkReceive(pAd);
PRX_CONTEXT pRxContext; PRX_CONTEXT pRxContext;
PURB pUrb; PURB pUrb;
int ret = 0; int ret = 0;
unsigned long IrqFlags; unsigned long IrqFlags;
RTMP_IRQ_LOCK(&pAd->
RTMP_IRQ_LOCK(&pAd->BulkInLock, IrqFlags); BulkInLock,
pRxContext = &(pAd->RxContext[pAd->NextRxBulkInIndex]); IrqFlags);
if ((pAd->PendingRx > 0) || (pRxContext->Readable == TRUE) || (pRxContext->InUse == TRUE)) pRxContext =
{ &(pAd->
RTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags); RxContext[pAd->
NextRxBulkInIndex]);
if ((pAd->PendingRx > 0)
|| (pRxContext->
Readable ==
TRUE)
|| (pRxContext->
InUse ==
TRUE)) {
RTMP_IRQ_UNLOCK
(&pAd->
BulkInLock,
IrqFlags);
break; break;
} }
pRxContext->InUse = TRUE; pRxContext->InUse =
pRxContext->IRPPending = TRUE; TRUE;
pRxContext->IRPPending =
TRUE;
pAd->PendingRx++; pAd->PendingRx++;
pAd->BulkInReq++; pAd->BulkInReq++;
RTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags); RTMP_IRQ_UNLOCK(&pAd->
BulkInLock,
IrqFlags);
// Init Rx context descriptor // Init Rx context descriptor
RTUSBInitRxDesc(pAd, pRxContext); RTUSBInitRxDesc(pAd,
pRxContext);
pUrb = pRxContext->pUrb; pUrb = pRxContext->pUrb;
if ((ret = RTUSB_SUBMIT_URB(pUrb))!=0) if ((ret = RTUSB_SUBMIT_URB(pUrb)) != 0) { // fail
{ // fail
RTMP_IRQ_LOCK
RTMP_IRQ_LOCK(&pAd->BulkInLock, IrqFlags); (&pAd->
pRxContext->InUse = FALSE; BulkInLock,
pRxContext->IRPPending = FALSE; IrqFlags);
pAd->PendingRx--; pRxContext->
pAd->BulkInReq--; InUse =
RTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags); FALSE;
DBGPRINT(RT_DEBUG_ERROR, ("CMDTHREAD_RESET_BULK_IN: Submit Rx URB failed(%d), status=%d\n", ret, pUrb->status)); pRxContext->
} IRPPending =
else FALSE;
{ // success pAd->
PendingRx--;
pAd->
BulkInReq--;
RTMP_IRQ_UNLOCK
(&pAd->
BulkInLock,
IrqFlags);
DBGPRINT
(RT_DEBUG_ERROR,
("CMDTHREAD_RESET_BULK_IN: Submit Rx URB failed(%d), status=%d\n",
ret,
pUrb->
status));
} else { // success
//DBGPRINT(RT_DEBUG_TRACE, ("BIDone, Pend=%d,BIIdx=%d,BIRIdx=%d!\n", //DBGPRINT(RT_DEBUG_TRACE, ("BIDone, Pend=%d,BIIdx=%d,BIRIdx=%d!\n",
// pAd->PendingRx, pAd->NextRxBulkInIndex, pAd->NextRxBulkInReadIndex)); // pAd->PendingRx, pAd->NextRxBulkInIndex, pAd->NextRxBulkInReadIndex));
DBGPRINT_RAW(RT_DEBUG_TRACE, ("CMDTHREAD_RESET_BULK_IN: Submit Rx URB Done, status=%d!\n", pUrb->status)); DBGPRINT_RAW
(RT_DEBUG_TRACE,
("CMDTHREAD_RESET_BULK_IN: Submit Rx URB Done, status=%d!\n",
pUrb->
status));
ASSERT((pRxContext->InUse == pRxContext->IRPPending)); ASSERT((pRxContext->InUse == pRxContext->IRPPending));
} }
} }
} } else {
else
{
// Card must be removed // Card must be removed
if (NT_SUCCESS(ntStatus) != TRUE) if (NT_SUCCESS(ntStatus) !=
{ TRUE) {
RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST); RTMP_SET_FLAG(pAd,
DBGPRINT_RAW(RT_DEBUG_ERROR, ("CMDTHREAD_RESET_BULK_IN: Read Register Failed!Card must be removed!!\n\n")); fRTMP_ADAPTER_NIC_NOT_EXIST);
} DBGPRINT_RAW
else (RT_DEBUG_ERROR,
{ ("CMDTHREAD_RESET_BULK_IN: Read Register Failed!Card must be removed!!\n\n"));
DBGPRINT_RAW(RT_DEBUG_ERROR, ("CMDTHREAD_RESET_BULK_IN: Cannot do bulk in because flags(0x%lx) on !\n", pAd->Flags)); } else {
} DBGPRINT_RAW
} (RT_DEBUG_ERROR,
} ("CMDTHREAD_RESET_BULK_IN: Cannot do bulk in because flags(0x%lx) on !\n",
DBGPRINT_RAW(RT_DEBUG_TRACE, ("CmdThread : CMDTHREAD_RESET_BULK_IN <===\n")); pAd->Flags));
}
}
}
DBGPRINT_RAW(RT_DEBUG_TRACE,
("CmdThread : CMDTHREAD_RESET_BULK_IN <===\n"));
break; break;
case CMDTHREAD_SET_ASIC_WCID: case CMDTHREAD_SET_ASIC_WCID:
...@@ -1425,30 +1609,64 @@ VOID CMDHandler( ...@@ -1425,30 +1609,64 @@ VOID CMDHandler(
RT_SET_ASIC_WCID SetAsicWcid; RT_SET_ASIC_WCID SetAsicWcid;
USHORT offset; USHORT offset;
UINT32 MACValue, MACRValue = 0; UINT32 MACValue, MACRValue = 0;
SetAsicWcid = *((PRT_SET_ASIC_WCID)(pData)); SetAsicWcid =
*((PRT_SET_ASIC_WCID) (pData));
if (SetAsicWcid.WCID >= MAX_LEN_OF_MAC_TABLE) if (SetAsicWcid.WCID >=
MAX_LEN_OF_MAC_TABLE)
return; return;
offset = MAC_WCID_BASE + ((UCHAR)SetAsicWcid.WCID)*HW_WCID_ENTRY_SIZE; offset =
MAC_WCID_BASE +
DBGPRINT_RAW(RT_DEBUG_TRACE, ("CmdThread : CMDTHREAD_SET_ASIC_WCID : WCID = %ld, SetTid = %lx, DeleteTid = %lx.\n", SetAsicWcid.WCID, SetAsicWcid.SetTid, SetAsicWcid.DeleteTid)); ((UCHAR) SetAsicWcid.WCID) *
MACValue = (pAd->MacTab.Content[SetAsicWcid.WCID].Addr[3]<<24)+(pAd->MacTab.Content[SetAsicWcid.WCID].Addr[2]<<16)+(pAd->MacTab.Content[SetAsicWcid.WCID].Addr[1]<<8)+(pAd->MacTab.Content[SetAsicWcid.WCID].Addr[0]); HW_WCID_ENTRY_SIZE;
DBGPRINT_RAW(RT_DEBUG_TRACE, ("1-MACValue= %x,\n", MACValue));
RTUSBWriteMACRegister(pAd, offset, MACValue); DBGPRINT_RAW(RT_DEBUG_TRACE,
("CmdThread : CMDTHREAD_SET_ASIC_WCID : WCID = %ld, SetTid = %lx, DeleteTid = %lx.\n",
SetAsicWcid.WCID,
SetAsicWcid.SetTid,
SetAsicWcid.DeleteTid));
MACValue =
(pAd->MacTab.
Content[SetAsicWcid.WCID].
Addr[3] << 24) +
(pAd->MacTab.
Content[SetAsicWcid.WCID].
Addr[2] << 16) +
(pAd->MacTab.
Content[SetAsicWcid.WCID].
Addr[1] << 8) +
(pAd->MacTab.
Content[SetAsicWcid.WCID].Addr[0]);
DBGPRINT_RAW(RT_DEBUG_TRACE,
("1-MACValue= %x,\n",
MACValue));
RTUSBWriteMACRegister(pAd, offset,
MACValue);
// Read bitmask // Read bitmask
RTUSBReadMACRegister(pAd, offset+4, &MACRValue); RTUSBReadMACRegister(pAd, offset + 4,
if ( SetAsicWcid.DeleteTid != 0xffffffff) &MACRValue);
MACRValue &= (~SetAsicWcid.DeleteTid); if (SetAsicWcid.DeleteTid != 0xffffffff)
MACRValue &=
(~SetAsicWcid.DeleteTid);
if (SetAsicWcid.SetTid != 0xffffffff) if (SetAsicWcid.SetTid != 0xffffffff)
MACRValue |= (SetAsicWcid.SetTid); MACRValue |=
(SetAsicWcid.SetTid);
MACRValue &= 0xffff0000; MACRValue &= 0xffff0000;
MACValue = (pAd->MacTab.Content[SetAsicWcid.WCID].Addr[5]<<8)+pAd->MacTab.Content[SetAsicWcid.WCID].Addr[4]; MACValue =
(pAd->MacTab.
Content[SetAsicWcid.WCID].
Addr[5] << 8) +
pAd->MacTab.Content[SetAsicWcid.
WCID].Addr[4];
MACValue |= MACRValue; MACValue |= MACRValue;
RTUSBWriteMACRegister(pAd, offset+4, MACValue); RTUSBWriteMACRegister(pAd, offset + 4,
MACValue);
DBGPRINT_RAW(RT_DEBUG_TRACE, ("2-MACValue= %x,\n", MACValue)); DBGPRINT_RAW(RT_DEBUG_TRACE,
("2-MACValue= %x,\n",
MACValue));
} }
break; break;
...@@ -1458,52 +1676,96 @@ VOID CMDHandler( ...@@ -1458,52 +1676,96 @@ VOID CMDHandler(
USHORT offset; USHORT offset;
UINT32 MACRValue = 0; UINT32 MACRValue = 0;
SHAREDKEY_MODE_STRUC csr1; SHAREDKEY_MODE_STRUC csr1;
SetAsicWcidAttri = *((PRT_SET_ASIC_WCID_ATTRI)(pData)); SetAsicWcidAttri =
*((PRT_SET_ASIC_WCID_ATTRI)
(pData));
if (SetAsicWcidAttri.WCID >= MAX_LEN_OF_MAC_TABLE) if (SetAsicWcidAttri.WCID >=
MAX_LEN_OF_MAC_TABLE)
return; return;
offset = MAC_WCID_ATTRIBUTE_BASE + ((UCHAR)SetAsicWcidAttri.WCID)*HW_WCID_ATTRI_SIZE; offset =
MAC_WCID_ATTRIBUTE_BASE +
((UCHAR) SetAsicWcidAttri.WCID) *
HW_WCID_ATTRI_SIZE;
DBGPRINT_RAW(RT_DEBUG_TRACE, ("Cmd : CMDTHREAD_SET_ASIC_WCID_CIPHER : WCID = %ld, Cipher = %lx.\n", SetAsicWcidAttri.WCID, SetAsicWcidAttri.Cipher)); DBGPRINT_RAW(RT_DEBUG_TRACE,
("Cmd : CMDTHREAD_SET_ASIC_WCID_CIPHER : WCID = %ld, Cipher = %lx.\n",
SetAsicWcidAttri.WCID,
SetAsicWcidAttri.Cipher));
// Read bitmask // Read bitmask
RTUSBReadMACRegister(pAd, offset, &MACRValue); RTUSBReadMACRegister(pAd, offset,
&MACRValue);
MACRValue = 0; MACRValue = 0;
MACRValue |= (((UCHAR)SetAsicWcidAttri.Cipher) << 1); MACRValue |=
(((UCHAR) SetAsicWcidAttri.
RTUSBWriteMACRegister(pAd, offset, MACRValue); Cipher) << 1);
DBGPRINT_RAW(RT_DEBUG_TRACE, ("2-offset = %x , MACValue= %x,\n", offset, MACRValue));
RTUSBWriteMACRegister(pAd, offset,
offset = PAIRWISE_IVEIV_TABLE_BASE + ((UCHAR)SetAsicWcidAttri.WCID)*HW_IVEIV_ENTRY_SIZE; MACRValue);
DBGPRINT_RAW(RT_DEBUG_TRACE,
("2-offset = %x , MACValue= %x,\n",
offset, MACRValue));
offset =
PAIRWISE_IVEIV_TABLE_BASE +
((UCHAR) SetAsicWcidAttri.WCID) *
HW_IVEIV_ENTRY_SIZE;
MACRValue = 0; MACRValue = 0;
if ( (SetAsicWcidAttri.Cipher <= CIPHER_WEP128)) if ((SetAsicWcidAttri.Cipher <=
MACRValue |= ( pAd->StaCfg.DefaultKeyId << 30); CIPHER_WEP128))
MACRValue |=
(pAd->StaCfg.
DefaultKeyId << 30);
else else
MACRValue |= (0x20000000); MACRValue |= (0x20000000);
RTUSBWriteMACRegister(pAd, offset, MACRValue); RTUSBWriteMACRegister(pAd, offset,
DBGPRINT_RAW(RT_DEBUG_TRACE, ("2-offset = %x , MACValue= %x,\n", offset, MACRValue)); MACRValue);
DBGPRINT_RAW(RT_DEBUG_TRACE,
("2-offset = %x , MACValue= %x,\n",
offset, MACRValue));
// //
// Update cipher algorithm. WSTA always use BSS0 // Update cipher algorithm. WSTA always use BSS0
// //
// for adhoc mode only ,because wep status slow than add key, when use zero config // for adhoc mode only ,because wep status slow than add key, when use zero config
if (pAd->StaCfg.BssType == BSS_ADHOC ) if (pAd->StaCfg.BssType == BSS_ADHOC) {
{ offset =
offset = MAC_WCID_ATTRIBUTE_BASE; MAC_WCID_ATTRIBUTE_BASE;
RTUSBReadMACRegister(pAd, offset, &MACRValue); RTUSBReadMACRegister(pAd,
offset,
&MACRValue);
MACRValue &= (~0xe); MACRValue &= (~0xe);
MACRValue |= (((UCHAR)SetAsicWcidAttri.Cipher) << 1); MACRValue |=
(((UCHAR) SetAsicWcidAttri.
Cipher) << 1);
RTUSBWriteMACRegister(pAd, offset, MACRValue); RTUSBWriteMACRegister(pAd,
offset,
MACRValue);
//Update group key cipher,,because wep status slow than add key, when use zero config //Update group key cipher,,because wep status slow than add key, when use zero config
RTUSBReadMACRegister(pAd, SHARED_KEY_MODE_BASE+4*(0/2), &csr1.word); RTUSBReadMACRegister(pAd,
SHARED_KEY_MODE_BASE
csr1.field.Bss0Key0CipherAlg = SetAsicWcidAttri.Cipher; +
csr1.field.Bss0Key1CipherAlg = SetAsicWcidAttri.Cipher; 4 * (0 /
2),
RTUSBWriteMACRegister(pAd, SHARED_KEY_MODE_BASE+4*(0/2), csr1.word); &csr1.
word);
csr1.field.Bss0Key0CipherAlg =
SetAsicWcidAttri.Cipher;
csr1.field.Bss0Key1CipherAlg =
SetAsicWcidAttri.Cipher;
RTUSBWriteMACRegister(pAd,
SHARED_KEY_MODE_BASE
+
4 * (0 /
2),
csr1.
word);
} }
} }
break; break;
...@@ -1512,27 +1774,28 @@ VOID CMDHandler( ...@@ -1512,27 +1774,28 @@ VOID CMDHandler(
case RT_CMD_SET_KEY_TABLE: //General call for AsicAddPairwiseKeyEntry() case RT_CMD_SET_KEY_TABLE: //General call for AsicAddPairwiseKeyEntry()
{ {
RT_ADD_PAIRWISE_KEY_ENTRY KeyInfo; RT_ADD_PAIRWISE_KEY_ENTRY KeyInfo;
KeyInfo = *((PRT_ADD_PAIRWISE_KEY_ENTRY)(pData)); KeyInfo =
*((PRT_ADD_PAIRWISE_KEY_ENTRY)
(pData));
AsicAddPairwiseKeyEntry(pAd, AsicAddPairwiseKeyEntry(pAd,
KeyInfo.MacAddr, KeyInfo.MacAddr,
(UCHAR)KeyInfo.MacTabMatchWCID, (UCHAR) KeyInfo.
&KeyInfo.CipherKey); MacTabMatchWCID,
&KeyInfo.
CipherKey);
} }
break; break;
case RT_CMD_SET_RX_WCID_TABLE: //General call for RTMPAddWcidAttributeEntry() case RT_CMD_SET_RX_WCID_TABLE: //General call for RTMPAddWcidAttributeEntry()
{ {
PMAC_TABLE_ENTRY pEntry ; PMAC_TABLE_ENTRY pEntry;
UCHAR KeyIdx = 0; UCHAR KeyIdx = 0;
UCHAR CipherAlg = CIPHER_NONE; UCHAR CipherAlg = CIPHER_NONE;
UCHAR ApIdx = BSS0; UCHAR ApIdx = BSS0;
pEntry = (PMAC_TABLE_ENTRY)(pData); pEntry = (PMAC_TABLE_ENTRY) (pData);
RTMPAddWcidAttributeEntry(pAd,
RTMPAddWcidAttributeEntry(
pAd,
ApIdx, ApIdx,
KeyIdx, KeyIdx,
CipherAlg, CipherAlg,
...@@ -1544,53 +1807,99 @@ VOID CMDHandler( ...@@ -1544,53 +1807,99 @@ VOID CMDHandler(
case CMDTHREAD_SET_CLIENT_MAC_ENTRY: case CMDTHREAD_SET_CLIENT_MAC_ENTRY:
{ {
MAC_TABLE_ENTRY *pEntry; MAC_TABLE_ENTRY *pEntry;
pEntry = (MAC_TABLE_ENTRY *)pData; pEntry = (MAC_TABLE_ENTRY *) pData;
{ {
AsicRemovePairwiseKeyEntry(pAd, pEntry->apidx, (UCHAR)pEntry->Aid); AsicRemovePairwiseKeyEntry(pAd,
if ((pEntry->AuthMode <= Ndis802_11AuthModeAutoSwitch) && (pEntry->WepStatus == Ndis802_11Encryption1Enabled)) pEntry->
apidx,
(UCHAR)
pEntry->
Aid);
if ((pEntry->AuthMode <=
Ndis802_11AuthModeAutoSwitch)
&& (pEntry->WepStatus ==
Ndis802_11Encryption1Enabled))
{ {
UINT32 uIV = 1; UINT32 uIV = 1;
PUCHAR ptr; PUCHAR ptr;
ptr = (PUCHAR) &uIV; ptr = (PUCHAR) & uIV;
*(ptr + 3) = (pAd->StaCfg.DefaultKeyId << 6); *(ptr + 3) =
AsicUpdateWCIDIVEIV(pAd, pEntry->Aid, uIV, 0); (pAd->StaCfg.
AsicUpdateWCIDAttribute(pAd, pEntry->Aid, BSS0, pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg, FALSE); DefaultKeyId << 6);
} AsicUpdateWCIDIVEIV(pAd,
else if (pEntry->AuthMode == Ndis802_11AuthModeWPANone) pEntry->
Aid,
uIV,
0);
AsicUpdateWCIDAttribute
(pAd, pEntry->Aid,
BSS0,
pAd->
SharedKey[BSS0]
[pAd->StaCfg.
DefaultKeyId].
CipherAlg, FALSE);
} else if (pEntry->AuthMode ==
Ndis802_11AuthModeWPANone)
{ {
UINT32 uIV = 1; UINT32 uIV = 1;
PUCHAR ptr; PUCHAR ptr;
ptr = (PUCHAR) &uIV; ptr = (PUCHAR) & uIV;
*(ptr + 3) = (pAd->StaCfg.DefaultKeyId << 6); *(ptr + 3) =
AsicUpdateWCIDIVEIV(pAd, pEntry->Aid, uIV, 0); (pAd->StaCfg.
AsicUpdateWCIDAttribute(pAd, pEntry->Aid, BSS0, pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg, FALSE); DefaultKeyId << 6);
} AsicUpdateWCIDIVEIV(pAd,
else pEntry->
{ Aid,
uIV,
0);
AsicUpdateWCIDAttribute
(pAd, pEntry->Aid,
BSS0,
pAd->
SharedKey[BSS0]
[pAd->StaCfg.
DefaultKeyId].
CipherAlg, FALSE);
} else {
// //
// Other case, disable engine. // Other case, disable engine.
// Don't worry WPA key, we will add WPA Key after 4-Way handshaking. // Don't worry WPA key, we will add WPA Key after 4-Way handshaking.
// //
USHORT offset; USHORT offset;
offset = MAC_WCID_ATTRIBUTE_BASE + (pEntry->Aid * HW_WCID_ATTRI_SIZE); offset =
MAC_WCID_ATTRIBUTE_BASE
+
(pEntry->Aid *
HW_WCID_ATTRI_SIZE);
// RX_PKEY_MODE:0 for no security; RX_KEY_TAB:0 for shared key table; BSS_IDX:0 // RX_PKEY_MODE:0 for no security; RX_KEY_TAB:0 for shared key table; BSS_IDX:0
RTUSBWriteMACRegister(pAd, offset, 0); RTUSBWriteMACRegister
(pAd, offset, 0);
} }
} }
AsicUpdateRxWCIDTable(pAd, pEntry->Aid, pEntry->Addr); AsicUpdateRxWCIDTable(pAd, pEntry->Aid,
DBGPRINT(RT_DEBUG_TRACE, ("UpdateRxWCIDTable(): Aid=%d, Addr=%02x:%02x:%02x:%02x:%02x:%02x!\n", pEntry->Aid, pEntry->Addr);
pEntry->Addr[0], pEntry->Addr[1], pEntry->Addr[2], pEntry->Addr[3], pEntry->Addr[4], pEntry->Addr[5])); DBGPRINT(RT_DEBUG_TRACE,
("UpdateRxWCIDTable(): Aid=%d, Addr=%02x:%02x:%02x:%02x:%02x:%02x!\n",
pEntry->Aid, pEntry->Addr[0],
pEntry->Addr[1],
pEntry->Addr[2],
pEntry->Addr[3],
pEntry->Addr[4],
pEntry->Addr[5]));
} }
break; break;
// add by johnli, fix "in_interrupt" error when call "MacTableDeleteEntry" in Rx tasklet // add by johnli, fix "in_interrupt" error when call "MacTableDeleteEntry" in Rx tasklet
case CMDTHREAD_UPDATE_PROTECT: case CMDTHREAD_UPDATE_PROTECT:
{ {
AsicUpdateProtect(pAd, 0, (ALLN_SETPROTECT), TRUE, 0); AsicUpdateProtect(pAd, 0,
(ALLN_SETPROTECT),
TRUE, 0);
} }
break; break;
// end johnli // end johnli
...@@ -1601,74 +1910,159 @@ VOID CMDHandler( ...@@ -1601,74 +1910,159 @@ VOID CMDHandler(
UINT32 KeyIdx; UINT32 KeyIdx;
PNDIS_802_11_WEP pWepKey; PNDIS_802_11_WEP pWepKey;
DBGPRINT(RT_DEBUG_TRACE, ("CmdThread::OID_802_11_ADD_WEP \n")); DBGPRINT(RT_DEBUG_TRACE,
("CmdThread::OID_802_11_ADD_WEP \n"));
pWepKey = (PNDIS_802_11_WEP)pData; pWepKey = (PNDIS_802_11_WEP) pData;
KeyIdx = pWepKey->KeyIndex & 0x0fffffff; KeyIdx = pWepKey->KeyIndex & 0x0fffffff;
// it is a shared key // it is a shared key
if ((KeyIdx >= 4) || ((pWepKey->KeyLength != 5) && (pWepKey->KeyLength != 13))) if ((KeyIdx >= 4)
{ || ((pWepKey->KeyLength != 5)
NdisStatus = NDIS_STATUS_INVALID_DATA; && (pWepKey->KeyLength !=
DBGPRINT(RT_DEBUG_ERROR, ("CmdThread::OID_802_11_ADD_WEP, INVALID_DATA!!\n")); 13))) {
} NdisStatus =
else NDIS_STATUS_INVALID_DATA;
{ DBGPRINT(RT_DEBUG_ERROR,
("CmdThread::OID_802_11_ADD_WEP, INVALID_DATA!!\n"));
} else {
UCHAR CipherAlg; UCHAR CipherAlg;
pAd->SharedKey[BSS0][KeyIdx].KeyLen = (UCHAR) pWepKey->KeyLength; pAd->SharedKey[BSS0][KeyIdx].
NdisMoveMemory(pAd->SharedKey[BSS0][KeyIdx].Key, &pWepKey->KeyMaterial, pWepKey->KeyLength); KeyLen =
CipherAlg = (pAd->SharedKey[BSS0][KeyIdx].KeyLen == 5)? CIPHER_WEP64 : CIPHER_WEP128; (UCHAR) pWepKey->KeyLength;
NdisMoveMemory(pAd->
SharedKey[BSS0]
[KeyIdx].Key,
&pWepKey->
KeyMaterial,
pWepKey->
KeyLength);
CipherAlg =
(pAd->
SharedKey[BSS0][KeyIdx].
KeyLen ==
5) ? CIPHER_WEP64 :
CIPHER_WEP128;
// //
// Change the WEP cipher to CKIP cipher if CKIP KP on. // Change the WEP cipher to CKIP cipher if CKIP KP on.
// Funk UI or Meetinghouse UI will add ckip key from this path. // Funk UI or Meetinghouse UI will add ckip key from this path.
// //
if (pAd->OpMode == OPMODE_STA) if (pAd->OpMode == OPMODE_STA) {
{ pAd->MacTab.
pAd->MacTab.Content[BSSID_WCID].PairwiseKey.CipherAlg = pAd->SharedKey[BSS0][KeyIdx].CipherAlg; Content[BSSID_WCID].
pAd->MacTab.Content[BSSID_WCID].PairwiseKey.KeyLen = pAd->SharedKey[BSS0][KeyIdx].KeyLen; PairwiseKey.
} CipherAlg =
pAd->SharedKey[BSS0][KeyIdx].CipherAlg = CipherAlg; pAd->
if (pWepKey->KeyIndex & 0x80000000) SharedKey[BSS0]
{ [KeyIdx].CipherAlg;
pAd->MacTab.
Content[BSSID_WCID].
PairwiseKey.KeyLen =
pAd->
SharedKey[BSS0]
[KeyIdx].KeyLen;
}
pAd->SharedKey[BSS0][KeyIdx].
CipherAlg = CipherAlg;
if (pWepKey->
KeyIndex & 0x80000000) {
// Default key for tx (shared key) // Default key for tx (shared key)
UCHAR IVEIV[8]; UCHAR IVEIV[8];
UINT32 WCIDAttri, Value; UINT32 WCIDAttri, Value;
USHORT offset, offset2; USHORT offset, offset2;
NdisZeroMemory(IVEIV, 8); NdisZeroMemory(IVEIV,
pAd->StaCfg.DefaultKeyId = (UCHAR) KeyIdx; 8);
pAd->StaCfg.
DefaultKeyId =
(UCHAR) KeyIdx;
// Add BSSID to WCTable. because this is Tx wep key. // Add BSSID to WCTable. because this is Tx wep key.
// WCID Attribute UDF:3, BSSIdx:3, Alg:3, Keytable:1=PAIRWISE KEY, BSSIdx is 0 // WCID Attribute UDF:3, BSSIdx:3, Alg:3, Keytable:1=PAIRWISE KEY, BSSIdx is 0
WCIDAttri = (CipherAlg<<1)|SHAREDKEYTABLE; WCIDAttri =
(CipherAlg << 1) |
offset = MAC_WCID_ATTRIBUTE_BASE + (BSSID_WCID* HW_WCID_ATTRI_SIZE); SHAREDKEYTABLE;
RTUSBWriteMACRegister(pAd, offset, WCIDAttri);
offset =
MAC_WCID_ATTRIBUTE_BASE
+
(BSSID_WCID *
HW_WCID_ATTRI_SIZE);
RTUSBWriteMACRegister
(pAd, offset,
WCIDAttri);
// 1. IV/EIV // 1. IV/EIV
// Specify key index to find shared key. // Specify key index to find shared key.
IVEIV[3] = (UCHAR)(KeyIdx<< 6); //WEP Eiv bit off. groupkey index is not 0 IVEIV[3] = (UCHAR) (KeyIdx << 6); //WEP Eiv bit off. groupkey index is not 0
offset = PAIRWISE_IVEIV_TABLE_BASE + (BSS0Mcast_WCID * HW_IVEIV_ENTRY_SIZE); offset =
offset2 = PAIRWISE_IVEIV_TABLE_BASE + (BSSID_WCID* HW_IVEIV_ENTRY_SIZE); PAIRWISE_IVEIV_TABLE_BASE
for (i=0; i<8;) +
{ (BSS0Mcast_WCID *
Value = IVEIV[i]; HW_IVEIV_ENTRY_SIZE);
Value += (IVEIV[i+1]<<8); offset2 =
Value += (IVEIV[i+2]<<16); PAIRWISE_IVEIV_TABLE_BASE
Value += (IVEIV[i+3]<<24); +
RTUSBWriteMACRegister(pAd, offset+i, Value); (BSSID_WCID *
RTUSBWriteMACRegister(pAd, offset2+i, Value); HW_IVEIV_ENTRY_SIZE);
i+=4; for (i = 0; i < 8;) {
Value =
IVEIV[i];
Value +=
(IVEIV
[i +
1] << 8);
Value +=
(IVEIV
[i +
2] << 16);
Value +=
(IVEIV
[i +
3] << 24);
RTUSBWriteMACRegister
(pAd,
offset + i,
Value);
RTUSBWriteMACRegister
(pAd,
offset2 +
i, Value);
i += 4;
} }
// 2. WCID Attribute UDF:3, BSSIdx:3, Alg:3, Keytable:use share key, BSSIdx is 0 // 2. WCID Attribute UDF:3, BSSIdx:3, Alg:3, Keytable:use share key, BSSIdx is 0
WCIDAttri = (pAd->SharedKey[BSS0][KeyIdx].CipherAlg<<1)|SHAREDKEYTABLE; WCIDAttri =
offset = MAC_WCID_ATTRIBUTE_BASE + (BSS0Mcast_WCID* HW_WCID_ATTRI_SIZE); (pAd->
DBGPRINT(RT_DEBUG_TRACE, ("BSS0Mcast_WCID : offset = %x, WCIDAttri = %x\n", offset, WCIDAttri)); SharedKey[BSS0]
RTUSBWriteMACRegister(pAd, offset, WCIDAttri); [KeyIdx].
CipherAlg << 1) |
} SHAREDKEYTABLE;
AsicAddSharedKeyEntry(pAd, BSS0, (UCHAR)KeyIdx, CipherAlg, pWepKey->KeyMaterial, NULL, NULL); offset =
DBGPRINT(RT_DEBUG_TRACE, ("CmdThread::OID_802_11_ADD_WEP (KeyIdx=%d, Len=%d-byte)\n", KeyIdx, pWepKey->KeyLength)); MAC_WCID_ATTRIBUTE_BASE
+
(BSS0Mcast_WCID *
HW_WCID_ATTRI_SIZE);
DBGPRINT(RT_DEBUG_TRACE,
("BSS0Mcast_WCID : offset = %x, WCIDAttri = %x\n",
offset,
WCIDAttri));
RTUSBWriteMACRegister
(pAd, offset,
WCIDAttri);
}
AsicAddSharedKeyEntry(pAd, BSS0,
(UCHAR)
KeyIdx,
CipherAlg,
pWepKey->
KeyMaterial,
NULL,
NULL);
DBGPRINT(RT_DEBUG_TRACE,
("CmdThread::OID_802_11_ADD_WEP (KeyIdx=%d, Len=%d-byte)\n",
KeyIdx,
pWepKey->KeyLength));
} }
} }
break; break;
...@@ -1686,7 +2080,7 @@ VOID CMDHandler( ...@@ -1686,7 +2080,7 @@ VOID CMDHandler(
case CMDTHREAD_SET_PSM_BIT: case CMDTHREAD_SET_PSM_BIT:
{ {
USHORT *pPsm = (USHORT *)pData; USHORT *pPsm = (USHORT *) pData;
MlmeSetPsmBit(pAd, *pPsm); MlmeSetPsmBit(pAd, *pPsm);
} }
break; break;
...@@ -1695,20 +2089,20 @@ VOID CMDHandler( ...@@ -1695,20 +2089,20 @@ VOID CMDHandler(
break; break;
default: default:
DBGPRINT(RT_DEBUG_ERROR, ("--> Control Thread !! ERROR !! Unknown(cmdqelmt->command=0x%x) !! \n", cmdqelmt->command)); DBGPRINT(RT_DEBUG_ERROR,
("--> Control Thread !! ERROR !! Unknown(cmdqelmt->command=0x%x) !! \n",
cmdqelmt->command));
break; break;
} }
} }
if (cmdqelmt->CmdFromNdis == TRUE) if (cmdqelmt->CmdFromNdis == TRUE) {
{
if (cmdqelmt->buffer != NULL) if (cmdqelmt->buffer != NULL)
os_free_mem(pAd, cmdqelmt->buffer); os_free_mem(pAd, cmdqelmt->buffer);
os_free_mem(pAd, cmdqelmt); os_free_mem(pAd, cmdqelmt);
} } else {
else if ((cmdqelmt->buffer != NULL)
{ && (cmdqelmt->bufferlength != 0))
if ((cmdqelmt->buffer != NULL) && (cmdqelmt->bufferlength != 0))
os_free_mem(pAd, cmdqelmt->buffer); os_free_mem(pAd, cmdqelmt->buffer);
os_free_mem(pAd, cmdqelmt); os_free_mem(pAd, cmdqelmt);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment