ath9k_hw: Disable PAPRD based on paprd_ht20_mask for 5GHz
authorMohammed Shafi Shajakhan <mohammed@qca.qualcomm.com>
Fri, 8 Jul 2011 07:31:32 +0000 (13:01 +0530)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 8 Jul 2011 15:47:17 +0000 (11:47 -0400)
Signed-off-by: Mohammed Shafi Shajakhan <mohammed@qca.qualcomm.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/ar9003_paprd.c
drivers/net/wireless/ath/ath9k/hw.h

index de1972307b0a54471fe8198234ad5efbe8a2d69c..f80d1d63398011f4deb02f532d5cb8beade9eb5a 100644 (file)
@@ -21,6 +21,36 @@ void ar9003_paprd_enable(struct ath_hw *ah, bool val)
 {
        struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
        struct ath9k_channel *chan = ah->curchan;
+       struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
+
+       /*
+        * 3 bits for modalHeader5G.papdRateMaskHt20
+        * is used for sub-band disabling of PAPRD.
+        * 5G band is divided into 3 sub-bands -- upper,
+        * middle, lower.
+        * if bit 30 of modalHeader5G.papdRateMaskHt20 is set
+        * -- disable PAPRD for upper band 5GHz
+        * if bit 29 of modalHeader5G.papdRateMaskHt20 is set
+        * -- disable PAPRD for middle band 5GHz
+        * if bit 28 of modalHeader5G.papdRateMaskHt20 is set
+        * -- disable PAPRD for lower band 5GHz
+        */
+
+       if (IS_CHAN_5GHZ(chan)) {
+               if (chan->channel >= UPPER_5G_SUB_BAND_START) {
+                       if (le32_to_cpu(eep->modalHeader5G.papdRateMaskHt20)
+                                                                 & BIT(30))
+                               val = false;
+               } else if (chan->channel >= MID_5G_SUB_BAND_START) {
+                       if (le32_to_cpu(eep->modalHeader5G.papdRateMaskHt20)
+                                                                 & BIT(29))
+                               val = false;
+               } else {
+                       if (le32_to_cpu(eep->modalHeader5G.papdRateMaskHt20)
+                                                                 & BIT(28))
+                               val = false;
+               }
+       }
 
        if (val) {
                ah->paprd_table_write_done = true;
index 818acdd1ba907aa10375a0fd6fd6b236d66281ab..a1c317455bc0883c5e673fa99f3b83a5a1bcc3af 100644 (file)
 #define AR_KEYTABLE_SIZE            128
 #define POWER_UP_TIME               10000
 #define SPUR_RSSI_THRESH            40
+#define UPPER_5G_SUB_BAND_START                5700
+#define MID_5G_SUB_BAND_START          5400
 
 #define CAB_TIMEOUT_VAL             10
 #define BEACON_TIMEOUT_VAL          10