forked from Minki/linux
ath9k: Code scrub
Merge core.c and base.c Remove Antenna Diversity (unused now). Remove unused chainmask handling code. Comment, indentation scrub. Signed-off-by: Sujith <Sujith.Manoharan@atheros.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
bf8c1ac6d8
commit
ff37e337be
@ -9,7 +9,6 @@ ath9k-y += hw.o \
|
||||
main.o \
|
||||
recv.o \
|
||||
xmit.o \
|
||||
rc.o \
|
||||
core.o
|
||||
rc.o
|
||||
|
||||
obj-$(CONFIG_ATH9K) += ath9k.o
|
||||
|
@ -14,13 +14,9 @@
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* Implementation of beacon processing. */
|
||||
|
||||
#include "core.h"
|
||||
|
||||
/*
|
||||
* Configure parameters for the beacon queue
|
||||
*
|
||||
* This function will modify certain transmit queue properties depending on
|
||||
* the operating mode of the station (AP or AdHoc). Parameters are AIFS
|
||||
* settings and channel width min/max
|
||||
@ -54,9 +50,15 @@ static int ath_beaconq_config(struct ath_softc *sc)
|
||||
}
|
||||
}
|
||||
|
||||
static void ath_bstuck_process(struct ath_softc *sc)
|
||||
{
|
||||
DPRINTF(sc, ATH_DBG_BEACON,
|
||||
"%s: stuck beacon; resetting (bmiss count %u)\n",
|
||||
__func__, sc->sc_bmisscount);
|
||||
ath_reset(sc, false);
|
||||
}
|
||||
|
||||
/*
|
||||
* Setup the beacon frame for transmit.
|
||||
*
|
||||
* Associates the beacon frame buffer with a transmit descriptor. Will set
|
||||
* up all required antenna switch parameters, rate codes, and channel flags.
|
||||
* Beacons are always sent out at the lowest rate, and are not retried.
|
||||
@ -138,14 +140,7 @@ static void ath_beacon_setup(struct ath_softc *sc,
|
||||
ctsrate, ctsduration, series, 4, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Generate beacon frame and queue cab data for a vap.
|
||||
*
|
||||
* Updates the contents of the beacon frame. It is assumed that the buffer for
|
||||
* the beacon frame has been allocated in the ATH object, and simply needs to
|
||||
* be filled for this cycle. Also, any CAB (crap after beacon?) traffic will
|
||||
* be added to the beacon frame at this point.
|
||||
*/
|
||||
/* Generate beacon frame and queue cab data for a vap */
|
||||
static struct ath_buf *ath_beacon_generate(struct ath_softc *sc, int if_id)
|
||||
{
|
||||
struct ath_buf *bf;
|
||||
@ -275,14 +270,6 @@ static void ath_beacon_start_adhoc(struct ath_softc *sc, int if_id)
|
||||
sc->sc_bhalq, ito64(bf->bf_daddr), bf->bf_desc);
|
||||
}
|
||||
|
||||
/*
|
||||
* Setup a h/w transmit queue for beacons.
|
||||
*
|
||||
* This function allocates an information structure (struct ath9k_txq_info)
|
||||
* on the stack, sets some specific parameters (zero out channel width
|
||||
* min/max, and enable aifs). The info structure does not need to be
|
||||
* persistant.
|
||||
*/
|
||||
int ath_beaconq_setup(struct ath_hal *ah)
|
||||
{
|
||||
struct ath9k_tx_queue_info qi;
|
||||
@ -295,14 +282,6 @@ int ath_beaconq_setup(struct ath_hal *ah)
|
||||
return ath9k_hw_setuptxqueue(ah, ATH9K_TX_QUEUE_BEACON, &qi);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Allocate and setup an initial beacon frame.
|
||||
*
|
||||
* Allocate a beacon state variable for a specific VAP instance created on
|
||||
* the ATH interface. This routine also calculates the beacon "slot" for
|
||||
* staggared beacons in the mBSSID case.
|
||||
*/
|
||||
int ath_beacon_alloc(struct ath_softc *sc, int if_id)
|
||||
{
|
||||
struct ieee80211_vif *vif;
|
||||
@ -321,7 +300,6 @@ int ath_beacon_alloc(struct ath_softc *sc, int if_id)
|
||||
if (!avp->av_bcbuf) {
|
||||
/* Allocate beacon state for hostap/ibss. We know
|
||||
* a buffer is available. */
|
||||
|
||||
avp->av_bcbuf = list_first_entry(&sc->sc_bbuf,
|
||||
struct ath_buf, list);
|
||||
list_del(&avp->av_bcbuf->list);
|
||||
@ -427,12 +405,6 @@ int ath_beacon_alloc(struct ath_softc *sc, int if_id)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Reclaim beacon resources and return buffer to the pool.
|
||||
*
|
||||
* Checks the VAP to put the beacon frame buffer back to the ATH object
|
||||
* queue, and de-allocates any skbs that were sent as CAB traffic.
|
||||
*/
|
||||
void ath_beacon_return(struct ath_softc *sc, struct ath_vap *avp)
|
||||
{
|
||||
if (avp->av_bcbuf != NULL) {
|
||||
@ -458,13 +430,6 @@ void ath_beacon_return(struct ath_softc *sc, struct ath_vap *avp)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Tasklet for Sending Beacons
|
||||
*
|
||||
* Transmit one or more beacon frames at SWBA. Dynamic updates to the frame
|
||||
* contents are done as needed and the slot time is also adjusted based on
|
||||
* current state.
|
||||
*/
|
||||
void ath9k_beacon_tasklet(unsigned long data)
|
||||
{
|
||||
struct ath_softc *sc = (struct ath_softc *)data;
|
||||
@ -481,9 +446,7 @@ void ath9k_beacon_tasklet(unsigned long data)
|
||||
|
||||
if (sc->sc_flags & SC_OP_NO_RESET) {
|
||||
show_cycles = ath9k_hw_GetMibCycleCountsPct(ah,
|
||||
&rx_clear,
|
||||
&rx_frame,
|
||||
&tx_frame);
|
||||
&rx_clear, &rx_frame, &tx_frame);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -605,9 +568,10 @@ void ath9k_beacon_tasklet(unsigned long data)
|
||||
if (sc->sc_updateslot == UPDATE) {
|
||||
sc->sc_updateslot = COMMIT; /* commit next beacon */
|
||||
sc->sc_slotupdate = slot;
|
||||
} else if (sc->sc_updateslot == COMMIT && sc->sc_slotupdate == slot)
|
||||
ath_setslottime(sc); /* commit change to hardware */
|
||||
|
||||
} else if (sc->sc_updateslot == COMMIT && sc->sc_slotupdate == slot) {
|
||||
ath9k_hw_setslottime(sc->sc_ah, sc->sc_slottime);
|
||||
sc->sc_updateslot = OK;
|
||||
}
|
||||
if (bfaddr != 0) {
|
||||
/*
|
||||
* Stop any current dma and put the new frame(s) on the queue.
|
||||
@ -629,20 +593,6 @@ void ath9k_beacon_tasklet(unsigned long data)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Tasklet for Beacon Stuck processing
|
||||
*
|
||||
* Processing for Beacon Stuck.
|
||||
* Basically resets the chip.
|
||||
*/
|
||||
void ath_bstuck_process(struct ath_softc *sc)
|
||||
{
|
||||
DPRINTF(sc, ATH_DBG_BEACON,
|
||||
"%s: stuck beacon; resetting (bmiss count %u)\n",
|
||||
__func__, sc->sc_bmisscount);
|
||||
ath_reset(sc, false);
|
||||
}
|
||||
|
||||
/*
|
||||
* Configure the beacon and sleep timers.
|
||||
*
|
||||
@ -886,8 +836,6 @@ void ath_beacon_config(struct ath_softc *sc, int if_id)
|
||||
}
|
||||
}
|
||||
|
||||
/* Function to collect beacon rssi data and resync beacon if necessary */
|
||||
|
||||
void ath_beacon_sync(struct ath_softc *sc, int if_id)
|
||||
{
|
||||
/*
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -47,10 +47,6 @@
|
||||
|
||||
struct ath_node;
|
||||
|
||||
/******************/
|
||||
/* Utility macros */
|
||||
/******************/
|
||||
|
||||
/* Macro to expand scalars to 64-bit objects */
|
||||
|
||||
#define ito64(x) (sizeof(x) == 8) ? \
|
||||
@ -86,11 +82,6 @@ struct ath_node;
|
||||
|
||||
#define ATH_TXQ_SETUP(sc, i) ((sc)->sc_txqsetup & (1<<i))
|
||||
|
||||
static inline unsigned long get_timestamp(void)
|
||||
{
|
||||
return ((jiffies / HZ) * 1000) + (jiffies % HZ) * (1000 / HZ);
|
||||
}
|
||||
|
||||
static const u8 ath_bcast_mac[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
|
||||
|
||||
/*************/
|
||||
@ -141,34 +132,6 @@ struct ath_config {
|
||||
u8 swBeaconProcess; /* Process received beacons in SW (vs HW) */
|
||||
};
|
||||
|
||||
/***********************/
|
||||
/* Chainmask Selection */
|
||||
/***********************/
|
||||
|
||||
#define ATH_CHAINMASK_SEL_TIMEOUT 6000
|
||||
/* Default - Number of last RSSI values that is used for
|
||||
* chainmask selection */
|
||||
#define ATH_CHAINMASK_SEL_RSSI_CNT 10
|
||||
/* Means use 3x3 chainmask instead of configured chainmask */
|
||||
#define ATH_CHAINMASK_SEL_3X3 7
|
||||
/* Default - Rssi threshold below which we have to switch to 3x3 */
|
||||
#define ATH_CHAINMASK_SEL_UP_RSSI_THRES 20
|
||||
/* Default - Rssi threshold above which we have to switch to
|
||||
* user configured values */
|
||||
#define ATH_CHAINMASK_SEL_DOWN_RSSI_THRES 35
|
||||
/* Struct to store the chainmask select related info */
|
||||
struct ath_chainmask_sel {
|
||||
struct timer_list timer;
|
||||
int cur_tx_mask; /* user configured or 3x3 */
|
||||
int cur_rx_mask; /* user configured or 3x3 */
|
||||
int tx_avgrssi;
|
||||
u8 switch_allowed:1, /* timer will set this */
|
||||
cm_sel_enabled : 1;
|
||||
};
|
||||
|
||||
int ath_chainmask_sel_logic(struct ath_softc *sc, struct ath_node *an);
|
||||
void ath_update_chainmask(struct ath_softc *sc, int is_ht);
|
||||
|
||||
/*************************/
|
||||
/* Descriptor Management */
|
||||
/*************************/
|
||||
@ -240,7 +203,6 @@ struct ath_buf {
|
||||
an aggregate) */
|
||||
struct ath_buf *bf_lastfrm; /* last buf of this frame */
|
||||
struct ath_buf *bf_next; /* next subframe in the aggregate */
|
||||
struct ath_buf *bf_rifslast; /* last buf for RIFS burst */
|
||||
void *bf_mpdu; /* enclosing frame structure */
|
||||
struct ath_desc *bf_desc; /* virtual addr of desc */
|
||||
dma_addr_t bf_daddr; /* physical addr of desc */
|
||||
@ -278,16 +240,10 @@ struct ath_descdma {
|
||||
dma_addr_t dd_dmacontext;
|
||||
};
|
||||
|
||||
int ath_descdma_setup(struct ath_softc *sc,
|
||||
struct ath_descdma *dd,
|
||||
struct list_head *head,
|
||||
const char *name,
|
||||
int nbuf,
|
||||
int ndesc);
|
||||
int ath_desc_alloc(struct ath_softc *sc);
|
||||
void ath_desc_free(struct ath_softc *sc);
|
||||
void ath_descdma_cleanup(struct ath_softc *sc,
|
||||
struct ath_descdma *dd,
|
||||
int ath_descdma_setup(struct ath_softc *sc, struct ath_descdma *dd,
|
||||
struct list_head *head, const char *name,
|
||||
int nbuf, int ndesc);
|
||||
void ath_descdma_cleanup(struct ath_softc *sc, struct ath_descdma *dd,
|
||||
struct list_head *head);
|
||||
|
||||
/***********/
|
||||
@ -452,7 +408,6 @@ int ath_tx_start(struct ath_softc *sc, struct sk_buff *skb,
|
||||
void ath_tx_tasklet(struct ath_softc *sc);
|
||||
u32 ath_txq_depth(struct ath_softc *sc, int qnum);
|
||||
u32 ath_txq_aggr_depth(struct ath_softc *sc, int qnum);
|
||||
void ath_notify_txq_status(struct ath_softc *sc, u16 queue_depth);
|
||||
void ath_tx_cabq(struct ath_softc *sc, struct sk_buff *skb);
|
||||
|
||||
/**********************/
|
||||
@ -517,25 +472,18 @@ struct ath_node_aggr {
|
||||
/* driver-specific node state */
|
||||
struct ath_node {
|
||||
struct ath_softc *an_sc;
|
||||
struct ath_chainmask_sel an_chainmask_sel;
|
||||
struct ath_node_aggr an_aggr;
|
||||
u16 maxampdu;
|
||||
u8 mpdudensity;
|
||||
};
|
||||
|
||||
void ath_tx_resume_tid(struct ath_softc *sc,
|
||||
struct ath_atx_tid *tid);
|
||||
void ath_tx_resume_tid(struct ath_softc *sc, struct ath_atx_tid *tid);
|
||||
bool ath_tx_aggr_check(struct ath_softc *sc, struct ath_node *an, u8 tidno);
|
||||
void ath_tx_aggr_teardown(struct ath_softc *sc,
|
||||
struct ath_node *an, u8 tidno);
|
||||
void ath_tx_aggr_teardown(struct ath_softc *sc, struct ath_node *an, u8 tidno);
|
||||
int ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta,
|
||||
u16 tid, u16 *ssn);
|
||||
int ath_tx_aggr_stop(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid);
|
||||
void ath_tx_aggr_resume(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid);
|
||||
void ath_newassoc(struct ath_softc *sc,
|
||||
struct ath_node *node, int isnew, int isuapsd);
|
||||
void ath_node_attach(struct ath_softc *sc, struct ieee80211_sta *sta);
|
||||
void ath_node_detach(struct ath_softc *sc, struct ieee80211_sta *sta);
|
||||
|
||||
/********/
|
||||
/* VAPs */
|
||||
@ -593,49 +541,8 @@ void ath9k_beacon_tasklet(unsigned long data);
|
||||
void ath_beacon_config(struct ath_softc *sc, int if_id);
|
||||
int ath_beaconq_setup(struct ath_hal *ah);
|
||||
int ath_beacon_alloc(struct ath_softc *sc, int if_id);
|
||||
void ath_bstuck_process(struct ath_softc *sc);
|
||||
void ath_beacon_return(struct ath_softc *sc, struct ath_vap *avp);
|
||||
void ath_beacon_sync(struct ath_softc *sc, int if_id);
|
||||
void ath_get_beaconconfig(struct ath_softc *sc,
|
||||
int if_id,
|
||||
struct ath_beacon_config *conf);
|
||||
/*********************/
|
||||
/* Antenna diversity */
|
||||
/*********************/
|
||||
|
||||
#define ATH_ANT_DIV_MAX_CFG 2
|
||||
#define ATH_ANT_DIV_MIN_IDLE_US 1000000 /* us */
|
||||
#define ATH_ANT_DIV_MIN_SCAN_US 50000 /* us */
|
||||
|
||||
enum ATH_ANT_DIV_STATE{
|
||||
ATH_ANT_DIV_IDLE,
|
||||
ATH_ANT_DIV_SCAN, /* evaluating antenna */
|
||||
};
|
||||
|
||||
struct ath_antdiv {
|
||||
struct ath_softc *antdiv_sc;
|
||||
u8 antdiv_start;
|
||||
enum ATH_ANT_DIV_STATE antdiv_state;
|
||||
u8 antdiv_num_antcfg;
|
||||
u8 antdiv_curcfg;
|
||||
u8 antdiv_bestcfg;
|
||||
int32_t antdivf_rssitrig;
|
||||
int32_t antdiv_lastbrssi[ATH_ANT_DIV_MAX_CFG];
|
||||
u64 antdiv_lastbtsf[ATH_ANT_DIV_MAX_CFG];
|
||||
u64 antdiv_laststatetsf;
|
||||
u8 antdiv_bssid[ETH_ALEN];
|
||||
};
|
||||
|
||||
void ath_slow_ant_div_init(struct ath_antdiv *antdiv,
|
||||
struct ath_softc *sc, int32_t rssitrig);
|
||||
void ath_slow_ant_div_start(struct ath_antdiv *antdiv,
|
||||
u8 num_antcfg,
|
||||
const u8 *bssid);
|
||||
void ath_slow_ant_div_stop(struct ath_antdiv *antdiv);
|
||||
void ath_slow_ant_div(struct ath_antdiv *antdiv,
|
||||
struct ieee80211_hdr *wh,
|
||||
struct ath_rx_status *rx_stats);
|
||||
void ath_setdefantenna(void *sc, u32 antenna);
|
||||
|
||||
/*******/
|
||||
/* ANI */
|
||||
@ -717,30 +624,8 @@ struct ath_rfkill {
|
||||
|
||||
#define ATH_IF_ID_ANY 0xff
|
||||
#define ATH_TXPOWER_MAX 100 /* .5 dBm units */
|
||||
|
||||
#define RSSI_LPF_THRESHOLD -20
|
||||
#define ATH_RSSI_EP_MULTIPLIER (1<<7) /* pow2 to optimize out * and / */
|
||||
#define ATH_RATE_DUMMY_MARKER 0
|
||||
#define ATH_RSSI_LPF_LEN 10
|
||||
#define ATH_RSSI_DUMMY_MARKER 0x127
|
||||
|
||||
#define ATH_EP_MUL(x, mul) ((x) * (mul))
|
||||
#define ATH_EP_RND(x, mul) \
|
||||
((((x)%(mul)) >= ((mul)/2)) ? ((x) + ((mul) - 1)) / (mul) : (x)/(mul))
|
||||
#define ATH_RSSI_OUT(x) \
|
||||
(((x) != ATH_RSSI_DUMMY_MARKER) ? \
|
||||
(ATH_EP_RND((x), ATH_RSSI_EP_MULTIPLIER)) : ATH_RSSI_DUMMY_MARKER)
|
||||
#define ATH_RSSI_IN(x) \
|
||||
(ATH_EP_MUL((x), ATH_RSSI_EP_MULTIPLIER))
|
||||
#define ATH_LPF_RSSI(x, y, len) \
|
||||
((x != ATH_RSSI_DUMMY_MARKER) ? \
|
||||
(((x) * ((len) - 1) + (y)) / (len)) : (y))
|
||||
#define ATH_RSSI_LPF(x, y) do { \
|
||||
if ((y) >= RSSI_LPF_THRESHOLD) \
|
||||
x = ATH_LPF_RSSI((x), \
|
||||
ATH_RSSI_IN((y)), ATH_RSSI_LPF_LEN); \
|
||||
} while (0)
|
||||
|
||||
#define ATH_RATE_DUMMY_MARKER 0
|
||||
|
||||
enum PROT_MODE {
|
||||
PROT_M_NONE = 0,
|
||||
@ -748,12 +633,6 @@ enum PROT_MODE {
|
||||
PROT_M_CTSONLY
|
||||
};
|
||||
|
||||
enum RATE_TYPE {
|
||||
NORMAL_RATE = 0,
|
||||
HALF_RATE,
|
||||
QUARTER_RATE
|
||||
};
|
||||
|
||||
struct ath_ht_info {
|
||||
enum ath9k_ht_macmode tx_chan_width;
|
||||
u8 ext_chan_offset;
|
||||
@ -881,27 +760,9 @@ struct ath_softc {
|
||||
struct ath_ani sc_ani;
|
||||
};
|
||||
|
||||
int ath_init(u16 devid, struct ath_softc *sc);
|
||||
int ath_open(struct ath_softc *sc, struct ath9k_channel *initial_chan);
|
||||
void ath_stop(struct ath_softc *sc);
|
||||
irqreturn_t ath_isr(int irq, void *dev);
|
||||
int ath_reset(struct ath_softc *sc, bool retry_tx);
|
||||
int ath_set_channel(struct ath_softc *sc, struct ath9k_channel *hchan);
|
||||
|
||||
/*********************/
|
||||
/* Utility Functions */
|
||||
/*********************/
|
||||
|
||||
void ath_key_reset(struct ath_softc *sc, u16 keyix, int freeslot);
|
||||
int ath_keyset(struct ath_softc *sc,
|
||||
u16 keyix,
|
||||
struct ath9k_keyval *hk,
|
||||
const u8 mac[ETH_ALEN]);
|
||||
int ath_get_hal_qnum(u16 queue, struct ath_softc *sc);
|
||||
int ath_get_mac80211_qnum(u32 queue, struct ath_softc *sc);
|
||||
void ath_setslottime(struct ath_softc *sc);
|
||||
void ath_update_txpow(struct ath_softc *sc);
|
||||
int ath_cabq_update(struct ath_softc *);
|
||||
u64 ath_extend_tsf(struct ath_softc *sc, u32 rstamp);
|
||||
|
||||
#endif /* CORE_H */
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1401,7 +1401,6 @@ static void ath_tx_status(void *priv, struct ieee80211_supported_band *sband,
|
||||
struct ath_softc *sc = priv;
|
||||
struct ath_rate_priv *ath_rc_priv = priv_sta;
|
||||
struct ath_tx_info_priv *tx_info_priv = NULL;
|
||||
struct ath_node *an;
|
||||
struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
|
||||
struct ieee80211_hdr *hdr;
|
||||
int final_ts_idx, tx_status = 0, is_underrun = 0;
|
||||
@ -1410,21 +1409,15 @@ static void ath_tx_status(void *priv, struct ieee80211_supported_band *sband,
|
||||
hdr = (struct ieee80211_hdr *)skb->data;
|
||||
fc = hdr->frame_control;
|
||||
tx_info_priv = ATH_TX_INFO_PRIV(tx_info);
|
||||
an = (struct ath_node *)sta->drv_priv;
|
||||
final_ts_idx = tx_info_priv->tx.ts_rateindex;
|
||||
|
||||
if (!an || !priv_sta || !ieee80211_is_data(fc) ||
|
||||
if (!priv_sta || !ieee80211_is_data(fc) ||
|
||||
!tx_info_priv->update_rc)
|
||||
goto exit;
|
||||
|
||||
if (tx_info_priv->tx.ts_status & ATH9K_TXERR_FILT)
|
||||
goto exit;
|
||||
|
||||
if (tx_info_priv->tx.ts_rssi > 0) {
|
||||
ATH_RSSI_LPF(an->an_chainmask_sel.tx_avgrssi,
|
||||
tx_info_priv->tx.ts_rssi);
|
||||
}
|
||||
|
||||
/*
|
||||
* If underrun error is seen assume it as an excessive retry only
|
||||
* if prefetch trigger level have reached the max (0x3f for 5416)
|
||||
|
@ -55,6 +55,28 @@ static void ath_rx_buf_link(struct ath_softc *sc, struct ath_buf *bf)
|
||||
ath9k_hw_rxena(ah);
|
||||
}
|
||||
|
||||
static void ath_setdefantenna(struct ath_softc *sc, u32 antenna)
|
||||
{
|
||||
/* XXX block beacon interrupts */
|
||||
ath9k_hw_setantenna(sc->sc_ah, antenna);
|
||||
sc->sc_defant = antenna;
|
||||
sc->sc_rxotherant = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Extend 15-bit time stamp from rx descriptor to
|
||||
* a full 64-bit TSF using the current h/w TSF.
|
||||
*/
|
||||
static u64 ath_extend_tsf(struct ath_softc *sc, u32 rstamp)
|
||||
{
|
||||
u64 tsf;
|
||||
|
||||
tsf = ath9k_hw_gettsf64(sc->sc_ah);
|
||||
if ((tsf & 0x7fff) < rstamp)
|
||||
tsf -= 0x8000;
|
||||
return (tsf & ~0x7fff) | rstamp;
|
||||
}
|
||||
|
||||
static struct sk_buff *ath_rxbuf_alloc(struct ath_softc *sc, u32 len)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
|
@ -147,6 +147,19 @@ static int ath_aggr_query(struct ath_softc *sc, struct ath_node *an, u8 tidno)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void ath_get_beaconconfig(struct ath_softc *sc, int if_id,
|
||||
struct ath_beacon_config *conf)
|
||||
{
|
||||
struct ieee80211_hw *hw = sc->hw;
|
||||
|
||||
/* fill in beacon config data */
|
||||
|
||||
conf->beacon_interval = hw->conf.beacon_int;
|
||||
conf->listen_interval = 100;
|
||||
conf->dtim_count = 1;
|
||||
conf->bmiss_timeout = ATH_DEFAULT_BMISS_LIMIT * conf->listen_interval;
|
||||
}
|
||||
|
||||
/* Calculate Atheros packet type from IEEE80211 packet header */
|
||||
|
||||
static enum ath9k_pkt_type get_hw_packet_type(struct sk_buff *skb)
|
||||
@ -522,7 +535,6 @@ static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf)
|
||||
struct ath_desc *ds = bf->bf_desc;
|
||||
struct ath_desc *lastds = bf->bf_lastbf->bf_desc;
|
||||
struct ath9k_11n_rate_series series[4];
|
||||
struct ath_node *an = NULL;
|
||||
struct sk_buff *skb;
|
||||
struct ieee80211_tx_info *tx_info;
|
||||
struct ieee80211_tx_rate *rates;
|
||||
@ -540,9 +552,6 @@ static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf)
|
||||
tx_info = IEEE80211_SKB_CB(skb);
|
||||
rates = tx_info->control.rates;
|
||||
|
||||
if (tx_info->control.sta)
|
||||
an = (struct ath_node *)tx_info->control.sta->drv_priv;
|
||||
|
||||
if (ieee80211_has_morefrags(fc) ||
|
||||
(le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_FRAG)) {
|
||||
rates[1].count = rates[2].count = rates[3].count = 0;
|
||||
@ -632,9 +641,6 @@ static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf)
|
||||
(rates[i].flags & IEEE80211_TX_RC_SHORT_GI),
|
||||
bf_isshpreamble(bf));
|
||||
|
||||
if (bf_isht(bf) && an)
|
||||
series[i].ChSel = ath_chainmask_sel_logic(sc, an);
|
||||
else
|
||||
series[i].ChSel = sc->sc_tx_chainmask;
|
||||
|
||||
if (rtsctsena)
|
||||
|
Loading…
Reference in New Issue
Block a user