1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
|
#ifndef __INC_TRANSMIT_H
#define __INC_TRANSMIT_H
/*---------------------------Define---------------------------------------------*/
//
// <Roger_Notes> We using different FW fragment size for PCIe and Usb interface respectively.
// 2009.05.05.
//
#define RT_LOCAL_FW_BUF_SIZE 0x8000 // size 32k
#if TX_AGGREGATION
#define MAX_TX_AGG_PKT 15
#endif
#define PACKET_NORMAL 0
#define PACKET_DHCP 1
#define PACKET_ARP 2
#define PACKET_EAPOL 3
#define MAX_FIRMWARE_CODE_SIZE 0x40000//0x5000 // Firmware Local buffer size. 92C should not use the buffer.
#define UNSPECIFIED_QUEUE_ID 0xff
#define UNSPECIFIED_DATA_RATE 0xffff
#define RT_TCB_FLAG_USE_COALESCE_BUFFER BIT0 // Set if coalesce is turned ON
#define RT_TCB_FLAG_USE_PACKET_SHIFT BIT1
#define RT_TCB_FLAG_PS_REPLY_PS_POLL BIT2 // This packet is sent from replying the PS-Poll sent by the PS mode client.
#define RT_TCB_FLAG_PS_MCAST_DTIM BIT3 // DTIM reaches, send the multicast packet.
#define RT_TCB_FLAG_PS_PRE_TRANSMIT BIT4 // Means that we set it in PS queue before PreTransmitTCB(), we should send it in PreTransmitTCB().
#define RT_TCB_FLAG_RAW_DATA BIT5 // Sent by raw data. Do not change the content.
#define NIC_SEND_HANG_THRESHOLD_NORMAL 4
#define NIC_SEND_HANG_THRESHOLD_POWERSAVE 8
#define MAX_DOZE_WAITING_TIMES 100 // The time of micro-second * 10 to wait before config RF OFF/Sleep.
#define TCB_RESOURCE_THRESHOLD 10
// To prevent too many data packets exhaust all TCB resource which blocks the Beacon or Mgnt packets sent,
// reserve some TCBs for important (MGNT) frames.
// By Bruce, 2013-04-10.
#define RT_RESERVED_TCB_NUM_FOR_MGNT 2
//
// Note:
// Reserve 1 tx desc to avoid tx stuck under the test "sendrecvstress_cmn" in Vista DTM WLK1.3.
// We still have no ideal why the HW DMA apears stuck frequently if the num of descs is exhaused with
// all of the own bits set; however, once 1 desc is reserved, the HW never gets stuck anymore.
// W-MAC also has the same trick to keep one buffer desc from the discussion with SD1 Jone.
// This issue only happens on the PCI interface cards.
// By Bruce, 2009-05-06.
//
#define VacancyTxDescNum(_Adapter, _Queue) \
((_Adapter)->NumTxDesc[_Queue] - (_Adapter)->nBufInTxDesc[_Queue] - 1)
#define IsThereBufferInTxDesc(_Adapter, _Queue) \
((_Adapter)->nBufInTxDesc[_Queue] > 0)
#define IncrementTxDescToFill(_Adapter, _Queue, _N) \
(_Adapter)->NextTxDescToFill[_Queue]=((_Adapter)->NextTxDescToFill[_Queue]+_N)%(_Adapter)->NumTxDesc[_Queue]; \
(_Adapter)->nBufInTxDesc[_Queue]+=_N;
#define IncrementTxDescToCheck(_Adapter, _Queue, _N) \
(_Adapter)->NextTxDescToCheck[_Queue]=((_Adapter)->NextTxDescToCheck[_Queue]+_N)%(_Adapter)->NumTxDesc[_Queue]; \
(_Adapter)->nBufInTxDesc[_Queue] -=_N;
// TODO: Modify this !!
#define FRAGMENT_THRESHOLD(_Adapter) ((u2Byte)((_Adapter)->MgntInfo.FragThreshold-4))
#define IS_DRVAGGR_TCB(pTcb) (pTcb->bDrvAggrFirstPacket || pTcb->bDrvAggrSubframe)
pu1Byte
GET_FRAME_OF_FIRST_FRAG(
PADAPTER Adapter,
PRT_TCB pTcb
);
pu1Byte
DOT11_HEADER_FROM_TCB(
PADAPTER Adapter,
PRT_TCB pTcb
);
VOID
GetTcbDestaddr(
PADAPTER Adapter,
PRT_TCB pTcb,
pu1Byte * ppDestaddr
);
VOID
InitializeTxVariables(
PADAPTER Adapter
);
RT_STATUS
PrepareTCBs(
PADAPTER Adapter
);
VOID
FreeTCBs(
PADAPTER Adapter,
BOOLEAN bReset
);
VOID
RemoveZeroLengthBuffer(
PRT_TCB pTcb
);
u1Byte
TcbGetTOSField(
PRT_TCB pTcb,
u1Byte SkipBuffers
);
BOOLEAN
RetrieveSegmentDataFromTCB(
PRT_TCB pTcb,
u1Byte SkipBuffers,
u4Byte DataOffset,
PVOID pDataBuffer,
u4Byte DataBufLength
);
VOID
TranslateHeader(
PADAPTER Adapter,
PRT_TCB pTcb
);
VOID
FillPartialHeader(
PADAPTER Adapter,
PRT_TCB pTcb
);
BOOLEAN
PreTransmitTCB(
PADAPTER Adapter,
PRT_TCB pTcb
);
BOOLEAN
TxCheckCoalesce(
PADAPTER Adapter,
PRT_TCB pTcb
);
BOOLEAN
TxDoCoalesce(
PADAPTER Adapter,
PRT_TCB pTcb
);
BOOLEAN
CheckFragment(
PADAPTER Adapter,
PRT_TCB pTcb,
int nHdrOffset
);
VOID
FragmentTCB(
PADAPTER Adapter,
PRT_TCB pTcb
);
RT_STATUS
TransmitTCB(
PADAPTER Adapter,
PRT_TCB pTcb
);
VOID
ResetTxStatistics(
PADAPTER Adapter
);
VOID
CountTxStatistics(
PADAPTER Adapter,
PRT_TCB pTcb
);
RESET_TYPE
TxCheckStuck(
IN PADAPTER Adapter
);
VOID
ReturnTCB(
PADAPTER Adapter,
PRT_TCB pTcb,
RT_STATUS status
);
PRT_TX_LOCAL_BUFFER
GetLocalFWBuffer(
PADAPTER Adapter
);
PRT_TX_LOCAL_BUFFER
GetLocalBuffer(
PADAPTER Adapter
);
VOID
ReturnLocalFWBuffer(
PADAPTER Adapter,
PRT_TX_LOCAL_BUFFER pLocalBuffer
);
VOID
ReturnLocalBuffer(
PADAPTER Adapter,
PRT_TX_LOCAL_BUFFER pLocalBuffer
);
BOOLEAN
WaitTxBusyQueueComplete(
PADAPTER Adapter
);
VOID
ReleaseDataFrameQueued(
IN PADAPTER pAdapter
);
BOOLEAN
UpdateEarlyModeInfo(
IN PADAPTER Adapter,
IN PRT_TCB pTcb,
IN PRT_LIST_ENTRY plistHead
);
BOOLEAN
TCB_CopySystemPacketToLocal(
IN PADAPTER pAdapter,
IN OUT PRT_TCB pTcb
);
VOID
TX_InitThreads(
IN PADAPTER Adapter
);
VOID
TX_DeInitThreads(
IN PADAPTER Adapter
);
VOID
TX_InitializeVariables(
IN PADAPTER Adapter
);
VOID
TX_InitializeSpinlock(
IN PADAPTER Adapter
);
VOID
TX_FreeSpinlock(
IN PADAPTER Adapter
);
#endif // #ifndef __INC_TRANSMIT_H
|