svn commit: r318760 - head/sys/dev/bhnd/nvram
Landon J. Fuller
landonf at FreeBSD.org
Tue May 23 22:30:16 UTC 2017
Author: landonf
Date: Tue May 23 22:30:15 2017
New Revision: 318760
URL: https://svnweb.freebsd.org/changeset/base/318760
Log:
bhnd(4): Fix a SPROM identification regression introduced in r315866
In r315866, we introduced a direct read of the 8-bit sromrev field from the
memory mapped SPROM/OTP device. On OTP devices that require 16-bit access
alignment, this read fails, preventing identification of the SPROM layout.
So, let's perform an aligned read of the combined 16-bit sromrev/crc field
instead.
Approved by: adrian (mentor, implicit)
Modified:
head/sys/dev/bhnd/nvram/bhnd_nvram_data_sprom.c
head/sys/dev/bhnd/nvram/bhnd_sprom.c
Modified: head/sys/dev/bhnd/nvram/bhnd_nvram_data_sprom.c
==============================================================================
--- head/sys/dev/bhnd/nvram/bhnd_nvram_data_sprom.c Tue May 23 22:11:45 2017 (r318759)
+++ head/sys/dev/bhnd/nvram/bhnd_nvram_data_sprom.c Tue May 23 22:30:15 2017 (r318760)
@@ -184,6 +184,7 @@ bhnd_nvram_sprom_ident(struct bhnd_nvram
u_char buf[512];
size_t nread;
uint16_t magic;
+ uint8_t srevcrc[2];
uint8_t srev;
bool crc_valid;
bool have_magic;
@@ -224,12 +225,15 @@ bhnd_nvram_sprom_ident(struct bhnd_nvram
nbytes += nr;
}
- /* Read SPROM revision */
- error = bhnd_nvram_io_read(io, layout->srev_offset, &srev,
- sizeof(srev));
+ /* Read 8-bit SPROM revision, maintaining 16-bit size alignment
+ * required by some OTP/SPROM chipsets. */
+ error = bhnd_nvram_io_read(io, layout->srev_offset, &srevcrc,
+ sizeof(srevcrc));
if (error)
return (error);
+ srev = srevcrc[0];
+
/* Early sromrev 1 devices (specifically some BCM440x enet
* cards) are reported to have been incorrectly programmed
* with a revision of 0x10. */
Modified: head/sys/dev/bhnd/nvram/bhnd_sprom.c
==============================================================================
--- head/sys/dev/bhnd/nvram/bhnd_sprom.c Tue May 23 22:11:45 2017 (r318759)
+++ head/sys/dev/bhnd/nvram/bhnd_sprom.c Tue May 23 22:30:15 2017 (r318760)
@@ -120,9 +120,9 @@ bhnd_sprom_attach(device_t dev, bus_size
sprom_size = r_size - offset;
- /* Allocate an I/O context for the SPROM parser. SPROM reads do not
- * appear to require any specific alignment. */
- io = bhnd_nvram_iores_new(r, offset, sprom_size, 1);
+ /* Allocate an I/O context for the SPROM parser. All SPROM reads
+ * must be 16-bit aligned */
+ io = bhnd_nvram_iores_new(r, offset, sprom_size, sizeof(uint16_t));
if (io == NULL) {
error = ENXIO;
goto failed;
More information about the svn-src-head
mailing list