📄 dac960.c
字号:
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 + -