📄 card.c
字号:
pbyData[6] = (BYTE)(dwTSFOffset2>>16); pbyData[7] = (BYTE)(dwTSFOffset2>>24); CONTROLnsRequestOut(pDevice, MESSAGE_TYPE_SET_TSFTBTT, MESSAGE_REQUEST_TSF, 0, 8, pbyData ); }/* * Description: Read NIC TSF counter * Get local TSF counter * * Parameters: * In: * pDevice - The adapter to be read * Out: * qwCurrTSF - Current TSF counter * * Return Value: TRUE if success; otherwise FALSE * */BOOL CARDbGetCurrentTSF (PVOID pDeviceHandler, PQWORD pqwCurrTSF){ PSDevice pDevice = (PSDevice) pDeviceHandler; LODWORD(*pqwCurrTSF) = LODWORD(pDevice->qwCurrTSF); HIDWORD(*pqwCurrTSF) = HIDWORD(pDevice->qwCurrTSF); return(TRUE);}/* * Description: Clear NIC TSF counter * Clear local TSF counter * * Parameters: * In: * pDevice - The adapter to be read * * Return Value: TRUE if success; otherwise FALSE * */BOOL CARDbClearCurrentTSF(PVOID pDeviceHandler){ PSDevice pDevice = (PSDevice) pDeviceHandler; MACvRegBitsOn(pDevice,MAC_REG_TFTCTL,TFTCTL_TSFCNTRST); LODWORD(pDevice->qwCurrTSF) = 0; HIDWORD(pDevice->qwCurrTSF) = 0; return(TRUE);}/* * Description: Read NIC TSF counter * Get NEXTTBTT from adjusted TSF and Beacon Interval * * Parameters: * In: * qwTSF - Current TSF counter * wbeaconInterval - Beacon Interval * Out: * qwCurrTSF - Current TSF counter * * Return Value: TSF value of next Beacon * */QWORD CARDqGetNextTBTT (QWORD qwTSF, WORD wBeaconInterval){ UINT uLowNextTBTT; UINT uHighRemain, uLowRemain; UINT uBeaconInterval; uBeaconInterval = wBeaconInterval * 1024; // Next TBTT = ((local_current_TSF / beacon_interval) + 1 ) * beacon_interval uLowNextTBTT = (LODWORD(qwTSF) >> 10) << 10; uLowRemain = (uLowNextTBTT) % uBeaconInterval; uHighRemain = ((0x80000000 % uBeaconInterval)* 2 * HIDWORD(qwTSF)) % uBeaconInterval; uLowRemain = (uHighRemain + uLowRemain) % uBeaconInterval; uLowRemain = uBeaconInterval - uLowRemain; // check if carry when add one beacon interval if ((~uLowNextTBTT) < uLowRemain) HIDWORD(qwTSF) ++ ; LODWORD(qwTSF) = uLowNextTBTT + uLowRemain; return (qwTSF);}/* * Description: Set NIC TSF counter for first Beacon time * Get NEXTTBTT from adjusted TSF and Beacon Interval * * Parameters: * In: * dwIoBase - IO Base * wBeaconInterval - Beacon Interval * Out: * none * * Return Value: none * */void CARDvSetFirstNextTBTT (PVOID pDeviceHandler, WORD wBeaconInterval){ PSDevice pDevice = (PSDevice) pDeviceHandler; QWORD qwNextTBTT; DWORD dwLoTBTT,dwHiTBTT; BYTE pbyData[8]; HIDWORD(qwNextTBTT) = 0; LODWORD(qwNextTBTT) = 0; CARDbClearCurrentTSF(pDevice); //CARDbGetCurrentTSF(pDevice, &qwNextTBTT); //Get Local TSF counter qwNextTBTT = CARDqGetNextTBTT(qwNextTBTT, wBeaconInterval); // Set NextTBTT dwLoTBTT = LODWORD(qwNextTBTT); dwHiTBTT = HIDWORD(qwNextTBTT); pbyData[0] = (BYTE)dwLoTBTT; pbyData[1] = (BYTE)(dwLoTBTT>>8); pbyData[2] = (BYTE)(dwLoTBTT>>16); pbyData[3] = (BYTE)(dwLoTBTT>>24); pbyData[4] = (BYTE)dwHiTBTT; pbyData[5] = (BYTE)(dwHiTBTT>>8); pbyData[6] = (BYTE)(dwHiTBTT>>16); pbyData[7] = (BYTE)(dwHiTBTT>>24); CONTROLnsRequestOut(pDevice, MESSAGE_TYPE_SET_TSFTBTT, MESSAGE_REQUEST_TBTT, 0, 8, pbyData ); return;}/* * Description: Sync NIC TSF counter for Beacon time * Get NEXTTBTT and write to HW * * Parameters: * In: * pDevice - The adapter to be set * qwTSF - Current TSF counter * wBeaconInterval - Beacon Interval * Out: * none * * Return Value: none * */void CARDvUpdateNextTBTT (PVOID pDeviceHandler, QWORD qwTSF, WORD wBeaconInterval){ PSDevice pDevice = (PSDevice) pDeviceHandler; DWORD dwLoTBTT,dwHiTBTT; BYTE pbyData[8]; qwTSF = CARDqGetNextTBTT(qwTSF, wBeaconInterval); // Set NextTBTT dwLoTBTT = LODWORD(qwTSF); dwHiTBTT = HIDWORD(qwTSF); pbyData[0] = (BYTE)dwLoTBTT; pbyData[1] = (BYTE)(dwLoTBTT>>8); pbyData[2] = (BYTE)(dwLoTBTT>>16); pbyData[3] = (BYTE)(dwLoTBTT>>24); pbyData[4] = (BYTE)dwHiTBTT; pbyData[5] = (BYTE)(dwHiTBTT>>8); pbyData[6] = (BYTE)(dwHiTBTT>>16); pbyData[7] = (BYTE)(dwHiTBTT>>24); CONTROLnsRequestOut(pDevice, MESSAGE_TYPE_SET_TSFTBTT, MESSAGE_REQUEST_TBTT, 0, 8, pbyData ); DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Card:Update Next TBTT[%8xh:%8xh] \n",(int)HIDWORD(qwTSF), (int)LODWORD(qwTSF)); return;}/* * Description: Turn off Radio power * * Parameters: * In: * pDevice - The adapter to be turned off * Out: * none * * Return Value: TRUE if success; otherwise FALSE * */BOOL CARDbRadioPowerOff (PVOID pDeviceHandler){PSDevice pDevice = (PSDevice) pDeviceHandler; BOOL bResult = TRUE; //if (pDevice->bRadioOff == TRUE) // return TRUE; pDevice->bRadioOff = TRUE; switch (pDevice->byRFType) { case RF_AL2230: case RF_AL2230S: case RF_AIROHA7230: case RF_VT3226: //RobertYu:20051111 case RF_VT3226D0: case RF_VT3342A0: //RobertYu:20060609 MACvRegBitsOff(pDevice, MAC_REG_SOFTPWRCTL, (SOFTPWRCTL_SWPE2 | SOFTPWRCTL_SWPE3)); break; } MACvRegBitsOff(pDevice, MAC_REG_HOSTCR, HOSTCR_RXON); BBvSetDeepSleep(pDevice); return bResult;}/* * Description: Turn on Radio power * * Parameters: * In: * pDevice - The adapter to be turned on * Out: * none * * Return Value: TRUE if success; otherwise FALSE * */BOOL CARDbRadioPowerOn (PVOID pDeviceHandler){PSDevice pDevice = (PSDevice) pDeviceHandler; BOOL bResult = TRUE; if ((pDevice->bHWRadioOff == TRUE) || (pDevice->bRadioControlOff == TRUE)) { return FALSE; } //if (pDevice->bRadioOff == FALSE) // return TRUE; pDevice->bRadioOff = FALSE; BBvExitDeepSleep(pDevice); MACvRegBitsOn(pDevice, MAC_REG_HOSTCR, HOSTCR_RXON); switch (pDevice->byRFType) { case RF_AL2230: case RF_AL2230S: case RF_AIROHA7230: case RF_VT3226: //RobertYu:20051111 case RF_VT3226D0: case RF_VT3342A0: //RobertYu:20060609 MACvRegBitsOn(pDevice, MAC_REG_SOFTPWRCTL, (SOFTPWRCTL_SWPE2 | SOFTPWRCTL_SWPE3)); break; } return bResult;}void CARDvSetBSSMode (PVOID pDeviceHandler){ PSDevice pDevice = (PSDevice) pDeviceHandler; // Set BB and packet type at the same time.//{{RobertYu:20050222, AL7230 have two TX PA output, only connet to b/g now // so in 11a mode need to set the MAC Reg0x4C to 11b/g mode to turn on PA if( (pDevice->byRFType == RF_AIROHA7230 ) && (pDevice->byBBType == BB_TYPE_11A) ) { MACvSetBBType(pDevice, BB_TYPE_11G); } else { MACvSetBBType(pDevice, pDevice->byBBType); } pDevice->byPacketType = CARDbyGetPktType(pDevice); if (pDevice->byBBType == BB_TYPE_11A) { ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0x88, 0x03); } else if (pDevice->byBBType == BB_TYPE_11B) { ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0x88, 0x02); } else if (pDevice->byBBType == BB_TYPE_11G) { ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0x88, 0x08); } vUpdateIFS(pDevice); CARDvSetRSPINF(pDevice, (BYTE)pDevice->byBBType); if ( pDevice->byBBType == BB_TYPE_11A ) { //request by Jack 2005-04-26 if (pDevice->byRFType == RF_AIROHA7230) { pDevice->abyBBVGA[0] = 0x20; ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xE7, pDevice->abyBBVGA[0]); } pDevice->abyBBVGA[2] = 0x10; pDevice->abyBBVGA[3] = 0x10; } else { //request by Jack 2005-04-26 if (pDevice->byRFType == RF_AIROHA7230) { pDevice->abyBBVGA[0] = 0x1C; ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xE7, pDevice->abyBBVGA[0]); } pDevice->abyBBVGA[2] = 0x0; pDevice->abyBBVGA[3] = 0x0; }}/* * * Description: * Do Channel Switch defined in 802.11h * * Parameters: * In: * hDeviceContext - device structure point * Out: * none * * Return Value: none. *-*/BOOLCARDbChannelSwitch ( IN PVOID pDeviceHandler, IN BYTE byMode, IN BYTE byNewChannel, IN BYTE byCount ){ PSDevice pDevice = (PSDevice) pDeviceHandler; BOOL bResult = TRUE; if (byCount == 0) { pDevice->sMgmtObj.uCurrChannel = byNewChannel; bResult = CARDbSetMediaChannel(pDevice, byNewChannel); return(bResult); } pDevice->byChannelSwitchCount = byCount; pDevice->byNewChannel = byNewChannel; pDevice->bChannelSwitch = TRUE; if (byMode == 1) { //bResult=CARDbStopTxPacket(pDevice, PKT_TYPE_802_11_ALL); pDevice->bStopDataPkt = TRUE; } return (bResult); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -