2 * IBM Hot Plug Controller Driver
4 * Written By: Chuck Cole, Jyoti Shah, Tong Yu, Irene Zubarev, IBM Corporation
6 * Copyright (C) 2001,2003 Greg Kroah-Hartman (greg@kroah.com)
7 * Copyright (C) 2001-2003 IBM Corp.
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or (at
14 * your option) any later version.
16 * This program is distributed in the hope that it will be useful, but
17 * WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
19 * NON INFRINGEMENT. See the GNU General Public License for more
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 * Send feedback to <gregkh@us.ibm.com>
30 #include <linux/init.h>
31 #include <linux/module.h>
32 #include <linux/slab.h>
33 #include <linux/pci.h>
34 #include <linux/interrupt.h>
35 #include <linux/delay.h>
36 #include <linux/wait.h>
38 #include <asm/pci_x86.h> /* for struct irq_routing_table */
41 #define attn_on(sl) ibmphp_hpc_writeslot (sl, HPC_SLOT_ATTNON)
42 #define attn_off(sl) ibmphp_hpc_writeslot (sl, HPC_SLOT_ATTNOFF)
43 #define attn_LED_blink(sl) ibmphp_hpc_writeslot (sl, HPC_SLOT_BLINKLED)
44 #define get_ctrl_revision(sl, rev) ibmphp_hpc_readslot (sl, READ_REVLEVEL, rev)
45 #define get_hpc_options(sl, opt) ibmphp_hpc_readslot (sl, READ_HPCOPTIONS, opt)
47 #define DRIVER_VERSION "0.6"
48 #define DRIVER_DESC "IBM Hot Plug PCI Controller Driver"
53 module_param(debug, bool, S_IRUGO | S_IWUSR);
54 MODULE_PARM_DESC (debug, "Debugging mode enabled or not");
55 MODULE_LICENSE ("GPL");
56 MODULE_DESCRIPTION (DRIVER_DESC);
58 struct pci_bus *ibmphp_pci_bus;
61 static int irqs[16]; /* PIC mode IRQ's we're using so far (in case MPS
62 * tables don't provide default info for empty slots */
67 static int get_max_adapter_speed_1 (struct hotplug_slot *, u8 *, u8);
69 static inline int get_max_adapter_speed (struct hotplug_slot *hs, u8 *value)
71 return get_max_adapter_speed_1 (hs, value, 1);
74 static inline int get_cur_bus_info(struct slot **sl)
77 struct slot * slot_cur = *sl;
79 debug("options = %x\n", slot_cur->ctrl->options);
80 debug("revision = %x\n", slot_cur->ctrl->revision);
82 if (READ_BUS_STATUS(slot_cur->ctrl))
83 rc = ibmphp_hpc_readslot(slot_cur, READ_BUSSTATUS, NULL);
88 slot_cur->bus_on->current_speed = CURRENT_BUS_SPEED(slot_cur->busstatus);
89 if (READ_BUS_MODE(slot_cur->ctrl))
90 slot_cur->bus_on->current_bus_mode =
91 CURRENT_BUS_MODE(slot_cur->busstatus);
93 slot_cur->bus_on->current_bus_mode = 0xFF;
95 debug("busstatus = %x, bus_speed = %x, bus_mode = %x\n",
97 slot_cur->bus_on->current_speed,
98 slot_cur->bus_on->current_bus_mode);
104 static inline int slot_update(struct slot **sl)
107 rc = ibmphp_hpc_readslot(*sl, READ_ALLSTAT, NULL);
111 rc = get_cur_bus_info(sl);
115 static int __init get_max_slots (void)
117 struct slot * slot_cur;
118 struct list_head * tmp;
121 list_for_each(tmp, &ibmphp_slot_head) {
122 slot_cur = list_entry(tmp, struct slot, ibm_slot_list);
123 /* sometimes the hot-pluggable slots start with 4 (not always from 1) */
124 slot_count = max(slot_count, slot_cur->number);
129 /* This routine will put the correct slot->device information per slot. It's
130 * called from initialization of the slot structures. It will also assign
131 * interrupt numbers per each slot.
132 * Parameters: struct slot
133 * Returns 0 or errors
135 int ibmphp_init_devno(struct slot **cur_slot)
137 struct irq_routing_table *rtable;
142 rtable = pcibios_get_irq_routing_table();
144 err("no BIOS routing table...\n");
148 len = (rtable->size - sizeof(struct irq_routing_table)) /
149 sizeof(struct irq_info);
155 for (loop = 0; loop < len; loop++) {
156 if ((*cur_slot)->number == rtable->slots[loop].slot &&
157 (*cur_slot)->bus == rtable->slots[loop].bus) {
158 int ioapic = -1, ioapic_pin = -1;
159 int triggering, polarity;
161 (*cur_slot)->device = PCI_SLOT(rtable->slots[loop].devfn);
162 for (i = 0; i < 4; i++)
163 (*cur_slot)->irq[i] = IO_APIC_get_PCI_irq_vector((int) (*cur_slot)->bus,
164 (int) (*cur_slot)->device, i.
165 &ioapic, &ioapic_pin,
166 &triggering, &polarity);
168 debug("(*cur_slot)->irq[0] = %x\n",
169 (*cur_slot)->irq[0]);
170 debug("(*cur_slot)->irq[1] = %x\n",
171 (*cur_slot)->irq[1]);
172 debug("(*cur_slot)->irq[2] = %x\n",
173 (*cur_slot)->irq[2]);
174 debug("(*cur_slot)->irq[3] = %x\n",
175 (*cur_slot)->irq[3]);
177 debug("rtable->exlusive_irqs = %x\n",
178 rtable->exclusive_irqs);
179 debug("rtable->slots[loop].irq[0].bitmap = %x\n",
180 rtable->slots[loop].irq[0].bitmap);
181 debug("rtable->slots[loop].irq[1].bitmap = %x\n",
182 rtable->slots[loop].irq[1].bitmap);
183 debug("rtable->slots[loop].irq[2].bitmap = %x\n",
184 rtable->slots[loop].irq[2].bitmap);
185 debug("rtable->slots[loop].irq[3].bitmap = %x\n",
186 rtable->slots[loop].irq[3].bitmap);
188 debug("rtable->slots[loop].irq[0].link = %x\n",
189 rtable->slots[loop].irq[0].link);
190 debug("rtable->slots[loop].irq[1].link = %x\n",
191 rtable->slots[loop].irq[1].link);
192 debug("rtable->slots[loop].irq[2].link = %x\n",
193 rtable->slots[loop].irq[2].link);
194 debug("rtable->slots[loop].irq[3].link = %x\n",
195 rtable->slots[loop].irq[3].link);
196 debug("end of init_devno\n");
206 static inline int power_on(struct slot *slot_cur)
208 u8 cmd = HPC_SLOT_ON;
211 retval = ibmphp_hpc_writeslot(slot_cur, cmd);
213 err("power on failed\n");
216 if (CTLR_RESULT(slot_cur->ctrl->status)) {
217 err("command not completed successfully in power_on\n");
220 msleep(3000); /* For ServeRAID cards, and some 66 PCI */
224 static inline int power_off(struct slot *slot_cur)
226 u8 cmd = HPC_SLOT_OFF;
229 retval = ibmphp_hpc_writeslot(slot_cur, cmd);
231 err("power off failed\n");
234 if (CTLR_RESULT(slot_cur->ctrl->status)) {
235 err("command not completed successfully in power_off\n");
241 static int set_attention_status(struct hotplug_slot *hotplug_slot, u8 value)
245 u8 cmd = 0x00; /* avoid compiler warning */
247 debug("set_attention_status - Entry hotplug_slot[%lx] value[%x]\n",
248 (ulong) hotplug_slot, value);
249 ibmphp_lock_operations();
254 case HPC_SLOT_ATTN_OFF:
255 cmd = HPC_SLOT_ATTNOFF;
257 case HPC_SLOT_ATTN_ON:
258 cmd = HPC_SLOT_ATTNON;
260 case HPC_SLOT_ATTN_BLINK:
261 cmd = HPC_SLOT_BLINKLED;
265 err("set_attention_status - Error : invalid input [%x]\n",
270 pslot = hotplug_slot->private;
272 rc = ibmphp_hpc_writeslot(pslot, cmd);
279 ibmphp_unlock_operations();
281 debug("set_attention_status - Exit rc[%d]\n", rc);
285 static int get_attention_status(struct hotplug_slot *hotplug_slot, u8 * value)
291 debug("get_attention_status - Entry hotplug_slot[%lx] pvalue[%lx]\n",
292 (ulong) hotplug_slot, (ulong) value);
294 ibmphp_lock_operations();
296 pslot = hotplug_slot->private;
298 memcpy(&myslot, pslot, sizeof(struct slot));
299 rc = ibmphp_hpc_readslot(pslot, READ_SLOTSTATUS,
302 rc = ibmphp_hpc_readslot(pslot,
304 &(myslot.ext_status));
306 *value = SLOT_ATTN(myslot.status,
311 ibmphp_unlock_operations();
312 debug("get_attention_status - Exit rc[%d] value[%x]\n", rc, *value);
316 static int get_latch_status(struct hotplug_slot *hotplug_slot, u8 * value)
322 debug("get_latch_status - Entry hotplug_slot[%lx] pvalue[%lx]\n",
323 (ulong) hotplug_slot, (ulong) value);
324 ibmphp_lock_operations();
326 pslot = hotplug_slot->private;
328 memcpy(&myslot, pslot, sizeof(struct slot));
329 rc = ibmphp_hpc_readslot(pslot, READ_SLOTSTATUS,
332 *value = SLOT_LATCH(myslot.status);
336 ibmphp_unlock_operations();
337 debug("get_latch_status - Exit rc[%d] rc[%x] value[%x]\n",
343 static int get_power_status(struct hotplug_slot *hotplug_slot, u8 * value)
349 debug("get_power_status - Entry hotplug_slot[%lx] pvalue[%lx]\n",
350 (ulong) hotplug_slot, (ulong) value);
351 ibmphp_lock_operations();
353 pslot = hotplug_slot->private;
355 memcpy(&myslot, pslot, sizeof(struct slot));
356 rc = ibmphp_hpc_readslot(pslot, READ_SLOTSTATUS,
359 *value = SLOT_PWRGD(myslot.status);
363 ibmphp_unlock_operations();
364 debug("get_power_status - Exit rc[%d] rc[%x] value[%x]\n",
369 static int get_adapter_present(struct hotplug_slot *hotplug_slot, u8 * value)
376 debug("get_adapter_status - Entry hotplug_slot[%lx] pvalue[%lx]\n",
377 (ulong) hotplug_slot, (ulong) value);
378 ibmphp_lock_operations();
380 pslot = hotplug_slot->private;
382 memcpy(&myslot, pslot, sizeof(struct slot));
383 rc = ibmphp_hpc_readslot(pslot, READ_SLOTSTATUS,
386 present = SLOT_PRESENT(myslot.status);
387 if (present == HPC_SLOT_EMPTY)
395 ibmphp_unlock_operations();
396 debug("get_adapter_present - Exit rc[%d] value[%x]\n", rc, *value);
400 static int get_max_bus_speed(struct hotplug_slot *hotplug_slot, enum pci_bus_speed *value)
406 debug("%s - Entry hotplug_slot[%p] pvalue[%p]\n", __func__,
407 hotplug_slot, value);
409 ibmphp_lock_operations();
412 pslot = hotplug_slot->private;
415 mode = pslot->supported_bus_mode;
416 *value = pslot->supported_speed;
421 if (mode == BUS_MODE_PCIX)
426 *value = pslot->supported_speed + 0x01;
429 /* Note (will need to change): there would be soon 256, 512 also */
435 ibmphp_unlock_operations();
436 debug("%s - Exit rc[%d] value[%x]\n", __func__, rc, *value);
440 static int get_cur_bus_speed(struct hotplug_slot *hotplug_slot, enum pci_bus_speed *value)
446 debug("%s - Entry hotplug_slot[%p] pvalue[%p]\n", __func__,
447 hotplug_slot, value);
449 ibmphp_lock_operations();
452 pslot = hotplug_slot->private;
454 rc = get_cur_bus_info(&pslot);
456 mode = pslot->bus_on->current_bus_mode;
457 *value = pslot->bus_on->current_speed;
462 if (mode == BUS_MODE_PCIX)
464 else if (mode == BUS_MODE_PCI)
467 *value = PCI_SPEED_UNKNOWN;
474 /* Note of change: there would also be 256, 512 soon */
481 ibmphp_unlock_operations();
482 debug("%s - Exit rc[%d] value[%x]\n", __func__, rc, *value);
487 static int get_max_adapter_speed_1(struct hotplug_slot *hotplug_slot, u8 * value, u8 flag)
493 debug("get_max_adapter_speed_1 - Entry hotplug_slot[%lx] pvalue[%lx]\n",
494 (ulong)hotplug_slot, (ulong) value);
497 ibmphp_lock_operations();
499 if (hotplug_slot && value) {
500 pslot = hotplug_slot->private;
502 memcpy(&myslot, pslot, sizeof(struct slot));
503 rc = ibmphp_hpc_readslot(pslot, READ_SLOTSTATUS,
506 if (!(SLOT_LATCH (myslot.status)) &&
507 (SLOT_PRESENT (myslot.status))) {
508 rc = ibmphp_hpc_readslot(pslot,
510 &(myslot.ext_status));
512 *value = SLOT_SPEED(myslot.ext_status);
514 *value = MAX_ADAPTER_NONE;
519 ibmphp_unlock_operations();
521 debug("get_max_adapter_speed_1 - Exit rc[%d] value[%x]\n", rc, *value);
525 static int get_bus_name(struct hotplug_slot *hotplug_slot, char * value)
528 struct slot *pslot = NULL;
530 debug("get_bus_name - Entry hotplug_slot[%lx]\n", (ulong)hotplug_slot);
532 ibmphp_lock_operations();
535 pslot = hotplug_slot->private;
538 snprintf(value, 100, "Bus %x", pslot->bus);
543 ibmphp_unlock_operations();
544 debug("get_bus_name - Exit rc[%d] value[%x]\n", rc, *value);
549 /****************************************************************************
550 * This routine will initialize the ops data structure used in the validate
551 * function. It will also power off empty slots that are powered on since BIOS
552 * leaves those on, albeit disconnected
553 ****************************************************************************/
554 static int __init init_ops(void)
556 struct slot *slot_cur;
557 struct list_head *tmp;
561 list_for_each(tmp, &ibmphp_slot_head) {
562 slot_cur = list_entry(tmp, struct slot, ibm_slot_list);
567 debug("BEFORE GETTING SLOT STATUS, slot # %x\n",
569 if (slot_cur->ctrl->revision == 0xFF)
570 if (get_ctrl_revision(slot_cur,
571 &slot_cur->ctrl->revision))
574 if (slot_cur->bus_on->current_speed == 0xFF)
575 if (get_cur_bus_info(&slot_cur))
578 if (slot_cur->ctrl->options == 0xFF)
579 if (get_hpc_options(slot_cur, &slot_cur->ctrl->options))
582 retval = slot_update(&slot_cur);
586 debug("status = %x\n", slot_cur->status);
587 debug("ext_status = %x\n", slot_cur->ext_status);
588 debug("SLOT_POWER = %x\n", SLOT_POWER(slot_cur->status));
589 debug("SLOT_PRESENT = %x\n", SLOT_PRESENT(slot_cur->status));
590 debug("SLOT_LATCH = %x\n", SLOT_LATCH(slot_cur->status));
592 if ((SLOT_PWRGD(slot_cur->status)) &&
593 !(SLOT_PRESENT(slot_cur->status)) &&
594 !(SLOT_LATCH(slot_cur->status))) {
595 debug("BEFORE POWER OFF COMMAND\n");
596 rc = power_off(slot_cur);
600 /* retval = slot_update(&slot_cur);
603 * ibmphp_update_slot_info(slot_cur);
611 /* This operation will check whether the slot is within the bounds and
612 * the operation is valid to perform on that slot
613 * Parameters: slot, operation
614 * Returns: 0 or error codes
616 static int validate(struct slot *slot_cur, int opn)
623 number = slot_cur->number;
624 if ((number > max_slots) || (number < 0))
626 debug("slot_number in validate is %d\n", slot_cur->number);
628 retval = slot_update(&slot_cur);
634 if (!(SLOT_PWRGD(slot_cur->status)) &&
635 (SLOT_PRESENT(slot_cur->status)) &&
636 !(SLOT_LATCH(slot_cur->status)))
640 if ((SLOT_PWRGD(slot_cur->status)) &&
641 (SLOT_PRESENT(slot_cur->status)) &&
642 !(SLOT_LATCH(slot_cur->status)))
648 err("validate failed....\n");
652 /****************************************************************************
653 * This routine is for updating the data structures in the hotplug core
654 * Parameters: struct slot
655 * Returns: 0 or error
656 ****************************************************************************/
657 int ibmphp_update_slot_info(struct slot *slot_cur)
659 struct hotplug_slot_info *info;
664 info = kmalloc(sizeof(struct hotplug_slot_info), GFP_KERNEL);
666 err("out of system memory\n");
670 info->power_status = SLOT_PWRGD(slot_cur->status);
671 info->attention_status = SLOT_ATTN(slot_cur->status,
672 slot_cur->ext_status);
673 info->latch_status = SLOT_LATCH(slot_cur->status);
674 if (!SLOT_PRESENT(slot_cur->status)) {
675 info->adapter_status = 0;
676 /* info->max_adapter_speed_status = MAX_ADAPTER_NONE; */
678 info->adapter_status = 1;
679 /* get_max_adapter_speed_1(slot_cur->hotplug_slot,
680 &info->max_adapter_speed_status, 0); */
683 bus_speed = slot_cur->bus_on->current_speed;
684 mode = slot_cur->bus_on->current_bus_mode;
690 if (mode == BUS_MODE_PCIX)
692 else if (mode == BUS_MODE_PCI)
695 bus_speed = PCI_SPEED_UNKNOWN;
702 bus_speed = PCI_SPEED_UNKNOWN;
705 info->cur_bus_speed = bus_speed;
706 info->max_bus_speed = slot_cur->hotplug_slot->info->max_bus_speed;
709 rc = pci_hp_change_slot_info(slot_cur->hotplug_slot, info);
715 /******************************************************************************
716 * This function will return the pci_func, given bus and devfunc, or NULL. It
717 * is called from visit routines
718 ******************************************************************************/
720 static struct pci_func *ibm_slot_find(u8 busno, u8 device, u8 function)
722 struct pci_func *func_cur;
723 struct slot *slot_cur;
724 struct list_head * tmp;
725 list_for_each(tmp, &ibmphp_slot_head) {
726 slot_cur = list_entry(tmp, struct slot, ibm_slot_list);
727 if (slot_cur->func) {
728 func_cur = slot_cur->func;
730 if ((func_cur->busno == busno) &&
731 (func_cur->device == device) &&
732 (func_cur->function == function))
734 func_cur = func_cur->next;
741 /*************************************************************
742 * This routine frees up memory used by struct slot, including
743 * the pointers to pci_func, bus, hotplug_slot, controller,
744 * and deregistering from the hotplug core
745 *************************************************************/
746 static void free_slots(void)
748 struct slot *slot_cur;
749 struct list_head * tmp;
750 struct list_head * next;
752 debug("%s -- enter\n", __func__);
754 list_for_each_safe(tmp, next, &ibmphp_slot_head) {
755 slot_cur = list_entry(tmp, struct slot, ibm_slot_list);
756 pci_hp_deregister(slot_cur->hotplug_slot);
758 debug("%s -- exit\n", __func__);
761 static void ibm_unconfigure_device(struct pci_func *func)
763 struct pci_dev *temp;
766 debug("inside %s\n", __func__);
767 debug("func->device = %x, func->function = %x\n",
768 func->device, func->function);
769 debug("func->device << 3 | 0x0 = %x\n", func->device << 3 | 0x0);
771 for (j = 0; j < 0x08; j++) {
772 temp = pci_get_bus_and_slot(func->busno, (func->device << 3) | j);
774 pci_remove_bus_device(temp);
778 pci_dev_put(func->dev);
782 * The following function is to fix kernel bug regarding
783 * getting bus entries, here we manually add those primary
784 * bus entries to kernel bus structure whenever apply
786 static u8 bus_structure_fixup(u8 busno)
792 if (pci_find_bus(0, busno) || !(ibmphp_find_same_bus_num(busno)))
795 bus = kmalloc(sizeof(*bus), GFP_KERNEL);
797 err("%s - out of memory\n", __func__);
800 dev = kmalloc(sizeof(*dev), GFP_KERNEL);
803 err("%s - out of memory\n", __func__);
808 bus->ops = ibmphp_pci_bus->ops;
810 for (dev->devfn = 0; dev->devfn < 256; dev->devfn += 8) {
811 if (!pci_read_config_word(dev, PCI_VENDOR_ID, &l) &&
812 (l != 0x0000) && (l != 0xffff)) {
813 debug("%s - Inside bus_struture_fixup()\n",
815 pci_scan_bus(busno, ibmphp_pci_bus->ops, NULL);
826 static int ibm_configure_device(struct pci_func *func)
829 struct pci_bus *child;
831 int flag = 0; /* this is to make sure we don't double scan the bus,
832 for bridged devices primarily */
834 if (!(bus_structure_fixup(func->busno)))
836 if (func->dev == NULL)
837 func->dev = pci_get_bus_and_slot(func->busno,
838 PCI_DEVFN(func->device, func->function));
840 if (func->dev == NULL) {
841 struct pci_bus *bus = pci_find_bus(0, func->busno);
845 num = pci_scan_slot(bus,
846 PCI_DEVFN(func->device, func->function));
848 pci_bus_add_devices(bus);
850 func->dev = pci_get_bus_and_slot(func->busno,
851 PCI_DEVFN(func->device, func->function));
852 if (func->dev == NULL) {
853 err("ERROR... : pci_dev still NULL\n");
857 if (!(flag) && (func->dev->hdr_type == PCI_HEADER_TYPE_BRIDGE)) {
858 pci_read_config_byte(func->dev, PCI_SECONDARY_BUS, &bus);
859 child = pci_add_new_bus(func->dev->bus, func->dev, bus);
860 pci_do_scan_bus(child);
866 /*******************************************************
867 * Returns whether the bus is empty or not
868 *******************************************************/
869 static int is_bus_empty(struct slot * slot_cur)
872 struct slot * tmp_slot;
873 u8 i = slot_cur->bus_on->slot_min;
875 while (i <= slot_cur->bus_on->slot_max) {
876 if (i == slot_cur->number) {
880 tmp_slot = ibmphp_get_slot_from_physical_num(i);
883 rc = slot_update(&tmp_slot);
886 if (SLOT_PRESENT(tmp_slot->status) &&
887 SLOT_PWRGD(tmp_slot->status))
894 /***********************************************************
895 * If the HPC permits and the bus currently empty, tries to set the
896 * bus speed and mode at the maximum card and bus capability
898 * Returns: bus is set (0) or error code
899 ***********************************************************/
900 static int set_bus(struct slot * slot_cur)
906 static struct pci_device_id ciobx[] = {
907 { PCI_DEVICE(PCI_VENDOR_ID_SERVERWORKS, 0x0101) },
911 debug("%s - entry slot # %d\n", __func__, slot_cur->number);
912 if (SET_BUS_STATUS(slot_cur->ctrl) && is_bus_empty(slot_cur)) {
913 rc = slot_update(&slot_cur);
916 speed = SLOT_SPEED(slot_cur->ext_status);
917 debug("ext_status = %x, speed = %x\n", slot_cur->ext_status, speed);
919 case HPC_SLOT_SPEED_33:
920 cmd = HPC_BUS_33CONVMODE;
922 case HPC_SLOT_SPEED_66:
923 if (SLOT_PCIX(slot_cur->ext_status)) {
924 if ((slot_cur->supported_speed >= BUS_SPEED_66) &&
925 (slot_cur->supported_bus_mode == BUS_MODE_PCIX))
926 cmd = HPC_BUS_66PCIXMODE;
927 else if (!SLOT_BUS_MODE(slot_cur->ext_status))
928 /* if max slot/bus capability is 66 pci
929 and there's no bus mode mismatch, then
930 the adapter supports 66 pci */
931 cmd = HPC_BUS_66CONVMODE;
933 cmd = HPC_BUS_33CONVMODE;
935 if (slot_cur->supported_speed >= BUS_SPEED_66)
936 cmd = HPC_BUS_66CONVMODE;
938 cmd = HPC_BUS_33CONVMODE;
941 case HPC_SLOT_SPEED_133:
942 switch (slot_cur->supported_speed) {
944 cmd = HPC_BUS_33CONVMODE;
947 if (slot_cur->supported_bus_mode == BUS_MODE_PCIX)
948 cmd = HPC_BUS_66PCIXMODE;
950 cmd = HPC_BUS_66CONVMODE;
953 cmd = HPC_BUS_100PCIXMODE;
956 /* This is to take care of the bug in CIOBX chip */
957 if (pci_dev_present(ciobx))
958 ibmphp_hpc_writeslot(slot_cur,
959 HPC_BUS_100PCIXMODE);
960 cmd = HPC_BUS_133PCIXMODE;
963 err("Wrong bus speed\n");
968 err("wrong slot speed\n");
971 debug("setting bus speed for slot %d, cmd %x\n",
972 slot_cur->number, cmd);
973 retval = ibmphp_hpc_writeslot(slot_cur, cmd);
975 err("setting bus speed failed\n");
978 if (CTLR_RESULT(slot_cur->ctrl->status)) {
979 err("command not completed successfully in set_bus\n");
983 /* This is for x440, once Brandon fixes the firmware,
984 will not need this delay */
986 debug("%s -Exit\n", __func__);
990 /* This routine checks the bus limitations that the slot is on from the BIOS.
991 * This is used in deciding whether or not to power up the slot.
992 * (electrical/spec limitations. For example, >1 133 MHz or >2 66 PCI cards on
995 * Returns: 0 = no limitations, -EINVAL = exceeded limitations on the bus
997 static int check_limitations(struct slot *slot_cur)
1000 struct slot * tmp_slot;
1004 for (i = slot_cur->bus_on->slot_min; i <= slot_cur->bus_on->slot_max; i++) {
1005 tmp_slot = ibmphp_get_slot_from_physical_num(i);
1008 if ((SLOT_PWRGD(tmp_slot->status)) &&
1009 !(SLOT_CONNECT(tmp_slot->status)))
1012 get_cur_bus_info(&slot_cur);
1013 switch (slot_cur->bus_on->current_speed) {
1015 limitation = slot_cur->bus_on->slots_at_33_conv;
1018 if (slot_cur->bus_on->current_bus_mode == BUS_MODE_PCIX)
1019 limitation = slot_cur->bus_on->slots_at_66_pcix;
1021 limitation = slot_cur->bus_on->slots_at_66_conv;
1024 limitation = slot_cur->bus_on->slots_at_100_pcix;
1027 limitation = slot_cur->bus_on->slots_at_133_pcix;
1031 if ((count + 1) > limitation)
1036 static inline void print_card_capability(struct slot *slot_cur)
1038 info("capability of the card is ");
1039 if ((slot_cur->ext_status & CARD_INFO) == PCIX133)
1040 info(" 133 MHz PCI-X\n");
1041 else if ((slot_cur->ext_status & CARD_INFO) == PCIX66)
1042 info(" 66 MHz PCI-X\n");
1043 else if ((slot_cur->ext_status & CARD_INFO) == PCI66)
1044 info(" 66 MHz PCI\n");
1046 info(" 33 MHz PCI\n");
1050 /* This routine will power on the slot, configure the device(s) and find the
1052 * Parameters: hotplug_slot
1053 * Returns: 0 or failure codes
1055 static int enable_slot(struct hotplug_slot *hs)
1058 struct slot *slot_cur;
1060 struct pci_func *tmp_func;
1062 ibmphp_lock_operations();
1064 debug("ENABLING SLOT........\n");
1065 slot_cur = hs->private;
1067 if ((rc = validate(slot_cur, ENABLE))) {
1068 err("validate function failed\n");
1072 attn_LED_blink(slot_cur);
1074 rc = set_bus(slot_cur);
1076 err("was not able to set the bus\n");
1080 /*-----------------debugging------------------------------*/
1081 get_cur_bus_info(&slot_cur);
1082 debug("the current bus speed right after set_bus = %x\n",
1083 slot_cur->bus_on->current_speed);
1084 /*----------------------------------------------------------*/
1086 rc = check_limitations(slot_cur);
1088 err("Adding this card exceeds the limitations of this bus.\n");
1089 err("(i.e., >1 133MHz cards running on same bus, or "
1090 ">2 66 PCI cards running on same bus.\n");
1091 err("Try hot-adding into another bus\n");
1096 rc = power_on(slot_cur);
1099 err("something wrong when powering up... please see below for details\n");
1100 /* need to turn off before on, otherwise, blinking overwrites */
1103 if (slot_update(&slot_cur)) {
1109 /* Check to see the error of why it failed */
1110 if ((SLOT_POWER(slot_cur->status)) &&
1111 !(SLOT_PWRGD(slot_cur->status)))
1112 err("power fault occurred trying to power up\n");
1113 else if (SLOT_BUS_SPEED(slot_cur->status)) {
1114 err("bus speed mismatch occurred. please check "
1115 "current bus speed and card capability\n");
1116 print_card_capability(slot_cur);
1117 } else if (SLOT_BUS_MODE(slot_cur->ext_status)) {
1118 err("bus mode mismatch occurred. please check "
1119 "current bus mode and card capability\n");
1120 print_card_capability(slot_cur);
1122 ibmphp_update_slot_info(slot_cur);
1125 debug("after power_on\n");
1126 /*-----------------------debugging---------------------------*/
1127 get_cur_bus_info(&slot_cur);
1128 debug("the current bus speed right after power_on = %x\n",
1129 slot_cur->bus_on->current_speed);
1130 /*----------------------------------------------------------*/
1132 rc = slot_update(&slot_cur);
1137 if (SLOT_POWER(slot_cur->status) && !(SLOT_PWRGD(slot_cur->status))) {
1138 err("power fault occurred trying to power up...\n");
1141 if (SLOT_POWER(slot_cur->status) && (SLOT_BUS_SPEED(slot_cur->status))) {
1142 err("bus speed mismatch occurred. please check current bus "
1143 "speed and card capability\n");
1144 print_card_capability(slot_cur);
1147 /* Don't think this case will happen after above checks...
1148 * but just in case, for paranoia sake */
1149 if (!(SLOT_POWER(slot_cur->status))) {
1150 err("power on failed...\n");
1154 slot_cur->func = kzalloc(sizeof(struct pci_func), GFP_KERNEL);
1155 if (!slot_cur->func) {
1156 /* We cannot do update_slot_info here, since no memory for
1157 * kmalloc n.e.ways, and update_slot_info allocates some */
1158 err("out of system memory\n");
1162 slot_cur->func->busno = slot_cur->bus;
1163 slot_cur->func->device = slot_cur->device;
1164 for (i = 0; i < 4; i++)
1165 slot_cur->func->irq[i] = slot_cur->irq[i];
1167 debug("b4 configure_card, slot_cur->bus = %x, slot_cur->device = %x\n",
1168 slot_cur->bus, slot_cur->device);
1170 if (ibmphp_configure_card(slot_cur->func, slot_cur->number)) {
1171 err("configure_card was unsuccessful...\n");
1172 /* true because don't need to actually deallocate resources,
1173 * just remove references */
1174 ibmphp_unconfigure_card(&slot_cur, 1);
1175 debug("after unconfigure_card\n");
1176 slot_cur->func = NULL;
1183 tmp_func = ibm_slot_find(slot_cur->bus, slot_cur->func->device,
1185 if (tmp_func && !(tmp_func->dev))
1186 ibm_configure_device(tmp_func);
1190 if (slot_update(&slot_cur)) {
1194 ibmphp_print_test();
1195 rc = ibmphp_update_slot_info(slot_cur);
1197 ibmphp_unlock_operations();
1201 attn_off(slot_cur); /* need to turn off if was blinking b4 */
1204 rcpr = slot_update(&slot_cur);
1209 ibmphp_update_slot_info(slot_cur);
1213 attn_off(slot_cur); /* need to turn off if was blinking b4 */
1215 rcpr = power_off(slot_cur);
1223 /**************************************************************
1224 * HOT REMOVING ADAPTER CARD *
1225 * INPUT: POINTER TO THE HOTPLUG SLOT STRUCTURE *
1226 * OUTPUT: SUCCESS 0 ; FAILURE: UNCONFIGURE , VALIDATE *
1228 **************************************************************/
1229 static int ibmphp_disable_slot(struct hotplug_slot *hotplug_slot)
1231 struct slot *slot = hotplug_slot->private;
1234 ibmphp_lock_operations();
1235 rc = ibmphp_do_disable_slot(slot);
1236 ibmphp_unlock_operations();
1240 int ibmphp_do_disable_slot(struct slot *slot_cur)
1245 debug("DISABLING SLOT...\n");
1247 if ((slot_cur == NULL) || (slot_cur->ctrl == NULL)) {
1251 flag = slot_cur->flag;
1255 rc = validate(slot_cur, DISABLE);
1256 /* checking if powered off already & valid slot # */
1260 attn_LED_blink(slot_cur);
1262 if (slot_cur->func == NULL) {
1263 /* We need this for fncs's that were there on bootup */
1264 slot_cur->func = kzalloc(sizeof(struct pci_func), GFP_KERNEL);
1265 if (!slot_cur->func) {
1266 err("out of system memory\n");
1270 slot_cur->func->busno = slot_cur->bus;
1271 slot_cur->func->device = slot_cur->device;
1274 ibm_unconfigure_device(slot_cur->func);
1276 /* If we got here from latch suddenly opening on operating card or
1277 a power fault, there's no power to the card, so cannot
1278 read from it to determine what resources it occupied. This operation
1279 is forbidden anyhow. The best we can do is remove it from kernel
1287 rc = ibmphp_unconfigure_card(&slot_cur, 0);
1288 slot_cur->func = NULL;
1289 debug("in disable_slot. after unconfigure_card\n");
1291 err("could not unconfigure card.\n");
1295 rc = ibmphp_hpc_writeslot(slot_cur, HPC_SLOT_OFF);
1300 rc = slot_update(&slot_cur);
1304 rc = ibmphp_update_slot_info(slot_cur);
1305 ibmphp_print_test();
1310 /* Need to turn off if was blinking b4 */
1313 if (slot_update(&slot_cur)) {
1318 ibmphp_update_slot_info(slot_cur);
1322 struct hotplug_slot_ops ibmphp_hotplug_slot_ops = {
1323 .owner = THIS_MODULE,
1324 .set_attention_status = set_attention_status,
1325 .enable_slot = enable_slot,
1326 .disable_slot = ibmphp_disable_slot,
1327 .hardware_test = NULL,
1328 .get_power_status = get_power_status,
1329 .get_attention_status = get_attention_status,
1330 .get_latch_status = get_latch_status,
1331 .get_adapter_status = get_adapter_present,
1332 .get_max_bus_speed = get_max_bus_speed,
1333 .get_cur_bus_speed = get_cur_bus_speed,
1334 /* .get_max_adapter_speed = get_max_adapter_speed,
1335 .get_bus_name_status = get_bus_name,
1339 static void ibmphp_unload(void)
1342 debug("after slots\n");
1343 ibmphp_free_resources();
1344 debug("after resources\n");
1345 ibmphp_free_bus_info_queue();
1346 debug("after bus info\n");
1347 ibmphp_free_ebda_hpc_queue();
1348 debug("after ebda hpc\n");
1349 ibmphp_free_ebda_pci_rsrc_queue();
1350 debug("after ebda pci rsrc\n");
1351 kfree(ibmphp_pci_bus);
1354 static int __init ibmphp_init(void)
1356 struct pci_bus *bus;
1362 info(DRIVER_DESC " version: " DRIVER_VERSION "\n");
1364 ibmphp_pci_bus = kmalloc(sizeof(*ibmphp_pci_bus), GFP_KERNEL);
1365 if (!ibmphp_pci_bus) {
1366 err("out of memory\n");
1371 bus = pci_find_bus(0, 0);
1373 err("Can't find the root pci bus, can not continue\n");
1377 memcpy(ibmphp_pci_bus, bus, sizeof(*ibmphp_pci_bus));
1379 ibmphp_debug = debug;
1381 ibmphp_hpc_initvars();
1383 for (i = 0; i < 16; i++)
1386 if ((rc = ibmphp_access_ebda()))
1388 debug("after ibmphp_access_ebda()\n");
1390 if ((rc = ibmphp_rsrc_init()))
1392 debug("AFTER Resource & EBDA INITIALIZATIONS\n");
1394 max_slots = get_max_slots();
1396 if ((rc = ibmphp_register_pci()))
1404 ibmphp_print_test();
1405 if ((rc = ibmphp_hpc_start_poll_thread())) {
1417 static void __exit ibmphp_exit(void)
1419 ibmphp_hpc_stop_poll_thread();
1420 debug("after polling\n");
1425 module_init(ibmphp_init);