Module Name: src Committed By: riastradh Date: Sat Feb 28 04:54:12 UTC 2015
Modified Files: src/sys/external/bsd/drm2/dist/drm/i915: intel_dp.c intel_i2c.c Log Message: Fix two more gmbus wait bugs. - Fix sense of return value in intel_dp_aux_wait_done. - Make the waits uninterruptible here like in Linux. To generate a diff of this commit: cvs rdiff -u -r1.9 -r1.10 src/sys/external/bsd/drm2/dist/drm/i915/intel_dp.c cvs rdiff -u -r1.7 -r1.8 src/sys/external/bsd/drm2/dist/drm/i915/intel_i2c.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/external/bsd/drm2/dist/drm/i915/intel_dp.c diff -u src/sys/external/bsd/drm2/dist/drm/i915/intel_dp.c:1.9 src/sys/external/bsd/drm2/dist/drm/i915/intel_dp.c:1.10 --- src/sys/external/bsd/drm2/dist/drm/i915/intel_dp.c:1.9 Thu Nov 6 12:47:48 2014 +++ src/sys/external/bsd/drm2/dist/drm/i915/intel_dp.c Sat Feb 28 04:54:12 2015 @@ -371,10 +371,16 @@ intel_dp_aux_wait_done(struct intel_dp * if (has_aux_irq && !cold) { int ret; spin_lock(&dev_priv->gmbus_wait_lock); - DRM_SPIN_TIMED_WAIT_UNTIL(ret, &dev_priv->gmbus_wait_queue, - &dev_priv->gmbus_wait_lock, msecs_to_jiffies_timeout(10), + DRM_SPIN_TIMED_WAIT_NOINTR_UNTIL(ret, + &dev_priv->gmbus_wait_queue, &dev_priv->gmbus_wait_lock, + msecs_to_jiffies_timeout(10), C); - done = ret; /* XXX ugh */ + if (ret < 0) /* Failure: pretend same as done. */ + done = true; + else if (ret == 0) /* Timed out: not done. */ + done = false; + else /* Succeeded (ret > 0): done. */ + done = true; spin_unlock(&dev_priv->gmbus_wait_lock); } else { done = wait_for_atomic(C, 10) == 0; Index: src/sys/external/bsd/drm2/dist/drm/i915/intel_i2c.c diff -u src/sys/external/bsd/drm2/dist/drm/i915/intel_i2c.c:1.7 src/sys/external/bsd/drm2/dist/drm/i915/intel_i2c.c:1.8 --- src/sys/external/bsd/drm2/dist/drm/i915/intel_i2c.c:1.7 Fri Feb 27 04:40:17 2015 +++ src/sys/external/bsd/drm2/dist/drm/i915/intel_i2c.c Sat Feb 28 04:54:12 2015 @@ -299,8 +299,9 @@ gmbus_wait_hw_status(struct drm_i915_pri } } else { int ret; - DRM_SPIN_TIMED_WAIT_UNTIL(ret, &dev_priv->gmbus_wait_queue, - &dev_priv->gmbus_wait_lock, mstohz(50), + DRM_SPIN_TIMED_WAIT_NOINTR_UNTIL(ret, + &dev_priv->gmbus_wait_queue, &dev_priv->gmbus_wait_lock, + mstohz(50), (gmbus2 = I915_READ_NOTRACE(GMBUS2 + reg_offset), ISSET(gmbus2, (GMBUS_SATOER | gmbus2_status)))); }