return Out8 (Dev, LSI_REG_ISTAT0, LSI_ISTAT0_SRST);\r
}\r
\r
+STATIC\r
+EFI_STATUS\r
+ReportHostAdapterOverrunError (\r
+ OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet\r
+ )\r
+{\r
+ Packet->SenseDataLength = 0;\r
+ Packet->HostAdapterStatus =\r
+ EFI_EXT_SCSI_STATUS_HOST_ADAPTER_DATA_OVERRUN_UNDERRUN;\r
+ Packet->TargetStatus = EFI_EXT_SCSI_STATUS_TARGET_GOOD;\r
+ return EFI_BAD_BUFFER_SIZE;\r
+}\r
+\r
+/**\r
+\r
+ Check the request packet from the Extended SCSI Pass Thru Protocol. The\r
+ request packet is modified, to be forwarded outwards by LsiScsiPassThru(),\r
+ if invalid or unsupported parameters are detected.\r
+\r
+ @param[in] Dev The LSI 53C895A SCSI device the packet targets.\r
+\r
+ @param[in] Target The SCSI target controlled by the LSI 53C895A SCSI\r
+ device.\r
+\r
+ @param[in] Lun The Logical Unit Number under the SCSI target.\r
+\r
+ @param[in out] Packet The Extended SCSI Pass Thru Protocol packet.\r
+\r
+\r
+ @retval EFI_SUCCESS The Extended SCSI Pass Thru Protocol packet was valid.\r
+\r
+ @return Otherwise, invalid or unsupported parameters were\r
+ detected. Status codes are meant for direct forwarding\r
+ by the EFI_EXT_SCSI_PASS_THRU_PROTOCOL.PassThru()\r
+ implementation.\r
+\r
+ **/\r
+STATIC\r
+EFI_STATUS\r
+LsiScsiCheckRequest (\r
+ IN LSI_SCSI_DEV *Dev,\r
+ IN UINT8 Target,\r
+ IN UINT64 Lun,\r
+ IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet\r
+ )\r
+{\r
+ if (Target > Dev->MaxTarget || Lun > Dev->MaxLun ||\r
+ Packet->DataDirection > EFI_EXT_SCSI_DATA_DIRECTION_BIDIRECTIONAL ||\r
+ //\r
+ // Trying to receive, but destination pointer is NULL, or contradicting\r
+ // transfer direction\r
+ //\r
+ (Packet->InTransferLength > 0 &&\r
+ (Packet->InDataBuffer == NULL ||\r
+ Packet->DataDirection == EFI_EXT_SCSI_DATA_DIRECTION_WRITE\r
+ )\r
+ ) ||\r
+\r
+ //\r
+ // Trying to send, but source pointer is NULL, or contradicting transfer\r
+ // direction\r
+ //\r
+ (Packet->OutTransferLength > 0 &&\r
+ (Packet->OutDataBuffer == NULL ||\r
+ Packet->DataDirection == EFI_EXT_SCSI_DATA_DIRECTION_READ\r
+ )\r
+ )\r
+ ) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ if (Packet->DataDirection == EFI_EXT_SCSI_DATA_DIRECTION_BIDIRECTIONAL ||\r
+ (Packet->InTransferLength > 0 && Packet->OutTransferLength > 0) ||\r
+ Packet->CdbLength > sizeof Dev->Dma->Cdb) {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
+ if (Packet->InTransferLength > sizeof Dev->Dma->Data) {\r
+ Packet->InTransferLength = sizeof Dev->Dma->Data;\r
+ return ReportHostAdapterOverrunError (Packet);\r
+ }\r
+ if (Packet->OutTransferLength > sizeof Dev->Dma->Data) {\r
+ Packet->OutTransferLength = sizeof Dev->Dma->Data;\r
+ return ReportHostAdapterOverrunError (Packet);\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
//\r
// The next seven functions implement EFI_EXT_SCSI_PASS_THRU_PROTOCOL\r
// for the LSI 53C895A SCSI Controller. Refer to UEFI Spec 2.3.1 + Errata C,\r
IN EFI_EVENT Event OPTIONAL\r
)\r
{\r
+ EFI_STATUS Status;\r
+ LSI_SCSI_DEV *Dev;\r
+\r
+ Dev = LSI_SCSI_FROM_PASS_THRU (This);\r
+ Status = LsiScsiCheckRequest (Dev, *Target, Lun, Packet);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
return EFI_UNSUPPORTED;\r
}\r
\r