6 * Copyright (C) 2004 Ben Collins
8 * This code is licensed under the GPL. See the file COPYING in the root
9 * directory of the kernel sources for details.
12 #include <linux/types.h>
16 #include "ieee1394_types.h"
18 #include "ieee1394_core.h"
19 #include "highlevel.h"
21 #include "config_roms.h"
23 struct hpsb_config_rom_entry
{
26 /* Base initialization, called at module load */
29 /* Cleanup called at module exit */
30 void (*cleanup
)(void);
32 /* The flag added to host->config_roms */
36 /* The default host entry. This must succeed. */
37 int hpsb_default_host_entry(struct hpsb_host
*host
)
39 struct csr1212_keyval
*root
;
40 struct csr1212_keyval
*vend_id
= NULL
;
41 struct csr1212_keyval
*text
= NULL
;
45 sprintf(csr_name
, "Linux - %s", host
->driver
->name
);
46 root
= host
->csr
.rom
->root_kv
;
48 vend_id
= csr1212_new_immediate(CSR1212_KV_ID_VENDOR
, host
->csr
.guid_hi
>> 8);
49 text
= csr1212_new_string_descriptor_leaf(csr_name
);
51 if (!vend_id
|| !text
) {
53 csr1212_release_keyval(vend_id
);
55 csr1212_release_keyval(text
);
56 csr1212_destroy_csr(host
->csr
.rom
);
60 csr1212_associate_keyval(vend_id
, text
);
61 csr1212_release_keyval(text
);
62 ret
= csr1212_attach_keyval_to_directory(root
, vend_id
);
63 csr1212_release_keyval(vend_id
);
64 if (ret
!= CSR1212_SUCCESS
) {
65 csr1212_destroy_csr(host
->csr
.rom
);
69 host
->update_config_rom
= 1;
75 #ifdef CONFIG_IEEE1394_ETH1394_ROM_ENTRY
78 static struct csr1212_keyval
*ip1394_ud
;
80 static int config_rom_ip1394_init(void)
82 struct csr1212_keyval
*spec_id
= NULL
;
83 struct csr1212_keyval
*spec_desc
= NULL
;
84 struct csr1212_keyval
*ver
= NULL
;
85 struct csr1212_keyval
*ver_desc
= NULL
;
88 ip1394_ud
= csr1212_new_directory(CSR1212_KV_ID_UNIT
);
90 spec_id
= csr1212_new_immediate(CSR1212_KV_ID_SPECIFIER_ID
,
91 ETHER1394_GASP_SPECIFIER_ID
);
92 spec_desc
= csr1212_new_string_descriptor_leaf("IANA");
93 ver
= csr1212_new_immediate(CSR1212_KV_ID_VERSION
,
94 ETHER1394_GASP_VERSION
);
95 ver_desc
= csr1212_new_string_descriptor_leaf("IPv4");
97 if (!ip1394_ud
|| !spec_id
|| !spec_desc
|| !ver
|| !ver_desc
)
100 csr1212_associate_keyval(spec_id
, spec_desc
);
101 csr1212_associate_keyval(ver
, ver_desc
);
102 if (csr1212_attach_keyval_to_directory(ip1394_ud
, spec_id
)
103 == CSR1212_SUCCESS
&&
104 csr1212_attach_keyval_to_directory(ip1394_ud
, ver
)
109 if (ret
&& ip1394_ud
) {
110 csr1212_release_keyval(ip1394_ud
);
115 csr1212_release_keyval(spec_id
);
117 csr1212_release_keyval(spec_desc
);
119 csr1212_release_keyval(ver
);
121 csr1212_release_keyval(ver_desc
);
126 static void config_rom_ip1394_cleanup(void)
129 csr1212_release_keyval(ip1394_ud
);
134 int hpsb_config_rom_ip1394_add(struct hpsb_host
*host
)
139 if (csr1212_attach_keyval_to_directory(host
->csr
.rom
->root_kv
,
140 ip1394_ud
) != CSR1212_SUCCESS
)
143 host
->config_roms
|= HPSB_CONFIG_ROM_ENTRY_IP1394
;
144 host
->update_config_rom
= 1;
147 EXPORT_SYMBOL_GPL(hpsb_config_rom_ip1394_add
);
149 void hpsb_config_rom_ip1394_remove(struct hpsb_host
*host
)
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 EXPORT_SYMBOL_GPL(hpsb_config_rom_ip1394_remove
);
157 static struct hpsb_config_rom_entry ip1394_entry
= {
159 .init
= config_rom_ip1394_init
,
160 .cleanup
= config_rom_ip1394_cleanup
,
161 .flag
= HPSB_CONFIG_ROM_ENTRY_IP1394
,
164 #endif /* CONFIG_IEEE1394_ETH1394_ROM_ENTRY */
166 static struct hpsb_config_rom_entry
*const config_rom_entries
[] = {
167 #ifdef CONFIG_IEEE1394_ETH1394_ROM_ENTRY
172 /* Initialize all config roms */
173 int hpsb_init_config_roms(void)
177 for (i
= 0; i
< ARRAY_SIZE(config_rom_entries
); i
++)
178 if (config_rom_entries
[i
]->init()) {
179 HPSB_ERR("Failed to initialize config rom entry `%s'",
180 config_rom_entries
[i
]->name
);
187 /* Cleanup all config roms */
188 void hpsb_cleanup_config_roms(void)
192 for (i
= 0; i
< ARRAY_SIZE(config_rom_entries
); i
++)
193 config_rom_entries
[i
]->cleanup();