diff options
Diffstat (limited to 'drivers/firewire/fw-card.c')
-rw-r--r-- | drivers/firewire/fw-card.c | 105 |
1 files changed, 66 insertions, 39 deletions
diff --git a/drivers/firewire/fw-card.c b/drivers/firewire/fw-card.c index 216965615ee8..b2aa85555a7a 100644 --- a/drivers/firewire/fw-card.c +++ b/drivers/firewire/fw-card.c | |||
@@ -1,8 +1,5 @@ | |||
1 | /* -*- c-basic-offset: 8 -*- | 1 | /* |
2 | * | 2 | * Copyright (C) 2005-2007 Kristian Hoegsberg <krh@bitplanet.net> |
3 | * fw-card.c - card level functions | ||
4 | * | ||
5 | * Copyright (C) 2005-2006 Kristian Hoegsberg <krh@bitplanet.net> | ||
6 | * | 3 | * |
7 | * This program is free software; you can redistribute it and/or modify | 4 | * This program is free software; you can redistribute it and/or modify |
8 | * it under the terms of the GNU General Public License as published by | 5 | * it under the terms of the GNU General Public License as published by |
@@ -69,12 +66,14 @@ generate_config_rom (struct fw_card *card, size_t *config_rom_length) | |||
69 | static u32 config_rom[256]; | 66 | static u32 config_rom[256]; |
70 | int i, j, length; | 67 | int i, j, length; |
71 | 68 | ||
72 | /* Initialize contents of config rom buffer. On the OHCI | 69 | /* |
70 | * Initialize contents of config rom buffer. On the OHCI | ||
73 | * controller, block reads to the config rom accesses the host | 71 | * controller, block reads to the config rom accesses the host |
74 | * memory, but quadlet read access the hardware bus info block | 72 | * memory, but quadlet read access the hardware bus info block |
75 | * registers. That's just crack, but it means we should make | 73 | * registers. That's just crack, but it means we should make |
76 | * sure the contents of bus info block in host memory mathces | 74 | * sure the contents of bus info block in host memory mathces |
77 | * the version stored in the OHCI registers. */ | 75 | * the version stored in the OHCI registers. |
76 | */ | ||
78 | 77 | ||
79 | memset(config_rom, 0, sizeof config_rom); | 78 | memset(config_rom, 0, sizeof config_rom); |
80 | config_rom[0] = bib_crc_length(4) | bib_info_length(4) | bib_crc(0); | 79 | config_rom[0] = bib_crc_length(4) | bib_info_length(4) | bib_crc(0); |
@@ -143,9 +142,11 @@ fw_core_add_descriptor (struct fw_descriptor *desc) | |||
143 | { | 142 | { |
144 | size_t i; | 143 | size_t i; |
145 | 144 | ||
146 | /* Check descriptor is valid; the length of all blocks in the | 145 | /* |
146 | * Check descriptor is valid; the length of all blocks in the | ||
147 | * descriptor has to add up to exactly the length of the | 147 | * descriptor has to add up to exactly the length of the |
148 | * block. */ | 148 | * block. |
149 | */ | ||
149 | i = 0; | 150 | i = 0; |
150 | while (i < desc->length) | 151 | while (i < desc->length) |
151 | i += (desc->data[i] >> 16) + 1; | 152 | i += (desc->data[i] >> 16) + 1; |
@@ -228,7 +229,8 @@ fw_card_bm_work(struct work_struct *work) | |||
228 | 229 | ||
229 | if (card->bm_generation + 1 == generation || | 230 | if (card->bm_generation + 1 == generation || |
230 | (card->bm_generation != generation && grace)) { | 231 | (card->bm_generation != generation && grace)) { |
231 | /* This first step is to figure out who is IRM and | 232 | /* |
233 | * This first step is to figure out who is IRM and | ||
232 | * then try to become bus manager. If the IRM is not | 234 | * then try to become bus manager. If the IRM is not |
233 | * well defined (e.g. does not have an active link | 235 | * well defined (e.g. does not have an active link |
234 | * layer or does not responds to our lock request, we | 236 | * layer or does not responds to our lock request, we |
@@ -236,7 +238,8 @@ fw_card_bm_work(struct work_struct *work) | |||
236 | * In that case, we do a goto into the gap count logic | 238 | * In that case, we do a goto into the gap count logic |
237 | * so that when we do the reset, we still optimize the | 239 | * so that when we do the reset, we still optimize the |
238 | * gap count. That could well save a reset in the | 240 | * gap count. That could well save a reset in the |
239 | * next generation. */ | 241 | * next generation. |
242 | */ | ||
240 | 243 | ||
241 | irm_id = card->irm_node->node_id; | 244 | irm_id = card->irm_node->node_id; |
242 | if (!card->irm_node->link_on) { | 245 | if (!card->irm_node->link_on) { |
@@ -260,8 +263,10 @@ fw_card_bm_work(struct work_struct *work) | |||
260 | wait_for_completion(&bmd.done); | 263 | wait_for_completion(&bmd.done); |
261 | 264 | ||
262 | if (bmd.rcode == RCODE_GENERATION) { | 265 | if (bmd.rcode == RCODE_GENERATION) { |
263 | /* Another bus reset happened. Just return, | 266 | /* |
264 | * the BM work has been rescheduled. */ | 267 | * Another bus reset happened. Just return, |
268 | * the BM work has been rescheduled. | ||
269 | */ | ||
265 | return; | 270 | return; |
266 | } | 271 | } |
267 | 272 | ||
@@ -271,48 +276,62 @@ fw_card_bm_work(struct work_struct *work) | |||
271 | 276 | ||
272 | spin_lock_irqsave(&card->lock, flags); | 277 | spin_lock_irqsave(&card->lock, flags); |
273 | if (bmd.rcode != RCODE_COMPLETE) { | 278 | if (bmd.rcode != RCODE_COMPLETE) { |
274 | /* The lock request failed, maybe the IRM | 279 | /* |
280 | * The lock request failed, maybe the IRM | ||
275 | * isn't really IRM capable after all. Let's | 281 | * isn't really IRM capable after all. Let's |
276 | * do a bus reset and pick the local node as | 282 | * do a bus reset and pick the local node as |
277 | * root, and thus, IRM. */ | 283 | * root, and thus, IRM. |
284 | */ | ||
278 | new_root_id = card->local_node->node_id; | 285 | new_root_id = card->local_node->node_id; |
279 | fw_notify("BM lock failed, making local node (%02x) root.\n", | 286 | fw_notify("BM lock failed, making local node (%02x) root.\n", |
280 | new_root_id); | 287 | new_root_id); |
281 | goto pick_me; | 288 | goto pick_me; |
282 | } | 289 | } |
283 | } else if (card->bm_generation != generation) { | 290 | } else if (card->bm_generation != generation) { |
284 | /* OK, we weren't BM in the last generation, and it's | 291 | /* |
292 | * OK, we weren't BM in the last generation, and it's | ||
285 | * less than 100ms since last bus reset. Reschedule | 293 | * less than 100ms since last bus reset. Reschedule |
286 | * this task 100ms from now. */ | 294 | * this task 100ms from now. |
295 | */ | ||
287 | spin_unlock_irqrestore(&card->lock, flags); | 296 | spin_unlock_irqrestore(&card->lock, flags); |
288 | schedule_delayed_work(&card->work, DIV_ROUND_UP(HZ, 10)); | 297 | schedule_delayed_work(&card->work, DIV_ROUND_UP(HZ, 10)); |
289 | return; | 298 | return; |
290 | } | 299 | } |
291 | 300 | ||
292 | /* We're bus manager for this generation, so next step is to | 301 | /* |
302 | * We're bus manager for this generation, so next step is to | ||
293 | * make sure we have an active cycle master and do gap count | 303 | * make sure we have an active cycle master and do gap count |
294 | * optimization. */ | 304 | * optimization. |
305 | */ | ||
295 | card->bm_generation = generation; | 306 | card->bm_generation = generation; |
296 | 307 | ||
297 | if (root == NULL) { | 308 | if (root == NULL) { |
298 | /* Either link_on is false, or we failed to read the | 309 | /* |
299 | * config rom. In either case, pick another root. */ | 310 | * Either link_on is false, or we failed to read the |
311 | * config rom. In either case, pick another root. | ||
312 | */ | ||
300 | new_root_id = card->local_node->node_id; | 313 | new_root_id = card->local_node->node_id; |
301 | } else if (atomic_read(&root->state) != FW_DEVICE_RUNNING) { | 314 | } else if (atomic_read(&root->state) != FW_DEVICE_RUNNING) { |
302 | /* If we haven't probed this device yet, bail out now | 315 | /* |
303 | * and let's try again once that's done. */ | 316 | * If we haven't probed this device yet, bail out now |
317 | * and let's try again once that's done. | ||
318 | */ | ||
304 | spin_unlock_irqrestore(&card->lock, flags); | 319 | spin_unlock_irqrestore(&card->lock, flags); |
305 | return; | 320 | return; |
306 | } else if (root->config_rom[2] & bib_cmc) { | 321 | } else if (root->config_rom[2] & bib_cmc) { |
307 | /* FIXME: I suppose we should set the cmstr bit in the | 322 | /* |
323 | * FIXME: I suppose we should set the cmstr bit in the | ||
308 | * STATE_CLEAR register of this node, as described in | 324 | * STATE_CLEAR register of this node, as described in |
309 | * 1394-1995, 8.4.2.6. Also, send out a force root | 325 | * 1394-1995, 8.4.2.6. Also, send out a force root |
310 | * packet for this node. */ | 326 | * packet for this node. |
327 | */ | ||
311 | new_root_id = root_id; | 328 | new_root_id = root_id; |
312 | } else { | 329 | } else { |
313 | /* Current root has an active link layer and we | 330 | /* |
331 | * Current root has an active link layer and we | ||
314 | * successfully read the config rom, but it's not | 332 | * successfully read the config rom, but it's not |
315 | * cycle master capable. */ | 333 | * cycle master capable. |
334 | */ | ||
316 | new_root_id = card->local_node->node_id; | 335 | new_root_id = card->local_node->node_id; |
317 | } | 336 | } |
318 | 337 | ||
@@ -324,9 +343,11 @@ fw_card_bm_work(struct work_struct *work) | |||
324 | else | 343 | else |
325 | gap_count = 63; | 344 | gap_count = 63; |
326 | 345 | ||
327 | /* Finally, figure out if we should do a reset or not. If we've | 346 | /* |
347 | * Finally, figure out if we should do a reset or not. If we've | ||
328 | * done less that 5 resets with the same physical topology and we | 348 | * done less that 5 resets with the same physical topology and we |
329 | * have either a new root or a new gap count setting, let's do it. */ | 349 | * have either a new root or a new gap count setting, let's do it. |
350 | */ | ||
330 | 351 | ||
331 | if (card->bm_retries++ < 5 && | 352 | if (card->bm_retries++ < 5 && |
332 | (card->gap_count != gap_count || new_root_id != root_id)) | 353 | (card->gap_count != gap_count || new_root_id != root_id)) |
@@ -391,8 +412,10 @@ fw_card_add(struct fw_card *card, | |||
391 | PHY_LINK_ACTIVE | PHY_CONTENDER) < 0) | 412 | PHY_LINK_ACTIVE | PHY_CONTENDER) < 0) |
392 | return -EIO; | 413 | return -EIO; |
393 | 414 | ||
394 | /* The subsystem grabs a reference when the card is added and | 415 | /* |
395 | * drops it when the driver calls fw_core_remove_card. */ | 416 | * The subsystem grabs a reference when the card is added and |
417 | * drops it when the driver calls fw_core_remove_card. | ||
418 | */ | ||
396 | fw_card_get(card); | 419 | fw_card_get(card); |
397 | 420 | ||
398 | down_write(&card_rwsem); | 421 | down_write(&card_rwsem); |
@@ -405,11 +428,13 @@ fw_card_add(struct fw_card *card, | |||
405 | EXPORT_SYMBOL(fw_card_add); | 428 | EXPORT_SYMBOL(fw_card_add); |
406 | 429 | ||
407 | 430 | ||
408 | /* The next few functions implements a dummy driver that use once a | 431 | /* |
432 | * The next few functions implements a dummy driver that use once a | ||
409 | * card driver shuts down an fw_card. This allows the driver to | 433 | * card driver shuts down an fw_card. This allows the driver to |
410 | * cleanly unload, as all IO to the card will be handled by the dummy | 434 | * cleanly unload, as all IO to the card will be handled by the dummy |
411 | * driver instead of calling into the (possibly) unloaded module. The | 435 | * driver instead of calling into the (possibly) unloaded module. The |
412 | * dummy driver just fails all IO. */ | 436 | * dummy driver just fails all IO. |
437 | */ | ||
413 | 438 | ||
414 | static int | 439 | static int |
415 | dummy_enable(struct fw_card *card, u32 *config_rom, size_t length) | 440 | dummy_enable(struct fw_card *card, u32 *config_rom, size_t length) |
@@ -429,8 +454,10 @@ static int | |||
429 | dummy_set_config_rom(struct fw_card *card, | 454 | dummy_set_config_rom(struct fw_card *card, |
430 | u32 *config_rom, size_t length) | 455 | u32 *config_rom, size_t length) |
431 | { | 456 | { |
432 | /* We take the card out of card_list before setting the dummy | 457 | /* |
433 | * driver, so this should never get called. */ | 458 | * We take the card out of card_list before setting the dummy |
459 | * driver, so this should never get called. | ||
460 | */ | ||
434 | BUG(); | 461 | BUG(); |
435 | return -1; | 462 | return -1; |
436 | } | 463 | } |
@@ -510,9 +537,11 @@ release_card(struct kref *kref) | |||
510 | kfree(card); | 537 | kfree(card); |
511 | } | 538 | } |
512 | 539 | ||
513 | /* An assumption for fw_card_put() is that the card driver allocates | 540 | /* |
541 | * An assumption for fw_card_put() is that the card driver allocates | ||
514 | * the fw_card struct with kalloc and that it has been shut down | 542 | * the fw_card struct with kalloc and that it has been shut down |
515 | * before the last ref is dropped. */ | 543 | * before the last ref is dropped. |
544 | */ | ||
516 | void | 545 | void |
517 | fw_card_put(struct fw_card *card) | 546 | fw_card_put(struct fw_card *card) |
518 | { | 547 | { |
@@ -524,8 +553,6 @@ int | |||
524 | fw_core_initiate_bus_reset(struct fw_card *card, int short_reset) | 553 | fw_core_initiate_bus_reset(struct fw_card *card, int short_reset) |
525 | { | 554 | { |
526 | int reg = short_reset ? 5 : 1; | 555 | int reg = short_reset ? 5 : 1; |
527 | /* The following values happen to be the same bit. However be | ||
528 | * explicit for clarity. */ | ||
529 | int bit = short_reset ? PHY_BUS_SHORT_RESET : PHY_BUS_RESET; | 556 | int bit = short_reset ? PHY_BUS_SHORT_RESET : PHY_BUS_RESET; |
530 | 557 | ||
531 | return card->driver->update_phy_reg(card, reg, 0, bit); | 558 | return card->driver->update_phy_reg(card, reg, 0, bit); |