From 3c6955e5aa2a7ebf18a44486be6a7f047811650b Mon Sep 17 00:00:00 2001 From: David Fries Date: Wed, 15 Jan 2014 22:29:16 -0600 Subject: w1: continue slave search where previous left off 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 Acked-by: Evgeniy Polyakov Signed-off-by: Greg Kroah-Hartman --- drivers/w1/w1.c | 18 +++++++++++++++--- drivers/w1/w1.h | 3 +++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/drivers/w1/w1.c b/drivers/w1/w1.c index 34ffdc6da4fb..4c89f85edfe6 100644 --- a/drivers/w1/w1.c +++ b/drivers/w1/w1.c @@ -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); } diff --git a/drivers/w1/w1.h b/drivers/w1/w1.h index bd10b3c2a406..80fbdf908919 100644 --- a/drivers/w1/w1.h +++ b/drivers/w1/w1.h @@ -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; -- cgit v1.2.1