From 6287af195257f486bc37d22c4e6a4619ac37c4f8 Mon Sep 17 00:00:00 2001 From: sephe Date: Wed, 7 Feb 2007 14:52:42 +0000 Subject: [PATCH] Convert RX desc's rssi field to relative RX signal strength (relative to noise floor). The conversion for Maxim, Philips and GCT RF are adapted from Realtek's 818x Linux driver. --- sys/dev/netif/rtw/rtw.c | 89 +++++++++++++++++++++++++++++++++++++------ sys/dev/netif/rtw/rtwreg.h | 5 ++- sys/dev/netif/rtw/rtwvar.h | 10 +++-- sys/dev/netif/rtw/sa2400reg.h | 17 ++++++++- 4 files changed, 104 insertions(+), 17 deletions(-) diff --git a/sys/dev/netif/rtw/rtw.c b/sys/dev/netif/rtw/rtw.c index 21a74455ba..889a30c985 100644 --- a/sys/dev/netif/rtw/rtw.c +++ b/sys/dev/netif/rtw/rtw.c @@ -32,7 +32,7 @@ * SUCH DAMAGE. * * $NetBSD: rtw.c,v 1.72 2006/03/28 00:48:10 dyoung Exp $ - * $DragonFly: src/sys/dev/netif/rtw/rtw.c,v 1.5 2006/12/22 23:26:21 swildner Exp $ + * $DragonFly: src/sys/dev/netif/rtw/rtw.c,v 1.6 2007/02/07 14:52:42 sephe Exp $ */ /* @@ -97,6 +97,7 @@ #include "rtwphyio.h" #include "rtwphy.h" #include "smc93cx6var.h" +#include "sa2400reg.h" /* XXX */ #define IEEE80211_DUR_DS_LONG_PREAMBLE 144 @@ -261,6 +262,11 @@ static int rtw_compute_duration(const struct ieee80211_frame_min *, struct rtw_duration *, struct rtw_duration *, int *, int); +static int rtw_get_rssi(struct rtw_softc *, uint8_t, uint8_t); +static int rtw_maxim_getrssi(uint8_t, uint8_t); +static int rtw_gct_getrssi(uint8_t, uint8_t); +static int rtw_philips_getrssi(uint8_t, uint8_t); + #ifdef RTW_DEBUG static void rtw_print_regs(struct rtw_regs *regs, const char *dvname, const char *where) @@ -1461,18 +1467,11 @@ rtw_intr_rx(struct rtw_softc *sc, uint16_t isr) goto next; } - if (sc->sc_rfchipid == RTW_RFCHIPID_PHILIPS) { - rssi = SHIFTOUT(hrssi, RTW_RXRSSI_RSSI); - } else { - rssi = SHIFTOUT(hrssi, RTW_RXRSSI_IMR_RSSI); - /* TBD find out each front-end's LNA gain in the - * front-end's units - */ - if ((hrssi & RTW_RXRSSI_IMR_LNA) == 0) - rssi |= 0x80; - } + rssi = SHIFTOUT(hrssi, RTW_RXRSSI_RSSI); sq = SHIFTOUT(hrssi, RTW_RXRSSI_SQ); + rssi = rtw_get_rssi(sc, rssi, sq); + /* * Note well: now we cannot recycle the rs_mbuf unless * we restore its original length. @@ -3694,14 +3693,17 @@ rtw_rf_attach(struct rtw_softc *sc, enum rtw_rfchipid rfchipid, int digphy) case RTW_RFCHIPID_GCT: rf = rtw_grf5101_create(&sc->sc_regs, rf_write, 0); sc->sc_pwrstate_cb = rtw_maxim_pwrstate; + sc->sc_getrssi = rtw_gct_getrssi; break; case RTW_RFCHIPID_MAXIM: rf = rtw_max2820_create(&sc->sc_regs, rf_write, 0); sc->sc_pwrstate_cb = rtw_maxim_pwrstate; + sc->sc_getrssi = rtw_maxim_getrssi; break; case RTW_RFCHIPID_PHILIPS: rf = rtw_sa2400_create(&sc->sc_regs, rf_write, digphy); sc->sc_pwrstate_cb = rtw_philips_pwrstate; + sc->sc_getrssi = rtw_philips_getrssi; break; case RTW_RFCHIPID_RFMD: /* XXX RFMD has no RF constructor */ @@ -4445,3 +4447,68 @@ rtw_compute_duration(const struct ieee80211_frame_min *wh, } return rtw_compute_duration1(lastlen + hdrlen, ack, icflags, rate, dn); } + +static int +rtw_get_rssi(struct rtw_softc *sc, uint8_t raw, uint8_t sq) +{ + int rssi; + + rssi = sc->sc_getrssi(raw, sq); + + if (rssi == 0) + rssi = 1; + else if (rssi > 100) + rssi = 100; + + if (rssi > (RTW_NOISE_FLOOR + RTW_RSSI_CORR)) + rssi -= (RTW_NOISE_FLOOR + RTW_RSSI_CORR); + else + rssi = 0; + + return rssi; +} + +static int +rtw_maxim_getrssi(uint8_t raw, uint8_t sq __unused) +{ + int rssi = raw; + + rssi &= 0x7e; + rssi >>= 1; + rssi += 0x42; + if (raw & 0x1) + rssi += 0xa; + rssi &= 0xff; + + return rssi; +} + +static int +rtw_gct_getrssi(uint8_t raw, uint8_t sq __unused) +{ + int rssi = raw; + + rssi &= 0x7e; + if ((raw & 0x1) == 0 || rssi > 0x3c) + rssi = 100; + else + rssi = (100 * rssi) / 0x3c; + rssi &= 0xff; + + return rssi; +} + +static int +rtw_philips_getrssi(uint8_t raw, uint8_t sq) +{ + static const uint8_t sq_rssi_map[SA2400_SQ_RSSI_MAP_MAX] = + { SA2400_SQ_RSSI_MAP }; + + if (sq < SA2400_SQ_RSSI_MAP_MAX - 1) /* NB: -1 is intended */ + return sq_rssi_map[sq]; + + if (sq == 0x80) + return 1; + else + return 0x32; +} diff --git a/sys/dev/netif/rtw/rtwreg.h b/sys/dev/netif/rtw/rtwreg.h index eae59f405f..a39488fc5e 100644 --- a/sys/dev/netif/rtw/rtwreg.h +++ b/sys/dev/netif/rtw/rtwreg.h @@ -29,7 +29,7 @@ * OF SUCH DAMAGE. * * $NetBSD: rtwreg.h,v 1.19 2006/03/10 23:37:35 dyoung Exp $ - * $DragonFly: src/sys/dev/netif/rtw/rtwreg.h,v 1.1 2006/09/03 07:37:58 sephe Exp $ + * $DragonFly: src/sys/dev/netif/rtw/rtwreg.h,v 1.2 2007/02/07 14:52:42 sephe Exp $ */ /* RTL8180L Host Control and Status Registers */ @@ -1098,3 +1098,6 @@ struct rtw_rxdesc { #define RTW_BBP_CHSQLIM 0x1a /* guess: channel signal-quality * threshold */ + +#define RTW_NOISE_FLOOR -95 /* guess */ +#define RTW_RSSI_CORR 131 /* Linux driver (256 - 125) */ diff --git a/sys/dev/netif/rtw/rtwvar.h b/sys/dev/netif/rtw/rtwvar.h index 4ced154a0e..b74becb275 100644 --- a/sys/dev/netif/rtw/rtwvar.h +++ b/sys/dev/netif/rtw/rtwvar.h @@ -29,7 +29,7 @@ * OF SUCH DAMAGE. * * $NetBSD: rtwvar.h,v 1.28 2006/02/16 20:17:16 perry Exp $ - * $DragonFly: src/sys/dev/netif/rtw/rtwvar.h,v 1.3 2006/12/22 23:26:21 swildner Exp $ + * $DragonFly: src/sys/dev/netif/rtw/rtwvar.h,v 1.4 2007/02/07 14:52:42 sephe Exp $ */ #ifndef _DEV_IC_RTWVAR_H_ @@ -411,8 +411,6 @@ struct rtw_sa2400 { int sa_digphy; /* 1: digital PHY */ }; -typedef void (*rtw_pwrstate_t)(struct rtw_regs *, enum rtw_pwrstate, int, int); - union rtw_keys { uint8_t rk_keys[4][16]; uint32_t rk_words[16]; @@ -464,7 +462,11 @@ struct rtw_softc { enum rtw_pwrstate sc_pwrstate; - rtw_pwrstate_t sc_pwrstate_cb; + void (*sc_pwrstate_cb) + (struct rtw_regs *, enum rtw_pwrstate, + int, int); + + int (*sc_getrssi)(uint8_t, uint8_t); struct rtw_rf *sc_rf; diff --git a/sys/dev/netif/rtw/sa2400reg.h b/sys/dev/netif/rtw/sa2400reg.h index 27074db1f2..758721034a 100644 --- a/sys/dev/netif/rtw/sa2400reg.h +++ b/sys/dev/netif/rtw/sa2400reg.h @@ -29,7 +29,7 @@ * OF SUCH DAMAGE. * * $NetBSD: sa2400reg.h,v 1.6 2006/03/08 08:26:50 dyoung Exp $ - * $DragonFly: src/sys/dev/netif/rtw/sa2400reg.h,v 1.1 2006/09/03 07:37:58 sephe Exp $ + * $DragonFly: src/sys/dev/netif/rtw/sa2400reg.h,v 1.2 2007/02/07 14:52:42 sephe Exp $ */ #ifndef _DEV_IC_SA2400REG_H_ @@ -266,4 +266,19 @@ * 0 = highest * frequencies */ + +#define SA2400_SQ_RSSI_MAP \ + 0x64, 0x64, 0x63, 0x62, 0x61, 0x60, 0x5f, 0x5e, \ + 0x5d, 0x5c, 0x5b, 0x5a, 0x57, 0x54, 0x52, 0x50, \ + 0x4e, 0x4c, 0x4a, 0x48, 0x46, 0x44, 0x41, 0x3f, \ + 0x3c, 0x3a, 0x37, 0x36, 0x36, 0x1c, 0x1c, 0x1b, \ + 0x1b, 0x1a, 0x1a, 0x19, 0x19, 0x18, 0x18, 0x17, \ + 0x17, 0x16, 0x16, 0x15, 0x15, 0x14, 0x14, 0x13, \ + 0x13, 0x12, 0x12, 0x11, 0x11, 0x10, 0x10, 0x0f, \ + 0x0f, 0x0e, 0x0e, 0x0d, 0x0d, 0x0c, 0x0c, 0x0b, \ + 0x0b, 0x0a, 0x0a, 0x09, 0x09, 0x08, 0x08, 0x07, \ + 0x07, 0x06, 0x06, 0x05, 0x04, 0x03, 0x02, 0x00 + +#define SA2400_SQ_RSSI_MAP_MAX 80 + #endif /* _DEV_IC_SA2400REG_H_ */ -- 2.11.4.GIT