/*************************************************************************** * WT register offsets. * * Wed Oct 22 13:50:20 2003 * Copyright 2003 mjander * mjander@users.sourceforge.org ****************************************************************************/ #ifndef _AU88X0_WT_H #define _AU88X0_WT_H /* WT channels are grouped in banks. Each bank has 0x20 channels. */ /* Bank register address boundary is 0x8000 */ #define NR_WT_PB 0x20 /* WT bank base register (as dword address). */ #define WT_BAR(x) (((x)&0xffe0)<<0x8) #define WT_BANK(x) (x>>5) /* WT Bank registers */ #define WT_CTRL(bank) (((((bank)&1)<<0xd) + 0x00)<<2) /* 0x0000 */ #define WT_SRAMP(bank) (((((bank)&1)<<0xd) + 0x01)<<2) /* 0x0004 */ #define WT_DSREG(bank) (((((bank)&1)<<0xd) + 0x02)<<2) /* 0x0008 */ #define WT_MRAMP(bank) (((((bank)&1)<<0xd) + 0x03)<<2) /* 0x000c */ #define WT_GMODE(bank) (((((bank)&1)<<0xd) + 0x04)<<2) /* 0x0010 */ #define WT_ARAMP(bank) (((((bank)&1)<<0xd) + 0x05)<<2) /* 0x0014 */ /* WT Voice registers */ #define WT_STEREO(voice) ((WT_BAR(voice)+ 0x20 +(((voice)&0x1f)>>1))<<2) /* 0x0080 */ #define WT_MUTE(voice) ((WT_BAR(voice)+ 0x40 +((voice)&0x1f))<<2) /* 0x0100 */ #define WT_RUN(voice) ((WT_BAR(voice)+ 0x60 +((voice)&0x1f))<<2) /* 0x0180 */ /* Some kind of parameters. */ /* PARM0, PARM1 : Filter (0xFF000000), SampleRate (0x0000FFFF) */ /* PARM2, PARM3 : Still unknown */ #define WT_PARM(x,y) (((WT_BAR(x))+ 0x80 +(((x)&0x1f)<<2)+(y))<<2) /* 0x0200 */ #define WT_DELAY(x,y) (((WT_BAR(x))+ 0x100 +(((x)&0x1f)<<2)+(y))<<2) /* 0x0400 */ /* Numeric indexes used by SetReg() and GetReg() */ #if 0 enum { run = 0, /* 0 W 1:run 0:stop */ parm0, /* 1 W filter, samplerate */ parm1, /* 2 W filter, samplerate */ parm2, /* 3 W */ parm3, /* 4 RW volume. This value is calculated using floating point ops. */ sramp, /* 5 W */ mute, /* 6 W 1:mute, 0:unmute */ gmode, /* 7 RO Looks like only bit0 is used. */ aramp, /* 8 W */ mramp, /* 9 W */ ctrl, /* a W */ delay, /* b W All 4 values are written at once with same value. */ dsreg, /* c (R)W */ } wt_reg; #endif typedef struct { u32 parm0; /* this_1E4 */ u32 parm1; /* this_1E8 */ u32 parm2; /* this_1EC */ u32 parm3; /* this_1F0 */ u32 this_1D0; } wt_voice_t; #endif /* _AU88X0_WT_H */ /* End of file */ ='hidden' name='id' value='94c3e614df2117626fccfac8f821c66e30556384'/>
diff options
context:
space:
mode:
authorSara Sharon <sara.sharon@intel.com>2016-12-07 15:04:37 +0200
committerLuca Coelho <luciano.coelho@intel.com>2017-02-06 19:19:23 +0200
commit94c3e614df2117626fccfac8f821c66e30556384 (patch)
treee392db0cd8da876d94b35b379377760f54f8b1cb
parent2c6262b754f3c3338cb40b23880a3ac1f4693b25 (diff)
iwlwifi: mvm: fix pending frame counter calculation
In DQA mode the check whether to decrement the pending frames counter relies on the tid status and not on the txq id. This may result in an inconsistent state of the pending frames counter in case frame is queued on a non aggregation queue but with this TID, and will be followed by a failure to remove the station and later on SYSASSERT 0x3421 when trying to remove the MAC. Such frames are for example bar and qos NDPs. Fix it by aligning the condition of incrementing the counter with the condition of decrementing it - rely on TID state for DQA mode. Also, avoid internal error like this affecting station removal for DQA mode - since we can know for sure it is an internal error. Fixes: cf961e16620f ("iwlwifi: mvm: support dqa-mode agg on non-shared queue") Signed-off-by: Sara Sharon <sara.sharon@intel.com> Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Diffstat
-rw-r--r--drivers/net/wireless/intel/iwlwifi/mvm/sta.c33
-rw-r--r--drivers/net/wireless/intel/iwlwifi/mvm/tx.c5
2 files changed, 25 insertions, 13 deletions
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c