4018517a1a
So I dug deeper into the DMA problems I had with iwlagn and a kind soul helped me in that he said something about pci-e alignment and mentioned the iwl_rx_allocate function to check for crossing 4KB boundaries. Since there's 8KB A-MPDU support, crossing 4k boundaries didn't seem like something the device would fail with, but when I looked into the function for a minute anyway I stumbled over this little gem: BUG_ON(rxb->dma_addr & (~DMA_BIT_MASK(36) & 0xff)); Clearly, that is a totally bogus check, one would hope the compiler removes it entirely. (Think about it) After fixing it, I obviously ran into it, nothing guarantees the alignment the way you want it, because of the way skbs and their headroom are allocated. I won't explain that here nor double-check that I'm right, that goes beyond what most of the CC'ed people care about. So then I came up with the patch below, and so far my system has survived minutes with 64K pages, when it would previously fail in seconds. And I haven't seen a single instance of the TX bug either. But when you see the patch it'll be pretty obvious to you why. This should fix the following reported kernel bugs: http://bugzilla.kernel.org/show_bug.cgi?id=11596 http://bugzilla.kernel.org/show_bug.cgi?id=11393 http://bugzilla.kernel.org/show_bug.cgi?id=11983 I haven't checked if there are any elsewhere, but I suppose RHBZ will have a few instances too... I'd like to ask anyone who is CC'ed (those are people I know ran into the bug) to try this patch. I am convinced that this patch is correct in spirit, but I haven't understood why, for example, there are so many unmap calls. I'm not entirely convinced that this is the only bug leading to the TX reply errors. Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com> |
||
---|---|---|
.. | ||
iwl3945-base.c | ||
iwl-3945-commands.h | ||
iwl-3945-core.h | ||
iwl-3945-debug.h | ||
iwl-3945-hw.h | ||
iwl-3945-io.h | ||
iwl-3945-led.c | ||
iwl-3945-led.h | ||
iwl-3945-rs.c | ||
iwl-3945-rs.h | ||
iwl-3945.c | ||
iwl-3945.h | ||
iwl-4965-hw.h | ||
iwl-4965.c | ||
iwl-5000-hw.h | ||
iwl-5000.c | ||
iwl-agn-rs.c | ||
iwl-agn-rs.h | ||
iwl-agn.c | ||
iwl-calib.c | ||
iwl-calib.h | ||
iwl-commands.h | ||
iwl-core.c | ||
iwl-core.h | ||
iwl-csr.h | ||
iwl-debug.h | ||
iwl-debugfs.c | ||
iwl-dev.h | ||
iwl-eeprom.c | ||
iwl-eeprom.h | ||
iwl-fh.h | ||
iwl-hcmd.c | ||
iwl-helpers.h | ||
iwl-io.h | ||
iwl-led.c | ||
iwl-led.h | ||
iwl-power.c | ||
iwl-power.h | ||
iwl-prph.h | ||
iwl-rfkill.c | ||
iwl-rfkill.h | ||
iwl-rx.c | ||
iwl-scan.c | ||
iwl-spectrum.h | ||
iwl-sta.c | ||
iwl-sta.h | ||
iwl-tx.c | ||
Kconfig | ||
Makefile |