forked from Minki/linux
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;
|
u8 triplet_ret = 0;
|
||||||
|
|
||||||
search_bit = 0;
|
search_bit = 0;
|
||||||
rn = last_rn = 0;
|
rn = dev->search_id;
|
||||||
|
last_rn = 0;
|
||||||
last_device = 0;
|
last_device = 0;
|
||||||
last_zero = -1;
|
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);
|
mutex_unlock(&dev->bus_mutex);
|
||||||
|
|
||||||
if ( (triplet_ret & 0x03) != 0x03 ) {
|
if ( (triplet_ret & 0x03) != 0x03 ) {
|
||||||
if ( (desc_bit == last_zero) || (last_zero < 0))
|
if ((desc_bit == last_zero) || (last_zero < 0)) {
|
||||||
last_device = 1;
|
last_device = 1;
|
||||||
|
dev->search_id = 0;
|
||||||
|
} else {
|
||||||
|
dev->search_id = rn;
|
||||||
|
}
|
||||||
desc_bit = last_zero;
|
desc_bit = last_zero;
|
||||||
cb(dev, rn);
|
cb(dev, rn);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!last_device && slave_count == dev->max_slave_count &&
|
if (!last_device && slave_count == dev->max_slave_count &&
|
||||||
!test_bit(W1_WARN_MAX_COUNT, &dev->flags)) {
|
!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, "
|
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);
|
dev->max_slave_count);
|
||||||
set_bit(W1_WARN_MAX_COUNT, &dev->flags);
|
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
|
/** Really nice hardware can handles the different types of ROM search
|
||||||
* w1_master* is passed to the slave found callback.
|
* 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 *,
|
void (*search)(void *, struct w1_master *,
|
||||||
u8, w1_slave_found_callback);
|
u8, w1_slave_found_callback);
|
||||||
@ -177,6 +178,8 @@ struct w1_master
|
|||||||
int initialized;
|
int initialized;
|
||||||
u32 id;
|
u32 id;
|
||||||
int search_count;
|
int search_count;
|
||||||
|
/* id to start searching on, to continue a search or 0 to restart */
|
||||||
|
u64 search_id;
|
||||||
|
|
||||||
atomic_t refcnt;
|
atomic_t refcnt;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user