All of lore.kernel.org
 help / color / mirror / Atom feed
From: Christian Lamparter <chunkeey@web.de>
To: wireless <linux-wireless@vger.kernel.org>
Cc: Johannes Berg <johannes@sipsolutions.net>,
	"Luis R. Rodriguez" <mcgrof@gmail.com>
Subject: [RFC/RFT] p54: regulatory domain hint
Date: Sun, 21 Dec 2008 23:36:30 +0100	[thread overview]
Message-ID: <200812212336.31267.chunkeey@web.de> (raw)

This patch adds a sub-routine that parses the default country eeprom entry
and forwards the obtained Alpha2 identifier to the regulatory sub-system.

Luis,

I've a question about the regulatory domain numbers. (ref: 802.11-2007 14.8.2.2)
As far as I can see zd1211rw driver (zd_mac.c) uses them to determine the country as well.
So, how should I/we deal with this?

Would you support a common helper function with a fixed list - like the one in zd_mac.c (or in this patch) -
which takes regDomain values and converts them into alpha2?
Or do you have a secret plan instead?

Regards,
	Chr
---
diff -Nurp a/drivers/net/wireless/p54/p54common.c b/drivers/net/wireless/p54/p54common.c
--- a/drivers/net/wireless/p54/p54common.c	2008-12-21 22:31:57.000000000 +0100
+++ b/drivers/net/wireless/p54/p54common.c	2008-12-21 22:42:04.000000000 +0100
@@ -128,6 +128,20 @@ static struct ieee80211_supported_band b
 	.n_bitrates = ARRAY_SIZE(p54_arates),
 };
 
+const static struct {
+	u8 reg;
+	char alpha2[2];
+} p54_reg_to_alpha2[] = {
+	{ PDR_COUNTRY_REGDOMAIN_FCC, "US" },
+	{ PDR_COUNTRY_REGDOMAIN_IC, "CA" },
+	{ PDR_COUNTRY_REGDOMAIN_ETSI, "DE" },	/* Generic ETSI, use most restrictive */
+	{ PDR_COUNTRY_REGDOMAIN_SPAIN, "ES" },
+	{ PDR_COUNTRY_REGDOMAIN_FRANCE, "FR" },
+	{ PDR_COUNTRY_REGDOMAIN_MKK13, "JP" },
+	{ PDR_COUNTRY_REGDOMAIN_MKK, "JP" },
+	{ PDR_COUNTRY_REGDOMAIN_CHINA, "CN" },
+};
+
 int p54_parse_firmware(struct ieee80211_hw *dev, const struct firmware *fw)
 {
 	struct p54_common *priv = dev->priv;
@@ -365,6 +379,37 @@ static void p54_parse_rssical(struct iee
 	}
 }
 
+static void p54_parse_default_country(struct ieee80211_hw *dev,
+				      void *data, int len)
+{
+	struct pda_country *country;
+	int i;
+
+	if (len != sizeof(*country)) {
+		printk(KERN_ERR "%s: invalid default country eeprom entry"
+				 " len:%d.\n",
+		       wiphy_name(dev->wiphy), len);
+
+		print_hex_dump_bytes("country:", DUMP_PREFIX_NONE,
+				     data, len);
+
+		printk(KERN_ERR "%s: please report this issue.\n",
+			wiphy_name(dev->wiphy));
+		return;
+	}
+
+	country = (struct pda_country *) data;
+	if (country->flags == PDR_COUNTRY_CERT_CODE_PSEUDO)
+		regulatory_hint(dev->wiphy, country->alpha2);
+	else {
+		for (i = 0; i < ARRAY_SIZE(p54_reg_to_alpha2); i++) {
+			if (country->regdomain == p54_reg_to_alpha2[i].reg)
+				regulatory_hint(dev->wiphy, (char *)
+						p54_reg_to_alpha2[i].alpha2);
+		}
+	}
+}
+
 static int p54_parse_eeprom(struct ieee80211_hw *dev, void *eeprom, int len)
 {
 	struct p54_common *priv = dev->priv;
@@ -453,6 +498,9 @@ static int p54_parse_eeprom(struct ieee8
 			memcpy(priv->iq_autocal, entry->data, data_len);
 			priv->iq_autocal_len = data_len / sizeof(struct pda_iq_autocal_entry);
 			break;
+		case PDR_DEFAULT_COUNTRY:
+			p54_parse_default_country(dev, entry->data, data_len);
+			break;
 		case PDR_INTERFACE_LIST:
 			tmp = entry->data;
 			while ((u8 *)tmp < entry->data + data_len) {
@@ -487,7 +535,6 @@ static int p54_parse_eeprom(struct ieee8
 		case PDR_UTF8_OEM_NAME:
 		case PDR_UTF8_PRODUCT_NAME:
 		case PDR_COUNTRY_LIST:
-		case PDR_DEFAULT_COUNTRY:
 		case PDR_ANTENNA_GAIN:
 		case PDR_PRISM_INDIGO_PA_CALIBRATION_DATA:
 		case PDR_REGULATORY_POWER_LIMITS:
diff -Nurp a/drivers/net/wireless/p54/p54common.h b/drivers/net/wireless/p54/p54common.h
--- a/drivers/net/wireless/p54/p54common.h	2008-12-21 20:44:12.000000000 +0100
+++ b/drivers/net/wireless/p54/p54common.h	2008-12-21 22:14:44.000000000 +0100
@@ -180,6 +180,12 @@ struct pda_rssi_cal_entry {
 	__le16 add;
 } __attribute__ ((packed));
 
+struct pda_country {
+	u8 regdomain;
+	u8 alpha2[2];
+	u8 flags;
+} __attribute__ ((packed));
+
 /*
  * this defines the PDR codes used to build PDAs as defined in document
  * number 553155. The current implementation mirrors version 1.1 of the
@@ -229,6 +235,17 @@ struct pda_rssi_cal_entry {
 #define PDR_PER_CHANNEL_BASEBAND_REGISTERS	0x8001
 
 /* PDR definitions for default country & country list */
+
+/* RegDomains as in 802.11-2007, 14.8.2.2 Table 14-23 */
+#define PDR_COUNTRY_REGDOMAIN_FCC	0x10
+#define PDR_COUNTRY_REGDOMAIN_IC	0x20
+#define PDR_COUNTRY_REGDOMAIN_ETSI	0x30
+#define PDR_COUNTRY_REGDOMAIN_SPAIN	0x31
+#define PDR_COUNTRY_REGDOMAIN_FRANCE	0x32
+#define PDR_COUNTRY_REGDOMAIN_MKK	0x40    /* channel 14 only */
+#define PDR_COUNTRY_REGDOMAIN_MKK13	0x41    /* channel 1 to 13 */
+#define PDR_COUNTRY_REGDOMAIN_CHINA	0x50
+
 #define PDR_COUNTRY_CERT_CODE		0x80
 #define PDR_COUNTRY_CERT_CODE_REAL	0x00
 #define PDR_COUNTRY_CERT_CODE_PSEUDO	0x80

             reply	other threads:[~2008-12-21 22:36 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-12-21 22:36 Christian Lamparter [this message]
2008-12-21 23:17 ` [RFC/RFT] p54: regulatory domain hint Larry Finger
2008-12-22 15:55 ` Luis R. Rodriguez

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=200812212336.31267.chunkeey@web.de \
    --to=chunkeey@web.de \
    --cc=johannes@sipsolutions.net \
    --cc=linux-wireless@vger.kernel.org \
    --cc=mcgrof@gmail.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.