28 #include <linux/module.h>
29 #include <linux/kernel.h>
30 #include <linux/slab.h>
31 #include <linux/pci.h>
41 #define DRIVER_DESC "CompactPCI Hot Plug Core"
43 #define MY_NAME "cpci_hotplug"
45 #define dbg(format, arg...) \
48 printk (KERN_DEBUG "%s: " format "\n", \
51 #define err(format, arg...) printk(KERN_ERR "%s: " format "\n", MY_NAME , ## arg)
52 #define info(format, arg...) printk(KERN_INFO "%s: " format "\n", MY_NAME , ## arg)
53 #define warn(format, arg...) printk(KERN_WARNING "%s: " format "\n", MY_NAME , ## arg)
63 static int thread_finished;
65 static int enable_slot(
struct hotplug_slot *
slot);
66 static int disable_slot(
struct hotplug_slot *
slot);
67 static int set_attention_status(
struct hotplug_slot *
slot,
u8 value);
68 static int get_power_status(
struct hotplug_slot *
slot,
u8 *
value);
69 static int get_attention_status(
struct hotplug_slot *
slot,
u8 *
value);
70 static int get_adapter_status(
struct hotplug_slot *
slot,
u8 *
value);
71 static int get_latch_status(
struct hotplug_slot *
slot,
u8 *
value);
84 update_latch_status(
struct hotplug_slot *hotplug_slot,
u8 value)
94 update_adapter_status(
struct hotplug_slot *hotplug_slot,
u8 value)
104 enable_slot(
struct hotplug_slot *hotplug_slot)
106 struct slot *
slot = hotplug_slot->private;
109 dbg(
"%s - physical_slot = %s", __func__, slot_name(slot));
111 if (controller->
ops->set_power)
112 retval = controller->
ops->set_power(slot, 1);
117 disable_slot(
struct hotplug_slot *hotplug_slot)
119 struct slot *slot = hotplug_slot->private;
122 dbg(
"%s - physical_slot = %s", __func__, slot_name(slot));
127 dbg(
"%s - unconfiguring slot %s", __func__, slot_name(slot));
129 err(
"%s - could not unconfigure slot %s",
130 __func__, slot_name(slot));
133 dbg(
"%s - finished unconfiguring slot %s", __func__, slot_name(slot));
137 err(
"%s - could not clear EXT for slot %s",
138 __func__, slot_name(slot));
144 if (controller->
ops->set_power)
145 if ((retval = controller->
ops->set_power(slot, 0)))
149 warn(
"failure to update adapter file");
161 cpci_get_power_status(
struct slot *slot)
165 if (controller->
ops->get_power)
166 power = controller->
ops->get_power(slot);
171 get_power_status(
struct hotplug_slot *hotplug_slot,
u8 *
value)
173 struct slot *slot = hotplug_slot->private;
175 *value = cpci_get_power_status(slot);
180 get_attention_status(
struct hotplug_slot *hotplug_slot,
u8 *
value)
182 struct slot *slot = hotplug_slot->private;
189 set_attention_status(
struct hotplug_slot *hotplug_slot,
u8 status)
195 get_adapter_status(
struct hotplug_slot *hotplug_slot,
u8 *
value)
197 *value = hotplug_slot->info->adapter_status;
202 get_latch_status(
struct hotplug_slot *hotplug_slot,
u8 *
value)
204 *value = hotplug_slot->info->latch_status;
208 static void release_slot(
struct hotplug_slot *hotplug_slot)
210 struct slot *slot = hotplug_slot->private;
219 #define SLOT_NAME_SIZE 6
225 struct hotplug_slot *hotplug_slot;
231 if (!(controller && bus))
238 for (i = first; i <= last; ++
i) {
239 slot = kzalloc(
sizeof (
struct slot),
GFP_KERNEL);
246 kzalloc(
sizeof (
struct hotplug_slot),
GFP_KERNEL);
258 hotplug_slot->info =
info;
266 hotplug_slot->private =
slot;
267 hotplug_slot->release = &release_slot;
268 hotplug_slot->ops = &cpci_hotplug_slot_ops;
274 dbg(
"initializing slot %s", name);
278 dbg(
"registering slot %s", name);
281 err(
"pci_hp_register failed with error %d", status);
284 dbg(
"slot registered with name: %s", slot_name(slot));
316 if (slot->
bus == bus) {
320 dbg(
"deregistering slot %s", slot_name(slot));
323 err(
"pci_hp_deregister failed with error %d",
335 cpci_hp_intr(
int irq,
void *
data)
337 dbg(
"entered cpci_hp_intr");
341 !controller->
ops->check_irq(controller->
dev_id)) {
342 dbg(
"exited cpci_hp_intr, not our interrupt");
347 controller->
ops->disable_irq();
360 init_slots(
int clear_ins)
365 dbg(
"%s - enter", __func__);
372 dbg(
"%s - looking at slot %s", __func__, slot_name(slot));
374 dbg(
"%s - cleared INS for slot %s",
375 __func__, slot_name(slot));
379 warn(
"failure to update adapter file");
381 warn(
"failure to update latch file");
386 dbg(
"%s - exit", __func__);
401 err(
"no slots registered, shutting down");
404 extracted = inserted = 0;
406 dbg(
"%s - looking at slot %s", __func__, slot_name(slot));
413 warn(
"slot %s already inserted",
420 dbg(
"%s - slot %s inserted", __func__, slot_name(slot));
424 dbg(
"%s - slot %s HS_CSR (1) = %04x",
425 __func__, slot_name(slot), hs_csr);
428 dbg(
"%s - configuring slot %s",
429 __func__, slot_name(slot));
431 err(
"%s - could not configure slot %s",
432 __func__, slot_name(slot));
435 dbg(
"%s - finished configuring slot %s",
436 __func__, slot_name(slot));
440 dbg(
"%s - slot %s HS_CSR (2) = %04x",
441 __func__, slot_name(slot), hs_csr);
444 warn(
"failure to update latch file");
447 warn(
"failure to update adapter file");
453 dbg(
"%s - slot %s HS_CSR (3) = %04x",
454 __func__, slot_name(slot), hs_csr);
459 dbg(
"%s - slot %s extracted",
460 __func__, slot_name(slot));
464 dbg(
"%s - slot %s HS_CSR = %04x",
465 __func__, slot_name(slot), hs_csr);
469 warn(
"failure to update latch file");
477 if (hs_csr == 0xffff) {
482 err(
"card in slot %s was improperly removed",
485 warn(
"failure to update adapter file");
492 dbg(
"inserted=%d, extracted=%d, extracting=%d",
494 if (inserted || extracted)
497 err(
"cannot find ENUM# source, shutting down");
505 event_thread(
void *data)
509 dbg(
"%s - event thread started", __func__);
511 dbg(
"event thread sleeping");
522 dbg(
"%s - error checking slots", __func__);
531 dbg(
"%s - re-enabling irq", __func__);
532 controller->
ops->enable_irq();
540 poll_thread(
void *data)
547 if (controller->
ops->query_enum()) {
554 dbg(
"%s - error checking slots", __func__);
567 cpci_start_thread(
void)
573 if (IS_ERR(cpci_thread)) {
574 err(
"Can't start up our thread");
575 return PTR_ERR(cpci_thread);
582 cpci_stop_thread(
void)
595 if (!(new_controller && new_controller->
ops))
597 if (new_controller->
irq) {
598 if (!(new_controller->
ops->enable_irq &&
599 new_controller->
ops->disable_irq))
605 new_controller->
dev_id)) {
606 err(
"Can't get irq %d for the hotplug cPCI controller",
607 new_controller->
irq);
610 dbg(
"%s - acquired controller irq %d",
611 __func__, new_controller->
irq);
614 controller = new_controller;
646 if (!thread_finished)
660 static int first = 1;
663 dbg(
"%s - enter", __func__);
674 status = init_slots(first);
680 status = cpci_start_thread();
683 dbg(
"%s - thread started", __func__);
685 if (controller->
irq) {
687 dbg(
"%s - enabling irq", __func__);
688 controller->
ops->enable_irq();
690 dbg(
"%s - exit", __func__);
699 if (controller->
irq) {
701 dbg(
"%s - disabling irq", __func__);
702 controller->
ops->disable_irq();