/*! \brief Calibration function * * Performs the calibration according to calibration method chosen. * Compares different calibration results in order to achieve optimal results. * */ void CalibrateInternalRc(void) { unsigned int count; #ifdef CALIBRATION_METHOD_SIMPLE // Simple search method unsigned char cycles = 0x80; do{ count = Counter(); if (count > countVal) OSCCAL--; // If count is more than count value corresponding to the given frequency: NOP(); // - decrease speed if (count < countVal) OSCCAL++; NOP(); // If count is less: - increase speed if (count == countVal) cycles=1; } while(--cycles); // Calibrate using 128(0x80) calibration cycles #else // Binary search with or without neighbor search unsigned char countDiff; unsigned char neighborSearchStatus = FINISHED; while(calibration == RUNNING){ count = Counter(); // Counter returns the count value after external ticks on XTAL if (calStep != 0) { BinarySearch(count); // Do binary search until stepsize is zero } else { if(neighborSearchStatus == RUNNING) { countDiff = ABS((signed int)count-(signed int)countVal); if (countDiff < bestCountDiff) // Store OSCCAL if higher accuracy is achieved { bestCountDiff = countDiff; bestOSCCAL = OSCCAL; } NeighborSearch(); // Do neighbor search } else // Prepare and start neighbor search { #ifdef CALIBRATION_METHOD_BINARY_WITHOUT_NEIGHBOR // No neighbor search if deselected calibration = FINISHED; countDiff = ABS((signed int)count-(signed int)countVal); bestCountDiff = countDiff; bestOSCCAL = OSCCAL; #else neighborSearchStatus = RUNNING; // Do neighbor search by default neighborsSearched = 0; countDiff = ABS((signed int)count-(signed int)countVal); bestCountDiff = countDiff; bestOSCCAL = OSCCAL; #endif } } } #endif }
VOID DeleteNeighborMP( IN PRTMP_ADAPTER pAd, IN PUCHAR pPeerMacAddr) { PMESH_NEIGHBOR_TAB pNeighborTab = pAd->MeshTab.pMeshNeighborTab; PMESH_NEIGHBOR_ENTRY pNeighborEntry = NULL; if(pNeighborTab == NULL) { DBGPRINT(RT_DEBUG_ERROR, ("pAd->MeshTab.pMeshNeighborTab equal NULL.\n")); return; } /* if empty, return */ if (pNeighborTab->NeighborNr == 0) { DBGPRINT(RT_DEBUG_ERROR, ("pMeshNeighborTab empty.\n")); return; } pNeighborEntry = NeighborSearch(pAd, pPeerMacAddr); if (pNeighborEntry != NULL) { PMESH_NEIGHBOR_ENTRY pPrevEntry = NULL; ULONG HashIdx = MESH_MAC_ADDR_HASH_INDEX(pNeighborEntry->PeerMac); PMESH_NEIGHBOR_ENTRY pProbeEntry = pNeighborTab->Hash[HashIdx]; /* update Hash list */ do { if (pProbeEntry == pNeighborEntry) { if (pPrevEntry == NULL) { pNeighborTab->Hash[HashIdx] = pNeighborEntry->pNext; } else { pPrevEntry->pNext = pNeighborEntry->pNext; } break; } pPrevEntry = pProbeEntry; pProbeEntry = pProbeEntry->pNext; } while (pProbeEntry); NdisZeroMemory(pNeighborEntry, sizeof(MESH_NEIGHBOR_ENTRY)); pNeighborTab->NeighborNr--; } return; }
PMESH_NEIGHBOR_ENTRY InsertNeighborMP( IN PRTMP_ADAPTER pAd, IN CHAR RealRssi, IN PUCHAR pPeerMacAddr, IN UCHAR Channel, IN UINT8 ChBW, IN UINT8 ExtChOffset, IN PUCHAR pHostName, IN PUCHAR pMeshId, IN UCHAR MeshIdLen, IN USHORT CapabilityInfo, IN PUCHAR pVIE, IN USHORT LenVIE, IN PMESH_CONFIGURAION_IE pMeshConfig) { INT i; ULONG HashIdx; PMESH_NEIGHBOR_TAB pNeighborTab = pAd->MeshTab.pMeshNeighborTab; PMESH_NEIGHBOR_ENTRY pNeighborEntry = NULL, pNeighborCurrEntry; if(pNeighborTab == NULL) { DBGPRINT(RT_DEBUG_ERROR, ("pAd->MeshTab.pMeshNeighborTab equal NULL.\n")); return NULL; } pNeighborEntry = NeighborSearch(pAd, pPeerMacAddr); if (pNeighborEntry == NULL) { /* if FULL, return */ if (pNeighborTab->NeighborNr >= MAX_NEIGHBOR_MP) { DBGPRINT(RT_DEBUG_ERROR, ("pAd->MeshTab.pMeshNeighborTab FULL.\n")); return NULL; } for (i = 0; i < MAX_NEIGHBOR_MP; i++) { pNeighborEntry = &pAd->MeshTab.pMeshNeighborTab->NeighborMP[i]; if (pNeighborEntry->Valid == FALSE) break; } if (i < MAX_NEIGHBOR_MP) { ULONG Idx; NeighborEntrySet(pNeighborEntry, RealRssi, pPeerMacAddr, (PSTRING)pHostName, (PCHAR)pMeshId, MeshIdLen, Channel, ChBW, ExtChOffset, CapabilityInfo, pVIE, LenVIE, pMeshConfig); Idx = GetMeshLinkId(pAd, (PCHAR)pPeerMacAddr); if (Idx != BSS_NOT_FOUND) { pNeighborEntry->State = CANDIDATE_MP; pNeighborEntry->MeshLinkIdx = Idx; } else pNeighborEntry->State = NEIGHBOR_MP; pNeighborTab->NeighborNr++; } else { pNeighborEntry = NULL; DBGPRINT(RT_DEBUG_ERROR, ("%s: Neighbor tab full.\n", __FUNCTION__)); } /* add this Neighbor entry into HASH table */ if (pNeighborEntry) { HashIdx = MESH_MAC_ADDR_HASH_INDEX(pPeerMacAddr); if (pNeighborTab->Hash[HashIdx] == NULL) { pNeighborTab->Hash[HashIdx] = pNeighborEntry; } else { pNeighborCurrEntry = pNeighborTab->Hash[HashIdx]; while (pNeighborCurrEntry->pNext != NULL) pNeighborCurrEntry = pNeighborCurrEntry->pNext; pNeighborCurrEntry->pNext = pNeighborEntry; } } } else { NeighborEntrySet(pNeighborEntry, RealRssi, pPeerMacAddr, (PSTRING)pHostName, (PCHAR)pMeshId, MeshIdLen, Channel, ChBW, ExtChOffset, CapabilityInfo, pVIE, LenVIE, pMeshConfig); } return pNeighborEntry; }