mirror of
https://github.com/torvalds/linux.git
synced 2026-06-29 09:35:47 +02:00
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> |
||
|---|---|---|
| .. | ||
| ath5k | ||
| ath9k | ||
| b43 | ||
| b43legacy | ||
| hostap | ||
| iwlwifi | ||
| libertas | ||
| libertas_tf | ||
| p54 | ||
| prism54 | ||
| rt2x00 | ||
| zd1211rw | ||
| adm8211.c | ||
| adm8211.h | ||
| airo_cs.c | ||
| airo.c | ||
| airo.h | ||
| airport.c | ||
| arlan-main.c | ||
| arlan-proc.c | ||
| arlan.h | ||
| atmel_cs.c | ||
| atmel_pci.c | ||
| atmel.c | ||
| atmel.h | ||
| hermes_dld.c | ||
| hermes_dld.h | ||
| hermes_rid.h | ||
| hermes.c | ||
| hermes.h | ||
| i82586.h | ||
| i82593.h | ||
| ipw2100.c | ||
| ipw2100.h | ||
| ipw2200.c | ||
| ipw2200.h | ||
| Kconfig | ||
| mac80211_hwsim.c | ||
| Makefile | ||
| netwave_cs.c | ||
| orinoco_cs.c | ||
| orinoco_nortel.c | ||
| orinoco_pci.c | ||
| orinoco_pci.h | ||
| orinoco_plx.c | ||
| orinoco_tmd.c | ||
| orinoco.c | ||
| orinoco.h | ||
| ray_cs.c | ||
| ray_cs.h | ||
| rayctl.h | ||
| rndis_wlan.c | ||
| rtl818x.h | ||
| rtl8180_dev.c | ||
| rtl8180_grf5101.c | ||
| rtl8180_grf5101.h | ||
| rtl8180_max2820.c | ||
| rtl8180_max2820.h | ||
| rtl8180_rtl8225.c | ||
| rtl8180_rtl8225.h | ||
| rtl8180_sa2400.c | ||
| rtl8180_sa2400.h | ||
| rtl8180.h | ||
| rtl8187_dev.c | ||
| rtl8187_rtl8225.c | ||
| rtl8187_rtl8225.h | ||
| rtl8187.h | ||
| spectrum_cs.c | ||
| strip.c | ||
| wavelan_cs.c | ||
| wavelan_cs.h | ||
| wavelan_cs.p.h | ||
| wavelan.c | ||
| wavelan.h | ||
| wavelan.p.h | ||
| wl3501_cs.c | ||
| wl3501.h | ||
| zd1201.c | ||
| zd1201.h | ||