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

📄 dac960.c

📁 Linux块设备驱动源码
💻 C
📖 第 1 页 / 共 5 页
字号:
	Command->V1.ScatterGatherList =		(DAC960_V1_ScatterGatherSegment_T *)ScatterGatherCPU;	Command->V1.ScatterGatherListDMA = ScatterGatherDMA;      } else {        Command->cmd_sglist = Command->V2.ScatterList;	Command->V2.ScatterGatherList =		(DAC960_V2_ScatterGatherSegment_T *)ScatterGatherCPU;	Command->V2.ScatterGatherListDMA = ScatterGatherDMA;	Command->V2.RequestSense =				(DAC960_SCSI_RequestSense_T *)RequestSenseCPU;	Command->V2.RequestSenseDMA = RequestSenseDMA;      }    }  return true;}/*  DAC960_DestroyAuxiliaryStructures deallocates the auxiliary data  structures for Controller.*/static void DAC960_DestroyAuxiliaryStructures(DAC960_Controller_T *Controller){  int i;  struct pci_pool *ScatterGatherPool = Controller->ScatterGatherPool;  struct pci_pool *RequestSensePool = NULL;  void *ScatterGatherCPU;  dma_addr_t ScatterGatherDMA;  void *RequestSenseCPU;  dma_addr_t RequestSenseDMA;  DAC960_Command_T *CommandGroup = NULL;    if (Controller->FirmwareType == DAC960_V2_Controller)        RequestSensePool = Controller->V2.RequestSensePool;  Controller->FreeCommands = NULL;  for (i = 0; i < Controller->DriverQueueDepth; i++)    {      DAC960_Command_T *Command = Controller->Commands[i];      if (Command == NULL)	  continue;      if (Controller->FirmwareType == DAC960_V1_Controller) {	  ScatterGatherCPU = (void *)Command->V1.ScatterGatherList;	  ScatterGatherDMA = Command->V1.ScatterGatherListDMA;	  RequestSenseCPU = NULL;	  RequestSenseDMA = (dma_addr_t)0;      } else {          ScatterGatherCPU = (void *)Command->V2.ScatterGatherList;	  ScatterGatherDMA = Command->V2.ScatterGatherListDMA;	  RequestSenseCPU = (void *)Command->V2.RequestSense;	  RequestSenseDMA = Command->V2.RequestSenseDMA;      }      if (ScatterGatherCPU != NULL)          pci_pool_free(ScatterGatherPool, ScatterGatherCPU, ScatterGatherDMA);      if (RequestSenseCPU != NULL)          pci_pool_free(RequestSensePool, RequestSenseCPU, RequestSenseDMA);      if ((Command->CommandIdentifier	   % Controller->CommandAllocationGroupSize) == 1) {	   /*	    * We can't free the group of commands until all of the	    * request sense and scatter gather dma structures are free.            * Remember the beginning of the group, but don't free it	    * until we've reached the beginning of the next group.	    */	   if (CommandGroup != NULL)		kfree(CommandGroup);	    CommandGroup = Command;      }      Controller->Commands[i] = NULL;    }  if (CommandGroup != NULL)      kfree(CommandGroup);  if (Controller->CombinedStatusBuffer != NULL)    {      kfree(Controller->CombinedStatusBuffer);      Controller->CombinedStatusBuffer = NULL;      Controller->CurrentStatusBuffer = NULL;    }  if (ScatterGatherPool != NULL)  	pci_pool_destroy(ScatterGatherPool);  if (Controller->FirmwareType == DAC960_V1_Controller) return;  if (RequestSensePool != NULL)	pci_pool_destroy(RequestSensePool);  for (i = 0; i < DAC960_MaxLogicalDrives; i++)    if (Controller->V2.LogicalDeviceInformation[i] != NULL)      {	kfree(Controller->V2.LogicalDeviceInformation[i]);	Controller->V2.LogicalDeviceInformation[i] = NULL;      }  for (i = 0; i < DAC960_V2_MaxPhysicalDevices; i++)    {      if (Controller->V2.PhysicalDeviceInformation[i] != NULL)	{	  kfree(Controller->V2.PhysicalDeviceInformation[i]);	  Controller->V2.PhysicalDeviceInformation[i] = NULL;	}      if (Controller->V2.InquiryUnitSerialNumber[i] != NULL)	{	  kfree(Controller->V2.InquiryUnitSerialNumber[i]);	  Controller->V2.InquiryUnitSerialNumber[i] = NULL;	}    }}/*  DAC960_V1_ClearCommand clears critical fields of Command for DAC960 V1  Firmware Controllers.*/static inline void DAC960_V1_ClearCommand(DAC960_Command_T *Command){  DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox;  memset(CommandMailbox, 0, sizeof(DAC960_V1_CommandMailbox_T));  Command->V1.CommandStatus = 0;}/*  DAC960_V2_ClearCommand clears critical fields of Command for DAC960 V2  Firmware Controllers.*/static inline void DAC960_V2_ClearCommand(DAC960_Command_T *Command){  DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox;  memset(CommandMailbox, 0, sizeof(DAC960_V2_CommandMailbox_T));  Command->V2.CommandStatus = 0;}/*  DAC960_AllocateCommand allocates a Command structure from Controller's  free list.  During driver initialization, a special initialization command  has been placed on the free list to guarantee that command allocation can  never fail.*/static inline DAC960_Command_T *DAC960_AllocateCommand(DAC960_Controller_T						       *Controller){  DAC960_Command_T *Command = Controller->FreeCommands;  if (Command == NULL) return NULL;  Controller->FreeCommands = Command->Next;  Command->Next = NULL;  return Command;}/*  DAC960_DeallocateCommand deallocates Command, returning it to Controller's  free list.*/static inline void DAC960_DeallocateCommand(DAC960_Command_T *Command){  DAC960_Controller_T *Controller = Command->Controller;  Command->Request = NULL;  Command->Next = Controller->FreeCommands;  Controller->FreeCommands = Command;}/*  DAC960_WaitForCommand waits for a wake_up on Controller's Command Wait Queue.*/static void DAC960_WaitForCommand(DAC960_Controller_T *Controller){  spin_unlock_irq(&Controller->queue_lock);  __wait_event(Controller->CommandWaitQueue, Controller->FreeCommands);  spin_lock_irq(&Controller->queue_lock);}/*  DAC960_GEM_QueueCommand queues Command for DAC960 GEM Series Controllers.*/static void DAC960_GEM_QueueCommand(DAC960_Command_T *Command){  DAC960_Controller_T *Controller = Command->Controller;  void __iomem *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_GEM_WriteCommandMailbox(NextCommandMailbox, CommandMailbox);  if (Controller->V2.PreviousCommandMailbox1->Words[0] == 0 ||      Controller->V2.PreviousCommandMailbox2->Words[0] == 0)      DAC960_GEM_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_BA_QueueCommand queues Command for DAC960 BA Series Controllers.*/static void DAC960_BA_QueueCommand(DAC960_Command_T *Command){  DAC960_Controller_T *Controller = Command->Controller;  void __iomem *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_BA_WriteCommandMailbox(NextCommandMailbox, CommandMailbox);  if (Controller->V2.PreviousCommandMailbox1->Words[0] == 0 ||      Controller->V2.PreviousCommandMailbox2->Words[0] == 0)    DAC960_BA_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_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 __iomem *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 __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_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 __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_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 __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_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;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -