Pavel Machek | 66101de | 2008-10-01 14:36:56 +0200 | [diff] [blame] | 1 | //============================================================================ |
| 2 | // Module Name: |
| 3 | // MLMETxRx.C |
| 4 | // |
| 5 | // Description: |
| 6 | // The interface between MDS (MAC Data Service) and MLME. |
| 7 | // |
| 8 | // Revision History: |
| 9 | // -------------------------------------------------------------------------- |
| 10 | // 200209 UN20 Jennifer Xu |
| 11 | // Initial Release |
| 12 | // 20021108 PD43 Austin Liu |
| 13 | // 20030117 PD43 Austin Liu |
| 14 | // Deleted MLMEReturnPacket and MLMEProcThread() |
| 15 | // |
| 16 | // Copyright (c) 1996-2002 Winbond Electronics Corp. All Rights Reserved. |
| 17 | //============================================================================ |
Pekka Enberg | 7e797ab | 2009-01-07 17:32:58 +0200 | [diff] [blame] | 18 | #include "sysdef.h" |
Pavel Machek | 66101de | 2008-10-01 14:36:56 +0200 | [diff] [blame] | 19 | |
Pekka Enberg | 80aba53 | 2008-10-30 13:04:29 +0200 | [diff] [blame] | 20 | #include "mds_f.h" |
| 21 | |
Pavel Machek | 66101de | 2008-10-01 14:36:56 +0200 | [diff] [blame] | 22 | //============================================================================= |
Pekka Enberg | 1e8a2b6 | 2008-10-30 16:14:38 +0200 | [diff] [blame] | 23 | u8 MLMESendFrame(struct wbsoft_priv * adapter, u8 *pMMPDU, u16 len, u8 DataType) |
Pavel Machek | 66101de | 2008-10-01 14:36:56 +0200 | [diff] [blame] | 24 | /* DataType : FRAME_TYPE_802_11_MANAGEMENT, FRAME_TYPE_802_11_MANAGEMENT_CHALLENGE, |
| 25 | FRAME_TYPE_802_11_DATA */ |
| 26 | { |
Pekka Enberg | 88ebc4b | 2008-10-22 11:03:19 +0300 | [diff] [blame] | 27 | if (adapter->sMlmeFrame.IsInUsed != PACKET_FREE_TO_USE) { |
| 28 | adapter->sMlmeFrame.wNumTxMMPDUDiscarded++; |
Pekka Enberg | 279b6cc | 2008-10-27 22:46:39 +0200 | [diff] [blame] | 29 | return false; |
Pavel Machek | 66101de | 2008-10-01 14:36:56 +0200 | [diff] [blame] | 30 | } |
Pekka Enberg | 88ebc4b | 2008-10-22 11:03:19 +0300 | [diff] [blame] | 31 | adapter->sMlmeFrame.IsInUsed = PACKET_COME_FROM_MLME; |
Pavel Machek | 66101de | 2008-10-01 14:36:56 +0200 | [diff] [blame] | 32 | |
| 33 | // Keep information for sending |
Pekka Enberg | 88ebc4b | 2008-10-22 11:03:19 +0300 | [diff] [blame] | 34 | adapter->sMlmeFrame.pMMPDU = pMMPDU; |
| 35 | adapter->sMlmeFrame.DataType = DataType; |
Pavel Machek | 66101de | 2008-10-01 14:36:56 +0200 | [diff] [blame] | 36 | // len must be the last setting due to QUERY_SIZE_SECOND of Mds |
Pekka Enberg | 88ebc4b | 2008-10-22 11:03:19 +0300 | [diff] [blame] | 37 | adapter->sMlmeFrame.len = len; |
| 38 | adapter->sMlmeFrame.wNumTxMMPDU++; |
Pavel Machek | 66101de | 2008-10-01 14:36:56 +0200 | [diff] [blame] | 39 | |
| 40 | // H/W will enter power save by set the register. S/W don't send null frame |
| 41 | //with PWRMgt bit enbled to enter power save now. |
| 42 | |
| 43 | // Transmit NDIS packet |
Pekka Enberg | 88ebc4b | 2008-10-22 11:03:19 +0300 | [diff] [blame] | 44 | Mds_Tx(adapter); |
Pekka Enberg | 279b6cc | 2008-10-27 22:46:39 +0200 | [diff] [blame] | 45 | return true; |
Pavel Machek | 66101de | 2008-10-01 14:36:56 +0200 | [diff] [blame] | 46 | } |
| 47 | |
Pekka Enberg | 1e8a2b6 | 2008-10-30 16:14:38 +0200 | [diff] [blame] | 48 | void MLME_GetNextPacket(struct wbsoft_priv *adapter, PDESCRIPTOR desc) |
Pavel Machek | 66101de | 2008-10-01 14:36:56 +0200 | [diff] [blame] | 49 | { |
Pekka Enberg | 3c01ec0 | 2008-10-28 00:14:14 +0200 | [diff] [blame] | 50 | desc->InternalUsed = desc->buffer_start_index + desc->buffer_number; |
| 51 | desc->InternalUsed %= MAX_DESCRIPTOR_BUFFER_INDEX; |
| 52 | desc->buffer_address[desc->InternalUsed] = adapter->sMlmeFrame.pMMPDU; |
| 53 | desc->buffer_size[desc->InternalUsed] = adapter->sMlmeFrame.len; |
| 54 | desc->buffer_total_size += adapter->sMlmeFrame.len; |
| 55 | desc->buffer_number++; |
| 56 | desc->Type = adapter->sMlmeFrame.DataType; |
Pavel Machek | 66101de | 2008-10-01 14:36:56 +0200 | [diff] [blame] | 57 | } |
| 58 | |
Pekka Enberg | 7cd5613 | 2008-10-30 19:04:51 +0200 | [diff] [blame] | 59 | static void MLMEfreeMMPDUBuffer(struct wbsoft_priv *adapter, s8 *pData) |
Pavel Machek | 66101de | 2008-10-01 14:36:56 +0200 | [diff] [blame] | 60 | { |
| 61 | int i; |
| 62 | |
| 63 | // Reclaim the data buffer |
| 64 | for (i = 0; i < MAX_NUM_TX_MMPDU; i++) { |
Pekka Enberg | 88ebc4b | 2008-10-22 11:03:19 +0300 | [diff] [blame] | 65 | if (pData == (s8 *)&(adapter->sMlmeFrame.TxMMPDU[i])) |
Pavel Machek | 66101de | 2008-10-01 14:36:56 +0200 | [diff] [blame] | 66 | break; |
| 67 | } |
Pekka Enberg | 88ebc4b | 2008-10-22 11:03:19 +0300 | [diff] [blame] | 68 | if (adapter->sMlmeFrame.TxMMPDUInUse[i]) |
Pekka Enberg | 279b6cc | 2008-10-27 22:46:39 +0200 | [diff] [blame] | 69 | adapter->sMlmeFrame.TxMMPDUInUse[i] = false; |
Pavel Machek | 66101de | 2008-10-01 14:36:56 +0200 | [diff] [blame] | 70 | else { |
| 71 | // Something wrong |
| 72 | // PD43 Add debug code here??? |
| 73 | } |
| 74 | } |
| 75 | |
| 76 | void |
Pekka Enberg | 1e8a2b6 | 2008-10-30 16:14:38 +0200 | [diff] [blame] | 77 | MLME_SendComplete(struct wbsoft_priv * adapter, u8 PacketID, unsigned char SendOK) |
Pavel Machek | 66101de | 2008-10-01 14:36:56 +0200 | [diff] [blame] | 78 | { |
| 79 | MLME_TXCALLBACK TxCallback; |
| 80 | |
| 81 | // Reclaim the data buffer |
Pekka Enberg | 88ebc4b | 2008-10-22 11:03:19 +0300 | [diff] [blame] | 82 | adapter->sMlmeFrame.len = 0; |
| 83 | MLMEfreeMMPDUBuffer( adapter, adapter->sMlmeFrame.pMMPDU ); |
Pavel Machek | 66101de | 2008-10-01 14:36:56 +0200 | [diff] [blame] | 84 | |
| 85 | |
| 86 | TxCallback.bResult = MLME_SUCCESS; |
| 87 | |
| 88 | // Return resource |
Pekka Enberg | 88ebc4b | 2008-10-22 11:03:19 +0300 | [diff] [blame] | 89 | adapter->sMlmeFrame.IsInUsed = PACKET_FREE_TO_USE; |
Pavel Machek | 66101de | 2008-10-01 14:36:56 +0200 | [diff] [blame] | 90 | } |
| 91 | |
| 92 | |
| 93 | |