|
|
//***************************************************************************
//
// getdata.c
//
// Module: Windows HBA API implmentation
//
// Purpose: Contains routines for getting and setting data
//
// Copyright (c) 2001 Microsoft Corporation
//
//***************************************************************************
#include "hbaapip.h"
HBA_STATUS HBA_GetAdapterAttributesX( HBA_HANDLE HbaHandle, HBA_ADAPTERATTRIBUTES *HbaAdapterAttributes, BOOLEAN IsAnsi ) { HANDLE Handle; PADAPTER_HANDLE HandleData; ULONG Status; HBA_STATUS HbaStatus = HBA_STATUS_ERROR; PWNODE_SINGLE_INSTANCE Buffer; PUCHAR Data; ULONG DataLength; PHBA_ADAPTERATTRIBUTES HbaAdapterAttributesA;
HandleData = GetDataByHandle(HbaHandle); if (HandleData != NULL) {
Status = WmiOpenBlock((LPGUID)&MSFC_FCAdapterHBAAttributes_GUID, GENERIC_READ, &Handle);
if (Status == ERROR_SUCCESS) { //
// Validate adapter name by querying for that adapter name as a
// WMI instance name
//
Status = QuerySingleInstance(Handle, HandleData->InstanceName, &Buffer);
if (Status == ERROR_SUCCESS) { Status = ParseSingleInstance(Buffer, NULL, &Data, &DataLength); if (Status == ERROR_SUCCESS) { //
// Skip over AdapterId as it is not needed for HBA
//
Data += sizeof(ULONGLONG);
//
// Get the HBA status returned from the miniport.
// If the miniport returns HBA_STATUS_OK then all
// data is filled in the data block. If any other
// HBA status is returned then the miniport is
// reporting an error and we want to return that
// HBA error code to the caller
//
HbaStatus = *(HBA_STATUS *)Data; Data += sizeof(HBA_STATUS);
if (HbaStatus == HBA_STATUS_OK) {
//
// We have got our adapter attributes, so copy them
// over to the output buffer
//
if (IsAnsi) { HbaAdapterAttributesA = HbaAdapterAttributes;
GetDataFromDataBlock(HbaAdapterAttributesA, NodeWWN, HBA_WWN, Data);
GetDataFromDataBlock(HbaAdapterAttributesA, VendorSpecificID, HBA_UINT32, Data);
GetDataFromDataBlock(HbaAdapterAttributesA, NumberOfPorts, HBA_UINT32, Data);
CopyString(&HbaAdapterAttributesA->Manufacturer, &Data, 64, IsAnsi);
CopyString(&HbaAdapterAttributesA->SerialNumber, &Data, 64, IsAnsi);
CopyString(&HbaAdapterAttributesA->Model, &Data, 256, IsAnsi);
CopyString(&HbaAdapterAttributesA->ModelDescription, &Data, 256, IsAnsi);
CopyString(&HbaAdapterAttributesA->NodeSymbolicName, &Data, 256, IsAnsi);
CopyString(&HbaAdapterAttributesA->HardwareVersion, &Data, 256, IsAnsi);
CopyString(&HbaAdapterAttributesA->DriverVersion, &Data, 256, IsAnsi);
CopyString(&HbaAdapterAttributesA->OptionROMVersion, &Data, 256, IsAnsi);
CopyString(&HbaAdapterAttributesA->FirmwareVersion, &Data, 256, IsAnsi);
CopyString(&HbaAdapterAttributesA->DriverName, &Data, 256, IsAnsi);
} else { GetDataFromDataBlock(HbaAdapterAttributes, NodeWWN, HBA_WWN, Data);
GetDataFromDataBlock(HbaAdapterAttributes, VendorSpecificID, HBA_UINT32, Data);
GetDataFromDataBlock(HbaAdapterAttributes, NumberOfPorts, HBA_UINT32, Data);
CopyString(&HbaAdapterAttributes->Manufacturer, &Data, 64, IsAnsi);
CopyString(&HbaAdapterAttributes->SerialNumber, &Data, 64, IsAnsi);
CopyString(&HbaAdapterAttributes->Model, &Data, 256, IsAnsi);
CopyString(&HbaAdapterAttributes->ModelDescription, &Data, 256, IsAnsi);
CopyString(&HbaAdapterAttributes->NodeSymbolicName, &Data, 256, IsAnsi);
CopyString(&HbaAdapterAttributes->HardwareVersion, &Data, 256, IsAnsi);
CopyString(&HbaAdapterAttributes->DriverVersion, &Data, 256, IsAnsi);
CopyString(&HbaAdapterAttributes->OptionROMVersion, &Data, 256, IsAnsi);
CopyString(&HbaAdapterAttributes->FirmwareVersion, &Data, 256, IsAnsi);
CopyString(&HbaAdapterAttributes->DriverName, &Data, 256, IsAnsi); } } } FreeMemory(Buffer); } WmiCloseBlock(Handle); } } else { HbaStatus = HBA_STATUS_ERROR_INVALID_HANDLE; } return(HbaStatus); }
HBA_STATUS HBA_API HBA_GetAdapterAttributes( HBA_HANDLE HbaHandle, HBA_ADAPTERATTRIBUTES *HbaAdapterAttributes ) { return(HBA_GetAdapterAttributesX(HbaHandle, HbaAdapterAttributes, TRUE)); }
HBA_STATUS HBA_GetAdapterPortAttributesX( HBA_HANDLE HbaHandle, HBA_UINT32 PortIndex, HBA_PORTATTRIBUTES *PortAttributes, BOOLEAN IsAnsi ) { HANDLE Handle; PADAPTER_HANDLE HandleData; ULONG Status; HBA_STATUS HbaStatus = HBA_STATUS_ERROR; PWNODE_SINGLE_INSTANCE Buffer; PUCHAR Data; ULONG DataLength; PWCHAR InstanceName;
HandleData = GetDataByHandle(HbaHandle); if (HandleData != NULL) {
Status = WmiOpenBlock((LPGUID)&MSFC_FibrePortHBAAttributes_GUID, GENERIC_READ, &Handle);
if (Status == ERROR_SUCCESS) { InstanceName = CreatePortInstanceNameW(HandleData->InstanceName, PortIndex); if (InstanceName != NULL) { Status = QuerySingleInstance(Handle, InstanceName, &Buffer);
if (Status == ERROR_SUCCESS) { Status = ParseSingleInstance(Buffer, NULL, &Data, &DataLength); if (Status == ERROR_SUCCESS) { //
// Skip over AdapterId as it is not needed for HBA
//
Data += sizeof(ULONGLONG);
//
// Get the HBA status returned from the miniport.
// If the miniport returns HBA_STATUS_OK then all
// data is filled in the data block. If any other
// HBA status is returned then the miniport is
// reporting an error and we want to return that
// HBA error code to the caller
//
HbaStatus = *(HBA_STATUS *)Data; Data += sizeof(HBA_STATUS);
if (HbaStatus == HBA_STATUS_OK) { CopyPortAttributes(PortAttributes, Data, IsAnsi); } } FreeMemory(Buffer); } FreeMemory(InstanceName); } WmiCloseBlock(Handle); } } else { HbaStatus = HBA_STATUS_ERROR_INVALID_HANDLE; } return(HbaStatus); }
HBA_STATUS HBA_API HBA_GetAdapterPortAttributes( HBA_HANDLE HbaHandle, HBA_UINT32 PortIndex, HBA_PORTATTRIBUTES *PortAttributes ) { return(HBA_GetAdapterPortAttributesX(HbaHandle, PortIndex, PortAttributes, TRUE)); }
HBA_STATUS HBA_API HBA_GetPortStatistics( HBA_HANDLE HbaHandle, HBA_UINT32 PortIndex, HBA_PORTSTATISTICS *HbaPortStatistics ) { HANDLE Handle; PADAPTER_HANDLE HandleData; ULONG Status; HBA_STATUS HbaStatus = HBA_STATUS_ERROR; PUCHAR Data; ULONG DataLength; PWCHAR InstanceName; PWNODE_SINGLE_INSTANCE Buffer;
HandleData = GetDataByHandle(HbaHandle); if (HandleData != NULL) {
Status = WmiOpenBlock((LPGUID)&MSFC_FibrePortHBAStatistics_GUID, GENERIC_READ, &Handle);
if (Status == ERROR_SUCCESS) { InstanceName = CreatePortInstanceNameW(HandleData->InstanceName, PortIndex); if (InstanceName != NULL) { Status = QuerySingleInstance(Handle, InstanceName, &Buffer);
if (Status == ERROR_SUCCESS) { Status = ParseSingleInstance(Buffer, NULL, &Data, &DataLength); if (Status == ERROR_SUCCESS) { //
// Skip over AdapterId as it is not needed for HBA
//
Data += sizeof(ULONGLONG);
//
// Get the HBA status returned from the miniport.
// If the miniport returns HBA_STATUS_OK then all
// data is filled in the data block. If any other
// HBA status is returned then the miniport is
// reporting an error and we want to return that
// HBA error code to the caller
//
HbaStatus = *(HBA_STATUS *)Data; Data += sizeof(HBA_STATUS);
//
// Since the data block goes from ULONG to
// ULONGLONG, we need to account for 4 bytes of
// padding
//
Data += 4;
if (HbaStatus == HBA_STATUS_OK) { //
// We have got our port statistics, so copy them
// over to the output buffer
//
GetDataFromDataBlock(HbaPortStatistics, SecondsSinceLastReset, HBA_INT64, Data);
GetDataFromDataBlock(HbaPortStatistics, TxFrames, HBA_INT64, Data);
GetDataFromDataBlock(HbaPortStatistics, TxWords, HBA_INT64, Data);
GetDataFromDataBlock(HbaPortStatistics, RxFrames, HBA_INT64, Data);
GetDataFromDataBlock(HbaPortStatistics, RxWords, HBA_INT64, Data);
GetDataFromDataBlock(HbaPortStatistics, LIPCount, HBA_INT64, Data);
GetDataFromDataBlock(HbaPortStatistics, NOSCount, HBA_INT64, Data);
GetDataFromDataBlock(HbaPortStatistics, ErrorFrames, HBA_INT64, Data);
GetDataFromDataBlock(HbaPortStatistics, DumpedFrames, HBA_INT64, Data);
GetDataFromDataBlock(HbaPortStatistics, LinkFailureCount, HBA_INT64, Data);
GetDataFromDataBlock(HbaPortStatistics, LossOfSyncCount, HBA_INT64, Data);
GetDataFromDataBlock(HbaPortStatistics, LossOfSignalCount, HBA_INT64, Data);
GetDataFromDataBlock(HbaPortStatistics, PrimitiveSeqProtocolErrCount, HBA_INT64, Data);
GetDataFromDataBlock(HbaPortStatistics, InvalidTxWordCount, HBA_INT64, Data);
GetDataFromDataBlock(HbaPortStatistics, InvalidCRCCount, HBA_INT64, Data); } } FreeMemory(Buffer); } FreeMemory(InstanceName); } WmiCloseBlock(Handle); } } else { HbaStatus = HBA_STATUS_ERROR_INVALID_HANDLE; } return(HbaStatus); }
|