ar9170: handle otus' A-MPDU density definitions
authorChristian Lamparter <chunkeey@web.de>
Fri, 24 Apr 2009 19:35:57 +0000 (21:35 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 6 May 2009 19:14:38 +0000 (15:14 -0400)
Otus uses slightly different set of "Minimum MPDU Start Spacing" values
than the 802.11n D2.0 specifies. (the whole table is shifted by one and
therefore the 16us spacing is not officially available!)

And while we're at it, we also initialize our MAC's density register.
So, this annoying _feature_ will not break TX A-MPDU later.

Signed-off-by: Christian Lamparter <chunkeey@web.de>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ar9170/hw.h
drivers/net/wireless/ath/ar9170/mac.c
drivers/net/wireless/ath/ar9170/main.c

index 95bf812d6fcc8d7bbb1de58e222d8fe9f9ca2760..3293e0fb24fbc79a4a62cb3e7c75ace3f7b9ba76 100644 (file)
@@ -207,6 +207,8 @@ enum ar9170_cmd {
 #define AR9170_MAC_REG_AC1_AC0_TXOP            (AR9170_MAC_REG_BASE + 0xB44)
 #define AR9170_MAC_REG_AC3_AC2_TXOP            (AR9170_MAC_REG_BASE + 0xB48)
 
+#define AR9170_MAC_REG_AMPDU_SET               (AR9170_MAC_REG_BASE + 0xba0)
+
 #define AR9170_MAC_REG_ACK_TABLE               (AR9170_MAC_REG_BASE + 0xC00)
 #define AR9170_MAC_REG_AMPDU_RX_THRESH         (AR9170_MAC_REG_BASE + 0xC50)
 
index 0e5967dd119c2e589c50e8bdbb28e94409b00222..45986b6eadbc06c736d0986a28dae7276bc575bd 100644 (file)
@@ -72,6 +72,24 @@ int ar9170_set_qos(struct ar9170 *ar)
        return ar9170_regwrite_result();
 }
 
+static int ar9170_set_ampdu_density(struct ar9170 *ar, u8 mpdudensity)
+{
+       u32 val;
+
+       /* don't allow AMPDU density > 8us */
+       if (mpdudensity > 6)
+               return -EINVAL;
+
+       /* Watch out! Otus uses slightly different density values. */
+       val = 0x140a00 | (mpdudensity ? (mpdudensity + 1) : 0);
+
+       ar9170_regwrite_begin(ar);
+       ar9170_regwrite(AR9170_MAC_REG_AMPDU_SET, val);
+       ar9170_regwrite_finish();
+
+       return ar9170_regwrite_result();
+}
+
 int ar9170_init_mac(struct ar9170 *ar)
 {
        ar9170_regwrite_begin(ar);
@@ -296,6 +314,11 @@ int ar9170_set_operating_mode(struct ar9170 *ar)
        if (err)
                return err;
 
+       /* set AMPDU density to 8us. */
+       err = ar9170_set_ampdu_density(ar, 6);
+       if (err)
+               return err;
+
        ar9170_regwrite_begin(ar);
 
        ar9170_regwrite(AR9170_MAC_REG_POWERMANAGEMENT, pm_mode);
index 3bd3a61225cea3be9c3a7ea97e8265ade38ef498..4ef1d2fc859c47c8dac22686a3ac72b67a99987f 100644 (file)
@@ -151,8 +151,8 @@ static struct ieee80211_channel ar9170_5ghz_chantable[] = {
                          IEEE80211_HT_CAP_SGI_40 |                     \
                          IEEE80211_HT_CAP_DSSSCCK40 |                  \
                          IEEE80211_HT_CAP_SM_PS,                       \
-       .ampdu_factor   = 3, /* ?? */                                   \
-       .ampdu_density  = 7, /* ?? */                                   \
+       .ampdu_factor   = 3,                                            \
+       .ampdu_density  = 6,                                            \
        .mcs            = {                                             \
                .rx_mask = { 0xFF, 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, },     \
        },                                                              \