ath5k: use direct function calls for descriptors when possible
Use direct function calls for ath5k_hw_setup_rx_desc() and ath5k_hw_setup_mrr_tx_desc() instead of a function pointer which always pointed to the same function in the case of ath5k_hw_setup_rx_desc() and which is easily unified in the case of ath5k_hw_setup_mrr_tx_desc(). Also simplify the initialization function for the remaining function pointers. Signed-off-by: Bruno Randolf <br1@einfach.org> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
02a78b42f8
commit
a666819354
|
@ -1127,15 +1127,10 @@ struct ath5k_hw {
|
||||||
/*
|
/*
|
||||||
* Function pointers
|
* Function pointers
|
||||||
*/
|
*/
|
||||||
int (*ah_setup_rx_desc)(struct ath5k_hw *ah, struct ath5k_desc *desc,
|
|
||||||
u32 size, unsigned int flags);
|
|
||||||
int (*ah_setup_tx_desc)(struct ath5k_hw *, struct ath5k_desc *,
|
int (*ah_setup_tx_desc)(struct ath5k_hw *, struct ath5k_desc *,
|
||||||
unsigned int, unsigned int, int, enum ath5k_pkt_type,
|
unsigned int, unsigned int, int, enum ath5k_pkt_type,
|
||||||
unsigned int, unsigned int, unsigned int, unsigned int,
|
unsigned int, unsigned int, unsigned int, unsigned int,
|
||||||
unsigned int, unsigned int, unsigned int, unsigned int);
|
unsigned int, unsigned int, unsigned int, unsigned int);
|
||||||
int (*ah_setup_mrr_tx_desc)(struct ath5k_hw *, struct ath5k_desc *,
|
|
||||||
unsigned int, unsigned int, unsigned int, unsigned int,
|
|
||||||
unsigned int, unsigned int);
|
|
||||||
int (*ah_proc_tx_desc)(struct ath5k_hw *, struct ath5k_desc *,
|
int (*ah_proc_tx_desc)(struct ath5k_hw *, struct ath5k_desc *,
|
||||||
struct ath5k_tx_status *);
|
struct ath5k_tx_status *);
|
||||||
int (*ah_proc_rx_desc)(struct ath5k_hw *, struct ath5k_desc *,
|
int (*ah_proc_rx_desc)(struct ath5k_hw *, struct ath5k_desc *,
|
||||||
|
@ -1236,6 +1231,11 @@ int ath5k_hw_set_slot_time(struct ath5k_hw *ah, unsigned int slot_time);
|
||||||
|
|
||||||
/* Hardware Descriptor Functions */
|
/* Hardware Descriptor Functions */
|
||||||
int ath5k_hw_init_desc_functions(struct ath5k_hw *ah);
|
int ath5k_hw_init_desc_functions(struct ath5k_hw *ah);
|
||||||
|
int ath5k_hw_setup_rx_desc(struct ath5k_hw *ah, struct ath5k_desc *desc,
|
||||||
|
u32 size, unsigned int flags);
|
||||||
|
int ath5k_hw_setup_mrr_tx_desc(struct ath5k_hw *ah, struct ath5k_desc *desc,
|
||||||
|
unsigned int tx_rate1, u_int tx_tries1, u_int tx_rate2,
|
||||||
|
u_int tx_tries2, unsigned int tx_rate3, u_int tx_tries3);
|
||||||
|
|
||||||
/* GPIO Functions */
|
/* GPIO Functions */
|
||||||
void ath5k_hw_set_ledstate(struct ath5k_hw *ah, unsigned int state);
|
void ath5k_hw_set_ledstate(struct ath5k_hw *ah, unsigned int state);
|
||||||
|
|
|
@ -769,7 +769,8 @@ ath5k_attach(struct pci_dev *pdev, struct ieee80211_hw *hw)
|
||||||
* return false w/o doing anything. MAC's that do
|
* return false w/o doing anything. MAC's that do
|
||||||
* support it will return true w/o doing anything.
|
* support it will return true w/o doing anything.
|
||||||
*/
|
*/
|
||||||
ret = ah->ah_setup_mrr_tx_desc(ah, NULL, 0, 0, 0, 0, 0, 0);
|
ret = ath5k_hw_setup_mrr_tx_desc(ah, NULL, 0, 0, 0, 0, 0, 0);
|
||||||
|
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto err;
|
goto err;
|
||||||
if (ret > 0)
|
if (ret > 0)
|
||||||
|
@ -1245,7 +1246,7 @@ ath5k_rxbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf)
|
||||||
ds = bf->desc;
|
ds = bf->desc;
|
||||||
ds->ds_link = bf->daddr; /* link to self */
|
ds->ds_link = bf->daddr; /* link to self */
|
||||||
ds->ds_data = bf->skbaddr;
|
ds->ds_data = bf->skbaddr;
|
||||||
ret = ah->ah_setup_rx_desc(ah, ds, ah->common.rx_bufsize, 0);
|
ret = ath5k_hw_setup_rx_desc(ah, ds, ah->common.rx_bufsize, 0);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
ATH5K_ERR(sc, "%s: could not setup RX desc\n", __func__);
|
ATH5K_ERR(sc, "%s: could not setup RX desc\n", __func__);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -1354,7 +1355,7 @@ ath5k_txbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf,
|
||||||
mrr_tries[i] = info->control.rates[i + 1].count;
|
mrr_tries[i] = info->control.rates[i + 1].count;
|
||||||
}
|
}
|
||||||
|
|
||||||
ah->ah_setup_mrr_tx_desc(ah, ds,
|
ath5k_hw_setup_mrr_tx_desc(ah, ds,
|
||||||
mrr_rate[0], mrr_tries[0],
|
mrr_rate[0], mrr_tries[0],
|
||||||
mrr_rate[1], mrr_tries[1],
|
mrr_rate[1], mrr_tries[1],
|
||||||
mrr_rate[2], mrr_tries[2]);
|
mrr_rate[2], mrr_tries[2]);
|
||||||
|
|
|
@ -277,13 +277,17 @@ static int ath5k_hw_setup_4word_tx_desc(struct ath5k_hw *ah,
|
||||||
/*
|
/*
|
||||||
* Initialize a 4-word multi rate retry tx control descriptor on 5212
|
* Initialize a 4-word multi rate retry tx control descriptor on 5212
|
||||||
*/
|
*/
|
||||||
static int
|
int
|
||||||
ath5k_hw_setup_mrr_tx_desc(struct ath5k_hw *ah, struct ath5k_desc *desc,
|
ath5k_hw_setup_mrr_tx_desc(struct ath5k_hw *ah, struct ath5k_desc *desc,
|
||||||
unsigned int tx_rate1, u_int tx_tries1, u_int tx_rate2,
|
unsigned int tx_rate1, u_int tx_tries1, u_int tx_rate2,
|
||||||
u_int tx_tries2, unsigned int tx_rate3, u_int tx_tries3)
|
u_int tx_tries2, unsigned int tx_rate3, u_int tx_tries3)
|
||||||
{
|
{
|
||||||
struct ath5k_hw_4w_tx_ctl *tx_ctl;
|
struct ath5k_hw_4w_tx_ctl *tx_ctl;
|
||||||
|
|
||||||
|
/* no mrr support for cards older than 5212 */
|
||||||
|
if (ah->ah_version < AR5K_AR5212)
|
||||||
|
return 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Rates can be 0 as long as the retry count is 0 too.
|
* Rates can be 0 as long as the retry count is 0 too.
|
||||||
* A zero rate and nonzero retry count will put the HW into a mode where
|
* A zero rate and nonzero retry count will put the HW into a mode where
|
||||||
|
@ -323,15 +327,6 @@ ath5k_hw_setup_mrr_tx_desc(struct ath5k_hw *ah, struct ath5k_desc *desc,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* no mrr support for cards older than 5212 */
|
|
||||||
static int
|
|
||||||
ath5k_hw_setup_no_mrr(struct ath5k_hw *ah, struct ath5k_desc *desc,
|
|
||||||
unsigned int tx_rate1, u_int tx_tries1, u_int tx_rate2,
|
|
||||||
u_int tx_tries2, unsigned int tx_rate3, u_int tx_tries3)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Proccess the tx status descriptor on 5210/5211
|
* Proccess the tx status descriptor on 5210/5211
|
||||||
*/
|
*/
|
||||||
|
@ -480,8 +475,8 @@ static int ath5k_hw_proc_4word_tx_status(struct ath5k_hw *ah,
|
||||||
/*
|
/*
|
||||||
* Initialize an rx control descriptor
|
* Initialize an rx control descriptor
|
||||||
*/
|
*/
|
||||||
static int ath5k_hw_setup_rx_desc(struct ath5k_hw *ah, struct ath5k_desc *desc,
|
int ath5k_hw_setup_rx_desc(struct ath5k_hw *ah, struct ath5k_desc *desc,
|
||||||
u32 size, unsigned int flags)
|
u32 size, unsigned int flags)
|
||||||
{
|
{
|
||||||
struct ath5k_hw_rx_ctl *rx_ctl;
|
struct ath5k_hw_rx_ctl *rx_ctl;
|
||||||
|
|
||||||
|
@ -658,29 +653,15 @@ static int ath5k_hw_proc_5212_rx_status(struct ath5k_hw *ah,
|
||||||
*/
|
*/
|
||||||
int ath5k_hw_init_desc_functions(struct ath5k_hw *ah)
|
int ath5k_hw_init_desc_functions(struct ath5k_hw *ah)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (ah->ah_version != AR5K_AR5210 &&
|
|
||||||
ah->ah_version != AR5K_AR5211 &&
|
|
||||||
ah->ah_version != AR5K_AR5212)
|
|
||||||
return -ENOTSUPP;
|
|
||||||
|
|
||||||
if (ah->ah_version == AR5K_AR5212) {
|
if (ah->ah_version == AR5K_AR5212) {
|
||||||
ah->ah_setup_rx_desc = ath5k_hw_setup_rx_desc;
|
|
||||||
ah->ah_setup_tx_desc = ath5k_hw_setup_4word_tx_desc;
|
ah->ah_setup_tx_desc = ath5k_hw_setup_4word_tx_desc;
|
||||||
ah->ah_setup_mrr_tx_desc = ath5k_hw_setup_mrr_tx_desc;
|
|
||||||
ah->ah_proc_tx_desc = ath5k_hw_proc_4word_tx_status;
|
ah->ah_proc_tx_desc = ath5k_hw_proc_4word_tx_status;
|
||||||
} else {
|
|
||||||
ah->ah_setup_rx_desc = ath5k_hw_setup_rx_desc;
|
|
||||||
ah->ah_setup_tx_desc = ath5k_hw_setup_2word_tx_desc;
|
|
||||||
ah->ah_setup_mrr_tx_desc = ath5k_hw_setup_no_mrr;
|
|
||||||
ah->ah_proc_tx_desc = ath5k_hw_proc_2word_tx_status;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ah->ah_version == AR5K_AR5212)
|
|
||||||
ah->ah_proc_rx_desc = ath5k_hw_proc_5212_rx_status;
|
ah->ah_proc_rx_desc = ath5k_hw_proc_5212_rx_status;
|
||||||
else if (ah->ah_version <= AR5K_AR5211)
|
} else if (ah->ah_version <= AR5K_AR5211) {
|
||||||
|
ah->ah_setup_tx_desc = ath5k_hw_setup_2word_tx_desc;
|
||||||
|
ah->ah_proc_tx_desc = ath5k_hw_proc_2word_tx_status;
|
||||||
ah->ah_proc_rx_desc = ath5k_hw_proc_5210_rx_status;
|
ah->ah_proc_rx_desc = ath5k_hw_proc_5210_rx_status;
|
||||||
|
} else
|
||||||
|
return -ENOTSUPP;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue