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 struct io_apic_irq_attr irq_attr
;
160 (*cur_slot
)->device
= PCI_SLOT(rtable
->slots
[loop
].devfn
);
161 for (i
= 0; i
< 4; i
++)
162 (*cur_slot
)->irq
[i
] = IO_APIC_get_PCI_irq_vector((int) (*cur_slot
)->bus
,
163 (int) (*cur_slot
)->device
, i
,
166 debug("(*cur_slot)->irq[0] = %x\n",
167 (*cur_slot
)->irq
[0]);
168 debug("(*cur_slot)->irq[1] = %x\n",
169 (*cur_slot
)->irq
[1]);
170 debug("(*cur_slot)->irq[2] = %x\n",
171 (*cur_slot
)->irq
[2]);
172 debug("(*cur_slot)->irq[3] = %x\n",
173 (*cur_slot
)->irq
[3]);
175 debug("rtable->exlusive_irqs = %x\n",
176 rtable
->exclusive_irqs
);
177 debug("rtable->slots[loop].irq[0].bitmap = %x\n",
178 rtable
->slots
[loop
].irq
[0].bitmap
);
179 debug("rtable->slots[loop].irq[1].bitmap = %x\n",
180 rtable
->slots
[loop
].irq
[1].bitmap
);
181 debug("rtable->slots[loop].irq[2].bitmap = %x\n",
182 rtable
->slots
[loop
].irq
[2].bitmap
);
183 debug("rtable->slots[loop].irq[3].bitmap = %x\n",
184 rtable
->slots
[loop
].irq
[3].bitmap
);
186 debug("rtable->slots[loop].irq[0].link = %x\n",
187 rtable
->slots
[loop
].irq
[0].link
);
188 debug("rtable->slots[loop].irq[1].link = %x\n",
189 rtable
->slots
[loop
].irq
[1].link
);
190 debug("rtable->slots[loop].irq[2].link = %x\n",
191 rtable
->slots
[loop
].irq
[2].link
);
192 debug("rtable->slots[loop].irq[3].link = %x\n",
193 rtable
->slots
[loop
].irq
[3].link
);
194 debug("end of init_devno\n");
204 static inline int power_on(struct slot
*slot_cur
)
206 u8 cmd
= HPC_SLOT_ON
;
209 retval
= ibmphp_hpc_writeslot(slot_cur
, cmd
);
211 err("power on failed\n");
214 if (CTLR_RESULT(slot_cur
->ctrl
->status
)) {
215 err("command not completed successfully in power_on\n");
218 msleep(3000); /* For ServeRAID cards, and some 66 PCI */
222 static inline int power_off(struct slot
*slot_cur
)
224 u8 cmd
= HPC_SLOT_OFF
;
227 retval
= ibmphp_hpc_writeslot(slot_cur
, cmd
);
229 err("power off failed\n");
232 if (CTLR_RESULT(slot_cur
->ctrl
->status
)) {
233 err("command not completed successfully in power_off\n");
239 static int set_attention_status(struct hotplug_slot
*hotplug_slot
, u8 value
)
243 u8 cmd
= 0x00; /* avoid compiler warning */
245 debug("set_attention_status - Entry hotplug_slot[%lx] value[%x]\n",
246 (ulong
) hotplug_slot
, value
);
247 ibmphp_lock_operations();
252 case HPC_SLOT_ATTN_OFF
:
253 cmd
= HPC_SLOT_ATTNOFF
;
255 case HPC_SLOT_ATTN_ON
:
256 cmd
= HPC_SLOT_ATTNON
;
258 case HPC_SLOT_ATTN_BLINK
:
259 cmd
= HPC_SLOT_BLINKLED
;
263 err("set_attention_status - Error : invalid input [%x]\n",
268 pslot
= hotplug_slot
->private;
270 rc
= ibmphp_hpc_writeslot(pslot
, cmd
);
277 ibmphp_unlock_operations();
279 debug("set_attention_status - Exit rc[%d]\n", rc
);
283 static int get_attention_status(struct hotplug_slot
*hotplug_slot
, u8
* value
)
289 debug("get_attention_status - Entry hotplug_slot[%lx] pvalue[%lx]\n",
290 (ulong
) hotplug_slot
, (ulong
) value
);
292 ibmphp_lock_operations();
294 pslot
= hotplug_slot
->private;
296 memcpy(&myslot
, pslot
, sizeof(struct slot
));
297 rc
= ibmphp_hpc_readslot(pslot
, READ_SLOTSTATUS
,
300 rc
= ibmphp_hpc_readslot(pslot
,
302 &(myslot
.ext_status
));
304 *value
= SLOT_ATTN(myslot
.status
,
309 ibmphp_unlock_operations();
310 debug("get_attention_status - Exit rc[%d] value[%x]\n", rc
, *value
);
314 static int get_latch_status(struct hotplug_slot
*hotplug_slot
, u8
* value
)
320 debug("get_latch_status - Entry hotplug_slot[%lx] pvalue[%lx]\n",
321 (ulong
) hotplug_slot
, (ulong
) value
);
322 ibmphp_lock_operations();
324 pslot
= hotplug_slot
->private;
326 memcpy(&myslot
, pslot
, sizeof(struct slot
));
327 rc
= ibmphp_hpc_readslot(pslot
, READ_SLOTSTATUS
,
330 *value
= SLOT_LATCH(myslot
.status
);
334 ibmphp_unlock_operations();
335 debug("get_latch_status - Exit rc[%d] rc[%x] value[%x]\n",
341 static int get_power_status(struct hotplug_slot
*hotplug_slot
, u8
* value
)
347 debug("get_power_status - Entry hotplug_slot[%lx] pvalue[%lx]\n",
348 (ulong
) hotplug_slot
, (ulong
) value
);
349 ibmphp_lock_operations();
351 pslot
= hotplug_slot
->private;
353 memcpy(&myslot
, pslot
, sizeof(struct slot
));
354 rc
= ibmphp_hpc_readslot(pslot
, READ_SLOTSTATUS
,
357 *value
= SLOT_PWRGD(myslot
.status
);
361 ibmphp_unlock_operations();
362 debug("get_power_status - Exit rc[%d] rc[%x] value[%x]\n",
367 static int get_adapter_present(struct hotplug_slot
*hotplug_slot
, u8
* value
)
374 debug("get_adapter_status - Entry hotplug_slot[%lx] pvalue[%lx]\n",
375 (ulong
) hotplug_slot
, (ulong
) value
);
376 ibmphp_lock_operations();
378 pslot
= hotplug_slot
->private;
380 memcpy(&myslot
, pslot
, sizeof(struct slot
));
381 rc
= ibmphp_hpc_readslot(pslot
, READ_SLOTSTATUS
,
384 present
= SLOT_PRESENT(myslot
.status
);
385 if (present
== HPC_SLOT_EMPTY
)
393 ibmphp_unlock_operations();
394 debug("get_adapter_present - Exit rc[%d] value[%x]\n", rc
, *value
);
398 static int get_max_bus_speed(struct slot
*slot
)
402 enum pci_bus_speed speed
;
403 struct pci_bus
*bus
= slot
->hotplug_slot
->pci_slot
->bus
;
405 debug("%s - Entry slot[%p]\n", __func__
, slot
);
407 ibmphp_lock_operations();
408 mode
= slot
->supported_bus_mode
;
409 speed
= slot
->supported_speed
;
410 ibmphp_unlock_operations();
416 if (mode
== BUS_MODE_PCIX
)
424 /* Note (will need to change): there would be soon 256, 512 also */
429 bus
->max_bus_speed
= speed
;
431 debug("%s - Exit rc[%d] speed[%x]\n", __func__
, rc
, speed
);
436 static int get_max_adapter_speed_1(struct hotplug_slot *hotplug_slot, u8 * value, u8 flag)
442 debug("get_max_adapter_speed_1 - Entry hotplug_slot[%lx] pvalue[%lx]\n",
443 (ulong)hotplug_slot, (ulong) value);
446 ibmphp_lock_operations();
448 if (hotplug_slot && value) {
449 pslot = hotplug_slot->private;
451 memcpy(&myslot, pslot, sizeof(struct slot));
452 rc = ibmphp_hpc_readslot(pslot, READ_SLOTSTATUS,
455 if (!(SLOT_LATCH (myslot.status)) &&
456 (SLOT_PRESENT (myslot.status))) {
457 rc = ibmphp_hpc_readslot(pslot,
459 &(myslot.ext_status));
461 *value = SLOT_SPEED(myslot.ext_status);
463 *value = MAX_ADAPTER_NONE;
468 ibmphp_unlock_operations();
470 debug("get_max_adapter_speed_1 - Exit rc[%d] value[%x]\n", rc, *value);
474 static int get_bus_name(struct hotplug_slot *hotplug_slot, char * value)
477 struct slot *pslot = NULL;
479 debug("get_bus_name - Entry hotplug_slot[%lx]\n", (ulong)hotplug_slot);
481 ibmphp_lock_operations();
484 pslot = hotplug_slot->private;
487 snprintf(value, 100, "Bus %x", pslot->bus);
492 ibmphp_unlock_operations();
493 debug("get_bus_name - Exit rc[%d] value[%x]\n", rc, *value);
498 /****************************************************************************
499 * This routine will initialize the ops data structure used in the validate
500 * function. It will also power off empty slots that are powered on since BIOS
501 * leaves those on, albeit disconnected
502 ****************************************************************************/
503 static int __init
init_ops(void)
505 struct slot
*slot_cur
;
506 struct list_head
*tmp
;
510 list_for_each(tmp
, &ibmphp_slot_head
) {
511 slot_cur
= list_entry(tmp
, struct slot
, ibm_slot_list
);
516 debug("BEFORE GETTING SLOT STATUS, slot # %x\n",
518 if (slot_cur
->ctrl
->revision
== 0xFF)
519 if (get_ctrl_revision(slot_cur
,
520 &slot_cur
->ctrl
->revision
))
523 if (slot_cur
->bus_on
->current_speed
== 0xFF)
524 if (get_cur_bus_info(&slot_cur
))
526 get_max_bus_speed(slot_cur
);
528 if (slot_cur
->ctrl
->options
== 0xFF)
529 if (get_hpc_options(slot_cur
, &slot_cur
->ctrl
->options
))
532 retval
= slot_update(&slot_cur
);
536 debug("status = %x\n", slot_cur
->status
);
537 debug("ext_status = %x\n", slot_cur
->ext_status
);
538 debug("SLOT_POWER = %x\n", SLOT_POWER(slot_cur
->status
));
539 debug("SLOT_PRESENT = %x\n", SLOT_PRESENT(slot_cur
->status
));
540 debug("SLOT_LATCH = %x\n", SLOT_LATCH(slot_cur
->status
));
542 if ((SLOT_PWRGD(slot_cur
->status
)) &&
543 !(SLOT_PRESENT(slot_cur
->status
)) &&
544 !(SLOT_LATCH(slot_cur
->status
))) {
545 debug("BEFORE POWER OFF COMMAND\n");
546 rc
= power_off(slot_cur
);
550 /* retval = slot_update(&slot_cur);
553 * ibmphp_update_slot_info(slot_cur);
561 /* This operation will check whether the slot is within the bounds and
562 * the operation is valid to perform on that slot
563 * Parameters: slot, operation
564 * Returns: 0 or error codes
566 static int validate(struct slot
*slot_cur
, int opn
)
573 number
= slot_cur
->number
;
574 if ((number
> max_slots
) || (number
< 0))
576 debug("slot_number in validate is %d\n", slot_cur
->number
);
578 retval
= slot_update(&slot_cur
);
584 if (!(SLOT_PWRGD(slot_cur
->status
)) &&
585 (SLOT_PRESENT(slot_cur
->status
)) &&
586 !(SLOT_LATCH(slot_cur
->status
)))
590 if ((SLOT_PWRGD(slot_cur
->status
)) &&
591 (SLOT_PRESENT(slot_cur
->status
)) &&
592 !(SLOT_LATCH(slot_cur
->status
)))
598 err("validate failed....\n");
602 /****************************************************************************
603 * This routine is for updating the data structures in the hotplug core
604 * Parameters: struct slot
605 * Returns: 0 or error
606 ****************************************************************************/
607 int ibmphp_update_slot_info(struct slot
*slot_cur
)
609 struct hotplug_slot_info
*info
;
610 struct pci_bus
*bus
= slot_cur
->hotplug_slot
->pci_slot
->bus
;
615 info
= kmalloc(sizeof(struct hotplug_slot_info
), GFP_KERNEL
);
617 err("out of system memory\n");
621 info
->power_status
= SLOT_PWRGD(slot_cur
->status
);
622 info
->attention_status
= SLOT_ATTN(slot_cur
->status
,
623 slot_cur
->ext_status
);
624 info
->latch_status
= SLOT_LATCH(slot_cur
->status
);
625 if (!SLOT_PRESENT(slot_cur
->status
)) {
626 info
->adapter_status
= 0;
627 /* info->max_adapter_speed_status = MAX_ADAPTER_NONE; */
629 info
->adapter_status
= 1;
630 /* get_max_adapter_speed_1(slot_cur->hotplug_slot,
631 &info->max_adapter_speed_status, 0); */
634 bus_speed
= slot_cur
->bus_on
->current_speed
;
635 mode
= slot_cur
->bus_on
->current_bus_mode
;
641 if (mode
== BUS_MODE_PCIX
)
643 else if (mode
== BUS_MODE_PCI
)
646 bus_speed
= PCI_SPEED_UNKNOWN
;
653 bus_speed
= PCI_SPEED_UNKNOWN
;
656 bus
->cur_bus_speed
= bus_speed
;
659 rc
= pci_hp_change_slot_info(slot_cur
->hotplug_slot
, info
);
665 /******************************************************************************
666 * This function will return the pci_func, given bus and devfunc, or NULL. It
667 * is called from visit routines
668 ******************************************************************************/
670 static struct pci_func
*ibm_slot_find(u8 busno
, u8 device
, u8 function
)
672 struct pci_func
*func_cur
;
673 struct slot
*slot_cur
;
674 struct list_head
* tmp
;
675 list_for_each(tmp
, &ibmphp_slot_head
) {
676 slot_cur
= list_entry(tmp
, struct slot
, ibm_slot_list
);
677 if (slot_cur
->func
) {
678 func_cur
= slot_cur
->func
;
680 if ((func_cur
->busno
== busno
) &&
681 (func_cur
->device
== device
) &&
682 (func_cur
->function
== function
))
684 func_cur
= func_cur
->next
;
691 /*************************************************************
692 * This routine frees up memory used by struct slot, including
693 * the pointers to pci_func, bus, hotplug_slot, controller,
694 * and deregistering from the hotplug core
695 *************************************************************/
696 static void free_slots(void)
698 struct slot
*slot_cur
;
699 struct list_head
* tmp
;
700 struct list_head
* next
;
702 debug("%s -- enter\n", __func__
);
704 list_for_each_safe(tmp
, next
, &ibmphp_slot_head
) {
705 slot_cur
= list_entry(tmp
, struct slot
, ibm_slot_list
);
706 pci_hp_deregister(slot_cur
->hotplug_slot
);
708 debug("%s -- exit\n", __func__
);
711 static void ibm_unconfigure_device(struct pci_func
*func
)
713 struct pci_dev
*temp
;
716 debug("inside %s\n", __func__
);
717 debug("func->device = %x, func->function = %x\n",
718 func
->device
, func
->function
);
719 debug("func->device << 3 | 0x0 = %x\n", func
->device
<< 3 | 0x0);
721 for (j
= 0; j
< 0x08; j
++) {
722 temp
= pci_get_bus_and_slot(func
->busno
, (func
->device
<< 3) | j
);
724 pci_remove_bus_device(temp
);
728 pci_dev_put(func
->dev
);
732 * The following function is to fix kernel bug regarding
733 * getting bus entries, here we manually add those primary
734 * bus entries to kernel bus structure whenever apply
736 static u8
bus_structure_fixup(u8 busno
)
742 if (pci_find_bus(0, busno
) || !(ibmphp_find_same_bus_num(busno
)))
745 bus
= kmalloc(sizeof(*bus
), GFP_KERNEL
);
747 err("%s - out of memory\n", __func__
);
750 dev
= kmalloc(sizeof(*dev
), GFP_KERNEL
);
753 err("%s - out of memory\n", __func__
);
758 bus
->ops
= ibmphp_pci_bus
->ops
;
760 for (dev
->devfn
= 0; dev
->devfn
< 256; dev
->devfn
+= 8) {
761 if (!pci_read_config_word(dev
, PCI_VENDOR_ID
, &l
) &&
762 (l
!= 0x0000) && (l
!= 0xffff)) {
763 debug("%s - Inside bus_struture_fixup()\n",
765 pci_scan_bus(busno
, ibmphp_pci_bus
->ops
, NULL
);
776 static int ibm_configure_device(struct pci_func
*func
)
779 struct pci_bus
*child
;
781 int flag
= 0; /* this is to make sure we don't double scan the bus,
782 for bridged devices primarily */
784 if (!(bus_structure_fixup(func
->busno
)))
786 if (func
->dev
== NULL
)
787 func
->dev
= pci_get_bus_and_slot(func
->busno
,
788 PCI_DEVFN(func
->device
, func
->function
));
790 if (func
->dev
== NULL
) {
791 struct pci_bus
*bus
= pci_find_bus(0, func
->busno
);
795 num
= pci_scan_slot(bus
,
796 PCI_DEVFN(func
->device
, func
->function
));
798 pci_bus_add_devices(bus
);
800 func
->dev
= pci_get_bus_and_slot(func
->busno
,
801 PCI_DEVFN(func
->device
, func
->function
));
802 if (func
->dev
== NULL
) {
803 err("ERROR... : pci_dev still NULL\n");
807 if (!(flag
) && (func
->dev
->hdr_type
== PCI_HEADER_TYPE_BRIDGE
)) {
808 pci_read_config_byte(func
->dev
, PCI_SECONDARY_BUS
, &bus
);
809 child
= pci_add_new_bus(func
->dev
->bus
, func
->dev
, bus
);
810 pci_do_scan_bus(child
);
816 /*******************************************************
817 * Returns whether the bus is empty or not
818 *******************************************************/
819 static int is_bus_empty(struct slot
* slot_cur
)
822 struct slot
* tmp_slot
;
823 u8 i
= slot_cur
->bus_on
->slot_min
;
825 while (i
<= slot_cur
->bus_on
->slot_max
) {
826 if (i
== slot_cur
->number
) {
830 tmp_slot
= ibmphp_get_slot_from_physical_num(i
);
833 rc
= slot_update(&tmp_slot
);
836 if (SLOT_PRESENT(tmp_slot
->status
) &&
837 SLOT_PWRGD(tmp_slot
->status
))
844 /***********************************************************
845 * If the HPC permits and the bus currently empty, tries to set the
846 * bus speed and mode at the maximum card and bus capability
848 * Returns: bus is set (0) or error code
849 ***********************************************************/
850 static int set_bus(struct slot
* slot_cur
)
856 static struct pci_device_id ciobx
[] = {
857 { PCI_DEVICE(PCI_VENDOR_ID_SERVERWORKS
, 0x0101) },
861 debug("%s - entry slot # %d\n", __func__
, slot_cur
->number
);
862 if (SET_BUS_STATUS(slot_cur
->ctrl
) && is_bus_empty(slot_cur
)) {
863 rc
= slot_update(&slot_cur
);
866 speed
= SLOT_SPEED(slot_cur
->ext_status
);
867 debug("ext_status = %x, speed = %x\n", slot_cur
->ext_status
, speed
);
869 case HPC_SLOT_SPEED_33
:
870 cmd
= HPC_BUS_33CONVMODE
;
872 case HPC_SLOT_SPEED_66
:
873 if (SLOT_PCIX(slot_cur
->ext_status
)) {
874 if ((slot_cur
->supported_speed
>= BUS_SPEED_66
) &&
875 (slot_cur
->supported_bus_mode
== BUS_MODE_PCIX
))
876 cmd
= HPC_BUS_66PCIXMODE
;
877 else if (!SLOT_BUS_MODE(slot_cur
->ext_status
))
878 /* if max slot/bus capability is 66 pci
879 and there's no bus mode mismatch, then
880 the adapter supports 66 pci */
881 cmd
= HPC_BUS_66CONVMODE
;
883 cmd
= HPC_BUS_33CONVMODE
;
885 if (slot_cur
->supported_speed
>= BUS_SPEED_66
)
886 cmd
= HPC_BUS_66CONVMODE
;
888 cmd
= HPC_BUS_33CONVMODE
;
891 case HPC_SLOT_SPEED_133
:
892 switch (slot_cur
->supported_speed
) {
894 cmd
= HPC_BUS_33CONVMODE
;
897 if (slot_cur
->supported_bus_mode
== BUS_MODE_PCIX
)
898 cmd
= HPC_BUS_66PCIXMODE
;
900 cmd
= HPC_BUS_66CONVMODE
;
903 cmd
= HPC_BUS_100PCIXMODE
;
906 /* This is to take care of the bug in CIOBX chip */
907 if (pci_dev_present(ciobx
))
908 ibmphp_hpc_writeslot(slot_cur
,
909 HPC_BUS_100PCIXMODE
);
910 cmd
= HPC_BUS_133PCIXMODE
;
913 err("Wrong bus speed\n");
918 err("wrong slot speed\n");
921 debug("setting bus speed for slot %d, cmd %x\n",
922 slot_cur
->number
, cmd
);
923 retval
= ibmphp_hpc_writeslot(slot_cur
, cmd
);
925 err("setting bus speed failed\n");
928 if (CTLR_RESULT(slot_cur
->ctrl
->status
)) {
929 err("command not completed successfully in set_bus\n");
933 /* This is for x440, once Brandon fixes the firmware,
934 will not need this delay */
936 debug("%s -Exit\n", __func__
);
940 /* This routine checks the bus limitations that the slot is on from the BIOS.
941 * This is used in deciding whether or not to power up the slot.
942 * (electrical/spec limitations. For example, >1 133 MHz or >2 66 PCI cards on
945 * Returns: 0 = no limitations, -EINVAL = exceeded limitations on the bus
947 static int check_limitations(struct slot
*slot_cur
)
950 struct slot
* tmp_slot
;
954 for (i
= slot_cur
->bus_on
->slot_min
; i
<= slot_cur
->bus_on
->slot_max
; i
++) {
955 tmp_slot
= ibmphp_get_slot_from_physical_num(i
);
958 if ((SLOT_PWRGD(tmp_slot
->status
)) &&
959 !(SLOT_CONNECT(tmp_slot
->status
)))
962 get_cur_bus_info(&slot_cur
);
963 switch (slot_cur
->bus_on
->current_speed
) {
965 limitation
= slot_cur
->bus_on
->slots_at_33_conv
;
968 if (slot_cur
->bus_on
->current_bus_mode
== BUS_MODE_PCIX
)
969 limitation
= slot_cur
->bus_on
->slots_at_66_pcix
;
971 limitation
= slot_cur
->bus_on
->slots_at_66_conv
;
974 limitation
= slot_cur
->bus_on
->slots_at_100_pcix
;
977 limitation
= slot_cur
->bus_on
->slots_at_133_pcix
;
981 if ((count
+ 1) > limitation
)
986 static inline void print_card_capability(struct slot
*slot_cur
)
988 info("capability of the card is ");
989 if ((slot_cur
->ext_status
& CARD_INFO
) == PCIX133
)
990 info(" 133 MHz PCI-X\n");
991 else if ((slot_cur
->ext_status
& CARD_INFO
) == PCIX66
)
992 info(" 66 MHz PCI-X\n");
993 else if ((slot_cur
->ext_status
& CARD_INFO
) == PCI66
)
994 info(" 66 MHz PCI\n");
996 info(" 33 MHz PCI\n");
1000 /* This routine will power on the slot, configure the device(s) and find the
1002 * Parameters: hotplug_slot
1003 * Returns: 0 or failure codes
1005 static int enable_slot(struct hotplug_slot
*hs
)
1008 struct slot
*slot_cur
;
1010 struct pci_func
*tmp_func
;
1012 ibmphp_lock_operations();
1014 debug("ENABLING SLOT........\n");
1015 slot_cur
= hs
->private;
1017 if ((rc
= validate(slot_cur
, ENABLE
))) {
1018 err("validate function failed\n");
1022 attn_LED_blink(slot_cur
);
1024 rc
= set_bus(slot_cur
);
1026 err("was not able to set the bus\n");
1030 /*-----------------debugging------------------------------*/
1031 get_cur_bus_info(&slot_cur
);
1032 debug("the current bus speed right after set_bus = %x\n",
1033 slot_cur
->bus_on
->current_speed
);
1034 /*----------------------------------------------------------*/
1036 rc
= check_limitations(slot_cur
);
1038 err("Adding this card exceeds the limitations of this bus.\n");
1039 err("(i.e., >1 133MHz cards running on same bus, or "
1040 ">2 66 PCI cards running on same bus.\n");
1041 err("Try hot-adding into another bus\n");
1046 rc
= power_on(slot_cur
);
1049 err("something wrong when powering up... please see below for details\n");
1050 /* need to turn off before on, otherwise, blinking overwrites */
1053 if (slot_update(&slot_cur
)) {
1059 /* Check to see the error of why it failed */
1060 if ((SLOT_POWER(slot_cur
->status
)) &&
1061 !(SLOT_PWRGD(slot_cur
->status
)))
1062 err("power fault occurred trying to power up\n");
1063 else if (SLOT_BUS_SPEED(slot_cur
->status
)) {
1064 err("bus speed mismatch occurred. please check "
1065 "current bus speed and card capability\n");
1066 print_card_capability(slot_cur
);
1067 } else if (SLOT_BUS_MODE(slot_cur
->ext_status
)) {
1068 err("bus mode mismatch occurred. please check "
1069 "current bus mode and card capability\n");
1070 print_card_capability(slot_cur
);
1072 ibmphp_update_slot_info(slot_cur
);
1075 debug("after power_on\n");
1076 /*-----------------------debugging---------------------------*/
1077 get_cur_bus_info(&slot_cur
);
1078 debug("the current bus speed right after power_on = %x\n",
1079 slot_cur
->bus_on
->current_speed
);
1080 /*----------------------------------------------------------*/
1082 rc
= slot_update(&slot_cur
);
1087 if (SLOT_POWER(slot_cur
->status
) && !(SLOT_PWRGD(slot_cur
->status
))) {
1088 err("power fault occurred trying to power up...\n");
1091 if (SLOT_POWER(slot_cur
->status
) && (SLOT_BUS_SPEED(slot_cur
->status
))) {
1092 err("bus speed mismatch occurred. please check current bus "
1093 "speed and card capability\n");
1094 print_card_capability(slot_cur
);
1097 /* Don't think this case will happen after above checks...
1098 * but just in case, for paranoia sake */
1099 if (!(SLOT_POWER(slot_cur
->status
))) {
1100 err("power on failed...\n");
1104 slot_cur
->func
= kzalloc(sizeof(struct pci_func
), GFP_KERNEL
);
1105 if (!slot_cur
->func
) {
1106 /* We cannot do update_slot_info here, since no memory for
1107 * kmalloc n.e.ways, and update_slot_info allocates some */
1108 err("out of system memory\n");
1112 slot_cur
->func
->busno
= slot_cur
->bus
;
1113 slot_cur
->func
->device
= slot_cur
->device
;
1114 for (i
= 0; i
< 4; i
++)
1115 slot_cur
->func
->irq
[i
] = slot_cur
->irq
[i
];
1117 debug("b4 configure_card, slot_cur->bus = %x, slot_cur->device = %x\n",
1118 slot_cur
->bus
, slot_cur
->device
);
1120 if (ibmphp_configure_card(slot_cur
->func
, slot_cur
->number
)) {
1121 err("configure_card was unsuccessful...\n");
1122 /* true because don't need to actually deallocate resources,
1123 * just remove references */
1124 ibmphp_unconfigure_card(&slot_cur
, 1);
1125 debug("after unconfigure_card\n");
1126 slot_cur
->func
= NULL
;
1133 tmp_func
= ibm_slot_find(slot_cur
->bus
, slot_cur
->func
->device
,
1135 if (tmp_func
&& !(tmp_func
->dev
))
1136 ibm_configure_device(tmp_func
);
1140 if (slot_update(&slot_cur
)) {
1144 ibmphp_print_test();
1145 rc
= ibmphp_update_slot_info(slot_cur
);
1147 ibmphp_unlock_operations();
1151 attn_off(slot_cur
); /* need to turn off if was blinking b4 */
1154 rcpr
= slot_update(&slot_cur
);
1159 ibmphp_update_slot_info(slot_cur
);
1163 attn_off(slot_cur
); /* need to turn off if was blinking b4 */
1165 rcpr
= power_off(slot_cur
);
1173 /**************************************************************
1174 * HOT REMOVING ADAPTER CARD *
1175 * INPUT: POINTER TO THE HOTPLUG SLOT STRUCTURE *
1176 * OUTPUT: SUCCESS 0 ; FAILURE: UNCONFIGURE , VALIDATE *
1178 **************************************************************/
1179 static int ibmphp_disable_slot(struct hotplug_slot
*hotplug_slot
)
1181 struct slot
*slot
= hotplug_slot
->private;
1184 ibmphp_lock_operations();
1185 rc
= ibmphp_do_disable_slot(slot
);
1186 ibmphp_unlock_operations();
1190 int ibmphp_do_disable_slot(struct slot
*slot_cur
)
1195 debug("DISABLING SLOT...\n");
1197 if ((slot_cur
== NULL
) || (slot_cur
->ctrl
== NULL
)) {
1201 flag
= slot_cur
->flag
;
1205 rc
= validate(slot_cur
, DISABLE
);
1206 /* checking if powered off already & valid slot # */
1210 attn_LED_blink(slot_cur
);
1212 if (slot_cur
->func
== NULL
) {
1213 /* We need this for fncs's that were there on bootup */
1214 slot_cur
->func
= kzalloc(sizeof(struct pci_func
), GFP_KERNEL
);
1215 if (!slot_cur
->func
) {
1216 err("out of system memory\n");
1220 slot_cur
->func
->busno
= slot_cur
->bus
;
1221 slot_cur
->func
->device
= slot_cur
->device
;
1224 ibm_unconfigure_device(slot_cur
->func
);
1226 /* If we got here from latch suddenly opening on operating card or
1227 a power fault, there's no power to the card, so cannot
1228 read from it to determine what resources it occupied. This operation
1229 is forbidden anyhow. The best we can do is remove it from kernel
1237 rc
= ibmphp_unconfigure_card(&slot_cur
, 0);
1238 slot_cur
->func
= NULL
;
1239 debug("in disable_slot. after unconfigure_card\n");
1241 err("could not unconfigure card.\n");
1245 rc
= ibmphp_hpc_writeslot(slot_cur
, HPC_SLOT_OFF
);
1250 rc
= slot_update(&slot_cur
);
1254 rc
= ibmphp_update_slot_info(slot_cur
);
1255 ibmphp_print_test();
1260 /* Need to turn off if was blinking b4 */
1263 if (slot_update(&slot_cur
)) {
1268 ibmphp_update_slot_info(slot_cur
);
1272 struct hotplug_slot_ops ibmphp_hotplug_slot_ops
= {
1273 .set_attention_status
= set_attention_status
,
1274 .enable_slot
= enable_slot
,
1275 .disable_slot
= ibmphp_disable_slot
,
1276 .hardware_test
= NULL
,
1277 .get_power_status
= get_power_status
,
1278 .get_attention_status
= get_attention_status
,
1279 .get_latch_status
= get_latch_status
,
1280 .get_adapter_status
= get_adapter_present
,
1281 /* .get_max_adapter_speed = get_max_adapter_speed,
1282 .get_bus_name_status = get_bus_name,
1286 static void ibmphp_unload(void)
1289 debug("after slots\n");
1290 ibmphp_free_resources();
1291 debug("after resources\n");
1292 ibmphp_free_bus_info_queue();
1293 debug("after bus info\n");
1294 ibmphp_free_ebda_hpc_queue();
1295 debug("after ebda hpc\n");
1296 ibmphp_free_ebda_pci_rsrc_queue();
1297 debug("after ebda pci rsrc\n");
1298 kfree(ibmphp_pci_bus
);
1301 static int __init
ibmphp_init(void)
1303 struct pci_bus
*bus
;
1309 info(DRIVER_DESC
" version: " DRIVER_VERSION
"\n");
1311 ibmphp_pci_bus
= kmalloc(sizeof(*ibmphp_pci_bus
), GFP_KERNEL
);
1312 if (!ibmphp_pci_bus
) {
1313 err("out of memory\n");
1318 bus
= pci_find_bus(0, 0);
1320 err("Can't find the root pci bus, can not continue\n");
1324 memcpy(ibmphp_pci_bus
, bus
, sizeof(*ibmphp_pci_bus
));
1326 ibmphp_debug
= debug
;
1328 ibmphp_hpc_initvars();
1330 for (i
= 0; i
< 16; i
++)
1333 if ((rc
= ibmphp_access_ebda()))
1335 debug("after ibmphp_access_ebda()\n");
1337 if ((rc
= ibmphp_rsrc_init()))
1339 debug("AFTER Resource & EBDA INITIALIZATIONS\n");
1341 max_slots
= get_max_slots();
1343 if ((rc
= ibmphp_register_pci()))
1351 ibmphp_print_test();
1352 if ((rc
= ibmphp_hpc_start_poll_thread())) {
1364 static void __exit
ibmphp_exit(void)
1366 ibmphp_hpc_stop_poll_thread();
1367 debug("after polling\n");
1372 module_init(ibmphp_init
);
1373 module_exit(ibmphp_exit
);