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 /drivers | |
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
Diffstat (limited to 'drivers')
-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) { |