mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-23 07:22:33 +00:00
57 lines
2.1 KiB
Diff
57 lines
2.1 KiB
Diff
|
From 1808665b2b2e06d6f14762eb0ab82d65e3af3e2b Mon Sep 17 00:00:00 2001
|
||
|
From: Mariusz Bialonczyk <manio@skyboo.net>
|
||
|
Date: Wed, 22 May 2019 12:40:53 +0200
|
||
|
Subject: [PATCH 678/703] w1: ds2413: when the slave is not responding during
|
||
|
read, select it again
|
||
|
|
||
|
commit 3856032a0628e6b94badb9131a706dda185e071d upstream.
|
||
|
|
||
|
The protocol is not allowing to obtain a byte of 0xff for PIO_ACCESS_READ
|
||
|
call. It is very likely that the slave was not addressed properly and
|
||
|
it is just not respoding (leaving the bus in logic high state) during
|
||
|
the read of sampled PIO value.
|
||
|
We cannot just call w1_reset_resume_command() because the problem will
|
||
|
persist, instead try selecting (addressing) the slave again.
|
||
|
|
||
|
Signed-off-by: Mariusz Bialonczyk <manio@skyboo.net>
|
||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||
|
---
|
||
|
drivers/w1/slaves/w1_ds2413.c | 9 ++++++++-
|
||
|
1 file changed, 8 insertions(+), 1 deletion(-)
|
||
|
|
||
|
--- a/drivers/w1/slaves/w1_ds2413.c
|
||
|
+++ b/drivers/w1/slaves/w1_ds2413.c
|
||
|
@@ -24,6 +24,7 @@
|
||
|
#define W1_F3A_FUNC_PIO_ACCESS_READ 0xF5
|
||
|
#define W1_F3A_FUNC_PIO_ACCESS_WRITE 0x5A
|
||
|
#define W1_F3A_SUCCESS_CONFIRM_BYTE 0xAA
|
||
|
+#define W1_F3A_INVALID_PIO_STATE 0xFF
|
||
|
|
||
|
static ssize_t state_read(struct file *filp, struct kobject *kobj,
|
||
|
struct bin_attribute *bin_attr, char *buf, loff_t off,
|
||
|
@@ -45,6 +46,7 @@ static ssize_t state_read(struct file *f
|
||
|
mutex_lock(&sl->master->bus_mutex);
|
||
|
dev_dbg(&sl->dev, "mutex locked");
|
||
|
|
||
|
+next:
|
||
|
if (w1_reset_select_slave(sl))
|
||
|
goto out;
|
||
|
|
||
|
@@ -52,10 +54,15 @@ static ssize_t state_read(struct file *f
|
||
|
w1_write_8(sl->master, W1_F3A_FUNC_PIO_ACCESS_READ);
|
||
|
|
||
|
*buf = w1_read_8(sl->master);
|
||
|
- /* check for correct complement */
|
||
|
if ((*buf & 0x0F) == ((~*buf >> 4) & 0x0F)) {
|
||
|
+ /* complement is correct */
|
||
|
bytes_read = 1;
|
||
|
goto out;
|
||
|
+ } else if (*buf == W1_F3A_INVALID_PIO_STATE) {
|
||
|
+ /* slave didn't respond, try to select it again */
|
||
|
+ dev_warn(&sl->dev, "slave device did not respond to PIO_ACCESS_READ, " \
|
||
|
+ "reselecting, retries left: %d\n", retries);
|
||
|
+ goto next;
|
||
|
}
|
||
|
|
||
|
if (w1_reset_resume_command(sl->master))
|