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 dev_set_name(&h
->device
, "fw-host%d", h
->id
);
160 h
->host_dev
.parent
= &h
->device
;
161 h
->host_dev
.class = &hpsb_host_class
;
162 dev_set_name(&h
->host_dev
, "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
);