drivers/staging/rtl8723bs/hal/odm_CfoTracking.c

Source file repositories/reference/linux-study-clean/drivers/staging/rtl8723bs/hal/odm_CfoTracking.c

File Facts

System
Linux kernel
Corpus path
drivers/staging/rtl8723bs/hal/odm_CfoTracking.c
Extension
.c
Size
5397 bytes
Lines
211
Domain
Driver Families
Bucket
drivers/staging
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

if (pCfoTrack->bAdjust == false) {
			if (CFO_ave > CFO_TH_XTAL_HIGH || CFO_ave < (-CFO_TH_XTAL_HIGH))
				pCfoTrack->bAdjust = true;
		} else {
			if (CFO_ave < CFO_TH_XTAL_LOW && CFO_ave > (-CFO_TH_XTAL_LOW))
				pCfoTrack->bAdjust = false;
		}

		/* 4 1.5 BT case: Disable CFO tracking */
		if (pDM_Odm->bBtEnabled) {
			pCfoTrack->bAdjust = false;
			odm_SetCrystalCap(pDM_Odm, pCfoTrack->DefXCap);
		}

		/* 4 1.6 Big jump */
		if (pCfoTrack->bAdjust) {
			if (CFO_ave > CFO_TH_XTAL_LOW)
				Adjust_Xtal = Adjust_Xtal + ((CFO_ave - CFO_TH_XTAL_LOW) >> 2);
			else if (CFO_ave < (-CFO_TH_XTAL_LOW))
				Adjust_Xtal = Adjust_Xtal + ((CFO_TH_XTAL_LOW - CFO_ave) >> 2);
		}

		/* 4 1.7 Adjust Crystal Cap. */
		if (pCfoTrack->bAdjust) {
			if (CFO_ave > CFO_TH_XTAL_LOW)
				CrystalCap = CrystalCap + Adjust_Xtal;
			else if (CFO_ave < (-CFO_TH_XTAL_LOW))
				CrystalCap = CrystalCap - Adjust_Xtal;

			if (CrystalCap > 0x3f)
				CrystalCap = 0x3f;
			else if (CrystalCap < 0)
				CrystalCap = 0;

			odm_SetCrystalCap(pDM_Odm, (u8)CrystalCap);
		}

		/* 3 2. Dynamic ATC switch */
		if (CFO_ave < CFO_TH_ATC && CFO_ave > -CFO_TH_ATC)
			odm_SetATCStatus(pDM_Odm, false);
		else
			odm_SetATCStatus(pDM_Odm, true);
	}
}

void odm_parsing_cfo(void *dm_void, void *pkt_info_void, s8 *cfotail)
{
	struct dm_odm_t *dm_odm = (struct dm_odm_t *)dm_void;
	struct odm_packet_info *pkt_info = pkt_info_void;
	struct cfo_tracking *cfo_track = &dm_odm->DM_CfoTrack;
	u8 i;

	if (!(dm_odm->SupportAbility & ODM_BB_CFO_TRACKING))
		return;

	if (pkt_info->station_id != 0) {
		/*
		 * 3 Update CFO report for path-A & path-B
		 * Only paht-A and path-B have CFO tail and short CFO
		 */
		for (i = RF_PATH_A; i <= RF_PATH_B; i++)
			cfo_track->CFO_tail[i] = (int)cfotail[i];

		/* 3 Update packet counter */
		if (cfo_track->packetCount == 0xffffffff)
			cfo_track->packetCount = 0;
		else
			cfo_track->packetCount++;
	}
}

Annotation

Implementation Notes