summaryrefslogtreecommitdiffstats
path: root/sys/dev/ral
diff options
context:
space:
mode:
authorsam <sam@FreeBSD.org>2008-05-12 00:32:52 +0000
committersam <sam@FreeBSD.org>2008-05-12 00:32:52 +0000
commit84c4dbca4f8c896454fea4783d326b6ae762c495 (patch)
tree8d1e3a21c6ef5e265717fe9a3c927a97d5d6b097 /sys/dev/ral
parentf663b621286051ac42452779cf814624994dae88 (diff)
downloadFreeBSD-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.c28
-rw-r--r--sys/dev/ral/rt2661.c28
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;
OpenPOWER on IntegriCloud