Commit 64106104 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6:
  ieee1394: fix host device registering when nodemgr disabled
  ieee1394: video1394: DMA fix
  ieee1394: raw1394: prevent unloading of low-level driver
  ieee1394: dv1394: tidy up card removal
  ieee1394: dv1394: fix CardBus card ejection
  ieee1394: sbp2: lower block queue alignment requirement
  ieee1394: sbp2: remove bogus "emulated" host flag
  ieee1394: save one word in struct hpsb_host
  ieee1394: restore config ROM when resuming
  ieee1394: ohci1394: drop pcmcia-cs compatibility code
  ieee1394: nodemgr: check info_length in ROM header earlier
  the scheduled IEEE1394_OUI_DB removal
  the scheduled IEEE1394_EXPORT_FULL_API removal
  ieee1394: sbp2: use a better wildcard for blacklist
  Add PCI class ID for firewire OHCI controllers.
  ieee1394: modified csr1212_key_id_type_map to support lisight
parents beda9f3a 91efa462
...@@ -50,22 +50,6 @@ Who: Dan Dennedy <dan@dennedy.org>, Stefan Richter <stefanr@s5r6.in-berlin.de> ...@@ -50,22 +50,6 @@ Who: Dan Dennedy <dan@dennedy.org>, Stefan Richter <stefanr@s5r6.in-berlin.de>
--------------------------- ---------------------------
What: ieee1394 core's unused exports (CONFIG_IEEE1394_EXPORT_FULL_API)
When: January 2007
Why: There are no projects known to use these exported symbols, except
dfg1394 (uses one symbol whose functionality is core-internal now).
Who: Stefan Richter <stefanr@s5r6.in-berlin.de>
---------------------------
What: ieee1394's *_oui sysfs attributes (CONFIG_IEEE1394_OUI_DB)
When: January 2007
Files: drivers/ieee1394/: oui.db, oui2c.sh
Why: big size, little value
Who: Stefan Richter <stefanr@s5r6.in-berlin.de>
---------------------------
What: Video4Linux API 1 ioctls and video_decoder.h from Video devices. What: Video4Linux API 1 ioctls and video_decoder.h from Video devices.
When: December 2006 When: December 2006
Why: V4L1 AP1 was replaced by V4L2 API. during migration from 2.4 to 2.6 Why: V4L1 AP1 was replaced by V4L2 API. during migration from 2.4 to 2.6
......
...@@ -35,20 +35,6 @@ config IEEE1394_VERBOSEDEBUG ...@@ -35,20 +35,6 @@ config IEEE1394_VERBOSEDEBUG
Say Y if you really want or need the debugging output, everyone Say Y if you really want or need the debugging output, everyone
else says N. else says N.
config IEEE1394_OUI_DB
bool "OUI Database built-in (deprecated)"
depends on IEEE1394
help
If you say Y here, then an OUI list (vendor unique ID's) will be
compiled into the ieee1394 module. This doesn't really do much
except being able to display the vendor of a hardware node. The
downside is that it adds about 300k to the size of the module,
or kernel (depending on whether you compile ieee1394 as a
module, or static in the kernel).
This option is not needed for userspace programs like gscanbus
to show this information.
config IEEE1394_EXTRA_CONFIG_ROMS config IEEE1394_EXTRA_CONFIG_ROMS
bool "Build in extra config rom entries for certain functionality" bool "Build in extra config rom entries for certain functionality"
depends on IEEE1394 depends on IEEE1394
...@@ -66,13 +52,6 @@ config IEEE1394_CONFIG_ROM_IP1394 ...@@ -66,13 +52,6 @@ config IEEE1394_CONFIG_ROM_IP1394
with MacOSX and WinXP IP-over-1394), enable this option and the with MacOSX and WinXP IP-over-1394), enable this option and the
eth1394 option below. eth1394 option below.
config IEEE1394_EXPORT_FULL_API
bool "Export all symbols of ieee1394's API (deprecated)"
depends on IEEE1394
default n
help
This option will be removed soon. Don't worry, say N.
comment "Device Drivers" comment "Device Drivers"
depends on IEEE1394 depends on IEEE1394
......
...@@ -5,9 +5,6 @@ ...@@ -5,9 +5,6 @@
ieee1394-objs := ieee1394_core.o ieee1394_transactions.o hosts.o \ ieee1394-objs := ieee1394_core.o ieee1394_transactions.o hosts.o \
highlevel.o csr.o nodemgr.o dma.o iso.o \ highlevel.o csr.o nodemgr.o dma.o iso.o \
csr1212.o config_roms.o csr1212.o config_roms.o
ifdef CONFIG_IEEE1394_OUI_DB
ieee1394-objs += oui.o
endif
obj-$(CONFIG_IEEE1394) += ieee1394.o obj-$(CONFIG_IEEE1394) += ieee1394.o
obj-$(CONFIG_IEEE1394_PCILYNX) += pcilynx.o obj-$(CONFIG_IEEE1394_PCILYNX) += pcilynx.o
...@@ -18,10 +15,3 @@ obj-$(CONFIG_IEEE1394_SBP2) += sbp2.o ...@@ -18,10 +15,3 @@ obj-$(CONFIG_IEEE1394_SBP2) += sbp2.o
obj-$(CONFIG_IEEE1394_DV1394) += dv1394.o obj-$(CONFIG_IEEE1394_DV1394) += dv1394.o
obj-$(CONFIG_IEEE1394_ETH1394) += eth1394.o obj-$(CONFIG_IEEE1394_ETH1394) += eth1394.o
quiet_cmd_oui2c = OUI2C $@
cmd_oui2c = $(CONFIG_SHELL) $(srctree)/$(src)/oui2c.sh < $< > $@
targets := oui.c
$(obj)/oui.o: $(obj)/oui.c
$(obj)/oui.c: $(src)/oui.db $(src)/oui2c.sh FORCE
$(call if_changed,oui2c)
...@@ -47,14 +47,14 @@ ...@@ -47,14 +47,14 @@
#define __D (1 << CSR1212_KV_TYPE_DIRECTORY) #define __D (1 << CSR1212_KV_TYPE_DIRECTORY)
#define __L (1 << CSR1212_KV_TYPE_LEAF) #define __L (1 << CSR1212_KV_TYPE_LEAF)
static const u_int8_t csr1212_key_id_type_map[0x30] = { static const u_int8_t csr1212_key_id_type_map[0x30] = {
0, /* Reserved */ __C, /* used by Apple iSight */
__D | __L, /* Descriptor */ __D | __L, /* Descriptor */
__I | __D | __L, /* Bus_Dependent_Info */ __I | __D | __L, /* Bus_Dependent_Info */
__I | __D | __L, /* Vendor */ __I | __D | __L, /* Vendor */
__I, /* Hardware_Version */ __I, /* Hardware_Version */
0, 0, /* Reserved */ 0, 0, /* Reserved */
__D | __L, /* Module */ __D | __L | __I, /* Module */
0, 0, 0, 0, /* Reserved */ __I, 0, 0, 0, /* used by Apple iSight, Reserved */
__I, /* Node_Capabilities */ __I, /* Node_Capabilities */
__L, /* EUI_64 */ __L, /* EUI_64 */
0, 0, 0, /* Reserved */ 0, 0, 0, /* Reserved */
...@@ -1234,6 +1234,12 @@ static int csr1212_parse_bus_info_block(struct csr1212_csr *csr) ...@@ -1234,6 +1234,12 @@ static int csr1212_parse_bus_info_block(struct csr1212_csr *csr)
csr->private); csr->private);
if (ret != CSR1212_SUCCESS) if (ret != CSR1212_SUCCESS)
return ret; return ret;
/* check ROM header's info_length */
if (i == 0 &&
CSR1212_BE32_TO_CPU(csr->cache_head->data[0]) >> 24 !=
bytes_to_quads(csr->bus_info_len) - 1)
return CSR1212_EINVAL;
} }
bi = (struct csr1212_bus_info_block_img*)csr->cache_head->data; bi = (struct csr1212_bus_info_block_img*)csr->cache_head->data;
...@@ -1250,9 +1256,6 @@ static int csr1212_parse_bus_info_block(struct csr1212_csr *csr) ...@@ -1250,9 +1256,6 @@ static int csr1212_parse_bus_info_block(struct csr1212_csr *csr)
return ret; return ret;
} }
if (bytes_to_quads(csr->bus_info_len - sizeof(csr1212_quad_t)) != bi->length)
return CSR1212_EINVAL;
#if 0 #if 0
/* Apparently there are too many differnt wrong implementations of the /* Apparently there are too many differnt wrong implementations of the
* CRC algorithm that verifying them is moot. */ * CRC algorithm that verifying them is moot. */
......
...@@ -2255,49 +2255,37 @@ static int dv1394_init(struct ti_ohci *ohci, enum pal_or_ntsc format, enum modes ...@@ -2255,49 +2255,37 @@ static int dv1394_init(struct ti_ohci *ohci, enum pal_or_ntsc format, enum modes
return 0; return 0;
} }
static void dv1394_un_init(struct video_card *video) static void dv1394_remove_host(struct hpsb_host *host)
{ {
/* obviously nobody has the driver open at this point */ struct video_card *video, *tmp_video;
do_dv1394_shutdown(video, 1);
kfree(video);
}
static void dv1394_remove_host (struct hpsb_host *host)
{
struct video_card *video;
unsigned long flags; unsigned long flags;
int id = host->id; int found_ohci_card = 0;
/* We only work with the OHCI-1394 driver */
if (strcmp(host->driver->name, OHCI1394_DRIVER_NAME))
return;
/* find the corresponding video_cards */
do { do {
struct video_card *tmp_vid;
video = NULL; video = NULL;
spin_lock_irqsave(&dv1394_cards_lock, flags); spin_lock_irqsave(&dv1394_cards_lock, flags);
list_for_each_entry(tmp_vid, &dv1394_cards, list) { list_for_each_entry(tmp_video, &dv1394_cards, list) {
if ((tmp_vid->id >> 2) == id) { if ((tmp_video->id >> 2) == host->id) {
list_del(&tmp_vid->list); list_del(&tmp_video->list);
video = tmp_vid; video = tmp_video;
found_ohci_card = 1;
break; break;
} }
} }
spin_unlock_irqrestore(&dv1394_cards_lock, flags); spin_unlock_irqrestore(&dv1394_cards_lock, flags);
if (video) if (video) {
dv1394_un_init(video); do_dv1394_shutdown(video, 1);
} while (video != NULL); kfree(video);
}
} while (video);
class_device_destroy(hpsb_protocol_class, if (found_ohci_card)
MKDEV(IEEE1394_MAJOR, IEEE1394_MINOR_BLOCK_DV1394 * 16 + (id<<2))); class_device_destroy(hpsb_protocol_class, MKDEV(IEEE1394_MAJOR,
IEEE1394_MINOR_BLOCK_DV1394 * 16 + (host->id << 2)));
} }
static void dv1394_add_host (struct hpsb_host *host) static void dv1394_add_host(struct hpsb_host *host)
{ {
struct ti_ohci *ohci; struct ti_ohci *ohci;
int id = host->id; int id = host->id;
......
...@@ -190,14 +190,19 @@ int hpsb_add_host(struct hpsb_host *host) ...@@ -190,14 +190,19 @@ int hpsb_add_host(struct hpsb_host *host)
{ {
if (hpsb_default_host_entry(host)) if (hpsb_default_host_entry(host))
return -ENOMEM; return -ENOMEM;
hpsb_add_extra_config_roms(host); hpsb_add_extra_config_roms(host);
highlevel_add_host(host); highlevel_add_host(host);
return 0; return 0;
} }
void hpsb_resume_host(struct hpsb_host *host)
{
if (host->driver->set_hw_config_rom)
host->driver->set_hw_config_rom(host,
host->csr.rom->bus_info_data);
host->driver->devctl(host, RESET_BUS, SHORT_RESET);
}
void hpsb_remove_host(struct hpsb_host *host) void hpsb_remove_host(struct hpsb_host *host)
{ {
host->is_shutdown = 1; host->is_shutdown = 1;
...@@ -206,9 +211,7 @@ void hpsb_remove_host(struct hpsb_host *host) ...@@ -206,9 +211,7 @@ void hpsb_remove_host(struct hpsb_host *host)
flush_scheduled_work(); flush_scheduled_work();
host->driver = &dummy_driver; host->driver = &dummy_driver;
highlevel_remove_host(host); highlevel_remove_host(host);
hpsb_remove_extra_config_roms(host); hpsb_remove_extra_config_roms(host);
class_device_unregister(&host->class_dev); class_device_unregister(&host->class_dev);
......
...@@ -61,9 +61,9 @@ struct hpsb_host { ...@@ -61,9 +61,9 @@ struct hpsb_host {
struct device device; struct device device;
struct class_device class_dev; struct class_device class_dev;
int update_config_rom;
struct delayed_work delayed_reset; struct delayed_work delayed_reset;
unsigned int config_roms; unsigned config_roms:31;
unsigned update_config_rom:1;
struct list_head addr_space; struct list_head addr_space;
u64 low_addr_space; /* upper bound of physical DMA area */ u64 low_addr_space; /* upper bound of physical DMA area */
...@@ -200,7 +200,8 @@ struct hpsb_host_driver { ...@@ -200,7 +200,8 @@ struct hpsb_host_driver {
struct hpsb_host *hpsb_alloc_host(struct hpsb_host_driver *drv, size_t extra, struct hpsb_host *hpsb_alloc_host(struct hpsb_host_driver *drv, size_t extra,
struct device *dev); struct device *dev);
int hpsb_add_host(struct hpsb_host *host); int hpsb_add_host(struct hpsb_host *host);
void hpsb_remove_host(struct hpsb_host *h); void hpsb_resume_host(struct hpsb_host *host);
void hpsb_remove_host(struct hpsb_host *host);
/* Updates the configuration rom image of a host. rom_version must be the /* Updates the configuration rom image of a host. rom_version must be the
* current version, otherwise it will fail with return value -1. If this * current version, otherwise it will fail with return value -1. If this
......
...@@ -1178,6 +1178,7 @@ module_exit(ieee1394_cleanup); ...@@ -1178,6 +1178,7 @@ module_exit(ieee1394_cleanup);
/** hosts.c **/ /** hosts.c **/
EXPORT_SYMBOL(hpsb_alloc_host); EXPORT_SYMBOL(hpsb_alloc_host);
EXPORT_SYMBOL(hpsb_add_host); EXPORT_SYMBOL(hpsb_add_host);
EXPORT_SYMBOL(hpsb_resume_host);
EXPORT_SYMBOL(hpsb_remove_host); EXPORT_SYMBOL(hpsb_remove_host);
EXPORT_SYMBOL(hpsb_update_config_rom_image); EXPORT_SYMBOL(hpsb_update_config_rom_image);
...@@ -1195,10 +1196,6 @@ EXPORT_SYMBOL(hpsb_selfid_complete); ...@@ -1195,10 +1196,6 @@ EXPORT_SYMBOL(hpsb_selfid_complete);
EXPORT_SYMBOL(hpsb_packet_sent); EXPORT_SYMBOL(hpsb_packet_sent);
EXPORT_SYMBOL(hpsb_packet_received); EXPORT_SYMBOL(hpsb_packet_received);
EXPORT_SYMBOL_GPL(hpsb_disable_irm); EXPORT_SYMBOL_GPL(hpsb_disable_irm);
#ifdef CONFIG_IEEE1394_EXPORT_FULL_API
EXPORT_SYMBOL(hpsb_send_phy_config);
EXPORT_SYMBOL(hpsb_send_packet_and_wait);
#endif
/** ieee1394_transactions.c **/ /** ieee1394_transactions.c **/
EXPORT_SYMBOL(hpsb_get_tlabel); EXPORT_SYMBOL(hpsb_get_tlabel);
...@@ -1229,20 +1226,12 @@ EXPORT_SYMBOL(hpsb_set_hostinfo_key); ...@@ -1229,20 +1226,12 @@ EXPORT_SYMBOL(hpsb_set_hostinfo_key);
EXPORT_SYMBOL(hpsb_get_hostinfo_bykey); EXPORT_SYMBOL(hpsb_get_hostinfo_bykey);
EXPORT_SYMBOL(hpsb_set_hostinfo); EXPORT_SYMBOL(hpsb_set_hostinfo);
EXPORT_SYMBOL(highlevel_host_reset); EXPORT_SYMBOL(highlevel_host_reset);
#ifdef CONFIG_IEEE1394_EXPORT_FULL_API
EXPORT_SYMBOL(highlevel_add_host);
EXPORT_SYMBOL(highlevel_remove_host);
#endif
/** nodemgr.c **/ /** nodemgr.c **/
EXPORT_SYMBOL(hpsb_node_fill_packet); EXPORT_SYMBOL(hpsb_node_fill_packet);
EXPORT_SYMBOL(hpsb_node_write); EXPORT_SYMBOL(hpsb_node_write);
EXPORT_SYMBOL(__hpsb_register_protocol); EXPORT_SYMBOL(__hpsb_register_protocol);
EXPORT_SYMBOL(hpsb_unregister_protocol); EXPORT_SYMBOL(hpsb_unregister_protocol);
#ifdef CONFIG_IEEE1394_EXPORT_FULL_API
EXPORT_SYMBOL(ieee1394_bus_type);
EXPORT_SYMBOL(nodemgr_for_each_host);
#endif
/** csr.c **/ /** csr.c **/
EXPORT_SYMBOL(hpsb_update_config_rom); EXPORT_SYMBOL(hpsb_update_config_rom);
...@@ -1287,13 +1276,3 @@ EXPORT_SYMBOL(csr1212_read); ...@@ -1287,13 +1276,3 @@ EXPORT_SYMBOL(csr1212_read);
EXPORT_SYMBOL(csr1212_parse_keyval); EXPORT_SYMBOL(csr1212_parse_keyval);
EXPORT_SYMBOL(_csr1212_read_keyval); EXPORT_SYMBOL(_csr1212_read_keyval);
EXPORT_SYMBOL(_csr1212_destroy_keyval); EXPORT_SYMBOL(_csr1212_destroy_keyval);
#ifdef CONFIG_IEEE1394_EXPORT_FULL_API
EXPORT_SYMBOL(csr1212_create_csr);
EXPORT_SYMBOL(csr1212_init_local_csr);
EXPORT_SYMBOL(csr1212_new_immediate);
EXPORT_SYMBOL(csr1212_associate_keyval);
EXPORT_SYMBOL(csr1212_new_string_descriptor_leaf);
EXPORT_SYMBOL(csr1212_destroy_csr);
EXPORT_SYMBOL(csr1212_generate_csr_image);
EXPORT_SYMBOL(csr1212_parse_csr);
#endif
...@@ -41,22 +41,6 @@ struct nodemgr_csr_info { ...@@ -41,22 +41,6 @@ struct nodemgr_csr_info {
}; };
static char *nodemgr_find_oui_name(int oui)
{
#ifdef CONFIG_IEEE1394_OUI_DB
extern struct oui_list_struct {
int oui;
char *name;
} oui_list[];
int i;
for (i = 0; oui_list[i].name; i++)
if (oui_list[i].oui == oui)
return oui_list[i].name;
#endif
return NULL;
}
/* /*
* Correct the speed map entry. This is necessary * Correct the speed map entry. This is necessary
* - for nodes with link speed < phy speed, * - for nodes with link speed < phy speed,
...@@ -274,7 +258,6 @@ static struct device_driver nodemgr_mid_layer_driver = { ...@@ -274,7 +258,6 @@ static struct device_driver nodemgr_mid_layer_driver = {
struct device nodemgr_dev_template_host = { struct device nodemgr_dev_template_host = {
.bus = &ieee1394_bus_type, .bus = &ieee1394_bus_type,
.release = nodemgr_release_host, .release = nodemgr_release_host,
.driver = &nodemgr_mid_layer_driver,
}; };
...@@ -473,11 +456,9 @@ fw_attr(ne, struct node_entry, nodeid, unsigned int, "0x%04x\n") ...@@ -473,11 +456,9 @@ fw_attr(ne, struct node_entry, nodeid, unsigned int, "0x%04x\n")
fw_attr(ne, struct node_entry, vendor_id, unsigned int, "0x%06x\n") fw_attr(ne, struct node_entry, vendor_id, unsigned int, "0x%06x\n")
fw_attr_td(ne, struct node_entry, vendor_name_kv) fw_attr_td(ne, struct node_entry, vendor_name_kv)
fw_attr(ne, struct node_entry, vendor_oui, const char *, "%s\n")
fw_attr(ne, struct node_entry, guid, unsigned long long, "0x%016Lx\n") fw_attr(ne, struct node_entry, guid, unsigned long long, "0x%016Lx\n")
fw_attr(ne, struct node_entry, guid_vendor_id, unsigned int, "0x%06x\n") fw_attr(ne, struct node_entry, guid_vendor_id, unsigned int, "0x%06x\n")
fw_attr(ne, struct node_entry, guid_vendor_oui, const char *, "%s\n")
fw_attr(ne, struct node_entry, in_limbo, int, "%d\n"); fw_attr(ne, struct node_entry, in_limbo, int, "%d\n");
static struct device_attribute *const fw_ne_attrs[] = { static struct device_attribute *const fw_ne_attrs[] = {
...@@ -503,7 +484,6 @@ fw_attr(ud, struct unit_directory, model_id, unsigned int, "0x%06x\n") ...@@ -503,7 +484,6 @@ fw_attr(ud, struct unit_directory, model_id, unsigned int, "0x%06x\n")
fw_attr(ud, struct unit_directory, specifier_id, unsigned int, "0x%06x\n") fw_attr(ud, struct unit_directory, specifier_id, unsigned int, "0x%06x\n")
fw_attr(ud, struct unit_directory, version, unsigned int, "0x%06x\n") fw_attr(ud, struct unit_directory, version, unsigned int, "0x%06x\n")
fw_attr_td(ud, struct unit_directory, vendor_name_kv) fw_attr_td(ud, struct unit_directory, vendor_name_kv)
fw_attr(ud, struct unit_directory, vendor_oui, const char *, "%s\n")
fw_attr_td(ud, struct unit_directory, model_name_kv) fw_attr_td(ud, struct unit_directory, model_name_kv)
static struct device_attribute *const fw_ud_attrs[] = { static struct device_attribute *const fw_ud_attrs[] = {
...@@ -865,7 +845,6 @@ static struct node_entry *nodemgr_create_node(octlet_t guid, struct csr1212_csr ...@@ -865,7 +845,6 @@ static struct node_entry *nodemgr_create_node(octlet_t guid, struct csr1212_csr
ne->guid = guid; ne->guid = guid;
ne->guid_vendor_id = (guid >> 40) & 0xffffff; ne->guid_vendor_id = (guid >> 40) & 0xffffff;
ne->guid_vendor_oui = nodemgr_find_oui_name(ne->guid_vendor_id);
ne->csr = csr; ne->csr = csr;
memcpy(&ne->device, &nodemgr_dev_template_ne, memcpy(&ne->device, &nodemgr_dev_template_ne,
...@@ -885,9 +864,6 @@ static struct node_entry *nodemgr_create_node(octlet_t guid, struct csr1212_csr ...@@ -885,9 +864,6 @@ static struct node_entry *nodemgr_create_node(octlet_t guid, struct csr1212_csr
goto fail_classdevreg; goto fail_classdevreg;
get_device(&ne->device); get_device(&ne->device);
if (ne->guid_vendor_oui &&
device_create_file(&ne->device, &dev_attr_ne_guid_vendor_oui))
goto fail_addoiu;
nodemgr_create_ne_dev_files(ne); nodemgr_create_ne_dev_files(ne);
nodemgr_update_bus_options(ne); nodemgr_update_bus_options(ne);
...@@ -898,8 +874,6 @@ static struct node_entry *nodemgr_create_node(octlet_t guid, struct csr1212_csr ...@@ -898,8 +874,6 @@ static struct node_entry *nodemgr_create_node(octlet_t guid, struct csr1212_csr
return ne; return ne;
fail_addoiu:
put_device(&ne->device);
fail_classdevreg: fail_classdevreg:
device_unregister(&ne->device); device_unregister(&ne->device);
fail_devreg: fail_devreg:
...@@ -975,15 +949,10 @@ static void nodemgr_register_device(struct node_entry *ne, ...@@ -975,15 +949,10 @@ static void nodemgr_register_device(struct node_entry *ne,
goto fail_classdevreg; goto fail_classdevreg;
get_device(&ud->device); get_device(&ud->device);
if (ud->vendor_oui &&
device_create_file(&ud->device, &dev_attr_ud_vendor_oui))
goto fail_addoui;
nodemgr_create_ud_dev_files(ud); nodemgr_create_ud_dev_files(ud);
return; return;
fail_addoui:
put_device(&ud->device);
fail_classdevreg: fail_classdevreg:
device_unregister(&ud->device); device_unregister(&ud->device);
fail_devreg: fail_devreg:
...@@ -1020,9 +989,6 @@ static struct unit_directory *nodemgr_process_unit_directory ...@@ -1020,9 +989,6 @@ static struct unit_directory *nodemgr_process_unit_directory
if (kv->key.type == CSR1212_KV_TYPE_IMMEDIATE) { if (kv->key.type == CSR1212_KV_TYPE_IMMEDIATE) {
ud->vendor_id = kv->value.immediate; ud->vendor_id = kv->value.immediate;
ud->flags |= UNIT_DIRECTORY_VENDOR_ID; ud->flags |= UNIT_DIRECTORY_VENDOR_ID;
if (ud->vendor_id)
ud->vendor_oui = nodemgr_find_oui_name(ud->vendor_id);
} }
break; break;
...@@ -1153,9 +1119,6 @@ static void nodemgr_process_root_directory(struct host_info *hi, struct node_ent ...@@ -1153,9 +1119,6 @@ static void nodemgr_process_root_directory(struct host_info *hi, struct node_ent
switch (kv->key.id) { switch (kv->key.id) {
case CSR1212_KV_ID_VENDOR: case CSR1212_KV_ID_VENDOR:
ne->vendor_id = kv->value.immediate; ne->vendor_id = kv->value.immediate;
if (ne->vendor_id)
ne->vendor_oui = nodemgr_find_oui_name(ne->vendor_id);
break; break;
case CSR1212_KV_ID_NODE_CAPABILITIES: case CSR1212_KV_ID_NODE_CAPABILITIES:
...@@ -1183,9 +1146,6 @@ static void nodemgr_process_root_directory(struct host_info *hi, struct node_ent ...@@ -1183,9 +1146,6 @@ static void nodemgr_process_root_directory(struct host_info *hi, struct node_ent
last_key_id = kv->key.id; last_key_id = kv->key.id;
} }
if (ne->vendor_oui &&
device_create_file(&ne->device, &dev_attr_ne_vendor_oui))
goto fail;
if (ne->vendor_name_kv && if (ne->vendor_name_kv &&
device_create_file(&ne->device, &dev_attr_ne_vendor_name_kv)) device_create_file(&ne->device, &dev_attr_ne_vendor_name_kv))
goto fail; goto fail;
...@@ -1889,22 +1849,31 @@ int init_ieee1394_nodemgr(void) ...@@ -1889,22 +1849,31 @@ int init_ieee1394_nodemgr(void)
error = class_register(&nodemgr_ne_class); error = class_register(&nodemgr_ne_class);
if (error) if (error)
return error; goto fail_ne;
error = class_register(&nodemgr_ud_class); error = class_register(&nodemgr_ud_class);
if (error) { if (error)
class_unregister(&nodemgr_ne_class); goto fail_ud;
return error;
}
error = driver_register(&nodemgr_mid_layer_driver); error = driver_register(&nodemgr_mid_layer_driver);
if (error)
goto fail_ml;
/* This driver is not used if nodemgr is off (disable_nodemgr=1). */
nodemgr_dev_template_host.driver = &nodemgr_mid_layer_driver;
hpsb_register_highlevel(&nodemgr_highlevel); hpsb_register_highlevel(&nodemgr_highlevel);
return 0; return 0;
fail_ml:
class_unregister(&nodemgr_ud_class);
fail_ud:
class_unregister(&nodemgr_ne_class);
fail_ne:
return error;
} }
void cleanup_ieee1394_nodemgr(void) void cleanup_ieee1394_nodemgr(void)
{ {
hpsb_unregister_highlevel(&nodemgr_highlevel); hpsb_unregister_highlevel(&nodemgr_highlevel);
driver_unregister(&nodemgr_mid_layer_driver);
class_unregister(&nodemgr_ud_class); class_unregister(&nodemgr_ud_class);
class_unregister(&nodemgr_ne_class); class_unregister(&nodemgr_ne_class);
} }
...@@ -70,7 +70,6 @@ struct unit_directory { ...@@ -70,7 +70,6 @@ struct unit_directory {
quadlet_t vendor_id; quadlet_t vendor_id;
struct csr1212_keyval *vendor_name_kv; struct csr1212_keyval *vendor_name_kv;
const char *vendor_oui;
quadlet_t model_id; quadlet_t model_id;
struct csr1212_keyval *model_name_kv; struct csr1212_keyval *model_name_kv;
...@@ -93,7 +92,6 @@ struct unit_directory { ...@@ -93,7 +92,6 @@ struct unit_directory {
struct node_entry { struct node_entry {
u64 guid; /* GUID of this node */ u64 guid; /* GUID of this node */
u32 guid_vendor_id; /* Top 24bits of guid */ u32 guid_vendor_id; /* Top 24bits of guid */
const char *guid_vendor_oui; /* OUI name of guid vendor id */
struct hpsb_host *host; /* Host this node is attached to */ struct hpsb_host *host; /* Host this node is attached to */
nodeid_t nodeid; /* NodeID */ nodeid_t nodeid; /* NodeID */
...@@ -104,7 +102,6 @@ struct node_entry { ...@@ -104,7 +102,6 @@ struct node_entry {
/* The following is read from the config rom */ /* The following is read from the config rom */
u32 vendor_id; u32 vendor_id;
struct csr1212_keyval *vendor_name_kv; struct csr1212_keyval *vendor_name_kv;
const char *vendor_oui;
u32 capabilities; u32 capabilities;
......
...@@ -3281,14 +3281,11 @@ static int __devinit ohci1394_pci_probe(struct pci_dev *dev, ...@@ -3281,14 +3281,11 @@ static int __devinit ohci1394_pci_probe(struct pci_dev *dev,
PRINT(KERN_WARNING, "PCI resource length of 0x%llx too small!", PRINT(KERN_WARNING, "PCI resource length of 0x%llx too small!",
(unsigned long long)pci_resource_len(dev, 0)); (unsigned long long)pci_resource_len(dev, 0));
/* Seems PCMCIA handles this internally. Not sure why. Seems if (!request_mem_region(ohci_base, OHCI1394_REGISTER_SIZE,
* pretty bogus to force a driver to special case this. */ OHCI1394_DRIVER_NAME))
#ifndef PCMCIA
if (!request_mem_region (ohci_base, OHCI1394_REGISTER_SIZE, OHCI1394_DRIVER_NAME))
FAIL(-ENOMEM, "MMIO resource (0x%llx - 0x%llx) unavailable", FAIL(-ENOMEM, "MMIO resource (0x%llx - 0x%llx) unavailable",
(unsigned long long)ohci_base, (unsigned long long)ohci_base,
(unsigned long long)ohci_base + OHCI1394_REGISTER_SIZE); (unsigned long long)ohci_base + OHCI1394_REGISTER_SIZE);
#endif
ohci->init_state = OHCI_INIT_HAVE_MEM_REGION; ohci->init_state = OHCI_INIT_HAVE_MEM_REGION;
ohci->registers = ioremap(ohci_base, OHCI1394_REGISTER_SIZE); ohci->registers = ioremap(ohci_base, OHCI1394_REGISTER_SIZE);
...@@ -3509,10 +3506,8 @@ static void ohci1394_pci_remove(struct pci_dev *pdev) ...@@ -3509,10 +3506,8 @@ static void ohci1394_pci_remove(struct pci_dev *pdev)
iounmap(ohci->registers); iounmap(ohci->registers);
case OHCI_INIT_HAVE_MEM_REGION: case OHCI_INIT_HAVE_MEM_REGION:
#ifndef PCMCIA
release_mem_region(pci_resource_start(ohci->dev, 0), release_mem_region(pci_resource_start(ohci->dev, 0),
OHCI1394_REGISTER_SIZE); OHCI1394_REGISTER_SIZE);
#endif
#ifdef CONFIG_PPC_PMAC #ifdef CONFIG_PPC_PMAC
/* On UniNorth, power down the cable and turn off the chip clock /* On UniNorth, power down the cable and turn off the chip clock
...@@ -3541,9 +3536,6 @@ static int ohci1394_pci_suspend(struct pci_dev *pdev, pm_message_t state) ...@@ -3541,9 +3536,6 @@ static int ohci1394_pci_suspend(struct pci_dev *pdev, pm_message_t state)
int err; int err;
struct ti_ohci *ohci = pci_get_drvdata(pdev); struct ti_ohci *ohci = pci_get_drvdata(pdev);
printk(KERN_INFO "%s does not fully support suspend and resume yet\n",
OHCI1394_DRIVER_NAME);
if (!ohci) { if (!ohci) {
printk(KERN_ERR "%s: tried to suspend nonexisting host\n", printk(KERN_ERR "%s: tried to suspend nonexisting host\n",
OHCI1394_DRIVER_NAME); OHCI1394_DRIVER_NAME);
...@@ -3630,15 +3622,14 @@ static int ohci1394_pci_resume(struct pci_dev *pdev) ...@@ -3630,15 +3622,14 @@ static int ohci1394_pci_resume(struct pci_dev *pdev)
mdelay(50); mdelay(50);
ohci_initialize(ohci); ohci_initialize(ohci);
hpsb_resume_host(ohci->host);
return 0; return 0;
} }
#endif /* CONFIG_PM */ #endif /* CONFIG_PM */
#define PCI_CLASS_FIREWIRE_OHCI ((PCI_CLASS_SERIAL_FIREWIRE << 8) | 0x10)
static struct pci_device_id ohci1394_pci_tbl[] = { static struct pci_device_id ohci1394_pci_tbl[] = {
{ {
.class = PCI_CLASS_FIREWIRE_OHCI, .class = PCI_CLASS_SERIAL_FIREWIRE_OHCI,
.class_mask = PCI_ANY_ID, .class_mask = PCI_ANY_ID,
.vendor = PCI_ANY_ID, .vendor = PCI_ANY_ID,
.device = PCI_ANY_ID, .device = PCI_ANY_ID,
......
This diff is collapsed.
#!/bin/sh
cat <<EOF
/* Generated file for OUI database */
#ifdef CONFIG_IEEE1394_OUI_DB
struct oui_list_struct {
int oui;
char *name;
} oui_list[] = {
EOF
while read oui name; do
echo " { 0x$oui, \"$name\" },"
done
cat <<EOF
};
#endif /* CONFIG_IEEE1394_OUI_DB */
EOF
...@@ -636,13 +636,22 @@ static int state_initialized(struct file_info *fi, struct pending_request *req) ...@@ -636,13 +636,22 @@ static int state_initialized(struct file_info *fi, struct pending_request *req)
case RAW1394_REQ_SET_CARD: case RAW1394_REQ_SET_CARD:
spin_lock_irqsave(&host_info_lock, flags); spin_lock_irqsave(&host_info_lock, flags);
if (req->req.misc < host_count) { if (req->req.misc >= host_count) {
list_for_each_entry(hi, &host_info_list, list) { req->req.error = RAW1394_ERROR_INVALID_ARG;
goto out_set_card;
}
list_for_each_entry(hi, &host_info_list, list)
if (!req->req.misc--) if (!req->req.misc--)
break; break;
} get_device(&hi->host->device); /* FIXME handle failure case */
get_device(&hi->host->device); // XXX Need to handle failure case
list_add_tail(&fi->list, &hi->file_info_list); list_add_tail(&fi->list, &hi->file_info_list);
/* prevent unloading of the host's low-level driver */
if (!try_module_get(hi->host->driver->owner)) {
req->req.error = RAW1394_ERROR_ABORTED;
goto out_set_card;
}
WARN_ON(fi->host);
fi->host = hi->host; fi->host = hi->host;
fi->state = connected; fi->state = connected;
...@@ -650,13 +659,9 @@ static int state_initialized(struct file_info *fi, struct pending_request *req) ...@@ -650,13 +659,9 @@ static int state_initialized(struct file_info *fi, struct pending_request *req)
req->req.generation = get_hpsb_generation(fi->host); req->req.generation = get_hpsb_generation(fi->host);
req->req.misc = (fi->host->node_id << 16) req->req.misc = (fi->host->node_id << 16)
| fi->host->node_count; | fi->host->node_count;
if (fi->protocol_version > 3) { if (fi->protocol_version > 3)
req->req.misc |= req->req.misc |= NODEID_TO_NODE(fi->host->irm_id) << 8;
NODEID_TO_NODE(fi->host->irm_id) << 8; out_set_card:
}
} else {
req->req.error = RAW1394_ERROR_INVALID_ARG;
}
spin_unlock_irqrestore(&host_info_lock, flags); spin_unlock_irqrestore(&host_info_lock, flags);
req->req.length = 0; req->req.length = 0;
...@@ -2955,6 +2960,11 @@ static int raw1394_release(struct inode *inode, struct file *file) ...@@ -2955,6 +2960,11 @@ static int raw1394_release(struct inode *inode, struct file *file)
put_device(&fi->host->device); put_device(&fi->host->device);
} }
spin_lock_irqsave(&host_info_lock, flags);
if (fi->host)
module_put(fi->host->driver->owner);
spin_unlock_irqrestore(&host_info_lock, flags);
kfree(fi); kfree(fi);
return 0; return 0;
......
...@@ -51,7 +51,6 @@ ...@@ -51,7 +51,6 @@
* Grep for inline FIXME comments below. * Grep for inline FIXME comments below.
*/ */
#include <linux/blkdev.h>
#include <linux/compiler.h> #include <linux/compiler.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/device.h> #include <linux/device.h>
...@@ -304,10 +303,11 @@ static struct scsi_host_template sbp2_shost_template = { ...@@ -304,10 +303,11 @@ static struct scsi_host_template sbp2_shost_template = {
.use_clustering = ENABLE_CLUSTERING, .use_clustering = ENABLE_CLUSTERING,
.cmd_per_lun = SBP2_MAX_CMDS, .cmd_per_lun = SBP2_MAX_CMDS,
.can_queue = SBP2_MAX_CMDS, .can_queue = SBP2_MAX_CMDS,
.emulated = 1,
.sdev_attrs = sbp2_sysfs_sdev_attrs, .sdev_attrs = sbp2_sysfs_sdev_attrs,
}; };
/* for match-all entries in sbp2_workarounds_table */
#define SBP2_ROM_VALUE_WILDCARD 0x1000000
/* /*
* List of devices with known bugs. * List of devices with known bugs.
...@@ -329,22 +329,14 @@ static const struct { ...@@ -329,22 +329,14 @@ static const struct {
}, },
/* Initio bridges, actually only needed for some older ones */ { /* Initio bridges, actually only needed for some older ones */ {
.firmware_revision = 0x000200, .firmware_revision = 0x000200,
.model_id = SBP2_ROM_VALUE_WILDCARD,
.workarounds = SBP2_WORKAROUND_INQUIRY_36, .workarounds = SBP2_WORKAROUND_INQUIRY_36,
}, },
/* Symbios bridge */ { /* Symbios bridge */ {
.firmware_revision = 0xa0b800, .firmware_revision = 0xa0b800,
.model_id = SBP2_ROM_VALUE_WILDCARD,
.workarounds = SBP2_WORKAROUND_128K_MAX_TRANS, .workarounds = SBP2_WORKAROUND_128K_MAX_TRANS,
}, },
/*
* Note about the following Apple iPod blacklist entries:
*
* There are iPods (2nd gen, 3rd gen) with model_id==0. Since our
* matching logic treats 0 as a wildcard, we cannot match this ID
* without rewriting the matching routine. Fortunately these iPods
* do not feature the read_capacity bug according to one report.
* Read_capacity behaviour as well as model_id could change due to
* Apple-supplied firmware updates though.
*/
/* iPod 4th generation */ { /* iPod 4th generation */ {
.firmware_revision = 0x0a2700, .firmware_revision = 0x0a2700,
.model_id = 0x000021, .model_id = 0x000021,
...@@ -1307,11 +1299,13 @@ static void sbp2_parse_unit_directory(struct sbp2_lu *lu, ...@@ -1307,11 +1299,13 @@ static void sbp2_parse_unit_directory(struct sbp2_lu *lu,
if (!(workarounds & SBP2_WORKAROUND_OVERRIDE)) if (!(workarounds & SBP2_WORKAROUND_OVERRIDE))
for (i = 0; i < ARRAY_SIZE(sbp2_workarounds_table); i++) { for (i = 0; i < ARRAY_SIZE(sbp2_workarounds_table); i++) {
if (sbp2_workarounds_table[i].firmware_revision && if (sbp2_workarounds_table[i].firmware_revision !=
SBP2_ROM_VALUE_WILDCARD &&
sbp2_workarounds_table[i].firmware_revision != sbp2_workarounds_table[i].firmware_revision !=
(firmware_revision & 0xffff00)) (firmware_revision & 0xffff00))
continue; continue;
if (sbp2_workarounds_table[i].model_id && if (sbp2_workarounds_table[i].model_id !=
SBP2_ROM_VALUE_WILDCARD &&
sbp2_workarounds_table[i].model_id != ud->model_id) sbp2_workarounds_table[i].model_id != ud->model_id)
continue; continue;
workarounds |= sbp2_workarounds_table[i].workarounds; workarounds |= sbp2_workarounds_table[i].workarounds;
...@@ -2017,7 +2011,6 @@ static int sbp2scsi_slave_configure(struct scsi_device *sdev) ...@@ -2017,7 +2011,6 @@ static int sbp2scsi_slave_configure(struct scsi_device *sdev)
{ {
struct sbp2_lu *lu = (struct sbp2_lu *)sdev->host->hostdata[0]; struct sbp2_lu *lu = (struct sbp2_lu *)sdev->host->hostdata[0];
blk_queue_dma_alignment(sdev->request_queue, (512 - 1));
sdev->use_10_for_rw = 1; sdev->use_10_for_rw = 1;
if (sdev->type == TYPE_ROM) if (sdev->type == TYPE_ROM)
......
...@@ -489,6 +489,9 @@ static void wakeup_dma_ir_ctx(unsigned long l) ...@@ -489,6 +489,9 @@ static void wakeup_dma_ir_ctx(unsigned long l)
reset_ir_status(d, i); reset_ir_status(d, i);
d->buffer_status[d->buffer_prg_assignment[i]] = VIDEO1394_BUFFER_READY; d->buffer_status[d->buffer_prg_assignment[i]] = VIDEO1394_BUFFER_READY;
do_gettimeofday(&d->buffer_time[d->buffer_prg_assignment[i]]); do_gettimeofday(&d->buffer_time[d->buffer_prg_assignment[i]]);
dma_region_sync_for_cpu(&d->dma,
d->buffer_prg_assignment[i] * d->buf_size,
d->buf_size);
} }
} }
...@@ -1096,6 +1099,8 @@ static long video1394_ioctl(struct file *file, ...@@ -1096,6 +1099,8 @@ static long video1394_ioctl(struct file *file,
DBGMSG(ohci->host->id, "Starting iso transmit DMA ctx=%d", DBGMSG(ohci->host->id, "Starting iso transmit DMA ctx=%d",
d->ctx); d->ctx);
put_timestamp(ohci, d, d->last_buffer); put_timestamp(ohci, d, d->last_buffer);
dma_region_sync_for_device(&d->dma,
v.buffer * d->buf_size, d->buf_size);
/* Tell the controller where the first program is */ /* Tell the controller where the first program is */
reg_write(ohci, d->cmdPtr, reg_write(ohci, d->cmdPtr,
...@@ -1111,6 +1116,9 @@ static long video1394_ioctl(struct file *file, ...@@ -1111,6 +1116,9 @@ static long video1394_ioctl(struct file *file,
"Waking up iso transmit dma ctx=%d", "Waking up iso transmit dma ctx=%d",
d->ctx); d->ctx);
put_timestamp(ohci, d, d->last_buffer); put_timestamp(ohci, d, d->last_buffer);
dma_region_sync_for_device(&d->dma,
v.buffer * d->buf_size, d->buf_size);
reg_write(ohci, d->ctrlSet, 0x1000); reg_write(ohci, d->ctrlSet, 0x1000);
} }
} }
......
...@@ -95,6 +95,7 @@ ...@@ -95,6 +95,7 @@
#define PCI_BASE_CLASS_SERIAL 0x0c #define PCI_BASE_CLASS_SERIAL 0x0c
#define PCI_CLASS_SERIAL_FIREWIRE 0x0c00 #define PCI_CLASS_SERIAL_FIREWIRE 0x0c00
#define PCI_CLASS_SERIAL_FIREWIRE_OHCI 0x0c0010
#define PCI_CLASS_SERIAL_ACCESS 0x0c01 #define PCI_CLASS_SERIAL_ACCESS 0x0c01
#define PCI_CLASS_SERIAL_SSA 0x0c02 #define PCI_CLASS_SERIAL_SSA 0x0c02
#define PCI_CLASS_SERIAL_USB 0x0c03 #define PCI_CLASS_SERIAL_USB 0x0c03
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment