| //============================================================================ |
| // 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 "sysdef.h" |
| |
| #include "mds_f.h" |
| |
| //============================================================================= |
| u8 MLMESendFrame(struct wbsoft_priv * 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(struct wbsoft_priv *adapter, struct wb35_descriptor *desc) |
| { |
| desc->InternalUsed = desc->buffer_start_index + desc->buffer_number; |
| desc->InternalUsed %= MAX_DESCRIPTOR_BUFFER_INDEX; |
| desc->buffer_address[desc->InternalUsed] = adapter->sMlmeFrame.pMMPDU; |
| desc->buffer_size[desc->InternalUsed] = adapter->sMlmeFrame.len; |
| desc->buffer_total_size += adapter->sMlmeFrame.len; |
| desc->buffer_number++; |
| desc->Type = adapter->sMlmeFrame.DataType; |
| } |
| |
| static void MLMEfreeMMPDUBuffer(struct wbsoft_priv *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(struct wbsoft_priv * 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; |
| } |
| |
| |
| |