<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">From johnpol@2ka.mipt.ru Thu Aug 11 07:05:13 2005
From: Evgeniy Polyakov &lt;johnpol@2ka.mipt.ru&gt;
Subject: w1: Added w1_reset_select_slave() - Resets the bus and then selects the slave by
Date: Thu, 11 Aug 2005 17:27:49 +0400
Message-Id: &lt;11237668692523@2ka.mipt.ru&gt;
To: GregKH &lt;greg@kroah.com&gt;

sending either a skip rom or a rom match.

Patch from Ben Gardner &lt;bgardner@wabtec.com&gt;

Signed-off-by: Evgeniy Polyakov &lt;johnpol@2ka.mipt.ru&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@suse.de&gt;

---
 drivers/w1/w1_io.c    |   24 ++++++++++++++++++++++++
 drivers/w1/w1_io.h    |    1 +
 drivers/w1/w1_therm.c |   11 ++---------
 3 files changed, 27 insertions(+), 9 deletions(-)

--- gregkh-2.6.orig/drivers/w1/w1_io.c	2005-08-02 13:41:30.000000000 -0700
+++ gregkh-2.6/drivers/w1/w1_io.c	2005-08-12 14:13:08.000000000 -0700
@@ -277,6 +277,29 @@
 		w1_search(dev, cb);
 }
 
+/**
+ * Resets the bus and then selects the slave by sending either a skip rom
+ * or a rom match.
+ * The w1 master lock must be held.
+ *
+ * @param sl	the slave to select
+ * @return 	0=success, anything else=error
+ */
+int w1_reset_select_slave(struct w1_slave *sl)
+{
+	if (w1_reset_bus(sl-&gt;master))
+		return -1;
+
+	if (sl-&gt;master-&gt;slave_count == 1)
+		w1_write_8(sl-&gt;master, W1_SKIP_ROM);
+	else {
+		u8 match[9] = {W1_MATCH_ROM, };
+		memcpy(&amp;match[1], (u8 *)&amp;sl-&gt;reg_num, 8);
+		w1_write_block(sl-&gt;master, match, 9);
+	}
+	return 0;
+}
+
 EXPORT_SYMBOL(w1_touch_bit);
 EXPORT_SYMBOL(w1_write_8);
 EXPORT_SYMBOL(w1_read_8);
@@ -286,3 +309,4 @@
 EXPORT_SYMBOL(w1_read_block);
 EXPORT_SYMBOL(w1_write_block);
 EXPORT_SYMBOL(w1_search_devices);
+EXPORT_SYMBOL(w1_reset_select_slave);
--- gregkh-2.6.orig/drivers/w1/w1_io.h	2005-08-02 13:41:30.000000000 -0700
+++ gregkh-2.6/drivers/w1/w1_io.h	2005-08-12 14:13:08.000000000 -0700
@@ -34,5 +34,6 @@
 void w1_write_block(struct w1_master *, const u8 *, int);
 u8 w1_read_block(struct w1_master *, u8 *, int);
 void w1_search_devices(struct w1_master *dev, w1_slave_found_callback cb);
+int w1_reset_select_slave(struct w1_slave *sl);
 
 #endif /* __W1_IO_H */
--- gregkh-2.6.orig/drivers/w1/w1_therm.c	2005-08-12 14:13:07.000000000 -0700
+++ gregkh-2.6/drivers/w1/w1_therm.c	2005-08-12 14:13:08.000000000 -0700
@@ -176,15 +176,10 @@
 	crc = 0;
 
 	while (max_trying--) {
-		if (!w1_reset_bus (dev)) {
+		if (!w1_reset_select_slave(sl)) {
 			int count = 0;
-			u8 match[9] = {W1_MATCH_ROM, };
 			unsigned int tm = 750;
 
-			memcpy(&amp;match[1], (u64 *) &amp; sl-&gt;reg_num, 8);
-
-			w1_write_block(dev, match, 9);
-
 			w1_write_8(dev, W1_CONVERT_TEMP);
 
 			while (tm) {
@@ -193,8 +188,7 @@
 					flush_signals(current);
 			}
 
-			if (!w1_reset_bus (dev)) {
-				w1_write_block(dev, match, 9);
+			if (!w1_reset_select_slave(sl)) {
 
 				w1_write_8(dev, W1_READ_SCRATCHPAD);
 				if ((count = w1_read_block(dev, rom, 9)) != 9) {
@@ -205,7 +199,6 @@
 
 				if (rom[8] == crc &amp;&amp; rom[0])
 					verdict = 1;
-
 			}
 		}
 
</pre></body></html>