aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/ipmi/ipmi_smic.c
diff options
context:
space:
mode:
authorJohn Baldwin <jhb@FreeBSD.org>2015-02-06 16:45:10 +0000
committerJohn Baldwin <jhb@FreeBSD.org>2015-02-06 16:45:10 +0000
commitc869aa71f056ba8078a9db78290c295a644cad84 (patch)
treea94f64ba5185d4aec4bb28e8734dc3f2e25c7a95 /sys/dev/ipmi/ipmi_smic.c
parent64de80195bba295c961a4cdf96dbe0e4979bdf2a (diff)
Notes
Diffstat (limited to 'sys/dev/ipmi/ipmi_smic.c')
-rw-r--r--sys/dev/ipmi/ipmi_smic.c24
1 files changed, 23 insertions, 1 deletions
diff --git a/sys/dev/ipmi/ipmi_smic.c b/sys/dev/ipmi/ipmi_smic.c
index c79c86d574fb..4e26553e98e7 100644
--- a/sys/dev/ipmi/ipmi_smic.c
+++ b/sys/dev/ipmi/ipmi_smic.c
@@ -364,8 +364,11 @@ smic_loop(void *arg)
while ((req = ipmi_dequeue_request(sc)) != NULL) {
IPMI_UNLOCK(sc);
ok = 0;
- for (i = 0; i < 3 && !ok; i++)
+ for (i = 0; i < 3 && !ok; i++) {
+ IPMI_IO_LOCK(sc);
ok = smic_polled_request(sc, req);
+ IPMI_IO_UNLOCK(sc);
+ }
if (ok)
req->ir_error = 0;
else
@@ -385,6 +388,24 @@ smic_startup(struct ipmi_softc *sc)
"%s: smic", device_get_nameunit(sc->ipmi_dev)));
}
+static int
+smic_driver_request(struct ipmi_softc *sc, struct ipmi_request *req, int timo)
+{
+ int i, ok;
+
+ ok = 0;
+ for (i = 0; i < 3 && !ok; i++) {
+ IPMI_IO_LOCK(sc);
+ ok = smic_polled_request(sc, req);
+ IPMI_IO_UNLOCK(sc);
+ }
+ if (ok)
+ req->ir_error = 0;
+ else
+ req->ir_error = EIO;
+ return (req->ir_error);
+}
+
int
ipmi_smic_attach(struct ipmi_softc *sc)
{
@@ -393,6 +414,7 @@ ipmi_smic_attach(struct ipmi_softc *sc)
/* Setup function pointers. */
sc->ipmi_startup = smic_startup;
sc->ipmi_enqueue_request = ipmi_polled_enqueue_request;
+ sc->ipmi_driver_request = smic_driver_request;
/* See if we can talk to the controller. */
flags = INB(sc, SMIC_FLAGS);