diff options
author | bschmidt <bschmidt@FreeBSD.org> | 2010-02-15 19:18:46 +0000 |
---|---|---|
committer | bschmidt <bschmidt@FreeBSD.org> | 2010-02-15 19:18:46 +0000 |
commit | 5640f10b9c5803c3fc012027b0e485bdfbba0b5f (patch) | |
tree | c96ddd0d8bd49a364c63b295aef26623ee34bfc4 /sys/dev/iwn | |
parent | f41f7b8afcb0123810a3056971383da925587d45 (diff) | |
download | FreeBSD-src-5640f10b9c5803c3fc012027b0e485bdfbba0b5f.zip FreeBSD-src-5640f10b9c5803c3fc012027b0e485bdfbba0b5f.tar.gz |
Fix for the Intel WiFi Link 1000. The EEPROM image is in the OTPROM block
before the last block, not in the last block itself.
Approved by: rpaulo (mentor)
Obtained from: OpenBSD
MFC after: 3 weeks
Diffstat (limited to 'sys/dev/iwn')
-rw-r--r-- | sys/dev/iwn/if_iwn.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/sys/dev/iwn/if_iwn.c b/sys/dev/iwn/if_iwn.c index bbd8dd9..b6af7b8 100644 --- a/sys/dev/iwn/if_iwn.c +++ b/sys/dev/iwn/if_iwn.c @@ -972,8 +972,7 @@ iwn_eeprom_unlock(struct iwn_softc *sc) int iwn_init_otprom(struct iwn_softc *sc) { - uint32_t base; - uint16_t next; + uint16_t prev, base, next; int count, error; /* Wait for clock stabilization before accessing prph. */ @@ -1000,25 +999,26 @@ iwn_init_otprom(struct iwn_softc *sc) IWN_OTP_GP_ECC_CORR_STTS | IWN_OTP_GP_ECC_UNCORR_STTS); /* - * Find last valid OTP block (contains the EEPROM image) for HW - * without OTP shadow RAM. + * Find the block before last block (contains the EEPROM image) + * for HW without OTP shadow RAM. */ if (sc->hw_type == IWN_HW_REV_TYPE_1000) { /* Switch to absolute addressing mode. */ IWN_CLRBITS(sc, IWN_OTP_GP, IWN_OTP_GP_RELATIVE_ACCESS); - base = 0; + base = prev = 0; for (count = 0; count < IWN1000_OTP_NBLOCKS; count++) { error = iwn_read_prom_data(sc, base, &next, 2); if (error != 0) return error; if (next == 0) /* End of linked-list. */ break; + prev = base; base = le16toh(next); } - if (base == 0 || count == IWN1000_OTP_NBLOCKS) + if (count == 0 || count == IWN1000_OTP_NBLOCKS) return EIO; /* Skip "next" word. */ - sc->prom_base = base + 1; + sc->prom_base = prev + 1; } return 0; } |