diff options
Diffstat (limited to 'drivers/firewire/core-iso.c')
| -rw-r--r-- | drivers/firewire/core-iso.c | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/drivers/firewire/core-iso.c b/drivers/firewire/core-iso.c index 166f19c6d38d..110e731f5574 100644 --- a/drivers/firewire/core-iso.c +++ b/drivers/firewire/core-iso.c | |||
| @@ -177,9 +177,8 @@ EXPORT_SYMBOL(fw_iso_context_stop); | |||
| 177 | */ | 177 | */ |
| 178 | 178 | ||
| 179 | static int manage_bandwidth(struct fw_card *card, int irm_id, int generation, | 179 | static int manage_bandwidth(struct fw_card *card, int irm_id, int generation, |
| 180 | int bandwidth, bool allocate) | 180 | int bandwidth, bool allocate, __be32 data[2]) |
| 181 | { | 181 | { |
| 182 | __be32 data[2]; | ||
| 183 | int try, new, old = allocate ? BANDWIDTH_AVAILABLE_INITIAL : 0; | 182 | int try, new, old = allocate ? BANDWIDTH_AVAILABLE_INITIAL : 0; |
| 184 | 183 | ||
| 185 | /* | 184 | /* |
| @@ -215,9 +214,9 @@ static int manage_bandwidth(struct fw_card *card, int irm_id, int generation, | |||
| 215 | } | 214 | } |
| 216 | 215 | ||
| 217 | static int manage_channel(struct fw_card *card, int irm_id, int generation, | 216 | static int manage_channel(struct fw_card *card, int irm_id, int generation, |
| 218 | u32 channels_mask, u64 offset, bool allocate) | 217 | u32 channels_mask, u64 offset, bool allocate, __be32 data[2]) |
| 219 | { | 218 | { |
| 220 | __be32 data[2], c, all, old; | 219 | __be32 c, all, old; |
| 221 | int i, retry = 5; | 220 | int i, retry = 5; |
| 222 | 221 | ||
| 223 | old = all = allocate ? cpu_to_be32(~0) : 0; | 222 | old = all = allocate ? cpu_to_be32(~0) : 0; |
| @@ -260,7 +259,7 @@ static int manage_channel(struct fw_card *card, int irm_id, int generation, | |||
| 260 | } | 259 | } |
| 261 | 260 | ||
| 262 | static void deallocate_channel(struct fw_card *card, int irm_id, | 261 | static void deallocate_channel(struct fw_card *card, int irm_id, |
| 263 | int generation, int channel) | 262 | int generation, int channel, __be32 buffer[2]) |
| 264 | { | 263 | { |
| 265 | u32 mask; | 264 | u32 mask; |
| 266 | u64 offset; | 265 | u64 offset; |
| @@ -269,7 +268,7 @@ static void deallocate_channel(struct fw_card *card, int irm_id, | |||
| 269 | offset = channel < 32 ? CSR_REGISTER_BASE + CSR_CHANNELS_AVAILABLE_HI : | 268 | offset = channel < 32 ? CSR_REGISTER_BASE + CSR_CHANNELS_AVAILABLE_HI : |
| 270 | CSR_REGISTER_BASE + CSR_CHANNELS_AVAILABLE_LO; | 269 | CSR_REGISTER_BASE + CSR_CHANNELS_AVAILABLE_LO; |
| 271 | 270 | ||
| 272 | manage_channel(card, irm_id, generation, mask, offset, false); | 271 | manage_channel(card, irm_id, generation, mask, offset, false, buffer); |
| 273 | } | 272 | } |
| 274 | 273 | ||
| 275 | /** | 274 | /** |
| @@ -298,7 +297,7 @@ static void deallocate_channel(struct fw_card *card, int irm_id, | |||
| 298 | */ | 297 | */ |
| 299 | void fw_iso_resource_manage(struct fw_card *card, int generation, | 298 | void fw_iso_resource_manage(struct fw_card *card, int generation, |
| 300 | u64 channels_mask, int *channel, int *bandwidth, | 299 | u64 channels_mask, int *channel, int *bandwidth, |
| 301 | bool allocate) | 300 | bool allocate, __be32 buffer[2]) |
| 302 | { | 301 | { |
| 303 | u32 channels_hi = channels_mask; /* channels 31...0 */ | 302 | u32 channels_hi = channels_mask; /* channels 31...0 */ |
| 304 | u32 channels_lo = channels_mask >> 32; /* channels 63...32 */ | 303 | u32 channels_lo = channels_mask >> 32; /* channels 63...32 */ |
| @@ -310,10 +309,12 @@ void fw_iso_resource_manage(struct fw_card *card, int generation, | |||
| 310 | 309 | ||
| 311 | if (channels_hi) | 310 | if (channels_hi) |
| 312 | c = manage_channel(card, irm_id, generation, channels_hi, | 311 | c = manage_channel(card, irm_id, generation, channels_hi, |
| 313 | CSR_REGISTER_BASE + CSR_CHANNELS_AVAILABLE_HI, allocate); | 312 | CSR_REGISTER_BASE + CSR_CHANNELS_AVAILABLE_HI, |
| 313 | allocate, buffer); | ||
| 314 | if (channels_lo && c < 0) { | 314 | if (channels_lo && c < 0) { |
| 315 | c = manage_channel(card, irm_id, generation, channels_lo, | 315 | c = manage_channel(card, irm_id, generation, channels_lo, |
| 316 | CSR_REGISTER_BASE + CSR_CHANNELS_AVAILABLE_LO, allocate); | 316 | CSR_REGISTER_BASE + CSR_CHANNELS_AVAILABLE_LO, |
| 317 | allocate, buffer); | ||
| 317 | if (c >= 0) | 318 | if (c >= 0) |
| 318 | c += 32; | 319 | c += 32; |
| 319 | } | 320 | } |
| @@ -325,12 +326,13 @@ void fw_iso_resource_manage(struct fw_card *card, int generation, | |||
| 325 | if (*bandwidth == 0) | 326 | if (*bandwidth == 0) |
| 326 | return; | 327 | return; |
| 327 | 328 | ||
| 328 | ret = manage_bandwidth(card, irm_id, generation, *bandwidth, allocate); | 329 | ret = manage_bandwidth(card, irm_id, generation, *bandwidth, |
| 330 | allocate, buffer); | ||
| 329 | if (ret < 0) | 331 | if (ret < 0) |
| 330 | *bandwidth = 0; | 332 | *bandwidth = 0; |
| 331 | 333 | ||
| 332 | if (allocate && ret < 0 && c >= 0) { | 334 | if (allocate && ret < 0 && c >= 0) { |
| 333 | deallocate_channel(card, irm_id, generation, c); | 335 | deallocate_channel(card, irm_id, generation, c, buffer); |
| 334 | *channel = ret; | 336 | *channel = ret; |
| 335 | } | 337 | } |
| 336 | } | 338 | } |
