]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/net/wireless/ath/ath9k/ar9003_mac.c
Merge tag 'v2.6.38' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[mv-sheeva.git] / drivers / net / wireless / ath / ath9k / ar9003_mac.c
index 3b424ca1ba844855b798e757e0d0727dd29e9e27..4ceddbbdfcee6d0b24917e6c9bd82e46032dca84 100644 (file)
@@ -182,8 +182,8 @@ static bool ar9003_hw_get_isr(struct ath_hw *ah, enum ath9k_int *masked)
                }
 
                if (sync_cause & AR_INTR_SYNC_LOCAL_TIMEOUT)
-                       ath_print(common, ATH_DBG_INTERRUPT,
-                                 "AR_INTR_SYNC_LOCAL_TIMEOUT\n");
+                       ath_dbg(common, ATH_DBG_INTERRUPT,
+                               "AR_INTR_SYNC_LOCAL_TIMEOUT\n");
 
                REG_WRITE(ah, AR_INTR_SYNC_CAUSE_CLR, sync_cause);
                (void) REG_READ(ah, AR_INTR_SYNC_CAUSE_CLR);
@@ -237,73 +237,76 @@ static int ar9003_hw_proc_txdesc(struct ath_hw *ah, void *ds,
                                 struct ath_tx_status *ts)
 {
        struct ar9003_txs *ads;
+       u32 status;
 
        ads = &ah->ts_ring[ah->ts_tail];
 
-       if ((ads->status8 & AR_TxDone) == 0)
+       status = ACCESS_ONCE(ads->status8);
+       if ((status & AR_TxDone) == 0)
                return -EINPROGRESS;
 
        ah->ts_tail = (ah->ts_tail + 1) % ah->ts_size;
 
        if ((MS(ads->ds_info, AR_DescId) != ATHEROS_VENDOR_ID) ||
            (MS(ads->ds_info, AR_TxRxDesc) != 1)) {
-               ath_print(ath9k_hw_common(ah), ATH_DBG_XMIT,
-                         "Tx Descriptor error %x\n", ads->ds_info);
+               ath_dbg(ath9k_hw_common(ah), ATH_DBG_XMIT,
+                       "Tx Descriptor error %x\n", ads->ds_info);
                memset(ads, 0, sizeof(*ads));
                return -EIO;
        }
 
+       if (status & AR_TxOpExceeded)
+               ts->ts_status |= ATH9K_TXERR_XTXOP;
+       ts->ts_rateindex = MS(status, AR_FinalTxIdx);
+       ts->ts_seqnum = MS(status, AR_SeqNum);
+       ts->tid = MS(status, AR_TxTid);
+
        ts->qid = MS(ads->ds_info, AR_TxQcuNum);
        ts->desc_id = MS(ads->status1, AR_TxDescId);
-       ts->ts_seqnum = MS(ads->status8, AR_SeqNum);
        ts->ts_tstamp = ads->status4;
        ts->ts_status = 0;
        ts->ts_flags  = 0;
 
-       if (ads->status3 & AR_ExcessiveRetries)
+       status = ACCESS_ONCE(ads->status2);
+       ts->ts_rssi_ctl0 = MS(status, AR_TxRSSIAnt00);
+       ts->ts_rssi_ctl1 = MS(status, AR_TxRSSIAnt01);
+       ts->ts_rssi_ctl2 = MS(status, AR_TxRSSIAnt02);
+       if (status & AR_TxBaStatus) {
+               ts->ts_flags |= ATH9K_TX_BA;
+               ts->ba_low = ads->status5;
+               ts->ba_high = ads->status6;
+       }
+
+       status = ACCESS_ONCE(ads->status3);
+       if (status & AR_ExcessiveRetries)
                ts->ts_status |= ATH9K_TXERR_XRETRY;
-       if (ads->status3 & AR_Filtered)
+       if (status & AR_Filtered)
                ts->ts_status |= ATH9K_TXERR_FILT;
-       if (ads->status3 & AR_FIFOUnderrun) {
+       if (status & AR_FIFOUnderrun) {
                ts->ts_status |= ATH9K_TXERR_FIFO;
                ath9k_hw_updatetxtriglevel(ah, true);
        }
-       if (ads->status8 & AR_TxOpExceeded)
-               ts->ts_status |= ATH9K_TXERR_XTXOP;
-       if (ads->status3 & AR_TxTimerExpired)
+       if (status & AR_TxTimerExpired)
                ts->ts_status |= ATH9K_TXERR_TIMER_EXPIRED;
-
-       if (ads->status3 & AR_DescCfgErr)
+       if (status & AR_DescCfgErr)
                ts->ts_flags |= ATH9K_TX_DESC_CFG_ERR;
-       if (ads->status3 & AR_TxDataUnderrun) {
+       if (status & AR_TxDataUnderrun) {
                ts->ts_flags |= ATH9K_TX_DATA_UNDERRUN;
                ath9k_hw_updatetxtriglevel(ah, true);
        }
-       if (ads->status3 & AR_TxDelimUnderrun) {
+       if (status & AR_TxDelimUnderrun) {
                ts->ts_flags |= ATH9K_TX_DELIM_UNDERRUN;
                ath9k_hw_updatetxtriglevel(ah, true);
        }
-       if (ads->status2 & AR_TxBaStatus) {
-               ts->ts_flags |= ATH9K_TX_BA;
-               ts->ba_low = ads->status5;
-               ts->ba_high = ads->status6;
-       }
+       ts->ts_shortretry = MS(status, AR_RTSFailCnt);
+       ts->ts_longretry = MS(status, AR_DataFailCnt);
+       ts->ts_virtcol = MS(status, AR_VirtRetryCnt);
 
-       ts->ts_rateindex = MS(ads->status8, AR_FinalTxIdx);
-
-       ts->ts_rssi = MS(ads->status7, AR_TxRSSICombined);
-       ts->ts_rssi_ctl0 = MS(ads->status2, AR_TxRSSIAnt00);
-       ts->ts_rssi_ctl1 = MS(ads->status2, AR_TxRSSIAnt01);
-       ts->ts_rssi_ctl2 = MS(ads->status2, AR_TxRSSIAnt02);
-       ts->ts_rssi_ext0 = MS(ads->status7, AR_TxRSSIAnt10);
-       ts->ts_rssi_ext1 = MS(ads->status7, AR_TxRSSIAnt11);
-       ts->ts_rssi_ext2 = MS(ads->status7, AR_TxRSSIAnt12);
-       ts->ts_shortretry = MS(ads->status3, AR_RTSFailCnt);
-       ts->ts_longretry = MS(ads->status3, AR_DataFailCnt);
-       ts->ts_virtcol = MS(ads->status3, AR_VirtRetryCnt);
-       ts->ts_antenna = 0;
-
-       ts->tid = MS(ads->status8, AR_TxTid);
+       status = ACCESS_ONCE(ads->status7);
+       ts->ts_rssi = MS(status, AR_TxRSSICombined);
+       ts->ts_rssi_ext0 = MS(status, AR_TxRSSIAnt10);
+       ts->ts_rssi_ext1 = MS(status, AR_TxRSSIAnt11);
+       ts->ts_rssi_ext2 = MS(status, AR_TxRSSIAnt12);
 
        memset(ads, 0, sizeof(*ads));
 
@@ -319,7 +322,6 @@ static void ar9003_hw_set11n_txdesc(struct ath_hw *ah, void *ds,
        if (txpower > ah->txpower_limit)
                txpower = ah->txpower_limit;
 
-       txpower += ah->txpower_indexoffset;
        if (txpower > 63)
                txpower = 63;
 
@@ -407,12 +409,36 @@ static void ar9003_hw_set11n_ratescenario(struct ath_hw *ah, void *ds,
 static void ar9003_hw_set11n_aggr_first(struct ath_hw *ah, void *ds,
                                        u32 aggrLen)
 {
+#define FIRST_DESC_NDELIMS 60
        struct ar9003_txc *ads = (struct ar9003_txc *) ds;
 
        ads->ctl12 |= (AR_IsAggr | AR_MoreAggr);
 
-       ads->ctl17 &= ~AR_AggrLen;
-       ads->ctl17 |= SM(aggrLen, AR_AggrLen);
+       if (ah->ent_mode & AR_ENT_OTP_MPSD) {
+               u32 ctl17, ndelim;
+               /*
+                * Add delimiter when using RTS/CTS with aggregation
+                * and non enterprise AR9003 card
+                */
+               ctl17 = ads->ctl17;
+               ndelim = MS(ctl17, AR_PadDelim);
+
+               if (ndelim < FIRST_DESC_NDELIMS) {
+                       aggrLen += (FIRST_DESC_NDELIMS - ndelim) * 4;
+                       ndelim = FIRST_DESC_NDELIMS;
+               }
+
+               ctl17 &= ~AR_AggrLen;
+               ctl17 |= SM(aggrLen, AR_AggrLen);
+
+               ctl17 &= ~AR_PadDelim;
+               ctl17 |= SM(ndelim, AR_PadDelim);
+
+               ads->ctl17 = ctl17;
+       } else {
+               ads->ctl17 &= ~AR_AggrLen;
+               ads->ctl17 |= SM(aggrLen, AR_AggrLen);
+       }
 }
 
 static void ar9003_hw_set11n_aggr_middle(struct ath_hw *ah, void *ds,
@@ -587,9 +613,9 @@ int ath9k_hw_process_rxdesc_edma(struct ath_hw *ah, struct ath_rx_status *rxs,
                 * possibly be reviewing the last subframe. AR_CRCErr
                 * is the CRC of the actual data.
                 */
-               if (rxsp->status11 & AR_CRCErr) {
+               if (rxsp->status11 & AR_CRCErr)
                        rxs->rs_status |= ATH9K_RXERR_CRC;
-               } else if (rxsp->status11 & AR_PHYErr) {
+               if (rxsp->status11 & AR_PHYErr) {
                        phyerr = MS(rxsp->status11, AR_PHYErrCode);
                        /*
                         * If we reach a point here where AR_PostDelimCRCErr is
@@ -612,11 +638,12 @@ int ath9k_hw_process_rxdesc_edma(struct ath_hw *ah, struct ath_rx_status *rxs,
                                rxs->rs_phyerr = phyerr;
                        }
 
-               } else if (rxsp->status11 & AR_DecryptCRCErr) {
+               }
+               if (rxsp->status11 & AR_DecryptCRCErr)
                        rxs->rs_status |= ATH9K_RXERR_DECRYPT;
-               } else if (rxsp->status11 & AR_MichaelErr) {
+               if (rxsp->status11 & AR_MichaelErr)
                        rxs->rs_status |= ATH9K_RXERR_MIC;
-               } else if (rxsp->status11 & AR_KeyMiss)
+               if (rxsp->status11 & AR_KeyMiss)
                        rxs->rs_status |= ATH9K_RXERR_DECRYPT;
        }
 
@@ -631,10 +658,10 @@ void ath9k_hw_reset_txstatus_ring(struct ath_hw *ah)
        memset((void *) ah->ts_ring, 0,
                ah->ts_size * sizeof(struct ar9003_txs));
 
-       ath_print(ath9k_hw_common(ah), ATH_DBG_XMIT,
-                 "TS Start 0x%x End 0x%x Virt %p, Size %d\n",
-                  ah->ts_paddr_start, ah->ts_paddr_end,
-                  ah->ts_ring, ah->ts_size);
+       ath_dbg(ath9k_hw_common(ah), ATH_DBG_XMIT,
+               "TS Start 0x%x End 0x%x Virt %p, Size %d\n",
+               ah->ts_paddr_start, ah->ts_paddr_end,
+               ah->ts_ring, ah->ts_size);
 
        REG_WRITE(ah, AR_Q_STATUS_RING_START, ah->ts_paddr_start);
        REG_WRITE(ah, AR_Q_STATUS_RING_END, ah->ts_paddr_end);