diff options
Diffstat (limited to 'drivers/firmware/iscsi_ibft.c')
| -rw-r--r-- | drivers/firmware/iscsi_ibft.c | 42 | 
1 files changed, 40 insertions, 2 deletions
diff --git a/drivers/firmware/iscsi_ibft.c b/drivers/firmware/iscsi_ibft.c index c811cb10790..2cce44a1d7d 100644 --- a/drivers/firmware/iscsi_ibft.c +++ b/drivers/firmware/iscsi_ibft.c @@ -746,6 +746,37 @@ static void __exit ibft_exit(void)  	ibft_cleanup();  } +#ifdef CONFIG_ACPI +static const struct { +	char *sign; +} ibft_signs[] = { +	/* +	 * One spec says "IBFT", the other says "iBFT". We have to check +	 * for both. +	 */ +	{ ACPI_SIG_IBFT }, +	{ "iBFT" }, +}; + +static void __init acpi_find_ibft_region(void) +{ +	int i; +	struct acpi_table_header *table = NULL; + +	if (acpi_disabled) +		return; + +	for (i = 0; i < ARRAY_SIZE(ibft_signs) && !ibft_addr; i++) { +		acpi_get_table(ibft_signs[i].sign, 0, &table); +		ibft_addr = (struct acpi_table_ibft *)table; +	} +} +#else +static void __init acpi_find_ibft_region(void) +{ +} +#endif +  /*   * ibft_init() - creates sysfs tree entries for the iBFT data.   */ @@ -753,9 +784,16 @@ static int __init ibft_init(void)  {  	int rc = 0; +	/* +	   As on UEFI systems the setup_arch()/find_ibft_region() +	   is called before ACPI tables are parsed and it only does +	   legacy finding. +	*/ +	if (!ibft_addr) +		acpi_find_ibft_region(); +  	if (ibft_addr) { -		printk(KERN_INFO "iBFT detected at 0x%llx.\n", -		       (u64)isa_virt_to_bus(ibft_addr)); +		pr_info("iBFT detected.\n");  		rc = ibft_check_device();  		if (rc)  |