Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/ral/rt2661.c
Show First 20 Lines • Show All 845 Lines • ▼ Show 20 Lines | rt2661_eeprom_read(struct rt2661_softc *sc, uint8_t addr) | ||||
RT2661_EEPROM_CTL(sc, RT2661_C); | RT2661_EEPROM_CTL(sc, RT2661_C); | ||||
return val; | return val; | ||||
} | } | ||||
static void | static void | ||||
rt2661_tx_intr(struct rt2661_softc *sc) | rt2661_tx_intr(struct rt2661_softc *sc) | ||||
{ | { | ||||
struct ieee80211_ratectl_tx_status *txs = &sc->sc_txs; | |||||
struct rt2661_tx_ring *txq; | struct rt2661_tx_ring *txq; | ||||
struct rt2661_tx_data *data; | struct rt2661_tx_data *data; | ||||
uint32_t val; | uint32_t val; | ||||
int error, qid, retrycnt; | int error, qid; | ||||
struct ieee80211vap *vap; | |||||
txs->flags = IEEE80211_RATECTL_TX_FAIL_LONG; | |||||
for (;;) { | for (;;) { | ||||
struct ieee80211_node *ni; | struct ieee80211_node *ni; | ||||
struct mbuf *m; | struct mbuf *m; | ||||
val = RAL_READ(sc, RT2661_STA_CSR4); | val = RAL_READ(sc, RT2661_STA_CSR4); | ||||
if (!(val & RT2661_TX_STAT_VALID)) | if (!(val & RT2661_TX_STAT_VALID)) | ||||
break; | break; | ||||
/* retrieve the queue in which this frame was sent */ | /* retrieve the queue in which this frame was sent */ | ||||
qid = RT2661_TX_QID(val); | qid = RT2661_TX_QID(val); | ||||
txq = (qid <= 3) ? &sc->txq[qid] : &sc->mgtq; | txq = (qid <= 3) ? &sc->txq[qid] : &sc->mgtq; | ||||
/* retrieve rate control algorithm context */ | /* retrieve rate control algorithm context */ | ||||
data = &txq->data[txq->stat]; | data = &txq->data[txq->stat]; | ||||
m = data->m; | m = data->m; | ||||
data->m = NULL; | data->m = NULL; | ||||
ni = data->ni; | ni = data->ni; | ||||
data->ni = NULL; | data->ni = NULL; | ||||
/* if no frame has been sent, ignore */ | /* if no frame has been sent, ignore */ | ||||
if (ni == NULL) | if (ni == NULL) | ||||
continue; | continue; | ||||
else | |||||
vap = ni->ni_vap; | |||||
switch (RT2661_TX_RESULT(val)) { | switch (RT2661_TX_RESULT(val)) { | ||||
case RT2661_TX_SUCCESS: | case RT2661_TX_SUCCESS: | ||||
retrycnt = RT2661_TX_RETRYCNT(val); | txs->status = IEEE80211_RATECTL_TX_SUCCESS; | ||||
txs->long_retries = RT2661_TX_RETRYCNT(val); | |||||
DPRINTFN(sc, 10, "data frame sent successfully after " | DPRINTFN(sc, 10, "data frame sent successfully after " | ||||
"%d retries\n", retrycnt); | "%d retries\n", txs->long_retries); | ||||
if (data->rix != IEEE80211_FIXED_RATE_NONE) | if (data->rix != IEEE80211_FIXED_RATE_NONE) | ||||
ieee80211_ratectl_tx_complete(vap, ni, | ieee80211_ratectl_tx_complete(ni, txs); | ||||
IEEE80211_RATECTL_TX_SUCCESS, | |||||
&retrycnt, NULL); | |||||
error = 0; | error = 0; | ||||
break; | break; | ||||
case RT2661_TX_RETRY_FAIL: | case RT2661_TX_RETRY_FAIL: | ||||
retrycnt = RT2661_TX_RETRYCNT(val); | txs->status = IEEE80211_RATECTL_TX_FAIL_LONG; | ||||
txs->long_retries = RT2661_TX_RETRYCNT(val); | |||||
DPRINTFN(sc, 9, "%s\n", | DPRINTFN(sc, 9, "%s\n", | ||||
"sending data frame failed (too much retries)"); | "sending data frame failed (too much retries)"); | ||||
if (data->rix != IEEE80211_FIXED_RATE_NONE) | if (data->rix != IEEE80211_FIXED_RATE_NONE) | ||||
ieee80211_ratectl_tx_complete(vap, ni, | ieee80211_ratectl_tx_complete(ni, txs); | ||||
IEEE80211_RATECTL_TX_FAILURE, | |||||
&retrycnt, NULL); | |||||
error = 1; | error = 1; | ||||
break; | break; | ||||
default: | default: | ||||
/* other failure */ | /* other failure */ | ||||
device_printf(sc->sc_dev, | device_printf(sc->sc_dev, | ||||
"sending data frame failed 0x%08x\n", val); | "sending data frame failed 0x%08x\n", val); | ||||
error = 1; | error = 1; | ||||
▲ Show 20 Lines • Show All 1,884 Lines • Show Last 20 Lines |