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 "../../../arch/x86/pci/pci.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 if ((*cur_slot
)->bus
== rtable
->slots
[loop
].bus
) {
158 (*cur_slot
)->device
= PCI_SLOT(rtable
->slots
[loop
].devfn
);
159 for (i
= 0; i
< 4; i
++)
160 (*cur_slot
)->irq
[i
] = IO_APIC_get_PCI_irq_vector((int) (*cur_slot
)->bus
,
161 (int) (*cur_slot
)->device
, i
);
163 debug("(*cur_slot)->irq[0] = %x\n",
164 (*cur_slot
)->irq
[0]);
165 debug("(*cur_slot)->irq[1] = %x\n",
166 (*cur_slot
)->irq
[1]);
167 debug("(*cur_slot)->irq[2] = %x\n",
168 (*cur_slot
)->irq
[2]);
169 debug("(*cur_slot)->irq[3] = %x\n",
170 (*cur_slot
)->irq
[3]);
172 debug("rtable->exlusive_irqs = %x\n",
173 rtable
->exclusive_irqs
);
174 debug("rtable->slots[loop].irq[0].bitmap = %x\n",
175 rtable
->slots
[loop
].irq
[0].bitmap
);
176 debug("rtable->slots[loop].irq[1].bitmap = %x\n",
177 rtable
->slots
[loop
].irq
[1].bitmap
);
178 debug("rtable->slots[loop].irq[2].bitmap = %x\n",
179 rtable
->slots
[loop
].irq
[2].bitmap
);
180 debug("rtable->slots[loop].irq[3].bitmap = %x\n",
181 rtable
->slots
[loop
].irq
[3].bitmap
);
183 debug("rtable->slots[loop].irq[0].link = %x\n",
184 rtable
->slots
[loop
].irq
[0].link
);
185 debug("rtable->slots[loop].irq[1].link = %x\n",
186 rtable
->slots
[loop
].irq
[1].link
);
187 debug("rtable->slots[loop].irq[2].link = %x\n",
188 rtable
->slots
[loop
].irq
[2].link
);
189 debug("rtable->slots[loop].irq[3].link = %x\n",
190 rtable
->slots
[loop
].irq
[3].link
);
191 debug("end of init_devno\n");
202 static inline int power_on(struct slot
*slot_cur
)
204 u8 cmd
= HPC_SLOT_ON
;
207 retval
= ibmphp_hpc_writeslot(slot_cur
, cmd
);
209 err("power on failed\n");
212 if (CTLR_RESULT(slot_cur
->ctrl
->status
)) {
213 err("command not completed successfully in power_on\n");
216 msleep(3000); /* For ServeRAID cards, and some 66 PCI */
220 static inline int power_off(struct slot
*slot_cur
)
222 u8 cmd
= HPC_SLOT_OFF
;
225 retval
= ibmphp_hpc_writeslot(slot_cur
, cmd
);
227 err("power off failed\n");
230 if (CTLR_RESULT(slot_cur
->ctrl
->status
)) {
231 err("command not completed successfully in power_off\n");
237 static int set_attention_status(struct hotplug_slot
*hotplug_slot
, u8 value
)
241 u8 cmd
= 0x00; /* avoid compiler warning */
243 debug("set_attention_status - Entry hotplug_slot[%lx] value[%x]\n",
244 (ulong
) hotplug_slot
, value
);
245 ibmphp_lock_operations();
250 case HPC_SLOT_ATTN_OFF
:
251 cmd
= HPC_SLOT_ATTNOFF
;
253 case HPC_SLOT_ATTN_ON
:
254 cmd
= HPC_SLOT_ATTNON
;
256 case HPC_SLOT_ATTN_BLINK
:
257 cmd
= HPC_SLOT_BLINKLED
;
261 err("set_attention_status - Error : invalid input [%x]\n",
266 pslot
= hotplug_slot
->private;
268 rc
= ibmphp_hpc_writeslot(pslot
, cmd
);
275 ibmphp_unlock_operations();
277 debug("set_attention_status - Exit rc[%d]\n", rc
);
281 static int get_attention_status(struct hotplug_slot
*hotplug_slot
, u8
* value
)
287 debug("get_attention_status - Entry hotplug_slot[%lx] pvalue[%lx]\n",
288 (ulong
) hotplug_slot
, (ulong
) value
);
290 ibmphp_lock_operations();
292 pslot
= hotplug_slot
->private;
294 memcpy(&myslot
, pslot
, sizeof(struct slot
));
295 rc
= ibmphp_hpc_readslot(pslot
, READ_SLOTSTATUS
,
298 rc
= ibmphp_hpc_readslot(pslot
,
300 &(myslot
.ext_status
));
302 *value
= SLOT_ATTN(myslot
.status
,
307 ibmphp_unlock_operations();
308 debug("get_attention_status - Exit rc[%d] value[%x]\n", rc
, *value
);
312 static int get_latch_status(struct hotplug_slot
*hotplug_slot
, u8
* value
)
318 debug("get_latch_status - Entry hotplug_slot[%lx] pvalue[%lx]\n",
319 (ulong
) hotplug_slot
, (ulong
) value
);
320 ibmphp_lock_operations();
322 pslot
= hotplug_slot
->private;
324 memcpy(&myslot
, pslot
, sizeof(struct slot
));
325 rc
= ibmphp_hpc_readslot(pslot
, READ_SLOTSTATUS
,
328 *value
= SLOT_LATCH(myslot
.status
);
332 ibmphp_unlock_operations();
333 debug("get_latch_status - Exit rc[%d] rc[%x] value[%x]\n",
339 static int get_power_status(struct hotplug_slot
*hotplug_slot
, u8
* value
)
345 debug("get_power_status - Entry hotplug_slot[%lx] pvalue[%lx]\n",
346 (ulong
) hotplug_slot
, (ulong
) value
);
347 ibmphp_lock_operations();
349 pslot
= hotplug_slot
->private;
351 memcpy(&myslot
, pslot
, sizeof(struct slot
));
352 rc
= ibmphp_hpc_readslot(pslot
, READ_SLOTSTATUS
,
355 *value
= SLOT_PWRGD(myslot
.status
);
359 ibmphp_unlock_operations();
360 debug("get_power_status - Exit rc[%d] rc[%x] value[%x]\n",
365 static int get_adapter_present(struct hotplug_slot
*hotplug_slot
, u8
* value
)
372 debug("get_adapter_status - Entry hotplug_slot[%lx] pvalue[%lx]\n",
373 (ulong
) hotplug_slot
, (ulong
) value
);
374 ibmphp_lock_operations();
376 pslot
= hotplug_slot
->private;
378 memcpy(&myslot
, pslot
, sizeof(struct slot
));
379 rc
= ibmphp_hpc_readslot(pslot
, READ_SLOTSTATUS
,
382 present
= SLOT_PRESENT(myslot
.status
);
383 if (present
== HPC_SLOT_EMPTY
)
391 ibmphp_unlock_operations();
392 debug("get_adapter_present - Exit rc[%d] value[%x]\n", rc
, *value
);
396 static int get_max_bus_speed(struct hotplug_slot
*hotplug_slot
, enum pci_bus_speed
*value
)
402 debug("%s - Entry hotplug_slot[%p] pvalue[%p]\n", __func__
,
403 hotplug_slot
, value
);
405 ibmphp_lock_operations();
408 pslot
= hotplug_slot
->private;
411 mode
= pslot
->supported_bus_mode
;
412 *value
= pslot
->supported_speed
;
417 if (mode
== BUS_MODE_PCIX
)
422 *value
= pslot
->supported_speed
+ 0x01;
425 /* Note (will need to change): there would be soon 256, 512 also */
431 ibmphp_unlock_operations();
432 debug("%s - Exit rc[%d] value[%x]\n", __func__
, rc
, *value
);
436 static int get_cur_bus_speed(struct hotplug_slot
*hotplug_slot
, enum pci_bus_speed
*value
)
442 debug("%s - Entry hotplug_slot[%p] pvalue[%p]\n", __func__
,
443 hotplug_slot
, value
);
445 ibmphp_lock_operations();
448 pslot
= hotplug_slot
->private;
450 rc
= get_cur_bus_info(&pslot
);
452 mode
= pslot
->bus_on
->current_bus_mode
;
453 *value
= pslot
->bus_on
->current_speed
;
458 if (mode
== BUS_MODE_PCIX
)
460 else if (mode
== BUS_MODE_PCI
)
463 *value
= PCI_SPEED_UNKNOWN
;
470 /* Note of change: there would also be 256, 512 soon */
477 ibmphp_unlock_operations();
478 debug("%s - Exit rc[%d] value[%x]\n", __func__
, rc
, *value
);
483 static int get_max_adapter_speed_1(struct hotplug_slot *hotplug_slot, u8 * value, u8 flag)
489 debug("get_max_adapter_speed_1 - Entry hotplug_slot[%lx] pvalue[%lx]\n",
490 (ulong)hotplug_slot, (ulong) value);
493 ibmphp_lock_operations();
495 if (hotplug_slot && value) {
496 pslot = hotplug_slot->private;
498 memcpy(&myslot, pslot, sizeof(struct slot));
499 rc = ibmphp_hpc_readslot(pslot, READ_SLOTSTATUS,
502 if (!(SLOT_LATCH (myslot.status)) &&
503 (SLOT_PRESENT (myslot.status))) {
504 rc = ibmphp_hpc_readslot(pslot,
506 &(myslot.ext_status));
508 *value = SLOT_SPEED(myslot.ext_status);
510 *value = MAX_ADAPTER_NONE;
515 ibmphp_unlock_operations();
517 debug("get_max_adapter_speed_1 - Exit rc[%d] value[%x]\n", rc, *value);
521 static int get_bus_name(struct hotplug_slot *hotplug_slot, char * value)
524 struct slot *pslot = NULL;
526 debug("get_bus_name - Entry hotplug_slot[%lx]\n", (ulong)hotplug_slot);
528 ibmphp_lock_operations();
531 pslot = hotplug_slot->private;
534 snprintf(value, 100, "Bus %x", pslot->bus);
539 ibmphp_unlock_operations();
540 debug("get_bus_name - Exit rc[%d] value[%x]\n", rc, *value);
545 /****************************************************************************
546 * This routine will initialize the ops data structure used in the validate
547 * function. It will also power off empty slots that are powered on since BIOS
548 * leaves those on, albeit disconnected
549 ****************************************************************************/
550 static int __init
init_ops(void)
552 struct slot
*slot_cur
;
553 struct list_head
*tmp
;
557 list_for_each(tmp
, &ibmphp_slot_head
) {
558 slot_cur
= list_entry(tmp
, struct slot
, ibm_slot_list
);
563 debug("BEFORE GETTING SLOT STATUS, slot # %x\n",
565 if (slot_cur
->ctrl
->revision
== 0xFF)
566 if (get_ctrl_revision(slot_cur
,
567 &slot_cur
->ctrl
->revision
))
570 if (slot_cur
->bus_on
->current_speed
== 0xFF)
571 if (get_cur_bus_info(&slot_cur
))
574 if (slot_cur
->ctrl
->options
== 0xFF)
575 if (get_hpc_options(slot_cur
, &slot_cur
->ctrl
->options
))
578 retval
= slot_update(&slot_cur
);
582 debug("status = %x\n", slot_cur
->status
);
583 debug("ext_status = %x\n", slot_cur
->ext_status
);
584 debug("SLOT_POWER = %x\n", SLOT_POWER(slot_cur
->status
));
585 debug("SLOT_PRESENT = %x\n", SLOT_PRESENT(slot_cur
->status
));
586 debug("SLOT_LATCH = %x\n", SLOT_LATCH(slot_cur
->status
));
588 if ((SLOT_PWRGD(slot_cur
->status
)) &&
589 !(SLOT_PRESENT(slot_cur
->status
)) &&
590 !(SLOT_LATCH(slot_cur
->status
))) {
591 debug("BEFORE POWER OFF COMMAND\n");
592 rc
= power_off(slot_cur
);
596 /* retval = slot_update(&slot_cur);
599 * ibmphp_update_slot_info(slot_cur);
607 /* This operation will check whether the slot is within the bounds and
608 * the operation is valid to perform on that slot
609 * Parameters: slot, operation
610 * Returns: 0 or error codes
612 static int validate(struct slot
*slot_cur
, int opn
)
619 number
= slot_cur
->number
;
620 if ((number
> max_slots
) || (number
< 0))
622 debug("slot_number in validate is %d\n", slot_cur
->number
);
624 retval
= slot_update(&slot_cur
);
630 if (!(SLOT_PWRGD(slot_cur
->status
)) &&
631 (SLOT_PRESENT(slot_cur
->status
)) &&
632 !(SLOT_LATCH(slot_cur
->status
)))
636 if ((SLOT_PWRGD(slot_cur
->status
)) &&
637 (SLOT_PRESENT(slot_cur
->status
)) &&
638 !(SLOT_LATCH(slot_cur
->status
)))
644 err("validate failed....\n");
648 /****************************************************************************
649 * This routine is for updating the data structures in the hotplug core
650 * Parameters: struct slot
651 * Returns: 0 or error
652 ****************************************************************************/
653 int ibmphp_update_slot_info(struct slot
*slot_cur
)
655 struct hotplug_slot_info
*info
;
660 info
= kmalloc(sizeof(struct hotplug_slot_info
), GFP_KERNEL
);
662 err("out of system memory\n");
666 info
->power_status
= SLOT_PWRGD(slot_cur
->status
);
667 info
->attention_status
= SLOT_ATTN(slot_cur
->status
,
668 slot_cur
->ext_status
);
669 info
->latch_status
= SLOT_LATCH(slot_cur
->status
);
670 if (!SLOT_PRESENT(slot_cur
->status
)) {
671 info
->adapter_status
= 0;
672 /* info->max_adapter_speed_status = MAX_ADAPTER_NONE; */
674 info
->adapter_status
= 1;
675 /* get_max_adapter_speed_1(slot_cur->hotplug_slot,
676 &info->max_adapter_speed_status, 0); */
679 bus_speed
= slot_cur
->bus_on
->current_speed
;
680 mode
= slot_cur
->bus_on
->current_bus_mode
;
686 if (mode
== BUS_MODE_PCIX
)
688 else if (mode
== BUS_MODE_PCI
)
691 bus_speed
= PCI_SPEED_UNKNOWN
;
698 bus_speed
= PCI_SPEED_UNKNOWN
;
701 info
->cur_bus_speed
= bus_speed
;
702 info
->max_bus_speed
= slot_cur
->hotplug_slot
->info
->max_bus_speed
;
705 rc
= pci_hp_change_slot_info(slot_cur
->hotplug_slot
, info
);
711 /******************************************************************************
712 * This function will return the pci_func, given bus and devfunc, or NULL. It
713 * is called from visit routines
714 ******************************************************************************/
716 static struct pci_func
*ibm_slot_find(u8 busno
, u8 device
, u8 function
)
718 struct pci_func
*func_cur
;
719 struct slot
*slot_cur
;
720 struct list_head
* tmp
;
721 list_for_each(tmp
, &ibmphp_slot_head
) {
722 slot_cur
= list_entry(tmp
, struct slot
, ibm_slot_list
);
723 if (slot_cur
->func
) {
724 func_cur
= slot_cur
->func
;
726 if ((func_cur
->busno
== busno
) &&
727 (func_cur
->device
== device
) &&
728 (func_cur
->function
== function
))
730 func_cur
= func_cur
->next
;
737 /*************************************************************
738 * This routine frees up memory used by struct slot, including
739 * the pointers to pci_func, bus, hotplug_slot, controller,
740 * and deregistering from the hotplug core
741 *************************************************************/
742 static void free_slots(void)
744 struct slot
*slot_cur
;
745 struct list_head
* tmp
;
746 struct list_head
* next
;
748 debug("%s -- enter\n", __func__
);
750 list_for_each_safe(tmp
, next
, &ibmphp_slot_head
) {
751 slot_cur
= list_entry(tmp
, struct slot
, ibm_slot_list
);
752 pci_hp_deregister(slot_cur
->hotplug_slot
);
754 debug("%s -- exit\n", __func__
);
757 static void ibm_unconfigure_device(struct pci_func
*func
)
759 struct pci_dev
*temp
;
762 debug("inside %s\n", __func__
);
763 debug("func->device = %x, func->function = %x\n",
764 func
->device
, func
->function
);
765 debug("func->device << 3 | 0x0 = %x\n", func
->device
<< 3 | 0x0);
767 for (j
= 0; j
< 0x08; j
++) {
768 temp
= pci_get_bus_and_slot(func
->busno
, (func
->device
<< 3) | j
);
770 pci_remove_bus_device(temp
);
774 pci_dev_put(func
->dev
);
778 * The following function is to fix kernel bug regarding
779 * getting bus entries, here we manually add those primary
780 * bus entries to kernel bus structure whenever apply
782 static u8
bus_structure_fixup(u8 busno
)
788 if (pci_find_bus(0, busno
) || !(ibmphp_find_same_bus_num(busno
)))
791 bus
= kmalloc(sizeof(*bus
), GFP_KERNEL
);
793 err("%s - out of memory\n", __func__
);
796 dev
= kmalloc(sizeof(*dev
), GFP_KERNEL
);
799 err("%s - out of memory\n", __func__
);
804 bus
->ops
= ibmphp_pci_bus
->ops
;
806 for (dev
->devfn
= 0; dev
->devfn
< 256; dev
->devfn
+= 8) {
807 if (!pci_read_config_word(dev
, PCI_VENDOR_ID
, &l
) &&
808 (l
!= 0x0000) && (l
!= 0xffff)) {
809 debug("%s - Inside bus_struture_fixup()\n",
811 pci_scan_bus(busno
, ibmphp_pci_bus
->ops
, NULL
);
822 static int ibm_configure_device(struct pci_func
*func
)
825 struct pci_bus
*child
;
827 int flag
= 0; /* this is to make sure we don't double scan the bus,
828 for bridged devices primarily */
830 if (!(bus_structure_fixup(func
->busno
)))
832 if (func
->dev
== NULL
)
833 func
->dev
= pci_get_bus_and_slot(func
->busno
,
834 PCI_DEVFN(func
->device
, func
->function
));
836 if (func
->dev
== NULL
) {
837 struct pci_bus
*bus
= pci_find_bus(0, func
->busno
);
841 num
= pci_scan_slot(bus
,
842 PCI_DEVFN(func
->device
, func
->function
));
844 pci_bus_add_devices(bus
);
846 func
->dev
= pci_get_bus_and_slot(func
->busno
,
847 PCI_DEVFN(func
->device
, func
->function
));
848 if (func
->dev
== NULL
) {
849 err("ERROR... : pci_dev still NULL\n");
853 if (!(flag
) && (func
->dev
->hdr_type
== PCI_HEADER_TYPE_BRIDGE
)) {
854 pci_read_config_byte(func
->dev
, PCI_SECONDARY_BUS
, &bus
);
855 child
= pci_add_new_bus(func
->dev
->bus
, func
->dev
, bus
);
856 pci_do_scan_bus(child
);
862 /*******************************************************
863 * Returns whether the bus is empty or not
864 *******************************************************/
865 static int is_bus_empty(struct slot
* slot_cur
)
868 struct slot
* tmp_slot
;
869 u8 i
= slot_cur
->bus_on
->slot_min
;
871 while (i
<= slot_cur
->bus_on
->slot_max
) {
872 if (i
== slot_cur
->number
) {
876 tmp_slot
= ibmphp_get_slot_from_physical_num(i
);
879 rc
= slot_update(&tmp_slot
);
882 if (SLOT_PRESENT(tmp_slot
->status
) &&
883 SLOT_PWRGD(tmp_slot
->status
))
890 /***********************************************************
891 * If the HPC permits and the bus currently empty, tries to set the
892 * bus speed and mode at the maximum card and bus capability
894 * Returns: bus is set (0) or error code
895 ***********************************************************/
896 static int set_bus(struct slot
* slot_cur
)
902 static struct pci_device_id ciobx
[] = {
903 { PCI_DEVICE(PCI_VENDOR_ID_SERVERWORKS
, 0x0101) },
907 debug("%s - entry slot # %d\n", __func__
, slot_cur
->number
);
908 if (SET_BUS_STATUS(slot_cur
->ctrl
) && is_bus_empty(slot_cur
)) {
909 rc
= slot_update(&slot_cur
);
912 speed
= SLOT_SPEED(slot_cur
->ext_status
);
913 debug("ext_status = %x, speed = %x\n", slot_cur
->ext_status
, speed
);
915 case HPC_SLOT_SPEED_33
:
916 cmd
= HPC_BUS_33CONVMODE
;
918 case HPC_SLOT_SPEED_66
:
919 if (SLOT_PCIX(slot_cur
->ext_status
)) {
920 if ((slot_cur
->supported_speed
>= BUS_SPEED_66
) &&
921 (slot_cur
->supported_bus_mode
== BUS_MODE_PCIX
))
922 cmd
= HPC_BUS_66PCIXMODE
;
923 else if (!SLOT_BUS_MODE(slot_cur
->ext_status
))
924 /* if max slot/bus capability is 66 pci
925 and there's no bus mode mismatch, then
926 the adapter supports 66 pci */
927 cmd
= HPC_BUS_66CONVMODE
;
929 cmd
= HPC_BUS_33CONVMODE
;
931 if (slot_cur
->supported_speed
>= BUS_SPEED_66
)
932 cmd
= HPC_BUS_66CONVMODE
;
934 cmd
= HPC_BUS_33CONVMODE
;
937 case HPC_SLOT_SPEED_133
:
938 switch (slot_cur
->supported_speed
) {
940 cmd
= HPC_BUS_33CONVMODE
;
943 if (slot_cur
->supported_bus_mode
== BUS_MODE_PCIX
)
944 cmd
= HPC_BUS_66PCIXMODE
;
946 cmd
= HPC_BUS_66CONVMODE
;
949 cmd
= HPC_BUS_100PCIXMODE
;
952 /* This is to take care of the bug in CIOBX chip */
953 if (pci_dev_present(ciobx
))
954 ibmphp_hpc_writeslot(slot_cur
,
955 HPC_BUS_100PCIXMODE
);
956 cmd
= HPC_BUS_133PCIXMODE
;
959 err("Wrong bus speed\n");
964 err("wrong slot speed\n");
967 debug("setting bus speed for slot %d, cmd %x\n",
968 slot_cur
->number
, cmd
);
969 retval
= ibmphp_hpc_writeslot(slot_cur
, cmd
);
971 err("setting bus speed failed\n");
974 if (CTLR_RESULT(slot_cur
->ctrl
->status
)) {
975 err("command not completed successfully in set_bus\n");
979 /* This is for x440, once Brandon fixes the firmware,
980 will not need this delay */
982 debug("%s -Exit\n", __func__
);
986 /* This routine checks the bus limitations that the slot is on from the BIOS.
987 * This is used in deciding whether or not to power up the slot.
988 * (electrical/spec limitations. For example, >1 133 MHz or >2 66 PCI cards on
991 * Returns: 0 = no limitations, -EINVAL = exceeded limitations on the bus
993 static int check_limitations(struct slot
*slot_cur
)
996 struct slot
* tmp_slot
;
1000 for (i
= slot_cur
->bus_on
->slot_min
; i
<= slot_cur
->bus_on
->slot_max
; i
++) {
1001 tmp_slot
= ibmphp_get_slot_from_physical_num(i
);
1004 if ((SLOT_PWRGD(tmp_slot
->status
)) &&
1005 !(SLOT_CONNECT(tmp_slot
->status
)))
1008 get_cur_bus_info(&slot_cur
);
1009 switch (slot_cur
->bus_on
->current_speed
) {
1011 limitation
= slot_cur
->bus_on
->slots_at_33_conv
;
1014 if (slot_cur
->bus_on
->current_bus_mode
== BUS_MODE_PCIX
)
1015 limitation
= slot_cur
->bus_on
->slots_at_66_pcix
;
1017 limitation
= slot_cur
->bus_on
->slots_at_66_conv
;
1020 limitation
= slot_cur
->bus_on
->slots_at_100_pcix
;
1023 limitation
= slot_cur
->bus_on
->slots_at_133_pcix
;
1027 if ((count
+ 1) > limitation
)
1032 static inline void print_card_capability(struct slot
*slot_cur
)
1034 info("capability of the card is ");
1035 if ((slot_cur
->ext_status
& CARD_INFO
) == PCIX133
)
1036 info(" 133 MHz PCI-X\n");
1037 else if ((slot_cur
->ext_status
& CARD_INFO
) == PCIX66
)
1038 info(" 66 MHz PCI-X\n");
1039 else if ((slot_cur
->ext_status
& CARD_INFO
) == PCI66
)
1040 info(" 66 MHz PCI\n");
1042 info(" 33 MHz PCI\n");
1046 /* This routine will power on the slot, configure the device(s) and find the
1048 * Parameters: hotplug_slot
1049 * Returns: 0 or failure codes
1051 static int enable_slot(struct hotplug_slot
*hs
)
1054 struct slot
*slot_cur
;
1056 struct pci_func
*tmp_func
;
1058 ibmphp_lock_operations();
1060 debug("ENABLING SLOT........\n");
1061 slot_cur
= hs
->private;
1063 if ((rc
= validate(slot_cur
, ENABLE
))) {
1064 err("validate function failed\n");
1068 attn_LED_blink(slot_cur
);
1070 rc
= set_bus(slot_cur
);
1072 err("was not able to set the bus\n");
1076 /*-----------------debugging------------------------------*/
1077 get_cur_bus_info(&slot_cur
);
1078 debug("the current bus speed right after set_bus = %x\n",
1079 slot_cur
->bus_on
->current_speed
);
1080 /*----------------------------------------------------------*/
1082 rc
= check_limitations(slot_cur
);
1084 err("Adding this card exceeds the limitations of this bus.\n");
1085 err("(i.e., >1 133MHz cards running on same bus, or "
1086 ">2 66 PCI cards running on same bus.\n");
1087 err("Try hot-adding into another bus\n");
1092 rc
= power_on(slot_cur
);
1095 err("something wrong when powering up... please see below for details\n");
1096 /* need to turn off before on, otherwise, blinking overwrites */
1099 if (slot_update(&slot_cur
)) {
1105 /* Check to see the error of why it failed */
1106 if ((SLOT_POWER(slot_cur
->status
)) &&
1107 !(SLOT_PWRGD(slot_cur
->status
)))
1108 err("power fault occurred trying to power up\n");
1109 else if (SLOT_BUS_SPEED(slot_cur
->status
)) {
1110 err("bus speed mismatch occurred. please check "
1111 "current bus speed and card capability\n");
1112 print_card_capability(slot_cur
);
1113 } else if (SLOT_BUS_MODE(slot_cur
->ext_status
)) {
1114 err("bus mode mismatch occurred. please check "
1115 "current bus mode and card capability\n");
1116 print_card_capability(slot_cur
);
1118 ibmphp_update_slot_info(slot_cur
);
1121 debug("after power_on\n");
1122 /*-----------------------debugging---------------------------*/
1123 get_cur_bus_info(&slot_cur
);
1124 debug("the current bus speed right after power_on = %x\n",
1125 slot_cur
->bus_on
->current_speed
);
1126 /*----------------------------------------------------------*/
1128 rc
= slot_update(&slot_cur
);
1133 if (SLOT_POWER(slot_cur
->status
) && !(SLOT_PWRGD(slot_cur
->status
))) {
1134 err("power fault occurred trying to power up...\n");
1137 if (SLOT_POWER(slot_cur
->status
) && (SLOT_BUS_SPEED(slot_cur
->status
))) {
1138 err("bus speed mismatch occurred. please check current bus "
1139 "speed and card capability\n");
1140 print_card_capability(slot_cur
);
1143 /* Don't think this case will happen after above checks...
1144 * but just in case, for paranoia sake */
1145 if (!(SLOT_POWER(slot_cur
->status
))) {
1146 err("power on failed...\n");
1150 slot_cur
->func
= kzalloc(sizeof(struct pci_func
), GFP_KERNEL
);
1151 if (!slot_cur
->func
) {
1152 /* We cannot do update_slot_info here, since no memory for
1153 * kmalloc n.e.ways, and update_slot_info allocates some */
1154 err("out of system memory\n");
1158 slot_cur
->func
->busno
= slot_cur
->bus
;
1159 slot_cur
->func
->device
= slot_cur
->device
;
1160 for (i
= 0; i
< 4; i
++)
1161 slot_cur
->func
->irq
[i
] = slot_cur
->irq
[i
];
1163 debug("b4 configure_card, slot_cur->bus = %x, slot_cur->device = %x\n",
1164 slot_cur
->bus
, slot_cur
->device
);
1166 if (ibmphp_configure_card(slot_cur
->func
, slot_cur
->number
)) {
1167 err("configure_card was unsuccessful...\n");
1168 /* true because don't need to actually deallocate resources,
1169 * just remove references */
1170 ibmphp_unconfigure_card(&slot_cur
, 1);
1171 debug("after unconfigure_card\n");
1172 slot_cur
->func
= NULL
;
1179 tmp_func
= ibm_slot_find(slot_cur
->bus
, slot_cur
->func
->device
,
1181 if (tmp_func
&& !(tmp_func
->dev
))
1182 ibm_configure_device(tmp_func
);
1186 if (slot_update(&slot_cur
)) {
1190 ibmphp_print_test();
1191 rc
= ibmphp_update_slot_info(slot_cur
);
1193 ibmphp_unlock_operations();
1197 attn_off(slot_cur
); /* need to turn off if was blinking b4 */
1200 rcpr
= slot_update(&slot_cur
);
1205 ibmphp_update_slot_info(slot_cur
);
1209 attn_off(slot_cur
); /* need to turn off if was blinking b4 */
1211 rcpr
= power_off(slot_cur
);
1219 /**************************************************************
1220 * HOT REMOVING ADAPTER CARD *
1221 * INPUT: POINTER TO THE HOTPLUG SLOT STRUCTURE *
1222 * OUTPUT: SUCCESS 0 ; FAILURE: UNCONFIGURE , VALIDATE *
1224 **************************************************************/
1225 static int ibmphp_disable_slot(struct hotplug_slot
*hotplug_slot
)
1227 struct slot
*slot
= hotplug_slot
->private;
1230 ibmphp_lock_operations();
1231 rc
= ibmphp_do_disable_slot(slot
);
1232 ibmphp_unlock_operations();
1236 int ibmphp_do_disable_slot(struct slot
*slot_cur
)
1241 debug("DISABLING SLOT...\n");
1243 if ((slot_cur
== NULL
) || (slot_cur
->ctrl
== NULL
)) {
1247 flag
= slot_cur
->flag
;
1251 rc
= validate(slot_cur
, DISABLE
);
1252 /* checking if powered off already & valid slot # */
1256 attn_LED_blink(slot_cur
);
1258 if (slot_cur
->func
== NULL
) {
1259 /* We need this for fncs's that were there on bootup */
1260 slot_cur
->func
= kzalloc(sizeof(struct pci_func
), GFP_KERNEL
);
1261 if (!slot_cur
->func
) {
1262 err("out of system memory\n");
1266 slot_cur
->func
->busno
= slot_cur
->bus
;
1267 slot_cur
->func
->device
= slot_cur
->device
;
1270 ibm_unconfigure_device(slot_cur
->func
);
1272 /* If we got here from latch suddenly opening on operating card or
1273 a power fault, there's no power to the card, so cannot
1274 read from it to determine what resources it occupied. This operation
1275 is forbidden anyhow. The best we can do is remove it from kernel
1283 rc
= ibmphp_unconfigure_card(&slot_cur
, 0);
1284 slot_cur
->func
= NULL
;
1285 debug("in disable_slot. after unconfigure_card\n");
1287 err("could not unconfigure card.\n");
1291 rc
= ibmphp_hpc_writeslot(slot_cur
, HPC_SLOT_OFF
);
1296 rc
= slot_update(&slot_cur
);
1300 rc
= ibmphp_update_slot_info(slot_cur
);
1301 ibmphp_print_test();
1306 /* Need to turn off if was blinking b4 */
1309 if (slot_update(&slot_cur
)) {
1314 ibmphp_update_slot_info(slot_cur
);
1318 struct hotplug_slot_ops ibmphp_hotplug_slot_ops
= {
1319 .owner
= THIS_MODULE
,
1320 .set_attention_status
= set_attention_status
,
1321 .enable_slot
= enable_slot
,
1322 .disable_slot
= ibmphp_disable_slot
,
1323 .hardware_test
= NULL
,
1324 .get_power_status
= get_power_status
,
1325 .get_attention_status
= get_attention_status
,
1326 .get_latch_status
= get_latch_status
,
1327 .get_adapter_status
= get_adapter_present
,
1328 .get_max_bus_speed
= get_max_bus_speed
,
1329 .get_cur_bus_speed
= get_cur_bus_speed
,
1330 /* .get_max_adapter_speed = get_max_adapter_speed,
1331 .get_bus_name_status = get_bus_name,
1335 static void ibmphp_unload(void)
1338 debug("after slots\n");
1339 ibmphp_free_resources();
1340 debug("after resources\n");
1341 ibmphp_free_bus_info_queue();
1342 debug("after bus info\n");
1343 ibmphp_free_ebda_hpc_queue();
1344 debug("after ebda hpc\n");
1345 ibmphp_free_ebda_pci_rsrc_queue();
1346 debug("after ebda pci rsrc\n");
1347 kfree(ibmphp_pci_bus
);
1350 static int __init
ibmphp_init(void)
1352 struct pci_bus
*bus
;
1358 info(DRIVER_DESC
" version: " DRIVER_VERSION
"\n");
1360 ibmphp_pci_bus
= kmalloc(sizeof(*ibmphp_pci_bus
), GFP_KERNEL
);
1361 if (!ibmphp_pci_bus
) {
1362 err("out of memory\n");
1367 bus
= pci_find_bus(0, 0);
1369 err("Can't find the root pci bus, can not continue\n");
1373 memcpy(ibmphp_pci_bus
, bus
, sizeof(*ibmphp_pci_bus
));
1375 ibmphp_debug
= debug
;
1377 ibmphp_hpc_initvars();
1379 for (i
= 0; i
< 16; i
++)
1382 if ((rc
= ibmphp_access_ebda()))
1384 debug("after ibmphp_access_ebda()\n");
1386 if ((rc
= ibmphp_rsrc_init()))
1388 debug("AFTER Resource & EBDA INITIALIZATIONS\n");
1390 max_slots
= get_max_slots();
1392 if ((rc
= ibmphp_register_pci()))
1400 ibmphp_print_test();
1401 if ((rc
= ibmphp_hpc_start_poll_thread())) {
1405 /* lock ourselves into memory with a module
1406 * count of -1 so that no one can unload us. */
1407 module_put(THIS_MODULE
);
1417 static void __exit
ibmphp_exit(void)
1419 ibmphp_hpc_stop_poll_thread();
1420 debug("after polling\n");
1425 module_init(ibmphp_init
);
1426 module_exit(ibmphp_exit
);