📄 dac960.c
字号:
DCDB->EarlyStatus = false; DCDB->Timeout = DAC960_V1_DCDB_Timeout_10_seconds; DCDB->NoAutomaticRequestSense = false; DCDB->DisconnectPermitted = true; DCDB->TransferLength = sizeof(DAC960_SCSI_Inquiry_T); DCDB->BusAddress = Virtual_to_Bus(InquiryStandardData); DCDB->CDBLength = 6; DCDB->TransferLengthHigh4 = 0; DCDB->SenseLength = sizeof(DCDB->SenseData); DCDB->CDB[0] = 0x12; /* INQUIRY */ DCDB->CDB[1] = 0; /* EVPD = 0 */ DCDB->CDB[2] = 0; /* Page Code */ DCDB->CDB[3] = 0; /* Reserved */ DCDB->CDB[4] = sizeof(DAC960_SCSI_Inquiry_T); DCDB->CDB[5] = 0; /* Control */ DAC960_AcquireControllerLock(Controller, &ProcessorFlags); DAC960_QueueCommand(Command); DAC960_ReleaseControllerLock(Controller, &ProcessorFlags); } for (Channel = 0; Channel < Controller->Channels; Channel++) { DAC960_Command_T *Command = Controller->Commands[Channel]; DAC960_SCSI_Inquiry_UnitSerialNumber_T *InquiryUnitSerialNumber = &Controller->V1.InquiryUnitSerialNumber[Channel][TargetID]; InquiryUnitSerialNumber->PeripheralDeviceType = 0x1F; Semaphore = &Semaphores[Channel]; down(Semaphore); if (Command->V1.CommandStatus != DAC960_V1_NormalCompletion) continue; Command->Semaphore = Semaphore; DCDB = &DCDBs[Channel]; DCDB->TransferLength = sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T); DCDB->BusAddress = Virtual_to_Bus(InquiryUnitSerialNumber); DCDB->SenseLength = sizeof(DCDB->SenseData); DCDB->CDB[0] = 0x12; /* INQUIRY */ DCDB->CDB[1] = 1; /* EVPD = 1 */ DCDB->CDB[2] = 0x80; /* Page Code */ DCDB->CDB[3] = 0; /* Reserved */ DCDB->CDB[4] = sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T); DCDB->CDB[5] = 0; /* Control */ DAC960_AcquireControllerLock(Controller, &ProcessorFlags); DAC960_QueueCommand(Command); DAC960_ReleaseControllerLock(Controller, &ProcessorFlags); down(Semaphore); } } return true;}/* DAC960_V2_ReadDeviceConfiguration reads the Device Configuration Information for DAC960 V2 Firmware Controllers by requesting the Physical Device Information and SCSI Inquiry Unit Serial Number information for each device connected to Controller.*/static boolean DAC960_V2_ReadDeviceConfiguration(DAC960_Controller_T *Controller){ unsigned char Channel = 0, TargetID = 0, LogicalUnit = 0; unsigned short PhysicalDeviceIndex = 0; while (true) { DAC960_V2_PhysicalDeviceInfo_T *NewPhysicalDeviceInfo = &Controller->V2.NewPhysicalDeviceInformation; DAC960_V2_PhysicalDeviceInfo_T *PhysicalDeviceInfo; DAC960_SCSI_Inquiry_UnitSerialNumber_T *InquiryUnitSerialNumber; DAC960_Command_T *Command; DAC960_V2_CommandMailbox_T *CommandMailbox; if (!DAC960_V2_PhysicalDeviceInfo(Controller, DAC960_V2_GetPhysicalDeviceInfoValid, Channel, TargetID, LogicalUnit, NewPhysicalDeviceInfo, sizeof(DAC960_V2_PhysicalDeviceInfo_T))) break; Channel = NewPhysicalDeviceInfo->Channel; TargetID = NewPhysicalDeviceInfo->TargetID; LogicalUnit = NewPhysicalDeviceInfo->LogicalUnit; PhysicalDeviceInfo = (DAC960_V2_PhysicalDeviceInfo_T *) kmalloc(sizeof(DAC960_V2_PhysicalDeviceInfo_T), GFP_ATOMIC); if (PhysicalDeviceInfo == NULL) return DAC960_Failure(Controller, "PHYSICAL DEVICE ALLOCATION"); Controller->V2.PhysicalDeviceInformation[PhysicalDeviceIndex] = PhysicalDeviceInfo; memcpy(PhysicalDeviceInfo, NewPhysicalDeviceInfo, sizeof(DAC960_V2_PhysicalDeviceInfo_T)); InquiryUnitSerialNumber = (DAC960_SCSI_Inquiry_UnitSerialNumber_T *) kmalloc(sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T), GFP_ATOMIC); if (InquiryUnitSerialNumber == NULL) return DAC960_Failure(Controller, "SERIAL NUMBER ALLOCATION"); Controller->V2.InquiryUnitSerialNumber[PhysicalDeviceIndex] = InquiryUnitSerialNumber; memset(InquiryUnitSerialNumber, 0, sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T)); InquiryUnitSerialNumber->PeripheralDeviceType = 0x1F; Command = DAC960_AllocateCommand(Controller); CommandMailbox = &Command->V2.CommandMailbox; DAC960_V2_ClearCommand(Command); Command->CommandType = DAC960_ImmediateCommand; CommandMailbox->SCSI_10.CommandOpcode = DAC960_V2_SCSI_10_Passthru; CommandMailbox->SCSI_10.CommandControlBits .DataTransferControllerToHost = true; CommandMailbox->SCSI_10.CommandControlBits .NoAutoRequestSense = true; CommandMailbox->SCSI_10.DataTransferSize = sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T); CommandMailbox->SCSI_10.PhysicalDevice.LogicalUnit = LogicalUnit; CommandMailbox->SCSI_10.PhysicalDevice.TargetID = TargetID; CommandMailbox->SCSI_10.PhysicalDevice.Channel = Channel; CommandMailbox->SCSI_10.CDBLength = 6; CommandMailbox->SCSI_10.SCSI_CDB[0] = 0x12; /* INQUIRY */ CommandMailbox->SCSI_10.SCSI_CDB[1] = 1; /* EVPD = 1 */ CommandMailbox->SCSI_10.SCSI_CDB[2] = 0x80; /* Page Code */ CommandMailbox->SCSI_10.SCSI_CDB[3] = 0; /* Reserved */ CommandMailbox->SCSI_10.SCSI_CDB[4] = sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T); CommandMailbox->SCSI_10.SCSI_CDB[5] = 0; /* Control */ CommandMailbox->SCSI_10.DataTransferMemoryAddress .ScatterGatherSegments[0] .SegmentDataPointer = Virtual_to_Bus(InquiryUnitSerialNumber); CommandMailbox->SCSI_10.DataTransferMemoryAddress .ScatterGatherSegments[0] .SegmentByteCount = CommandMailbox->SCSI_10.DataTransferSize; DAC960_ExecuteCommand(Command); DAC960_DeallocateCommand(Command); PhysicalDeviceIndex++; LogicalUnit++; } return true;}/* DAC960_SanitizeInquiryData sanitizes the Vendor, Model, Revision, and Product Serial Number fields of the Inquiry Standard Data and Inquiry Unit Serial Number structures.*/static void DAC960_SanitizeInquiryData(DAC960_SCSI_Inquiry_T *InquiryStandardData, DAC960_SCSI_Inquiry_UnitSerialNumber_T *InquiryUnitSerialNumber, unsigned char *Vendor, unsigned char *Model, unsigned char *Revision, unsigned char *SerialNumber){ int SerialNumberLength, i; if (InquiryStandardData->PeripheralDeviceType == 0x1F) return; for (i = 0; i < sizeof(InquiryStandardData->VendorIdentification); i++) { unsigned char VendorCharacter = InquiryStandardData->VendorIdentification[i]; Vendor[i] = (VendorCharacter >= ' ' && VendorCharacter <= '~' ? VendorCharacter : ' '); } Vendor[sizeof(InquiryStandardData->VendorIdentification)] = '\0'; for (i = 0; i < sizeof(InquiryStandardData->ProductIdentification); i++) { unsigned char ModelCharacter = InquiryStandardData->ProductIdentification[i]; Model[i] = (ModelCharacter >= ' ' && ModelCharacter <= '~' ? ModelCharacter : ' '); } Model[sizeof(InquiryStandardData->ProductIdentification)] = '\0'; for (i = 0; i < sizeof(InquiryStandardData->ProductRevisionLevel); i++) { unsigned char RevisionCharacter = InquiryStandardData->ProductRevisionLevel[i]; Revision[i] = (RevisionCharacter >= ' ' && RevisionCharacter <= '~' ? RevisionCharacter : ' '); } Revision[sizeof(InquiryStandardData->ProductRevisionLevel)] = '\0'; if (InquiryUnitSerialNumber->PeripheralDeviceType == 0x1F) return; SerialNumberLength = InquiryUnitSerialNumber->PageLength; if (SerialNumberLength > sizeof(InquiryUnitSerialNumber->ProductSerialNumber)) SerialNumberLength = sizeof(InquiryUnitSerialNumber->ProductSerialNumber); for (i = 0; i < SerialNumberLength; i++) { unsigned char SerialNumberCharacter = InquiryUnitSerialNumber->ProductSerialNumber[i]; SerialNumber[i] = (SerialNumberCharacter >= ' ' && SerialNumberCharacter <= '~' ? SerialNumberCharacter : ' '); } SerialNumber[SerialNumberLength] = '\0';}/* DAC960_V1_ReportDeviceConfiguration reports the Device Configuration Information for DAC960 V1 Firmware Controllers.*/static boolean DAC960_V1_ReportDeviceConfiguration(DAC960_Controller_T *Controller){ int LogicalDriveNumber, Channel, TargetID; DAC960_Info(" Physical Devices:\n", Controller); for (Channel = 0; Channel < Controller->Channels; Channel++) for (TargetID = 0; TargetID < Controller->Targets; TargetID++) { DAC960_SCSI_Inquiry_T *InquiryStandardData = &Controller->V1.InquiryStandardData[Channel][TargetID]; DAC960_SCSI_Inquiry_UnitSerialNumber_T *InquiryUnitSerialNumber = &Controller->V1.InquiryUnitSerialNumber[Channel][TargetID]; DAC960_V1_DeviceState_T *DeviceState = &Controller->V1.DeviceState[Channel][TargetID]; DAC960_V1_ErrorTableEntry_T *ErrorEntry = &Controller->V1.ErrorTable.ErrorTableEntries[Channel][TargetID]; char Vendor[1+sizeof(InquiryStandardData->VendorIdentification)]; char Model[1+sizeof(InquiryStandardData->ProductIdentification)]; char Revision[1+sizeof(InquiryStandardData->ProductRevisionLevel)]; char SerialNumber[1+sizeof(InquiryUnitSerialNumber ->ProductSerialNumber)]; if (InquiryStandardData->PeripheralDeviceType == 0x1F) continue; DAC960_SanitizeInquiryData(InquiryStandardData, InquiryUnitSerialNumber, Vendor, Model, Revision, SerialNumber); DAC960_Info(" %d:%d%s Vendor: %s Model: %s Revision: %s\n", Controller, Channel, TargetID, (TargetID < 10 ? " " : ""), Vendor, Model, Revision); if (InquiryUnitSerialNumber->PeripheralDeviceType != 0x1F) DAC960_Info(" Serial Number: %s\n", Controller, SerialNumber); if (DeviceState->Present && DeviceState->DeviceType == DAC960_V1_DiskType) { if (Controller->V1.DeviceResetCount[Channel][TargetID] > 0) DAC960_Info(" Disk Status: %s, %d blocks, %d resets\n", Controller, (DeviceState->DeviceState == DAC960_V1_Device_Dead ? "Dead" : DeviceState->DeviceState == DAC960_V1_Device_WriteOnly ? "Write-Only" : DeviceState->DeviceState == DAC960_V1_Device_Online ? "Online" : "Standby"), DeviceState->DiskSize, Controller->V1.DeviceResetCount[Channel][TargetID]); else DAC960_Info(" Disk Status: %s, %d blocks\n", Controller, (DeviceState->DeviceState == DAC960_V1_Device_Dead ? "Dead" : DeviceState->DeviceState == DAC960_V1_Device_WriteOnly ? "Write-Only" : DeviceState->DeviceState == DAC960_V1_Device_Online ? "Online" : "Standby"), DeviceState->DiskSize); } if (ErrorEntry->ParityErrorCount > 0 || ErrorEntry->SoftErrorCount > 0 || ErrorEntry->HardErrorCount > 0 || ErrorEntry->MiscErrorCount > 0) DAC960_Info(" Errors - Parity: %d, Soft: %d, " "Hard: %d, Misc: %d\n", Controller, ErrorEntry->ParityErrorCount, ErrorEntry->SoftErrorCount, ErrorEntry->HardErrorCount, ErrorEntry->MiscErrorCount); } DAC960_Info(" Logical Drives:\n", Controller); for (LogicalDriveNumber = 0; LogicalDriveNumber < Controller->LogicalDriveCount; LogicalDriveNumber++) { DAC960_V1_LogicalDriveInformation_T *LogicalDriveInformation = &Controller->V1.LogicalDriveInformation[LogicalDriveNumber]; DAC960_Info(" /dev/rd/c%dd%d: RAID-%d, %s, %d blocks, %s\n", Controller, Controller->ControllerNumber, LogicalDriveNumber, LogicalDriveInformation->RAIDLevel, (LogicalDriveInformation->LogicalDriveState == DAC960_V1_LogicalDrive_Online ? "Online" : LogicalDriveInformation->LogicalDriveState == DAC960_V1_LogicalDrive_Critical ? "Critical" : "Offline"), LogicalDriveInformation->LogicalDriveSize, (LogicalDriveInformation->WriteBack ? "Write Back" : "Write Thru")); } return true;}/* DAC960_V2_ReportDeviceConfiguration reports the Device Configuration Information for DAC960 V2 Firmware Controllers.*/static boolean DAC960_V2_ReportDeviceConfiguration(DAC960_Controller_T *Controller){ int PhysicalDeviceIndex, LogicalDriveNumber; DAC960_Info(" Physical Devices:\n", Controller); for (PhysicalDeviceIndex = 0; PhysicalDeviceIndex < DAC960_V2_MaxPhysicalDevices; PhysicalDeviceIndex++) { DAC960_V2_PhysicalDeviceInfo_T *PhysicalDeviceInfo = Controller->V2.PhysicalDeviceInformation[PhysicalDeviceIndex]; DAC960_SCSI_Inquiry_T *InquiryStandardData = (DAC960_SCSI_Inquiry_T *) &PhysicalDeviceInfo->SCSI_InquiryData; DAC960_SCSI_Inquiry_UnitSerialNumber_T *InquiryUnitSerialNumber = Controller->V2.InquiryUnitSerialNumber[PhysicalDeviceIndex]; char Vendor[1+sizeof(InquiryStandardData->VendorIdentification)]; char Model[1+sizeof(InquiryStandardData->ProductIdentification)]; char Revision[1+sizeof(InquiryStandardData->ProductRevisionLevel)]; char SerialNumber[1+sizeof(InquiryUnitSerialNumber->ProductSerialNumber)]; if (PhysicalDeviceInfo == NULL) break; DAC960_SanitizeInquiryData(InquiryStandardData, InquiryUnitSerialNumber, Vendor, Model, Revision, SerialNumber); DAC960_Info(" %d:%d%s Vendor: %s Model: %s Revision: %s\n", Controller, PhysicalDeviceInfo->Channel, PhysicalDeviceInfo->TargetID, (PhysicalDeviceInfo->TargetID < 10 ? " " : ""), Vendor, Model, Revision); if (PhysicalDeviceInfo->NegotiatedSynchronousMegaTransfers == 0) DAC960_Info(" %sAsynchronous\n", Controller, (PhysicalDeviceInfo->NegotiatedDataWidthBits == 16 ? "Wide " :"")); else DAC960_Info(" %sSynchronous at %d MB/sec\n", Controller, (PhysicalDeviceInfo->NegotiatedDataWidthBits == 16 ? "Wide " :""), (PhysicalDeviceInfo->NegotiatedSynchronousMegaTransfers
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -