aboutsummaryrefslogtreecommitdiffstats
path: root/src/net/fcp.c
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2020-10-22 14:01:27 +0100
committerMichael Brown <mcb30@ipxe.org>2020-10-22 14:16:55 +0100
commitbf051a76eef07bb4bd04ad4ff2b8b5e23ef26740 (patch)
tree0b479c39ade7f5f34e9be868a0c229a788dc48b0 /src/net/fcp.c
parente6f9054d13bd9bc95720ca3e8cf6c4dcf4eae018 (diff)
downloadipxe-bf051a76eef07bb4bd04ad4ff2b8b5e23ef26740.tar.gz
[fcp] Allow Fibre Channel device to be described using an EFI device path
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/net/fcp.c')
-rw-r--r--src/net/fcp.c28
1 files changed, 20 insertions, 8 deletions
diff --git a/src/net/fcp.c b/src/net/fcp.c
index d92cfdcf3..f78f7bd9b 100644
--- a/src/net/fcp.c
+++ b/src/net/fcp.c
@@ -43,6 +43,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#include <ipxe/scsi.h>
#include <ipxe/device.h>
#include <ipxe/edd.h>
+#include <ipxe/efi/efi_path.h>
#include <ipxe/fc.h>
#include <ipxe/fcels.h>
#include <ipxe/fcp.h>
@@ -158,10 +159,8 @@ struct fcp_device {
/** List of active commands */
struct list_head fcpcmds;
- /** Fibre Channel WWN (for boot firmware table) */
- struct fc_name wwn;
- /** SCSI LUN (for boot firmware table) */
- struct scsi_lun lun;
+ /** Device description (for boot firmware table) */
+ struct fcp_description desc;
};
/** An FCP command */
@@ -864,9 +863,9 @@ static int fcpdev_edd_describe ( struct fcp_device *fcpdev,
} lun;
type->type = cpu_to_le64 ( EDD_INTF_TYPE_FIBRE );
- memcpy ( &wwn.fc, &fcpdev->wwn, sizeof ( wwn.fc ) );
+ memcpy ( &wwn.fc, &fcpdev->desc.wwn, sizeof ( wwn.fc ) );
path->fibre.wwn = be64_to_cpu ( wwn.u64 );
- memcpy ( &lun.scsi, &fcpdev->lun, sizeof ( lun.scsi ) );
+ memcpy ( &lun.scsi, &fcpdev->desc.lun, sizeof ( lun.scsi ) );
path->fibre.lun = be64_to_cpu ( lun.u64 );
return 0;
}
@@ -893,6 +892,18 @@ static struct device * fcpdev_identify_device ( struct fcp_device *fcpdev ) {
return identify_device ( &fcpdev->user.ulp->peer->port->transport );
}
+/**
+ * Describe as an EFI device path
+ *
+ * @v fcp FCP device
+ * @ret path EFI device path, or NULL on error
+ */
+static EFI_DEVICE_PATH_PROTOCOL *
+fcpdev_efi_describe ( struct fcp_device *fcpdev ) {
+
+ return efi_fcp_path ( &fcpdev->desc );
+}
+
/** FCP device SCSI interface operations */
static struct interface_operation fcpdev_scsi_op[] = {
INTF_OP ( scsi_command, struct fcp_device *, fcpdev_scsi_command ),
@@ -901,6 +912,7 @@ static struct interface_operation fcpdev_scsi_op[] = {
INTF_OP ( edd_describe, struct fcp_device *, fcpdev_edd_describe ),
INTF_OP ( identify_device, struct fcp_device *,
fcpdev_identify_device ),
+ EFI_INTF_OP ( efi_describe, struct fcp_device *, fcpdev_efi_describe ),
};
/** FCP device SCSI interface descriptor */
@@ -965,8 +977,8 @@ static int fcpdev_open ( struct interface *parent, struct fc_name *wwn,
fc_ulp_attach ( ulp, &fcpdev->user );
/* Preserve parameters required for boot firmware table */
- memcpy ( &fcpdev->wwn, wwn, sizeof ( fcpdev->wwn ) );
- memcpy ( &fcpdev->lun, lun, sizeof ( fcpdev->lun ) );
+ memcpy ( &fcpdev->desc.wwn, wwn, sizeof ( fcpdev->desc.wwn ) );
+ memcpy ( &fcpdev->desc.lun, lun, sizeof ( fcpdev->desc.lun ) );
/* Attach SCSI device to parent interface */
if ( ( rc = scsi_open ( parent, &fcpdev->scsi, lun ) ) != 0 ) {