[Blackfin] arch: scrub dead alive/idle LED code
[linux-2.6] / drivers / firewire / fw-device.c
1 /*
2  * Device probing and sysfs code.
3  *
4  * Copyright (C) 2005-2006  Kristian Hoegsberg <krh@bitplanet.net>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19  */
20
21 #include <linux/module.h>
22 #include <linux/wait.h>
23 #include <linux/errno.h>
24 #include <linux/kthread.h>
25 #include <linux/device.h>
26 #include <linux/delay.h>
27 #include <linux/idr.h>
28 #include <linux/rwsem.h>
29 #include <asm/semaphore.h>
30 #include <linux/ctype.h>
31 #include "fw-transaction.h"
32 #include "fw-topology.h"
33 #include "fw-device.h"
34
35 void fw_csr_iterator_init(struct fw_csr_iterator *ci, u32 * p)
36 {
37         ci->p = p + 1;
38         ci->end = ci->p + (p[0] >> 16);
39 }
40 EXPORT_SYMBOL(fw_csr_iterator_init);
41
42 int fw_csr_iterator_next(struct fw_csr_iterator *ci, int *key, int *value)
43 {
44         *key = *ci->p >> 24;
45         *value = *ci->p & 0xffffff;
46
47         return ci->p++ < ci->end;
48 }
49 EXPORT_SYMBOL(fw_csr_iterator_next);
50
51 static int is_fw_unit(struct device *dev);
52
53 static int match_unit_directory(u32 * directory, const struct fw_device_id *id)
54 {
55         struct fw_csr_iterator ci;
56         int key, value, match;
57
58         match = 0;
59         fw_csr_iterator_init(&ci, directory);
60         while (fw_csr_iterator_next(&ci, &key, &value)) {
61                 if (key == CSR_VENDOR && value == id->vendor)
62                         match |= FW_MATCH_VENDOR;
63                 if (key == CSR_MODEL && value == id->model)
64                         match |= FW_MATCH_MODEL;
65                 if (key == CSR_SPECIFIER_ID && value == id->specifier_id)
66                         match |= FW_MATCH_SPECIFIER_ID;
67                 if (key == CSR_VERSION && value == id->version)
68                         match |= FW_MATCH_VERSION;
69         }
70
71         return (match & id->match_flags) == id->match_flags;
72 }
73
74 static int fw_unit_match(struct device *dev, struct device_driver *drv)
75 {
76         struct fw_unit *unit = fw_unit(dev);
77         struct fw_driver *driver = fw_driver(drv);
78         int i;
79
80         /* We only allow binding to fw_units. */
81         if (!is_fw_unit(dev))
82                 return 0;
83
84         for (i = 0; driver->id_table[i].match_flags != 0; i++) {
85                 if (match_unit_directory(unit->directory, &driver->id_table[i]))
86                         return 1;
87         }
88
89         return 0;
90 }
91
92 static int get_modalias(struct fw_unit *unit, char *buffer, size_t buffer_size)
93 {
94         struct fw_device *device = fw_device(unit->device.parent);
95         struct fw_csr_iterator ci;
96
97         int key, value;
98         int vendor = 0;
99         int model = 0;
100         int specifier_id = 0;
101         int version = 0;
102
103         fw_csr_iterator_init(&ci, &device->config_rom[5]);
104         while (fw_csr_iterator_next(&ci, &key, &value)) {
105                 switch (key) {
106                 case CSR_VENDOR:
107                         vendor = value;
108                         break;
109                 case CSR_MODEL:
110                         model = value;
111                         break;
112                 }
113         }
114
115         fw_csr_iterator_init(&ci, unit->directory);
116         while (fw_csr_iterator_next(&ci, &key, &value)) {
117                 switch (key) {
118                 case CSR_SPECIFIER_ID:
119                         specifier_id = value;
120                         break;
121                 case CSR_VERSION:
122                         version = value;
123                         break;
124                 }
125         }
126
127         return snprintf(buffer, buffer_size,
128                         "ieee1394:ven%08Xmo%08Xsp%08Xver%08X",
129                         vendor, model, specifier_id, version);
130 }
131
132 static int
133 fw_unit_uevent(struct device *dev, struct kobj_uevent_env *env)
134 {
135         struct fw_unit *unit = fw_unit(dev);
136         char modalias[64];
137
138         get_modalias(unit, modalias, sizeof(modalias));
139
140         if (add_uevent_var(env, "MODALIAS=%s", modalias))
141                 return -ENOMEM;
142
143         return 0;
144 }
145
146 struct bus_type fw_bus_type = {
147         .name = "firewire",
148         .match = fw_unit_match,
149 };
150 EXPORT_SYMBOL(fw_bus_type);
151
152 struct fw_device *fw_device_get(struct fw_device *device)
153 {
154         get_device(&device->device);
155
156         return device;
157 }
158
159 void fw_device_put(struct fw_device *device)
160 {
161         put_device(&device->device);
162 }
163
164 static void fw_device_release(struct device *dev)
165 {
166         struct fw_device *device = fw_device(dev);
167         unsigned long flags;
168
169         /*
170          * Take the card lock so we don't set this to NULL while a
171          * FW_NODE_UPDATED callback is being handled.
172          */
173         spin_lock_irqsave(&device->card->lock, flags);
174         device->node->data = NULL;
175         spin_unlock_irqrestore(&device->card->lock, flags);
176
177         fw_node_put(device->node);
178         fw_card_put(device->card);
179         kfree(device->config_rom);
180         kfree(device);
181 }
182
183 int fw_device_enable_phys_dma(struct fw_device *device)
184 {
185         return device->card->driver->enable_phys_dma(device->card,
186                                                      device->node_id,
187                                                      device->generation);
188 }
189 EXPORT_SYMBOL(fw_device_enable_phys_dma);
190
191 struct config_rom_attribute {
192         struct device_attribute attr;
193         u32 key;
194 };
195
196 static ssize_t
197 show_immediate(struct device *dev, struct device_attribute *dattr, char *buf)
198 {
199         struct config_rom_attribute *attr =
200                 container_of(dattr, struct config_rom_attribute, attr);
201         struct fw_csr_iterator ci;
202         u32 *dir;
203         int key, value;
204
205         if (is_fw_unit(dev))
206                 dir = fw_unit(dev)->directory;
207         else
208                 dir = fw_device(dev)->config_rom + 5;
209
210         fw_csr_iterator_init(&ci, dir);
211         while (fw_csr_iterator_next(&ci, &key, &value))
212                 if (attr->key == key)
213                         return snprintf(buf, buf ? PAGE_SIZE : 0,
214                                         "0x%06x\n", value);
215
216         return -ENOENT;
217 }
218
219 #define IMMEDIATE_ATTR(name, key)                               \
220         { __ATTR(name, S_IRUGO, show_immediate, NULL), key }
221
222 static ssize_t
223 show_text_leaf(struct device *dev, struct device_attribute *dattr, char *buf)
224 {
225         struct config_rom_attribute *attr =
226                 container_of(dattr, struct config_rom_attribute, attr);
227         struct fw_csr_iterator ci;
228         u32 *dir, *block = NULL, *p, *end;
229         int length, key, value, last_key = 0;
230         char *b;
231
232         if (is_fw_unit(dev))
233                 dir = fw_unit(dev)->directory;
234         else
235                 dir = fw_device(dev)->config_rom + 5;
236
237         fw_csr_iterator_init(&ci, dir);
238         while (fw_csr_iterator_next(&ci, &key, &value)) {
239                 if (attr->key == last_key &&
240                     key == (CSR_DESCRIPTOR | CSR_LEAF))
241                         block = ci.p - 1 + value;
242                 last_key = key;
243         }
244
245         if (block == NULL)
246                 return -ENOENT;
247
248         length = min(block[0] >> 16, 256U);
249         if (length < 3)
250                 return -ENOENT;
251
252         if (block[1] != 0 || block[2] != 0)
253                 /* Unknown encoding. */
254                 return -ENOENT;
255
256         if (buf == NULL)
257                 return length * 4;
258
259         b = buf;
260         end = &block[length + 1];
261         for (p = &block[3]; p < end; p++, b += 4)
262                 * (u32 *) b = (__force u32) __cpu_to_be32(*p);
263
264         /* Strip trailing whitespace and add newline. */
265         while (b--, (isspace(*b) || *b == '\0') && b > buf);
266         strcpy(b + 1, "\n");
267
268         return b + 2 - buf;
269 }
270
271 #define TEXT_LEAF_ATTR(name, key)                               \
272         { __ATTR(name, S_IRUGO, show_text_leaf, NULL), key }
273
274 static struct config_rom_attribute config_rom_attributes[] = {
275         IMMEDIATE_ATTR(vendor, CSR_VENDOR),
276         IMMEDIATE_ATTR(hardware_version, CSR_HARDWARE_VERSION),
277         IMMEDIATE_ATTR(specifier_id, CSR_SPECIFIER_ID),
278         IMMEDIATE_ATTR(version, CSR_VERSION),
279         IMMEDIATE_ATTR(model, CSR_MODEL),
280         TEXT_LEAF_ATTR(vendor_name, CSR_VENDOR),
281         TEXT_LEAF_ATTR(model_name, CSR_MODEL),
282         TEXT_LEAF_ATTR(hardware_version_name, CSR_HARDWARE_VERSION),
283 };
284
285 static void
286 init_fw_attribute_group(struct device *dev,
287                         struct device_attribute *attrs,
288                         struct fw_attribute_group *group)
289 {
290         struct device_attribute *attr;
291         int i, j;
292
293         for (j = 0; attrs[j].attr.name != NULL; j++)
294                 group->attrs[j] = &attrs[j].attr;
295
296         for (i = 0; i < ARRAY_SIZE(config_rom_attributes); i++) {
297                 attr = &config_rom_attributes[i].attr;
298                 if (attr->show(dev, attr, NULL) < 0)
299                         continue;
300                 group->attrs[j++] = &attr->attr;
301         }
302
303         BUG_ON(j >= ARRAY_SIZE(group->attrs));
304         group->attrs[j++] = NULL;
305         group->groups[0] = &group->group;
306         group->groups[1] = NULL;
307         group->group.attrs = group->attrs;
308         dev->groups = group->groups;
309 }
310
311 static ssize_t
312 modalias_show(struct device *dev,
313               struct device_attribute *attr, char *buf)
314 {
315         struct fw_unit *unit = fw_unit(dev);
316         int length;
317
318         length = get_modalias(unit, buf, PAGE_SIZE);
319         strcpy(buf + length, "\n");
320
321         return length + 1;
322 }
323
324 static ssize_t
325 rom_index_show(struct device *dev,
326                struct device_attribute *attr, char *buf)
327 {
328         struct fw_device *device = fw_device(dev->parent);
329         struct fw_unit *unit = fw_unit(dev);
330
331         return snprintf(buf, PAGE_SIZE, "%d\n",
332                         (int)(unit->directory - device->config_rom));
333 }
334
335 static struct device_attribute fw_unit_attributes[] = {
336         __ATTR_RO(modalias),
337         __ATTR_RO(rom_index),
338         __ATTR_NULL,
339 };
340
341 static ssize_t
342 config_rom_show(struct device *dev, struct device_attribute *attr, char *buf)
343 {
344         struct fw_device *device = fw_device(dev);
345
346         memcpy(buf, device->config_rom, device->config_rom_length * 4);
347
348         return device->config_rom_length * 4;
349 }
350
351 static ssize_t
352 guid_show(struct device *dev, struct device_attribute *attr, char *buf)
353 {
354         struct fw_device *device = fw_device(dev);
355         u64 guid;
356
357         guid = ((u64)device->config_rom[3] << 32) | device->config_rom[4];
358
359         return snprintf(buf, PAGE_SIZE, "0x%016llx\n",
360                         (unsigned long long)guid);
361 }
362
363 static struct device_attribute fw_device_attributes[] = {
364         __ATTR_RO(config_rom),
365         __ATTR_RO(guid),
366         __ATTR_NULL,
367 };
368
369 struct read_quadlet_callback_data {
370         struct completion done;
371         int rcode;
372         u32 data;
373 };
374
375 static void
376 complete_transaction(struct fw_card *card, int rcode,
377                      void *payload, size_t length, void *data)
378 {
379         struct read_quadlet_callback_data *callback_data = data;
380
381         if (rcode == RCODE_COMPLETE)
382                 callback_data->data = be32_to_cpu(*(__be32 *)payload);
383         callback_data->rcode = rcode;
384         complete(&callback_data->done);
385 }
386
387 static int read_rom(struct fw_device *device, int index, u32 * data)
388 {
389         struct read_quadlet_callback_data callback_data;
390         struct fw_transaction t;
391         u64 offset;
392
393         init_completion(&callback_data.done);
394
395         offset = 0xfffff0000400ULL + index * 4;
396         fw_send_request(device->card, &t, TCODE_READ_QUADLET_REQUEST,
397                         device->node_id, device->generation, device->max_speed,
398                         offset, NULL, 4, complete_transaction, &callback_data);
399
400         wait_for_completion(&callback_data.done);
401
402         *data = callback_data.data;
403
404         return callback_data.rcode;
405 }
406
407 static int read_bus_info_block(struct fw_device *device)
408 {
409         static u32 rom[256];
410         u32 stack[16], sp, key;
411         int i, end, length;
412
413         device->max_speed = SCODE_100;
414
415         /* First read the bus info block. */
416         for (i = 0; i < 5; i++) {
417                 if (read_rom(device, i, &rom[i]) != RCODE_COMPLETE)
418                         return -1;
419                 /*
420                  * As per IEEE1212 7.2, during power-up, devices can
421                  * reply with a 0 for the first quadlet of the config
422                  * rom to indicate that they are booting (for example,
423                  * if the firmware is on the disk of a external
424                  * harddisk).  In that case we just fail, and the
425                  * retry mechanism will try again later.
426                  */
427                 if (i == 0 && rom[i] == 0)
428                         return -1;
429         }
430
431         device->max_speed = device->node->max_speed;
432
433         /*
434          * Determine the speed of
435          *   - devices with link speed less than PHY speed,
436          *   - devices with 1394b PHY (unless only connected to 1394a PHYs),
437          *   - all devices if there are 1394b repeaters.
438          * Note, we cannot use the bus info block's link_spd as starting point
439          * because some buggy firmwares set it lower than necessary and because
440          * 1394-1995 nodes do not have the field.
441          */
442         if ((rom[2] & 0x7) < device->max_speed ||
443             device->max_speed == SCODE_BETA ||
444             device->card->beta_repeaters_present) {
445                 u32 dummy;
446
447                 /* for S1600 and S3200 */
448                 if (device->max_speed == SCODE_BETA)
449                         device->max_speed = device->card->link_speed;
450
451                 while (device->max_speed > SCODE_100) {
452                         if (read_rom(device, 0, &dummy) == RCODE_COMPLETE)
453                                 break;
454                         device->max_speed--;
455                 }
456         }
457
458         /*
459          * Now parse the config rom.  The config rom is a recursive
460          * directory structure so we parse it using a stack of
461          * references to the blocks that make up the structure.  We
462          * push a reference to the root directory on the stack to
463          * start things off.
464          */
465         length = i;
466         sp = 0;
467         stack[sp++] = 0xc0000005;
468         while (sp > 0) {
469                 /*
470                  * Pop the next block reference of the stack.  The
471                  * lower 24 bits is the offset into the config rom,
472                  * the upper 8 bits are the type of the reference the
473                  * block.
474                  */
475                 key = stack[--sp];
476                 i = key & 0xffffff;
477                 if (i >= ARRAY_SIZE(rom))
478                         /*
479                          * The reference points outside the standard
480                          * config rom area, something's fishy.
481                          */
482                         return -1;
483
484                 /* Read header quadlet for the block to get the length. */
485                 if (read_rom(device, i, &rom[i]) != RCODE_COMPLETE)
486                         return -1;
487                 end = i + (rom[i] >> 16) + 1;
488                 i++;
489                 if (end > ARRAY_SIZE(rom))
490                         /*
491                          * This block extends outside standard config
492                          * area (and the array we're reading it
493                          * into).  That's broken, so ignore this
494                          * device.
495                          */
496                         return -1;
497
498                 /*
499                  * Now read in the block.  If this is a directory
500                  * block, check the entries as we read them to see if
501                  * it references another block, and push it in that case.
502                  */
503                 while (i < end) {
504                         if (read_rom(device, i, &rom[i]) != RCODE_COMPLETE)
505                                 return -1;
506                         if ((key >> 30) == 3 && (rom[i] >> 30) > 1 &&
507                             sp < ARRAY_SIZE(stack))
508                                 stack[sp++] = i + rom[i];
509                         i++;
510                 }
511                 if (length < i)
512                         length = i;
513         }
514
515         device->config_rom = kmalloc(length * 4, GFP_KERNEL);
516         if (device->config_rom == NULL)
517                 return -1;
518         memcpy(device->config_rom, rom, length * 4);
519         device->config_rom_length = length;
520
521         return 0;
522 }
523
524 static void fw_unit_release(struct device *dev)
525 {
526         struct fw_unit *unit = fw_unit(dev);
527
528         kfree(unit);
529 }
530
531 static struct device_type fw_unit_type = {
532         .uevent         = fw_unit_uevent,
533         .release        = fw_unit_release,
534 };
535
536 static int is_fw_unit(struct device *dev)
537 {
538         return dev->type == &fw_unit_type;
539 }
540
541 static void create_units(struct fw_device *device)
542 {
543         struct fw_csr_iterator ci;
544         struct fw_unit *unit;
545         int key, value, i;
546
547         i = 0;
548         fw_csr_iterator_init(&ci, &device->config_rom[5]);
549         while (fw_csr_iterator_next(&ci, &key, &value)) {
550                 if (key != (CSR_UNIT | CSR_DIRECTORY))
551                         continue;
552
553                 /*
554                  * Get the address of the unit directory and try to
555                  * match the drivers id_tables against it.
556                  */
557                 unit = kzalloc(sizeof(*unit), GFP_KERNEL);
558                 if (unit == NULL) {
559                         fw_error("failed to allocate memory for unit\n");
560                         continue;
561                 }
562
563                 unit->directory = ci.p + value - 1;
564                 unit->device.bus = &fw_bus_type;
565                 unit->device.type = &fw_unit_type;
566                 unit->device.parent = &device->device;
567                 snprintf(unit->device.bus_id, sizeof(unit->device.bus_id),
568                          "%s.%d", device->device.bus_id, i++);
569
570                 init_fw_attribute_group(&unit->device,
571                                         fw_unit_attributes,
572                                         &unit->attribute_group);
573                 if (device_register(&unit->device) < 0)
574                         goto skip_unit;
575
576                 continue;
577
578         skip_unit:
579                 kfree(unit);
580         }
581 }
582
583 static int shutdown_unit(struct device *device, void *data)
584 {
585         device_unregister(device);
586
587         return 0;
588 }
589
590 static DECLARE_RWSEM(idr_rwsem);
591 static DEFINE_IDR(fw_device_idr);
592 int fw_cdev_major;
593
594 struct fw_device *fw_device_from_devt(dev_t devt)
595 {
596         struct fw_device *device;
597
598         down_read(&idr_rwsem);
599         device = idr_find(&fw_device_idr, MINOR(devt));
600         up_read(&idr_rwsem);
601
602         return device;
603 }
604
605 static void fw_device_shutdown(struct work_struct *work)
606 {
607         struct fw_device *device =
608                 container_of(work, struct fw_device, work.work);
609         int minor = MINOR(device->device.devt);
610
611         down_write(&idr_rwsem);
612         idr_remove(&fw_device_idr, minor);
613         up_write(&idr_rwsem);
614
615         fw_device_cdev_remove(device);
616         device_for_each_child(&device->device, NULL, shutdown_unit);
617         device_unregister(&device->device);
618 }
619
620 static struct device_type fw_device_type = {
621         .release        = fw_device_release,
622 };
623
624 /*
625  * These defines control the retry behavior for reading the config
626  * rom.  It shouldn't be necessary to tweak these; if the device
627  * doesn't respond to a config rom read within 10 seconds, it's not
628  * going to respond at all.  As for the initial delay, a lot of
629  * devices will be able to respond within half a second after bus
630  * reset.  On the other hand, it's not really worth being more
631  * aggressive than that, since it scales pretty well; if 10 devices
632  * are plugged in, they're all getting read within one second.
633  */
634
635 #define MAX_RETRIES     10
636 #define RETRY_DELAY     (3 * HZ)
637 #define INITIAL_DELAY   (HZ / 2)
638
639 static void fw_device_init(struct work_struct *work)
640 {
641         struct fw_device *device =
642                 container_of(work, struct fw_device, work.work);
643         int minor, err;
644
645         /*
646          * All failure paths here set node->data to NULL, so that we
647          * don't try to do device_for_each_child() on a kfree()'d
648          * device.
649          */
650
651         if (read_bus_info_block(device) < 0) {
652                 if (device->config_rom_retries < MAX_RETRIES) {
653                         device->config_rom_retries++;
654                         schedule_delayed_work(&device->work, RETRY_DELAY);
655                 } else {
656                         fw_notify("giving up on config rom for node id %x\n",
657                                   device->node_id);
658                         if (device->node == device->card->root_node)
659                                 schedule_delayed_work(&device->card->work, 0);
660                         fw_device_release(&device->device);
661                 }
662                 return;
663         }
664
665         err = -ENOMEM;
666         down_write(&idr_rwsem);
667         if (idr_pre_get(&fw_device_idr, GFP_KERNEL))
668                 err = idr_get_new(&fw_device_idr, device, &minor);
669         up_write(&idr_rwsem);
670         if (err < 0)
671                 goto error;
672
673         device->device.bus = &fw_bus_type;
674         device->device.type = &fw_device_type;
675         device->device.parent = device->card->device;
676         device->device.devt = MKDEV(fw_cdev_major, minor);
677         snprintf(device->device.bus_id, sizeof(device->device.bus_id),
678                  "fw%d", minor);
679
680         init_fw_attribute_group(&device->device,
681                                 fw_device_attributes,
682                                 &device->attribute_group);
683         if (device_add(&device->device)) {
684                 fw_error("Failed to add device.\n");
685                 goto error_with_cdev;
686         }
687
688         create_units(device);
689
690         /*
691          * Transition the device to running state.  If it got pulled
692          * out from under us while we did the intialization work, we
693          * have to shut down the device again here.  Normally, though,
694          * fw_node_event will be responsible for shutting it down when
695          * necessary.  We have to use the atomic cmpxchg here to avoid
696          * racing with the FW_NODE_DESTROYED case in
697          * fw_node_event().
698          */
699         if (atomic_cmpxchg(&device->state,
700                     FW_DEVICE_INITIALIZING,
701                     FW_DEVICE_RUNNING) == FW_DEVICE_SHUTDOWN)
702                 fw_device_shutdown(&device->work.work);
703         else
704                 fw_notify("created new fw device %s "
705                           "(%d config rom retries, S%d00)\n",
706                           device->device.bus_id, device->config_rom_retries,
707                           1 << device->max_speed);
708
709         /*
710          * Reschedule the IRM work if we just finished reading the
711          * root node config rom.  If this races with a bus reset we
712          * just end up running the IRM work a couple of extra times -
713          * pretty harmless.
714          */
715         if (device->node == device->card->root_node)
716                 schedule_delayed_work(&device->card->work, 0);
717
718         return;
719
720  error_with_cdev:
721         down_write(&idr_rwsem);
722         idr_remove(&fw_device_idr, minor);
723         up_write(&idr_rwsem);
724  error:
725         put_device(&device->device);
726 }
727
728 static int update_unit(struct device *dev, void *data)
729 {
730         struct fw_unit *unit = fw_unit(dev);
731         struct fw_driver *driver = (struct fw_driver *)dev->driver;
732
733         if (is_fw_unit(dev) && driver != NULL && driver->update != NULL) {
734                 down(&dev->sem);
735                 driver->update(unit);
736                 up(&dev->sem);
737         }
738
739         return 0;
740 }
741
742 static void fw_device_update(struct work_struct *work)
743 {
744         struct fw_device *device =
745                 container_of(work, struct fw_device, work.work);
746
747         fw_device_cdev_update(device);
748         device_for_each_child(&device->device, NULL, update_unit);
749 }
750
751 void fw_node_event(struct fw_card *card, struct fw_node *node, int event)
752 {
753         struct fw_device *device;
754
755         switch (event) {
756         case FW_NODE_CREATED:
757         case FW_NODE_LINK_ON:
758                 if (!node->link_on)
759                         break;
760
761                 device = kzalloc(sizeof(*device), GFP_ATOMIC);
762                 if (device == NULL)
763                         break;
764
765                 /*
766                  * Do minimal intialization of the device here, the
767                  * rest will happen in fw_device_init().  We need the
768                  * card and node so we can read the config rom and we
769                  * need to do device_initialize() now so
770                  * device_for_each_child() in FW_NODE_UPDATED is
771                  * doesn't freak out.
772                  */
773                 device_initialize(&device->device);
774                 atomic_set(&device->state, FW_DEVICE_INITIALIZING);
775                 device->card = fw_card_get(card);
776                 device->node = fw_node_get(node);
777                 device->node_id = node->node_id;
778                 device->generation = card->generation;
779                 INIT_LIST_HEAD(&device->client_list);
780
781                 /*
782                  * Set the node data to point back to this device so
783                  * FW_NODE_UPDATED callbacks can update the node_id
784                  * and generation for the device.
785                  */
786                 node->data = device;
787
788                 /*
789                  * Many devices are slow to respond after bus resets,
790                  * especially if they are bus powered and go through
791                  * power-up after getting plugged in.  We schedule the
792                  * first config rom scan half a second after bus reset.
793                  */
794                 INIT_DELAYED_WORK(&device->work, fw_device_init);
795                 schedule_delayed_work(&device->work, INITIAL_DELAY);
796                 break;
797
798         case FW_NODE_UPDATED:
799                 if (!node->link_on || node->data == NULL)
800                         break;
801
802                 device = node->data;
803                 device->node_id = node->node_id;
804                 device->generation = card->generation;
805                 if (atomic_read(&device->state) == FW_DEVICE_RUNNING) {
806                         PREPARE_DELAYED_WORK(&device->work, fw_device_update);
807                         schedule_delayed_work(&device->work, 0);
808                 }
809                 break;
810
811         case FW_NODE_DESTROYED:
812         case FW_NODE_LINK_OFF:
813                 if (!node->data)
814                         break;
815
816                 /*
817                  * Destroy the device associated with the node.  There
818                  * are two cases here: either the device is fully
819                  * initialized (FW_DEVICE_RUNNING) or we're in the
820                  * process of reading its config rom
821                  * (FW_DEVICE_INITIALIZING).  If it is fully
822                  * initialized we can reuse device->work to schedule a
823                  * full fw_device_shutdown().  If not, there's work
824                  * scheduled to read it's config rom, and we just put
825                  * the device in shutdown state to have that code fail
826                  * to create the device.
827                  */
828                 device = node->data;
829                 if (atomic_xchg(&device->state,
830                                 FW_DEVICE_SHUTDOWN) == FW_DEVICE_RUNNING) {
831                         PREPARE_DELAYED_WORK(&device->work, fw_device_shutdown);
832                         schedule_delayed_work(&device->work, 0);
833                 }
834                 break;
835         }
836 }