| /* ============================================================================ |
| 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; |
| } |
| |
| |
| |