netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Ivo van Doorn <ivdoorn@gmail.com>
To: "John W. Linville" <linville@tuxdriver.com>
Cc: netdev@vger.kernel.org
Subject: [PATCH 08/26] rt2x00: Rssi detection
Date: Sun, 3 Dec 2006 19:19:03 +0100	[thread overview]
Message-ID: <200612031919.03866.IvDoorn@gmail.com> (raw)

Correctly detect the maxssi settings from the EEPROM
where available, and correct the dummy values that
had been added in the initial patch to support
noise and signal measurement.
MAX_RX_SSI is a value that is different on each chipset,
so it should be a driver specific define.

Signed-off-by Ivo van Doorn <IvDoorn@gmail.com>

---

diff -rU3 wireless-dev-bbp/drivers/net/wireless/d80211/rt2x00/rt2400pci.c wireless-dev-rssi/drivers/net/wireless/d80211/rt2x00/rt2400pci.c
--- wireless-dev-bbp/drivers/net/wireless/d80211/rt2x00/rt2400pci.c	2006-12-03 12:38:28.000000000 +0100
+++ wireless-dev-rssi/drivers/net/wireless/d80211/rt2x00/rt2400pci.c	2006-12-03 12:46:41.000000000 +0100
@@ -1550,13 +1550,15 @@
 			rt2x00dev->rx_params.ssi =
 				rt2x00_get_field32(word2, RXD_W2_RSSI);
 
-/* FIXME: The following set of assignments supply additional data for wireless statistics. The
-          necessary quantities are (1) the "noise" value in dBm, and (2) the "signal" value in dBm.
-          The present code supplies dummy values for these quantities. */
-
-			rt2x00dev->rx_params.noise = -85;   /* FIXME */
-			rt2x00dev->rx_params.signal =
-				rt2x00dev->rx_params.ssi - RT2X00_RX_MAX_SSI; /* FIXME */
+			/*
+			 * The following set of assignments supply
+			 * additional data for wireless statistics. The
+			 * necessary quantities are (1) the "noise" value
+			 * in dBm, and (2) the "signal" value in dBm.
+			 */
+			rt2x00dev->rx_params.noise = 0;
+			rt2x00dev->rx_params.signal = rt2x00dev->rx_params.ssi
+				- rt2x00dev->hw->maxssi;
 
 			__ieee80211_rx(rt2x00dev->hw,
 				skb, &rt2x00dev->rx_params);
diff -rU3 wireless-dev-bbp/drivers/net/wireless/d80211/rt2x00/rt2400pci.h wireless-dev-rssi/drivers/net/wireless/d80211/rt2x00/rt2400pci.h
--- wireless-dev-bbp/drivers/net/wireless/d80211/rt2x00/rt2400pci.h	2006-12-02 23:22:43.000000000 +0100
+++ wireless-dev-rssi/drivers/net/wireless/d80211/rt2x00/rt2400pci.h	2006-12-03 12:49:55.000000000 +0100
@@ -39,6 +39,11 @@
 #define RF2421				0x0001
 
 /*
+ * Max RSSI value, required for RSSI <-> dBm conversion.
+ */
+#define MAX_RX_SSI			100
+
+/*
  * Register layout information.
  */
 #define CSR_REG_BASE			0x0000
diff -rU3 wireless-dev-bbp/drivers/net/wireless/d80211/rt2x00/rt2500pci.c wireless-dev-rssi/drivers/net/wireless/d80211/rt2x00/rt2500pci.c
--- wireless-dev-bbp/drivers/net/wireless/d80211/rt2x00/rt2500pci.c	2006-12-03 12:34:39.000000000 +0100
+++ wireless-dev-rssi/drivers/net/wireless/d80211/rt2x00/rt2500pci.c	2006-12-03 12:47:36.000000000 +0100
@@ -1707,13 +1707,16 @@
 			rt2x00dev->rx_params.ssi =
 				rt2x00_get_field32(word2, RXD_W2_RSSI);
 
-/* FIXME: The following set of assignments supply additional data for wireless statistics. The
-          necessary quantities are (1) the "noise" value in dBm, and (2) the "signal" value in dBm.
-          The present code supplies dummy values for these quantities. */
-
-			rt2x00dev->rx_params.noise = -85;   /* FIXME */
-			rt2x00dev->rx_params.signal =
-				rt2x00dev->rx_params.ssi - RT2X00_RX_MAX_SSI; /* FIXME */
+			/*
+			 * The following set of assignments supply
+			 * additional data for wireless statistics. The
+			 * necessary quantities are (1) the "noise" value
+			 * in dBm, and (2) the "signal" value in dBm.
+			 */
+			rt2x00dev->rx_params.noise =
+				rt2x00_get_link_noise(&rt2x00dev->link);
+			rt2x00dev->rx_params.signal = rt2x00dev->rx_params.ssi
+				- rt2x00dev->hw->maxssi;
 
 			__ieee80211_rx(rt2x00dev->hw,
 				skb, &rt2x00dev->rx_params);
@@ -2588,6 +2591,15 @@
 	if (rt2x00_get_field16(eeprom, EEPROM_NIC_DYN_BBP_TUNE))
 		SET_FLAG(rt2x00dev, CONFIG_DISABLE_LINK_TUNING);
 
+	/*
+	 * Read the RSSI <-> dBm offset information.
+	 */
+	rt2x00_eeprom_read(rt2x00dev, EEPROM_CALIBRATE_OFFSET, &eeprom);
+	rt2x00dev->hw->maxssi =
+		rt2x00_get_field16(eeprom, EEPROM_CALIBRATE_OFFSET_RSSI);
+	if (rt2x00dev->hw->maxssi == 0x00 || rt2x00dev->hw->maxssi == 0xff)
+		rt2x00dev->hw->maxssi = MAX_RX_SSI;
+
 	return 0;
 }
 
diff -rU3 wireless-dev-bbp/drivers/net/wireless/d80211/rt2x00/rt2500pci.h wireless-dev-rssi/drivers/net/wireless/d80211/rt2x00/rt2500pci.h
--- wireless-dev-bbp/drivers/net/wireless/d80211/rt2x00/rt2500pci.h	2006-12-02 23:22:56.000000000 +0100
+++ wireless-dev-rssi/drivers/net/wireless/d80211/rt2x00/rt2500pci.h	2006-12-03 12:50:28.000000000 +0100
@@ -50,6 +50,11 @@
 #define RT2560_VERSION_D		4
 
 /*
+ * Max RSSI value, required for RSSI <-> dBm conversion.
+ */
+#define MAX_RX_SSI			120
+
+/*
  * Register layout information.
  */
 #define CSR_REG_BASE			0x0000
@@ -1001,6 +1006,12 @@
 #define EEPROM_TXPOWER_2		FIELD16(0xff00)
 
 /*
+ * RSSI <-> dBm offset calibration
+ */
+#define EEPROM_CALIBRATE_OFFSET		0x3e
+#define EEPROM_CALIBRATE_OFFSET_RSSI	FIELD16(0x00ff)
+
+/*
  * DMA descriptor defines.
  */
 #define TXD_DESC_SIZE			( 11 * sizeof(struct data_desc) )
diff -rU3 wireless-dev-bbp/drivers/net/wireless/d80211/rt2x00/rt2500usb.c wireless-dev-rssi/drivers/net/wireless/d80211/rt2x00/rt2500usb.c
--- wireless-dev-bbp/drivers/net/wireless/d80211/rt2x00/rt2500usb.c	2006-12-03 12:35:13.000000000 +0100
+++ wireless-dev-rssi/drivers/net/wireless/d80211/rt2x00/rt2500usb.c	2006-12-03 12:48:18.000000000 +0100
@@ -1657,13 +1657,16 @@
 			rt2x00dev->rx_params.ssi =
 				rt2x00_get_field32(word1, RXD_W1_RSSI);
 
-/* FIXME: The following set of assignments supply additional data for wireless statistics. The
-	  necessary quantities are (1) the "noise" value in dBm, and (2) the "signal" value in dBm.
-	  The present code supplies dummy values for these quantities. */
-
-			rt2x00dev->rx_params.noise = -85;   /* FIXME */
-			rt2x00dev->rx_params.signal =
-				rt2x00dev->rx_params.ssi - RT2X00_RX_MAX_SSI; /* FIXME */
+			/*
+			 * The following set of assignments supply
+			 * additional data for wireless statistics. The
+			 * necessary quantities are (1) the "noise" value
+			 * in dBm, and (2) the "signal" value in dBm.
+			 */
+			rt2x00dev->rx_params.noise =
+				rt2x00_get_link_noise(&rt2x00dev->link);
+			rt2x00dev->rx_params.signal = rt2x00dev->rx_params.ssi
+				- rt2x00dev->hw->maxssi;
 
 			__ieee80211_rx(rt2x00dev->hw,
 				skb, &rt2x00dev->rx_params);
@@ -2397,6 +2400,15 @@
 	if (rt2x00_get_field16(eeprom, EEPROM_NIC_DYN_BBP_TUNE))
 		SET_FLAG(rt2x00dev, CONFIG_DISABLE_LINK_TUNING);
 
+	/*
+	 * Read the RSSI <-> dBm offset information.
+	 */
+	rt2x00_eeprom_read(rt2x00dev, EEPROM_CALIBRATE_OFFSET, &eeprom);
+	rt2x00dev->hw->maxssi =
+		rt2x00_get_field16(eeprom, EEPROM_CALIBRATE_OFFSET_RSSI);
+	if (rt2x00dev->hw->maxssi == 0x00 || rt2x00dev->hw->maxssi == 0xff)
+		rt2x00dev->hw->maxssi = MAX_RX_SSI;
+
 	return 0;
 }
 
diff -rU3 wireless-dev-bbp/drivers/net/wireless/d80211/rt2x00/rt2500usb.h wireless-dev-rssi/drivers/net/wireless/d80211/rt2x00/rt2500usb.h
--- wireless-dev-bbp/drivers/net/wireless/d80211/rt2x00/rt2500usb.h	2006-12-02 23:23:08.000000000 +0100
+++ wireless-dev-rssi/drivers/net/wireless/d80211/rt2x00/rt2500usb.h	2006-12-03 12:51:02.000000000 +0100
@@ -43,6 +43,11 @@
 #define RF5222				0x0010
 
 /*
+ * Max RSSI value, required for RSSI <-> dBm conversion.
+ */
+#define MAX_RX_SSI			120
+
+/*
  * Register layout information.
  */
 #define CSR_REG_BASE			0x0400
@@ -556,6 +561,12 @@
 #define EEPROM_TXPOWER_2		FIELD16(0xff00)
 
 /*
+ * RSSI <-> dBm offset calibration
+ */
+#define EEPROM_CALIBRATE_OFFSET		0x36
+#define EEPROM_CALIBRATE_OFFSET_RSSI	FIELD16(0x00ff)
+
+/*
  * DMA descriptor defines.
  */
 #define TXD_DESC_SIZE			( 5 * sizeof(struct data_desc) )
diff -rU3 wireless-dev-bbp/drivers/net/wireless/d80211/rt2x00/rt2x00.h wireless-dev-rssi/drivers/net/wireless/d80211/rt2x00/rt2x00.h
--- wireless-dev-bbp/drivers/net/wireless/d80211/rt2x00/rt2x00.h	2006-12-03 00:03:07.000000000 +0100
+++ wireless-dev-rssi/drivers/net/wireless/d80211/rt2x00/rt2x00.h	2006-12-03 12:56:07.000000000 +0100
@@ -851,8 +851,6 @@
 #define CONFIG_DOUBLE_ANTENNA		0x00010000
 #define CONFIG_DISABLE_BBP_TUNING	0x00020000
 
-#define RT2X00_RX_MAX_SSI		100
-
 	/*
 	 * Chipset identification.
 	 */
diff -rU3 wireless-dev-bbp/drivers/net/wireless/d80211/rt2x00/rt61pci.c wireless-dev-rssi/drivers/net/wireless/d80211/rt2x00/rt61pci.c
--- wireless-dev-bbp/drivers/net/wireless/d80211/rt2x00/rt61pci.c	2006-12-03 12:35:34.000000000 +0100
+++ wireless-dev-rssi/drivers/net/wireless/d80211/rt2x00/rt61pci.c	2006-12-03 12:48:43.000000000 +0100
@@ -2158,13 +2158,16 @@
 			rt2x00dev->rx_params.ssi =
 				rt2x00_get_field32(word1, RXD_W1_RSSI);
 
-/* FIXME: The following set of assignments supply additional data for wireless statistics. The
-	  necessary quantities are (1) the "noise" value in dBm, and (2) the "signal" value in dBm.
-	  The present code supplies dummy values for these quantities. */
-
-			rt2x00dev->rx_params.noise = -85;   /* FIXME */
-			rt2x00dev->rx_params.signal =
-				rt2x00dev->rx_params.ssi - RT2X00_RX_MAX_SSI; /* FIXME */
+			/*
+			 * The following set of assignments supply
+			 * additional data for wireless statistics. The
+			 * necessary quantities are (1) the "noise" value
+			 * in dBm, and (2) the "signal" value in dBm.
+			 */
+			rt2x00dev->rx_params.noise =
+				rt2x00_get_link_noise(&rt2x00dev->link);
+			rt2x00dev->rx_params.signal = rt2x00dev->rx_params.ssi
+				- rt2x00dev->hw->maxssi;
 
 			__ieee80211_rx(rt2x00dev->hw,
 				skb, &rt2x00dev->rx_params);
diff -rU3 wireless-dev-bbp/drivers/net/wireless/d80211/rt2x00/rt61pci.h wireless-dev-rssi/drivers/net/wireless/d80211/rt2x00/rt61pci.h
--- wireless-dev-bbp/drivers/net/wireless/d80211/rt2x00/rt61pci.h	2006-12-02 23:23:20.000000000 +0100
+++ wireless-dev-rssi/drivers/net/wireless/d80211/rt2x00/rt61pci.h	2006-12-03 12:51:17.000000000 +0100
@@ -43,6 +43,11 @@
 #define RF2529				0x0004
 
 /*
+ * Max RSSI value, required for RSSI <-> dBm conversion.
+ */
+#define MAX_RX_SSI			120
+
+/*
  * Register layout information.
  */
 #define CSR_REG_BASE			0x3000
diff -rU3 wireless-dev-bbp/drivers/net/wireless/d80211/rt2x00/rt73usb.c wireless-dev-rssi/drivers/net/wireless/d80211/rt2x00/rt73usb.c
--- wireless-dev-bbp/drivers/net/wireless/d80211/rt2x00/rt73usb.c	2006-12-03 12:35:52.000000000 +0100
+++ wireless-dev-rssi/drivers/net/wireless/d80211/rt2x00/rt73usb.c	2006-12-03 12:48:57.000000000 +0100
@@ -1932,13 +1932,16 @@
 			rt2x00dev->rx_params.ssi =
 				rt2x00_get_field32(word1, RXD_W1_RSSI);
 
-/* FIXME: The following set of assignments supply additional data for wireless statistics. The
-	  necessary quantities are (1) the "noise" value in dBm, and (2) the "signal" value in dBm.
-	  The present code supplies dummy values for these quantities. */
-
-			rt2x00dev->rx_params.noise = -85;   /* FIXME */
-			rt2x00dev->rx_params.signal =
-				rt2x00dev->rx_params.ssi - RT2X00_RX_MAX_SSI; /* FIXME */
+			/*
+			 * The following set of assignments supply
+			 * additional data for wireless statistics. The
+			 * necessary quantities are (1) the "noise" value
+			 * in dBm, and (2) the "signal" value in dBm.
+			 */
+			rt2x00dev->rx_params.noise =
+				rt2x00_get_link_noise(&rt2x00dev->link);
+			rt2x00dev->rx_params.signal = rt2x00dev->rx_params.ssi
+				- rt2x00dev->hw->maxssi;
 
 			__ieee80211_rx(rt2x00dev->hw,
 				skb, &rt2x00dev->rx_params);
diff -rU3 wireless-dev-bbp/drivers/net/wireless/d80211/rt2x00/rt73usb.h wireless-dev-rssi/drivers/net/wireless/d80211/rt2x00/rt73usb.h
--- wireless-dev-bbp/drivers/net/wireless/d80211/rt2x00/rt73usb.h	2006-12-02 23:23:31.000000000 +0100
+++ wireless-dev-rssi/drivers/net/wireless/d80211/rt2x00/rt73usb.h	2006-12-03 12:51:34.000000000 +0100
@@ -41,6 +41,11 @@
 #define RF2527				0x0004
 
 /*
+ * Max RSSI value, required for RSSI <-> dBm conversion.
+ */
+#define MAX_RX_SSI			120
+
+/*
  * Register layout information.
  */
 #define CSR_REG_BASE			0x3000

                 reply	other threads:[~2006-12-03 18:19 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=200612031919.03866.IvDoorn@gmail.com \
    --to=ivdoorn@gmail.com \
    --cc=linville@tuxdriver.com \
    --cc=netdev@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).