Instead of reencoding pre-DDR3 manufacturer code to DDR3 manufacturer code, move the common decoding to a separate function. --- eeprom/decode-dimms | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) --- i2c-tools.orig/eeprom/decode-dimms 2015-06-01 09:14:30.899898763 +0200 +++ i2c-tools/eeprom/decode-dimms 2015-06-01 09:19:01.931673815 +0200 @@ -336,6 +336,21 @@ sub parity($) return ($parity & 1); } +# The code byte includes parity, the count byte does not. +sub manufacturer_common($$) +{ + my ($count, $code) = @_; + my $manufacturer; + + return "Invalid" if parity($code) != 1 + or ($code &= 0x7F) == 0; + return "Unknown" if $count >= @vendors + or $code - 1 >= @{$vendors[$count]}; + $manufacturer = $vendors[$count][$code - 1]; + $manufacturer =~ s/ \(former .*\)$// if $opt_side_by_side; + return $manufacturer; +} + # New encoding format (as of DDR3) for manufacturer just has a count of # leading 0x7F rather than all the individual bytes. The count bytes includes # parity! @@ -346,12 +361,7 @@ sub manufacturer_ddr3($$) return "Undefined" unless spd_written($count, $code); - return "Invalid" if parity($code) != 1 - or ($code & 0x7F) == 0; - return "Unknown" if ($count & 0x7F) >= @vendors - or ($code & 0x7F) - 1 >= @{$vendors[$count & 0x7F]}; - $manufacturer = $vendors[$count & 0x7F][($code & 0x7F) - 1]; - $manufacturer =~ s/ \(former .*\)$// if $opt_side_by_side; + $manufacturer = manufacturer_common($count & 0x7F, $code); $manufacturer .= "? (Invalid parity)" if parity($count) != 1; return $manufacturer; } @@ -369,11 +379,7 @@ sub manufacturer(@) } return ("Invalid", []) unless defined $first; - return ("Invalid", [$first, @bytes]) if parity($first) != 1; - if (parity($ai) == 0) { - $ai |= 0x80; - } - return (manufacturer_ddr3($ai, $first), \@bytes); + return (manufacturer_common($ai, $first), \@bytes); } sub manufacturer_data(@) -- Jean Delvare SUSE L3 Support -- To unsubscribe from this list: send the line "unsubscribe linux-i2c" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html