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>
 
  37 #include <linux/smp_lock.h>
 
  39 #include "../../../arch/i386/pci/pci.h" /* for struct irq_routing_table */
 
  42 #define attn_on(sl)  ibmphp_hpc_writeslot (sl, HPC_SLOT_ATTNON)
 
  43 #define attn_off(sl) ibmphp_hpc_writeslot (sl, HPC_SLOT_ATTNOFF)
 
  44 #define attn_LED_blink(sl) ibmphp_hpc_writeslot (sl, HPC_SLOT_BLINKLED)
 
  45 #define get_ctrl_revision(sl, rev) ibmphp_hpc_readslot (sl, READ_REVLEVEL, rev)
 
  46 #define get_hpc_options(sl, opt) ibmphp_hpc_readslot (sl, READ_HPCOPTIONS, opt)
 
  48 #define DRIVER_VERSION  "0.6"
 
  49 #define DRIVER_DESC     "IBM Hot Plug PCI Controller Driver"
 
  54 module_param(debug, bool, S_IRUGO | S_IWUSR);
 
  55 MODULE_PARM_DESC (debug, "Debugging mode enabled or not");
 
  56 MODULE_LICENSE ("GPL");
 
  57 MODULE_DESCRIPTION (DRIVER_DESC);
 
  59 struct pci_bus *ibmphp_pci_bus;
 
  62 static int irqs[16];    /* PIC mode IRQ's we're using so far (in case MPS
 
  63                          * tables don't provide default info for empty slots */
 
  68 static int get_max_adapter_speed_1 (struct hotplug_slot *, u8 *, u8);
 
  70 static inline int get_max_adapter_speed (struct hotplug_slot *hs, u8 *value)
 
  72         return get_max_adapter_speed_1 (hs, value, 1);
 
  75 static inline int get_cur_bus_info(struct slot **sl) 
 
  78         struct slot * slot_cur = *sl;
 
  80         debug("options = %x\n", slot_cur->ctrl->options);
 
  81         debug("revision = %x\n", slot_cur->ctrl->revision);     
 
  83         if (READ_BUS_STATUS(slot_cur->ctrl)) 
 
  84                 rc = ibmphp_hpc_readslot(slot_cur, READ_BUSSTATUS, NULL);
 
  89         slot_cur->bus_on->current_speed = CURRENT_BUS_SPEED(slot_cur->busstatus);
 
  90         if (READ_BUS_MODE(slot_cur->ctrl))
 
  91                 slot_cur->bus_on->current_bus_mode =
 
  92                                 CURRENT_BUS_MODE(slot_cur->busstatus);
 
  94                 slot_cur->bus_on->current_bus_mode = 0xFF;
 
  96         debug("busstatus = %x, bus_speed = %x, bus_mode = %x\n",
 
  98                         slot_cur->bus_on->current_speed,
 
  99                         slot_cur->bus_on->current_bus_mode);
 
 105 static inline int slot_update(struct slot **sl)
 
 108         rc = ibmphp_hpc_readslot(*sl, READ_ALLSTAT, NULL);
 
 112                 rc = get_cur_bus_info(sl);
 
 116 static int __init get_max_slots (void)
 
 118         struct slot * slot_cur;
 
 119         struct list_head * tmp;
 
 122         list_for_each(tmp, &ibmphp_slot_head) {
 
 123                 slot_cur = list_entry(tmp, struct slot, ibm_slot_list);
 
 124                 /* sometimes the hot-pluggable slots start with 4 (not always from 1) */
 
 125                 slot_count = max(slot_count, slot_cur->number);
 
 130 /* This routine will put the correct slot->device information per slot.  It's
 
 131  * called from initialization of the slot structures. It will also assign
 
 132  * interrupt numbers per each slot.
 
 133  * Parameters: struct slot
 
 134  * Returns 0 or errors
 
 136 int ibmphp_init_devno(struct slot **cur_slot)
 
 138         struct irq_routing_table *rtable;
 
 143         rtable = pcibios_get_irq_routing_table();
 
 145                 err("no BIOS routing table...\n");
 
 149         len = (rtable->size - sizeof(struct irq_routing_table)) /
 
 150                         sizeof(struct irq_info);
 
 154         for (loop = 0; loop < len; loop++) {
 
 155                 if ((*cur_slot)->number == rtable->slots[loop].slot) {
 
 156                 if ((*cur_slot)->bus == rtable->slots[loop].bus) {
 
 157                         (*cur_slot)->device = PCI_SLOT(rtable->slots[loop].devfn);
 
 158                         for (i = 0; i < 4; i++)
 
 159                                 (*cur_slot)->irq[i] = IO_APIC_get_PCI_irq_vector((int) (*cur_slot)->bus,
 
 160                                                 (int) (*cur_slot)->device, i);
 
 162                                 debug("(*cur_slot)->irq[0] = %x\n",
 
 163                                                 (*cur_slot)->irq[0]);
 
 164                                 debug("(*cur_slot)->irq[1] = %x\n",
 
 165                                                 (*cur_slot)->irq[1]);
 
 166                                 debug("(*cur_slot)->irq[2] = %x\n",
 
 167                                                 (*cur_slot)->irq[2]);
 
 168                                 debug("(*cur_slot)->irq[3] = %x\n",
 
 169                                                 (*cur_slot)->irq[3]);
 
 171                                 debug("rtable->exlusive_irqs = %x\n",
 
 172                                         rtable->exclusive_irqs);
 
 173                                 debug("rtable->slots[loop].irq[0].bitmap = %x\n",
 
 174                                         rtable->slots[loop].irq[0].bitmap);
 
 175                                 debug("rtable->slots[loop].irq[1].bitmap = %x\n",
 
 176                                         rtable->slots[loop].irq[1].bitmap);
 
 177                                 debug("rtable->slots[loop].irq[2].bitmap = %x\n",
 
 178                                         rtable->slots[loop].irq[2].bitmap);
 
 179                                 debug("rtable->slots[loop].irq[3].bitmap = %x\n",
 
 180                                         rtable->slots[loop].irq[3].bitmap);
 
 182                                 debug("rtable->slots[loop].irq[0].link = %x\n",
 
 183                                         rtable->slots[loop].irq[0].link);
 
 184                                 debug("rtable->slots[loop].irq[1].link = %x\n",
 
 185                                         rtable->slots[loop].irq[1].link);
 
 186                                 debug("rtable->slots[loop].irq[2].link = %x\n",
 
 187                                         rtable->slots[loop].irq[2].link);
 
 188                                 debug("rtable->slots[loop].irq[3].link = %x\n",
 
 189                                         rtable->slots[loop].irq[3].link);
 
 190                                 debug("end of init_devno\n");
 
 199 static inline int power_on(struct slot *slot_cur)
 
 201         u8 cmd = HPC_SLOT_ON;
 
 204         retval = ibmphp_hpc_writeslot(slot_cur, cmd);
 
 206                 err("power on failed\n");
 
 209         if (CTLR_RESULT(slot_cur->ctrl->status)) {
 
 210                 err("command not completed successfully in power_on\n");
 
 213         msleep(3000);   /* For ServeRAID cards, and some 66 PCI */
 
 217 static inline int power_off(struct slot *slot_cur)
 
 219         u8 cmd = HPC_SLOT_OFF;
 
 222         retval = ibmphp_hpc_writeslot(slot_cur, cmd);
 
 224                 err("power off failed\n");
 
 227         if (CTLR_RESULT(slot_cur->ctrl->status)) {
 
 228                 err("command not completed successfully in power_off\n");
 
 234 static int set_attention_status(struct hotplug_slot *hotplug_slot, u8 value)
 
 238         u8 cmd = 0x00;     /* avoid compiler warning */
 
 240         debug("set_attention_status - Entry hotplug_slot[%lx] value[%x]\n",
 
 241                         (ulong) hotplug_slot, value);
 
 242         ibmphp_lock_operations();
 
 247                 case HPC_SLOT_ATTN_OFF:
 
 248                         cmd = HPC_SLOT_ATTNOFF;
 
 250                 case HPC_SLOT_ATTN_ON:
 
 251                         cmd = HPC_SLOT_ATTNON;
 
 253                 case HPC_SLOT_ATTN_BLINK:
 
 254                         cmd = HPC_SLOT_BLINKLED;
 
 258                         err("set_attention_status - Error : invalid input [%x]\n",
 
 263                         pslot = hotplug_slot->private;
 
 265                                 rc = ibmphp_hpc_writeslot(pslot, cmd);
 
 272         ibmphp_unlock_operations();
 
 274         debug("set_attention_status - Exit rc[%d]\n", rc);
 
 278 static int get_attention_status(struct hotplug_slot *hotplug_slot, u8 * value)
 
 284         debug("get_attention_status - Entry hotplug_slot[%lx] pvalue[%lx]\n",
 
 285                                         (ulong) hotplug_slot, (ulong) value);
 
 287         ibmphp_lock_operations();
 
 289                 pslot = hotplug_slot->private;
 
 291                         memcpy(&myslot, pslot, sizeof(struct slot));
 
 292                         rc = ibmphp_hpc_readslot(pslot, READ_SLOTSTATUS,
 
 295                                 rc = ibmphp_hpc_readslot(pslot,
 
 297                                                 &(myslot.ext_status));
 
 299                                 *value = SLOT_ATTN(myslot.status,
 
 304         ibmphp_unlock_operations();
 
 305         debug("get_attention_status - Exit rc[%d] value[%x]\n", rc, *value);
 
 309 static int get_latch_status(struct hotplug_slot *hotplug_slot, u8 * value)
 
 315         debug("get_latch_status - Entry hotplug_slot[%lx] pvalue[%lx]\n",
 
 316                                         (ulong) hotplug_slot, (ulong) value);
 
 317         ibmphp_lock_operations();
 
 319                 pslot = hotplug_slot->private;
 
 321                         memcpy(&myslot, pslot, sizeof(struct slot));
 
 322                         rc = ibmphp_hpc_readslot(pslot, READ_SLOTSTATUS,
 
 325                                 *value = SLOT_LATCH(myslot.status);
 
 329         ibmphp_unlock_operations();
 
 330         debug("get_latch_status - Exit rc[%d] rc[%x] value[%x]\n",
 
 336 static int get_power_status(struct hotplug_slot *hotplug_slot, u8 * value)
 
 342         debug("get_power_status - Entry hotplug_slot[%lx] pvalue[%lx]\n",
 
 343                                         (ulong) hotplug_slot, (ulong) value);
 
 344         ibmphp_lock_operations();
 
 346                 pslot = hotplug_slot->private;
 
 348                         memcpy(&myslot, pslot, sizeof(struct slot));
 
 349                         rc = ibmphp_hpc_readslot(pslot, READ_SLOTSTATUS,
 
 352                                 *value = SLOT_PWRGD(myslot.status);
 
 356         ibmphp_unlock_operations();
 
 357         debug("get_power_status - Exit rc[%d] rc[%x] value[%x]\n",
 
 362 static int get_adapter_present(struct hotplug_slot *hotplug_slot, u8 * value)
 
 369         debug("get_adapter_status - Entry hotplug_slot[%lx] pvalue[%lx]\n",
 
 370                                         (ulong) hotplug_slot, (ulong) value);
 
 371         ibmphp_lock_operations();
 
 373                 pslot = hotplug_slot->private;
 
 375                         memcpy(&myslot, pslot, sizeof(struct slot));
 
 376                         rc = ibmphp_hpc_readslot(pslot, READ_SLOTSTATUS,
 
 379                                 present = SLOT_PRESENT(myslot.status);
 
 380                                 if (present == HPC_SLOT_EMPTY)
 
 388         ibmphp_unlock_operations();
 
 389         debug("get_adapter_present - Exit rc[%d] value[%x]\n", rc, *value);
 
 393 static int get_max_bus_speed(struct hotplug_slot *hotplug_slot, enum pci_bus_speed *value)
 
 399         debug("%s - Entry hotplug_slot[%p] pvalue[%p]\n", __FUNCTION__,
 
 400                 hotplug_slot, value);
 
 402         ibmphp_lock_operations();
 
 405                 pslot = hotplug_slot->private;
 
 408                         mode = pslot->supported_bus_mode;
 
 409                         *value = pslot->supported_speed; 
 
 414                                 if (mode == BUS_MODE_PCIX) 
 
 419                                 *value = pslot->supported_speed + 0x01;
 
 422                                 /* Note (will need to change): there would be soon 256, 512 also */
 
 428         ibmphp_unlock_operations();
 
 429         debug("%s - Exit rc[%d] value[%x]\n", __FUNCTION__, rc, *value);
 
 433 static int get_cur_bus_speed(struct hotplug_slot *hotplug_slot, enum pci_bus_speed *value)
 
 439         debug("%s - Entry hotplug_slot[%p] pvalue[%p]\n", __FUNCTION__,
 
 440                 hotplug_slot, value);
 
 442         ibmphp_lock_operations();
 
 445                 pslot = hotplug_slot->private;
 
 447                         rc = get_cur_bus_info(&pslot);
 
 449                                 mode = pslot->bus_on->current_bus_mode;
 
 450                                 *value = pslot->bus_on->current_speed;
 
 455                                         if (mode == BUS_MODE_PCIX) 
 
 457                                         else if (mode == BUS_MODE_PCI)
 
 460                                                 *value = PCI_SPEED_UNKNOWN;
 
 467                                         /* Note of change: there would also be 256, 512 soon */
 
 474         ibmphp_unlock_operations();
 
 475         debug("%s - Exit rc[%d] value[%x]\n", __FUNCTION__, rc, *value);
 
 480 static int get_max_adapter_speed_1(struct hotplug_slot *hotplug_slot, u8 * value, u8 flag)
 
 486         debug("get_max_adapter_speed_1 - Entry hotplug_slot[%lx] pvalue[%lx]\n",
 
 487                                                 (ulong)hotplug_slot, (ulong) value);
 
 490                 ibmphp_lock_operations();
 
 492         if (hotplug_slot && value) {
 
 493                 pslot = hotplug_slot->private;
 
 495                         memcpy(&myslot, pslot, sizeof(struct slot));
 
 496                         rc = ibmphp_hpc_readslot(pslot, READ_SLOTSTATUS,
 
 499                         if (!(SLOT_LATCH (myslot.status)) &&
 
 500                                         (SLOT_PRESENT (myslot.status))) {
 
 501                                 rc = ibmphp_hpc_readslot(pslot,
 
 503                                                 &(myslot.ext_status));
 
 505                                         *value = SLOT_SPEED(myslot.ext_status);
 
 507                                 *value = MAX_ADAPTER_NONE;
 
 512                 ibmphp_unlock_operations();
 
 514         debug("get_max_adapter_speed_1 - Exit rc[%d] value[%x]\n", rc, *value);
 
 518 static int get_bus_name(struct hotplug_slot *hotplug_slot, char * value)
 
 521         struct slot *pslot = NULL;
 
 523         debug("get_bus_name - Entry hotplug_slot[%lx]\n", (ulong)hotplug_slot);
 
 525         ibmphp_lock_operations();
 
 528                 pslot = hotplug_slot->private;
 
 531                         snprintf(value, 100, "Bus %x", pslot->bus);
 
 536         ibmphp_unlock_operations();
 
 537         debug("get_bus_name - Exit rc[%d] value[%x]\n", rc, *value);
 
 542 /****************************************************************************
 
 543  * This routine will initialize the ops data structure used in the validate
 
 544  * function. It will also power off empty slots that are powered on since BIOS
 
 545  * leaves those on, albeit disconnected
 
 546  ****************************************************************************/
 
 547 static int __init init_ops(void)
 
 549         struct slot *slot_cur;
 
 550         struct list_head *tmp;
 
 554         list_for_each(tmp, &ibmphp_slot_head) {
 
 555                 slot_cur = list_entry(tmp, struct slot, ibm_slot_list);
 
 560                 debug("BEFORE GETTING SLOT STATUS, slot # %x\n",
 
 562                 if (slot_cur->ctrl->revision == 0xFF) 
 
 563                         if (get_ctrl_revision(slot_cur,
 
 564                                                 &slot_cur->ctrl->revision))
 
 567                 if (slot_cur->bus_on->current_speed == 0xFF) 
 
 568                         if (get_cur_bus_info(&slot_cur)) 
 
 571                 if (slot_cur->ctrl->options == 0xFF)
 
 572                         if (get_hpc_options(slot_cur, &slot_cur->ctrl->options))
 
 575                 retval = slot_update(&slot_cur);
 
 579                 debug("status = %x\n", slot_cur->status);
 
 580                 debug("ext_status = %x\n", slot_cur->ext_status);
 
 581                 debug("SLOT_POWER = %x\n", SLOT_POWER(slot_cur->status));
 
 582                 debug("SLOT_PRESENT = %x\n", SLOT_PRESENT(slot_cur->status));
 
 583                 debug("SLOT_LATCH = %x\n", SLOT_LATCH(slot_cur->status));
 
 585                 if ((SLOT_PWRGD(slot_cur->status)) && 
 
 586                     !(SLOT_PRESENT(slot_cur->status)) && 
 
 587                     !(SLOT_LATCH(slot_cur->status))) {
 
 588                         debug("BEFORE POWER OFF COMMAND\n");
 
 589                                 rc = power_off(slot_cur);
 
 593         /*              retval = slot_update(&slot_cur);
 
 596          *              ibmphp_update_slot_info(slot_cur);
 
 604 /* This operation will check whether the slot is within the bounds and
 
 605  * the operation is valid to perform on that slot
 
 606  * Parameters: slot, operation
 
 607  * Returns: 0 or error codes
 
 609 static int validate(struct slot *slot_cur, int opn)
 
 616         number = slot_cur->number;
 
 617         if ((number > max_slots) || (number < 0))
 
 619         debug("slot_number in validate is %d\n", slot_cur->number);
 
 621         retval = slot_update(&slot_cur);
 
 627                         if (!(SLOT_PWRGD(slot_cur->status)) && 
 
 628                              (SLOT_PRESENT(slot_cur->status)) && 
 
 629                              !(SLOT_LATCH(slot_cur->status)))
 
 633                         if ((SLOT_PWRGD(slot_cur->status)) && 
 
 634                             (SLOT_PRESENT(slot_cur->status)) &&
 
 635                             !(SLOT_LATCH(slot_cur->status)))
 
 641         err("validate failed....\n");
 
 645 /****************************************************************************
 
 646  * This routine is for updating the data structures in the hotplug core
 
 647  * Parameters: struct slot
 
 648  * Returns: 0 or error
 
 649  ****************************************************************************/
 
 650 int ibmphp_update_slot_info(struct slot *slot_cur)
 
 652         struct hotplug_slot_info *info;
 
 657         info = kmalloc(sizeof(struct hotplug_slot_info), GFP_KERNEL);
 
 659                 err("out of system memory\n");
 
 663         info->power_status = SLOT_PWRGD(slot_cur->status);
 
 664         info->attention_status = SLOT_ATTN(slot_cur->status,
 
 665                                                 slot_cur->ext_status);
 
 666         info->latch_status = SLOT_LATCH(slot_cur->status);
 
 667         if (!SLOT_PRESENT(slot_cur->status)) {
 
 668                 info->adapter_status = 0;
 
 669 /*              info->max_adapter_speed_status = MAX_ADAPTER_NONE; */
 
 671                 info->adapter_status = 1;
 
 672 /*              get_max_adapter_speed_1(slot_cur->hotplug_slot,
 
 673                                         &info->max_adapter_speed_status, 0); */
 
 676         bus_speed = slot_cur->bus_on->current_speed;
 
 677         mode = slot_cur->bus_on->current_bus_mode;
 
 683                         if (mode == BUS_MODE_PCIX) 
 
 685                         else if (mode == BUS_MODE_PCI)
 
 688                                 bus_speed = PCI_SPEED_UNKNOWN;
 
 695                         bus_speed = PCI_SPEED_UNKNOWN;
 
 698         info->cur_bus_speed = bus_speed;
 
 699         info->max_bus_speed = slot_cur->hotplug_slot->info->max_bus_speed;
 
 702         rc = pci_hp_change_slot_info(slot_cur->hotplug_slot, info);
 
 708 /******************************************************************************
 
 709  * This function will return the pci_func, given bus and devfunc, or NULL.  It
 
 710  * is called from visit routines
 
 711  ******************************************************************************/
 
 713 static struct pci_func *ibm_slot_find(u8 busno, u8 device, u8 function)
 
 715         struct pci_func *func_cur;
 
 716         struct slot *slot_cur;
 
 717         struct list_head * tmp;
 
 718         list_for_each(tmp, &ibmphp_slot_head) {
 
 719                 slot_cur = list_entry(tmp, struct slot, ibm_slot_list);
 
 720                 if (slot_cur->func) {
 
 721                         func_cur = slot_cur->func;
 
 723                                 if ((func_cur->busno == busno) &&
 
 724                                                 (func_cur->device == device) &&
 
 725                                                 (func_cur->function == function))
 
 727                                 func_cur = func_cur->next;
 
 734 /*************************************************************
 
 735  * This routine frees up memory used by struct slot, including
 
 736  * the pointers to pci_func, bus, hotplug_slot, controller,
 
 737  * and deregistering from the hotplug core
 
 738  *************************************************************/
 
 739 static void free_slots(void)
 
 741         struct slot *slot_cur;
 
 742         struct list_head * tmp;
 
 743         struct list_head * next;
 
 745         debug("%s -- enter\n", __FUNCTION__);
 
 747         list_for_each_safe(tmp, next, &ibmphp_slot_head) {
 
 748                 slot_cur = list_entry(tmp, struct slot, ibm_slot_list);
 
 749                 pci_hp_deregister(slot_cur->hotplug_slot);
 
 751         debug("%s -- exit\n", __FUNCTION__);
 
 754 static void ibm_unconfigure_device(struct pci_func *func)
 
 756         struct pci_dev *temp;
 
 759         debug("inside %s\n", __FUNCTION__);
 
 760         debug("func->device = %x, func->function = %x\n",
 
 761                                         func->device, func->function);
 
 762         debug("func->device << 3 | 0x0  = %x\n", func->device << 3 | 0x0);
 
 764         for (j = 0; j < 0x08; j++) {
 
 765                 temp = pci_find_slot(func->busno, (func->device << 3) | j);
 
 767                         pci_remove_bus_device(temp);
 
 772  * The following function is to fix kernel bug regarding 
 
 773  * getting bus entries, here we manually add those primary 
 
 774  * bus entries to kernel bus structure whenever apply
 
 776 static u8 bus_structure_fixup(u8 busno)
 
 782         if (pci_find_bus(0, busno) || !(ibmphp_find_same_bus_num(busno)))
 
 785         bus = kmalloc(sizeof(*bus), GFP_KERNEL);
 
 787                 err("%s - out of memory\n", __FUNCTION__);
 
 790         dev = kmalloc(sizeof(*dev), GFP_KERNEL);
 
 793                 err("%s - out of memory\n", __FUNCTION__);
 
 798         bus->ops = ibmphp_pci_bus->ops;
 
 800         for (dev->devfn = 0; dev->devfn < 256; dev->devfn += 8) {
 
 801                 if (!pci_read_config_word(dev, PCI_VENDOR_ID, &l) &&
 
 802                                         (l != 0x0000) && (l != 0xffff)) {
 
 803                         debug("%s - Inside bus_struture_fixup()\n",
 
 805                         pci_scan_bus(busno, ibmphp_pci_bus->ops, NULL);
 
 816 static int ibm_configure_device(struct pci_func *func)
 
 819         struct pci_bus *child;
 
 821         int flag = 0;   /* this is to make sure we don't double scan the bus,
 
 822                                         for bridged devices primarily */
 
 824         if (!(bus_structure_fixup(func->busno)))
 
 826         if (func->dev == NULL)
 
 827                 func->dev = pci_find_slot(func->busno,
 
 828                                 PCI_DEVFN(func->device, func->function));
 
 830         if (func->dev == NULL) {
 
 831                 struct pci_bus *bus = pci_find_bus(0, func->busno);
 
 835                 num = pci_scan_slot(bus,
 
 836                                 PCI_DEVFN(func->device, func->function));
 
 838                         pci_bus_add_devices(bus);
 
 840                 func->dev = pci_find_slot(func->busno,
 
 841                                 PCI_DEVFN(func->device, func->function));
 
 842                 if (func->dev == NULL) {
 
 843                         err("ERROR... : pci_dev still NULL\n");
 
 847         if (!(flag) && (func->dev->hdr_type == PCI_HEADER_TYPE_BRIDGE)) {
 
 848                 pci_read_config_byte(func->dev, PCI_SECONDARY_BUS, &bus);
 
 849                 child = pci_add_new_bus(func->dev->bus, func->dev, bus);
 
 850                 pci_do_scan_bus(child);
 
 856 /*******************************************************
 
 857  * Returns whether the bus is empty or not 
 
 858  *******************************************************/
 
 859 static int is_bus_empty(struct slot * slot_cur)
 
 862         struct slot * tmp_slot;
 
 863         u8 i = slot_cur->bus_on->slot_min;
 
 865         while (i <= slot_cur->bus_on->slot_max) {
 
 866                 if (i == slot_cur->number) {
 
 870                 tmp_slot = ibmphp_get_slot_from_physical_num(i);
 
 873                 rc = slot_update(&tmp_slot);
 
 876                 if (SLOT_PRESENT(tmp_slot->status) &&
 
 877                                         SLOT_PWRGD(tmp_slot->status))
 
 884 /***********************************************************
 
 885  * If the HPC permits and the bus currently empty, tries to set the 
 
 886  * bus speed and mode at the maximum card and bus capability
 
 888  * Returns: bus is set (0) or error code
 
 889  ***********************************************************/
 
 890 static int set_bus(struct slot * slot_cur)
 
 896         static struct pci_device_id ciobx[] = {
 
 897                 { PCI_DEVICE(PCI_VENDOR_ID_SERVERWORKS, 0x0101) },
 
 901         debug("%s - entry slot # %d\n", __FUNCTION__, slot_cur->number);
 
 902         if (SET_BUS_STATUS(slot_cur->ctrl) && is_bus_empty(slot_cur)) {
 
 903                 rc = slot_update(&slot_cur);
 
 906                 speed = SLOT_SPEED(slot_cur->ext_status);
 
 907                 debug("ext_status = %x, speed = %x\n", slot_cur->ext_status, speed);
 
 909                 case HPC_SLOT_SPEED_33:
 
 910                         cmd = HPC_BUS_33CONVMODE;
 
 912                 case HPC_SLOT_SPEED_66:
 
 913                         if (SLOT_PCIX(slot_cur->ext_status)) {
 
 914                                 if ((slot_cur->supported_speed >= BUS_SPEED_66) &&
 
 915                                                 (slot_cur->supported_bus_mode == BUS_MODE_PCIX))
 
 916                                         cmd = HPC_BUS_66PCIXMODE;
 
 917                                 else if (!SLOT_BUS_MODE(slot_cur->ext_status))
 
 918                                         /* if max slot/bus capability is 66 pci
 
 919                                         and there's no bus mode mismatch, then
 
 920                                         the adapter supports 66 pci */ 
 
 921                                         cmd = HPC_BUS_66CONVMODE;
 
 923                                         cmd = HPC_BUS_33CONVMODE;
 
 925                                 if (slot_cur->supported_speed >= BUS_SPEED_66)
 
 926                                         cmd = HPC_BUS_66CONVMODE;
 
 928                                         cmd = HPC_BUS_33CONVMODE;
 
 931                 case HPC_SLOT_SPEED_133:
 
 932                         switch (slot_cur->supported_speed) {
 
 934                                 cmd = HPC_BUS_33CONVMODE;
 
 937                                 if (slot_cur->supported_bus_mode == BUS_MODE_PCIX)
 
 938                                         cmd = HPC_BUS_66PCIXMODE;
 
 940                                         cmd = HPC_BUS_66CONVMODE;
 
 943                                 cmd = HPC_BUS_100PCIXMODE;
 
 946                                 /* This is to take care of the bug in CIOBX chip */
 
 947                                 if (pci_dev_present(ciobx))
 
 948                                         ibmphp_hpc_writeslot(slot_cur,
 
 949                                                         HPC_BUS_100PCIXMODE);
 
 950                                 cmd = HPC_BUS_133PCIXMODE;
 
 953                                 err("Wrong bus speed\n");
 
 958                         err("wrong slot speed\n");
 
 961                 debug("setting bus speed for slot %d, cmd %x\n",
 
 962                                                 slot_cur->number, cmd);
 
 963                 retval = ibmphp_hpc_writeslot(slot_cur, cmd);
 
 965                         err("setting bus speed failed\n");
 
 968                 if (CTLR_RESULT(slot_cur->ctrl->status)) {
 
 969                         err("command not completed successfully in set_bus\n");
 
 973         /* This is for x440, once Brandon fixes the firmware, 
 
 974         will not need this delay */
 
 976         debug("%s -Exit\n", __FUNCTION__);
 
 980 /* This routine checks the bus limitations that the slot is on from the BIOS.
 
 981  * This is used in deciding whether or not to power up the slot.  
 
 982  * (electrical/spec limitations. For example, >1 133 MHz or >2 66 PCI cards on
 
 985  * Returns: 0 = no limitations, -EINVAL = exceeded limitations on the bus
 
 987 static int check_limitations(struct slot *slot_cur)
 
 990         struct slot * tmp_slot;
 
 994         for (i = slot_cur->bus_on->slot_min; i <= slot_cur->bus_on->slot_max; i++) {
 
 995                 tmp_slot = ibmphp_get_slot_from_physical_num(i);
 
 998                 if ((SLOT_PWRGD(tmp_slot->status)) &&
 
 999                                         !(SLOT_CONNECT(tmp_slot->status)))
 
1002         get_cur_bus_info(&slot_cur);
 
1003         switch (slot_cur->bus_on->current_speed) {
 
1005                 limitation = slot_cur->bus_on->slots_at_33_conv;
 
1008                 if (slot_cur->bus_on->current_bus_mode == BUS_MODE_PCIX)
 
1009                         limitation = slot_cur->bus_on->slots_at_66_pcix;
 
1011                         limitation = slot_cur->bus_on->slots_at_66_conv;
 
1014                 limitation = slot_cur->bus_on->slots_at_100_pcix;
 
1017                 limitation = slot_cur->bus_on->slots_at_133_pcix;
 
1021         if ((count + 1) > limitation)
 
1026 static inline void print_card_capability(struct slot *slot_cur)
 
1028         info("capability of the card is ");
 
1029         if ((slot_cur->ext_status & CARD_INFO) == PCIX133) 
 
1030                 info("   133 MHz PCI-X\n");
 
1031         else if ((slot_cur->ext_status & CARD_INFO) == PCIX66)
 
1032                 info("    66 MHz PCI-X\n");
 
1033         else if ((slot_cur->ext_status & CARD_INFO) == PCI66)
 
1034                 info("    66 MHz PCI\n");
 
1036                 info("    33 MHz PCI\n");
 
1040 /* This routine will power on the slot, configure the device(s) and find the
 
1042  * Parameters: hotplug_slot
 
1043  * Returns: 0 or failure codes
 
1045 static int enable_slot(struct hotplug_slot *hs)
 
1048         struct slot *slot_cur;
 
1050         struct pci_func *tmp_func;
 
1052         ibmphp_lock_operations();
 
1054         debug("ENABLING SLOT........\n");
 
1055         slot_cur = hs->private;
 
1057         if ((rc = validate(slot_cur, ENABLE))) {
 
1058                 err("validate function failed\n");
 
1062         attn_LED_blink(slot_cur);
 
1064         rc = set_bus(slot_cur);
 
1066                 err("was not able to set the bus\n");
 
1070         /*-----------------debugging------------------------------*/
 
1071         get_cur_bus_info(&slot_cur);
 
1072         debug("the current bus speed right after set_bus = %x\n",
 
1073                                         slot_cur->bus_on->current_speed);
 
1074         /*----------------------------------------------------------*/
 
1076         rc = check_limitations(slot_cur);
 
1078                 err("Adding this card exceeds the limitations of this bus.\n");
 
1079                 err("(i.e., >1 133MHz cards running on same bus, or "
 
1080                      ">2 66 PCI cards running on same bus.\n");
 
1081                 err("Try hot-adding into another bus\n");
 
1086         rc = power_on(slot_cur);
 
1089                 err("something wrong when powering up... please see below for details\n");
 
1090                 /* need to turn off before on, otherwise, blinking overwrites */
 
1093                 if (slot_update(&slot_cur)) {
 
1099                 /* Check to see the error of why it failed */
 
1100                 if ((SLOT_POWER(slot_cur->status)) &&
 
1101                                         !(SLOT_PWRGD(slot_cur->status)))
 
1102                         err("power fault occurred trying to power up\n");
 
1103                 else if (SLOT_BUS_SPEED(slot_cur->status)) {
 
1104                         err("bus speed mismatch occurred.  please check "
 
1105                                 "current bus speed and card capability\n");
 
1106                         print_card_capability(slot_cur);
 
1107                 } else if (SLOT_BUS_MODE(slot_cur->ext_status)) {
 
1108                         err("bus mode mismatch occurred.  please check "
 
1109                                 "current bus mode and card capability\n");
 
1110                         print_card_capability(slot_cur);
 
1112                 ibmphp_update_slot_info(slot_cur);
 
1115         debug("after power_on\n");
 
1116         /*-----------------------debugging---------------------------*/
 
1117         get_cur_bus_info(&slot_cur);
 
1118         debug("the current bus speed right after power_on = %x\n",
 
1119                                         slot_cur->bus_on->current_speed);
 
1120         /*----------------------------------------------------------*/
 
1122         rc = slot_update(&slot_cur);
 
1127         if (SLOT_POWER(slot_cur->status) && !(SLOT_PWRGD(slot_cur->status))) {
 
1128                 err("power fault occurred trying to power up...\n");
 
1131         if (SLOT_POWER(slot_cur->status) && (SLOT_BUS_SPEED(slot_cur->status))) {
 
1132                 err("bus speed mismatch occurred.  please check current bus "
 
1133                                         "speed and card capability\n");
 
1134                 print_card_capability(slot_cur);
 
1137         /* Don't think this case will happen after above checks...
 
1138          * but just in case, for paranoia sake */
 
1139         if (!(SLOT_POWER(slot_cur->status))) {
 
1140                 err("power on failed...\n");
 
1144         slot_cur->func = kzalloc(sizeof(struct pci_func), GFP_KERNEL);
 
1145         if (!slot_cur->func) {
 
1146                 /* We cannot do update_slot_info here, since no memory for
 
1147                  * kmalloc n.e.ways, and update_slot_info allocates some */
 
1148                 err("out of system memory\n");
 
1152         slot_cur->func->busno = slot_cur->bus;
 
1153         slot_cur->func->device = slot_cur->device;
 
1154         for (i = 0; i < 4; i++)
 
1155                 slot_cur->func->irq[i] = slot_cur->irq[i];
 
1157         debug("b4 configure_card, slot_cur->bus = %x, slot_cur->device = %x\n",
 
1158                                         slot_cur->bus, slot_cur->device);
 
1160         if (ibmphp_configure_card(slot_cur->func, slot_cur->number)) {
 
1161                 err("configure_card was unsuccessful...\n");
 
1162                 /* true because don't need to actually deallocate resources,
 
1163                  * just remove references */
 
1164                 ibmphp_unconfigure_card(&slot_cur, 1);
 
1165                 debug("after unconfigure_card\n");
 
1166                 slot_cur->func = NULL;
 
1173                 tmp_func = ibm_slot_find(slot_cur->bus, slot_cur->func->device,
 
1175                 if (tmp_func && !(tmp_func->dev))
 
1176                         ibm_configure_device(tmp_func);
 
1180         if (slot_update(&slot_cur)) {
 
1184         ibmphp_print_test();
 
1185         rc = ibmphp_update_slot_info(slot_cur);
 
1187         ibmphp_unlock_operations(); 
 
1191         attn_off(slot_cur);     /* need to turn off if was blinking b4 */
 
1194         rcpr = slot_update(&slot_cur);
 
1199         ibmphp_update_slot_info(slot_cur);
 
1203         attn_off(slot_cur);     /* need to turn off if was blinking b4 */
 
1205         rcpr = power_off(slot_cur);
 
1213 /**************************************************************
 
1214 * HOT REMOVING ADAPTER CARD                                   *
 
1215 * INPUT: POINTER TO THE HOTPLUG SLOT STRUCTURE                *
 
1216 * OUTPUT: SUCCESS 0 ; FAILURE: UNCONFIGURE , VALIDATE         *
 
1218 **************************************************************/
 
1219 static int ibmphp_disable_slot(struct hotplug_slot *hotplug_slot)
 
1221         struct slot *slot = hotplug_slot->private;
 
1224         ibmphp_lock_operations();
 
1225         rc = ibmphp_do_disable_slot(slot);
 
1226         ibmphp_unlock_operations();
 
1230 int ibmphp_do_disable_slot(struct slot *slot_cur)
 
1235         debug("DISABLING SLOT...\n"); 
 
1237         if ((slot_cur == NULL) || (slot_cur->ctrl == NULL)) {
 
1241         flag = slot_cur->flag;
 
1245                 rc = validate(slot_cur, DISABLE);
 
1246                         /* checking if powered off already & valid slot # */
 
1250         attn_LED_blink(slot_cur);
 
1252         if (slot_cur->func == NULL) {
 
1253                 /* We need this for fncs's that were there on bootup */
 
1254                 slot_cur->func = kzalloc(sizeof(struct pci_func), GFP_KERNEL);
 
1255                 if (!slot_cur->func) {
 
1256                         err("out of system memory\n");
 
1260                 slot_cur->func->busno = slot_cur->bus;
 
1261                 slot_cur->func->device = slot_cur->device;
 
1264         ibm_unconfigure_device(slot_cur->func);
 
1266         /* If we got here from latch suddenly opening on operating card or 
 
1267         a power fault, there's no power to the card, so cannot
 
1268         read from it to determine what resources it occupied.  This operation
 
1269         is forbidden anyhow.  The best we can do is remove it from kernel
 
1277         rc = ibmphp_unconfigure_card(&slot_cur, 0);
 
1278         slot_cur->func = NULL;
 
1279         debug("in disable_slot. after unconfigure_card\n");
 
1281                 err("could not unconfigure card.\n");
 
1285         rc = ibmphp_hpc_writeslot(slot_cur, HPC_SLOT_OFF);
 
1290         rc = slot_update(&slot_cur);
 
1294         rc = ibmphp_update_slot_info(slot_cur);
 
1295         ibmphp_print_test();
 
1300         /*  Need to turn off if was blinking b4 */
 
1303         if (slot_update(&slot_cur)) {
 
1308                 ibmphp_update_slot_info(slot_cur);
 
1312 struct hotplug_slot_ops ibmphp_hotplug_slot_ops = {
 
1313         .owner =                        THIS_MODULE,
 
1314         .set_attention_status =         set_attention_status,
 
1315         .enable_slot =                  enable_slot,
 
1316         .disable_slot =                 ibmphp_disable_slot,
 
1317         .hardware_test =                NULL,
 
1318         .get_power_status =             get_power_status,
 
1319         .get_attention_status =         get_attention_status,
 
1320         .get_latch_status =             get_latch_status,
 
1321         .get_adapter_status =           get_adapter_present,
 
1322         .get_max_bus_speed =            get_max_bus_speed,
 
1323         .get_cur_bus_speed =            get_cur_bus_speed,
 
1324 /*      .get_max_adapter_speed =        get_max_adapter_speed,
 
1325         .get_bus_name_status =          get_bus_name,
 
1329 static void ibmphp_unload(void)
 
1332         debug("after slots\n");
 
1333         ibmphp_free_resources();
 
1334         debug("after resources\n");
 
1335         ibmphp_free_bus_info_queue();
 
1336         debug("after bus info\n");
 
1337         ibmphp_free_ebda_hpc_queue();
 
1338         debug("after ebda hpc\n");
 
1339         ibmphp_free_ebda_pci_rsrc_queue();
 
1340         debug("after ebda pci rsrc\n");
 
1341         kfree(ibmphp_pci_bus);
 
1344 static int __init ibmphp_init(void)
 
1346         struct pci_bus *bus;
 
1352         info(DRIVER_DESC " version: " DRIVER_VERSION "\n");
 
1354         ibmphp_pci_bus = kmalloc(sizeof(*ibmphp_pci_bus), GFP_KERNEL);
 
1355         if (!ibmphp_pci_bus) {
 
1356                 err("out of memory\n");
 
1361         bus = pci_find_bus(0, 0);
 
1363                 err("Can't find the root pci bus, can not continue\n");
 
1367         memcpy(ibmphp_pci_bus, bus, sizeof(*ibmphp_pci_bus));
 
1369         ibmphp_debug = debug;
 
1371         ibmphp_hpc_initvars();
 
1373         for (i = 0; i < 16; i++)
 
1376         if ((rc = ibmphp_access_ebda()))
 
1378         debug("after ibmphp_access_ebda()\n");
 
1380         if ((rc = ibmphp_rsrc_init()))
 
1382         debug("AFTER Resource & EBDA INITIALIZATIONS\n");
 
1384         max_slots = get_max_slots();
 
1386         if ((rc = ibmphp_register_pci()))
 
1394         ibmphp_print_test();
 
1395         if ((rc = ibmphp_hpc_start_poll_thread())) {
 
1399         /* lock ourselves into memory with a module 
 
1400          * count of -1 so that no one can unload us. */
 
1401         module_put(THIS_MODULE);
 
1411 static void __exit ibmphp_exit(void)
 
1413         ibmphp_hpc_stop_poll_thread();
 
1414         debug("after polling\n");
 
1419 module_init(ibmphp_init);
 
1420 module_exit(ibmphp_exit);