]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/staging/rtl8187se/ieee80211/dot11d.c
Merge branch 'omap-pool'
[linux-2.6-omap-h63xx.git] / drivers / staging / rtl8187se / ieee80211 / dot11d.c
index 5d8b752fc0fb98744b48b7cd596ef7aefa9a903f..54bcdcf1d330f1b5e60d7793743f2ad5e8fb4c12 100644 (file)
-#ifdef ENABLE_DOT11D\r
-//-----------------------------------------------------------------------------\r
-//     File:\r
-//             Dot11d.c\r
-//\r
-//     Description:\r
-//             Implement 802.11d. \r
-//\r
-//-----------------------------------------------------------------------------\r
-\r
-#include "dot11d.h"\r
-\r
-void\r
-Dot11d_Init(struct ieee80211_device *ieee)\r
-{\r
-       PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(ieee);\r
-\r
-       pDot11dInfo->bEnabled = 0;\r
-\r
-       pDot11dInfo->State = DOT11D_STATE_NONE;\r
-       pDot11dInfo->CountryIeLen = 0;\r
-       memset(pDot11dInfo->channel_map, 0, MAX_CHANNEL_NUMBER+1);  \r
-       memset(pDot11dInfo->MaxTxPwrDbmList, 0xFF, MAX_CHANNEL_NUMBER+1);\r
-       RESET_CIE_WATCHDOG(ieee);\r
-\r
-       printk("Dot11d_Init()\n");\r
-}\r
-\r
-//\r
-//     Description:\r
-//             Reset to the state as we are just entering a regulatory domain.\r
-//\r
-void\r
-Dot11d_Reset(struct ieee80211_device *ieee)\r
-{\r
-       u32 i;\r
-       PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(ieee);\r
-\r
-       // Clear old channel map\r
-       memset(pDot11dInfo->channel_map, 0, MAX_CHANNEL_NUMBER+1);\r
-       memset(pDot11dInfo->MaxTxPwrDbmList, 0xFF, MAX_CHANNEL_NUMBER+1);\r
-       // Set new channel map\r
-       for (i=1; i<=11; i++) {\r
-               (pDot11dInfo->channel_map)[i] = 1;\r
-       }\r
-       for (i=12; i<=14; i++) {\r
-               (pDot11dInfo->channel_map)[i] = 2;\r
-       }\r
-\r
-       pDot11dInfo->State = DOT11D_STATE_NONE;\r
-       pDot11dInfo->CountryIeLen = 0;\r
-       RESET_CIE_WATCHDOG(ieee);\r
-\r
-       //printk("Dot11d_Reset()\n");\r
-}\r
-\r
-//\r
-//     Description:\r
-//             Update country IE from Beacon or Probe Resopnse \r
-//             and configure PHY for operation in the regulatory domain.\r
-//\r
-//     TODO: \r
-//             Configure Tx power.\r
-//\r
-//     Assumption:\r
-//             1. IS_DOT11D_ENABLE() is TRUE.\r
-//             2. Input IE is an valid one.\r
-//\r
-void\r
-Dot11d_UpdateCountryIe(\r
-       struct ieee80211_device *dev,\r
-       u8 *            pTaddr,\r
-       u16     CoutryIeLen,\r
-       u8 * pCoutryIe   \r
-       )\r
-{\r
-       PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(dev);\r
-       u8 i, j, NumTriples, MaxChnlNum;\r
-       PCHNL_TXPOWER_TRIPLE pTriple;\r
-\r
-       if((CoutryIeLen - 3)%3 != 0)\r
-       {\r
-               printk("Dot11d_UpdateCountryIe(): Invalid country IE, skip it........1\n");\r
-               Dot11d_Reset(dev);\r
-               return;\r
-       }\r
-\r
-       memset(pDot11dInfo->channel_map, 0, MAX_CHANNEL_NUMBER+1);\r
-       memset(pDot11dInfo->MaxTxPwrDbmList, 0xFF, MAX_CHANNEL_NUMBER+1);\r
-       MaxChnlNum = 0;\r
-       NumTriples = (CoutryIeLen - 3) / 3; // skip 3-byte country string.\r
-       pTriple = (PCHNL_TXPOWER_TRIPLE)(pCoutryIe + 3);\r
-       for(i = 0; i < NumTriples; i++)\r
-       {\r
-               if(MaxChnlNum >= pTriple->FirstChnl)\r
-               { // It is not in a monotonically increasing order, so stop processing.\r
-                       printk("Dot11d_UpdateCountryIe(): Invalid country IE, skip it........1\n");\r
-                       Dot11d_Reset(dev);\r
-                       return; \r
-               }\r
-               if(MAX_CHANNEL_NUMBER < (pTriple->FirstChnl + pTriple->NumChnls))\r
-               { // It is not a valid set of channel id, so stop processing.\r
-                       printk("Dot11d_UpdateCountryIe(): Invalid country IE, skip it........2\n");\r
-                       Dot11d_Reset(dev);\r
-                       return; \r
-               }\r
-\r
-               for(j = 0 ; j < pTriple->NumChnls; j++)\r
-               {\r
-                       pDot11dInfo->channel_map[pTriple->FirstChnl + j] = 1;\r
-                       pDot11dInfo->MaxTxPwrDbmList[pTriple->FirstChnl + j] = pTriple->MaxTxPowerInDbm;\r
-                       MaxChnlNum = pTriple->FirstChnl + j;\r
-               }       \r
-\r
-               pTriple = (PCHNL_TXPOWER_TRIPLE)((u8*)pTriple + 3);\r
-       }\r
-#if 1\r
-       //printk("Dot11d_UpdateCountryIe(): Channel List:\n");\r
-       printk("Channel List:");\r
-       for(i=1; i<= MAX_CHANNEL_NUMBER; i++)\r
-               if(pDot11dInfo->channel_map[i] > 0)\r
-                       printk(" %d", i);\r
-       printk("\n");\r
-#endif\r
-\r
-       UPDATE_CIE_SRC(dev, pTaddr);\r
-\r
-       pDot11dInfo->CountryIeLen = CoutryIeLen;\r
-       memcpy(pDot11dInfo->CountryIeBuf, pCoutryIe,CoutryIeLen);\r
-       pDot11dInfo->State = DOT11D_STATE_LEARNED;\r
-}\r
-\r
-void dump_chnl_map(u8 * channel_map)\r
-{\r
-       int i;\r
-       printk("Channel List:");\r
-       for(i=1; i<= MAX_CHANNEL_NUMBER; i++)\r
-               if(channel_map[i] > 0)\r
-                       printk(" %d(%d)", i, channel_map[i]);\r
-       printk("\n");\r
-}\r
-\r
-u8\r
-DOT11D_GetMaxTxPwrInDbm(\r
-       struct ieee80211_device *dev,\r
-       u8 Channel\r
-       )\r
-{\r
-       PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(dev);\r
-       u8 MaxTxPwrInDbm = 255;\r
-\r
-       if(MAX_CHANNEL_NUMBER < Channel)\r
-       { \r
-               printk("DOT11D_GetMaxTxPwrInDbm(): Invalid Channel\n");\r
-               return MaxTxPwrInDbm; \r
-       }\r
-       if(pDot11dInfo->channel_map[Channel])\r
-       {\r
-               MaxTxPwrInDbm = pDot11dInfo->MaxTxPwrDbmList[Channel];  \r
-       }\r
-\r
-       return MaxTxPwrInDbm;\r
-}\r
-\r
-\r
-void\r
-DOT11D_ScanComplete(\r
-       struct ieee80211_device * dev\r
-       )\r
-{\r
-       PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(dev);\r
-\r
-       switch(pDot11dInfo->State)\r
-       {\r
-       case DOT11D_STATE_LEARNED:\r
-               pDot11dInfo->State = DOT11D_STATE_DONE;\r
-               break;\r
-\r
-       case DOT11D_STATE_DONE:\r
-               if( GET_CIE_WATCHDOG(dev) == 0 )\r
-               { // Reset country IE if previous one is gone. \r
-                       Dot11d_Reset(dev); \r
-               }\r
-               break;\r
-       case DOT11D_STATE_NONE:\r
-               break;\r
-       }\r
-}\r
-\r
-int IsLegalChannel(\r
-       struct ieee80211_device * dev,\r
-       u8 channel\r
-)\r
-{\r
-       PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(dev);\r
-\r
-       if(MAX_CHANNEL_NUMBER < channel)\r
-       { \r
-               printk("IsLegalChannel(): Invalid Channel\n");\r
-               return 0; \r
-       }\r
-       if(pDot11dInfo->channel_map[channel] > 0)\r
-               return 1;\r
-       return 0;\r
-}\r
-\r
-int ToLegalChannel(\r
-       struct ieee80211_device * dev,\r
-       u8 channel\r
-)\r
-{\r
-       PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(dev);\r
-       u8 default_chn = 0;\r
-       u32 i = 0;\r
-\r
-       for (i=1; i<= MAX_CHANNEL_NUMBER; i++)\r
-       {\r
-               if(pDot11dInfo->channel_map[i] > 0)\r
-               {\r
-                       default_chn = i;\r
-                       break;\r
-               }\r
-       }\r
-\r
-       if(MAX_CHANNEL_NUMBER < channel)\r
-       { \r
-               printk("IsLegalChannel(): Invalid Channel\n");\r
-               return default_chn; \r
-       }\r
-       \r
-       if(pDot11dInfo->channel_map[channel] > 0)\r
-               return channel;\r
-       \r
-       return default_chn;\r
-}\r
-\r
-#if 0\r
-EXPORT_SYMBOL(Dot11d_Init);\r
-EXPORT_SYMBOL(Dot11d_Reset);\r
-EXPORT_SYMBOL(Dot11d_UpdateCountryIe);\r
-EXPORT_SYMBOL(DOT11D_GetMaxTxPwrInDbm);\r
-EXPORT_SYMBOL(DOT11D_ScanComplete);\r
-EXPORT_SYMBOL(IsLegalChannel);\r
-EXPORT_SYMBOL(ToLegalChannel);\r
-#endif\r
-#endif\r
+#ifdef ENABLE_DOT11D
+//-----------------------------------------------------------------------------
+//     File:
+//             Dot11d.c
+//
+//     Description:
+//             Implement 802.11d.
+//
+//-----------------------------------------------------------------------------
+
+#include "dot11d.h"
+
+void
+Dot11d_Init(struct ieee80211_device *ieee)
+{
+       PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(ieee);
+
+       pDot11dInfo->bEnabled = 0;
+
+       pDot11dInfo->State = DOT11D_STATE_NONE;
+       pDot11dInfo->CountryIeLen = 0;
+       memset(pDot11dInfo->channel_map, 0, MAX_CHANNEL_NUMBER+1);
+       memset(pDot11dInfo->MaxTxPwrDbmList, 0xFF, MAX_CHANNEL_NUMBER+1);
+       RESET_CIE_WATCHDOG(ieee);
+
+       printk("Dot11d_Init()\n");
+}
+
+//
+//     Description:
+//             Reset to the state as we are just entering a regulatory domain.
+//
+void
+Dot11d_Reset(struct ieee80211_device *ieee)
+{
+       u32 i;
+       PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(ieee);
+
+       // Clear old channel map
+       memset(pDot11dInfo->channel_map, 0, MAX_CHANNEL_NUMBER+1);
+       memset(pDot11dInfo->MaxTxPwrDbmList, 0xFF, MAX_CHANNEL_NUMBER+1);
+       // Set new channel map
+       for (i=1; i<=11; i++) {
+               (pDot11dInfo->channel_map)[i] = 1;
+       }
+       for (i=12; i<=14; i++) {
+               (pDot11dInfo->channel_map)[i] = 2;
+       }
+
+       pDot11dInfo->State = DOT11D_STATE_NONE;
+       pDot11dInfo->CountryIeLen = 0;
+       RESET_CIE_WATCHDOG(ieee);
+
+       //printk("Dot11d_Reset()\n");
+}
+
+//
+//     Description:
+//             Update country IE from Beacon or Probe Resopnse
+//             and configure PHY for operation in the regulatory domain.
+//
+//     TODO:
+//             Configure Tx power.
+//
+//     Assumption:
+//             1. IS_DOT11D_ENABLE() is TRUE.
+//             2. Input IE is an valid one.
+//
+void
+Dot11d_UpdateCountryIe(
+       struct ieee80211_device *dev,
+       u8 *            pTaddr,
+       u16     CoutryIeLen,
+       u8 * pCoutryIe
+       )
+{
+       PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(dev);
+       u8 i, j, NumTriples, MaxChnlNum;
+       PCHNL_TXPOWER_TRIPLE pTriple;
+
+       if((CoutryIeLen - 3)%3 != 0)
+       {
+               printk("Dot11d_UpdateCountryIe(): Invalid country IE, skip it........1\n");
+               Dot11d_Reset(dev);
+               return;
+       }
+
+       memset(pDot11dInfo->channel_map, 0, MAX_CHANNEL_NUMBER+1);
+       memset(pDot11dInfo->MaxTxPwrDbmList, 0xFF, MAX_CHANNEL_NUMBER+1);
+       MaxChnlNum = 0;
+       NumTriples = (CoutryIeLen - 3) / 3; // skip 3-byte country string.
+       pTriple = (PCHNL_TXPOWER_TRIPLE)(pCoutryIe + 3);
+       for(i = 0; i < NumTriples; i++)
+       {
+               if(MaxChnlNum >= pTriple->FirstChnl)
+               { // It is not in a monotonically increasing order, so stop processing.
+                       printk("Dot11d_UpdateCountryIe(): Invalid country IE, skip it........1\n");
+                       Dot11d_Reset(dev);
+                       return;
+               }
+               if(MAX_CHANNEL_NUMBER < (pTriple->FirstChnl + pTriple->NumChnls))
+               { // It is not a valid set of channel id, so stop processing.
+                       printk("Dot11d_UpdateCountryIe(): Invalid country IE, skip it........2\n");
+                       Dot11d_Reset(dev);
+                       return;
+               }
+
+               for(j = 0 ; j < pTriple->NumChnls; j++)
+               {
+                       pDot11dInfo->channel_map[pTriple->FirstChnl + j] = 1;
+                       pDot11dInfo->MaxTxPwrDbmList[pTriple->FirstChnl + j] = pTriple->MaxTxPowerInDbm;
+                       MaxChnlNum = pTriple->FirstChnl + j;
+               }
+
+               pTriple = (PCHNL_TXPOWER_TRIPLE)((u8*)pTriple + 3);
+       }
+#if 1
+       //printk("Dot11d_UpdateCountryIe(): Channel List:\n");
+       printk("Channel List:");
+       for(i=1; i<= MAX_CHANNEL_NUMBER; i++)
+               if(pDot11dInfo->channel_map[i] > 0)
+                       printk(" %d", i);
+       printk("\n");
+#endif
+
+       UPDATE_CIE_SRC(dev, pTaddr);
+
+       pDot11dInfo->CountryIeLen = CoutryIeLen;
+       memcpy(pDot11dInfo->CountryIeBuf, pCoutryIe,CoutryIeLen);
+       pDot11dInfo->State = DOT11D_STATE_LEARNED;
+}
+
+void dump_chnl_map(u8 * channel_map)
+{
+       int i;
+       printk("Channel List:");
+       for(i=1; i<= MAX_CHANNEL_NUMBER; i++)
+               if(channel_map[i] > 0)
+                       printk(" %d(%d)", i, channel_map[i]);
+       printk("\n");
+}
+
+u8
+DOT11D_GetMaxTxPwrInDbm(
+       struct ieee80211_device *dev,
+       u8 Channel
+       )
+{
+       PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(dev);
+       u8 MaxTxPwrInDbm = 255;
+
+       if(MAX_CHANNEL_NUMBER < Channel)
+       {
+               printk("DOT11D_GetMaxTxPwrInDbm(): Invalid Channel\n");
+               return MaxTxPwrInDbm;
+       }
+       if(pDot11dInfo->channel_map[Channel])
+       {
+               MaxTxPwrInDbm = pDot11dInfo->MaxTxPwrDbmList[Channel];
+       }
+
+       return MaxTxPwrInDbm;
+}
+
+
+void
+DOT11D_ScanComplete(
+       struct ieee80211_device * dev
+       )
+{
+       PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(dev);
+
+       switch(pDot11dInfo->State)
+       {
+       case DOT11D_STATE_LEARNED:
+               pDot11dInfo->State = DOT11D_STATE_DONE;
+               break;
+
+       case DOT11D_STATE_DONE:
+               if( GET_CIE_WATCHDOG(dev) == 0 )
+               { // Reset country IE if previous one is gone.
+                       Dot11d_Reset(dev);
+               }
+               break;
+       case DOT11D_STATE_NONE:
+               break;
+       }
+}
+
+int IsLegalChannel(
+       struct ieee80211_device * dev,
+       u8 channel
+)
+{
+       PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(dev);
+
+       if(MAX_CHANNEL_NUMBER < channel)
+       {
+               printk("IsLegalChannel(): Invalid Channel\n");
+               return 0;
+       }
+       if(pDot11dInfo->channel_map[channel] > 0)
+               return 1;
+       return 0;
+}
+
+int ToLegalChannel(
+       struct ieee80211_device * dev,
+       u8 channel
+)
+{
+       PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(dev);
+       u8 default_chn = 0;
+       u32 i = 0;
+
+       for (i=1; i<= MAX_CHANNEL_NUMBER; i++)
+       {
+               if(pDot11dInfo->channel_map[i] > 0)
+               {
+                       default_chn = i;
+                       break;
+               }
+       }
+
+       if(MAX_CHANNEL_NUMBER < channel)
+       {
+               printk("IsLegalChannel(): Invalid Channel\n");
+               return default_chn;
+       }
+
+       if(pDot11dInfo->channel_map[channel] > 0)
+               return channel;
+
+       return default_chn;
+}
+
+#if 0
+EXPORT_SYMBOL(Dot11d_Init);
+EXPORT_SYMBOL(Dot11d_Reset);
+EXPORT_SYMBOL(Dot11d_UpdateCountryIe);
+EXPORT_SYMBOL(DOT11D_GetMaxTxPwrInDbm);
+EXPORT_SYMBOL(DOT11D_ScanComplete);
+EXPORT_SYMBOL(IsLegalChannel);
+EXPORT_SYMBOL(ToLegalChannel);
+#endif
+#endif