summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorDavid Gwynne <dlg@cvs.openbsd.org>2004-11-11 12:57:20 +0000
committerDavid Gwynne <dlg@cvs.openbsd.org>2004-11-11 12:57:20 +0000
commit54165f7e5c330786b8090977c3315b41d4c03bf6 (patch)
tree07081dfa8c43df1310d6bc66ce07919b305c5210 /sys
parent4ab9dad3f7fcfae213be0433dd3f92fbabc0438e (diff)
half of the changes from netbsds if_axe.c revision 1.5:
Protect MII reads and writes properly against multiple access.
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/usb/if_axe.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/sys/dev/usb/if_axe.c b/sys/dev/usb/if_axe.c
index 59ddba404a8..7806ca5ee98 100644
--- a/sys/dev/usb/if_axe.c
+++ b/sys/dev/usb/if_axe.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_axe.c,v 1.17 2004/11/11 12:38:48 dlg Exp $ */
+/* $OpenBSD: if_axe.c,v 1.18 2004/11/11 12:57:19 dlg Exp $ */
/*
* Copyright (c) 1997, 1998, 1999, 2000-2003
@@ -269,10 +269,13 @@ axe_miibus_readreg(device_ptr_t dev, int phy, int reg)
if (sc->axe_phyaddrs[0] != 0xFF && sc->axe_phyaddrs[0] != phy)
return (0);
+ val = 0;
+ axe_lock_mii(sc);
axe_cmd(sc, AXE_CMD_MII_OPMODE_SW, 0, 0, NULL);
err = axe_cmd(sc, AXE_CMD_MII_READ_REG, reg, phy, (void *)&val);
axe_cmd(sc, AXE_CMD_MII_OPMODE_HW, 0, 0, NULL);
+ axe_unlock_mii(sc);
if (err) {
printf("axe%d: read PHY failed\n", sc->axe_unit);
@@ -294,16 +297,16 @@ axe_miibus_writereg(device_ptr_t dev, int phy, int reg, int val)
if (sc->axe_dying)
return;
+ axe_lock_mii(sc);
axe_cmd(sc, AXE_CMD_MII_OPMODE_SW, 0, 0, NULL);
err = axe_cmd(sc, AXE_CMD_MII_WRITE_REG, reg, phy, (void *)&val);
axe_cmd(sc, AXE_CMD_MII_OPMODE_HW, 0, 0, NULL);
+ axe_unlock_mii(sc);
if (err) {
printf("axe%d: write PHY failed\n", sc->axe_unit);
return;
}
-
- return;
}
Static void
@@ -452,7 +455,7 @@ USB_ATTACH(axe)
}
usb_init_task(&sc->axe_tick_task, axe_tick_task, sc);
- lockinit(&sc->axe_mii_lock, PZERO, "axemii", 0, 0);
+ lockinit(&sc->axe_mii_lock, PZERO, "axemii", 0, LK_CANRECURSE);
usb_init_task(&sc->axe_stop_task, (void (*)(void *))axe_stop, sc);
err = usbd_device2interface_handle(dev, AXE_IFACE_IDX, &sc->axe_iface);