diff options
-rw-r--r-- | drivers/message/i2o/core.h | 2 | ||||
-rw-r--r-- | drivers/message/i2o/device.c | 144 | ||||
-rw-r--r-- | drivers/message/i2o/driver.c | 2 | ||||
-rw-r--r-- | drivers/message/i2o/iop.c | 34 | ||||
-rw-r--r-- | include/linux/i2o.h | 1 |
5 files changed, 68 insertions, 115 deletions
diff --git a/drivers/message/i2o/core.h b/drivers/message/i2o/core.h index 9eefedb16211..9aa9b91170b2 100644 --- a/drivers/message/i2o/core.h +++ b/drivers/message/i2o/core.h | |||
@@ -33,6 +33,8 @@ extern int __init i2o_pci_init(void); | |||
33 | extern void __exit i2o_pci_exit(void); | 33 | extern void __exit i2o_pci_exit(void); |
34 | 34 | ||
35 | /* device */ | 35 | /* device */ |
36 | extern struct device_attribute i2o_device_attrs[]; | ||
37 | |||
36 | extern void i2o_device_remove(struct i2o_device *); | 38 | extern void i2o_device_remove(struct i2o_device *); |
37 | extern int i2o_device_parse_lct(struct i2o_controller *); | 39 | extern int i2o_device_parse_lct(struct i2o_controller *); |
38 | 40 | ||
diff --git a/drivers/message/i2o/device.c b/drivers/message/i2o/device.c index 1db26215937f..a5e260b7a3b6 100644 --- a/drivers/message/i2o/device.c +++ b/drivers/message/i2o/device.c | |||
@@ -142,8 +142,9 @@ static void i2o_device_release(struct device *dev) | |||
142 | 142 | ||
143 | 143 | ||
144 | /** | 144 | /** |
145 | * i2o_device_class_show_class_id - Displays class id of I2O device | 145 | * i2o_device_show_class_id - Displays class id of I2O device |
146 | * @cd: class device of which the class id should be displayed | 146 | * @dev: device of which the class id should be displayed |
147 | * @attr: pointer to device attribute | ||
147 | * @buf: buffer into which the class id should be printed | 148 | * @buf: buffer into which the class id should be printed |
148 | * | 149 | * |
149 | * Returns the number of bytes which are printed into the buffer. | 150 | * Returns the number of bytes which are printed into the buffer. |
@@ -159,15 +160,15 @@ static ssize_t i2o_device_show_class_id(struct device *dev, | |||
159 | } | 160 | } |
160 | 161 | ||
161 | /** | 162 | /** |
162 | * i2o_device_class_show_tid - Displays TID of I2O device | 163 | * i2o_device_show_tid - Displays TID of I2O device |
163 | * @cd: class device of which the TID should be displayed | 164 | * @dev: device of which the TID should be displayed |
164 | * @buf: buffer into which the class id should be printed | 165 | * @attr: pointer to device attribute |
166 | * @buf: buffer into which the TID should be printed | ||
165 | * | 167 | * |
166 | * Returns the number of bytes which are printed into the buffer. | 168 | * Returns the number of bytes which are printed into the buffer. |
167 | */ | 169 | */ |
168 | static ssize_t i2o_device_show_tid(struct device *dev, | 170 | static ssize_t i2o_device_show_tid(struct device *dev, |
169 | struct device_attribute *attr, | 171 | struct device_attribute *attr, char *buf) |
170 | char *buf) | ||
171 | { | 172 | { |
172 | struct i2o_device *i2o_dev = to_i2o_device(dev); | 173 | struct i2o_device *i2o_dev = to_i2o_device(dev); |
173 | 174 | ||
@@ -209,66 +210,6 @@ static struct i2o_device *i2o_device_alloc(void) | |||
209 | } | 210 | } |
210 | 211 | ||
211 | /** | 212 | /** |
212 | * i2o_setup_sysfs_links - Adds attributes to the I2O device | ||
213 | * @cd: I2O class device which is added to the I2O device class | ||
214 | * | ||
215 | * This function get called when a I2O device is added to the class. It | ||
216 | * creates the attributes for each device and creates user/parent symlink | ||
217 | * if necessary. | ||
218 | * | ||
219 | * Returns 0 on success or negative error code on failure. | ||
220 | */ | ||
221 | static void i2o_setup_sysfs_links(struct i2o_device *i2o_dev) | ||
222 | { | ||
223 | struct i2o_controller *c = i2o_dev->iop; | ||
224 | struct i2o_device *tmp; | ||
225 | |||
226 | /* create user entries for this device */ | ||
227 | tmp = i2o_iop_find_device(i2o_dev->iop, i2o_dev->lct_data.user_tid); | ||
228 | if (tmp && tmp != i2o_dev) | ||
229 | sysfs_create_link(&i2o_dev->device.kobj, | ||
230 | &tmp->device.kobj, "user"); | ||
231 | |||
232 | /* create user entries refering to this device */ | ||
233 | list_for_each_entry(tmp, &c->devices, list) | ||
234 | if (tmp->lct_data.user_tid == i2o_dev->lct_data.tid && | ||
235 | tmp != i2o_dev) | ||
236 | sysfs_create_link(&tmp->device.kobj, | ||
237 | &i2o_dev->device.kobj, "user"); | ||
238 | |||
239 | /* create parent entries for this device */ | ||
240 | tmp = i2o_iop_find_device(i2o_dev->iop, i2o_dev->lct_data.parent_tid); | ||
241 | if (tmp && tmp != i2o_dev) | ||
242 | sysfs_create_link(&i2o_dev->device.kobj, | ||
243 | &tmp->device.kobj, "parent"); | ||
244 | |||
245 | /* create parent entries refering to this device */ | ||
246 | list_for_each_entry(tmp, &c->devices, list) | ||
247 | if (tmp->lct_data.parent_tid == i2o_dev->lct_data.tid && | ||
248 | tmp != i2o_dev) | ||
249 | sysfs_create_link(&tmp->device.kobj, | ||
250 | &i2o_dev->device.kobj, "parent"); | ||
251 | } | ||
252 | |||
253 | static void i2o_remove_sysfs_links(struct i2o_device *i2o_dev) | ||
254 | { | ||
255 | struct i2o_controller *c = i2o_dev->iop; | ||
256 | struct i2o_device *tmp; | ||
257 | |||
258 | sysfs_remove_link(&i2o_dev->device.kobj, "parent"); | ||
259 | sysfs_remove_link(&i2o_dev->device.kobj, "user"); | ||
260 | |||
261 | list_for_each_entry(tmp, &c->devices, list) { | ||
262 | if (tmp->lct_data.parent_tid == i2o_dev->lct_data.tid) | ||
263 | sysfs_remove_link(&tmp->device.kobj, "parent"); | ||
264 | if (tmp->lct_data.user_tid == i2o_dev->lct_data.tid) | ||
265 | sysfs_remove_link(&tmp->device.kobj, "user"); | ||
266 | } | ||
267 | } | ||
268 | |||
269 | |||
270 | |||
271 | /** | ||
272 | * i2o_device_add - allocate a new I2O device and add it to the IOP | 213 | * i2o_device_add - allocate a new I2O device and add it to the IOP |
273 | * @iop: I2O controller where the device is on | 214 | * @iop: I2O controller where the device is on |
274 | * @entry: LCT entry of the I2O device | 215 | * @entry: LCT entry of the I2O device |
@@ -282,33 +223,57 @@ static void i2o_remove_sysfs_links(struct i2o_device *i2o_dev) | |||
282 | static struct i2o_device *i2o_device_add(struct i2o_controller *c, | 223 | static struct i2o_device *i2o_device_add(struct i2o_controller *c, |
283 | i2o_lct_entry * entry) | 224 | i2o_lct_entry * entry) |
284 | { | 225 | { |
285 | struct i2o_device *dev; | 226 | struct i2o_device *i2o_dev, *tmp; |
286 | 227 | ||
287 | dev = i2o_device_alloc(); | 228 | i2o_dev = i2o_device_alloc(); |
288 | if (IS_ERR(dev)) { | 229 | if (IS_ERR(i2o_dev)) { |
289 | printk(KERN_ERR "i2o: unable to allocate i2o device\n"); | 230 | printk(KERN_ERR "i2o: unable to allocate i2o device\n"); |
290 | return dev; | 231 | return i2o_dev; |
291 | } | 232 | } |
292 | 233 | ||
293 | dev->lct_data = *entry; | 234 | i2o_dev->lct_data = *entry; |
294 | dev->iop = c; | ||
295 | 235 | ||
296 | snprintf(dev->device.bus_id, BUS_ID_SIZE, "%d:%03x", c->unit, | 236 | snprintf(i2o_dev->device.bus_id, BUS_ID_SIZE, "%d:%03x", c->unit, |
297 | dev->lct_data.tid); | 237 | i2o_dev->lct_data.tid); |
298 | 238 | ||
299 | dev->device.parent = &c->device; | 239 | i2o_dev->iop = c; |
240 | i2o_dev->device.parent = &c->device; | ||
300 | 241 | ||
301 | device_register(&dev->device); | 242 | device_register(&i2o_dev->device); |
302 | 243 | ||
303 | list_add_tail(&dev->list, &c->devices); | 244 | list_add_tail(&i2o_dev->list, &c->devices); |
304 | 245 | ||
305 | i2o_setup_sysfs_links(dev); | 246 | /* create user entries for this device */ |
247 | tmp = i2o_iop_find_device(i2o_dev->iop, i2o_dev->lct_data.user_tid); | ||
248 | if (tmp && (tmp != i2o_dev)) | ||
249 | sysfs_create_link(&i2o_dev->device.kobj, &tmp->device.kobj, | ||
250 | "user"); | ||
306 | 251 | ||
307 | i2o_driver_notify_device_add_all(dev); | 252 | /* create user entries refering to this device */ |
253 | list_for_each_entry(tmp, &c->devices, list) | ||
254 | if ((tmp->lct_data.user_tid == i2o_dev->lct_data.tid) | ||
255 | && (tmp != i2o_dev)) | ||
256 | sysfs_create_link(&tmp->device.kobj, | ||
257 | &i2o_dev->device.kobj, "user"); | ||
308 | 258 | ||
309 | pr_debug("i2o: device %s added\n", dev->device.bus_id); | 259 | /* create parent entries for this device */ |
260 | tmp = i2o_iop_find_device(i2o_dev->iop, i2o_dev->lct_data.parent_tid); | ||
261 | if (tmp && (tmp != i2o_dev)) | ||
262 | sysfs_create_link(&i2o_dev->device.kobj, &tmp->device.kobj, | ||
263 | "parent"); | ||
310 | 264 | ||
311 | return dev; | 265 | /* create parent entries refering to this device */ |
266 | list_for_each_entry(tmp, &c->devices, list) | ||
267 | if ((tmp->lct_data.parent_tid == i2o_dev->lct_data.tid) | ||
268 | && (tmp != i2o_dev)) | ||
269 | sysfs_create_link(&tmp->device.kobj, | ||
270 | &i2o_dev->device.kobj, "parent"); | ||
271 | |||
272 | i2o_driver_notify_device_add_all(i2o_dev); | ||
273 | |||
274 | pr_debug("i2o: device %s added\n", i2o_dev->device.bus_id); | ||
275 | |||
276 | return i2o_dev; | ||
312 | } | 277 | } |
313 | 278 | ||
314 | /** | 279 | /** |
@@ -321,9 +286,22 @@ static struct i2o_device *i2o_device_add(struct i2o_controller *c, | |||
321 | */ | 286 | */ |
322 | void i2o_device_remove(struct i2o_device *i2o_dev) | 287 | void i2o_device_remove(struct i2o_device *i2o_dev) |
323 | { | 288 | { |
289 | struct i2o_device *tmp; | ||
290 | struct i2o_controller *c = i2o_dev->iop; | ||
291 | |||
324 | i2o_driver_notify_device_remove_all(i2o_dev); | 292 | i2o_driver_notify_device_remove_all(i2o_dev); |
325 | i2o_remove_sysfs_links(i2o_dev); | 293 | |
294 | sysfs_remove_link(&i2o_dev->device.kobj, "parent"); | ||
295 | sysfs_remove_link(&i2o_dev->device.kobj, "user"); | ||
296 | |||
297 | list_for_each_entry(tmp, &c->devices, list) { | ||
298 | if (tmp->lct_data.parent_tid == i2o_dev->lct_data.tid) | ||
299 | sysfs_remove_link(&tmp->device.kobj, "parent"); | ||
300 | if (tmp->lct_data.user_tid == i2o_dev->lct_data.tid) | ||
301 | sysfs_remove_link(&tmp->device.kobj, "user"); | ||
302 | } | ||
326 | list_del(&i2o_dev->list); | 303 | list_del(&i2o_dev->list); |
304 | |||
327 | device_unregister(&i2o_dev->device); | 305 | device_unregister(&i2o_dev->device); |
328 | } | 306 | } |
329 | 307 | ||
diff --git a/drivers/message/i2o/driver.c b/drivers/message/i2o/driver.c index 0fb9c4e2ad4c..25292b36e2d9 100644 --- a/drivers/message/i2o/driver.c +++ b/drivers/message/i2o/driver.c | |||
@@ -61,8 +61,6 @@ static int i2o_bus_match(struct device *dev, struct device_driver *drv) | |||
61 | }; | 61 | }; |
62 | 62 | ||
63 | /* I2O bus type */ | 63 | /* I2O bus type */ |
64 | extern struct device_attribute i2o_device_attrs[]; | ||
65 | |||
66 | struct bus_type i2o_bus_type = { | 64 | struct bus_type i2o_bus_type = { |
67 | .name = "i2o", | 65 | .name = "i2o", |
68 | .match = i2o_bus_match, | 66 | .match = i2o_bus_match, |
diff --git a/drivers/message/i2o/iop.c b/drivers/message/i2o/iop.c index f86abb42bf89..7411a0504bf2 100644 --- a/drivers/message/i2o/iop.c +++ b/drivers/message/i2o/iop.c | |||
@@ -806,7 +806,6 @@ void i2o_iop_remove(struct i2o_controller *c) | |||
806 | list_for_each_entry_safe(dev, tmp, &c->devices, list) | 806 | list_for_each_entry_safe(dev, tmp, &c->devices, list) |
807 | i2o_device_remove(dev); | 807 | i2o_device_remove(dev); |
808 | 808 | ||
809 | class_device_unregister(c->classdev); | ||
810 | device_del(&c->device); | 809 | device_del(&c->device); |
811 | 810 | ||
812 | /* Ask the IOP to switch to RESET state */ | 811 | /* Ask the IOP to switch to RESET state */ |
@@ -1050,9 +1049,6 @@ static void i2o_iop_release(struct device *dev) | |||
1050 | i2o_iop_free(c); | 1049 | i2o_iop_free(c); |
1051 | }; | 1050 | }; |
1052 | 1051 | ||
1053 | /* I2O controller class */ | ||
1054 | static struct class *i2o_controller_class; | ||
1055 | |||
1056 | /** | 1052 | /** |
1057 | * i2o_iop_alloc - Allocate and initialize a i2o_controller struct | 1053 | * i2o_iop_alloc - Allocate and initialize a i2o_controller struct |
1058 | * | 1054 | * |
@@ -1124,36 +1120,29 @@ int i2o_iop_add(struct i2o_controller *c) | |||
1124 | goto iop_reset; | 1120 | goto iop_reset; |
1125 | } | 1121 | } |
1126 | 1122 | ||
1127 | c->classdev = class_device_create(i2o_controller_class, NULL, MKDEV(0,0), | ||
1128 | &c->device, "iop%d", c->unit); | ||
1129 | if (IS_ERR(c->classdev)) { | ||
1130 | osm_err("%s: could not add controller class\n", c->name); | ||
1131 | goto device_del; | ||
1132 | } | ||
1133 | |||
1134 | osm_info("%s: Activating I2O controller...\n", c->name); | 1123 | osm_info("%s: Activating I2O controller...\n", c->name); |
1135 | osm_info("%s: This may take a few minutes if there are many devices\n", | 1124 | osm_info("%s: This may take a few minutes if there are many devices\n", |
1136 | c->name); | 1125 | c->name); |
1137 | 1126 | ||
1138 | if ((rc = i2o_iop_activate(c))) { | 1127 | if ((rc = i2o_iop_activate(c))) { |
1139 | osm_err("%s: could not activate controller\n", c->name); | 1128 | osm_err("%s: could not activate controller\n", c->name); |
1140 | goto class_del; | 1129 | goto device_del; |
1141 | } | 1130 | } |
1142 | 1131 | ||
1143 | osm_debug("%s: building sys table...\n", c->name); | 1132 | osm_debug("%s: building sys table...\n", c->name); |
1144 | 1133 | ||
1145 | if ((rc = i2o_systab_build())) | 1134 | if ((rc = i2o_systab_build())) |
1146 | goto class_del; | 1135 | goto device_del; |
1147 | 1136 | ||
1148 | osm_debug("%s: online controller...\n", c->name); | 1137 | osm_debug("%s: online controller...\n", c->name); |
1149 | 1138 | ||
1150 | if ((rc = i2o_iop_online(c))) | 1139 | if ((rc = i2o_iop_online(c))) |
1151 | goto class_del; | 1140 | goto device_del; |
1152 | 1141 | ||
1153 | osm_debug("%s: getting LCT...\n", c->name); | 1142 | osm_debug("%s: getting LCT...\n", c->name); |
1154 | 1143 | ||
1155 | if ((rc = i2o_exec_lct_get(c))) | 1144 | if ((rc = i2o_exec_lct_get(c))) |
1156 | goto class_del; | 1145 | goto device_del; |
1157 | 1146 | ||
1158 | list_add(&c->list, &i2o_controllers); | 1147 | list_add(&c->list, &i2o_controllers); |
1159 | 1148 | ||
@@ -1163,9 +1152,6 @@ int i2o_iop_add(struct i2o_controller *c) | |||
1163 | 1152 | ||
1164 | return 0; | 1153 | return 0; |
1165 | 1154 | ||
1166 | class_del: | ||
1167 | class_device_unregister(c->classdev); | ||
1168 | |||
1169 | device_del: | 1155 | device_del: |
1170 | device_del(&c->device); | 1156 | device_del(&c->device); |
1171 | 1157 | ||
@@ -1225,14 +1211,8 @@ static int __init i2o_iop_init(void) | |||
1225 | 1211 | ||
1226 | printk(KERN_INFO OSM_DESCRIPTION " v" OSM_VERSION "\n"); | 1212 | printk(KERN_INFO OSM_DESCRIPTION " v" OSM_VERSION "\n"); |
1227 | 1213 | ||
1228 | i2o_controller_class = class_create(THIS_MODULE, "i2o_controller"); | ||
1229 | if (IS_ERR(i2o_controller_class)) { | ||
1230 | osm_err("can't register class i2o_controller\n"); | ||
1231 | goto exit; | ||
1232 | } | ||
1233 | |||
1234 | if ((rc = i2o_driver_init())) | 1214 | if ((rc = i2o_driver_init())) |
1235 | goto class_exit; | 1215 | goto exit; |
1236 | 1216 | ||
1237 | if ((rc = i2o_exec_init())) | 1217 | if ((rc = i2o_exec_init())) |
1238 | goto driver_exit; | 1218 | goto driver_exit; |
@@ -1248,9 +1228,6 @@ static int __init i2o_iop_init(void) | |||
1248 | driver_exit: | 1228 | driver_exit: |
1249 | i2o_driver_exit(); | 1229 | i2o_driver_exit(); |
1250 | 1230 | ||
1251 | class_exit: | ||
1252 | class_destroy(i2o_controller_class); | ||
1253 | |||
1254 | exit: | 1231 | exit: |
1255 | return rc; | 1232 | return rc; |
1256 | } | 1233 | } |
@@ -1265,7 +1242,6 @@ static void __exit i2o_iop_exit(void) | |||
1265 | i2o_pci_exit(); | 1242 | i2o_pci_exit(); |
1266 | i2o_exec_exit(); | 1243 | i2o_exec_exit(); |
1267 | i2o_driver_exit(); | 1244 | i2o_driver_exit(); |
1268 | class_destroy(i2o_controller_class); | ||
1269 | }; | 1245 | }; |
1270 | 1246 | ||
1271 | module_init(i2o_iop_init); | 1247 | module_init(i2o_iop_init); |
diff --git a/include/linux/i2o.h b/include/linux/i2o.h index 9e359a981221..4c18b7711bd9 100644 --- a/include/linux/i2o.h +++ b/include/linux/i2o.h | |||
@@ -561,7 +561,6 @@ struct i2o_controller { | |||
561 | struct resource mem_resource; /* Mem resource allocated to the IOP */ | 561 | struct resource mem_resource; /* Mem resource allocated to the IOP */ |
562 | 562 | ||
563 | struct device device; | 563 | struct device device; |
564 | struct class_device *classdev; /* I2O controller class device */ | ||
565 | struct i2o_device *exec; /* Executive */ | 564 | struct i2o_device *exec; /* Executive */ |
566 | #if BITS_PER_LONG == 64 | 565 | #if BITS_PER_LONG == 64 |
567 | spinlock_t context_list_lock; /* lock for context_list */ | 566 | spinlock_t context_list_lock; /* lock for context_list */ |