diff options
Diffstat (limited to 'drivers/firmware/edd.c')
| -rw-r--r-- | drivers/firmware/edd.c | 28 | 
1 files changed, 14 insertions, 14 deletions
diff --git a/drivers/firmware/edd.c b/drivers/firmware/edd.c index 96c25d93eed..e2295766580 100644 --- a/drivers/firmware/edd.c +++ b/drivers/firmware/edd.c @@ -151,7 +151,8 @@ edd_show_host_bus(struct edd_device *edev, char *buf)  		p += scnprintf(p, left, "\tbase_address: %x\n",  			     info->params.interface_path.isa.base_address);  	} else if (!strncmp(info->params.host_bus_type, "PCIX", 4) || -		   !strncmp(info->params.host_bus_type, "PCI", 3)) { +		   !strncmp(info->params.host_bus_type, "PCI", 3) || +		   !strncmp(info->params.host_bus_type, "XPRS", 4)) {  		p += scnprintf(p, left,  			     "\t%02x:%02x.%d  channel: %u\n",  			     info->params.interface_path.pci.bus, @@ -159,7 +160,6 @@ edd_show_host_bus(struct edd_device *edev, char *buf)  			     info->params.interface_path.pci.function,  			     info->params.interface_path.pci.channel);  	} else if (!strncmp(info->params.host_bus_type, "IBND", 4) || -		   !strncmp(info->params.host_bus_type, "XPRS", 4) ||  		   !strncmp(info->params.host_bus_type, "HTPT", 4)) {  		p += scnprintf(p, left,  			     "\tTBD: %llx\n", @@ -531,8 +531,8 @@ static int  edd_has_edd30(struct edd_device *edev)  {  	struct edd_info *info; -	int i, nonzero_path = 0; -	char c; +	int i; +	u8 csum = 0;  	if (!edev)  		return 0; @@ -544,16 +544,16 @@ edd_has_edd30(struct edd_device *edev)  		return 0;  	} -	for (i = 30; i <= 73; i++) { -		c = *(((uint8_t *) info) + i + 4); -		if (c) { -			nonzero_path++; -			break; -		} -	} -	if (!nonzero_path) { + +	/* We support only T13 spec */ +	if (info->params.device_path_info_length != 44) +		return 0; + +	for (i = 30; i < info->params.device_path_info_length + 30; i++) +		csum += *(((u8 *)&info->params) + i); + +	if (csum)  		return 0; -	}  	return 1;  } @@ -668,7 +668,7 @@ edd_get_pci_dev(struct edd_device *edev)  {  	struct edd_info *info = edd_dev_get_info(edev); -	if (edd_dev_is_type(edev, "PCI")) { +	if (edd_dev_is_type(edev, "PCI") || edd_dev_is_type(edev, "XPRS")) {  		return pci_get_bus_and_slot(info->params.interface_path.pci.bus,  				     PCI_DEVFN(info->params.interface_path.pci.slot,  					       info->params.interface_path.pci.  | 
