//============================================================================ // Module Name: // MLMETxRx.C // // Description: // The interface between MDS (MAC Data Service) and MLME. // // Revision History: // -------------------------------------------------------------------------- // 200209 UN20 Jennifer Xu // Initial Release // 20021108 PD43 Austin Liu // 20030117 PD43 Austin Liu // Deleted MLMEReturnPacket and MLMEProcThread() // // Copyright (c) 1996-2002 Winbond Electronics Corp. All Rights Reserved. //============================================================================ #include "os_common.h" void MLMEResetTxRx(PWB32_ADAPTER Adapter) { s32 i; // Reset the interface between MDS and MLME for (i = 0; i < MAX_NUM_TX_MMPDU; i++) Adapter->sMlmeFrame.TxMMPDUInUse[i] = FALSE; for (i = 0; i < MAX_NUM_RX_MMPDU; i++) Adapter->sMlmeFrame.SaveRxBufSlotInUse[i] = FALSE; Adapter->sMlmeFrame.wNumRxMMPDUInMLME = 0; Adapter->sMlmeFrame.wNumRxMMPDUDiscarded = 0; Adapter->sMlmeFrame.wNumRxMMPDU = 0; Adapter->sMlmeFrame.wNumTxMMPDUDiscarded = 0; Adapter->sMlmeFrame.wNumTxMMPDU = 0; Adapter->sLocalPara.boCCAbusy = FALSE; Adapter->sLocalPara.iPowerSaveMode = PWR_ACTIVE; // Power active } //============================================================================= // Function: // MLMEGetMMPDUBuffer() // // Description: // Return the pointer to an available data buffer with // the size MAX_MMPDU_SIZE for a MMPDU. // // Arguments: // Adapter - pointer to the miniport adapter context. // // Return value: // NULL : No available data buffer available // Otherwise: Pointer to the data buffer //============================================================================= /* FIXME: Should this just be replaced with kmalloc() and kfree()? */ u8 *MLMEGetMMPDUBuffer(PWB32_ADAPTER Adapter) { s32 i; u8 *returnVal; for (i = 0; i< MAX_NUM_TX_MMPDU; i++) { if (Adapter->sMlmeFrame.TxMMPDUInUse[i] == FALSE) break; } if (i >= MAX_NUM_TX_MMPDU) return NULL; returnVal = (u8 *)&(Adapter->sMlmeFrame.TxMMPDU[i]); Adapter->sMlmeFrame.TxMMPDUInUse[i] = TRUE; return returnVal; } //============================================================================= u8 MLMESendFrame(PWB32_ADAPTER Adapter, u8 *pMMPDU, u16 len, u8 DataType) /* DataType : FRAME_TYPE_802_11_MANAGEMENT, FRAME_TYPE_802_11_MANAGEMENT_CHALLENGE, FRAME_TYPE_802_11_DATA */ { if (Adapter->sMlmeFrame.IsInUsed != PACKET_FREE_TO_USE) { Adapter->sMlmeFrame.wNumTxMMPDUDiscarded++; return FALSE; } Adapter->sMlmeFrame.IsInUsed = PACKET_COME_FROM_MLME; // Keep information for sending Adapter->sMlmeFrame.pMMPDU = pMMPDU; Adapter->sMlmeFrame.DataType = DataType; // len must be the last setting due to QUERY_SIZE_SECOND of Mds Adapter->sMlmeFrame.len = len; Adapter->sMlmeFrame.wNumTxMMPDU++; // H/W will enter power save by set the register. S/W don't send null frame //with PWRMgt bit enbled to enter power save now. // Transmit NDIS packet Mds_Tx(Adapter); return TRUE; } void MLME_GetNextPacket(PADAPTER Adapter, PDESCRIPTOR pDes) { #define DESCRIPTOR_ADD_BUFFER( _D, _A, _S ) \ {\ _D->InternalUsed = _D->buffer_start_index + _D->buffer_number; \ _D->InternalUsed %= MAX_DESCRIPTOR_BUFFER_INDEX; \ _D->buffer_address[ _D->InternalUsed ] = _A; \ _D->buffer_size[ _D->InternalUsed ] = _S; \ _D->buffer_total_size += _S; \ _D->buffer_number++;\ } DESCRIPTOR_ADD_BUFFER( pDes, Adapter->sMlmeFrame.pMMPDU, Adapter->sMlmeFrame.len ); pDes->Type = Adapter->sMlmeFrame.DataType; } void MLMEfreeMMPDUBuffer(PWB32_ADAPTER Adapter, s8 *pData) { int i; // Reclaim the data buffer for (i = 0; i < MAX_NUM_TX_MMPDU; i++) { if (pData == (s8 *)&(Adapter->sMlmeFrame.TxMMPDU[i])) break; } if (Adapter->sMlmeFrame.TxMMPDUInUse[i]) Adapter->sMlmeFrame.TxMMPDUInUse[i] = FALSE; else { // Something wrong // PD43 Add debug code here??? } } void MLME_SendComplete(PADAPTER Adapter, u8 PacketID, unsigned char SendOK) { MLME_TXCALLBACK TxCallback; // Reclaim the data buffer Adapter->sMlmeFrame.len = 0; MLMEfreeMMPDUBuffer( Adapter, Adapter->sMlmeFrame.pMMPDU ); TxCallback.bResult = MLME_SUCCESS; // Return resource Adapter->sMlmeFrame.IsInUsed = PACKET_FREE_TO_USE; }