blob: 643ceb060d562d4abc01bdd2ebcb97d25c2d555e [file] [log] [blame]
Pavel Machek66101de2008-10-01 14:36:56 +02001//============================================================================
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 Enberg7e797ab2009-01-07 17:32:58 +020018#include "sysdef.h"
Pavel Machek66101de2008-10-01 14:36:56 +020019
Pekka Enberg80aba532008-10-30 13:04:29 +020020#include "mds_f.h"
21
Pavel Machek66101de2008-10-01 14:36:56 +020022//=============================================================================
Pekka Enberg1e8a2b62008-10-30 16:14:38 +020023u8 MLMESendFrame(struct wbsoft_priv * adapter, u8 *pMMPDU, u16 len, u8 DataType)
Pavel Machek66101de2008-10-01 14:36:56 +020024/* DataType : FRAME_TYPE_802_11_MANAGEMENT, FRAME_TYPE_802_11_MANAGEMENT_CHALLENGE,
25 FRAME_TYPE_802_11_DATA */
26{
Pekka Enberg88ebc4b2008-10-22 11:03:19 +030027 if (adapter->sMlmeFrame.IsInUsed != PACKET_FREE_TO_USE) {
28 adapter->sMlmeFrame.wNumTxMMPDUDiscarded++;
Pekka Enberg279b6cc2008-10-27 22:46:39 +020029 return false;
Pavel Machek66101de2008-10-01 14:36:56 +020030 }
Pekka Enberg88ebc4b2008-10-22 11:03:19 +030031 adapter->sMlmeFrame.IsInUsed = PACKET_COME_FROM_MLME;
Pavel Machek66101de2008-10-01 14:36:56 +020032
33 // Keep information for sending
Pekka Enberg88ebc4b2008-10-22 11:03:19 +030034 adapter->sMlmeFrame.pMMPDU = pMMPDU;
35 adapter->sMlmeFrame.DataType = DataType;
Pavel Machek66101de2008-10-01 14:36:56 +020036 // len must be the last setting due to QUERY_SIZE_SECOND of Mds
Pekka Enberg88ebc4b2008-10-22 11:03:19 +030037 adapter->sMlmeFrame.len = len;
38 adapter->sMlmeFrame.wNumTxMMPDU++;
Pavel Machek66101de2008-10-01 14:36:56 +020039
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 Enberg88ebc4b2008-10-22 11:03:19 +030044 Mds_Tx(adapter);
Pekka Enberg279b6cc2008-10-27 22:46:39 +020045 return true;
Pavel Machek66101de2008-10-01 14:36:56 +020046}
47
Pekka Enberg1e8a2b62008-10-30 16:14:38 +020048void MLME_GetNextPacket(struct wbsoft_priv *adapter, PDESCRIPTOR desc)
Pavel Machek66101de2008-10-01 14:36:56 +020049{
Pekka Enberg3c01ec02008-10-28 00:14:14 +020050 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 Machek66101de2008-10-01 14:36:56 +020057}
58
Pekka Enberg7cd56132008-10-30 19:04:51 +020059static void MLMEfreeMMPDUBuffer(struct wbsoft_priv *adapter, s8 *pData)
Pavel Machek66101de2008-10-01 14:36:56 +020060{
61 int i;
62
63 // Reclaim the data buffer
64 for (i = 0; i < MAX_NUM_TX_MMPDU; i++) {
Pekka Enberg88ebc4b2008-10-22 11:03:19 +030065 if (pData == (s8 *)&(adapter->sMlmeFrame.TxMMPDU[i]))
Pavel Machek66101de2008-10-01 14:36:56 +020066 break;
67 }
Pekka Enberg88ebc4b2008-10-22 11:03:19 +030068 if (adapter->sMlmeFrame.TxMMPDUInUse[i])
Pekka Enberg279b6cc2008-10-27 22:46:39 +020069 adapter->sMlmeFrame.TxMMPDUInUse[i] = false;
Pavel Machek66101de2008-10-01 14:36:56 +020070 else {
71 // Something wrong
72 // PD43 Add debug code here???
73 }
74}
75
76void
Pekka Enberg1e8a2b62008-10-30 16:14:38 +020077MLME_SendComplete(struct wbsoft_priv * adapter, u8 PacketID, unsigned char SendOK)
Pavel Machek66101de2008-10-01 14:36:56 +020078{
79 MLME_TXCALLBACK TxCallback;
80
81 // Reclaim the data buffer
Pekka Enberg88ebc4b2008-10-22 11:03:19 +030082 adapter->sMlmeFrame.len = 0;
83 MLMEfreeMMPDUBuffer( adapter, adapter->sMlmeFrame.pMMPDU );
Pavel Machek66101de2008-10-01 14:36:56 +020084
85
86 TxCallback.bResult = MLME_SUCCESS;
87
88 // Return resource
Pekka Enberg88ebc4b2008-10-22 11:03:19 +030089 adapter->sMlmeFrame.IsInUsed = PACKET_FREE_TO_USE;
Pavel Machek66101de2008-10-01 14:36:56 +020090}
91
92
93