|
@@ -676,7 +676,8 @@ static struct l2cap_chan *chan_create(void)
|
|
|
}
|
|
|
|
|
|
static struct l2cap_chan *add_peer_chan(struct l2cap_chan *chan,
|
|
|
- struct lowpan_btle_dev *dev)
|
|
|
+ struct lowpan_btle_dev *dev,
|
|
|
+ bool new_netdev)
|
|
|
{
|
|
|
struct lowpan_peer *peer;
|
|
|
|
|
@@ -697,7 +698,8 @@ static struct l2cap_chan *add_peer_chan(struct l2cap_chan *chan,
|
|
|
spin_unlock(&devices_lock);
|
|
|
|
|
|
/* Notifying peers about us needs to be done without locks held */
|
|
|
- INIT_DELAYED_WORK(&dev->notify_peers, do_notify_peers);
|
|
|
+ if (new_netdev)
|
|
|
+ INIT_DELAYED_WORK(&dev->notify_peers, do_notify_peers);
|
|
|
schedule_delayed_work(&dev->notify_peers, msecs_to_jiffies(100));
|
|
|
|
|
|
return peer->chan;
|
|
@@ -755,6 +757,7 @@ out:
|
|
|
static inline void chan_ready_cb(struct l2cap_chan *chan)
|
|
|
{
|
|
|
struct lowpan_btle_dev *dev;
|
|
|
+ bool new_netdev = false;
|
|
|
|
|
|
dev = lookup_dev(chan->conn);
|
|
|
|
|
@@ -765,12 +768,13 @@ static inline void chan_ready_cb(struct l2cap_chan *chan)
|
|
|
l2cap_chan_del(chan, -ENOENT);
|
|
|
return;
|
|
|
}
|
|
|
+ new_netdev = true;
|
|
|
}
|
|
|
|
|
|
if (!try_module_get(THIS_MODULE))
|
|
|
return;
|
|
|
|
|
|
- add_peer_chan(chan, dev);
|
|
|
+ add_peer_chan(chan, dev, new_netdev);
|
|
|
ifup(dev->netdev);
|
|
|
}
|
|
|
|