/*
* Compare two device-paths, stopping when the shorter of the two hits
- * an End* node. This is useful to, for example, compare a device-path
+ * an End* node. This is useful to, for example, compare a device-path
* representing a device with one representing a file on the device, or
* a device with a parent device.
*/
}
/*
- * See UEFI spec (section 3.1.2, about short-form device-paths..
- * tl;dr: we can have a device-path that starts with a USB WWID
- * or USB Class node, and a few other cases which don't encode
- * the full device path with bus hierarchy:
+ * We can have device paths that start with a USB WWID or a USB Class node,
+ * and a few other cases which don't encode the full device path with bus
+ * hierarchy:
*
* - MESSAGING:USB_WWID
* - MESSAGING:USB_CLASS
* - MEDIA:FILE_PATH
* - MEDIA:HARD_DRIVE
* - MESSAGING:URI
+ *
+ * See UEFI spec (section 3.1.2, about short-form device-paths)
*/
static struct efi_device_path *shorten_path(struct efi_device_path *dp)
{
/*
* Create a device node for a block device partition.
*
- * @buf buffer to which the device path is wirtten
+ * @buf buffer to which the device path is written
* @desc block device descriptor
* @part partition number, 0 identifies a block device
*/
/*
* Create a device path for a block device or one of its partitions.
*
- * @buf buffer to which the device path is wirtten
+ * @buf buffer to which the device path is written
* @desc block device descriptor
* @part partition number, 0 identifies a block device
*/
/*
* We *could* make a more accurate path, by looking at if_type
* and handling all the different cases like we do for non-
- * legacy (ie CONFIG_BLK=y) case. But most important thing
+ * legacy (i.e. CONFIG_BLK=y) case. But most important thing
* is just to have a unique device-path for if_type+devnum.
* So map things to a fictitious USB device.
*/
return dp_part_node(buf, desc, part);
}
-/* Construct a device-path from a partition on a blk device: */
+/* Construct a device-path from a partition on a block device: */
struct efi_device_path *efi_dp_from_part(struct blk_desc *desc, int part)
{
void *buf, *start;
/*
* Create a device node for a block device partition.
*
- * @buf buffer to which the device path is wirtten
+ * @buf buffer to which the device path is written
* @desc block device descriptor
* @part partition number, 0 identifies a block device
*/
return buf;
}
-/* convert path to an UEFI style path (ie. DOS style backslashes and utf16) */
+/* convert path to an UEFI style path (i.e. DOS style backslashes and UTF-16) */
static void path_to_uefi(u16 *uefi, const char *path)
{
while (*path) {
char filename[32] = { 0 }; /* dp->str is u16[32] long */
char *s;
- if (!device || (path && !file))
+ if (path && !file)
return EFI_INVALID_PARAMETER;
is_net = !strcmp(dev, "Net");
if (part < 0)
return EFI_INVALID_PARAMETER;
- *device = efi_dp_from_part(desc, part);
+ if (device)
+ *device = efi_dp_from_part(desc, part);
} else {
#ifdef CONFIG_NET
- *device = efi_dp_from_eth();
+ if (device)
+ *device = efi_dp_from_eth();
#endif
}
s = filename;
while ((s = strchr(s, '/')))
*s++ = '\\';
- *file = efi_dp_from_file(NULL, 0, filename);
+ *file = efi_dp_from_file(((!is_net && device) ? desc : NULL),
+ part, filename);
return EFI_SUCCESS;
}