📄 dac960.c
字号:
}/* DAC960_LP_QueueCommand queues Command for DAC960 LP Series Controllers.*/static void DAC960_LP_QueueCommand(DAC960_Command_T *Command){ DAC960_Controller_T *Controller = Command->Controller; void *ControllerBaseAddress = Controller->BaseAddress; DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox; DAC960_V2_CommandMailbox_T *NextCommandMailbox = Controller->V2.NextCommandMailbox; CommandMailbox->Common.CommandIdentifier = Command->CommandIdentifier; DAC960_LP_WriteCommandMailbox(NextCommandMailbox, CommandMailbox); if (Controller->V2.PreviousCommandMailbox1->Words[0] == 0 || Controller->V2.PreviousCommandMailbox2->Words[0] == 0) DAC960_LP_MemoryMailboxNewCommand(ControllerBaseAddress); Controller->V2.PreviousCommandMailbox2 = Controller->V2.PreviousCommandMailbox1; Controller->V2.PreviousCommandMailbox1 = NextCommandMailbox; if (++NextCommandMailbox > Controller->V2.LastCommandMailbox) NextCommandMailbox = Controller->V2.FirstCommandMailbox; Controller->V2.NextCommandMailbox = NextCommandMailbox;}/* DAC960_LA_QueueCommandDualMode queues Command for DAC960 LA Series Controllers with Dual Mode Firmware.*/static void DAC960_LA_QueueCommandDualMode(DAC960_Command_T *Command){ DAC960_Controller_T *Controller = Command->Controller; void *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_LA_WriteCommandMailbox(NextCommandMailbox, CommandMailbox); if (Controller->V1.PreviousCommandMailbox1->Words[0] == 0 || Controller->V1.PreviousCommandMailbox2->Words[0] == 0) DAC960_LA_MemoryMailboxNewCommand(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_LA_QueueCommandSingleMode queues Command for DAC960 LA Series Controllers with Single Mode Firmware.*/static void DAC960_LA_QueueCommandSingleMode(DAC960_Command_T *Command){ DAC960_Controller_T *Controller = Command->Controller; void *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_LA_WriteCommandMailbox(NextCommandMailbox, CommandMailbox); if (Controller->V1.PreviousCommandMailbox1->Words[0] == 0 || Controller->V1.PreviousCommandMailbox2->Words[0] == 0) DAC960_LA_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_PG_QueueCommandDualMode queues Command for DAC960 PG Series Controllers with Dual Mode Firmware.*/static void DAC960_PG_QueueCommandDualMode(DAC960_Command_T *Command){ DAC960_Controller_T *Controller = Command->Controller; void *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_MemoryMailboxNewCommand(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_PG_QueueCommandSingleMode queues Command for DAC960 PG Series Controllers with Single Mode Firmware.*/static void DAC960_PG_QueueCommandSingleMode(DAC960_Command_T *Command){ DAC960_Controller_T *Controller = Command->Controller; void *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 *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 *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 ProcessorFlags; Command->Completion = &Completion; DAC960_AcquireControllerLock(Controller, &ProcessorFlags); DAC960_QueueCommand(Command); DAC960_ReleaseControllerLock(Controller, &ProcessorFlags); 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, void *DataPointer){ 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 = Virtual_to_Bus32(DataPointer); 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, void *DataPointer){ 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 = Virtual_to_Bus32(DataPointer); 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, void *DataPointer){ 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 = Virtual_to_Bus32(DataPointer); 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.*/static boolean DAC960_V2_GeneralInfo(DAC960_Controller_T *Controller, DAC960_V2_IOCTL_Opcode_T IOCTL_Opcode, void *DataPointer, unsigned int DataByteCount){ 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 = DataByteCount; CommandMailbox->Common.IOCTL_Opcode = IOCTL_Opcode; CommandMailbox->Common.DataTransferMemoryAddress .ScatterGatherSegments[0] .SegmentDataPointer = Virtual_to_Bus64(DataPointer); 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.*/static boolean DAC960_V2_ControllerInfo(DAC960_Controller_T *Controller,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -