Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 17 May 2008 20:49:56 GMT
From:      Andrew Thompson <thompsa@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 141785 for review
Message-ID:  <200805172049.m4HKnuio026857@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=141785

Change 141785 by thompsa@thompsa_burger on 2008/05/17 20:49:08

	Calculate the noise floor supplied from the hardware.
	
	Info from:	http://bcm-specs.sipsolutions.net/

Affected files ...

.. //depot/projects/vap/sys/dev/bwi/bwirf.c#6 edit
.. //depot/projects/vap/sys/dev/bwi/bwirf.h#4 edit
.. //depot/projects/vap/sys/dev/bwi/if_bwi.c#22 edit
.. //depot/projects/vap/sys/dev/bwi/if_bwireg.h#2 edit
.. //depot/projects/vap/sys/dev/bwi/if_bwivar.h#10 edit

Differences ...

==== //depot/projects/vap/sys/dev/bwi/bwirf.c#6 (text+ko) ====

@@ -137,6 +137,9 @@
 			const struct bwi_rxbuf_hdr *);
 static int	bwi_rf_calc_rssi_bcm2060(struct bwi_mac *,
 			const struct bwi_rxbuf_hdr *);
+static int	bwi_rf_calc_noise_bcm2050(struct bwi_mac *);
+static int	bwi_rf_calc_noise_bcm2053(struct bwi_mac *);
+static int	bwi_rf_calc_noise_bcm2060(struct bwi_mac *);
 
 static void	bwi_rf_on_11a(struct bwi_mac *);
 static void	bwi_rf_on_11bg(struct bwi_mac *);
@@ -275,14 +278,17 @@
 		rf->rf_on = bwi_rf_on_11a;
 		rf->rf_off = bwi_rf_off_11a;
 		rf->rf_calc_rssi = bwi_rf_calc_rssi_bcm2060;
+		rf->rf_calc_noise = bwi_rf_calc_noise_bcm2060;
 		break;
 	case IEEE80211_MODE_11B:
 		if (type == BWI_RF_T_BCM2050) {
 			rf->rf_ctrl_rd = BWI_RF_CTRL_RD_11BG;
 			rf->rf_calc_rssi = bwi_rf_calc_rssi_bcm2050;
+			rf->rf_calc_noise = bwi_rf_calc_noise_bcm2050;
 		} else if (type == BWI_RF_T_BCM2053) {
 			rf->rf_ctrl_adj = 1;
 			rf->rf_calc_rssi = bwi_rf_calc_rssi_bcm2053;
+			rf->rf_calc_noise = bwi_rf_calc_noise_bcm2053;
 		} else {
 			device_printf(sc->sc_dev, "only BCM2050/BCM2053 RF "
 				      "is supported for 11B PHY\n");
@@ -312,6 +318,7 @@
 		rf->rf_calc_nrssi_slope = bwi_rf_calc_nrssi_slope_11g;
 		rf->rf_set_nrssi_thr = bwi_rf_set_nrssi_thr_11g;
 		rf->rf_calc_rssi = bwi_rf_calc_rssi_bcm2050;
+		rf->rf_calc_noise = bwi_rf_calc_noise_bcm2050;
 		rf->rf_lo_update = bwi_rf_lo_update_11g;
 		break;
 	default:
@@ -2532,6 +2539,51 @@
 	return rssi;
 }
 
+static int
+bwi_rf_calc_noise_bcm2050(struct bwi_mac *mac)
+{
+	uint16_t val;
+	int noise;
+
+	val = MOBJ_READ_2(mac, BWI_COMM_MOBJ, BWI_COMM_MOBJ_RF_NOISE);
+	noise = (int)val;	/* XXX check bounds? */
+
+	if (mac->mac_sc->sc_card_flags & BWI_CARD_F_SW_NRSSI) {
+		struct bwi_rf *rf = &mac->mac_rf;
+
+		if (noise >= BWI_NRSSI_TBLSZ)
+			noise = BWI_NRSSI_TBLSZ - 1;
+
+		noise = ((31 - (int)rf->rf_nrssi_table[noise]) * -131) / 128;
+		noise -= 67;
+	} else {
+		noise = ((31 - noise) * -149) / 128;
+		noise -= 68;
+	}
+	return noise;
+}
+
+static int
+bwi_rf_calc_noise_bcm2053(struct bwi_mac *mac)
+{
+	uint16_t val;
+	int noise;
+
+	val = MOBJ_READ_2(mac, BWI_COMM_MOBJ, BWI_COMM_MOBJ_RF_NOISE);
+	noise = (int)val;	/* XXX check bounds? */
+
+	noise = ((noise - 11) * 103) / 64;
+	noise -= 109;
+	return noise;
+}
+
+static int
+bwi_rf_calc_noise_bcm2060(struct bwi_mac *mac)
+{
+	/* XXX Dont know how to calc */
+	return (BWI_NOISE_FLOOR);
+}
+
 static uint16_t
 bwi_rf_lo_measure_11b(struct bwi_mac *mac)
 {

==== //depot/projects/vap/sys/dev/bwi/bwirf.h#4 (text+ko) ====

@@ -95,6 +95,12 @@
 	return _mac->mac_rf.rf_calc_rssi(_mac, _hdr);
 }
 
+static __inline int
+bwi_rf_calc_noise(struct bwi_mac *_mac)
+{
+	return _mac->mac_rf.rf_calc_noise(_mac);
+}
+
 static __inline void
 bwi_rf_lo_update(struct bwi_mac *_mac)
 {

==== //depot/projects/vap/sys/dev/bwi/if_bwi.c#22 (text+ko) ====

@@ -119,10 +119,11 @@
 static void	bwi_calibrate(void *);
 
 static int	bwi_calc_rssi(struct bwi_softc *, const struct bwi_rxbuf_hdr *);
+static int	bwi_calc_noise(struct bwi_softc *);
 static __inline uint8_t bwi_ofdm_plcp2rate(const uint32_t *);
 static __inline uint8_t bwi_ds_plcp2rate(const struct ieee80211_ds_plcp_hdr *);
 static void	bwi_rx_radiotap(struct ifnet *, struct mbuf *,
-			struct bwi_rxbuf_hdr *, const void *, int, int);
+			struct bwi_rxbuf_hdr *, const void *, int, int, int);
 
 static void	bwi_restart(void *, int);
 static void	bwi_init_statechg(struct bwi_softc *, int);
@@ -2639,7 +2640,7 @@
 		struct mbuf *m;
 		const void *plcp;
 		uint16_t flags2;
-		int buflen, wh_ofs, hdr_extra, rssi, type, rate;
+		int buflen, wh_ofs, hdr_extra, rssi, noise, type, rate;
 
 		m = rb->rb_mbuf;
 		bus_dmamap_sync(sc->sc_buf_dtag, rb->rb_dmap,
@@ -2669,6 +2670,7 @@
 
 		plcp = ((const uint8_t *)(hdr + 1) + hdr_extra);
 		rssi = bwi_calc_rssi(sc, hdr);
+		noise = bwi_calc_noise(sc);
 
 		m->m_pkthdr.rcvif = ifp;
 		m->m_len = m->m_pkthdr.len = buflen + sizeof(*hdr);
@@ -2681,7 +2683,7 @@
 
 		/* RX radio tap */
 		if (bpf_peers_present(ifp->if_bpf))
-			bwi_rx_radiotap(ifp, m, hdr, plcp, rate, rssi);
+			bwi_rx_radiotap(ifp, m, hdr, plcp, rate, rssi, noise);
 
 		m_adj(m, -IEEE80211_CRC_LEN);
 
@@ -2690,12 +2692,11 @@
 		wh = mtod(m, struct ieee80211_frame_min *);
 		ni = ieee80211_find_rxnode(ic, wh);
 		if (ni != NULL) {
-			type = ieee80211_input(ni, m, rssi - BWI_NOISE_FLOOR,
-			    BWI_NOISE_FLOOR, 0);
+			type = ieee80211_input(ni, m, rssi - noise, noise, 0);
 			ieee80211_free_node(ni);
 		} else
-			type = ieee80211_input_all(ic, m,
-			    rssi - BWI_NOISE_FLOOR, BWI_NOISE_FLOOR, 0);
+			type = ieee80211_input_all(ic, m, rssi - noise,
+			    noise, 0);
 		if (type == IEEE80211_FC0_TYPE_DATA) {
 			rx_data = 1;
 			sc->sc_rx_rate = rate;
@@ -3783,6 +3784,18 @@
 	return bwi_rf_calc_rssi(mac, hdr);
 }
 
+static int
+bwi_calc_noise(struct bwi_softc *sc)
+{
+	struct bwi_mac *mac;
+
+	KASSERT(sc->sc_cur_regwin->rw_type == BWI_REGWIN_T_MAC,
+	    ("current regwin type %d", sc->sc_cur_regwin->rw_type));
+	mac = (struct bwi_mac *)sc->sc_cur_regwin;
+
+	return bwi_rf_calc_noise(mac);
+}
+
 static __inline uint8_t
 bwi_ofdm_plcp2rate(const uint32_t *plcp0)
 {
@@ -3802,7 +3815,7 @@
 
 static void
 bwi_rx_radiotap(struct ifnet *ifp, struct mbuf *m,
-    struct bwi_rxbuf_hdr *hdr, const void *plcp, int rate, int rssi)
+    struct bwi_rxbuf_hdr *hdr, const void *plcp, int rate, int rssi, int noise)
 {
 	struct bwi_softc *sc = ifp->if_softc;
 	const struct ieee80211_frame_min *wh;
@@ -3818,7 +3831,7 @@
 	sc->sc_rx_th.wr_tsf = hdr->rxh_tsf; /* No endian convertion */
 	sc->sc_rx_th.wr_rate = rate;
 	sc->sc_rx_th.wr_antsignal = rssi;
-	sc->sc_rx_th.wr_antnoise = BWI_NOISE_FLOOR;
+	sc->sc_rx_th.wr_antnoise = noise;
 
 	bpf_mtap2(ifp->if_bpf, &sc->sc_rx_th, sc->sc_rx_th_len, m);
 }

==== //depot/projects/vap/sys/dev/bwi/if_bwireg.h#2 (text+ko) ====

@@ -203,6 +203,7 @@
 #define BWI_COMM_MOBJ_HFLAGS_MI		0x60
 #define BWI_COMM_MOBJ_HFLAGS_HI		0x62
 #define BWI_COMM_MOBJ_RF_ATTEN		0x64
+#define BWI_COMM_MOBJ_RF_NOISE		0x6e
 #define BWI_COMM_MOBJ_TSSI_OFDM		0x70
 #define BWI_COMM_MOBJ_PROBE_RESP_TO	0x74
 #define BWI_COMM_MOBJ_CHAN		0xa0

==== //depot/projects/vap/sys/dev/bwi/if_bwivar.h#10 (text+ko) ====

@@ -419,6 +419,7 @@
 	int			(*rf_calc_rssi)
 				(struct bwi_mac *,
 				 const struct bwi_rxbuf_hdr *);
+	int			(*rf_calc_noise)(struct bwi_mac *);
 
 	void			(*rf_lo_update)(struct bwi_mac *);
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200805172049.m4HKnuio026857>