📄 dac960.c
字号:
void __iomem *ControllerBaseAddress = Controller->BaseAddress; DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox; DAC960_V1_CommandMailbox_T *NextCommandMailbox = Controller->V1.NextCommandMailbox; CommandMailbox->Common.CommandIdentifier = Command->CommandIdentifier; DAC960_PG_WriteCommandMailbox(NextCommandMailbox, CommandMailbox); if (Controller->V1.PreviousCommandMailbox1->Words[0] == 0 || Controller->V1.PreviousCommandMailbox2->Words[0] == 0) DAC960_PG_HardwareMailboxNewCommand(ControllerBaseAddress); Controller->V1.PreviousCommandMailbox2 = Controller->V1.PreviousCommandMailbox1; Controller->V1.PreviousCommandMailbox1 = NextCommandMailbox; if (++NextCommandMailbox > Controller->V1.LastCommandMailbox) NextCommandMailbox = Controller->V1.FirstCommandMailbox; Controller->V1.NextCommandMailbox = NextCommandMailbox;}/* DAC960_PD_QueueCommand queues Command for DAC960 PD Series Controllers.*/static void DAC960_PD_QueueCommand(DAC960_Command_T *Command){ DAC960_Controller_T *Controller = Command->Controller; void __iomem *ControllerBaseAddress = Controller->BaseAddress; DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox; CommandMailbox->Common.CommandIdentifier = Command->CommandIdentifier; while (DAC960_PD_MailboxFullP(ControllerBaseAddress)) udelay(1); DAC960_PD_WriteCommandMailbox(ControllerBaseAddress, CommandMailbox); DAC960_PD_NewCommand(ControllerBaseAddress);}/* DAC960_P_QueueCommand queues Command for DAC960 P Series Controllers.*/static void DAC960_P_QueueCommand(DAC960_Command_T *Command){ DAC960_Controller_T *Controller = Command->Controller; void __iomem *ControllerBaseAddress = Controller->BaseAddress; DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox; CommandMailbox->Common.CommandIdentifier = Command->CommandIdentifier; switch (CommandMailbox->Common.CommandOpcode) { case DAC960_V1_Enquiry: CommandMailbox->Common.CommandOpcode = DAC960_V1_Enquiry_Old; break; case DAC960_V1_GetDeviceState: CommandMailbox->Common.CommandOpcode = DAC960_V1_GetDeviceState_Old; break; case DAC960_V1_Read: CommandMailbox->Common.CommandOpcode = DAC960_V1_Read_Old; DAC960_PD_To_P_TranslateReadWriteCommand(CommandMailbox); break; case DAC960_V1_Write: CommandMailbox->Common.CommandOpcode = DAC960_V1_Write_Old; DAC960_PD_To_P_TranslateReadWriteCommand(CommandMailbox); break; case DAC960_V1_ReadWithScatterGather: CommandMailbox->Common.CommandOpcode = DAC960_V1_ReadWithScatterGather_Old; DAC960_PD_To_P_TranslateReadWriteCommand(CommandMailbox); break; case DAC960_V1_WriteWithScatterGather: CommandMailbox->Common.CommandOpcode = DAC960_V1_WriteWithScatterGather_Old; DAC960_PD_To_P_TranslateReadWriteCommand(CommandMailbox); break; default: break; } while (DAC960_PD_MailboxFullP(ControllerBaseAddress)) udelay(1); DAC960_PD_WriteCommandMailbox(ControllerBaseAddress, CommandMailbox); DAC960_PD_NewCommand(ControllerBaseAddress);}/* DAC960_ExecuteCommand executes Command and waits for completion.*/static void DAC960_ExecuteCommand(DAC960_Command_T *Command){ DAC960_Controller_T *Controller = Command->Controller; DECLARE_COMPLETION(Completion); unsigned long flags; Command->Completion = &Completion; spin_lock_irqsave(&Controller->queue_lock, flags); DAC960_QueueCommand(Command); spin_unlock_irqrestore(&Controller->queue_lock, flags); if (in_interrupt()) return; wait_for_completion(&Completion);}/* DAC960_V1_ExecuteType3 executes a DAC960 V1 Firmware Controller Type 3 Command and waits for completion. It returns true on success and false on failure.*/static boolean DAC960_V1_ExecuteType3(DAC960_Controller_T *Controller, DAC960_V1_CommandOpcode_T CommandOpcode, dma_addr_t DataDMA){ DAC960_Command_T *Command = DAC960_AllocateCommand(Controller); DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox; DAC960_V1_CommandStatus_T CommandStatus; DAC960_V1_ClearCommand(Command); Command->CommandType = DAC960_ImmediateCommand; CommandMailbox->Type3.CommandOpcode = CommandOpcode; CommandMailbox->Type3.BusAddress = DataDMA; DAC960_ExecuteCommand(Command); CommandStatus = Command->V1.CommandStatus; DAC960_DeallocateCommand(Command); return (CommandStatus == DAC960_V1_NormalCompletion);}/* DAC960_V1_ExecuteTypeB executes a DAC960 V1 Firmware Controller Type 3B Command and waits for completion. It returns true on success and false on failure.*/static boolean DAC960_V1_ExecuteType3B(DAC960_Controller_T *Controller, DAC960_V1_CommandOpcode_T CommandOpcode, unsigned char CommandOpcode2, dma_addr_t DataDMA){ DAC960_Command_T *Command = DAC960_AllocateCommand(Controller); DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox; DAC960_V1_CommandStatus_T CommandStatus; DAC960_V1_ClearCommand(Command); Command->CommandType = DAC960_ImmediateCommand; CommandMailbox->Type3B.CommandOpcode = CommandOpcode; CommandMailbox->Type3B.CommandOpcode2 = CommandOpcode2; CommandMailbox->Type3B.BusAddress = DataDMA; DAC960_ExecuteCommand(Command); CommandStatus = Command->V1.CommandStatus; DAC960_DeallocateCommand(Command); return (CommandStatus == DAC960_V1_NormalCompletion);}/* DAC960_V1_ExecuteType3D executes a DAC960 V1 Firmware Controller Type 3D Command and waits for completion. It returns true on success and false on failure.*/static boolean DAC960_V1_ExecuteType3D(DAC960_Controller_T *Controller, DAC960_V1_CommandOpcode_T CommandOpcode, unsigned char Channel, unsigned char TargetID, dma_addr_t DataDMA){ DAC960_Command_T *Command = DAC960_AllocateCommand(Controller); DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox; DAC960_V1_CommandStatus_T CommandStatus; DAC960_V1_ClearCommand(Command); Command->CommandType = DAC960_ImmediateCommand; CommandMailbox->Type3D.CommandOpcode = CommandOpcode; CommandMailbox->Type3D.Channel = Channel; CommandMailbox->Type3D.TargetID = TargetID; CommandMailbox->Type3D.BusAddress = DataDMA; DAC960_ExecuteCommand(Command); CommandStatus = Command->V1.CommandStatus; DAC960_DeallocateCommand(Command); return (CommandStatus == DAC960_V1_NormalCompletion);}/* DAC960_V2_GeneralInfo executes a DAC960 V2 Firmware General Information Reading IOCTL Command and waits for completion. It returns true on success and false on failure. Return data in The controller's HealthStatusBuffer, which is dma-able memory*/static boolean DAC960_V2_GeneralInfo(DAC960_Controller_T *Controller){ DAC960_Command_T *Command = DAC960_AllocateCommand(Controller); DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox; DAC960_V2_CommandStatus_T CommandStatus; DAC960_V2_ClearCommand(Command); Command->CommandType = DAC960_ImmediateCommand; CommandMailbox->Common.CommandOpcode = DAC960_V2_IOCTL; CommandMailbox->Common.CommandControlBits .DataTransferControllerToHost = true; CommandMailbox->Common.CommandControlBits .NoAutoRequestSense = true; CommandMailbox->Common.DataTransferSize = sizeof(DAC960_V2_HealthStatusBuffer_T); CommandMailbox->Common.IOCTL_Opcode = DAC960_V2_GetHealthStatus; CommandMailbox->Common.DataTransferMemoryAddress .ScatterGatherSegments[0] .SegmentDataPointer = Controller->V2.HealthStatusBufferDMA; CommandMailbox->Common.DataTransferMemoryAddress .ScatterGatherSegments[0] .SegmentByteCount = CommandMailbox->Common.DataTransferSize; DAC960_ExecuteCommand(Command); CommandStatus = Command->V2.CommandStatus; DAC960_DeallocateCommand(Command); return (CommandStatus == DAC960_V2_NormalCompletion);}/* DAC960_V2_ControllerInfo executes a DAC960 V2 Firmware Controller Information Reading IOCTL Command and waits for completion. It returns true on success and false on failure. Data is returned in the controller's V2.NewControllerInformation dma-able memory buffer.*/static boolean DAC960_V2_NewControllerInfo(DAC960_Controller_T *Controller){ DAC960_Command_T *Command = DAC960_AllocateCommand(Controller); DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox; DAC960_V2_CommandStatus_T CommandStatus; DAC960_V2_ClearCommand(Command); Command->CommandType = DAC960_ImmediateCommand; CommandMailbox->ControllerInfo.CommandOpcode = DAC960_V2_IOCTL; CommandMailbox->ControllerInfo.CommandControlBits .DataTransferControllerToHost = true; CommandMailbox->ControllerInfo.CommandControlBits .NoAutoRequestSense = true; CommandMailbox->ControllerInfo.DataTransferSize = sizeof(DAC960_V2_ControllerInfo_T); CommandMailbox->ControllerInfo.ControllerNumber = 0; CommandMailbox->ControllerInfo.IOCTL_Opcode = DAC960_V2_GetControllerInfo; CommandMailbox->ControllerInfo.DataTransferMemoryAddress .ScatterGatherSegments[0] .SegmentDataPointer = Controller->V2.NewControllerInformationDMA; CommandMailbox->ControllerInfo.DataTransferMemoryAddress .ScatterGatherSegments[0] .SegmentByteCount = CommandMailbox->ControllerInfo.DataTransferSize; DAC960_ExecuteCommand(Command); CommandStatus = Command->V2.CommandStatus; DAC960_DeallocateCommand(Command); return (CommandStatus == DAC960_V2_NormalCompletion);}/* DAC960_V2_LogicalDeviceInfo executes a DAC960 V2 Firmware Controller Logical Device Information Reading IOCTL Command and waits for completion. It returns true on success and false on failure. Data is returned in the controller's V2.NewLogicalDeviceInformation*/static boolean DAC960_V2_NewLogicalDeviceInfo(DAC960_Controller_T *Controller, unsigned short LogicalDeviceNumber){ DAC960_Command_T *Command = DAC960_AllocateCommand(Controller); DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox; DAC960_V2_CommandStatus_T CommandStatus; DAC960_V2_ClearCommand(Command); Command->CommandType = DAC960_ImmediateCommand; CommandMailbox->LogicalDeviceInfo.CommandOpcode = DAC960_V2_IOCTL; CommandMailbox->LogicalDeviceInfo.CommandControlBits .DataTransferControllerToHost = true; CommandMailbox->LogicalDeviceInfo.CommandControlBits .NoAutoRequestSense = true; CommandMailbox->LogicalDeviceInfo.DataTransferSize = sizeof(DAC960_V2_LogicalDeviceInfo_T); CommandMailbox->LogicalDeviceInfo.LogicalDevice.LogicalDeviceNumber = LogicalDeviceNumber; CommandMailbox->LogicalDeviceInfo.IOCTL_Opcode = DAC960_V2_GetLogicalDeviceInfoValid; CommandMailbox->LogicalDeviceInfo.DataTransferMemoryAddress .ScatterGatherSegments[0] .SegmentDataPointer = Controller->V2.NewLogicalDeviceInformationDMA; CommandMailbox->LogicalDeviceInfo.DataTransferMemoryAddress .ScatterGatherSegments[0] .SegmentByteCount = CommandMailbox->LogicalDeviceInfo.DataTransferSize; DAC960_ExecuteCommand(Command); CommandStatus = Command->V2.CommandStatus; DAC960_DeallocateCommand(Command); return (CommandStatus == DAC960_V2_NormalCompletion);}/* DAC960_V2_PhysicalDeviceInfo executes a DAC960 V2 Firmware Controller "Read Physical Device Information" IOCTL Command and waits for completion. It returns true on success and false on failure. The Channel, TargetID, LogicalUnit arguments should be 0 the first time this function is called for a given controller. This will return data for the "first" device on that controller. The returned data includes a Channel, TargetID, LogicalUnit that can be passed in to this routine to get data for the NEXT device on that controller. Data is stored in the controller's V2.NewPhysicalDeviceInfo dma-able memory buffer.*/static boolean DAC960_V2_NewPhysicalDeviceInfo(DAC960_Controller_T *Controller, unsigned char Channel, unsigned char TargetID, unsigned char LogicalUnit){ DAC960_Command_T *Command = DAC960_AllocateCommand(Controller); DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox; DAC960_V2_CommandStatus_T CommandStatus; DAC960_V2_ClearCommand(Command); Command->CommandType = DAC960_ImmediateCommand; CommandMailbox->PhysicalDeviceInfo.CommandOpcode = DAC960_V2_IOCTL; CommandMailbox->PhysicalDeviceInfo.CommandControlBits .DataTransferControllerToHost = true; CommandMailbox->PhysicalDeviceInfo.CommandControlBits .NoAutoRequestSense = true; CommandMailbox->PhysicalDeviceInfo.DataTransferSize = sizeof(DAC960_V2_PhysicalDeviceInfo_T); CommandMailbox->PhysicalDeviceInfo.PhysicalDevice.LogicalUnit = LogicalUnit; CommandMailbox->PhysicalDeviceInfo.PhysicalDevice.TargetID = TargetID; CommandMailbox->PhysicalDeviceInfo.PhysicalDevice.Channel = Channel; CommandMailbox->PhysicalDeviceInfo.IOCTL_Opcode = DAC960_V2_GetPhysicalDeviceInfoValid; CommandMailbox->PhysicalDeviceInfo.DataTransferMemoryAddress .ScatterGatherSegments[0] .SegmentDataPointer = Controller->V2.NewPhysicalDeviceInformationDMA; CommandMailbox->PhysicalDeviceInfo.DataTransferMemoryAddress .ScatterGatherSegments[0] .SegmentByteCount = CommandMailbox->PhysicalDeviceInfo.DataTransferSize; DAC960_ExecuteCommand(Command); CommandStatus = Command->V2.CommandStatus; DAC960_DeallocateCommand(Command); return (CommandStatus == DAC960_V2_NormalCompletion);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -