diff options
| -rw-r--r-- | Documentation/debugging-via-ohci1394.txt | 16 | ||||
| -rw-r--r-- | drivers/firewire/Kconfig | 5 | ||||
| -rw-r--r-- | drivers/firewire/fw-card.c | 50 | ||||
| -rw-r--r-- | drivers/firewire/fw-cdev.c | 13 | ||||
| -rw-r--r-- | drivers/firewire/fw-device.c | 263 | ||||
| -rw-r--r-- | drivers/firewire/fw-device.h | 38 | ||||
| -rw-r--r-- | drivers/firewire/fw-iso.c | 5 | ||||
| -rw-r--r-- | drivers/firewire/fw-ohci.c | 402 | ||||
| -rw-r--r-- | drivers/firewire/fw-ohci.h | 2 | ||||
| -rw-r--r-- | drivers/firewire/fw-sbp2.c | 150 | ||||
| -rw-r--r-- | drivers/firewire/fw-topology.c | 10 | ||||
| -rw-r--r-- | drivers/firewire/fw-topology.h | 11 | ||||
| -rw-r--r-- | drivers/firewire/fw-transaction.c | 75 | ||||
| -rw-r--r-- | drivers/firewire/fw-transaction.h | 10 | ||||
| -rw-r--r-- | drivers/ieee1394/csr.c | 6 | ||||
| -rw-r--r-- | drivers/ieee1394/dv1394.c | 4 | ||||
| -rw-r--r-- | drivers/ieee1394/highlevel.c | 6 | ||||
| -rw-r--r-- | drivers/ieee1394/ieee1394_core.c | 4 | ||||
| -rw-r--r-- | drivers/ieee1394/nodemgr.c | 6 | ||||
| -rw-r--r-- | drivers/ieee1394/ohci1394.c | 229 | ||||
| -rw-r--r-- | drivers/ieee1394/pcilynx.c | 15 | ||||
| -rw-r--r-- | drivers/ieee1394/raw1394.c | 2 | ||||
| -rw-r--r-- | drivers/ieee1394/sbp2.c | 11 | ||||
| -rw-r--r-- | drivers/ieee1394/video1394.c | 4 | ||||
| -rw-r--r-- | lib/Kconfig.debug | 13 |
25 files changed, 877 insertions, 473 deletions
diff --git a/Documentation/debugging-via-ohci1394.txt b/Documentation/debugging-via-ohci1394.txt index c360d4e91b48..59a91e5c6909 100644 --- a/Documentation/debugging-via-ohci1394.txt +++ b/Documentation/debugging-via-ohci1394.txt | |||
| @@ -41,15 +41,19 @@ to a working state and enables physical DMA by default for all remote nodes. | |||
| 41 | This can be turned off by ohci1394's module parameter phys_dma=0. | 41 | This can be turned off by ohci1394's module parameter phys_dma=0. |
| 42 | 42 | ||
| 43 | The alternative firewire-ohci driver in drivers/firewire uses filtered physical | 43 | The alternative firewire-ohci driver in drivers/firewire uses filtered physical |
| 44 | DMA, hence is not yet suitable for remote debugging. | 44 | DMA by default, which is more secure but not suitable for remote debugging. |
| 45 | Compile the driver with CONFIG_FIREWIRE_OHCI_REMOTE_DMA (Kernel hacking menu: | ||
| 46 | Remote debugging over FireWire with firewire-ohci) to get unfiltered physical | ||
| 47 | DMA. | ||
| 45 | 48 | ||
| 46 | Because ohci1394 depends on the PCI enumeration to be completed, an | 49 | Because ohci1394 and firewire-ohci depend on the PCI enumeration to be |
| 47 | initialization routine which runs pretty early (long before console_init() | 50 | completed, an initialization routine which runs pretty early has been |
| 48 | which makes the printk buffer appear on the console can be called) was written. | 51 | implemented for x86. This routine runs long before console_init() can be |
| 52 | called, i.e. before the printk buffer appears on the console. | ||
| 49 | 53 | ||
| 50 | To activate it, enable CONFIG_PROVIDE_OHCI1394_DMA_INIT (Kernel hacking menu: | 54 | To activate it, enable CONFIG_PROVIDE_OHCI1394_DMA_INIT (Kernel hacking menu: |
| 51 | Provide code for enabling DMA over FireWire early on boot) and pass the | 55 | Remote debugging over FireWire early on boot) and pass the parameter |
| 52 | parameter "ohci1394_dma=early" to the recompiled kernel on boot. | 56 | "ohci1394_dma=early" to the recompiled kernel on boot. |
| 53 | 57 | ||
| 54 | Tools | 58 | Tools |
| 55 | ----- | 59 | ----- |
diff --git a/drivers/firewire/Kconfig b/drivers/firewire/Kconfig index 25bdc2dd9ce1..fb4d391810b6 100644 --- a/drivers/firewire/Kconfig +++ b/drivers/firewire/Kconfig | |||
| @@ -54,6 +54,11 @@ config FIREWIRE_OHCI | |||
| 54 | directive, use "install modulename /bin/true" for the modules to be | 54 | directive, use "install modulename /bin/true" for the modules to be |
| 55 | blacklisted. | 55 | blacklisted. |
| 56 | 56 | ||
| 57 | config FIREWIRE_OHCI_DEBUG | ||
| 58 | bool | ||
| 59 | depends on FIREWIRE_OHCI | ||
| 60 | default y | ||
| 61 | |||
| 57 | config FIREWIRE_SBP2 | 62 | config FIREWIRE_SBP2 |
| 58 | tristate "Support for storage devices (SBP-2 protocol driver)" | 63 | tristate "Support for storage devices (SBP-2 protocol driver)" |
| 59 | depends on FIREWIRE && SCSI | 64 | depends on FIREWIRE && SCSI |
diff --git a/drivers/firewire/fw-card.c b/drivers/firewire/fw-card.c index a03462750b95..5b4c0d9f5173 100644 --- a/drivers/firewire/fw-card.c +++ b/drivers/firewire/fw-card.c | |||
| @@ -167,7 +167,6 @@ fw_core_add_descriptor(struct fw_descriptor *desc) | |||
| 167 | 167 | ||
| 168 | return 0; | 168 | return 0; |
| 169 | } | 169 | } |
| 170 | EXPORT_SYMBOL(fw_core_add_descriptor); | ||
| 171 | 170 | ||
| 172 | void | 171 | void |
| 173 | fw_core_remove_descriptor(struct fw_descriptor *desc) | 172 | fw_core_remove_descriptor(struct fw_descriptor *desc) |
| @@ -182,7 +181,6 @@ fw_core_remove_descriptor(struct fw_descriptor *desc) | |||
| 182 | 181 | ||
| 183 | mutex_unlock(&card_mutex); | 182 | mutex_unlock(&card_mutex); |
| 184 | } | 183 | } |
| 185 | EXPORT_SYMBOL(fw_core_remove_descriptor); | ||
| 186 | 184 | ||
| 187 | static const char gap_count_table[] = { | 185 | static const char gap_count_table[] = { |
| 188 | 63, 5, 7, 8, 10, 13, 16, 18, 21, 24, 26, 29, 32, 35, 37, 40 | 186 | 63, 5, 7, 8, 10, 13, 16, 18, 21, 24, 26, 29, 32, 35, 37, 40 |
| @@ -220,7 +218,7 @@ fw_card_bm_work(struct work_struct *work) | |||
| 220 | struct bm_data bmd; | 218 | struct bm_data bmd; |
| 221 | unsigned long flags; | 219 | unsigned long flags; |
| 222 | int root_id, new_root_id, irm_id, gap_count, generation, grace; | 220 | int root_id, new_root_id, irm_id, gap_count, generation, grace; |
| 223 | int do_reset = 0; | 221 | bool do_reset = false; |
| 224 | 222 | ||
| 225 | spin_lock_irqsave(&card->lock, flags); | 223 | spin_lock_irqsave(&card->lock, flags); |
| 226 | local_node = card->local_node; | 224 | local_node = card->local_node; |
| @@ -331,7 +329,7 @@ fw_card_bm_work(struct work_struct *work) | |||
| 331 | */ | 329 | */ |
| 332 | spin_unlock_irqrestore(&card->lock, flags); | 330 | spin_unlock_irqrestore(&card->lock, flags); |
| 333 | goto out; | 331 | goto out; |
| 334 | } else if (root_device->config_rom[2] & BIB_CMC) { | 332 | } else if (root_device->cmc) { |
| 335 | /* | 333 | /* |
| 336 | * FIXME: I suppose we should set the cmstr bit in the | 334 | * FIXME: I suppose we should set the cmstr bit in the |
| 337 | * STATE_CLEAR register of this node, as described in | 335 | * STATE_CLEAR register of this node, as described in |
| @@ -360,14 +358,14 @@ fw_card_bm_work(struct work_struct *work) | |||
| 360 | gap_count = 63; | 358 | gap_count = 63; |
| 361 | 359 | ||
| 362 | /* | 360 | /* |
| 363 | * Finally, figure out if we should do a reset or not. If we've | 361 | * Finally, figure out if we should do a reset or not. If we have |
| 364 | * done less that 5 resets with the same physical topology and we | 362 | * done less than 5 resets with the same physical topology and we |
| 365 | * have either a new root or a new gap count setting, let's do it. | 363 | * have either a new root or a new gap count setting, let's do it. |
| 366 | */ | 364 | */ |
| 367 | 365 | ||
| 368 | if (card->bm_retries++ < 5 && | 366 | if (card->bm_retries++ < 5 && |
| 369 | (card->gap_count != gap_count || new_root_id != root_id)) | 367 | (card->gap_count != gap_count || new_root_id != root_id)) |
| 370 | do_reset = 1; | 368 | do_reset = true; |
| 371 | 369 | ||
| 372 | spin_unlock_irqrestore(&card->lock, flags); | 370 | spin_unlock_irqrestore(&card->lock, flags); |
| 373 | 371 | ||
| @@ -398,7 +396,6 @@ fw_card_initialize(struct fw_card *card, const struct fw_card_driver *driver, | |||
| 398 | { | 396 | { |
| 399 | static atomic_t index = ATOMIC_INIT(-1); | 397 | static atomic_t index = ATOMIC_INIT(-1); |
| 400 | 398 | ||
| 401 | kref_init(&card->kref); | ||
| 402 | atomic_set(&card->device_count, 0); | 399 | atomic_set(&card->device_count, 0); |
| 403 | card->index = atomic_inc_return(&index); | 400 | card->index = atomic_inc_return(&index); |
| 404 | card->driver = driver; | 401 | card->driver = driver; |
| @@ -429,12 +426,6 @@ fw_card_add(struct fw_card *card, | |||
| 429 | card->link_speed = link_speed; | 426 | card->link_speed = link_speed; |
| 430 | card->guid = guid; | 427 | card->guid = guid; |
| 431 | 428 | ||
| 432 | /* | ||
| 433 | * The subsystem grabs a reference when the card is added and | ||
| 434 | * drops it when the driver calls fw_core_remove_card. | ||
| 435 | */ | ||
| 436 | fw_card_get(card); | ||
| 437 | |||
| 438 | mutex_lock(&card_mutex); | 429 | mutex_lock(&card_mutex); |
| 439 | config_rom = generate_config_rom(card, &length); | 430 | config_rom = generate_config_rom(card, &length); |
| 440 | list_add_tail(&card->link, &card_list); | 431 | list_add_tail(&card->link, &card_list); |
| @@ -540,40 +531,9 @@ fw_core_remove_card(struct fw_card *card) | |||
| 540 | cancel_delayed_work_sync(&card->work); | 531 | cancel_delayed_work_sync(&card->work); |
| 541 | fw_flush_transactions(card); | 532 | fw_flush_transactions(card); |
| 542 | del_timer_sync(&card->flush_timer); | 533 | del_timer_sync(&card->flush_timer); |
| 543 | |||
| 544 | fw_card_put(card); | ||
| 545 | } | 534 | } |
| 546 | EXPORT_SYMBOL(fw_core_remove_card); | 535 | EXPORT_SYMBOL(fw_core_remove_card); |
| 547 | 536 | ||
| 548 | struct fw_card * | ||
| 549 | fw_card_get(struct fw_card *card) | ||
| 550 | { | ||
| 551 | kref_get(&card->kref); | ||
| 552 | |||
| 553 | return card; | ||
| 554 | } | ||
| 555 | EXPORT_SYMBOL(fw_card_get); | ||
| 556 | |||
| 557 | static void | ||
| 558 | release_card(struct kref *kref) | ||
| 559 | { | ||
| 560 | struct fw_card *card = container_of(kref, struct fw_card, kref); | ||
| 561 | |||
| 562 | kfree(card); | ||
| 563 | } | ||
| 564 | |||
| 565 | /* | ||
| 566 | * An assumption for fw_card_put() is that the card driver allocates | ||
| 567 | * the fw_card struct with kalloc and that it has been shut down | ||
| 568 | * before the last ref is dropped. | ||
| 569 | */ | ||
| 570 | void | ||
| 571 | fw_card_put(struct fw_card *card) | ||
| 572 | { | ||
| 573 | kref_put(&card->kref, release_card); | ||
| 574 | } | ||
| 575 | EXPORT_SYMBOL(fw_card_put); | ||
| 576 | |||
| 577 | int | 537 | int |
| 578 | fw_core_initiate_bus_reset(struct fw_card *card, int short_reset) | 538 | fw_core_initiate_bus_reset(struct fw_card *card, int short_reset) |
| 579 | { | 539 | { |
diff --git a/drivers/firewire/fw-cdev.c b/drivers/firewire/fw-cdev.c index 46bc197a047f..4a541921a14a 100644 --- a/drivers/firewire/fw-cdev.c +++ b/drivers/firewire/fw-cdev.c | |||
| @@ -269,21 +269,28 @@ static int ioctl_get_info(struct client *client, void *buffer) | |||
| 269 | { | 269 | { |
| 270 | struct fw_cdev_get_info *get_info = buffer; | 270 | struct fw_cdev_get_info *get_info = buffer; |
| 271 | struct fw_cdev_event_bus_reset bus_reset; | 271 | struct fw_cdev_event_bus_reset bus_reset; |
| 272 | unsigned long ret = 0; | ||
| 272 | 273 | ||
| 273 | client->version = get_info->version; | 274 | client->version = get_info->version; |
| 274 | get_info->version = FW_CDEV_VERSION; | 275 | get_info->version = FW_CDEV_VERSION; |
| 275 | 276 | ||
| 277 | down_read(&fw_device_rwsem); | ||
| 278 | |||
| 276 | if (get_info->rom != 0) { | 279 | if (get_info->rom != 0) { |
| 277 | void __user *uptr = u64_to_uptr(get_info->rom); | 280 | void __user *uptr = u64_to_uptr(get_info->rom); |
| 278 | size_t want = get_info->rom_length; | 281 | size_t want = get_info->rom_length; |
| 279 | size_t have = client->device->config_rom_length * 4; | 282 | size_t have = client->device->config_rom_length * 4; |
| 280 | 283 | ||
| 281 | if (copy_to_user(uptr, client->device->config_rom, | 284 | ret = copy_to_user(uptr, client->device->config_rom, |
| 282 | min(want, have))) | 285 | min(want, have)); |
| 283 | return -EFAULT; | ||
| 284 | } | 286 | } |
| 285 | get_info->rom_length = client->device->config_rom_length * 4; | 287 | get_info->rom_length = client->device->config_rom_length * 4; |
| 286 | 288 | ||
| 289 | up_read(&fw_device_rwsem); | ||
| 290 | |||
| 291 | if (ret != 0) | ||
| 292 | return -EFAULT; | ||
| 293 | |||
| 287 | client->bus_reset_closure = get_info->bus_reset_closure; | 294 | client->bus_reset_closure = get_info->bus_reset_closure; |
| 288 | if (get_info->bus_reset != 0) { | 295 | if (get_info->bus_reset != 0) { |
| 289 | void __user *uptr = u64_to_uptr(get_info->bus_reset); | 296 | void __user *uptr = u64_to_uptr(get_info->bus_reset); |
diff --git a/drivers/firewire/fw-device.c b/drivers/firewire/fw-device.c index 870125a3638e..2d01bc1b9752 100644 --- a/drivers/firewire/fw-device.c +++ b/drivers/firewire/fw-device.c | |||
| @@ -25,7 +25,7 @@ | |||
| 25 | #include <linux/device.h> | 25 | #include <linux/device.h> |
| 26 | #include <linux/delay.h> | 26 | #include <linux/delay.h> |
| 27 | #include <linux/idr.h> | 27 | #include <linux/idr.h> |
| 28 | #include <linux/rwsem.h> | 28 | #include <linux/string.h> |
| 29 | #include <asm/semaphore.h> | 29 | #include <asm/semaphore.h> |
| 30 | #include <asm/system.h> | 30 | #include <asm/system.h> |
| 31 | #include <linux/ctype.h> | 31 | #include <linux/ctype.h> |
| @@ -160,9 +160,9 @@ static void fw_device_release(struct device *dev) | |||
| 160 | * Take the card lock so we don't set this to NULL while a | 160 | * Take the card lock so we don't set this to NULL while a |
| 161 | * FW_NODE_UPDATED callback is being handled. | 161 | * FW_NODE_UPDATED callback is being handled. |
| 162 | */ | 162 | */ |
| 163 | spin_lock_irqsave(&device->card->lock, flags); | 163 | spin_lock_irqsave(&card->lock, flags); |
| 164 | device->node->data = NULL; | 164 | device->node->data = NULL; |
| 165 | spin_unlock_irqrestore(&device->card->lock, flags); | 165 | spin_unlock_irqrestore(&card->lock, flags); |
| 166 | 166 | ||
| 167 | fw_node_put(device->node); | 167 | fw_node_put(device->node); |
| 168 | kfree(device->config_rom); | 168 | kfree(device->config_rom); |
| @@ -195,7 +195,9 @@ show_immediate(struct device *dev, struct device_attribute *dattr, char *buf) | |||
| 195 | container_of(dattr, struct config_rom_attribute, attr); | 195 | container_of(dattr, struct config_rom_attribute, attr); |
| 196 | struct fw_csr_iterator ci; | 196 | struct fw_csr_iterator ci; |
| 197 | u32 *dir; | 197 | u32 *dir; |
| 198 | int key, value; | 198 | int key, value, ret = -ENOENT; |
| 199 | |||
| 200 | down_read(&fw_device_rwsem); | ||
| 199 | 201 | ||
| 200 | if (is_fw_unit(dev)) | 202 | if (is_fw_unit(dev)) |
| 201 | dir = fw_unit(dev)->directory; | 203 | dir = fw_unit(dev)->directory; |
| @@ -204,11 +206,15 @@ show_immediate(struct device *dev, struct device_attribute *dattr, char *buf) | |||
| 204 | 206 | ||
| 205 | fw_csr_iterator_init(&ci, dir); | 207 | fw_csr_iterator_init(&ci, dir); |
| 206 | while (fw_csr_iterator_next(&ci, &key, &value)) | 208 | while (fw_csr_iterator_next(&ci, &key, &value)) |
| 207 | if (attr->key == key) | 209 | if (attr->key == key) { |
| 208 | return snprintf(buf, buf ? PAGE_SIZE : 0, | 210 | ret = snprintf(buf, buf ? PAGE_SIZE : 0, |
| 209 | "0x%06x\n", value); | 211 | "0x%06x\n", value); |
| 212 | break; | ||
| 213 | } | ||
| 214 | |||
| 215 | up_read(&fw_device_rwsem); | ||
| 210 | 216 | ||
| 211 | return -ENOENT; | 217 | return ret; |
| 212 | } | 218 | } |
| 213 | 219 | ||
| 214 | #define IMMEDIATE_ATTR(name, key) \ | 220 | #define IMMEDIATE_ATTR(name, key) \ |
| @@ -221,9 +227,11 @@ show_text_leaf(struct device *dev, struct device_attribute *dattr, char *buf) | |||
| 221 | container_of(dattr, struct config_rom_attribute, attr); | 227 | container_of(dattr, struct config_rom_attribute, attr); |
| 222 | struct fw_csr_iterator ci; | 228 | struct fw_csr_iterator ci; |
| 223 | u32 *dir, *block = NULL, *p, *end; | 229 | u32 *dir, *block = NULL, *p, *end; |
| 224 | int length, key, value, last_key = 0; | 230 | int length, key, value, last_key = 0, ret = -ENOENT; |
| 225 | char *b; | 231 | char *b; |
| 226 | 232 | ||
| 233 | down_read(&fw_device_rwsem); | ||
| 234 | |||
| 227 | if (is_fw_unit(dev)) | 235 | if (is_fw_unit(dev)) |
| 228 | dir = fw_unit(dev)->directory; | 236 | dir = fw_unit(dev)->directory; |
| 229 | else | 237 | else |
| @@ -238,18 +246,20 @@ show_text_leaf(struct device *dev, struct device_attribute *dattr, char *buf) | |||
| 238 | } | 246 | } |
| 239 | 247 | ||
| 240 | if (block == NULL) | 248 | if (block == NULL) |
| 241 | return -ENOENT; | 249 | goto out; |
| 242 | 250 | ||
| 243 | length = min(block[0] >> 16, 256U); | 251 | length = min(block[0] >> 16, 256U); |
| 244 | if (length < 3) | 252 | if (length < 3) |
| 245 | return -ENOENT; | 253 | goto out; |
| 246 | 254 | ||
| 247 | if (block[1] != 0 || block[2] != 0) | 255 | if (block[1] != 0 || block[2] != 0) |
| 248 | /* Unknown encoding. */ | 256 | /* Unknown encoding. */ |
| 249 | return -ENOENT; | 257 | goto out; |
| 250 | 258 | ||
| 251 | if (buf == NULL) | 259 | if (buf == NULL) { |
| 252 | return length * 4; | 260 | ret = length * 4; |
| 261 | goto out; | ||
| 262 | } | ||
| 253 | 263 | ||
| 254 | b = buf; | 264 | b = buf; |
| 255 | end = &block[length + 1]; | 265 | end = &block[length + 1]; |
| @@ -259,8 +269,11 @@ show_text_leaf(struct device *dev, struct device_attribute *dattr, char *buf) | |||
| 259 | /* Strip trailing whitespace and add newline. */ | 269 | /* Strip trailing whitespace and add newline. */ |
| 260 | while (b--, (isspace(*b) || *b == '\0') && b > buf); | 270 | while (b--, (isspace(*b) || *b == '\0') && b > buf); |
| 261 | strcpy(b + 1, "\n"); | 271 | strcpy(b + 1, "\n"); |
| 272 | ret = b + 2 - buf; | ||
| 273 | out: | ||
| 274 | up_read(&fw_device_rwsem); | ||
| 262 | 275 | ||
| 263 | return b + 2 - buf; | 276 | return ret; |
| 264 | } | 277 | } |
| 265 | 278 | ||
| 266 | #define TEXT_LEAF_ATTR(name, key) \ | 279 | #define TEXT_LEAF_ATTR(name, key) \ |
| @@ -337,19 +350,28 @@ static ssize_t | |||
| 337 | config_rom_show(struct device *dev, struct device_attribute *attr, char *buf) | 350 | config_rom_show(struct device *dev, struct device_attribute *attr, char *buf) |
| 338 | { | 351 | { |
| 339 | struct fw_device *device = fw_device(dev); | 352 | struct fw_device *device = fw_device(dev); |
| 353 | size_t length; | ||
| 340 | 354 | ||
| 341 | memcpy(buf, device->config_rom, device->config_rom_length * 4); | 355 | down_read(&fw_device_rwsem); |
| 356 | length = device->config_rom_length * 4; | ||
| 357 | memcpy(buf, device->config_rom, length); | ||
| 358 | up_read(&fw_device_rwsem); | ||
| 342 | 359 | ||
| 343 | return device->config_rom_length * 4; | 360 | return length; |
| 344 | } | 361 | } |
| 345 | 362 | ||
| 346 | static ssize_t | 363 | static ssize_t |
| 347 | guid_show(struct device *dev, struct device_attribute *attr, char *buf) | 364 | guid_show(struct device *dev, struct device_attribute *attr, char *buf) |
| 348 | { | 365 | { |
| 349 | struct fw_device *device = fw_device(dev); | 366 | struct fw_device *device = fw_device(dev); |
| 367 | int ret; | ||
| 368 | |||
| 369 | down_read(&fw_device_rwsem); | ||
| 370 | ret = snprintf(buf, PAGE_SIZE, "0x%08x%08x\n", | ||
| 371 | device->config_rom[3], device->config_rom[4]); | ||
| 372 | up_read(&fw_device_rwsem); | ||
| 350 | 373 | ||
| 351 | return snprintf(buf, PAGE_SIZE, "0x%08x%08x\n", | 374 | return ret; |
| 352 | device->config_rom[3], device->config_rom[4]); | ||
| 353 | } | 375 | } |
| 354 | 376 | ||
| 355 | static struct device_attribute fw_device_attributes[] = { | 377 | static struct device_attribute fw_device_attributes[] = { |
| @@ -388,7 +410,7 @@ read_rom(struct fw_device *device, int generation, int index, u32 *data) | |||
| 388 | 410 | ||
| 389 | init_completion(&callback_data.done); | 411 | init_completion(&callback_data.done); |
| 390 | 412 | ||
| 391 | offset = 0xfffff0000400ULL + index * 4; | 413 | offset = (CSR_REGISTER_BASE | CSR_CONFIG_ROM) + index * 4; |
| 392 | fw_send_request(device->card, &t, TCODE_READ_QUADLET_REQUEST, | 414 | fw_send_request(device->card, &t, TCODE_READ_QUADLET_REQUEST, |
| 393 | device->node_id, generation, device->max_speed, | 415 | device->node_id, generation, device->max_speed, |
| 394 | offset, NULL, 4, complete_transaction, &callback_data); | 416 | offset, NULL, 4, complete_transaction, &callback_data); |
| @@ -400,6 +422,9 @@ read_rom(struct fw_device *device, int generation, int index, u32 *data) | |||
| 400 | return callback_data.rcode; | 422 | return callback_data.rcode; |
| 401 | } | 423 | } |
| 402 | 424 | ||
| 425 | #define READ_BIB_ROM_SIZE 256 | ||
| 426 | #define READ_BIB_STACK_SIZE 16 | ||
| 427 | |||
| 403 | /* | 428 | /* |
| 404 | * Read the bus info block, perform a speed probe, and read all of the rest of | 429 | * Read the bus info block, perform a speed probe, and read all of the rest of |
| 405 | * the config ROM. We do all this with a cached bus generation. If the bus | 430 | * the config ROM. We do all this with a cached bus generation. If the bus |
| @@ -409,16 +434,23 @@ read_rom(struct fw_device *device, int generation, int index, u32 *data) | |||
| 409 | */ | 434 | */ |
| 410 | static int read_bus_info_block(struct fw_device *device, int generation) | 435 | static int read_bus_info_block(struct fw_device *device, int generation) |
| 411 | { | 436 | { |
| 412 | static u32 rom[256]; | 437 | u32 *rom, *stack, *old_rom, *new_rom; |
| 413 | u32 stack[16], sp, key; | 438 | u32 sp, key; |
| 414 | int i, end, length; | 439 | int i, end, length, ret = -1; |
| 440 | |||
| 441 | rom = kmalloc(sizeof(*rom) * READ_BIB_ROM_SIZE + | ||
| 442 | sizeof(*stack) * READ_BIB_STACK_SIZE, GFP_KERNEL); | ||
| 443 | if (rom == NULL) | ||
| 444 | return -ENOMEM; | ||
| 445 | |||
| 446 | stack = &rom[READ_BIB_ROM_SIZE]; | ||
| 415 | 447 | ||
| 416 | device->max_speed = SCODE_100; | 448 | device->max_speed = SCODE_100; |
| 417 | 449 | ||
| 418 | /* First read the bus info block. */ | 450 | /* First read the bus info block. */ |
| 419 | for (i = 0; i < 5; i++) { | 451 | for (i = 0; i < 5; i++) { |
| 420 | if (read_rom(device, generation, i, &rom[i]) != RCODE_COMPLETE) | 452 | if (read_rom(device, generation, i, &rom[i]) != RCODE_COMPLETE) |
| 421 | return -1; | 453 | goto out; |
| 422 | /* | 454 | /* |
| 423 | * As per IEEE1212 7.2, during power-up, devices can | 455 | * As per IEEE1212 7.2, during power-up, devices can |
| 424 | * reply with a 0 for the first quadlet of the config | 456 | * reply with a 0 for the first quadlet of the config |
| @@ -428,7 +460,7 @@ static int read_bus_info_block(struct fw_device *device, int generation) | |||
| 428 | * retry mechanism will try again later. | 460 | * retry mechanism will try again later. |
| 429 | */ | 461 | */ |
| 430 | if (i == 0 && rom[i] == 0) | 462 | if (i == 0 && rom[i] == 0) |
| 431 | return -1; | 463 | goto out; |
| 432 | } | 464 | } |
| 433 | 465 | ||
| 434 | device->max_speed = device->node->max_speed; | 466 | device->max_speed = device->node->max_speed; |
| @@ -478,26 +510,26 @@ static int read_bus_info_block(struct fw_device *device, int generation) | |||
| 478 | */ | 510 | */ |
| 479 | key = stack[--sp]; | 511 | key = stack[--sp]; |
| 480 | i = key & 0xffffff; | 512 | i = key & 0xffffff; |
| 481 | if (i >= ARRAY_SIZE(rom)) | 513 | if (i >= READ_BIB_ROM_SIZE) |
| 482 | /* | 514 | /* |
| 483 | * The reference points outside the standard | 515 | * The reference points outside the standard |
| 484 | * config rom area, something's fishy. | 516 | * config rom area, something's fishy. |
| 485 | */ | 517 | */ |
| 486 | return -1; | 518 | goto out; |
| 487 | 519 | ||
| 488 | /* Read header quadlet for the block to get the length. */ | 520 | /* Read header quadlet for the block to get the length. */ |
| 489 | if (read_rom(device, generation, i, &rom[i]) != RCODE_COMPLETE) | 521 | if (read_rom(device, generation, i, &rom[i]) != RCODE_COMPLETE) |
| 490 | return -1; | 522 | goto out; |
| 491 | end = i + (rom[i] >> 16) + 1; | 523 | end = i + (rom[i] >> 16) + 1; |
| 492 | i++; | 524 | i++; |
| 493 | if (end > ARRAY_SIZE(rom)) | 525 | if (end > READ_BIB_ROM_SIZE) |
| 494 | /* | 526 | /* |
| 495 | * This block extends outside standard config | 527 | * This block extends outside standard config |
| 496 | * area (and the array we're reading it | 528 | * area (and the array we're reading it |
| 497 | * into). That's broken, so ignore this | 529 | * into). That's broken, so ignore this |
| 498 | * device. | 530 | * device. |
| 499 | */ | 531 | */ |
| 500 | return -1; | 532 | goto out; |
| 501 | 533 | ||
| 502 | /* | 534 | /* |
| 503 | * Now read in the block. If this is a directory | 535 | * Now read in the block. If this is a directory |
| @@ -507,9 +539,9 @@ static int read_bus_info_block(struct fw_device *device, int generation) | |||
| 507 | while (i < end) { | 539 | while (i < end) { |
| 508 | if (read_rom(device, generation, i, &rom[i]) != | 540 | if (read_rom(device, generation, i, &rom[i]) != |
| 509 | RCODE_COMPLETE) | 541 | RCODE_COMPLETE) |
| 510 | return -1; | 542 | goto out; |
| 511 | if ((key >> 30) == 3 && (rom[i] >> 30) > 1 && | 543 | if ((key >> 30) == 3 && (rom[i] >> 30) > 1 && |
| 512 | sp < ARRAY_SIZE(stack)) | 544 | sp < READ_BIB_STACK_SIZE) |
| 513 | stack[sp++] = i + rom[i]; | 545 | stack[sp++] = i + rom[i]; |
| 514 | i++; | 546 | i++; |
| 515 | } | 547 | } |
| @@ -517,13 +549,23 @@ static int read_bus_info_block(struct fw_device *device, int generation) | |||
| 517 | length = i; | 549 | length = i; |
| 518 | } | 550 | } |
| 519 | 551 | ||
| 520 | device->config_rom = kmalloc(length * 4, GFP_KERNEL); | 552 | old_rom = device->config_rom; |
| 521 | if (device->config_rom == NULL) | 553 | new_rom = kmemdup(rom, length * 4, GFP_KERNEL); |
| 522 | return -1; | 554 | if (new_rom == NULL) |
| 523 | memcpy(device->config_rom, rom, length * 4); | 555 | goto out; |
| 556 | |||
| 557 | down_write(&fw_device_rwsem); | ||
| 558 | device->config_rom = new_rom; | ||
| 524 | device->config_rom_length = length; | 559 | device->config_rom_length = length; |
| 560 | up_write(&fw_device_rwsem); | ||
| 525 | 561 | ||
| 526 | return 0; | 562 | kfree(old_rom); |
| 563 | ret = 0; | ||
| 564 | device->cmc = rom[2] & 1 << 30; | ||
| 565 | out: | ||
| 566 | kfree(rom); | ||
| 567 | |||
| 568 | return ret; | ||
| 527 | } | 569 | } |
| 528 | 570 | ||
| 529 | static void fw_unit_release(struct device *dev) | 571 | static void fw_unit_release(struct device *dev) |
| @@ -592,7 +634,14 @@ static int shutdown_unit(struct device *device, void *data) | |||
| 592 | return 0; | 634 | return 0; |
| 593 | } | 635 | } |
| 594 | 636 | ||
| 595 | static DECLARE_RWSEM(idr_rwsem); | 637 | /* |
| 638 | * fw_device_rwsem acts as dual purpose mutex: | ||
| 639 | * - serializes accesses to fw_device_idr, | ||
| 640 | * - serializes accesses to fw_device.config_rom/.config_rom_length and | ||
| 641 | * fw_unit.directory, unless those accesses happen at safe occasions | ||
| 642 | */ | ||
| 643 | DECLARE_RWSEM(fw_device_rwsem); | ||
| 644 | |||
| 596 | static DEFINE_IDR(fw_device_idr); | 645 | static DEFINE_IDR(fw_device_idr); |
| 597 | int fw_cdev_major; | 646 | int fw_cdev_major; |
| 598 | 647 | ||
| @@ -600,11 +649,11 @@ struct fw_device *fw_device_get_by_devt(dev_t devt) | |||
| 600 | { | 649 | { |
| 601 | struct fw_device *device; | 650 | struct fw_device *device; |
| 602 | 651 | ||
| 603 | down_read(&idr_rwsem); | 652 | down_read(&fw_device_rwsem); |
| 604 | device = idr_find(&fw_device_idr, MINOR(devt)); | 653 | device = idr_find(&fw_device_idr, MINOR(devt)); |
| 605 | if (device) | 654 | if (device) |
| 606 | fw_device_get(device); | 655 | fw_device_get(device); |
| 607 | up_read(&idr_rwsem); | 656 | up_read(&fw_device_rwsem); |
| 608 | 657 | ||
| 609 | return device; | 658 | return device; |
| 610 | } | 659 | } |
| @@ -619,9 +668,9 @@ static void fw_device_shutdown(struct work_struct *work) | |||
| 619 | device_for_each_child(&device->device, NULL, shutdown_unit); | 668 | device_for_each_child(&device->device, NULL, shutdown_unit); |
| 620 | device_unregister(&device->device); | 669 | device_unregister(&device->device); |
| 621 | 670 | ||
| 622 | down_write(&idr_rwsem); | 671 | down_write(&fw_device_rwsem); |
| 623 | idr_remove(&fw_device_idr, minor); | 672 | idr_remove(&fw_device_idr, minor); |
| 624 | up_write(&idr_rwsem); | 673 | up_write(&fw_device_rwsem); |
| 625 | fw_device_put(device); | 674 | fw_device_put(device); |
| 626 | } | 675 | } |
| 627 | 676 | ||
| @@ -674,10 +723,10 @@ static void fw_device_init(struct work_struct *work) | |||
| 674 | err = -ENOMEM; | 723 | err = -ENOMEM; |
| 675 | 724 | ||
| 676 | fw_device_get(device); | 725 | fw_device_get(device); |
| 677 | down_write(&idr_rwsem); | 726 | down_write(&fw_device_rwsem); |
| 678 | if (idr_pre_get(&fw_device_idr, GFP_KERNEL)) | 727 | if (idr_pre_get(&fw_device_idr, GFP_KERNEL)) |
| 679 | err = idr_get_new(&fw_device_idr, device, &minor); | 728 | err = idr_get_new(&fw_device_idr, device, &minor); |
| 680 | up_write(&idr_rwsem); | 729 | up_write(&fw_device_rwsem); |
| 681 | 730 | ||
| 682 | if (err < 0) | 731 | if (err < 0) |
| 683 | goto error; | 732 | goto error; |
| @@ -711,7 +760,7 @@ static void fw_device_init(struct work_struct *work) | |||
| 711 | if (atomic_cmpxchg(&device->state, | 760 | if (atomic_cmpxchg(&device->state, |
| 712 | FW_DEVICE_INITIALIZING, | 761 | FW_DEVICE_INITIALIZING, |
| 713 | FW_DEVICE_RUNNING) == FW_DEVICE_SHUTDOWN) { | 762 | FW_DEVICE_RUNNING) == FW_DEVICE_SHUTDOWN) { |
| 714 | fw_device_shutdown(&device->work.work); | 763 | fw_device_shutdown(work); |
| 715 | } else { | 764 | } else { |
| 716 | if (device->config_rom_retries) | 765 | if (device->config_rom_retries) |
| 717 | fw_notify("created device %s: GUID %08x%08x, S%d00, " | 766 | fw_notify("created device %s: GUID %08x%08x, S%d00, " |
| @@ -725,6 +774,7 @@ static void fw_device_init(struct work_struct *work) | |||
| 725 | device->device.bus_id, | 774 | device->device.bus_id, |
| 726 | device->config_rom[3], device->config_rom[4], | 775 | device->config_rom[3], device->config_rom[4], |
| 727 | 1 << device->max_speed); | 776 | 1 << device->max_speed); |
| 777 | device->config_rom_retries = 0; | ||
| 728 | } | 778 | } |
| 729 | 779 | ||
| 730 | /* | 780 | /* |
| @@ -739,9 +789,9 @@ static void fw_device_init(struct work_struct *work) | |||
| 739 | return; | 789 | return; |
| 740 | 790 | ||
| 741 | error_with_cdev: | 791 | error_with_cdev: |
| 742 | down_write(&idr_rwsem); | 792 | down_write(&fw_device_rwsem); |
| 743 | idr_remove(&fw_device_idr, minor); | 793 | idr_remove(&fw_device_idr, minor); |
| 744 | up_write(&idr_rwsem); | 794 | up_write(&fw_device_rwsem); |
| 745 | error: | 795 | error: |
| 746 | fw_device_put(device); /* fw_device_idr's reference */ | 796 | fw_device_put(device); /* fw_device_idr's reference */ |
| 747 | 797 | ||
| @@ -771,6 +821,106 @@ static void fw_device_update(struct work_struct *work) | |||
| 771 | device_for_each_child(&device->device, NULL, update_unit); | 821 | device_for_each_child(&device->device, NULL, update_unit); |
| 772 | } | 822 | } |
| 773 | 823 | ||
| 824 | enum { | ||
| 825 | REREAD_BIB_ERROR, | ||
| 826 | REREAD_BIB_GONE, | ||
| 827 | REREAD_BIB_UNCHANGED, | ||
| 828 | REREAD_BIB_CHANGED, | ||
| 829 | }; | ||
| 830 | |||
| 831 | /* Reread and compare bus info block and header of root directory */ | ||
| 832 | static int reread_bus_info_block(struct fw_device *device, int generation) | ||
| 833 | { | ||
| 834 | u32 q; | ||
| 835 | int i; | ||
| 836 | |||
| 837 | for (i = 0; i < 6; i++) { | ||
| 838 | if (read_rom(device, generation, i, &q) != RCODE_COMPLETE) | ||
| 839 | return REREAD_BIB_ERROR; | ||
| 840 | |||
| 841 | if (i == 0 && q == 0) | ||
| 842 | return REREAD_BIB_GONE; | ||
| 843 | |||
| 844 | if (i > device->config_rom_length || q != device->config_rom[i]) | ||
| 845 | return REREAD_BIB_CHANGED; | ||
| 846 | } | ||
| 847 | |||
| 848 | return REREAD_BIB_UNCHANGED; | ||
| 849 | } | ||
| 850 | |||
| 851 | static void fw_device_refresh(struct work_struct *work) | ||
| 852 | { | ||
| 853 | struct fw_device *device = | ||
| 854 | container_of(work, struct fw_device, work.work); | ||
| 855 | struct fw_card *card = device->card; | ||
| 856 | int node_id = device->node_id; | ||
| 857 | |||
| 858 | switch (reread_bus_info_block(device, device->generation)) { | ||
| 859 | case REREAD_BIB_ERROR: | ||
| 860 | if (device->config_rom_retries < MAX_RETRIES / 2 && | ||
| 861 | atomic_read(&device->state) == FW_DEVICE_INITIALIZING) { | ||
| 862 | device->config_rom_retries++; | ||
| 863 | schedule_delayed_work(&device->work, RETRY_DELAY / 2); | ||
| 864 | |||
| 865 | return; | ||
| 866 | } | ||
| 867 | goto give_up; | ||
| 868 | |||
| 869 | case REREAD_BIB_GONE: | ||
| 870 | goto gone; | ||
| 871 | |||
| 872 | case REREAD_BIB_UNCHANGED: | ||
| 873 | if (atomic_cmpxchg(&device->state, | ||
| 874 | FW_DEVICE_INITIALIZING, | ||
| 875 | FW_DEVICE_RUNNING) == FW_DEVICE_SHUTDOWN) | ||
| 876 | goto gone; | ||
| 877 | |||
| 878 | fw_device_update(work); | ||
| 879 | device->config_rom_retries = 0; | ||
| 880 | goto out; | ||
| 881 | |||
| 882 | case REREAD_BIB_CHANGED: | ||
| 883 | break; | ||
| 884 | } | ||
| 885 | |||
| 886 | /* | ||
| 887 | * Something changed. We keep things simple and don't investigate | ||
| 888 | * further. We just destroy all previous units and create new ones. | ||
| 889 | */ | ||
| 890 | device_for_each_child(&device->device, NULL, shutdown_unit); | ||
| 891 | |||
| 892 | if (read_bus_info_block(device, device->generation) < 0) { | ||
| 893 | if (device->config_rom_retries < MAX_RETRIES && | ||
| 894 | atomic_read(&device->state) == FW_DEVICE_INITIALIZING) { | ||
| 895 | device->config_rom_retries++; | ||
| 896 | schedule_delayed_work(&device->work, RETRY_DELAY); | ||
| 897 | |||
| 898 | return; | ||
| 899 | } | ||
| 900 | goto give_up; | ||
| 901 | } | ||
| 902 | |||
| 903 | create_units(device); | ||
| 904 | |||
| 905 | if (atomic_cmpxchg(&device->state, | ||
| 906 | FW_DEVICE_INITIALIZING, | ||
| 907 | FW_DEVICE_RUNNING) == FW_DEVICE_SHUTDOWN) | ||
| 908 | goto gone; | ||
| 909 | |||
| 910 | fw_notify("refreshed device %s\n", device->device.bus_id); | ||
| 911 | device->config_rom_retries = 0; | ||
| 912 | goto out; | ||
| 913 | |||
| 914 | give_up: | ||
| 915 | fw_notify("giving up on refresh of device %s\n", device->device.bus_id); | ||
| 916 | gone: | ||
| 917 | atomic_set(&device->state, FW_DEVICE_SHUTDOWN); | ||
| 918 | fw_device_shutdown(work); | ||
| 919 | out: | ||
| 920 | if (node_id == card->root_node->node_id) | ||
| 921 | schedule_delayed_work(&card->work, 0); | ||
| 922 | } | ||
| 923 | |||
| 774 | void fw_node_event(struct fw_card *card, struct fw_node *node, int event) | 924 | void fw_node_event(struct fw_card *card, struct fw_node *node, int event) |
| 775 | { | 925 | { |
| 776 | struct fw_device *device; | 926 | struct fw_device *device; |
| @@ -780,7 +930,7 @@ void fw_node_event(struct fw_card *card, struct fw_node *node, int event) | |||
| 780 | case FW_NODE_LINK_ON: | 930 | case FW_NODE_LINK_ON: |
| 781 | if (!node->link_on) | 931 | if (!node->link_on) |
| 782 | break; | 932 | break; |
| 783 | 933 | create: | |
| 784 | device = kzalloc(sizeof(*device), GFP_ATOMIC); | 934 | device = kzalloc(sizeof(*device), GFP_ATOMIC); |
| 785 | if (device == NULL) | 935 | if (device == NULL) |
| 786 | break; | 936 | break; |
| @@ -819,6 +969,23 @@ void fw_node_event(struct fw_card *card, struct fw_node *node, int event) | |||
| 819 | schedule_delayed_work(&device->work, INITIAL_DELAY); | 969 | schedule_delayed_work(&device->work, INITIAL_DELAY); |
| 820 | break; | 970 | break; |
| 821 | 971 | ||
| 972 | case FW_NODE_INITIATED_RESET: | ||
| 973 | device = node->data; | ||
| 974 | if (device == NULL) | ||
| 975 | goto create; | ||
| 976 | |||
| 977 | device->node_id = node->node_id; | ||
| 978 | smp_wmb(); /* update node_id before generation */ | ||
| 979 | device->generation = card->generation; | ||
| 980 | if (atomic_cmpxchg(&device->state, | ||
| 981 | FW_DEVICE_RUNNING, | ||
| 982 | FW_DEVICE_INITIALIZING) == FW_DEVICE_RUNNING) { | ||
| 983 | PREPARE_DELAYED_WORK(&device->work, fw_device_refresh); | ||
| 984 | schedule_delayed_work(&device->work, | ||
| 985 | node == card->local_node ? 0 : INITIAL_DELAY); | ||
| 986 | } | ||
| 987 | break; | ||
| 988 | |||
| 822 | case FW_NODE_UPDATED: | 989 | case FW_NODE_UPDATED: |
| 823 | if (!node->link_on || node->data == NULL) | 990 | if (!node->link_on || node->data == NULL) |
| 824 | break; | 991 | break; |
diff --git a/drivers/firewire/fw-device.h b/drivers/firewire/fw-device.h index 78ecd3991b7f..5f131f5129da 100644 --- a/drivers/firewire/fw-device.h +++ b/drivers/firewire/fw-device.h | |||
| @@ -21,6 +21,7 @@ | |||
| 21 | 21 | ||
| 22 | #include <linux/fs.h> | 22 | #include <linux/fs.h> |
| 23 | #include <linux/cdev.h> | 23 | #include <linux/cdev.h> |
| 24 | #include <linux/rwsem.h> | ||
| 24 | #include <asm/atomic.h> | 25 | #include <asm/atomic.h> |
| 25 | 26 | ||
| 26 | enum fw_device_state { | 27 | enum fw_device_state { |
| @@ -46,6 +47,11 @@ struct fw_attribute_group { | |||
| 46 | * fw_device.node_id is guaranteed to be current too. | 47 | * fw_device.node_id is guaranteed to be current too. |
| 47 | * | 48 | * |
| 48 | * The same applies to fw_device.card->node_id vs. fw_device.generation. | 49 | * The same applies to fw_device.card->node_id vs. fw_device.generation. |
| 50 | * | ||
| 51 | * fw_device.config_rom and fw_device.config_rom_length may be accessed during | ||
| 52 | * the lifetime of any fw_unit belonging to the fw_device, before device_del() | ||
| 53 | * was called on the last fw_unit. Alternatively, they may be accessed while | ||
| 54 | * holding fw_device_rwsem. | ||
| 49 | */ | 55 | */ |
| 50 | struct fw_device { | 56 | struct fw_device { |
| 51 | atomic_t state; | 57 | atomic_t state; |
| @@ -53,6 +59,7 @@ struct fw_device { | |||
| 53 | int node_id; | 59 | int node_id; |
| 54 | int generation; | 60 | int generation; |
| 55 | unsigned max_speed; | 61 | unsigned max_speed; |
| 62 | bool cmc; | ||
| 56 | struct fw_card *card; | 63 | struct fw_card *card; |
| 57 | struct device device; | 64 | struct device device; |
| 58 | struct list_head link; | 65 | struct list_head link; |
| @@ -64,28 +71,24 @@ struct fw_device { | |||
| 64 | struct fw_attribute_group attribute_group; | 71 | struct fw_attribute_group attribute_group; |
| 65 | }; | 72 | }; |
| 66 | 73 | ||
| 67 | static inline struct fw_device * | 74 | static inline struct fw_device *fw_device(struct device *dev) |
| 68 | fw_device(struct device *dev) | ||
| 69 | { | 75 | { |
| 70 | return container_of(dev, struct fw_device, device); | 76 | return container_of(dev, struct fw_device, device); |
| 71 | } | 77 | } |
| 72 | 78 | ||
| 73 | static inline int | 79 | static inline int fw_device_is_shutdown(struct fw_device *device) |
| 74 | fw_device_is_shutdown(struct fw_device *device) | ||
| 75 | { | 80 | { |
| 76 | return atomic_read(&device->state) == FW_DEVICE_SHUTDOWN; | 81 | return atomic_read(&device->state) == FW_DEVICE_SHUTDOWN; |
| 77 | } | 82 | } |
| 78 | 83 | ||
| 79 | static inline struct fw_device * | 84 | static inline struct fw_device *fw_device_get(struct fw_device *device) |
| 80 | fw_device_get(struct fw_device *device) | ||
| 81 | { | 85 | { |
| 82 | get_device(&device->device); | 86 | get_device(&device->device); |
| 83 | 87 | ||
| 84 | return device; | 88 | return device; |
| 85 | } | 89 | } |
| 86 | 90 | ||
| 87 | static inline void | 91 | static inline void fw_device_put(struct fw_device *device) |
| 88 | fw_device_put(struct fw_device *device) | ||
| 89 | { | 92 | { |
| 90 | put_device(&device->device); | 93 | put_device(&device->device); |
| 91 | } | 94 | } |
| @@ -96,20 +99,35 @@ int fw_device_enable_phys_dma(struct fw_device *device); | |||
| 96 | void fw_device_cdev_update(struct fw_device *device); | 99 | void fw_device_cdev_update(struct fw_device *device); |
| 97 | void fw_device_cdev_remove(struct fw_device *device); | 100 | void fw_device_cdev_remove(struct fw_device *device); |
| 98 | 101 | ||
| 102 | extern struct rw_semaphore fw_device_rwsem; | ||
| 99 | extern int fw_cdev_major; | 103 | extern int fw_cdev_major; |
| 100 | 104 | ||
| 105 | /* | ||
| 106 | * fw_unit.directory must not be accessed after device_del(&fw_unit.device). | ||
| 107 | */ | ||
| 101 | struct fw_unit { | 108 | struct fw_unit { |
| 102 | struct device device; | 109 | struct device device; |
| 103 | u32 *directory; | 110 | u32 *directory; |
| 104 | struct fw_attribute_group attribute_group; | 111 | struct fw_attribute_group attribute_group; |
| 105 | }; | 112 | }; |
| 106 | 113 | ||
| 107 | static inline struct fw_unit * | 114 | static inline struct fw_unit *fw_unit(struct device *dev) |
| 108 | fw_unit(struct device *dev) | ||
| 109 | { | 115 | { |
| 110 | return container_of(dev, struct fw_unit, device); | 116 | return container_of(dev, struct fw_unit, device); |
| 111 | } | 117 | } |
| 112 | 118 | ||
| 119 | static inline struct fw_unit *fw_unit_get(struct fw_unit *unit) | ||
| 120 | { | ||
| 121 | get_device(&unit->device); | ||
| 122 | |||
| 123 | return unit; | ||
| 124 | } | ||
| 125 | |||
| 126 | static inline void fw_unit_put(struct fw_unit *unit) | ||
| 127 | { | ||
| 128 | put_device(&unit->device); | ||
| 129 | } | ||
| 130 | |||
| 113 | #define CSR_OFFSET 0x40 | 131 | #define CSR_OFFSET 0x40 |
| 114 | #define CSR_LEAF 0x80 | 132 | #define CSR_LEAF 0x80 |
| 115 | #define CSR_DIRECTORY 0xc0 | 133 | #define CSR_DIRECTORY 0xc0 |
diff --git a/drivers/firewire/fw-iso.c b/drivers/firewire/fw-iso.c index 2b640e9be6de..bcbe794a3ea5 100644 --- a/drivers/firewire/fw-iso.c +++ b/drivers/firewire/fw-iso.c | |||
| @@ -126,7 +126,6 @@ fw_iso_context_create(struct fw_card *card, int type, | |||
| 126 | 126 | ||
| 127 | return ctx; | 127 | return ctx; |
| 128 | } | 128 | } |
| 129 | EXPORT_SYMBOL(fw_iso_context_create); | ||
| 130 | 129 | ||
| 131 | void fw_iso_context_destroy(struct fw_iso_context *ctx) | 130 | void fw_iso_context_destroy(struct fw_iso_context *ctx) |
| 132 | { | 131 | { |
| @@ -134,14 +133,12 @@ void fw_iso_context_destroy(struct fw_iso_context *ctx) | |||
| 134 | 133 | ||
| 135 | card->driver->free_iso_context(ctx); | 134 | card->driver->free_iso_context(ctx); |
| 136 | } | 135 | } |
| 137 | EXPORT_SYMBOL(fw_iso_context_destroy); | ||
| 138 | 136 | ||
| 139 | int | 137 | int |
| 140 | fw_iso_context_start(struct fw_iso_context *ctx, int cycle, int sync, int tags) | 138 | fw_iso_context_start(struct fw_iso_context *ctx, int cycle, int sync, int tags) |
| 141 | { | 139 | { |
| 142 | return ctx->card->driver->start_iso(ctx, cycle, sync, tags); | 140 | return ctx->card->driver->start_iso(ctx, cycle, sync, tags); |
| 143 | } | 141 | } |
| 144 | EXPORT_SYMBOL(fw_iso_context_start); | ||
| 145 | 142 | ||
| 146 | int | 143 | int |
| 147 | fw_iso_context_queue(struct fw_iso_context *ctx, | 144 | fw_iso_context_queue(struct fw_iso_context *ctx, |
| @@ -153,11 +150,9 @@ fw_iso_context_queue(struct fw_iso_context *ctx, | |||
| 153 | 150 | ||
| 154 | return card->driver->queue_iso(ctx, packet, buffer, payload); | 151 | return card->driver->queue_iso(ctx, packet, buffer, payload); |
| 155 | } | 152 | } |
| 156 | EXPORT_SYMBOL(fw_iso_context_queue); | ||
| 157 | 153 | ||
| 158 | int | 154 | int |
| 159 | fw_iso_context_stop(struct fw_iso_context *ctx) | 155 | fw_iso_context_stop(struct fw_iso_context *ctx) |
| 160 | { | 156 | { |
| 161 | return ctx->card->driver->stop_iso(ctx); | 157 | return ctx->card->driver->stop_iso(ctx); |
| 162 | } | 158 | } |
| 163 | EXPORT_SYMBOL(fw_iso_context_stop); | ||
diff --git a/drivers/firewire/fw-ohci.c b/drivers/firewire/fw-ohci.c index ca6d51efd8bb..4f02c55f13e1 100644 --- a/drivers/firewire/fw-ohci.c +++ b/drivers/firewire/fw-ohci.c | |||
| @@ -27,6 +27,7 @@ | |||
| 27 | #include <linux/kernel.h> | 27 | #include <linux/kernel.h> |
| 28 | #include <linux/mm.h> | 28 | #include <linux/mm.h> |
| 29 | #include <linux/module.h> | 29 | #include <linux/module.h> |
| 30 | #include <linux/moduleparam.h> | ||
| 30 | #include <linux/pci.h> | 31 | #include <linux/pci.h> |
| 31 | #include <linux/spinlock.h> | 32 | #include <linux/spinlock.h> |
| 32 | 33 | ||
| @@ -177,9 +178,10 @@ struct fw_ohci { | |||
| 177 | struct tasklet_struct bus_reset_tasklet; | 178 | struct tasklet_struct bus_reset_tasklet; |
| 178 | int node_id; | 179 | int node_id; |
| 179 | int generation; | 180 | int generation; |
| 180 | int request_generation; | 181 | int request_generation; /* for timestamping incoming requests */ |
| 181 | u32 bus_seconds; | 182 | u32 bus_seconds; |
| 182 | bool old_uninorth; | 183 | bool old_uninorth; |
| 184 | bool bus_reset_packet_quirk; | ||
| 183 | 185 | ||
| 184 | /* | 186 | /* |
| 185 | * Spinlock for accessing fw_ohci data. Never call out of | 187 | * Spinlock for accessing fw_ohci data. Never call out of |
| @@ -237,6 +239,196 @@ static inline struct fw_ohci *fw_ohci(struct fw_card *card) | |||
| 237 | 239 | ||
| 238 | static char ohci_driver_name[] = KBUILD_MODNAME; | 240 | static char ohci_driver_name[] = KBUILD_MODNAME; |
| 239 | 241 | ||
| 242 | #ifdef CONFIG_FIREWIRE_OHCI_DEBUG | ||
| 243 | |||
| 244 | #define OHCI_PARAM_DEBUG_AT_AR 1 | ||
| 245 | #define OHCI_PARAM_DEBUG_SELFIDS 2 | ||
| 246 | #define OHCI_PARAM_DEBUG_IRQS 4 | ||
| 247 | #define OHCI_PARAM_DEBUG_BUSRESETS 8 /* only effective before chip init */ | ||
| 248 | |||
| 249 | static int param_debug; | ||
| 250 | module_param_named(debug, param_debug, int, 0644); | ||
| 251 | MODULE_PARM_DESC(debug, "Verbose logging (default = 0" | ||
| 252 | ", AT/AR events = " __stringify(OHCI_PARAM_DEBUG_AT_AR) | ||
| 253 | ", self-IDs = " __stringify(OHCI_PARAM_DEBUG_SELFIDS) | ||
| 254 | ", IRQs = " __stringify(OHCI_PARAM_DEBUG_IRQS) | ||
| 255 | ", busReset events = " __stringify(OHCI_PARAM_DEBUG_BUSRESETS) | ||
| 256 | ", or a combination, or all = -1)"); | ||
| 257 | |||
| 258 | static void log_irqs(u32 evt) | ||
| 259 | { | ||
| 260 | if (likely(!(param_debug & | ||
| 261 | (OHCI_PARAM_DEBUG_IRQS | OHCI_PARAM_DEBUG_BUSRESETS)))) | ||
| 262 | return; | ||
| 263 | |||
| 264 | if (!(param_debug & OHCI_PARAM_DEBUG_IRQS) && | ||
| 265 | !(evt & OHCI1394_busReset)) | ||
| 266 | return; | ||
| 267 | |||
| 268 | printk(KERN_DEBUG KBUILD_MODNAME ": IRQ " | ||
| 269 | "%08x%s%s%s%s%s%s%s%s%s%s%s%s%s\n", | ||
| 270 | evt, | ||
| 271 | evt & OHCI1394_selfIDComplete ? " selfID" : "", | ||
| 272 | evt & OHCI1394_RQPkt ? " AR_req" : "", | ||
| 273 | evt & OHCI1394_RSPkt ? " AR_resp" : "", | ||
| 274 | evt & OHCI1394_reqTxComplete ? " AT_req" : "", | ||
| 275 | evt & OHCI1394_respTxComplete ? " AT_resp" : "", | ||
| 276 | evt & OHCI1394_isochRx ? " IR" : "", | ||
| 277 | evt & OHCI1394_isochTx ? " IT" : "", | ||
| 278 | evt & OHCI1394_postedWriteErr ? " postedWriteErr" : "", | ||
| 279 | evt & OHCI1394_cycleTooLong ? " cycleTooLong" : "", | ||
| 280 | evt & OHCI1394_cycle64Seconds ? " cycle64Seconds" : "", | ||
| 281 | evt & OHCI1394_regAccessFail ? " regAccessFail" : "", | ||
| 282 | evt & OHCI1394_busReset ? " busReset" : "", | ||
| 283 | evt & ~(OHCI1394_selfIDComplete | OHCI1394_RQPkt | | ||
| 284 | OHCI1394_RSPkt | OHCI1394_reqTxComplete | | ||
| 285 | OHCI1394_respTxComplete | OHCI1394_isochRx | | ||
| 286 | OHCI1394_isochTx | OHCI1394_postedWriteErr | | ||
| 287 | OHCI1394_cycleTooLong | OHCI1394_cycle64Seconds | | ||
| 288 | OHCI1394_regAccessFail | OHCI1394_busReset) | ||
| 289 | ? " ?" : ""); | ||
| 290 | } | ||
| 291 | |||
| 292 | static const char *speed[] = { | ||
| 293 | [0] = "S100", [1] = "S200", [2] = "S400", [3] = "beta", | ||
| 294 | }; | ||
| 295 | static const char *power[] = { | ||
| 296 | [0] = "+0W", [1] = "+15W", [2] = "+30W", [3] = "+45W", | ||
| 297 | [4] = "-3W", [5] = " ?W", [6] = "-3..-6W", [7] = "-3..-10W", | ||
| 298 | }; | ||
| 299 | static const char port[] = { '.', '-', 'p', 'c', }; | ||
| 300 | |||
| 301 | static char _p(u32 *s, int shift) | ||
| 302 | { | ||
| 303 | return port[*s >> shift & 3]; | ||
| 304 | } | ||
| 305 | |||
| 306 | static void log_selfids(int node_id, int generation, int self_id_count, u32 *s) | ||
| 307 | { | ||
| 308 | if (likely(!(param_debug & OHCI_PARAM_DEBUG_SELFIDS))) | ||
| 309 | return; | ||
| 310 | |||
| 311 | printk(KERN_DEBUG KBUILD_MODNAME ": %d selfIDs, generation %d, " | ||
| 312 | "local node ID %04x\n", self_id_count, generation, node_id); | ||
| 313 | |||
| 314 | for (; self_id_count--; ++s) | ||
| 315 | if ((*s & 1 << 23) == 0) | ||
| 316 | printk(KERN_DEBUG "selfID 0: %08x, phy %d [%c%c%c] " | ||
| 317 | "%s gc=%d %s %s%s%s\n", | ||
| 318 | *s, *s >> 24 & 63, _p(s, 6), _p(s, 4), _p(s, 2), | ||
| 319 | speed[*s >> 14 & 3], *s >> 16 & 63, | ||
| 320 | power[*s >> 8 & 7], *s >> 22 & 1 ? "L" : "", | ||
| 321 | *s >> 11 & 1 ? "c" : "", *s & 2 ? "i" : ""); | ||
| 322 | else | ||
| 323 | printk(KERN_DEBUG "selfID n: %08x, phy %d " | ||
| 324 | "[%c%c%c%c%c%c%c%c]\n", | ||
| 325 | *s, *s >> 24 & 63, | ||
| 326 | _p(s, 16), _p(s, 14), _p(s, 12), _p(s, 10), | ||
| 327 | _p(s, 8), _p(s, 6), _p(s, 4), _p(s, 2)); | ||
| 328 | } | ||
| 329 | |||
| 330 | static const char *evts[] = { | ||
| 331 | [0x00] = "evt_no_status", [0x01] = "-reserved-", | ||
| 332 | [0x02] = "evt_long_packet", [0x03] = "evt_missing_ack", | ||
| 333 | [0x04] = "evt_underrun", [0x05] = "evt_overrun", | ||
| 334 | [0x06] = "evt_descriptor_read", [0x07] = "evt_data_read", | ||
| 335 | [0x08] = "evt_data_write", [0x09] = "evt_bus_reset", | ||
| 336 | [0x0a] = "evt_timeout", [0x0b] = "evt_tcode_err", | ||
| 337 | [0x0c] = "-reserved-", [0x0d] = "-reserved-", | ||
| 338 | [0x0e] = "evt_unknown", [0x0f] = "evt_flushed", | ||
| 339 | [0x10] = "-reserved-", [0x11] = "ack_complete", | ||
| 340 | [0x12] = "ack_pending ", [0x13] = "-reserved-", | ||
| 341 | [0x14] = "ack_busy_X", [0x15] = "ack_busy_A", | ||
| 342 | [0x16] = "ack_busy_B", [0x17] = "-reserved-", | ||
| 343 | [0x18] = "-reserved-", [0x19] = "-reserved-", | ||
| 344 | [0x1a] = "-reserved-", [0x1b] = "ack_tardy", | ||
| 345 | [0x1c] = "-reserved-", [0x1d] = "ack_data_error", | ||
| 346 | [0x1e] = "ack_type_error", [0x1f] = "-reserved-", | ||
| 347 | [0x20] = "pending/cancelled", | ||
| 348 | }; | ||
| 349 | static const char *tcodes[] = { | ||
| 350 | [0x0] = "QW req", [0x1] = "BW req", | ||
| 351 | [0x2] = "W resp", [0x3] = "-reserved-", | ||
| 352 | [0x4] = "QR req", [0x5] = "BR req", | ||
| 353 | [0x6] = "QR resp", [0x7] = "BR resp", | ||
| 354 | [0x8] = "cycle start", [0x9] = "Lk req", | ||
| 355 | [0xa] = "async stream packet", [0xb] = "Lk resp", | ||
| 356 | [0xc] = "-reserved-", [0xd] = "-reserved-", | ||
| 357 | [0xe] = "link internal", [0xf] = "-reserved-", | ||
| 358 | }; | ||
| 359 | static const char *phys[] = { | ||
| 360 | [0x0] = "phy config packet", [0x1] = "link-on packet", | ||
| 361 | [0x2] = "self-id packet", [0x3] = "-reserved-", | ||
| 362 | }; | ||
| 363 | |||
| 364 | static void log_ar_at_event(char dir, int speed, u32 *header, int evt) | ||
| 365 | { | ||
| 366 | int tcode = header[0] >> 4 & 0xf; | ||
| 367 | char specific[12]; | ||
| 368 | |||
| 369 | if (likely(!(param_debug & OHCI_PARAM_DEBUG_AT_AR))) | ||
| 370 | return; | ||
| 371 | |||
| 372 | if (unlikely(evt >= ARRAY_SIZE(evts))) | ||
| 373 | evt = 0x1f; | ||
| 374 | |||
| 375 | if (evt == OHCI1394_evt_bus_reset) { | ||
| 376 | printk(KERN_DEBUG "A%c evt_bus_reset, generation %d\n", | ||
| 377 | dir, (header[2] >> 16) & 0xff); | ||
| 378 | return; | ||
| 379 | } | ||
| 380 | |||
| 381 | if (header[0] == ~header[1]) { | ||
| 382 | printk(KERN_DEBUG "A%c %s, %s, %08x\n", | ||
| 383 | dir, evts[evt], phys[header[0] >> 30 & 0x3], | ||
| 384 | header[0]); | ||
| 385 | return; | ||
| 386 | } | ||
| 387 | |||
| 388 | switch (tcode) { | ||
| 389 | case 0x0: case 0x6: case 0x8: | ||
| 390 | snprintf(specific, sizeof(specific), " = %08x", | ||
| 391 | be32_to_cpu((__force __be32)header[3])); | ||
| 392 | break; | ||
| 393 | case 0x1: case 0x5: case 0x7: case 0x9: case 0xb: | ||
| 394 | snprintf(specific, sizeof(specific), " %x,%x", | ||
| 395 | header[3] >> 16, header[3] & 0xffff); | ||
| 396 | break; | ||
| 397 | default: | ||
| 398 | specific[0] = '\0'; | ||
| 399 | } | ||
| 400 | |||
| 401 | switch (tcode) { | ||
| 402 | case 0xe: case 0xa: | ||
| 403 | printk(KERN_DEBUG "A%c %s, %s\n", | ||
| 404 | dir, evts[evt], tcodes[tcode]); | ||
| 405 | break; | ||
| 406 | case 0x0: case 0x1: case 0x4: case 0x5: case 0x9: | ||
| 407 | printk(KERN_DEBUG "A%c spd %x tl %02x, " | ||
| 408 | "%04x -> %04x, %s, " | ||
| 409 | "%s, %04x%08x%s\n", | ||
| 410 | dir, speed, header[0] >> 10 & 0x3f, | ||
| 411 | header[1] >> 16, header[0] >> 16, evts[evt], | ||
| 412 | tcodes[tcode], header[1] & 0xffff, header[2], specific); | ||
| 413 | break; | ||
| 414 | default: | ||
| 415 | printk(KERN_DEBUG "A%c spd %x tl %02x, " | ||
| 416 | "%04x -> %04x, %s, " | ||
| 417 | "%s%s\n", | ||
| 418 | dir, speed, header[0] >> 10 & 0x3f, | ||
| 419 | header[1] >> 16, header[0] >> 16, evts[evt], | ||
| 420 | tcodes[tcode], specific); | ||
| 421 | } | ||
| 422 | } | ||
| 423 | |||
| 424 | #else | ||
| 425 | |||
| 426 | #define log_irqs(evt) | ||
| 427 | #define log_selfids(node_id, generation, self_id_count, sid) | ||
| 428 | #define log_ar_at_event(dir, speed, header, evt) | ||
| 429 | |||
| 430 | #endif /* CONFIG_FIREWIRE_OHCI_DEBUG */ | ||
| 431 | |||
| 240 | static inline void reg_write(const struct fw_ohci *ohci, int offset, u32 data) | 432 | static inline void reg_write(const struct fw_ohci *ohci, int offset, u32 data) |
| 241 | { | 433 | { |
| 242 | writel(data, ohci->registers + offset); | 434 | writel(data, ohci->registers + offset); |
| @@ -320,6 +512,7 @@ static __le32 *handle_ar_packet(struct ar_context *ctx, __le32 *buffer) | |||
| 320 | struct fw_ohci *ohci = ctx->ohci; | 512 | struct fw_ohci *ohci = ctx->ohci; |
| 321 | struct fw_packet p; | 513 | struct fw_packet p; |
| 322 | u32 status, length, tcode; | 514 | u32 status, length, tcode; |
| 515 | int evt; | ||
| 323 | 516 | ||
| 324 | p.header[0] = cond_le32_to_cpu(buffer[0]); | 517 | p.header[0] = cond_le32_to_cpu(buffer[0]); |
| 325 | p.header[1] = cond_le32_to_cpu(buffer[1]); | 518 | p.header[1] = cond_le32_to_cpu(buffer[1]); |
| @@ -362,12 +555,15 @@ static __le32 *handle_ar_packet(struct ar_context *ctx, __le32 *buffer) | |||
| 362 | /* FIXME: What to do about evt_* errors? */ | 555 | /* FIXME: What to do about evt_* errors? */ |
| 363 | length = (p.header_length + p.payload_length + 3) / 4; | 556 | length = (p.header_length + p.payload_length + 3) / 4; |
| 364 | status = cond_le32_to_cpu(buffer[length]); | 557 | status = cond_le32_to_cpu(buffer[length]); |
| 558 | evt = (status >> 16) & 0x1f; | ||
| 365 | 559 | ||
| 366 | p.ack = ((status >> 16) & 0x1f) - 16; | 560 | p.ack = evt - 16; |
| 367 | p.speed = (status >> 21) & 0x7; | 561 | p.speed = (status >> 21) & 0x7; |
| 368 | p.timestamp = status & 0xffff; | 562 | p.timestamp = status & 0xffff; |
| 369 | p.generation = ohci->request_generation; | 563 | p.generation = ohci->request_generation; |
| 370 | 564 | ||
| 565 | log_ar_at_event('R', p.speed, p.header, evt); | ||
| 566 | |||
| 371 | /* | 567 | /* |
| 372 | * The OHCI bus reset handler synthesizes a phy packet with | 568 | * The OHCI bus reset handler synthesizes a phy packet with |
| 373 | * the new generation number when a bus reset happens (see | 569 | * the new generation number when a bus reset happens (see |
| @@ -376,14 +572,19 @@ static __le32 *handle_ar_packet(struct ar_context *ctx, __le32 *buffer) | |||
| 376 | * generation. We only need this for requests; for responses | 572 | * generation. We only need this for requests; for responses |
| 377 | * we use the unique tlabel for finding the matching | 573 | * we use the unique tlabel for finding the matching |
| 378 | * request. | 574 | * request. |
| 575 | * | ||
| 576 | * Alas some chips sometimes emit bus reset packets with a | ||
| 577 | * wrong generation. We set the correct generation for these | ||
| 578 | * at a slightly incorrect time (in bus_reset_tasklet). | ||
| 379 | */ | 579 | */ |
| 380 | 580 | if (evt == OHCI1394_evt_bus_reset) { | |
| 381 | if (p.ack + 16 == 0x09) | 581 | if (!ohci->bus_reset_packet_quirk) |
| 382 | ohci->request_generation = (p.header[2] >> 16) & 0xff; | 582 | ohci->request_generation = (p.header[2] >> 16) & 0xff; |
| 383 | else if (ctx == &ohci->ar_request_ctx) | 583 | } else if (ctx == &ohci->ar_request_ctx) { |
| 384 | fw_core_handle_request(&ohci->card, &p); | 584 | fw_core_handle_request(&ohci->card, &p); |
| 385 | else | 585 | } else { |
| 386 | fw_core_handle_response(&ohci->card, &p); | 586 | fw_core_handle_response(&ohci->card, &p); |
| 587 | } | ||
| 387 | 588 | ||
| 388 | return buffer + length + 1; | 589 | return buffer + length + 1; |
| 389 | } | 590 | } |
| @@ -770,8 +971,19 @@ at_context_queue_packet(struct context *ctx, struct fw_packet *packet) | |||
| 770 | DESCRIPTOR_IRQ_ALWAYS | | 971 | DESCRIPTOR_IRQ_ALWAYS | |
| 771 | DESCRIPTOR_BRANCH_ALWAYS); | 972 | DESCRIPTOR_BRANCH_ALWAYS); |
| 772 | 973 | ||
| 773 | /* FIXME: Document how the locking works. */ | 974 | /* |
| 774 | if (ohci->generation != packet->generation) { | 975 | * If the controller and packet generations don't match, we need to |
| 976 | * bail out and try again. If IntEvent.busReset is set, the AT context | ||
| 977 | * is halted, so appending to the context and trying to run it is | ||
| 978 | * futile. Most controllers do the right thing and just flush the AT | ||
| 979 | * queue (per section 7.2.3.2 of the OHCI 1.1 specification), but | ||
| 980 | * some controllers (like a JMicron JMB381 PCI-e) misbehave and wind | ||
| 981 | * up stalling out. So we just bail out in software and try again | ||
| 982 | * later, and everyone is happy. | ||
| 983 | * FIXME: Document how the locking works. | ||
| 984 | */ | ||
| 985 | if (ohci->generation != packet->generation || | ||
| 986 | reg_read(ohci, OHCI1394_IntEventSet) & OHCI1394_busReset) { | ||
| 775 | if (packet->payload_length > 0) | 987 | if (packet->payload_length > 0) |
| 776 | dma_unmap_single(ohci->card.device, payload_bus, | 988 | dma_unmap_single(ohci->card.device, payload_bus, |
| 777 | packet->payload_length, DMA_TO_DEVICE); | 989 | packet->payload_length, DMA_TO_DEVICE); |
| @@ -817,6 +1029,8 @@ static int handle_at_packet(struct context *context, | |||
| 817 | evt = le16_to_cpu(last->transfer_status) & 0x1f; | 1029 | evt = le16_to_cpu(last->transfer_status) & 0x1f; |
| 818 | packet->timestamp = le16_to_cpu(last->res_count); | 1030 | packet->timestamp = le16_to_cpu(last->res_count); |
| 819 | 1031 | ||
| 1032 | log_ar_at_event('T', packet->speed, packet->header, evt); | ||
| 1033 | |||
| 820 | switch (evt) { | 1034 | switch (evt) { |
| 821 | case OHCI1394_evt_timeout: | 1035 | case OHCI1394_evt_timeout: |
| 822 | /* Async response transmit timed out. */ | 1036 | /* Async response transmit timed out. */ |
| @@ -1019,20 +1233,30 @@ static void bus_reset_tasklet(unsigned long data) | |||
| 1019 | ohci->node_id = reg & (OHCI1394_NodeID_busNumber | | 1233 | ohci->node_id = reg & (OHCI1394_NodeID_busNumber | |
| 1020 | OHCI1394_NodeID_nodeNumber); | 1234 | OHCI1394_NodeID_nodeNumber); |
| 1021 | 1235 | ||
| 1236 | reg = reg_read(ohci, OHCI1394_SelfIDCount); | ||
| 1237 | if (reg & OHCI1394_SelfIDCount_selfIDError) { | ||
| 1238 | fw_notify("inconsistent self IDs\n"); | ||
| 1239 | return; | ||
| 1240 | } | ||
| 1022 | /* | 1241 | /* |
| 1023 | * The count in the SelfIDCount register is the number of | 1242 | * The count in the SelfIDCount register is the number of |
| 1024 | * bytes in the self ID receive buffer. Since we also receive | 1243 | * bytes in the self ID receive buffer. Since we also receive |
| 1025 | * the inverted quadlets and a header quadlet, we shift one | 1244 | * the inverted quadlets and a header quadlet, we shift one |
| 1026 | * bit extra to get the actual number of self IDs. | 1245 | * bit extra to get the actual number of self IDs. |
| 1027 | */ | 1246 | */ |
| 1028 | 1247 | self_id_count = (reg >> 3) & 0x3ff; | |
| 1029 | self_id_count = (reg_read(ohci, OHCI1394_SelfIDCount) >> 3) & 0x3ff; | 1248 | if (self_id_count == 0) { |
| 1249 | fw_notify("inconsistent self IDs\n"); | ||
| 1250 | return; | ||
| 1251 | } | ||
| 1030 | generation = (cond_le32_to_cpu(ohci->self_id_cpu[0]) >> 16) & 0xff; | 1252 | generation = (cond_le32_to_cpu(ohci->self_id_cpu[0]) >> 16) & 0xff; |
| 1031 | rmb(); | 1253 | rmb(); |
| 1032 | 1254 | ||
| 1033 | for (i = 1, j = 0; j < self_id_count; i += 2, j++) { | 1255 | for (i = 1, j = 0; j < self_id_count; i += 2, j++) { |
| 1034 | if (ohci->self_id_cpu[i] != ~ohci->self_id_cpu[i + 1]) | 1256 | if (ohci->self_id_cpu[i] != ~ohci->self_id_cpu[i + 1]) { |
| 1035 | fw_error("inconsistent self IDs\n"); | 1257 | fw_notify("inconsistent self IDs\n"); |
| 1258 | return; | ||
| 1259 | } | ||
| 1036 | ohci->self_id_buffer[j] = | 1260 | ohci->self_id_buffer[j] = |
| 1037 | cond_le32_to_cpu(ohci->self_id_cpu[i]); | 1261 | cond_le32_to_cpu(ohci->self_id_cpu[i]); |
| 1038 | } | 1262 | } |
| @@ -1067,6 +1291,9 @@ static void bus_reset_tasklet(unsigned long data) | |||
| 1067 | context_stop(&ohci->at_response_ctx); | 1291 | context_stop(&ohci->at_response_ctx); |
| 1068 | reg_write(ohci, OHCI1394_IntEventClear, OHCI1394_busReset); | 1292 | reg_write(ohci, OHCI1394_IntEventClear, OHCI1394_busReset); |
| 1069 | 1293 | ||
| 1294 | if (ohci->bus_reset_packet_quirk) | ||
| 1295 | ohci->request_generation = generation; | ||
| 1296 | |||
| 1070 | /* | 1297 | /* |
| 1071 | * This next bit is unrelated to the AT context stuff but we | 1298 | * This next bit is unrelated to the AT context stuff but we |
| 1072 | * have to do it under the spinlock also. If a new config rom | 1299 | * have to do it under the spinlock also. If a new config rom |
| @@ -1097,12 +1324,20 @@ static void bus_reset_tasklet(unsigned long data) | |||
| 1097 | reg_write(ohci, OHCI1394_ConfigROMhdr, ohci->next_header); | 1324 | reg_write(ohci, OHCI1394_ConfigROMhdr, ohci->next_header); |
| 1098 | } | 1325 | } |
| 1099 | 1326 | ||
| 1327 | #ifdef CONFIG_FIREWIRE_OHCI_REMOTE_DMA | ||
| 1328 | reg_write(ohci, OHCI1394_PhyReqFilterHiSet, ~0); | ||
| 1329 | reg_write(ohci, OHCI1394_PhyReqFilterLoSet, ~0); | ||
| 1330 | #endif | ||
| 1331 | |||
| 1100 | spin_unlock_irqrestore(&ohci->lock, flags); | 1332 | spin_unlock_irqrestore(&ohci->lock, flags); |
| 1101 | 1333 | ||
| 1102 | if (free_rom) | 1334 | if (free_rom) |
| 1103 | dma_free_coherent(ohci->card.device, CONFIG_ROM_SIZE, | 1335 | dma_free_coherent(ohci->card.device, CONFIG_ROM_SIZE, |
| 1104 | free_rom, free_rom_bus); | 1336 | free_rom, free_rom_bus); |
| 1105 | 1337 | ||
| 1338 | log_selfids(ohci->node_id, generation, | ||
| 1339 | self_id_count, ohci->self_id_buffer); | ||
| 1340 | |||
| 1106 | fw_core_handle_bus_reset(&ohci->card, ohci->node_id, generation, | 1341 | fw_core_handle_bus_reset(&ohci->card, ohci->node_id, generation, |
| 1107 | self_id_count, ohci->self_id_buffer); | 1342 | self_id_count, ohci->self_id_buffer); |
| 1108 | } | 1343 | } |
| @@ -1118,7 +1353,9 @@ static irqreturn_t irq_handler(int irq, void *data) | |||
| 1118 | if (!event || !~event) | 1353 | if (!event || !~event) |
| 1119 | return IRQ_NONE; | 1354 | return IRQ_NONE; |
| 1120 | 1355 | ||
| 1121 | reg_write(ohci, OHCI1394_IntEventClear, event); | 1356 | /* busReset must not be cleared yet, see OHCI 1.1 clause 7.2.3.2 */ |
| 1357 | reg_write(ohci, OHCI1394_IntEventClear, event & ~OHCI1394_busReset); | ||
| 1358 | log_irqs(event); | ||
| 1122 | 1359 | ||
| 1123 | if (event & OHCI1394_selfIDComplete) | 1360 | if (event & OHCI1394_selfIDComplete) |
| 1124 | tasklet_schedule(&ohci->bus_reset_tasklet); | 1361 | tasklet_schedule(&ohci->bus_reset_tasklet); |
| @@ -1153,6 +1390,10 @@ static irqreturn_t irq_handler(int irq, void *data) | |||
| 1153 | iso_event &= ~(1 << i); | 1390 | iso_event &= ~(1 << i); |
| 1154 | } | 1391 | } |
| 1155 | 1392 | ||
| 1393 | if (unlikely(event & OHCI1394_regAccessFail)) | ||
| 1394 | fw_error("Register access failure - " | ||
| 1395 | "please notify linux1394-devel@lists.sf.net\n"); | ||
| 1396 | |||
| 1156 | if (unlikely(event & OHCI1394_postedWriteErr)) | 1397 | if (unlikely(event & OHCI1394_postedWriteErr)) |
| 1157 | fw_error("PCI posted write error\n"); | 1398 | fw_error("PCI posted write error\n"); |
| 1158 | 1399 | ||
| @@ -1192,6 +1433,8 @@ static int ohci_enable(struct fw_card *card, u32 *config_rom, size_t length) | |||
| 1192 | { | 1433 | { |
| 1193 | struct fw_ohci *ohci = fw_ohci(card); | 1434 | struct fw_ohci *ohci = fw_ohci(card); |
| 1194 | struct pci_dev *dev = to_pci_dev(card->device); | 1435 | struct pci_dev *dev = to_pci_dev(card->device); |
| 1436 | u32 lps; | ||
| 1437 | int i; | ||
| 1195 | 1438 | ||
| 1196 | if (software_reset(ohci)) { | 1439 | if (software_reset(ohci)) { |
| 1197 | fw_error("Failed to reset ohci card.\n"); | 1440 | fw_error("Failed to reset ohci card.\n"); |
| @@ -1203,13 +1446,24 @@ static int ohci_enable(struct fw_card *card, u32 *config_rom, size_t length) | |||
| 1203 | * most of the registers. In fact, on some cards (ALI M5251), | 1446 | * most of the registers. In fact, on some cards (ALI M5251), |
| 1204 | * accessing registers in the SClk domain without LPS enabled | 1447 | * accessing registers in the SClk domain without LPS enabled |
| 1205 | * will lock up the machine. Wait 50msec to make sure we have | 1448 | * will lock up the machine. Wait 50msec to make sure we have |
| 1206 | * full link enabled. | 1449 | * full link enabled. However, with some cards (well, at least |
| 1450 | * a JMicron PCIe card), we have to try again sometimes. | ||
| 1207 | */ | 1451 | */ |
| 1208 | reg_write(ohci, OHCI1394_HCControlSet, | 1452 | reg_write(ohci, OHCI1394_HCControlSet, |
| 1209 | OHCI1394_HCControl_LPS | | 1453 | OHCI1394_HCControl_LPS | |
| 1210 | OHCI1394_HCControl_postedWriteEnable); | 1454 | OHCI1394_HCControl_postedWriteEnable); |
| 1211 | flush_writes(ohci); | 1455 | flush_writes(ohci); |
| 1212 | msleep(50); | 1456 | |
| 1457 | for (lps = 0, i = 0; !lps && i < 3; i++) { | ||
| 1458 | msleep(50); | ||
| 1459 | lps = reg_read(ohci, OHCI1394_HCControlSet) & | ||
| 1460 | OHCI1394_HCControl_LPS; | ||
| 1461 | } | ||
| 1462 | |||
| 1463 | if (!lps) { | ||
| 1464 | fw_error("Failed to set Link Power Status\n"); | ||
| 1465 | return -EIO; | ||
| 1466 | } | ||
| 1213 | 1467 | ||
| 1214 | reg_write(ohci, OHCI1394_HCControlClear, | 1468 | reg_write(ohci, OHCI1394_HCControlClear, |
| 1215 | OHCI1394_HCControl_noByteSwapData); | 1469 | OHCI1394_HCControl_noByteSwapData); |
| @@ -1237,7 +1491,10 @@ static int ohci_enable(struct fw_card *card, u32 *config_rom, size_t length) | |||
| 1237 | OHCI1394_reqTxComplete | OHCI1394_respTxComplete | | 1491 | OHCI1394_reqTxComplete | OHCI1394_respTxComplete | |
| 1238 | OHCI1394_isochRx | OHCI1394_isochTx | | 1492 | OHCI1394_isochRx | OHCI1394_isochTx | |
| 1239 | OHCI1394_postedWriteErr | OHCI1394_cycleTooLong | | 1493 | OHCI1394_postedWriteErr | OHCI1394_cycleTooLong | |
| 1240 | OHCI1394_cycle64Seconds | OHCI1394_masterIntEnable); | 1494 | OHCI1394_cycle64Seconds | OHCI1394_regAccessFail | |
| 1495 | OHCI1394_masterIntEnable); | ||
| 1496 | if (param_debug & OHCI_PARAM_DEBUG_BUSRESETS) | ||
| 1497 | reg_write(ohci, OHCI1394_IntMaskSet, OHCI1394_busReset); | ||
| 1241 | 1498 | ||
| 1242 | /* Activate link_on bit and contender bit in our self ID packets.*/ | 1499 | /* Activate link_on bit and contender bit in our self ID packets.*/ |
| 1243 | if (ohci_update_phy_reg(card, 4, 0, | 1500 | if (ohci_update_phy_reg(card, 4, 0, |
| @@ -1421,6 +1678,7 @@ static int ohci_cancel_packet(struct fw_card *card, struct fw_packet *packet) | |||
| 1421 | if (packet->ack != 0) | 1678 | if (packet->ack != 0) |
| 1422 | goto out; | 1679 | goto out; |
| 1423 | 1680 | ||
| 1681 | log_ar_at_event('T', packet->speed, packet->header, 0x20); | ||
| 1424 | driver_data->packet = NULL; | 1682 | driver_data->packet = NULL; |
| 1425 | packet->ack = RCODE_CANCELLED; | 1683 | packet->ack = RCODE_CANCELLED; |
| 1426 | packet->callback(packet, &ohci->card, packet->ack); | 1684 | packet->callback(packet, &ohci->card, packet->ack); |
| @@ -1435,6 +1693,9 @@ static int ohci_cancel_packet(struct fw_card *card, struct fw_packet *packet) | |||
| 1435 | static int | 1693 | static int |
| 1436 | ohci_enable_phys_dma(struct fw_card *card, int node_id, int generation) | 1694 | ohci_enable_phys_dma(struct fw_card *card, int node_id, int generation) |
| 1437 | { | 1695 | { |
| 1696 | #ifdef CONFIG_FIREWIRE_OHCI_REMOTE_DMA | ||
| 1697 | return 0; | ||
| 1698 | #else | ||
| 1438 | struct fw_ohci *ohci = fw_ohci(card); | 1699 | struct fw_ohci *ohci = fw_ohci(card); |
| 1439 | unsigned long flags; | 1700 | unsigned long flags; |
| 1440 | int n, retval = 0; | 1701 | int n, retval = 0; |
| @@ -1466,6 +1727,7 @@ ohci_enable_phys_dma(struct fw_card *card, int node_id, int generation) | |||
| 1466 | out: | 1727 | out: |
| 1467 | spin_unlock_irqrestore(&ohci->lock, flags); | 1728 | spin_unlock_irqrestore(&ohci->lock, flags); |
| 1468 | return retval; | 1729 | return retval; |
| 1730 | #endif /* CONFIG_FIREWIRE_OHCI_REMOTE_DMA */ | ||
| 1469 | } | 1731 | } |
| 1470 | 1732 | ||
| 1471 | static u64 | 1733 | static u64 |
| @@ -2045,17 +2307,9 @@ static const struct fw_card_driver ohci_driver = { | |||
| 2045 | .stop_iso = ohci_stop_iso, | 2307 | .stop_iso = ohci_stop_iso, |
| 2046 | }; | 2308 | }; |
| 2047 | 2309 | ||
| 2048 | static int __devinit | ||
| 2049 | pci_probe(struct pci_dev *dev, const struct pci_device_id *ent) | ||
| 2050 | { | ||
| 2051 | struct fw_ohci *ohci; | ||
| 2052 | u32 bus_options, max_receive, link_speed; | ||
| 2053 | u64 guid; | ||
| 2054 | int err; | ||
| 2055 | size_t size; | ||
| 2056 | |||
| 2057 | #ifdef CONFIG_PPC_PMAC | 2310 | #ifdef CONFIG_PPC_PMAC |
| 2058 | /* Necessary on some machines if fw-ohci was loaded/ unloaded before */ | 2311 | static void ohci_pmac_on(struct pci_dev *dev) |
| 2312 | { | ||
| 2059 | if (machine_is(powermac)) { | 2313 | if (machine_is(powermac)) { |
| 2060 | struct device_node *ofn = pci_device_to_OF_node(dev); | 2314 | struct device_node *ofn = pci_device_to_OF_node(dev); |
| 2061 | 2315 | ||
| @@ -2064,8 +2318,33 @@ pci_probe(struct pci_dev *dev, const struct pci_device_id *ent) | |||
| 2064 | pmac_call_feature(PMAC_FTR_1394_ENABLE, ofn, 0, 1); | 2318 | pmac_call_feature(PMAC_FTR_1394_ENABLE, ofn, 0, 1); |
| 2065 | } | 2319 | } |
| 2066 | } | 2320 | } |
| 2321 | } | ||
| 2322 | |||
| 2323 | static void ohci_pmac_off(struct pci_dev *dev) | ||
| 2324 | { | ||
| 2325 | if (machine_is(powermac)) { | ||
| 2326 | struct device_node *ofn = pci_device_to_OF_node(dev); | ||
| 2327 | |||
| 2328 | if (ofn) { | ||
| 2329 | pmac_call_feature(PMAC_FTR_1394_ENABLE, ofn, 0, 0); | ||
| 2330 | pmac_call_feature(PMAC_FTR_1394_CABLE_POWER, ofn, 0, 0); | ||
| 2331 | } | ||
| 2332 | } | ||
| 2333 | } | ||
| 2334 | #else | ||
| 2335 | #define ohci_pmac_on(dev) | ||
| 2336 | #define ohci_pmac_off(dev) | ||
| 2067 | #endif /* CONFIG_PPC_PMAC */ | 2337 | #endif /* CONFIG_PPC_PMAC */ |
| 2068 | 2338 | ||
| 2339 | static int __devinit | ||
| 2340 | pci_probe(struct pci_dev *dev, const struct pci_device_id *ent) | ||
| 2341 | { | ||
| 2342 | struct fw_ohci *ohci; | ||
| 2343 | u32 bus_options, max_receive, link_speed; | ||
| 2344 | u64 guid; | ||
| 2345 | int err; | ||
| 2346 | size_t size; | ||
| 2347 | |||
| 2069 | ohci = kzalloc(sizeof(*ohci), GFP_KERNEL); | 2348 | ohci = kzalloc(sizeof(*ohci), GFP_KERNEL); |
| 2070 | if (ohci == NULL) { | 2349 | if (ohci == NULL) { |
| 2071 | fw_error("Could not malloc fw_ohci data.\n"); | 2350 | fw_error("Could not malloc fw_ohci data.\n"); |
| @@ -2074,10 +2353,12 @@ pci_probe(struct pci_dev *dev, const struct pci_device_id *ent) | |||
| 2074 | 2353 | ||
| 2075 | fw_card_initialize(&ohci->card, &ohci_driver, &dev->dev); | 2354 | fw_card_initialize(&ohci->card, &ohci_driver, &dev->dev); |
| 2076 | 2355 | ||
| 2356 | ohci_pmac_on(dev); | ||
| 2357 | |||
| 2077 | err = pci_enable_device(dev); | 2358 | err = pci_enable_device(dev); |
| 2078 | if (err) { | 2359 | if (err) { |
| 2079 | fw_error("Failed to enable OHCI hardware.\n"); | 2360 | fw_error("Failed to enable OHCI hardware.\n"); |
| 2080 | goto fail_put_card; | 2361 | goto fail_free; |
| 2081 | } | 2362 | } |
| 2082 | 2363 | ||
| 2083 | pci_set_master(dev); | 2364 | pci_set_master(dev); |
| @@ -2088,6 +2369,8 @@ pci_probe(struct pci_dev *dev, const struct pci_device_id *ent) | |||
| 2088 | ohci->old_uninorth = dev->vendor == PCI_VENDOR_ID_APPLE && | 2369 | ohci->old_uninorth = dev->vendor == PCI_VENDOR_ID_APPLE && |
| 2089 | dev->device == PCI_DEVICE_ID_APPLE_UNI_N_FW; | 2370 | dev->device == PCI_DEVICE_ID_APPLE_UNI_N_FW; |
| 2090 | #endif | 2371 | #endif |
| 2372 | ohci->bus_reset_packet_quirk = dev->vendor == PCI_VENDOR_ID_TI; | ||
| 2373 | |||
| 2091 | spin_lock_init(&ohci->lock); | 2374 | spin_lock_init(&ohci->lock); |
| 2092 | 2375 | ||
| 2093 | tasklet_init(&ohci->bus_reset_tasklet, | 2376 | tasklet_init(&ohci->bus_reset_tasklet, |
| @@ -2173,8 +2456,9 @@ pci_probe(struct pci_dev *dev, const struct pci_device_id *ent) | |||
| 2173 | pci_release_region(dev, 0); | 2456 | pci_release_region(dev, 0); |
| 2174 | fail_disable: | 2457 | fail_disable: |
| 2175 | pci_disable_device(dev); | 2458 | pci_disable_device(dev); |
| 2176 | fail_put_card: | 2459 | fail_free: |
| 2177 | fw_card_put(&ohci->card); | 2460 | kfree(&ohci->card); |
| 2461 | ohci_pmac_off(dev); | ||
| 2178 | 2462 | ||
| 2179 | return err; | 2463 | return err; |
| 2180 | } | 2464 | } |
| @@ -2202,72 +2486,42 @@ static void pci_remove(struct pci_dev *dev) | |||
| 2202 | pci_iounmap(dev, ohci->registers); | 2486 | pci_iounmap(dev, ohci->registers); |
| 2203 | pci_release_region(dev, 0); | 2487 | pci_release_region(dev, 0); |
| 2204 | pci_disable_device(dev); | 2488 | pci_disable_device(dev); |
| 2205 | fw_card_put(&ohci->card); | 2489 | kfree(&ohci->card); |
| 2206 | 2490 | ohci_pmac_off(dev); | |
| 2207 | #ifdef CONFIG_PPC_PMAC | ||
| 2208 | /* On UniNorth, power down the cable and turn off the chip clock | ||
| 2209 | * to save power on laptops */ | ||
| 2210 | if (machine_is(powermac)) { | ||
| 2211 | struct device_node *ofn = pci_device_to_OF_node(dev); | ||
| 2212 | |||
| 2213 | if (ofn) { | ||
| 2214 | pmac_call_feature(PMAC_FTR_1394_ENABLE, ofn, 0, 0); | ||
| 2215 | pmac_call_feature(PMAC_FTR_1394_CABLE_POWER, ofn, 0, 0); | ||
| 2216 | } | ||
| 2217 | } | ||
| 2218 | #endif /* CONFIG_PPC_PMAC */ | ||
| 2219 | 2491 | ||
| 2220 | fw_notify("Removed fw-ohci device.\n"); | 2492 | fw_notify("Removed fw-ohci device.\n"); |
| 2221 | } | 2493 | } |
| 2222 | 2494 | ||
| 2223 | #ifdef CONFIG_PM | 2495 | #ifdef CONFIG_PM |
| 2224 | static int pci_suspend(struct pci_dev *pdev, pm_message_t state) | 2496 | static int pci_suspend(struct pci_dev *dev, pm_message_t state) |
| 2225 | { | 2497 | { |
| 2226 | struct fw_ohci *ohci = pci_get_drvdata(pdev); | 2498 | struct fw_ohci *ohci = pci_get_drvdata(dev); |
| 2227 | int err; | 2499 | int err; |
| 2228 | 2500 | ||
| 2229 | software_reset(ohci); | 2501 | software_reset(ohci); |
| 2230 | free_irq(pdev->irq, ohci); | 2502 | free_irq(dev->irq, ohci); |
| 2231 | err = pci_save_state(pdev); | 2503 | err = pci_save_state(dev); |
| 2232 | if (err) { | 2504 | if (err) { |
| 2233 | fw_error("pci_save_state failed\n"); | 2505 | fw_error("pci_save_state failed\n"); |
| 2234 | return err; | 2506 | return err; |
| 2235 | } | 2507 | } |
| 2236 | err = pci_set_power_state(pdev, pci_choose_state(pdev, state)); | 2508 | err = pci_set_power_state(dev, pci_choose_state(dev, state)); |
| 2237 | if (err) | 2509 | if (err) |
| 2238 | fw_error("pci_set_power_state failed with %d\n", err); | 2510 | fw_error("pci_set_power_state failed with %d\n", err); |
| 2239 | 2511 | ohci_pmac_off(dev); | |
| 2240 | /* PowerMac suspend code comes last */ | ||
| 2241 | #ifdef CONFIG_PPC_PMAC | ||
| 2242 | if (machine_is(powermac)) { | ||
| 2243 | struct device_node *ofn = pci_device_to_OF_node(pdev); | ||
| 2244 | |||
| 2245 | if (ofn) | ||
| 2246 | pmac_call_feature(PMAC_FTR_1394_ENABLE, ofn, 0, 0); | ||
| 2247 | } | ||
| 2248 | #endif /* CONFIG_PPC_PMAC */ | ||
| 2249 | 2512 | ||
| 2250 | return 0; | 2513 | return 0; |
| 2251 | } | 2514 | } |
| 2252 | 2515 | ||
| 2253 | static int pci_resume(struct pci_dev *pdev) | 2516 | static int pci_resume(struct pci_dev *dev) |
| 2254 | { | 2517 | { |
| 2255 | struct fw_ohci *ohci = pci_get_drvdata(pdev); | 2518 | struct fw_ohci *ohci = pci_get_drvdata(dev); |
| 2256 | int err; | 2519 | int err; |
| 2257 | 2520 | ||
| 2258 | /* PowerMac resume code comes first */ | 2521 | ohci_pmac_on(dev); |
| 2259 | #ifdef CONFIG_PPC_PMAC | 2522 | pci_set_power_state(dev, PCI_D0); |
| 2260 | if (machine_is(powermac)) { | 2523 | pci_restore_state(dev); |
| 2261 | struct device_node *ofn = pci_device_to_OF_node(pdev); | 2524 | err = pci_enable_device(dev); |
| 2262 | |||
| 2263 | if (ofn) | ||
| 2264 | pmac_call_feature(PMAC_FTR_1394_ENABLE, ofn, 0, 1); | ||
| 2265 | } | ||
| 2266 | #endif /* CONFIG_PPC_PMAC */ | ||
| 2267 | |||
| 2268 | pci_set_power_state(pdev, PCI_D0); | ||
| 2269 | pci_restore_state(pdev); | ||
| 2270 | err = pci_enable_device(pdev); | ||
| 2271 | if (err) { | 2525 | if (err) { |
| 2272 | fw_error("pci_enable_device failed\n"); | 2526 | fw_error("pci_enable_device failed\n"); |
| 2273 | return err; | 2527 | return err; |
diff --git a/drivers/firewire/fw-ohci.h b/drivers/firewire/fw-ohci.h index dec4f04e6b24..a2fbb6240ca7 100644 --- a/drivers/firewire/fw-ohci.h +++ b/drivers/firewire/fw-ohci.h | |||
| @@ -30,6 +30,7 @@ | |||
| 30 | #define OHCI1394_HCControl_softReset 0x00010000 | 30 | #define OHCI1394_HCControl_softReset 0x00010000 |
| 31 | #define OHCI1394_SelfIDBuffer 0x064 | 31 | #define OHCI1394_SelfIDBuffer 0x064 |
| 32 | #define OHCI1394_SelfIDCount 0x068 | 32 | #define OHCI1394_SelfIDCount 0x068 |
| 33 | #define OHCI1394_SelfIDCount_selfIDError 0x80000000 | ||
| 33 | #define OHCI1394_IRMultiChanMaskHiSet 0x070 | 34 | #define OHCI1394_IRMultiChanMaskHiSet 0x070 |
| 34 | #define OHCI1394_IRMultiChanMaskHiClear 0x074 | 35 | #define OHCI1394_IRMultiChanMaskHiClear 0x074 |
| 35 | #define OHCI1394_IRMultiChanMaskLoSet 0x078 | 36 | #define OHCI1394_IRMultiChanMaskLoSet 0x078 |
| @@ -124,6 +125,7 @@ | |||
| 124 | #define OHCI1394_lockRespErr 0x00000200 | 125 | #define OHCI1394_lockRespErr 0x00000200 |
| 125 | #define OHCI1394_selfIDComplete 0x00010000 | 126 | #define OHCI1394_selfIDComplete 0x00010000 |
| 126 | #define OHCI1394_busReset 0x00020000 | 127 | #define OHCI1394_busReset 0x00020000 |
| 128 | #define OHCI1394_regAccessFail 0x00040000 | ||
| 127 | #define OHCI1394_phy 0x00080000 | 129 | #define OHCI1394_phy 0x00080000 |
| 128 | #define OHCI1394_cycleSynch 0x00100000 | 130 | #define OHCI1394_cycleSynch 0x00100000 |
| 129 | #define OHCI1394_cycle64Seconds 0x00200000 | 131 | #define OHCI1394_cycle64Seconds 0x00200000 |
diff --git a/drivers/firewire/fw-sbp2.c b/drivers/firewire/fw-sbp2.c index 62b4e47d0cc0..2a999373863e 100644 --- a/drivers/firewire/fw-sbp2.c +++ b/drivers/firewire/fw-sbp2.c | |||
| @@ -153,6 +153,7 @@ struct sbp2_target { | |||
| 153 | struct list_head lu_list; | 153 | struct list_head lu_list; |
| 154 | 154 | ||
| 155 | u64 management_agent_address; | 155 | u64 management_agent_address; |
| 156 | u64 guid; | ||
| 156 | int directory_id; | 157 | int directory_id; |
| 157 | int node_id; | 158 | int node_id; |
| 158 | int address_high; | 159 | int address_high; |
| @@ -173,10 +174,8 @@ struct sbp2_target { | |||
| 173 | #define SBP2_ORB_TIMEOUT 2000U /* Timeout in ms */ | 174 | #define SBP2_ORB_TIMEOUT 2000U /* Timeout in ms */ |
| 174 | #define SBP2_ORB_NULL 0x80000000 | 175 | #define SBP2_ORB_NULL 0x80000000 |
| 175 | #define SBP2_MAX_SG_ELEMENT_LENGTH 0xf000 | 176 | #define SBP2_MAX_SG_ELEMENT_LENGTH 0xf000 |
| 176 | #define SBP2_RETRY_LIMIT 0xf /* 15 retries */ | 177 | #define SBP2_RETRY_LIMIT 0xf /* 15 retries */ |
| 177 | 178 | #define SBP2_CYCLE_LIMIT (0xc8 << 12) /* 200 125us cycles */ | |
| 178 | #define SBP2_DIRECTION_TO_MEDIA 0x0 | ||
| 179 | #define SBP2_DIRECTION_FROM_MEDIA 0x1 | ||
| 180 | 179 | ||
| 181 | /* Unit directory keys */ | 180 | /* Unit directory keys */ |
| 182 | #define SBP2_CSR_UNIT_CHARACTERISTICS 0x3a | 181 | #define SBP2_CSR_UNIT_CHARACTERISTICS 0x3a |
| @@ -224,8 +223,8 @@ struct sbp2_status { | |||
| 224 | }; | 223 | }; |
| 225 | 224 | ||
| 226 | struct sbp2_pointer { | 225 | struct sbp2_pointer { |
| 227 | u32 high; | 226 | __be32 high; |
| 228 | u32 low; | 227 | __be32 low; |
| 229 | }; | 228 | }; |
| 230 | 229 | ||
| 231 | struct sbp2_orb { | 230 | struct sbp2_orb { |
| @@ -253,8 +252,8 @@ struct sbp2_management_orb { | |||
| 253 | struct { | 252 | struct { |
| 254 | struct sbp2_pointer password; | 253 | struct sbp2_pointer password; |
| 255 | struct sbp2_pointer response; | 254 | struct sbp2_pointer response; |
| 256 | u32 misc; | 255 | __be32 misc; |
| 257 | u32 length; | 256 | __be32 length; |
| 258 | struct sbp2_pointer status_fifo; | 257 | struct sbp2_pointer status_fifo; |
| 259 | } request; | 258 | } request; |
| 260 | __be32 response[4]; | 259 | __be32 response[4]; |
| @@ -263,20 +262,17 @@ struct sbp2_management_orb { | |||
| 263 | struct sbp2_status status; | 262 | struct sbp2_status status; |
| 264 | }; | 263 | }; |
| 265 | 264 | ||
| 266 | #define LOGIN_RESPONSE_GET_LOGIN_ID(v) ((v).misc & 0xffff) | ||
| 267 | #define LOGIN_RESPONSE_GET_LENGTH(v) (((v).misc >> 16) & 0xffff) | ||
| 268 | |||
| 269 | struct sbp2_login_response { | 265 | struct sbp2_login_response { |
| 270 | u32 misc; | 266 | __be32 misc; |
| 271 | struct sbp2_pointer command_block_agent; | 267 | struct sbp2_pointer command_block_agent; |
| 272 | u32 reconnect_hold; | 268 | __be32 reconnect_hold; |
| 273 | }; | 269 | }; |
| 274 | #define COMMAND_ORB_DATA_SIZE(v) ((v)) | 270 | #define COMMAND_ORB_DATA_SIZE(v) ((v)) |
| 275 | #define COMMAND_ORB_PAGE_SIZE(v) ((v) << 16) | 271 | #define COMMAND_ORB_PAGE_SIZE(v) ((v) << 16) |
| 276 | #define COMMAND_ORB_PAGE_TABLE_PRESENT ((1) << 19) | 272 | #define COMMAND_ORB_PAGE_TABLE_PRESENT ((1) << 19) |
| 277 | #define COMMAND_ORB_MAX_PAYLOAD(v) ((v) << 20) | 273 | #define COMMAND_ORB_MAX_PAYLOAD(v) ((v) << 20) |
| 278 | #define COMMAND_ORB_SPEED(v) ((v) << 24) | 274 | #define COMMAND_ORB_SPEED(v) ((v) << 24) |
| 279 | #define COMMAND_ORB_DIRECTION(v) ((v) << 27) | 275 | #define COMMAND_ORB_DIRECTION ((1) << 27) |
| 280 | #define COMMAND_ORB_REQUEST_FORMAT(v) ((v) << 29) | 276 | #define COMMAND_ORB_REQUEST_FORMAT(v) ((v) << 29) |
| 281 | #define COMMAND_ORB_NOTIFY ((1) << 31) | 277 | #define COMMAND_ORB_NOTIFY ((1) << 31) |
| 282 | 278 | ||
| @@ -285,7 +281,7 @@ struct sbp2_command_orb { | |||
| 285 | struct { | 281 | struct { |
| 286 | struct sbp2_pointer next; | 282 | struct sbp2_pointer next; |
| 287 | struct sbp2_pointer data_descriptor; | 283 | struct sbp2_pointer data_descriptor; |
| 288 | u32 misc; | 284 | __be32 misc; |
| 289 | u8 command_block[12]; | 285 | u8 command_block[12]; |
| 290 | } request; | 286 | } request; |
| 291 | struct scsi_cmnd *cmd; | 287 | struct scsi_cmnd *cmd; |
| @@ -459,8 +455,7 @@ sbp2_send_orb(struct sbp2_orb *orb, struct sbp2_logical_unit *lu, | |||
| 459 | unsigned long flags; | 455 | unsigned long flags; |
| 460 | 456 | ||
| 461 | orb->pointer.high = 0; | 457 | orb->pointer.high = 0; |
| 462 | orb->pointer.low = orb->request_bus; | 458 | orb->pointer.low = cpu_to_be32(orb->request_bus); |
| 463 | fw_memcpy_to_be32(&orb->pointer, &orb->pointer, sizeof(orb->pointer)); | ||
| 464 | 459 | ||
| 465 | spin_lock_irqsave(&device->card->lock, flags); | 460 | spin_lock_irqsave(&device->card->lock, flags); |
| 466 | list_add_tail(&orb->link, &lu->orb_list); | 461 | list_add_tail(&orb->link, &lu->orb_list); |
| @@ -536,31 +531,31 @@ sbp2_send_management_orb(struct sbp2_logical_unit *lu, int node_id, | |||
| 536 | if (dma_mapping_error(orb->response_bus)) | 531 | if (dma_mapping_error(orb->response_bus)) |
| 537 | goto fail_mapping_response; | 532 | goto fail_mapping_response; |
| 538 | 533 | ||
| 539 | orb->request.response.high = 0; | 534 | orb->request.response.high = 0; |
| 540 | orb->request.response.low = orb->response_bus; | 535 | orb->request.response.low = cpu_to_be32(orb->response_bus); |
| 541 | 536 | ||
| 542 | orb->request.misc = | 537 | orb->request.misc = cpu_to_be32( |
| 543 | MANAGEMENT_ORB_NOTIFY | | 538 | MANAGEMENT_ORB_NOTIFY | |
| 544 | MANAGEMENT_ORB_FUNCTION(function) | | 539 | MANAGEMENT_ORB_FUNCTION(function) | |
| 545 | MANAGEMENT_ORB_LUN(lun_or_login_id); | 540 | MANAGEMENT_ORB_LUN(lun_or_login_id)); |
| 546 | orb->request.length = | 541 | orb->request.length = cpu_to_be32( |
| 547 | MANAGEMENT_ORB_RESPONSE_LENGTH(sizeof(orb->response)); | 542 | MANAGEMENT_ORB_RESPONSE_LENGTH(sizeof(orb->response))); |
| 548 | 543 | ||
| 549 | orb->request.status_fifo.high = lu->address_handler.offset >> 32; | 544 | orb->request.status_fifo.high = |
| 550 | orb->request.status_fifo.low = lu->address_handler.offset; | 545 | cpu_to_be32(lu->address_handler.offset >> 32); |
| 546 | orb->request.status_fifo.low = | ||
| 547 | cpu_to_be32(lu->address_handler.offset); | ||
| 551 | 548 | ||
| 552 | if (function == SBP2_LOGIN_REQUEST) { | 549 | if (function == SBP2_LOGIN_REQUEST) { |
| 553 | /* Ask for 2^2 == 4 seconds reconnect grace period */ | 550 | /* Ask for 2^2 == 4 seconds reconnect grace period */ |
| 554 | orb->request.misc |= | 551 | orb->request.misc |= cpu_to_be32( |
| 555 | MANAGEMENT_ORB_RECONNECT(2) | | 552 | MANAGEMENT_ORB_RECONNECT(2) | |
| 556 | MANAGEMENT_ORB_EXCLUSIVE(sbp2_param_exclusive_login); | 553 | MANAGEMENT_ORB_EXCLUSIVE(sbp2_param_exclusive_login)); |
| 557 | timeout = lu->tgt->mgt_orb_timeout; | 554 | timeout = lu->tgt->mgt_orb_timeout; |
| 558 | } else { | 555 | } else { |
| 559 | timeout = SBP2_ORB_TIMEOUT; | 556 | timeout = SBP2_ORB_TIMEOUT; |
| 560 | } | 557 | } |
| 561 | 558 | ||
| 562 | fw_memcpy_to_be32(&orb->request, &orb->request, sizeof(orb->request)); | ||
| 563 | |||
| 564 | init_completion(&orb->done); | 559 | init_completion(&orb->done); |
| 565 | orb->base.callback = complete_management_orb; | 560 | orb->base.callback = complete_management_orb; |
| 566 | 561 | ||
| @@ -605,8 +600,7 @@ sbp2_send_management_orb(struct sbp2_logical_unit *lu, int node_id, | |||
| 605 | sizeof(orb->response), DMA_FROM_DEVICE); | 600 | sizeof(orb->response), DMA_FROM_DEVICE); |
| 606 | fail_mapping_response: | 601 | fail_mapping_response: |
| 607 | if (response) | 602 | if (response) |
| 608 | fw_memcpy_from_be32(response, | 603 | memcpy(response, orb->response, sizeof(orb->response)); |
| 609 | orb->response, sizeof(orb->response)); | ||
| 610 | kref_put(&orb->base.kref, free_orb); | 604 | kref_put(&orb->base.kref, free_orb); |
| 611 | 605 | ||
| 612 | return retval; | 606 | return retval; |
| @@ -701,10 +695,8 @@ static void sbp2_conditionally_block(struct sbp2_logical_unit *lu) | |||
| 701 | if (!tgt->dont_block && !lu->blocked && | 695 | if (!tgt->dont_block && !lu->blocked && |
| 702 | lu->generation != card->generation) { | 696 | lu->generation != card->generation) { |
| 703 | lu->blocked = true; | 697 | lu->blocked = true; |
| 704 | if (++tgt->blocked == 1) { | 698 | if (++tgt->blocked == 1) |
| 705 | scsi_block_requests(shost); | 699 | scsi_block_requests(shost); |
| 706 | fw_notify("blocked %s\n", lu->tgt->bus_id); | ||
| 707 | } | ||
| 708 | } | 700 | } |
| 709 | spin_unlock_irqrestore(&card->lock, flags); | 701 | spin_unlock_irqrestore(&card->lock, flags); |
| 710 | } | 702 | } |
| @@ -731,10 +723,8 @@ static void sbp2_conditionally_unblock(struct sbp2_logical_unit *lu) | |||
| 731 | } | 723 | } |
| 732 | spin_unlock_irqrestore(&card->lock, flags); | 724 | spin_unlock_irqrestore(&card->lock, flags); |
| 733 | 725 | ||
| 734 | if (unblock) { | 726 | if (unblock) |
| 735 | scsi_unblock_requests(shost); | 727 | scsi_unblock_requests(shost); |
| 736 | fw_notify("unblocked %s\n", lu->tgt->bus_id); | ||
| 737 | } | ||
| 738 | } | 728 | } |
| 739 | 729 | ||
| 740 | /* | 730 | /* |
| @@ -796,7 +786,7 @@ static void sbp2_release_target(struct kref *kref) | |||
| 796 | scsi_remove_host(shost); | 786 | scsi_remove_host(shost); |
| 797 | fw_notify("released %s\n", tgt->bus_id); | 787 | fw_notify("released %s\n", tgt->bus_id); |
| 798 | 788 | ||
| 799 | put_device(&tgt->unit->device); | 789 | fw_unit_put(tgt->unit); |
| 800 | scsi_host_put(shost); | 790 | scsi_host_put(shost); |
| 801 | fw_device_put(device); | 791 | fw_device_put(device); |
| 802 | } | 792 | } |
| @@ -825,6 +815,22 @@ complete_set_busy_timeout(struct fw_card *card, int rcode, | |||
| 825 | complete(done); | 815 | complete(done); |
| 826 | } | 816 | } |
| 827 | 817 | ||
| 818 | /* | ||
| 819 | * Write retransmit retry values into the BUSY_TIMEOUT register. | ||
| 820 | * - The single-phase retry protocol is supported by all SBP-2 devices, but the | ||
| 821 | * default retry_limit value is 0 (i.e. never retry transmission). We write a | ||
| 822 | * saner value after logging into the device. | ||
| 823 | * - The dual-phase retry protocol is optional to implement, and if not | ||
| 824 | * supported, writes to the dual-phase portion of the register will be | ||
| 825 | * ignored. We try to write the original 1394-1995 default here. | ||
| 826 | * - In the case of devices that are also SBP-3-compliant, all writes are | ||
| 827 | * ignored, as the register is read-only, but contains single-phase retry of | ||
| 828 | * 15, which is what we're trying to set for all SBP-2 device anyway, so this | ||
| 829 | * write attempt is safe and yields more consistent behavior for all devices. | ||
| 830 | * | ||
| 831 | * See section 8.3.2.3.5 of the 1394-1995 spec, section 6.2 of the SBP-2 spec, | ||
| 832 | * and section 6.4 of the SBP-3 spec for further details. | ||
| 833 | */ | ||
| 828 | static void sbp2_set_busy_timeout(struct sbp2_logical_unit *lu) | 834 | static void sbp2_set_busy_timeout(struct sbp2_logical_unit *lu) |
| 829 | { | 835 | { |
| 830 | struct fw_device *device = fw_device(lu->tgt->unit->device.parent); | 836 | struct fw_device *device = fw_device(lu->tgt->unit->device.parent); |
| @@ -832,8 +838,7 @@ static void sbp2_set_busy_timeout(struct sbp2_logical_unit *lu) | |||
| 832 | struct fw_transaction t; | 838 | struct fw_transaction t; |
| 833 | static __be32 busy_timeout; | 839 | static __be32 busy_timeout; |
| 834 | 840 | ||
| 835 | /* FIXME: we should try to set dual-phase cycle_limit too */ | 841 | busy_timeout = cpu_to_be32(SBP2_CYCLE_LIMIT | SBP2_RETRY_LIMIT); |
| 836 | busy_timeout = cpu_to_be32(SBP2_RETRY_LIMIT); | ||
| 837 | 842 | ||
| 838 | fw_send_request(device->card, &t, TCODE_WRITE_QUADLET_REQUEST, | 843 | fw_send_request(device->card, &t, TCODE_WRITE_QUADLET_REQUEST, |
| 839 | lu->tgt->node_id, lu->generation, device->max_speed, | 844 | lu->tgt->node_id, lu->generation, device->max_speed, |
| @@ -885,11 +890,10 @@ static void sbp2_login(struct work_struct *work) | |||
| 885 | tgt->address_high = local_node_id << 16; | 890 | tgt->address_high = local_node_id << 16; |
| 886 | sbp2_set_generation(lu, generation); | 891 | sbp2_set_generation(lu, generation); |
| 887 | 892 | ||
| 888 | /* Get command block agent offset and login id. */ | ||
| 889 | lu->command_block_agent_address = | 893 | lu->command_block_agent_address = |
| 890 | ((u64) (response.command_block_agent.high & 0xffff) << 32) | | 894 | ((u64)(be32_to_cpu(response.command_block_agent.high) & 0xffff) |
| 891 | response.command_block_agent.low; | 895 | << 32) | be32_to_cpu(response.command_block_agent.low); |
| 892 | lu->login_id = LOGIN_RESPONSE_GET_LOGIN_ID(response); | 896 | lu->login_id = be32_to_cpu(response.misc) & 0xffff; |
| 893 | 897 | ||
| 894 | fw_notify("%s: logged in to LUN %04x (%d retries)\n", | 898 | fw_notify("%s: logged in to LUN %04x (%d retries)\n", |
| 895 | tgt->bus_id, lu->lun, lu->retries); | 899 | tgt->bus_id, lu->lun, lu->retries); |
| @@ -1111,6 +1115,7 @@ static int sbp2_probe(struct device *dev) | |||
| 1111 | kref_init(&tgt->kref); | 1115 | kref_init(&tgt->kref); |
| 1112 | INIT_LIST_HEAD(&tgt->lu_list); | 1116 | INIT_LIST_HEAD(&tgt->lu_list); |
| 1113 | tgt->bus_id = unit->device.bus_id; | 1117 | tgt->bus_id = unit->device.bus_id; |
| 1118 | tgt->guid = (u64)device->config_rom[3] << 32 | device->config_rom[4]; | ||
| 1114 | 1119 | ||
| 1115 | if (fw_device_enable_phys_dma(device) < 0) | 1120 | if (fw_device_enable_phys_dma(device) < 0) |
| 1116 | goto fail_shost_put; | 1121 | goto fail_shost_put; |
| @@ -1119,6 +1124,7 @@ static int sbp2_probe(struct device *dev) | |||
| 1119 | goto fail_shost_put; | 1124 | goto fail_shost_put; |
| 1120 | 1125 | ||
| 1121 | fw_device_get(device); | 1126 | fw_device_get(device); |
| 1127 | fw_unit_get(unit); | ||
| 1122 | 1128 | ||
| 1123 | /* Initialize to values that won't match anything in our table. */ | 1129 | /* Initialize to values that won't match anything in our table. */ |
| 1124 | firmware_revision = 0xff000000; | 1130 | firmware_revision = 0xff000000; |
| @@ -1134,8 +1140,6 @@ static int sbp2_probe(struct device *dev) | |||
| 1134 | 1140 | ||
| 1135 | sbp2_init_workarounds(tgt, model, firmware_revision); | 1141 | sbp2_init_workarounds(tgt, model, firmware_revision); |
| 1136 | 1142 | ||
| 1137 | get_device(&unit->device); | ||
| 1138 | |||
| 1139 | /* Do the login in a workqueue so we can easily reschedule retries. */ | 1143 | /* Do the login in a workqueue so we can easily reschedule retries. */ |
| 1140 | list_for_each_entry(lu, &tgt->lu_list, link) | 1144 | list_for_each_entry(lu, &tgt->lu_list, link) |
| 1141 | sbp2_queue_work(lu, 0); | 1145 | sbp2_queue_work(lu, 0); |
| @@ -1367,9 +1371,12 @@ sbp2_map_scatterlist(struct sbp2_command_orb *orb, struct fw_device *device, | |||
| 1367 | * tables. | 1371 | * tables. |
| 1368 | */ | 1372 | */ |
| 1369 | if (count == 1 && sg_dma_len(sg) < SBP2_MAX_SG_ELEMENT_LENGTH) { | 1373 | if (count == 1 && sg_dma_len(sg) < SBP2_MAX_SG_ELEMENT_LENGTH) { |
| 1370 | orb->request.data_descriptor.high = lu->tgt->address_high; | 1374 | orb->request.data_descriptor.high = |
| 1371 | orb->request.data_descriptor.low = sg_dma_address(sg); | 1375 | cpu_to_be32(lu->tgt->address_high); |
| 1372 | orb->request.misc |= COMMAND_ORB_DATA_SIZE(sg_dma_len(sg)); | 1376 | orb->request.data_descriptor.low = |
| 1377 | cpu_to_be32(sg_dma_address(sg)); | ||
| 1378 | orb->request.misc |= | ||
| 1379 | cpu_to_be32(COMMAND_ORB_DATA_SIZE(sg_dma_len(sg))); | ||
| 1373 | return 0; | 1380 | return 0; |
| 1374 | } | 1381 | } |
| 1375 | 1382 | ||
| @@ -1390,16 +1397,14 @@ sbp2_map_scatterlist(struct sbp2_command_orb *orb, struct fw_device *device, | |||
| 1390 | goto fail_page_table; | 1397 | goto fail_page_table; |
| 1391 | } | 1398 | } |
| 1392 | l = min(sg_len, SBP2_MAX_SG_ELEMENT_LENGTH); | 1399 | l = min(sg_len, SBP2_MAX_SG_ELEMENT_LENGTH); |
| 1393 | orb->page_table[j].low = sg_addr; | 1400 | orb->page_table[j].low = cpu_to_be32(sg_addr); |
| 1394 | orb->page_table[j].high = (l << 16); | 1401 | orb->page_table[j].high = cpu_to_be32(l << 16); |
| 1395 | sg_addr += l; | 1402 | sg_addr += l; |
| 1396 | sg_len -= l; | 1403 | sg_len -= l; |
| 1397 | j++; | 1404 | j++; |
| 1398 | } | 1405 | } |
| 1399 | } | 1406 | } |
| 1400 | 1407 | ||
| 1401 | fw_memcpy_to_be32(orb->page_table, orb->page_table, | ||
| 1402 | sizeof(orb->page_table[0]) * j); | ||
| 1403 | orb->page_table_bus = | 1408 | orb->page_table_bus = |
| 1404 | dma_map_single(device->card->device, orb->page_table, | 1409 | dma_map_single(device->card->device, orb->page_table, |
| 1405 | sizeof(orb->page_table), DMA_TO_DEVICE); | 1410 | sizeof(orb->page_table), DMA_TO_DEVICE); |
| @@ -1413,11 +1418,10 @@ sbp2_map_scatterlist(struct sbp2_command_orb *orb, struct fw_device *device, | |||
| 1413 | * initiator (i.e. us), but data_descriptor can refer to data | 1418 | * initiator (i.e. us), but data_descriptor can refer to data |
| 1414 | * on other nodes so we need to put our ID in descriptor.high. | 1419 | * on other nodes so we need to put our ID in descriptor.high. |
| 1415 | */ | 1420 | */ |
| 1416 | orb->request.data_descriptor.high = lu->tgt->address_high; | 1421 | orb->request.data_descriptor.high = cpu_to_be32(lu->tgt->address_high); |
| 1417 | orb->request.data_descriptor.low = orb->page_table_bus; | 1422 | orb->request.data_descriptor.low = cpu_to_be32(orb->page_table_bus); |
| 1418 | orb->request.misc |= | 1423 | orb->request.misc |= cpu_to_be32(COMMAND_ORB_PAGE_TABLE_PRESENT | |
| 1419 | COMMAND_ORB_PAGE_TABLE_PRESENT | | 1424 | COMMAND_ORB_DATA_SIZE(j)); |
| 1420 | COMMAND_ORB_DATA_SIZE(j); | ||
| 1421 | 1425 | ||
| 1422 | return 0; | 1426 | return 0; |
| 1423 | 1427 | ||
| @@ -1463,8 +1467,7 @@ static int sbp2_scsi_queuecommand(struct scsi_cmnd *cmd, scsi_done_fn_t done) | |||
| 1463 | orb->done = done; | 1467 | orb->done = done; |
| 1464 | orb->cmd = cmd; | 1468 | orb->cmd = cmd; |
| 1465 | 1469 | ||
| 1466 | orb->request.next.high = SBP2_ORB_NULL; | 1470 | orb->request.next.high = cpu_to_be32(SBP2_ORB_NULL); |
| 1467 | orb->request.next.low = 0x0; | ||
| 1468 | /* | 1471 | /* |
| 1469 | * At speed 100 we can do 512 bytes per packet, at speed 200, | 1472 | * At speed 100 we can do 512 bytes per packet, at speed 200, |
| 1470 | * 1024 bytes per packet etc. The SBP-2 max_payload field | 1473 | * 1024 bytes per packet etc. The SBP-2 max_payload field |
| @@ -1473,25 +1476,17 @@ static int sbp2_scsi_queuecommand(struct scsi_cmnd *cmd, scsi_done_fn_t done) | |||
| 1473 | */ | 1476 | */ |
| 1474 | max_payload = min(device->max_speed + 7, | 1477 | max_payload = min(device->max_speed + 7, |
| 1475 | device->card->max_receive - 1); | 1478 | device->card->max_receive - 1); |
| 1476 | orb->request.misc = | 1479 | orb->request.misc = cpu_to_be32( |
| 1477 | COMMAND_ORB_MAX_PAYLOAD(max_payload) | | 1480 | COMMAND_ORB_MAX_PAYLOAD(max_payload) | |
| 1478 | COMMAND_ORB_SPEED(device->max_speed) | | 1481 | COMMAND_ORB_SPEED(device->max_speed) | |
| 1479 | COMMAND_ORB_NOTIFY; | 1482 | COMMAND_ORB_NOTIFY); |
| 1480 | 1483 | ||
| 1481 | if (cmd->sc_data_direction == DMA_FROM_DEVICE) | 1484 | if (cmd->sc_data_direction == DMA_FROM_DEVICE) |
| 1482 | orb->request.misc |= | 1485 | orb->request.misc |= cpu_to_be32(COMMAND_ORB_DIRECTION); |
| 1483 | COMMAND_ORB_DIRECTION(SBP2_DIRECTION_FROM_MEDIA); | ||
| 1484 | else if (cmd->sc_data_direction == DMA_TO_DEVICE) | ||
| 1485 | orb->request.misc |= | ||
| 1486 | COMMAND_ORB_DIRECTION(SBP2_DIRECTION_TO_MEDIA); | ||
| 1487 | 1486 | ||
| 1488 | if (scsi_sg_count(cmd) && sbp2_map_scatterlist(orb, device, lu) < 0) | 1487 | if (scsi_sg_count(cmd) && sbp2_map_scatterlist(orb, device, lu) < 0) |
| 1489 | goto out; | 1488 | goto out; |
| 1490 | 1489 | ||
| 1491 | fw_memcpy_to_be32(&orb->request, &orb->request, sizeof(orb->request)); | ||
| 1492 | |||
| 1493 | memset(orb->request.command_block, | ||
| 1494 | 0, sizeof(orb->request.command_block)); | ||
| 1495 | memcpy(orb->request.command_block, cmd->cmnd, COMMAND_SIZE(*cmd->cmnd)); | 1490 | memcpy(orb->request.command_block, cmd->cmnd, COMMAND_SIZE(*cmd->cmnd)); |
| 1496 | 1491 | ||
| 1497 | orb->base.callback = complete_command_orb; | 1492 | orb->base.callback = complete_command_orb; |
| @@ -1519,11 +1514,8 @@ static int sbp2_scsi_slave_alloc(struct scsi_device *sdev) | |||
| 1519 | 1514 | ||
| 1520 | sdev->allow_restart = 1; | 1515 | sdev->allow_restart = 1; |
| 1521 | 1516 | ||
| 1522 | /* | 1517 | /* SBP-2 requires quadlet alignment of the data buffers. */ |
| 1523 | * Update the dma alignment (minimum alignment requirements for | 1518 | blk_queue_update_dma_alignment(sdev->request_queue, 4 - 1); |
| 1524 | * start and end of DMA transfers) to be a sector | ||
| 1525 | */ | ||
| 1526 | blk_queue_update_dma_alignment(sdev->request_queue, 511); | ||
| 1527 | 1519 | ||
| 1528 | if (lu->tgt->workarounds & SBP2_WORKAROUND_INQUIRY_36) | 1520 | if (lu->tgt->workarounds & SBP2_WORKAROUND_INQUIRY_36) |
| 1529 | sdev->inquiry_len = 36; | 1521 | sdev->inquiry_len = 36; |
| @@ -1581,16 +1573,14 @@ sbp2_sysfs_ieee1394_id_show(struct device *dev, struct device_attribute *attr, | |||
| 1581 | { | 1573 | { |
| 1582 | struct scsi_device *sdev = to_scsi_device(dev); | 1574 | struct scsi_device *sdev = to_scsi_device(dev); |
| 1583 | struct sbp2_logical_unit *lu; | 1575 | struct sbp2_logical_unit *lu; |
| 1584 | struct fw_device *device; | ||
| 1585 | 1576 | ||
| 1586 | if (!sdev) | 1577 | if (!sdev) |
| 1587 | return 0; | 1578 | return 0; |
| 1588 | 1579 | ||
| 1589 | lu = sdev->hostdata; | 1580 | lu = sdev->hostdata; |
| 1590 | device = fw_device(lu->tgt->unit->device.parent); | ||
| 1591 | 1581 | ||
| 1592 | return sprintf(buf, "%08x%08x:%06x:%04x\n", | 1582 | return sprintf(buf, "%016llx:%06x:%04x\n", |
| 1593 | device->config_rom[3], device->config_rom[4], | 1583 | (unsigned long long)lu->tgt->guid, |
| 1594 | lu->tgt->directory_id, lu->lun); | 1584 | lu->tgt->directory_id, lu->lun); |
| 1595 | } | 1585 | } |
| 1596 | 1586 | ||
diff --git a/drivers/firewire/fw-topology.c b/drivers/firewire/fw-topology.c index d2c7a3d7e1cb..213b0ff8f3d6 100644 --- a/drivers/firewire/fw-topology.c +++ b/drivers/firewire/fw-topology.c | |||
| @@ -108,6 +108,7 @@ static struct fw_node *fw_node_create(u32 sid, int port_count, int color) | |||
| 108 | node->node_id = LOCAL_BUS | SELF_ID_PHY_ID(sid); | 108 | node->node_id = LOCAL_BUS | SELF_ID_PHY_ID(sid); |
| 109 | node->link_on = SELF_ID_LINK_ON(sid); | 109 | node->link_on = SELF_ID_LINK_ON(sid); |
| 110 | node->phy_speed = SELF_ID_PHY_SPEED(sid); | 110 | node->phy_speed = SELF_ID_PHY_SPEED(sid); |
| 111 | node->initiated_reset = SELF_ID_PHY_INITIATOR(sid); | ||
| 111 | node->port_count = port_count; | 112 | node->port_count = port_count; |
| 112 | 113 | ||
| 113 | atomic_set(&node->ref_count, 1); | 114 | atomic_set(&node->ref_count, 1); |
| @@ -289,12 +290,11 @@ static struct fw_node *build_tree(struct fw_card *card, | |||
| 289 | beta_repeaters_present = true; | 290 | beta_repeaters_present = true; |
| 290 | 291 | ||
| 291 | /* | 292 | /* |
| 292 | * If all PHYs does not report the same gap count | 293 | * If PHYs report different gap counts, set an invalid count |
| 293 | * setting, we fall back to 63 which will force a gap | 294 | * which will force a gap count reconfiguration and a reset. |
| 294 | * count reconfiguration and a reset. | ||
| 295 | */ | 295 | */ |
| 296 | if (SELF_ID_GAP_COUNT(q) != gap_count) | 296 | if (SELF_ID_GAP_COUNT(q) != gap_count) |
| 297 | gap_count = 63; | 297 | gap_count = 0; |
| 298 | 298 | ||
| 299 | update_hop_count(node); | 299 | update_hop_count(node); |
| 300 | 300 | ||
| @@ -431,6 +431,8 @@ update_tree(struct fw_card *card, struct fw_node *root) | |||
| 431 | event = FW_NODE_LINK_OFF; | 431 | event = FW_NODE_LINK_OFF; |
| 432 | else if (!node0->link_on && node1->link_on) | 432 | else if (!node0->link_on && node1->link_on) |
| 433 | event = FW_NODE_LINK_ON; | 433 | event = FW_NODE_LINK_ON; |
| 434 | else if (node1->initiated_reset && node1->link_on) | ||
| 435 | event = FW_NODE_INITIATED_RESET; | ||
| 434 | else | 436 | else |
| 435 | event = FW_NODE_UPDATED; | 437 | event = FW_NODE_UPDATED; |
| 436 | 438 | ||
diff --git a/drivers/firewire/fw-topology.h b/drivers/firewire/fw-topology.h index cedc1ec906e9..addb9f8ea776 100644 --- a/drivers/firewire/fw-topology.h +++ b/drivers/firewire/fw-topology.h | |||
| @@ -20,11 +20,12 @@ | |||
| 20 | #define __fw_topology_h | 20 | #define __fw_topology_h |
| 21 | 21 | ||
| 22 | enum { | 22 | enum { |
| 23 | FW_NODE_CREATED = 0x00, | 23 | FW_NODE_CREATED, |
| 24 | FW_NODE_UPDATED = 0x01, | 24 | FW_NODE_UPDATED, |
| 25 | FW_NODE_DESTROYED = 0x02, | 25 | FW_NODE_DESTROYED, |
| 26 | FW_NODE_LINK_ON = 0x03, | 26 | FW_NODE_LINK_ON, |
| 27 | FW_NODE_LINK_OFF = 0x04, | 27 | FW_NODE_LINK_OFF, |
| 28 | FW_NODE_INITIATED_RESET, | ||
| 28 | }; | 29 | }; |
| 29 | 30 | ||
| 30 | struct fw_node { | 31 | struct fw_node { |
diff --git a/drivers/firewire/fw-transaction.c b/drivers/firewire/fw-transaction.c index e6f1bda38940..3a59e9b783b0 100644 --- a/drivers/firewire/fw-transaction.c +++ b/drivers/firewire/fw-transaction.c | |||
| @@ -18,6 +18,7 @@ | |||
| 18 | * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | 18 | * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
| 19 | */ | 19 | */ |
| 20 | 20 | ||
| 21 | #include <linux/completion.h> | ||
| 21 | #include <linux/kernel.h> | 22 | #include <linux/kernel.h> |
| 22 | #include <linux/module.h> | 23 | #include <linux/module.h> |
| 23 | #include <linux/init.h> | 24 | #include <linux/init.h> |
| @@ -294,42 +295,40 @@ fw_send_request(struct fw_card *card, struct fw_transaction *t, | |||
| 294 | } | 295 | } |
| 295 | EXPORT_SYMBOL(fw_send_request); | 296 | EXPORT_SYMBOL(fw_send_request); |
| 296 | 297 | ||
| 298 | struct fw_phy_packet { | ||
| 299 | struct fw_packet packet; | ||
| 300 | struct completion done; | ||
| 301 | }; | ||
| 302 | |||
| 297 | static void | 303 | static void |
| 298 | transmit_phy_packet_callback(struct fw_packet *packet, | 304 | transmit_phy_packet_callback(struct fw_packet *packet, |
| 299 | struct fw_card *card, int status) | 305 | struct fw_card *card, int status) |
| 300 | { | 306 | { |
| 301 | kfree(packet); | 307 | struct fw_phy_packet *p = |
| 302 | } | 308 | container_of(packet, struct fw_phy_packet, packet); |
| 303 | |||
| 304 | static void send_phy_packet(struct fw_card *card, u32 data, int generation) | ||
| 305 | { | ||
| 306 | struct fw_packet *packet; | ||
| 307 | |||
| 308 | packet = kzalloc(sizeof(*packet), GFP_ATOMIC); | ||
| 309 | if (packet == NULL) | ||
| 310 | return; | ||
| 311 | |||
| 312 | packet->header[0] = data; | ||
| 313 | packet->header[1] = ~data; | ||
| 314 | packet->header_length = 8; | ||
| 315 | packet->payload_length = 0; | ||
| 316 | packet->speed = SCODE_100; | ||
| 317 | packet->generation = generation; | ||
| 318 | packet->callback = transmit_phy_packet_callback; | ||
| 319 | 309 | ||
| 320 | card->driver->send_request(card, packet); | 310 | complete(&p->done); |
| 321 | } | 311 | } |
| 322 | 312 | ||
| 323 | void fw_send_phy_config(struct fw_card *card, | 313 | void fw_send_phy_config(struct fw_card *card, |
| 324 | int node_id, int generation, int gap_count) | 314 | int node_id, int generation, int gap_count) |
| 325 | { | 315 | { |
| 326 | u32 q; | 316 | struct fw_phy_packet p; |
| 327 | 317 | u32 data = PHY_IDENTIFIER(PHY_PACKET_CONFIG) | | |
| 328 | q = PHY_IDENTIFIER(PHY_PACKET_CONFIG) | | 318 | PHY_CONFIG_ROOT_ID(node_id) | |
| 329 | PHY_CONFIG_ROOT_ID(node_id) | | 319 | PHY_CONFIG_GAP_COUNT(gap_count); |
| 330 | PHY_CONFIG_GAP_COUNT(gap_count); | 320 | |
| 331 | 321 | p.packet.header[0] = data; | |
| 332 | send_phy_packet(card, q, generation); | 322 | p.packet.header[1] = ~data; |
| 323 | p.packet.header_length = 8; | ||
| 324 | p.packet.payload_length = 0; | ||
| 325 | p.packet.speed = SCODE_100; | ||
| 326 | p.packet.generation = generation; | ||
| 327 | p.packet.callback = transmit_phy_packet_callback; | ||
| 328 | init_completion(&p.done); | ||
| 329 | |||
| 330 | card->driver->send_request(card, &p.packet); | ||
| 331 | wait_for_completion(&p.done); | ||
| 333 | } | 332 | } |
| 334 | 333 | ||
| 335 | void fw_flush_transactions(struct fw_card *card) | 334 | void fw_flush_transactions(struct fw_card *card) |
| @@ -389,21 +388,21 @@ lookup_enclosing_address_handler(struct list_head *list, | |||
| 389 | static DEFINE_SPINLOCK(address_handler_lock); | 388 | static DEFINE_SPINLOCK(address_handler_lock); |
| 390 | static LIST_HEAD(address_handler_list); | 389 | static LIST_HEAD(address_handler_list); |
| 391 | 390 | ||
| 392 | const struct fw_address_region fw_low_memory_region = | ||
| 393 | { .start = 0x000000000000ULL, .end = 0x000100000000ULL, }; | ||
| 394 | const struct fw_address_region fw_high_memory_region = | 391 | const struct fw_address_region fw_high_memory_region = |
| 395 | { .start = 0x000100000000ULL, .end = 0xffffe0000000ULL, }; | 392 | { .start = 0x000100000000ULL, .end = 0xffffe0000000ULL, }; |
| 393 | EXPORT_SYMBOL(fw_high_memory_region); | ||
| 394 | |||
| 395 | #if 0 | ||
| 396 | const struct fw_address_region fw_low_memory_region = | ||
| 397 | { .start = 0x000000000000ULL, .end = 0x000100000000ULL, }; | ||
| 396 | const struct fw_address_region fw_private_region = | 398 | const struct fw_address_region fw_private_region = |
| 397 | { .start = 0xffffe0000000ULL, .end = 0xfffff0000000ULL, }; | 399 | { .start = 0xffffe0000000ULL, .end = 0xfffff0000000ULL, }; |
| 398 | const struct fw_address_region fw_csr_region = | 400 | const struct fw_address_region fw_csr_region = |
| 399 | { .start = 0xfffff0000000ULL, .end = 0xfffff0000800ULL, }; | 401 | { .start = CSR_REGISTER_BASE, |
| 402 | .end = CSR_REGISTER_BASE | CSR_CONFIG_ROM_END, }; | ||
| 400 | const struct fw_address_region fw_unit_space_region = | 403 | const struct fw_address_region fw_unit_space_region = |
| 401 | { .start = 0xfffff0000900ULL, .end = 0x1000000000000ULL, }; | 404 | { .start = 0xfffff0000900ULL, .end = 0x1000000000000ULL, }; |
| 402 | EXPORT_SYMBOL(fw_low_memory_region); | 405 | #endif /* 0 */ |
| 403 | EXPORT_SYMBOL(fw_high_memory_region); | ||
| 404 | EXPORT_SYMBOL(fw_private_region); | ||
| 405 | EXPORT_SYMBOL(fw_csr_region); | ||
| 406 | EXPORT_SYMBOL(fw_unit_space_region); | ||
| 407 | 406 | ||
| 408 | /** | 407 | /** |
| 409 | * Allocate a range of addresses in the node space of the OHCI | 408 | * Allocate a range of addresses in the node space of the OHCI |
| @@ -747,7 +746,8 @@ fw_core_handle_response(struct fw_card *card, struct fw_packet *p) | |||
| 747 | EXPORT_SYMBOL(fw_core_handle_response); | 746 | EXPORT_SYMBOL(fw_core_handle_response); |
| 748 | 747 | ||
| 749 | static const struct fw_address_region topology_map_region = | 748 | static const struct fw_address_region topology_map_region = |
| 750 | { .start = 0xfffff0001000ull, .end = 0xfffff0001400ull, }; | 749 | { .start = CSR_REGISTER_BASE | CSR_TOPOLOGY_MAP, |
| 750 | .end = CSR_REGISTER_BASE | CSR_TOPOLOGY_MAP_END, }; | ||
| 751 | 751 | ||
| 752 | static void | 752 | static void |
| 753 | handle_topology_map(struct fw_card *card, struct fw_request *request, | 753 | handle_topology_map(struct fw_card *card, struct fw_request *request, |
| @@ -785,7 +785,8 @@ static struct fw_address_handler topology_map = { | |||
| 785 | }; | 785 | }; |
| 786 | 786 | ||
| 787 | static const struct fw_address_region registers_region = | 787 | static const struct fw_address_region registers_region = |
| 788 | { .start = 0xfffff0000000ull, .end = 0xfffff0000400ull, }; | 788 | { .start = CSR_REGISTER_BASE, |
| 789 | .end = CSR_REGISTER_BASE | CSR_CONFIG_ROM, }; | ||
| 789 | 790 | ||
| 790 | static void | 791 | static void |
| 791 | handle_registers(struct fw_card *card, struct fw_request *request, | 792 | handle_registers(struct fw_card *card, struct fw_request *request, |
| @@ -794,7 +795,7 @@ handle_registers(struct fw_card *card, struct fw_request *request, | |||
| 794 | unsigned long long offset, | 795 | unsigned long long offset, |
| 795 | void *payload, size_t length, void *callback_data) | 796 | void *payload, size_t length, void *callback_data) |
| 796 | { | 797 | { |
| 797 | int reg = offset - CSR_REGISTER_BASE; | 798 | int reg = offset & ~CSR_REGISTER_BASE; |
| 798 | unsigned long long bus_time; | 799 | unsigned long long bus_time; |
| 799 | __be32 *data = payload; | 800 | __be32 *data = payload; |
| 800 | 801 | ||
diff --git a/drivers/firewire/fw-transaction.h b/drivers/firewire/fw-transaction.h index a43bb22912f9..04d3854f6560 100644 --- a/drivers/firewire/fw-transaction.h +++ b/drivers/firewire/fw-transaction.h | |||
| @@ -201,11 +201,7 @@ struct fw_address_region { | |||
| 201 | u64 end; | 201 | u64 end; |
| 202 | }; | 202 | }; |
| 203 | 203 | ||
| 204 | extern const struct fw_address_region fw_low_memory_region; | ||
| 205 | extern const struct fw_address_region fw_high_memory_region; | 204 | extern const struct fw_address_region fw_high_memory_region; |
| 206 | extern const struct fw_address_region fw_private_region; | ||
| 207 | extern const struct fw_address_region fw_csr_region; | ||
| 208 | extern const struct fw_address_region fw_unit_space_region; | ||
| 209 | 205 | ||
| 210 | int fw_core_add_address_handler(struct fw_address_handler *handler, | 206 | int fw_core_add_address_handler(struct fw_address_handler *handler, |
| 211 | const struct fw_address_region *region); | 207 | const struct fw_address_region *region); |
| @@ -221,12 +217,9 @@ struct fw_card { | |||
| 221 | const struct fw_card_driver *driver; | 217 | const struct fw_card_driver *driver; |
| 222 | struct device *device; | 218 | struct device *device; |
| 223 | atomic_t device_count; | 219 | atomic_t device_count; |
| 224 | struct kref kref; | ||
| 225 | 220 | ||
| 226 | int node_id; | 221 | int node_id; |
| 227 | int generation; | 222 | int generation; |
| 228 | /* This is the generation used for timestamping incoming requests. */ | ||
| 229 | int request_generation; | ||
| 230 | int current_tlabel, tlabel_mask; | 223 | int current_tlabel, tlabel_mask; |
| 231 | struct list_head transaction_list; | 224 | struct list_head transaction_list; |
| 232 | struct timer_list flush_timer; | 225 | struct timer_list flush_timer; |
| @@ -263,9 +256,6 @@ struct fw_card { | |||
| 263 | int bm_generation; | 256 | int bm_generation; |
| 264 | }; | 257 | }; |
| 265 | 258 | ||
| 266 | struct fw_card *fw_card_get(struct fw_card *card); | ||
| 267 | void fw_card_put(struct fw_card *card); | ||
| 268 | |||
| 269 | /* | 259 | /* |
| 270 | * The iso packet format allows for an immediate header/payload part | 260 | * The iso packet format allows for an immediate header/payload part |
| 271 | * stored in 'header' immediately after the packet info plus an | 261 | * stored in 'header' immediately after the packet info plus an |
diff --git a/drivers/ieee1394/csr.c b/drivers/ieee1394/csr.c index 52ac83e0ebee..c90be4070e40 100644 --- a/drivers/ieee1394/csr.c +++ b/drivers/ieee1394/csr.c | |||
| @@ -133,8 +133,7 @@ static void host_reset(struct hpsb_host *host) | |||
| 133 | host->csr.state &= ~0x100; | 133 | host->csr.state &= ~0x100; |
| 134 | } | 134 | } |
| 135 | 135 | ||
| 136 | host->csr.topology_map[1] = | 136 | be32_add_cpu(&host->csr.topology_map[1], 1); |
| 137 | cpu_to_be32(be32_to_cpu(host->csr.topology_map[1]) + 1); | ||
| 138 | host->csr.topology_map[2] = cpu_to_be32(host->node_count << 16 | 137 | host->csr.topology_map[2] = cpu_to_be32(host->node_count << 16 |
| 139 | | host->selfid_count); | 138 | | host->selfid_count); |
| 140 | host->csr.topology_map[0] = | 139 | host->csr.topology_map[0] = |
| @@ -142,8 +141,7 @@ static void host_reset(struct hpsb_host *host) | |||
| 142 | | csr_crc16(host->csr.topology_map + 1, | 141 | | csr_crc16(host->csr.topology_map + 1, |
| 143 | host->selfid_count + 2)); | 142 | host->selfid_count + 2)); |
| 144 | 143 | ||
| 145 | host->csr.speed_map[1] = | 144 | be32_add_cpu(&host->csr.speed_map[1], 1); |
| 146 | cpu_to_be32(be32_to_cpu(host->csr.speed_map[1]) + 1); | ||
| 147 | host->csr.speed_map[0] = cpu_to_be32(0x3f1 << 16 | 145 | host->csr.speed_map[0] = cpu_to_be32(0x3f1 << 16 |
| 148 | | csr_crc16(host->csr.speed_map+1, | 146 | | csr_crc16(host->csr.speed_map+1, |
| 149 | 0x3f1)); | 147 | 0x3f1)); |
diff --git a/drivers/ieee1394/dv1394.c b/drivers/ieee1394/dv1394.c index 65722117ab6e..6228fadacd38 100644 --- a/drivers/ieee1394/dv1394.c +++ b/drivers/ieee1394/dv1394.c | |||
| @@ -2179,8 +2179,7 @@ static struct ieee1394_device_id dv1394_id_table[] = { | |||
| 2179 | MODULE_DEVICE_TABLE(ieee1394, dv1394_id_table); | 2179 | MODULE_DEVICE_TABLE(ieee1394, dv1394_id_table); |
| 2180 | 2180 | ||
| 2181 | static struct hpsb_protocol_driver dv1394_driver = { | 2181 | static struct hpsb_protocol_driver dv1394_driver = { |
| 2182 | .name = "dv1394", | 2182 | .name = "dv1394", |
| 2183 | .id_table = dv1394_id_table, | ||
| 2184 | }; | 2183 | }; |
| 2185 | 2184 | ||
| 2186 | 2185 | ||
| @@ -2568,7 +2567,6 @@ static int __init dv1394_init_module(void) | |||
| 2568 | 2567 | ||
| 2569 | cdev_init(&dv1394_cdev, &dv1394_fops); | 2568 | cdev_init(&dv1394_cdev, &dv1394_fops); |
| 2570 | dv1394_cdev.owner = THIS_MODULE; | 2569 | dv1394_cdev.owner = THIS_MODULE; |
| 2571 | kobject_set_name(&dv1394_cdev.kobj, "dv1394"); | ||
| 2572 | ret = cdev_add(&dv1394_cdev, IEEE1394_DV1394_DEV, 16); | 2570 | ret = cdev_add(&dv1394_cdev, IEEE1394_DV1394_DEV, 16); |
| 2573 | if (ret) { | 2571 | if (ret) { |
| 2574 | printk(KERN_ERR "dv1394: unable to register character device\n"); | 2572 | printk(KERN_ERR "dv1394: unable to register character device\n"); |
diff --git a/drivers/ieee1394/highlevel.c b/drivers/ieee1394/highlevel.c index b6425469b6ee..fa2bfec0fca2 100644 --- a/drivers/ieee1394/highlevel.c +++ b/drivers/ieee1394/highlevel.c | |||
| @@ -339,7 +339,7 @@ u64 hpsb_allocate_and_register_addrspace(struct hpsb_highlevel *hl, | |||
| 339 | if ((alignment & 3) || (alignment > 0x800000000000ULL) || | 339 | if ((alignment & 3) || (alignment > 0x800000000000ULL) || |
| 340 | (hweight64(alignment) != 1)) { | 340 | (hweight64(alignment) != 1)) { |
| 341 | HPSB_ERR("%s called with invalid alignment: 0x%048llx", | 341 | HPSB_ERR("%s called with invalid alignment: 0x%048llx", |
| 342 | __FUNCTION__, (unsigned long long)alignment); | 342 | __func__, (unsigned long long)alignment); |
| 343 | return retval; | 343 | return retval; |
| 344 | } | 344 | } |
| 345 | 345 | ||
| @@ -354,7 +354,7 @@ u64 hpsb_allocate_and_register_addrspace(struct hpsb_highlevel *hl, | |||
| 354 | if (((start|end) & ~align_mask) || (start >= end) || | 354 | if (((start|end) & ~align_mask) || (start >= end) || |
| 355 | (end > CSR1212_ALL_SPACE_END)) { | 355 | (end > CSR1212_ALL_SPACE_END)) { |
| 356 | HPSB_ERR("%s called with invalid addresses " | 356 | HPSB_ERR("%s called with invalid addresses " |
| 357 | "(start = %012Lx end = %012Lx)", __FUNCTION__, | 357 | "(start = %012Lx end = %012Lx)", __func__, |
| 358 | (unsigned long long)start,(unsigned long long)end); | 358 | (unsigned long long)start,(unsigned long long)end); |
| 359 | return retval; | 359 | return retval; |
| 360 | } | 360 | } |
| @@ -422,7 +422,7 @@ int hpsb_register_addrspace(struct hpsb_highlevel *hl, struct hpsb_host *host, | |||
| 422 | 422 | ||
| 423 | if (((start|end) & 3) || (start >= end) || | 423 | if (((start|end) & 3) || (start >= end) || |
| 424 | (end > CSR1212_ALL_SPACE_END)) { | 424 | (end > CSR1212_ALL_SPACE_END)) { |
| 425 | HPSB_ERR("%s called with invalid addresses", __FUNCTION__); | 425 | HPSB_ERR("%s called with invalid addresses", __func__); |
| 426 | return 0; | 426 | return 0; |
| 427 | } | 427 | } |
| 428 | 428 | ||
diff --git a/drivers/ieee1394/ieee1394_core.c b/drivers/ieee1394/ieee1394_core.c index 36c747b277d0..dcdb71a7718d 100644 --- a/drivers/ieee1394/ieee1394_core.c +++ b/drivers/ieee1394/ieee1394_core.c | |||
| @@ -242,7 +242,7 @@ int hpsb_bus_reset(struct hpsb_host *host) | |||
| 242 | { | 242 | { |
| 243 | if (host->in_bus_reset) { | 243 | if (host->in_bus_reset) { |
| 244 | HPSB_NOTICE("%s called while bus reset already in progress", | 244 | HPSB_NOTICE("%s called while bus reset already in progress", |
| 245 | __FUNCTION__); | 245 | __func__); |
| 246 | return 1; | 246 | return 1; |
| 247 | } | 247 | } |
| 248 | 248 | ||
| @@ -373,6 +373,8 @@ static void build_speed_map(struct hpsb_host *host, int nodecount) | |||
| 373 | if (sid->port2 == SELFID_PORT_CHILD) cldcnt[n]++; | 373 | if (sid->port2 == SELFID_PORT_CHILD) cldcnt[n]++; |
| 374 | 374 | ||
| 375 | speedcap[n] = sid->speed; | 375 | speedcap[n] = sid->speed; |
| 376 | if (speedcap[n] > host->csr.lnk_spd) | ||
| 377 | speedcap[n] = host->csr.lnk_spd; | ||
| 376 | n--; | 378 | n--; |
| 377 | } | 379 | } |
| 378 | } | 380 | } |
diff --git a/drivers/ieee1394/nodemgr.c b/drivers/ieee1394/nodemgr.c index 511e4321c6b6..70afa3786f3f 100644 --- a/drivers/ieee1394/nodemgr.c +++ b/drivers/ieee1394/nodemgr.c | |||
| @@ -701,7 +701,11 @@ static int nodemgr_bus_match(struct device * dev, struct device_driver * drv) | |||
| 701 | return 0; | 701 | return 0; |
| 702 | 702 | ||
| 703 | driver = container_of(drv, struct hpsb_protocol_driver, driver); | 703 | driver = container_of(drv, struct hpsb_protocol_driver, driver); |
| 704 | for (id = driver->id_table; id->match_flags != 0; id++) { | 704 | id = driver->id_table; |
| 705 | if (!id) | ||
| 706 | return 0; | ||
| 707 | |||
| 708 | for (; id->match_flags != 0; id++) { | ||
| 705 | if ((id->match_flags & IEEE1394_MATCH_VENDOR_ID) && | 709 | if ((id->match_flags & IEEE1394_MATCH_VENDOR_ID) && |
| 706 | id->vendor_id != ud->vendor_id) | 710 | id->vendor_id != ud->vendor_id) |
| 707 | continue; | 711 | continue; |
diff --git a/drivers/ieee1394/ohci1394.c b/drivers/ieee1394/ohci1394.c index 969de2a2d633..0690469fcecf 100644 --- a/drivers/ieee1394/ohci1394.c +++ b/drivers/ieee1394/ohci1394.c | |||
| @@ -149,7 +149,7 @@ printk(level "%s: fw-host%d: " fmt "\n" , OHCI1394_DRIVER_NAME, ohci->host->id , | |||
| 149 | /* Module Parameters */ | 149 | /* Module Parameters */ |
| 150 | static int phys_dma = 1; | 150 | static int phys_dma = 1; |
| 151 | module_param(phys_dma, int, 0444); | 151 | module_param(phys_dma, int, 0444); |
| 152 | MODULE_PARM_DESC(phys_dma, "Enable physical dma (default = 1)."); | 152 | MODULE_PARM_DESC(phys_dma, "Enable physical DMA (default = 1)."); |
| 153 | 153 | ||
| 154 | static void dma_trm_tasklet(unsigned long data); | 154 | static void dma_trm_tasklet(unsigned long data); |
| 155 | static void dma_trm_reset(struct dma_trm_ctx *d); | 155 | static void dma_trm_reset(struct dma_trm_ctx *d); |
| @@ -708,7 +708,7 @@ static void insert_packet(struct ti_ohci *ohci, | |||
| 708 | /* FIXME: do something about it */ | 708 | /* FIXME: do something about it */ |
| 709 | PRINT(KERN_ERR, | 709 | PRINT(KERN_ERR, |
| 710 | "%s: packet data addr: %p size %Zd bytes " | 710 | "%s: packet data addr: %p size %Zd bytes " |
| 711 | "cross page boundary", __FUNCTION__, | 711 | "cross page boundary", __func__, |
| 712 | packet->data, packet->data_size); | 712 | packet->data, packet->data_size); |
| 713 | } | 713 | } |
| 714 | #endif | 714 | #endif |
| @@ -2089,10 +2089,8 @@ static void dma_trm_reset(struct dma_trm_ctx *d) | |||
| 2089 | 2089 | ||
| 2090 | spin_lock_irqsave(&d->lock, flags); | 2090 | spin_lock_irqsave(&d->lock, flags); |
| 2091 | 2091 | ||
| 2092 | list_splice(&d->fifo_list, &packet_list); | 2092 | list_splice_init(&d->fifo_list, &packet_list); |
| 2093 | list_splice(&d->pending_list, &packet_list); | 2093 | list_splice_init(&d->pending_list, &packet_list); |
| 2094 | INIT_LIST_HEAD(&d->fifo_list); | ||
| 2095 | INIT_LIST_HEAD(&d->pending_list); | ||
| 2096 | 2094 | ||
| 2097 | d->branchAddrPtr = NULL; | 2095 | d->branchAddrPtr = NULL; |
| 2098 | d->sent_ind = d->prg_ind; | 2096 | d->sent_ind = d->prg_ind; |
| @@ -2787,7 +2785,7 @@ alloc_dma_rcv_ctx(struct ti_ohci *ohci, struct dma_rcv_ctx *d, | |||
| 2787 | d->buf_bus = kzalloc(d->num_desc * sizeof(*d->buf_bus), GFP_ATOMIC); | 2785 | d->buf_bus = kzalloc(d->num_desc * sizeof(*d->buf_bus), GFP_ATOMIC); |
| 2788 | 2786 | ||
| 2789 | if (d->buf_cpu == NULL || d->buf_bus == NULL) { | 2787 | if (d->buf_cpu == NULL || d->buf_bus == NULL) { |
| 2790 | PRINT(KERN_ERR, "Failed to allocate dma buffer"); | 2788 | PRINT(KERN_ERR, "Failed to allocate %s", "DMA buffer"); |
| 2791 | free_dma_rcv_ctx(d); | 2789 | free_dma_rcv_ctx(d); |
| 2792 | return -ENOMEM; | 2790 | return -ENOMEM; |
| 2793 | } | 2791 | } |
| @@ -2796,7 +2794,7 @@ alloc_dma_rcv_ctx(struct ti_ohci *ohci, struct dma_rcv_ctx *d, | |||
| 2796 | d->prg_bus = kzalloc(d->num_desc * sizeof(*d->prg_bus), GFP_ATOMIC); | 2794 | d->prg_bus = kzalloc(d->num_desc * sizeof(*d->prg_bus), GFP_ATOMIC); |
| 2797 | 2795 | ||
| 2798 | if (d->prg_cpu == NULL || d->prg_bus == NULL) { | 2796 | if (d->prg_cpu == NULL || d->prg_bus == NULL) { |
| 2799 | PRINT(KERN_ERR, "Failed to allocate dma prg"); | 2797 | PRINT(KERN_ERR, "Failed to allocate %s", "DMA prg"); |
| 2800 | free_dma_rcv_ctx(d); | 2798 | free_dma_rcv_ctx(d); |
| 2801 | return -ENOMEM; | 2799 | return -ENOMEM; |
| 2802 | } | 2800 | } |
| @@ -2804,7 +2802,7 @@ alloc_dma_rcv_ctx(struct ti_ohci *ohci, struct dma_rcv_ctx *d, | |||
| 2804 | d->spb = kmalloc(d->split_buf_size, GFP_ATOMIC); | 2802 | d->spb = kmalloc(d->split_buf_size, GFP_ATOMIC); |
| 2805 | 2803 | ||
| 2806 | if (d->spb == NULL) { | 2804 | if (d->spb == NULL) { |
| 2807 | PRINT(KERN_ERR, "Failed to allocate split buffer"); | 2805 | PRINT(KERN_ERR, "Failed to allocate %s", "split buffer"); |
| 2808 | free_dma_rcv_ctx(d); | 2806 | free_dma_rcv_ctx(d); |
| 2809 | return -ENOMEM; | 2807 | return -ENOMEM; |
| 2810 | } | 2808 | } |
| @@ -2830,7 +2828,7 @@ alloc_dma_rcv_ctx(struct ti_ohci *ohci, struct dma_rcv_ctx *d, | |||
| 2830 | memset(d->buf_cpu[i], 0, d->buf_size); | 2828 | memset(d->buf_cpu[i], 0, d->buf_size); |
| 2831 | } else { | 2829 | } else { |
| 2832 | PRINT(KERN_ERR, | 2830 | PRINT(KERN_ERR, |
| 2833 | "Failed to allocate dma buffer"); | 2831 | "Failed to allocate %s", "DMA buffer"); |
| 2834 | free_dma_rcv_ctx(d); | 2832 | free_dma_rcv_ctx(d); |
| 2835 | return -ENOMEM; | 2833 | return -ENOMEM; |
| 2836 | } | 2834 | } |
| @@ -2841,7 +2839,7 @@ alloc_dma_rcv_ctx(struct ti_ohci *ohci, struct dma_rcv_ctx *d, | |||
| 2841 | memset(d->prg_cpu[i], 0, sizeof(struct dma_cmd)); | 2839 | memset(d->prg_cpu[i], 0, sizeof(struct dma_cmd)); |
| 2842 | } else { | 2840 | } else { |
| 2843 | PRINT(KERN_ERR, | 2841 | PRINT(KERN_ERR, |
| 2844 | "Failed to allocate dma prg"); | 2842 | "Failed to allocate %s", "DMA prg"); |
| 2845 | free_dma_rcv_ctx(d); | 2843 | free_dma_rcv_ctx(d); |
| 2846 | return -ENOMEM; | 2844 | return -ENOMEM; |
| 2847 | } | 2845 | } |
| @@ -2902,7 +2900,7 @@ alloc_dma_trm_ctx(struct ti_ohci *ohci, struct dma_trm_ctx *d, | |||
| 2902 | d->prg_bus = kzalloc(d->num_desc * sizeof(*d->prg_bus), GFP_KERNEL); | 2900 | d->prg_bus = kzalloc(d->num_desc * sizeof(*d->prg_bus), GFP_KERNEL); |
| 2903 | 2901 | ||
| 2904 | if (d->prg_cpu == NULL || d->prg_bus == NULL) { | 2902 | if (d->prg_cpu == NULL || d->prg_bus == NULL) { |
| 2905 | PRINT(KERN_ERR, "Failed to allocate at dma prg"); | 2903 | PRINT(KERN_ERR, "Failed to allocate %s", "AT DMA prg"); |
| 2906 | free_dma_trm_ctx(d); | 2904 | free_dma_trm_ctx(d); |
| 2907 | return -ENOMEM; | 2905 | return -ENOMEM; |
| 2908 | } | 2906 | } |
| @@ -2925,7 +2923,7 @@ alloc_dma_trm_ctx(struct ti_ohci *ohci, struct dma_trm_ctx *d, | |||
| 2925 | memset(d->prg_cpu[i], 0, sizeof(struct at_dma_prg)); | 2923 | memset(d->prg_cpu[i], 0, sizeof(struct at_dma_prg)); |
| 2926 | } else { | 2924 | } else { |
| 2927 | PRINT(KERN_ERR, | 2925 | PRINT(KERN_ERR, |
| 2928 | "Failed to allocate at dma prg"); | 2926 | "Failed to allocate %s", "AT DMA prg"); |
| 2929 | free_dma_trm_ctx(d); | 2927 | free_dma_trm_ctx(d); |
| 2930 | return -ENOMEM; | 2928 | return -ENOMEM; |
| 2931 | } | 2929 | } |
| @@ -2986,22 +2984,9 @@ static struct hpsb_host_driver ohci1394_driver = { | |||
| 2986 | * PCI Driver Interface functions * | 2984 | * PCI Driver Interface functions * |
| 2987 | ***********************************/ | 2985 | ***********************************/ |
| 2988 | 2986 | ||
| 2989 | #define FAIL(err, fmt, args...) \ | ||
| 2990 | do { \ | ||
| 2991 | PRINT_G(KERN_ERR, fmt , ## args); \ | ||
| 2992 | ohci1394_pci_remove(dev); \ | ||
| 2993 | return err; \ | ||
| 2994 | } while (0) | ||
| 2995 | |||
| 2996 | static int __devinit ohci1394_pci_probe(struct pci_dev *dev, | ||
| 2997 | const struct pci_device_id *ent) | ||
| 2998 | { | ||
| 2999 | struct hpsb_host *host; | ||
| 3000 | struct ti_ohci *ohci; /* shortcut to currently handled device */ | ||
| 3001 | resource_size_t ohci_base; | ||
| 3002 | |||
| 3003 | #ifdef CONFIG_PPC_PMAC | 2987 | #ifdef CONFIG_PPC_PMAC |
| 3004 | /* Necessary on some machines if ohci1394 was loaded/ unloaded before */ | 2988 | static void ohci1394_pmac_on(struct pci_dev *dev) |
| 2989 | { | ||
| 3005 | if (machine_is(powermac)) { | 2990 | if (machine_is(powermac)) { |
| 3006 | struct device_node *ofn = pci_device_to_OF_node(dev); | 2991 | struct device_node *ofn = pci_device_to_OF_node(dev); |
| 3007 | 2992 | ||
| @@ -3010,15 +2995,45 @@ static int __devinit ohci1394_pci_probe(struct pci_dev *dev, | |||
| 3010 | pmac_call_feature(PMAC_FTR_1394_ENABLE, ofn, 0, 1); | 2995 | pmac_call_feature(PMAC_FTR_1394_ENABLE, ofn, 0, 1); |
| 3011 | } | 2996 | } |
| 3012 | } | 2997 | } |
| 2998 | } | ||
| 2999 | |||
| 3000 | static void ohci1394_pmac_off(struct pci_dev *dev) | ||
| 3001 | { | ||
| 3002 | if (machine_is(powermac)) { | ||
| 3003 | struct device_node *ofn = pci_device_to_OF_node(dev); | ||
| 3004 | |||
| 3005 | if (ofn) { | ||
| 3006 | pmac_call_feature(PMAC_FTR_1394_ENABLE, ofn, 0, 0); | ||
| 3007 | pmac_call_feature(PMAC_FTR_1394_CABLE_POWER, ofn, 0, 0); | ||
| 3008 | } | ||
| 3009 | } | ||
| 3010 | } | ||
| 3011 | #else | ||
| 3012 | #define ohci1394_pmac_on(dev) | ||
| 3013 | #define ohci1394_pmac_off(dev) | ||
| 3013 | #endif /* CONFIG_PPC_PMAC */ | 3014 | #endif /* CONFIG_PPC_PMAC */ |
| 3014 | 3015 | ||
| 3015 | if (pci_enable_device(dev)) | 3016 | static int __devinit ohci1394_pci_probe(struct pci_dev *dev, |
| 3016 | FAIL(-ENXIO, "Failed to enable OHCI hardware"); | 3017 | const struct pci_device_id *ent) |
| 3018 | { | ||
| 3019 | struct hpsb_host *host; | ||
| 3020 | struct ti_ohci *ohci; /* shortcut to currently handled device */ | ||
| 3021 | resource_size_t ohci_base; | ||
| 3022 | int err = -ENOMEM; | ||
| 3023 | |||
| 3024 | ohci1394_pmac_on(dev); | ||
| 3025 | if (pci_enable_device(dev)) { | ||
| 3026 | PRINT_G(KERN_ERR, "Failed to enable OHCI hardware"); | ||
| 3027 | err = -ENXIO; | ||
| 3028 | goto err; | ||
| 3029 | } | ||
| 3017 | pci_set_master(dev); | 3030 | pci_set_master(dev); |
| 3018 | 3031 | ||
| 3019 | host = hpsb_alloc_host(&ohci1394_driver, sizeof(struct ti_ohci), &dev->dev); | 3032 | host = hpsb_alloc_host(&ohci1394_driver, sizeof(struct ti_ohci), &dev->dev); |
| 3020 | if (!host) FAIL(-ENOMEM, "Failed to allocate host structure"); | 3033 | if (!host) { |
| 3021 | 3034 | PRINT_G(KERN_ERR, "Failed to allocate %s", "host structure"); | |
| 3035 | goto err; | ||
| 3036 | } | ||
| 3022 | ohci = host->hostdata; | 3037 | ohci = host->hostdata; |
| 3023 | ohci->dev = dev; | 3038 | ohci->dev = dev; |
| 3024 | ohci->host = host; | 3039 | ohci->host = host; |
| @@ -3067,15 +3082,20 @@ static int __devinit ohci1394_pci_probe(struct pci_dev *dev, | |||
| 3067 | (unsigned long long)pci_resource_len(dev, 0)); | 3082 | (unsigned long long)pci_resource_len(dev, 0)); |
| 3068 | 3083 | ||
| 3069 | if (!request_mem_region(ohci_base, OHCI1394_REGISTER_SIZE, | 3084 | if (!request_mem_region(ohci_base, OHCI1394_REGISTER_SIZE, |
| 3070 | OHCI1394_DRIVER_NAME)) | 3085 | OHCI1394_DRIVER_NAME)) { |
| 3071 | FAIL(-ENOMEM, "MMIO resource (0x%llx - 0x%llx) unavailable", | 3086 | PRINT_G(KERN_ERR, "MMIO resource (0x%llx - 0x%llx) unavailable", |
| 3072 | (unsigned long long)ohci_base, | 3087 | (unsigned long long)ohci_base, |
| 3073 | (unsigned long long)ohci_base + OHCI1394_REGISTER_SIZE); | 3088 | (unsigned long long)ohci_base + OHCI1394_REGISTER_SIZE); |
| 3089 | goto err; | ||
| 3090 | } | ||
| 3074 | ohci->init_state = OHCI_INIT_HAVE_MEM_REGION; | 3091 | ohci->init_state = OHCI_INIT_HAVE_MEM_REGION; |
| 3075 | 3092 | ||
| 3076 | ohci->registers = ioremap(ohci_base, OHCI1394_REGISTER_SIZE); | 3093 | ohci->registers = ioremap(ohci_base, OHCI1394_REGISTER_SIZE); |
| 3077 | if (ohci->registers == NULL) | 3094 | if (ohci->registers == NULL) { |
| 3078 | FAIL(-ENXIO, "Failed to remap registers - card not accessible"); | 3095 | PRINT_G(KERN_ERR, "Failed to remap registers"); |
| 3096 | err = -ENXIO; | ||
| 3097 | goto err; | ||
| 3098 | } | ||
| 3079 | ohci->init_state = OHCI_INIT_HAVE_IOMAPPING; | 3099 | ohci->init_state = OHCI_INIT_HAVE_IOMAPPING; |
| 3080 | DBGMSG("Remapped memory spaces reg 0x%p", ohci->registers); | 3100 | DBGMSG("Remapped memory spaces reg 0x%p", ohci->registers); |
| 3081 | 3101 | ||
| @@ -3083,16 +3103,20 @@ static int __devinit ohci1394_pci_probe(struct pci_dev *dev, | |||
| 3083 | ohci->csr_config_rom_cpu = | 3103 | ohci->csr_config_rom_cpu = |
| 3084 | pci_alloc_consistent(ohci->dev, OHCI_CONFIG_ROM_LEN, | 3104 | pci_alloc_consistent(ohci->dev, OHCI_CONFIG_ROM_LEN, |
| 3085 | &ohci->csr_config_rom_bus); | 3105 | &ohci->csr_config_rom_bus); |
| 3086 | if (ohci->csr_config_rom_cpu == NULL) | 3106 | if (ohci->csr_config_rom_cpu == NULL) { |
| 3087 | FAIL(-ENOMEM, "Failed to allocate buffer config rom"); | 3107 | PRINT_G(KERN_ERR, "Failed to allocate %s", "buffer config rom"); |
| 3108 | goto err; | ||
| 3109 | } | ||
| 3088 | ohci->init_state = OHCI_INIT_HAVE_CONFIG_ROM_BUFFER; | 3110 | ohci->init_state = OHCI_INIT_HAVE_CONFIG_ROM_BUFFER; |
| 3089 | 3111 | ||
| 3090 | /* self-id dma buffer allocation */ | 3112 | /* self-id dma buffer allocation */ |
| 3091 | ohci->selfid_buf_cpu = | 3113 | ohci->selfid_buf_cpu = |
| 3092 | pci_alloc_consistent(ohci->dev, OHCI1394_SI_DMA_BUF_SIZE, | 3114 | pci_alloc_consistent(ohci->dev, OHCI1394_SI_DMA_BUF_SIZE, |
| 3093 | &ohci->selfid_buf_bus); | 3115 | &ohci->selfid_buf_bus); |
| 3094 | if (ohci->selfid_buf_cpu == NULL) | 3116 | if (ohci->selfid_buf_cpu == NULL) { |
| 3095 | FAIL(-ENOMEM, "Failed to allocate DMA buffer for self-id packets"); | 3117 | PRINT_G(KERN_ERR, "Failed to allocate %s", "self-ID buffer"); |
| 3118 | goto err; | ||
| 3119 | } | ||
| 3096 | ohci->init_state = OHCI_INIT_HAVE_SELFID_BUFFER; | 3120 | ohci->init_state = OHCI_INIT_HAVE_SELFID_BUFFER; |
| 3097 | 3121 | ||
| 3098 | if ((unsigned long)ohci->selfid_buf_cpu & 0x1fff) | 3122 | if ((unsigned long)ohci->selfid_buf_cpu & 0x1fff) |
| @@ -3108,28 +3132,32 @@ static int __devinit ohci1394_pci_probe(struct pci_dev *dev, | |||
| 3108 | if (alloc_dma_rcv_ctx(ohci, &ohci->ar_req_context, | 3132 | if (alloc_dma_rcv_ctx(ohci, &ohci->ar_req_context, |
| 3109 | DMA_CTX_ASYNC_REQ, 0, AR_REQ_NUM_DESC, | 3133 | DMA_CTX_ASYNC_REQ, 0, AR_REQ_NUM_DESC, |
| 3110 | AR_REQ_BUF_SIZE, AR_REQ_SPLIT_BUF_SIZE, | 3134 | AR_REQ_BUF_SIZE, AR_REQ_SPLIT_BUF_SIZE, |
| 3111 | OHCI1394_AsReqRcvContextBase) < 0) | 3135 | OHCI1394_AsReqRcvContextBase) < 0) { |
| 3112 | FAIL(-ENOMEM, "Failed to allocate AR Req context"); | 3136 | PRINT_G(KERN_ERR, "Failed to allocate %s", "AR Req context"); |
| 3113 | 3137 | goto err; | |
| 3138 | } | ||
| 3114 | /* AR DMA response context allocation */ | 3139 | /* AR DMA response context allocation */ |
| 3115 | if (alloc_dma_rcv_ctx(ohci, &ohci->ar_resp_context, | 3140 | if (alloc_dma_rcv_ctx(ohci, &ohci->ar_resp_context, |
| 3116 | DMA_CTX_ASYNC_RESP, 0, AR_RESP_NUM_DESC, | 3141 | DMA_CTX_ASYNC_RESP, 0, AR_RESP_NUM_DESC, |
| 3117 | AR_RESP_BUF_SIZE, AR_RESP_SPLIT_BUF_SIZE, | 3142 | AR_RESP_BUF_SIZE, AR_RESP_SPLIT_BUF_SIZE, |
| 3118 | OHCI1394_AsRspRcvContextBase) < 0) | 3143 | OHCI1394_AsRspRcvContextBase) < 0) { |
| 3119 | FAIL(-ENOMEM, "Failed to allocate AR Resp context"); | 3144 | PRINT_G(KERN_ERR, "Failed to allocate %s", "AR Resp context"); |
| 3120 | 3145 | goto err; | |
| 3146 | } | ||
| 3121 | /* AT DMA request context */ | 3147 | /* AT DMA request context */ |
| 3122 | if (alloc_dma_trm_ctx(ohci, &ohci->at_req_context, | 3148 | if (alloc_dma_trm_ctx(ohci, &ohci->at_req_context, |
| 3123 | DMA_CTX_ASYNC_REQ, 0, AT_REQ_NUM_DESC, | 3149 | DMA_CTX_ASYNC_REQ, 0, AT_REQ_NUM_DESC, |
| 3124 | OHCI1394_AsReqTrContextBase) < 0) | 3150 | OHCI1394_AsReqTrContextBase) < 0) { |
| 3125 | FAIL(-ENOMEM, "Failed to allocate AT Req context"); | 3151 | PRINT_G(KERN_ERR, "Failed to allocate %s", "AT Req context"); |
| 3126 | 3152 | goto err; | |
| 3153 | } | ||
| 3127 | /* AT DMA response context */ | 3154 | /* AT DMA response context */ |
| 3128 | if (alloc_dma_trm_ctx(ohci, &ohci->at_resp_context, | 3155 | if (alloc_dma_trm_ctx(ohci, &ohci->at_resp_context, |
| 3129 | DMA_CTX_ASYNC_RESP, 1, AT_RESP_NUM_DESC, | 3156 | DMA_CTX_ASYNC_RESP, 1, AT_RESP_NUM_DESC, |
| 3130 | OHCI1394_AsRspTrContextBase) < 0) | 3157 | OHCI1394_AsRspTrContextBase) < 0) { |
| 3131 | FAIL(-ENOMEM, "Failed to allocate AT Resp context"); | 3158 | PRINT_G(KERN_ERR, "Failed to allocate %s", "AT Resp context"); |
| 3132 | 3159 | goto err; | |
| 3160 | } | ||
| 3133 | /* Start off with a soft reset, to clear everything to a sane | 3161 | /* Start off with a soft reset, to clear everything to a sane |
| 3134 | * state. */ | 3162 | * state. */ |
| 3135 | ohci_soft_reset(ohci); | 3163 | ohci_soft_reset(ohci); |
| @@ -3172,9 +3200,10 @@ static int __devinit ohci1394_pci_probe(struct pci_dev *dev, | |||
| 3172 | * by that point. | 3200 | * by that point. |
| 3173 | */ | 3201 | */ |
| 3174 | if (request_irq(dev->irq, ohci_irq_handler, IRQF_SHARED, | 3202 | if (request_irq(dev->irq, ohci_irq_handler, IRQF_SHARED, |
| 3175 | OHCI1394_DRIVER_NAME, ohci)) | 3203 | OHCI1394_DRIVER_NAME, ohci)) { |
| 3176 | FAIL(-ENOMEM, "Failed to allocate shared interrupt %d", dev->irq); | 3204 | PRINT_G(KERN_ERR, "Failed to allocate interrupt %d", dev->irq); |
| 3177 | 3205 | goto err; | |
| 3206 | } | ||
| 3178 | ohci->init_state = OHCI_INIT_HAVE_IRQ; | 3207 | ohci->init_state = OHCI_INIT_HAVE_IRQ; |
| 3179 | ohci_initialize(ohci); | 3208 | ohci_initialize(ohci); |
| 3180 | 3209 | ||
| @@ -3194,25 +3223,28 @@ static int __devinit ohci1394_pci_probe(struct pci_dev *dev, | |||
| 3194 | host->middle_addr_space = OHCI1394_MIDDLE_ADDRESS_SPACE; | 3223 | host->middle_addr_space = OHCI1394_MIDDLE_ADDRESS_SPACE; |
| 3195 | 3224 | ||
| 3196 | /* Tell the highlevel this host is ready */ | 3225 | /* Tell the highlevel this host is ready */ |
| 3197 | if (hpsb_add_host(host)) | 3226 | if (hpsb_add_host(host)) { |
| 3198 | FAIL(-ENOMEM, "Failed to register host with highlevel"); | 3227 | PRINT_G(KERN_ERR, "Failed to register host with highlevel"); |
| 3199 | 3228 | goto err; | |
| 3229 | } | ||
| 3200 | ohci->init_state = OHCI_INIT_DONE; | 3230 | ohci->init_state = OHCI_INIT_DONE; |
| 3201 | 3231 | ||
| 3202 | return 0; | 3232 | return 0; |
| 3203 | #undef FAIL | 3233 | err: |
| 3234 | ohci1394_pci_remove(dev); | ||
| 3235 | return err; | ||
| 3204 | } | 3236 | } |
| 3205 | 3237 | ||
| 3206 | static void ohci1394_pci_remove(struct pci_dev *pdev) | 3238 | static void ohci1394_pci_remove(struct pci_dev *dev) |
| 3207 | { | 3239 | { |
| 3208 | struct ti_ohci *ohci; | 3240 | struct ti_ohci *ohci; |
| 3209 | struct device *dev; | 3241 | struct device *device; |
| 3210 | 3242 | ||
| 3211 | ohci = pci_get_drvdata(pdev); | 3243 | ohci = pci_get_drvdata(dev); |
| 3212 | if (!ohci) | 3244 | if (!ohci) |
| 3213 | return; | 3245 | goto out; |
| 3214 | 3246 | ||
| 3215 | dev = get_device(&ohci->host->device); | 3247 | device = get_device(&ohci->host->device); |
| 3216 | 3248 | ||
| 3217 | switch (ohci->init_state) { | 3249 | switch (ohci->init_state) { |
| 3218 | case OHCI_INIT_DONE: | 3250 | case OHCI_INIT_DONE: |
| @@ -3246,7 +3278,7 @@ static void ohci1394_pci_remove(struct pci_dev *pdev) | |||
| 3246 | /* Soft reset before we start - this disables | 3278 | /* Soft reset before we start - this disables |
| 3247 | * interrupts and clears linkEnable and LPS. */ | 3279 | * interrupts and clears linkEnable and LPS. */ |
| 3248 | ohci_soft_reset(ohci); | 3280 | ohci_soft_reset(ohci); |
| 3249 | free_irq(ohci->dev->irq, ohci); | 3281 | free_irq(dev->irq, ohci); |
| 3250 | 3282 | ||
| 3251 | case OHCI_INIT_HAVE_TXRX_BUFFERS__MAYBE: | 3283 | case OHCI_INIT_HAVE_TXRX_BUFFERS__MAYBE: |
| 3252 | /* The ohci_soft_reset() stops all DMA contexts, so we | 3284 | /* The ohci_soft_reset() stops all DMA contexts, so we |
| @@ -3257,12 +3289,12 @@ static void ohci1394_pci_remove(struct pci_dev *pdev) | |||
| 3257 | free_dma_trm_ctx(&ohci->at_resp_context); | 3289 | free_dma_trm_ctx(&ohci->at_resp_context); |
| 3258 | 3290 | ||
| 3259 | case OHCI_INIT_HAVE_SELFID_BUFFER: | 3291 | case OHCI_INIT_HAVE_SELFID_BUFFER: |
| 3260 | pci_free_consistent(ohci->dev, OHCI1394_SI_DMA_BUF_SIZE, | 3292 | pci_free_consistent(dev, OHCI1394_SI_DMA_BUF_SIZE, |
| 3261 | ohci->selfid_buf_cpu, | 3293 | ohci->selfid_buf_cpu, |
| 3262 | ohci->selfid_buf_bus); | 3294 | ohci->selfid_buf_bus); |
| 3263 | 3295 | ||
| 3264 | case OHCI_INIT_HAVE_CONFIG_ROM_BUFFER: | 3296 | case OHCI_INIT_HAVE_CONFIG_ROM_BUFFER: |
| 3265 | pci_free_consistent(ohci->dev, OHCI_CONFIG_ROM_LEN, | 3297 | pci_free_consistent(dev, OHCI_CONFIG_ROM_LEN, |
| 3266 | ohci->csr_config_rom_cpu, | 3298 | ohci->csr_config_rom_cpu, |
| 3267 | ohci->csr_config_rom_bus); | 3299 | ohci->csr_config_rom_bus); |
| 3268 | 3300 | ||
| @@ -3270,35 +3302,24 @@ static void ohci1394_pci_remove(struct pci_dev *pdev) | |||
| 3270 | iounmap(ohci->registers); | 3302 | iounmap(ohci->registers); |
| 3271 | 3303 | ||
| 3272 | case OHCI_INIT_HAVE_MEM_REGION: | 3304 | case OHCI_INIT_HAVE_MEM_REGION: |
| 3273 | release_mem_region(pci_resource_start(ohci->dev, 0), | 3305 | release_mem_region(pci_resource_start(dev, 0), |
| 3274 | OHCI1394_REGISTER_SIZE); | 3306 | OHCI1394_REGISTER_SIZE); |
| 3275 | 3307 | ||
| 3276 | #ifdef CONFIG_PPC_PMAC | ||
| 3277 | /* On UniNorth, power down the cable and turn off the chip clock | ||
| 3278 | * to save power on laptops */ | ||
| 3279 | if (machine_is(powermac)) { | ||
| 3280 | struct device_node* ofn = pci_device_to_OF_node(ohci->dev); | ||
| 3281 | |||
| 3282 | if (ofn) { | ||
| 3283 | pmac_call_feature(PMAC_FTR_1394_ENABLE, ofn, 0, 0); | ||
| 3284 | pmac_call_feature(PMAC_FTR_1394_CABLE_POWER, ofn, 0, 0); | ||
| 3285 | } | ||
| 3286 | } | ||
| 3287 | #endif /* CONFIG_PPC_PMAC */ | ||
| 3288 | |||
| 3289 | case OHCI_INIT_ALLOC_HOST: | 3308 | case OHCI_INIT_ALLOC_HOST: |
| 3290 | pci_set_drvdata(ohci->dev, NULL); | 3309 | pci_set_drvdata(dev, NULL); |
| 3291 | } | 3310 | } |
| 3292 | 3311 | ||
| 3293 | if (dev) | 3312 | if (device) |
| 3294 | put_device(dev); | 3313 | put_device(device); |
| 3314 | out: | ||
| 3315 | ohci1394_pmac_off(dev); | ||
| 3295 | } | 3316 | } |
| 3296 | 3317 | ||
| 3297 | #ifdef CONFIG_PM | 3318 | #ifdef CONFIG_PM |
| 3298 | static int ohci1394_pci_suspend(struct pci_dev *pdev, pm_message_t state) | 3319 | static int ohci1394_pci_suspend(struct pci_dev *dev, pm_message_t state) |
| 3299 | { | 3320 | { |
| 3300 | int err; | 3321 | int err; |
| 3301 | struct ti_ohci *ohci = pci_get_drvdata(pdev); | 3322 | struct ti_ohci *ohci = pci_get_drvdata(dev); |
| 3302 | 3323 | ||
| 3303 | if (!ohci) { | 3324 | if (!ohci) { |
| 3304 | printk(KERN_ERR "%s: tried to suspend nonexisting host\n", | 3325 | printk(KERN_ERR "%s: tried to suspend nonexisting host\n", |
| @@ -3326,32 +3347,23 @@ static int ohci1394_pci_suspend(struct pci_dev *pdev, pm_message_t state) | |||
| 3326 | ohci_devctl(ohci->host, RESET_BUS, LONG_RESET_NO_FORCE_ROOT); | 3347 | ohci_devctl(ohci->host, RESET_BUS, LONG_RESET_NO_FORCE_ROOT); |
| 3327 | ohci_soft_reset(ohci); | 3348 | ohci_soft_reset(ohci); |
| 3328 | 3349 | ||
| 3329 | err = pci_save_state(pdev); | 3350 | err = pci_save_state(dev); |
| 3330 | if (err) { | 3351 | if (err) { |
| 3331 | PRINT(KERN_ERR, "pci_save_state failed with %d", err); | 3352 | PRINT(KERN_ERR, "pci_save_state failed with %d", err); |
| 3332 | return err; | 3353 | return err; |
| 3333 | } | 3354 | } |
| 3334 | err = pci_set_power_state(pdev, pci_choose_state(pdev, state)); | 3355 | err = pci_set_power_state(dev, pci_choose_state(dev, state)); |
| 3335 | if (err) | 3356 | if (err) |
| 3336 | DBGMSG("pci_set_power_state failed with %d", err); | 3357 | DBGMSG("pci_set_power_state failed with %d", err); |
| 3337 | 3358 | ohci1394_pmac_off(dev); | |
| 3338 | /* PowerMac suspend code comes last */ | ||
| 3339 | #ifdef CONFIG_PPC_PMAC | ||
| 3340 | if (machine_is(powermac)) { | ||
| 3341 | struct device_node *ofn = pci_device_to_OF_node(pdev); | ||
| 3342 | |||
| 3343 | if (ofn) | ||
| 3344 | pmac_call_feature(PMAC_FTR_1394_ENABLE, ofn, 0, 0); | ||
| 3345 | } | ||
| 3346 | #endif /* CONFIG_PPC_PMAC */ | ||
| 3347 | 3359 | ||
| 3348 | return 0; | 3360 | return 0; |
| 3349 | } | 3361 | } |
| 3350 | 3362 | ||
| 3351 | static int ohci1394_pci_resume(struct pci_dev *pdev) | 3363 | static int ohci1394_pci_resume(struct pci_dev *dev) |
| 3352 | { | 3364 | { |
| 3353 | int err; | 3365 | int err; |
| 3354 | struct ti_ohci *ohci = pci_get_drvdata(pdev); | 3366 | struct ti_ohci *ohci = pci_get_drvdata(dev); |
| 3355 | 3367 | ||
| 3356 | if (!ohci) { | 3368 | if (!ohci) { |
| 3357 | printk(KERN_ERR "%s: tried to resume nonexisting host\n", | 3369 | printk(KERN_ERR "%s: tried to resume nonexisting host\n", |
| @@ -3360,19 +3372,10 @@ static int ohci1394_pci_resume(struct pci_dev *pdev) | |||
| 3360 | } | 3372 | } |
| 3361 | DBGMSG("resume called"); | 3373 | DBGMSG("resume called"); |
| 3362 | 3374 | ||
| 3363 | /* PowerMac resume code comes first */ | 3375 | ohci1394_pmac_on(dev); |
| 3364 | #ifdef CONFIG_PPC_PMAC | 3376 | pci_set_power_state(dev, PCI_D0); |
| 3365 | if (machine_is(powermac)) { | 3377 | pci_restore_state(dev); |
| 3366 | struct device_node *ofn = pci_device_to_OF_node(pdev); | 3378 | err = pci_enable_device(dev); |
| 3367 | |||
| 3368 | if (ofn) | ||
| 3369 | pmac_call_feature(PMAC_FTR_1394_ENABLE, ofn, 0, 1); | ||
| 3370 | } | ||
| 3371 | #endif /* CONFIG_PPC_PMAC */ | ||
| 3372 | |||
| 3373 | pci_set_power_state(pdev, PCI_D0); | ||
| 3374 | pci_restore_state(pdev); | ||
| 3375 | err = pci_enable_device(pdev); | ||
| 3376 | if (err) { | 3379 | if (err) { |
| 3377 | PRINT(KERN_ERR, "pci_enable_device failed with %d", err); | 3380 | PRINT(KERN_ERR, "pci_enable_device failed with %d", err); |
| 3378 | return err; | 3381 | return err; |
diff --git a/drivers/ieee1394/pcilynx.c b/drivers/ieee1394/pcilynx.c index 8af01ab30cc9..7aee1ac97c80 100644 --- a/drivers/ieee1394/pcilynx.c +++ b/drivers/ieee1394/pcilynx.c | |||
| @@ -226,7 +226,7 @@ static int get_phy_reg(struct ti_lynx *lynx, int addr) | |||
| 226 | if (addr > 15) { | 226 | if (addr > 15) { |
| 227 | PRINT(KERN_ERR, lynx->id, | 227 | PRINT(KERN_ERR, lynx->id, |
| 228 | "%s: PHY register address %d out of range", | 228 | "%s: PHY register address %d out of range", |
| 229 | __FUNCTION__, addr); | 229 | __func__, addr); |
| 230 | return -1; | 230 | return -1; |
| 231 | } | 231 | } |
| 232 | 232 | ||
| @@ -238,7 +238,7 @@ static int get_phy_reg(struct ti_lynx *lynx, int addr) | |||
| 238 | 238 | ||
| 239 | if (i > 10000) { | 239 | if (i > 10000) { |
| 240 | PRINT(KERN_ERR, lynx->id, "%s: runaway loop, aborting", | 240 | PRINT(KERN_ERR, lynx->id, "%s: runaway loop, aborting", |
| 241 | __FUNCTION__); | 241 | __func__); |
| 242 | retval = -1; | 242 | retval = -1; |
| 243 | break; | 243 | break; |
| 244 | } | 244 | } |
| @@ -261,13 +261,13 @@ static int set_phy_reg(struct ti_lynx *lynx, int addr, int val) | |||
| 261 | 261 | ||
| 262 | if (addr > 15) { | 262 | if (addr > 15) { |
| 263 | PRINT(KERN_ERR, lynx->id, | 263 | PRINT(KERN_ERR, lynx->id, |
| 264 | "%s: PHY register address %d out of range", __FUNCTION__, addr); | 264 | "%s: PHY register address %d out of range", __func__, addr); |
| 265 | return -1; | 265 | return -1; |
| 266 | } | 266 | } |
| 267 | 267 | ||
| 268 | if (val > 0xff) { | 268 | if (val > 0xff) { |
| 269 | PRINT(KERN_ERR, lynx->id, | 269 | PRINT(KERN_ERR, lynx->id, |
| 270 | "%s: PHY register value %d out of range", __FUNCTION__, val); | 270 | "%s: PHY register value %d out of range", __func__, val); |
| 271 | return -1; | 271 | return -1; |
| 272 | } | 272 | } |
| 273 | 273 | ||
| @@ -287,7 +287,7 @@ static int sel_phy_reg_page(struct ti_lynx *lynx, int page) | |||
| 287 | 287 | ||
| 288 | if (page > 7) { | 288 | if (page > 7) { |
| 289 | PRINT(KERN_ERR, lynx->id, | 289 | PRINT(KERN_ERR, lynx->id, |
| 290 | "%s: PHY page %d out of range", __FUNCTION__, page); | 290 | "%s: PHY page %d out of range", __func__, page); |
| 291 | return -1; | 291 | return -1; |
| 292 | } | 292 | } |
| 293 | 293 | ||
| @@ -309,7 +309,7 @@ static int sel_phy_reg_port(struct ti_lynx *lynx, int port) | |||
| 309 | 309 | ||
| 310 | if (port > 15) { | 310 | if (port > 15) { |
| 311 | PRINT(KERN_ERR, lynx->id, | 311 | PRINT(KERN_ERR, lynx->id, |
| 312 | "%s: PHY port %d out of range", __FUNCTION__, port); | 312 | "%s: PHY port %d out of range", __func__, port); |
| 313 | return -1; | 313 | return -1; |
| 314 | } | 314 | } |
| 315 | 315 | ||
| @@ -738,8 +738,7 @@ static int lynx_devctl(struct hpsb_host *host, enum devctl_cmd cmd, int arg) | |||
| 738 | spin_lock_irqsave(&lynx->async.queue_lock, flags); | 738 | spin_lock_irqsave(&lynx->async.queue_lock, flags); |
| 739 | 739 | ||
| 740 | reg_write(lynx, DMA_CHAN_CTRL(CHANNEL_ASYNC_SEND), 0); | 740 | reg_write(lynx, DMA_CHAN_CTRL(CHANNEL_ASYNC_SEND), 0); |
| 741 | list_splice(&lynx->async.queue, &packet_list); | 741 | list_splice_init(&lynx->async.queue, &packet_list); |
| 742 | INIT_LIST_HEAD(&lynx->async.queue); | ||
| 743 | 742 | ||
| 744 | if (list_empty(&lynx->async.pcl_queue)) { | 743 | if (list_empty(&lynx->async.pcl_queue)) { |
| 745 | spin_unlock_irqrestore(&lynx->async.queue_lock, flags); | 744 | spin_unlock_irqrestore(&lynx->async.queue_lock, flags); |
diff --git a/drivers/ieee1394/raw1394.c b/drivers/ieee1394/raw1394.c index 37e7e109af38..04e96ba56e09 100644 --- a/drivers/ieee1394/raw1394.c +++ b/drivers/ieee1394/raw1394.c | |||
| @@ -2959,7 +2959,6 @@ MODULE_DEVICE_TABLE(ieee1394, raw1394_id_table); | |||
| 2959 | 2959 | ||
| 2960 | static struct hpsb_protocol_driver raw1394_driver = { | 2960 | static struct hpsb_protocol_driver raw1394_driver = { |
| 2961 | .name = "raw1394", | 2961 | .name = "raw1394", |
| 2962 | .id_table = raw1394_id_table, | ||
| 2963 | }; | 2962 | }; |
| 2964 | 2963 | ||
| 2965 | /******************************************************************************/ | 2964 | /******************************************************************************/ |
| @@ -3004,7 +3003,6 @@ static int __init init_raw1394(void) | |||
| 3004 | 3003 | ||
| 3005 | cdev_init(&raw1394_cdev, &raw1394_fops); | 3004 | cdev_init(&raw1394_cdev, &raw1394_fops); |
| 3006 | raw1394_cdev.owner = THIS_MODULE; | 3005 | raw1394_cdev.owner = THIS_MODULE; |
| 3007 | kobject_set_name(&raw1394_cdev.kobj, RAW1394_DEVICE_NAME); | ||
| 3008 | ret = cdev_add(&raw1394_cdev, IEEE1394_RAW1394_DEV, 1); | 3006 | ret = cdev_add(&raw1394_cdev, IEEE1394_RAW1394_DEV, 1); |
| 3009 | if (ret) { | 3007 | if (ret) { |
| 3010 | HPSB_ERR("raw1394 failed to register minor device block"); | 3008 | HPSB_ERR("raw1394 failed to register minor device block"); |
diff --git a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c index f53f72daae34..16b9d0ad154e 100644 --- a/drivers/ieee1394/sbp2.c +++ b/drivers/ieee1394/sbp2.c | |||
| @@ -615,7 +615,7 @@ static struct sbp2_command_info *sbp2util_allocate_command_orb( | |||
| 615 | cmd->Current_SCpnt = Current_SCpnt; | 615 | cmd->Current_SCpnt = Current_SCpnt; |
| 616 | list_add_tail(&cmd->list, &lu->cmd_orb_inuse); | 616 | list_add_tail(&cmd->list, &lu->cmd_orb_inuse); |
| 617 | } else | 617 | } else |
| 618 | SBP2_ERR("%s: no orbs available", __FUNCTION__); | 618 | SBP2_ERR("%s: no orbs available", __func__); |
| 619 | spin_unlock_irqrestore(&lu->cmd_orb_lock, flags); | 619 | spin_unlock_irqrestore(&lu->cmd_orb_lock, flags); |
| 620 | return cmd; | 620 | return cmd; |
| 621 | } | 621 | } |
| @@ -1294,7 +1294,7 @@ static int sbp2_set_busy_timeout(struct sbp2_lu *lu) | |||
| 1294 | 1294 | ||
| 1295 | data = cpu_to_be32(SBP2_BUSY_TIMEOUT_VALUE); | 1295 | data = cpu_to_be32(SBP2_BUSY_TIMEOUT_VALUE); |
| 1296 | if (hpsb_node_write(lu->ne, SBP2_BUSY_TIMEOUT_ADDRESS, &data, 4)) | 1296 | if (hpsb_node_write(lu->ne, SBP2_BUSY_TIMEOUT_ADDRESS, &data, 4)) |
| 1297 | SBP2_ERR("%s error", __FUNCTION__); | 1297 | SBP2_ERR("%s error", __func__); |
| 1298 | return 0; | 1298 | return 0; |
| 1299 | } | 1299 | } |
| 1300 | 1300 | ||
| @@ -1985,11 +1985,8 @@ static int sbp2scsi_slave_alloc(struct scsi_device *sdev) | |||
| 1985 | lu->sdev = sdev; | 1985 | lu->sdev = sdev; |
| 1986 | sdev->allow_restart = 1; | 1986 | sdev->allow_restart = 1; |
| 1987 | 1987 | ||
| 1988 | /* | 1988 | /* SBP-2 requires quadlet alignment of the data buffers. */ |
| 1989 | * Update the dma alignment (minimum alignment requirements for | 1989 | blk_queue_update_dma_alignment(sdev->request_queue, 4 - 1); |
| 1990 | * start and end of DMA transfers) to be a sector | ||
| 1991 | */ | ||
| 1992 | blk_queue_update_dma_alignment(sdev->request_queue, 511); | ||
| 1993 | 1990 | ||
| 1994 | if (lu->workarounds & SBP2_WORKAROUND_INQUIRY_36) | 1991 | if (lu->workarounds & SBP2_WORKAROUND_INQUIRY_36) |
| 1995 | sdev->inquiry_len = 36; | 1992 | sdev->inquiry_len = 36; |
diff --git a/drivers/ieee1394/video1394.c b/drivers/ieee1394/video1394.c index bd28adfd7afc..e03024eeeac1 100644 --- a/drivers/ieee1394/video1394.c +++ b/drivers/ieee1394/video1394.c | |||
| @@ -1315,8 +1315,7 @@ static struct ieee1394_device_id video1394_id_table[] = { | |||
| 1315 | MODULE_DEVICE_TABLE(ieee1394, video1394_id_table); | 1315 | MODULE_DEVICE_TABLE(ieee1394, video1394_id_table); |
| 1316 | 1316 | ||
| 1317 | static struct hpsb_protocol_driver video1394_driver = { | 1317 | static struct hpsb_protocol_driver video1394_driver = { |
| 1318 | .name = VIDEO1394_DRIVER_NAME, | 1318 | .name = VIDEO1394_DRIVER_NAME, |
| 1319 | .id_table = video1394_id_table, | ||
| 1320 | }; | 1319 | }; |
| 1321 | 1320 | ||
| 1322 | 1321 | ||
| @@ -1504,7 +1503,6 @@ static int __init video1394_init_module (void) | |||
| 1504 | 1503 | ||
| 1505 | cdev_init(&video1394_cdev, &video1394_fops); | 1504 | cdev_init(&video1394_cdev, &video1394_fops); |
| 1506 | video1394_cdev.owner = THIS_MODULE; | 1505 | video1394_cdev.owner = THIS_MODULE; |
| 1507 | kobject_set_name(&video1394_cdev.kobj, VIDEO1394_DRIVER_NAME); | ||
| 1508 | ret = cdev_add(&video1394_cdev, IEEE1394_VIDEO1394_DEV, 16); | 1506 | ret = cdev_add(&video1394_cdev, IEEE1394_VIDEO1394_DEV, 16); |
| 1509 | if (ret) { | 1507 | if (ret) { |
| 1510 | PRINT_G(KERN_ERR, "video1394: unable to get minor device block"); | 1508 | PRINT_G(KERN_ERR, "video1394: unable to get minor device block"); |
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index aaba784332e0..95de3102bc87 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug | |||
| @@ -583,7 +583,7 @@ config LATENCYTOP | |||
| 583 | to find out which userspace is blocking on what kernel operations. | 583 | to find out which userspace is blocking on what kernel operations. |
| 584 | 584 | ||
| 585 | config PROVIDE_OHCI1394_DMA_INIT | 585 | config PROVIDE_OHCI1394_DMA_INIT |
| 586 | bool "Provide code for enabling DMA over FireWire early on boot" | 586 | bool "Remote debugging over FireWire early on boot" |
| 587 | depends on PCI && X86 | 587 | depends on PCI && X86 |
| 588 | help | 588 | help |
| 589 | If you want to debug problems which hang or crash the kernel early | 589 | If you want to debug problems which hang or crash the kernel early |
| @@ -611,6 +611,17 @@ config PROVIDE_OHCI1394_DMA_INIT | |||
| 611 | 611 | ||
| 612 | See Documentation/debugging-via-ohci1394.txt for more information. | 612 | See Documentation/debugging-via-ohci1394.txt for more information. |
| 613 | 613 | ||
| 614 | config FIREWIRE_OHCI_REMOTE_DMA | ||
| 615 | bool "Remote debugging over FireWire with firewire-ohci" | ||
| 616 | depends on FIREWIRE_OHCI | ||
| 617 | help | ||
| 618 | This option lets you use the FireWire bus for remote debugging | ||
| 619 | with help of the firewire-ohci driver. It enables unfiltered | ||
| 620 | remote DMA in firewire-ohci. | ||
| 621 | See Documentation/debugging-via-ohci1394.txt for more information. | ||
| 622 | |||
| 623 | If unsure, say N. | ||
| 624 | |||
| 614 | source "samples/Kconfig" | 625 | source "samples/Kconfig" |
| 615 | 626 | ||
| 616 | source "lib/Kconfig.kgdb" | 627 | source "lib/Kconfig.kgdb" |
