diff options
author | David S. Miller <davem@davemloft.net> | 2009-03-17 18:01:30 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-03-17 18:01:30 -0400 |
commit | 2d6a5e9500103680464a723a4564961675652680 (patch) | |
tree | d18903333aae8a4415b179d6e7d38f203724892c /drivers/net/wireless/ath9k/hw.c | |
parent | bd257ed9f1d129b4e881f513a406b435c8852565 (diff) | |
parent | f10023a4ef3f5cc05457b059c6880bc447adfa1f (diff) |
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
Conflicts:
drivers/net/igb/igb_main.c
drivers/net/qlge/qlge_main.c
drivers/net/wireless/ath9k/ath9k.h
drivers/net/wireless/ath9k/core.h
drivers/net/wireless/ath9k/hw.c
Diffstat (limited to 'drivers/net/wireless/ath9k/hw.c')
-rw-r--r-- | drivers/net/wireless/ath9k/hw.c | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/drivers/net/wireless/ath9k/hw.c b/drivers/net/wireless/ath9k/hw.c index eb750a503999..60e55d8c510b 100644 --- a/drivers/net/wireless/ath9k/hw.c +++ b/drivers/net/wireless/ath9k/hw.c | |||
@@ -391,6 +391,25 @@ static void ath9k_hw_set_defaults(struct ath_hw *ah) | |||
391 | } | 391 | } |
392 | 392 | ||
393 | ah->config.intr_mitigation = 1; | 393 | ah->config.intr_mitigation = 1; |
394 | |||
395 | /* | ||
396 | * We need this for PCI devices only (Cardbus, PCI, miniPCI) | ||
397 | * _and_ if on non-uniprocessor systems (Multiprocessor/HT). | ||
398 | * This means we use it for all AR5416 devices, and the few | ||
399 | * minor PCI AR9280 devices out there. | ||
400 | * | ||
401 | * Serialization is required because these devices do not handle | ||
402 | * well the case of two concurrent reads/writes due to the latency | ||
403 | * involved. During one read/write another read/write can be issued | ||
404 | * on another CPU while the previous read/write may still be working | ||
405 | * on our hardware, if we hit this case the hardware poops in a loop. | ||
406 | * We prevent this by serializing reads and writes. | ||
407 | * | ||
408 | * This issue is not present on PCI-Express devices or pre-AR5416 | ||
409 | * devices (legacy, 802.11abg). | ||
410 | */ | ||
411 | if (num_possible_cpus() > 1) | ||
412 | ah->config.serialize_regmode = SER_REG_MODE_AUTO; | ||
394 | } | 413 | } |
395 | 414 | ||
396 | static struct ath_hw *ath9k_hw_newstate(u16 devid, struct ath_softc *sc, | 415 | static struct ath_hw *ath9k_hw_newstate(u16 devid, struct ath_softc *sc, |
@@ -610,7 +629,8 @@ static struct ath_hw *ath9k_hw_do_attach(u16 devid, struct ath_softc *sc, | |||
610 | } | 629 | } |
611 | 630 | ||
612 | if (ah->config.serialize_regmode == SER_REG_MODE_AUTO) { | 631 | if (ah->config.serialize_regmode == SER_REG_MODE_AUTO) { |
613 | if (ah->hw_version.macVersion == AR_SREV_VERSION_5416_PCI) { | 632 | if (ah->hw_version.macVersion == AR_SREV_VERSION_5416_PCI || |
633 | (AR_SREV_9280(ah) && !ah->is_pciexpress)) { | ||
614 | ah->config.serialize_regmode = | 634 | ah->config.serialize_regmode = |
615 | SER_REG_MODE_ON; | 635 | SER_REG_MODE_ON; |
616 | } else { | 636 | } else { |