|
@@ -916,7 +916,7 @@ static int lookup_existing_device(struct device *dev, void *data)
|
|
|
old->config_rom_retries = 0;
|
|
|
fw_notice(card, "rediscovered device %s\n", dev_name(dev));
|
|
|
|
|
|
- PREPARE_DELAYED_WORK(&old->work, fw_device_update);
|
|
|
+ old->workfn = fw_device_update;
|
|
|
fw_schedule_device_work(old, 0);
|
|
|
|
|
|
if (current_node == card->root_node)
|
|
@@ -1075,7 +1075,7 @@ static void fw_device_init(struct work_struct *work)
|
|
|
if (atomic_cmpxchg(&device->state,
|
|
|
FW_DEVICE_INITIALIZING,
|
|
|
FW_DEVICE_RUNNING) == FW_DEVICE_GONE) {
|
|
|
- PREPARE_DELAYED_WORK(&device->work, fw_device_shutdown);
|
|
|
+ device->workfn = fw_device_shutdown;
|
|
|
fw_schedule_device_work(device, SHUTDOWN_DELAY);
|
|
|
} else {
|
|
|
fw_notice(card, "created device %s: GUID %08x%08x, S%d00\n",
|
|
@@ -1196,13 +1196,20 @@ static void fw_device_refresh(struct work_struct *work)
|
|
|
dev_name(&device->device), fw_rcode_string(ret));
|
|
|
gone:
|
|
|
atomic_set(&device->state, FW_DEVICE_GONE);
|
|
|
- PREPARE_DELAYED_WORK(&device->work, fw_device_shutdown);
|
|
|
+ device->workfn = fw_device_shutdown;
|
|
|
fw_schedule_device_work(device, SHUTDOWN_DELAY);
|
|
|
out:
|
|
|
if (node_id == card->root_node->node_id)
|
|
|
fw_schedule_bm_work(card, 0);
|
|
|
}
|
|
|
|
|
|
+static void fw_device_workfn(struct work_struct *work)
|
|
|
+{
|
|
|
+ struct fw_device *device = container_of(to_delayed_work(work),
|
|
|
+ struct fw_device, work);
|
|
|
+ device->workfn(work);
|
|
|
+}
|
|
|
+
|
|
|
void fw_node_event(struct fw_card *card, struct fw_node *node, int event)
|
|
|
{
|
|
|
struct fw_device *device;
|
|
@@ -1252,7 +1259,8 @@ void fw_node_event(struct fw_card *card, struct fw_node *node, int event)
|
|
|
* power-up after getting plugged in. We schedule the
|
|
|
* first config rom scan half a second after bus reset.
|
|
|
*/
|
|
|
- INIT_DELAYED_WORK(&device->work, fw_device_init);
|
|
|
+ device->workfn = fw_device_init;
|
|
|
+ INIT_DELAYED_WORK(&device->work, fw_device_workfn);
|
|
|
fw_schedule_device_work(device, INITIAL_DELAY);
|
|
|
break;
|
|
|
|
|
@@ -1268,7 +1276,7 @@ void fw_node_event(struct fw_card *card, struct fw_node *node, int event)
|
|
|
if (atomic_cmpxchg(&device->state,
|
|
|
FW_DEVICE_RUNNING,
|
|
|
FW_DEVICE_INITIALIZING) == FW_DEVICE_RUNNING) {
|
|
|
- PREPARE_DELAYED_WORK(&device->work, fw_device_refresh);
|
|
|
+ device->workfn = fw_device_refresh;
|
|
|
fw_schedule_device_work(device,
|
|
|
device->is_local ? 0 : INITIAL_DELAY);
|
|
|
}
|
|
@@ -1283,7 +1291,7 @@ void fw_node_event(struct fw_card *card, struct fw_node *node, int event)
|
|
|
smp_wmb(); /* update node_id before generation */
|
|
|
device->generation = card->generation;
|
|
|
if (atomic_read(&device->state) == FW_DEVICE_RUNNING) {
|
|
|
- PREPARE_DELAYED_WORK(&device->work, fw_device_update);
|
|
|
+ device->workfn = fw_device_update;
|
|
|
fw_schedule_device_work(device, 0);
|
|
|
}
|
|
|
break;
|
|
@@ -1308,7 +1316,7 @@ void fw_node_event(struct fw_card *card, struct fw_node *node, int event)
|
|
|
device = node->data;
|
|
|
if (atomic_xchg(&device->state,
|
|
|
FW_DEVICE_GONE) == FW_DEVICE_RUNNING) {
|
|
|
- PREPARE_DELAYED_WORK(&device->work, fw_device_shutdown);
|
|
|
+ device->workfn = fw_device_shutdown;
|
|
|
fw_schedule_device_work(device,
|
|
|
list_empty(&card->link) ? 0 : SHUTDOWN_DELAY);
|
|
|
}
|