Commit | Line | Data |
---|---|---|
66101de1 PM |
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 | //============================================================================ | |
18 | #include "os_common.h" | |
19 | ||
20 | void MLMEResetTxRx(PWB32_ADAPTER Adapter) | |
21 | { | |
22 | s32 i; | |
23 | ||
24 | // Reset the interface between MDS and MLME | |
25 | for (i = 0; i < MAX_NUM_TX_MMPDU; i++) | |
26 | Adapter->sMlmeFrame.TxMMPDUInUse[i] = FALSE; | |
27 | for (i = 0; i < MAX_NUM_RX_MMPDU; i++) | |
28 | Adapter->sMlmeFrame.SaveRxBufSlotInUse[i] = FALSE; | |
29 | ||
30 | Adapter->sMlmeFrame.wNumRxMMPDUInMLME = 0; | |
31 | Adapter->sMlmeFrame.wNumRxMMPDUDiscarded = 0; | |
32 | Adapter->sMlmeFrame.wNumRxMMPDU = 0; | |
33 | Adapter->sMlmeFrame.wNumTxMMPDUDiscarded = 0; | |
34 | Adapter->sMlmeFrame.wNumTxMMPDU = 0; | |
35 | Adapter->sLocalPara.boCCAbusy = FALSE; | |
36 | Adapter->sLocalPara.iPowerSaveMode = PWR_ACTIVE; // Power active | |
37 | } | |
38 | ||
39 | //============================================================================= | |
40 | // Function: | |
41 | // MLMEGetMMPDUBuffer() | |
42 | // | |
43 | // Description: | |
44 | // Return the pointer to an available data buffer with | |
45 | // the size MAX_MMPDU_SIZE for a MMPDU. | |
46 | // | |
47 | // Arguments: | |
48 | // Adapter - pointer to the miniport adapter context. | |
49 | // | |
50 | // Return value: | |
51 | // NULL : No available data buffer available | |
52 | // Otherwise: Pointer to the data buffer | |
53 | //============================================================================= | |
54 | ||
55 | /* FIXME: Should this just be replaced with kmalloc() and kfree()? */ | |
56 | u8 *MLMEGetMMPDUBuffer(PWB32_ADAPTER Adapter) | |
57 | { | |
58 | s32 i; | |
59 | u8 *returnVal; | |
60 | ||
61 | for (i = 0; i< MAX_NUM_TX_MMPDU; i++) { | |
62 | if (Adapter->sMlmeFrame.TxMMPDUInUse[i] == FALSE) | |
63 | break; | |
64 | } | |
65 | if (i >= MAX_NUM_TX_MMPDU) return NULL; | |
66 | ||
67 | returnVal = (u8 *)&(Adapter->sMlmeFrame.TxMMPDU[i]); | |
68 | Adapter->sMlmeFrame.TxMMPDUInUse[i] = TRUE; | |
69 | ||
70 | return returnVal; | |
71 | } | |
72 | ||
73 | //============================================================================= | |
74 | u8 MLMESendFrame(PWB32_ADAPTER Adapter, u8 *pMMPDU, u16 len, u8 DataType) | |
75 | /* DataType : FRAME_TYPE_802_11_MANAGEMENT, FRAME_TYPE_802_11_MANAGEMENT_CHALLENGE, | |
76 | FRAME_TYPE_802_11_DATA */ | |
77 | { | |
78 | if (Adapter->sMlmeFrame.IsInUsed != PACKET_FREE_TO_USE) { | |
79 | Adapter->sMlmeFrame.wNumTxMMPDUDiscarded++; | |
80 | return FALSE; | |
81 | } | |
82 | Adapter->sMlmeFrame.IsInUsed = PACKET_COME_FROM_MLME; | |
83 | ||
84 | // Keep information for sending | |
85 | Adapter->sMlmeFrame.pMMPDU = pMMPDU; | |
86 | Adapter->sMlmeFrame.DataType = DataType; | |
87 | // len must be the last setting due to QUERY_SIZE_SECOND of Mds | |
88 | Adapter->sMlmeFrame.len = len; | |
89 | Adapter->sMlmeFrame.wNumTxMMPDU++; | |
90 | ||
91 | // H/W will enter power save by set the register. S/W don't send null frame | |
92 | //with PWRMgt bit enbled to enter power save now. | |
93 | ||
94 | // Transmit NDIS packet | |
95 | Mds_Tx(Adapter); | |
96 | return TRUE; | |
97 | } | |
98 | ||
99 | void | |
100 | MLME_GetNextPacket(PADAPTER Adapter, PDESCRIPTOR pDes) | |
101 | { | |
102 | #define DESCRIPTOR_ADD_BUFFER( _D, _A, _S ) \ | |
103 | {\ | |
104 | _D->InternalUsed = _D->buffer_start_index + _D->buffer_number; \ | |
105 | _D->InternalUsed %= MAX_DESCRIPTOR_BUFFER_INDEX; \ | |
106 | _D->buffer_address[ _D->InternalUsed ] = _A; \ | |
107 | _D->buffer_size[ _D->InternalUsed ] = _S; \ | |
108 | _D->buffer_total_size += _S; \ | |
109 | _D->buffer_number++;\ | |
110 | } | |
111 | ||
112 | DESCRIPTOR_ADD_BUFFER( pDes, Adapter->sMlmeFrame.pMMPDU, Adapter->sMlmeFrame.len ); | |
113 | pDes->Type = Adapter->sMlmeFrame.DataType; | |
114 | } | |
115 | ||
8b384e0c | 116 | void MLMEfreeMMPDUBuffer(PWB32_ADAPTER Adapter, s8 *pData) |
66101de1 PM |
117 | { |
118 | int i; | |
119 | ||
120 | // Reclaim the data buffer | |
121 | for (i = 0; i < MAX_NUM_TX_MMPDU; i++) { | |
8b384e0c | 122 | if (pData == (s8 *)&(Adapter->sMlmeFrame.TxMMPDU[i])) |
66101de1 PM |
123 | break; |
124 | } | |
125 | if (Adapter->sMlmeFrame.TxMMPDUInUse[i]) | |
126 | Adapter->sMlmeFrame.TxMMPDUInUse[i] = FALSE; | |
127 | else { | |
128 | // Something wrong | |
129 | // PD43 Add debug code here??? | |
130 | } | |
131 | } | |
132 | ||
133 | void | |
134 | MLME_SendComplete(PADAPTER Adapter, u8 PacketID, unsigned char SendOK) | |
135 | { | |
136 | MLME_TXCALLBACK TxCallback; | |
137 | ||
138 | // Reclaim the data buffer | |
139 | Adapter->sMlmeFrame.len = 0; | |
140 | MLMEfreeMMPDUBuffer( Adapter, Adapter->sMlmeFrame.pMMPDU ); | |
141 | ||
142 | ||
143 | TxCallback.bResult = MLME_SUCCESS; | |
144 | ||
145 | // Return resource | |
146 | Adapter->sMlmeFrame.IsInUsed = PACKET_FREE_TO_USE; | |
147 | } | |
148 | ||
149 | ||
150 |