From fabd694ccf8f716fdc029714fb187526420f39d9 Mon Sep 17 00:00:00 2001 From: Vasanthakumar Thiagarajan Date: Fri, 23 Apr 2010 10:14:01 -0700 Subject: [PATCH 13/17] ath9k: Pktlog update for ar9003 Signed-off-by: Vasanthakumar Thiagarajan --- drivers/net/wireless/ath/ath9k/ar9002_mac.c | 3 ++- drivers/net/wireless/ath/ath9k/ar9003_mac.c | 4 +++- drivers/net/wireless/ath/ath9k/hw-ops.h | 5 +++-- drivers/net/wireless/ath/ath9k/hw.c | 3 +-- drivers/net/wireless/ath/ath9k/hw.h | 2 +- drivers/net/wireless/ath/ath9k/pktlog.h | 18 +++++++++--------- drivers/net/wireless/ath/ath9k/recv.c | 15 +++++++++++++-- drivers/net/wireless/ath/ath9k/xmit.c | 14 ++++++++++---- 8 files changed, 42 insertions(+), 22 deletions(-) diff --git a/drivers/net/wireless/ath/ath9k/ar9002_mac.c b/drivers/net/wireless/ath/ath9k/ar9002_mac.c index 2be20d2..89ab919 100644 --- a/drivers/net/wireless/ath/ath9k/ar9002_mac.c +++ b/drivers/net/wireless/ath/ath9k/ar9002_mac.c @@ -215,7 +215,8 @@ static void ar9002_hw_fill_txdesc(struct ath_hw *ah, void *ds, u32 seglen, } static int ar9002_hw_proc_txdesc(struct ath_hw *ah, void *ds, - struct ath_tx_status *ts) + struct ath_tx_status *ts, + void *txs_desc) { struct ar5416_desc *ads = AR5416DESC(ds); diff --git a/drivers/net/wireless/ath/ath9k/ar9003_mac.c b/drivers/net/wireless/ath/ath9k/ar9003_mac.c index 4073107..790507a 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_mac.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c @@ -234,7 +234,8 @@ static void ar9003_hw_fill_txdesc(struct ath_hw *ah, void *ds, u32 seglen, } static int ar9003_hw_proc_txdesc(struct ath_hw *ah, void *ds, - struct ath_tx_status *ts) + struct ath_tx_status *ts, + void *txs_desc) { struct ar9003_txs *ads; @@ -305,6 +306,7 @@ static int ar9003_hw_proc_txdesc(struct ath_hw *ah, void *ds, ts->tid = MS(ads->status8, AR_TxTid); + memcpy(txs_desc, ads, sizeof(*ads)); memset(ads, 0, sizeof(*ads)); return 0; diff --git a/drivers/net/wireless/ath/ath9k/hw-ops.h b/drivers/net/wireless/ath/ath9k/hw-ops.h index 624422a..4fbfa66 100644 --- a/drivers/net/wireless/ath/ath9k/hw-ops.h +++ b/drivers/net/wireless/ath/ath9k/hw-ops.h @@ -67,9 +67,10 @@ static inline void ath9k_hw_filltxdesc(struct ath_hw *ah, void *ds, u32 seglen, } static inline int ath9k_hw_txprocdesc(struct ath_hw *ah, void *ds, - struct ath_tx_status *ts) + struct ath_tx_status *ts, + void *txs_desc) { - return ath9k_hw_ops(ah)->proc_txdesc(ah, ds, ts); + return ath9k_hw_ops(ah)->proc_txdesc(ah, ds, ts, txs_desc); } static inline void ath9k_hw_set11n_txdesc(struct ath_hw *ah, void *ds, diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c index 813f54a..7b9779a 100644 --- a/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c @@ -2471,8 +2471,7 @@ void ath9k_hw_setrxfilter(struct ath_hw *ah, u32 bits) phybits |= AR_PHY_ERR_RADAR; if (bits & ATH9K_RX_FILTER_PHYERR) phybits |= AR_PHY_ERR_OFDM_TIMING | AR_PHY_ERR_CCK_TIMING; - REG_WRITE(ah, AR_PHY_ERR, ah->is_pkt_logging - ? 0xffffffff : phybits); + REG_WRITE(ah, AR_PHY_ERR, 0xffffffff); if (phybits) REG_WRITE(ah, AR_RXCFG, diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h index e61e8f9..9124edd 100644 --- a/drivers/net/wireless/ath/ath9k/hw.h +++ b/drivers/net/wireless/ath/ath9k/hw.h @@ -583,7 +583,7 @@ struct ath_hw_ops { const void *ds0, dma_addr_t buf_addr, unsigned int qcu); int (*proc_txdesc)(struct ath_hw *ah, void *ds, - struct ath_tx_status *ts); + struct ath_tx_status *ts, void* txs_desc); void (*set11n_txdesc)(struct ath_hw *ah, void *ds, u32 pktLen, enum ath9k_pkt_type type, u32 txPower, u32 keyIx, diff --git a/drivers/net/wireless/ath/ath9k/pktlog.h b/drivers/net/wireless/ath/ath9k/pktlog.h index 509a85e..d198a5c 100644 --- a/drivers/net/wireless/ath/ath9k/pktlog.h +++ b/drivers/net/wireless/ath/ath9k/pktlog.h @@ -2,7 +2,7 @@ #define PKTLOG_H #ifdef CONFIG_ATH9K_PKTLOG -#define CUR_PKTLOG_VER 10009 /* Packet log version */ +#define CUR_PKTLOG_VER 10010 /* Packet log version */ #define PKTLOG_MAGIC_NUM 7735225 #define ATH_PKTLOG_TX 0x000000001 #define ATH_PKTLOG_RX 0x000000002 @@ -54,7 +54,7 @@ struct ath_pktlog_txstatus { int32_t misc[0]; /* Can be used for HT specific or other misc info */ } __packed; -#define PKTLOG_MAX_RXSTATUS_WORDS 9 +#define PKTLOG_MAX_RXSTATUS_WORDS 11 struct ath_pktlog_rx { u16 framectrl; /* frame control field from header */ @@ -108,15 +108,15 @@ struct ath_pktlog_rcupdate { int32_t misc[0]; /* Can be used for HT specific or other misc info */ }; -#define TXCTL_OFFSET(ah) 2 +#define TXCTL_OFFSET(ah) (AR_SREV_9300_20_OR_LATER(ah) ? 11 : 2) #define TXCTL_NUMWORDS(ah) (AR_SREV_5416_20_OR_LATER(ah) ? 12 : 8) -#define TXSTATUS_OFFSET(ah) (AR_SREV_5416_20_OR_LATER(ah) ? 14 : 10) -#define TXSTATUS_NUMWORDS(ah) 10 +#define TXSTATUS_OFFSET(ah) (AR_SREV_9300_20_OR_LATER(ah) ? 2 : 14) +#define TXSTATUS_NUMWORDS(ah) (AR_SREV_9300_20_OR_LATER(ah) ? 7 : 10) -#define RXCTL_OFFSET(ah) 3 -#define RXCTL_NUMWORDS(ah) 1 -#define RXSTATUS_OFFSET(ah) 4 -#define RXSTATUS_NUMWORDS(ah) 9 +#define RXCTL_OFFSET(ah) (AR_SREV_9300_20_OR_LATER(ah) ? 0 : 3) +#define RXCTL_NUMWORDS(ah) (AR_SREV_9300_20_OR_LATER(ah) ? 0 : 1) +#define RXSTATUS_OFFSET(ah) (AR_SREV_9300_20_OR_LATER(ah) ? 1 : 4) +#define RXSTATUS_NUMWORDS(ah) (AR_SREV_9300_20_OR_LATER(ah) ? 11 : 9) struct ath_desc_info { u8 txctl_offset; diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c index 5beeccb..146e79d 100644 --- a/drivers/net/wireless/ath/ath9k/recv.c +++ b/drivers/net/wireless/ath/ath9k/recv.c @@ -826,6 +826,7 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp) struct ieee80211_rx_status *rxs; struct ath_hw *ah = sc->sc_ah; struct ath_common *common = ath9k_hw_common(ah); + u32 *rx_desc = NULL; /* * The hw can techncically differ from common->hw when using ath9k * virtual wiphy so to account for that we iterate over the active @@ -902,13 +903,23 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp) dma_type); skb_put(skb, rs.rs_datalen + ah->caps.rx_status_len); - if (ah->caps.rx_status_len) + if (ah->caps.rx_status_len) { + rx_desc = kzalloc(ah->caps.rx_status_len, GFP_ATOMIC); + if (rx_desc == NULL) + BUG_ON(1); + memcpy(rx_desc, skb->data, ah->caps.rx_status_len); skb_pull(skb, ah->caps.rx_status_len); + } ath9k_cmn_rx_skb_postprocess(common, skb, &rs, rxs, decrypt_error); - ath_pktlog_rx(sc, bf->bf_desc, skb); + if (rx_desc) { + ath_pktlog_rx(sc, (void *) rx_desc, skb); + kfree(rx_desc); + } else { + ath_pktlog_rx(sc, bf->bf_desc, skb); + } /* We will now give hardware our shiny new allocated skb */ bf->bf_mpdu = requeue_skb; diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c index b5602ed..7300a30 100644 --- a/drivers/net/wireless/ath/ath9k/xmit.c +++ b/drivers/net/wireless/ath/ath9k/xmit.c @@ -2117,7 +2117,7 @@ static void ath_tx_processq(struct ath_softc *sc, struct ath_txq *txq) ds = lastbf->bf_desc; memset(&ts, 0, sizeof(ts)); - status = ath9k_hw_txprocdesc(ah, ds, &ts); + status = ath9k_hw_txprocdesc(ah, ds, &ts, NULL); if (status == -EINPROGRESS) { spin_unlock_bh(&txq->axq_lock); break; @@ -2246,9 +2246,11 @@ void ath_tx_edma_tasklet(struct ath_softc *sc) struct list_head bf_head; int status; int txok; + u32 txs_desc[9]; for (;;) { - status = ath9k_hw_txprocdesc(ah, NULL, (void *)&txs); + status = ath9k_hw_txprocdesc(ah, NULL, (void *)&txs, + (void *) txs_desc); if (status == -EINPROGRESS) break; if (status == -EIO) { @@ -2301,14 +2303,18 @@ void ath_tx_edma_tasklet(struct ath_softc *sc) ath_tx_rc_status(bf, &txs, 0, txok, true); } - if (bf_isampdu(bf)) + if (bf_isampdu(bf)) { ath_tx_complete_aggr(sc, txq, bf, &bf_head, &txs, txok); - else + } else { + ath9k_pktlog_txctrl(sc, &bf_head, lastbf); ath_tx_complete_buf(sc, bf, txq, &bf_head, &txs, txok, 0); + } ath_wake_mac80211_queue(sc, txq); + ath_pktlog_txstatus(sc, txs_desc); + spin_lock_bh(&txq->axq_lock); if (!list_empty(&txq->txq_fifo_pending)) { INIT_LIST_HEAD(&bf_head); -- 1.6.3.3