This will give us an exclusive access to the PciIo of this device
after it was started and until is will be stopped.
Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=2390
Signed-off-by: Nikita Leshenko <nikita.leshchenko@oracle.com>
Reviewed-by: Liran Alon <liran.alon@oracle.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Message-Id: <
20200504210607.144434-9-nikita.leshchenko@oracle.com>
EFI_EXT_SCSI_PASS_THRU_PROTOCOL PassThru;\r
EFI_EXT_SCSI_PASS_THRU_MODE PassThruMode;\r
UINT8 MaxTarget;\r
EFI_EXT_SCSI_PASS_THRU_PROTOCOL PassThru;\r
EFI_EXT_SCSI_PASS_THRU_MODE PassThruMode;\r
UINT8 MaxTarget;\r
+ EFI_PCI_IO_PROTOCOL *PciIo;\r
} MPT_SCSI_DEV;\r
\r
#define MPT_SCSI_FROM_PASS_THRU(PassThruPtr) \\r
} MPT_SCSI_DEV;\r
\r
#define MPT_SCSI_FROM_PASS_THRU(PassThruPtr) \\r
\r
Dev->MaxTarget = PcdGet8 (PcdMptScsiMaxTargetLimit);\r
\r
\r
Dev->MaxTarget = PcdGet8 (PcdMptScsiMaxTargetLimit);\r
\r
+ Status = gBS->OpenProtocol (\r
+ ControllerHandle,\r
+ &gEfiPciIoProtocolGuid,\r
+ (VOID **)&Dev->PciIo,\r
+ This->DriverBindingHandle,\r
+ ControllerHandle,\r
+ EFI_OPEN_PROTOCOL_BY_DRIVER\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ goto FreePool;\r
+ }\r
+\r
//\r
// Host adapter channel, doesn't exist\r
//\r
//\r
// Host adapter channel, doesn't exist\r
//\r
&Dev->PassThru\r
);\r
if (EFI_ERROR (Status)) {\r
&Dev->PassThru\r
);\r
if (EFI_ERROR (Status)) {\r
}\r
\r
return EFI_SUCCESS;\r
\r
}\r
\r
return EFI_SUCCESS;\r
\r
+CloseProtocol:\r
+ gBS->CloseProtocol (\r
+ ControllerHandle,\r
+ &gEfiPciIoProtocolGuid,\r
+ This->DriverBindingHandle,\r
+ ControllerHandle\r
+ );\r
+\r
FreePool:\r
FreePool (Dev);\r
\r
FreePool:\r
FreePool (Dev);\r
\r
+ gBS->CloseProtocol (\r
+ ControllerHandle,\r
+ &gEfiPciIoProtocolGuid,\r
+ This->DriverBindingHandle,\r
+ ControllerHandle\r
+ );\r
+\r
FreePool (Dev);\r
\r
return Status;\r
FreePool (Dev);\r
\r
return Status;\r