📄 dac960.c
字号:
PhysicalDevice.LogicalUnit = NewLogicalDeviceInfo->LogicalUnit; Controller->V2.LogicalDriveToVirtualDevice[LogicalDeviceNumber] = PhysicalDevice; if (NewLogicalDeviceInfo->LogicalDeviceState != DAC960_V2_LogicalDevice_Offline) Controller->LogicalDriveInitiallyAccessible[LogicalDeviceNumber] = true; LogicalDeviceInfo = (DAC960_V2_LogicalDeviceInfo_T *) kmalloc(sizeof(DAC960_V2_LogicalDeviceInfo_T), GFP_ATOMIC); if (LogicalDeviceInfo == NULL) return DAC960_Failure(Controller, "LOGICAL DEVICE ALLOCATION"); Controller->V2.LogicalDeviceInformation[LogicalDeviceNumber] = LogicalDeviceInfo; memcpy(LogicalDeviceInfo, NewLogicalDeviceInfo, sizeof(DAC960_V2_LogicalDeviceInfo_T)); LogicalDeviceNumber++; } return true;}/* DAC960_ReportControllerConfiguration reports the Configuration Information for Controller.*/static boolean DAC960_ReportControllerConfiguration(DAC960_Controller_T *Controller){ DAC960_Info("Configuring Mylex %s PCI RAID Controller\n", Controller, Controller->ModelName); DAC960_Info(" Firmware Version: %s, Channels: %d, Memory Size: %dMB\n", Controller, Controller->FirmwareVersion, Controller->Channels, Controller->MemorySize); DAC960_Info(" PCI Bus: %d, Device: %d, Function: %d, I/O Address: ", Controller, Controller->Bus, Controller->Device, Controller->Function); if (Controller->IO_Address == 0) DAC960_Info("Unassigned\n", Controller); else DAC960_Info("0x%X\n", Controller, Controller->IO_Address); DAC960_Info(" PCI Address: 0x%X mapped at 0x%lX, IRQ Channel: %d\n", Controller, Controller->PCI_Address, (unsigned long) Controller->BaseAddress, Controller->IRQ_Channel); DAC960_Info(" Controller Queue Depth: %d, " "Maximum Blocks per Command: %d\n", Controller, Controller->ControllerQueueDepth, Controller->MaxBlocksPerCommand); DAC960_Info(" Driver Queue Depth: %d, " "Scatter/Gather Limit: %d of %d Segments\n", Controller, Controller->DriverQueueDepth, Controller->DriverScatterGatherLimit, Controller->ControllerScatterGatherLimit); if (Controller->FirmwareType == DAC960_V1_Controller) { DAC960_Info(" Stripe Size: %dKB, Segment Size: %dKB, " "BIOS Geometry: %d/%d\n", Controller, Controller->V1.StripeSize, Controller->V1.SegmentSize, Controller->V1.GeometryTranslationHeads, Controller->V1.GeometryTranslationSectors); if (Controller->V1.SAFTE_EnclosureManagementEnabled) DAC960_Info(" SAF-TE Enclosure Management Enabled\n", Controller); } return true;}/* DAC960_V1_ReadDeviceConfiguration reads the Device Configuration Information for DAC960 V1 Firmware Controllers by requesting the SCSI Inquiry and SCSI Inquiry Unit Serial Number information for each device connected to Controller.*/static boolean DAC960_V1_ReadDeviceConfiguration(DAC960_Controller_T *Controller){ DAC960_V1_DCDB_T DCDBs[DAC960_V1_MaxChannels], *DCDB; Completion_T Completions[DAC960_V1_MaxChannels], *Completion; unsigned long ProcessorFlags; int Channel, TargetID; for (TargetID = 0; TargetID < Controller->Targets; TargetID++) { for (Channel = 0; Channel < Controller->Channels; Channel++) { DAC960_Command_T *Command = Controller->Commands[Channel]; DAC960_SCSI_Inquiry_T *InquiryStandardData = &Controller->V1.InquiryStandardData[Channel][TargetID]; InquiryStandardData->PeripheralDeviceType = 0x1F; Completion = &Completions[Channel]; init_completion(Completion); DCDB = &DCDBs[Channel]; DAC960_V1_ClearCommand(Command); Command->CommandType = DAC960_ImmediateCommand; Command->Completion = Completion; Command->V1.CommandMailbox.Type3.CommandOpcode = DAC960_V1_DCDB; Command->V1.CommandMailbox.Type3.BusAddress = Virtual_to_Bus32(DCDB); DCDB->Channel = Channel; DCDB->TargetID = TargetID; DCDB->Direction = DAC960_V1_DCDB_DataTransferDeviceToSystem; 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_Bus32(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; Completion = &Completions[Channel]; wait_for_completion(Completion); if (Command->V1.CommandStatus != DAC960_V1_NormalCompletion) continue; Command->Completion = Completion; DCDB = &DCDBs[Channel]; DCDB->TransferLength = sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T); DCDB->BusAddress = Virtual_to_Bus32(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); wait_for_completion(Completion); } } 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_Bus64(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, %u blocks
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -