summaryrefslogtreecommitdiffstats
path: root/sys/dev/usb/net
diff options
context:
space:
mode:
authoryongari <yongari@FreeBSD.org>2014-04-03 01:32:43 +0000
committeryongari <yongari@FreeBSD.org>2014-04-03 01:32:43 +0000
commita4288fbf04d9ccdc0560315f3cf0e21f4138286f (patch)
tree91c0a5b0b357b1f9f8af7f20e8babd6ec7731898 /sys/dev/usb/net
parent101a8946cc5a12dbed97f9223a53c444eaa97415 (diff)
downloadFreeBSD-src-a4288fbf04d9ccdc0560315f3cf0e21f4138286f.zip
FreeBSD-src-a4288fbf04d9ccdc0560315f3cf0e21f4138286f.tar.gz
Correct endianness handling in getting station address from EEPROM.
While I'm here, remove aue_eeprom_getword() as its only usage is to read station address and make it more readable. This change is inspired by NetBSD. With this change, aue(4) should work on big endian architectures. PR: 188177
Diffstat (limited to 'sys/dev/usb/net')
-rw-r--r--sys/dev/usb/net/if_aue.c30
1 files changed, 14 insertions, 16 deletions
diff --git a/sys/dev/usb/net/if_aue.c b/sys/dev/usb/net/if_aue.c
index e9d6646..92b58d5 100644
--- a/sys/dev/usb/net/if_aue.c
+++ b/sys/dev/usb/net/if_aue.c
@@ -212,9 +212,7 @@ static uint8_t aue_csr_read_1(struct aue_softc *, uint16_t);
static uint16_t aue_csr_read_2(struct aue_softc *, uint16_t);
static void aue_csr_write_1(struct aue_softc *, uint16_t, uint8_t);
static void aue_csr_write_2(struct aue_softc *, uint16_t, uint16_t);
-static void aue_eeprom_getword(struct aue_softc *, int, uint16_t *);
-static void aue_read_eeprom(struct aue_softc *, uint8_t *, uint16_t,
- uint16_t);
+static uint16_t aue_eeprom_getword(struct aue_softc *, int);
static void aue_reset(struct aue_softc *);
static void aue_reset_pegasus_II(struct aue_softc *);
@@ -376,11 +374,10 @@ aue_csr_write_2(struct aue_softc *sc, uint16_t reg, uint16_t val)
/*
* Read a word of data stored in the EEPROM at address 'addr.'
*/
-static void
-aue_eeprom_getword(struct aue_softc *sc, int addr, uint16_t *dest)
+static uint16_t
+aue_eeprom_getword(struct aue_softc *sc, int addr)
{
int i;
- uint16_t word = 0;
aue_csr_write_1(sc, AUE_EE_REG, addr);
aue_csr_write_1(sc, AUE_EE_CTL, AUE_EECTL_READ);
@@ -395,22 +392,23 @@ aue_eeprom_getword(struct aue_softc *sc, int addr, uint16_t *dest)
if (i == AUE_TIMEOUT)
device_printf(sc->sc_ue.ue_dev, "EEPROM read timed out\n");
- word = aue_csr_read_2(sc, AUE_EE_DATA);
- *dest = word;
+ return (aue_csr_read_2(sc, AUE_EE_DATA));
}
/*
- * Read a sequence of words from the EEPROM.
+ * Read station address(offset 0) from the EEPROM.
*/
static void
-aue_read_eeprom(struct aue_softc *sc, uint8_t *dest,
- uint16_t off, uint16_t len)
+aue_read_mac(struct aue_softc *sc, uint8_t *eaddr)
{
- uint16_t *ptr = (uint16_t *)dest;
- int i;
+ int i, offset;
+ uint16_t word;
- for (i = 0; i != len; i++, ptr++)
- aue_eeprom_getword(sc, off + i, ptr);
+ for (i = 0, offset = 0; i < ETHER_ADDR_LEN / 2; i++) {
+ word = aue_eeprom_getword(sc, offset + i);
+ eaddr[i * 2] = (uint8_t)word;
+ eaddr[i * 2 + 1] = (uint8_t)(word >> 8);
+ }
}
static int
@@ -636,7 +634,7 @@ aue_attach_post(struct usb_ether *ue)
aue_reset(sc);
/* get station address from the EEPROM */
- aue_read_eeprom(sc, ue->ue_eaddr, 0, 3);
+ aue_read_mac(sc, ue->ue_eaddr);
}
/*
OpenPOWER on IntegriCloud