VOID write_tmac_info_tim(RTMP_ADAPTER *pAd, INT apidx, UCHAR *tmac_buf, HTTRANSMIT_SETTING *BeaconTransmit, ULONG frmLen) { MAC_TX_INFO mac_info; NdisZeroMemory((UCHAR *)&mac_info, sizeof(mac_info)); #ifdef MT_MAC mac_info.Type = FC_TYPE_MGMT; mac_info.SubType = SUBTYPE_BEACON; #endif mac_info.FRAG = FALSE; mac_info.CFACK = FALSE; mac_info.InsTimestamp = FALSE; mac_info.AMPDU = FALSE; mac_info.BM = 1; mac_info.Ack = FALSE; mac_info.NSeq = TRUE; mac_info.BASize = 0; mac_info.WCID = 0; mac_info.Length = frmLen; mac_info.PID = PID_MGMT; mac_info.TID = 0; mac_info.TxRate = 0; mac_info.Txopmode = IFS_HTTXOP; mac_info.q_idx = Q_IDX_BCN; mac_info.hdr_len = 24; mac_info.bss_idx = apidx; mac_info.SpeEn = 1; mac_info.Preamble = LONG_PREAMBLE; write_tmac_info(pAd, tmac_buf, &mac_info, BeaconTransmit); }
VOID write_tmac_info_beacon(RTMP_ADAPTER *pAd, INT apidx, UCHAR *tmac_buf, HTTRANSMIT_SETTING *BeaconTransmit, ULONG frmLen) { MAC_TX_INFO mac_info; NdisZeroMemory((UCHAR *)&mac_info, sizeof(mac_info)); mac_info.FRAG = FALSE; mac_info.CFACK = FALSE; mac_info.InsTimestamp = TRUE; mac_info.AMPDU = FALSE; mac_info.BM = 1; mac_info.Ack = FALSE; mac_info.NSeq = TRUE; mac_info.BASize = 0; mac_info.WCID = RESERVED_WCID; mac_info.Length = frmLen; mac_info.PID = PID_MGMT; mac_info.TID = 0; mac_info.TxRate = 0; mac_info.Txopmode = IFS_HTTXOP; mac_info.Preamble = LONG_PREAMBLE; write_tmac_info(pAd, tmac_buf, &mac_info, BeaconTransmit); #ifdef SPECIFIC_TX_POWER_SUPPORT /* Specific Power for Long-Range Beacon */ if ((pAd->ApCfg.MBSSID[apidx].TxPwrAdj != -1) && (BeaconTransmit->field.MODE == MODE_CCK)) { UCHAR TxPwrAdj = 0; TXWI_STRUC *pTxWI = (TXWI_STRUC *)tmac_buf; TxPwrAdj = pAd->ApCfg.MBSSID[apidx].TxPwrAdj; #ifdef RTMP_MAC if (pAd->chipCap.hif_type == HIF_RTMP) pTxWI->TXWI_O.TxPwrAdj = TxPwrAdj; #endif /* RTMP_MAC */ #ifdef RLT_MAC if (pAd->chipCap.hif_type == HIF_RLT) pTxWI->TXWI_N.TxPwrAdj = TxPwrAdj; #endif /* RLT_MAC */ } #endif /* SPECIFIC_TX_POWER_SUPPORT */ }
VOID PrepareProtectionFrame( IN PRTMP_ADAPTER pAd, IN ULONG Type, IN ULONG Number, IN ULONG NAV, IN ULONG OPMode, IN PMAC_TABLE_ENTRY pEntry) { HEADER_802_11 ProtectionFrame; TXWI_STRUC ProtectionFrameTxWI; TXWI_STRUC *pTxWI; UCHAR *ptr = NULL; UINT i = 0; //PHY_CFG PhyCfg = {0}; UCHAR Wcid = 0; UCHAR Length = 0; ULONG FrameAddress = 0; BOOLEAN Ack = FALSE; DBGPRINT(RT_DEBUG_TRACE, ("==>PrepareProtectionFrame\n")); NdisZeroMemory(&ProtectionFrameTxWI, sizeof(TXWI_STRUC)); NdisZeroMemory(&ProtectionFrame, sizeof(HEADER_802_11)); //ProtectionFrame.FC.Type = BTYPE_DATA; switch (Type){ case CTSTOSELF: ProtectionFrame.FC.Type =FC_TYPE_CNTL; ProtectionFrame.FC.SubType = SUBTYPE_CTS; break; case CFEND: ProtectionFrame.FC.Type = FC_TYPE_CNTL; ProtectionFrame.FC.SubType = SUBTYPE_CFEND; break; case POWERSAVE1: ProtectionFrame.FC.Type =FC_TYPE_DATA; ProtectionFrame.FC.SubType = SUBTYPE_DATA_NULL; ProtectionFrame.FC.PwrMgmt = PWR_SAVE; ProtectionFrame.FC.ToDs = 1; ProtectionFrame.FC.FrDs = 0; break; case POWERSAVE0: ProtectionFrame.FC.Type =FC_TYPE_DATA; ProtectionFrame.FC.SubType = SUBTYPE_DATA_NULL; ProtectionFrame.FC.PwrMgmt = PWR_ACTIVE; ProtectionFrame.FC.ToDs = 1; ProtectionFrame.FC.FrDs = 0; break; } if (Type == CTSTOSELF) { COPY_MAC_ADDR(ProtectionFrame.Addr1, pAd->CurrentAddress); ProtectionFrame.Duration = (USHORT)NAV; Wcid = 0xff; Length = 10; } else if (Type == CFEND) { COPY_MAC_ADDR(ProtectionFrame.Addr1, BROADCAST_ADDR); COPY_MAC_ADDR(ProtectionFrame.Addr2, pAd->CurrentAddress); ProtectionFrame.Duration = 0; Wcid = 0xff; Length = 16; } else { pAd->Sequence = (pAd->Sequence+1) & MAXSEQ;//((pAd->Sequence) + 1) & (MAX_SEQ_NUMBER); ProtectionFrame.Sequence = pAd->Sequence; ProtectionFrame.Duration = RTMPCalcDuration(pAd, RATE_1, 14); COPY_MAC_ADDR(ProtectionFrame.Addr1, pEntry->Addr); COPY_MAC_ADDR(ProtectionFrame.Addr2, pAd->CurrentAddress); COPY_MAC_ADDR(ProtectionFrame.Addr3, pAd->CommonCfg.Bssid); Ack =TRUE; Wcid = BSSID_WCID; Length = sizeof(HEADER_802_11) ; } pTxWI = (TXWI_STRUC *)&ProtectionFrameTxWI; //write_tmac_info(pAd, (UCHAR *)pTxWI, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, 0, BSSID_WCID, Length, // 0, 0, (UCHAR)pAd->CommonCfg.MlmeTransmit.field.MCS, IFS_HTTXOP, &pAd->CommonCfg.MlmeTransmit); write_tmac_info(pAd, (UCHAR *)pTxWI, FALSE, FALSE, FALSE, FALSE, FALSE, 0, 0, pEntry->Aid, Length, 0, 0, (UCHAR)pAd->CommonCfg.MlmeTransmit.field.MCS, IFS_HTTXOP, &pAd->CommonCfg.MlmeTransmit); pTxWI->TXWI_N.PHYMODE = MODE_CCK; pTxWI->TXWI_N.MCS= 0; if (Number == 0) { FrameAddress = HW_NULL_BASE + 0x4000; } else if (Number == 1) { FrameAddress = HW_NULL2_BASE + 0x4000; } else { //trigger number 0/1 is belong to null number address //Beacon address from D000 FrameAddress = 0xD000 + (0x200*(Number-2)); } DBGPRINT(RT_DEBUG_TRACE, ("Protection FrameAddress =0x%08x \n", (UINT32)FrameAddress)); // // Move TXWI and frame content to on-chip memory // ptr = (PUCHAR)&ProtectionFrameTxWI; for (i=0; i<pAd->chipCap.TXWISize; i+=4) // 24-byte TXINFO field { RTMP_IO_WRITE32(pAd, FrameAddress + i, *((UINT32 *)ptr)); ptr +=4 ; } ptr = (PUCHAR)&ProtectionFrame; DBGPRINT(RT_DEBUG_TRACE, ("Type =%lu \n",Type)); hex_dump("PrepareProtectionFrame" ,ptr, Length); for (i = 0; i < Length; i+=4) { RTMP_IO_WRITE32(pAd, FrameAddress + pAd->chipCap.TXWISize + i, *((UINT32 *)ptr)); ptr +=4; } }