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
next 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 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).