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>
This commit is contained in:
David Fries 2014-01-15 22:29:16 -06:00 committed by Greg Kroah-Hartman
parent a16130569a
commit 3c6955e5aa
2 changed files with 18 additions and 3 deletions

View 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);
}

View 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;