diff options
author | David Fries <David@Fries.net> | 2014-01-15 22:29:16 -0600 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2014-02-07 15:40:17 -0800 |
commit | 3c6955e5aa2a7ebf18a44486be6a7f047811650b (patch) | |
tree | b9365215e9e5421e24e111a6b3e792af1ade73d9 | |
parent | a16130569af7e92b0a68a8c96170d84756f91c47 (diff) | |
download | blackbird-op-linux-3c6955e5aa2a7ebf18a44486be6a7f047811650b.tar.gz blackbird-op-linux-3c6955e5aa2a7ebf18a44486be6a7f047811650b.zip |
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 <David@Fries.net>
Acked-by: Evgeniy Polyakov <zbr@ioremap.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r-- | drivers/w1/w1.c | 18 | ||||
-rw-r--r-- | 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; |