diff options
Diffstat (limited to 'drivers/firewire/core-device.c')
| -rw-r--r-- | drivers/firewire/core-device.c | 22 | 
1 files changed, 15 insertions, 7 deletions
diff --git a/drivers/firewire/core-device.c b/drivers/firewire/core-device.c index de4aa409abe2..2c6d5e118ac1 100644 --- a/drivers/firewire/core-device.c +++ b/drivers/firewire/core-device.c @@ -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);  		}  | 
