diff options
author | sam <sam@FreeBSD.org> | 2008-05-12 00:32:52 +0000 |
---|---|---|
committer | sam <sam@FreeBSD.org> | 2008-05-12 00:32:52 +0000 |
commit | 84c4dbca4f8c896454fea4783d326b6ae762c495 (patch) | |
tree | 8d1e3a21c6ef5e265717fe9a3c927a97d5d6b097 /sys/dev/ral | |
parent | f663b621286051ac42452779cf814624994dae88 (diff) | |
download | FreeBSD-src-84c4dbca4f8c896454fea4783d326b6ae762c495.zip FreeBSD-src-84c4dbca4f8c896454fea4783d326b6ae762c495.tar.gz |
Update PLCP<->rate mapping support:
o correct mapping of CCK rates to PLCP; was using nonstandard Ralink
values which just happened to also be used by Zydas (so went unnoticed)
o change ieee80211_plcp2rate api to take a phy type instead of a flag
that indicates ofdm/!ofdm
o update drivers to match (restore per-driver code to map rate->PLCP)
Reviewed by: sephe, weongyo, thompsa
Diffstat (limited to 'sys/dev/ral')
-rw-r--r-- | sys/dev/ral/rt2560.c | 28 | ||||
-rw-r--r-- | sys/dev/ral/rt2661.c | 28 |
2 files changed, 52 insertions, 4 deletions
diff --git a/sys/dev/ral/rt2560.c b/sys/dev/ral/rt2560.c index e8823b1..d012b8f 100644 --- a/sys/dev/ral/rt2560.c +++ b/sys/dev/ral/rt2560.c @@ -1238,7 +1238,8 @@ rt2560_decryption_intr(struct rt2560_softc *sc) htole64(((uint64_t)tsf_hi << 32) | tsf_lo); tap->wr_flags = 0; tap->wr_rate = ieee80211_plcp2rate(desc->rate, - le32toh(desc->flags) & RT2560_RX_OFDM); + (desc->flags & htole32(RT2560_RX_OFDM)) ? + IEEE80211_T_OFDM : IEEE80211_T_CCK); tap->wr_antenna = sc->rx_ant; tap->wr_antsignal = RT2560_RSSI(sc, desc->rssi); @@ -1433,6 +1434,29 @@ rt2560_intr(void *arg) #define RT2560_TXRX_TURNAROUND 10 /* us */ +static uint8_t +rt2560_plcp_signal(int rate) +{ + switch (rate) { + /* OFDM rates (cf IEEE Std 802.11a-1999, pp. 14 Table 80) */ + case 12: return 0xb; + case 18: return 0xf; + case 24: return 0xa; + case 36: return 0xe; + case 48: return 0x9; + case 72: return 0xd; + case 96: return 0x8; + case 108: return 0xc; + + /* CCK rates (NB: not IEEE std, device-specific) */ + case 2: return 0x0; + case 4: return 0x1; + case 11: return 0x2; + case 22: return 0x3; + } + return 0xff; /* XXX unsupported/unknown rate */ +} + static void rt2560_setup_tx_desc(struct rt2560_softc *sc, struct rt2560_tx_desc *desc, uint32_t flags, int len, int rate, int encrypt, bus_addr_t physaddr) @@ -1452,7 +1476,7 @@ rt2560_setup_tx_desc(struct rt2560_softc *sc, struct rt2560_tx_desc *desc, RT2560_LOGCWMAX(8)); /* setup PLCP fields */ - desc->plcp_signal = ieee80211_rate2plcp(rate); + desc->plcp_signal = rt2560_plcp_signal(rate); desc->plcp_service = 4; len += IEEE80211_CRC_LEN; diff --git a/sys/dev/ral/rt2661.c b/sys/dev/ral/rt2661.c index 7dfb635..cc89d16 100644 --- a/sys/dev/ral/rt2661.c +++ b/sys/dev/ral/rt2661.c @@ -1119,7 +1119,8 @@ rt2661_rx_intr(struct rt2661_softc *sc) htole64(((uint64_t)tsf_hi << 32) | tsf_lo); tap->wr_flags = 0; tap->wr_rate = ieee80211_plcp2rate(desc->rate, - le32toh(desc->flags) & RT2661_RX_OFDM); + (desc->flags & htole32(RT2661_RX_OFDM)) ? + IEEE80211_T_OFDM : IEEE80211_T_CCK); tap->wr_antsignal = rssi < 0 ? 0 : rssi; bpf_mtap2(ifp->if_bpf, tap, sc->sc_rxtap_len, m); @@ -1246,6 +1247,29 @@ rt2661_intr(void *arg) RAL_UNLOCK(sc); } +static uint8_t +rt2661_plcp_signal(int rate) +{ + switch (rate) { + /* OFDM rates (cf IEEE Std 802.11a-1999, pp. 14 Table 80) */ + case 12: return 0xb; + case 18: return 0xf; + case 24: return 0xa; + case 36: return 0xe; + case 48: return 0x9; + case 72: return 0xd; + case 96: return 0x8; + case 108: return 0xc; + + /* CCK rates (NB: not IEEE std, device-specific) */ + case 2: return 0x0; + case 4: return 0x1; + case 11: return 0x2; + case 22: return 0x3; + } + return 0xff; /* XXX unsupported/unknown rate */ +} + static void rt2661_setup_tx_desc(struct rt2661_softc *sc, struct rt2661_tx_desc *desc, uint32_t flags, uint16_t xflags, int len, int rate, @@ -1277,7 +1301,7 @@ rt2661_setup_tx_desc(struct rt2661_softc *sc, struct rt2661_tx_desc *desc, desc->qid = ac; /* setup PLCP fields */ - desc->plcp_signal = ieee80211_rate2plcp(rate); + desc->plcp_signal = rt2661_plcp_signal(rate); desc->plcp_service = 4; len += IEEE80211_CRC_LEN; |