1. 13 4月, 2011 1 次提交
    • F
      ath9k_hw: fix stopping rx DMA during resets · 5882da02
      Felix Fietkau 提交于
      During PHY errors, the MAC can sometimes fail to enter an idle state on older
      hardware (before AR9380) after an rx stop has been requested.
      
      This typically shows up in the kernel log with messages like these:
      
      ath: Could not stop RX, we could be confusing the DMA engine when we start RX up
      ------------[ cut here ]------------
      WARNING: at drivers/net/wireless/ath/ath9k/recv.c:504 ath_stoprecv+0xcc/0xf0 [ath9k]()
      Call Trace:
      [<8023f0e8>] dump_stack+0x8/0x34
      [<80075050>] warn_slowpath_common+0x78/0xa4
      [<80075094>] warn_slowpath_null+0x18/0x24
      [<80d66d60>] ath_stoprecv+0xcc/0xf0 [ath9k]
      [<80d642cc>] ath_set_channel+0xbc/0x270 [ath9k]
      [<80d65254>] ath_radio_disable+0x4a4/0x7fc [ath9k]
      
      When this happens, the state that the MAC enters is easy to identify and
      does not result in bogus DMA traffic, however to ensure a working state
      after a channel change, the hardware should still be reset.
      
      This patch adds detection for this specific MAC state, after which the above
      warnings completely disappear in my tests.
      Signed-off-by: NFelix Fietkau <nbd@openwrt.org>
      Cc: stable@kernel.org
      Cc: Kyungwan Nam <Kyungwan.Nam@Atheros.com>
      Signed-off-by: NJohn W. Linville <linville@tuxdriver.com>
      5882da02
  2. 15 3月, 2011 2 次提交
    • F
      ath9k: improve reliability of beacon transmission and stuck beacon handling · efff395e
      Felix Fietkau 提交于
      ath9k calls ath9k_hw_stoptxdma every time it sends a beacon, however there
      is not much point in doing that if the previous beacon and mcast traffic
      went out properly. On AR9380, calling that function too often can result
      in an increase of stuck beacons due to differences in the handling of the
      queue enable/disable functionality.
      
      With this patch, the queue will only be explicitly stopped if the previous
      data frames were not sent successfully. With the beacon code being the
      only remaining user of ath9k_hw_stoptxdma, this function can be simplified
      in order to remove the now pointless attempts at waiting for transmission
      completion, which would never happen at this point due to the different
      method of tx scheduling of the beacon queue.
      Signed-off-by: NFelix Fietkau <nbd@openwrt.org>
      Signed-off-by: NJohn W. Linville <linville@tuxdriver.com>
      efff395e
    • F
      ath9k: fix stopping tx dma on reset · 0d51cccc
      Felix Fietkau 提交于
      In some situations, stopping Tx DMA frequently fails, leading to messages
      like this:
      
      ath: Failed to stop TX DMA in 100 msec after killing last frame
      ath: Failed to stop TX DMA!
      
      This patch uses a few MAC features to abort DMA globally instead of iterating
      over all hardware queues and attempting to stop them individually.
      Not only is that faster and works with a shorter timeout, it also makes the
      process much more reliable.
      
      With this change, I can no longer trigger these messages on AR9380,
      and on AR9280 they become much more rare.
      Signed-off-by: NFelix Fietkau <nbd@openwrt.org>
      Signed-off-by: NJohn W. Linville <linville@tuxdriver.com>
      0d51cccc
  3. 29 1月, 2011 1 次提交
  4. 25 11月, 2010 1 次提交
  5. 10 11月, 2010 3 次提交
    • F
      ath9k_hw: optimize all descriptor access functions · ada9f1ca
      Felix Fietkau 提交于
      Because all of the descriptor data structures are marked as __packed, GCC
      assumes the worst case wrt. alignment and generates unaligned load/store
      instructions on MIPS for access to all fields.
      Since descriptors always have to be 4-byte-aligned, we can just mark the
      data structures with __aligned(4), which allows GCC to generate much more
      efficient code.
      Verified through disassembly and OProfile comparisons.
      Signed-off-by: NFelix Fietkau <nbd@openwrt.org>
      Signed-off-by: NJohn W. Linville <linville@tuxdriver.com>
      ada9f1ca
    • F
      ath9k_hw: optimize tx status descriptor processing · e0e9bc82
      Felix Fietkau 提交于
      Disassembly shows, that at least on MIPS, the compiler generates a lot of
      memory accesses to the same location in the descriptor field parsing.
      Since it is operating on uncached memory, this can be quite expensive in
      this hot path.
      Change the code a bit to help the compiler optimize it properly, and get
      rid of some unused fields in the ath_tx_status struct.
      Signed-off-by: NFelix Fietkau <nbd@openwrt.org>
      Signed-off-by: NJohn W. Linville <linville@tuxdriver.com>
      e0e9bc82
    • F
      ath9k_hw: optimize interrupt mask changes · 4df3071e
      Felix Fietkau 提交于
      OProfile showed that ath9k was spending way too much time in
      ath9k_hw_set_interrupts. Since most of the interrupt mask changes only
      need to globally enable/disable interrupts, it makes sense to split
      this part into separate functions, replacing all calls to
      ath9k_hw_set_interrupts(ah, 0) with ath9k_hw_disable_interrupts(ah).
      
      ath9k_hw_set_interrupts(ah, ah->imask) only gets changed to
      ath9k_hw_enable_interrupts(ah), whenever ah->imask was not changed
      since the point where interrupts were disabled.
      Signed-off-by: NFelix Fietkau <nbd@openwrt.org>
      Signed-off-by: NJohn W. Linville <linville@tuxdriver.com>
      4df3071e
  6. 17 9月, 2010 1 次提交
  7. 13 7月, 2010 1 次提交
  8. 15 6月, 2010 2 次提交
  9. 20 4月, 2010 1 次提交
  10. 17 4月, 2010 11 次提交
  11. 01 4月, 2010 3 次提交
  12. 24 3月, 2010 1 次提交
  13. 13 1月, 2010 1 次提交
  14. 29 12月, 2009 1 次提交
  15. 29 11月, 2009 3 次提交
    • L
      ath9k: Fix maximum tx fifo settings for single stream devices · f4709fdf
      Luis R. Rodriguez 提交于
      Atheros single stream AR9285 and AR9271 have half the PCU TX FIFO
      buffer size of that of dual stream devices. Dual stream devices
      have a max PCU TX FIFO size of 8 KB while single stream devices
      have 4 KB. Single stream devices have an issue though and require
      hardware only to use half of the amount of its capable PCU TX FIFO
      size, 2 KB and this requires a change in software.
      
      Technically a change would not have been required (except for frame
      burst considerations of 128 bytes) if these devices would have been
      able to use the full 4 KB of the PCU TX FIFO size but our systems
      engineers recommend 2 KB to be used only. We enforce this through
      software by reducing the max frame triggger level to 2 KB.
      
      Fixing the max frame trigger level should then have a few benefits:
      
        * The PER will now be adjusted as designed for underruns when the
          max trigger level is reached. This should help alleviate the
          bus as the rate control algorithm chooses a slower rate which
          should ensure frames are transmitted properly under high system
          bus load.
      
        * The poll we use on our TX queues should now trigger and work
          as designed for single stream devices. The hardware passes
          data from each TX queue on the PCU TX FIFO queue respecting each
          queue's priority. The new trigger level ensures this seeding of
          the PCU TX FIFO queue occurs as designed which could mean avoiding
          false resets and actually reseting hw correctly when a TX queue
          is indeed stuck.
      
        * Some undocumented / unsupported behaviour could have been triggered
          when the max trigger level level was being set to 4 KB on single
          stream devices. Its not clear what this issue was to me yet.
      
      Cc: Kyungwan Nam <kyungwan.nam@atheros.com>
      Cc: Bennyam Malavazi <bennyam.malavazi@atheros.com>
      Cc: Stephen Chen <stephen.chen@atheros.com>
      Cc: Shan Palanisamy <shan.palanisamy@atheros.com>
      Cc: Paul Shaw <paul.shaw@atheros.com>
      Signed-off-by: NVasanthakumar Thiagarajan <vasanth@atheros.com>
      Signed-off-by: NLuis R. Rodriguez <lrodriguez@atheros.com>
      Signed-off-by: NJohn W. Linville <linville@tuxdriver.com>
      f4709fdf
    • L
      ath9k: fix processing of TX PS null data frames · e7824a50
      Luis R. Rodriguez 提交于
      When mac80211 was telling us to go into Powersave we listened
      and immediately turned RX off. This meant hardware would not
      see the ACKs from the AP we're associated with and hardware
      we'd end up retransmiting the null data frame in a loop
      helplessly.
      
      Fix this by keeping track of the transmitted nullfunc frames
      and only when we are sure the AP has sent back an ACK do we
      go ahead and shut RX off.
      Signed-off-by: NVasanthakumar Thiagarajan <vasanth@atheros.com>
      Signed-off-by: NVivek Natarajan <Vivek.Natarajan@atheros.com>
      Signed-off-by: NLuis R. Rodriguez <lrodriguez@atheros.com>
      Signed-off-by: NJohn W. Linville <linville@tuxdriver.com>
      e7824a50
    • F
      ath9k: properly use the mac80211 rate control api · 545750d3
      Felix Fietkau 提交于
      This patch changes ath9k to pass proper MCS indexes and flags
      between the RC and the rest of the driver code.
      sc->cur_rate_table remains, as it's used by the RC code internally,
      but the rest of the driver code no longer uses it, so a potential
      new RC for ath9k would not have to update it.
      Signed-off-by: NFelix Fietkau <nbd@openwrt.org>
      Signed-off-by: NJohn W. Linville <linville@tuxdriver.com>
      545750d3
  16. 08 10月, 2009 3 次提交
  17. 09 9月, 2009 1 次提交
  18. 14 8月, 2009 1 次提交
  19. 23 4月, 2009 1 次提交
  20. 28 3月, 2009 1 次提交