diff options
Diffstat (limited to 'drivers/firewire')
| -rw-r--r-- | drivers/firewire/core-device.c | 22 | ||||
| -rw-r--r-- | drivers/firewire/net.c | 6 | ||||
| -rw-r--r-- | drivers/firewire/ohci.c | 15 | ||||
| -rw-r--r-- | drivers/firewire/sbp2.c | 17 | 
4 files changed, 33 insertions, 27 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);  		} diff --git a/drivers/firewire/net.c b/drivers/firewire/net.c index 6b895986dc22..4af0a7bad7f2 100644 --- a/drivers/firewire/net.c +++ b/drivers/firewire/net.c @@ -929,8 +929,6 @@ static void fwnet_write_complete(struct fw_card *card, int rcode,  	if (rcode == RCODE_COMPLETE) {  		fwnet_transmit_packet_done(ptask);  	} else { -		fwnet_transmit_packet_failed(ptask); -  		if (printk_timed_ratelimit(&j,  1000) || rcode != last_rcode) {  			dev_err(&ptask->dev->netdev->dev,  				"fwnet_write_complete failed: %x (skipped %d)\n", @@ -938,8 +936,10 @@ static void fwnet_write_complete(struct fw_card *card, int rcode,  			errors_skipped = 0;  			last_rcode = rcode; -		} else +		} else {  			errors_skipped++; +		} +		fwnet_transmit_packet_failed(ptask);  	}  } diff --git a/drivers/firewire/ohci.c b/drivers/firewire/ohci.c index 6f74d8d3f700..8db663219560 100644 --- a/drivers/firewire/ohci.c +++ b/drivers/firewire/ohci.c @@ -290,7 +290,6 @@ static char ohci_driver_name[] = KBUILD_MODNAME;  #define QUIRK_NO_MSI			0x10  #define QUIRK_TI_SLLZ059		0x20  #define QUIRK_IR_WAKE			0x40 -#define QUIRK_PHY_LCTRL_TIMEOUT		0x80  /* In case of multiple matches in ohci_quirks[], only the first one is used. */  static const struct { @@ -303,10 +302,7 @@ static const struct {  		QUIRK_BE_HEADERS},  	{PCI_VENDOR_ID_ATT, PCI_DEVICE_ID_AGERE_FW643, 6, -		QUIRK_PHY_LCTRL_TIMEOUT | QUIRK_NO_MSI}, - -	{PCI_VENDOR_ID_ATT, PCI_ANY_ID, PCI_ANY_ID, -		QUIRK_PHY_LCTRL_TIMEOUT}, +		QUIRK_NO_MSI},  	{PCI_VENDOR_ID_CREATIVE, PCI_DEVICE_ID_CREATIVE_SB1394, PCI_ANY_ID,  		QUIRK_RESET_PACKET}, @@ -353,7 +349,6 @@ MODULE_PARM_DESC(quirks, "Chip quirks (default = 0"  	", disable MSI = "		__stringify(QUIRK_NO_MSI)  	", TI SLLZ059 erratum = "	__stringify(QUIRK_TI_SLLZ059)  	", IR wake unreliable = "	__stringify(QUIRK_IR_WAKE) -	", phy LCtrl timeout = "	__stringify(QUIRK_PHY_LCTRL_TIMEOUT)  	")");  #define OHCI_PARAM_DEBUG_AT_AR		1 @@ -2299,9 +2294,6 @@ static int ohci_enable(struct fw_card *card,  	 * TI TSB82AA2 + TSB81BA3(A) cards signal LPS enabled early but  	 * cannot actually use the phy at that time.  These need tens of  	 * millisecods pause between LPS write and first phy access too. -	 * -	 * But do not wait for 50msec on Agere/LSI cards.  Their phy -	 * arbitration state machine may time out during such a long wait.  	 */  	reg_write(ohci, OHCI1394_HCControlSet, @@ -2309,11 +2301,8 @@ static int ohci_enable(struct fw_card *card,  		  OHCI1394_HCControl_postedWriteEnable);  	flush_writes(ohci); -	if (!(ohci->quirks & QUIRK_PHY_LCTRL_TIMEOUT)) +	for (lps = 0, i = 0; !lps && i < 3; i++) {  		msleep(50); - -	for (lps = 0, i = 0; !lps && i < 150; i++) { -		msleep(1);  		lps = reg_read(ohci, OHCI1394_HCControlSet) &  		      OHCI1394_HCControl_LPS;  	} diff --git a/drivers/firewire/sbp2.c b/drivers/firewire/sbp2.c index 281029daf98c..7aef911fdc71 100644 --- a/drivers/firewire/sbp2.c +++ b/drivers/firewire/sbp2.c @@ -146,6 +146,7 @@ struct sbp2_logical_unit {  	 */  	int generation;  	int retries; +	work_func_t workfn;  	struct delayed_work work;  	bool has_sdev;  	bool blocked; @@ -864,7 +865,7 @@ static void sbp2_login(struct work_struct *work)  	/* set appropriate retry limit(s) in BUSY_TIMEOUT register */  	sbp2_set_busy_timeout(lu); -	PREPARE_DELAYED_WORK(&lu->work, sbp2_reconnect); +	lu->workfn = sbp2_reconnect;  	sbp2_agent_reset(lu);  	/* This was a re-login. */ @@ -918,7 +919,7 @@ static void sbp2_login(struct work_struct *work)  	 * If a bus reset happened, sbp2_update will have requeued  	 * lu->work already.  Reset the work from reconnect to login.  	 */ -	PREPARE_DELAYED_WORK(&lu->work, sbp2_login); +	lu->workfn = sbp2_login;  }  static void sbp2_reconnect(struct work_struct *work) @@ -952,7 +953,7 @@ static void sbp2_reconnect(struct work_struct *work)  		    lu->retries++ >= 5) {  			dev_err(tgt_dev(tgt), "failed to reconnect\n");  			lu->retries = 0; -			PREPARE_DELAYED_WORK(&lu->work, sbp2_login); +			lu->workfn = sbp2_login;  		}  		sbp2_queue_work(lu, DIV_ROUND_UP(HZ, 5)); @@ -972,6 +973,13 @@ static void sbp2_reconnect(struct work_struct *work)  	sbp2_conditionally_unblock(lu);  } +static void sbp2_lu_workfn(struct work_struct *work) +{ +	struct sbp2_logical_unit *lu = container_of(to_delayed_work(work), +						struct sbp2_logical_unit, work); +	lu->workfn(work); +} +  static int sbp2_add_logical_unit(struct sbp2_target *tgt, int lun_entry)  {  	struct sbp2_logical_unit *lu; @@ -998,7 +1006,8 @@ static int sbp2_add_logical_unit(struct sbp2_target *tgt, int lun_entry)  	lu->blocked  = false;  	++tgt->dont_block;  	INIT_LIST_HEAD(&lu->orb_list); -	INIT_DELAYED_WORK(&lu->work, sbp2_login); +	lu->workfn = sbp2_login; +	INIT_DELAYED_WORK(&lu->work, sbp2_lu_workfn);  	list_add_tail(&lu->link, &tgt->lu_list);  	return 0;  | 
