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

📄 dac960.c

📁 讲述linux的初始化过程
💻 C
📖 第 1 页 / 共 5 页
字号:
	  DCDB->EarlyStatus = false;	  DCDB->Timeout = DAC960_V1_DCDB_Timeout_10_seconds;	  DCDB->NoAutomaticRequestSense = false;	  DCDB->DisconnectPermitted = true;	  DCDB->TransferLength = sizeof(DAC960_SCSI_Inquiry_T);	  DCDB->BusAddress = Virtual_to_Bus(InquiryStandardData);	  DCDB->CDBLength = 6;	  DCDB->TransferLengthHigh4 = 0;	  DCDB->SenseLength = sizeof(DCDB->SenseData);	  DCDB->CDB[0] = 0x12; /* INQUIRY */	  DCDB->CDB[1] = 0; /* EVPD = 0 */	  DCDB->CDB[2] = 0; /* Page Code */	  DCDB->CDB[3] = 0; /* Reserved */	  DCDB->CDB[4] = sizeof(DAC960_SCSI_Inquiry_T);	  DCDB->CDB[5] = 0; /* Control */	  DAC960_AcquireControllerLock(Controller, &ProcessorFlags);	  DAC960_QueueCommand(Command);	  DAC960_ReleaseControllerLock(Controller, &ProcessorFlags);	}      for (Channel = 0; Channel < Controller->Channels; Channel++)	{	  DAC960_Command_T *Command = Controller->Commands[Channel];	  DAC960_SCSI_Inquiry_UnitSerialNumber_T *InquiryUnitSerialNumber =	    &Controller->V1.InquiryUnitSerialNumber[Channel][TargetID];	  InquiryUnitSerialNumber->PeripheralDeviceType = 0x1F;	  Semaphore = &Semaphores[Channel];	  down(Semaphore);	  if (Command->V1.CommandStatus != DAC960_V1_NormalCompletion)	    continue;	  Command->Semaphore = Semaphore;	  DCDB = &DCDBs[Channel];	  DCDB->TransferLength = sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T);	  DCDB->BusAddress = Virtual_to_Bus(InquiryUnitSerialNumber);	  DCDB->SenseLength = sizeof(DCDB->SenseData);	  DCDB->CDB[0] = 0x12; /* INQUIRY */	  DCDB->CDB[1] = 1; /* EVPD = 1 */	  DCDB->CDB[2] = 0x80; /* Page Code */	  DCDB->CDB[3] = 0; /* Reserved */	  DCDB->CDB[4] = sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T);	  DCDB->CDB[5] = 0; /* Control */	  DAC960_AcquireControllerLock(Controller, &ProcessorFlags);	  DAC960_QueueCommand(Command);	  DAC960_ReleaseControllerLock(Controller, &ProcessorFlags);	  down(Semaphore);	}    }  return true;}/*  DAC960_V2_ReadDeviceConfiguration reads the Device Configuration Information  for DAC960 V2 Firmware Controllers by requesting the Physical Device  Information and SCSI Inquiry Unit Serial Number information for each  device connected to Controller.*/static boolean DAC960_V2_ReadDeviceConfiguration(DAC960_Controller_T						 *Controller){  unsigned char Channel = 0, TargetID = 0, LogicalUnit = 0;  unsigned short PhysicalDeviceIndex = 0;  while (true)    {      DAC960_V2_PhysicalDeviceInfo_T *NewPhysicalDeviceInfo =	&Controller->V2.NewPhysicalDeviceInformation;      DAC960_V2_PhysicalDeviceInfo_T *PhysicalDeviceInfo;      DAC960_SCSI_Inquiry_UnitSerialNumber_T *InquiryUnitSerialNumber;      DAC960_Command_T *Command;      DAC960_V2_CommandMailbox_T *CommandMailbox;      if (!DAC960_V2_PhysicalDeviceInfo(Controller,					DAC960_V2_GetPhysicalDeviceInfoValid,					Channel,					TargetID,					LogicalUnit,					NewPhysicalDeviceInfo,					sizeof(DAC960_V2_PhysicalDeviceInfo_T)))	  break;      Channel = NewPhysicalDeviceInfo->Channel;      TargetID = NewPhysicalDeviceInfo->TargetID;      LogicalUnit = NewPhysicalDeviceInfo->LogicalUnit;      PhysicalDeviceInfo = (DAC960_V2_PhysicalDeviceInfo_T *)	kmalloc(sizeof(DAC960_V2_PhysicalDeviceInfo_T), GFP_ATOMIC);      if (PhysicalDeviceInfo == NULL)	return DAC960_Failure(Controller, "PHYSICAL DEVICE ALLOCATION");      Controller->V2.PhysicalDeviceInformation[PhysicalDeviceIndex] =	PhysicalDeviceInfo;      memcpy(PhysicalDeviceInfo, NewPhysicalDeviceInfo,	     sizeof(DAC960_V2_PhysicalDeviceInfo_T));      InquiryUnitSerialNumber = (DAC960_SCSI_Inquiry_UnitSerialNumber_T *)	kmalloc(sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T), GFP_ATOMIC);      if (InquiryUnitSerialNumber == NULL)	return DAC960_Failure(Controller, "SERIAL NUMBER ALLOCATION");      Controller->V2.InquiryUnitSerialNumber[PhysicalDeviceIndex] =	InquiryUnitSerialNumber;      memset(InquiryUnitSerialNumber, 0,	     sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T));      InquiryUnitSerialNumber->PeripheralDeviceType = 0x1F;      Command = DAC960_AllocateCommand(Controller);      CommandMailbox = &Command->V2.CommandMailbox;      DAC960_V2_ClearCommand(Command);      Command->CommandType = DAC960_ImmediateCommand;      CommandMailbox->SCSI_10.CommandOpcode = DAC960_V2_SCSI_10_Passthru;      CommandMailbox->SCSI_10.CommandControlBits			     .DataTransferControllerToHost = true;      CommandMailbox->SCSI_10.CommandControlBits			     .NoAutoRequestSense = true;      CommandMailbox->SCSI_10.DataTransferSize =	sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T);      CommandMailbox->SCSI_10.PhysicalDevice.LogicalUnit = LogicalUnit;      CommandMailbox->SCSI_10.PhysicalDevice.TargetID = TargetID;      CommandMailbox->SCSI_10.PhysicalDevice.Channel = Channel;      CommandMailbox->SCSI_10.CDBLength = 6;      CommandMailbox->SCSI_10.SCSI_CDB[0] = 0x12; /* INQUIRY */      CommandMailbox->SCSI_10.SCSI_CDB[1] = 1; /* EVPD = 1 */      CommandMailbox->SCSI_10.SCSI_CDB[2] = 0x80; /* Page Code */      CommandMailbox->SCSI_10.SCSI_CDB[3] = 0; /* Reserved */      CommandMailbox->SCSI_10.SCSI_CDB[4] =	sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T);      CommandMailbox->SCSI_10.SCSI_CDB[5] = 0; /* Control */      CommandMailbox->SCSI_10.DataTransferMemoryAddress			     .ScatterGatherSegments[0]			     .SegmentDataPointer =	Virtual_to_Bus(InquiryUnitSerialNumber);      CommandMailbox->SCSI_10.DataTransferMemoryAddress			     .ScatterGatherSegments[0]			     .SegmentByteCount =	CommandMailbox->SCSI_10.DataTransferSize;      DAC960_ExecuteCommand(Command);      DAC960_DeallocateCommand(Command);      PhysicalDeviceIndex++;      LogicalUnit++;    }  return true;}/*  DAC960_SanitizeInquiryData sanitizes the Vendor, Model, Revision, and  Product Serial Number fields of the Inquiry Standard Data and Inquiry  Unit Serial Number structures.*/static void DAC960_SanitizeInquiryData(DAC960_SCSI_Inquiry_T					 *InquiryStandardData,				       DAC960_SCSI_Inquiry_UnitSerialNumber_T					 *InquiryUnitSerialNumber,				       unsigned char *Vendor,				       unsigned char *Model,				       unsigned char *Revision,				       unsigned char *SerialNumber){  int SerialNumberLength, i;  if (InquiryStandardData->PeripheralDeviceType == 0x1F) return;  for (i = 0; i < sizeof(InquiryStandardData->VendorIdentification); i++)    {      unsigned char VendorCharacter =	InquiryStandardData->VendorIdentification[i];      Vendor[i] = (VendorCharacter >= ' ' && VendorCharacter <= '~'		   ? VendorCharacter : ' ');    }  Vendor[sizeof(InquiryStandardData->VendorIdentification)] = '\0';  for (i = 0; i < sizeof(InquiryStandardData->ProductIdentification); i++)    {      unsigned char ModelCharacter =	InquiryStandardData->ProductIdentification[i];      Model[i] = (ModelCharacter >= ' ' && ModelCharacter <= '~'		  ? ModelCharacter : ' ');    }  Model[sizeof(InquiryStandardData->ProductIdentification)] = '\0';  for (i = 0; i < sizeof(InquiryStandardData->ProductRevisionLevel); i++)    {      unsigned char RevisionCharacter =	InquiryStandardData->ProductRevisionLevel[i];      Revision[i] = (RevisionCharacter >= ' ' && RevisionCharacter <= '~'		     ? RevisionCharacter : ' ');    }  Revision[sizeof(InquiryStandardData->ProductRevisionLevel)] = '\0';  if (InquiryUnitSerialNumber->PeripheralDeviceType == 0x1F) return;  SerialNumberLength = InquiryUnitSerialNumber->PageLength;  if (SerialNumberLength >      sizeof(InquiryUnitSerialNumber->ProductSerialNumber))    SerialNumberLength = sizeof(InquiryUnitSerialNumber->ProductSerialNumber);  for (i = 0; i < SerialNumberLength; i++)    {      unsigned char SerialNumberCharacter =	InquiryUnitSerialNumber->ProductSerialNumber[i];      SerialNumber[i] =	(SerialNumberCharacter >= ' ' && SerialNumberCharacter <= '~'	 ? SerialNumberCharacter : ' ');    }  SerialNumber[SerialNumberLength] = '\0';}/*  DAC960_V1_ReportDeviceConfiguration reports the Device Configuration  Information for DAC960 V1 Firmware Controllers.*/static boolean DAC960_V1_ReportDeviceConfiguration(DAC960_Controller_T						   *Controller){  int LogicalDriveNumber, Channel, TargetID;  DAC960_Info("  Physical Devices:\n", Controller);  for (Channel = 0; Channel < Controller->Channels; Channel++)    for (TargetID = 0; TargetID < Controller->Targets; TargetID++)      {	DAC960_SCSI_Inquiry_T *InquiryStandardData =	  &Controller->V1.InquiryStandardData[Channel][TargetID];	DAC960_SCSI_Inquiry_UnitSerialNumber_T *InquiryUnitSerialNumber =	  &Controller->V1.InquiryUnitSerialNumber[Channel][TargetID];	DAC960_V1_DeviceState_T *DeviceState =	  &Controller->V1.DeviceState[Channel][TargetID];	DAC960_V1_ErrorTableEntry_T *ErrorEntry =	  &Controller->V1.ErrorTable.ErrorTableEntries[Channel][TargetID];	char Vendor[1+sizeof(InquiryStandardData->VendorIdentification)];	char Model[1+sizeof(InquiryStandardData->ProductIdentification)];	char Revision[1+sizeof(InquiryStandardData->ProductRevisionLevel)];	char SerialNumber[1+sizeof(InquiryUnitSerialNumber				   ->ProductSerialNumber)];	if (InquiryStandardData->PeripheralDeviceType == 0x1F) continue;	DAC960_SanitizeInquiryData(InquiryStandardData, InquiryUnitSerialNumber,				   Vendor, Model, Revision, SerialNumber);	DAC960_Info("    %d:%d%s Vendor: %s  Model: %s  Revision: %s\n",		    Controller, Channel, TargetID, (TargetID < 10 ? " " : ""),		    Vendor, Model, Revision);	if (InquiryUnitSerialNumber->PeripheralDeviceType != 0x1F)	  DAC960_Info("         Serial Number: %s\n", Controller, SerialNumber);	if (DeviceState->Present &&	    DeviceState->DeviceType == DAC960_V1_DiskType)	  {	    if (Controller->V1.DeviceResetCount[Channel][TargetID] > 0)	      DAC960_Info("         Disk Status: %s, %d blocks, %d resets\n",			  Controller,			  (DeviceState->DeviceState == DAC960_V1_Device_Dead			   ? "Dead"			   : DeviceState->DeviceState			     == DAC960_V1_Device_WriteOnly			     ? "Write-Only"			     : DeviceState->DeviceState			       == DAC960_V1_Device_Online			       ? "Online" : "Standby"),			  DeviceState->DiskSize,			  Controller->V1.DeviceResetCount[Channel][TargetID]);	    else	      DAC960_Info("         Disk Status: %s, %d blocks\n", Controller,			  (DeviceState->DeviceState == DAC960_V1_Device_Dead			   ? "Dead"			   : DeviceState->DeviceState			     == DAC960_V1_Device_WriteOnly			     ? "Write-Only"			     : DeviceState->DeviceState			       == DAC960_V1_Device_Online			       ? "Online" : "Standby"),			  DeviceState->DiskSize);	  }	if (ErrorEntry->ParityErrorCount > 0 ||	    ErrorEntry->SoftErrorCount > 0 ||	    ErrorEntry->HardErrorCount > 0 ||	    ErrorEntry->MiscErrorCount > 0)	  DAC960_Info("         Errors - Parity: %d, Soft: %d, "		      "Hard: %d, Misc: %d\n", Controller,		      ErrorEntry->ParityErrorCount,		      ErrorEntry->SoftErrorCount,		      ErrorEntry->HardErrorCount,		      ErrorEntry->MiscErrorCount);      }  DAC960_Info("  Logical Drives:\n", Controller);  for (LogicalDriveNumber = 0;       LogicalDriveNumber < Controller->LogicalDriveCount;       LogicalDriveNumber++)    {      DAC960_V1_LogicalDriveInformation_T *LogicalDriveInformation =	&Controller->V1.LogicalDriveInformation[LogicalDriveNumber];      DAC960_Info("    /dev/rd/c%dd%d: RAID-%d, %s, %d blocks, %s\n",		  Controller, Controller->ControllerNumber, LogicalDriveNumber,		  LogicalDriveInformation->RAIDLevel,		  (LogicalDriveInformation->LogicalDriveState		   == DAC960_V1_LogicalDrive_Online		   ? "Online"		   : LogicalDriveInformation->LogicalDriveState		     == DAC960_V1_LogicalDrive_Critical		     ? "Critical" : "Offline"),		  LogicalDriveInformation->LogicalDriveSize,		  (LogicalDriveInformation->WriteBack		   ? "Write Back" : "Write Thru"));    }  return true;}/*  DAC960_V2_ReportDeviceConfiguration reports the Device Configuration  Information for DAC960 V2 Firmware Controllers.*/static boolean DAC960_V2_ReportDeviceConfiguration(DAC960_Controller_T						   *Controller){  int PhysicalDeviceIndex, LogicalDriveNumber;  DAC960_Info("  Physical Devices:\n", Controller);  for (PhysicalDeviceIndex = 0;       PhysicalDeviceIndex < DAC960_V2_MaxPhysicalDevices;       PhysicalDeviceIndex++)    {      DAC960_V2_PhysicalDeviceInfo_T *PhysicalDeviceInfo =	Controller->V2.PhysicalDeviceInformation[PhysicalDeviceIndex];      DAC960_SCSI_Inquiry_T *InquiryStandardData =	(DAC960_SCSI_Inquiry_T *) &PhysicalDeviceInfo->SCSI_InquiryData;      DAC960_SCSI_Inquiry_UnitSerialNumber_T *InquiryUnitSerialNumber =	Controller->V2.InquiryUnitSerialNumber[PhysicalDeviceIndex];      char Vendor[1+sizeof(InquiryStandardData->VendorIdentification)];      char Model[1+sizeof(InquiryStandardData->ProductIdentification)];      char Revision[1+sizeof(InquiryStandardData->ProductRevisionLevel)];      char SerialNumber[1+sizeof(InquiryUnitSerialNumber->ProductSerialNumber)];      if (PhysicalDeviceInfo == NULL) break;      DAC960_SanitizeInquiryData(InquiryStandardData, InquiryUnitSerialNumber,				 Vendor, Model, Revision, SerialNumber);      DAC960_Info("    %d:%d%s Vendor: %s  Model: %s  Revision: %s\n",		  Controller,		  PhysicalDeviceInfo->Channel,		  PhysicalDeviceInfo->TargetID,		  (PhysicalDeviceInfo->TargetID < 10 ? " " : ""),		  Vendor, Model, Revision);      if (PhysicalDeviceInfo->NegotiatedSynchronousMegaTransfers == 0)	DAC960_Info("         %sAsynchronous\n", Controller,		    (PhysicalDeviceInfo->NegotiatedDataWidthBits == 16		     ? "Wide " :""));      else	DAC960_Info("         %sSynchronous at %d MB/sec\n", Controller,		    (PhysicalDeviceInfo->NegotiatedDataWidthBits == 16		     ? "Wide " :""),		    (PhysicalDeviceInfo->NegotiatedSynchronousMegaTransfers		    

⌨️ 快捷键说明

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