ieee1394: eth1394: don't autoload by hotplug when ohci1394 starts

Until now, ieee1394 put an IP-over-1394 capability entry into each new
host's config ROM.  As soon as the controller was initialized --- i.e.
right after modprobe ohci1394 --- this entry triggered a hotplug event
which typically caused auto-loading of eth1394.

This irritated or annoyed many users and distributors.  Of course they
could blacklist eth1394, but then ieee1394 wrongly advertized IP-over-
1394 capability to the FireWire bus.

Therefore
  - remove the offending kernel config option
    IEEE1394_CONFIG_ROM_IP1394,
  - let eth1394 add the ROM entry by itself, i.e. only after eth1394 was
    loaded.

This fixes http://bugzilla.kernel.org/show_bug.cgi?id=7793 .

To emulate the behaviour of older kernels, simply add the following to
to /etc/modprobe.conf:

install ohci1394 /sbin/modprobe eth1394; \
                 /sbin/modprobe --ignore-install ohci1394

Note, autoloading of eth1394 when an _external_ IP-over-1394 capable
device is discovered is _not_ affected by this patch.

Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
This commit is contained in:
Stefan Richter 2007-03-27 01:36:50 +02:00
parent e00f04a70f
commit 70093cfde8
5 changed files with 36 additions and 86 deletions

View file

@ -34,23 +34,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_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" comment "Device Drivers"
depends on IEEE1394 depends on IEEE1394
@ -120,11 +103,15 @@ config IEEE1394_SBP2_PHYS_DMA
This option is buggy and currently broken on some architectures. This option is buggy and currently broken on some architectures.
If unsure, say N. If unsure, say N.
config IEEE1394_ETH1394_ROM_ENTRY
depends on IEEE1394
bool
default n
config IEEE1394_ETH1394 config IEEE1394_ETH1394
tristate "Ethernet over 1394" tristate "IP over 1394"
depends on IEEE1394 && EXPERIMENTAL && INET depends on IEEE1394 && EXPERIMENTAL && INET
select IEEE1394_CONFIG_ROM_IP1394 select IEEE1394_ETH1394_ROM_ENTRY
select IEEE1394_EXTRA_CONFIG_ROMS
help help
This driver implements a functional majority of RFC 2734: IPv4 over This driver implements a functional majority of RFC 2734: IPv4 over
1394. It will provide IP connectivity with implementations of RFC 1394. It will provide IP connectivity with implementations of RFC
@ -133,6 +120,8 @@ config IEEE1394_ETH1394
This driver is still considered experimental. It does not yet support This driver is still considered experimental. It does not yet support
MCAP, therefore multicast support is significantly limited. MCAP, therefore multicast support is significantly limited.
The module is called eth1394 although it does not emulate Ethernet.
config IEEE1394_DV1394 config IEEE1394_DV1394
tristate "OHCI-DV I/O support (deprecated)" tristate "OHCI-DV I/O support (deprecated)"
depends on IEEE1394 && IEEE1394_OHCI1394 depends on IEEE1394 && IEEE1394_OHCI1394

View file

@ -26,12 +26,6 @@ struct hpsb_config_rom_entry {
/* Base initialization, called at module load */ /* Base initialization, called at module load */
int (*init)(void); 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 */ /* Cleanup called at module exit */
void (*cleanup)(void); void (*cleanup)(void);
@ -78,7 +72,7 @@ int hpsb_default_host_entry(struct hpsb_host *host)
} }
#ifdef CONFIG_IEEE1394_CONFIG_ROM_IP1394 #ifdef CONFIG_IEEE1394_ETH1394_ROM_ENTRY
#include "eth1394.h" #include "eth1394.h"
static struct csr1212_keyval *ip1394_ud; static struct csr1212_keyval *ip1394_ud;
@ -137,7 +131,7 @@ static void config_rom_ip1394_cleanup(void)
} }
} }
static int config_rom_ip1394_add(struct hpsb_host *host) int hpsb_config_rom_ip1394_add(struct hpsb_host *host)
{ {
if (!ip1394_ud) if (!ip1394_ud)
return -ENODEV; return -ENODEV;
@ -146,30 +140,33 @@ static int config_rom_ip1394_add(struct hpsb_host *host)
ip1394_ud) != CSR1212_SUCCESS) ip1394_ud) != CSR1212_SUCCESS)
return -ENOMEM; return -ENOMEM;
host->config_roms |= HPSB_CONFIG_ROM_ENTRY_IP1394;
host->update_config_rom = 1;
return 0; return 0;
} }
EXPORT_SYMBOL_GPL(hpsb_config_rom_ip1394_add);
static void config_rom_ip1394_remove(struct hpsb_host *host) void hpsb_config_rom_ip1394_remove(struct hpsb_host *host)
{ {
csr1212_detach_keyval_from_directory(host->csr.rom->root_kv, ip1394_ud); csr1212_detach_keyval_from_directory(host->csr.rom->root_kv, ip1394_ud);
host->config_roms &= ~HPSB_CONFIG_ROM_ENTRY_IP1394;
host->update_config_rom = 1;
} }
EXPORT_SYMBOL_GPL(hpsb_config_rom_ip1394_remove);
static struct hpsb_config_rom_entry ip1394_entry = { static struct hpsb_config_rom_entry ip1394_entry = {
.name = "ip1394", .name = "ip1394",
.init = config_rom_ip1394_init, .init = config_rom_ip1394_init,
.add = config_rom_ip1394_add,
.remove = config_rom_ip1394_remove,
.cleanup = config_rom_ip1394_cleanup, .cleanup = config_rom_ip1394_cleanup,
.flag = HPSB_CONFIG_ROM_ENTRY_IP1394, .flag = HPSB_CONFIG_ROM_ENTRY_IP1394,
}; };
#endif /* CONFIG_IEEE1394_CONFIG_ROM_IP1394 */
#endif /* CONFIG_IEEE1394_ETH1394_ROM_ENTRY */
static struct hpsb_config_rom_entry *const config_rom_entries[] = { static struct hpsb_config_rom_entry *const config_rom_entries[] = {
#ifdef CONFIG_IEEE1394_CONFIG_ROM_IP1394 #ifdef CONFIG_IEEE1394_ETH1394_ROM_ENTRY
&ip1394_entry, &ip1394_entry,
#endif #endif
NULL,
}; };
/* Initialize all config roms */ /* Initialize all config roms */
@ -177,18 +174,12 @@ int hpsb_init_config_roms(void)
{ {
int i, error = 0; int i, error = 0;
for (i = 0; config_rom_entries[i]; i++) { for (i = 0; i < ARRAY_SIZE(config_rom_entries); i++)
if (!config_rom_entries[i]->init)
continue;
if (config_rom_entries[i]->init()) { if (config_rom_entries[i]->init()) {
HPSB_ERR("Failed to initialize config rom entry `%s'", HPSB_ERR("Failed to initialize config rom entry `%s'",
config_rom_entries[i]->name); config_rom_entries[i]->name);
error = -1; error = -1;
} else }
HPSB_DEBUG("Initialized config rom entry `%s'",
config_rom_entries[i]->name);
}
return error; return error;
} }
@ -198,43 +189,6 @@ void hpsb_cleanup_config_roms(void)
{ {
int i; int i;
for (i = 0; config_rom_entries[i]; i++) { for (i = 0; i < ARRAY_SIZE(config_rom_entries); i++)
if (config_rom_entries[i]->cleanup) config_rom_entries[i]->cleanup();
config_rom_entries[i]->cleanup();
}
}
/* Add extra config roms to specified host */
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;
}
/* Remove extra config roms from specified host */
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;
}
} }

View file

@ -6,11 +6,14 @@ struct hpsb_host;
int hpsb_default_host_entry(struct hpsb_host *host); int hpsb_default_host_entry(struct hpsb_host *host);
int hpsb_init_config_roms(void); int hpsb_init_config_roms(void);
void hpsb_cleanup_config_roms(void); void hpsb_cleanup_config_roms(void);
int hpsb_add_extra_config_roms(struct hpsb_host *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 /* List of flags to check if a host contains a certain extra config rom
* entry. Available in the host->config_roms member. */ * entry. Available in the host->config_roms member. */
#define HPSB_CONFIG_ROM_ENTRY_IP1394 0x00000001 #define HPSB_CONFIG_ROM_ENTRY_IP1394 0x00000001
#ifdef CONFIG_IEEE1394_ETH1394_ROM_ENTRY
int hpsb_config_rom_ip1394_add(struct hpsb_host *host);
void hpsb_config_rom_ip1394_remove(struct hpsb_host *host);
#endif
#endif /* _IEEE1394_CONFIG_ROMS_H */ #endif /* _IEEE1394_CONFIG_ROMS_H */

View file

@ -561,8 +561,10 @@ static void ether1394_add_host (struct hpsb_host *host)
struct eth1394_priv *priv; struct eth1394_priv *priv;
u64 fifo_addr; u64 fifo_addr;
if (!(host->config_roms & HPSB_CONFIG_ROM_ENTRY_IP1394)) if (hpsb_config_rom_ip1394_add(host) != 0) {
ETH1394_PRINT_G(KERN_ERR, "Can't add IP-over-1394 ROM entry\n");
return; return;
}
fifo_addr = hpsb_allocate_and_register_addrspace( fifo_addr = hpsb_allocate_and_register_addrspace(
&eth1394_highlevel, host, &addr_ops, &eth1394_highlevel, host, &addr_ops,
@ -570,6 +572,7 @@ static void ether1394_add_host (struct hpsb_host *host)
CSR1212_INVALID_ADDR_SPACE, CSR1212_INVALID_ADDR_SPACE); CSR1212_INVALID_ADDR_SPACE, CSR1212_INVALID_ADDR_SPACE);
if (fifo_addr == CSR1212_INVALID_ADDR_SPACE) { if (fifo_addr == CSR1212_INVALID_ADDR_SPACE) {
ETH1394_PRINT_G(KERN_ERR, "Cannot register CSR space\n"); ETH1394_PRINT_G(KERN_ERR, "Cannot register CSR space\n");
hpsb_config_rom_ip1394_remove(host);
return; return;
} }
@ -649,6 +652,7 @@ out:
if (hi) if (hi)
hpsb_destroy_hostinfo(&eth1394_highlevel, host); hpsb_destroy_hostinfo(&eth1394_highlevel, host);
hpsb_unregister_addrspace(&eth1394_highlevel, host, fifo_addr); hpsb_unregister_addrspace(&eth1394_highlevel, host, fifo_addr);
hpsb_config_rom_ip1394_remove(host);
} }
/* Remove a card from our list */ /* Remove a card from our list */
@ -662,6 +666,7 @@ static void ether1394_remove_host (struct hpsb_host *host)
return; return;
priv = netdev_priv(hi->dev); priv = netdev_priv(hi->dev);
hpsb_unregister_addrspace(&eth1394_highlevel, host, priv->local_fifo); hpsb_unregister_addrspace(&eth1394_highlevel, host, priv->local_fifo);
hpsb_config_rom_ip1394_remove(host);
if (priv->iso) if (priv->iso)
hpsb_iso_shutdown(priv->iso); hpsb_iso_shutdown(priv->iso);
unregister_netdev(hi->dev); unregister_netdev(hi->dev);

View file

@ -180,7 +180,7 @@ 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);
highlevel_add_host(host); highlevel_add_host(host);
return 0; return 0;
} }
@ -202,7 +202,6 @@ void hpsb_remove_host(struct hpsb_host *host)
host->driver = &dummy_driver; host->driver = &dummy_driver;
highlevel_remove_host(host); highlevel_remove_host(host);
hpsb_remove_extra_config_roms(host);
class_device_unregister(&host->class_dev); class_device_unregister(&host->class_dev);
device_unregister(&host->device); device_unregister(&host->device);