diff options
Diffstat (limited to 'sys/dev/ic')
-rw-r--r-- | sys/dev/ic/rt2560.c | 44 | ||||
-rw-r--r-- | sys/dev/ic/rt2560reg.h | 3 | ||||
-rw-r--r-- | sys/dev/ic/rt2560var.h | 4 | ||||
-rw-r--r-- | sys/dev/ic/rt2661.c | 44 | ||||
-rw-r--r-- | sys/dev/ic/rt2661reg.h | 4 | ||||
-rw-r--r-- | sys/dev/ic/rt2661var.h | 4 |
6 files changed, 92 insertions, 11 deletions
diff --git a/sys/dev/ic/rt2560.c b/sys/dev/ic/rt2560.c index fa3a618e66d..f829af55070 100644 --- a/sys/dev/ic/rt2560.c +++ b/sys/dev/ic/rt2560.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rt2560.c,v 1.9 2006/01/14 08:50:38 jsg Exp $ */ +/* $OpenBSD: rt2560.c,v 1.10 2006/01/14 12:43:27 damien Exp $ */ /*- * Copyright (c) 2005, 2006 @@ -104,6 +104,9 @@ void rt2560_decryption_intr(struct rt2560_softc *); void rt2560_rx_intr(struct rt2560_softc *); void rt2560_beacon_expire(struct rt2560_softc *); void rt2560_wakeup_expire(struct rt2560_softc *); +#if NBPFILTER > 0 +uint8_t rt2560_rxrate(struct rt2560_rx_desc *); +#endif int rt2560_ack_rate(struct ieee80211com *, int); uint16_t rt2560_txtime(int, int, uint32_t); uint8_t rt2560_plcp_signal(int); @@ -1330,12 +1333,13 @@ rt2560_decryption_intr(struct rt2560_softc *sc) uint32_t tsf_lo, tsf_hi; /* get timestamp (low and high 32 bits) */ - tsf_lo = RAL_READ(sc, RT2560_CSR16); tsf_hi = RAL_READ(sc, RT2560_CSR17); + tsf_lo = RAL_READ(sc, RT2560_CSR16); tap->wr_tsf = htole64(((uint64_t)tsf_hi << 32) | tsf_lo); tap->wr_flags = 0; + tap->wr_rate = rt2560_rxrate(desc); tap->wr_chan_freq = htole16(ic->ic_ibss_chan->ic_freq); tap->wr_chan_flags = htole16(ic->ic_ibss_chan->ic_flags); @@ -1344,7 +1348,7 @@ rt2560_decryption_intr(struct rt2560_softc *sc) M_DUP_PKTHDR(&mb, m); mb.m_data = (caddr_t)tap; - mb.m_len = sc->sc_rxtap_len; + mb.m_len = sc->sc_txtap_len; mb.m_next = m; mb.m_pkthdr.len += mb.m_len; bpf_mtap(sc->sc_drvbpf, &mb); @@ -1520,6 +1524,40 @@ rt2560_intr(void *arg) #define RT2560_RXTX_TURNAROUND 10 /* us */ /* + * This function is only used by the Rx radiotap code. It returns the rate at + * which a given frame was received. + */ +#if NBPFILTER > 0 +uint8_t +rt2560_rxrate(struct rt2560_rx_desc *desc) +{ + if (letoh32(desc->flags) & RT2560_RX_OFDM) { + /* reverse function of rt2560_plcp_signal */ + switch (desc->rate) { + case 0xb: return 12; + case 0xf: return 18; + case 0xa: return 24; + case 0xe: return 36; + case 0x9: return 48; + case 0xd: return 72; + case 0x8: return 96; + case 0xc: return 108; + } + } else { + if (desc->rate == 10) + return 2; + if (desc->rate == 20) + return 4; + if (desc->rate == 55) + return 11; + if (desc->rate == 110) + return 22; + } + return 2; /* should not get there */ +} +#endif + +/* * Return the expected ack rate for a frame transmitted at rate `rate'. * XXX: this should depend on the destination node basic rate set. */ diff --git a/sys/dev/ic/rt2560reg.h b/sys/dev/ic/rt2560reg.h index d104f14f96d..d0f6909d18b 100644 --- a/sys/dev/ic/rt2560reg.h +++ b/sys/dev/ic/rt2560reg.h @@ -1,4 +1,4 @@ -/* $OpenBSD: rt2560reg.h,v 1.2 2006/01/10 17:40:29 damien Exp $ */ +/* $OpenBSD: rt2560reg.h,v 1.3 2006/01/14 12:43:27 damien Exp $ */ /*- * Copyright (c) 2005, 2006 @@ -230,6 +230,7 @@ struct rt2560_rx_desc { uint32_t flags; #define RT2560_RX_BUSY (1 << 0) #define RT2560_RX_CRC_ERROR (1 << 5) +#define RT2560_RX_OFDM (1 << 6) #define RT2560_RX_PHY_ERROR (1 << 7) #define RT2560_RX_CIPHER_BUSY (1 << 8) #define RT2560_RX_ICV_ERROR (1 << 9) diff --git a/sys/dev/ic/rt2560var.h b/sys/dev/ic/rt2560var.h index 0f117f608bd..a8fe71f8840 100644 --- a/sys/dev/ic/rt2560var.h +++ b/sys/dev/ic/rt2560var.h @@ -1,4 +1,4 @@ -/* $OpenBSD: rt2560var.h,v 1.1 2006/01/09 20:03:34 damien Exp $ */ +/* $OpenBSD: rt2560var.h,v 1.2 2006/01/14 12:43:27 damien Exp $ */ /*- * Copyright (c) 2005, 2006 @@ -21,6 +21,7 @@ struct rt2560_rx_radiotap_header { struct ieee80211_radiotap_header wr_ihdr; uint64_t wr_tsf; uint8_t wr_flags; + uint8_t wr_rate; uint16_t wr_chan_freq; uint16_t wr_chan_flags; uint8_t wr_antenna; @@ -30,6 +31,7 @@ struct rt2560_rx_radiotap_header { #define RT2560_RX_RADIOTAP_PRESENT \ ((1 << IEEE80211_RADIOTAP_TSFT) | \ (1 << IEEE80211_RADIOTAP_FLAGS) | \ + (1 << IEEE80211_RADIOTAP_RATE) | \ (1 << IEEE80211_RADIOTAP_CHANNEL) | \ (1 << IEEE80211_RADIOTAP_ANTENNA) | \ (1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL)) diff --git a/sys/dev/ic/rt2661.c b/sys/dev/ic/rt2661.c index 6db0f3e608d..415b62f1ff1 100644 --- a/sys/dev/ic/rt2661.c +++ b/sys/dev/ic/rt2661.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rt2661.c,v 1.7 2006/01/14 08:50:38 jsg Exp $ */ +/* $OpenBSD: rt2661.c,v 1.8 2006/01/14 12:43:27 damien Exp $ */ /*- * Copyright (c) 2006 @@ -105,6 +105,9 @@ void rt2661_mcu_beacon_expire(struct rt2661_softc *); void rt2661_mcu_wakeup(struct rt2661_softc *); void rt2661_mcu_cmd_intr(struct rt2661_softc *); int rt2661_intr(void *); +#if NBPFILTER > 0 +uint8_t rt2661_rxrate(struct rt2661_rx_desc *); +#endif int rt2661_ack_rate(struct ieee80211com *, int); uint16_t rt2661_txtime(int, int, uint32_t); uint8_t rt2661_plcp_signal(int); @@ -1227,12 +1230,13 @@ rt2661_rx_intr(struct rt2661_softc *sc) uint32_t tsf_lo, tsf_hi; /* get timestamp (low and high 32 bits) */ - tsf_lo = RAL_READ(sc, RT2661_TXRX_CSR12); tsf_hi = RAL_READ(sc, RT2661_TXRX_CSR13); + tsf_lo = RAL_READ(sc, RT2661_TXRX_CSR12); tap->wr_tsf = htole64(((uint64_t)tsf_hi << 32) | tsf_lo); tap->wr_flags = 0; + tap->wr_rate = rt2661_rxrate(desc); tap->wr_chan_freq = htole16(ic->ic_ibss_chan->ic_freq); tap->wr_chan_flags = htole16(ic->ic_ibss_chan->ic_flags); @@ -1240,7 +1244,7 @@ rt2661_rx_intr(struct rt2661_softc *sc) M_DUP_PKTHDR(&mb, m); mb.m_data = (caddr_t)tap; - mb.m_len = sc->sc_rxtap_len; + mb.m_len = sc->sc_txtap_len; mb.m_next = m; mb.m_pkthdr.len += mb.m_len; bpf_mtap(sc->sc_drvbpf, &mb); @@ -1369,6 +1373,40 @@ rt2661_intr(void *arg) #define RAL_SIFS 10 /* us */ /* + * This function is only used by the Rx radiotap code. It returns the rate at + * which a given frame was received. + */ +#if NBPFILTER > 0 +uint8_t +rt2661_rxrate(struct rt2661_rx_desc *desc) +{ + if (letoh32(desc->flags) & RT2661_RX_OFDM) { + /* reverse function of rt2661_plcp_signal */ + switch (desc->rate & 0xf) { + case 0xb: return 12; + case 0xf: return 18; + case 0xa: return 24; + case 0xe: return 36; + case 0x9: return 48; + case 0xd: return 72; + case 0x8: return 96; + case 0xc: return 108; + } + } else { + if (desc->rate == 10) + return 2; + if (desc->rate == 20) + return 4; + if (desc->rate == 55) + return 11; + if (desc->rate == 110) + return 22; + } + return 2; /* should not get there */ +} +#endif + +/* * Return the expected ack rate for a frame transmitted at rate `rate'. * XXX: this should depend on the destination node basic rate set. */ diff --git a/sys/dev/ic/rt2661reg.h b/sys/dev/ic/rt2661reg.h index 659a8fb48f7..9584cb0ec0b 100644 --- a/sys/dev/ic/rt2661reg.h +++ b/sys/dev/ic/rt2661reg.h @@ -1,4 +1,4 @@ -/* $OpenBSD: rt2661reg.h,v 1.4 2006/01/11 21:44:17 damien Exp $ */ +/* $OpenBSD: rt2661reg.h,v 1.5 2006/01/14 12:43:27 damien Exp $ */ /*- * Copyright (c) 2006 @@ -266,7 +266,7 @@ struct rt2661_rx_desc { #define RT2661_RX_PHY_ERROR (1 << 8) #define RT2661_RX_CIPHER_MASK 0x00000600 - uint8_t signal; + uint8_t rate; uint8_t rssi; uint8_t reserved1; uint8_t offset; diff --git a/sys/dev/ic/rt2661var.h b/sys/dev/ic/rt2661var.h index 0f911753810..e7bae7400de 100644 --- a/sys/dev/ic/rt2661var.h +++ b/sys/dev/ic/rt2661var.h @@ -1,4 +1,4 @@ -/* $OpenBSD: rt2661var.h,v 1.2 2006/01/10 21:20:46 damien Exp $ */ +/* $OpenBSD: rt2661var.h,v 1.3 2006/01/14 12:43:27 damien Exp $ */ /*- * Copyright (c) 2006 @@ -21,6 +21,7 @@ struct rt2661_rx_radiotap_header { struct ieee80211_radiotap_header wr_ihdr; uint64_t wr_tsf; uint8_t wr_flags; + uint8_t wr_rate; uint16_t wr_chan_freq; uint16_t wr_chan_flags; uint8_t wr_antsignal; @@ -29,6 +30,7 @@ struct rt2661_rx_radiotap_header { #define RT2661_RX_RADIOTAP_PRESENT \ ((1 << IEEE80211_RADIOTAP_TSFT) | \ (1 << IEEE80211_RADIOTAP_FLAGS) | \ + (1 << IEEE80211_RADIOTAP_RATE) | \ (1 << IEEE80211_RADIOTAP_CHANNEL) | \ (1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL)) |