diff options
author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2009-12-04 13:24:19 -0500 |
---|---|---|
committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2009-12-05 01:10:59 -0500 |
commit | 75757507e014fa074d25d2883c4ab604999584bd (patch) | |
tree | 80b94859f420a6fcf05cb4b4f7fb90234351a8fd /drivers/firmware | |
parent | 7705d548cbe33f18ea7713b9a07aa11047aaeca4 (diff) |
DMI: allow omitting ident strings in DMI tables
The purpose of dmi->ident is twofold - it may be used by DMI callback
functions when composing log messages; it is also used to determine
end of DMI table in dmi_check_system() and dmi_first_match(). However,
in case when callbacks are not interested in using ident at all it just
wastes memory. Let's make entries with empty first match slot serve as
end-of-table markers instead.
Acked-by: Jean Delvare <khali@linux-fr.org>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
Diffstat (limited to 'drivers/firmware')
-rw-r--r-- | drivers/firmware/dmi_scan.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/drivers/firmware/dmi_scan.c b/drivers/firmware/dmi_scan.c index 938100f14b16..3a2ccb09e2f8 100644 --- a/drivers/firmware/dmi_scan.c +++ b/drivers/firmware/dmi_scan.c | |||
@@ -429,7 +429,7 @@ static bool dmi_matches(const struct dmi_system_id *dmi) | |||
429 | for (i = 0; i < ARRAY_SIZE(dmi->matches); i++) { | 429 | for (i = 0; i < ARRAY_SIZE(dmi->matches); i++) { |
430 | int s = dmi->matches[i].slot; | 430 | int s = dmi->matches[i].slot; |
431 | if (s == DMI_NONE) | 431 | if (s == DMI_NONE) |
432 | continue; | 432 | break; |
433 | if (dmi_ident[s] | 433 | if (dmi_ident[s] |
434 | && strstr(dmi_ident[s], dmi->matches[i].substr)) | 434 | && strstr(dmi_ident[s], dmi->matches[i].substr)) |
435 | continue; | 435 | continue; |
@@ -440,6 +440,15 @@ static bool dmi_matches(const struct dmi_system_id *dmi) | |||
440 | } | 440 | } |
441 | 441 | ||
442 | /** | 442 | /** |
443 | * dmi_is_end_of_table - check for end-of-table marker | ||
444 | * @dmi: pointer to the dmi_system_id structure to check | ||
445 | */ | ||
446 | static bool dmi_is_end_of_table(const struct dmi_system_id *dmi) | ||
447 | { | ||
448 | return dmi->matches[0].slot == DMI_NONE; | ||
449 | } | ||
450 | |||
451 | /** | ||
443 | * dmi_check_system - check system DMI data | 452 | * dmi_check_system - check system DMI data |
444 | * @list: array of dmi_system_id structures to match against | 453 | * @list: array of dmi_system_id structures to match against |
445 | * All non-null elements of the list must match | 454 | * All non-null elements of the list must match |
@@ -457,7 +466,7 @@ int dmi_check_system(const struct dmi_system_id *list) | |||
457 | int count = 0; | 466 | int count = 0; |
458 | const struct dmi_system_id *d; | 467 | const struct dmi_system_id *d; |
459 | 468 | ||
460 | for (d = list; d->ident; d++) | 469 | for (d = list; !dmi_is_end_of_table(d); d++) |
461 | if (dmi_matches(d)) { | 470 | if (dmi_matches(d)) { |
462 | count++; | 471 | count++; |
463 | if (d->callback && d->callback(d)) | 472 | if (d->callback && d->callback(d)) |
@@ -484,7 +493,7 @@ const struct dmi_system_id *dmi_first_match(const struct dmi_system_id *list) | |||
484 | { | 493 | { |
485 | const struct dmi_system_id *d; | 494 | const struct dmi_system_id *d; |
486 | 495 | ||
487 | for (d = list; d->ident; d++) | 496 | for (d = list; !dmi_is_end_of_table(d); d++) |
488 | if (dmi_matches(d)) | 497 | if (dmi_matches(d)) |
489 | return d; | 498 | return d; |
490 | 499 | ||