summaryrefslogtreecommitdiff
path: root/general/PLX9x5x/sys/Private.h
blob: 3cce2eddabae7ff41002ac70f126828cd9cc0565 (plain)
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
/*++

Copyright (c) Microsoft Corporation.  All rights reserved.

    THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
    KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
    PURPOSE.

Module Name:

    Private.h

Abstract:

Environment:

    Kernel mode

--*/


#if !defined(_PCI9656_H_)
#define _PCI9659_H_

//
// The device extension for the device object
//
typedef struct _DEVICE_EXTENSION {

    WDFDEVICE               Device;

    // Following fields are specific to the hardware
    // Configuration

    // HW Resources
    PPCI9656_REGS           Regs;             // Registers address
    PUCHAR                  RegsBase;         // Registers base address
    ULONG                   RegsLength;       // Registers base length

    PUCHAR                  PortBase;         // Port base address
    ULONG                   PortLength;       // Port base length

    PUCHAR                  SRAMBase;         // SRAM base address
    ULONG                   SRAMLength;       // SRAM base length

    PUCHAR                  SRAM2Base;        // SRAM (alt) base address
    ULONG                   SRAM2Length;      // SRAM (alt) base length

    WDFINTERRUPT            Interrupt;     // Returned by InterruptCreate

    union {
        INT_CSR bits;
        ULONG   ulong;
    }                       IntCsr;

    union {
        DMA_CSR bits;
        UCHAR   uchar;
    }                       Dma0Csr;

    union {
        DMA_CSR bits;
        UCHAR   uchar;
    }                       Dma1Csr;

    // DmaEnabler
    WDFDMAENABLER           DmaEnabler;
    ULONG                   MaximumTransferLength;

    // IOCTL handling
    WDFQUEUE                ControlQueue;
    BOOLEAN                 RequireSingleTransfer;

#ifdef SIMULATE_MEMORY_FRAGMENTATION
    PMDL                    WriteMdlChain;
    PMDL                    ReadMdlChain;
#endif

    // Write
    WDFQUEUE                WriteQueue;
    WDFDMATRANSACTION       WriteDmaTransaction;

    ULONG                   WriteTransferElements;
    WDFCOMMONBUFFER         WriteCommonBuffer;
    size_t                  WriteCommonBufferSize;
    _Field_size_(WriteCommonBufferSize) PUCHAR WriteCommonBufferBase;
    PHYSICAL_ADDRESS        WriteCommonBufferBaseLA;  // Logical Address

    // Read
    ULONG                   ReadTransferElements;
    WDFCOMMONBUFFER         ReadCommonBuffer;
    size_t                  ReadCommonBufferSize;
    _Field_size_(ReadCommonBufferSize) PUCHAR ReadCommonBufferBase;
    PHYSICAL_ADDRESS        ReadCommonBufferBaseLA;   // Logical Address

    WDFDMATRANSACTION       ReadDmaTransaction;
    WDFQUEUE                ReadQueue;

    ULONG                   HwErrCount;

}  DEVICE_EXTENSION, *PDEVICE_EXTENSION;

//
// This will generate the function named PLxGetDeviceContext to be use for
// retreiving the DEVICE_EXTENSION pointer.
//
WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(DEVICE_EXTENSION, PLxGetDeviceContext)

#if !defined(ASSOC_WRITE_REQUEST_WITH_DMA_TRANSACTION)
//
// The context structure used with WdfDmaTransactionCreate
//
typedef struct TRANSACTION_CONTEXT {

    WDFREQUEST     Request;

} TRANSACTION_CONTEXT, * PTRANSACTION_CONTEXT;

WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(TRANSACTION_CONTEXT, PLxGetTransactionContext)

#endif

//
// Function prototypes
//
DRIVER_INITIALIZE DriverEntry;

EVT_WDF_DRIVER_DEVICE_ADD PLxEvtDeviceAdd;
EVT_WDF_OBJECT_CONTEXT_CLEANUP PlxEvtDeviceCleanup;

EVT_WDF_OBJECT_CONTEXT_CLEANUP PlxEvtDriverContextCleanup;

EVT_WDF_DEVICE_D0_ENTRY PLxEvtDeviceD0Entry;
EVT_WDF_DEVICE_D0_EXIT PLxEvtDeviceD0Exit;
EVT_WDF_DEVICE_PREPARE_HARDWARE PLxEvtDevicePrepareHardware;
EVT_WDF_DEVICE_RELEASE_HARDWARE PLxEvtDeviceReleaseHardware;

EVT_WDF_IO_QUEUE_IO_READ PLxEvtIoRead;
EVT_WDF_IO_QUEUE_IO_WRITE PLxEvtIoWrite;
EVT_WDF_IO_QUEUE_IO_DEVICE_CONTROL PLxEvtIoDeviceControl;

EVT_WDF_INTERRUPT_ISR PLxEvtInterruptIsr;
EVT_WDF_INTERRUPT_DPC PLxEvtInterruptDpc;
EVT_WDF_INTERRUPT_ENABLE PLxEvtInterruptEnable;
EVT_WDF_INTERRUPT_DISABLE PLxEvtInterruptDisable;

NTSTATUS
PLxSetIdleAndWakeSettings(
    IN PDEVICE_EXTENSION FdoData
    );

NTSTATUS
PLxInitializeDeviceExtension(
    IN PDEVICE_EXTENSION DevExt
    );

VOID
PlxCleanupDeviceExtension(
    _In_ PDEVICE_EXTENSION DevExt
    );

NTSTATUS
PLxPrepareHardware(
    IN PDEVICE_EXTENSION DevExt,
    IN WDFCMRESLIST     ResourcesTranslated
    );

NTSTATUS
PLxInitRead(
    IN PDEVICE_EXTENSION DevExt
    );

NTSTATUS
PLxInitWrite(
    IN PDEVICE_EXTENSION DevExt
    );

//
// WDFINTERRUPT Support
//
NTSTATUS
PLxInterruptCreate(
    IN PDEVICE_EXTENSION DevExt
    );

VOID
PLxReadRequestComplete(
    IN WDFDMATRANSACTION  DmaTransaction,
    IN NTSTATUS           Status
    );

VOID
PLxWriteRequestComplete(
    IN WDFDMATRANSACTION  DmaTransaction,
    IN NTSTATUS           Status
    );

NTSTATUS
PLxInitializeHardware(
    IN PDEVICE_EXTENSION DevExt
    );

VOID
PLxShutdown(
    IN PDEVICE_EXTENSION DevExt
    );

EVT_WDF_PROGRAM_DMA PLxEvtProgramReadDma;
EVT_WDF_PROGRAM_DMA PLxEvtProgramWriteDma;

VOID
PLxHardwareReset(
    IN PDEVICE_EXTENSION    DevExt
    );

NTSTATUS
PLxInitializeDMA(
    IN PDEVICE_EXTENSION DevExt
    );

#ifdef SIMULATE_MEMORY_FRAGMENTATION

#define POOL_TAG 'x5x9'

//
// Constants for the MDL chains we use to simulate memory fragmentation.
//
#define MDL_CHAIN_LENGTH 8
#define MDL_BUFFER_SIZE  ((PCI9656_MAXIMUM_TRANSFER_LENGTH) / MDL_CHAIN_LENGTH)

C_ASSERT(MDL_CHAIN_LENGTH * MDL_BUFFER_SIZE == PCI9656_MAXIMUM_TRANSFER_LENGTH);

NTSTATUS
BuildMdlChain(
    _Out_ PMDL* MdlChain
    );

VOID
DestroyMdlChain(
    _In_ PMDL MdlChain
    );

VOID
CopyBufferToMdlChain(
    _In_reads_bytes_(Length) PVOID Buffer,
    _In_ size_t Length,
    _In_ PMDL MdlChain
    );

VOID
CopyMdlChainToBuffer(
    _In_ PMDL MdlChain,
    _Out_writes_bytes_(Length) PVOID Buffer,
    _In_ size_t Length
    );
#endif // SIMULATE_MEMORY_FRAGMENTATION

#pragma warning(disable:4127) // avoid conditional expression is constant error with W4

#endif  // _PCI9656_H_