Patch "w1: w1_therm: fix locking behavior in convert_t" has been added to the 5.15-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    w1: w1_therm: fix locking behavior in convert_t

to the 5.15-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     w1-w1_therm-fix-locking-behavior-in-convert_t.patch
and it can be found in the queue-5.15 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit e152cd39a4a6eacf412fba60af99e3eebcd5e9c4
Author: Stefan Wahren <stefan.wahren@xxxxxxxx>
Date:   Thu Apr 27 13:21:52 2023 +0200

    w1: w1_therm: fix locking behavior in convert_t
    
    [ Upstream commit dca5480ab7b77a889088ab7cac81934604510ac7 ]
    
    The commit 67b392f7b8ed ("w1_therm: optimizing temperature read timings")
    accidentially inverted the logic for lock handling of the bus mutex.
    
    Before:
      pullup -> release lock before sleep
      no pullup -> release lock after sleep
    
    After:
      pullup -> release lock after sleep
      no pullup -> release lock before sleep
    
    This cause spurious measurements of 85 degree (powerup value) on the
    Tarragon board with connected 1-w temperature sensor
    (w1_therm.w1_strong_pull=0).
    
    In the meantime a new feature for polling the conversion
    completion has been integrated in these branches with
    commit 021da53e65fd ("w1: w1_therm: Add sysfs entries to control
    conversion time and driver features"). But this feature isn't
    available for parasite power mode, so handle this separately.
    
    Link: https://lore.kernel.org/regressions/2023042645-attentive-amends-7b0b@gregkh/T/
    Fixes: 67b392f7b8ed ("w1_therm: optimizing temperature read timings")
    Signed-off-by: Stefan Wahren <stefan.wahren@xxxxxxxx>
    Link: https://lore.kernel.org/r/20230427112152.12313-1-stefan.wahren@xxxxxxxx
    Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/w1/slaves/w1_therm.c b/drivers/w1/slaves/w1_therm.c
index 9cbeeb4923ecf..67d1cfbbb5f7f 100644
--- a/drivers/w1/slaves/w1_therm.c
+++ b/drivers/w1/slaves/w1_therm.c
@@ -1093,29 +1093,26 @@ static int convert_t(struct w1_slave *sl, struct therm_info *info)
 
 			w1_write_8(dev_master, W1_CONVERT_TEMP);
 
-			if (strong_pullup) { /*some device need pullup */
+			if (SLAVE_FEATURES(sl) & W1_THERM_POLL_COMPLETION) {
+				ret = w1_poll_completion(dev_master, W1_POLL_CONVERT_TEMP);
+				if (ret) {
+					dev_dbg(&sl->dev, "%s: Timeout\n", __func__);
+					goto mt_unlock;
+				}
+				mutex_unlock(&dev_master->bus_mutex);
+			} else if (!strong_pullup) { /*no device need pullup */
 				sleep_rem = msleep_interruptible(t_conv);
 				if (sleep_rem != 0) {
 					ret = -EINTR;
 					goto mt_unlock;
 				}
 				mutex_unlock(&dev_master->bus_mutex);
-			} else { /*no device need pullup */
-				if (SLAVE_FEATURES(sl) & W1_THERM_POLL_COMPLETION) {
-					ret = w1_poll_completion(dev_master, W1_POLL_CONVERT_TEMP);
-					if (ret) {
-						dev_dbg(&sl->dev, "%s: Timeout\n", __func__);
-						goto mt_unlock;
-					}
-					mutex_unlock(&dev_master->bus_mutex);
-				} else {
-					/* Fixed delay */
-					mutex_unlock(&dev_master->bus_mutex);
-					sleep_rem = msleep_interruptible(t_conv);
-					if (sleep_rem != 0) {
-						ret = -EINTR;
-						goto dec_refcnt;
-					}
+			} else { /*some device need pullup */
+				mutex_unlock(&dev_master->bus_mutex);
+				sleep_rem = msleep_interruptible(t_conv);
+				if (sleep_rem != 0) {
+					ret = -EINTR;
+					goto dec_refcnt;
 				}
 			}
 			ret = read_scratchpad(sl, info);



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux