libertas: move scan/assoc related stuff
authorHolger Schurig <hs4233@mail.mn-solutions.de>
Thu, 22 Oct 2009 13:30:48 +0000 (15:30 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 27 Oct 2009 20:48:36 +0000 (16:48 -0400)
Another cfg80211-preparation patch: removes some code/definitions from
main.c and dev.h and put's it into assoc.c/.h, scan.c/.h.

No function change.

Signed-off-by: Holger Schurig <hs4233@mail.mn-solutions.de>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/libertas/assoc.c
drivers/net/wireless/libertas/assoc.h
drivers/net/wireless/libertas/cmd.c
drivers/net/wireless/libertas/decl.h
drivers/net/wireless/libertas/defs.h
drivers/net/wireless/libertas/dev.h
drivers/net/wireless/libertas/main.c
drivers/net/wireless/libertas/scan.c
drivers/net/wireless/libertas/scan.h

index 5a280ebadba4ed6ae2aa3fedd4d645f8dd28f568..2ccfeca32cdefd17690fdc5589263bac0c34b0bb 100644 (file)
@@ -23,6 +23,13 @@ static const u8 bssid_off[ETH_ALEN]  __attribute__ ((aligned (2))) =
  */
 #define CAPINFO_MASK   (~(0xda00))
 
+/**
+ * 802.11b/g supported bitrates (in 500Kb/s units)
+ */
+u8 lbs_bg_rates[MAX_RATES] =
+    { 0x02, 0x04, 0x0b, 0x16, 0x0c, 0x12, 0x18, 0x24, 0x30, 0x48, 0x60, 0x6c,
+0x00, 0x00 };
+
 
 /**
  *  @brief This function finds common rates between rates and card rates.
index 6e765e9f91a38ec47bc7e256d2d54d6a5dd6916c..610d14c14cd4d532370b8b9310e377dcffa1e3f5 100644 (file)
@@ -3,7 +3,127 @@
 #ifndef _LBS_ASSOC_H_
 #define _LBS_ASSOC_H_
 
-#include "dev.h"
+
+#include "defs.h"
+#include "host.h"
+
+
+struct lbs_private;
+
+/*
+ * In theory, the IE is limited to the IE length, 255,
+ * but in practice 64 bytes are enough.
+ */
+#define MAX_WPA_IE_LEN 64
+
+
+
+struct lbs_802_11_security {
+       u8 WPAenabled;
+       u8 WPA2enabled;
+       u8 wep_enabled;
+       u8 auth_mode;
+       u32 key_mgmt;
+};
+
+/** Current Basic Service Set State Structure */
+struct current_bss_params {
+       /** bssid */
+       u8 bssid[ETH_ALEN];
+       /** ssid */
+       u8 ssid[IEEE80211_MAX_SSID_LEN + 1];
+       u8 ssid_len;
+
+       /** band */
+       u8 band;
+       /** channel */
+       u8 channel;
+       /** zero-terminated array of supported data rates */
+       u8 rates[MAX_RATES + 1];
+};
+
+/**
+ *  @brief Structure used to store information for each beacon/probe response
+ */
+struct bss_descriptor {
+       u8 bssid[ETH_ALEN];
+
+       u8 ssid[IEEE80211_MAX_SSID_LEN + 1];
+       u8 ssid_len;
+
+       u16 capability;
+       u32 rssi;
+       u32 channel;
+       u16 beaconperiod;
+       __le16 atimwindow;
+
+       /* IW_MODE_AUTO, IW_MODE_ADHOC, IW_MODE_INFRA */
+       u8 mode;
+
+       /* zero-terminated array of supported data rates */
+       u8 rates[MAX_RATES + 1];
+
+       unsigned long last_scanned;
+
+       union ieee_phy_param_set phy;
+       union ieee_ss_param_set ss;
+
+       u8 wpa_ie[MAX_WPA_IE_LEN];
+       size_t wpa_ie_len;
+       u8 rsn_ie[MAX_WPA_IE_LEN];
+       size_t rsn_ie_len;
+
+       u8 mesh;
+
+       struct list_head list;
+};
+
+/** Association request
+ *
+ * Encapsulates all the options that describe a specific assocation request
+ * or configuration of the wireless card's radio, mode, and security settings.
+ */
+struct assoc_request {
+#define ASSOC_FLAG_SSID                        1
+#define ASSOC_FLAG_CHANNEL             2
+#define ASSOC_FLAG_BAND                        3
+#define ASSOC_FLAG_MODE                        4
+#define ASSOC_FLAG_BSSID               5
+#define ASSOC_FLAG_WEP_KEYS            6
+#define ASSOC_FLAG_WEP_TX_KEYIDX       7
+#define ASSOC_FLAG_WPA_MCAST_KEY       8
+#define ASSOC_FLAG_WPA_UCAST_KEY       9
+#define ASSOC_FLAG_SECINFO             10
+#define ASSOC_FLAG_WPA_IE              11
+       unsigned long flags;
+
+       u8 ssid[IEEE80211_MAX_SSID_LEN + 1];
+       u8 ssid_len;
+       u8 channel;
+       u8 band;
+       u8 mode;
+       u8 bssid[ETH_ALEN] __attribute__ ((aligned (2)));
+
+       /** WEP keys */
+       struct enc_key wep_keys[4];
+       u16 wep_tx_keyidx;
+
+       /** WPA keys */
+       struct enc_key wpa_mcast_key;
+       struct enc_key wpa_unicast_key;
+
+       struct lbs_802_11_security secinfo;
+
+       /** WPA Information Elements*/
+       u8 wpa_ie[MAX_WPA_IE_LEN];
+       u8 wpa_ie_len;
+
+       /* BSS to associate with for infrastructure of Ad-Hoc join */
+       struct bss_descriptor bss;
+};
+
+
+extern u8 lbs_bg_rates[MAX_RATES];
 
 void lbs_association_worker(struct work_struct *work);
 struct assoc_request *lbs_get_association_request(struct lbs_private *priv);
index dd4f98231352dda4c5598c0b4d3fbf3263b0b929..ec65be0c4d930896aad9b2ba4e055afaf17d5034 100644 (file)
@@ -12,6 +12,7 @@
 #include "dev.h"
 #include "assoc.h"
 #include "wext.h"
+#include "scan.h"
 #include "cmd.h"
 
 static struct cmd_ctrl_node *lbs_get_cmd_ctrl_node(struct lbs_private *priv);
index 20fa8176cd889cd9372b5f702fa4a0ed84705ac2..7d8323876c52026c9f0e206615448075294ef297 100644 (file)
@@ -10,6 +10,9 @@
 
 #include "defs.h"
 
+
+extern const struct ethtool_ops lbs_ethtool_ops;
+
 /** Function Prototype Declaration */
 struct lbs_private;
 struct sk_buff;
@@ -33,7 +36,6 @@ u8 lbs_data_rate_to_fw_index(u32 rate);
 /** The proc fs interface */
 netdev_tx_t lbs_hard_start_xmit(struct sk_buff *skb,
                                struct net_device *dev);
-int lbs_set_regiontable(struct lbs_private *priv, u8 region, u8 band);
 
 int lbs_process_rxed_packet(struct lbs_private *priv, struct sk_buff *);
 
@@ -49,8 +51,6 @@ void lbs_persist_config_init(struct net_device *net);
 void lbs_persist_config_remove(struct net_device *net);
 
 /* main.c */
-struct chan_freq_power *lbs_get_region_cfp_table(u8 region,
-       int *cfp_no);
 struct lbs_private *lbs_add_card(void *card, struct device *dmdev);
 void lbs_remove_card(struct lbs_private *priv);
 int lbs_start_card(struct lbs_private *priv);
index 1cf5d5985daca6de8c7fe281577314bd21014911..6b6ea9f7bf5b37de87186a9db1248ab49b28c165 100644 (file)
@@ -322,7 +322,6 @@ static inline void lbs_deb_hex(unsigned int grp, const char *prompt, u8 *buf, in
 extern const char lbs_driver_version[];
 extern u16 lbs_region_code_to_index[MRVDRV_MAX_REGION_CODE];
 
-extern u8 lbs_bg_rates[MAX_RATES];
 
 /** ENUM definition*/
 /** SNRNF_TYPE */
index 50b457706bada943113bf4bf0c116d767a81f696..cc245820d3f2616dc2f1c38fe6150bd643bf85d9 100644 (file)
@@ -6,75 +6,10 @@
 #ifndef _LBS_DEV_H_
 #define _LBS_DEV_H_
 
-#include <linux/netdevice.h>
-#include <linux/wireless.h>
-#include <linux/ethtool.h>
-#include <linux/debugfs.h>
+#include "scan.h"
+#include "assoc.h"
 
-#include "defs.h"
-#include "host.h"
 
-extern const struct ethtool_ops lbs_ethtool_ops;
-
-#define        MAX_BSSID_PER_CHANNEL           16
-
-#define NR_TX_QUEUE                    3
-
-/* For the extended Scan */
-#define MAX_EXTENDED_SCAN_BSSID_LIST    MAX_BSSID_PER_CHANNEL * \
-                                               MRVDRV_MAX_CHANNEL_SIZE + 1
-
-#define        MAX_REGION_CHANNEL_NUM  2
-
-/** Chan-freq-TxPower mapping table*/
-struct chan_freq_power {
-       /** channel Number              */
-       u16 channel;
-       /** frequency of this channel   */
-       u32 freq;
-       /** Max allowed Tx power level  */
-       u16 maxtxpower;
-       /** TRUE:channel unsupported;  FLASE:supported*/
-       u8 unsupported;
-};
-
-/** region-band mapping table*/
-struct region_channel {
-       /** TRUE if this entry is valid              */
-       u8 valid;
-       /** region code for US, Japan ...            */
-       u8 region;
-       /** band B/G/A, used for BAND_CONFIG cmd             */
-       u8 band;
-       /** Actual No. of elements in the array below */
-       u8 nrcfp;
-       /** chan-freq-txpower mapping table*/
-       struct chan_freq_power *CFP;
-};
-
-struct lbs_802_11_security {
-       u8 WPAenabled;
-       u8 WPA2enabled;
-       u8 wep_enabled;
-       u8 auth_mode;
-       u32 key_mgmt;
-};
-
-/** Current Basic Service Set State Structure */
-struct current_bss_params {
-       /** bssid */
-       u8 bssid[ETH_ALEN];
-       /** ssid */
-       u8 ssid[IEEE80211_MAX_SSID_LEN + 1];
-       u8 ssid_len;
-
-       /** band */
-       u8 band;
-       /** channel */
-       u8 channel;
-       /** zero-terminated array of supported data rates */
-       u8 rates[MAX_RATES + 1];
-};
 
 /** sleep_params */
 struct sleep_params {
@@ -295,12 +230,6 @@ struct lbs_private {
        struct enc_key wpa_mcast_key;
        struct enc_key wpa_unicast_key;
 
-/*
- * In theory, the IE is limited to the IE length, 255,
- * but in practice 64 bytes are enough.
- */
-#define MAX_WPA_IE_LEN 64
-
        /** WPA Information Elements*/
        u8 wpa_ie[MAX_WPA_IE_LEN];
        u8 wpa_ie_len;
@@ -334,84 +263,4 @@ struct lbs_private {
 
 extern struct cmd_confirm_sleep confirm_sleep;
 
-/**
- *  @brief Structure used to store information for each beacon/probe response
- */
-struct bss_descriptor {
-       u8 bssid[ETH_ALEN];
-
-       u8 ssid[IEEE80211_MAX_SSID_LEN + 1];
-       u8 ssid_len;
-
-       u16 capability;
-       u32 rssi;
-       u32 channel;
-       u16 beaconperiod;
-       __le16 atimwindow;
-
-       /* IW_MODE_AUTO, IW_MODE_ADHOC, IW_MODE_INFRA */
-       u8 mode;
-
-       /* zero-terminated array of supported data rates */
-       u8 rates[MAX_RATES + 1];
-
-       unsigned long last_scanned;
-
-       union ieee_phy_param_set phy;
-       union ieee_ss_param_set ss;
-
-       u8 wpa_ie[MAX_WPA_IE_LEN];
-       size_t wpa_ie_len;
-       u8 rsn_ie[MAX_WPA_IE_LEN];
-       size_t rsn_ie_len;
-
-       u8 mesh;
-
-       struct list_head list;
-};
-
-/** Association request
- *
- * Encapsulates all the options that describe a specific assocation request
- * or configuration of the wireless card's radio, mode, and security settings.
- */
-struct assoc_request {
-#define ASSOC_FLAG_SSID                        1
-#define ASSOC_FLAG_CHANNEL             2
-#define ASSOC_FLAG_BAND                        3
-#define ASSOC_FLAG_MODE                        4
-#define ASSOC_FLAG_BSSID               5
-#define ASSOC_FLAG_WEP_KEYS            6
-#define ASSOC_FLAG_WEP_TX_KEYIDX       7
-#define ASSOC_FLAG_WPA_MCAST_KEY       8
-#define ASSOC_FLAG_WPA_UCAST_KEY       9
-#define ASSOC_FLAG_SECINFO             10
-#define ASSOC_FLAG_WPA_IE              11
-       unsigned long flags;
-
-       u8 ssid[IEEE80211_MAX_SSID_LEN + 1];
-       u8 ssid_len;
-       u8 channel;
-       u8 band;
-       u8 mode;
-       u8 bssid[ETH_ALEN] __attribute__ ((aligned (2)));
-
-       /** WEP keys */
-       struct enc_key wep_keys[4];
-       u16 wep_tx_keyidx;
-
-       /** WPA keys */
-       struct enc_key wpa_mcast_key;
-       struct enc_key wpa_unicast_key;
-
-       struct lbs_802_11_security secinfo;
-
-       /** WPA Information Elements*/
-       u8 wpa_ie[MAX_WPA_IE_LEN];
-       u8 wpa_ie_len;
-
-       /* BSS to associate with for infrastructure of Ad-Hoc join */
-       struct bss_descriptor bss;
-};
-
 #endif
index 2f87659cc1d33b57e5c22e135d3cde9ce9bd1317..ee0893334553f627423e4010b0fa5bacaeb73a6c 100644 (file)
@@ -45,132 +45,12 @@ module_param_named(libertas_debug, lbs_debug, int, 0644);
 struct cmd_confirm_sleep confirm_sleep;
 
 
-#define LBS_TX_PWR_DEFAULT             20      /*100mW */
-#define LBS_TX_PWR_US_DEFAULT          20      /*100mW */
-#define LBS_TX_PWR_JP_DEFAULT          16      /*50mW */
-#define LBS_TX_PWR_FR_DEFAULT          20      /*100mW */
-#define LBS_TX_PWR_EMEA_DEFAULT        20      /*100mW */
-
-/* Format { channel, frequency (MHz), maxtxpower } */
-/* band: 'B/G', region: USA FCC/Canada IC */
-static struct chan_freq_power channel_freq_power_US_BG[] = {
-       {1, 2412, LBS_TX_PWR_US_DEFAULT},
-       {2, 2417, LBS_TX_PWR_US_DEFAULT},
-       {3, 2422, LBS_TX_PWR_US_DEFAULT},
-       {4, 2427, LBS_TX_PWR_US_DEFAULT},
-       {5, 2432, LBS_TX_PWR_US_DEFAULT},
-       {6, 2437, LBS_TX_PWR_US_DEFAULT},
-       {7, 2442, LBS_TX_PWR_US_DEFAULT},
-       {8, 2447, LBS_TX_PWR_US_DEFAULT},
-       {9, 2452, LBS_TX_PWR_US_DEFAULT},
-       {10, 2457, LBS_TX_PWR_US_DEFAULT},
-       {11, 2462, LBS_TX_PWR_US_DEFAULT}
-};
-
-/* band: 'B/G', region: Europe ETSI */
-static struct chan_freq_power channel_freq_power_EU_BG[] = {
-       {1, 2412, LBS_TX_PWR_EMEA_DEFAULT},
-       {2, 2417, LBS_TX_PWR_EMEA_DEFAULT},
-       {3, 2422, LBS_TX_PWR_EMEA_DEFAULT},
-       {4, 2427, LBS_TX_PWR_EMEA_DEFAULT},
-       {5, 2432, LBS_TX_PWR_EMEA_DEFAULT},
-       {6, 2437, LBS_TX_PWR_EMEA_DEFAULT},
-       {7, 2442, LBS_TX_PWR_EMEA_DEFAULT},
-       {8, 2447, LBS_TX_PWR_EMEA_DEFAULT},
-       {9, 2452, LBS_TX_PWR_EMEA_DEFAULT},
-       {10, 2457, LBS_TX_PWR_EMEA_DEFAULT},
-       {11, 2462, LBS_TX_PWR_EMEA_DEFAULT},
-       {12, 2467, LBS_TX_PWR_EMEA_DEFAULT},
-       {13, 2472, LBS_TX_PWR_EMEA_DEFAULT}
-};
-
-/* band: 'B/G', region: Spain */
-static struct chan_freq_power channel_freq_power_SPN_BG[] = {
-       {10, 2457, LBS_TX_PWR_DEFAULT},
-       {11, 2462, LBS_TX_PWR_DEFAULT}
-};
-
-/* band: 'B/G', region: France */
-static struct chan_freq_power channel_freq_power_FR_BG[] = {
-       {10, 2457, LBS_TX_PWR_FR_DEFAULT},
-       {11, 2462, LBS_TX_PWR_FR_DEFAULT},
-       {12, 2467, LBS_TX_PWR_FR_DEFAULT},
-       {13, 2472, LBS_TX_PWR_FR_DEFAULT}
-};
-
-/* band: 'B/G', region: Japan */
-static struct chan_freq_power channel_freq_power_JPN_BG[] = {
-       {1, 2412, LBS_TX_PWR_JP_DEFAULT},
-       {2, 2417, LBS_TX_PWR_JP_DEFAULT},
-       {3, 2422, LBS_TX_PWR_JP_DEFAULT},
-       {4, 2427, LBS_TX_PWR_JP_DEFAULT},
-       {5, 2432, LBS_TX_PWR_JP_DEFAULT},
-       {6, 2437, LBS_TX_PWR_JP_DEFAULT},
-       {7, 2442, LBS_TX_PWR_JP_DEFAULT},
-       {8, 2447, LBS_TX_PWR_JP_DEFAULT},
-       {9, 2452, LBS_TX_PWR_JP_DEFAULT},
-       {10, 2457, LBS_TX_PWR_JP_DEFAULT},
-       {11, 2462, LBS_TX_PWR_JP_DEFAULT},
-       {12, 2467, LBS_TX_PWR_JP_DEFAULT},
-       {13, 2472, LBS_TX_PWR_JP_DEFAULT},
-       {14, 2484, LBS_TX_PWR_JP_DEFAULT}
-};
-
-/**
- * the structure for channel, frequency and power
- */
-struct region_cfp_table {
-       u8 region;
-       struct chan_freq_power *cfp_BG;
-       int cfp_no_BG;
-};
-
-/**
- * the structure for the mapping between region and CFP
- */
-static struct region_cfp_table region_cfp_table[] = {
-       {0x10,                  /*US FCC */
-        channel_freq_power_US_BG,
-        ARRAY_SIZE(channel_freq_power_US_BG),
-        }
-       ,
-       {0x20,                  /*CANADA IC */
-        channel_freq_power_US_BG,
-        ARRAY_SIZE(channel_freq_power_US_BG),
-        }
-       ,
-       {0x30, /*EU*/ channel_freq_power_EU_BG,
-        ARRAY_SIZE(channel_freq_power_EU_BG),
-        }
-       ,
-       {0x31, /*SPAIN*/ channel_freq_power_SPN_BG,
-        ARRAY_SIZE(channel_freq_power_SPN_BG),
-        }
-       ,
-       {0x32, /*FRANCE*/ channel_freq_power_FR_BG,
-        ARRAY_SIZE(channel_freq_power_FR_BG),
-        }
-       ,
-       {0x40, /*JAPAN*/ channel_freq_power_JPN_BG,
-        ARRAY_SIZE(channel_freq_power_JPN_BG),
-        }
-       ,
-/*Add new region here */
-};
-
 /**
  * the table to keep region code
  */
 u16 lbs_region_code_to_index[MRVDRV_MAX_REGION_CODE] =
     { 0x10, 0x20, 0x30, 0x31, 0x32, 0x40 };
 
-/**
- * 802.11b/g supported bitrates (in 500Kb/s units)
- */
-u8 lbs_bg_rates[MAX_RATES] =
-    { 0x02, 0x04, 0x0b, 0x16, 0x0c, 0x12, 0x18, 0x24, 0x30, 0x48, 0x60, 0x6c,
-0x00, 0x00 };
-
 /**
  * FW rate table.  FW refers to rates by their index in this table, not by the
  * rate value itself.  Values of 0x00 are
@@ -1617,68 +1497,6 @@ static void lbs_remove_mesh(struct lbs_private *priv)
        lbs_deb_leave(LBS_DEB_MESH);
 }
 
-/**
- *  @brief This function finds the CFP in
- *  region_cfp_table based on region and band parameter.
- *
- *  @param region  The region code
- *  @param band           The band
- *  @param cfp_no  A pointer to CFP number
- *  @return       A pointer to CFP
- */
-struct chan_freq_power *lbs_get_region_cfp_table(u8 region, int *cfp_no)
-{
-       int i, end;
-
-       lbs_deb_enter(LBS_DEB_MAIN);
-
-       end = ARRAY_SIZE(region_cfp_table);
-
-       for (i = 0; i < end ; i++) {
-               lbs_deb_main("region_cfp_table[i].region=%d\n",
-                       region_cfp_table[i].region);
-               if (region_cfp_table[i].region == region) {
-                       *cfp_no = region_cfp_table[i].cfp_no_BG;
-                       lbs_deb_leave(LBS_DEB_MAIN);
-                       return region_cfp_table[i].cfp_BG;
-               }
-       }
-
-       lbs_deb_leave_args(LBS_DEB_MAIN, "ret NULL");
-       return NULL;
-}
-
-int lbs_set_regiontable(struct lbs_private *priv, u8 region, u8 band)
-{
-       int ret = 0;
-       int i = 0;
-
-       struct chan_freq_power *cfp;
-       int cfp_no;
-
-       lbs_deb_enter(LBS_DEB_MAIN);
-
-       memset(priv->region_channel, 0, sizeof(priv->region_channel));
-
-       cfp = lbs_get_region_cfp_table(region, &cfp_no);
-       if (cfp != NULL) {
-               priv->region_channel[i].nrcfp = cfp_no;
-               priv->region_channel[i].CFP = cfp;
-       } else {
-               lbs_deb_main("wrong region code %#x in band B/G\n",
-                      region);
-               ret = -1;
-               goto out;
-       }
-       priv->region_channel[i].valid = 1;
-       priv->region_channel[i].region = region;
-       priv->region_channel[i].band = band;
-       i++;
-out:
-       lbs_deb_leave_args(LBS_DEB_MAIN, "ret %d", ret);
-       return ret;
-}
-
 void lbs_queue_event(struct lbs_private *priv, u32 event)
 {
        unsigned long flags;
index 2700f4b455e39db53752cc63ff54f6797b1c4569..8273bcd216bed843fece30e90a453a06615b5b25 100644 (file)
@@ -15,6 +15,7 @@
 #include "decl.h"
 #include "dev.h"
 #include "scan.h"
+#include "assoc.h"
 #include "cmd.h"
 
 //! Approximate amount of data needed to pass a scan result back to iwlist
@@ -121,6 +122,189 @@ static inline int is_same_network(struct bss_descriptor *src,
 
 
 
+/*********************************************************************/
+/*                                                                   */
+/* Region channel support                                            */
+/*                                                                   */
+/*********************************************************************/
+
+#define LBS_TX_PWR_DEFAULT             20      /*100mW */
+#define LBS_TX_PWR_US_DEFAULT          20      /*100mW */
+#define LBS_TX_PWR_JP_DEFAULT          16      /*50mW */
+#define LBS_TX_PWR_FR_DEFAULT          20      /*100mW */
+#define LBS_TX_PWR_EMEA_DEFAULT        20      /*100mW */
+
+/* Format { channel, frequency (MHz), maxtxpower } */
+/* band: 'B/G', region: USA FCC/Canada IC */
+static struct chan_freq_power channel_freq_power_US_BG[] = {
+       {1, 2412, LBS_TX_PWR_US_DEFAULT},
+       {2, 2417, LBS_TX_PWR_US_DEFAULT},
+       {3, 2422, LBS_TX_PWR_US_DEFAULT},
+       {4, 2427, LBS_TX_PWR_US_DEFAULT},
+       {5, 2432, LBS_TX_PWR_US_DEFAULT},
+       {6, 2437, LBS_TX_PWR_US_DEFAULT},
+       {7, 2442, LBS_TX_PWR_US_DEFAULT},
+       {8, 2447, LBS_TX_PWR_US_DEFAULT},
+       {9, 2452, LBS_TX_PWR_US_DEFAULT},
+       {10, 2457, LBS_TX_PWR_US_DEFAULT},
+       {11, 2462, LBS_TX_PWR_US_DEFAULT}
+};
+
+/* band: 'B/G', region: Europe ETSI */
+static struct chan_freq_power channel_freq_power_EU_BG[] = {
+       {1, 2412, LBS_TX_PWR_EMEA_DEFAULT},
+       {2, 2417, LBS_TX_PWR_EMEA_DEFAULT},
+       {3, 2422, LBS_TX_PWR_EMEA_DEFAULT},
+       {4, 2427, LBS_TX_PWR_EMEA_DEFAULT},
+       {5, 2432, LBS_TX_PWR_EMEA_DEFAULT},
+       {6, 2437, LBS_TX_PWR_EMEA_DEFAULT},
+       {7, 2442, LBS_TX_PWR_EMEA_DEFAULT},
+       {8, 2447, LBS_TX_PWR_EMEA_DEFAULT},
+       {9, 2452, LBS_TX_PWR_EMEA_DEFAULT},
+       {10, 2457, LBS_TX_PWR_EMEA_DEFAULT},
+       {11, 2462, LBS_TX_PWR_EMEA_DEFAULT},
+       {12, 2467, LBS_TX_PWR_EMEA_DEFAULT},
+       {13, 2472, LBS_TX_PWR_EMEA_DEFAULT}
+};
+
+/* band: 'B/G', region: Spain */
+static struct chan_freq_power channel_freq_power_SPN_BG[] = {
+       {10, 2457, LBS_TX_PWR_DEFAULT},
+       {11, 2462, LBS_TX_PWR_DEFAULT}
+};
+
+/* band: 'B/G', region: France */
+static struct chan_freq_power channel_freq_power_FR_BG[] = {
+       {10, 2457, LBS_TX_PWR_FR_DEFAULT},
+       {11, 2462, LBS_TX_PWR_FR_DEFAULT},
+       {12, 2467, LBS_TX_PWR_FR_DEFAULT},
+       {13, 2472, LBS_TX_PWR_FR_DEFAULT}
+};
+
+/* band: 'B/G', region: Japan */
+static struct chan_freq_power channel_freq_power_JPN_BG[] = {
+       {1, 2412, LBS_TX_PWR_JP_DEFAULT},
+       {2, 2417, LBS_TX_PWR_JP_DEFAULT},
+       {3, 2422, LBS_TX_PWR_JP_DEFAULT},
+       {4, 2427, LBS_TX_PWR_JP_DEFAULT},
+       {5, 2432, LBS_TX_PWR_JP_DEFAULT},
+       {6, 2437, LBS_TX_PWR_JP_DEFAULT},
+       {7, 2442, LBS_TX_PWR_JP_DEFAULT},
+       {8, 2447, LBS_TX_PWR_JP_DEFAULT},
+       {9, 2452, LBS_TX_PWR_JP_DEFAULT},
+       {10, 2457, LBS_TX_PWR_JP_DEFAULT},
+       {11, 2462, LBS_TX_PWR_JP_DEFAULT},
+       {12, 2467, LBS_TX_PWR_JP_DEFAULT},
+       {13, 2472, LBS_TX_PWR_JP_DEFAULT},
+       {14, 2484, LBS_TX_PWR_JP_DEFAULT}
+};
+
+/**
+ * the structure for channel, frequency and power
+ */
+struct region_cfp_table {
+       u8 region;
+       struct chan_freq_power *cfp_BG;
+       int cfp_no_BG;
+};
+
+/**
+ * the structure for the mapping between region and CFP
+ */
+static struct region_cfp_table region_cfp_table[] = {
+       {0x10,                  /*US FCC */
+        channel_freq_power_US_BG,
+        ARRAY_SIZE(channel_freq_power_US_BG),
+        }
+       ,
+       {0x20,                  /*CANADA IC */
+        channel_freq_power_US_BG,
+        ARRAY_SIZE(channel_freq_power_US_BG),
+        }
+       ,
+       {0x30, /*EU*/ channel_freq_power_EU_BG,
+        ARRAY_SIZE(channel_freq_power_EU_BG),
+        }
+       ,
+       {0x31, /*SPAIN*/ channel_freq_power_SPN_BG,
+        ARRAY_SIZE(channel_freq_power_SPN_BG),
+        }
+       ,
+       {0x32, /*FRANCE*/ channel_freq_power_FR_BG,
+        ARRAY_SIZE(channel_freq_power_FR_BG),
+        }
+       ,
+       {0x40, /*JAPAN*/ channel_freq_power_JPN_BG,
+        ARRAY_SIZE(channel_freq_power_JPN_BG),
+        }
+       ,
+/*Add new region here */
+};
+
+/**
+ *  @brief This function finds the CFP in
+ *  region_cfp_table based on region and band parameter.
+ *
+ *  @param region  The region code
+ *  @param band           The band
+ *  @param cfp_no  A pointer to CFP number
+ *  @return       A pointer to CFP
+ */
+static struct chan_freq_power *lbs_get_region_cfp_table(u8 region, int *cfp_no)
+{
+       int i, end;
+
+       lbs_deb_enter(LBS_DEB_MAIN);
+
+       end = ARRAY_SIZE(region_cfp_table);
+
+       for (i = 0; i < end ; i++) {
+               lbs_deb_main("region_cfp_table[i].region=%d\n",
+                       region_cfp_table[i].region);
+               if (region_cfp_table[i].region == region) {
+                       *cfp_no = region_cfp_table[i].cfp_no_BG;
+                       lbs_deb_leave(LBS_DEB_MAIN);
+                       return region_cfp_table[i].cfp_BG;
+               }
+       }
+
+       lbs_deb_leave_args(LBS_DEB_MAIN, "ret NULL");
+       return NULL;
+}
+
+int lbs_set_regiontable(struct lbs_private *priv, u8 region, u8 band)
+{
+       int ret = 0;
+       int i = 0;
+
+       struct chan_freq_power *cfp;
+       int cfp_no;
+
+       lbs_deb_enter(LBS_DEB_MAIN);
+
+       memset(priv->region_channel, 0, sizeof(priv->region_channel));
+
+       cfp = lbs_get_region_cfp_table(region, &cfp_no);
+       if (cfp != NULL) {
+               priv->region_channel[i].nrcfp = cfp_no;
+               priv->region_channel[i].CFP = cfp;
+       } else {
+               lbs_deb_main("wrong region code %#x in band B/G\n",
+                      region);
+               ret = -1;
+               goto out;
+       }
+       priv->region_channel[i].valid = 1;
+       priv->region_channel[i].region = region;
+       priv->region_channel[i].band = band;
+       i++;
+out:
+       lbs_deb_leave_args(LBS_DEB_MAIN, "ret %d", ret);
+       return ret;
+}
+
+
+
 
 /*********************************************************************/
 /*                                                                   */
index fab7d5d097fc73f5241117e35b4adc32b30a6c1c..8fb1706d752667ae0682fd2a730665d16a765f21 100644 (file)
@@ -9,8 +9,36 @@
 
 #include <net/iw_handler.h>
 
+struct lbs_private;
+
 #define MAX_NETWORK_COUNT 128
 
+/** Chan-freq-TxPower mapping table*/
+struct chan_freq_power {
+       /** channel Number              */
+       u16 channel;
+       /** frequency of this channel   */
+       u32 freq;
+       /** Max allowed Tx power level  */
+       u16 maxtxpower;
+       /** TRUE:channel unsupported;  FLASE:supported*/
+       u8 unsupported;
+};
+
+/** region-band mapping table*/
+struct region_channel {
+       /** TRUE if this entry is valid              */
+       u8 valid;
+       /** region code for US, Japan ...            */
+       u8 region;
+       /** band B/G/A, used for BAND_CONFIG cmd             */
+       u8 band;
+       /** Actual No. of elements in the array below */
+       u8 nrcfp;
+       /** chan-freq-txpower mapping table*/
+       struct chan_freq_power *CFP;
+};
+
 /**
  *  @brief Maximum number of channels that can be sent in a setuserscan ioctl
  */
@@ -18,6 +46,8 @@
 
 int lbs_ssid_cmp(u8 *ssid1, u8 ssid1_len, u8 *ssid2, u8 ssid2_len);
 
+int lbs_set_regiontable(struct lbs_private *priv, u8 region, u8 band);
+
 int lbs_send_specific_ssid_scan(struct lbs_private *priv, u8 *ssid,
                                u8 ssid_len);