diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-06-08 23:52:19 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-06-08 23:52:19 -0400 |
| commit | 84f7586edab93052bbe7eb72e1e9bce5f7b6ae45 (patch) | |
| tree | 4e76cabe691946dbc01bbc72c67a5ac0eac52038 | |
| parent | 8d86dc6a5bcd0f1d5b9364d43843f1bb4b15f57a (diff) | |
| parent | 10389536742cefbedecb67a5b2906f155cf3a1c3 (diff) | |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6:
firewire: core: check for 1394a compliant IRM, fix inaccessibility of Sony camcorder
| -rw-r--r-- | drivers/firewire/core-card.c | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/drivers/firewire/core-card.c b/drivers/firewire/core-card.c index 9dcb30466ec0..371713ff0266 100644 --- a/drivers/firewire/core-card.c +++ b/drivers/firewire/core-card.c | |||
| @@ -231,7 +231,7 @@ void fw_schedule_bm_work(struct fw_card *card, unsigned long delay) | |||
| 231 | static void fw_card_bm_work(struct work_struct *work) | 231 | static void fw_card_bm_work(struct work_struct *work) |
| 232 | { | 232 | { |
| 233 | struct fw_card *card = container_of(work, struct fw_card, work.work); | 233 | struct fw_card *card = container_of(work, struct fw_card, work.work); |
| 234 | struct fw_device *root_device; | 234 | struct fw_device *root_device, *irm_device; |
| 235 | struct fw_node *root_node; | 235 | struct fw_node *root_node; |
| 236 | unsigned long flags; | 236 | unsigned long flags; |
| 237 | int root_id, new_root_id, irm_id, local_id; | 237 | int root_id, new_root_id, irm_id, local_id; |
| @@ -239,6 +239,7 @@ static void fw_card_bm_work(struct work_struct *work) | |||
| 239 | bool do_reset = false; | 239 | bool do_reset = false; |
| 240 | bool root_device_is_running; | 240 | bool root_device_is_running; |
| 241 | bool root_device_is_cmc; | 241 | bool root_device_is_cmc; |
| 242 | bool irm_is_1394_1995_only; | ||
| 242 | 243 | ||
| 243 | spin_lock_irqsave(&card->lock, flags); | 244 | spin_lock_irqsave(&card->lock, flags); |
| 244 | 245 | ||
| @@ -248,12 +249,18 @@ static void fw_card_bm_work(struct work_struct *work) | |||
| 248 | } | 249 | } |
| 249 | 250 | ||
| 250 | generation = card->generation; | 251 | generation = card->generation; |
| 252 | |||
| 251 | root_node = card->root_node; | 253 | root_node = card->root_node; |
| 252 | fw_node_get(root_node); | 254 | fw_node_get(root_node); |
| 253 | root_device = root_node->data; | 255 | root_device = root_node->data; |
| 254 | root_device_is_running = root_device && | 256 | root_device_is_running = root_device && |
| 255 | atomic_read(&root_device->state) == FW_DEVICE_RUNNING; | 257 | atomic_read(&root_device->state) == FW_DEVICE_RUNNING; |
| 256 | root_device_is_cmc = root_device && root_device->cmc; | 258 | root_device_is_cmc = root_device && root_device->cmc; |
| 259 | |||
| 260 | irm_device = card->irm_node->data; | ||
| 261 | irm_is_1394_1995_only = irm_device && irm_device->config_rom && | ||
| 262 | (irm_device->config_rom[2] & 0x000000f0) == 0; | ||
| 263 | |||
| 257 | root_id = root_node->node_id; | 264 | root_id = root_node->node_id; |
| 258 | irm_id = card->irm_node->node_id; | 265 | irm_id = card->irm_node->node_id; |
| 259 | local_id = card->local_node->node_id; | 266 | local_id = card->local_node->node_id; |
| @@ -276,8 +283,15 @@ static void fw_card_bm_work(struct work_struct *work) | |||
| 276 | 283 | ||
| 277 | if (!card->irm_node->link_on) { | 284 | if (!card->irm_node->link_on) { |
| 278 | new_root_id = local_id; | 285 | new_root_id = local_id; |
| 279 | fw_notify("IRM has link off, making local node (%02x) root.\n", | 286 | fw_notify("%s, making local node (%02x) root.\n", |
| 280 | new_root_id); | 287 | "IRM has link off", new_root_id); |
| 288 | goto pick_me; | ||
| 289 | } | ||
| 290 | |||
| 291 | if (irm_is_1394_1995_only) { | ||
| 292 | new_root_id = local_id; | ||
| 293 | fw_notify("%s, making local node (%02x) root.\n", | ||
| 294 | "IRM is not 1394a compliant", new_root_id); | ||
| 281 | goto pick_me; | 295 | goto pick_me; |
| 282 | } | 296 | } |
| 283 | 297 | ||
| @@ -316,8 +330,8 @@ static void fw_card_bm_work(struct work_struct *work) | |||
| 316 | * root, and thus, IRM. | 330 | * root, and thus, IRM. |
| 317 | */ | 331 | */ |
| 318 | new_root_id = local_id; | 332 | new_root_id = local_id; |
| 319 | fw_notify("BM lock failed, making local node (%02x) root.\n", | 333 | fw_notify("%s, making local node (%02x) root.\n", |
| 320 | new_root_id); | 334 | "BM lock failed", new_root_id); |
| 321 | goto pick_me; | 335 | goto pick_me; |
| 322 | } | 336 | } |
| 323 | } else if (card->bm_generation != generation) { | 337 | } else if (card->bm_generation != generation) { |
