diff options
author | Dmitry Shmidt <dimitrysh@google.com> | 2010-01-29 14:38:28 -0800 |
---|---|---|
committer | Dmitry Shmidt <dimitrysh@google.com> | 2010-01-29 14:38:28 -0800 |
commit | ddac9c138c5b4b16b99fb8bc5f0f10418efa1029 (patch) | |
tree | 9ad7e34f8dcd9d63ef2faa9e865d6056a061e6c3 /wl1271/platforms/os | |
parent | a615fb1650af6e111053506f1b764b28a5b4631d (diff) | |
download | wlan-ddac9c138c5b4b16b99fb8bc5f0f10418efa1029.tar.gz |
wl1271: Android/Sholes update
Signed-off-by: Dmitry Shmidt <dimitrysh@google.com>
Diffstat (limited to 'wl1271/platforms/os')
-rw-r--r-- | wl1271/platforms/os/common/inc/osApi.h | 2 | ||||
-rw-r--r-- | wl1271/platforms/os/common/src/osRgstry.c | 745 | ||||
-rw-r--r-- | wl1271/platforms/os/linux/Makefile | 29 | ||||
-rw-r--r-- | wl1271/platforms/os/linux/build/Makefile | 20 | ||||
-rw-r--r-- | wl1271/platforms/os/linux/inc/WlanDrvIf.h | 12 | ||||
-rw-r--r-- | wl1271/platforms/os/linux/src/CmdInterpretWext.c | 804 | ||||
-rw-r--r-- | wl1271/platforms/os/linux/src/RxBuf.c | 57 | ||||
-rw-r--r-- | wl1271/platforms/os/linux/src/WlanDrvIf.c | 688 | ||||
-rw-r--r-- | wl1271/platforms/os/linux/src/WlanDrvWext.c | 176 | ||||
-rw-r--r-- | wl1271/platforms/os/linux/src/osRgstry_parser.c | 8 | ||||
-rw-r--r-- | wl1271/platforms/os/linux/src/osapi.c | 348 | ||||
-rw-r--r-- | wl1271/platforms/os/linux/src/osmemapi.c | 200 | ||||
-rw-r--r-- | wl1271/platforms/os/linux/src/stack_profile.c | 120 | ||||
-rw-r--r-- | wl1271/platforms/os/linux/wl_env.bash | 9 |
14 files changed, 1730 insertions, 1488 deletions
diff --git a/wl1271/platforms/os/common/inc/osApi.h b/wl1271/platforms/os/common/inc/osApi.h index 46d2e4c0..4787a75f 100644 --- a/wl1271/platforms/os/common/inc/osApi.h +++ b/wl1271/platforms/os/common/inc/osApi.h @@ -529,7 +529,6 @@ void os_protectLock (TI_HANDLE OsContext, TI_HANDLE ProtectContext); */ void os_protectUnlock (TI_HANDLE OsContext, TI_HANDLE ProtectContext); - /* Wakelock functionality */ int os_wake_lock (TI_HANDLE OsContext); int os_wake_unlock (TI_HANDLE OsContext); @@ -539,7 +538,6 @@ int os_wake_lock_timeout_enable (TI_HANDLE OsContext); #define os_profile(hos,fn,par) - /**************************************************************************************** START OF GWSI DRIVER API *****************************************************************************************/ diff --git a/wl1271/platforms/os/common/src/osRgstry.c b/wl1271/platforms/os/common/src/osRgstry.c index 27c88136..736d8726 100644 --- a/wl1271/platforms/os/common/src/osRgstry.c +++ b/wl1271/platforms/os/common/src/osRgstry.c @@ -78,21 +78,21 @@ NDIS_STRING STRGroup_addr7 = NDIS_STRING_CONST( "Group_addr7" ); /* If Early Wakeup is Enabled, 1251 wakes-up EARLY_WAKEUP_TIME before expected Beacon reception occasion */ /* If Early Wakeup is Disabled, 1251 wakes-up at the expected Beacon reception occasion. */ NDIS_STRING STREarlyWakeup = NDIS_STRING_CONST( "EarlyWakeup" ); - + NDIS_STRING STRArp_Ip_Addr = NDIS_STRING_CONST( "ArpIp_Addr" ); NDIS_STRING STRArp_Ip_Filter_Ena = NDIS_STRING_CONST( "ArpIp_Filter_ena"); -NDIS_STRING STRBeaconFilterDesiredState = NDIS_STRING_CONST( "Beacon_Filter_Desired_State") ; -NDIS_STRING STRBeaconFilterStored = NDIS_STRING_CONST( "Beacon_Filter_Stored") ; +NDIS_STRING STRBeaconFilterDesiredState = NDIS_STRING_CONST( "Beacon_Filter_Desired_State"); +NDIS_STRING STRBeaconFilterStored = NDIS_STRING_CONST( "Beacon_Filter_Stored"); /*this is for configuring table from ini file*/ -NDIS_STRING STRBeaconIETableSize = NDIS_STRING_CONST( "Beacon_IE_Table_Size") ; +NDIS_STRING STRBeaconIETableSize = NDIS_STRING_CONST( "Beacon_IE_Table_Size"); NDIS_STRING STRBeaconIETable = NDIS_STRING_CONST( "Beacon_IE_Table") ; -NDIS_STRING STRBeaconIETableNumOfElem = NDIS_STRING_CONST( "Beacon_IE_Num_Of_Elem") ; +NDIS_STRING STRBeaconIETableNumOfElem = NDIS_STRING_CONST( "Beacon_IE_Num_Of_Elem"); -NDIS_STRING STRCoexActivityTable = NDIS_STRING_CONST( "Coex_Activity_Table") ; -NDIS_STRING STRCoexActivityNumOfElem = NDIS_STRING_CONST( "Coex_Activity_Num_Of_Elem") ; +NDIS_STRING STRCoexActivityTable = NDIS_STRING_CONST( "Coex_Activity_Table"); +NDIS_STRING STRCoexActivityNumOfElem = NDIS_STRING_CONST( "Coex_Activity_Num_Of_Elem"); /* ------------------------------------------------------ */ NDIS_STRING STRFirmwareDebug = NDIS_STRING_CONST( "FirmwareDebug" ); @@ -141,7 +141,7 @@ NDIS_STRING STRdot11MaxTxMSDULifetime = NDIS_STRING_CONST( "dot11MaxTransm NDIS_STRING STRdot11MaxReceiveLifetime = NDIS_STRING_CONST( "dot11MaxReceiveLifetime" ); NDIS_STRING STRdot11RateFallBackRetryLimit = NDIS_STRING_CONST( "dot11RateFallBackRetryLimit"); -NDIS_STRING STRReAuthActivePriority = NDIS_STRING_CONST( "ReAuthActivePriority" ); +NDIS_STRING STRReAuthActivePriority = NDIS_STRING_CONST( "ReAuthActivePriority" ); NDIS_STRING STRListenInterval = NDIS_STRING_CONST( "dot11ListenInterval" ); NDIS_STRING STRExternalMode = NDIS_STRING_CONST( "DriverExternalMode" ); @@ -226,12 +226,11 @@ NDIS_STRING STRdot11WEPDefaultKeyID = NDIS_STRING_CONST( "dot11WEPDefaul NDIS_STRING STRMixedMode = NDIS_STRING_CONST( "MixedMode" ); -NDIS_STRING STRWPAMixedMode = NDIS_STRING_CONST( "WPAMixedMode"); -NDIS_STRING STRRSNPreAuth = NDIS_STRING_CONST( "RSNPreAuthentication"); -NDIS_STRING STRRSNPreAuthTimeout = NDIS_STRING_CONST( "RSNPreAuthTimeout" ); - +NDIS_STRING STRWPAMixedMode = NDIS_STRING_CONST( "WPAMixedMode"); +NDIS_STRING STRRSNPreAuth = NDIS_STRING_CONST( "RSNPreAuthentication"); +NDIS_STRING STRRSNPreAuthTimeout = NDIS_STRING_CONST( "RSNPreAuthTimeout" ); -NDIS_STRING STRPairwiseMicFailureFilter = NDIS_STRING_CONST( "PairwiseMicFailureFilter" ); +NDIS_STRING STRPairwiseMicFailureFilter = NDIS_STRING_CONST( "PairwiseMicFailureFilter" ); NDIS_STRING STRTimeToResetCountryMs = NDIS_STRING_CONST( "TimeToResetCountryMs" ); NDIS_STRING STRMultiRegulatoryDomainEnabled = NDIS_STRING_CONST( "MultiRegulatoryDomain" ); @@ -298,7 +297,7 @@ NDIS_STRING STRTriggeredScanTimeOut = NDIS_STRING_CONST( "Tr /*-----------------------------------*/ /* Coexistence params */ /*-----------------------------------*/ -NDIS_STRING STRBThWlanCoexistEnable = NDIS_STRING_CONST( "BThWlanCoexistEnable" ); +NDIS_STRING STRBThWlanCoexistEnable = NDIS_STRING_CONST( "BThWlanCoexistEnable" ); NDIS_STRING STRBThWlanCoexistPerThreshold = NDIS_STRING_CONST( "coexBtPerThreshold" ); NDIS_STRING STRBThWlanCoexistHv3MaxOverride = NDIS_STRING_CONST( "coexHv3MaxOverride" ); @@ -355,8 +354,6 @@ NDIS_STRING STRBThWlanCoexTemp3 = NDIS_STRING_CONST( "coexTempParam3" ); NDIS_STRING STRBThWlanCoexTemp4 = NDIS_STRING_CONST( "coexTempParam4" ); NDIS_STRING STRBThWlanCoexTemp5 = NDIS_STRING_CONST( "coexTempParam5" ); - - NDIS_STRING STRDisableSsidPending = NDIS_STRING_CONST( "DisableSsidPending" ); /*-----------------------------------*/ @@ -630,7 +627,7 @@ NDIS_STRING STRRxDataFiltersFilter4Mask = NDIS_STRING_CONST("RxDataFilte NDIS_STRING STRRxDataFiltersFilter4Pattern = NDIS_STRING_CONST("RxDataFilters_Filter4Pattern"); -NDIS_STRING STRReAuthActiveTimeout = NDIS_STRING_CONST( "ReAuthActiveTimeout" ); +NDIS_STRING STRReAuthActiveTimeout = NDIS_STRING_CONST( "ReAuthActiveTimeout" ); /*--------------------------- Measurement parameters @@ -661,7 +658,7 @@ NDIS_STRING STRstationMacAddress = NDIS_STRING_CONST("dot11Statio NDIS_STRING SendINIBufferToUser = NDIS_STRING_CONST("SendINIBufferToUserMode"); /*------------------------------------------- - RSSI/SNR Weights for Average calculations + RSSI/SNR Weights for Average calculations --------------------------------------------*/ NDIS_STRING STRRssiBeaconAverageWeight = NDIS_STRING_CONST("RssiBeaconAverageWeight"); @@ -769,21 +766,21 @@ NDIS_STRING STRFmCoexSwallowClkDif = NDIS_STRING_CONST("FmCoexSwallowClkD /*----------------------------------------*/ -NDIS_STRING STRRateMngRateRetryScore = NDIS_STRING_CONST("RateMngRateRetryScore"); -NDIS_STRING STRRateMngPerAdd = NDIS_STRING_CONST("RateMngPerAdd"); -NDIS_STRING STRRateMngPerTh1 = NDIS_STRING_CONST("RateMngPerTh1"); -NDIS_STRING STRRateMngPerTh2 = NDIS_STRING_CONST("RateMngPerTh2"); -NDIS_STRING STRRateMngMaxPer = NDIS_STRING_CONST("RateMngMaxPer"); -NDIS_STRING STRRateMngInverseCuriosityFactor = NDIS_STRING_CONST("RateMngInverseCuriosityFactor"); -NDIS_STRING STRRateMngTxFailLowTh = NDIS_STRING_CONST("RateMngTxFailLowTh"); -NDIS_STRING STRRateMngTxFailHighTh = NDIS_STRING_CONST("RateMngTxFailHighTh"); -NDIS_STRING STRRateMngPerAlphaShift = NDIS_STRING_CONST("RateMngPerAlphaShift"); -NDIS_STRING STRRateMngPerAddShift = NDIS_STRING_CONST("RateMngPerAddShift"); -NDIS_STRING STRRateMngPerBeta1Shift = NDIS_STRING_CONST("RateMngPerBeta1Shift"); -NDIS_STRING STRRateMngPerBeta2Shift = NDIS_STRING_CONST("RateMngPerBeta2Shift"); -NDIS_STRING STRRateMngRateCheckUp = NDIS_STRING_CONST("RateMngRateCheckUp"); -NDIS_STRING STRRateMngRateCheckDown = NDIS_STRING_CONST("RateMngRateCheckDown"); -NDIS_STRING STRRateMngRateRetryPolicy = NDIS_STRING_CONST("RateMngRateRetryPolicy"); +NDIS_STRING STRRateMngRateRetryScore = NDIS_STRING_CONST("RateMngRateRetryScore"); +NDIS_STRING STRRateMngPerAdd = NDIS_STRING_CONST("RateMngPerAdd"); +NDIS_STRING STRRateMngPerTh1 = NDIS_STRING_CONST("RateMngPerTh1"); +NDIS_STRING STRRateMngPerTh2 = NDIS_STRING_CONST("RateMngPerTh2"); +NDIS_STRING STRRateMngMaxPer = NDIS_STRING_CONST("RateMngMaxPer"); +NDIS_STRING STRRateMngInverseCuriosityFactor = NDIS_STRING_CONST("RateMngInverseCuriosityFactor"); +NDIS_STRING STRRateMngTxFailLowTh = NDIS_STRING_CONST("RateMngTxFailLowTh"); +NDIS_STRING STRRateMngTxFailHighTh = NDIS_STRING_CONST("RateMngTxFailHighTh"); +NDIS_STRING STRRateMngPerAlphaShift = NDIS_STRING_CONST("RateMngPerAlphaShift"); +NDIS_STRING STRRateMngPerAddShift = NDIS_STRING_CONST("RateMngPerAddShift"); +NDIS_STRING STRRateMngPerBeta1Shift = NDIS_STRING_CONST("RateMngPerBeta1Shift"); +NDIS_STRING STRRateMngPerBeta2Shift = NDIS_STRING_CONST("RateMngPerBeta2Shift"); +NDIS_STRING STRRateMngRateCheckUp = NDIS_STRING_CONST("RateMngRateCheckUp"); +NDIS_STRING STRRateMngRateCheckDown = NDIS_STRING_CONST("RateMngRateCheckDown"); +NDIS_STRING STRRateMngRateRetryPolicy = NDIS_STRING_CONST("RateMngRateRetryPolicy"); NDIS_STRING STRincludeWSCinProbeReq = NDIS_STRING_CONST("IncludeWSCinProbeReq"); @@ -820,7 +817,7 @@ static void assignRegValue(TI_UINT32* lValue, PNDIS_CONFIGURATION_PARAMETER ndis static void parse_filter_request(TRxDataFilterRequest* request, TI_UINT8 offset, char * mask, TI_UINT8 maskLength, char * pattern, TI_UINT8 patternLength); -void regReadIntegerParameter ( +static void regReadIntegerParameter ( TWlanDrvIfObjPtr pAdapter, PNDIS_STRING pParameterName, TI_UINT32 defaultValue, @@ -913,7 +910,7 @@ static TI_UINT32 tiwlnstrtoi_hex (TI_UINT8 *num, TI_UINT32 length) break; } } - + return value; } @@ -923,8 +920,8 @@ Routine Name: regConvertStringtoMACAddress -Routine Description: Converts the MAC Adrress in a form of string readen from the Registry -to the MAC Address Array to be stored in the init_table struct +Routine Description: Converts the MAC Adrress in a form of string readen from the Registry +to the MAC Address Array to be stored in the init_table struct Arguments: @@ -935,29 +932,35 @@ Return Value: None -----------------------------------------------------------------------------*/ -static void regConvertStringtoMACAddress(TI_UINT8 *staMACAddressString,TI_UINT8 *MacAddressArray) +static void regConvertStringtoMACAddress(TI_UINT8 *staMACAddressString, TI_UINT8 *MacAddressArray) { char *ptr; TI_UINT8 *tmpMacAddr; - TI_UINT8 value=0,value_l,value_h,add_value; + TI_UINT8 value = 0, value_l, value_h, add_value; int i, str_len; /* Take the pointer to the string MAC Address to convert it to the Array MAC Address */ - ptr=(char *)staMACAddressString; + ptr = (char *)staMACAddressString; tmpMacAddr = MacAddressArray; - str_len = 3 * MAC_ADDR_LEN - 1; /* Each value includes two digits and a space so multpily by 3 */ + str_len = 3 * MAC_ADDR_LEN - 1; - for (i = 0; i < MAC_ADDR_LEN; ptr++, str_len--) + for(i=0;(i < MAC_ADDR_LEN);ptr++,str_len--) { - /* The value can be "0-9" or from "a-f" */ - value_l = *ptr - '0'; - value_h = *ptr - 'a'; + if (str_len > 0) { + /* The value can be or "0-9" or from "a-f" */ + value_l = (*ptr - '0'); + value_h = (*ptr - 'a'); + } + else { /* last element */ + value_l = value_h = 16; + } + /*PRINTF(DBG_REGISTRY,("value_l [%d] value_h [%d] *ptr %c value %d\n",value_l,value_h,*ptr,value));*/ - if ((str_len > 0) && ((value_l <= 9) || (value_h <= 15 ))) + if( (value_l <= 9) || (value_h <= 15 ) ) { /* We are in an expected range */ /* Check if 0-9 */ - if (value_l <= 9) + if(value_l <= 9 ) { add_value = value_l; } @@ -967,7 +970,7 @@ static void regConvertStringtoMACAddress(TI_UINT8 *staMACAddressString,TI_UINT8 /* 'a' is in fact 10 decimal in hexa */ add_value = value_h + 10; } - value = value * 16 + add_value; + value = value * 16 + add_value; } else { @@ -979,7 +982,6 @@ static void regConvertStringtoMACAddress(TI_UINT8 *staMACAddressString,TI_UINT8 } - /*----------------------------------------------------------------------------- Routine Name: @@ -1003,87 +1005,66 @@ regFillInitTable( void* pInitTable ) { - TI_UINT8 bssidBroadcast[MAC_ADDR_LEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - char dummySsidString[MAX_SSID_LEN]; - - TI_UINT8 *ClsfrIp = "0a 03 01 c9"; - TI_UINT8 ClsfrIpString[16]; - TI_UINT8 ClsfrIpStringSize; - - /* EEPROM-less : MAC address */ - TI_UINT8 regMACstrLen = REG_MAC_ADDR_STR_LEN; - TI_UINT8 staMACAddress[REG_MAC_ADDR_STR_LEN]; - TI_UINT8 defStaMacAddress0[]= "00 22 11 33 44 55"; - TI_UINT8 defStaMacAddress1[]= "11 11 12 13 14 15"; - TI_UINT8 defStaMacAddress2[]= "12 21 22 23 24 25"; - TI_UINT8 defStaMacAddress3[]= "13 31 32 33 34 35"; - TI_UINT8 defStaMacAddress4[]= "14 41 42 43 44 45"; - TI_UINT8 defStaMacAddress5[]= "15 51 52 53 54 55"; - TI_UINT8 defStaMacAddress6[]= "16 61 62 63 64 65"; - TI_UINT8 defStaMacAddress7[]= "17 71 72 73 74 75"; - - - TI_UINT8 regArpIpStrLen = REG_ARP_IP_ADDR_STR_LEN ; - TI_UINT8 staArpIpAddress[REG_ARP_IP_ADDR_STR_LEN]; - TI_UINT8 defArpIpAddress[] = "0a 00 00 0a" ; /*value by default*/ + static TI_UINT8 *ClsfrIp = "0a 03 01 c9"; + static TI_UINT8 ClsfrIpString[16]; + static TI_UINT8 ClsfrIpStringSize; + + /* EEPROM-less : MAC address */ + static TI_UINT8 regMACstrLen = REG_MAC_ADDR_STR_LEN; + static TI_UINT8 staMACAddress[REG_MAC_ADDR_STR_LEN]; + static TI_UINT8 defStaMacAddress0[]= "00 22 11 33 44 55"; + static TI_UINT8 regArpIpStrLen = REG_ARP_IP_ADDR_STR_LEN; + static TI_UINT8 staArpIpAddress[REG_ARP_IP_ADDR_STR_LEN]; + static TI_UINT8 defArpIpAddress[] = "0a 00 00 0a" ; /*value by default*/ /*defaults values for beacon IE table*/ /*TI_UINT8 defBeaconIETableSize = 0 ;*/ - TI_UINT8 defBeaconIETable[] = "00 01 01 01 32 01 2a 01 03 01 06 01 07 01 20 01 25 01 23 01 30 01 28 01 2e 01 3d 01 85 01 dd 01 00 52 f2 02 00 01"; + static TI_UINT8 defBeaconIETable[] = "00 01 01 01 32 01 2a 01 03 01 06 01 07 01 20 01 25 01 23 01 30 01 28 01 2e 01 3d 01 85 01 dd 01 00 52 f2 02 00 01"; /*TI_UINT8 tmpIeTable[BEACON_FILTER_TABLE_MAX_SIZE] ;*/ - TI_UINT8 staBeaconFilterIETable[BEACON_FILTER_STRING_MAX_LEN] ; - TI_UINT8 tmpIeTableSize = 37; - TI_UINT8 strSize = 113; - - TI_UINT8 defRxRssiAndProcessCompensation_2_4G[] = "ec,f6,00,0c,18,f8,fc,00,08,10,f0,f8,00,0a,14"; - TI_UINT8 tmpRssiTableSize = RSSI_AND_PROCESS_COMPENSATION_TABLE_SIZE; - TI_UINT8 staRssiAndProcessCompensation[RSSI_AND_PROCESS_COMPENSATION_TABLE_SIZE] ; - TI_UINT8 RssiSize = 113; + static TI_UINT8 tmpIeTableSize = 37; + static TI_UINT8 strSize = 113; + static TI_UINT8 defRxRssiAndProcessCompensation_2_4G[] = "ec,f6,00,0c,18,f8,fc,00,08,10,f0,f8,00,0a,14"; + static TI_UINT8 tmpRssiTableSize = RSSI_AND_PROCESS_COMPENSATION_TABLE_SIZE; + static TI_UINT8 staRssiAndProcessCompensation[RSSI_AND_PROCESS_COMPENSATION_TABLE_SIZE] ; + static TI_UINT8 RssiSize = 44; /* defaults values for CoexActivity table*/ /* example: WLAN(0), BT_VOICE(0), defPrio(20), raisePrio(25), minServ(0), maxServ(1ms) */ - TI_UINT8 defCoexActivityTable[] = ""; /* Sample "01 00 14 19 0000 0001 " */ - TI_UINT8 strCoexActivityTable[COEX_ACTIVITY_TABLE_MAX_NUM*COEX_ACTIVITY_TABLE_SIZE] ; - TI_UINT8 strCoexActivitySize = 0; - - TI_UINT32 filterOffset = 0; - char filterMask[16]; - TI_UINT8 filterMaskLength; - char filterPattern[16]; - TI_UINT8 filterPatternLength; - - TInitTable* p = (TInitTable*) pInitTable; - USHORT tableLen = 0; - USHORT loopIndex = 0; - TI_UINT8 ScanControlTable24Tmp[2 * NUM_OF_CHANNELS_24]; - TI_UINT8 ScanControlTable5Tmp[2 * NUM_OF_CHANNELS_5]; - TI_UINT8 ScanControlTable24Def[2* NUM_OF_CHANNELS_24] = "FFFFFFFFFFFFFFFFFFFFFFFFFFFF"; - TI_UINT8 ScanControlTable5Def[2 * NUM_OF_CHANNELS_5] = "FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000000000000000000000000000000000000000000000000000000000000000000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000000000000000FF000000FF000000FF000000FF000000FF000000000000000000000000000000"; - TI_UINT8 reportSeverityTableDefaults[REPORT_SEVERITY_MAX] = "0001101"; - TI_UINT8 reportModuleTableDefaults[REPORT_FILES_NUM]; - TI_UINT16 reportSeverityTableLen; - TI_UINT16 reportModuleTableLen; - - TI_UINT8 uSmeTempList[ 255 ]; - TI_UINT32 uSmeScanIntervalsTempList[ 255 ]; - TI_UINT32 uTempEntriesCount, uSmeGChannelsCount, uIndex; - TI_UINT32 uWiFiMode = 0; - TI_INT8 SRConfigParams[MAX_SMART_REFLEX_PARAM]; - TI_UINT32 len,TempSRCnt; - TI_UINT8 uTempRatePolicyList[RATE_MNG_MAX_RETRY_POLICY_PARAMS_LEN]; - TI_UINT32 uTempRatePolicyCnt=0; - - int macIndex ; /*used for group address filtering*/ + static TI_UINT8 defCoexActivityTable[] = ""; /* Sample "01 00 14 19 0000 0001 " */ + + static TI_UINT32 filterOffset = 0; + static char filterMask[16]; + static TI_UINT8 filterMaskLength; + static char filterPattern[16]; + static TI_UINT8 filterPatternLength; + + static USHORT tableLen = 0; + static USHORT loopIndex = 0; + static TI_UINT8 ScanControlTable24Tmp[2 * NUM_OF_CHANNELS_24]; + static TI_UINT8 ScanControlTable5Tmp[2 * NUM_OF_CHANNELS_5]; + static TI_UINT8 ScanControlTable24Def[2* NUM_OF_CHANNELS_24] = "FFFFFFFFFFFFFFFFFFFFFFFFFFFF"; + static TI_UINT8 ScanControlTable5Def[2 * NUM_OF_CHANNELS_5] = "FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000000000000000000000000000000000000000000000000000000000000000000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000000000000000FF000000FF000000FF000000FF000000FF000000000000000000000000000000"; + static TI_UINT8 reportSeverityTableDefaults[REPORT_SEVERITY_MAX+1] = "00001101"; + static TI_UINT16 reportSeverityTableLen; + + static TI_UINT32 uWiFiMode = 0; + static TI_INT8 SRConfigParams[14]; + static TI_UINT8 len,TempSRCnt; + static TI_UINT8 uTempRatePolicyList[RATE_MNG_MAX_RETRY_POLICY_PARAMS_LEN]; + static TI_UINT32 uTempRatePolicyCnt=0; + + TInitTable *p = (TInitTable *)pInitTable; + TI_UINT32 uTempEntriesCount, uIndex; PRINT(DBG_REGISTRY_LOUD, "TIWL: Reading InitTable parameters\n"); - - /*set all report modules.as default*/ - memset(reportModuleTableDefaults, '1', REPORT_FILES_NUM ); - + + if (!p) + return; + /* Reset structure */ NdisZeroMemory(p, sizeof(TInitTable)); - + regReadIntegerParameter(pAdapter, &STRincludeWSCinProbeReq, WSC_INCLUDE_IN_BEACON_DEF,WSC_INCLUDE_IN_BEACON_MIN,WSC_INCLUDE_IN_BEACON_MAX, sizeof p->siteMgrInitParams.includeWSCinProbeReq, @@ -1093,12 +1074,12 @@ regFillInitTable( /*is the desired state ENABLED ?*/ regReadIntegerParameter(pAdapter, &STRBeaconFilterDesiredState, DEF_BEACON_FILTER_ENABLE_VALUE, MIN_BEACON_FILTER_ENABLE_VALUE, MAX_BEACON_FILTER_ENABLE_VALUE, - sizeof p->siteMgrInitParams.beaconFilterParams.desiredState, + sizeof p->siteMgrInitParams.beaconFilterParams.desiredState, (TI_UINT8*)&p->siteMgrInitParams.beaconFilterParams.desiredState ); - + regReadIntegerParameter(pAdapter, &STRBeaconFilterStored, DEF_NUM_STORED_FILTERS, MIN_NUM_STORED_FILTERS, MAX_NUM_STORED_FILTERS, - sizeof p->siteMgrInitParams.beaconFilterParams.numOfStored, + sizeof p->siteMgrInitParams.beaconFilterParams.numOfStored, (TI_UINT8*)&p->siteMgrInitParams.beaconFilterParams.numOfStored ); /*Read the beacon filter IE table*/ @@ -1106,145 +1087,156 @@ regFillInitTable( regReadIntegerParameter(pAdapter, &STRBeaconIETableSize, BEACON_FILTER_IE_TABLE_DEF_SIZE, BEACON_FILTER_IE_TABLE_MIN_SIZE, BEACON_FILTER_IE_TABLE_MAX_SIZE, - sizeof p->siteMgrInitParams.beaconFilterParams.IETableSize, + sizeof p->siteMgrInitParams.beaconFilterParams.IETableSize, (TI_UINT8*)(&p->siteMgrInitParams.beaconFilterParams.IETableSize) ); - + tmpIeTableSize = p->siteMgrInitParams.beaconFilterParams.IETableSize; - + /*Read the number of elements in the table ( this is because 221 has 5 values following it )*/ regReadIntegerParameter(pAdapter, &STRBeaconIETableNumOfElem, DEF_BEACON_FILTER_IE_TABLE_NUM, BEACON_FILTER_IE_TABLE_MIN_NUM, BEACON_FILTER_IE_TABLE_MAX_NUM, - sizeof p->siteMgrInitParams.beaconFilterParams.numOfElements, + sizeof p->siteMgrInitParams.beaconFilterParams.numOfElements, (TI_UINT8*)(&p->siteMgrInitParams.beaconFilterParams.numOfElements) ); /*printk("\n OsRgstr tmpIeTableSize = %d numOfElems = %d" , tmpIeTableSize , p->siteMgrInitParams.beaconFilterParams.numOfElements) ;*/ strSize = 3 * tmpIeTableSize - 1 ; /*includes spaces between bytes*/ if ( ( tmpIeTableSize > 0 ) && ( tmpIeTableSize <= BEACON_FILTER_IE_TABLE_MAX_SIZE) ) { - - regReadStringParameter(pAdapter, &STRBeaconIETable , + TI_UINT8 *staBeaconFilterIETable; + + staBeaconFilterIETable = os_memoryAlloc(pAdapter, BEACON_FILTER_STRING_MAX_LEN); + if (staBeaconFilterIETable) { + regReadStringParameter(pAdapter, &STRBeaconIETable , (TI_INT8*)(defBeaconIETable), strSize, (TI_UINT8*)staBeaconFilterIETable, &strSize); - regConvertStringtoBeaconIETable(staBeaconFilterIETable , (TI_UINT8*)&p->siteMgrInitParams.beaconFilterParams.IETable[0]/*(TI_UINT8*)&(tmpIeTable[0] )*/ , tmpIeTableSize); + regConvertStringtoBeaconIETable(staBeaconFilterIETable, (TI_UINT8*)&p->siteMgrInitParams.beaconFilterParams.IETable[0]/*(TI_UINT8*)&(tmpIeTable[0] )*/, tmpIeTableSize); + os_memoryFree(pAdapter, staBeaconFilterIETable, BEACON_FILTER_STRING_MAX_LEN); + } } /* MAC ADDRESSES FILTER*/ regReadIntegerParameter(pAdapter, &STRFilterEnabled, DEF_FILTER_ENABLE_VALUE, MIN_FILTER_ENABLE_VALUE, MAX_FILTER_ENABLE_VALUE, - sizeof p->twdInitParams.tMacAddrFilter.isFilterEnabled, + sizeof p->twdInitParams.tMacAddrFilter.isFilterEnabled, (TI_UINT8*) &p->twdInitParams.tMacAddrFilter.isFilterEnabled); regReadIntegerParameter(pAdapter, &STRnumGroupAddrs, NUM_GROUP_ADDRESS_VALUE_DEF, NUM_GROUP_ADDRESS_VALUE_MIN, NUM_GROUP_ADDRESS_VALUE_MAX, - sizeof p->twdInitParams.tMacAddrFilter.numOfMacAddresses, + sizeof p->twdInitParams.tMacAddrFilter.numOfMacAddresses, (TI_UINT8*) &p->twdInitParams.tMacAddrFilter.numOfMacAddresses); - - /*printk("\nOsRgstry Num Of Group Addr:%d \n" , p->twdInitParams.tMacAddrFilter.numOfMacAddresses) ;*/ - macIndex = p->twdInitParams.tMacAddrFilter.numOfMacAddresses -1 ; - switch( macIndex ) + /*printk("\nOsRgstry Num Of Group Addr:%d \n" , p->twdInitParams.tMacAddrFilter.numOfMacAddresses) ;*/ { - case 7: + TI_UINT8 defStaMacAddress1[]= "11 11 12 13 14 15"; + TI_UINT8 defStaMacAddress2[]= "12 21 22 23 24 25"; + TI_UINT8 defStaMacAddress3[]= "13 31 32 33 34 35"; + TI_UINT8 defStaMacAddress4[]= "14 41 42 43 44 45"; + TI_UINT8 defStaMacAddress5[]= "15 51 52 53 54 55"; + TI_UINT8 defStaMacAddress6[]= "16 61 62 63 64 65"; + TI_UINT8 defStaMacAddress7[]= "17 71 72 73 74 75"; + int macIndex ; /*used for group address filtering*/ + + macIndex = p->twdInitParams.tMacAddrFilter.numOfMacAddresses - 1; + switch( macIndex ) { + case 7: + { - regReadStringParameter(pAdapter, &STRGroup_addr7, - (TI_INT8*)(defStaMacAddress7), REG_MAC_ADDR_STR_LEN, - (TI_UINT8*)staMACAddress, ®MACstrLen); - - regConvertStringtoMACAddress(staMACAddress,(TI_UINT8*) &p->twdInitParams.tMacAddrFilter.macAddrTable[7]); - --macIndex; - } + regReadStringParameter(pAdapter, &STRGroup_addr7, + (TI_INT8*)(defStaMacAddress7), REG_MAC_ADDR_STR_LEN, + (TI_UINT8*)staMACAddress, ®MACstrLen); - case 6: - { + regConvertStringtoMACAddress(staMACAddress,(TI_UINT8*) &p->twdInitParams.tMacAddrFilter.macAddrTable[7]); + --macIndex; + } - regReadStringParameter(pAdapter, &STRGroup_addr6, - (TI_INT8*)(defStaMacAddress6), REG_MAC_ADDR_STR_LEN, - (TI_UINT8*)staMACAddress, ®MACstrLen); + case 6: + { - regConvertStringtoMACAddress(staMACAddress,(TI_UINT8*) &p->twdInitParams.tMacAddrFilter.macAddrTable[6]); - --macIndex; - } + regReadStringParameter(pAdapter, &STRGroup_addr6, + (TI_INT8*)(defStaMacAddress6), REG_MAC_ADDR_STR_LEN, + (TI_UINT8*)staMACAddress, ®MACstrLen); - case 5: - { + regConvertStringtoMACAddress(staMACAddress,(TI_UINT8*) &p->twdInitParams.tMacAddrFilter.macAddrTable[6]); + --macIndex; + } - regReadStringParameter(pAdapter, &STRGroup_addr5, - (TI_INT8*)(defStaMacAddress5), REG_MAC_ADDR_STR_LEN, - (TI_UINT8*)staMACAddress, ®MACstrLen); + case 5: + { - regConvertStringtoMACAddress(staMACAddress,(TI_UINT8*) &p->twdInitParams.tMacAddrFilter.macAddrTable[5]); - --macIndex; - } + regReadStringParameter(pAdapter, &STRGroup_addr5, + (TI_INT8*)(defStaMacAddress5), REG_MAC_ADDR_STR_LEN, + (TI_UINT8*)staMACAddress, ®MACstrLen); - case 4: - { + regConvertStringtoMACAddress(staMACAddress,(TI_UINT8*) &p->twdInitParams.tMacAddrFilter.macAddrTable[5]); + --macIndex; + } - regReadStringParameter(pAdapter, &STRGroup_addr4, - (TI_INT8*)(defStaMacAddress4), REG_MAC_ADDR_STR_LEN, - (TI_UINT8*)staMACAddress, ®MACstrLen); + case 4: + { - regConvertStringtoMACAddress(staMACAddress,(TI_UINT8*) &p->twdInitParams.tMacAddrFilter.macAddrTable[4]); - --macIndex; - } + regReadStringParameter(pAdapter, &STRGroup_addr4, + (TI_INT8*)(defStaMacAddress4), REG_MAC_ADDR_STR_LEN, + (TI_UINT8*)staMACAddress, ®MACstrLen); - case 3: - { + regConvertStringtoMACAddress(staMACAddress,(TI_UINT8*) &p->twdInitParams.tMacAddrFilter.macAddrTable[4]); + --macIndex; + } - regReadStringParameter(pAdapter, &STRGroup_addr3, - (TI_INT8*)(defStaMacAddress3), REG_MAC_ADDR_STR_LEN, - (TI_UINT8*)staMACAddress, ®MACstrLen); + case 3: + { - regConvertStringtoMACAddress(staMACAddress, (TI_UINT8*)&p->twdInitParams.tMacAddrFilter.macAddrTable[3]); - --macIndex; - } + regReadStringParameter(pAdapter, &STRGroup_addr3, + (TI_INT8*)(defStaMacAddress3), REG_MAC_ADDR_STR_LEN, + (TI_UINT8*)staMACAddress, ®MACstrLen); - case 2: - { + regConvertStringtoMACAddress(staMACAddress, (TI_UINT8*)&p->twdInitParams.tMacAddrFilter.macAddrTable[3]); + --macIndex; + } - regReadStringParameter(pAdapter, &STRGroup_addr2, - (TI_INT8*)(defStaMacAddress2), REG_MAC_ADDR_STR_LEN, - (TI_UINT8*)staMACAddress, ®MACstrLen); + case 2: + { - regConvertStringtoMACAddress(staMACAddress,(TI_UINT8*) &p->twdInitParams.tMacAddrFilter.macAddrTable[2]); - --macIndex; - } + regReadStringParameter(pAdapter, &STRGroup_addr2, + (TI_INT8*)(defStaMacAddress2), REG_MAC_ADDR_STR_LEN, + (TI_UINT8*)staMACAddress, ®MACstrLen); - case 1: - { + regConvertStringtoMACAddress(staMACAddress,(TI_UINT8*) &p->twdInitParams.tMacAddrFilter.macAddrTable[2]); + --macIndex; + } - regReadStringParameter(pAdapter, &STRGroup_addr1, - (TI_INT8*)(defStaMacAddress1), REG_MAC_ADDR_STR_LEN, - (TI_UINT8*)staMACAddress, ®MACstrLen); + case 1: + { - regConvertStringtoMACAddress(staMACAddress,(TI_UINT8*) &p->twdInitParams.tMacAddrFilter.macAddrTable[1]); - --macIndex; - } + regReadStringParameter(pAdapter, &STRGroup_addr1, + (TI_INT8*)(defStaMacAddress1), REG_MAC_ADDR_STR_LEN, + (TI_UINT8*)staMACAddress, ®MACstrLen); - - case 0: - { + regConvertStringtoMACAddress(staMACAddress,(TI_UINT8*) &p->twdInitParams.tMacAddrFilter.macAddrTable[1]); + --macIndex; + } - regReadStringParameter(pAdapter, &STRGroup_addr0, - (TI_INT8*)(defStaMacAddress0), REG_MAC_ADDR_STR_LEN, - (TI_UINT8*)staMACAddress, ®MACstrLen); + case 0: + { - regConvertStringtoMACAddress(staMACAddress,(TI_UINT8*) &p->twdInitParams.tMacAddrFilter.macAddrTable[0]); + regReadStringParameter(pAdapter, &STRGroup_addr0, + (TI_INT8*)(defStaMacAddress0), REG_MAC_ADDR_STR_LEN, + (TI_UINT8*)staMACAddress, ®MACstrLen); - - } + regConvertStringtoMACAddress(staMACAddress,(TI_UINT8*) &p->twdInitParams.tMacAddrFilter.macAddrTable[0]); + } - default: - { + default: + { + } } } - /************************/ /* Read severity table */ /**********************/ @@ -1259,37 +1251,40 @@ regFillInitTable( /***********************/ /* Read modules table */ /*********************/ - - regReadStringParameter(pAdapter, &STR_ReportModuleTable, - (TI_INT8*)reportModuleTableDefaults, - (TI_UINT8)REPORT_FILES_NUM, - (TI_UINT8*)p->tReport.aFileEnable, - (TI_UINT8*)&reportModuleTableLen); - - - /* - Default SSID should be non-Valid SSID, hence the STA will not try to connect - */ - for(loopIndex = 0; loopIndex < MAX_SSID_LEN; loopIndex++) - dummySsidString[loopIndex] = (loopIndex+1); - - + { + TI_UINT8 *reportModuleTableDefaults; + TI_UINT16 reportModuleTableLen; + + reportModuleTableDefaults = os_memoryAlloc(pAdapter, REPORT_FILES_NUM); + if (!reportModuleTableDefaults) + return; + + /*set all report modules.as default*/ + memset(reportModuleTableDefaults, '1', REPORT_FILES_NUM ); + + regReadStringParameter(pAdapter, &STR_ReportModuleTable, + (TI_INT8*)reportModuleTableDefaults, + (TI_UINT8)REPORT_FILES_NUM, + (TI_UINT8*)p->tReport.aFileEnable, + (TI_UINT8*)&reportModuleTableLen); + os_memoryFree(pAdapter, reportModuleTableDefaults, REPORT_FILES_NUM); + } /* rate Policy Params */ regReadIntegerParameter(pAdapter, &STRRatePolicyUserShortRetryLimit, - CTRL_DATA_RATE_POLICY_USER_SHORT_RETRY_LIMIT_DEF, + CTRL_DATA_RATE_POLICY_USER_SHORT_RETRY_LIMIT_DEF, CTRL_DATA_RATE_POLICY_USER_SHORT_RETRY_LIMIT_MIN, CTRL_DATA_RATE_POLICY_USER_SHORT_RETRY_LIMIT_MAX, - sizeof p->ctrlDataInitParams.ctrlDataTxRatePolicy.shortRetryLimit, + sizeof p->ctrlDataInitParams.ctrlDataTxRatePolicy.shortRetryLimit, (TI_UINT8*)&p->ctrlDataInitParams.ctrlDataTxRatePolicy.shortRetryLimit); regReadIntegerParameter(pAdapter, &STRRatePolicyUserLongRetryLimit, CTRL_DATA_RATE_POLICY_USER_LONG_RETRY_LIMIT_DEF, CTRL_DATA_RATE_POLICY_USER_LONG_RETRY_LIMIT_MIN, CTRL_DATA_RATE_POLICY_USER_LONG_RETRY_LIMIT_MAX, - sizeof p->ctrlDataInitParams.ctrlDataTxRatePolicy.longRetryLimit, + sizeof p->ctrlDataInitParams.ctrlDataTxRatePolicy.longRetryLimit, (TI_UINT8*)&p->ctrlDataInitParams.ctrlDataTxRatePolicy.longRetryLimit); - regReadIntegerParameterHex (pAdapter, &STRRatePolicyUserEnabledRatesMaskCck, + regReadIntegerParameterHex (pAdapter, &STRRatePolicyUserEnabledRatesMaskCck, CTRL_DATA_RATE_POLICY_USER_EN_DIS_MASK_CCK_DEF, CTRL_DATA_RATE_POLICY_USER_EN_DIS_MASK_MIN, CTRL_DATA_RATE_POLICY_USER_EN_DIS_MASK_MAX, @@ -1347,23 +1342,23 @@ regFillInitTable( 80, 0, 255, sizeof p->twdInitParams.tGeneral.halCtrlArmClock, (TI_UINT8*)&p->twdInitParams.tGeneral.halCtrlArmClock); - + regReadIntegerParameter(pAdapter, &STRg80211DraftNumber, DRAFT_6_AND_LATER, DRAFT_5_AND_EARLIER, DRAFT_6_AND_LATER, sizeof p->siteMgrInitParams.siteMgrUseDraftNum, (TI_UINT8*)&p->siteMgrInitParams.siteMgrUseDraftNum); - + regReadIntegerParameter(pAdapter, &STRTraceBufferSize, /*1024, 0, 1024, sizeof(TI_UINT32), */ 16, 16, 16, sizeof p->twdInitParams.tGeneral.TraceBufferSize, (TI_UINT8*)&p->twdInitParams.tGeneral.TraceBufferSize); - + regReadIntegerParameter(pAdapter, &STRPrintTrace, TI_FALSE, TI_FALSE, TI_TRUE, sizeof p->twdInitParams.tGeneral.bDoPrint, (TI_UINT8*)&p->twdInitParams.tGeneral.bDoPrint); - + regReadIntegerParameter(pAdapter, &STRFirmwareDebug, TI_FALSE, TI_FALSE, TI_TRUE, sizeof p->twdInitParams.tGeneral.halCtrlFirmwareDebug, @@ -1515,7 +1510,7 @@ regFillInitTable( TWD_MAX_RX_MSDU_LIFETIME_MAX, sizeof p->twdInitParams.tGeneral.halCtrlMaxRxMsduLifetime, (TI_UINT8*)&p->twdInitParams.tGeneral.halCtrlMaxRxMsduLifetime); - + regReadIntegerParameter(pAdapter, &STRdot11RateFallBackRetryLimit, TWD_RATE_FB_RETRY_LIMIT_DEF, TWD_RATE_FB_RETRY_LIMIT_MIN, TWD_RATE_FB_RETRY_LIMIT_MAX, @@ -1590,26 +1585,40 @@ regFillInitTable( (TI_UINT8*)&p->siteMgrInitParams.siteMgrDesiredChannel); /* NOTE: desired BSSID and SSID (and BSS type, later on) are currently set both to the SME and the site manager!!! */ - MAC_COPY (p->siteMgrInitParams.siteMgrDesiredBSSID, bssidBroadcast); - MAC_COPY (p->tSmeModifiedInitParams.tDesiredBssid, bssidBroadcast); + { + TI_UINT8 bssidBroadcast[MAC_ADDR_LEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - regReadStringParameter(pAdapter, &STRdot11DesiredSSID, - (TI_INT8*)dummySsidString, - (TI_UINT8)MAX_SSID_LEN, - (TI_UINT8*)p->siteMgrInitParams.siteMgrDesiredSSID.str, - (TI_UINT8*)&p->siteMgrInitParams.siteMgrDesiredSSID.len); + MAC_COPY (p->siteMgrInitParams.siteMgrDesiredBSSID, bssidBroadcast); + MAC_COPY (p->tSmeModifiedInitParams.tDesiredBssid, bssidBroadcast); + } - /* in case no SSID desired at the init file set dummy len */ - for(loopIndex = 0; loopIndex < MAX_SSID_LEN; loopIndex++) { - if(dummySsidString[loopIndex] != p->siteMgrInitParams.siteMgrDesiredSSID.str[loopIndex]) - break; - } + static char dummySsidString[MAX_SSID_LEN]; + + /* + Default SSID should be non-Valid SSID, hence the STA will not try to connect + */ + for(loopIndex = 0; loopIndex < MAX_SSID_LEN; loopIndex++) + dummySsidString[loopIndex] = (loopIndex+1); + + regReadStringParameter(pAdapter, &STRdot11DesiredSSID, + (TI_INT8*)dummySsidString, + (TI_UINT8)MAX_SSID_LEN, + (TI_UINT8*)p->siteMgrInitParams.siteMgrDesiredSSID.str, + (TI_UINT8*)&p->siteMgrInitParams.siteMgrDesiredSSID.len); + + /* in case no SSID desired at the init file set dummy len */ + for(loopIndex = 0; loopIndex < MAX_SSID_LEN; loopIndex++) + { + if(dummySsidString[loopIndex] != p->siteMgrInitParams.siteMgrDesiredSSID.str[loopIndex]) + break; + } - p->siteMgrInitParams.siteMgrDesiredSSID.len = (TI_UINT8)loopIndex; + p->siteMgrInitParams.siteMgrDesiredSSID.len = (TI_UINT8)loopIndex; + } NdisMoveMemory(&p->tSmeModifiedInitParams.tDesiredSsid, - &p->siteMgrInitParams.siteMgrDesiredSSID, + &p->siteMgrInitParams.siteMgrDesiredSSID, sizeof(TSsid)); regReadIntegerParameter(pAdapter, &STRdot11DesiredNetworkType, @@ -1639,9 +1648,8 @@ regFillInitTable( p->siteMgrInitParams.siteMgrDesiredChannel = SITE_MGR_CHANNEL_A_MIN; } - if(1) { - TI_UINT32 Freq2ChannelTable[] = {0,2412000,2417000,2422000,2427000,2432000,2437000, + static TI_UINT32 Freq2ChannelTable[] = {0,2412000,2417000,2422000,2427000,2432000,2437000, 2442000,2447000,2452000,2457000, 2462000,2467000,2472000,2484000}; @@ -1862,12 +1870,12 @@ regFillInitTable( (TI_UINT8*)&p->tSmeModifiedInitParams.eConnectMode); { - /* due to the fact that two following init keys has negative values, we read them as table */ + /* due to the fact that two following init keys has negative values, we read them as table */ TI_UINT32 uEntriesNumber = 1; regReadIntegerTable(pAdapter ,&STRSmeScanRssiThreshold, SME_SCAN_RSSI_THRESHOLD_DEF, sizeof(TI_INT8) * 3, - (TI_UINT8*)&p->tSmeInitParams.iRssiThreshold, NULL, &uEntriesNumber, + (TI_UINT8*)&p->tSmeInitParams.iRssiThreshold, NULL, &uEntriesNumber, sizeof(TI_INT8),TI_FALSE); if ( (p->tSmeInitParams.iRssiThreshold < SME_SCAN_RSSI_THRESHOLD_MIN) || @@ -1879,7 +1887,7 @@ regFillInitTable( regReadIntegerTable(pAdapter ,&STRSmeScanSnrThreshold, SME_SCAN_SNR_THRESHOLD_DEF, sizeof(TI_INT8), (TI_UINT8*)&p->tSmeInitParams.iSnrThreshold, NULL, &uEntriesNumber, sizeof(TI_INT8),TI_FALSE); - + if ( (p->tSmeInitParams.iSnrThreshold < SME_SCAN_SNR_THRESHOLD_MIN) || (p->tSmeInitParams.iSnrThreshold > SME_SCAN_SNR_THRESHOLD_MAX)) { @@ -1908,59 +1916,79 @@ regFillInitTable( SME_SCAN_PROBE_REQ_DEF, SME_SCAN_PROBE_REQ_MIN, SME_SCAN_PROBE_REQ_MAX, sizeof p->tSmeInitParams.uProbeReqNum, (TI_UINT8*)&p->tSmeInitParams.uProbeReqNum); - regReadIntegerTable(pAdapter, &STRSmeScanIntervals, SME_SCAN_INTERVALS_LIST_VAL_DEF, + + { + TI_UINT32 *uSmeScanIntervalsTempList; + + uSmeScanIntervalsTempList = os_memoryAlloc(pAdapter, SME_SCAN_INTERVALS_LIST_STRING_MAX_SIZE * sizeof(TI_UINT32)); + if (!uSmeScanIntervalsTempList) { + return; + } + regReadIntegerTable(pAdapter, &STRSmeScanIntervals, SME_SCAN_INTERVALS_LIST_VAL_DEF, SME_SCAN_INTERVALS_LIST_STRING_MAX_SIZE, - (TI_UINT8*)&uSmeScanIntervalsTempList, NULL, &uTempEntriesCount, + (TI_UINT8 *)uSmeScanIntervalsTempList, NULL, &uTempEntriesCount, sizeof (TI_UINT32),TI_FALSE); - /* sanity check */ - if (uTempEntriesCount > PERIODIC_SCAN_MAX_INTERVAL_NUM) - { - uTempEntriesCount = PERIODIC_SCAN_MAX_INTERVAL_NUM; + /* sanity check */ + if (uTempEntriesCount > PERIODIC_SCAN_MAX_INTERVAL_NUM) + { + uTempEntriesCount = PERIODIC_SCAN_MAX_INTERVAL_NUM; + } + /* convert from TI_UINT8 to TI_UINT32 */ + for (uIndex = 0; uIndex < uTempEntriesCount; uIndex++) + { + p->tSmeInitParams.uScanIntervals[ uIndex ] = uSmeScanIntervalsTempList[ uIndex ]; + } + os_memoryFree(pAdapter, uSmeScanIntervalsTempList, SME_SCAN_INTERVALS_LIST_STRING_MAX_SIZE * sizeof(TI_UINT32)); } - /* convert from TI_UINT8 to TI_UINT32 */ - for (uIndex = 0; uIndex < uTempEntriesCount; uIndex++) { - p->tSmeInitParams.uScanIntervals[ uIndex ] = uSmeScanIntervalsTempList[ uIndex ]; - } - regReadIntegerTable(pAdapter, &STRSmeScanGChannels, SME_SCAN_CHANNELS_LIST_G_VAL_DEF, - SME_SCAN_CHANNELS_LIST_G_STRING_MAX_SIZE, - (TI_UINT8*)&uSmeTempList, NULL, &uTempEntriesCount, - sizeof (TI_UINT8),TI_FALSE); + TI_UINT8 *uSmeTempList; + TI_UINT32 uSmeGChannelsCount; + uSmeTempList = os_memoryAlloc(pAdapter, SME_SCAN_CHANNELS_LIST_G_STRING_MAX_SIZE); + if (!uSmeTempList) { + return; + } + regReadIntegerTable(pAdapter, &STRSmeScanGChannels, SME_SCAN_CHANNELS_LIST_G_VAL_DEF, + SME_SCAN_CHANNELS_LIST_G_STRING_MAX_SIZE, + (TI_UINT8 *)uSmeTempList, NULL, &uTempEntriesCount, + sizeof (TI_UINT8),TI_FALSE); - /* convert to channel list */ - for (uIndex = 0; uIndex < uTempEntriesCount; uIndex++) - { - p->tSmeInitParams.tChannelList[ uIndex ].eBand = RADIO_BAND_2_4_GHZ; - p->tSmeInitParams.tChannelList[ uIndex ].uChannel = uSmeTempList[ uIndex ]; + + /* convert to channel list */ + for (uIndex = 0; uIndex < uTempEntriesCount; uIndex++) + { + p->tSmeInitParams.tChannelList[ uIndex ].eBand = RADIO_BAND_2_4_GHZ; + p->tSmeInitParams.tChannelList[ uIndex ].uChannel = uSmeTempList[ uIndex ]; + } + uSmeGChannelsCount = uTempEntriesCount; + + /* + * Add A_MODE channels to scan list only if it enabled + * NOTE: Don't use empty channel list string + */ + if ((p->siteMgrInitParams.siteMgrDesiredDot11Mode == DOT11_A_MODE) || + (p->siteMgrInitParams.siteMgrDesiredDot11Mode == DOT11_DUAL_MODE)) + { + regReadIntegerTable(pAdapter, &STRSmeScanAChannels, SME_SCAN_CHANNELS_LIST_A_VAL_DEF, + SME_SCAN_CHANNELS_LIST_A_STRING_MAX_SIZE, + (TI_UINT8*)&uSmeTempList, NULL, &uTempEntriesCount, + sizeof (TI_UINT8),TI_FALSE); + + /* convert to channel list */ + for (uIndex = 0; uIndex < uTempEntriesCount; uIndex++) + { + p->tSmeInitParams.tChannelList[ uSmeGChannelsCount + uIndex ].eBand = RADIO_BAND_5_0_GHZ; + p->tSmeInitParams.tChannelList[ uSmeGChannelsCount + uIndex ].uChannel = uSmeTempList[ uIndex ]; + } + + p->tSmeInitParams.uChannelNum = uSmeGChannelsCount + uIndex; + } + else + { + p->tSmeInitParams.uChannelNum = uSmeGChannelsCount; + } + os_memoryFree(pAdapter, uSmeTempList, SME_SCAN_CHANNELS_LIST_G_STRING_MAX_SIZE); } - uSmeGChannelsCount = uTempEntriesCount; - - /* - * Add A_MODE channels to scan list only if it enabled - * NOTE: Don't use empty channel list string - */ - if ((p->siteMgrInitParams.siteMgrDesiredDot11Mode == DOT11_A_MODE) || - (p->siteMgrInitParams.siteMgrDesiredDot11Mode == DOT11_DUAL_MODE)) - { - regReadIntegerTable(pAdapter, &STRSmeScanAChannels, SME_SCAN_CHANNELS_LIST_A_VAL_DEF, - SME_SCAN_CHANNELS_LIST_A_STRING_MAX_SIZE, - (TI_UINT8*)&uSmeTempList, NULL, &uTempEntriesCount, - sizeof (TI_UINT8),TI_FALSE); - - /* convert to channel list */ - for (uIndex = 0; uIndex < uTempEntriesCount; uIndex++) - { - p->tSmeInitParams.tChannelList[ uSmeGChannelsCount + uIndex ].eBand = RADIO_BAND_5_0_GHZ; - p->tSmeInitParams.tChannelList[ uSmeGChannelsCount + uIndex ].uChannel = uSmeTempList[ uIndex ]; - } - - p->tSmeInitParams.uChannelNum = uSmeGChannelsCount + uIndex; - } - else - { - p->tSmeInitParams.uChannelNum = uSmeGChannelsCount; - } regReadIntegerParameter(pAdapter, &STRdot11AuthenticationMode, RSN_AUTH_SUITE_DEF, RSN_AUTH_SUITE_MIN, RSN_AUTH_SUITE_MAX, @@ -1968,13 +1996,13 @@ regFillInitTable( (TI_UINT8*)&p->rsnInitParams.authSuite); /* Soft Gemini Section */ - + regReadIntegerParameter(pAdapter, &STRBThWlanCoexistEnable, SOFT_GEMINI_ENABLED_DEF, SOFT_GEMINI_ENABLED_MIN, SOFT_GEMINI_ENABLED_MAX, sizeof p->SoftGeminiInitParams.SoftGeminiEnable, (TI_UINT8*)&p->SoftGeminiInitParams.SoftGeminiEnable); - regReadIntegerParameter(pAdapter, &STRBThWlanCoexistParamsBtLoadRatio, + regReadIntegerParameter(pAdapter, &STRBThWlanCoexistParamsBtLoadRatio, SOFT_GEMINI_PARAMS_LOAD_RATIO_DEF, SOFT_GEMINI_PARAMS_LOAD_RATIO_MIN, SOFT_GEMINI_PARAMS_LOAD_RATIO_MAX, sizeof p->SoftGeminiInitParams.coexParams[SOFT_GEMINI_BT_LOAD_RATIO], (TI_UINT8*)&p->SoftGeminiInitParams.coexParams[SOFT_GEMINI_BT_LOAD_RATIO]); @@ -2073,7 +2101,7 @@ regFillInitTable( - /* EDR section */ + /* EDR section */ regReadIntegerParameter(pAdapter, &STRBThWlanCoexistUpsdAclMasterMinEDR, SOFT_GEMINI_WLAN_PS_BT_ACL_MASTER_MIN_EDR_DEF, SOFT_GEMINI_WLAN_PS_BT_ACL_MASTER_MIN_EDR_MIN, SOFT_GEMINI_WLAN_PS_BT_ACL_MASTER_MIN_EDR_MAX, sizeof p->SoftGeminiInitParams.coexParams[SOFT_GEMINI_WLAN_PS_BT_ACL_MASTER_MIN_EDR], @@ -2205,32 +2233,32 @@ regFillInitTable( regReadIntegerParameter(pAdapter, &STRBThWlanCoexHv3MaxServed, SOFT_GEMINI_HV3_MAX_SERVED_DEF, SOFT_GEMINI_HV3_MAX_SERVED_MIN, SOFT_GEMINI_HV3_MAX_SERVED_MAX, sizeof p->SoftGeminiInitParams.coexParams[SOFT_GEMINI_HV3_MAX_SERVED], - (TI_UINT8*)&p->SoftGeminiInitParams.coexParams[SOFT_GEMINI_HV3_MAX_SERVED]);; - - regReadIntegerParameter(pAdapter, &STRBThWlanCoexTemp1, - SOFT_GEMINI_TEMP_PARAM_1_DEF, SOFT_GEMINI_TEMP_PARAM_1_MIN, SOFT_GEMINI_TEMP_PARAM_1_MAX, - sizeof p->SoftGeminiInitParams.coexParams[SOFT_GEMINI_TEMP_PARAM_1], - (TI_UINT8*)&p->SoftGeminiInitParams.coexParams[SOFT_GEMINI_TEMP_PARAM_1]);; - - regReadIntegerParameter(pAdapter, &STRBThWlanCoexTemp2, - SOFT_GEMINI_TEMP_PARAM_2_DEF, SOFT_GEMINI_TEMP_PARAM_2_MIN, SOFT_GEMINI_TEMP_PARAM_2_MAX, - sizeof p->SoftGeminiInitParams.coexParams[SOFT_GEMINI_TEMP_PARAM_2], - (TI_UINT8*)&p->SoftGeminiInitParams.coexParams[SOFT_GEMINI_TEMP_PARAM_2]);; - - regReadIntegerParameter(pAdapter, &STRBThWlanCoexTemp3, - SOFT_GEMINI_TEMP_PARAM_3_DEF, SOFT_GEMINI_TEMP_PARAM_3_MIN, SOFT_GEMINI_TEMP_PARAM_3_MAX, - sizeof p->SoftGeminiInitParams.coexParams[SOFT_GEMINI_TEMP_PARAM_3], - (TI_UINT8*)&p->SoftGeminiInitParams.coexParams[SOFT_GEMINI_TEMP_PARAM_3]);; - - regReadIntegerParameter(pAdapter, &STRBThWlanCoexTemp4, + (TI_UINT8*)&p->SoftGeminiInitParams.coexParams[SOFT_GEMINI_HV3_MAX_SERVED]); + regReadIntegerParameter(pAdapter, &STRBThWlanCoexTemp1, + SOFT_GEMINI_TEMP_PARAM_1_DEF, SOFT_GEMINI_TEMP_PARAM_1_MIN, SOFT_GEMINI_TEMP_PARAM_1_MAX, + sizeof p->SoftGeminiInitParams.coexParams[SOFT_GEMINI_TEMP_PARAM_1], + (TI_UINT8*)&p->SoftGeminiInitParams.coexParams[SOFT_GEMINI_TEMP_PARAM_1]); + + regReadIntegerParameter(pAdapter, &STRBThWlanCoexTemp2, + SOFT_GEMINI_TEMP_PARAM_2_DEF, SOFT_GEMINI_TEMP_PARAM_2_MIN, SOFT_GEMINI_TEMP_PARAM_2_MAX, + sizeof p->SoftGeminiInitParams.coexParams[SOFT_GEMINI_TEMP_PARAM_2], + (TI_UINT8*)&p->SoftGeminiInitParams.coexParams[SOFT_GEMINI_TEMP_PARAM_2]); + + regReadIntegerParameter(pAdapter, &STRBThWlanCoexTemp3, + SOFT_GEMINI_TEMP_PARAM_3_DEF, SOFT_GEMINI_TEMP_PARAM_3_MIN, SOFT_GEMINI_TEMP_PARAM_3_MAX, + sizeof p->SoftGeminiInitParams.coexParams[SOFT_GEMINI_TEMP_PARAM_3], + (TI_UINT8*)&p->SoftGeminiInitParams.coexParams[SOFT_GEMINI_TEMP_PARAM_3]); + + regReadIntegerParameter(pAdapter, &STRBThWlanCoexTemp4, SOFT_GEMINI_TEMP_PARAM_4_DEF, SOFT_GEMINI_TEMP_PARAM_4_MIN, SOFT_GEMINI_TEMP_PARAM_4_MAX, sizeof p->SoftGeminiInitParams.coexParams[SOFT_GEMINI_TEMP_PARAM_4], - (TI_UINT8*)&p->SoftGeminiInitParams.coexParams[SOFT_GEMINI_TEMP_PARAM_4]);; + (TI_UINT8*)&p->SoftGeminiInitParams.coexParams[SOFT_GEMINI_TEMP_PARAM_4]); - regReadIntegerParameter(pAdapter, &STRBThWlanCoexTemp5, + regReadIntegerParameter(pAdapter, &STRBThWlanCoexTemp5, SOFT_GEMINI_TEMP_PARAM_5_DEF, SOFT_GEMINI_TEMP_PARAM_5_MIN, SOFT_GEMINI_TEMP_PARAM_5_MAX, sizeof p->SoftGeminiInitParams.coexParams[SOFT_GEMINI_TEMP_PARAM_5], - (TI_UINT8*)&p->SoftGeminiInitParams.coexParams[SOFT_GEMINI_TEMP_PARAM_5]);; + (TI_UINT8*)&p->SoftGeminiInitParams.coexParams[SOFT_GEMINI_TEMP_PARAM_5]); + /* * CoexActivity table @@ -2243,14 +2271,23 @@ regFillInitTable( (TI_UINT8*)(&p->twdInitParams.tGeneral.halCoexActivityTable.numOfElements) ); /* Read the CoexActivity table string */ - regReadStringParameter(pAdapter, &STRCoexActivityTable , + { + TI_UINT8 *strCoexActivityTable; + TI_UINT8 strCoexActivitySize = 0; + + strCoexActivityTable = os_memoryAlloc(pAdapter, COEX_ACTIVITY_TABLE_MAX_NUM*COEX_ACTIVITY_TABLE_SIZE); + if (strCoexActivityTable) { + regReadStringParameter(pAdapter, &STRCoexActivityTable , (TI_INT8*)(defCoexActivityTable), strCoexActivitySize, (TI_UINT8*)strCoexActivityTable, &strCoexActivitySize); - /* Convert the CoexActivity table string */ - regConvertStringtoCoexActivityTable(strCoexActivityTable , p->twdInitParams.tGeneral.halCoexActivityTable.numOfElements, &p->twdInitParams.tGeneral.halCoexActivityTable.entry[0] , strCoexActivitySize); + /* Convert the CoexActivity table string */ + regConvertStringtoCoexActivityTable(strCoexActivityTable , p->twdInitParams.tGeneral.halCoexActivityTable.numOfElements, &p->twdInitParams.tGeneral.halCoexActivityTable.entry[0] , strCoexActivitySize); + os_memoryFree(pAdapter, strCoexActivityTable, COEX_ACTIVITY_TABLE_MAX_NUM*COEX_ACTIVITY_TABLE_SIZE); + } + } - /* + /* Power Manager */ regReadIntegerParameter(pAdapter, @@ -2549,7 +2586,7 @@ regReadIntegerParameter(pAdapter, &STRSettings, regReadIntegerTable (pAdapter, &STRSRDebugTable, SMART_REFLEX_CONFIG_PARAMS_DEF_TABLE, MAX_SR_PARAM_LEN, NULL, (TI_INT8*)&p->twdInitParams.tSmartReflexDebugParams.errorTable, - &TempSRCnt, sizeof (TI_UINT8),TI_FALSE); + (TI_UINT32 *)&TempSRCnt, sizeof (TI_UINT8),TI_FALSE); @@ -2572,7 +2609,7 @@ regReadIntegerParameter(pAdapter, &STRSettings, POWER_MGMNT_NEED_TO_SEND_NULL_PACKET_MAX_VALUE, sizeof p->PowerMgrInitParams.needToSendNullData, (TI_UINT8*)&p->PowerMgrInitParams.needToSendNullData); - + regReadIntegerParameter(pAdapter, &STRPowerMgmtNullPktRateModulation, POWER_MGMNT_NULL_PACKET_RATE_MOD_DEF_VALUE, @@ -2580,7 +2617,7 @@ regReadIntegerParameter(pAdapter, &STRSettings, POWER_MGMNT_NULL_PACKET_RATE_MOD_MAX_VALUE, sizeof p->PowerMgrInitParams.NullPktRateModulation, (TI_UINT8*)&p->PowerMgrInitParams.NullPktRateModulation); - + regReadIntegerParameter(pAdapter, &STRPowerMgmtNumNullPktRetries, POWER_MGMNT_NUM_NULL_PACKET_RETRY_DEF_VALUE, @@ -2620,7 +2657,7 @@ regReadIntegerParameter(pAdapter, &STRSettings, HOST_FAST_WAKE_SUPPORT_MAX, sizeof p->twdInitParams.tGeneral.uHostFastWakeupSupport, (TI_UINT8*)&p->twdInitParams.tGeneral.uHostFastWakeupSupport); - + /*--------------- Power Management Wake up conditions ------------------*/ regReadIntegerParameter(pAdapter, &STRListenInterval, @@ -2648,7 +2685,7 @@ regReadIntegerParameter(pAdapter, &STRSettings, sizeof p->twdInitParams.tPowerSrv.hangOverPeriod, (TI_UINT8*)&p->twdInitParams.tPowerSrv.hangOverPeriod); /*-----------------------------------------------------------------------*/ - + /* Scan SRV */ regReadIntegerParameter(pAdapter, &STRNumberOfNoScanCompleteToRecovery, @@ -4239,7 +4276,7 @@ regReadIntegerParameter(pAdapter, &STRFmCoexSwallowClkDif, /*----------------------------------------------*/ -/* Rate Management parameters */ +/* Rate Management parameters */ /*----------------------------------------------*/ regReadIntegerParameter(pAdapter, &STRRateMngRateRetryScore, @@ -4334,7 +4371,6 @@ regReadIntegerTable (pAdapter, &STRRateMngRateRetryPolicy, RATE_MNG_RATE_RETRY_P p->twdInitParams.tRateMngParams.RateRetryPolicy[uIndex] = uTempRatePolicyList[uIndex]; } - #ifdef _WINDOWS /* set etherMaxPayloadSize parameter for MTU size setting */ pAdapter->etherMaxPayloadSize = ETHER_MAX_PAYLOAD_SIZE; @@ -4361,7 +4397,7 @@ Return Value: None -----------------------------------------------------------------------------*/ -void regReadIntegerParameter ( +static void regReadIntegerParameter ( TWlanDrvIfObjPtr pAdapter, PNDIS_STRING pParameterName, TI_UINT32 defaultValue, @@ -5073,24 +5109,23 @@ regReadIntegerTable( TI_UINT8 uParameterSize, TI_BOOL bHex) { + static CHAR Buffer[MAX_KEY_BUFFER_LEN]; TI_UINT32 parameterIndex = 0; int myNumber; TI_UINT32 index; TI_UINT32 bufferSize = 0; - char tempBuffer[15]; + char tempBuffer[16]; char *pTempBuffer = tempBuffer; TI_UINT32 tempBufferIndex = 0; TI_BOOL isDigit; TI_BOOL numberReady; TI_BOOL isSign; - TI_BOOL endOfLine; + TI_BOOL endOfLine; TI_UINT32 debugInfo = 0; - - CHAR Buffer[MAX_KEY_BUFFER_LEN]; TI_INT8* pBuffer = (TI_INT8*)&Buffer; regReadStringParameter(pAdapter, @@ -5100,7 +5135,7 @@ regReadIntegerTable( (TI_UINT8*)pBuffer, &bufferSize); - index=0; + index = 0; do { /* Parsing one line */ isSign = TI_FALSE; @@ -5262,7 +5297,7 @@ regReadIntegerTable( } ++parameterIndex; - + }while ((index<bufferSize)&&(endOfLine==TI_FALSE)); *pEntriesNumber = parameterIndex; /* return number of entries read */ @@ -5310,7 +5345,7 @@ Return Value: None -----------------------------------------------------------------------------*/ -static void regConvertStringtoBeaconIETable(TI_UINT8 *staIpAddressString,TI_UINT8 *IpAddressArray, TI_UINT8 size) +static void regConvertStringtoBeaconIETable(TI_UINT8 *staIpAddressString, TI_UINT8 *IpAddressArray, TI_UINT8 size) { char *ptr; TI_UINT8 *tmpIpAddr; @@ -5320,19 +5355,25 @@ static void regConvertStringtoBeaconIETable(TI_UINT8 *staIpAddressString,TI_UINT /* Take the pointer to the string MAC Address to convert it to the Array MAC Address */ ptr = (char *)staIpAddressString; tmpIpAddr = IpAddressArray; - str_len = 3 * size - 1; /* Each value includes two digits and a space so multpily by 3 */ + str_len = 3 * size - 1; - for (i = 0; i < size; ptr++, str_len--) + for(i=0;(i < size);ptr++,str_len--) { - value_l = *ptr - '0'; - value_h = *ptr - 'a'; + if (str_len > 0) { + /* The value can be or "0-9" or from "a-f" */ + value_l = (*ptr - '0'); + value_h = (*ptr - 'a'); + } + else { /* last element */ + value_l = value_h = 16; + } + /*PRINTF(DBG_REGISTRY,("value_l [%d] value_h [%d] *ptr %c value %d\n",value_l,value_h,*ptr,value));*/ - if ((str_len > 0) && ((value_l <= 9) || (value_h <= 15))) + if( (value_l <= 9) || (value_h <= 15 ) ) { /* We are in an expected range */ - /* Check if 0-9 */ - if (value_l <= 9) + if(value_l <= 9 ) { add_value = value_l; } @@ -5343,10 +5384,12 @@ static void regConvertStringtoBeaconIETable(TI_UINT8 *staIpAddressString,TI_UINT add_value = value_h + 10; } value = value * 16 + add_value; + /*PRINTF(DBG_REGISTRY,("value %d add_value %d \n",value,add_value));*/ } else { tmpIpAddr[i] = value; + /*PRINTF(DBG_REGISTRY,("tmpMacAddr[%d] is %x\n",i,tmpMacAddr[i]));*/ value = 0; i++; } @@ -5359,7 +5402,7 @@ Routine Name: regConvertStringtoCoexActivityTable -Routine Description: Converts the CoexActivity string into CoexActivity config table +Routine Description: Converts the CoexActivity string into CoexActivity config table Arguments: @@ -5374,7 +5417,7 @@ static void regConvertStringtoCoexActivityTable(TI_UINT8 *strCoexActivityTable, { char *ptr; TI_UINT16 tmpArray[NUM_OF_COEX_ACTIVITY_PARAMS_IN_SG]; - TI_UINT16 value=0,value_l,value_h,add_value; + TI_UINT16 value = 0, value_l, value_h, add_value; TI_UINT32 i; int entry = 0; @@ -5382,11 +5425,10 @@ static void regConvertStringtoCoexActivityTable(TI_UINT8 *strCoexActivityTable, problem if buffer is not ended with blank (Dm) */ /* Take the pointer to the string MAC Address to convert it to the Array MAC Address */ - ptr=(char *)strCoexActivityTable; + ptr = (char *)strCoexActivityTable; - for (i=0 ;i < numOfElements*NUM_OF_COEX_ACTIVITY_PARAMS_IN_SG ;ptr++) + for(i=0;(i < numOfElements*NUM_OF_COEX_ACTIVITY_PARAMS_IN_SG);ptr++) { - /* The value can be or "0-9" or from "a-f" */ value_l = (*ptr - '0'); value_h = (*ptr - 'a'); @@ -5407,10 +5449,8 @@ static void regConvertStringtoCoexActivityTable(TI_UINT8 *strCoexActivityTable, /* 'a' is in fact 10 decimal in hexa */ add_value = value_h + 10; } - value = value*16 + add_value; - /* PRINTF(DBG_REGISTRY,("value %d add_value %d \n",value,add_value));*/ - - + value = value * 16 + add_value; + /* PRINTF(DBG_REGISTRY,("value %d add_value %d \n",value,add_value));*/ } else { @@ -5428,9 +5468,7 @@ static void regConvertStringtoCoexActivityTable(TI_UINT8 *strCoexActivityTable, entry++; } } - } - } static void parse_hex_string(char * pString, TI_UINT8 StrLength, TI_UINT8 * pBuffer, TI_UINT8 * Length) @@ -5440,7 +5478,7 @@ static void parse_hex_string(char * pString, TI_UINT8 StrLength, TI_UINT8 * pBuf while ((iter < StrLength) && (ch = pString[iter])) { - TI_UINT8 val = ((ch >= '0' && ch <= '9') ? (ch - '0') : + TI_UINT8 val = ((ch >= '0' && ch <= '9') ? (ch - '0') : (ch >= 'A' && ch <= 'F') ? (0xA + ch - 'A') : (ch >= 'a' && ch <= 'f') ? (0xA + ch - 'a') : 0); @@ -5490,4 +5528,3 @@ static void parse_filter_request(TRxDataFilterRequest* request, TI_UINT8 offset, parse_hex_string(pattern, patternLength, request->pattern, &request->patternLength); } } - diff --git a/wl1271/platforms/os/linux/Makefile b/wl1271/platforms/os/linux/Makefile index c9e7707f..0c56778c 100644 --- a/wl1271/platforms/os/linux/Makefile +++ b/wl1271/platforms/os/linux/Makefile @@ -13,7 +13,7 @@ STATIC_LIB ?= y # # Rebuild the supplicant # -BUILD_SUPPL ?= y +BUILD_SUPPL ?= n # # Supplicant @@ -53,9 +53,16 @@ USE_IRQ_ACTIVE_HIGH ?= n # TEST ?= n - +# +# Eth Support +# ETH_SUPPORT ?= n +# +# Debug +# +DEBUG ?= y + ## ## ## File lists and locations @@ -203,8 +210,8 @@ endif ifeq "$(HOST_PLATFORM)" "zoom1" TARGET = apps.tar endif -ifeq "$(HOST_PLATFORM)" "*UNDEFINED*" -TARGET = help +ifeq "$(HOST_PLATFORM)" "sholes" +TARGET = apps.tar endif # .PHONY: all @@ -244,7 +251,7 @@ TAR_FILE = $(HOST_PLATFORM)Binaries.tar apps.tar: apps ifeq ($(STRIP),y) @echo stripping... - cd $(OUTPUT_DIR) && $(CROSS_COMPILE)strip --strip-unneeded $(MODULES_LIST) + cd $(OUTPUT_DIR) && $(CROSS_COMPILE)strip -g --strip-unneeded $(MODULES_LIST) # cd $(DK_ROOT)/external_drivers/$(HOST_PLATFORM)/Linux/$(BUS_DRV) && $(CROSS_COMPILE)strip -g $(BUS_DRIVER_MODULE) endif @@ -278,19 +285,19 @@ clean: $(MAKE) -C $(OS_COMMON_DIR) CROSS_COMPILE=$(CROSS_COMPILE) DEBUG=$(DEBUG) BUILD_SUPPL=$(BUILD_SUPPL) SUPPL=$(SUPPL) WSPI=$(WSPI) INTR=$(INTR) XCC=$(XCC) INFO=$(INFO) STATIC_LIB=$(STATIC_LIB) clean $(MAKE) -C $(OS_LINUX_DIR) CROSS_COMPILE=$(CROSS_COMPILE) DEBUG=$(DEBUG) BUILD_SUPPL=$(BUILD_SUPPL) SUPPL=$(SUPPL) WSPI=$(WSPI) INTR=$(INTR) XCC=$(XCC) INFO=$(INFO) STATIC_LIB=$(STATIC_LIB) clean # $(MAKE) -C $(DK_ROOT)/external_drivers/$(HOST_PLATFORM)/Linux/$(BUS_DRV) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) KERNEL_DIR=$(KERNEL_DIR) OUTPUT_DIR=$(shell pwd)/$(OUTPUT_DIR) clean -# $(MAKE) -C $(WLAN_CUDK_DIR) CROSS_COMPILE=$(CROSS_COMPILE) BUILD_SUPPL=$(BUILD_SUPPL) SUPPL=$(SUPPL) XCC=$(XCC) ETH_SUPPORT=$(ETH_SUPPORT) clean +# $(MAKE) -C $(WLAN_CUDK_DIR) CROSS_COMPILE=$(CROSS_COMPILE) BUILD_SUPPL=$(BUILD_SUPPL) SUPPL=$(SUPPL) XCC=$(XCC) clean # $(MAKE) -C $(WLAN_CU_CLI_DIR) CROSS_COMPILE=$(CROSS_COMPILE) BUILD_SUPPL=$(BUILD_SUPPL) SUPPL=$(SUPPL) XCC=$(XCC) cleanall # $(MAKE) -C $(WLAN_LOADER_DIR) CROSS_COMPILE=$(CROSS_COMPILE) BUILD_SUPPL=$(BUILD_SUPPL) SUPPL=$(SUPPL) XCC=$(XCC) clean # $(MAKE) -C $(LINUX_WIRELESS_TOOLS_DIR) CROSS_COMPILE=$(CROSS_COMPILE) BUILD_SUPPL=$(BUILD_SUPPL) SUPPL=$(SUPPL) XCC=$(XCC) clean # $(MAKE) -C $(DBG_MDL) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) KERNEL_DIR=$(KERNEL_DIR) clean - @rm -f suppl.* apps.* voice.* - @rm -f *spi*.ko sdio.ko - @rm -f $(OUTPUT_DIR)/tiwlan_drv.ko +# @rm -f suppl.* apps.* voice.* +# @rm -f *spi*.ko sdio.ko +# @rm -f $(OUTPUT_DIR)/wlan_cu @rm -f $(OUTPUT_DIR)/tiwlan_drv.ko - @rm -f wpa_supplicant +# @rm -f wpa_supplicant # @rm -f $(FW_IMAGE_DEST_FILE) - @rm -rf *.o *.a \.*.o.cmd *~ *.~* core .depend dep +# @rm -rf *.o *.a \.*.o.cmd *~ *.~* core .depend dep # @rm -f tiwlan_drv.ko $(OUTPUT_DIR)/gwsi_drv.o $(OUTPUT_DIR)/debug_tools.o # @rm -rf $(OUTPUT_DIR)/iwconfig apps/iwlist $(OUTPUT_DIR)/iwevent diff --git a/wl1271/platforms/os/linux/build/Makefile b/wl1271/platforms/os/linux/build/Makefile index 92d05700..c93bb801 100644 --- a/wl1271/platforms/os/linux/build/Makefile +++ b/wl1271/platforms/os/linux/build/Makefile @@ -9,6 +9,7 @@ NO_ARCH_STRCMP ?= y NO_USERMODE_WORKAROUND ?= n MEM_ALLOC_TRACE ?= n +STACK_PROFILING_ON ?= n ## ## @@ -37,16 +38,18 @@ endif # List of linux OS files needed to be compiled # OS_SRCS = \ - $(DK_ROOT)/external_drivers/zoom2/Linux/sdio/SdioDrv.c \ $(DK_ROOT)/platforms/os/linux/src/WlanDrvIf.c \ - $(DK_ROOT)/platforms/hw/host_platform_$(HOST_PLATFORM)/linux/host_platform.c \ $(DK_ROOT)/platforms/os/linux/src/osapi.c \ $(DK_ROOT)/platforms/os/linux/src/osmemapi.c \ $(DK_ROOT)/platforms/os/linux/src/osRgstry_parser.c \ $(DK_ROOT)/platforms/os/linux/src/ipc_k.c \ $(DK_ROOT)/platforms/os/linux/src/WlanDrvWext.c \ $(DK_ROOT)/platforms/os/linux/src/CmdInterpretWext.c \ - $(DK_ROOT)/platforms/os/linux/src/RxBuf.c + $(DK_ROOT)/platforms/os/linux/src/RxBuf.c \ + $(DK_ROOT)/platforms/hw/linux/host_platform.c \ + $(DK_ROOT)/external_drivers/sdio/linux/SdioDrv.c +# $(DK_ROOT)/external_drivers/$(HOST_PLATFORM)/Linux/sdio/SdioDrv.c +# $(DK_ROOT)/platforms/hw/host_platform_$(HOST_PLATFORM)/linux/host_platform.c ifeq ($(STACK_PROFILING_ON),y) OS_SRCS += $(DK_ROOT)/platforms/os/linux/src/stack_profile.c @@ -58,16 +61,19 @@ ifeq ($(NO_ARCH_STRCMP),y) endif OS_INCS = $(DK_ROOT)/platforms/os/linux/inc $(DK_ROOT)/platforms/os/linux/src $(DK_ROOT)/platforms/os/common/inc -OS_INCS += $(DK_ROOT)/stad/src/core/EvHandler $(DK_ROOT)/Test $(DK_ROOT)/platforms/hw/host_platform_$(HOST_PLATFORM)/linux +#OS_INCS += $(DK_ROOT)/stad/src/core/EvHandler $(DK_ROOT)/Test $(DK_ROOT)/platforms/hw/host_platform_$(HOST_PLATFORM)/linux +OS_INCS += $(DK_ROOT)/stad/src/core/EvHandler $(DK_ROOT)/Test $(DK_ROOT)/platforms/hw/linux ifeq ($(WSPI),y) OS_SRCS += $(DK_ROOT)/platforms/hw/host_platform_$(HOST_PLATFORM)/linux/WspiAdapter.c - OS_INCS += $(EXT_DRV)/$(HOST_PLATFORM)/Linux/spi + OS_INCS += $(EXT_DRV)/$(HOST_PLATFORM)/Linux/spi endif ifeq ($(WSPI),n) - OS_SRCS += $(DK_ROOT)/platforms/hw/host_platform_$(HOST_PLATFORM)/linux/SdioAdapter.c - OS_INCS += $(EXT_DRV)/$(HOST_PLATFORM)/Linux/sdio +# OS_SRCS += $(DK_ROOT)/platforms/hw/host_platform_$(HOST_PLATFORM)/linux/SdioAdapter.c +# OS_INCS += $(EXT_DRV)/$(HOST_PLATFORM)/Linux/sdio + OS_SRCS += $(DK_ROOT)/platforms/hw/linux/SdioAdapter.c + OS_INCS += $(EXT_DRV)/sdio/linux endif OS_OBJS = $(patsubst %.c, %.o, $(OS_SRCS)) diff --git a/wl1271/platforms/os/linux/inc/WlanDrvIf.h b/wl1271/platforms/os/linux/inc/WlanDrvIf.h index 66d7cf47..0e9ddbe4 100644 --- a/wl1271/platforms/os/linux/inc/WlanDrvIf.h +++ b/wl1271/platforms/os/linux/inc/WlanDrvIf.h @@ -45,7 +45,6 @@ #include <linux/netdevice.h> #include <linux/workqueue.h> #include <mach/gpio.h> - #ifdef CONFIG_HAS_WAKELOCK #include <linux/wakelock.h> #endif @@ -57,9 +56,9 @@ #include "windows_types.h" #define TIWLAN_DRV_NAME "tiwlan" +#define DRIVERWQ_NAME "tiwlan_wq" #define TIWLAN_DRV_IF_NAME TIWLAN_DRV_NAME"%d" - #ifdef TI_DBG #define ti_dprintf(log, fmt, args...) do { \ if (log != TIWLAN_LOG_OTHER) { \ @@ -83,7 +82,7 @@ #endif -typedef enum +typedef enum { TIWLAN_LOG_ERROR, TIWLAN_LOG_INFO, @@ -102,12 +101,13 @@ typedef struct /* Driver object */ -typedef struct +typedef struct { TWlanDrvIfCommon tCommon; /* The driver object common part */ int irq; /* The OS IRQ handle */ - struct workqueue_struct *pWorkQueue;/* The OS work queue */ + unsigned long irq_flags; /* The IRQ flags */ + struct workqueue_struct *tiwlan_wq; /* Work Queue */ struct work_struct tWork; /* The OS work handle. */ spinlock_t lock; /* The OS spinlock handle. */ unsigned long flags; /* For saving the cpu flags during spinlock */ @@ -121,7 +121,7 @@ typedef struct struct wake_lock wl_wifi; /* Wifi wakelock */ struct wake_lock wl_rxwake; /* Wifi rx wakelock */ #endif - NDIS_HANDLE ConfigHandle;/* Temp - For Windows compatibility */ + NDIS_HANDLE ConfigHandle;/* Temp - For Windows compatibility */ } TWlanDrvIfObj, *TWlanDrvIfObjPtr; diff --git a/wl1271/platforms/os/linux/src/CmdInterpretWext.c b/wl1271/platforms/os/linux/src/CmdInterpretWext.c index d48770fb..656626fc 100644 --- a/wl1271/platforms/os/linux/src/CmdInterpretWext.c +++ b/wl1271/platforms/os/linux/src/CmdInterpretWext.c @@ -61,8 +61,7 @@ static int cmdInterpret_setSecurityParams (TI_HANDLE hCmdInterpret); static int cmdInterpret_initEvents(TI_HANDLE hCmdInterpret); static int cmdInterpret_unregisterEvents(TI_HANDLE hCmdInterpret, TI_HANDLE hEvHandler); -#define CHECK_PENDING_RESULT(x,y) if (x == COMMAND_PENDING) { os_printf ("Unexpected COMMAND PENDING result (cmd = 0x%x)\n",y.paramType); break; } -#define CHECK_PENDING_RESULT_RET(x,y) if (x == COMMAND_PENDING) { os_printf ("Unexpected COMMAND PENDING result (cmd = 0x%x)\n",y.paramType); return NULL; } +#define CHECK_PENDING_RESULT(x,y) if (x == COMMAND_PENDING) { os_printf ("Unexpected COMMAND PENDING result (cmd = 0x%x)\n",y->paramType); break; } static const char *ieee80211_modes[] = { "?", "IEEE 802.11 B", "IEEE 802.11 A", "IEEE 802.11 BG", "IEEE 802.11 ABG" @@ -71,7 +70,7 @@ static const char *ieee80211_modes[] = { typedef struct { - TI_UINT8 *assocRespBuffer; + TI_UINT8 *assocRespBuffer; TI_UINT32 assocRespLen; } cckm_assocInformation_t; @@ -110,10 +109,10 @@ TI_HANDLE cmdInterpret_Create (TI_HANDLE hOs) /* Deinitialize the cmdInterpreter module */ TI_STATUS cmdInterpret_Destroy (TI_HANDLE hCmdInterpret, TI_HANDLE hEvHandler) { - cmdInterpret_t * pCmdInterpret = (cmdInterpret_t *)hCmdInterpret; + cmdInterpret_t *pCmdInterpret = (cmdInterpret_t *)hCmdInterpret; /* Unregister events */ - cmdInterpret_unregisterEvents ((TI_HANDLE)pCmdInterpret, hEvHandler); + cmdInterpret_unregisterEvents ((TI_HANDLE)pCmdInterpret, hEvHandler); /* Release allocated memory */ os_memoryFree (pCmdInterpret->hOs, pCmdInterpret, sizeof(cmdInterpret_t)); @@ -139,13 +138,16 @@ void cmdInterpret_Init (TI_HANDLE hCmdInterpret, TStadHandlesList *pStadHandles) int cmdInterpret_convertAndExecute(TI_HANDLE hCmdInterpret, TConfigCommand *cmdObj) { cmdInterpret_t *pCmdInterpret = (cmdInterpret_t *)hCmdInterpret; + paramInfo_t *pParam; TI_STATUS res = TI_NOK; int i,j; - paramInfo_t Param; + union iwreq_data *wrqu = (union iwreq_data *)cmdObj->buffer1; cmdObj->return_code = WEXT_NOT_SUPPORTED; - + pParam = (paramInfo_t *)os_memoryAlloc(pCmdInterpret->hOs, sizeof(paramInfo_t)); + if (!pParam) + return res; /* Check user request */ switch (cmdObj->cmd) { @@ -162,12 +164,12 @@ int cmdInterpret_convertAndExecute(TI_HANDLE hCmdInterpret, TConfigCommand *cmdO /* If there is a given channel */ if (wrqu->freq.m != 0) { - Param.paramType = SITE_MGR_DESIRED_CHANNEL_PARAM; - Param.paramLength = sizeof(TI_UINT32); - Param.content.siteMgrDesiredChannel = wrqu->freq.m; + pParam->paramType = SITE_MGR_DESIRED_CHANNEL_PARAM; + pParam->paramLength = sizeof(TI_UINT32); + pParam->content.siteMgrDesiredChannel = wrqu->freq.m; - res = cmdDispatch_SetParam (pCmdInterpret->hCmdDispatch, &Param); - CHECK_PENDING_RESULT(res,Param) + res = cmdDispatch_SetParam (pCmdInterpret->hCmdDispatch, pParam); + CHECK_PENDING_RESULT(res,pParam) } break; } @@ -175,18 +177,18 @@ int cmdInterpret_convertAndExecute(TI_HANDLE hCmdInterpret, TConfigCommand *cmdO /* Get channel / frequency */ case SIOCGIWFREQ: { - Param.paramType = SITE_MGR_CURRENT_CHANNEL_PARAM; - Param.paramLength = sizeof(TI_UINT32); + pParam->paramType = SITE_MGR_CURRENT_CHANNEL_PARAM; + pParam->paramLength = sizeof(TI_UINT32); - res = cmdDispatch_GetParam (pCmdInterpret->hCmdDispatch, &Param); + res = cmdDispatch_GetParam (pCmdInterpret->hCmdDispatch, pParam); if(res == NO_SITE_SELECTED_YET) res = TI_OK; - - CHECK_PENDING_RESULT(res,Param) + + CHECK_PENDING_RESULT(res,pParam) if (res == TI_OK) { - wrqu->freq.m = Param.content.siteMgrCurrentChannel; + wrqu->freq.m = pParam->content.siteMgrCurrentChannel; wrqu->freq.e = 3; wrqu->freq.i = 0; } @@ -196,44 +198,45 @@ int cmdInterpret_convertAndExecute(TI_HANDLE hCmdInterpret, TConfigCommand *cmdO /* Set Mode (Adhoc / infrastructure) */ case SIOCSIWMODE: { - Param.paramType = SME_DESIRED_BSS_TYPE_PARAM; - Param.paramLength = sizeof(ScanBssType_e); + pParam->paramType = SME_DESIRED_BSS_TYPE_PARAM; + pParam->paramLength = sizeof(ScanBssType_e); switch (wrqu->mode) { case IW_MODE_AUTO: - Param.content.smeDesiredBSSType = BSS_ANY; + pParam->content.smeDesiredBSSType = BSS_ANY; break; case IW_MODE_ADHOC: - Param.content.smeDesiredBSSType = BSS_INDEPENDENT; + pParam->content.smeDesiredBSSType = BSS_INDEPENDENT; break; case IW_MODE_INFRA: - Param.content.smeDesiredBSSType = BSS_INFRASTRUCTURE; + pParam->content.smeDesiredBSSType = BSS_INFRASTRUCTURE; break; default: - return -EOPNOTSUPP; + res = -EOPNOTSUPP; + goto cmd_end; } - res = cmdDispatch_SetParam(pCmdInterpret->hCmdDispatch, &Param); - CHECK_PENDING_RESULT(res,Param) + res = cmdDispatch_SetParam(pCmdInterpret->hCmdDispatch, pParam); + CHECK_PENDING_RESULT(res,pParam) /* also set the site mgr desired mode */ - Param.paramType = SITE_MGR_DESIRED_BSS_TYPE_PARAM; - res = cmdDispatch_SetParam(pCmdInterpret->hCmdDispatch, &Param); - CHECK_PENDING_RESULT(res,Param) - + pParam->paramType = SITE_MGR_DESIRED_BSS_TYPE_PARAM; + res = cmdDispatch_SetParam(pCmdInterpret->hCmdDispatch, pParam); + CHECK_PENDING_RESULT(res,pParam) + break; } /* Get Mode (Adhoc / infrastructure) */ case SIOCGIWMODE: { - Param.paramType = SME_DESIRED_BSS_TYPE_PARAM; - Param.paramLength = sizeof(ScanBssType_e); - res = cmdDispatch_GetParam(pCmdInterpret->hCmdDispatch, &Param); - CHECK_PENDING_RESULT(res,Param) + pParam->paramType = SME_DESIRED_BSS_TYPE_PARAM; + pParam->paramLength = sizeof(ScanBssType_e); + res = cmdDispatch_GetParam(pCmdInterpret->hCmdDispatch, pParam); + CHECK_PENDING_RESULT(res,pParam) - switch (Param.content.smeDesiredBSSType) + switch (pParam->content.smeDesiredBSSType) { case BSS_ANY: wrqu->mode = IW_MODE_AUTO; @@ -255,19 +258,19 @@ int cmdInterpret_convertAndExecute(TI_HANDLE hCmdInterpret, TConfigCommand *cmdO case SIOCSIWSENS: { /* First get the current roaming configuration as a whole */ - Param.paramType = ROAMING_MNGR_APPLICATION_CONFIGURATION; - Param.paramLength = sizeof (roamingMngrConfigParams_t); - res = cmdDispatch_GetParam(pCmdInterpret->hCmdDispatch, &Param); + pParam->paramType = ROAMING_MNGR_APPLICATION_CONFIGURATION; + pParam->paramLength = sizeof (roamingMngrConfigParams_t); + res = cmdDispatch_GetParam(pCmdInterpret->hCmdDispatch, pParam); - CHECK_PENDING_RESULT(res,Param) + CHECK_PENDING_RESULT(res,pParam) /* Now change the low rssi threshold supplied by the user */ - Param.content.roamingConfigBuffer.roamingMngrThresholdsConfig.lowRssiThreshold = wrqu->param.value; + pParam->content.roamingConfigBuffer.roamingMngrThresholdsConfig.lowRssiThreshold = wrqu->param.value; /* And set the parameters back to the roaming module */ - res = cmdDispatch_SetParam(pCmdInterpret->hCmdDispatch, &Param); + res = cmdDispatch_SetParam(pCmdInterpret->hCmdDispatch, pParam); - CHECK_PENDING_RESULT(res,Param) + CHECK_PENDING_RESULT(res,pParam) break; } @@ -275,15 +278,15 @@ int cmdInterpret_convertAndExecute(TI_HANDLE hCmdInterpret, TConfigCommand *cmdO /* Get sensitivity (Rssi threshold OR CCA?)*/ case SIOCGIWSENS: { - Param.paramType = ROAMING_MNGR_APPLICATION_CONFIGURATION; - Param.paramLength = sizeof (roamingMngrConfigParams_t); - res = cmdDispatch_GetParam(pCmdInterpret->hCmdDispatch, &Param); + pParam->paramType = ROAMING_MNGR_APPLICATION_CONFIGURATION; + pParam->paramLength = sizeof (roamingMngrConfigParams_t); + res = cmdDispatch_GetParam(pCmdInterpret->hCmdDispatch, pParam); - CHECK_PENDING_RESULT(res,Param) + CHECK_PENDING_RESULT(res,pParam) if (res == TI_OK) { - wrqu->param.value = Param.content.roamingConfigBuffer.roamingMngrThresholdsConfig.lowRssiThreshold; + wrqu->param.value = pParam->content.roamingConfigBuffer.roamingMngrThresholdsConfig.lowRssiThreshold; wrqu->param.disabled = (wrqu->param.value == 0); wrqu->param.fixed = 1; } @@ -318,7 +321,7 @@ int cmdInterpret_convertAndExecute(TI_HANDLE hCmdInterpret, TConfigCommand *cmdO range->old_num_frequency = 0; /* Wireless event capability bitmasks */ - IW_EVENT_CAPA_SET(range->event_capa, SIOCGIWAP); + IW_EVENT_CAPA_SET(range->event_capa, SIOCGIWAP); IW_EVENT_CAPA_SET(range->event_capa, IWEVREGISTERED); IW_EVENT_CAPA_SET(range->event_capa, IWEVEXPIRED); @@ -326,16 +329,16 @@ int cmdInterpret_convertAndExecute(TI_HANDLE hCmdInterpret, TConfigCommand *cmdO range->sensitivity = 0; /* Rates */ - Param.paramType = SITE_MGR_DESIRED_SUPPORTED_RATE_SET_PARAM; - res = cmdDispatch_GetParam (pCmdInterpret->hCmdDispatch, &Param ); + pParam->paramType = SITE_MGR_DESIRED_SUPPORTED_RATE_SET_PARAM; + res = cmdDispatch_GetParam (pCmdInterpret->hCmdDispatch, pParam ); - CHECK_PENDING_RESULT(res,Param) + CHECK_PENDING_RESULT(res,pParam) /* Number of entries in the rates list */ - range->num_bitrates = Param.content.siteMgrDesiredSupportedRateSet.len; - for (i=0; i<Param.content.siteMgrDesiredSupportedRateSet.len; i++) + range->num_bitrates = pParam->content.siteMgrDesiredSupportedRateSet.len; + for (i=0; i<pParam->content.siteMgrDesiredSupportedRateSet.len; i++) { - range->bitrate[i] = ((Param.content.siteMgrDesiredSupportedRateSet.ratesString[i] & 0x7F) * 500000); + range->bitrate[i] = ((pParam->content.siteMgrDesiredSupportedRateSet.ratesString[i] & 0x7F) * 500000); } /* RTS threshold */ @@ -381,25 +384,25 @@ int cmdInterpret_convertAndExecute(TI_HANDLE hCmdInterpret, TConfigCommand *cmdO range->max_r_time = 0; /* Maximal retry lifetime */ /* Get Supported channels */ - Param.paramType = SITE_MGR_RADIO_BAND_PARAM; - res = cmdDispatch_GetParam( pCmdInterpret->hCmdDispatch, &Param ); + pParam->paramType = SITE_MGR_RADIO_BAND_PARAM; + res = cmdDispatch_GetParam( pCmdInterpret->hCmdDispatch, pParam ); - CHECK_PENDING_RESULT(res,Param) + CHECK_PENDING_RESULT(res,pParam) /* pParam->content.siteMgrRadioBand contains the current band, now get list of supported channels */ - Param.paramType = REGULATORY_DOMAIN_ALL_SUPPORTED_CHANNELS; - res = cmdDispatch_GetParam( pCmdInterpret->hCmdDispatch, &Param ); + pParam->paramType = REGULATORY_DOMAIN_ALL_SUPPORTED_CHANNELS; + res = cmdDispatch_GetParam( pCmdInterpret->hCmdDispatch, pParam ); - CHECK_PENDING_RESULT(res,Param) + CHECK_PENDING_RESULT(res,pParam) - range->num_channels = Param.content.supportedChannels.sizeOfList; /* Number of channels [0; num - 1] */ - range->num_frequency = Param.content.supportedChannels.sizeOfList; /* Number of entry in the list */ + range->num_channels = pParam->content.supportedChannels.sizeOfList; /* Number of channels [0; num - 1] */ + range->num_frequency = pParam->content.supportedChannels.sizeOfList; /* Number of entry in the list */ - for (i=0; i<Param.content.supportedChannels.sizeOfList; i++) + for (i=0; i<pParam->content.supportedChannels.sizeOfList; i++) { range->freq[i].e = 0; range->freq[i].m = i; - range->freq[i].i = Param.content.supportedChannels.listOfChannels[i]+1; + range->freq[i].i = pParam->content.supportedChannels.listOfChannels[i]+1; } /* Encoder (Encryption) capabilities */ @@ -418,9 +421,9 @@ int cmdInterpret_convertAndExecute(TI_HANDLE hCmdInterpret, TConfigCommand *cmdO range->encoding_login_index = 0; /* token index for login token */ /* Encryption capabilities */ - range->enc_capa = IW_ENC_CAPA_WPA | - IW_ENC_CAPA_WPA2 | - IW_ENC_CAPA_CIPHER_TKIP | + range->enc_capa = IW_ENC_CAPA_WPA | + IW_ENC_CAPA_WPA2 | + IW_ENC_CAPA_CIPHER_TKIP | IW_ENC_CAPA_CIPHER_CCMP; /* IW_ENC_CAPA_* bit field */ } @@ -434,21 +437,21 @@ int cmdInterpret_convertAndExecute(TI_HANDLE hCmdInterpret, TConfigCommand *cmdO if (MAC_NULL (wrqu->ap_addr.sa_data)) { /* Convert to "FF:FF:FF:FF:FF:FF" since this driver requires this value */ - MAC_COPY (Param.content.siteMgrDesiredBSSID, "\xff\xff\xff\xff\xff\xff"); - } + MAC_COPY (pParam->content.siteMgrDesiredBSSID, "\xff\xff\xff\xff\xff\xff"); + } else { - MAC_COPY (Param.content.siteMgrDesiredBSSID, wrqu->ap_addr.sa_data); + MAC_COPY (pParam->content.siteMgrDesiredBSSID, wrqu->ap_addr.sa_data); } - Param.paramType = SITE_MGR_DESIRED_BSSID_PARAM; - res = cmdDispatch_SetParam ( pCmdInterpret->hCmdDispatch, &Param ); - CHECK_PENDING_RESULT(res,Param) + pParam->paramType = SITE_MGR_DESIRED_BSSID_PARAM; + res = cmdDispatch_SetParam ( pCmdInterpret->hCmdDispatch, pParam ); + CHECK_PENDING_RESULT(res,pParam) /* also set it to the SME */ - Param.paramType = SME_DESIRED_BSSID_PARAM; - res = cmdDispatch_SetParam ( pCmdInterpret->hCmdDispatch, &Param ); - CHECK_PENDING_RESULT(res,Param) + pParam->paramType = SME_DESIRED_BSSID_PARAM; + res = cmdDispatch_SetParam ( pCmdInterpret->hCmdDispatch, pParam ); + CHECK_PENDING_RESULT(res,pParam) break; } @@ -458,20 +461,20 @@ int cmdInterpret_convertAndExecute(TI_HANDLE hCmdInterpret, TConfigCommand *cmdO case SIOCGIWAP: { /* Get current AP BSSID */ - Param.paramType = SITE_MGR_CURRENT_BSSID_PARAM; - res = cmdDispatch_GetParam ( pCmdInterpret->hCmdDispatch, &Param ); + pParam->paramType = SITE_MGR_CURRENT_BSSID_PARAM; + res = cmdDispatch_GetParam ( pCmdInterpret->hCmdDispatch, pParam ); - CHECK_PENDING_RESULT(res,Param) + CHECK_PENDING_RESULT(res,pParam) /* In case we are not associated - copy zeroes into bssid */ if (res == NO_SITE_SELECTED_YET) { MAC_COPY (wrqu->ap_addr.sa_data, "\x00\x00\x00\x00\x00\x00"); cmdObj->return_code = WEXT_OK; - } + } else if (res == TI_OK) { - MAC_COPY (wrqu->ap_addr.sa_data, Param.content.siteMgrDesiredBSSID); + MAC_COPY (wrqu->ap_addr.sa_data, pParam->content.siteMgrDesiredBSSID); } break; @@ -483,26 +486,27 @@ int cmdInterpret_convertAndExecute(TI_HANDLE hCmdInterpret, TConfigCommand *cmdO { struct iw_mlme *mlme = (struct iw_mlme *)cmdObj->param3; - Param.paramType = SITE_MGR_DESIRED_SSID_PARAM; + pParam->paramType = SITE_MGR_DESIRED_SSID_PARAM; /* In either case - we need to disconnect, so prepare "junk" SSID */ for (i = 0; i < MAX_SSID_LEN; i++) - Param.content.siteMgrDesiredSSID.str[i] = (i+1); - Param.content.siteMgrDesiredSSID.len = MAX_SSID_LEN; + pParam->content.siteMgrDesiredSSID.str[i] = (i+1); + pParam->content.siteMgrDesiredSSID.len = MAX_SSID_LEN; switch (mlme->cmd) { case IW_MLME_DEAUTH: case IW_MLME_DISASSOC: - res = cmdDispatch_SetParam (pCmdInterpret->hCmdDispatch, &Param ); - CHECK_PENDING_RESULT(res,Param) + res = cmdDispatch_SetParam (pCmdInterpret->hCmdDispatch, pParam ); + CHECK_PENDING_RESULT(res,pParam) /* now also set it to the SME */ - Param.paramType = SME_DESIRED_SSID_ACT_PARAM; - res = cmdDispatch_SetParam (pCmdInterpret->hCmdDispatch, &Param ); - CHECK_PENDING_RESULT(res,Param) + pParam->paramType = SME_DESIRED_SSID_ACT_PARAM; + res = cmdDispatch_SetParam (pCmdInterpret->hCmdDispatch, pParam ); + CHECK_PENDING_RESULT(res,pParam) break; default: - return -EOPNOTSUPP; + res = -EOPNOTSUPP; + goto cmd_end; } break; } @@ -510,12 +514,13 @@ int cmdInterpret_convertAndExecute(TI_HANDLE hCmdInterpret, TConfigCommand *cmdO /* trigger scanning (list cells) */ case SIOCSIWSCAN: { - struct iw_scan_req scanReq; - TScanParams scanParams; - Param.content.pScanParams = &scanParams; + struct iw_scan_req scanReq; + TScanParams scanParams; + + pParam->content.pScanParams = &scanParams; /* Init the parameters in case the Supplicant doesn't support them*/ - Param.content.pScanParams->desiredSsid.len = 0; + pParam->content.pScanParams->desiredSsid.len = 0; scanReq.scan_type = SCAN_TYPE_TRIGGERED_ACTIVE; if (cmdObj->param3) @@ -524,39 +529,39 @@ int cmdInterpret_convertAndExecute(TI_HANDLE hCmdInterpret, TConfigCommand *cmdO if (wrqu->data.flags & IW_SCAN_THIS_ESSID) { - Param.content.pScanParams->desiredSsid.len = scanReq.essid_len; - os_memoryCopy(pCmdInterpret->hOs,Param.content.pScanParams->desiredSsid.str, scanReq.essid, scanReq.essid_len); + pParam->content.pScanParams->desiredSsid.len = scanReq.essid_len; + os_memoryCopy(pCmdInterpret->hOs,pParam->content.pScanParams->desiredSsid.str, scanReq.essid, scanReq.essid_len); } else { - Param.content.pScanParams->desiredSsid.len = 0; /* scan all*/ + pParam->content.pScanParams->desiredSsid.len = 0; /* scan all*/ } } /* set the scan type according to driver trigger scan */ if (IW_SCAN_TYPE_PASSIVE == scanReq.scan_type) { - Param.content.pScanParams->scanType = SCAN_TYPE_TRIGGERED_PASSIVE; + pParam->content.pScanParams->scanType = SCAN_TYPE_TRIGGERED_PASSIVE; } else { - Param.content.pScanParams->scanType = SCAN_TYPE_TRIGGERED_ACTIVE; + pParam->content.pScanParams->scanType = SCAN_TYPE_TRIGGERED_ACTIVE; } - Param.paramType = SCAN_CNCN_BSSID_LIST_SCAN_PARAM; - Param.paramLength = sizeof(TScanParams); - res = cmdDispatch_SetParam (pCmdInterpret->hCmdDispatch, &Param ); - CHECK_PENDING_RESULT(res,Param) + pParam->paramType = SCAN_CNCN_BSSID_LIST_SCAN_PARAM; + pParam->paramLength = sizeof(TScanParams); + res = cmdDispatch_SetParam (pCmdInterpret->hCmdDispatch, pParam ); + CHECK_PENDING_RESULT(res,pParam) } break; /* get scanning results */ case SIOCGIWSCAN: { + unsigned char buf[30]; char *event = (char *)cmdObj->buffer2; - unsigned char buf[200]; struct iw_event iwe; - char *end_buf,*current_val; + char *end_buf, *current_val; int allocated_size; OS_802_11_BSSID_LIST_EX *my_list; OS_802_11_BSSID_EX *my_current; @@ -564,28 +569,32 @@ int cmdInterpret_convertAndExecute(TI_HANDLE hCmdInterpret, TConfigCommand *cmdO #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) struct iw_request_info info; - info.cmd= SIOCGIWSCAN; - info.flags=0; + info.cmd = SIOCGIWSCAN; + info.flags = 0; #endif end_buf = (char *)(cmdObj->buffer2 + wrqu->data.length); /* First get the amount of memory required to hold the entire BSSID list by setting the length to 0 */ - Param.paramType = SCAN_CNCN_BSSID_LIST_SIZE_PARAM; - Param.paramLength = 0; - res = cmdDispatch_GetParam (pCmdInterpret->hCmdDispatch, &Param ); - CHECK_PENDING_RESULT(res,Param) + pParam->paramType = SCAN_CNCN_BSSID_LIST_SIZE_PARAM; + pParam->paramLength = 0; + res = cmdDispatch_GetParam (pCmdInterpret->hCmdDispatch, pParam ); + CHECK_PENDING_RESULT(res,pParam) - allocated_size = Param.content.uBssidListSize; + allocated_size = pParam->content.uBssidListSize; /* Allocate required memory */ my_list = os_memoryAlloc (pCmdInterpret->hOs, allocated_size); + if (!my_list) { + res = -ENOMEM; + goto cmd_end; + } /* And retrieve the list */ - Param.paramType = SCAN_CNCN_BSSID_LIST_PARAM; - Param.content.pBssidList = my_list; - Param.paramLength = allocated_size; - res = cmdDispatch_GetParam (pCmdInterpret->hCmdDispatch, &Param ); - CHECK_PENDING_RESULT(res,Param) + pParam->paramType = SCAN_CNCN_BSSID_LIST_PARAM; + pParam->content.pBssidList = my_list; + pParam->paramLength = allocated_size; + res = cmdDispatch_GetParam (pCmdInterpret->hCmdDispatch, pParam ); + CHECK_PENDING_RESULT(res,pParam) my_current = &my_list->Bssid[0]; i=0; @@ -603,7 +612,7 @@ int cmdInterpret_convertAndExecute(TI_HANDLE hCmdInterpret, TConfigCommand *cmdO { break; } - + /* The first entry MUST be the AP BSSID */ os_memorySet (pCmdInterpret->hOs, &iwe, 0, sizeof(iwe)); iwe.cmd = SIOCGIWAP; @@ -659,7 +668,7 @@ int cmdInterpret_convertAndExecute(TI_HANDLE hCmdInterpret, TConfigCommand *cmdO os_memorySet (pCmdInterpret->hOs, &iwe, 0, sizeof(iwe)); iwe.cmd = SIOCGIWFREQ; iwe.u.freq.m = my_current->Configuration.Union.channel; - iwe.u.freq.e = 3; + iwe.u.freq.e = 3; /* Frequency divider */ iwe.u.freq.i = 0; iwe.len = IW_EV_FREQ_LEN; @@ -730,7 +739,7 @@ int cmdInterpret_convertAndExecute(TI_HANDLE hCmdInterpret, TConfigCommand *cmdO os_memorySet (pCmdInterpret->hOs, &iwe, 0, sizeof(iwe)); iwe.cmd = IWEVGENIE; offset = sizeof(OS_802_11_FIXED_IEs); - while(offset < my_current->IELength) + while(offset < my_current->IELength) { OS_802_11_VARIABLE_IEs *pIE; pIE = (OS_802_11_VARIABLE_IEs*)&(my_current->IEs[offset]); @@ -743,7 +752,7 @@ int cmdInterpret_convertAndExecute(TI_HANDLE hCmdInterpret, TConfigCommand *cmdO event = iwe_stream_add_point(&info, event, end_buf, &iwe, (char *)&(my_current->IEs[offset])); #endif offset += pIE->Length + 2; - } + } my_current = (OS_802_11_BSSID_EX *) (((char *) my_current) + my_current->Length); } @@ -775,15 +784,15 @@ int cmdInterpret_convertAndExecute(TI_HANDLE hCmdInterpret, TConfigCommand *cmdO else cmdInterpret_setSecurityParams (hCmdInterpret); - os_memoryZero (pCmdInterpret->hOs, &Param.content.siteMgrDesiredSSID.str, MAX_SSID_LEN); + os_memoryZero (pCmdInterpret->hOs, &pParam->content.siteMgrDesiredSSID.str, MAX_SSID_LEN); - Param.content.siteMgrCurrentSSID.len = 0; + pParam->content.siteMgrCurrentSSID.len = 0; if (wrqu->essid.flags == 0) { /* Connect to ANY ESSID - use empty */ - os_memoryCopy(pCmdInterpret->hOs, &Param.content.siteMgrCurrentSSID.str, "\00", 1); - Param.content.siteMgrCurrentSSID.len = 0;; + os_memoryCopy(pCmdInterpret->hOs, &pParam->content.siteMgrCurrentSSID.str, "\00", 1); + pParam->content.siteMgrCurrentSSID.len = 0;; } else { /* Handle ESSID length issue in WEXT (backward compatibility with old/new versions) */ @@ -793,18 +802,18 @@ int cmdInterpret_convertAndExecute(TI_HANDLE hCmdInterpret, TConfigCommand *cmdO while (length < wrqu->essid.length && extra[length]) length++; - os_memoryCopy(pCmdInterpret->hOs, &Param.content.siteMgrCurrentSSID.str, cmdObj->buffer2, length); - Param.content.siteMgrCurrentSSID.len = length; + os_memoryCopy(pCmdInterpret->hOs, &pParam->content.siteMgrCurrentSSID.str, cmdObj->buffer2, length); + pParam->content.siteMgrCurrentSSID.len = length; } - Param.paramType = SITE_MGR_DESIRED_SSID_PARAM; - Param.paramLength = sizeof (TSsid); - res = cmdDispatch_SetParam (pCmdInterpret->hCmdDispatch, &Param ); - CHECK_PENDING_RESULT(res,Param) + pParam->paramType = SITE_MGR_DESIRED_SSID_PARAM; + pParam->paramLength = sizeof (TSsid); + res = cmdDispatch_SetParam (pCmdInterpret->hCmdDispatch, pParam ); + CHECK_PENDING_RESULT(res,pParam) /* also set it to the SME */ - Param.paramType = SME_DESIRED_SSID_ACT_PARAM; - res = cmdDispatch_SetParam (pCmdInterpret->hCmdDispatch, &Param ); - CHECK_PENDING_RESULT(res,Param) + pParam->paramType = SME_DESIRED_SSID_ACT_PARAM; + res = cmdDispatch_SetParam (pCmdInterpret->hCmdDispatch, pParam ); + CHECK_PENDING_RESULT(res,pParam) } break; @@ -813,22 +822,22 @@ int cmdInterpret_convertAndExecute(TI_HANDLE hCmdInterpret, TConfigCommand *cmdO { char *extra = (char *)cmdObj->buffer2; - Param.paramType = SITE_MGR_CURRENT_SSID_PARAM; - res = cmdDispatch_GetParam ( pCmdInterpret->hCmdDispatch, &Param ); + pParam->paramType = SITE_MGR_CURRENT_SSID_PARAM; + res = cmdDispatch_GetParam ( pCmdInterpret->hCmdDispatch, pParam ); if(res == NO_SITE_SELECTED_YET) res = WEXT_OK; - CHECK_PENDING_RESULT(res,Param) + CHECK_PENDING_RESULT(res,pParam) wrqu->essid.flags = 1; - os_memoryCopy(pCmdInterpret->hOs, cmdObj->buffer2, &Param.content.siteMgrCurrentSSID.str, Param.content.siteMgrCurrentSSID.len ); + os_memoryCopy(pCmdInterpret->hOs, cmdObj->buffer2, &pParam->content.siteMgrCurrentSSID.str, pParam->content.siteMgrCurrentSSID.len ); - if(Param.content.siteMgrCurrentSSID.len < MAX_SSID_LEN) + if (pParam->content.siteMgrCurrentSSID.len < MAX_SSID_LEN) { - extra[Param.content.siteMgrCurrentSSID.len] = 0; + extra[pParam->content.siteMgrCurrentSSID.len] = 0; } - wrqu->essid.length = Param.content.siteMgrCurrentSSID.len; + wrqu->essid.length = pParam->content.siteMgrCurrentSSID.len; } break; @@ -836,8 +845,10 @@ int cmdInterpret_convertAndExecute(TI_HANDLE hCmdInterpret, TConfigCommand *cmdO /* set node name/nickname */ case SIOCSIWNICKN: { - if (wrqu->data.length > IW_ESSID_MAX_SIZE) - return -EINVAL; + if (wrqu->data.length > IW_ESSID_MAX_SIZE) { + res = -EINVAL; + goto cmd_end; + } os_memoryCopy(pCmdInterpret->hOs, pCmdInterpret->nickName, cmdObj->buffer2, wrqu->data.length); pCmdInterpret->nickName[IW_ESSID_MAX_SIZE] = 0; res = TI_OK; @@ -860,28 +871,28 @@ int cmdInterpret_convertAndExecute(TI_HANDLE hCmdInterpret, TConfigCommand *cmdO /* Set RTS Threshold */ case SIOCSIWRTS: { - Param.paramType = TWD_RTS_THRESHOLD_PARAM; + pParam->paramType = TWD_RTS_THRESHOLD_PARAM; if (wrqu->rts.disabled) - Param.content.halCtrlRtsThreshold = TWD_RTS_THRESHOLD_DEF; + pParam->content.halCtrlRtsThreshold = TWD_RTS_THRESHOLD_DEF; else - Param.content.halCtrlRtsThreshold = wrqu->rts.value; + pParam->content.halCtrlRtsThreshold = wrqu->rts.value; - res = cmdDispatch_SetParam (pCmdInterpret->hCmdDispatch,&Param); - CHECK_PENDING_RESULT(res,Param) + res = cmdDispatch_SetParam (pCmdInterpret->hCmdDispatch,pParam); + CHECK_PENDING_RESULT(res,pParam) break; } - + /* Get RTS Threshold */ case SIOCGIWRTS: { - Param.paramType = TWD_RTS_THRESHOLD_PARAM; - res = cmdDispatch_GetParam (pCmdInterpret->hCmdDispatch,&Param); + pParam->paramType = TWD_RTS_THRESHOLD_PARAM; + res = cmdDispatch_GetParam (pCmdInterpret->hCmdDispatch,pParam); - CHECK_PENDING_RESULT(res,Param) + CHECK_PENDING_RESULT(res,pParam) - wrqu->rts.value = Param.content.halCtrlRtsThreshold; - wrqu->rts.fixed = 1; + wrqu->rts.value = pParam->content.halCtrlRtsThreshold; + wrqu->rts.fixed = 1; cmdObj->return_code = WEXT_OK; break; } @@ -889,11 +900,11 @@ int cmdInterpret_convertAndExecute(TI_HANDLE hCmdInterpret, TConfigCommand *cmdO /* Set Fragmentation threshold */ case SIOCSIWFRAG: { - Param.paramType = TWD_FRAG_THRESHOLD_PARAM; - Param.content.halCtrlFragThreshold = ((wrqu->frag.value+1)>>1) << 1; /* make it always even */ + pParam->paramType = TWD_FRAG_THRESHOLD_PARAM; + pParam->content.halCtrlFragThreshold = ((wrqu->frag.value+1)>>1) << 1; /* make it always even */ - res = cmdDispatch_SetParam(pCmdInterpret->hCmdDispatch, &Param); - CHECK_PENDING_RESULT(res,Param) + res = cmdDispatch_SetParam(pCmdInterpret->hCmdDispatch, pParam); + CHECK_PENDING_RESULT(res,pParam) break; } @@ -901,13 +912,13 @@ int cmdInterpret_convertAndExecute(TI_HANDLE hCmdInterpret, TConfigCommand *cmdO /* Get Fragmentation threshold */ case SIOCGIWFRAG: { - Param.paramType = TWD_FRAG_THRESHOLD_PARAM; - res = cmdDispatch_GetParam (pCmdInterpret->hCmdDispatch,&Param); + pParam->paramType = TWD_FRAG_THRESHOLD_PARAM; + res = cmdDispatch_GetParam (pCmdInterpret->hCmdDispatch,pParam); - CHECK_PENDING_RESULT(res,Param) + CHECK_PENDING_RESULT(res,pParam) - wrqu->rts.value = Param.content.halCtrlFragThreshold; - wrqu->rts.fixed = 1; + wrqu->rts.value = pParam->content.halCtrlFragThreshold; + wrqu->rts.fixed = 1; cmdObj->return_code = WEXT_OK; break; } @@ -920,25 +931,25 @@ int cmdInterpret_convertAndExecute(TI_HANDLE hCmdInterpret, TConfigCommand *cmdO } else { - Param.paramType = REGULATORY_DOMAIN_CURRENT_TX_POWER_LEVEL_PARAM; - Param.content.desiredTxPower = wrqu->txpower.value; - res = cmdDispatch_SetParam (pCmdInterpret->hCmdDispatch,&Param); - CHECK_PENDING_RESULT(res,Param) + pParam->paramType = REGULATORY_DOMAIN_CURRENT_TX_POWER_LEVEL_PARAM; + pParam->content.desiredTxPower = wrqu->txpower.value; + res = cmdDispatch_SetParam (pCmdInterpret->hCmdDispatch,pParam); + CHECK_PENDING_RESULT(res,pParam) } break; /* Get TX power level */ case SIOCGIWTXPOW: { - Param.paramType = REGULATORY_DOMAIN_CURRENT_TX_POWER_IN_DBM_PARAM; - res = cmdDispatch_GetParam (pCmdInterpret->hCmdDispatch,&Param); + pParam->paramType = REGULATORY_DOMAIN_CURRENT_TX_POWER_IN_DBM_PARAM; + res = cmdDispatch_GetParam (pCmdInterpret->hCmdDispatch,pParam); - CHECK_PENDING_RESULT(res,Param) + CHECK_PENDING_RESULT(res,pParam) wrqu->txpower.flags = IW_TXPOW_RELATIVE | IW_TXPOW_RANGE; wrqu->txpower.disabled = 0; wrqu->txpower.fixed = 0; - wrqu->txpower.value = Param.content.desiredTxPower; + wrqu->txpower.value = pParam->content.desiredTxPower; break; } @@ -955,35 +966,34 @@ int cmdInterpret_convertAndExecute(TI_HANDLE hCmdInterpret, TConfigCommand *cmdO index--; else { - Param.paramType = RSN_DEFAULT_KEY_ID; - res = cmdDispatch_GetParam (pCmdInterpret->hCmdDispatch,&Param); - CHECK_PENDING_RESULT(res,Param) - index = Param.content.rsnDefaultKeyID; + pParam->paramType = RSN_DEFAULT_KEY_ID; + res = cmdDispatch_GetParam (pCmdInterpret->hCmdDispatch,pParam); + CHECK_PENDING_RESULT(res,pParam) + index = pParam->content.rsnDefaultKeyID; } - - Param.paramType = RSN_ADD_KEY_PARAM; + + pParam->paramType = RSN_ADD_KEY_PARAM; /* remove key if disabled */ if (wrqu->data.flags & IW_ENCODE_DISABLED) { - Param.paramType = RSN_REMOVE_KEY_PARAM; + pParam->paramType = RSN_REMOVE_KEY_PARAM; } - Param.content.rsnOsKey.KeyIndex = index; + pParam->content.rsnOsKey.KeyIndex = index; if (wrqu->data.length) { - os_memoryCopy(pCmdInterpret->hOs, &Param.content.rsnOsKey.KeyMaterial, cmdObj->buffer2, wrqu->data.length); - Param.content.rsnOsKey.KeyLength = wrqu->data.length; + os_memoryCopy(pCmdInterpret->hOs, &pParam->content.rsnOsKey.KeyMaterial, cmdObj->buffer2, wrqu->data.length); + pParam->content.rsnOsKey.KeyLength = wrqu->data.length; } else { /* No key material is provided, just set given index as default TX key */ - Param.paramType = RSN_DEFAULT_KEY_ID; - Param.content.rsnDefaultKeyID = index; + pParam->paramType = RSN_DEFAULT_KEY_ID; + pParam->content.rsnDefaultKeyID = index; } - - res = cmdDispatch_SetParam (pCmdInterpret->hCmdDispatch, &Param); - CHECK_PENDING_RESULT(res,Param) + res = cmdDispatch_SetParam (pCmdInterpret->hCmdDispatch, pParam); + CHECK_PENDING_RESULT(res,pParam) break; } @@ -1005,25 +1015,25 @@ int cmdInterpret_convertAndExecute(TI_HANDLE hCmdInterpret, TConfigCommand *cmdO index--; else { - Param.paramType = RSN_DEFAULT_KEY_ID; - res = cmdDispatch_GetParam (pCmdInterpret->hCmdDispatch,&Param); - CHECK_PENDING_RESULT(res,Param) - index = Param.content.rsnDefaultKeyID; + pParam->paramType = RSN_DEFAULT_KEY_ID; + res = cmdDispatch_GetParam (pCmdInterpret->hCmdDispatch,pParam); + CHECK_PENDING_RESULT(res,pParam) + index = pParam->content.rsnDefaultKeyID; wrqu->data.flags = (index+1); } - Param.content.pRsnKey = &myKeyInfo; + pParam->content.pRsnKey = &myKeyInfo; - Param.paramType = RSN_KEY_PARAM; - Param.content.pRsnKey->keyIndex = index; - res = cmdDispatch_GetParam (pCmdInterpret->hCmdDispatch,&Param); - CHECK_PENDING_RESULT(res,Param) + pParam->paramType = RSN_KEY_PARAM; + pParam->content.pRsnKey->keyIndex = index; + res = cmdDispatch_GetParam (pCmdInterpret->hCmdDispatch,pParam); + CHECK_PENDING_RESULT(res,pParam) - if ((Param.content.pRsnKey) && (Param.content.pRsnKey->encLen)) + if ((pParam->content.pRsnKey) && (pParam->content.pRsnKey->encLen)) { wrqu->data.flags |= IW_ENCODE_ENABLED; - wrqu->data.length = Param.content.pRsnKey->encLen; - os_memoryCopy(pCmdInterpret->hOs,extra, &Param.content.pRsnKey->encKey,wrqu->data.length); + wrqu->data.length = pParam->content.pRsnKey->encLen; + os_memoryCopy(pCmdInterpret->hOs,extra, &pParam->content.pRsnKey->encKey,wrqu->data.length); } /* Convert from driver (OID-like) authentication parameters to WEXT */ @@ -1050,22 +1060,21 @@ int cmdInterpret_convertAndExecute(TI_HANDLE hCmdInterpret, TConfigCommand *cmdO } break; - case SIOCSIWGENIE: + case SIOCSIWGENIE: { - Param.paramType = RSN_GENERIC_IE_PARAM; - Param.content.rsnGenericIE.length = wrqu->data.length; - if (wrqu->data.length) { - os_memoryCopy(pCmdInterpret->hOs, Param.content.rsnGenericIE.data, cmdObj->param3, wrqu->data.length); - } - res = cmdDispatch_SetParam (pCmdInterpret->hCmdDispatch, &Param); - CHECK_PENDING_RESULT(res,Param); - - break; + pParam->paramType = RSN_GENERIC_IE_PARAM; + pParam->content.rsnGenericIE.length = wrqu->data.length; + if (wrqu->data.length) { + os_memoryCopy(pCmdInterpret->hOs, pParam->content.rsnGenericIE.data, cmdObj->param3, wrqu->data.length); + } + res = cmdDispatch_SetParam (pCmdInterpret->hCmdDispatch, pParam); + CHECK_PENDING_RESULT(res,pParam); } + break; /* Set Authentication */ case SIOCSIWAUTH: - + res = TI_OK; switch (wrqu->param.flags & IW_AUTH_INDEX) { case IW_AUTH_WPA_VERSION: @@ -1094,15 +1103,13 @@ int cmdInterpret_convertAndExecute(TI_HANDLE hCmdInterpret, TConfigCommand *cmdO case IW_AUTH_PRIVACY_INVOKED: break; default: - return -EOPNOTSUPP; + res = -EOPNOTSUPP; } - - res = TI_OK; - break; /* Get Authentication */ case SIOCGIWAUTH: + res = TI_OK; { switch (wrqu->param.flags & IW_AUTH_INDEX) { @@ -1122,12 +1129,9 @@ int cmdInterpret_convertAndExecute(TI_HANDLE hCmdInterpret, TConfigCommand *cmdO wrqu->param.value = pCmdInterpret->wai.iw_auth_80211_auth_alg; break; default: - return -EOPNOTSUPP; + res = -EOPNOTSUPP; } } - - res = TI_OK; - break; /* set encoding token & mode */ @@ -1138,26 +1142,28 @@ int cmdInterpret_convertAndExecute(TI_HANDLE hCmdInterpret, TConfigCommand *cmdO TI_UINT8 temp[32]; #ifdef GEM_SUPPORTED - if ( ext->alg == KEY_GEM ) { - TSecurityKeys key; - os_memoryZero(pCmdInterpret->hOs, &key, sizeof(key)); - key.keyType = ext->alg; - if (ext->key_len > MAX_KEY_LEN) { - return -EINVAL; - } - key.encLen = ext->key_len; - os_memoryCopy(pCmdInterpret->hOs, key.encKey, ext->key, ext->key_len); - key.keyIndex = (wrqu->encoding.flags & IW_ENCODE_INDEX) - 1; - os_memoryCopy(pCmdInterpret->hOs, &key.macAddress, ext->addr.sa_data, sizeof(key.macAddress)); - - Param.paramType = RSN_SET_KEY_PARAM; - Param.paramLength = sizeof(Param.content.pRsnKey); - Param.content.pRsnKey = &key; - - res = cmdDispatch_SetParam (pCmdInterpret->hCmdDispatch, &Param); - CHECK_PENDING_RESULT(res,Param); - break; - } + if ( ext->alg == KEY_GEM ) { + TSecurityKeys key; + + os_memoryZero(pCmdInterpret->hOs, &key, sizeof(key)); + key.keyType = ext->alg; + if (ext->key_len > MAX_KEY_LEN) { + res = -EINVAL; + break; + } + key.encLen = ext->key_len; + os_memoryCopy(pCmdInterpret->hOs, key.encKey, ext->key, ext->key_len); + key.keyIndex = (wrqu->encoding.flags & IW_ENCODE_INDEX) - 1; + os_memoryCopy(pCmdInterpret->hOs, &key.macAddress, ext->addr.sa_data, sizeof(key.macAddress)); + + pParam->paramType = RSN_SET_KEY_PARAM; + pParam->paramLength = sizeof(pParam->content.pRsnKey); + pParam->content.pRsnKey = &key; + + res = cmdDispatch_SetParam (pCmdInterpret->hCmdDispatch, pParam); + CHECK_PENDING_RESULT(res,pParam); + break; + } #endif addr = ext->addr.sa_data; @@ -1167,36 +1173,36 @@ int cmdInterpret_convertAndExecute(TI_HANDLE hCmdInterpret, TConfigCommand *cmdO os_printf ("ext->ext_flags = 0x%x\n",ext->ext_flags); os_printf ("ext->key_len = 0x%x\n",ext->key_len); os_printf ("ext->key_idx = 0x%x\n",(wrqu->encoding.flags & IW_ENCODE_INDEX)); - + os_printf ("key = "); for (i=0; i<ext->key_len; i++) { os_printf ("0x%02x:",ext->key[i]); } - os_printf ("\n"); + os_printf ("\n"); */ - MAC_COPY (Param.content.rsnOsKey.BSSID, addr); + MAC_COPY (pParam->content.rsnOsKey.BSSID, addr); - Param.content.rsnOsKey.KeyLength = ext->key_len; + pParam->content.rsnOsKey.KeyLength = ext->key_len; - Param.content.rsnOsKey.KeyIndex = wrqu->encoding.flags & IW_ENCODE_INDEX; - Param.content.rsnOsKey.KeyIndex -= 1; + pParam->content.rsnOsKey.KeyIndex = wrqu->encoding.flags & IW_ENCODE_INDEX; + pParam->content.rsnOsKey.KeyIndex -= 1; if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) { - Param.content.rsnOsKey.KeyIndex |= TIWLAN_KEY_FLAGS_TRANSMIT; + pParam->content.rsnOsKey.KeyIndex |= TIWLAN_KEY_FLAGS_TRANSMIT; } if (addr[0]!=0xFF) { - Param.content.rsnOsKey.KeyIndex |= TIWLAN_KEY_FLAGS_PAIRWISE; + pParam->content.rsnOsKey.KeyIndex |= TIWLAN_KEY_FLAGS_PAIRWISE; } if (ext->ext_flags & IW_ENCODE_EXT_RX_SEQ_VALID) { - os_memoryCopy(pCmdInterpret->hOs, &Param.content.rsnOsKey.KeyRSC, &ext->rx_seq, IW_ENCODE_SEQ_MAX_SIZE); - Param.content.rsnOsKey.KeyIndex |= TIWLAN_KEY_FLAGS_SET_KEY_RSC; + os_memoryCopy(pCmdInterpret->hOs, &pParam->content.rsnOsKey.KeyRSC, &ext->rx_seq, IW_ENCODE_SEQ_MAX_SIZE); + pParam->content.rsnOsKey.KeyIndex |= TIWLAN_KEY_FLAGS_SET_KEY_RSC; } /* If key is TKIP - need to switch RX and TX MIC (to match driver API) */ @@ -1205,19 +1211,19 @@ int cmdInterpret_convertAndExecute(TI_HANDLE hCmdInterpret, TConfigCommand *cmdO os_memoryCopy(pCmdInterpret->hOs,(TI_UINT8*)(((TI_UINT8*)&temp)+24),(TI_UINT8*)(((TI_UINT8*)&ext->key)+16),8); os_memoryCopy(pCmdInterpret->hOs,(TI_UINT8*)(((TI_UINT8*)&temp)+16),(TI_UINT8*)(((TI_UINT8*)&ext->key)+24),8); os_memoryCopy(pCmdInterpret->hOs,&temp,&ext->key,16); - os_memoryCopy(pCmdInterpret->hOs, &Param.content.rsnOsKey.KeyMaterial, &temp, ext->key_len); + os_memoryCopy(pCmdInterpret->hOs, &pParam->content.rsnOsKey.KeyMaterial, &temp, ext->key_len); } else { - os_memoryCopy(pCmdInterpret->hOs, &Param.content.rsnOsKey.KeyMaterial, &ext->key, ext->key_len); + os_memoryCopy(pCmdInterpret->hOs, &pParam->content.rsnOsKey.KeyMaterial, &ext->key, ext->key_len); } if (ext->key_len == 0) - Param.paramType = RSN_REMOVE_KEY_PARAM; + pParam->paramType = RSN_REMOVE_KEY_PARAM; else - Param.paramType = RSN_ADD_KEY_PARAM; + pParam->paramType = RSN_ADD_KEY_PARAM; - res = cmdDispatch_SetParam (pCmdInterpret->hCmdDispatch, &Param); - CHECK_PENDING_RESULT(res,Param) + res = cmdDispatch_SetParam (pCmdInterpret->hCmdDispatch, pParam); + CHECK_PENDING_RESULT(res,pParam) } break; @@ -1230,26 +1236,26 @@ int cmdInterpret_convertAndExecute(TI_HANDLE hCmdInterpret, TConfigCommand *cmdO switch (pmksa->cmd) { case IW_PMKSA_ADD: - Param.paramType = RSN_PMKID_LIST; - Param.content.rsnPMKIDList.BSSIDInfoCount = 1; - Param.content.rsnPMKIDList.Length = 2*sizeof(TI_UINT32) + MAC_ADDR_LEN + PMKID_VALUE_SIZE; - MAC_COPY (Param.content.rsnPMKIDList.osBSSIDInfo[0].BSSID, pmksa->bssid.sa_data); - os_memoryCopy(pCmdInterpret->hOs, &Param.content.rsnPMKIDList.osBSSIDInfo[0].PMKID, pmksa->pmkid, IW_PMKID_LEN); + pParam->paramType = RSN_PMKID_LIST; + pParam->content.rsnPMKIDList.BSSIDInfoCount = 1; + pParam->content.rsnPMKIDList.Length = 2*sizeof(TI_UINT32) + MAC_ADDR_LEN + PMKID_VALUE_SIZE; + MAC_COPY (pParam->content.rsnPMKIDList.osBSSIDInfo[0].BSSID, pmksa->bssid.sa_data); + os_memoryCopy(pCmdInterpret->hOs, &pParam->content.rsnPMKIDList.osBSSIDInfo[0].PMKID, pmksa->pmkid, IW_PMKID_LEN); - res = cmdDispatch_SetParam (pCmdInterpret->hCmdDispatch, &Param); - CHECK_PENDING_RESULT(res,Param) + res = cmdDispatch_SetParam (pCmdInterpret->hCmdDispatch, pParam); + CHECK_PENDING_RESULT(res,pParam) break; case IW_PMKSA_REMOVE: /* Not supported yet */ break; case IW_PMKSA_FLUSH: - Param.paramType = RSN_PMKID_LIST; + pParam->paramType = RSN_PMKID_LIST; /* By using info count=0, RSN knows to clear its tables */ /* It's also possible to call rsn_resetPMKIDList directly, but cmdDispatcher should be the interface */ - Param.content.rsnPMKIDList.BSSIDInfoCount = 0; - res = cmdDispatch_SetParam (pCmdInterpret->hCmdDispatch, &Param); - CHECK_PENDING_RESULT(res,Param) + pParam->content.rsnPMKIDList.BSSIDInfoCount = 0; + res = cmdDispatch_SetParam (pCmdInterpret->hCmdDispatch, pParam); + CHECK_PENDING_RESULT(res,pParam) break; default: @@ -1269,16 +1275,15 @@ int cmdInterpret_convertAndExecute(TI_HANDLE hCmdInterpret, TConfigCommand *cmdO os_printf ("in_buffer = 0x%x (len = %d)\n",my_command->in_buffer,(unsigned int)my_command->in_buffer_len); os_printf ("out_buffer = 0x%x (len = %d)\n",my_command->out_buffer,(unsigned int)my_command->out_buffer_len); */ - - Param.paramType = my_command->cmd; + + pParam->paramType = my_command->cmd; if (IS_PARAM_ASYNC(my_command->cmd)) { - /* os_printf ("Detected ASYNC command - setting CB \n"); */ - Param.content.interogateCmdCBParams.hCb = (TI_HANDLE)pCmdInterpret; - Param.content.interogateCmdCBParams.fCb = (void*)cmdInterpret_ServiceCompleteCB; - Param.content.interogateCmdCBParams.pCb = my_command->out_buffer; + pParam->content.interogateCmdCBParams.hCb = (TI_HANDLE)pCmdInterpret; + pParam->content.interogateCmdCBParams.fCb = (void*)cmdInterpret_ServiceCompleteCB; + pParam->content.interogateCmdCBParams.pCb = my_command->out_buffer; if (my_command->out_buffer) { /* the next copy is need for PLT commands */ @@ -1287,50 +1292,48 @@ int cmdInterpret_convertAndExecute(TI_HANDLE hCmdInterpret, TConfigCommand *cmdO } else if ((my_command->in_buffer) && (my_command->in_buffer_len)) { - /* this cmd doesnt have the structure allocated as part of the paramInfo_t structure. as a result we need to allocate the memory internally. */ if(IS_ALLOC_NEEDED_PARAM(my_command->cmd)) { - - *(void**)&Param.content = os_memoryAlloc(pCmdInterpret->hOs, my_command->in_buffer_len); - os_memoryCopy(pCmdInterpret->hOs, *(void**)&Param.content, my_command->in_buffer, my_command->in_buffer_len); + *(void **)&pParam->content = os_memoryAlloc(pCmdInterpret->hOs, my_command->in_buffer_len); + os_memoryCopy(pCmdInterpret->hOs, *(void **)&pParam->content, my_command->in_buffer, my_command->in_buffer_len); } else - os_memoryCopy(pCmdInterpret->hOs,&Param.content,my_command->in_buffer,my_command->in_buffer_len); + os_memoryCopy(pCmdInterpret->hOs,&pParam->content,my_command->in_buffer,my_command->in_buffer_len); } if (my_command->flags & PRIVATE_CMD_SET_FLAG) { - Param.paramLength = my_command->in_buffer_len; - res = cmdDispatch_SetParam (pCmdInterpret->hCmdDispatch,&Param); - } + /* os_printf ("Calling setParam\n"); */ + pParam->paramLength = my_command->in_buffer_len; + res = cmdDispatch_SetParam (pCmdInterpret->hCmdDispatch,pParam); + } else if (my_command->flags & PRIVATE_CMD_GET_FLAG) { - /* os_printf ("Calling getParam\n"); */ - Param.paramLength = my_command->out_buffer_len; - res = cmdDispatch_GetParam (pCmdInterpret->hCmdDispatch,&Param); + pParam->paramLength = my_command->out_buffer_len; + res = cmdDispatch_GetParam (pCmdInterpret->hCmdDispatch,pParam); if(res == EXTERNAL_GET_PARAM_DENIED) { cmdObj->return_code = WEXT_INVALID_PARAMETER; - return res; + goto cmd_end; } - /* - this is for cmd that want to check the size of memory that they need to + /* + this is for cmd that want to check the size of memory that they need to allocate for the actual data. */ - if(Param.paramLength && (my_command->out_buffer_len == 0)) + if(pParam->paramLength && (my_command->out_buffer_len == 0)) { - my_command->out_buffer_len = Param.paramLength; + my_command->out_buffer_len = pParam->paramLength; } } else { - res = TI_NOK; + res = TI_NOK; } if (res == TI_OK) @@ -1346,20 +1349,20 @@ int cmdInterpret_convertAndExecute(TI_HANDLE hCmdInterpret, TConfigCommand *cmdO { if(IS_ALLOC_NEEDED_PARAM(my_command->cmd)) { - os_memoryCopy(pCmdInterpret->hOs,my_command->out_buffer,*(void**)&Param.content,my_command->out_buffer_len); + os_memoryCopy(pCmdInterpret->hOs,my_command->out_buffer,*(void **)&pParam->content,my_command->out_buffer_len); } else { - os_memoryCopy(pCmdInterpret->hOs,my_command->out_buffer,&Param.content,my_command->out_buffer_len); - } - } + os_memoryCopy(pCmdInterpret->hOs,my_command->out_buffer,&pParam->content,my_command->out_buffer_len); + } + } } } /* need to free the allocated memory */ if(IS_ALLOC_NEEDED_PARAM(my_command->cmd)) { - os_memoryFree(pCmdInterpret->hOs, *(void**)&Param.content, my_command->in_buffer_len); + os_memoryFree(pCmdInterpret->hOs, *(void **)&pParam->content, my_command->in_buffer_len); } } @@ -1370,13 +1373,12 @@ int cmdInterpret_convertAndExecute(TI_HANDLE hCmdInterpret, TConfigCommand *cmdO } - - if (res == TI_OK) { cmdObj->return_code = WEXT_OK; } - +cmd_end: + os_memoryFree(pCmdInterpret->hOs, pParam, sizeof(paramInfo_t)); /* Return with return code */ return res; @@ -1417,14 +1419,14 @@ static int cmdInterpret_initEvents(TI_HANDLE hCmdInterpret) for (i=0; i<IPC_EVENT_MAX; i++) { - evParams.uDeliveryType = DELIVERY_PUSH; - evParams.uProcessID = 0; - evParams.uEventID = 0; - evParams.hUserParam = hCmdInterpret; - evParams.pfEventCallback = cmdInterpret_Event; - evParams.uEventType = i; + evParams.uDeliveryType = DELIVERY_PUSH; + evParams.uProcessID = 0; + evParams.uEventID = 0; + evParams.hUserParam = hCmdInterpret; + evParams.pfEventCallback = cmdInterpret_Event; + evParams.uEventType = i; EvHandlerRegisterEvent (pCmdInterpret->hEvHandler, (TI_UINT8*) &evParams, sizeof(IPC_EVENT_PARAMS)); - pCmdInterpret->hEvents[i] = evParams.uEventID; + pCmdInterpret->hEvents[i] = evParams.uEventID; } return TI_OK; @@ -1458,10 +1460,9 @@ static TI_INT32 cmdInterpret_Event(IPC_EV_DATA* pData) OS_802_11_ASSOCIATION_INFORMATION *assocInformation; TI_UINT8 *requestIEs; TI_UINT8 *responseIEs; - paramInfo_t Param; union iwreq_data wrqu; char *memptr; - int TotalLength,res; + int TotalLength, res = TI_OK; #ifdef XCC_MODULE_INCLUDED cckm_assocInformation_t cckm_assoc; unsigned char beaconIE[MAX_BEACON_BODY_LENGTH]; @@ -1472,41 +1473,50 @@ static TI_INT32 cmdInterpret_Event(IPC_EV_DATA* pData) /* indicate to the OS */ os_IndicateEvent (pCmdInterpret->hOs, pData); + switch (pData->EvParams.uEventType) { case IPC_EVENT_ASSOCIATED: { + paramInfo_t *pParam; + + pParam = (paramInfo_t *)os_memoryAlloc(pCmdInterpret->hOs, sizeof(paramInfo_t)); + if (!pParam) + return TI_NOK; + /* Get Association information */ /* first check if this is ADHOC or INFRA (to avoid retrieving ASSOC INFO for ADHOC)*/ - Param.paramType = CTRL_DATA_CURRENT_BSS_TYPE_PARAM; - cmdDispatch_GetParam(pCmdInterpret->hCmdDispatch, &Param); - if (Param.content.ctrlDataCurrentBssType == BSS_INFRASTRUCTURE) + pParam->paramType = CTRL_DATA_CURRENT_BSS_TYPE_PARAM; + cmdDispatch_GetParam(pCmdInterpret->hCmdDispatch, pParam); + if (pParam->content.ctrlDataCurrentBssType == BSS_INFRASTRUCTURE) { /* First get length of data */ - Param.paramType = ASSOC_ASSOCIATION_INFORMATION_PARAM; - Param.paramLength = 0; - res = cmdDispatch_GetParam(pCmdInterpret->hCmdDispatch, &Param); + pParam->paramType = ASSOC_ASSOCIATION_INFORMATION_PARAM; + pParam->paramLength = 0; + res = cmdDispatch_GetParam(pCmdInterpret->hCmdDispatch, pParam); if (res != TI_NOK) { - TotalLength = sizeof(OS_802_11_ASSOCIATION_INFORMATION) + Param.content.assocAssociationInformation.RequestIELength + - Param.content.assocAssociationInformation.ResponseIELength; + TotalLength = sizeof(OS_802_11_ASSOCIATION_INFORMATION) + pParam->content.assocAssociationInformation.RequestIELength + + pParam->content.assocAssociationInformation.ResponseIELength; - memptr = os_memoryAlloc (pCmdInterpret->hOs, TotalLength); + memptr = os_memoryAlloc(pCmdInterpret->hOs, TotalLength); - if(!memptr) - return TI_NOK; + if (!memptr) { + res = TI_NOK; + goto event_end; + } /* Get actual data */ - Param.paramType = ASSOC_ASSOCIATION_INFORMATION_PARAM; - Param.paramLength = TotalLength; - cmdDispatch_GetParam(pCmdInterpret->hCmdDispatch, &Param); + pParam->paramType = ASSOC_ASSOCIATION_INFORMATION_PARAM; + pParam->paramLength = TotalLength; + cmdDispatch_GetParam(pCmdInterpret->hCmdDispatch, pParam); - os_memoryCopy(pCmdInterpret->hOs, memptr, &Param.content, TotalLength); + os_memoryCopy(pCmdInterpret->hOs, memptr, &pParam->content, TotalLength); assocInformation = (OS_802_11_ASSOCIATION_INFORMATION*)memptr; requestIEs = (TI_UINT8*)memptr + sizeof(OS_802_11_ASSOCIATION_INFORMATION); @@ -1527,7 +1537,7 @@ static TI_INT32 cmdInterpret_Event(IPC_EV_DATA* pData) wireless_send_event(NETDEV(pCmdInterpret->hOs), IWEVASSOCRESPIE, &wrqu, (char *)responseIEs); } - os_memoryFree (pCmdInterpret->hOs, memptr, TotalLength); + os_memoryFree(pCmdInterpret->hOs, memptr, TotalLength); } } @@ -1540,17 +1550,21 @@ static TI_INT32 cmdInterpret_Event(IPC_EV_DATA* pData) my_current = os_memoryAlloc (pCmdInterpret->hOs,MAX_BEACON_BODY_LENGTH); - Param.paramType = SITE_MGR_GET_SELECTED_BSSID_INFO_EX; - Param.content.pSiteMgrSelectedSiteInfo = my_current; - Param.paramLength = MAX_BEACON_BODY_LENGTH; - cmdDispatch_GetParam(pCmdInterpret->hCmdDispatch, &Param); + if (!my_current) { + res = TI_NOK; + goto event_end; + } + pParam->paramType = SITE_MGR_GET_SELECTED_BSSID_INFO_EX; + pParam->content.pSiteMgrSelectedSiteInfo = my_current; + pParam->paramLength = MAX_BEACON_BODY_LENGTH; + cmdDispatch_GetParam(pCmdInterpret->hCmdDispatch, pParam); - len = Param.content.pSiteMgrSelectedSiteInfo->IELength - BEACON_HEADER_FIX_SIZE; + len = pParam->content.pSiteMgrSelectedSiteInfo->IELength - BEACON_HEADER_FIX_SIZE; n = sprintf(beaconIE, "BEACONIE="); for (i = 0; i < len; i++) { - n += sprintf(beaconIE + n, "%02x", Param.content.pSiteMgrSelectedSiteInfo->IEs[BEACON_HEADER_FIX_SIZE+i] & 0xff); + n += sprintf(beaconIE + n, "%02x", pParam->content.pSiteMgrSelectedSiteInfo->IEs[BEACON_HEADER_FIX_SIZE+i] & 0xff); } os_memorySet (pCmdInterpret->hOs,&wrqu, 0, sizeof(wrqu)); @@ -1565,14 +1579,17 @@ static TI_INT32 cmdInterpret_Event(IPC_EV_DATA* pData) */ - Param.paramType = ASSOC_ASSOCIATION_RESP_PARAM; - Param.paramLength = sizeof(TAssocReqBuffer); - cmdDispatch_GetParam(pCmdInterpret->hCmdDispatch, &Param); + pParam->paramType = ASSOC_ASSOCIATION_RESP_PARAM; + pParam->paramLength = sizeof(TAssocReqBuffer); + cmdDispatch_GetParam(pCmdInterpret->hCmdDispatch, pParam); cckm_assoc.assocRespLen = Param.content.assocReqBuffer.bufferSize - ASSOC_RESP_FIXED_DATA_LEN ; cckm_assoc.assocRespBuffer = os_memoryAlloc (pCmdInterpret->hOs, cckm_assoc.assocRespLen); - - memcpy(cckm_assoc.assocRespBuffer,(Param.content.assocReqBuffer.buffer)+ASSOC_RESP_FIXED_DATA_LEN,cckm_assoc.assocRespLen); + if (!cckm_assoc.assocRespBuffer) { + res = TI_NOK; + goto event_end; + } + memcpy(cckm_assoc.assocRespBuffer,(pParam->content.assocReqBuffer.buffer)+ASSOC_RESP_FIXED_DATA_LEN,cckm_assoc.assocRespLen); wrqu.data.length = cckm_assoc.assocRespLen; wireless_send_event(NETDEV(pCmdInterpret->hOs), IWEVASSOCRESPIE, &wrqu, (TI_UINT8*)cckm_assoc.assocRespBuffer); os_memoryFree(pCmdInterpret->hOs,cckm_assoc.assocRespBuffer,cckm_assoc.assocRespLen); @@ -1581,13 +1598,13 @@ static TI_INT32 cmdInterpret_Event(IPC_EV_DATA* pData) /* Send associated event (containing BSSID of AP) */ os_memorySet (pCmdInterpret->hOs,&wrqu, 0, sizeof(wrqu)); - Param.paramType = SITE_MGR_CURRENT_BSSID_PARAM; - cmdDispatch_GetParam ( pCmdInterpret->hCmdDispatch, &Param ); - MAC_COPY (wrqu.ap_addr.sa_data, Param.content.siteMgrDesiredBSSID); + pParam->paramType = SITE_MGR_CURRENT_BSSID_PARAM; + cmdDispatch_GetParam ( pCmdInterpret->hCmdDispatch, pParam ); + MAC_COPY (wrqu.ap_addr.sa_data, pParam->content.siteMgrDesiredBSSID); wrqu.ap_addr.sa_family = ARPHRD_ETHER; wireless_send_event(NETDEV(pCmdInterpret->hOs), SIOCGIWAP, &wrqu, NULL); - - +event_end: + os_memoryFree(pCmdInterpret->hOs, pParam, sizeof(paramInfo_t)); } break; case IPC_EVENT_DISASSOCIATED: @@ -1604,27 +1621,27 @@ static TI_INT32 cmdInterpret_Event(IPC_EV_DATA* pData) case IPC_EVENT_SCAN_COMPLETE: { - TI_UINT8 *buf; - wrqu.data.length = 0; - wrqu.data.flags = 0; - buf = pData->uBuffer; - - if (*(TI_UINT32*)buf == SCAN_STATUS_COMPLETE) - wireless_send_event(NETDEV(pCmdInterpret->hOs), SIOCGIWSCAN, &wrqu, NULL); - else - { + TI_UINT8 *buf; + wrqu.data.length = 0; + wrqu.data.flags = 0; + buf = pData->uBuffer; + + if (*(TI_UINT32*)buf == SCAN_STATUS_COMPLETE) + wireless_send_event(NETDEV(pCmdInterpret->hOs), SIOCGIWSCAN, &wrqu, NULL); + else + { if (*(TI_UINT32*)buf == SCAN_STATUS_STOPPED) // scan is stopped successfully - pData->EvParams.uEventType = IPC_EVENT_SCAN_STOPPED; + pData->EvParams.uEventType = IPC_EVENT_SCAN_STOPPED; else if (*(TI_UINT32*)buf == SCAN_STATUS_FAILED) // scan is stopped successfully - pData->EvParams.uEventType = IPC_EVENT_SCAN_FAILED; - else - break; - - os_memorySet (pCmdInterpret->hOs,&wrqu, 0, sizeof(wrqu)); - wrqu.data.length = sizeof(IPC_EV_DATA); - wireless_send_event(NETDEV(pCmdInterpret->hOs), IWEVCUSTOM, &wrqu, (u8 *)pData); - } - } + pData->EvParams.uEventType = IPC_EVENT_SCAN_FAILED; + else + break; + + os_memorySet (pCmdInterpret->hOs,&wrqu, 0, sizeof(wrqu)); + wrqu.data.length = sizeof(IPC_EV_DATA); + wireless_send_event(NETDEV(pCmdInterpret->hOs), IWEVCUSTOM, &wrqu, (u8 *)pData); + } + } break; case IPC_EVENT_MEDIA_SPECIFIC: @@ -1712,11 +1729,11 @@ static TI_INT32 cmdInterpret_Event(IPC_EV_DATA* pData) wrqu.data.length = sizeof(IPC_EV_DATA); wireless_send_event(NETDEV(pCmdInterpret->hOs), IWEVCUSTOM, &wrqu, (TI_UINT8 *)pData); } - + break; } - return TI_OK; + return res; } @@ -1724,9 +1741,9 @@ static TI_INT32 cmdInterpret_Event(IPC_EV_DATA* pData) static int cmdInterpret_setSecurityParams (TI_HANDLE hCmdInterpret) { cmdInterpret_t *pCmdInterpret = (cmdInterpret_t *)hCmdInterpret; - paramInfo_t Param; + paramInfo_t *pParam; int auth_mode, encr_mode; - + /* printk ("wpa_version=0x%x auth_alg=0x%x key_mgmt=0x%x " "cipher_pairwise=0x%x cipher_group=0x%x\n", @@ -1734,6 +1751,9 @@ static int cmdInterpret_setSecurityParams (TI_HANDLE hCmdInterpret) pCmdInterpret->wai.iw_auth_key_mgmt, pCmdInterpret->wai.iw_auth_cipher_pairwise, pCmdInterpret->wai.iw_auth_cipher_group); */ + pParam = (paramInfo_t *)os_memoryAlloc(pCmdInterpret->hOs, sizeof(paramInfo_t)); + if (!pParam) + return TI_NOK; if (pCmdInterpret->wai.iw_auth_wpa_version & IW_AUTH_WPA_VERSION_WPA2) { if (pCmdInterpret->wai.iw_auth_key_mgmt & IW_AUTH_KEY_MGMT_802_1X) @@ -1789,14 +1809,14 @@ static int cmdInterpret_setSecurityParams (TI_HANDLE hCmdInterpret) break; } - Param.paramType = RSN_EXT_AUTHENTICATION_MODE; - Param.content.rsnExtAuthneticationMode = auth_mode; - cmdDispatch_SetParam ( pCmdInterpret->hCmdDispatch, &Param ); - - Param.paramType = RSN_ENCRYPTION_STATUS_PARAM; - Param.content.rsnEncryptionStatus = encr_mode; - cmdDispatch_SetParam ( pCmdInterpret->hCmdDispatch, &Param ); + pParam->paramType = RSN_EXT_AUTHENTICATION_MODE; + pParam->content.rsnExtAuthneticationMode = auth_mode; + cmdDispatch_SetParam ( pCmdInterpret->hCmdDispatch, pParam ); + pParam->paramType = RSN_ENCRYPTION_STATUS_PARAM; + pParam->content.rsnEncryptionStatus = encr_mode; + cmdDispatch_SetParam ( pCmdInterpret->hCmdDispatch, pParam ); + os_memoryFree(pCmdInterpret->hOs, pParam, sizeof(paramInfo_t)); return TI_OK; } @@ -1804,42 +1824,42 @@ static int cmdInterpret_setSecurityParams (TI_HANDLE hCmdInterpret) void *cmdInterpret_GetStat (TI_HANDLE hCmdInterpret) { cmdInterpret_t *pCmdInterpret = (cmdInterpret_t *)hCmdInterpret; - paramInfo_t Param; - TI_STATUS res = TI_NOK; /* Check if driver is initialized - If not - return empty statistics */ if (hCmdInterpret) { - Param.paramType = SITE_MGR_GET_STATS; - res = cmdDispatch_GetParam ( pCmdInterpret->hCmdDispatch, &Param ); + paramInfo_t *pParam; + TI_STATUS res; - CHECK_PENDING_RESULT_RET(res, Param); + pParam = (paramInfo_t *)os_memoryAlloc(pCmdInterpret->hOs, sizeof(paramInfo_t)); + if (!pParam) + return NULL; - if (res == TI_OK) - { - pCmdInterpret->wstats.qual.level = (TI_UINT8)Param.content.siteMgrCurrentRssi; - pCmdInterpret->wstats.qual.updated = IW_QUAL_LEVEL_UPDATED | IW_QUAL_QUAL_UPDATED | IW_QUAL_NOISE_INVALID | IW_QUAL_DBM; + pParam->paramType = SITE_MGR_GET_STATS; + res = cmdDispatch_GetParam ( pCmdInterpret->hCmdDispatch, pParam ); - } - else - { - pCmdInterpret->wstats.qual.level = 0; - pCmdInterpret->wstats.qual.updated = IW_QUAL_ALL_INVALID; - } + if (res == TI_OK) + { + pCmdInterpret->wstats.qual.level = (TI_UINT8)pParam->content.siteMgrCurrentRssi; + pCmdInterpret->wstats.qual.updated = IW_QUAL_LEVEL_UPDATED | IW_QUAL_QUAL_UPDATED | IW_QUAL_NOISE_INVALID | IW_QUAL_DBM; + } + else + { + pCmdInterpret->wstats.qual.level = 0; + pCmdInterpret->wstats.qual.updated = IW_QUAL_ALL_INVALID; + } pCmdInterpret->wstats.qual.noise = 0; - pCmdInterpret->wstats.qual.qual = 0; - pCmdInterpret->wstats.status = 0; - pCmdInterpret->wstats.miss.beacon = 0; - pCmdInterpret->wstats.discard.retries = 0; /* Tx : Max MAC retries num reached */ - pCmdInterpret->wstats.discard.nwid = 0; /* Rx : Wrong nwid/essid */ - pCmdInterpret->wstats.discard.code = 0; /* Rx : Unable to code/decode (WEP) */ - pCmdInterpret->wstats.discard.fragment = 0; /* Rx : Can't perform MAC reassembly */ - pCmdInterpret->wstats.discard.misc = 0; /* Others cases */ - + pCmdInterpret->wstats.qual.qual = 0; + pCmdInterpret->wstats.status = 0; + pCmdInterpret->wstats.miss.beacon = 0; + pCmdInterpret->wstats.discard.retries = 0; /* Tx : Max MAC retries num reached */ + pCmdInterpret->wstats.discard.nwid = 0; /* Rx : Wrong nwid/essid */ + pCmdInterpret->wstats.discard.code = 0; /* Rx : Unable to code/decode (WEP) */ + pCmdInterpret->wstats.discard.fragment = 0; /* Rx : Can't perform MAC reassembly */ + pCmdInterpret->wstats.discard.misc = 0; /* Others cases */ + os_memoryFree(pCmdInterpret->hOs, pParam, sizeof(paramInfo_t)); return &pCmdInterpret->wstats; } return (void *)NULL; } - - diff --git a/wl1271/platforms/os/linux/src/RxBuf.c b/wl1271/platforms/os/linux/src/RxBuf.c index 58481ac1..61972928 100644 --- a/wl1271/platforms/os/linux/src/RxBuf.c +++ b/wl1271/platforms/os/linux/src/RxBuf.c @@ -46,20 +46,18 @@ * Allocate BUF Rx packets. * Add 16 bytes before the data buffer for WSPI overhead! */ -void* RxBufAlloc(TI_HANDLE hOs, TI_UINT32 len,PacketClassTag_e ePacketClassTag) +void *RxBufAlloc(TI_HANDLE hOs, TI_UINT32 len,PacketClassTag_e ePacketClassTag) { - rx_head_t *rx_head; - TI_UINT32 alloc_len = len + WSPI_PAD_BYTES + PAYLOAD_ALIGN_PAD_BYTES + RX_HEAD_LEN_ALIGNED; - struct sk_buff *skb = alloc_skb (alloc_len, GFP_ATOMIC); - - if(skb == NULL){ - printk("RxBufAlloc(): alloc_skb failed\n"); - return NULL; - } - rx_head = (rx_head_t *)skb->head; + TI_UINT32 alloc_len = len + WSPI_PAD_BYTES + PAYLOAD_ALIGN_PAD_BYTES + RX_HEAD_LEN_ALIGNED; + struct sk_buff *skb; + rx_head_t *rx_head; + skb = alloc_skb(alloc_len, GFP_ATOMIC); + if (!skb) + return NULL; + rx_head = (rx_head_t *)skb->head; rx_head->skb = skb; - skb_reserve(skb, RX_HEAD_LEN_ALIGNED+WSPI_PAD_BYTES); + skb_reserve(skb, RX_HEAD_LEN_ALIGNED + WSPI_PAD_BYTES); /* printk("-->> RxBufAlloc(len=%d) skb=0x%x skb->data=0x%x skb->head=0x%x skb->len=%d\n", (int)len, (int)skb, (int)skb->data, (int)skb->head, (int)skb->len); @@ -70,28 +68,27 @@ void* RxBufAlloc(TI_HANDLE hOs, TI_UINT32 len,PacketClassTag_e ePacketClassTag) /*--------------------------------------------------------------------------------------*/ -inline void RxBufFree(TI_HANDLE hOs, void* pBuf) +inline void RxBufFree(TI_HANDLE hOs, void *pBuf) { - unsigned char *pdata = (unsigned char *)((TI_UINT32)pBuf & ~(TI_UINT32)0x3); + unsigned char *pdata = (unsigned char *)((TI_UINT32)pBuf & ~(TI_UINT32)0x3); rx_head_t *rx_head = (rx_head_t *)(pdata - WSPI_PAD_BYTES - RX_HEAD_LEN_ALIGNED); struct sk_buff *skb = rx_head->skb; - #ifdef TI_DBG - if ((TI_UINT32)pBuf & 0x3) - { - if ((TI_UINT32)pBuf - (TI_UINT32)skb->data != 2) - { - printk("RxBufFree() address error skb=0x%x skb->data=0x%x pPacket=0x%x !!!\n",(int)skb, (int)skb->data, (int)pBuf); - } - } - else - { - if ((TI_UINT32)skb->data != (TI_UINT32)pBuf) - { - printk("RxBufFree() address error skb=0x%x skb->data=0x%x pPacket=0x%x !!!\n",(int)skb, (int)skb->data, (int)pBuf); - } - } + if ((TI_UINT32)pBuf & 0x3) + { + if ((TI_UINT32)pBuf - (TI_UINT32)skb->data != 2) + { + printk("RxBufFree() address error skb=0x%x skb->data=0x%x pPacket=0x%x !!!\n",(int)skb, (int)skb->data, (int)pBuf); + } + } + else + { + if ((TI_UINT32)skb->data != (TI_UINT32)pBuf) + { + printk("RxBufFree() address error skb=0x%x skb->data=0x%x pPacket=0x%x !!!\n",(int)skb, (int)skb->data, (int)pBuf); + } + } #endif /* printk("-->> RxBufFree() skb=0x%x skb->data=0x%x skb->head=0x%x skb->len=%d\n", @@ -99,7 +96,3 @@ inline void RxBufFree(TI_HANDLE hOs, void* pBuf) */ dev_kfree_skb(skb); } - - - - diff --git a/wl1271/platforms/os/linux/src/WlanDrvIf.c b/wl1271/platforms/os/linux/src/WlanDrvIf.c index c0803a4f..ab322c7b 100644 --- a/wl1271/platforms/os/linux/src/WlanDrvIf.c +++ b/wl1271/platforms/os/linux/src/WlanDrvIf.c @@ -55,8 +55,6 @@ #include <linux/etherdevice.h> #include <linux/delay.h> #include <linux/netlink.h> -#include <linux/version.h> - #include "WlanDrvIf.h" #include "osApi.h" @@ -73,12 +71,15 @@ #include "tracebuf_api.h" #endif /* PM hooks */ -#ifdef CONFIG_PM +#ifdef TI_CONFIG_PM_HOOKS #include "SdioDrv.h" static int wlanDrvIf_pm_resume(void); static int wlanDrvIf_pm_suspend(void); #endif #include "bmtrace_api.h" +#ifdef STACK_PROFILE +#include "stack_profile.h" +#endif /* save driver handle just for module cleanup */ static TWlanDrvIfObj *pDrvStaticHandle; @@ -89,9 +90,30 @@ static TWlanDrvIfObj *pDrvStaticHandle; MODULE_DESCRIPTION("TI WLAN Embedded Station Driver"); MODULE_LICENSE("GPL"); -/* linux/irq.h declarations */ -extern void disable_irq(unsigned int); +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 31)) +static int wlanDrvIf_Xmit(struct sk_buff *skb, struct net_device *dev); +static int wlanDrvIf_XmitDummy(struct sk_buff *skb, struct net_device *dev); +static struct net_device_stats *wlanDrvIf_NetGetStat(struct net_device *dev); +int wlanDrvIf_Open(struct net_device *dev); +int wlanDrvIf_Release(struct net_device *dev); + +static struct net_device_ops tiwlan_ops_pri = { + .ndo_open = wlanDrvIf_Open, + .ndo_stop = wlanDrvIf_Release, + .ndo_get_stats = wlanDrvIf_NetGetStat, + .ndo_do_ioctl = NULL, + .ndo_start_xmit = wlanDrvIf_Xmit, +}; + +static struct net_device_ops tiwlan_ops_dummy = { + .ndo_open = wlanDrvIf_Open, + .ndo_stop = wlanDrvIf_Release, + .ndo_get_stats = wlanDrvIf_NetGetStat, + .ndo_do_ioctl = NULL, + .ndo_start_xmit = wlanDrvIf_XmitDummy, +}; +#endif /** * \fn wlanDrvIf_Xmit @@ -110,43 +132,43 @@ extern void disable_irq(unsigned int); */ static int wlanDrvIf_Xmit (struct sk_buff *skb, struct net_device *dev) { - TWlanDrvIfObj *drv = (TWlanDrvIfObj *)NETDEV_GET_PRIVATE(dev); - TTxCtrlBlk * pPktCtrlBlk; - int status; + TWlanDrvIfObj *drv = (TWlanDrvIfObj *)NETDEV_GET_PRIVATE(dev); + TTxCtrlBlk * pPktCtrlBlk; + int status; - CL_TRACE_START_L1(); + CL_TRACE_START_L1(); - os_profile (drv, 0, 0); - drv->stats.tx_packets++; - drv->stats.tx_bytes += skb->len; + os_profile (drv, 0, 0); + drv->stats.tx_packets++; + drv->stats.tx_bytes += skb->len; - /* Allocate a TxCtrlBlk for the Tx packet and save timestamp, length and packet handle */ - pPktCtrlBlk = TWD_txCtrlBlk_Alloc (drv->tCommon.hTWD); + /* Allocate a TxCtrlBlk for the Tx packet and save timestamp, length and packet handle */ + pPktCtrlBlk = TWD_txCtrlBlk_Alloc (drv->tCommon.hTWD); - pPktCtrlBlk->tTxDescriptor.startTime = os_timeStampMs(drv); /* remove use of skb->tstamp.off_usec */ - pPktCtrlBlk->tTxDescriptor.length = skb->len; - pPktCtrlBlk->tTxPktParams.pInputPkt = skb; + pPktCtrlBlk->tTxDescriptor.startTime = os_timeStampMs(drv); /* remove use of skb->tstamp.off_usec */ + pPktCtrlBlk->tTxDescriptor.length = skb->len; + pPktCtrlBlk->tTxPktParams.pInputPkt = skb; - /* Point the first BDL buffer to the Ethernet header, and the second buffer to the rest of the packet */ - pPktCtrlBlk->tTxnStruct.aBuf[0] = skb->data; - pPktCtrlBlk->tTxnStruct.aLen[0] = ETHERNET_HDR_LEN; - pPktCtrlBlk->tTxnStruct.aBuf[1] = skb->data + ETHERNET_HDR_LEN; - pPktCtrlBlk->tTxnStruct.aLen[1] = (TI_UINT16)skb->len - ETHERNET_HDR_LEN; - pPktCtrlBlk->tTxnStruct.aLen[2] = 0; + /* Point the first BDL buffer to the Ethernet header, and the second buffer to the rest of the packet */ + pPktCtrlBlk->tTxnStruct.aBuf[0] = skb->data; + pPktCtrlBlk->tTxnStruct.aLen[0] = ETHERNET_HDR_LEN; + pPktCtrlBlk->tTxnStruct.aBuf[1] = skb->data + ETHERNET_HDR_LEN; + pPktCtrlBlk->tTxnStruct.aLen[1] = (TI_UINT16)skb->len - ETHERNET_HDR_LEN; + pPktCtrlBlk->tTxnStruct.aLen[2] = 0; - /* Send the packet to the driver for transmission. */ - status = txDataQ_InsertPacket (drv->tCommon.hTxDataQ, pPktCtrlBlk,(TI_UINT8)skb->priority); + /* Send the packet to the driver for transmission. */ + status = txDataQ_InsertPacket (drv->tCommon.hTxDataQ, pPktCtrlBlk,(TI_UINT8)skb->priority); - /* If failed (queue full or driver not running), drop the packet. */ + /* If failed (queue full or driver not running), drop the packet. */ if (status != TI_OK) { drv->stats.tx_errors++; } - os_profile (drv, 1, 0); + os_profile (drv, 1, 0); - CL_TRACE_END_L1("tiwlan_drv.ko", "OS", "TX", ""); + CL_TRACE_END_L1("tiwlan_drv.ko", "OS", "TX", ""); - return 0; + return 0; } /*--------------------------------------------------------------------------------------*/ /** @@ -186,8 +208,8 @@ void wlanDrvIf_FreeTxPacket (TI_HANDLE hOs, TTxCtrlBlk *pPktCtrlBlk, TI_STATUS e */ static int wlanDrvIf_XmitDummy (struct sk_buff *skb, struct net_device *dev) { - /* Just return error. The driver is not running (network stack frees the packet) */ - return -ENODEV; + /* Just return error. The driver is not running (network stack frees the packet) */ + return -ENODEV; } @@ -204,10 +226,10 @@ static int wlanDrvIf_XmitDummy (struct sk_buff *skb, struct net_device *dev) */ static struct net_device_stats *wlanDrvIf_NetGetStat (struct net_device *dev) { - TWlanDrvIfObj *drv = (TWlanDrvIfObj *)NETDEV_GET_PRIVATE(dev); - ti_dprintf (TIWLAN_LOG_OTHER, "wlanDrvIf_NetGetStat()\n"); - - return &drv->stats; + TWlanDrvIfObj *drv = (TWlanDrvIfObj *)NETDEV_GET_PRIVATE(dev); + ti_dprintf (TIWLAN_LOG_OTHER, "wlanDrvIf_NetGetStat()\n"); + + return &drv->stats; } @@ -226,18 +248,21 @@ static struct net_device_stats *wlanDrvIf_NetGetStat (struct net_device *dev) */ void wlanDrvIf_UpdateDriverState (TI_HANDLE hOs, EDriverSteadyState eDriverState) { - TWlanDrvIfObj *drv = (TWlanDrvIfObj *)hOs; + TWlanDrvIfObj *drv = (TWlanDrvIfObj *)hOs; - ti_dprintf(TIWLAN_LOG_OTHER, "wlanDrvIf_UpdateDriverState(): State = %d\n", eDriverState); + ti_dprintf(TIWLAN_LOG_OTHER, "wlanDrvIf_UpdateDriverState(): State = %d\n", eDriverState); - /* Save the new state */ - drv->tCommon.eDriverState = eDriverState; + /* Save the new state */ + drv->tCommon.eDriverState = eDriverState; - /* If the new state is not RUNNING, replace the Tx handler to a dummy one. */ - if (eDriverState != DRV_STATE_RUNNING) - { - drv->netdev->hard_start_xmit = wlanDrvIf_XmitDummy; - } + /* If the new state is not RUNNING, replace the Tx handler to a dummy one. */ + if (eDriverState != DRV_STATE_RUNNING) { +#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 31)) + drv->netdev->hard_start_xmit = wlanDrvIf_XmitDummy; +#else + drv->netdev->netdev_ops = &tiwlan_ops_dummy; +#endif + } } @@ -257,11 +282,11 @@ void wlanDrvIf_UpdateDriverState (TI_HANDLE hOs, EDriverSteadyState eDriverState */ irqreturn_t wlanDrvIf_HandleInterrupt (int irq, void *hDrv, struct pt_regs *cpu_regs) { - TWlanDrvIfObj *drv = (TWlanDrvIfObj *)hDrv; + TWlanDrvIfObj *drv = (TWlanDrvIfObj *)hDrv; - TWD_InterruptRequest (drv->tCommon.hTWD); + TWD_InterruptRequest (drv->tCommon.hTWD); - return IRQ_HANDLED; + return IRQ_HANDLED; } @@ -280,10 +305,10 @@ irqreturn_t wlanDrvIf_HandleInterrupt (int irq, void *hDrv, struct pt_regs *cpu_ #ifdef PRIODIC_INTERRUPT static void wlanDrvIf_PollIrqHandler (TI_HANDLE parm) { - TWlanDrvIfObj *drv = (TWlanDrvIfObj *)parm; + TWlanDrvIfObj *drv = (TWlanDrvIfObj *)parm; - wlanDrvIf_HandleInterrupt (0, drv, NULL); - os_periodicIntrTimerStart (drv); + wlanDrvIf_HandleInterrupt (0, drv, NULL); + os_periodicIntrTimerStart (drv); } #endif @@ -301,54 +326,51 @@ static void wlanDrvIf_PollIrqHandler (TI_HANDLE parm) * \param hDrv - The driver object handle * \return void * \sa - */ + */ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23) static void wlanDrvIf_DriverTask (void *hDrv) { - TWlanDrvIfObj *drv = (TWlanDrvIfObj *)hDrv; + TWlanDrvIfObj *drv = (TWlanDrvIfObj *)hDrv; #else static void wlanDrvIf_DriverTask(struct work_struct *work) { - TWlanDrvIfObj *drv = container_of(work, TWlanDrvIfObj, tWork); +#ifdef STACK_PROFILE + register unsigned long sp asm ("sp"); + unsigned long local_sp = sp; +#endif + TWlanDrvIfObj *drv = container_of(work, TWlanDrvIfObj, tWork); #endif #ifdef STACK_PROFILE - unsigned int curr1,base1; - unsigned int curr2,base2; - static unsigned int maximum_stack = 0; + unsigned long curr1, base1; + unsigned long curr2, base2; + static unsigned long maximum_stack = 0; #endif - - - os_profile (drv, 0, 0); + os_profile (drv, 0, 0); #ifdef STACK_PROFILE - curr1 = check_stack_start(&base1); + curr1 = check_stack_start(&base1, local_sp + 4, 0); #endif + /* Call the driver main task */ + context_DriverTask (drv->tCommon.hContext); - /* Call the driver main task */ - context_DriverTask (drv->tCommon.hContext); - - os_wake_lock_timeout(drv); - os_wake_unlock(drv); - + os_profile (drv, 1, 0); + os_wake_lock_timeout(drv); + os_wake_unlock(drv); #ifdef STACK_PROFILE - curr2 = check_stack_stop(&base2); - if (base2 == base1) - { - /* if the current measurement is bigger then the maximum store it and print*/ - if ((curr1 - curr2) > maximum_stack) - { - printk("STACK PROFILER GOT THE LOCAL MAXIMMUM!!!! \n"); - printk("current operation stack use =%d \n",(curr1 - curr2)); - printk("total stack use=%d \n",8192 - curr2 + base2); - printk("total stack usage= %d percent \n",100 * (8192 - curr2 + base2) / 8192); + curr2 = check_stack_stop(&base2, 0); + if (base2 == base1) { + /* if the current measurement is bigger then the maximum store it and print*/ + if ((curr1 - curr2) > maximum_stack) { + printk("STACK PROFILER GOT THE LOCAL MAXIMMUM!!!! \n"); + printk("current operation stack use=%lu \n",(curr1 - curr2)); + printk("total stack use=%lu \n",8192 - curr2 + base2); + printk("total stack usage=%lu percent \n",100 * (8192 - curr2 + base2) / 8192); maximum_stack = curr1 - curr2; - } - } + } + } #endif - - os_profile (drv, 1, 0); } @@ -404,7 +426,7 @@ int wlanDrvIf_LoadFiles (TWlanDrvIfObj *drv, TLoaderFilesData *pInitFiles) drv->tCommon.tNvsImage.uSize = pInitFiles->uNvsFileLength; drv->tCommon.tNvsImage.pImage = kmalloc (drv->tCommon.tNvsImage.uSize, GFP_KERNEL); #ifdef TI_MEM_ALLOC_TRACE - os_printf ("MTT:%s:%d ::kmalloc(%lu, %x) : %lu\n", + os_printf ("MTT:%s:%d ::kmalloc(%lu, %x) : %lu\n", __FUNCTION__, __LINE__, drv->tCommon.tNvsImage.uSize, GFP_KERNEL, drv->tCommon.tNvsImage.uSize); #endif if (!drv->tCommon.tNvsImage.pImage) @@ -423,7 +445,7 @@ int wlanDrvIf_LoadFiles (TWlanDrvIfObj *drv, TLoaderFilesData *pInitFiles) } drv->tCommon.tFwImage.pImage = os_memoryAlloc (drv, drv->tCommon.tFwImage.uSize); #ifdef TI_MEM_ALLOC_TRACE - os_printf ("MTT:%s:%d ::kmalloc(%lu, %x) : %lu\n", + os_printf ("MTT:%s:%d ::kmalloc(%lu, %x) : %lu\n", __FUNCTION__, __LINE__, drv->tCommon.tFwImage.uSize, GFP_KERNEL, drv->tCommon.tFwImage.uSize); #endif if (!drv->tCommon.tFwImage.pImage) @@ -581,10 +603,10 @@ int wlanDrvIf_GetFile (TI_HANDLE hOs, TFileInfo *pFileInfo) */ void wlanDrvIf_SetMacAddress (TI_HANDLE hOs, TI_UINT8 *pMacAddr) { - TWlanDrvIfObj *drv = (TWlanDrvIfObj *)hOs; + TWlanDrvIfObj *drv = (TWlanDrvIfObj *)hOs; - /* Copy STA MAC address to the network interface structure */ - MAC_COPY (drv->netdev->dev_addr, pMacAddr); + /* Copy STA MAC address to the network interface structure */ + MAC_COPY (drv->netdev->dev_addr, pMacAddr); } @@ -603,57 +625,58 @@ void wlanDrvIf_SetMacAddress (TI_HANDLE hOs, TI_UINT8 *pMacAddr) */ int wlanDrvIf_Start (struct net_device *dev) { - TWlanDrvIfObj *drv = (TWlanDrvIfObj *)NETDEV_GET_PRIVATE(dev); - - ti_dprintf (TIWLAN_LOG_OTHER, "wlanDrvIf_Start()\n"); - - if (!drv->tCommon.hDrvMain) - { - ti_dprintf (TIWLAN_LOG_ERROR, "wlanDrvIf_Start() Driver not created!\n"); - return -ENODEV; - } + TWlanDrvIfObj *drv = (TWlanDrvIfObj *)NETDEV_GET_PRIVATE(dev); + ti_dprintf (TIWLAN_LOG_OTHER, "wlanDrvIf_Start()\n"); + printk("%s\n", __func__); + if (!drv->tCommon.hDrvMain) { + ti_dprintf (TIWLAN_LOG_ERROR, "wlanDrvIf_Start() Driver not created!\n"); + return -ENODEV; + } - /* - * Insert Start command in DrvMain action queue, request driver scheduling - * and wait for action completion (all init process). - */ - os_wake_lock_timeout_enable(drv); - drvMain_InsertAction (drv->tCommon.hDrvMain, ACTION_TYPE_START); - - return 0; + /* + * Insert Start command in DrvMain action queue, request driver scheduling + * and wait for action completion (all init process). + */ + os_wake_lock_timeout_enable(drv); + drvMain_InsertAction (drv->tCommon.hDrvMain, ACTION_TYPE_START); + return 0; } int wlanDrvIf_Open (struct net_device *dev) { - TWlanDrvIfObj *drv = (TWlanDrvIfObj *)NETDEV_GET_PRIVATE(dev); - - ti_dprintf (TIWLAN_LOG_OTHER, "wlanDrvIf_Open()\n"); + TWlanDrvIfObj *drv = (TWlanDrvIfObj *)NETDEV_GET_PRIVATE(dev); - if (!drv->tCommon.hDrvMain) - { - ti_dprintf (TIWLAN_LOG_ERROR, "wlanDrvIf_Open() Driver not created!\n"); - return -ENODEV; - } + ti_dprintf (TIWLAN_LOG_OTHER, "wlanDrvIf_Open()\n"); + printk("%s\n", __func__); + if (!drv->tCommon.hDrvMain) { + ti_dprintf (TIWLAN_LOG_ERROR, "wlanDrvIf_Open() Driver not created!\n"); + return -ENODEV; + } if (drv->tCommon.eDriverState == DRV_STATE_STOPPED || drv->tCommon.eDriverState == DRV_STATE_IDLE) { wlanDrvIf_Start(dev); } - /* - * Finalize network interface setup - */ - drv->netdev->hard_start_xmit = wlanDrvIf_Xmit; - drv->netdev->addr_len = MAC_ADDR_LEN; - netif_start_queue (dev); - - /* register 3430 PM hooks in our SDIO driver */ -#ifdef CONFIG_PM - sdioDrv_register_pm(wlanDrvIf_pm_resume, wlanDrvIf_pm_suspend); + /* + * Finalize network interface setup + */ +#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 31)) + drv->netdev->hard_start_xmit = wlanDrvIf_Xmit; +#else + drv->netdev->netdev_ops = &tiwlan_ops_pri; #endif + drv->netdev->addr_len = MAC_ADDR_LEN; + netif_start_queue (dev); - return 0; + /* register 3430 PM hooks in our SDIO driver */ +#ifdef TI_CONFIG_PM_HOOKS +#ifndef CONFIG_MMC_EMBEDDED_SDIO + sdioDrv_register_pm(wlanDrvIf_pm_resume, wlanDrvIf_pm_suspend); +#endif +#endif + return 0; } /** @@ -671,31 +694,32 @@ int wlanDrvIf_Open (struct net_device *dev) */ int wlanDrvIf_Stop (struct net_device *dev) { - TWlanDrvIfObj *drv = (TWlanDrvIfObj *)NETDEV_GET_PRIVATE(dev); - - ti_dprintf (TIWLAN_LOG_OTHER, "wlanDrvIf_Stop()\n"); - - /* - * Insert Stop command in DrvMain action queue, request driver scheduling - * and wait for Stop process completion. - */ - os_wake_lock_timeout_enable(drv); - drvMain_InsertAction (drv->tCommon.hDrvMain, ACTION_TYPE_STOP); - - return 0; + TWlanDrvIfObj *drv = (TWlanDrvIfObj *)NETDEV_GET_PRIVATE(dev); + + ti_dprintf (TIWLAN_LOG_OTHER, "wlanDrvIf_Stop()\n"); + printk("%s\n", __func__); + /* + * Insert Stop command in DrvMain action queue, request driver scheduling + * and wait for Stop process completion. + */ + os_wake_lock_timeout_enable(drv); + drvMain_InsertAction (drv->tCommon.hDrvMain, ACTION_TYPE_STOP); + return 0; } int wlanDrvIf_Release (struct net_device *dev) { - ti_dprintf (TIWLAN_LOG_OTHER, "wlanDrvIf_Release()\n"); + /* TWlanDrvIfObj *drv = (TWlanDrvIfObj *)NETDEV_GET_PRIVATE(dev); */ - /* Disable network interface queue */ - netif_stop_queue (dev); - return 0; + ti_dprintf (TIWLAN_LOG_OTHER, "wlanDrvIf_Release()\n"); + printk("%s\n", __func__); + /* Disable network interface queue */ + netif_stop_queue (dev); + return 0; } /* 3430 PM hooks */ -#ifdef CONFIG_PM +#ifdef TI_CONFIG_PM_HOOKS static int wlanDrvIf_pm_resume(void) { return(wlanDrvIf_Open(pDrvStaticHandle->netdev)); @@ -722,57 +746,56 @@ static int wlanDrvIf_pm_suspend(void) */ static int wlanDrvIf_SetupNetif (TWlanDrvIfObj *drv) { - struct net_device *dev; - int res; - - /* Allocate network interface structure for the driver */ - dev = alloc_etherdev (0); - if (dev == NULL) - { - ti_dprintf (TIWLAN_LOG_ERROR, "alloc_etherdev() failed\n"); - return -ENOMEM; - } + struct net_device *dev; + int res; + + /* Allocate network interface structure for the driver */ + dev = alloc_etherdev (0); + if (dev == NULL) { + ti_dprintf (TIWLAN_LOG_ERROR, "alloc_etherdev() failed\n"); + return -ENOMEM; + } - /* Setup the network interface */ - ether_setup (dev); + /* Setup the network interface */ + ether_setup (dev); + NETDEV_SET_PRIVATE(dev,drv); + drv->netdev = dev; + strcpy (dev->name, TIWLAN_DRV_IF_NAME); + netif_carrier_off (dev); +#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 31)) /* the following is required on at least BSP 23.8 and higher. Without it, the Open function of the driver will not be called when trying to 'ifconfig up' the interface */ #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,23) - dev->validate_addr = NULL; + dev->validate_addr = NULL; +#endif + dev->open = wlanDrvIf_Open; + dev->stop = wlanDrvIf_Release; + dev->hard_start_xmit = wlanDrvIf_XmitDummy; + dev->get_stats = wlanDrvIf_NetGetStat; + dev->do_ioctl = NULL; +#else + dev->netdev_ops = &tiwlan_ops_dummy; #endif + dev->tx_queue_len = 100; - NETDEV_SET_PRIVATE(dev,drv); - drv->netdev = dev; - strcpy (dev->name, TIWLAN_DRV_IF_NAME); - netif_carrier_off (dev); - dev->open = wlanDrvIf_Open; - dev->stop = wlanDrvIf_Release; - dev->hard_start_xmit = wlanDrvIf_XmitDummy; - dev->get_stats = wlanDrvIf_NetGetStat; - dev->tx_queue_len = 100; - dev->do_ioctl = NULL; - - /* Initialize Wireless Extensions interface (WEXT) */ - wlanDrvWext_Init (dev); - - res = register_netdev (dev); - if (res != 0) - { - ti_dprintf (TIWLAN_LOG_ERROR, "register_netdev() failed : %d\n", res); - kfree (dev); - return res; - } + /* Initialize Wireless Extensions interface (WEXT) */ + wlanDrvWext_Init (dev); + res = register_netdev (dev); + if (res != 0) { + ti_dprintf (TIWLAN_LOG_ERROR, "register_netdev() failed : %d\n", res); + kfree (dev); + return res; + } /* On the latest Kernel there is no more support for the below macro. */ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) - SET_MODULE_OWNER (dev); + SET_MODULE_OWNER (dev); #endif - - return 0; + return 0; } /** @@ -790,8 +813,8 @@ On the latest Kernel there is no more support for the below macro. */ void wlanDrvIf_CommandDone (TI_HANDLE hOs, void *pSignalObject, TI_UINT8 *CmdResp_p) { - /* Free semaphore */ - os_SignalObjectSet (hOs, pSignalObject); + /* Free semaphore */ + os_SignalObjectSet (hOs, pSignalObject); } @@ -811,98 +834,124 @@ void wlanDrvIf_CommandDone (TI_HANDLE hOs, void *pSignalObject, TI_UINT8 *CmdRes */ static int wlanDrvIf_Create (void) { - TWlanDrvIfObj *drv; - int rc; + TWlanDrvIfObj *drv; /* Dm: Failure is not cleaned properly !!! */ + int rc; - /* Allocate driver's structure */ - drv = kmalloc (sizeof(TWlanDrvIfObj), GFP_KERNEL); - if (!drv) - { - return -ENOMEM; - } + /* Allocate driver's structure */ + drv = kmalloc (sizeof(TWlanDrvIfObj), GFP_KERNEL); + if (!drv) { + return -ENOMEM; + } #ifdef TI_DBG tb_init(TB_OPTION_NONE); #endif - pDrvStaticHandle = drv; /* save for module destroy */ - #ifdef TI_MEM_ALLOC_TRACE - os_printf ("MTT:%s:%d ::kmalloc(%lu, %x) : %lu\n", __FUNCTION__, __LINE__, sizeof(TWlanDrvIfObj), GFP_KERNEL, sizeof(TWlanDrvIfObj)); - #endif - memset (drv, 0, sizeof(TWlanDrvIfObj)); - - drv->irq = TNETW_IRQ; - drv->tCommon.eDriverState = DRV_STATE_IDLE; + pDrvStaticHandle = drv; /* save for module destroy */ +#ifdef TI_MEM_ALLOC_TRACE + os_printf ("MTT:%s:%d ::kmalloc(%lu, %x) : %lu\n", __FUNCTION__, __LINE__, sizeof(TWlanDrvIfObj), GFP_KERNEL, sizeof(TWlanDrvIfObj)); +#endif + memset (drv, 0, sizeof(TWlanDrvIfObj)); - drv->pWorkQueue = create_singlethread_workqueue (TIWLAN_DRV_NAME); - if (!drv->pWorkQueue) - { - return -ENOMEM; - } + /* Dm: drv->irq = TNETW_IRQ; */ + drv->tCommon.eDriverState = DRV_STATE_IDLE; - drv->wl_packet = 0; - drv->wl_count = 0; + drv->tiwlan_wq = create_freezeable_workqueue(DRIVERWQ_NAME); + if (!drv->tiwlan_wq) { + ti_dprintf (TIWLAN_LOG_ERROR, "wlanDrvIf_Create(): Failed to create workQ!\n"); + rc = -EINVAL; + goto drv_create_end_1; + } + drv->wl_packet = 0; + drv->wl_count = 0; #ifdef CONFIG_HAS_WAKELOCK - wake_lock_init(&drv->wl_wifi, WAKE_LOCK_SUSPEND, "wifi_wake"); - wake_lock_init(&drv->wl_rxwake, WAKE_LOCK_SUSPEND, "wifi_rx_wake"); + wake_lock_init(&drv->wl_wifi, WAKE_LOCK_SUSPEND, "wifi_wake"); + wake_lock_init(&drv->wl_rxwake, WAKE_LOCK_SUSPEND, "wifi_rx_wake"); #endif - #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23) - INIT_WORK(&drv->tWork, wlanDrvIf_DriverTask, (void *)drv); + INIT_WORK(&drv->tWork, wlanDrvIf_DriverTask, (void *)drv); #else - INIT_WORK(&drv->tWork, wlanDrvIf_DriverTask); + INIT_WORK(&drv->tWork, wlanDrvIf_DriverTask); #endif - spin_lock_init (&drv->lock); + spin_lock_init (&drv->lock); - /* Setup driver network interface. */ - rc = wlanDrvIf_SetupNetif (drv); - if (rc) - { - kfree (drv); - return rc; - } - + /* Setup driver network interface. */ + rc = wlanDrvIf_SetupNetif (drv); + if (rc) { + goto drv_create_end_2; + } - /* Create the events socket interface */ + /* Create the events socket interface */ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23) drv->wl_sock = netlink_kernel_create( NETLINK_USERSOCK, 0, NULL, THIS_MODULE ); #else - drv->wl_sock = netlink_kernel_create(&init_net, NETLINK_USERSOCK, 0, NULL, NULL, THIS_MODULE ); + drv->wl_sock = netlink_kernel_create(&init_net, NETLINK_USERSOCK, 0, NULL, NULL, THIS_MODULE ); #endif - if (drv->wl_sock == NULL) - { - ti_dprintf (TIWLAN_LOG_ERROR, "netlink_kernel_create() failed !\n"); - return -EINVAL; - } + if (drv->wl_sock == NULL) { + ti_dprintf (TIWLAN_LOG_ERROR, "netlink_kernel_create() failed !\n"); + rc = -EINVAL; + goto drv_create_end_3; + } - /* Create all driver modules and link their handles */ - drvMain_Create (drv, - &drv->tCommon.hDrvMain, - &drv->tCommon.hCmdHndlr, - &drv->tCommon.hContext, - &drv->tCommon.hTxDataQ, - &drv->tCommon.hTxMgmtQ, - &drv->tCommon.hTxCtrl, - &drv->tCommon.hTWD, + /* Create all driver modules and link their handles */ + rc = drvMain_Create (drv, + &drv->tCommon.hDrvMain, + &drv->tCommon.hCmdHndlr, + &drv->tCommon.hContext, + &drv->tCommon.hTxDataQ, + &drv->tCommon.hTxMgmtQ, + &drv->tCommon.hTxCtrl, + &drv->tCommon.hTWD, &drv->tCommon.hEvHandler, &drv->tCommon.hCmdDispatch, - &drv->tCommon.hReport); - - /* - * Initialize interrupts (or polling mode for debug): - */ + &drv->tCommon.hReport); + if (rc != TI_OK) { + ti_dprintf (TIWLAN_LOG_ERROR, "%s: Failed to dvrMain_Create!\n", __func__); + rc = -EINVAL; + goto drv_create_end_4; + } + /* + * Initialize interrupts (or polling mode for debug): + */ #ifdef PRIODIC_INTERRUPT - /* Debug mode: Polling (the timer is started by HwInit process) */ - drv->hPollTimer = os_timerCreate ((TI_HANDLE)drv, wlanDrvIf_PollIrqHandler, (TI_HANDLE)drv); + /* Debug mode: Polling (the timer is started by HwInit process) */ + drv->hPollTimer = os_timerCreate ((TI_HANDLE)drv, wlanDrvIf_PollIrqHandler, (TI_HANDLE)drv); #else - /* Normal mode: Interrupts (the default mode) */ - rc = hPlatform_initInterrupt (drv, (void*)wlanDrvIf_HandleInterrupt); - if (rc) - { - ti_dprintf (TIWLAN_LOG_ERROR, "wlanDrvIf_Create(): Failed to register interrupt handler!\n"); - return rc; - } + /* Normal mode: Interrupts (the default mode) */ + rc = hPlatform_initInterrupt (drv, (void*)wlanDrvIf_HandleInterrupt); + if (rc) { + ti_dprintf (TIWLAN_LOG_ERROR, "wlanDrvIf_Create(): Failed to register interrupt handler!\n"); + goto drv_create_end_5; + } #endif /* PRIODIC_INTERRUPT */ + return 0; +drv_create_end_5: + /* Destroy all driver modules */ + if (drv->tCommon.hDrvMain) { + drvMain_Destroy (drv->tCommon.hDrvMain); + } +drv_create_end_4: + if (drv->wl_sock) { + sock_release (drv->wl_sock->sk_socket); + } + +drv_create_end_3: + /* Release the driver network interface */ + if (drv->netdev) { + unregister_netdev (drv->netdev); + free_netdev (drv->netdev); + } + +drv_create_end_2: +#ifdef CONFIG_HAS_WAKELOCK + wake_lock_destroy(&drv->wl_wifi); + wake_lock_destroy(&drv->wl_rxwake); +#endif + if (drv->tiwlan_wq) + destroy_workqueue(drv->tiwlan_wq); - return 0; +drv_create_end_1: + kfree(drv); + printk("%s: Fail\n", __func__); + return rc; } @@ -923,84 +972,79 @@ static int wlanDrvIf_Create (void) */ static void wlanDrvIf_Destroy (TWlanDrvIfObj *drv) { - if(!drv) - return; - - /* Release the driver network interface */ - if (drv->netdev) - { - netif_stop_queue (drv->netdev); - wlanDrvIf_Stop (drv->netdev); - unregister_netdev (drv->netdev); - } + if (!drv) + return; - cancel_work_sync (&drv->tWork); + if (drv->tiwlan_wq) { + cancel_work_sync(&drv->tWork); + flush_workqueue(drv->tiwlan_wq); + } - flush_workqueue (drv->pWorkQueue); - destroy_workqueue (drv->pWorkQueue); + /* Release the driver network interface */ + if (drv->netdev) { + netif_stop_queue (drv->netdev); + wlanDrvIf_Stop (drv->netdev); + unregister_netdev (drv->netdev); + free_netdev (drv->netdev); + } /* Destroy all driver modules */ - if (drv->tCommon.hDrvMain) - { - drvMain_Destroy (drv->tCommon.hDrvMain); - } - - /* close the ipc_kernel socket*/ - if (drv && drv->wl_sock) - { - sock_release (drv->wl_sock->sk_socket); - } + if (drv->tCommon.hDrvMain) { + drvMain_Destroy (drv->tCommon.hDrvMain); + } - /* Release the driver interrupt (or polling timer) */ + /* close the ipc_kernel socket*/ + if (drv && drv->wl_sock) { + sock_release (drv->wl_sock->sk_socket); + } + /* Release the driver interrupt (or polling timer) */ #ifdef PRIODIC_INTERRUPT - os_timerDestroy (drv, drv->hPollTimer); + os_timerDestroy (drv, drv->hPollTimer); #else - if (drv->irq) - { - set_irq_wake(drv->irq, 0); - free_irq (drv->irq, drv); - hPlatform_freeInterrupt (); - } + if (drv->irq) { + hPlatform_freeInterrupt(drv); + } #endif + if (drv->tiwlan_wq) + destroy_workqueue(drv->tiwlan_wq); #ifdef CONFIG_HAS_WAKELOCK - wake_lock_destroy(&drv->wl_wifi); - wake_lock_destroy(&drv->wl_rxwake); + wake_lock_destroy(&drv->wl_wifi); + wake_lock_destroy(&drv->wl_rxwake); #endif - - /* - * Free init files memory - */ - if (drv->tCommon.tFwImage.pImage) - { - os_memoryFree (drv, drv->tCommon.tFwImage.pImage, drv->tCommon.tFwImage.uSize); - #ifdef TI_MEM_ALLOC_TRACE - os_printf ("MTT:%s:%d ::kfree(0x%p) : %d\n", - __FUNCTION__, __LINE__, drv->tCommon.tFwImage.uSize, -drv->tCommon.tFwImage.uSize); - #endif - } - if (drv->tCommon.tNvsImage.pImage) - { - kfree (drv->tCommon.tNvsImage.pImage); - #ifdef TI_MEM_ALLOC_TRACE - os_printf ("MTT:%s:%d ::kfree(0x%p) : %d\n", - __FUNCTION__, __LINE__, drv->tCommon.tNvsImage.uSize, -drv->tCommon.tNvsImage.uSize); - #endif - } - if (drv->tCommon.tIniFile.pImage) - { - kfree (drv->tCommon.tIniFile.pImage); - #ifdef TI_MEM_ALLOC_TRACE - os_printf ("MTT:%s:%d ::kfree(0x%p) : %d\n", - __FUNCTION__, __LINE__, drv->tCommon.tIniFile.uSize, -drv->tCommon.tIniFile.uSize); - #endif - } + /* + * Free init files memory + */ + if (drv->tCommon.tFwImage.pImage) { + os_memoryFree (drv, drv->tCommon.tFwImage.pImage, drv->tCommon.tFwImage.uSize); +#ifdef TI_MEM_ALLOC_TRACE + os_printf ("MTT:%s:%d ::kfree(0x%p) : %d\n", + __FUNCTION__, __LINE__, drv->tCommon.tFwImage.uSize, + -drv->tCommon.tFwImage.uSize); +#endif + } + if (drv->tCommon.tNvsImage.pImage) { + kfree (drv->tCommon.tNvsImage.pImage); +#ifdef TI_MEM_ALLOC_TRACE + os_printf ("MTT:%s:%d ::kfree(0x%p) : %d\n", + __FUNCTION__, __LINE__, drv->tCommon.tNvsImage.uSize, + -drv->tCommon.tNvsImage.uSize); +#endif + } + if (drv->tCommon.tIniFile.pImage) { + kfree (drv->tCommon.tIniFile.pImage); +#ifdef TI_MEM_ALLOC_TRACE + os_printf ("MTT:%s:%d ::kfree(0x%p) : %d\n", + __FUNCTION__, __LINE__, drv->tCommon.tIniFile.uSize, + -drv->tCommon.tIniFile.uSize); +#endif + } /* Free the driver object */ #ifdef TI_DBG tb_destroy(); -#endif - kfree (drv); +#endif + kfree (drv); } @@ -1015,18 +1059,34 @@ static void wlanDrvIf_Destroy (TWlanDrvIfObj *drv) * \return Init: 0 - OK, else - failure. Exit: void * \sa wlanDrvIf_Create, wlanDrvIf_Destroy */ +#ifndef TI_SDIO_STANDALONE +static int sdc_ctrl = 2; +module_param(sdc_ctrl, int, S_IRUGO | S_IWUSR | S_IWGRP); + +extern int sdioDrv_init(int sdcnum); +extern void sdioDrv_exit(void); +#endif + static int __init wlanDrvIf_ModuleInit (void) { - printk(KERN_INFO "TIWLAN: driver init\n"); - sdioDrv_init(); - return wlanDrvIf_Create (); + printk(KERN_INFO "TIWLAN: driver init\n"); +#ifndef TI_SDIO_STANDALONE +#ifndef CONFIG_MMC_EMBEDDED_SDIO + sdioDrv_init(sdc_ctrl); +#endif +#endif + return wlanDrvIf_Create (); } static void __exit wlanDrvIf_ModuleExit (void) { - wlanDrvIf_Destroy (pDrvStaticHandle); - sdioDrv_exit(); - printk (KERN_INFO "TI WLAN: driver unloaded\n"); + wlanDrvIf_Destroy (pDrvStaticHandle); +#ifndef TI_SDIO_STANDALONE +#ifndef CONFIG_MMC_EMBEDDED_SDIO + sdioDrv_exit(); +#endif +#endif + printk (KERN_INFO "TI WLAN: driver unloaded\n"); } diff --git a/wl1271/platforms/os/linux/src/WlanDrvWext.c b/wl1271/platforms/os/linux/src/WlanDrvWext.c index 39743f64..8e0076ea 100644 --- a/wl1271/platforms/os/linux/src/WlanDrvWext.c +++ b/wl1271/platforms/os/linux/src/WlanDrvWext.c @@ -166,76 +166,75 @@ int wlanDrvWext_Handler (struct net_device *dev, void *iw_req, void *extra) { - int rc; - TWlanDrvIfObj *drv = (TWlanDrvIfObj *)NETDEV_GET_PRIVATE(dev); - ti_private_cmd_t my_command; - struct iw_mlme mlme; - struct iw_scan_req scanreq; + int rc; + TWlanDrvIfObj *drv = (TWlanDrvIfObj *)NETDEV_GET_PRIVATE(dev); + ti_private_cmd_t my_command; + struct iw_mlme mlme; + struct iw_scan_req scanreq; + void *copy_to_buf=NULL, *param3=NULL; - void *copy_to_buf=NULL, *param3=NULL; + os_memoryZero(drv, &my_command, sizeof(ti_private_cmd_t)); + os_memoryZero(drv, &mlme, sizeof(struct iw_mlme)); + os_memoryZero(drv, &scanreq, sizeof(struct iw_scan_req)); - os_memoryZero(drv, &my_command, sizeof(ti_private_cmd_t)); - os_memoryZero(drv, &mlme, sizeof(struct iw_mlme)); - os_memoryZero(drv, &scanreq, sizeof(struct iw_scan_req)); - - switch (info->cmd) - { - case SIOCIWFIRSTPRIV: - { - void *copy_from_buf; + switch (info->cmd) + { + case SIOCIWFIRSTPRIV: + { + void *copy_from_buf; - if (os_memoryCopyFromUser(drv, &my_command, ((union iwreq_data *)iw_req)->data.pointer, sizeof(ti_private_cmd_t))) - { - os_printf ("wlanDrvWext_Handler() os_memoryCopyFromUser FAILED !!!\n"); - return TI_NOK; - } - if (IS_PARAM_FOR_MODULE(my_command.cmd, DRIVER_MODULE_PARAM)) - { - /* If it's a driver level command, handle it here and exit */ - switch (my_command.cmd) - { - case DRIVER_INIT_PARAM: - return wlanDrvIf_LoadFiles (drv, my_command.in_buffer); - - case DRIVER_START_PARAM: - return wlanDrvIf_Start (dev); + if (os_memoryCopyFromUser(drv, &my_command, ((union iwreq_data *)iw_req)->data.pointer, sizeof(ti_private_cmd_t))) + { + os_printf ("wlanDrvWext_Handler() os_memoryCopyFromUser FAILED !!!\n"); + return TI_NOK; + } + if (IS_PARAM_FOR_MODULE(my_command.cmd, DRIVER_MODULE_PARAM)) + { + /* If it's a driver level command, handle it here and exit */ + switch (my_command.cmd) + { + case DRIVER_INIT_PARAM: + return wlanDrvIf_LoadFiles(drv, my_command.in_buffer); - case DRIVER_STOP_PARAM: - return wlanDrvIf_Stop (dev); + case DRIVER_START_PARAM: + return wlanDrvIf_Start(dev); - case DRIVER_STATUS_PARAM: - *(TI_UINT32 *)my_command.out_buffer = - (drv->tCommon.eDriverState == DRV_STATE_RUNNING) ? TI_TRUE : TI_FALSE; - return TI_OK; - } - } - /* if we are still here handle a normal private command*/ + case DRIVER_STOP_PARAM: + return wlanDrvIf_Stop(dev); - if ((my_command.in_buffer) && (my_command.in_buffer_len)) - { - copy_from_buf = my_command.in_buffer; - my_command.in_buffer = os_memoryAlloc(drv, my_command.in_buffer_len); - if (os_memoryCopyFromUser(drv, my_command.in_buffer, copy_from_buf, my_command.in_buffer_len)) - { - os_printf ("wlanDrvWext_Handler() os_memoryCopyFromUser 1 FAILED !!!\n"); - return TI_NOK; - } - } - if ((my_command.out_buffer) && (my_command.out_buffer_len)) - { - copy_to_buf = my_command.out_buffer; - my_command.out_buffer = os_memoryAlloc(drv, my_command.out_buffer_len); - } - param3 = &my_command; - } - break; + case DRIVER_STATUS_PARAM: + *(TI_UINT32 *)my_command.out_buffer = + (drv->tCommon.eDriverState == DRV_STATE_RUNNING) ? TI_TRUE : TI_FALSE; + return TI_OK; + } + } + /* if we are still here handle a normal private command*/ - case SIOCSIWMLME: - { - os_memoryCopyFromUser(drv, &mlme, ((union iwreq_data *)iw_req)->data.pointer, sizeof(struct iw_mlme)); - param3 = &mlme; - } - break; + if ((my_command.in_buffer) && (my_command.in_buffer_len)) + { + copy_from_buf = my_command.in_buffer; + my_command.in_buffer = os_memoryAlloc(drv, my_command.in_buffer_len); + if (os_memoryCopyFromUser(drv, my_command.in_buffer, copy_from_buf, my_command.in_buffer_len)) + { + os_printf("wlanDrvWext_Handler() os_memoryCopyFromUser 1 FAILED !!!\n"); + return TI_NOK; + } + } + if ((my_command.out_buffer) && (my_command.out_buffer_len)) + { + copy_to_buf = my_command.out_buffer; + my_command.out_buffer = os_memoryAlloc(drv, my_command.out_buffer_len); + } + param3 = &my_command; + } + break; + + case SIOCSIWMLME: + { + os_memoryCopyFromUser(drv, &mlme, ((union iwreq_data *)iw_req)->data.pointer, sizeof(struct iw_mlme)); + param3 = &mlme; + } + break; case SIOCSIWSCAN: { if (((union iwreq_data *)iw_req)->data.pointer) { @@ -263,14 +262,18 @@ int wlanDrvWext_Handler (struct net_device *dev, } break; } - /* If the friver is not running, return NOK */ - if (drv->tCommon.eDriverState != DRV_STATE_RUNNING) - { - return TI_NOK; - } + /* If the friver is not running, return NOK */ + if (drv->tCommon.eDriverState != DRV_STATE_RUNNING) + { + if (my_command.in_buffer) + os_memoryFree(drv, my_command.in_buffer, my_command.in_buffer_len); + if (my_command.out_buffer) + os_memoryFree(drv,my_command.out_buffer,my_command.out_buffer_len); + return TI_NOK; + } - /* Call the Cmd module with the given user paramters */ - rc = (cmdHndlr_InsertCommand (drv->tCommon.hCmdHndlr, + /* Call the Cmd module with the given user paramters */ + rc = cmdHndlr_InsertCommand(drv->tCommon.hCmdHndlr, info->cmd, info->flags, iw_req, @@ -278,21 +281,20 @@ int wlanDrvWext_Handler (struct net_device *dev, extra, 0, param3, - NULL)); - /* Here we are after the command was completed */ - if (my_command.in_buffer) - { - os_memoryFree (drv, my_command.in_buffer, my_command.in_buffer_len); - } - if (my_command.out_buffer) - { - if (os_memoryCopyToUser(drv, copy_to_buf, my_command.out_buffer, my_command.out_buffer_len)) - { - os_printf ("wlanDrvWext_Handler() os_memoryCopyToUser FAILED !!!\n"); - rc = TI_NOK; - } - os_memoryFree (drv, my_command.out_buffer, my_command.out_buffer_len); - } - - return rc; + NULL); + /* Here we are after the command was completed */ + if (my_command.in_buffer) + { + os_memoryFree(drv, my_command.in_buffer, my_command.in_buffer_len); + } + if (my_command.out_buffer) + { + if (os_memoryCopyToUser(drv, copy_to_buf, my_command.out_buffer, my_command.out_buffer_len)) + { + os_printf("wlanDrvWext_Handler() os_memoryCopyToUser FAILED !!!\n"); + rc = TI_NOK; + } + os_memoryFree(drv, my_command.out_buffer, my_command.out_buffer_len); + } + return rc; } diff --git a/wl1271/platforms/os/linux/src/osRgstry_parser.c b/wl1271/platforms/os/linux/src/osRgstry_parser.c index ec5bc3e4..8aa108b6 100644 --- a/wl1271/platforms/os/linux/src/osRgstry_parser.c +++ b/wl1271/platforms/os/linux/src/osRgstry_parser.c @@ -41,16 +41,15 @@ extern void regReadLastDbgState(TWlanDrvIfObjPtr pAdapter); -static char *init_file = NULL; -static int init_file_length= 0; +static char *init_file = NULL; +static int init_file_length = 0; static PNDIS_CONFIGURATION_PARAMETER pNdisParm; int osInitTable_IniFile (TI_HANDLE hOs, TInitTable *InitTable, char *file_buf, int file_length) { TWlanDrvIfObjPtr drv = (TWlanDrvIfObjPtr)hOs; - static NDIS_CONFIGURATION_PARAMETER vNdisParm; - + init_file = file_buf; init_file_length = file_length; pNdisParm = &vNdisParm; @@ -59,7 +58,6 @@ int osInitTable_IniFile (TI_HANDLE hOs, TInitTable *InitTable, char *file_buf, i #ifdef TI_DBG regReadLastDbgState(drv); #endif - return 0; } diff --git a/wl1271/platforms/os/linux/src/osapi.c b/wl1271/platforms/os/linux/src/osapi.c index 3809ec7f..833281af 100644 --- a/wl1271/platforms/os/linux/src/osapi.c +++ b/wl1271/platforms/os/linux/src/osapi.c @@ -80,11 +80,6 @@ typedef struct timer_list TOsTimer; TI_BOOL bRedirectOutputToLogger = TI_FALSE; TI_BOOL use_debug_module = TI_FALSE; -/* linux/irq.h declerations */ -extern void disable_irq(unsigned int); -extern void enable_irq(unsigned int); - - /**************************************************************************************** * * * OS Report API * @@ -134,38 +129,37 @@ NOTES: *****************************************************************************************/ void os_printf(const char *format ,...) { - static int from_new_line = 1; /* Used to save the last message EOL */ - va_list ap; - static char msg[MAX_MESSAGE_SIZE]; - char *p_msg = msg; /* Pointer to the message */ - TI_UINT16 message_len; - TI_UINT32 sec = 0; - TI_UINT32 uSec = 0; - os_memoryZero(NULL,msg, MAX_MESSAGE_SIZE); + static int from_new_line = 1; /* Used to save the last message EOL */ + va_list ap; + static char msg[MAX_MESSAGE_SIZE]; + char *p_msg = msg; /* Pointer to the message */ + TI_UINT16 message_len; + TI_UINT32 sec = 0; + TI_UINT32 uSec = 0; + os_memoryZero(NULL,msg, MAX_MESSAGE_SIZE); /* Format the message and keep the message length */ - va_start(ap,format); - message_len = vsnprintf(&msg[0], sizeof(msg) -1 , format, ap); - if( from_new_line ) - { - if (msg[1] == '$') - { - p_msg += 4; - } - - sec = os_timeStampUs(NULL); - uSec = sec % MICROSECOND_IN_SECONDS; - sec /= MICROSECOND_IN_SECONDS; - - printk(KERN_INFO DRIVER_NAME ": %d.%06d: %s",sec,uSec,p_msg); - } - else - { - printk(&msg[0]); - } - - from_new_line = ( msg[message_len] == '\n' ); - + va_start(ap,format); + message_len = vsnprintf(&msg[0], sizeof(msg) -1 , format, ap); + if( from_new_line ) + { + if (msg[1] == '$') + { + p_msg += 4; + } + + sec = os_timeStampUs(NULL); + uSec = sec % MICROSECOND_IN_SECONDS; + sec /= MICROSECOND_IN_SECONDS; + + printk(KERN_INFO DRIVER_NAME ": %d.%06d: %s",sec,uSec,p_msg); + } + else + { + printk(&msg[0]); + } + + from_new_line = ( msg[message_len] == '\n' ); va_end(ap); } @@ -194,7 +188,7 @@ NOTES: 1) The user's callback is called directly from OS timer context *****************************************************************************************/ TI_HANDLE os_timerCreate (TI_HANDLE OsContext, fTimerFunction pRoutine, TI_HANDLE hFuncHandle) { - TOsTimer *pOsTimer = os_memoryAlloc (OsContext, sizeof(TOsTimer)); + TOsTimer *pOsTimer = os_memoryAlloc (OsContext, sizeof(TOsTimer)); if(pOsTimer) { @@ -220,8 +214,8 @@ NOTES: *****************************************************************************************/ void os_timerDestroy (TI_HANDLE OsContext, TI_HANDLE TimerHandle) { - os_timerStop (OsContext, TimerHandle); - os_memoryFree (OsContext, TimerHandle, sizeof(TOsTimer)); + os_timerStop (OsContext, TimerHandle); + os_memoryFree (OsContext, TimerHandle, sizeof(TOsTimer)); } @@ -238,9 +232,9 @@ NOTES: *****************************************************************************************/ void os_timerStart (TI_HANDLE OsContext, TI_HANDLE TimerHandle, TI_UINT32 DelayMs) { - TI_UINT32 jiffie_cnt = msecs_to_jiffies (DelayMs); + TI_UINT32 jiffie_cnt = msecs_to_jiffies (DelayMs); - mod_timer ((TOsTimer *)TimerHandle, jiffies + jiffie_cnt); + mod_timer ((TOsTimer *)TimerHandle, jiffies + jiffie_cnt); } @@ -257,7 +251,7 @@ NOTES: *****************************************************************************************/ void os_timerStop (TI_HANDLE OsContext, TI_HANDLE TimerHandle) { - del_timer_sync((TOsTimer *)TimerHandle); + del_timer_sync((TOsTimer *)TimerHandle); } @@ -298,9 +292,9 @@ NOTES: *****************************************************************************************/ TI_UINT32 os_timeStampMs (TI_HANDLE OsContext) { - struct timeval tv; - do_gettimeofday(&tv); - return tv.tv_sec*1000 + tv.tv_usec/1000; + struct timeval tv; + do_gettimeofday(&tv); + return tv.tv_sec*1000 + tv.tv_usec/1000; } @@ -319,9 +313,9 @@ NOTES: *****************************************************************************************/ TI_UINT32 os_timeStampUs (TI_HANDLE OsContext) { - struct timeval tv; - do_gettimeofday(&tv); - return tv.tv_sec*1000000 + tv.tv_usec; + struct timeval tv; + do_gettimeofday(&tv); + return tv.tv_sec*1000000 + tv.tv_usec; } @@ -339,7 +333,7 @@ NOTES: *****************************************************************************************/ void os_StalluSec (TI_HANDLE OsContext, TI_UINT32 uSec) { - udelay (uSec); + udelay (uSec); } @@ -367,7 +361,7 @@ NOTES: *****************************************************************************************/ TI_HANDLE os_protectCreate (TI_HANDLE OsContext) { - return NULL; + return NULL; } @@ -400,9 +394,9 @@ NOTES: *****************************************************************************************/ void os_protectLock (TI_HANDLE OsContext, TI_HANDLE ProtectContext) { - TWlanDrvIfObj *drv = (TWlanDrvIfObj *)OsContext; + TWlanDrvIfObj *drv = (TWlanDrvIfObj *)OsContext; - spin_lock_irqsave (&drv->lock, drv->flags); + spin_lock_irqsave (&drv->lock, drv->flags); } @@ -434,7 +428,6 @@ RETURN: NOTES: *****************************************************************************************/ - TI_BOOL os_receivePacket(TI_HANDLE OsContext, void *pRxDesc ,void *pPacket, TI_UINT16 Length) { TWlanDrvIfObj *drv = (TWlanDrvIfObj *)OsContext; @@ -467,7 +460,9 @@ TI_BOOL os_receivePacket(TI_HANDLE OsContext, void *pRxDesc ,void *pPacket, TI_U printk("-->> os_receivePacket() pPacket=0x%x Length=%d skb=0x%x skb->data=0x%x skb->head=0x%x skb->len=%d\n", (int)pPacket, (int)Length, (int)skb, (int)skb->data, (int)skb->head, (int)skb->len); */ + /* Use skb_reserve, it updates both skb->data and skb->tail. */ skb->data = RX_ETH_PKT_DATA(pPacket); + skb->tail = skb->data; skb_put(skb, RX_ETH_PKT_LEN(pPacket)); /* printk("-->> os_receivePacket() skb=0x%x skb->data=0x%x skb->head=0x%x skb->len=%d\n", @@ -570,14 +565,14 @@ TI_INT32 os_IndicateEvent (TI_HANDLE OsContext, IPC_EV_DATA* pData) void os_disableIrq (TI_HANDLE OsContext) { - TWlanDrvIfObj *drv = (TWlanDrvIfObj *)OsContext; - disable_irq (drv->irq); + TWlanDrvIfObj *drv = (TWlanDrvIfObj *)OsContext; + disable_irq (drv->irq); } void os_enableIrq (TI_HANDLE OsContext) { - TWlanDrvIfObj *drv = (TWlanDrvIfObj *)OsContext; - enable_irq (drv->irq); + TWlanDrvIfObj *drv = (TWlanDrvIfObj *)OsContext; + enable_irq (drv->irq); } /*----------------------------------------------------------------------------- @@ -595,108 +590,119 @@ void os_InterruptServiced (TI_HANDLE OsContext) /* To be implemented with Level IRQ */ } -/*--------------------*/ -/* WAKE LOCK ROUTINES */ -/*--------------------*/ - /*----------------------------------------------------------------------------- - * Routine Name: os_wake_lock_timeout - * Routine Description: Called to prevent system from suspend for some time - * Arguments: OsContext - handle to OS context - * Return Value: packet counter - * -----------------------------------------------------------------------------*/ +Routine Name: os_wake_lock_timeout + +Routine Description: Called to prevent system from suspend for some time + +Arguments: OsContext - handle to OS context + +Return Value: packet counter +-----------------------------------------------------------------------------*/ int os_wake_lock_timeout (TI_HANDLE OsContext) { - TWlanDrvIfObj *drv = (TWlanDrvIfObj *)OsContext; - int ret = 0; - unsigned long flags; - - spin_lock_irqsave(&drv->lock, flags); - if (drv) { - ret = drv->wl_packet; - if (drv->wl_packet) { - drv->wl_packet = 0; + TWlanDrvIfObj *drv = (TWlanDrvIfObj *)OsContext; + int ret = 0; + unsigned long flags; + + if (drv) { + spin_lock_irqsave(&drv->lock, flags); + ret = drv->wl_packet; + if (drv->wl_packet) { + drv->wl_packet = 0; #ifdef CONFIG_HAS_WAKELOCK - wake_lock_timeout(&drv->wl_rxwake, (HZ >> 1)); + wake_lock_timeout(&drv->wl_rxwake, (HZ >> 1)); #endif - } - } - spin_unlock_irqrestore(&drv->lock, flags); - /* printk("%s: %d\n", __func__, ret); */ - return ret; + } + spin_unlock_irqrestore(&drv->lock, flags); + } + /* printk("%s: %d\n", __func__, ret); */ + return ret; } /*----------------------------------------------------------------------------- - * Routine Name: os_wake_lock_timeout_enable - * Routine Description: Called to set flag for suspend prevention for some time - * Arguments: OsContext - handle to OS context - * Return Value: packet counter - * -----------------------------------------------------------------------------*/ +Routine Name: os_wake_lock_timeout_enable + +Routine Description: Called to set flag for suspend prevention for some time + +Arguments: OsContext - handle to OS context + +Return Value: packet counter +-----------------------------------------------------------------------------*/ int os_wake_lock_timeout_enable (TI_HANDLE OsContext) { - TWlanDrvIfObj *drv = (TWlanDrvIfObj *)OsContext; - unsigned long flags; - int ret; + TWlanDrvIfObj *drv = (TWlanDrvIfObj *)OsContext; + unsigned long flags; + int ret = 0; - spin_lock_irqsave(&drv->lock, flags); - ret = drv->wl_packet = 1; - spin_unlock_irqrestore(&drv->lock, flags); - return ret; + if (drv) { + spin_lock_irqsave(&drv->lock, flags); + ret = drv->wl_packet = 1; + spin_unlock_irqrestore(&drv->lock, flags); + } + return ret; } /*----------------------------------------------------------------------------- - * Routine Name: os_wake_lock - * Routine Description: Called to prevent system from suspend - * Arguments: OsContext - handle to OS context - * Return Value: wake_lock counter - * -----------------------------------------------------------------------------*/ +Routine Name: os_wake_lock + +Routine Description: Called to prevent system from suspend + +Arguments: OsContext - handle to OS context + +Return Value: wake_lock counter +-----------------------------------------------------------------------------*/ int os_wake_lock (TI_HANDLE OsContext) { - TWlanDrvIfObj *drv = (TWlanDrvIfObj *)OsContext; - int ret = 0; - unsigned long flags; + TWlanDrvIfObj *drv = (TWlanDrvIfObj *)OsContext; + int ret = 0; + unsigned long flags; - spin_lock_irqsave(&drv->lock, flags); - if (drv) { + if (drv) { + spin_lock_irqsave(&drv->lock, flags); #ifdef CONFIG_HAS_WAKELOCK - if (!drv->wl_count) - wake_lock(&drv->wl_wifi); + if (!drv->wl_count) + wake_lock(&drv->wl_wifi); #endif - drv->wl_count++; - ret = drv->wl_count; - } - spin_unlock_irqrestore(&drv->lock, flags); - /* printk("%s: %d\n", __func__, ret); */ - return ret; + drv->wl_count++; + ret = drv->wl_count; + spin_unlock_irqrestore(&drv->lock, flags); + } + /* printk("%s: %d\n", __func__, ret); */ + return ret; } /*----------------------------------------------------------------------------- - * Routine Name: os_wake_unlock - * Routine Description: Called to allow system to suspend - * Arguments: OsContext - handle to OS context - * Return Value: wake_lock counter - * -----------------------------------------------------------------------------*/ +Routine Name: os_wake_unlock + +Routine Description: Called to allow system to suspend + +Arguments: OsContext - handle to OS context + +Return Value: wake_lock counter +-----------------------------------------------------------------------------*/ int os_wake_unlock (TI_HANDLE OsContext) { - TWlanDrvIfObj *drv = (TWlanDrvIfObj *)OsContext; - int ret = 0; - unsigned long flags; + TWlanDrvIfObj *drv = (TWlanDrvIfObj *)OsContext; + int ret = 0; + unsigned long flags; - spin_lock_irqsave(&drv->lock, flags); - if (drv && drv->wl_count) { - drv->wl_count--; + if (drv) { + spin_lock_irqsave(&drv->lock, flags); + if (drv->wl_count) { + drv->wl_count--; #ifdef CONFIG_HAS_WAKELOCK - if (!drv->wl_count) - wake_unlock(&drv->wl_wifi); + if (!drv->wl_count) + wake_unlock(&drv->wl_wifi); #endif - ret = drv->wl_count; - } - spin_unlock_irqrestore(&drv->lock, flags); - /* printk("%s: %d\n", __func__, ret); */ - return ret; + ret = drv->wl_count; + } + spin_unlock_irqrestore(&drv->lock, flags); + } + /* printk("%s: %d\n", __func__, ret); */ + return ret; } - /*----------------------------------------------------------------------------- Routine Name: os_RequestSchedule @@ -708,21 +714,20 @@ Return Value: TI_OK -----------------------------------------------------------------------------*/ int os_RequestSchedule (TI_HANDLE OsContext) { - TWlanDrvIfObj *drv = (TWlanDrvIfObj *)OsContext; - int iRes = TI_OK; + TWlanDrvIfObj *drv = (TWlanDrvIfObj *)OsContext; - /* Note: The performance trace below doesn't inclose the schedule itself because the rescheduling - * can occur immediately and call os_RequestSchedule again which will confuse the trace tools - */ - CL_TRACE_START_L3(); - CL_TRACE_END_L3("tiwlan_drv.ko", "OS", "TASK", ""); + /* Note: The performance trace below doesn't inclose the schedule + * itself because the rescheduling can occur immediately and call + * os_RequestSchedule again which will confuse the trace tools */ + CL_TRACE_START_L3(); + CL_TRACE_END_L3("tiwlan_drv.ko", "OS", "TASK", ""); - if (!queue_work (drv->pWorkQueue, &drv->tWork)) - { - iRes = TI_NOK; - } + if( !queue_work(drv->tiwlan_wq, &drv->tWork) ) { + /* printk("%s: Fail\n",__func__); */ + return TI_NOK; + } - return iRes; + return TI_OK; } @@ -737,11 +742,11 @@ Return Value: TI_OK -----------------------------------------------------------------------------*/ void *os_SignalObjectCreate (TI_HANDLE OsContext) { - struct completion *myPtr; - myPtr = os_memoryAlloc(OsContext, sizeof(struct completion)); - if(myPtr) - init_completion (myPtr); - return (myPtr); + struct completion *myPtr; + myPtr = os_memoryAlloc(OsContext, sizeof(struct completion)); + if (myPtr) + init_completion (myPtr); + return (myPtr); } @@ -756,8 +761,13 @@ Return Value: TI_OK -----------------------------------------------------------------------------*/ int os_SignalObjectWait (TI_HANDLE OsContext, void *signalObject) { - wait_for_completion ((struct completion *)signalObject); - return TI_OK; + if (!signalObject) + return TI_NOK; + if (!wait_for_completion_timeout((struct completion *)signalObject, + msecs_to_jiffies(10000))) { + printk("tiwlan: 10 sec %s timeout\n", __func__); + } + return TI_OK; } @@ -772,8 +782,10 @@ Return Value: TI_OK -----------------------------------------------------------------------------*/ int os_SignalObjectSet (TI_HANDLE OsContext, void *signalObject) { - complete ((struct completion *)signalObject); - return TI_OK; + if (!signalObject) + return TI_NOK; + complete ((struct completion *)signalObject); + return TI_OK; } @@ -788,8 +800,10 @@ Return Value: TI_OK -----------------------------------------------------------------------------*/ int os_SignalObjectFree (TI_HANDLE OsContext, void *signalObject) { - os_memoryFree(OsContext, signalObject, sizeof(struct completion)); - return TI_OK; + if (!signalObject) + return TI_NOK; + os_memoryFree(OsContext, signalObject, sizeof(struct completion)); + return TI_OK; } @@ -813,21 +827,21 @@ void os_Trace (TI_HANDLE OsContext, TI_UINT32 uLevel, TI_UINT32 uFileId, TI_UINT TI_UINT32 uMaxParamValue = 0; TI_UINT32 uMsgLen = TRACE_MSG_MIN_LENGTH; TI_UINT8 aMsg[TRACE_MSG_MAX_LENGTH] = {0}; - TTraceMsg *pMsgHdr = (TTraceMsg *)&aMsg[0]; + TTraceMsg *pMsgHdr = (TTraceMsg *)&aMsg[0]; TI_UINT8 *pMsgData = &aMsg[0] + sizeof(TTraceMsg); va_list list; - if (!bRedirectOutputToLogger) - { - return; - } + if (!bRedirectOutputToLogger) + { + return; + } if (uParamsNum > TRACE_MSG_MAX_PARAMS) { uParamsNum = TRACE_MSG_MAX_PARAMS; } - /* sync on the parameters */ + /* sync on the parameters */ va_start(list, uParamsNum); /* find the longest parameter */ @@ -849,7 +863,7 @@ void os_Trace (TI_HANDLE OsContext, TI_UINT32 uLevel, TI_UINT32 uFileId, TI_UINT } } - /* Set msg length and format according to the biggest parameter value (8/16/32 bits) */ + /* Set msg length and format according to the biggest parameter value (8/16/32 bits) */ if (uMaxParamValue > UINT16_MAX_VAL) { pMsgHdr->uFormat = TRACE_FORMAT_32_BITS_PARAMS; @@ -866,11 +880,11 @@ void os_Trace (TI_HANDLE OsContext, TI_UINT32 uLevel, TI_UINT32 uFileId, TI_UINT uMsgLen += uParamsNum; } - /* Fill all other header information */ - pMsgHdr->uLevel = (TI_UINT8)uLevel; - pMsgHdr->uParamsNum = (TI_UINT8)uParamsNum; - pMsgHdr->uFileId = (TI_UINT16)uFileId; - pMsgHdr->uLineNum = (TI_UINT16)uLineNum; + /* Fill all other header information */ + pMsgHdr->uLevel = (TI_UINT8)uLevel; + pMsgHdr->uParamsNum = (TI_UINT8)uParamsNum; + pMsgHdr->uFileId = (TI_UINT16)uFileId; + pMsgHdr->uLineNum = (TI_UINT16)uLineNum; /* re-sync on the parameters */ va_start(list, uParamsNum); @@ -904,7 +918,7 @@ void os_Trace (TI_HANDLE OsContext, TI_UINT32 uLevel, TI_UINT32 uFileId, TI_UINT va_end(list); - /* Send the trace message to the logger */ + /* Send the trace message to the logger */ SendLoggerData(OsContext, aMsg, (TI_UINT16)uMsgLen); } @@ -922,7 +936,3 @@ void os_Trace (TI_HANDLE OsContext, TI_UINT32 uLevel, TI_UINT32 uFileId, TI_UINT void os_SetDrvThreadPriority (TI_HANDLE OsContext, TI_UINT32 uWlanDrvThreadPriority) { } - - - - diff --git a/wl1271/platforms/os/linux/src/osmemapi.c b/wl1271/platforms/os/linux/src/osmemapi.c index 0243df76..e0e2fe2c 100644 --- a/wl1271/platforms/os/linux/src/osmemapi.c +++ b/wl1271/platforms/os/linux/src/osmemapi.c @@ -61,10 +61,10 @@ typedef void (*os_free)(void *); struct os_mem_block { - struct list_head blk_list; - os_free f_free; - __u32 size; - __u32 signature; + struct list_head blk_list; + os_free f_free; + __u32 size; + __u32 signature; }; #define MEM_BLOCK_START (('m'<<24) | ('e'<<16) | ('m'<<8) | 's') #define MEM_BLOCK_END (('m'<<24) | ('e'<<16) | ('m'<<8) | 'e') @@ -97,25 +97,25 @@ os_memoryAlloc( TI_UINT32 Size ) { - struct os_mem_block *blk; - __u32 total_size = Size + sizeof(struct os_mem_block) + sizeof(__u32); + struct os_mem_block *blk; + __u32 total_size = Size + sizeof(struct os_mem_block) + sizeof(__u32); #ifdef TI_MEM_ALLOC_TRACE - os_printf("MTT:%s:%d ::os_memoryAlloc(0x%p, %lu) : %lu\n",__FUNCTION__, __LINE__,OsContext,Size,total_size); + os_printf("MTT:%s:%d ::os_memoryAlloc(0x%p, %lu) : %lu\n",__FUNCTION__, __LINE__,OsContext,Size,total_size); #endif /* - Memory optimization issue. Allocate up to 2 pages (8k) from the SLAB allocator (2^n), - otherwise allocate from virtual pool. - If full Async mode is used, allow up to 6 pages (24k) for DMA-able memory, so the TxCtrlBlk table - can be transacted over DMA. + Memory optimization issue. Allocate up to 2 pages (8k) from the SLAB + allocator (2^n), otherwise allocate from virtual pool. + If full Async mode is used, allow up to 6 pages (24k) for DMA-able + memory, so the TxCtrlBlk table can be transacted over DMA. */ #ifdef FULL_ASYNC_MODE if (total_size < 6 * 4096) #else - if (total_size < 2 * 4096) + if (total_size < 2 * 4096) #endif - { - if (in_atomic()) + { + if (in_atomic()) { blk = kmalloc(total_size, GFP_ATOMIC); } @@ -125,31 +125,35 @@ os_memoryAlloc( } if (!blk) { - printk("%s: NULL\n",__func__); - return NULL; - } - blk->f_free = (os_free)kfree; - } + printk("%s: NULL\n",__func__); + return NULL; + } + blk->f_free = (os_free)kfree; + } else { - /* We expect that the big allocations should be made outside the interrupt, - otherwise fail + /* We expect that the big allocations should be made outside + the interrupt, otherwise fail */ - if (in_interrupt()) + if (in_interrupt()) { + printk("%s: NULL\n",__func__); return NULL; - blk = vmalloc(total_size); - if (!blk) - return NULL; - blk->f_free = (os_free)vfree; - } + } + blk = vmalloc(total_size); + if (!blk) { + printk("%s: NULL\n",__func__); + return NULL; + } + blk->f_free = (os_free)vfree; + } - os_profile (OsContext, 4, total_size); + os_profile (OsContext, 4, total_size); - /*list_add(&blk->blk_list, &drv->mem_blocks);*/ - blk->size = Size; - blk->signature = MEM_BLOCK_START; - *(__u32 *)((unsigned char *)blk + total_size - sizeof(__u32)) = MEM_BLOCK_END; - return (void*)((char *)blk + sizeof(struct os_mem_block)); + /*list_add(&blk->blk_list, &drv->mem_blocks);*/ + blk->size = Size; + blk->signature = MEM_BLOCK_START; + *(__u32 *)((unsigned char *)blk + total_size - sizeof(__u32)) = MEM_BLOCK_END; + return (void *)((char *)blk + sizeof(struct os_mem_block)); } @@ -173,22 +177,22 @@ os_memoryCAlloc( TI_UINT32 Size ) { - void* pAllocatedMem; - TI_UINT32 MemSize; + void* pAllocatedMem; + TI_UINT32 MemSize; #ifdef TI_MEM_ALLOC_TRACE - os_printf("MTT:%s:%d ::os_memoryCAlloc(0x%p, %lu, %lu) : %lu\n",__FUNCTION__,__LINE__,OsContext,Number,Size,Number*Size); + os_printf("MTT:%s:%d ::os_memoryCAlloc(0x%p, %lu, %lu) : %lu\n",__FUNCTION__,__LINE__,OsContext,Number,Size,Number*Size); #endif - MemSize = Number * Size; + MemSize = Number * Size; - pAllocatedMem = os_memoryAlloc(OsContext, MemSize); + pAllocatedMem = os_memoryAlloc(OsContext, MemSize); - if(!pAllocatedMem) - return NULL; + if (!pAllocatedMem) + return NULL; - memset(pAllocatedMem,0,MemSize); + memset(pAllocatedMem,0,MemSize); - return pAllocatedMem; + return pAllocatedMem; } @@ -218,29 +222,34 @@ os_memoryFree( TI_UINT32 Size ) { - struct os_mem_block *blk = - (struct os_mem_block *)((char *)pMemPtr - sizeof(struct os_mem_block)); - + struct os_mem_block *blk; + + if (!pMemPtr) { + printk("%s: NULL\n",__func__); + return; + } + blk = (struct os_mem_block *)((char *)pMemPtr - sizeof(struct os_mem_block)); + #ifdef TI_MEM_ALLOC_TRACE - os_printf("MTT:%s:%d ::os_memoryFree(0x%p, 0x%p, %lu) : %d\n",__FUNCTION__,__LINE__,OsContext,pMemPtr,Size,-Size); + os_printf("MTT:%s:%d ::os_memoryFree(0x%p, 0x%p, %lu) : %d\n",__FUNCTION__,__LINE__,OsContext,pMemPtr,Size,-Size); #endif if (blk->signature != MEM_BLOCK_START) - { + { printk("\n\n%s: memory block signature is incorrect - 0x%x\n\n\n", - __FUNCTION__, blk->signature); - return; - } - *(char *)(&blk->signature) = '~'; - if (*(__u32 *)((unsigned char *)blk + blk->size + sizeof(struct os_mem_block)) - != MEM_BLOCK_END) - { + __FUNCTION__, blk->signature); + return; + } + *(char *)(&blk->signature) = '~'; + if (*(__u32 *)((unsigned char *)blk + blk->size + sizeof(struct os_mem_block)) + != MEM_BLOCK_END) + { printk("\n\n%s: memory block corruption. Size=%u\n\n\n", - __FUNCTION__, blk->size); - } + __FUNCTION__, blk->size); + } - os_profile (OsContext, 5, blk->size + sizeof(struct os_mem_block) + sizeof(__u32)); + os_profile (OsContext, 5, blk->size + sizeof(struct os_mem_block) + sizeof(__u32)); - blk->f_free(blk); + blk->f_free(blk); } @@ -266,7 +275,11 @@ os_memorySet( TI_UINT32 Length ) { - memset(pMemPtr,Value,Length); + if (!pMemPtr) { + printk("%s: NULL\n",__func__); + return; + } + memset(pMemPtr,Value,Length); } /**************************************************************************************** @@ -289,29 +302,32 @@ os_memoryAlloc4HwDma( TI_UINT32 Size ) { - struct os_mem_block *blk; + struct os_mem_block *blk; __u32 total_size = Size + sizeof(struct os_mem_block) + sizeof(__u32); /* - if the size is greater than 2 pages then we cant allocate the memory through kmalloc so the function fails + if the size is greater than 2 pages then we cant allocate the memory + through kmalloc so the function fails */ if (Size < 2 * OS_PAGE_SIZE) - { - blk = kmalloc(total_size, GFP_ATOMIC|GFP_DMA); - if (!blk) + { + blk = kmalloc(total_size, GFP_ATOMIC|GFP_DMA); + if (!blk) { + printk("%s: NULL\n",__func__); return NULL; - blk->f_free = (os_free)kfree; + } + blk->f_free = (os_free)kfree; } - else - { + else + { printk("\n\n%s: memory cant be allocated-Size = %d\n\n\n", - __FUNCTION__, Size); + __FUNCTION__, Size); return NULL; } blk->size = Size; blk->signature = MEM_BLOCK_START; *(__u32 *)((unsigned char *)blk + total_size - sizeof(__u32)) = MEM_BLOCK_END; - return (void*)((char *)blk + sizeof(struct os_mem_block)); + return (void *)((char *)blk + sizeof(struct os_mem_block)); } /**************************************************************************************** @@ -339,24 +355,29 @@ os_memory4HwDmaFree( TI_UINT32 Size ) { - struct os_mem_block *blk = - (struct os_mem_block *)((char *)pMem_ptr - sizeof(struct os_mem_block)); + struct os_mem_block *blk; + + if (!pMem_ptr) { + printk("%s: NULL\n",__func__); + return; + } + blk = (struct os_mem_block *)((char *)pMem_ptr - sizeof(struct os_mem_block)); if (blk->signature != MEM_BLOCK_START) - { + { printk("\n\n%s: memory block signature is incorrect - 0x%x\n\n\n", - __FUNCTION__, blk->signature); - return; - } - *(char *)(&blk->signature) = '~'; - if (*(__u32 *)((unsigned char *)blk + blk->size + sizeof(struct os_mem_block)) - != MEM_BLOCK_END) - { + __FUNCTION__, blk->signature); + return; + } + *(char *)(&blk->signature) = '~'; + if (*(__u32 *)((unsigned char *)blk + blk->size + sizeof(struct os_mem_block)) + != MEM_BLOCK_END) + { printk("\n\n%s: memory block corruption. Size=%u\n\n\n", - __FUNCTION__, blk->size); - } + __FUNCTION__, blk->size); + } - blk->f_free(blk); + blk->f_free(blk); } /**************************************************************************************** @@ -379,7 +400,11 @@ os_memoryZero( TI_UINT32 Length ) { - memset(pMemPtr,0,Length); + if (!pMemPtr) { + printk("%s: NULL\n",__func__); + return; + } + memset(pMemPtr,0,Length); } @@ -406,7 +431,8 @@ os_memoryCopy( TI_UINT32 Size ) { - memcpy(pDstPtr,pSrcPtr,Size); + + memcpy(pDstPtr,pSrcPtr,Size); } /**************************************************************************************** @@ -434,7 +460,7 @@ os_memoryCompare( TI_INT32 Count ) { - return memcmp(Buf1, Buf2, Count); + return memcmp(Buf1, Buf2, Count); } @@ -463,7 +489,7 @@ os_memoryCopyFromUser( TI_UINT32 Size ) { - return copy_from_user(pDstPtr,pSrcPtr,Size); + return copy_from_user(pDstPtr,pSrcPtr,Size); } /**************************************************************************************** @@ -489,5 +515,5 @@ os_memoryCopyToUser( TI_UINT32 Size ) { - return copy_to_user(pDstPtr,pSrcPtr,Size); + return copy_to_user(pDstPtr,pSrcPtr,Size); } diff --git a/wl1271/platforms/os/linux/src/stack_profile.c b/wl1271/platforms/os/linux/src/stack_profile.c index 352c77e7..37e55cb4 100644 --- a/wl1271/platforms/os/linux/src/stack_profile.c +++ b/wl1271/platforms/os/linux/src/stack_profile.c @@ -31,60 +31,144 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - /* * src/stack_profile.c * */ #include <linux/stddef.h> +#include <linux/kernel.h> +#include <linux/sched.h> + +#define STACK_MASK (THREAD_SIZE-1) +#define MAX_STACK_FRAME 2 + +typedef struct STACK_FRAME { + unsigned long stack_buf[THREAD_SIZE/sizeof(unsigned long)]; + unsigned long *stack_start; + unsigned long stack_size; +} stack_frame_t; -unsigned long check_stack(unsigned long *base) +static stack_frame_t sf_array[MAX_STACK_FRAME]; + +static unsigned long check_stack(unsigned long *base) { - register unsigned long sp asm ("sp"); unsigned long retval = sp; - *base = ((sp & ~0x1fff) + 0x380); + + *base = ((sp & ~STACK_MASK) + sizeof(struct task_struct) + 4); return retval; } -unsigned long check_stack_start(unsigned long *base) +unsigned long check_stack_start(unsigned long *base, unsigned long real_sp, + int id) { - unsigned long i; - unsigned long from,to; + unsigned long i; + unsigned long from, to; to = check_stack(&from); *base = from; + /* save used stack context */ + if (id < MAX_STACK_FRAME) { + stack_frame_t *sfp = &sf_array[id]; + + if (!real_sp) + real_sp = to; + sfp->stack_size = THREAD_SIZE - (real_sp & STACK_MASK); + sfp->stack_start = (unsigned long *)real_sp; + memcpy(sfp->stack_buf, sfp->stack_start, sfp->stack_size); + } /* run from the stack pointer down to the base */ - for (i = from;i<to;i+=4) - { + for(i=from;(i < to);i+=4) { /* fill up the pattern */ - *(long *)i = 0xdeadbeef; + *(unsigned long *)i = 0xdeadbeef; } -/* printk("check_stack_start: from =%x to=%x data=%x\n",from,to,*(long *)(from+4));*/ + /*printk("check_stack_start: from=%x to=%x data=%x\n",from,to,*(long *)(from+4));*/ return to; } -unsigned long check_stack_stop(unsigned long *base) +unsigned long check_stack_stop(unsigned long *base, int id) { - unsigned long i; - unsigned long from,to; + unsigned long i; + unsigned long from, to; to = check_stack(&from); *base = from; + /* check used stack context */ + if (id < MAX_STACK_FRAME) { + stack_frame_t *sfp = &sf_array[id]; + + if (memcmp(sfp->stack_buf, sfp->stack_start, sfp->stack_size)) { + printk("%s: %p - Error\n", __func__, sfp->stack_start); + for(i=0;(i < sfp->stack_size/sizeof(unsigned long));i++) { + if (sfp->stack_start[i] != sfp->stack_buf[i]) + printk("%p: 0x%08lx != 0x%08lx\n", &sfp->stack_start[i], sfp->stack_start[i], sfp->stack_buf[i]); + } + } + } + /* run from the stack pointer down to the base */ - for (i = from;i<to;i+=4) - { + for(i=from;(i < to);i+=4) { /* check up the pattern */ - if ((*(long *)i) != 0xdeadbeef) + if ((*(unsigned long *)i) != 0xdeadbeef) break; } - /*printk("check_stack_stop: from =%x to=%x data=%x data=%x i=0x%x\n",from,to,*(long *)from,*(long *)(from+4),i);*/ + /*printk("check_stack_stop: from=%x to=%x data=%x data=%x i=0x%x\n",from,to,*(long *)from,*(long *)(from+4),i);*/ /* return the first time when the pattern doesn't match */ return i; } +void print_stack(int id) +{ + stack_frame_t *sfp = &sf_array[id]; + unsigned long i; + printk("%s: %d\n", __func__, id); + for(i=0;(i < sfp->stack_size/sizeof(unsigned long));i++) { + printk("%p: 0x%08lx\n", &sfp->stack_start[i], sfp->stack_start[i]); + } +} + +struct task_struct *get_task_struct_ptr_by_name(char *name) +{ + struct task_struct *g, *p; + + read_lock(&tasklist_lock); + do_each_thread(g, p) { + /* + * reset the NMI-timeout, listing all files on a slow + * console might take alot of time: + */ + /* touch_nmi_watchdog(); */ + if (!strcmp(name, p->comm)) { + read_unlock(&tasklist_lock); + return p; + } + } while_each_thread(g, p); + read_unlock(&tasklist_lock); + return NULL; +} + +unsigned long save_stack_context(char *name, int id) +{ +/* register unsigned long sp asm ("sp"); + unsigned long sp_local = sp; +*/ + struct task_struct *p; + stack_frame_t *sfp; + + if (id >= MAX_STACK_FRAME) + return 0L; + sfp = &sf_array[id]; + p = get_task_struct_ptr_by_name(name); + if (p) { + printk("%s: %s found\n", __func__, p->comm); /* sched_show_task(t);*/ + sfp->stack_start = (unsigned long *)((unsigned long)end_of_stack(p) & ~STACK_MASK); + sfp->stack_size = THREAD_SIZE; + memcpy(sfp->stack_buf, sfp->stack_start, sfp->stack_size); + } + return sfp->stack_size; +} diff --git a/wl1271/platforms/os/linux/wl_env.bash b/wl1271/platforms/os/linux/wl_env.bash index 64961c3f..234e0b34 100644 --- a/wl1271/platforms/os/linux/wl_env.bash +++ b/wl1271/platforms/os/linux/wl_env.bash @@ -1,5 +1,6 @@ -export PATH=<PATH TO CROSS COMPILER>:$PATH -export CROSS_COMPILE=arm-none-linux-gnueabi- +# export PATH=<PATH TO CROSS COMPILER>:$PATH +export CROSS_COMPILE=arm-eabi- export ARCH=arm -export HOST_PLATFORM=zoom2 -export KERNEL_DIR=<PATH TO KERNEL DIR> +export HOST_PLATFORM=sholes +export KERNEL_DIR=/usr/local/google/android/master/kernel + |