diff options
author | Rafael Vanoni <rafael.vanoni@sun.com> | 2009-11-13 01:32:32 -0800 |
---|---|---|
committer | Rafael Vanoni <rafael.vanoni@sun.com> | 2009-11-13 01:32:32 -0800 |
commit | d3d50737e566cade9a08d73d2af95105ac7cd960 (patch) | |
tree | 399b76a3f6bf107e2ff506d8f9c3333654b29fc7 /usr/src/uts/intel/io/heci/heci_init.c | |
parent | 1eff5f7761619411b3c31280fcd96cefc32968b7 (diff) | |
download | illumos-joyent-d3d50737e566cade9a08d73d2af95105ac7cd960.tar.gz |
PSARC/2009/396 Tickless Kernel Architecture / lbolt decoupling
6860030 tickless clock requires a clock() decoupled lbolt / lbolt64
Portions contributed by Chad Mynhier <cmynhier@gmail.com>
Diffstat (limited to 'usr/src/uts/intel/io/heci/heci_init.c')
-rw-r--r-- | usr/src/uts/intel/io/heci/heci_init.c | 46 |
1 files changed, 17 insertions, 29 deletions
diff --git a/usr/src/uts/intel/io/heci/heci_init.c b/usr/src/uts/intel/io/heci/heci_init.c index 7248ff6d21..0f5e4da22f 100644 --- a/usr/src/uts/intel/io/heci/heci_init.c +++ b/usr/src/uts/intel/io/heci/heci_init.c @@ -302,11 +302,8 @@ heci_hw_init(struct iamt_heci_device *dev) /* wait for ME to turn on ME_RDY */ err = 0; while (!dev->recvd_msg && err != -1) { - clock_t tm; - tm = ddi_get_lbolt(); - err = cv_timedwait(&dev->wait_recvd_msg, - &dev->device_lock, - tm + HECI_INTEROP_TIMEOUT); + err = cv_reltimedwait(&dev->wait_recvd_msg, + &dev->device_lock, HECI_INTEROP_TIMEOUT, TR_CLOCK_TICK); } if (err == -1 && !dev->recvd_msg) { @@ -572,6 +569,7 @@ host_start_message(struct iamt_heci_device *dev) struct hbm_host_version_request *host_start_req; struct hbm_host_stop_request *host_stop_req; int err = 0; + clock_t delta = (clock_t)(timeout * HZ); /* host start message */ mutex_enter(&dev->device_lock); @@ -600,10 +598,8 @@ host_start_message(struct iamt_heci_device *dev) DBG("call wait_event_interruptible_timeout for response message.\n"); err = 0; while (err != -1 && !dev->recvd_msg) { - clock_t tm; - tm = ddi_get_lbolt(); - err = cv_timedwait(&dev->wait_recvd_msg, - &dev->device_lock, tm + timeout * HZ); + err = cv_reltimedwait(&dev->wait_recvd_msg, &dev->device_lock, + delta, TR_CLOCK_TICK); } if (err == -1 && !dev->recvd_msg) { DBG("wait_timeout failed on host start response message.\n"); @@ -655,6 +651,7 @@ host_enum_clients_message(struct iamt_heci_device *dev) struct hbm_host_enum_request *host_enum_req; int err = 0; uint8_t i, j; + clock_t delta = (clock_t)(timeout * HZ); mutex_enter(&dev->device_lock); @@ -680,11 +677,8 @@ host_enum_clients_message(struct iamt_heci_device *dev) dev->recvd_msg = 0; err = 0; while (!dev->recvd_msg && err != -1) { - clock_t tm; - tm = ddi_get_lbolt(); - err = cv_timedwait(&dev->wait_recvd_msg, - &dev->device_lock, - tm + timeout * HZ); + err = cv_reltimedwait(&dev->wait_recvd_msg, &dev->device_lock, + delta, TR_CLOCK_TICK); } if (err == -1 && !dev->recvd_msg) { DBG("wait_event_interruptible_timeout failed " @@ -723,6 +717,7 @@ host_client_properties(struct iamt_heci_device *dev, struct heci_msg_hdr *heci_hdr; struct hbm_props_request *host_cli_req; int err; + clock_t delta = 10 * HZ; mutex_enter(&dev->device_lock); heci_hdr = (struct heci_msg_hdr *)&dev->wr_msg_buf[0]; @@ -747,11 +742,8 @@ host_client_properties(struct iamt_heci_device *dev, err = 0; while (!dev->recvd_msg && err != -1) { - clock_t tm; - tm = ddi_get_lbolt(); - err = cv_timedwait(&dev->wait_recvd_msg, - &dev->device_lock, - tm + 10 * HZ); + err = cv_reltimedwait(&dev->wait_recvd_msg, &dev->device_lock, + delta, TR_CLOCK_TICK); } if (err == -1 && !dev->recvd_msg) { DBG("wait failed on props resp msg.\n"); @@ -928,6 +920,7 @@ heci_connect_me_client(struct iamt_heci_device *dev, long timeout) { int err = 0; + clock_t delta = (clock_t)(timeout * HZ); if ((dev == NULL) || (priv == NULL)) return (0); @@ -943,11 +936,8 @@ heci_connect_me_client(struct iamt_heci_device *dev, while (!(HECI_FILE_CONNECTED == priv->state || HECI_FILE_DISCONNECTED == priv->state) && err != -1) { - clock_t tm; - tm = ddi_get_lbolt(); - err = cv_timedwait(&dev->wait_recvd_msg, - &dev->device_lock, - tm + timeout*HZ); + err = cv_reltimedwait(&dev->wait_recvd_msg, &dev->device_lock, + delta, TR_CLOCK_TICK); } if (HECI_FILE_CONNECTED != priv->state) { heci_remove_client_from_file_list(dev, priv->host_client_id); @@ -1100,6 +1090,7 @@ heci_disconnect_host_client(struct iamt_heci_device *dev, int rets, err; long timeout = 15; /* 15 seconds */ struct heci_cb_private *priv_cb; + clock_t delta = (clock_t)(timeout * HZ); if ((!dev) || (!file_ext)) return (-ENODEV); @@ -1136,11 +1127,8 @@ heci_disconnect_host_client(struct iamt_heci_device *dev, while (err != -1 && (HECI_FILE_DISCONNECTED != file_ext->state)) { - clock_t tm; - tm = ddi_get_lbolt(); - err = cv_timedwait(&dev->wait_recvd_msg, - &dev->device_lock, - tm + timeout * HZ); + err = cv_reltimedwait(&dev->wait_recvd_msg, &dev->device_lock, + delta, TR_CLOCK_TICK); } mutex_exit(&dev->device_lock); |