⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dac960.c

📁 Linux块设备驱动源码
💻 C
📖 第 1 页 / 共 5 页
字号:
  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 + -