1. 18 12月, 2013 2 次提交
  2. 26 11月, 2013 1 次提交
  3. 16 7月, 2013 1 次提交
  4. 13 6月, 2013 1 次提交
  5. 28 2月, 2013 1 次提交
    • J
      iwlwifi: use coherent DMA memory for command header · 38c0f334
      Johannes Berg 提交于
      Recently in commit 8a964f44
      ("iwlwifi: always copy first 16 bytes of commands") we fixed
      the problem that the hardware writes back to the command and
      that could overwrite parts of the data that was still needed
      and would thus be corrupted.
      
      Investigating this problem more closely we found that this
      write-back isn't really ordered very well with respect to
      other DMA traffic. Therefore, it sometimes happened that the
      write-back occurred after unmapping the command again which
      is clearly an issue and could corrupt the next allocation
      that goes to that spot, or (better) cause IOMMU faults.
      
      To fix this, allocate coherent memory for the first 16 bytes
      of each command, containing the write-back part, and use it
      for all queues. All the dynamic DMA mappings only need to be
      TO_DEVICE then. This ensures that even when the write-back
      happens "too late" it can't hit memory that has been freed
      or a mapping that doesn't exist any more.
      
      Since now the actual command is no longer modified, we can
      also remove CMD_WANT_HCMD and get rid of the DMA sync that
      was necessary to update the scratch pointer.
      Reviewed-by: NEmmanuel Grumbach <emmanuel.grumbach@intel.com>
      Signed-off-by: NJohannes Berg <johannes.berg@intel.com>
      38c0f334
  6. 27 2月, 2013 1 次提交
    • J
      iwlwifi: always copy first 16 bytes of commands · 8a964f44
      Johannes Berg 提交于
      The FH hardware will always write back to the scratch field
      in commands, even host commands not just TX commands, which
      can overwrite parts of the command. This is problematic if
      the command is re-used (with IWL_HCMD_DFL_NOCOPY) and can
      cause calibration issues.
      
      Address this problem by always putting at least the first
      16 bytes into the buffer we also use for the command header
      and therefore make the DMA engine write back into this.
      
      For commands that are smaller than 16 bytes also always map
      enough memory for the DMA engine to write back to.
      
      Cc: stable@vger.kernel.org
      Reviewed-by: NEmmanuel Grumbach <emmanuel.grumbach@intel.com>
      Signed-off-by: NJohannes Berg <johannes.berg@intel.com>
      8a964f44
  7. 05 2月, 2013 1 次提交
    • J
      iwlwifi: use threaded interrupt handler · 2bfb5092
      Johannes Berg 提交于
      With new transports coming up, move to threaded
      interrupt handling now. This has the advantage
      that we can use the same locking scheme with all
      different transports we may need to implement.
      
      Note that the TX path obviously still runs in a
      tasklet, so some spin_lock() calls need to change
      to spin_lock_bh() calls to properly lock out the
      TX path.
      
      In my test on a Calpella platform this has no
      impact on throughput or latency.
      
      Also add lockdep annotations to avoid lockups due
      to catch sending synchronous commands or using
      locks that connect with them from the irq thread.
      Reviewed-by: NEmmanuel Grumbach <emmanuel.grumbach@intel.com>
      Signed-off-by: NJohannes Berg <johannes.berg@intel.com>
      2bfb5092
  8. 01 2月, 2013 1 次提交
  9. 24 1月, 2013 1 次提交
  10. 16 1月, 2013 1 次提交
  11. 03 1月, 2013 2 次提交
  12. 19 11月, 2012 6 次提交
  13. 10 11月, 2012 1 次提交
  14. 01 11月, 2012 1 次提交
    • E
      iwlwifi: handle RFKILL logic in the transport layer · f946b529
      Emmanuel Grumbach 提交于
      No HCMD can be sent while RFKILL is asserted. If a SYNC
      command is running while RFKILL is asserted the fw will
      silently discard it. This means that the driver needs to
      wake the process that sleeps on the CMD_SYNC.
      
      Since the RFKILL interrupt is handled in the transport layer
      and the code that sleeps in CMD_SYNC is also in the transport
      layer, all this logic can be handled there.
      This simplifies the work of the op_mode.
      
      So the transport layer will now return -ERFKILL when a CMD
      is sent and RFKILL is asserted. This will be the case even
      when the CMD is SYNC. The transport layer will return
      -ERFKILL straight away.
      Signed-off-by: NEmmanuel Grumbach <emmanuel.grumbach@intel.com>
      Signed-off-by: NJohannes Berg <johannes.berg@intel.com>
      f946b529
  15. 29 10月, 2012 1 次提交
  16. 23 10月, 2012 1 次提交
  17. 11 9月, 2012 1 次提交
  18. 22 8月, 2012 1 次提交
  19. 26 7月, 2012 1 次提交
    • E
      iwlwifi: get the correct HCMD in the response handler · 96791422
      Emmanuel Grumbach 提交于
      Until now, the response handler of a Host Command got the
      exact same pointer that was also given to the DMA engine.
      We almost never need to the Host Command that was sent while
      handling its response, but when we do need it, we see that
      the command has been modified.
      
      This mystery has been elucidated. The FH (our DMA engine)
      writes its meta data on the buffer in the DRAM. Of course it
      copies the buffer to the NIC first. This was known to happen
      for Tx command, but as a matter of fact, it happens to all
      TFD brought by the FH which doesn't care much about what it
      brings from DRAM to internal SRAM.
      
      So copy the Host Command to yet another buffer so that we
      can properly pass the buffer that was sent originally to the
      fw. Do that only if it was request by the user since very
      few flows need to get the HCMD sent in the response handler.
      Signed-off-by: NEmmanuel Grumbach <emmanuel.grumbach@intel.com>
      Signed-off-by: NJohannes Berg <johannes.berg@intel.com>
      96791422
  20. 25 6月, 2012 1 次提交
  21. 13 6月, 2012 2 次提交
  22. 06 6月, 2012 5 次提交
  23. 25 5月, 2012 1 次提交
    • E
      iwlwifi: fix the Transmit Frame Descriptor rings · ebed633c
      Emmanuel Grumbach 提交于
      The logic that allows to have a short TFD queue was completely wrong.
      We do maintain 256 Transmit Frame Descriptors, but they point to
      recycled buffers. We used to attach and de-attach different TFDs for
      the same buffer and it worked since they pointed to the same buffer.
      
      Also zero the number of BDs after unmapping a TFD. This seems not
      necessary since we don't reclaim the same TFD twice, but I like
      housekeeping.
      
      This patch solves this warning:
      
      [ 6427.079855] WARNING: at lib/dma-debug.c:866 check_unmap+0x727/0x7a0()
      [ 6427.079859] Hardware name: Latitude E6410
      [ 6427.079865] iwlwifi 0000:02:00.0: DMA-API: device driver tries to free DMA memory it has not allocated [device address=0x00000000296d393c] [size=8 bytes]
      [ 6427.079870] Modules linked in: ...
      [ 6427.079950] Pid: 6613, comm: ifconfig Tainted: G           O 3.3.3 #5
      [ 6427.079954] Call Trace:
      [ 6427.079963]  [<c10337a2>] warn_slowpath_common+0x72/0xa0
      [ 6427.079982]  [<c1033873>] warn_slowpath_fmt+0x33/0x40
      [ 6427.079988]  [<c12dcb77>] check_unmap+0x727/0x7a0
      [ 6427.079995]  [<c12dcdaa>] debug_dma_unmap_page+0x5a/0x80
      [ 6427.080024]  [<fe2312ac>] iwlagn_unmap_tfd+0x12c/0x180 [iwlwifi]
      [ 6427.080048]  [<fe231349>] iwlagn_txq_free_tfd+0x49/0xb0 [iwlwifi]
      [ 6427.080071]  [<fe228e37>] iwl_tx_queue_unmap+0x67/0x90 [iwlwifi]
      [ 6427.080095]  [<fe22d221>] iwl_trans_pcie_stop_device+0x341/0x7b0 [iwlwifi]
      [ 6427.080113]  [<fe204b0e>] iwl_down+0x17e/0x260 [iwlwifi]
      [ 6427.080132]  [<fe20efec>] iwlagn_mac_stop+0x6c/0xf0 [iwlwifi]
      [ 6427.080168]  [<fd8480ce>] ieee80211_stop_device+0x5e/0x190 [mac80211]
      [ 6427.080198]  [<fd833208>] ieee80211_do_stop+0x288/0x620 [mac80211]
      [ 6427.080243]  [<fd8335b7>] ieee80211_stop+0x17/0x20 [mac80211]
      [ 6427.080250]  [<c148dac1>] __dev_close_many+0x81/0xd0
      [ 6427.080270]  [<c148db3d>] __dev_close+0x2d/0x50
      [ 6427.080276]  [<c148d152>] __dev_change_flags+0x82/0x150
      [ 6427.080282]  [<c148e3e3>] dev_change_flags+0x23/0x60
      [ 6427.080289]  [<c14f6320>] devinet_ioctl+0x6a0/0x770
      [ 6427.080296]  [<c14f8705>] inet_ioctl+0x95/0xb0
      [ 6427.080304]  [<c147a0f0>] sock_ioctl+0x70/0x270
      
      Cc: stable@vger.kernel.org
      Reported-by: NAntonio Quartulli <ordex@autistici.org>
      Tested-by: NAntonio Quartulli <ordex@autistici.org>
      Signed-off-by: NEmmanuel Grumbach <emmanuel.grumbach@intel.com>
      Reviewed-by: NWey-Yi W Guy <wey-yi.w.guy@intel.com>
      Signed-off-by: NJohannes Berg <johannes.berg@intel.com>
      Signed-off-by: NJohn W. Linville <linville@tuxdriver.com>
      ebed633c
  24. 24 4月, 2012 2 次提交
  25. 18 4月, 2012 3 次提交