/*----------------------------------------------------------------------------*/ BOOL kalDevPortWrite( P_GLUE_INFO_T prGlueInfo, IN UINT_16 u2Port, IN UINT_16 u2Len, IN PUINT_8 pucBuf, IN UINT_16 u2ValidInBufSize ) { UINT_32 i; GLUE_SPIN_LOCK_DECLARATION(); ASSERT(prGlueInfo); /* 0. acquire spinlock */ GLUE_ACQUIRE_SPIN_LOCK(prGlueInfo, SPIN_LOCK_EHPI_BUS); /* 1. indicate correct length to HIFSYS if larger than 4-bytes */ if(u2Len > 4) { kalDevRegWrite_impl(prGlueInfo, MCR_EHTCR, ALIGN_4(u2Len)); } /* 2. address cycle */ #if EHPI16 writew(u2Port, prGlueInfo->rHifInfo.mcr_addr_base); #elif EHPI8 writew((u2Port & 0xFF), prGlueInfo->rHifInfo.mcr_addr_base); writew(((u2Port & 0xFF00) >> 8), prGlueInfo->rHifInfo.mcr_addr_base); #endif /* 3. data cycle */ for(i = 0 ; i < ALIGN_4(u2Len) ; i += 4) { #if EHPI16 writew((UINT_32)(*((PUINT_16) &(pucBuf[i]))), prGlueInfo->rHifInfo.mcr_data_base); writew((UINT_32)(*((PUINT_16) &(pucBuf[i+2]))), prGlueInfo->rHifInfo.mcr_data_base); #elif EHPI8 writew((UINT_32)(*((PUINT_8) &(pucBuf[i]))), prGlueInfo->rHifInfo.mcr_data_base); writew((UINT_32)(*((PUINT_8) &(pucBuf[i+1]))), prGlueInfo->rHifInfo.mcr_data_base); writew((UINT_32)(*((PUINT_8) &(pucBuf[i+2]))), prGlueInfo->rHifInfo.mcr_data_base); writew((UINT_32)(*((PUINT_8) &(pucBuf[i+3]))), prGlueInfo->rHifInfo.mcr_data_base); #endif } /* 4. restore length to 4 if necessary */ if(u2Len > 4) { kalDevRegWrite_impl(prGlueInfo, MCR_EHTCR, 4); } /* 5. release spin lock */ GLUE_RELEASE_SPIN_LOCK(prGlueInfo, SPIN_LOCK_EHPI_BUS); return TRUE; }
/*----------------------------------------------------------------------------*/ VOID staRecInitialize ( IN P_ADAPTER_T prAdapter ) { P_STA_INFO_T prStaInfo; PUINT_8 pucMemHandle; P_STA_RECORD_T prStaRec; UINT_32 i; ASSERT(prAdapter); prStaInfo = &prAdapter->rStaInfo; //4 <0> Clear allocated memory. kalMemZero((PVOID) prStaInfo->pucStaRecCached, prStaInfo->u4StaRecCachedSize); ASSERT(IS_ALIGN_4((UINT_32)prStaInfo->pucStaRecCached)); pucMemHandle = prStaInfo->pucStaRecCached; LINK_INITIALIZE(&prStaInfo->rFreeStaRecList); for (i = 0; i < CFG_MAX_NUM_STA_RECORD; i++) { prStaRec = (P_STA_RECORD_T)pucMemHandle; STA_RECORD_SET_GUID(prStaRec); LINK_INSERT_TAIL(&prStaInfo->rFreeStaRecList, &prStaRec->rLinkEntry); pucMemHandle += ALIGN_4(sizeof(STA_RECORD_T)); } /* Check if the memory allocation consist with this initialization function */ ASSERT((UINT_32)(pucMemHandle - prStaInfo->pucStaRecCached) == prStaInfo->u4StaRecCachedSize); for (i = 0; i < STA_RECORD_HASH_NUM; i++) { LINK_INITIALIZE(&prStaInfo->arValidStaRecList[i]); } prStaInfo->ucValidStaRecNum = 0; return; } /* end of staRecInitialize() */
void Service::writeEntry(ComponentDesc* i_td, trace_hash_val i_hash, const char * i_fmt, uint32_t i_line, uint32_t i_type, va_list i_args) { // Skip writing trace if debug is disabled. if (unlikely(i_type == TRACE_DEBUG)) { if ((!i_td->iv_debugEnabled) && (!g_debugSettings.globalDebugEnable)) { return; } } #ifdef CONFIG_CONSOLE_OUTPUT_TRACE { va_list args; va_copy(args, i_args); #ifdef CONFIG_CONSOLE_OUTPUT_TRACE_COMP_NAME if ( !strcmp(i_td->iv_compName, CONFIG_CONSOLE_OUTPUT_TRACE_COMP_NAME) ) { #endif CONSOLE::vdisplayf(i_td->iv_compName, i_fmt, i_args); #ifdef CONFIG_CONSOLE_OUTPUT_TRACE_COMP_NAME } #endif va_end(args); } #endif do { // Get the right buffer for this component. Buffer* l_buffer = iv_buffers[i_td->iv_bufferType]; // Copy the current time. trace_entry_stamp_t l_time; _createTimeStamp(&l_time); // Sizes for trace entry. uint32_t l_size = 0; uint32_t l_num_args = 0; uint32_t l_num_words = 0; // Maps of arguments to special types. uint64_t l_str_map = 0, l_char_map = 0, l_double_map = 0; va_list l_args; va_copy(l_args, i_args); // Parse the fmt list to determine the types/sizes of each // argument. while(NULL != (i_fmt = strchr(i_fmt, '%'))) { i_fmt++; switch (*i_fmt) { case '%': break; case 's': // string. l_str_map |= (1 << l_num_args); l_num_args++; l_num_words++; l_size += ALIGN_4(strlen(va_arg(l_args, char*)) + 1); break; case 'c': // character. l_char_map |= (1 << l_num_args); l_num_args++; l_num_words++; va_arg(l_args, uint32_t); l_size += sizeof(uint32_t); break; case 'e': // doubles. case 'f': case 'g': l_double_map |= (1 << l_num_args); l_num_args++; l_num_words += 2; va_arg(l_args, double); l_size += sizeof(double); break; default: // uint64_t-sized argument. l_num_args++; l_num_words += 2; va_arg(l_args, uint64_t); l_size += sizeof(uint64_t); break; } i_fmt++; } va_end(l_args); // Ensure we don't have too many arguments. if (l_num_args > TRAC_MAX_ARGS) { // Simply reducing the number of arguments and continuing // causes FSP trace to crash. See defect 864438. //l_num_args = TRAC_MAX_ARGS; break; } // Claim an entry from the buffer. uint32_t l_realSize = ALIGN_4(sizeof(trace_bin_entry_t) + l_size); Entry* l_entry = l_buffer->claimEntry(i_td, l_realSize); if (NULL == l_entry) { break; } // Copy contents into the 'fsp-trace'-style structure. trace_bin_entry_t* l_binEntry = reinterpret_cast<trace_bin_entry_t*>(&l_entry->data[0]); l_binEntry->stamp = l_time; l_binEntry->head.length = l_size; l_binEntry->head.tag = TRACE_COMP_TRACE; l_binEntry->head.hash = i_hash; l_binEntry->head.line = i_line; // Copy arguments into the 'fsp-trace' entry's data section. char* l_dataOut = reinterpret_cast<char*>(&l_binEntry->data[0]); for (size_t i = 0; i < l_num_args; i++) { // String. if (l_str_map & (1 << i)) { char* str = va_arg(i_args, char*); uint32_t strSize = strlen(str); memcpy(l_dataOut, str, strSize+1); l_dataOut += ALIGN_4(strSize + 1); } // Single character. else if (l_char_map & (1 << i)) { *(reinterpret_cast<uint32_t*>(l_dataOut)) = va_arg(i_args, uint32_t); l_dataOut += sizeof(uint32_t); } // Doubles. else if (l_double_map & (1 << i)) { *(reinterpret_cast<double*>(l_dataOut)) = va_arg(i_args, double); l_dataOut += sizeof(double); }