be6b69369410b834f9245e3c4e10dcdce8ed5c73
[reactos.git] / drivers / storage / port / storport / fdo.c
1 /*
2 * PROJECT: ReactOS Storport Driver
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: Storport FDO code
5 * COPYRIGHT: Copyright 2017 Eric Kohl (eric.kohl@reactos.org)
6 */
7
8 /* INCLUDES *******************************************************************/
9
10 #include "precomp.h"
11
12 #define NDEBUG
13 #include <debug.h>
14
15
16 /* FUNCTIONS ******************************************************************/
17
18 static
19 NTSTATUS
20 PortFdoStartMiniport(
21 _In_ PFDO_DEVICE_EXTENSION DeviceExtension)
22 {
23 PHW_INITIALIZATION_DATA InitData;
24 INTERFACE_TYPE InterfaceType;
25 NTSTATUS Status;
26
27 DPRINT1("PortFdoStartDevice(%p)\n", DeviceExtension);
28
29 /* Get the interface type of the lower device */
30 InterfaceType = GetBusInterface(DeviceExtension->LowerDevice);
31 if (InterfaceType == InterfaceTypeUndefined)
32 return STATUS_NO_SUCH_DEVICE;
33
34 /* Get the driver init data for the given interface type */
35 InitData = PortGetDriverInitData(DeviceExtension->DriverExtension,
36 InterfaceType);
37 if (InitData == NULL)
38 return STATUS_NO_SUCH_DEVICE;
39
40 /* Initialize the miniport */
41 MiniportInitialize(&DeviceExtension->Miniport,
42 DeviceExtension,
43 InitData);
44
45 /* Call the miniports FindAdapter function */
46 Status = MiniportFindAdapter(&DeviceExtension->Miniport);
47 if (!NT_SUCCESS(Status))
48 {
49 DPRINT1("MiniportFindAdapter() failed (Status 0x%08lx)\n", Status);
50 return Status;
51 }
52
53 /* Call the miniports HwInitialize function */
54 Status = MiniportHwInitialize(&DeviceExtension->Miniport);
55 if (!NT_SUCCESS(Status))
56 {
57 DPRINT1("MiniportHwInitialize() failed (Status 0x%08lx)\n", Status);
58 return Status;
59 }
60
61 return STATUS_SUCCESS;
62 }
63
64
65 static
66 NTSTATUS
67 NTAPI
68 PortFdoStartDevice(
69 _In_ PFDO_DEVICE_EXTENSION DeviceExtension,
70 _In_ PIRP Irp)
71 {
72 NTSTATUS Status;
73
74 DPRINT1("PortFdoStartDevice(%p %p)\n",
75 DeviceExtension, Irp);
76
77 ASSERT(DeviceExtension->ExtensionType == FdoExtension);
78
79 /* Start the lower device if the FDO is in 'stopped' state */
80 if (DeviceExtension->PnpState == dsStopped)
81 {
82 Status = ForwardIrpAndWait(DeviceExtension->LowerDevice, Irp);
83 if (!NT_SUCCESS(Status))
84 {
85 DPRINT1("ForwardIrpAndWait() failed (Status 0x%08lx)\n", Status);
86 return Status;
87 }
88 }
89
90 /* Change to the 'started' state */
91 DeviceExtension->PnpState = dsStarted;
92
93 /* Start the miniport (FindAdapter & Initialize) */
94 Status = PortFdoStartMiniport(DeviceExtension);
95 if (!NT_SUCCESS(Status))
96 {
97 DPRINT1("FdoStartMiniport() failed (Status 0x%08lx)\n", Status);
98 DeviceExtension->PnpState = dsStopped;
99 }
100
101 return Status;
102 }
103
104
105 static
106 NTSTATUS
107 PortFdoQueryBusRelations(
108 _In_ PFDO_DEVICE_EXTENSION DeviceExtension,
109 _Out_ PULONG_PTR Information)
110 {
111 NTSTATUS Status = STATUS_SUCCESS;;
112
113 DPRINT1("PortFdoQueryBusRelations(%p %p)\n",
114 DeviceExtension, Information);
115
116 *Information = 0;
117
118 return Status;
119 }
120
121
122 NTSTATUS
123 NTAPI
124 PortFdoPnp(
125 _In_ PDEVICE_OBJECT DeviceObject,
126 _In_ PIRP Irp)
127 {
128 PFDO_DEVICE_EXTENSION DeviceExtension;
129 PIO_STACK_LOCATION Stack;
130 ULONG_PTR Information = 0;
131 NTSTATUS Status = STATUS_NOT_SUPPORTED;
132
133 DPRINT1("PortFdoPnp(%p %p)\n",
134 DeviceObject, Irp);
135
136 DeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
137 ASSERT(DeviceExtension);
138 ASSERT(DeviceExtension->ExtensionType == FdoExtension);
139
140 Stack = IoGetCurrentIrpStackLocation(Irp);
141
142 switch (Stack->MinorFunction)
143 {
144 case IRP_MN_START_DEVICE: /* 0x00 */
145 DPRINT1("IRP_MJ_PNP / IRP_MN_START_DEVICE\n");
146 Status = PortFdoStartDevice(DeviceExtension, Irp);
147 break;
148
149 case IRP_MN_QUERY_REMOVE_DEVICE: /* 0x01 */
150 DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_REMOVE_DEVICE\n");
151 break;
152
153 case IRP_MN_REMOVE_DEVICE: /* 0x02 */
154 DPRINT1("IRP_MJ_PNP / IRP_MN_REMOVE_DEVICE\n");
155 break;
156
157 case IRP_MN_CANCEL_REMOVE_DEVICE: /* 0x03 */
158 DPRINT1("IRP_MJ_PNP / IRP_MN_CANCEL_REMOVE_DEVICE\n");
159 break;
160
161 case IRP_MN_STOP_DEVICE: /* 0x04 */
162 DPRINT1("IRP_MJ_PNP / IRP_MN_STOP_DEVICE\n");
163 break;
164
165 case IRP_MN_QUERY_STOP_DEVICE: /* 0x05 */
166 DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_STOP_DEVICE\n");
167 break;
168
169 case IRP_MN_CANCEL_STOP_DEVICE: /* 0x06 */
170 DPRINT1("IRP_MJ_PNP / IRP_MN_CANCEL_STOP_DEVICE\n");
171 break;
172
173 case IRP_MN_QUERY_DEVICE_RELATIONS: /* 0x07 */
174 DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS\n");
175 switch (Stack->Parameters.QueryDeviceRelations.Type)
176 {
177 case BusRelations:
178 DPRINT1(" IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / BusRelations\n");
179 Status = PortFdoQueryBusRelations(DeviceExtension, &Information);
180 break;
181
182 case RemovalRelations:
183 DPRINT1(" IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / RemovalRelations\n");
184 return ForwardIrpAndForget(DeviceExtension->LowerDevice, Irp);
185
186 default:
187 DPRINT1(" IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / Unknown type 0x%lx\n",
188 Stack->Parameters.QueryDeviceRelations.Type);
189 return ForwardIrpAndForget(DeviceExtension->LowerDevice, Irp);
190 }
191 break;
192
193 case IRP_MN_FILTER_RESOURCE_REQUIREMENTS: /* 0x0d */
194 DPRINT1("IRP_MJ_PNP / IRP_MN_FILTER_RESOURCE_REQUIREMENTS\n");
195 return ForwardIrpAndForget(DeviceExtension->LowerDevice, Irp);
196
197 case IRP_MN_QUERY_PNP_DEVICE_STATE: /* 0x14 */
198 DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_PNP_DEVICE_STATE\n");
199 break;
200
201 case IRP_MN_DEVICE_USAGE_NOTIFICATION: /* 0x16 */
202 DPRINT1("IRP_MJ_PNP / IRP_MN_DEVICE_USAGE_NOTIFICATION\n");
203 break;
204
205 case IRP_MN_SURPRISE_REMOVAL: /* 0x17 */
206 DPRINT1("IRP_MJ_PNP / IRP_MN_SURPRISE_REMOVAL\n");
207 break;
208
209 default:
210 DPRINT1("IRP_MJ_PNP / Unknown IOCTL 0x%lx\n", Stack->MinorFunction);
211 return ForwardIrpAndForget(DeviceExtension->LowerDevice, Irp);
212 }
213
214 Irp->IoStatus.Information = Information;
215 Irp->IoStatus.Status = Status;
216 IoCompleteRequest(Irp, IO_NO_INCREMENT);
217
218 return Status;
219 }
220
221 /* EOF */