diff options
Diffstat (limited to 'drivers/firewire/core-iso.c')
| -rw-r--r-- | drivers/firewire/core-iso.c | 20 | 
1 files changed, 14 insertions, 6 deletions
diff --git a/drivers/firewire/core-iso.c b/drivers/firewire/core-iso.c index 1c0b504a42f..8f5aebfb29d 100644 --- a/drivers/firewire/core-iso.c +++ b/drivers/firewire/core-iso.c @@ -26,6 +26,7 @@  #include <linux/firewire-constants.h>  #include <linux/kernel.h>  #include <linux/mm.h> +#include <linux/slab.h>  #include <linux/spinlock.h>  #include <linux/vmalloc.h> @@ -189,7 +190,7 @@ static int manage_bandwidth(struct fw_card *card, int irm_id, int generation,  	for (try = 0; try < 5; try++) {  		new = allocate ? old - bandwidth : old + bandwidth;  		if (new < 0 || new > BANDWIDTH_AVAILABLE_INITIAL) -			break; +			return -EBUSY;  		data[0] = cpu_to_be32(old);  		data[1] = cpu_to_be32(new); @@ -217,7 +218,7 @@ static int manage_channel(struct fw_card *card, int irm_id, int generation,  		u32 channels_mask, u64 offset, bool allocate, __be32 data[2])  {  	__be32 c, all, old; -	int i, retry = 5; +	int i, ret = -EIO, retry = 5;  	old = all = allocate ? cpu_to_be32(~0) : 0; @@ -225,6 +226,8 @@ static int manage_channel(struct fw_card *card, int irm_id, int generation,  		if (!(channels_mask & 1 << i))  			continue; +		ret = -EBUSY; +  		c = cpu_to_be32(1 << (31 - i));  		if ((old & c) != (all & c))  			continue; @@ -250,12 +253,16 @@ static int manage_channel(struct fw_card *card, int irm_id, int generation,  			/* 1394-1995 IRM, fall through to retry. */  		default: -			if (retry--) +			if (retry) { +				retry--;  				i--; +			} else { +				ret = -EIO; +			}  		}  	} -	return -EIO; +	return ret;  }  static void deallocate_channel(struct fw_card *card, int irm_id, @@ -331,8 +338,9 @@ void fw_iso_resource_manage(struct fw_card *card, int generation,  	if (ret < 0)  		*bandwidth = 0; -	if (allocate && ret < 0 && c >= 0) { -		deallocate_channel(card, irm_id, generation, c, buffer); +	if (allocate && ret < 0) { +		if (c >= 0) +			deallocate_channel(card, irm_id, generation, c, buffer);  		*channel = ret;  	}  }  |