📄 card.c
字号:
swGetCCKControlRate(pDevice, RATE_1M), PK_TYPE_11B, &awLen[0], &abyServ[0], &abySignal[0] ); ///RSPINF_b_2 BBvCaculateParameter(pDevice, 14, swGetCCKControlRate(pDevice, RATE_2M), PK_TYPE_11B, &awLen[1], &abyServ[1], &abySignal[1] ); //RSPINF_b_5 BBvCaculateParameter(pDevice, 14, swGetCCKControlRate(pDevice, RATE_5M), PK_TYPE_11B, &awLen[2], &abyServ[2], &abySignal[2] ); //RSPINF_b_11 BBvCaculateParameter(pDevice, 14, swGetCCKControlRate(pDevice, RATE_11M), PK_TYPE_11B, &awLen[3], &abyServ[3], &abySignal[3] ); //RSPINF_a_6 CARDvCaculateOFDMRParameter (RATE_6M, byBBType, &abyTxRate[0], &abyRsvTime[0]); //RSPINF_a_9 CARDvCaculateOFDMRParameter (RATE_9M, byBBType, &abyTxRate[1], &abyRsvTime[1]); //RSPINF_a_12 CARDvCaculateOFDMRParameter (RATE_12M, byBBType, &abyTxRate[2], &abyRsvTime[2]); //RSPINF_a_18 CARDvCaculateOFDMRParameter (RATE_18M, byBBType, &abyTxRate[3], &abyRsvTime[3]); //RSPINF_a_24 CARDvCaculateOFDMRParameter (RATE_24M, byBBType, &abyTxRate[4], &abyRsvTime[4]); //RSPINF_a_36 CARDvCaculateOFDMRParameter (swGetOFDMControlRate(pDevice, RATE_36M), byBBType, &abyTxRate[5], &abyRsvTime[5]); //RSPINF_a_48 CARDvCaculateOFDMRParameter (swGetOFDMControlRate(pDevice, RATE_48M), byBBType, &abyTxRate[6], &abyRsvTime[6]); //RSPINF_a_54 CARDvCaculateOFDMRParameter (swGetOFDMControlRate(pDevice, RATE_54M), byBBType, &abyTxRate[7], &abyRsvTime[7]); //RSPINF_a_72 CARDvCaculateOFDMRParameter (swGetOFDMControlRate(pDevice, RATE_54M), byBBType, &abyTxRate[8], &abyRsvTime[8]); abyData[0] = (BYTE)(awLen[0]&0xFF); abyData[1] = (BYTE)(awLen[0]>>8); abyData[2] = abySignal[0]; abyData[3] = abyServ[0]; abyData[4] = (BYTE)(awLen[1]&0xFF); abyData[5] = (BYTE)(awLen[1]>>8); abyData[6] = abySignal[1]; abyData[7] = abyServ[1]; abyData[8] = (BYTE)(awLen[2]&0xFF); abyData[9] = (BYTE)(awLen[2]>>8); abyData[10] = abySignal[2]; abyData[11] = abyServ[2]; abyData[12] = (BYTE)(awLen[3]&0xFF); abyData[13] = (BYTE)(awLen[3]>>8); abyData[14] = abySignal[3]; abyData[15] = abyServ[3]; for(i=0;i<9;i++) { abyData[16+i*2] = abyTxRate[i]; abyData[16+i*2+1] = abyRsvTime[i]; } CONTROLnsRequestOut(pDevice, MESSAGE_TYPE_WRITE, MAC_REG_RSPINF_B_1, MESSAGE_REQUEST_MACREG, 34, &abyData[0]);}/* * Description: Update IFS * * Parameters: * In: * pDevice - The adapter to be set * Out: * none * * Return Value: None. * */void vUpdateIFS (PVOID pDeviceHandler){ PSDevice pDevice = (PSDevice) pDeviceHandler; //Set SIFS, DIFS, EIFS, SlotTime, CwMin BYTE byMaxMin = 0; BYTE byData[4]; if (pDevice->byPacketType==PK_TYPE_11A) {//0000 0000 0000 0000,11a pDevice->uSlot = C_SLOT_SHORT; pDevice->uSIFS = C_SIFS_A; pDevice->uDIFS = C_SIFS_A + 2*C_SLOT_SHORT; pDevice->uCwMin = C_CWMIN_A; byMaxMin = 4; } else if (pDevice->byPacketType==PK_TYPE_11B) {//0000 0001 0000 0000,11b pDevice->uSlot = C_SLOT_LONG; pDevice->uSIFS = C_SIFS_BG; pDevice->uDIFS = C_SIFS_BG + 2*C_SLOT_LONG; pDevice->uCwMin = C_CWMIN_B; byMaxMin = 5; } else {// PK_TYPE_11GA & PK_TYPE_11GB BYTE byRate = 0; BOOL bOFDMRate = FALSE; UINT ii = 0; PWLAN_IE_SUPP_RATES pItemRates = NULL; pDevice->uSIFS = C_SIFS_BG; if (pDevice->bShortSlotTime) { pDevice->uSlot = C_SLOT_SHORT; } else { pDevice->uSlot = C_SLOT_LONG; } pDevice->uDIFS = C_SIFS_BG + 2*pDevice->uSlot; pItemRates = (PWLAN_IE_SUPP_RATES)pDevice->sMgmtObj.abyCurrSuppRates; for (ii = 0; ii < pItemRates->len; ii++) { byRate = (BYTE)(pItemRates->abyRates[ii]&0x7F); if (RATEwGetRateIdx(byRate) > RATE_11M) { bOFDMRate = TRUE; break; } } if (bOFDMRate == FALSE) { pItemRates = (PWLAN_IE_SUPP_RATES)pDevice->sMgmtObj.abyCurrExtSuppRates; for (ii = 0; ii < pItemRates->len; ii++) { byRate = (BYTE)(pItemRates->abyRates[ii]&0x7F); if (RATEwGetRateIdx(byRate) > RATE_11M) { bOFDMRate = TRUE; break; } } } if (bOFDMRate == TRUE) { pDevice->uCwMin = C_CWMIN_A; byMaxMin = 4; } else { pDevice->uCwMin = C_CWMIN_B; byMaxMin = 5; } } pDevice->uCwMax = C_CWMAX; pDevice->uEIFS = C_EIFS; byData[0] = (BYTE)pDevice->uSIFS; byData[1] = (BYTE)pDevice->uDIFS; byData[2] = (BYTE)pDevice->uEIFS; byData[3] = (BYTE)pDevice->uSlot; CONTROLnsRequestOut(pDevice, MESSAGE_TYPE_WRITE, MAC_REG_SIFS, MESSAGE_REQUEST_MACREG, 4, &byData[0]); byMaxMin |= 0xA0;//1010 1111,C_CWMAX = 1023 CONTROLnsRequestOut(pDevice, MESSAGE_TYPE_WRITE, MAC_REG_CWMAXMIN0, MESSAGE_REQUEST_MACREG, 1, &byMaxMin);}void CARDvUpdateBasicTopRate (PVOID pDeviceHandler){PSDevice pDevice = (PSDevice) pDeviceHandler; BYTE byTopOFDM = RATE_24M, byTopCCK = RATE_1M;BYTE ii; //Determines the highest basic rate. for (ii = RATE_54M; ii >= RATE_6M; ii --) { if ( (pDevice->wBasicRate) & ((WORD)(1<<ii)) ) { byTopOFDM = ii; break; } } pDevice->byTopOFDMBasicRate = byTopOFDM; for (ii = RATE_11M;; ii --) { if ( (pDevice->wBasicRate) & ((WORD)(1<<ii)) ) { byTopCCK = ii; break; } if (ii == RATE_1M) break; } pDevice->byTopCCKBasicRate = byTopCCK; }/* * Description: Set NIC Tx Basic Rate * * Parameters: * In: * pDevice - The adapter to be set * wBasicRate - Basic Rate to be set * Out: * none * * Return Value: TRUE if succeeded; FALSE if failed. * */BOOL CARDbAddBasicRate (PVOID pDeviceHandler, WORD wRateIdx){PSDevice pDevice = (PSDevice) pDeviceHandler; WORD wRate = (WORD)(1<<wRateIdx); pDevice->wBasicRate |= wRate; //Determines the highest basic rate. CARDvUpdateBasicTopRate(pDevice); return(TRUE);}BOOL CARDbIsOFDMinBasicRate (PVOID pDeviceHandler){PSDevice pDevice = (PSDevice) pDeviceHandler; int ii; for (ii = RATE_54M; ii >= RATE_6M; ii --) { if ((pDevice->wBasicRate) & ((WORD)(1<<ii))) return TRUE; } return FALSE;}BYTE CARDbyGetPktType (PVOID pDeviceHandler){ PSDevice pDevice = (PSDevice) pDeviceHandler; if (pDevice->byBBType == BB_TYPE_11A || pDevice->byBBType == BB_TYPE_11B) { return (BYTE)pDevice->byBBType; } else if (CARDbIsOFDMinBasicRate(pDevice)) { return PK_TYPE_11GA; } else { return PK_TYPE_11GB; }}/* * Description: Caculate TSF offset of two TSF input * Get TSF Offset from RxBCN's TSF and local TSF * * Parameters: * In: * pDevice - The adapter to be sync. * qwTSF1 - Rx BCN's TSF * qwTSF2 - Local TSF * Out: * none * * Return Value: TSF Offset value * */QWORD CARDqGetTSFOffset (BYTE byRxRate, QWORD qwTSF1, QWORD qwTSF2){ QWORD qwTSFOffset; WORD wRxBcnTSFOffst = 0; HIDWORD(qwTSFOffset) = 0; LODWORD(qwTSFOffset) = 0; wRxBcnTSFOffst = cwRXBCNTSFOff[byRxRate%MAX_RATE]; (qwTSF2).u.dwLowDword += (DWORD)(wRxBcnTSFOffst); if ((qwTSF2).u.dwLowDword < (DWORD)(wRxBcnTSFOffst)) { (qwTSF2).u.dwHighDword++; } LODWORD(qwTSFOffset) = LODWORD(qwTSF1) - LODWORD(qwTSF2); if (LODWORD(qwTSF1) < LODWORD(qwTSF2)) { // if borrow needed HIDWORD(qwTSFOffset) = HIDWORD(qwTSF1) - HIDWORD(qwTSF2) - 1 ; } else { HIDWORD(qwTSFOffset) = HIDWORD(qwTSF1) - HIDWORD(qwTSF2); }; return (qwTSFOffset);}/* * Description: Sync. TSF counter to BSS * Get TSF offset and write to HW * * Parameters: * In: * pDevice - The adapter to be sync. * qwBSSTimestamp - Rx BCN's TSF * qwLocalTSF - Local TSF * Out: * none * * Return Value: none * */void CARDvAdjustTSF (PVOID pDeviceHandler, BYTE byRxRate, QWORD qwBSSTimestamp, QWORD qwLocalTSF){ PSDevice pDevice = (PSDevice) pDeviceHandler; QWORD qwTSFOffset; DWORD dwTSFOffset1,dwTSFOffset2; BYTE pbyData[8]; HIDWORD(qwTSFOffset) = 0; LODWORD(qwTSFOffset) = 0; qwTSFOffset = CARDqGetTSFOffset(byRxRate, qwBSSTimestamp, qwLocalTSF); // adjust TSF // HW's TSF add TSF Offset reg dwTSFOffset1 = LODWORD(qwTSFOffset); dwTSFOffset2 = HIDWORD(qwTSFOffset); pbyData[0] = (BYTE)dwTSFOffset1; pbyData[1] = (BYTE)(dwTSFOffset1>>8); pbyData[2] = (BYTE)(dwTSFOffset1>>16); pbyData[3] = (BYTE)(dwTSFOffset1>>24); pbyData[4] = (BYTE)dwTSFOffset2; pbyData[5] = (BYTE)(dwTSFOffset2>>8);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -