diff options
| -rw-r--r-- | drivers/firmware/dmi_scan.c | 72 | ||||
| -rw-r--r-- | include/linux/dmi.h | 1 | 
2 files changed, 55 insertions, 18 deletions
diff --git a/drivers/firmware/dmi_scan.c b/drivers/firmware/dmi_scan.c index d76adfea5df..8f0f7c44930 100644 --- a/drivers/firmware/dmi_scan.c +++ b/drivers/firmware/dmi_scan.c @@ -415,6 +415,29 @@ void __init dmi_scan_machine(void)  }  /** + *	dmi_matches - check if dmi_system_id structure matches system DMI data + *	@dmi: pointer to the dmi_system_id structure to check + */ +static bool dmi_matches(const struct dmi_system_id *dmi) +{ +	int i; + +	WARN(!dmi_initialized, KERN_ERR "dmi check: not initialized yet.\n"); + +	for (i = 0; i < ARRAY_SIZE(dmi->matches); i++) { +		int s = dmi->matches[i].slot; +		if (s == DMI_NONE) +			continue; +		if (dmi_ident[s] +		    && strstr(dmi_ident[s], dmi->matches[i].substr)) +			continue; +		/* No match */ +		return false; +	} +	return true; +} + +/**   *	dmi_check_system - check system DMI data   *	@list: array of dmi_system_id structures to match against   *		All non-null elements of the list must match @@ -429,32 +452,45 @@ void __init dmi_scan_machine(void)   */  int dmi_check_system(const struct dmi_system_id *list)  { -	int i, count = 0; -	const struct dmi_system_id *d = list; +	int count = 0; +	const struct dmi_system_id *d; -	WARN(!dmi_initialized, KERN_ERR "dmi check: not initialized yet.\n"); - -	while (d->ident) { -		for (i = 0; i < ARRAY_SIZE(d->matches); i++) { -			int s = d->matches[i].slot; -			if (s == DMI_NONE) -				continue; -			if (dmi_ident[s] && strstr(dmi_ident[s], d->matches[i].substr)) -				continue; -			/* No match */ -			goto fail; +	for (d = list; d->ident; d++) +		if (dmi_matches(d)) { +			count++; +			if (d->callback && d->callback(d)) +				break;  		} -		count++; -		if (d->callback && d->callback(d)) -			break; -fail:		d++; -	}  	return count;  }  EXPORT_SYMBOL(dmi_check_system);  /** + *	dmi_first_match - find dmi_system_id structure matching system DMI data + *	@list: array of dmi_system_id structures to match against + *		All non-null elements of the list must match + *		their slot's (field index's) data (i.e., each + *		list string must be a substring of the specified + *		DMI slot's string data) to be considered a + *		successful match. + * + *	Walk the blacklist table until the first match is found.  Return the + *	pointer to the matching entry or NULL if there's no match. + */ +const struct dmi_system_id *dmi_first_match(const struct dmi_system_id *list) +{ +	const struct dmi_system_id *d; + +	for (d = list; d->ident; d++) +		if (dmi_matches(d)) +			return d; + +	return NULL; +} +EXPORT_SYMBOL(dmi_first_match); + +/**   *	dmi_get_system_info - return DMI data value   *	@field: data index (see enum dmi_field)   * diff --git a/include/linux/dmi.h b/include/linux/dmi.h index 34161907b2f..aea23105d3e 100644 --- a/include/linux/dmi.h +++ b/include/linux/dmi.h @@ -38,6 +38,7 @@ struct dmi_device {  #ifdef CONFIG_DMI  extern int dmi_check_system(const struct dmi_system_id *list); +const struct dmi_system_id *dmi_first_match(const struct dmi_system_id *list);  extern const char * dmi_get_system_info(int field);  extern const struct dmi_device * dmi_find_device(int type, const char *name,  	const struct dmi_device *from);  |