mirror of https://gitee.com/openkylin/linux.git
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:
parent
a16130569a
commit
3c6955e5aa
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in New Issue