Parent repository is bk://bk.phunnypharm.org/ieee1394-2.6 ======== ChangeSet 1.1600 ======== D 1.1600 04/02/29 13:00:49-08:00 akpm@mnm.(none) 37805 37798 1/0/1 P ChangeSet C Merge bk://bk.phunnypharm.org/ieee1394-2.6 C into mnm.(none):/usr/src/bk-ieee1394 ------------------------------------------------ diff -Nru a/drivers/ieee1394/Kconfig b/drivers/ieee1394/Kconfig --- a/drivers/ieee1394/Kconfig Sun Feb 29 13:02:49 2004 +++ b/drivers/ieee1394/Kconfig Sun Feb 29 13:02:49 2004 @@ -47,6 +47,23 @@ This option is not needed for userspace programs like gscanbus to show this information. +config IEEE1394_EXTRA_CONFIG_ROMS + bool "Build in extra config rom entries for certain functionality" + depends on IEEE1394 + help + Some IEEE1394 functionality depends on extra config rom entries + being available in the host adapters CSR. These options will + allow you to choose which ones. + +config IEEE1394_CONFIG_ROM_IP1394 + bool "IP-1394 Entry" + depends on IEEE1394_EXTRA_CONFIG_ROMS && IEEE1394 + help + Adds an entry for using IP-over-1394. If you want to use your + IEEE1394 bus as a network for IP systems (including interacting + with MacOSX and WinXP IP-over-1394), enable this option and the + eth1394 option below. + comment "Device Drivers" depends on IEEE1394 @@ -108,6 +125,8 @@ config IEEE1394_ETH1394 tristate "Ethernet over 1394" depends on IEEE1394 && EXPERIMENTAL + select IEEE1394_CONFIG_ROM_IP1394 + select IEEE1394_EXTRA_CONFIG_ROMS help This driver implements a functional majority of RFC 2734: IPv4 over 1394. It will provide IP connectivity with implementations of RFC diff -Nru a/drivers/ieee1394/Makefile b/drivers/ieee1394/Makefile --- a/drivers/ieee1394/Makefile Sun Feb 29 13:02:49 2004 +++ b/drivers/ieee1394/Makefile Sun Feb 29 13:02:49 2004 @@ -4,7 +4,7 @@ ieee1394-objs := ieee1394_core.o ieee1394_transactions.o hosts.o \ highlevel.o csr.o nodemgr.o oui.o dma.o iso.o \ - csr1212.o + csr1212.o config_roms.o obj-$(CONFIG_IEEE1394) += ieee1394.o obj-$(CONFIG_IEEE1394_PCILYNX) += pcilynx.o diff -Nru a/drivers/ieee1394/amdtp.c b/drivers/ieee1394/amdtp.c --- a/drivers/ieee1394/amdtp.c Sun Feb 29 13:02:49 2004 +++ b/drivers/ieee1394/amdtp.c Sun Feb 29 13:02:49 2004 @@ -1227,15 +1227,15 @@ ah->host = host; ah->ohci = host->hostdata; - hpsb_set_hostinfo_key(&amdtp_highlevel, host, ah->ohci->id); + hpsb_set_hostinfo_key(&amdtp_highlevel, host, ah->host->id); - minor = IEEE1394_MINOR_BLOCK_AMDTP * 16 + ah->ohci->id; + minor = IEEE1394_MINOR_BLOCK_AMDTP * 16 + ah->host->id; INIT_LIST_HEAD(&ah->stream_list); spin_lock_init(&ah->stream_list_lock); devfs_mk_cdev(MKDEV(IEEE1394_MAJOR, minor), - S_IFCHR|S_IRUSR|S_IWUSR, "amdtp/%d", ah->ohci->id); + S_IFCHR|S_IRUSR|S_IWUSR, "amdtp/%d", ah->host->id); } static void amdtp_remove_host(struct hpsb_host *host) @@ -1243,7 +1243,7 @@ struct amdtp_host *ah = hpsb_get_hostinfo(&amdtp_highlevel, host); if (ah) - devfs_remove("amdtp/%d", ah->ohci->id); + devfs_remove("amdtp/%d", ah->host->id); return; } diff -Nru a/drivers/ieee1394/config_roms.c b/drivers/ieee1394/config_roms.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/ieee1394/config_roms.c Sun Feb 29 13:02:49 2004 @@ -0,0 +1,236 @@ +/* + * IEEE 1394 for Linux + * + * ConfigROM entries + * + * Copyright (C) 2004 Ben Collins + * + * This code is licensed under the GPL. See the file COPYING in the root + * directory of the kernel sources for details. + */ + +#include +#include + +#include "csr1212.h" +#include "ieee1394.h" +#include "ieee1394_types.h" +#include "hosts.h" +#include "ieee1394_core.h" +#include "highlevel.h" +#include "csr.h" +#include "config_roms.h" + +struct hpsb_config_rom_entry { + const char *name; + + /* Base initialization, called at module load */ + int (*init)(void); + + /* Add entry to specified host */ + int (*add)(struct hpsb_host *host); + + /* Remove entry from specified host */ + void (*remove)(struct hpsb_host *host); + + /* Cleanup called at module exit */ + void (*cleanup)(void); + + /* The flag added to host->config_roms */ + unsigned int flag; +}; + + +int hpsb_default_host_entry(struct hpsb_host *host) +{ + struct csr1212_keyval *root; + struct csr1212_keyval *vend_id = NULL; + struct csr1212_keyval *text = NULL; + char csr_name[128]; + int ret; + + sprintf(csr_name, "Linux - %s", host->driver->name); + root = host->csr.rom->root_kv; + + vend_id = csr1212_new_immediate(CSR1212_KV_ID_VENDOR, host->csr.guid_hi >> 8); + text = csr1212_new_string_descriptor_leaf(csr_name); + + if (!vend_id || !text) { + if (vend_id) + csr1212_release_keyval(vend_id); + if (text) + csr1212_release_keyval(text); + csr1212_destroy_csr(host->csr.rom); + return -ENOMEM; + } + + ret = csr1212_associate_keyval(vend_id, text); + csr1212_release_keyval(text); + ret |= csr1212_attach_keyval_to_directory(root, vend_id); + if (ret != CSR1212_SUCCESS) { + csr1212_release_keyval(vend_id); + csr1212_destroy_csr(host->csr.rom); + return -ENOMEM; + } + + host->update_config_rom = 1; + + return 0; +} + + +#ifdef CONFIG_IEEE1394_CONFIG_ROM_IP1394 +#include "eth1394.h" + +static struct csr1212_keyval *ip1394_ud; + +static int config_rom_ip1394_init(void) +{ + struct csr1212_keyval *spec_id = NULL; + struct csr1212_keyval *spec_desc = NULL; + struct csr1212_keyval *ver = NULL; + struct csr1212_keyval *ver_desc = NULL; + int ret = -ENOMEM; + + ip1394_ud = csr1212_new_directory(CSR1212_KV_ID_UNIT); + + spec_id = csr1212_new_immediate(CSR1212_KV_ID_SPECIFIER_ID, + ETHER1394_GASP_SPECIFIER_ID); + spec_desc = csr1212_new_string_descriptor_leaf("IANA"); + ver = csr1212_new_immediate(CSR1212_KV_ID_VERSION, + ETHER1394_GASP_VERSION); + ver_desc = csr1212_new_string_descriptor_leaf("IPv4"); + + if (!ip1394_ud || !spec_id || !spec_desc || !ver || !ver_desc) + goto ip1394_fail; + + if (csr1212_associate_keyval(spec_id, spec_desc) == CSR1212_SUCCESS && + csr1212_associate_keyval(ver, ver_desc) == CSR1212_SUCCESS && + csr1212_attach_keyval_to_directory(ip1394_ud, spec_id) == CSR1212_SUCCESS && + csr1212_attach_keyval_to_directory(ip1394_ud, ver) == CSR1212_SUCCESS) + ret = 0; + +ip1394_fail: + if (ret && ip1394_ud) { + csr1212_release_keyval(ip1394_ud); + ip1394_ud = NULL; + } + + if (spec_id) + csr1212_release_keyval(spec_id); + if (spec_desc) + csr1212_release_keyval(spec_desc); + if (ver) + csr1212_release_keyval(ver); + if (ver_desc) + csr1212_release_keyval(ver_desc); + + return ret; +} + +static void config_rom_ip1394_cleanup(void) +{ + if (ip1394_ud) { + csr1212_release_keyval(ip1394_ud); + ip1394_ud = NULL; + } +} + +static int config_rom_ip1394_add(struct hpsb_host *host) +{ + if (!ip1394_ud) + return -ENODEV; + + if (csr1212_attach_keyval_to_directory(host->csr.rom->root_kv, + ip1394_ud) != CSR1212_SUCCESS) + return -ENOMEM; + + return 0; +} + +static void config_rom_ip1394_remove(struct hpsb_host *host) +{ + csr1212_detach_keyval_from_directory(host->csr.rom->root_kv, ip1394_ud); +} + +static struct hpsb_config_rom_entry ip1394_entry = { + .name = "ip1394", + .init = config_rom_ip1394_init, + .add = config_rom_ip1394_add, + .remove = config_rom_ip1394_remove, + .cleanup = config_rom_ip1394_cleanup, + .flag = HPSB_CONFIG_ROM_ENTRY_IP1394, +}; +#endif /* CONFIG_IEEE1394_CONFIG_ROM_IP1394 */ + + +static struct hpsb_config_rom_entry *const config_rom_entries[] = { +#ifdef CONFIG_IEEE1394_CONFIG_ROM_IP1394 + &ip1394_entry, +#endif + NULL, +}; + + +int hpsb_init_config_roms(void) +{ + int i, error = 0; + + for (i = 0; config_rom_entries[i]; i++) { + if (!config_rom_entries[i]->init) + continue; + + if (config_rom_entries[i]->init()) { + HPSB_ERR("Failed to initialize config rom entry `%s'", + config_rom_entries[i]->name); + error = -1; + } else + HPSB_DEBUG("Initialized config rom entry `%s'", + config_rom_entries[i]->name); + } + + return error; +} + +void hpsb_cleanup_config_roms(void) +{ + int i; + + for (i = 0; config_rom_entries[i]; i++) { + if (config_rom_entries[i]->cleanup) + config_rom_entries[i]->cleanup(); + } +} + +int hpsb_add_extra_config_roms(struct hpsb_host *host) +{ + int i, error = 0; + + for (i = 0; config_rom_entries[i]; i++) { + if (config_rom_entries[i]->add(host)) { + HPSB_ERR("fw-host%d: Failed to attach config rom entry `%s'", + host->id, config_rom_entries[i]->name); + error = -1; + } else { + host->config_roms |= config_rom_entries[i]->flag; + host->update_config_rom = 1; + } + } + + return error; +} + +void hpsb_remove_extra_config_roms(struct hpsb_host *host) +{ + int i; + + for (i = 0; config_rom_entries[i]; i++) { + if (!(host->config_roms & config_rom_entries[i]->flag)) + continue; + + config_rom_entries[i]->remove(host); + + host->config_roms &= ~config_rom_entries[i]->flag; + host->update_config_rom = 1; + } +} diff -Nru a/drivers/ieee1394/config_roms.h b/drivers/ieee1394/config_roms.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/ieee1394/config_roms.h Sun Feb 29 13:02:49 2004 @@ -0,0 +1,27 @@ +#ifndef _IEEE1394_CONFIG_ROMS_H +#define _IEEE1394_CONFIG_ROMS_H + +#include "ieee1394_types.h" +#include "hosts.h" + +/* The default host entry. This must succeed. */ +int hpsb_default_host_entry(struct hpsb_host *host); + +/* Initialize all config roms */ +int hpsb_init_config_roms(void); + +/* Cleanup all config roms */ +void hpsb_cleanup_config_roms(void); + +/* Add extra config roms to specified host */ +int hpsb_add_extra_config_roms(struct hpsb_host *host); + +/* Remove extra config roms from specified host */ +void hpsb_remove_extra_config_roms(struct hpsb_host *host); + + +/* List of flags to check if a host contains a certain extra config rom + * entry. Available in the host->config_roms member. */ +#define HPSB_CONFIG_ROM_ENTRY_IP1394 0x00000001 + +#endif /* _IEEE1394_CONFIG_ROMS_H */ diff -Nru a/drivers/ieee1394/csr1212.c b/drivers/ieee1394/csr1212.c --- a/drivers/ieee1394/csr1212.c Sun Feb 29 13:02:49 2004 +++ b/drivers/ieee1394/csr1212.c Sun Feb 29 13:02:49 2004 @@ -704,10 +704,11 @@ if (k->key.type == CSR1212_KV_TYPE_DIRECTORY) { /* If the current entry is a directory, then move all * the entries to the destruction list. */ - tail->next = k->value.directory.dentries_head; - if (k->value.directory.dentries_head) + if (k->value.directory.dentries_head) { + tail->next = k->value.directory.dentries_head; k->value.directory.dentries_head->prev = tail; - tail = k->value.directory.dentries_tail; + tail = k->value.directory.dentries_tail; + } } free_keyval(k); k = a; @@ -1347,6 +1348,12 @@ case CSR1212_KV_TYPE_DIRECTORY: for (i = 0; i < kvi_len; i++) { csr1212_quad_t ki = kvi->data[i]; + + /* Some devices put null entries in their unit + * directories. If we come across such and entry, + * then skip it. */ + if (ki == 0x0) + continue; ret = csr1212_parse_dir_entry(kv, ki, (kv->offset + quads_to_bytes(i + 1)), diff -Nru a/drivers/ieee1394/dv1394.c b/drivers/ieee1394/dv1394.c --- a/drivers/ieee1394/dv1394.c Sun Feb 29 13:02:49 2004 +++ b/drivers/ieee1394/dv1394.c Sun Feb 29 13:02:49 2004 @@ -2222,7 +2222,7 @@ video->ohci = ohci; /* lower 2 bits of id indicate which of four "plugs" per host */ - video->id = ohci->id << 2; + video->id = ohci->host->id << 2; if (format == DV1394_NTSC) video->id |= mode; else @@ -2302,47 +2302,49 @@ ); devfs_remove("ieee1394/%s", buf); - list_del(&video->list); kfree(video); } static void dv1394_remove_host (struct hpsb_host *host) { - struct ti_ohci *ohci; - struct video_card *video = NULL; + struct video_card *video; unsigned long flags; - struct list_head *lh, *templh; - int n; + int id = host->id; /* We only work with the OHCI-1394 driver */ if (strcmp(host->driver->name, OHCI1394_DRIVER_NAME)) return; - ohci = (struct ti_ohci *)host->hostdata; + /* find the corresponding video_cards */ + do { + struct video_card *tmp_vid; + video = NULL; - /* find the corresponding video_cards */ - spin_lock_irqsave(&dv1394_cards_lock, flags); - if (!list_empty(&dv1394_cards)) { - list_for_each_safe(lh, templh, &dv1394_cards) { - video = list_entry(lh, struct video_card, list); - if ((video->id >> 2) == ohci->id) - dv1394_un_init(video); + spin_lock_irqsave(&dv1394_cards_lock, flags); + list_for_each_entry(tmp_vid, &dv1394_cards, list) { + if ((tmp_vid->id >> 2) == id) { + list_del(&tmp_vid->list); + video = tmp_vid; + break; + } } - } - spin_unlock_irqrestore(&dv1394_cards_lock, flags); + spin_unlock_irqrestore(&dv1394_cards_lock, flags); - n = (video->id >> 2); - - devfs_remove("ieee1394/dv/host%d/NTSC", n); - devfs_remove("ieee1394/dv/host%d/PAL", n); - devfs_remove("ieee1394/dv/host%d", n); + if (video) + dv1394_un_init(video); + } while (video != NULL); + + devfs_remove("ieee1394/dv/host%d/NTSC", id); + devfs_remove("ieee1394/dv/host%d/PAL", id); + devfs_remove("ieee1394/dv/host%d", id); } static void dv1394_add_host (struct hpsb_host *host) { struct ti_ohci *ohci; + int id = host->id; /* We only work with the OHCI-1394 driver */ if (strcmp(host->driver->name, OHCI1394_DRIVER_NAME)) @@ -2350,9 +2352,9 @@ ohci = (struct ti_ohci *)host->hostdata; - devfs_mk_dir("ieee1394/dv/host%d", ohci->id); - devfs_mk_dir("ieee1394/dv/host%d/NTSC", ohci->id); - devfs_mk_dir("ieee1394/dv/host%d/PAL", ohci->id); + devfs_mk_dir("ieee1394/dv/host%d", id); + devfs_mk_dir("ieee1394/dv/host%d/NTSC", id); + devfs_mk_dir("ieee1394/dv/host%d/PAL", id); dv1394_init(ohci, DV1394_NTSC, MODE_RECEIVE); dv1394_init(ohci, DV1394_NTSC, MODE_TRANSMIT); @@ -2369,7 +2371,7 @@ static void dv1394_host_reset(struct hpsb_host *host) { struct ti_ohci *ohci; - struct video_card *video = NULL; + struct video_card *video = NULL, *tmp_vid; unsigned long flags; /* We only work with the OHCI-1394 driver */ @@ -2381,10 +2383,10 @@ /* find the corresponding video_cards */ spin_lock_irqsave(&dv1394_cards_lock, flags); - if (!list_empty(&dv1394_cards)) { - list_for_each_entry(video, &dv1394_cards, list) { - if ((video->id >> 2) == ohci->id) - break; + list_for_each_entry(tmp_vid, &dv1394_cards, list) { + if ((tmp_vid->id >> 2) == host->id) { + video = tmp_vid; + break; } } spin_unlock_irqrestore(&dv1394_cards_lock, flags); diff -Nru a/drivers/ieee1394/eth1394.c b/drivers/ieee1394/eth1394.c --- a/drivers/ieee1394/eth1394.c Sun Feb 29 13:02:49 2004 +++ b/drivers/ieee1394/eth1394.c Sun Feb 29 13:02:49 2004 @@ -76,6 +76,7 @@ #include "iso.h" #include "nodemgr.h" #include "eth1394.h" +#include "config_roms.h" #define ETH1394_PRINT_G(level, fmt, args...) \ printk(level "%s: " fmt, driver_name, ## args) @@ -88,7 +89,7 @@ #define TRACE() printk(KERN_ERR "%s:%s[%d] ---- TRACE\n", driver_name, __FUNCTION__, __LINE__) static char version[] __devinitdata = - "$Rev: 1133 $ Ben Collins "; + "$Rev: 1175 $ Ben Collins "; struct fragment_info { struct list_head list; @@ -106,8 +107,6 @@ struct list_head frag_info; }; -static struct csr1212_keyval *eth1394_ud = NULL; - struct pdg_list { struct list_head list; /* partial datagram list per node */ unsigned int sz; /* partial datagram list size per node */ @@ -461,6 +460,8 @@ {} }; +MODULE_DEVICE_TABLE(ieee1394, eth1394_id_table); + static struct hpsb_protocol_driver eth1394_proto_driver = { .name = "IPv4 over 1394 Driver", .id_table = eth1394_id_table, @@ -553,9 +554,11 @@ struct net_device *dev = NULL; struct eth1394_priv *priv; static int version_printed = 0; - u64 fifo_addr; + if (!(host->config_roms & HPSB_CONFIG_ROM_ENTRY_IP1394)) + return; + fifo_addr = hpsb_allocate_and_register_addrspace(ð1394_highlevel, host, &addr_ops, @@ -634,14 +637,6 @@ priv->bc_state = ETHER1394_BC_RUNNING; } - if (csr1212_attach_keyval_to_directory(host->csr.rom->root_kv, - eth1394_ud) != CSR1212_SUCCESS) { - ETH1394_PRINT (KERN_ERR, dev->name, - "Cannot attach IP 1394 Unit Directory to " - "Config ROM\n"); - goto out; - } - hi->host->update_config_rom = 1; return; out: @@ -668,10 +663,6 @@ if (priv->iso != NULL) hpsb_iso_shutdown(priv->iso); - csr1212_detach_keyval_from_directory(hi->host->csr.rom->root_kv, - eth1394_ud); - hi->host->update_config_rom = 1; - if (hi->dev) { unregister_netdev (hi->dev); free_netdev(hi->dev); @@ -1483,7 +1474,6 @@ p = hpsb_alloc_packet(0); if (p) { p->host = host; - p->data = NULL; p->generation = get_hpsb_generation(host); p->type = hpsb_async; } @@ -1514,7 +1504,7 @@ | (1 << 8) | (TCODE_WRITEB << 4); p->header[3] = tx_len << 16; - p->data_size = tx_len + (tx_len % 4 ? 4 - (tx_len % 4) : 0); + p->data_size = (tx_len + 3) & ~3; p->data = (quadlet_t*)data; return 0; @@ -1807,7 +1797,7 @@ case ETHTOOL_GDRVINFO: { struct ethtool_drvinfo info = { ETHTOOL_GDRVINFO }; strcpy (info.driver, driver_name); - strcpy (info.version, "$Rev: 1133 $"); + strcpy (info.version, "$Rev: 1175 $"); /* FIXME XXX provide sane businfo */ strcpy (info.bus_info, "ieee1394"); if (copy_to_user (useraddr, &info, sizeof (info))) @@ -1830,67 +1820,13 @@ static int __init ether1394_init_module (void) { - int ret; - struct csr1212_keyval *spec_id = NULL; - struct csr1212_keyval *spec_desc = NULL; - struct csr1212_keyval *ver = NULL; - struct csr1212_keyval *ver_desc = NULL; - packet_task_cache = kmem_cache_create("packet_task", sizeof(struct packet_task), 0, 0, NULL, NULL); - eth1394_ud = csr1212_new_directory(CSR1212_KV_ID_UNIT); - spec_id = csr1212_new_immediate(CSR1212_KV_ID_SPECIFIER_ID, - ETHER1394_GASP_SPECIFIER_ID); - spec_desc = csr1212_new_string_descriptor_leaf("IANA"); - ver = csr1212_new_immediate(CSR1212_KV_ID_VERSION, - ETHER1394_GASP_VERSION); - ver_desc = csr1212_new_string_descriptor_leaf("IPv4"); - - if ((!eth1394_ud) || - (!spec_id) || - (!spec_desc) || - (!ver) || - (!ver_desc)) { - ret = -ENOMEM; - goto out; - } - - ret = csr1212_associate_keyval(spec_id, spec_desc); - if (ret != CSR1212_SUCCESS) - goto out; - - ret = csr1212_associate_keyval(ver, ver_desc); - if (ret != CSR1212_SUCCESS) - goto out; - - ret = csr1212_attach_keyval_to_directory(eth1394_ud, spec_id); - if (ret != CSR1212_SUCCESS) - goto out; - - ret = csr1212_attach_keyval_to_directory(eth1394_ud, ver); - if (ret != CSR1212_SUCCESS) - goto out; - /* Register ourselves as a highlevel driver */ hpsb_register_highlevel(ð1394_highlevel); - ret = hpsb_register_protocol(ð1394_proto_driver); - -out: - if ((ret != 0) && eth1394_ud) { - csr1212_release_keyval(eth1394_ud); - } - if (spec_id) - csr1212_release_keyval(spec_id); - if (spec_desc) - csr1212_release_keyval(spec_desc); - if (ver) - csr1212_release_keyval(ver); - if (ver_desc) - csr1212_release_keyval(ver_desc); - - return ret; + return hpsb_register_protocol(ð1394_proto_driver); } static void __exit ether1394_exit_module (void) @@ -1898,10 +1834,6 @@ hpsb_unregister_protocol(ð1394_proto_driver); hpsb_unregister_highlevel(ð1394_highlevel); kmem_cache_destroy(packet_task_cache); - - if (eth1394_ud) { - csr1212_release_keyval(eth1394_ud); - } } module_init(ether1394_init_module); diff -Nru a/drivers/ieee1394/eth1394.h b/drivers/ieee1394/eth1394.h --- a/drivers/ieee1394/eth1394.h Sun Feb 29 13:02:49 2004 +++ b/drivers/ieee1394/eth1394.h Sun Feb 29 13:02:49 2004 @@ -24,6 +24,8 @@ #ifndef __ETH1394_H #define __ETH1394_H +#include + #include "ieee1394.h" /* Register for incoming packets. This is 4096 bytes, which supports up to diff -Nru a/drivers/ieee1394/hosts.c b/drivers/ieee1394/hosts.c --- a/drivers/ieee1394/hosts.c Sun Feb 29 13:02:49 2004 +++ b/drivers/ieee1394/hosts.c Sun Feb 29 13:02:49 2004 @@ -27,6 +27,7 @@ #include "highlevel.h" #include "nodemgr.h" #include "csr.h" +#include "config_roms.h" static void delayed_reset_bus(unsigned long __reset_info) @@ -103,6 +104,7 @@ * Return Value: a pointer to the &hpsb_host if succesful, %NULL if * no memory was available. */ +static DECLARE_MUTEX(host_num_alloc); struct hpsb_host *hpsb_alloc_host(struct hpsb_host_driver *drv, size_t extra, struct device *dev) @@ -148,14 +150,12 @@ h->topology_map = h->csr.topology_map + 3; h->speed_map = (u8 *)(h->csr.speed_map + 2); - while (1) { - if (!nodemgr_for_each_host(&hostnum, alloc_hostnum_cb)) { - h->id = hostnum; - break; - } + down(&host_num_alloc); + while (nodemgr_for_each_host(&hostnum, alloc_hostnum_cb)) hostnum++; - } + + h->id = hostnum; memcpy(&h->device, &nodemgr_dev_template_host, sizeof(h->device)); h->device.parent = dev; @@ -169,12 +169,21 @@ class_device_register(&h->class_dev); get_device(&h->device); + up(&host_num_alloc); + return h; } -void hpsb_add_host(struct hpsb_host *host) +int hpsb_add_host(struct hpsb_host *host) { - highlevel_add_host(host); + if (hpsb_default_host_entry(host)) + return -ENOMEM; + + hpsb_add_extra_config_roms(host); + + highlevel_add_host(host); + + return 0; } void hpsb_remove_host(struct hpsb_host *host) @@ -183,6 +192,8 @@ host->driver = &dummy_driver; highlevel_remove_host(host); + + hpsb_remove_extra_config_roms(host); class_device_unregister(&host->class_dev); device_unregister(&host->device); diff -Nru a/drivers/ieee1394/hosts.h b/drivers/ieee1394/hosts.h --- a/drivers/ieee1394/hosts.h Sun Feb 29 13:02:49 2004 +++ b/drivers/ieee1394/hosts.h Sun Feb 29 13:02:49 2004 @@ -66,6 +66,8 @@ int update_config_rom; struct timer_list delayed_reset; + unsigned int config_roms; + struct list_head addr_space; }; @@ -191,7 +193,7 @@ struct hpsb_host *hpsb_alloc_host(struct hpsb_host_driver *drv, size_t extra, struct device *dev); -void hpsb_add_host(struct hpsb_host *host); +int hpsb_add_host(struct hpsb_host *host); void hpsb_remove_host(struct hpsb_host *h); /* The following 2 functions are deprecated and will be removed when the diff -Nru a/drivers/ieee1394/ieee1394.h b/drivers/ieee1394/ieee1394.h --- a/drivers/ieee1394/ieee1394.h Sun Feb 29 13:02:49 2004 +++ b/drivers/ieee1394/ieee1394.h Sun Feb 29 13:02:49 2004 @@ -36,8 +36,11 @@ #define ACK_BUSY_X 0x4 #define ACK_BUSY_A 0x5 #define ACK_BUSY_B 0x6 +#define ACK_TARDY 0xb +#define ACK_CONFLICT_ERROR 0xc #define ACK_DATA_ERROR 0xd #define ACK_TYPE_ERROR 0xe +#define ACK_ADDRESS_ERROR 0xf /* Non-standard "ACK codes" for internal use */ #define ACKX_NONE (-1) diff -Nru a/drivers/ieee1394/ieee1394_core.c b/drivers/ieee1394/ieee1394_core.c --- a/drivers/ieee1394/ieee1394_core.c Sun Feb 29 13:02:49 2004 +++ b/drivers/ieee1394/ieee1394_core.c Sun Feb 29 13:02:49 2004 @@ -44,6 +44,7 @@ #include "nodemgr.h" #include "dma.h" #include "iso.h" +#include "config_roms.h" /* * Disable the nodemgr detection and config rom reading functionality. @@ -92,7 +93,7 @@ void hpsb_set_packet_complete_task(struct hpsb_packet *packet, void (*routine)(void *), void *data) { - BUG_ON(packet->complete_routine != NULL); + WARN_ON(packet->complete_routine != NULL); packet->complete_routine = routine; packet->complete_data = data; return; @@ -120,34 +121,35 @@ */ struct hpsb_packet *hpsb_alloc_packet(size_t data_size) { - struct hpsb_packet *packet = NULL; - void *data = NULL; - - packet = kmem_cache_alloc(hpsb_packet_cache, GFP_ATOMIC); - if (packet == NULL) - return NULL; - - memset(packet, 0, sizeof(struct hpsb_packet)); - packet->header = packet->embedded_header; - - if (data_size) { - data = kmalloc(data_size + 8, GFP_ATOMIC); - if (data == NULL) { + struct hpsb_packet *packet = NULL; + void *data = NULL; + int gfp_flags = (in_atomic() || irqs_disabled()) ? GFP_ATOMIC : GFP_KERNEL; + + packet = kmem_cache_alloc(hpsb_packet_cache, gfp_flags); + if (packet == NULL) + return NULL; + + memset(packet, 0, sizeof(*packet)); + + packet->header = packet->embedded_header; + INIT_LIST_HEAD(&packet->list); + packet->state = hpsb_unused; + packet->generation = -1; + atomic_set(&packet->refcnt, 1); + + if (data_size) { + data_size = (data_size + 3) & ~3; + data = kmalloc(data_size + 8, gfp_flags); + if (data == NULL) { kmem_cache_free(hpsb_packet_cache, packet); - return NULL; - } - - packet->data = data; - packet->data_size = data_size; - } + return NULL; + } - INIT_LIST_HEAD(&packet->list); - packet->complete_routine = NULL; - packet->complete_data = NULL; - packet->state = hpsb_unused; - packet->generation = -1; + packet->data = data; + packet->data_size = data_size; + } - return packet; + return packet; } @@ -155,15 +157,14 @@ * hpsb_free_packet - free packet and data associated with it * @packet: packet to free (is NULL safe) * - * This function will free packet->data, packet->header and finally the packet - * itself. + * This function will free packet->data and finally the packet itself. */ void hpsb_free_packet(struct hpsb_packet *packet) { - if (!packet) return; - - kfree(packet->data); - kmem_cache_free(hpsb_packet_cache, packet); + if (packet && atomic_dec_and_test(&packet->refcnt)) { + kfree(packet->data); + kmem_cache_free(hpsb_packet_cache, packet); + } } @@ -402,28 +403,30 @@ void hpsb_packet_sent(struct hpsb_host *host, struct hpsb_packet *packet, int ackcode) { - unsigned long flags; - - packet->ack_code = ackcode; + packet->ack_code = ackcode; - if (packet->no_waiter) { - /* must not have a tlabel allocated */ - hpsb_free_packet(packet); - return; - } + if (packet->no_waiter) { + /* must not have a tlabel allocated */ + hpsb_free_packet(packet); + return; + } - if (ackcode != ACK_PENDING || !packet->expect_response) { - packet->state = hpsb_complete; - queue_packet_complete(packet); - return; - } + if (ackcode != ACK_PENDING || !packet->expect_response) { + atomic_dec(&packet->refcnt); + list_del(&packet->list); + packet->state = hpsb_complete; + queue_packet_complete(packet); + return; + } - packet->state = hpsb_pending; - packet->sendtime = jiffies; + if (packet->state == hpsb_complete) { + hpsb_free_packet(packet); + return; + } - spin_lock_irqsave(&host->pending_pkt_lock, flags); - list_add_tail(&packet->list, &host->pending_packets); - spin_unlock_irqrestore(&host->pending_pkt_lock, flags); + atomic_dec(&packet->refcnt); + packet->state = hpsb_pending; + packet->sendtime = jiffies; mod_timer(&host->timeout, jiffies + host->timeout_interval); } @@ -492,7 +495,7 @@ */ int hpsb_send_packet(struct hpsb_packet *packet) { - struct hpsb_host *host = packet->host; + struct hpsb_host *host = packet->host; if (host->is_shutdown) return -EINVAL; @@ -502,6 +505,15 @@ packet->state = hpsb_queued; + if (!packet->no_waiter || packet->expect_response) { + unsigned long flags; + + atomic_inc(&packet->refcnt); + spin_lock_irqsave(&host->pending_pkt_lock, flags); + list_add_tail(&packet->list, &host->pending_packets); + spin_unlock_irqrestore(&host->pending_pkt_lock, flags); + } + if (packet->node_id == host->node_id) { /* it is a local request, so handle it locally */ quadlet_t *data; @@ -658,7 +670,12 @@ break; } - packet->state = hpsb_complete; + if (packet->state == hpsb_queued) { + packet->sendtime = jiffies; + packet->ack_code = ACK_PENDING; + } + + packet->state = hpsb_complete; queue_packet_complete(packet); } @@ -1024,10 +1041,16 @@ complete_and_exit(&khpsbpkt_complete, 0); } + static int __init ieee1394_init(void) { int i; + if (hpsb_init_config_roms()) { + HPSB_ERR("Failed to initialize some config rom entries.\n"); + HPSB_ERR("Some features may not be available\n"); + } + khpsbpkt_pid = kernel_thread(hpsbpkt_thread, NULL, CLONE_KERNEL); if (khpsbpkt_pid < 0) { HPSB_ERR("Failed to start hpsbpkt thread!\n"); @@ -1044,7 +1067,7 @@ devfs_mk_dir("ieee1394"); hpsb_packet_cache = kmem_cache_create("hpsb_packet", sizeof(struct hpsb_packet), - 0, 0, NULL, NULL); + 0, SLAB_HWCACHE_ALIGN, NULL, NULL); bus_register(&ieee1394_bus_type); for (i = 0; fw_bus_attrs[i]; i++) @@ -1082,6 +1105,8 @@ } kmem_cache_destroy(hpsb_packet_cache); + + hpsb_cleanup_config_roms(); unregister_chrdev_region(IEEE1394_CORE_DEV, 256); devfs_remove("ieee1394"); diff -Nru a/drivers/ieee1394/ieee1394_core.h b/drivers/ieee1394/ieee1394_core.h --- a/drivers/ieee1394/ieee1394_core.h Sun Feb 29 13:02:49 2004 +++ b/drivers/ieee1394/ieee1394_core.h Sun Feb 29 13:02:49 2004 @@ -4,6 +4,7 @@ #include #include +#include #include #include "hosts.h" @@ -58,6 +59,8 @@ struct hpsb_host *host; unsigned int generation; + + atomic_t refcnt; /* Function (and possible data to pass to it) to call when this * packet is completed. */ diff -Nru a/drivers/ieee1394/ieee1394_transactions.c b/drivers/ieee1394/ieee1394_transactions.c --- a/drivers/ieee1394/ieee1394_transactions.c Sun Feb 29 13:02:49 2004 +++ b/drivers/ieee1394/ieee1394_transactions.c Sun Feb 29 13:02:49 2004 @@ -239,6 +239,11 @@ return -EAGAIN; } + case ACK_ADDRESS_ERROR: + return -EINVAL; + + case ACK_TARDY: + case ACK_CONFLICT_ERROR: case ACKX_NONE: case ACKX_SEND_ERROR: case ACKX_ABORTED: @@ -263,7 +268,7 @@ if (length == 0) return NULL; - packet = hpsb_alloc_packet(length + (length % 4 ? 4 - (length % 4) : 0)); + packet = hpsb_alloc_packet((length + 3) & ~3); if (!packet) return NULL; @@ -291,7 +296,7 @@ if (length == 0) return NULL; - packet = hpsb_alloc_packet(length + (length % 4 ? 4 - (length % 4) : 0)); + packet = hpsb_alloc_packet((length + 3) & ~3); if (!packet) return NULL; @@ -325,7 +330,7 @@ if (length == 0) return NULL; - packet = hpsb_alloc_packet(length + (length % 4 ? 4 - (length % 4) : 0)); + packet = hpsb_alloc_packet((length + 3) & ~3); if (!packet) return NULL; diff -Nru a/drivers/ieee1394/ohci1394.c b/drivers/ieee1394/ohci1394.c --- a/drivers/ieee1394/ohci1394.c Sun Feb 29 13:02:49 2004 +++ b/drivers/ieee1394/ohci1394.c Sun Feb 29 13:02:49 2004 @@ -134,10 +134,10 @@ #endif #ifdef OHCI1394_DEBUG -#define DBGMSG(card, fmt, args...) \ -printk(KERN_INFO "%s: fw-host%d: " fmt "\n" , OHCI1394_DRIVER_NAME, card , ## args) +#define DBGMSG(fmt, args...) \ +printk(KERN_INFO "%s: fw-host%d: " fmt "\n" , OHCI1394_DRIVER_NAME, ohci->host->id , ## args) #else -#define DBGMSG(card, fmt, args...) +#define DBGMSG(fmt, args...) #endif #ifdef CONFIG_IEEE1394_OHCI_DMA_DEBUG @@ -158,11 +158,11 @@ printk(level "%s: " fmt "\n" , OHCI1394_DRIVER_NAME , ## args) /* print card specific information */ -#define PRINT(level, card, fmt, args...) \ -printk(level "%s: fw-host%d: " fmt "\n" , OHCI1394_DRIVER_NAME, card , ## args) +#define PRINT(level, fmt, args...) \ +printk(level "%s: fw-host%d: " fmt "\n" , OHCI1394_DRIVER_NAME, ohci->host->id , ## args) static char version[] __devinitdata = - "$Rev: 1131 $ Ben Collins "; + "$Rev: 1172 $ Ben Collins "; /* Module Parameters */ static int phys_dma = 1; @@ -241,7 +241,7 @@ r = reg_read(ohci, OHCI1394_PhyControl); if (i >= OHCI_LOOP_COUNT) - PRINT (KERN_ERR, ohci->id, "Get PHY Reg timeout [0x%08x/0x%08x/%d]", + PRINT (KERN_ERR, "Get PHY Reg timeout [0x%08x/0x%08x/%d]", r, r & 0x80000000, i); spin_unlock_irqrestore (&ohci->phy_reg_lock, flags); @@ -268,7 +268,7 @@ } if (i == OHCI_LOOP_COUNT) - PRINT (KERN_ERR, ohci->id, "Set PHY Reg timeout [0x%08x/0x%08x/%d]", + PRINT (KERN_ERR, "Set PHY Reg timeout [0x%08x/0x%08x/%d]", r, r & 0x00004000, i); spin_unlock_irqrestore (&ohci->phy_reg_lock, flags); @@ -305,7 +305,7 @@ if ((self_id_count & 0x80000000) || ((self_id_count & 0x00FF0000) != (q0 & 0x00FF0000))) { - PRINT(KERN_ERR, ohci->id, + PRINT(KERN_ERR, "Error in reception of SelfID packets [0x%08x/0x%08x] (count: %d)", self_id_count, q0, ohci->self_id_errors); @@ -315,7 +315,7 @@ set_phy_reg_mask (ohci, 1, 0x40); ohci->self_id_errors++; } else { - PRINT(KERN_ERR, ohci->id, + PRINT(KERN_ERR, "Too many errors on SelfID error reception, giving up!"); } return; @@ -337,19 +337,19 @@ } if (q0 == ~q1) { - DBGMSG (ohci->id, "SelfID packet 0x%x received", q0); + DBGMSG ("SelfID packet 0x%x received", q0); hpsb_selfid_received(host, cpu_to_be32(q0)); if (((q0 & 0x3f000000) >> 24) == phyid) - DBGMSG (ohci->id, "SelfID for this node is 0x%08x", q0); + DBGMSG ("SelfID for this node is 0x%08x", q0); } else { - PRINT(KERN_ERR, ohci->id, + PRINT(KERN_ERR, "SelfID is inconsistent [0x%08x/0x%08x]", q0, q1); } q += 2; size -= 2; } - DBGMSG(ohci->id, "SelfID complete"); + DBGMSG("SelfID complete"); return; } @@ -364,7 +364,7 @@ break; mdelay(1); } - DBGMSG (ohci->id, "Soft reset finished"); + DBGMSG ("Soft reset finished"); } static int run_context(struct ti_ohci *ohci, int reg, char *msg) @@ -374,14 +374,14 @@ /* check that the node id is valid */ nodeId = reg_read(ohci, OHCI1394_NodeID); if (!(nodeId&0x80000000)) { - PRINT(KERN_ERR, ohci->id, + PRINT(KERN_ERR, "Running dma failed because Node ID is not valid"); return -1; } /* check that the node number != 63 */ if ((nodeId&0x3f)==63) { - PRINT(KERN_ERR, ohci->id, + PRINT(KERN_ERR, "Running dma failed because Node ID == 63"); return -1; } @@ -389,7 +389,7 @@ /* Run the dma context */ reg_write(ohci, reg, 0x8000); - if (msg) PRINT(KERN_DEBUG, ohci->id, "%s", msg); + if (msg) PRINT(KERN_DEBUG, "%s", msg); return 0; } @@ -451,7 +451,7 @@ /* Run context */ reg_write(ohci, d->ctrlSet, 0x00008000); - DBGMSG(ohci->id, "Receive DMA ctx=%d initialized", d->ctx); + DBGMSG("Receive DMA ctx=%d initialized", d->ctx); } /* Initialize the dma transmit context */ @@ -474,7 +474,7 @@ reg_write(ohci, OHCI1394_IsoXmitIntMaskSet, 1 << d->ctx); } - DBGMSG(ohci->id, "Transmit DMA ctx=%d initialized", d->ctx); + DBGMSG("Transmit DMA ctx=%d initialized", d->ctx); } /* Count the number of available iso contexts */ @@ -486,7 +486,7 @@ reg_write(ohci, reg, 0xffffffff); tmp = reg_read(ohci, reg); - DBGMSG(ohci->id,"Iso contexts reg: %08x implemented: %08x", reg, tmp); + DBGMSG("Iso contexts reg: %08x implemented: %08x", reg, tmp); /* Count the number of contexts */ for (i=0; i<32; i++) { @@ -600,7 +600,7 @@ #else sprintf (irq_buf, "%s", __irq_itoa(ohci->dev->irq)); #endif - PRINT(KERN_INFO, ohci->id, "OHCI-1394 %d.%d (PCI): IRQ=[%s] " + PRINT(KERN_INFO, "OHCI-1394 %d.%d (PCI): IRQ=[%s] " "MMIO=[%lx-%lx] Max Packet=[%d]", ((((buf) >> 16) & 0xf) + (((buf) >> 20) & 0xf) * 10), ((((buf) >> 4) & 0xf) + ((buf) & 0xf) * 10), irq_buf, @@ -635,7 +635,7 @@ u32 cycleTimer; int idx = d->prg_ind; - DBGMSG(ohci->id, "Inserting packet for node " NODE_BUS_FMT + DBGMSG("Inserting packet for node " NODE_BUS_FMT ", tlabel=%d, tcode=0x%x, speed=%d", NODE_BUS_ARGS(ohci->host, packet->node_id), packet->tlabel, packet->tcode, packet->speed_code); @@ -653,7 +653,7 @@ (((((cycleTimer>>25)&0x7)+1)&0x7)<<13) | ((cycleTimer&0x01fff000)>>12)); - DBGMSG(ohci->id, "cycleTimer: %08x timeStamp: %08x", + DBGMSG("cycleTimer: %08x timeStamp: %08x", cycleTimer, d->prg_cpu[idx]->begin.status); } else d->prg_cpu[idx]->begin.status = 0; @@ -709,7 +709,7 @@ if (cross_bound((unsigned long)packet->data, packet->data_size)>0) { /* FIXME: do something about it */ - PRINT(KERN_ERR, ohci->id, + PRINT(KERN_ERR, "%s: packet data addr: %p size %Zd bytes " "cross page boundary", __FUNCTION__, packet->data, packet->data_size); @@ -773,7 +773,7 @@ d->prg_cpu[idx]->end.branchAddress = 0; d->prg_cpu[idx]->end.status = 0; - DBGMSG(ohci->id, "Iso xmit context info: header[%08x %08x]\n" + DBGMSG("Iso xmit context info: header[%08x %08x]\n" " begin=%08x %08x %08x %08x\n" " %08x %08x %08x %08x\n" " end =%08x %08x %08x %08x", @@ -827,19 +827,19 @@ } if (d->free_prgs == 0) - DBGMSG(ohci->id, "Transmit DMA FIFO ctx=%d is full... waiting", d->ctx); + DBGMSG("Transmit DMA FIFO ctx=%d is full... waiting", d->ctx); /* Is the context running ? (should be unless it is the first packet to be sent in this context) */ if (!(reg_read(ohci, d->ctrlSet) & 0x8000)) { - DBGMSG(ohci->id,"Starting transmit DMA ctx=%d",d->ctx); + DBGMSG("Starting transmit DMA ctx=%d",d->ctx); reg_write(ohci, d->cmdPtr, d->prg_bus[idx]|z); run_context(ohci, d->ctrlSet, NULL); } else { /* Wake up the dma context if necessary */ if (!(reg_read(ohci, d->ctrlSet) & 0x400)) { - DBGMSG(ohci->id,"Waking transmit DMA ctx=%d",d->ctx); + DBGMSG("Waking transmit DMA ctx=%d",d->ctx); } /* do this always, to avoid race condition */ @@ -856,7 +856,7 @@ unsigned long flags; if (packet->data_size > ohci->max_packet_size) { - PRINT(KERN_ERR, ohci->id, + PRINT(KERN_ERR, "Transmit packet size %Zd is too big", packet->data_size); return -EOVERFLOW; @@ -874,7 +874,7 @@ if (ohci->it_legacy_context.ohci == NULL) { if (in_interrupt()) { - PRINT(KERN_ERR, ohci->id, + PRINT(KERN_ERR, "legacy IT context cannot be initialized during interrupt"); return -EINVAL; } @@ -882,7 +882,7 @@ if (alloc_dma_trm_ctx(ohci, &ohci->it_legacy_context, DMA_CTX_ISO, 0, IT_NUM_DESC, OHCI1394_IsoXmitContextBase) < 0) { - PRINT(KERN_ERR, ohci->id, + PRINT(KERN_ERR, "error initializing legacy IT context"); return -ENOMEM; } @@ -974,7 +974,7 @@ break; case SET_BUS_ID: - PRINT(KERN_ERR, ohci->id, "devctl command SET_BUS_ID err"); + PRINT(KERN_ERR, "devctl command SET_BUS_ID err"); break; case ACT_CYCLE_MASTER: @@ -985,7 +985,7 @@ /* * enable cycleTimer, cycleMaster */ - DBGMSG(ohci->id, "Cycle master enabled"); + DBGMSG("Cycle master enabled"); reg_write(ohci, OHCI1394_LinkControlSet, OHCI1394_LinkControl_CycleTimerEnable | OHCI1394_LinkControl_CycleMaster); @@ -1000,7 +1000,7 @@ break; case CANCEL_REQUESTS: - DBGMSG(ohci->id, "Cancel request received"); + DBGMSG("Cancel request received"); dma_trm_reset(&ohci->at_req_context); dma_trm_reset(&ohci->at_resp_context); break; @@ -1010,7 +1010,7 @@ u64 mask; if (arg<0 || arg>63) { - PRINT(KERN_ERR, ohci->id, + PRINT(KERN_ERR, "%s: IS0 listen channel %d is out of range", __FUNCTION__, arg); return -EFAULT; @@ -1022,14 +1022,14 @@ DMA_CTX_ISO, 0, IR_NUM_DESC, IR_BUF_SIZE, IR_SPLIT_BUF_SIZE, OHCI1394_IsoRcvContextBase) < 0) { - PRINT(KERN_ERR, ohci->id, "%s: failed to allocate an IR context", + PRINT(KERN_ERR, "%s: failed to allocate an IR context", __FUNCTION__); return -ENOMEM; } ohci->ir_legacy_channels = 0; initialize_dma_rcv_ctx(&ohci->ir_legacy_context, 1); - DBGMSG(ohci->id, "ISO receive legacy context activated"); + DBGMSG("ISO receive legacy context activated"); } mask = (u64)0x1<IR_channel_lock, flags); if (ohci->ISO_channel_usage & mask) { - PRINT(KERN_ERR, ohci->id, + PRINT(KERN_ERR, "%s: IS0 listen channel %d is already used", __FUNCTION__, arg); spin_unlock_irqrestore(&ohci->IR_channel_lock, flags); @@ -1055,7 +1055,7 @@ 1<IR_channel_lock, flags); - DBGMSG(ohci->id, "Listening enabled on channel %d", arg); + DBGMSG("Listening enabled on channel %d", arg); break; } case ISO_UNLISTEN_CHANNEL: @@ -1063,7 +1063,7 @@ u64 mask; if (arg<0 || arg>63) { - PRINT(KERN_ERR, ohci->id, + PRINT(KERN_ERR, "%s: IS0 unlisten channel %d is out of range", __FUNCTION__, arg); return -EFAULT; @@ -1074,7 +1074,7 @@ spin_lock_irqsave(&ohci->IR_channel_lock, flags); if (!(ohci->ISO_channel_usage & mask)) { - PRINT(KERN_ERR, ohci->id, + PRINT(KERN_ERR, "%s: IS0 unlisten channel %d is not used", __FUNCTION__, arg); spin_unlock_irqrestore(&ohci->IR_channel_lock, flags); @@ -1092,12 +1092,12 @@ 1<IR_channel_lock, flags); - DBGMSG(ohci->id, "Listening disabled on channel %d", arg); + DBGMSG("Listening disabled on channel %d", arg); if (ohci->ir_legacy_channels == 0) { stop_dma_rcv_ctx(&ohci->ir_legacy_context); free_dma_rcv_ctx(&ohci->ir_legacy_context); - DBGMSG(ohci->id, "ISO receive legacy context deactivated"); + DBGMSG("ISO receive legacy context deactivated"); } break; } @@ -1209,7 +1209,7 @@ /* one block per page of data in the DMA buffer, minus the final guard page */ recv->nblocks = iso->buf_size/PAGE_SIZE - 1; if (recv->nblocks < 3) { - DBGMSG(ohci->id, "ohci_iso_recv_init: DMA buffer too small"); + DBGMSG("ohci_iso_recv_init: DMA buffer too small"); goto err; } @@ -1245,7 +1245,7 @@ if (recv->buf_stride*iso->buf_packets > iso->buf_size || recv->buf_stride > PAGE_SIZE) { /* this shouldn't happen, but anyway... */ - DBGMSG(ohci->id, "ohci_iso_recv_init: problem choosing a buffer stride"); + DBGMSG("ohci_iso_recv_init: problem choosing a buffer stride"); goto err; } } @@ -1289,7 +1289,7 @@ /* write the DMA program */ ohci_iso_recv_program(iso); - DBGMSG(ohci->id, "ohci_iso_recv_init: %s mode, DMA buffer is %lu pages" + DBGMSG("ohci_iso_recv_init: %s mode, DMA buffer is %lu pages" " (%u bytes), using %u blocks, buf_stride %u, block_irq_interval %d", recv->dma_mode == BUFFER_FILL_MODE ? "buffer-fill" : "packet-per-buffer", @@ -1430,6 +1430,7 @@ static int ohci_iso_recv_start(struct hpsb_iso *iso, int cycle, int tag_mask, int sync) { struct ohci_iso_recv *recv = iso->hostdata; + struct ti_ohci *ohci = recv->ohci; u32 command, contextMatch; reg_write(recv->ohci, recv->ContextControlClear, 0xFFFFFFFF); @@ -1508,7 +1509,7 @@ /* check RUN */ if (!(reg_read(recv->ohci, recv->ContextControlSet) & 0x8000)) { - PRINT(KERN_ERR, recv->ohci->id, + PRINT(KERN_ERR, "Error starting IR DMA (ContextControl 0x%08x)\n", reg_read(recv->ohci, recv->ContextControlSet)); return -1; @@ -1591,6 +1592,7 @@ { int wake = 0; int runaway = 0; + struct ti_ohci *ohci = recv->ohci; while (1) { /* we expect the next parsable packet to begin at recv->dma_offset */ @@ -1607,7 +1609,7 @@ /* don't loop indefinitely */ if (runaway++ > 100000) { atomic_inc(&iso->overflows); - PRINT(KERN_ERR, recv->ohci->id, + PRINT(KERN_ERR, "IR DMA error - Runaway during buffer parsing!\n"); break; } @@ -1626,7 +1628,7 @@ len = p[recv->dma_offset+2] | (p[recv->dma_offset+3] << 8); if (len > 4096) { - PRINT(KERN_ERR, recv->ohci->id, + PRINT(KERN_ERR, "IR DMA error - bogus 'len' value %u\n", len); } @@ -1694,6 +1696,7 @@ static void ohci_iso_recv_bufferfill_task(struct hpsb_iso *iso, struct ohci_iso_recv *recv) { int loop; + struct ti_ohci *ohci = recv->ohci; /* loop over all blocks */ for (loop = 0; loop < recv->nblocks; loop++) { @@ -1716,7 +1719,7 @@ if (event != 0x11) { atomic_inc(&iso->overflows); - PRINT(KERN_ERR, recv->ohci->id, + PRINT(KERN_ERR, "IR DMA error - OHCI error code 0x%02x\n", event); } @@ -1739,7 +1742,7 @@ if ((recv->block_dma+1) % recv->nblocks == recv->block_reader) { atomic_inc(&iso->overflows); - DBGMSG(recv->ohci->id, "ISO reception overflow - " + DBGMSG("ISO reception overflow - " "ran out of DMA blocks"); } } @@ -1752,6 +1755,7 @@ { int count; int wake = 0; + struct ti_ohci *ohci = recv->ohci; /* loop over the entire buffer */ for (count = 0; count < recv->nblocks; count++) { @@ -1779,9 +1783,9 @@ packet_len = recv->buf_stride - rescount; } else if (event == 0x02) { - PRINT(KERN_ERR, recv->ohci->id, "IR DMA error - packet too long for buffer\n"); + PRINT(KERN_ERR, "IR DMA error - packet too long for buffer\n"); } else if (event) { - PRINT(KERN_ERR, recv->ohci->id, "IR DMA error - OHCI error code 0x%02x\n", event); + PRINT(KERN_ERR, "IR DMA error - OHCI error code 0x%02x\n", event); } /* sync our view of the buffer */ @@ -1911,6 +1915,7 @@ static void ohci_iso_xmit_stop(struct hpsb_iso *iso) { struct ohci_iso_xmit *xmit = iso->hostdata; + struct ti_ohci *ohci = xmit->ohci; /* disable interrupts */ reg_write(xmit->ohci, OHCI1394_IsoXmitIntMaskClear, 1 << xmit->task.context); @@ -1918,7 +1923,7 @@ /* halt DMA */ if (ohci1394_stop_context(xmit->ohci, xmit->ContextControlClear, NULL)) { /* XXX the DMA context will lock up if you try to send too much data! */ - PRINT(KERN_ERR, xmit->ohci->id, + PRINT(KERN_ERR, "you probably exceeded the OHCI card's bandwidth limit - " "reload the module and reduce xmit bandwidth"); } @@ -1943,6 +1948,7 @@ { struct hpsb_iso *iso = (struct hpsb_iso*) data; struct ohci_iso_xmit *xmit = iso->hostdata; + struct ti_ohci *ohci = xmit->ohci; int wake = 0; int count; @@ -1963,7 +1969,7 @@ } if (event != 0x11) - PRINT(KERN_ERR, xmit->ohci->id, + PRINT(KERN_ERR, "IT DMA error - OHCI error code 0x%02x\n", event); /* at least one packet went out, so wake up the writer */ @@ -1986,6 +1992,7 @@ static int ohci_iso_xmit_queue(struct hpsb_iso *iso, struct hpsb_iso_packet_info *info) { struct ohci_iso_xmit *xmit = iso->hostdata; + struct ti_ohci *ohci = xmit->ohci; int next_i, prev_i; struct iso_xmit_cmd *next, *prev; @@ -1997,7 +2004,7 @@ /* check that the packet doesn't cross a page boundary (we could allow this if we added OUTPUT_MORE descriptor support) */ if (cross_bound(info->offset, info->len)) { - PRINT(KERN_ERR, xmit->ohci->id, + PRINT(KERN_ERR, "rawiso xmit: packet %u crosses a page boundary", iso->first_packet); return -EINVAL; @@ -2081,6 +2088,7 @@ static int ohci_iso_xmit_start(struct hpsb_iso *iso, int cycle) { struct ohci_iso_xmit *xmit = iso->hostdata; + struct ti_ohci *ohci = xmit->ohci; /* clear out the control register */ reg_write(xmit->ohci, xmit->ContextControlClear, 0xFFFFFFFF); @@ -2118,7 +2126,7 @@ /* check the RUN bit */ if (!(reg_read(xmit->ohci, xmit->ContextControlSet) & 0x8000)) { - PRINT(KERN_ERR, xmit->ohci->id, "Error starting IT DMA (ContextControl 0x%08x)\n", + PRINT(KERN_ERR, "Error starting IT DMA (ContextControl 0x%08x)\n", reg_read(xmit->ohci, xmit->ContextControlSet)); return -1; } @@ -2192,8 +2200,9 @@ { unsigned long flags; LIST_HEAD(packet_list); + struct ti_ohci *ohci = d->ohci; - ohci1394_stop_context(d->ohci, d->ctrlClear, NULL); + ohci1394_stop_context(ohci, d->ctrlClear, NULL); /* Lock the context, reset it and release it. Move the packets * that were pending in the context to packet_list and free @@ -2217,10 +2226,10 @@ while (!list_empty(&packet_list)) { struct hpsb_packet *p = driver_packet(packet_list.next); - PRINT(KERN_INFO, d->ohci->id, + PRINT(KERN_INFO, "AT dma reset ctx=%d, aborting transmission", d->ctx); list_del(&p->driver_list); - hpsb_packet_sent(d->ohci->host, p, ACKX_ABORTED); + hpsb_packet_sent(ohci->host, p, ACKX_ABORTED); } } @@ -2270,43 +2279,43 @@ * we just return, and clean up in the ohci1394_pci_remove * function. */ if (event == ~(u32) 0) { - DBGMSG(ohci->id, "Device removed."); + DBGMSG("Device removed."); return IRQ_NONE; } - DBGMSG(ohci->id, "IntEvent: %08x", event); + DBGMSG("IntEvent: %08x", event); if (event & OHCI1394_unrecoverableError) { int ctx; - PRINT(KERN_ERR, ohci->id, "Unrecoverable error!"); + PRINT(KERN_ERR, "Unrecoverable error!"); if (reg_read(ohci, OHCI1394_AsReqTrContextControlSet) & 0x800) - PRINT(KERN_ERR, ohci->id, "Async Req Tx Context died: " + PRINT(KERN_ERR, "Async Req Tx Context died: " "ctrl[%08x] cmdptr[%08x]", reg_read(ohci, OHCI1394_AsReqTrContextControlSet), reg_read(ohci, OHCI1394_AsReqTrCommandPtr)); if (reg_read(ohci, OHCI1394_AsRspTrContextControlSet) & 0x800) - PRINT(KERN_ERR, ohci->id, "Async Rsp Tx Context died: " + PRINT(KERN_ERR, "Async Rsp Tx Context died: " "ctrl[%08x] cmdptr[%08x]", reg_read(ohci, OHCI1394_AsRspTrContextControlSet), reg_read(ohci, OHCI1394_AsRspTrCommandPtr)); if (reg_read(ohci, OHCI1394_AsReqRcvContextControlSet) & 0x800) - PRINT(KERN_ERR, ohci->id, "Async Req Rcv Context died: " + PRINT(KERN_ERR, "Async Req Rcv Context died: " "ctrl[%08x] cmdptr[%08x]", reg_read(ohci, OHCI1394_AsReqRcvContextControlSet), reg_read(ohci, OHCI1394_AsReqRcvCommandPtr)); if (reg_read(ohci, OHCI1394_AsRspRcvContextControlSet) & 0x800) - PRINT(KERN_ERR, ohci->id, "Async Rsp Rcv Context died: " + PRINT(KERN_ERR, "Async Rsp Rcv Context died: " "ctrl[%08x] cmdptr[%08x]", reg_read(ohci, OHCI1394_AsRspRcvContextControlSet), reg_read(ohci, OHCI1394_AsRspRcvCommandPtr)); for (ctx = 0; ctx < ohci->nb_iso_xmit_ctx; ctx++) { if (reg_read(ohci, OHCI1394_IsoXmitContextControlSet + (16 * ctx)) & 0x800) - PRINT(KERN_ERR, ohci->id, "Iso Xmit %d Context died: " + PRINT(KERN_ERR, "Iso Xmit %d Context died: " "ctrl[%08x] cmdptr[%08x]", ctx, reg_read(ohci, OHCI1394_IsoXmitContextControlSet + (16 * ctx)), reg_read(ohci, OHCI1394_IsoXmitCommandPtr + (16 * ctx))); @@ -2314,7 +2323,7 @@ for (ctx = 0; ctx < ohci->nb_iso_rcv_ctx; ctx++) { if (reg_read(ohci, OHCI1394_IsoRcvContextControlSet + (32 * ctx)) & 0x800) - PRINT(KERN_ERR, ohci->id, "Iso Recv %d Context died: " + PRINT(KERN_ERR, "Iso Recv %d Context died: " "ctrl[%08x] cmdptr[%08x] match[%08x]", ctx, reg_read(ohci, OHCI1394_IsoRcvContextControlSet + (32 * ctx)), reg_read(ohci, OHCI1394_IsoRcvCommandPtr + (32 * ctx)), @@ -2328,7 +2337,7 @@ /* We subscribe to the cycleInconsistent event only to * clear the corresponding event bit... otherwise, * isochronous cycleMatch DMA won't work. */ - DBGMSG(ohci->id, "OHCI1394_cycleInconsistent"); + DBGMSG("OHCI1394_cycleInconsistent"); event &= ~OHCI1394_cycleInconsistent; } @@ -2359,7 +2368,7 @@ * to solve this problem. This mainly effects nForce2. */ if (loop_count > 10000) { ohci_devctl(host, RESET_BUS, LONG_RESET); - DBGMSG(ohci->id, "Detected bus-reset loop. Forced a bus reset!"); + DBGMSG("Detected bus-reset loop. Forced a bus reset!"); loop_count = 0; } @@ -2368,7 +2377,7 @@ } spin_unlock_irqrestore(&ohci->event_lock, flags); if (!host->in_bus_reset) { - DBGMSG(ohci->id, "irq_handler: Bus reset requested"); + DBGMSG("irq_handler: Bus reset requested"); /* Subsystem call */ hpsb_bus_reset(ohci->host); @@ -2376,24 +2385,20 @@ event &= ~OHCI1394_busReset; } - /* XXX: We need a way to also queue the OHCI1394_reqTxComplete, - * but for right now we simply run it upon reception, to make sure - * we get sent acks before response packets. This sucks mainly - * because it halts the interrupt handler. */ if (event & OHCI1394_reqTxComplete) { struct dma_trm_ctx *d = &ohci->at_req_context; - DBGMSG(ohci->id, "Got reqTxComplete interrupt " + DBGMSG("Got reqTxComplete interrupt " "status=0x%08X", reg_read(ohci, d->ctrlSet)); if (reg_read(ohci, d->ctrlSet) & 0x800) ohci1394_stop_context(ohci, d->ctrlClear, "reqTxComplete"); else - dma_trm_tasklet ((unsigned long)d); + tasklet_schedule(&d->task); event &= ~OHCI1394_reqTxComplete; } if (event & OHCI1394_respTxComplete) { struct dma_trm_ctx *d = &ohci->at_resp_context; - DBGMSG(ohci->id, "Got respTxComplete interrupt " + DBGMSG("Got respTxComplete interrupt " "status=0x%08X", reg_read(ohci, d->ctrlSet)); if (reg_read(ohci, d->ctrlSet) & 0x800) ohci1394_stop_context(ohci, d->ctrlClear, @@ -2404,7 +2409,7 @@ } if (event & OHCI1394_RQPkt) { struct dma_rcv_ctx *d = &ohci->ar_req_context; - DBGMSG(ohci->id, "Got RQPkt interrupt status=0x%08X", + DBGMSG("Got RQPkt interrupt status=0x%08X", reg_read(ohci, d->ctrlSet)); if (reg_read(ohci, d->ctrlSet) & 0x800) ohci1394_stop_context(ohci, d->ctrlClear, "RQPkt"); @@ -2414,7 +2419,7 @@ } if (event & OHCI1394_RSPkt) { struct dma_rcv_ctx *d = &ohci->ar_resp_context; - DBGMSG(ohci->id, "Got RSPkt interrupt status=0x%08X", + DBGMSG("Got RSPkt interrupt status=0x%08X", reg_read(ohci, d->ctrlSet)); if (reg_read(ohci, d->ctrlSet) & 0x800) ohci1394_stop_context(ohci, d->ctrlClear, "RSPkt"); @@ -2443,7 +2448,7 @@ node_id = reg_read(ohci, OHCI1394_NodeID); if (!(node_id & 0x80000000)) { - PRINT(KERN_ERR, ohci->id, + PRINT(KERN_ERR, "SelfID received, but NodeID invalid " "(probably new bus reset occurred): %08X", node_id); @@ -2453,8 +2458,7 @@ phyid = node_id & 0x0000003f; isroot = (node_id & 0x40000000) != 0; - DBGMSG(ohci->id, - "SelfID interrupt received " + DBGMSG("SelfID interrupt received " "(phyid %d, %s)", phyid, (isroot ? "root" : "not root")); @@ -2484,13 +2488,13 @@ reg_write(ohci,OHCI1394_PhyReqFilterLoSet, 0x00000000); } - DBGMSG(ohci->id, "PhyReqFilter=%08x%08x", + DBGMSG("PhyReqFilter=%08x%08x", reg_read(ohci,OHCI1394_PhyReqFilterHiSet), reg_read(ohci,OHCI1394_PhyReqFilterLoSet)); hpsb_selfid_complete(host, phyid, isroot); } else - PRINT(KERN_ERR, ohci->id, + PRINT(KERN_ERR, "SelfID received outside of bus reset sequence"); selfid_not_valid: @@ -2500,7 +2504,7 @@ /* Make sure we handle everything, just in case we accidentally * enabled an interrupt that we didn't write a handler for. */ if (event) - PRINT(KERN_ERR, ohci->id, "Unhandled interrupt(s) 0x%08x", + PRINT(KERN_ERR, "Unhandled interrupt(s) 0x%08x", event); return IRQ_HANDLED; @@ -2510,7 +2514,7 @@ static void insert_dma_buffer(struct dma_rcv_ctx *d, int idx) { struct ti_ohci *ohci = (struct ti_ohci*)(d->ohci); - DBGMSG(ohci->id, "Inserting dma buf ctx=%d idx=%d", d->ctx, idx); + DBGMSG("Inserting dma buf ctx=%d idx=%d", d->ctx, idx); d->prg_cpu[idx]->status = cpu_to_le32(d->buf_size); d->prg_cpu[idx]->branchAddress &= le32_to_cpu(0xfffffff0); @@ -2519,7 +2523,7 @@ /* wake up the dma context if necessary */ if (!(reg_read(ohci, d->ctrlSet) & 0x400)) { - PRINT(KERN_INFO, ohci->id, + PRINT(KERN_INFO, "Waking dma ctx=%d ... processing is probably too slow", d->ctx); } @@ -2606,7 +2610,7 @@ * over more than one descriptor. The next case is where * it's all in the first descriptor. */ if ((offset + length) > d->buf_size) { - DBGMSG(ohci->id,"Split packet rcv'd"); + DBGMSG("Split packet rcv'd"); if (length > d->split_buf_size) { ohci1394_stop_context(ohci, d->ctrlClear, "Split packet size exceeded"); @@ -2621,7 +2625,7 @@ /* Other part of packet not written yet. * this should never happen I think * anyway we'll get it on the next call. */ - PRINT(KERN_INFO, ohci->id, + PRINT(KERN_INFO, "Got only half a packet!"); d->buf_ind = idx; d->buf_offset = offset; @@ -2654,7 +2658,7 @@ buf_ptr += offset/4; } } else { - DBGMSG(ohci->id,"Single packet rcv'd"); + DBGMSG("Single packet rcv'd"); memcpy(d->spb, buf_ptr, length); offset += length; buf_ptr += length/4; @@ -2671,7 +2675,7 @@ if (tcode != OHCI1394_TCODE_PHY) { if (!ohci->no_swap_incoming) packet_swab(d->spb, tcode); - DBGMSG(ohci->id, "Packet received from node" + DBGMSG("Packet received from node" " %d ack=0x%02X spd=%d tcode=0x%X" " length=%d ctx=%d tlabel=%d", (d->spb[1]>>16)&0x3f, @@ -2688,7 +2692,7 @@ } #ifdef OHCI1394_DEBUG else - PRINT (KERN_DEBUG, ohci->id, "Got phy packet ctx=%d ... discarded", + PRINT (KERN_DEBUG, "Got phy packet ctx=%d ... discarded", d->ctx); #endif @@ -2733,8 +2737,7 @@ #ifdef OHCI1394_DEBUG if (datasize) if (((le32_to_cpu(d->prg_cpu[d->sent_ind]->data[0])>>4)&0xf) == 0xa) - DBGMSG(ohci->id, - "Stream packet sent to channel %d tcode=0x%X " + DBGMSG("Stream packet sent to channel %d tcode=0x%X " "ack=0x%X spd=%d dataLength=%d ctx=%d", (le32_to_cpu(d->prg_cpu[d->sent_ind]->data[0])>>8)&0x3f, (le32_to_cpu(d->prg_cpu[d->sent_ind]->data[0])>>4)&0xf, @@ -2742,8 +2745,7 @@ le32_to_cpu(d->prg_cpu[d->sent_ind]->data[1])>>16, d->ctx); else - DBGMSG(ohci->id, - "Packet sent to node %d tcode=0x%X tLabel=" + DBGMSG("Packet sent to node %d tcode=0x%X tLabel=" "0x%02X ack=0x%X spd=%d dataLength=%d ctx=%d", (le32_to_cpu(d->prg_cpu[d->sent_ind]->data[1])>>16)&0x3f, (le32_to_cpu(d->prg_cpu[d->sent_ind]->data[0])>>4)&0xf, @@ -2752,8 +2754,7 @@ le32_to_cpu(d->prg_cpu[d->sent_ind]->data[3])>>16, d->ctx); else - DBGMSG(ohci->id, - "Packet sent to node %d tcode=0x%X tLabel=" + DBGMSG("Packet sent to node %d tcode=0x%X tLabel=" "0x%02X ack=0x%X spd=%d data=0x%08X ctx=%d", (le32_to_cpu(d->prg_cpu[d->sent_ind]->data[1]) >>16)&0x3f, @@ -2773,7 +2774,7 @@ case EVT_NO_STATUS: /* that should never happen */ case EVT_RESERVED_A: /* that should never happen */ case EVT_LONG_PACKET: /* that should never happen */ - PRINT(KERN_WARNING, ohci->id, "Received OHCI evt_* error 0x%x", status & 0x1f); + PRINT(KERN_WARNING, "Received OHCI evt_* error 0x%x", status & 0x1f); ack = ACKX_SEND_ERROR; break; case EVT_MISSING_ACK: @@ -2783,7 +2784,7 @@ ack = ACKX_SEND_ERROR; break; case EVT_OVERRUN: /* that should never happen */ - PRINT(KERN_WARNING, ohci->id, "Received OHCI evt_* error 0x%x", status & 0x1f); + PRINT(KERN_WARNING, "Received OHCI evt_* error 0x%x", status & 0x1f); ack = ACKX_SEND_ERROR; break; case EVT_DESCRIPTOR_READ: @@ -2792,7 +2793,7 @@ ack = ACKX_SEND_ERROR; break; case EVT_BUS_RESET: /* that should never happen */ - PRINT(KERN_WARNING, ohci->id, "Received OHCI evt_* error 0x%x", status & 0x1f); + PRINT(KERN_WARNING, "Received OHCI evt_* error 0x%x", status & 0x1f); ack = ACKX_SEND_ERROR; break; case EVT_TIMEOUT: @@ -2803,7 +2804,7 @@ break; case EVT_RESERVED_B: /* that should never happen */ case EVT_RESERVED_C: /* that should never happen */ - PRINT(KERN_WARNING, ohci->id, "Received OHCI evt_* error 0x%x", status & 0x1f); + PRINT(KERN_WARNING, "Received OHCI evt_* error 0x%x", status & 0x1f); ack = ACKX_SEND_ERROR; break; case EVT_UNKNOWN: @@ -2811,7 +2812,7 @@ ack = ACKX_SEND_ERROR; break; default: - PRINT(KERN_ERR, ohci->id, "Unhandled OHCI evt_* error 0x%x", status & 0x1f); + PRINT(KERN_ERR, "Unhandled OHCI evt_* error 0x%x", status & 0x1f); ack = ACKX_SEND_ERROR; BUG(); } @@ -2855,17 +2856,18 @@ static void free_dma_rcv_ctx(struct dma_rcv_ctx *d) { int i; + struct ti_ohci *ohci = d->ohci; - if (d->ohci == NULL) + if (ohci == NULL) return; - DBGMSG(d->ohci->id, "Freeing dma_rcv_ctx %d", d->ctx); + DBGMSG("Freeing dma_rcv_ctx %d", d->ctx); if (d->buf_cpu) { for (i=0; inum_desc; i++) if (d->buf_cpu[i] && d->buf_bus[i]) { pci_free_consistent( - d->ohci->dev, d->buf_size, + ohci->dev, d->buf_size, d->buf_cpu[i], d->buf_bus[i]); OHCI_DMA_FREE("consistent dma_rcv buf[%d]", i); } @@ -2912,7 +2914,7 @@ d->buf_bus = kmalloc(d->num_desc * sizeof(dma_addr_t), GFP_KERNEL); if (d->buf_cpu == NULL || d->buf_bus == NULL) { - PRINT(KERN_ERR, ohci->id, "Failed to allocate dma buffer"); + PRINT(KERN_ERR, "Failed to allocate dma buffer"); free_dma_rcv_ctx(d); return -ENOMEM; } @@ -2924,7 +2926,7 @@ d->prg_bus = kmalloc(d->num_desc * sizeof(dma_addr_t), GFP_KERNEL); if (d->prg_cpu == NULL || d->prg_bus == NULL) { - PRINT(KERN_ERR, ohci->id, "Failed to allocate dma prg"); + PRINT(KERN_ERR, "Failed to allocate dma prg"); free_dma_rcv_ctx(d); return -ENOMEM; } @@ -2934,7 +2936,7 @@ d->spb = kmalloc(d->split_buf_size, GFP_KERNEL); if (d->spb == NULL) { - PRINT(KERN_ERR, ohci->id, "Failed to allocate split buffer"); + PRINT(KERN_ERR, "Failed to allocate split buffer"); free_dma_rcv_ctx(d); return -ENOMEM; } @@ -2952,7 +2954,7 @@ if (d->buf_cpu[i] != NULL) { memset(d->buf_cpu[i], 0, d->buf_size); } else { - PRINT(KERN_ERR, ohci->id, + PRINT(KERN_ERR, "Failed to allocate dma buffer"); free_dma_rcv_ctx(d); return -ENOMEM; @@ -2964,7 +2966,7 @@ if (d->prg_cpu[i] != NULL) { memset(d->prg_cpu[i], 0, sizeof(struct dma_cmd)); } else { - PRINT(KERN_ERR, ohci->id, + PRINT(KERN_ERR, "Failed to allocate dma prg"); free_dma_rcv_ctx(d); return -ENOMEM; @@ -2979,7 +2981,7 @@ dma_rcv_tasklet, (unsigned long) d); if (ohci1394_register_iso_tasklet(ohci, &ohci->ir_legacy_tasklet) < 0) { - PRINT(KERN_ERR, ohci->id, "No IR DMA context available"); + PRINT(KERN_ERR, "No IR DMA context available"); free_dma_rcv_ctx(d); return -EBUSY; } @@ -3005,11 +3007,12 @@ static void free_dma_trm_ctx(struct dma_trm_ctx *d) { int i; + struct ti_ohci *ohci = d->ohci; - if (d->ohci == NULL) + if (ohci == NULL) return; - DBGMSG(d->ohci->id, "Freeing dma_trm_ctx %d", d->ctx); + DBGMSG("Freeing dma_trm_ctx %d", d->ctx); if (d->prg_cpu) { for (i=0; inum_desc; i++) @@ -3047,7 +3050,7 @@ d->prg_bus = kmalloc(d->num_desc * sizeof(dma_addr_t), GFP_KERNEL); if (d->prg_cpu == NULL || d->prg_bus == NULL) { - PRINT(KERN_ERR, ohci->id, "Failed to allocate at dma prg"); + PRINT(KERN_ERR, "Failed to allocate at dma prg"); free_dma_trm_ctx(d); return -ENOMEM; } @@ -3065,7 +3068,7 @@ if (d->prg_cpu[i] != NULL) { memset(d->prg_cpu[i], 0, sizeof(struct at_dma_prg)); } else { - PRINT(KERN_ERR, ohci->id, + PRINT(KERN_ERR, "Failed to allocate at dma prg"); free_dma_trm_ctx(d); return -ENOMEM; @@ -3080,7 +3083,7 @@ dma_trm_tasklet, (unsigned long) d); if (ohci1394_register_iso_tasklet(ohci, &ohci->it_legacy_tasklet) < 0) { - PRINT(KERN_ERR, ohci->id, "No IT DMA context available"); + PRINT(KERN_ERR, "No IT DMA context available"); free_dma_trm_ctx(d); return -EBUSY; } @@ -3157,11 +3160,6 @@ static int __devinit ohci1394_pci_probe(struct pci_dev *dev, const struct pci_device_id *ent) { - struct csr1212_keyval *root; - struct csr1212_keyval *vend_id = NULL; - struct csr1212_keyval *text = NULL; - int ret; - static int version_printed = 0; struct hpsb_host *host; @@ -3179,7 +3177,6 @@ if (!host) FAIL(-ENOMEM, "Failed to allocate host structure"); ohci = host->hostdata; - ohci->id = host->id; ohci->dev = dev; ohci->host = host; ohci->init_state = OHCI_INIT_ALLOC_HOST; @@ -3223,7 +3220,7 @@ * clearly says it's 2kb, so this shouldn't be a problem. */ ohci_base = pci_resource_start(dev, 0); if (pci_resource_len(dev, 0) != OHCI1394_REGISTER_SIZE) - PRINT(KERN_WARNING, ohci->id, "Unexpected PCI resource length of %lx!", + PRINT(KERN_WARNING, "Unexpected PCI resource length of %lx!", pci_resource_len(dev, 0)); /* Seems PCMCIA handles this internally. Not sure why. Seems @@ -3239,7 +3236,7 @@ if (ohci->registers == NULL) FAIL(-ENXIO, "Failed to remap registers - card not accessible"); ohci->init_state = OHCI_INIT_HAVE_IOMAPPING; - DBGMSG(ohci->id, "Remapped memory spaces reg 0x%p", ohci->registers); + DBGMSG("Remapped memory spaces reg 0x%p", ohci->registers); /* csr_config rom allocation */ ohci->csr_config_rom_cpu = @@ -3261,7 +3258,7 @@ ohci->init_state = OHCI_INIT_HAVE_SELFID_BUFFER; if ((unsigned long)ohci->selfid_buf_cpu & 0x1fff) - PRINT(KERN_INFO, ohci->id, "SelfID buffer %p is not aligned on " + PRINT(KERN_INFO, "SelfID buffer %p is not aligned on " "8Kb boundary... may cause problems on some CXD3222 chip", ohci->selfid_buf_cpu); @@ -3315,12 +3312,12 @@ /* Determine the number of available IR and IT contexts. */ ohci->nb_iso_rcv_ctx = get_nb_iso_ctx(ohci, OHCI1394_IsoRecvIntMaskSet); - DBGMSG(ohci->id, "%d iso receive contexts available", + DBGMSG("%d iso receive contexts available", ohci->nb_iso_rcv_ctx); ohci->nb_iso_xmit_ctx = get_nb_iso_ctx(ohci, OHCI1394_IsoXmitIntMaskSet); - DBGMSG(ohci->id, "%d iso transmit contexts available", + DBGMSG("%d iso transmit contexts available", ohci->nb_iso_xmit_ctx); /* Set the usage bits for non-existent contexts so they can't @@ -3346,38 +3343,6 @@ ohci->init_state = OHCI_INIT_HAVE_IRQ; ohci_initialize(ohci); - /* Setup initial root directory entries */ - root = host->csr.rom->root_kv; - - vend_id = csr1212_new_immediate(CSR1212_KV_ID_VENDOR, - reg_read(ohci, OHCI1394_GUIDHi) >> 8); - text = csr1212_new_string_descriptor_leaf("Linux 1394 - OHCI"); - - if (!vend_id || !text) { - if (vend_id) { - csr1212_release_keyval(vend_id); - } - if (text) { - csr1212_release_keyval(text); - } - FAIL(-ENOMEM, "Failed to allocate memory for mandatory ConfigROM entries!"); - } - - ret = csr1212_associate_keyval(vend_id, text); - csr1212_release_keyval(text); - if(ret != CSR1212_SUCCESS) { - csr1212_release_keyval(vend_id); - FAIL(ret, "Failed to associate text descriptor to vendor id"); - } - - ret = csr1212_attach_keyval_to_directory(root, vend_id); - if(ret != CSR1212_SUCCESS) { - csr1212_release_keyval(vend_id); - FAIL(ret, "Failed to attach vendor id to root directory"); - } - - host->update_config_rom = 1; - /* Set certain csr values */ host->csr.guid_hi = reg_read(ohci, OHCI1394_GUIDHi); host->csr.guid_lo = reg_read(ohci, OHCI1394_GUIDLo); @@ -3386,7 +3351,9 @@ host->csr.lnk_spd = reg_read(ohci, OHCI1394_BusOptions) & 0x7; /* Tell the highlevel this host is ready */ - hpsb_add_host(host); + if (hpsb_add_host(host)) + FAIL(-ENOMEM, "Failed to register host with highlevel"); + ohci->init_state = OHCI_INIT_DONE; return 0; @@ -3582,7 +3549,7 @@ while (reg_read(ohci, reg) & 0x400) { i++; if (i>5000) { - PRINT(KERN_ERR, ohci->id, + PRINT(KERN_ERR, "Runaway loop while stopping context: %s...", msg ? msg : ""); return 1; } @@ -3590,7 +3557,7 @@ mb(); udelay(10); } - if (msg) PRINT(KERN_ERR, ohci->id, "%s: dma prg stopped", msg); + if (msg) PRINT(KERN_ERR, "%s: dma prg stopped", msg); return 0; } diff -Nru a/drivers/ieee1394/ohci1394.h b/drivers/ieee1394/ohci1394.h --- a/drivers/ieee1394/ohci1394.h Sun Feb 29 13:02:49 2004 +++ b/drivers/ieee1394/ohci1394.h Sun Feb 29 13:02:49 2004 @@ -149,8 +149,6 @@ }; struct ti_ohci { - int id; /* sequential card number */ - struct pci_dev *dev; enum { diff -Nru a/drivers/ieee1394/pcilynx.c b/drivers/ieee1394/pcilynx.c --- a/drivers/ieee1394/pcilynx.c Sun Feb 29 13:02:49 2004 +++ b/drivers/ieee1394/pcilynx.c Sun Feb 29 13:02:49 2004 @@ -1516,11 +1516,6 @@ return error; \ } while (0) - struct csr1212_keyval *root; - struct csr1212_keyval *vend_id = NULL; - struct csr1212_keyval *text = NULL; - int ret; - char irq_buf[16]; struct hpsb_host *host; struct ti_lynx *lynx; /* shortcut to currently handled device */ @@ -1890,42 +1885,14 @@ else host->csr.lnk_spd = be32_to_cpu(lynx->bus_info_block[2]) & 0x7; - /* Setup initial root directory entries */ - root = host->csr.rom->root_kv; - - vend_id = csr1212_new_immediate(CSR1212_KV_ID_VENDOR, - be32_to_cpu(lynx->bus_info_block[3]) >> 8); - text = csr1212_new_string_descriptor_leaf("Linux 1394 - PCI-Lynx"); - - if (!vend_id || !text) { - if (vend_id) - csr1212_release_keyval(vend_id); - if (text) - csr1212_release_keyval(text); + if (hpsb_add_host(host)) { error = -ENOMEM; - FAIL("Failed to allocate memory for mandatory ConfigROM entries!"); - } - - ret = csr1212_associate_keyval(vend_id, text); - csr1212_release_keyval(text); /* no longer needed locally. */ - if(ret != CSR1212_SUCCESS) { - csr1212_release_keyval(vend_id); - error = ret; - FAIL("Failed to associate text descriptor to vendor id"); - } - - ret = csr1212_attach_keyval_to_directory(root, vend_id); - csr1212_release_keyval(vend_id); /* no longer needed locally. */ - if(ret != CSR1212_SUCCESS) { - error = ret; - FAIL("Failed to attach vendor id to root directory"); + FAIL("Failed to register host with highlevel"); } - host->update_config_rom = 1; - hpsb_add_host(host); lynx->state = is_host; - return ret; + return 0; #undef FAIL } diff -Nru a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c --- a/drivers/ieee1394/sbp2.c Sun Feb 29 13:02:49 2004 +++ b/drivers/ieee1394/sbp2.c Sun Feb 29 13:02:49 2004 @@ -78,7 +78,7 @@ #include "sbp2.h" static char version[] __devinitdata = - "$Rev: 1144 $ Ben Collins "; + "$Rev: 1170 $ Ben Collins "; /* * Module load parameter definitions @@ -677,6 +677,10 @@ */ sbp2scsi_complete_all_commands(scsi_id, DID_BUS_BUSY); + /* Make sure we unblock requests (since this is likely after a bus + * reset). */ + scsi_unblock_requests(scsi_id->scsi_host); + return 0; } @@ -2543,8 +2547,6 @@ done (command->Current_SCpnt); } } - - scsi_unblock_requests(scsi_id->scsi_host); return; } diff -Nru a/drivers/ieee1394/video1394.c b/drivers/ieee1394/video1394.c --- a/drivers/ieee1394/video1394.c Sun Feb 29 13:02:49 2004 +++ b/drivers/ieee1394/video1394.c Sun Feb 29 13:02:49 2004 @@ -155,7 +155,7 @@ { int i; - DBGMSG(d->ohci->id, "Freeing dma_iso_ctx %d", d->ctx); + DBGMSG(d->ohci->host->id, "Freeing dma_iso_ctx %d", d->ctx); ohci1394_stop_context(d->ohci, d->ctrlClear, NULL); if (d->iso_tasklet.link.next != NULL) @@ -200,7 +200,7 @@ d = kmalloc(sizeof(struct dma_iso_ctx), GFP_KERNEL); if (d == NULL) { - PRINT(KERN_ERR, ohci->id, "Failed to allocate dma_iso_ctx"); + PRINT(KERN_ERR, ohci->host->id, "Failed to allocate dma_iso_ctx"); return NULL; } @@ -221,7 +221,7 @@ if (dma_region_alloc(&d->dma, d->num_desc * d->buf_size, ohci->dev, PCI_DMA_BIDIRECTIONAL)) { - PRINT(KERN_ERR, ohci->id, "Failed to allocate dma buffer"); + PRINT(KERN_ERR, ohci->host->id, "Failed to allocate dma buffer"); free_dma_iso_ctx(d); return NULL; } @@ -236,7 +236,7 @@ (unsigned long) d); if (ohci1394_register_iso_tasklet(ohci, &d->iso_tasklet) < 0) { - PRINT(KERN_ERR, ohci->id, "no free iso %s contexts", + PRINT(KERN_ERR, ohci->host->id, "no free iso %s contexts", type == OHCI_ISO_RECEIVE ? "receive" : "transmit"); free_dma_iso_ctx(d); return NULL; @@ -246,7 +246,7 @@ d->prg_reg = kmalloc(d->num_desc * sizeof(struct dma_prog_region), GFP_KERNEL); if (d->prg_reg == NULL) { - PRINT(KERN_ERR, ohci->id, "Failed to allocate ir prg regs"); + PRINT(KERN_ERR, ohci->host->id, "Failed to allocate ir prg regs"); free_dma_iso_ctx(d); return NULL; } @@ -264,7 +264,7 @@ GFP_KERNEL); if (d->ir_prg == NULL) { - PRINT(KERN_ERR, ohci->id, "Failed to allocate dma ir prg"); + PRINT(KERN_ERR, ohci->host->id, "Failed to allocate dma ir prg"); free_dma_iso_ctx(d); return NULL; } @@ -277,7 +277,7 @@ for (i = 0;i < d->num_desc; i++) { if (dma_prog_region_alloc(&d->prg_reg[i], d->nb_cmd * sizeof(struct dma_cmd), ohci->dev)) { - PRINT(KERN_ERR, ohci->id, "Failed to allocate dma ir prg"); + PRINT(KERN_ERR, ohci->host->id, "Failed to allocate dma ir prg"); free_dma_iso_ctx(d); return NULL; } @@ -293,7 +293,7 @@ GFP_KERNEL); if (d->it_prg == NULL) { - PRINT(KERN_ERR, ohci->id, + PRINT(KERN_ERR, ohci->host->id, "Failed to allocate dma it prg"); free_dma_iso_ctx(d); return NULL; @@ -303,7 +303,7 @@ d->packet_size = packet_size; if (PAGE_SIZE % packet_size || packet_size>4096) { - PRINT(KERN_ERR, ohci->id, + PRINT(KERN_ERR, ohci->host->id, "Packet size %d (page_size: %ld) " "not yet supported\n", packet_size, PAGE_SIZE); @@ -321,7 +321,7 @@ for (i = 0; i < d->num_desc; i++) { if (dma_prog_region_alloc(&d->prg_reg[i], d->nb_cmd * sizeof(struct it_dma_prg), ohci->dev)) { - PRINT(KERN_ERR, ohci->id, "Failed to allocate dma it prg"); + PRINT(KERN_ERR, ohci->host->id, "Failed to allocate dma it prg"); free_dma_iso_ctx(d); return NULL; } @@ -339,22 +339,22 @@ GFP_KERNEL); if (d->buffer_status == NULL) { - PRINT(KERN_ERR, ohci->id, "Failed to allocate buffer_status"); + PRINT(KERN_ERR, ohci->host->id, "Failed to allocate buffer_status"); free_dma_iso_ctx(d); return NULL; } if (d->buffer_time == NULL) { - PRINT(KERN_ERR, ohci->id, "Failed to allocate buffer_time"); + PRINT(KERN_ERR, ohci->host->id, "Failed to allocate buffer_time"); free_dma_iso_ctx(d); return NULL; } if (d->last_used_cmd == NULL) { - PRINT(KERN_ERR, ohci->id, "Failed to allocate last_used_cmd"); + PRINT(KERN_ERR, ohci->host->id, "Failed to allocate last_used_cmd"); free_dma_iso_ctx(d); return NULL; } if (d->next_buffer == NULL) { - PRINT(KERN_ERR, ohci->id, "Failed to allocate next_buffer"); + PRINT(KERN_ERR, ohci->host->id, "Failed to allocate next_buffer"); free_dma_iso_ctx(d); return NULL; } @@ -365,7 +365,7 @@ spin_lock_init(&d->lock); - PRINT(KERN_INFO, ohci->id, "Iso %s DMA: %d buffers " + PRINT(KERN_INFO, ohci->host->id, "Iso %s DMA: %d buffers " "of size %d allocated for a frame size %d, each with %d prgs", (type == OHCI_ISO_RECEIVE) ? "receive" : "transmit", d->num_desc, d->buf_size, d->frame_size, d->nb_cmd); @@ -725,7 +725,7 @@ for (i=0; iISO_channel_usage & mask)) { v.channel = i; - PRINT(KERN_INFO, ohci->id, "Found free channel %d", i); + PRINT(KERN_INFO, ohci->host->id, "Found free channel %d", i); break; } mask = mask << 1; @@ -733,7 +733,7 @@ } if (v.channel<0 || v.channel>(ISO_CHANNELS-1)) { - PRINT(KERN_ERR, ohci->id, + PRINT(KERN_ERR, ohci->host->id, "Iso channel %d out of bounds", v.channel); return -EFAULT; } @@ -743,26 +743,26 @@ (u32)(ohci->ISO_channel_usage>>32), (u32)(ohci->ISO_channel_usage&0xffffffff)); if (ohci->ISO_channel_usage & mask) { - PRINT(KERN_ERR, ohci->id, + PRINT(KERN_ERR, ohci->host->id, "Channel %d is already taken", v.channel); return -EFAULT; } ohci->ISO_channel_usage |= mask; if (v.buf_size == 0 || v.buf_size > VIDEO1394_MAX_SIZE) { - PRINT(KERN_ERR, ohci->id, + PRINT(KERN_ERR, ohci->host->id, "Invalid %d length buffer requested",v.buf_size); return -EFAULT; } if (v.nb_buffers == 0 || v.nb_buffers > VIDEO1394_MAX_SIZE) { - PRINT(KERN_ERR, ohci->id, + PRINT(KERN_ERR, ohci->host->id, "Invalid %d buffers requested",v.nb_buffers); return -EFAULT; } if (v.nb_buffers * v.buf_size > VIDEO1394_MAX_SIZE) { - PRINT(KERN_ERR, ohci->id, + PRINT(KERN_ERR, ohci->host->id, "%d buffers of size %d bytes is too big", v.nb_buffers, v.buf_size); return -EFAULT; @@ -774,7 +774,7 @@ v.channel, 0); if (d == NULL) { - PRINT(KERN_ERR, ohci->id, + PRINT(KERN_ERR, ohci->host->id, "Couldn't allocate ir context"); return -EFAULT; } @@ -785,7 +785,7 @@ v.buf_size = d->buf_size; list_add_tail(&d->link, &ctx->context_list); - PRINT(KERN_INFO, ohci->id, + PRINT(KERN_INFO, ohci->host->id, "iso context %d listen on channel %d", d->ctx, v.channel); } @@ -795,7 +795,7 @@ v.channel, v.packet_size); if (d == NULL) { - PRINT(KERN_ERR, ohci->id, + PRINT(KERN_ERR, ohci->host->id, "Couldn't allocate it context"); return -EFAULT; } @@ -808,7 +808,7 @@ list_add_tail(&d->link, &ctx->context_list); - PRINT(KERN_INFO, ohci->id, + PRINT(KERN_INFO, ohci->host->id, "Iso context %d talk on channel %d", d->ctx, v.channel); } @@ -829,13 +829,13 @@ return -EFAULT; if (channel<0 || channel>(ISO_CHANNELS-1)) { - PRINT(KERN_ERR, ohci->id, + PRINT(KERN_ERR, ohci->host->id, "Iso channel %d out of bound", channel); return -EFAULT; } mask = (u64)0x1<ISO_channel_usage & mask)) { - PRINT(KERN_ERR, ohci->id, + PRINT(KERN_ERR, ohci->host->id, "Channel %d is not being used", channel); return -EFAULT; } @@ -849,7 +849,7 @@ d = find_ctx(&ctx->context_list, OHCI_ISO_TRANSMIT, channel); if (d == NULL) return -EFAULT; - PRINT(KERN_INFO, ohci->id, "Iso context %d " + PRINT(KERN_INFO, ohci->host->id, "Iso context %d " "stop talking on channel %d", d->ctx, channel); free_dma_iso_ctx(d); @@ -866,7 +866,7 @@ d = find_ctx(&ctx->context_list, OHCI_ISO_RECEIVE, v.channel); if ((v.buffer<0) || (v.buffer>d->num_desc)) { - PRINT(KERN_ERR, ohci->id, + PRINT(KERN_ERR, ohci->host->id, "Buffer %d out of range",v.buffer); return -EFAULT; } @@ -874,7 +874,7 @@ spin_lock_irqsave(&d->lock,flags); if (d->buffer_status[v.buffer]==VIDEO1394_BUFFER_QUEUED) { - PRINT(KERN_ERR, ohci->id, + PRINT(KERN_ERR, ohci->host->id, "Buffer %d is already used",v.buffer); spin_unlock_irqrestore(&d->lock,flags); return -EFAULT; @@ -895,7 +895,7 @@ if (!(reg_read(ohci, d->ctrlSet) & 0x8000)) { - DBGMSG(ohci->id, "Starting iso DMA ctx=%d",d->ctx); + DBGMSG(ohci->host->id, "Starting iso DMA ctx=%d",d->ctx); /* Tell the controller where the first program is */ reg_write(ohci, d->cmdPtr, @@ -907,7 +907,7 @@ else { /* Wake up dma context if necessary */ if (!(reg_read(ohci, d->ctrlSet) & 0x400)) { - PRINT(KERN_INFO, ohci->id, + PRINT(KERN_INFO, ohci->host->id, "Waking up iso dma ctx=%d", d->ctx); reg_write(ohci, d->ctrlSet, 0x1000); } @@ -928,7 +928,7 @@ d = find_ctx(&ctx->context_list, OHCI_ISO_RECEIVE, v.channel); if ((v.buffer<0) || (v.buffer>d->num_desc)) { - PRINT(KERN_ERR, ohci->id, + PRINT(KERN_ERR, ohci->host->id, "Buffer %d out of range",v.buffer); return -EFAULT; } @@ -970,7 +970,7 @@ d->buffer_status[v.buffer]=VIDEO1394_BUFFER_FREE; break; default: - PRINT(KERN_ERR, ohci->id, + PRINT(KERN_ERR, ohci->host->id, "Buffer %d is not queued",v.buffer); spin_unlock_irqrestore(&d->lock, flags); return -EFAULT; @@ -1011,7 +1011,7 @@ d = find_ctx(&ctx->context_list, OHCI_ISO_TRANSMIT, v.channel); if ((v.buffer<0) || (v.buffer>d->num_desc)) { - PRINT(KERN_ERR, ohci->id, + PRINT(KERN_ERR, ohci->host->id, "Buffer %d out of range",v.buffer); return -EFAULT; } @@ -1038,7 +1038,7 @@ spin_lock_irqsave(&d->lock,flags); if (d->buffer_status[v.buffer]!=VIDEO1394_BUFFER_FREE) { - PRINT(KERN_ERR, ohci->id, + PRINT(KERN_ERR, ohci->host->id, "Buffer %d is already used",v.buffer); spin_unlock_irqrestore(&d->lock,flags); if (qv.packet_sizes) @@ -1075,7 +1075,7 @@ if (!(reg_read(ohci, d->ctrlSet) & 0x8000)) { - DBGMSG(ohci->id, "Starting iso transmit DMA ctx=%d", + DBGMSG(ohci->host->id, "Starting iso transmit DMA ctx=%d", d->ctx); put_timestamp(ohci, d, d->last_buffer); @@ -1089,7 +1089,7 @@ else { /* Wake up dma context if necessary */ if (!(reg_read(ohci, d->ctrlSet) & 0x400)) { - PRINT(KERN_INFO, ohci->id, + PRINT(KERN_INFO, ohci->host->id, "Waking up iso transmit dma ctx=%d", d->ctx); put_timestamp(ohci, d, d->last_buffer); @@ -1114,7 +1114,7 @@ d = find_ctx(&ctx->context_list, OHCI_ISO_TRANSMIT, v.channel); if ((v.buffer<0) || (v.buffer>d->num_desc)) { - PRINT(KERN_ERR, ohci->id, + PRINT(KERN_ERR, ohci->host->id, "Buffer %d out of range",v.buffer); return -EFAULT; } @@ -1140,7 +1140,7 @@ d->buffer_status[v.buffer]=VIDEO1394_BUFFER_FREE; return 0; default: - PRINT(KERN_ERR, ohci->id, + PRINT(KERN_ERR, ohci->host->id, "Buffer %d is not queued",v.buffer); return -EFAULT; } @@ -1166,7 +1166,7 @@ lock_kernel(); if (ctx->current_ctx == NULL) { - PRINT(KERN_ERR, ctx->ohci->id, "Current iso context not set"); + PRINT(KERN_ERR, ctx->ohci->host->id, "Current iso context not set"); } else res = dma_region_mmap(&ctx->current_ctx->dma, file, vma); unlock_kernel(); @@ -1186,7 +1186,7 @@ ctx = kmalloc(sizeof(struct file_ctx), GFP_KERNEL); if (ctx == NULL) { - PRINT(KERN_ERR, ohci->id, "Cannot malloc file_ctx"); + PRINT(KERN_ERR, ohci->host->id, "Cannot malloc file_ctx"); return -ENOMEM; } @@ -1213,11 +1213,11 @@ mask = (u64) 1 << d->channel; if (!(ohci->ISO_channel_usage & mask)) - PRINT(KERN_ERR, ohci->id, "On release: Channel %d " + PRINT(KERN_ERR, ohci->host->id, "On release: Channel %d " "is not being used", d->channel); else ohci->ISO_channel_usage &= ~mask; - PRINT(KERN_INFO, ohci->id, "On release: Iso %s context " + PRINT(KERN_INFO, ohci->host->id, "On release: Iso %s context " "%d stop listening on channel %d", d->type == OHCI_ISO_RECEIVE ? "receive" : "transmit", d->ctx, d->channel); @@ -1278,17 +1278,17 @@ ohci = (struct ti_ohci *)host->hostdata; if (!hpsb_create_hostinfo(&video1394_highlevel, host, 0)) { - PRINT(KERN_ERR, ohci->id, "Cannot allocate hostinfo"); + PRINT(KERN_ERR, ohci->host->id, "Cannot allocate hostinfo"); return; } hpsb_set_hostinfo(&video1394_highlevel, host, ohci); - hpsb_set_hostinfo_key(&video1394_highlevel, host, ohci->id); + hpsb_set_hostinfo_key(&video1394_highlevel, host, ohci->host->id); - minor = IEEE1394_MINOR_BLOCK_VIDEO1394 * 16 + ohci->id; + minor = IEEE1394_MINOR_BLOCK_VIDEO1394 * 16 + ohci->host->id; devfs_mk_cdev(MKDEV(IEEE1394_MAJOR, minor), S_IFCHR | S_IRUSR | S_IWUSR, - "%s/%d", VIDEO1394_DRIVER_NAME, ohci->id); + "%s/%d", VIDEO1394_DRIVER_NAME, ohci->host->id); } @@ -1297,7 +1297,7 @@ struct ti_ohci *ohci = hpsb_get_hostinfo(&video1394_highlevel, host); if (ohci) - devfs_remove("%s/%d", VIDEO1394_DRIVER_NAME, ohci->id); + devfs_remove("%s/%d", VIDEO1394_DRIVER_NAME, ohci->host->id); return; } @@ -1459,7 +1459,7 @@ video1394_cdev.owner = THIS_MODULE; kobject_set_name(&video1394_cdev.kobj, VIDEO1394_DRIVER_NAME); ret = cdev_add(&video1394_cdev, IEEE1394_VIDEO1394_DEV, 16); - if (cdev_add(&video1394_cdev, IEEE1394_VIDEO1394_DEV, 16)) { + if (ret) { PRINT_G(KERN_ERR, "video1394: unable to get minor device block"); return ret; }