aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorStefan Richter <stefanr@s5r6.in-berlin.de>2007-03-26 19:36:50 -0400
committerStefan Richter <stefanr@s5r6.in-berlin.de>2007-04-29 18:00:30 -0400
commit70093cfde8af52b0b9030d90f9004cbde38f2ff8 (patch)
treef9230ca354e78b129898298095a6ee887c40a16d /drivers
parente00f04a70fa387b3accc81b5c346200f836e2a52 (diff)
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>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/ieee1394/Kconfig29
-rw-r--r--drivers/ieee1394/config_roms.c76
-rw-r--r--drivers/ieee1394/config_roms.h7
-rw-r--r--drivers/ieee1394/eth1394.c7
-rw-r--r--drivers/ieee1394/hosts.c3
5 files changed, 36 insertions, 86 deletions
diff --git a/drivers/ieee1394/Kconfig b/drivers/ieee1394/Kconfig
index f8ff6b866e6e..5c0b522ae077 100644
--- a/drivers/ieee1394/Kconfig
+++ b/drivers/ieee1394/Kconfig
@@ -34,23 +34,6 @@ config IEEE1394_VERBOSEDEBUG
34 Say Y if you really want or need the debugging output, everyone 34 Say Y if you really want or need the debugging output, everyone
35 else says N. 35 else says N.
36 36
37config IEEE1394_EXTRA_CONFIG_ROMS
38 bool "Build in extra config rom entries for certain functionality"
39 depends on IEEE1394
40 help
41 Some IEEE1394 functionality depends on extra config rom entries
42 being available in the host adapters CSR. These options will
43 allow you to choose which ones.
44
45config IEEE1394_CONFIG_ROM_IP1394
46 bool "IP-1394 Entry"
47 depends on IEEE1394_EXTRA_CONFIG_ROMS && IEEE1394
48 help
49 Adds an entry for using IP-over-1394. If you want to use your
50 IEEE1394 bus as a network for IP systems (including interacting
51 with MacOSX and WinXP IP-over-1394), enable this option and the
52 eth1394 option below.
53
54comment "Device Drivers" 37comment "Device Drivers"
55 depends on IEEE1394 38 depends on IEEE1394
56 39
@@ -120,11 +103,15 @@ config IEEE1394_SBP2_PHYS_DMA
120 This option is buggy and currently broken on some architectures. 103 This option is buggy and currently broken on some architectures.
121 If unsure, say N. 104 If unsure, say N.
122 105
106config IEEE1394_ETH1394_ROM_ENTRY
107 depends on IEEE1394
108 bool
109 default n
110
123config IEEE1394_ETH1394 111config IEEE1394_ETH1394
124 tristate "Ethernet over 1394" 112 tristate "IP over 1394"
125 depends on IEEE1394 && EXPERIMENTAL && INET 113 depends on IEEE1394 && EXPERIMENTAL && INET
126 select IEEE1394_CONFIG_ROM_IP1394 114 select IEEE1394_ETH1394_ROM_ENTRY
127 select IEEE1394_EXTRA_CONFIG_ROMS
128 help 115 help
129 This driver implements a functional majority of RFC 2734: IPv4 over 116 This driver implements a functional majority of RFC 2734: IPv4 over
130 1394. It will provide IP connectivity with implementations of RFC 117 1394. It will provide IP connectivity with implementations of RFC
@@ -133,6 +120,8 @@ config IEEE1394_ETH1394
133 This driver is still considered experimental. It does not yet support 120 This driver is still considered experimental. It does not yet support
134 MCAP, therefore multicast support is significantly limited. 121 MCAP, therefore multicast support is significantly limited.
135 122
123 The module is called eth1394 although it does not emulate Ethernet.
124
136config IEEE1394_DV1394 125config IEEE1394_DV1394
137 tristate "OHCI-DV I/O support (deprecated)" 126 tristate "OHCI-DV I/O support (deprecated)"
138 depends on IEEE1394 && IEEE1394_OHCI1394 127 depends on IEEE1394 && IEEE1394_OHCI1394
diff --git a/drivers/ieee1394/config_roms.c b/drivers/ieee1394/config_roms.c
index 556658a1db29..1b981207fa76 100644
--- a/drivers/ieee1394/config_roms.c
+++ b/drivers/ieee1394/config_roms.c
@@ -26,12 +26,6 @@ struct hpsb_config_rom_entry {
26 /* Base initialization, called at module load */ 26 /* Base initialization, called at module load */
27 int (*init)(void); 27 int (*init)(void);
28 28
29 /* Add entry to specified host */
30 int (*add)(struct hpsb_host *host);
31
32 /* Remove entry from specified host */
33 void (*remove)(struct hpsb_host *host);
34
35 /* Cleanup called at module exit */ 29 /* Cleanup called at module exit */
36 void (*cleanup)(void); 30 void (*cleanup)(void);
37 31
@@ -78,7 +72,7 @@ int hpsb_default_host_entry(struct hpsb_host *host)
78} 72}
79 73
80 74
81#ifdef CONFIG_IEEE1394_CONFIG_ROM_IP1394 75#ifdef CONFIG_IEEE1394_ETH1394_ROM_ENTRY
82#include "eth1394.h" 76#include "eth1394.h"
83 77
84static struct csr1212_keyval *ip1394_ud; 78static struct csr1212_keyval *ip1394_ud;
@@ -137,7 +131,7 @@ static void config_rom_ip1394_cleanup(void)
137 } 131 }
138} 132}
139 133
140static int config_rom_ip1394_add(struct hpsb_host *host) 134int hpsb_config_rom_ip1394_add(struct hpsb_host *host)
141{ 135{
142 if (!ip1394_ud) 136 if (!ip1394_ud)
143 return -ENODEV; 137 return -ENODEV;
@@ -146,30 +140,33 @@ static int config_rom_ip1394_add(struct hpsb_host *host)
146 ip1394_ud) != CSR1212_SUCCESS) 140 ip1394_ud) != CSR1212_SUCCESS)
147 return -ENOMEM; 141 return -ENOMEM;
148 142
143 host->config_roms |= HPSB_CONFIG_ROM_ENTRY_IP1394;
144 host->update_config_rom = 1;
149 return 0; 145 return 0;
150} 146}
147EXPORT_SYMBOL_GPL(hpsb_config_rom_ip1394_add);
151 148
152static void config_rom_ip1394_remove(struct hpsb_host *host) 149void hpsb_config_rom_ip1394_remove(struct hpsb_host *host)
153{ 150{
154 csr1212_detach_keyval_from_directory(host->csr.rom->root_kv, ip1394_ud); 151 csr1212_detach_keyval_from_directory(host->csr.rom->root_kv, ip1394_ud);
152 host->config_roms &= ~HPSB_CONFIG_ROM_ENTRY_IP1394;
153 host->update_config_rom = 1;
155} 154}
155EXPORT_SYMBOL_GPL(hpsb_config_rom_ip1394_remove);
156 156
157static struct hpsb_config_rom_entry ip1394_entry = { 157static struct hpsb_config_rom_entry ip1394_entry = {
158 .name = "ip1394", 158 .name = "ip1394",
159 .init = config_rom_ip1394_init, 159 .init = config_rom_ip1394_init,
160 .add = config_rom_ip1394_add,
161 .remove = config_rom_ip1394_remove,
162 .cleanup = config_rom_ip1394_cleanup, 160 .cleanup = config_rom_ip1394_cleanup,
163 .flag = HPSB_CONFIG_ROM_ENTRY_IP1394, 161 .flag = HPSB_CONFIG_ROM_ENTRY_IP1394,
164}; 162};
165#endif /* CONFIG_IEEE1394_CONFIG_ROM_IP1394 */
166 163
164#endif /* CONFIG_IEEE1394_ETH1394_ROM_ENTRY */
167 165
168static struct hpsb_config_rom_entry *const config_rom_entries[] = { 166static struct hpsb_config_rom_entry *const config_rom_entries[] = {
169#ifdef CONFIG_IEEE1394_CONFIG_ROM_IP1394 167#ifdef CONFIG_IEEE1394_ETH1394_ROM_ENTRY
170 &ip1394_entry, 168 &ip1394_entry,
171#endif 169#endif
172 NULL,
173}; 170};
174 171
175/* Initialize all config roms */ 172/* Initialize all config roms */
@@ -177,18 +174,12 @@ int hpsb_init_config_roms(void)
177{ 174{
178 int i, error = 0; 175 int i, error = 0;
179 176
180 for (i = 0; config_rom_entries[i]; i++) { 177 for (i = 0; i < ARRAY_SIZE(config_rom_entries); i++)
181 if (!config_rom_entries[i]->init)
182 continue;
183
184 if (config_rom_entries[i]->init()) { 178 if (config_rom_entries[i]->init()) {
185 HPSB_ERR("Failed to initialize config rom entry `%s'", 179 HPSB_ERR("Failed to initialize config rom entry `%s'",
186 config_rom_entries[i]->name); 180 config_rom_entries[i]->name);
187 error = -1; 181 error = -1;
188 } else 182 }
189 HPSB_DEBUG("Initialized config rom entry `%s'",
190 config_rom_entries[i]->name);
191 }
192 183
193 return error; 184 return error;
194} 185}
@@ -198,43 +189,6 @@ void hpsb_cleanup_config_roms(void)
198{ 189{
199 int i; 190 int i;
200 191
201 for (i = 0; config_rom_entries[i]; i++) { 192 for (i = 0; i < ARRAY_SIZE(config_rom_entries); i++)
202 if (config_rom_entries[i]->cleanup) 193 config_rom_entries[i]->cleanup();
203 config_rom_entries[i]->cleanup();
204 }
205}
206
207/* Add extra config roms to specified host */
208int hpsb_add_extra_config_roms(struct hpsb_host *host)
209{
210 int i, error = 0;
211
212 for (i = 0; config_rom_entries[i]; i++) {
213 if (config_rom_entries[i]->add(host)) {
214 HPSB_ERR("fw-host%d: Failed to attach config rom entry `%s'",
215 host->id, config_rom_entries[i]->name);
216 error = -1;
217 } else {
218 host->config_roms |= config_rom_entries[i]->flag;
219 host->update_config_rom = 1;
220 }
221 }
222
223 return error;
224}
225
226/* Remove extra config roms from specified host */
227void hpsb_remove_extra_config_roms(struct hpsb_host *host)
228{
229 int i;
230
231 for (i = 0; config_rom_entries[i]; i++) {
232 if (!(host->config_roms & config_rom_entries[i]->flag))
233 continue;
234
235 config_rom_entries[i]->remove(host);
236
237 host->config_roms &= ~config_rom_entries[i]->flag;
238 host->update_config_rom = 1;
239 }
240} 194}
diff --git a/drivers/ieee1394/config_roms.h b/drivers/ieee1394/config_roms.h
index 02a21871bdaf..1f5cd1f16c44 100644
--- a/drivers/ieee1394/config_roms.h
+++ b/drivers/ieee1394/config_roms.h
@@ -6,11 +6,14 @@ struct hpsb_host;
6int hpsb_default_host_entry(struct hpsb_host *host); 6int hpsb_default_host_entry(struct hpsb_host *host);
7int hpsb_init_config_roms(void); 7int hpsb_init_config_roms(void);
8void hpsb_cleanup_config_roms(void); 8void hpsb_cleanup_config_roms(void);
9int hpsb_add_extra_config_roms(struct hpsb_host *host);
10void hpsb_remove_extra_config_roms(struct hpsb_host *host);
11 9
12/* List of flags to check if a host contains a certain extra config rom 10/* List of flags to check if a host contains a certain extra config rom
13 * entry. Available in the host->config_roms member. */ 11 * entry. Available in the host->config_roms member. */
14#define HPSB_CONFIG_ROM_ENTRY_IP1394 0x00000001 12#define HPSB_CONFIG_ROM_ENTRY_IP1394 0x00000001
15 13
14#ifdef CONFIG_IEEE1394_ETH1394_ROM_ENTRY
15int hpsb_config_rom_ip1394_add(struct hpsb_host *host);
16void hpsb_config_rom_ip1394_remove(struct hpsb_host *host);
17#endif
18
16#endif /* _IEEE1394_CONFIG_ROMS_H */ 19#endif /* _IEEE1394_CONFIG_ROMS_H */
diff --git a/drivers/ieee1394/eth1394.c b/drivers/ieee1394/eth1394.c
index d056c5953be3..b4fa754bfd1a 100644
--- a/drivers/ieee1394/eth1394.c
+++ b/drivers/ieee1394/eth1394.c
@@ -561,8 +561,10 @@ static void ether1394_add_host (struct hpsb_host *host)
561 struct eth1394_priv *priv; 561 struct eth1394_priv *priv;
562 u64 fifo_addr; 562 u64 fifo_addr;
563 563
564 if (!(host->config_roms & HPSB_CONFIG_ROM_ENTRY_IP1394)) 564 if (hpsb_config_rom_ip1394_add(host) != 0) {
565 ETH1394_PRINT_G(KERN_ERR, "Can't add IP-over-1394 ROM entry\n");
565 return; 566 return;
567 }
566 568
567 fifo_addr = hpsb_allocate_and_register_addrspace( 569 fifo_addr = hpsb_allocate_and_register_addrspace(
568 &eth1394_highlevel, host, &addr_ops, 570 &eth1394_highlevel, host, &addr_ops,
@@ -570,6 +572,7 @@ static void ether1394_add_host (struct hpsb_host *host)
570 CSR1212_INVALID_ADDR_SPACE, CSR1212_INVALID_ADDR_SPACE); 572 CSR1212_INVALID_ADDR_SPACE, CSR1212_INVALID_ADDR_SPACE);
571 if (fifo_addr == CSR1212_INVALID_ADDR_SPACE) { 573 if (fifo_addr == CSR1212_INVALID_ADDR_SPACE) {
572 ETH1394_PRINT_G(KERN_ERR, "Cannot register CSR space\n"); 574 ETH1394_PRINT_G(KERN_ERR, "Cannot register CSR space\n");
575 hpsb_config_rom_ip1394_remove(host);
573 return; 576 return;
574 } 577 }
575 578
@@ -649,6 +652,7 @@ out:
649 if (hi) 652 if (hi)
650 hpsb_destroy_hostinfo(&eth1394_highlevel, host); 653 hpsb_destroy_hostinfo(&eth1394_highlevel, host);
651 hpsb_unregister_addrspace(&eth1394_highlevel, host, fifo_addr); 654 hpsb_unregister_addrspace(&eth1394_highlevel, host, fifo_addr);
655 hpsb_config_rom_ip1394_remove(host);
652} 656}
653 657
654/* Remove a card from our list */ 658/* Remove a card from our list */
@@ -662,6 +666,7 @@ static void ether1394_remove_host (struct hpsb_host *host)
662 return; 666 return;
663 priv = netdev_priv(hi->dev); 667 priv = netdev_priv(hi->dev);
664 hpsb_unregister_addrspace(&eth1394_highlevel, host, priv->local_fifo); 668 hpsb_unregister_addrspace(&eth1394_highlevel, host, priv->local_fifo);
669 hpsb_config_rom_ip1394_remove(host);
665 if (priv->iso) 670 if (priv->iso)
666 hpsb_iso_shutdown(priv->iso); 671 hpsb_iso_shutdown(priv->iso);
667 unregister_netdev(hi->dev); 672 unregister_netdev(hi->dev);
diff --git a/drivers/ieee1394/hosts.c b/drivers/ieee1394/hosts.c
index 1bf4aa3e8d15..6164a9a83396 100644
--- a/drivers/ieee1394/hosts.c
+++ b/drivers/ieee1394/hosts.c
@@ -180,7 +180,7 @@ int hpsb_add_host(struct hpsb_host *host)
180{ 180{
181 if (hpsb_default_host_entry(host)) 181 if (hpsb_default_host_entry(host))
182 return -ENOMEM; 182 return -ENOMEM;
183 hpsb_add_extra_config_roms(host); 183
184 highlevel_add_host(host); 184 highlevel_add_host(host);
185 return 0; 185 return 0;
186} 186}
@@ -202,7 +202,6 @@ void hpsb_remove_host(struct hpsb_host *host)
202 202
203 host->driver = &dummy_driver; 203 host->driver = &dummy_driver;
204 highlevel_remove_host(host); 204 highlevel_remove_host(host);
205 hpsb_remove_extra_config_roms(host);
206 205
207 class_device_unregister(&host->class_dev); 206 class_device_unregister(&host->class_dev);
208 device_unregister(&host->device); 207 device_unregister(&host->device);