nfsd4: reshuffle lease-setting code to allow reuse
[safe/jmp/linux-2.6] / drivers / ieee1394 / hosts.c
index ee82a53..e947d8f 100644 (file)
@@ -15,7 +15,6 @@
 #include <linux/list.h>
 #include <linux/init.h>
 #include <linux/slab.h>
-#include <linux/pci.h>
 #include <linux/timer.h>
 #include <linux/jiffies.h>
 #include <linux/mutex.h>
@@ -35,18 +34,18 @@ static void delayed_reset_bus(struct work_struct *work)
 {
        struct hpsb_host *host =
                container_of(work, struct hpsb_host, delayed_reset.work);
-       int generation = host->csr.generation + 1;
+       u8 generation = host->csr.generation + 1;
 
        /* The generation field rolls over to 2 rather than 0 per IEEE
         * 1394a-2000. */
        if (generation > 0xf || generation < 2)
                generation = 2;
 
-       CSR_SET_BUS_INFO_GENERATION(host->csr.rom, generation);
+       csr_set_bus_info_generation(host->csr.rom, generation);
        if (csr1212_generate_csr_image(host->csr.rom) != CSR1212_SUCCESS) {
                /* CSR image creation failed.
                 * Reset generation field and do not issue a bus reset. */
-               CSR_SET_BUS_INFO_GENERATION(host->csr.rom,
+               csr_set_bus_info_generation(host->csr.rom,
                                            host->csr.generation);
                return;
        }
@@ -94,14 +93,6 @@ static int alloc_hostnum_cb(struct hpsb_host *host, void *__data)
        return 0;
 }
 
-/*
- * The pending_packet_queue is special in that it's processed
- * from hardirq context too (such as hpsb_bus_reset()). Hence
- * split the lock class from the usual networking skb-head
- * lock class by using a separate key for it:
- */
-static struct lock_class_key pending_packet_queue_key;
-
 static DEFINE_MUTEX(host_num_alloc);
 
 /**
@@ -137,9 +128,7 @@ struct hpsb_host *hpsb_alloc_host(struct hpsb_host_driver *drv, size_t extra,
        h->hostdata = h + 1;
        h->driver = drv;
 
-       skb_queue_head_init(&h->pending_packet_queue);
-       lockdep_set_class(&h->pending_packet_queue.lock,
-                          &pending_packet_queue_key);
+       INIT_LIST_HEAD(&h->pending_packets);
        INIT_LIST_HEAD(&h->addr_space);
 
        for (i = 2; i < 16; i++)
@@ -165,15 +154,16 @@ struct hpsb_host *hpsb_alloc_host(struct hpsb_host_driver *drv, size_t extra,
 
        memcpy(&h->device, &nodemgr_dev_template_host, sizeof(h->device));
        h->device.parent = dev;
-       snprintf(h->device.bus_id, BUS_ID_SIZE, "fw-host%d", h->id);
+       set_dev_node(&h->device, dev_to_node(dev));
+       dev_set_name(&h->device, "fw-host%d", h->id);
 
-       h->class_dev.dev = &h->device;
-       h->class_dev.class = &hpsb_host_class;
-       snprintf(h->class_dev.class_id, BUS_ID_SIZE, "fw-host%d", h->id);
+       h->host_dev.parent = &h->device;
+       h->host_dev.class = &hpsb_host_class;
+       dev_set_name(&h->host_dev, "fw-host%d", h->id);
 
        if (device_register(&h->device))
                goto fail;
-       if (class_device_register(&h->class_dev)) {
+       if (device_register(&h->host_dev)) {
                device_unregister(&h->device);
                goto fail;
        }
@@ -191,13 +181,18 @@ int hpsb_add_host(struct hpsb_host *host)
        if (hpsb_default_host_entry(host))
                return -ENOMEM;
 
-       hpsb_add_extra_config_roms(host);
-
        highlevel_add_host(host);
-
        return 0;
 }
 
+void hpsb_resume_host(struct hpsb_host *host)
+{
+       if (host->driver->set_hw_config_rom)
+               host->driver->set_hw_config_rom(host,
+                                               host->csr.rom->bus_info_data);
+       host->driver->devctl(host, RESET_BUS, SHORT_RESET);
+}
+
 void hpsb_remove_host(struct hpsb_host *host)
 {
        host->is_shutdown = 1;
@@ -206,15 +201,20 @@ void hpsb_remove_host(struct hpsb_host *host)
        flush_scheduled_work();
 
        host->driver = &dummy_driver;
-
        highlevel_remove_host(host);
 
-       hpsb_remove_extra_config_roms(host);
-
-       class_device_unregister(&host->class_dev);
+       device_unregister(&host->host_dev);
        device_unregister(&host->device);
 }
 
+/**
+ * hpsb_update_config_rom_image - updates configuration ROM image of a host
+ *
+ * Updates the configuration ROM image of a host.  rom_version must be the
+ * current version, otherwise it will fail with return value -1. If this
+ * host does not support config-rom-update, it will return -%EINVAL.
+ * Return value 0 indicates success.
+ */
 int hpsb_update_config_rom_image(struct hpsb_host *host)
 {
        unsigned long reset_delay;