w1: continue slave search where previous left off
authorDavid Fries <David@Fries.net>
Thu, 16 Jan 2014 04:29:16 +0000 (22:29 -0600)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 7 Feb 2014 23:40:17 +0000 (15:40 -0800)
Search will detect at most max_slave_count devices per run, if there
are more pick up the next search where the previous left off.

Signed-off-by: David Fries <David@Fries.net>
Acked-by: Evgeniy Polyakov <zbr@ioremap.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/w1/w1.c
drivers/w1/w1.h

index 34ffdc6da4fbd63547201af8d482215528df67fe..4c89f85edfe693c41b739830283cd2231842aea3 100644 (file)
@@ -918,7 +918,8 @@ void w1_search(struct w1_master *dev, u8 search_type, w1_slave_found_callback cb
        u8  triplet_ret = 0;
 
        search_bit = 0;
-       rn = last_rn = 0;
+       rn = dev->search_id;
+       last_rn = 0;
        last_device = 0;
        last_zero = -1;
 
@@ -989,16 +990,27 @@ void w1_search(struct w1_master *dev, u8 search_type, w1_slave_found_callback cb
                mutex_unlock(&dev->bus_mutex);
 
                if ( (triplet_ret & 0x03) != 0x03 ) {
-                       if ( (desc_bit == last_zero) || (last_zero < 0))
+                       if ((desc_bit == last_zero) || (last_zero < 0)) {
                                last_device = 1;
+                               dev->search_id = 0;
+                       } else {
+                               dev->search_id = rn;
+                       }
                        desc_bit = last_zero;
                        cb(dev, rn);
                }
 
                if (!last_device && slave_count == dev->max_slave_count &&
                        !test_bit(W1_WARN_MAX_COUNT, &dev->flags)) {
+                       /* Only max_slave_count will be scanned in a search,
+                        * but it will start where it left off next search
+                        * until all ids are identified and then it will start
+                        * over.  A continued search will report the previous
+                        * last id as the first id (provided it is still on the
+                        * bus).
+                        */
                        dev_info(&dev->dev, "%s: max_slave_count %d reached, "
-                               "additional sensors ignored\n", __func__,
+                               "will continue next search.\n", __func__,
                                dev->max_slave_count);
                        set_bit(W1_WARN_MAX_COUNT, &dev->flags);
                }
index bd10b3c2a406ccc05e1cc43804134f829831b36d..80fbdf908919b583fdf52553f1050005ddebf63f 100644 (file)
@@ -150,6 +150,7 @@ struct w1_bus_master
 
        /** Really nice hardware can handles the different types of ROM search
         *  w1_master* is passed to the slave found callback.
+        *  u8 is search_type, W1_SEARCH or W1_ALARM_SEARCH
         */
        void            (*search)(void *, struct w1_master *,
                u8, w1_slave_found_callback);
@@ -177,6 +178,8 @@ struct w1_master
        int                     initialized;
        u32                     id;
        int                     search_count;
+       /* id to start searching on, to continue a search or 0 to restart */
+       u64                     search_id;
 
        atomic_t                refcnt;