xref: /reactos/drivers/storage/port/buslogic/wmi.c (revision c2c66aff)
1*c2c66affSColin Finck #include "miniport.h"
2*c2c66affSColin Finck #include "BusLogic958.h"        // includes scsi.h
3*c2c66affSColin Finck #include "wmistr.h"             // WMI definitions
4*c2c66affSColin Finck 
5*c2c66affSColin Finck #include "BT958dt.h"
6*c2c66affSColin Finck 
7*c2c66affSColin Finck #define BT958Wmi_MofResourceName        L"MofResource"
8*c2c66affSColin Finck 
9*c2c66affSColin Finck #define BT958_SETUP_GUID_INDEX 0
10*c2c66affSColin Finck 
11*c2c66affSColin Finck GUID BT958WmiExtendedSetupInfoGuid = BT958Wmi_ExtendedSetupInfo_Guid;
12*c2c66affSColin Finck 
13*c2c66affSColin Finck UCHAR
14*c2c66affSColin Finck BT958ReadExtendedSetupInfo
15*c2c66affSColin Finck (
16*c2c66affSColin Finck    IN  PHW_DEVICE_EXTENSION HwDeviceExtension,
17*c2c66affSColin Finck    OUT PUCHAR               Buffer
18*c2c66affSColin Finck );
19*c2c66affSColin Finck 
20*c2c66affSColin Finck BOOLEAN
21*c2c66affSColin Finck BT958QueryWmiDataBlock
22*c2c66affSColin Finck (
23*c2c66affSColin Finck     IN PVOID Context,
24*c2c66affSColin Finck     IN PSCSIWMI_REQUEST_CONTEXT RequestContext,
25*c2c66affSColin Finck     IN ULONG GuidIndex,
26*c2c66affSColin Finck     IN ULONG InstanceIndex,
27*c2c66affSColin Finck     IN ULONG InstanceCount,
28*c2c66affSColin Finck     IN OUT PULONG InstanceLengthArray,
29*c2c66affSColin Finck     IN ULONG OutBufferSize,
30*c2c66affSColin Finck     OUT PUCHAR Buffer
31*c2c66affSColin Finck );
32*c2c66affSColin Finck 
33*c2c66affSColin Finck UCHAR
34*c2c66affSColin Finck BT958QueryWmiRegInfo
35*c2c66affSColin Finck (
36*c2c66affSColin Finck     IN PVOID Context,
37*c2c66affSColin Finck     IN PSCSIWMI_REQUEST_CONTEXT RequestContext,
38*c2c66affSColin Finck     OUT PWCHAR *MofResourceName
39*c2c66affSColin Finck );
40*c2c66affSColin Finck 
41*c2c66affSColin Finck SCSIWMIGUIDREGINFO BT958GuidList[] =
42*c2c66affSColin Finck {
43*c2c66affSColin Finck    {&BT958WmiExtendedSetupInfoGuid,
44*c2c66affSColin Finck     1,
45*c2c66affSColin Finck     0
46*c2c66affSColin Finck    },
47*c2c66affSColin Finck };
48*c2c66affSColin Finck 
49*c2c66affSColin Finck #define BT958GuidCount (sizeof(BT958GuidList) / sizeof(SCSIWMIGUIDREGINFO))
50*c2c66affSColin Finck 
51*c2c66affSColin Finck 
BT958WmiInitialize(IN PHW_DEVICE_EXTENSION HwDeviceExtension)52*c2c66affSColin Finck void BT958WmiInitialize(
53*c2c66affSColin Finck     IN PHW_DEVICE_EXTENSION HwDeviceExtension
54*c2c66affSColin Finck     )
55*c2c66affSColin Finck {
56*c2c66affSColin Finck     PSCSI_WMILIB_CONTEXT WmiLibContext;
57*c2c66affSColin Finck 
58*c2c66affSColin Finck     WmiLibContext = &HwDeviceExtension->WmiLibContext;
59*c2c66affSColin Finck 
60*c2c66affSColin Finck     WmiLibContext->GuidList = BT958GuidList;
61*c2c66affSColin Finck     WmiLibContext->GuidCount = BT958GuidCount;
62*c2c66affSColin Finck     WmiLibContext->QueryWmiRegInfo = BT958QueryWmiRegInfo;
63*c2c66affSColin Finck     WmiLibContext->QueryWmiDataBlock = BT958QueryWmiDataBlock;
64*c2c66affSColin Finck     WmiLibContext->SetWmiDataItem = NULL;
65*c2c66affSColin Finck     WmiLibContext->SetWmiDataBlock = NULL;
66*c2c66affSColin Finck     WmiLibContext->WmiFunctionControl = NULL;
67*c2c66affSColin Finck     WmiLibContext->ExecuteWmiMethod = NULL;
68*c2c66affSColin Finck }
69*c2c66affSColin Finck 
70*c2c66affSColin Finck 
71*c2c66affSColin Finck 
72*c2c66affSColin Finck BOOLEAN
BT958WmiSrb(IN PHW_DEVICE_EXTENSION HwDeviceExtension,IN OUT PSCSI_WMI_REQUEST_BLOCK Srb)73*c2c66affSColin Finck BT958WmiSrb(
74*c2c66affSColin Finck     IN     PHW_DEVICE_EXTENSION    HwDeviceExtension,
75*c2c66affSColin Finck     IN OUT PSCSI_WMI_REQUEST_BLOCK Srb
76*c2c66affSColin Finck     )
77*c2c66affSColin Finck /*++
78*c2c66affSColin Finck 
79*c2c66affSColin Finck Routine Description:
80*c2c66affSColin Finck 
81*c2c66affSColin Finck    Process an SRB_FUNCTION_WMI request packet.
82*c2c66affSColin Finck 
83*c2c66affSColin Finck    This routine is called from the SCSI port driver synchronized with the
84*c2c66affSColin Finck    kernel via BT958StartIo.   On completion of WMI processing, the SCSI
85*c2c66affSColin Finck    port driver is notified that the adapter can take another request,  if
86*c2c66affSColin Finck    any are available.
87*c2c66affSColin Finck 
88*c2c66affSColin Finck Arguments:
89*c2c66affSColin Finck 
90*c2c66affSColin Finck    HwDeviceExtension - HBA miniport driver's adapter data storage.
91*c2c66affSColin Finck 
92*c2c66affSColin Finck    Srb               - IO request packet.
93*c2c66affSColin Finck 
94*c2c66affSColin Finck Return Value:
95*c2c66affSColin Finck 
96*c2c66affSColin Finck    Value to return to BT958StartIo caller.   Always TRUE.
97*c2c66affSColin Finck 
98*c2c66affSColin Finck --*/
99*c2c66affSColin Finck {
100*c2c66affSColin Finck    UCHAR status;
101*c2c66affSColin Finck    SCSIWMI_REQUEST_CONTEXT requestContext;
102*c2c66affSColin Finck    ULONG retSize;
103*c2c66affSColin Finck    BOOLEAN pending;
104*c2c66affSColin Finck 
105*c2c66affSColin Finck    // Validate our assumptions.
106*c2c66affSColin Finck    ASSERT(Srb->Function == SRB_FUNCTION_WMI);
107*c2c66affSColin Finck    ASSERT(Srb->Length == sizeof(SCSI_WMI_REQUEST_BLOCK));
108*c2c66affSColin Finck    ASSERT(Srb->DataTransferLength >= sizeof(ULONG));
109*c2c66affSColin Finck    ASSERT(Srb->DataBuffer);
110*c2c66affSColin Finck 
111*c2c66affSColin Finck    // Check if the WMI SRB is targeted for the adapter or one of the disks
112*c2c66affSColin Finck    if (!(Srb->WMIFlags & SRB_WMI_FLAGS_ADAPTER_REQUEST))
113*c2c66affSColin Finck    {
114*c2c66affSColin Finck 
115*c2c66affSColin Finck       // This is targeted to one of the disks, since there are no per disk
116*c2c66affSColin Finck       // wmi information we return an error. Note that if there was per
117*c2c66affSColin Finck       // disk information, then you'd likely have a differen WmiLibContext
118*c2c66affSColin Finck       // and a different set of guids.
119*c2c66affSColin Finck       Srb->DataTransferLength = 0;
120*c2c66affSColin Finck       Srb->SrbStatus = SRB_STATUS_SUCCESS;
121*c2c66affSColin Finck 
122*c2c66affSColin Finck    }
123*c2c66affSColin Finck    else
124*c2c66affSColin Finck    {
125*c2c66affSColin Finck        // Process the incoming WMI request.
126*c2c66affSColin Finck        pending = ScsiPortWmiDispatchFunction(&HwDeviceExtension->WmiLibContext,
127*c2c66affSColin Finck                                                 Srb->WMISubFunction,
128*c2c66affSColin Finck                                                 HwDeviceExtension,
129*c2c66affSColin Finck                                                 &requestContext,
130*c2c66affSColin Finck                                                 Srb->DataPath,
131*c2c66affSColin Finck                                                 Srb->DataTransferLength,
132*c2c66affSColin Finck                                                 Srb->DataBuffer);
133*c2c66affSColin Finck 
134*c2c66affSColin Finck        // We assume that the wmi request will never pend so that we can
135*c2c66affSColin Finck        // allocate the requestContext from stack. If the WMI request could
136*c2c66affSColin Finck        // ever pend then we'd need to allocate the request context from
137*c2c66affSColin Finck        // the SRB extension.
138*c2c66affSColin Finck        //
139*c2c66affSColin Finck        ASSERT(! pending);
140*c2c66affSColin Finck 
141*c2c66affSColin Finck        retSize =  ScsiPortWmiGetReturnSize(&requestContext);
142*c2c66affSColin Finck        status =  ScsiPortWmiGetReturnStatus(&requestContext);
143*c2c66affSColin Finck 
144*c2c66affSColin Finck        // We can do this since we assume it is done synchronously
145*c2c66affSColin Finck        Srb->DataTransferLength = retSize;
146*c2c66affSColin Finck 
147*c2c66affSColin Finck        //
148*c2c66affSColin Finck        // Adapter ready for next request.
149*c2c66affSColin Finck        //
150*c2c66affSColin Finck 
151*c2c66affSColin Finck        Srb->SrbStatus = status;
152*c2c66affSColin Finck    }
153*c2c66affSColin Finck 
154*c2c66affSColin Finck    ScsiPortNotification(RequestComplete, HwDeviceExtension, Srb);
155*c2c66affSColin Finck    ScsiPortNotification(NextRequest,     HwDeviceExtension, NULL);
156*c2c66affSColin Finck 
157*c2c66affSColin Finck    return TRUE;
158*c2c66affSColin Finck }
159*c2c66affSColin Finck 
160*c2c66affSColin Finck 
161*c2c66affSColin Finck 
162*c2c66affSColin Finck BOOLEAN
BT958QueryWmiDataBlock(IN PVOID Context,IN PSCSIWMI_REQUEST_CONTEXT RequestContext,IN ULONG GuidIndex,IN ULONG InstanceIndex,IN ULONG InstanceCount,IN OUT PULONG InstanceLengthArray,IN ULONG OutBufferSize,OUT PUCHAR Buffer)163*c2c66affSColin Finck BT958QueryWmiDataBlock(
164*c2c66affSColin Finck     IN PVOID Context,
165*c2c66affSColin Finck     IN PSCSIWMI_REQUEST_CONTEXT RequestContext,
166*c2c66affSColin Finck     IN ULONG GuidIndex,
167*c2c66affSColin Finck     IN ULONG InstanceIndex,
168*c2c66affSColin Finck     IN ULONG InstanceCount,
169*c2c66affSColin Finck     IN OUT PULONG InstanceLengthArray,
170*c2c66affSColin Finck     IN ULONG OutBufferSize,
171*c2c66affSColin Finck     OUT PUCHAR Buffer
172*c2c66affSColin Finck     )
173*c2c66affSColin Finck /*++
174*c2c66affSColin Finck 
175*c2c66affSColin Finck Routine Description:
176*c2c66affSColin Finck 
177*c2c66affSColin Finck     This routine is a callback into the miniport to query for the contents of
178*c2c66affSColin Finck     one or more instances of a data block. This callback may be called with
179*c2c66affSColin Finck     an output buffer that is too small to return all of the data queried.
180*c2c66affSColin Finck     In this case the callback is responsible to report the correct output
181*c2c66affSColin Finck         buffer size needed.
182*c2c66affSColin Finck 
183*c2c66affSColin Finck     If the request can be completed immediately without pending,
184*c2c66affSColin Finck         ScsiPortWmiPostProcess should be called from within this callback and
185*c2c66affSColin Finck     FALSE returned.
186*c2c66affSColin Finck 
187*c2c66affSColin Finck     If the request cannot be completed within this callback then TRUE should
188*c2c66affSColin Finck     be returned. Once the pending operations are finished the miniport should
189*c2c66affSColin Finck     call ScsiPortWmiPostProcess and then complete the srb.
190*c2c66affSColin Finck 
191*c2c66affSColin Finck Arguments:
192*c2c66affSColin Finck 
193*c2c66affSColin Finck     DeviceContext is a caller specified context value originally passed to
194*c2c66affSColin Finck         ScsiPortWmiDispatchFunction.
195*c2c66affSColin Finck 
196*c2c66affSColin Finck     RequestContext is a context associated with the srb being processed.
197*c2c66affSColin Finck 
198*c2c66affSColin Finck     GuidIndex is the index into the list of guids provided when the
199*c2c66affSColin Finck         miniport registered
200*c2c66affSColin Finck 
201*c2c66affSColin Finck     InstanceIndex is the index that denotes first instance of the data block
202*c2c66affSColin Finck         is being queried.
203*c2c66affSColin Finck 
204*c2c66affSColin Finck     InstanceCount is the number of instances expected to be returned for
205*c2c66affSColin Finck         the data block.
206*c2c66affSColin Finck 
207*c2c66affSColin Finck     InstanceLengthArray is a pointer to an array of ULONG that returns the
208*c2c66affSColin Finck         lengths of each instance of the data block. This may be NULL when
209*c2c66affSColin Finck         there is not enough space in the output buffer to fufill the request.
210*c2c66affSColin Finck         In this case the miniport should call ScsiPortWmiPostProcess with
211*c2c66affSColin Finck         a status of SRB_STATUS_DATA_OVERRUN and the size of the output buffer
212*c2c66affSColin Finck         needed to fufill the request.
213*c2c66affSColin Finck 
214*c2c66affSColin Finck     BufferAvail on entry has the maximum size available to write the data
215*c2c66affSColin Finck         blocks in the output buffer. If the output buffer is not large enough
216*c2c66affSColin Finck         to return all of the data blocks then the miniport should call
217*c2c66affSColin Finck         ScsiPortWmiPostProcess with a status of SRB_STATUS_DATA_OVERRUN
218*c2c66affSColin Finck         and the size of the output buffer needed to fufill the request.
219*c2c66affSColin Finck 
220*c2c66affSColin Finck     Buffer on return is filled with the returned data blocks. Note that each
221*c2c66affSColin Finck         instance of the data block must be aligned on a 8 byte boundry. This
222*c2c66affSColin Finck         may be NULL when there is not enough space in the output buffer to
223*c2c66affSColin Finck         fufill the request. In this case the miniport should call
224*c2c66affSColin Finck         ScsiPortWmiPostProcess with a status of SRB_STATUS_DATA_OVERRUN and
225*c2c66affSColin Finck         the size of the output buffer needed to fufill the request.
226*c2c66affSColin Finck 
227*c2c66affSColin Finck 
228*c2c66affSColin Finck Return Value:
229*c2c66affSColin Finck 
230*c2c66affSColin Finck     TRUE if request is pending else FALSE
231*c2c66affSColin Finck 
232*c2c66affSColin Finck --*/
233*c2c66affSColin Finck {
234*c2c66affSColin Finck     PHW_DEVICE_EXTENSION HwDeviceExtension = (PHW_DEVICE_EXTENSION)Context;
235*c2c66affSColin Finck     ULONG size = 0;
236*c2c66affSColin Finck     UCHAR status;
237*c2c66affSColin Finck 
238*c2c66affSColin Finck     //
239*c2c66affSColin Finck     // Only ever registers 1 instance per guid
240*c2c66affSColin Finck     ASSERT((InstanceIndex == 0) &&
241*c2c66affSColin Finck            (InstanceCount == 1));
242*c2c66affSColin Finck 
243*c2c66affSColin Finck     switch (GuidIndex)
244*c2c66affSColin Finck     {
245*c2c66affSColin Finck         case BT958_SETUP_GUID_INDEX:
246*c2c66affSColin Finck         {
247*c2c66affSColin Finck             size = sizeof(BT958ExtendedSetupInfo)-1;
248*c2c66affSColin Finck             if (OutBufferSize < size)
249*c2c66affSColin Finck             {
250*c2c66affSColin Finck                 //
251*c2c66affSColin Finck                 // The buffer passed to return the data is too small
252*c2c66affSColin Finck                 //
253*c2c66affSColin Finck                 status = SRB_STATUS_DATA_OVERRUN;
254*c2c66affSColin Finck                 break;
255*c2c66affSColin Finck             }
256*c2c66affSColin Finck 
257*c2c66affSColin Finck             if ( !BT958ReadExtendedSetupInfo(HwDeviceExtension,
258*c2c66affSColin Finck                                      Buffer))
259*c2c66affSColin Finck             {
260*c2c66affSColin Finck                 ASSERT(FALSE);
261*c2c66affSColin Finck                 size = 0;
262*c2c66affSColin Finck                 status = SRB_STATUS_ERROR;
263*c2c66affSColin Finck             }
264*c2c66affSColin Finck 			else
265*c2c66affSColin Finck 			{
266*c2c66affSColin Finck                 *InstanceLengthArray = size;
267*c2c66affSColin Finck                 status = SRB_STATUS_SUCCESS;
268*c2c66affSColin Finck             }
269*c2c66affSColin Finck             break;
270*c2c66affSColin Finck         }
271*c2c66affSColin Finck 
272*c2c66affSColin Finck         default:
273*c2c66affSColin Finck         {
274*c2c66affSColin Finck             status = SRB_STATUS_ERROR;
275*c2c66affSColin Finck         }
276*c2c66affSColin Finck     }
277*c2c66affSColin Finck 
278*c2c66affSColin Finck     ScsiPortWmiPostProcess(       RequestContext,
279*c2c66affSColin Finck                                   status,
280*c2c66affSColin Finck                                   size);
281*c2c66affSColin Finck 
282*c2c66affSColin Finck     return status;
283*c2c66affSColin Finck }
284*c2c66affSColin Finck 
285*c2c66affSColin Finck UCHAR
BT958QueryWmiRegInfo(IN PVOID Context,IN PSCSIWMI_REQUEST_CONTEXT RequestContext,OUT PWCHAR * MofResourceName)286*c2c66affSColin Finck BT958QueryWmiRegInfo(
287*c2c66affSColin Finck     IN PVOID Context,
288*c2c66affSColin Finck     IN PSCSIWMI_REQUEST_CONTEXT RequestContext,
289*c2c66affSColin Finck     OUT PWCHAR *MofResourceName
290*c2c66affSColin Finck     )
291*c2c66affSColin Finck /*++
292*c2c66affSColin Finck 
293*c2c66affSColin Finck Routine Description:
294*c2c66affSColin Finck 
295*c2c66affSColin Finck     This routine is a callback into the driver to retrieve information about
296*c2c66affSColin Finck     the guids being registered.
297*c2c66affSColin Finck 
298*c2c66affSColin Finck     Implementations of this routine may be in paged memory
299*c2c66affSColin Finck 
300*c2c66affSColin Finck Arguments:
301*c2c66affSColin Finck 
302*c2c66affSColin Finck     DeviceObject is the device whose registration information is needed
303*c2c66affSColin Finck 
304*c2c66affSColin Finck     *RegFlags returns with a set of flags that describe all of the guids being
305*c2c66affSColin Finck         registered for this device. If the device wants enable and disable
306*c2c66affSColin Finck         collection callbacks before receiving queries for the registered
307*c2c66affSColin Finck         guids then it should return the WMIREG_FLAG_EXPENSIVE flag. Also the
308*c2c66affSColin Finck         returned flags may specify WMIREG_FLAG_INSTANCE_PDO in which case
309*c2c66affSColin Finck         the instance name is determined from the PDO associated with the
310*c2c66affSColin Finck         device object. Note that the PDO must have an associated devnode. If
311*c2c66affSColin Finck         WMIREG_FLAG_INSTANCE_PDO is not set then Name must return a unique
312*c2c66affSColin Finck         name for the device. These flags are ORed into the flags specified
313*c2c66affSColin Finck         by the GUIDREGINFO for each guid.
314*c2c66affSColin Finck 
315*c2c66affSColin Finck     InstanceName returns with the instance name for the guids if
316*c2c66affSColin Finck         WMIREG_FLAG_INSTANCE_PDO is not set in the returned *RegFlags. The
317*c2c66affSColin Finck         caller will call ExFreePool with the buffer returned.
318*c2c66affSColin Finck 
319*c2c66affSColin Finck     *RegistryPath returns with the registry path of the driver. This is
320*c2c66affSColin Finck         required
321*c2c66affSColin Finck 
322*c2c66affSColin Finck     *MofResourceName returns with the name of the MOF resource attached to
323*c2c66affSColin Finck         the binary file. If the driver does not have a mof resource attached
324*c2c66affSColin Finck         then this can be returned as NULL.
325*c2c66affSColin Finck 
326*c2c66affSColin Finck     *Pdo returns with the device object for the PDO associated with this
327*c2c66affSColin Finck         device if the WMIREG_FLAG_INSTANCE_PDO flag is returned in
328*c2c66affSColin Finck         *RegFlags.
329*c2c66affSColin Finck 
330*c2c66affSColin Finck Return Value:
331*c2c66affSColin Finck 
332*c2c66affSColin Finck     status
333*c2c66affSColin Finck 
334*c2c66affSColin Finck --*/
335*c2c66affSColin Finck {
336*c2c66affSColin Finck     *MofResourceName = BT958Wmi_MofResourceName;
337*c2c66affSColin Finck     return SRB_STATUS_SUCCESS;
338*c2c66affSColin Finck }
339*c2c66affSColin Finck 
340*c2c66affSColin Finck 
341*c2c66affSColin Finck UCHAR
BT958ReadExtendedSetupInfo(IN PHW_DEVICE_EXTENSION HwDeviceExtension,OUT PUCHAR Buffer)342*c2c66affSColin Finck BT958ReadExtendedSetupInfo(
343*c2c66affSColin Finck    IN  PHW_DEVICE_EXTENSION HwDeviceExtension,
344*c2c66affSColin Finck    OUT PUCHAR               Buffer
345*c2c66affSColin Finck    )
346*c2c66affSColin Finck /*++
347*c2c66affSColin Finck 
348*c2c66affSColin Finck Routine Description:
349*c2c66affSColin Finck 
350*c2c66affSColin Finck    Read the adapter setup information into the supplied buffer.  The buffer
351*c2c66affSColin Finck    must be RM_CFG_MAX_SIZE (255) bytes large.
352*c2c66affSColin Finck 
353*c2c66affSColin Finck Arguments:
354*c2c66affSColin Finck 
355*c2c66affSColin Finck    HwDeviceExtension - HBA miniport driver's adapter data storage.
356*c2c66affSColin Finck 
357*c2c66affSColin Finck    Buffer - Buffer to hold adapter's setup information structure [manual 5-10].
358*c2c66affSColin Finck 
359*c2c66affSColin Finck Return Value:
360*c2c66affSColin Finck 
361*c2c66affSColin Finck    TRUE on success, FALSE on failure.
362*c2c66affSColin Finck 
363*c2c66affSColin Finck --*/
364*c2c66affSColin Finck {
365*c2c66affSColin Finck    UCHAR numberOfBytes = sizeof(BT958ExtendedSetupInfo)-1;
366*c2c66affSColin Finck 
367*c2c66affSColin Finck    PHW_DEVICE_EXTENSION deviceExtension = HwDeviceExtension;
368*c2c66affSColin Finck    BusLogic_HostAdapter_T *HostAdapter = &(deviceExtension->hcs);
369*c2c66affSColin Finck    BusLogic_ExtendedSetupInformation_T ExtendedSetupInformation;
370*c2c66affSColin Finck    BusLogic_RequestedReplyLength_T RequestedReplyLength = sizeof(ExtendedSetupInformation);
371*c2c66affSColin Finck    BOOLEAN Result = TRUE;
372*c2c66affSColin Finck 
373*c2c66affSColin Finck    BusLogic_WmiExtendedSetupInformation_T WmiExtendedSetupInfo;
374*c2c66affSColin Finck    PUCHAR SourceBuf = (PUCHAR) &WmiExtendedSetupInfo;
375*c2c66affSColin Finck 
376*c2c66affSColin Finck 
377*c2c66affSColin Finck    //
378*c2c66affSColin Finck    //  Issue the Inquire Extended Setup Information command.  Only genuine
379*c2c66affSColin Finck    //  BusLogic Host Adapters and TRUE clones support this command.  Adaptec 1542C
380*c2c66affSColin Finck    //  series Host Adapters that respond to the Geometry Register I/O port will
381*c2c66affSColin Finck    //  fail this command.
382*c2c66affSColin Finck    RequestedReplyLength = sizeof(ExtendedSetupInformation);
383*c2c66affSColin Finck    if (BusLogic_Command(HostAdapter,
384*c2c66affSColin Finck 					   BusLogic_InquireExtendedSetupInformation,
385*c2c66affSColin Finck 					   &RequestedReplyLength,
386*c2c66affSColin Finck 					   sizeof(RequestedReplyLength),
387*c2c66affSColin Finck 					   &ExtendedSetupInformation,
388*c2c66affSColin Finck 					   sizeof(ExtendedSetupInformation))
389*c2c66affSColin Finck       != sizeof(ExtendedSetupInformation))
390*c2c66affSColin Finck    {
391*c2c66affSColin Finck      Result = FALSE;
392*c2c66affSColin Finck    }
393*c2c66affSColin Finck 
394*c2c66affSColin Finck    WmiExtendedSetupInfo.BusType      =        ExtendedSetupInformation.BusType;
395*c2c66affSColin Finck    WmiExtendedSetupInfo.BIOS_Address =        ExtendedSetupInformation.BIOS_Address;
396*c2c66affSColin Finck    WmiExtendedSetupInfo.ScatterGatherLimit =  ExtendedSetupInformation.ScatterGatherLimit;
397*c2c66affSColin Finck    WmiExtendedSetupInfo.MailboxCount       =  ExtendedSetupInformation.MailboxCount;
398*c2c66affSColin Finck    WmiExtendedSetupInfo.BaseMailboxAddress =  ExtendedSetupInformation.BaseMailboxAddress;
399*c2c66affSColin Finck    WmiExtendedSetupInfo.FastOnEISA         =  ExtendedSetupInformation.Misc.FastOnEISA;
400*c2c66affSColin Finck    WmiExtendedSetupInfo.LevelSensitiveInterrupt = ExtendedSetupInformation.Misc.LevelSensitiveInterrupt;
401*c2c66affSColin Finck    WmiExtendedSetupInfo.FirmwareRevision[0] = ExtendedSetupInformation.FirmwareRevision[0];
402*c2c66affSColin Finck    WmiExtendedSetupInfo.FirmwareRevision[1] = ExtendedSetupInformation.FirmwareRevision[1];
403*c2c66affSColin Finck    WmiExtendedSetupInfo.FirmwareRevision[2] = ExtendedSetupInformation.FirmwareRevision[2];
404*c2c66affSColin Finck    WmiExtendedSetupInfo.HostWideSCSI        = ExtendedSetupInformation.HostWideSCSI;
405*c2c66affSColin Finck    WmiExtendedSetupInfo.HostDifferentialSCSI= ExtendedSetupInformation.HostDifferentialSCSI;
406*c2c66affSColin Finck    WmiExtendedSetupInfo.HostSupportsSCAM    = ExtendedSetupInformation.HostSupportsSCAM;
407*c2c66affSColin Finck    WmiExtendedSetupInfo.HostUltraSCSI       = ExtendedSetupInformation.HostUltraSCSI;
408*c2c66affSColin Finck    WmiExtendedSetupInfo.HostSmartTermination= ExtendedSetupInformation.HostSmartTermination;
409*c2c66affSColin Finck 
410*c2c66affSColin Finck    for (; numberOfBytes; numberOfBytes--)
411*c2c66affSColin Finck    {
412*c2c66affSColin Finck       *Buffer++ = *SourceBuf++;
413*c2c66affSColin Finck    }
414*c2c66affSColin Finck    return TRUE;
415*c2c66affSColin Finck }
416*c2c66affSColin Finck 
417