diff options
Diffstat (limited to 'drivers/firewire/core-topology.c')
-rw-r--r-- | drivers/firewire/core-topology.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/drivers/firewire/core-topology.c b/drivers/firewire/core-topology.c index 2f73bcd5696f..90b988035a2a 100644 --- a/drivers/firewire/core-topology.c +++ b/drivers/firewire/core-topology.c @@ -460,8 +460,14 @@ void fw_core_handle_bus_reset(struct fw_card *card, int node_id, int generation, { struct fw_node *local_node; + might_sleep(); + trace_bus_reset_handle(card->index, generation, node_id, bm_abdicate, self_ids, self_id_count); + // Disable bus management work during updating the cache of bus topology, since the work + // accesses to some members of fw_card. + disable_delayed_work_sync(&card->bm_work); + scoped_guard(spinlock, &card->lock) { // If the selfID buffer is not the immediate successor of the // previously processed one, we cannot reliably compare the @@ -495,6 +501,8 @@ void fw_core_handle_bus_reset(struct fw_card *card, int node_id, int generation, } } + enable_delayed_work(&card->bm_work); + fw_schedule_bm_work(card, 0); // Just used by transaction layer. |