4  * Low level (host adapter) management.
 
   6  * Copyright (C) 1999 Andreas E. Bombe
 
   7  * Copyright (C) 1999 Emanuel Pirker
 
   9  * This code is licensed under the GPL.  See the file COPYING in the root
 
  10  * directory of the kernel sources for details.
 
  13 #include <linux/module.h>
 
  14 #include <linux/types.h>
 
  15 #include <linux/list.h>
 
  16 #include <linux/init.h>
 
  17 #include <linux/slab.h>
 
  18 #include <linux/timer.h>
 
  19 #include <linux/jiffies.h>
 
  20 #include <linux/mutex.h>
 
  24 #include "ieee1394_types.h"
 
  26 #include "ieee1394_core.h"
 
  27 #include "highlevel.h"
 
  30 #include "config_roms.h"
 
  33 static void delayed_reset_bus(struct work_struct *work)
 
  35         struct hpsb_host *host =
 
  36                 container_of(work, struct hpsb_host, delayed_reset.work);
 
  37         int generation = host->csr.generation + 1;
 
  39         /* The generation field rolls over to 2 rather than 0 per IEEE
 
  41         if (generation > 0xf || generation < 2)
 
  44         CSR_SET_BUS_INFO_GENERATION(host->csr.rom, generation);
 
  45         if (csr1212_generate_csr_image(host->csr.rom) != CSR1212_SUCCESS) {
 
  46                 /* CSR image creation failed.
 
  47                  * Reset generation field and do not issue a bus reset. */
 
  48                 CSR_SET_BUS_INFO_GENERATION(host->csr.rom,
 
  49                                             host->csr.generation);
 
  53         host->csr.generation = generation;
 
  55         host->update_config_rom = 0;
 
  56         if (host->driver->set_hw_config_rom)
 
  57                 host->driver->set_hw_config_rom(host,
 
  58                                                 host->csr.rom->bus_info_data);
 
  60         host->csr.gen_timestamp[host->csr.generation] = jiffies;
 
  61         hpsb_reset_bus(host, SHORT_RESET);
 
  64 static int dummy_transmit_packet(struct hpsb_host *h, struct hpsb_packet *p)
 
  69 static int dummy_devctl(struct hpsb_host *h, enum devctl_cmd c, int arg)
 
  74 static int dummy_isoctl(struct hpsb_iso *iso, enum isoctl_cmd command,
 
  80 static struct hpsb_host_driver dummy_driver = {
 
  81         .transmit_packet = dummy_transmit_packet,
 
  82         .devctl =          dummy_devctl,
 
  83         .isoctl =          dummy_isoctl
 
  86 static int alloc_hostnum_cb(struct hpsb_host *host, void *__data)
 
  88         int *hostnum = __data;
 
  90         if (host->id == *hostnum)
 
  96 static DEFINE_MUTEX(host_num_alloc);
 
  99  * hpsb_alloc_host - allocate a new host controller.
 
 100  * @drv: the driver that will manage the host controller
 
 101  * @extra: number of extra bytes to allocate for the driver
 
 103  * Allocate a &hpsb_host and initialize the general subsystem specific
 
 104  * fields.  If the driver needs to store per host data, as drivers
 
 105  * usually do, the amount of memory required can be specified by the
 
 106  * @extra parameter.  Once allocated, the driver should initialize the
 
 107  * driver specific parts, enable the controller and make it available
 
 108  * to the general subsystem using hpsb_add_host().
 
 110  * Return Value: a pointer to the &hpsb_host if successful, %NULL if
 
 111  * no memory was available.
 
 113 struct hpsb_host *hpsb_alloc_host(struct hpsb_host_driver *drv, size_t extra,
 
 120         h = kzalloc(sizeof(*h) + extra, GFP_KERNEL);
 
 124         h->csr.rom = csr1212_create_csr(&csr_bus_ops, CSR_BUS_INFO_SIZE, h);
 
 131         INIT_LIST_HEAD(&h->pending_packets);
 
 132         INIT_LIST_HEAD(&h->addr_space);
 
 134         for (i = 2; i < 16; i++)
 
 135                 h->csr.gen_timestamp[i] = jiffies - 60 * HZ;
 
 137         atomic_set(&h->generation, 0);
 
 139         INIT_DELAYED_WORK(&h->delayed_reset, delayed_reset_bus);
 
 141         init_timer(&h->timeout);
 
 142         h->timeout.data = (unsigned long) h;
 
 143         h->timeout.function = abort_timedouts;
 
 144         h->timeout_interval = HZ / 20; /* 50ms, half of minimum SPLIT_TIMEOUT */
 
 146         h->topology_map = h->csr.topology_map + 3;
 
 147         h->speed_map = (u8 *)(h->csr.speed_map + 2);
 
 149         mutex_lock(&host_num_alloc);
 
 150         while (nodemgr_for_each_host(&hostnum, alloc_hostnum_cb))
 
 152         mutex_unlock(&host_num_alloc);
 
 155         memcpy(&h->device, &nodemgr_dev_template_host, sizeof(h->device));
 
 156         h->device.parent = dev;
 
 157         set_dev_node(&h->device, dev_to_node(dev));
 
 158         snprintf(h->device.bus_id, BUS_ID_SIZE, "fw-host%d", h->id);
 
 160         h->host_dev.parent = &h->device;
 
 161         h->host_dev.class = &hpsb_host_class;
 
 162         snprintf(h->host_dev.bus_id, BUS_ID_SIZE, "fw-host%d", h->id);
 
 164         if (device_register(&h->device))
 
 166         if (device_register(&h->host_dev)) {
 
 167                 device_unregister(&h->device);
 
 170         get_device(&h->device);
 
 179 int hpsb_add_host(struct hpsb_host *host)
 
 181         if (hpsb_default_host_entry(host))
 
 184         highlevel_add_host(host);
 
 188 void hpsb_resume_host(struct hpsb_host *host)
 
 190         if (host->driver->set_hw_config_rom)
 
 191                 host->driver->set_hw_config_rom(host,
 
 192                                                 host->csr.rom->bus_info_data);
 
 193         host->driver->devctl(host, RESET_BUS, SHORT_RESET);
 
 196 void hpsb_remove_host(struct hpsb_host *host)
 
 198         host->is_shutdown = 1;
 
 200         cancel_delayed_work(&host->delayed_reset);
 
 201         flush_scheduled_work();
 
 203         host->driver = &dummy_driver;
 
 204         highlevel_remove_host(host);
 
 206         device_unregister(&host->host_dev);
 
 207         device_unregister(&host->device);
 
 211  * hpsb_update_config_rom_image - updates configuration ROM image of a host
 
 213  * Updates the configuration ROM image of a host.  rom_version must be the
 
 214  * current version, otherwise it will fail with return value -1. If this
 
 215  * host does not support config-rom-update, it will return -%EINVAL.
 
 216  * Return value 0 indicates success.
 
 218 int hpsb_update_config_rom_image(struct hpsb_host *host)
 
 220         unsigned long reset_delay;
 
 221         int next_gen = host->csr.generation + 1;
 
 223         if (!host->update_config_rom)
 
 229         /* Stop the delayed interrupt, we're about to change the config rom and
 
 230          * it would be a waste to do a bus reset twice. */
 
 231         cancel_delayed_work(&host->delayed_reset);
 
 233         /* IEEE 1394a-2000 prohibits using the same generation number
 
 234          * twice in a 60 second period. */
 
 235         if (time_before(jiffies, host->csr.gen_timestamp[next_gen] + 60 * HZ))
 
 236                 /* Wait 60 seconds from the last time this generation number was
 
 239                         (60 * HZ) + host->csr.gen_timestamp[next_gen] - jiffies;
 
 241                 /* Wait 1 second in case some other code wants to change the
 
 242                  * Config ROM in the near future. */
 
 245         PREPARE_DELAYED_WORK(&host->delayed_reset, delayed_reset_bus);
 
 246         schedule_delayed_work(&host->delayed_reset, reset_delay);