/*
 * IBM Hot Plug Controller Driver
 *
 * Written By: Chuck Cole, Jyoti Shah, Tong Yu, Irene Zubarev, IBM Corporation
 *
 * Copyright (C) 2001,2003 Greg Kroah-Hartman (greg@kroah.com)
 * Copyright (C) 2001-2003 IBM Corp.
 *
 * All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or (at
 * your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
 * NON INFRINGEMENT.  See the GNU General Public License for more
 * details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 * Send feedback to <gregkh@us.ibm.com>
 *
 */

#include <linux/init.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/pci.h>
#include <linux/interrupt.h>
#include <linux/delay.h>
#include <linux/wait.h>
#include <linux/smp_lock.h>
#include "../pci.h"
#include "../../../arch/i386/pci/pci.h"	/* for struct irq_routing_table */
#include "ibmphp.h"

#define attn_on(sl)  ibmphp_hpc_writeslot (sl, HPC_SLOT_ATTNON)
#define attn_off(sl) ibmphp_hpc_writeslot (sl, HPC_SLOT_ATTNOFF)
#define attn_LED_blink(sl) ibmphp_hpc_writeslot (sl, HPC_SLOT_BLINKLED)
#define get_ctrl_revision(sl, rev) ibmphp_hpc_readslot (sl, READ_REVLEVEL, rev)
#define get_hpc_options(sl, opt) ibmphp_hpc_readslot (sl, READ_HPCOPTIONS, opt)

#define DRIVER_VERSION	"0.6"
#define DRIVER_DESC	"IBM Hot Plug PCI Controller Driver"

int ibmphp_debug;

static int debug;
module_param(debug, bool, S_IRUGO | S_IWUSR);
MODULE_PARM_DESC (debug, "Debugging mode enabled or not");
MODULE_LICENSE ("GPL");
MODULE_DESCRIPTION (DRIVER_DESC);

struct pci_bus *ibmphp_pci_bus;
static int max_slots;

static int irqs[16];    /* PIC mode IRQ's we're using so far (in case MPS
			 * tables don't provide default info for empty slots */

static int init_flag;

/*
static int get_max_adapter_speed_1 (struct hotplug_slot *, u8 *, u8);

static inline int get_max_adapter_speed (struct hotplug_slot *hs, u8 *value)
{
	return get_max_adapter_speed_1 (hs, value, 1);
}
*/
static inline int get_cur_bus_info(struct slot **sl) 
{
	int rc = 1;
	struct slot * slot_cur = *sl;

	debug("options = %x\n", slot_cur->ctrl->options);
	debug("revision = %x\n", slot_cur->ctrl->revision);	

	if (READ_BUS_STATUS(slot_cur->ctrl)) 
		rc = ibmphp_hpc_readslot(slot_cur, READ_BUSSTATUS, NULL);
	
	if (rc) 
		return rc;
	  
	slot_cur->bus_on->current_speed = CURRENT_BUS_SPEED(slot_cur->busstatus);
	if (READ_BUS_MODE(slot_cur->ctrl))
		slot_cur->bus_on->current_bus_mode =
				CURRENT_BUS_MODE(slot_cur->busstatus);
	else
		slot_cur->bus_on->current_bus_mode = 0xFF;

	debug("busstatus = %x, bus_speed = %x, bus_mode = %x\n",
			slot_cur->busstatus,
			slot_cur->bus_on->current_speed,
			slot_cur->bus_on->current_bus_mode);
	
	*sl = slot_cur;
	return 0;
}

static inline int slot_update(struct slot **sl)
{
	int rc;
 	rc = ibmphp_hpc_readslot(*sl, READ_ALLSTAT, NULL);
	if (rc) 
		return rc;
	if (!init_flag)
		rc = get_cur_bus_info(sl);
	return rc;
}

static int __init get_max_slots (void)
{
	struct slot * slot_cur;
	struct list_head * tmp;
	u8 slot_count = 0;

	list_for_each(tmp, &ibmphp_slot_head) {
		slot_cur = list_entry(tmp, struct slot, ibm_slot_list);
		/* sometimes the hot-pluggable slots start with 4 (not always from 1) */
		slot_count = max(slot_count, slot_cur->number);
	}
	return slot_count;
}

/* This routine will put the correct slot->device information per slot.  It's
 * called from initialization of the slot structures. It will also assign
 * interrupt numbers per each slot.
 * Parameters: struct slot
 * Returns 0 or errors
 */
int ibmphp_init_devno(struct slot **cur_slot)
{
	struct irq_routing_table *rtable;
	int len;
	int loop;
	int i;

	rtable = pcibios_get_irq_routing_table();
	if (!rtable) {
		err("no BIOS routing table...\n");
		return -ENOMEM;
	}

	len = (rtable->size - sizeof(struct irq_routing_table)) /
			sizeof(struct irq_info);

	if (!len)
		return -1;
	for (loop = 0; loop < len; loop++) {
		if ((*cur_slot)->number == rtable->slots[loop].slot) {
		if ((*cur_slot)->bus == rtable->slots[loop].bus) {
			(*cur_slot)->device = PCI_SLOT(rtable->slots[loop].devfn);
			for (i = 0; i < 4; i++)
				(*cur_slot)->irq[i] = IO_APIC_get_PCI_irq_vector((int) (*cur_slot)->bus,
						(int) (*cur_slot)->device, i);

				debug("(*cur_slot)->irq[0] = %x\n",
						(*cur_slot)->irq[0]);
				debug("(*cur_slot)->irq[1] = %x\n",
						(*cur_slot)->irq[1]);
				debug("(*cur_slot)->irq[2] = %x\n",
						(*cur_slot)->irq[2]);
				debug("(*cur_slot)->irq[3] = %x\n",
						(*cur_slot)->irq[3]);

				debug("rtable->exlusive_irqs = %x\n",
					rtable->exclusive_irqs);
				debug("rtable->slots[loop].irq[0].bitmap = %x\n",
					rtable->slots[loop].irq[0].bitmap);
				debug("rtable->slots[loop].irq[1].bitmap = %x\n",
					rtable->slots[loop].irq[1].bitmap);
				debug("rtable->slots[loop].irq[2].bitmap = %x\n",
					rtable->slots[loop].irq[2].bitmap);
				debug("rtable->slots[loop].irq[3].bitmap = %x\n",
					rtable->slots[loop].irq[3].bitmap);

				debug("rtable->slots[loop].irq[0].link = %x\n",
					rtable->slots[loop].irq[0].link);
				debug("rtable->slots[loop].irq[1].link = %x\n",
					rtable->slots[loop].irq[1].link);
				debug("rtable->slots[loop].irq[2].link = %x\n",
					rtable->slots[loop].irq[2].link);
				debug("rtable->slots[loop].irq[3].link = %x\n",
					rtable->slots[loop].irq[3].link);
				debug("end of init_devno\n");
				return 0;
			}
		}
	}

	return -1;
}

static inline int power_on(struct slot *slot_cur)
{
	u8 cmd = HPC_SLOT_ON;
	int retval;

	retval = ibmphp_hpc_writeslot(slot_cur, cmd);
	if (retval) {
		err("power on failed\n");
		return retval;
	}
	if (CTLR_RESULT(slot_cur->ctrl->status)) {
		err("command not completed successfully in power_on\n");
		return -EIO;
	}
	msleep(3000);	/* For ServeRAID cards, and some 66 PCI */
	return 0;
}

static inline int power_off(struct slot *slot_cur)
{
	u8 cmd = HPC_SLOT_OFF;
	int retval;

	retval = ibmphp_hpc_writeslot(slot_cur, cmd);
	if (retval) {
		err("power off failed\n");
		return retval;
	}
	if (CTLR_RESULT(slot_cur->ctrl->status)) {
		err("command not completed successfully in power_off\n");
		retval = -EIO;
	}
	return retval;
}

static int set_attention_status(struct hotplug_slot *hotplug_slot, u8 value)
{
	int rc = 0;
	struct slot *pslot;
	u8 cmd = 0x00;     /* avoid compiler warning */

	debug("set_attention_status - Entry hotplug_slot[%lx] value[%x]\n",
			(ulong) hotplug_slot, value);
	ibmphp_lock_operations();


	if (hotplug_slot) {
		switch (value) {
		case HPC_SLOT_ATTN_OFF:
			cmd = HPC_SLOT_ATTNOFF;
			break;
		case HPC_SLOT_ATTN_ON:
			cmd = HPC_SLOT_ATTNON;
			break;
		case HPC_SLOT_ATTN_BLINK:
			cmd = HPC_SLOT_BLINKLED;
			break;
		default:
			rc = -ENODEV;
			err("set_attention_status - Error : invalid input [%x]\n",
					value);
			break;
		}
		if (rc == 0) {
			pslot = hotplug_slot->private;
			if (pslot)
				rc = ibmphp_hpc_writeslot(pslot, cmd);
			else
				rc = -ENODEV;
		}
	} else	
		rc = -ENODEV;

	ibmphp_unlock_operations();

	debug("set_attention_status - Exit rc[%d]\n", rc);
	return rc;
}

static int get_attention_status(struct hotplug_slot *hotplug_slot, u8 * value)
{
	int rc = -ENODEV;
	struct slot *pslot;
	struct slot myslot;

	debug("get_attention_status - Entry hotplug_slot[%lx] pvalue[%lx]\n",
					(ulong) hotplug_slot, (ulong) value);
        
	ibmphp_lock_operations();
	if (hotplug_slot) {
		pslot = hotplug_slot->private;
		if (pslot) {
			memcpy(&myslot, pslot, sizeof(struct slot));
			rc = ibmphp_hpc_readslot(pslot, READ_SLOTSTATUS,
						&(myslot.status));
			if (!rc)
				rc = ibmphp_hpc_readslot(pslot,
						READ_EXTSLOTSTATUS,
						&(myslot.ext_status));
			if (!rc)
				*value = SLOT_ATTN(myslot.status,
						myslot.ext_status);
		}
	}

	ibmphp_unlock_operations();
	debug("get_attention_status - Exit rc[%d] value[%x]\n", rc, *value);
	return rc;
}

static int get_latch_status(struct hotplug_slot *hotplug_slot, u8 * value)
{
	int rc = -ENODEV;
	struct slot *pslot;
	struct slot myslot;

	debug("get_latch_status - Entry hotplug_slot[%lx] pvalue[%lx]\n",
					(ulong) hotplug_slot, (ulong) value);
	ibmphp_lock_operations();
	if (hotplug_slot) {
		pslot = hotplug_slot->private;
		if (pslot) {
			memcpy(&myslot, pslot, sizeof(struct slot));
			rc = ibmphp_hpc_readslot(pslot, READ_SLOTSTATUS,
						&(myslot.status));
			if (!rc)
				*value = SLOT_LATCH(myslot.status);
		}
	}

	ibmphp_unlock_operations();
	debug("get_latch_status - Exit rc[%d] rc[%x] value[%x]\n",
			rc, rc, *value);
	return rc;
}


static int get_power_status(struct hotplug_slot *hotplug_slot, u8 * value)
{
	int rc = -ENODEV;
	struct slot *pslot;
	struct slot myslot;

	debug("get_power_status - Entry hotplug_slot[%lx] pvalue[%lx]\n",
					(ulong) hotplug_slot, (ulong) value);
	ibmphp_lock_operations();
	if (hotplug_slot) {
		pslot = hotplug_slot->private;
		if (pslot) {
			memcpy(&myslot, pslot, sizeof(struct slot));
			rc = ibmphp_hpc_readslot(pslot, READ_SLOTSTATUS,
						&(myslot.status));
			if (!rc)
				*value = SLOT_PWRGD(myslot.status);
		}
	}

	ibmphp_unlock_operations();
	debug("get_power_status - Exit rc[%d] rc[%x] value[%x]\n",
			rc, rc, *value);
	return rc;
}

static int get_adapter_present(struct hotplug_slot *hotplug_slot, u8 * value)
{
	int rc = -ENODEV;
	struct slot *pslot;
	u8 present;
	struct slot myslot;

	debug("get_adapter_status - Entry hotplug_slot[%lx] pvalue[%lx]\n",
					(ulong) hotplug_slot, (ulong) value);
	ibmphp_lock_operations();
	if (hotplug_slot) {
		pslot = hotplug_slot->private;
		if (pslot) {
			memcpy(&myslot, pslot, sizeof(struct slot));
			rc = ibmphp_hpc_readslot(pslot, READ_SLOTSTATUS,
						&(myslot.status));
			if (!rc) {
				present = SLOT_PRESENT(myslot.status);
				if (present == HPC_SLOT_EMPTY)
					*value = 0;
				else
					*value = 1;
			}
		}
	}

	ibmphp_unlock_operations();
	debug("get_adapter_present - Exit rc[%d] value[%x]\n", rc, *value);
	return rc;
}

static int get_max_bus_speed(struct hotplug_slot *hotplug_slot, enum pci_bus_speed *value)
{
	int rc = -ENODEV;
	struct slot *pslot;
	u8 mode = 0;

	debug("%s - Entry hotplug_slot[%p] pvalue[%p]\n", __FUNCTION__,
		hotplug_slot, value);

	ibmphp_lock_operations();

	if (hotplug_slot) {
		pslot = hotplug_slot->private;
		if (pslot) {
			rc = 0;
			mode = pslot->supported_bus_mode;
			*value = pslot->supported_speed; 
			switch (*value) {
			case BUS_SPEED_33:
				break;
			case BUS_SPEED_66:
				if (mode == BUS_MODE_PCIX) 
					*value += 0x01;
				break;
			case BUS_SPEED_100:
			case BUS_SPEED_133:
				*value = pslot->supported_speed + 0x01;
				break;
			default:
				/* Note (will need to change): there would be soon 256, 512 also */
				rc = -ENODEV;
			}
		}
	}

	ibmphp_unlock_operations();
	debug("%s - Exit rc[%d] value[%x]\n", __FUNCTION__, rc, *value);
	return rc;
}

static int get_cur_bus_speed(struct hotplug_slot *hotplug_slot, enum pci_bus_speed *value)
{
	int rc = -ENODEV;
	struct slot *pslot;
	u8 mode = 0;

	debug("%s - Entry hotplug_slot[%p] pvalue[%p]\n", __FUNCTION__,
		hotplug_slot, value);

	ibmphp_lock_operations();

	if (hotplug_slot) {
		pslot = hotplug_slot->private;
		if (pslot) {
			rc = get_cur_bus_info(&pslot);
			if (!rc) {
				mode = pslot->bus_on->current_bus_mode;
				*value = pslot->bus_on->current_speed;
				switch (*value) {
				case BUS_SPEED_33:
					break;
				case BUS_SPEED_66:
					if (mode == BUS_MODE_PCIX) 
						*value += 0x01;
					else if (mode == BUS_MODE_PCI)
						;
					else
						*value = PCI_SPEED_UNKNOWN;
					break;
				case BUS_SPEED_100:
				case BUS_SPEED_133:
					*value += 0x01;
					break;
				default:
					/* Note of change: there would also be 256, 512 soon */
					rc = -ENODEV;
				}
			}
		}
	}

	ibmphp_unlock_operations();
	debug("%s - Exit rc[%d] value[%x]\n", __FUNCTION__, rc, *value);
	return rc;
}

/*
static int get_max_adapter_speed_1(struct hotplug_slot *hotplug_slot, u8 * value, u8 flag)
{
	int rc = -ENODEV;
	struct slot *pslot;
	struct slot myslot;

	debug("get_max_adapter_speed_1 - Entry hotplug_slot[%lx] pvalue[%lx]\n",
						(ulong)hotplug_slot, (ulong) value);

	if (flag)
		ibmphp_lock_operations();

	if (hotplug_slot && value) {
		pslot = hotplug_slot->private;
		if (pslot) {
			memcpy(&myslot, pslot, sizeof(struct slot));
			rc = ibmphp_hpc_readslot(pslot, READ_SLOTSTATUS,
						&(myslot.status));

			if (!(SLOT_LATCH (myslot.status)) &&
					(SLOT_PRESENT (myslot.status))) {
				rc = ibmphp_hpc_readslot(pslot,
						READ_EXTSLOTSTATUS,
						&(myslot.ext_status));
				if (!rc)
					*value = SLOT_SPEED(myslot.ext_status);
			} else
				*value = MAX_ADAPTER_NONE;
                }
	}

	if (flag)
		ibmphp_unlock_operations();

	debug("get_max_adapter_speed_1 - Exit rc[%d] value[%x]\n", rc, *value);
	return rc;
}

static int get_bus_name(struct hotplug_slot *hotplug_slot, char * value)
{
	int rc = -ENODEV;
	struct slot *pslot = NULL;

	debug("get_bus_name - Entry hotplug_slot[%lx]\n", (ulong)hotplug_slot);

	ibmphp_lock_operations();

	if (hotplug_slot) {
		pslot = hotplug_slot->private;
		if (pslot) {
			rc = 0;
			snprintf(value, 100, "Bus %x", pslot->bus);
		}
	} else
		rc = -ENODEV;

	ibmphp_unlock_operations();
	debug("get_bus_name - Exit rc[%d] value[%x]\n", rc, *value);
	return rc;
}
*/

/****************************************************************************
 * This routine will initialize the ops data structure used in the validate
 * function. It will also power off empty slots that are powered on since BIOS
 * leaves those on, albeit disconnected
 ****************************************************************************/
static int __init init_ops(void)
{
	struct slot *slot_cur;
	struct list_head *tmp;
	int retval;
	int rc;

	list_for_each(tmp, &ibmphp_slot_head) {
		slot_cur = list_entry(tmp, struct slot, ibm_slot_list);

		if (!slot_cur)
			return -ENODEV;

		debug("BEFORE GETTING SLOT STATUS, slot # %x\n",
							slot_cur->number);
		if (slot_cur->ctrl->revision == 0xFF) 
			if (get_ctrl_revision(slot_cur,
						&slot_cur->ctrl->revision))
				return -1;

		if (slot_cur->bus_on->current_speed == 0xFF) 
			if (get_cur_bus_info(&slot_cur)) 
				return -1;

		if (slot_cur->ctrl->options == 0xFF)
			if (get_hpc_options(slot_cur, &slot_cur->ctrl->options))
				return -1;

		retval = slot_update(&slot_cur);
		if (retval)
			return retval;

		debug("status = %x\n", slot_cur->status);
		debug("ext_status = %x\n", slot_cur->ext_status);
		debug("SLOT_POWER = %x\n", SLOT_POWER(slot_cur->status));
		debug("SLOT_PRESENT = %x\n", SLOT_PRESENT(slot_cur->status));
		debug("SLOT_LATCH = %x\n", SLOT_LATCH(slot_cur->status));

		if ((SLOT_PWRGD(slot_cur->status)) && 
		    !(SLOT_PRESENT(slot_cur->status)) && 
		    !(SLOT_LATCH(slot_cur->status))) {
			debug("BEFORE POWER OFF COMMAND\n");
				rc = power_off(slot_cur);
				if (rc)
					return rc;

	/*		retval = slot_update(&slot_cur);
	 *		if (retval)
	 *			return retval;
	 *		ibmphp_update_slot_info(slot_cur);
	 */
		}
	}
	init_flag = 0;
	return 0;
}

/* This operation will check whether the slot is within the bounds and
 * the operation is valid to perform on that slot
 * Parameters: slot, operation
 * Returns: 0 or error codes
 */
static int validate(struct slot *slot_cur, int opn)
{
	int number;
	int retval;

	if (!slot_cur)
		return -ENODEV;
	number = slot_cur->number;
	if ((number > max_slots) || (number < 0))
		return -EBADSLT;
	debug("slot_number in validate is %d\n", slot_cur->number);

	retval = slot_update(&slot_cur);
	if (retval)
		return retval;

	switch (opn) {
		case ENABLE:
			if (!(SLOT_PWRGD(slot_cur->status)) && 
			     (SLOT_PRESENT(slot_cur->status)) && 
			     !(SLOT_LATCH(slot_cur->status)))
				return 0;
			break;
		case DISABLE:
			if ((SLOT_PWRGD(slot_cur->status)) && 
			    (SLOT_PRESENT(slot_cur->status)) &&
			    !(SLOT_LATCH(slot_cur->status)))
				return 0;
			break;
		default:
			break;
	}
	err("validate failed....\n");
	return -EINVAL;
}

/****************************************************************************
 * This routine is for updating the data structures in the hotplug core
 * Parameters: struct slot
 * Returns: 0 or error
 ****************************************************************************/
int ibmphp_update_slot_info(struct slot *slot_cur)
{
	struct hotplug_slot_info *info;
	int rc;
	u8 bus_speed;
	u8 mode;

	info = kmalloc(sizeof(struct hotplug_slot_info), GFP_KERNEL);
	if (!info) {
		err("out of system memory\n");
		return -ENOMEM;
	}
        
	info->power_status = SLOT_PWRGD(slot_cur->status);
	info->attention_status = SLOT_ATTN(slot_cur->status,
						slot_cur->ext_status);
	info->latch_status = SLOT_LATCH(slot_cur->status);
        if (!SLOT_PRESENT(slot_cur->status)) {
                info->adapter_status = 0;
/*		info->max_adapter_speed_status = MAX_ADAPTER_NONE; */
	} else {
                info->adapter_status = 1;
/*		get_max_adapter_speed_1(slot_cur->hotplug_slot,
					&info->max_adapter_speed_status, 0); */
	}

	bus_speed = slot_cur->bus_on->current_speed;
	mode = slot_cur->bus_on->current_bus_mode;

	switch (bus_speed) {
		case BUS_SPEED_33:
			break;
		case BUS_SPEED_66:
			if (mode == BUS_MODE_PCIX) 
				bus_speed += 0x01;
			else if (mode == BUS_MODE_PCI)
				;
			else
				bus_speed = PCI_SPEED_UNKNOWN;
			break;
		case BUS_SPEED_100:
		case BUS_SPEED_133:
			bus_speed += 0x01;
			break;
		default:
			bus_speed = PCI_SPEED_UNKNOWN;
	}

	info->cur_bus_speed = bus_speed;
	info->max_bus_speed = slot_cur->hotplug_slot->info->max_bus_speed;
	// To do: bus_names 
	
	rc = pci_hp_change_slot_info(slot_cur->hotplug_slot, info);
	kfree(info);
	return rc;
}


/******************************************************************************
 * This function will return the pci_func, given bus and devfunc, or NULL.  It
 * is called from visit routines
 ******************************************************************************/

static struct pci_func *ibm_slot_find(u8 busno, u8 device, u8 function)
{
	struct pci_func *func_cur;
	struct slot *slot_cur;
	struct list_head * tmp;
	list_for_each(tmp, &ibmphp_slot_head) {
		slot_cur = list_entry(tmp, struct slot, ibm_slot_list);
		if (slot_cur->func) {
			func_cur = slot_cur->func;
			while (func_cur) {
				if ((func_cur->busno == busno) &&
						(func_cur->device == device) &&
						(func_cur->function == function))
					return func_cur;
				func_cur = func_cur->next;
			}
		}
	}
	return NULL;
}

/*************************************************************
 * This routine frees up memory used by struct slot, including
 * the pointers to pci_func, bus, hotplug_slot, controller,
 * and deregistering from the hotplug core
 *************************************************************/
static void free_slots(void)
{
	struct slot *slot_cur;
	struct list_head * tmp;
	struct list_head * next;

	debug("%s -- enter\n", __FUNCTION__);

	list_for_each_safe(tmp, next, &ibmphp_slot_head) {
		slot_cur = list_entry(tmp, struct slot, ibm_slot_list);
		pci_hp_deregister(slot_cur->hotplug_slot);
	}
	debug("%s -- exit\n", __FUNCTION__);
}

static void ibm_unconfigure_device(struct pci_func *func)
{
	struct pci_dev *temp;
	u8 j;

	debug("inside %s\n", __FUNCTION__);
	debug("func->device = %x, func->function = %x\n",
					func->device, func->function);
	debug("func->device << 3 | 0x0  = %x\n", func->device << 3 | 0x0);

	for (j = 0; j < 0x08; j++) {
		temp = pci_find_slot(func->busno, (func->device << 3) | j);
		if (temp)
			pci_remove_bus_device(temp);
	}
}

/*
 * The following function is to fix kernel bug regarding 
 * getting bus entries, here we manually add those primary 
 * bus entries to kernel bus structure whenever apply
 */
static u8 bus_structure_fixup(u8 busno)
{
	struct pci_bus *bus;
	struct pci_dev *dev;
	u16 l;

	if (pci_find_bus(0, busno) || !(ibmphp_find_same_bus_num(busno)))
		return 1;

	bus = kmalloc(sizeof(*bus), GFP_KERNEL);
	if (!bus) {
		err("%s - out of memory\n", __FUNCTION__);
		return 1;
	}
	dev = kmalloc(sizeof(*dev), GFP_KERNEL);
	if (!dev) {
		kfree(bus);
		err("%s - out of memory\n", __FUNCTION__);
		return 1;
	}

	bus->number = busno;
	bus->ops = ibmphp_pci_bus->ops;
	dev->bus = bus;
	for (dev->devfn = 0; dev->devfn < 256; dev->devfn += 8) {
		if (!pci_read_config_word(dev, PCI_VENDOR_ID, &l) &&
					(l != 0x0000) && (l != 0xffff)) {
			debug("%s - Inside bus_struture_fixup()\n",
							__FUNCTION__);
			pci_scan_bus(busno, ibmphp_pci_bus->ops, NULL);
			break;
		}
	}

	kfree(dev);
	kfree(bus);

	return 0;
}

static int ibm_configure_device(struct pci_func *func)
{
	unsigned char bus;
	struct pci_bus *child;
	int num;
	int flag = 0;	/* this is to make sure we don't double scan the bus,
					for bridged devices primarily */

	if (!(bus_structure_fixup(func->busno)))
		flag = 1;
	if (func->dev == NULL)
		func->dev = pci_find_slot(func->busno,
				PCI_DEVFN(func->device, func->function));

	if (func->dev == NULL) {
		struct pci_bus *bus = pci_find_bus(0, func->busno);
		if (!bus)
			return 0;

		num = pci_scan_slot(bus,
				PCI_DEVFN(func->device, func->function));
		if (num)
			pci_bus_add_devices(bus);

		func->dev = pci_find_slot(func->busno,
				PCI_DEVFN(func->device, func->function));
		if (func->dev == NULL) {
			err("ERROR... : pci_dev still NULL\n");
			return 0;
		}
	}
	if (!(flag) && (func->dev->hdr_type == PCI_HEADER_TYPE_BRIDGE)) {
		pci_read_config_byte(func->dev, PCI_SECONDARY_BUS, &bus);
		child = pci_add_new_bus(func->dev->bus, func->dev, bus);
		pci_do_scan_bus(child);
	}

	return 0;
}

/*******************************************************
 * Returns whether the bus is empty or not 
 *******************************************************/
static int is_bus_empty(struct slot * slot_cur)
{
	int rc;
	struct slot * tmp_slot;
	u8 i = slot_cur->bus_on->slot_min;

	while (i <= slot_cur->bus_on->slot_max) {
		if (i == slot_cur->number) {
			i++;
			continue;
		}
		tmp_slot = ibmphp_get_slot_from_physical_num(i);
		if (!tmp_slot)
			return 0;
		rc = slot_update(&tmp_slot);
		if (rc)
			return 0;
		if (SLOT_PRESENT(tmp_slot->status) &&
					SLOT_PWRGD(tmp_slot->status))
			return 0;
		i++;
	}
	return 1;
}

/***********************************************************
 * If the HPC permits and the bus currently empty, tries to set the 
 * bus speed and mode at the maximum card and bus capability
 * Parameters: slot
 * Returns: bus is set (0) or error code
 ***********************************************************/
static int set_bus(struct slot * slot_cur)
{
	int rc;
	u8 speed;
	u8 cmd = 0x0;
	int retval;
	static struct pci_device_id ciobx[] = {
		{ PCI_DEVICE(PCI_VENDOR_ID_SERVERWORKS, 0x0101) },
	        { },
	};	

	debug("%s - entry slot # %d\n", __FUNCTION__, slot_cur->number);
	if (SET_BUS_STATUS(slot_cur->ctrl) && is_bus_empty(slot_cur)) {
		rc = slot_update(&slot_cur);
		if (rc)
			return rc;
		speed = SLOT_SPEED(slot_cur->ext_status);
		debug("ext_status = %x, speed = %x\n", slot_cur->ext_status, speed);
		switch (speed) {
		case HPC_SLOT_SPEED_33:
			cmd = HPC_BUS_33CONVMODE;
			break;
		case HPC_SLOT_SPEED_66:
			if (SLOT_PCIX(slot_cur->ext_status)) {
				if ((slot_cur->supported_speed >= BUS_SPEED_66) &&
						(slot_cur->supported_bus_mode == BUS_MODE_PCIX))
					cmd = HPC_BUS_66PCIXMODE;
				else if (!SLOT_BUS_MODE(slot_cur->ext_status))
					/* if max slot/bus capability is 66 pci
					and there's no bus mode mismatch, then
					the adapter supports 66 pci */ 
					cmd = HPC_BUS_66CONVMODE;
				else
					cmd = HPC_BUS_33CONVMODE;
			} else {
				if (slot_cur->supported_speed >= BUS_SPEED_66)
					cmd = HPC_BUS_66CONVMODE;
				else
					cmd = HPC_BUS_33CONVMODE;
			}
			break;
		case HPC_SLOT_SPEED_133:
			switch (slot_cur->supported_speed) {
			case BUS_SPEED_33:
				cmd = HPC_BUS_33CONVMODE;
				break;
			case BUS_SPEED_66:
				if (slot_cur->supported_bus_mode == BUS_MODE_PCIX)
					cmd = HPC_BUS_66PCIXMODE;
				else
					cmd = HPC_BUS_66CONVMODE;
				break;
			case BUS_SPEED_100:
				cmd = HPC_BUS_100PCIXMODE;
				break;
			case BUS_SPEED_133:
				/* This is to take care of the bug in CIOBX chip */
				if (pci_dev_present(ciobx))
					ibmphp_hpc_writeslot(slot_cur,
							HPC_BUS_100PCIXMODE);
				cmd = HPC_BUS_133PCIXMODE;
				break;
			default:
				err("Wrong bus speed\n");
				return -ENODEV;
			}
			break;
		default:
			err("wrong slot speed\n");
			return -ENODEV;
		}
		debug("setting bus speed for slot %d, cmd %x\n",
						slot_cur->number, cmd);
		retval = ibmphp_hpc_writeslot(slot_cur, cmd);
		if (retval) {
			err("setting bus speed failed\n");
			return retval;
		}
		if (CTLR_RESULT(slot_cur->ctrl->status)) {
			err("command not completed successfully in set_bus\n");
			return -EIO;
		}
	}
	/* This is for x440, once Brandon fixes the firmware, 
	will not need this delay */
	msleep(1000);
	debug("%s -Exit\n", __FUNCTION__);
	return 0;
}

/* This routine checks the bus limitations that the slot is on from the BIOS.
 * This is used in deciding whether or not to power up the slot.  
 * (electrical/spec limitations. For example, >1 133 MHz or >2 66 PCI cards on
 * same bus) 
 * Parameters: slot
 * Returns: 0 = no limitations, -EINVAL = exceeded limitations on the bus
 */
static int check_limitations(struct slot *slot_cur)
{
	u8 i;
	struct slot * tmp_slot;
	u8 count = 0;
	u8 limitation = 0;

	for (i = slot_cur->bus_on->slot_min; i <= slot_cur->bus_on->slot_max; i++) {
		tmp_slot = ibmphp_get_slot_from_physical_num(i);
		if (!tmp_slot)
			return -ENODEV;
		if ((SLOT_PWRGD(tmp_slot->status)) &&
					!(SLOT_CONNECT(tmp_slot->status)))
			count++;
	}
	get_cur_bus_info(&slot_cur);
	switch (slot_cur->bus_on->current_speed) {
	case BUS_SPEED_33:
		limitation = slot_cur->bus_on->slots_at_33_conv;
		break;
	case BUS_SPEED_66:
		if (slot_cur->bus_on->current_bus_mode == BUS_MODE_PCIX)
			limitation = slot_cur->bus_on->slots_at_66_pcix;
		else
			limitation = slot_cur->bus_on->slots_at_66_conv;
		break;
	case BUS_SPEED_100:
		limitation = slot_cur->bus_on->slots_at_100_pcix;
		break;
	case BUS_SPEED_133:
		limitation = slot_cur->bus_on->slots_at_133_pcix;
		break;
	}

	if ((count + 1) > limitation)
		return -EINVAL;
	return 0;
}

static inline void print_card_capability(struct slot *slot_cur)
{
	info("capability of the card is ");
	if ((slot_cur->ext_status & CARD_INFO) == PCIX133) 
		info("   133 MHz PCI-X\n");
	else if ((slot_cur->ext_status & CARD_INFO) == PCIX66)
		info("    66 MHz PCI-X\n");
	else if ((slot_cur->ext_status & CARD_INFO) == PCI66)
		info("    66 MHz PCI\n");
	else
		info("    33 MHz PCI\n");

}

/* This routine will power on the slot, configure the device(s) and find the
 * drivers for them.
 * Parameters: hotplug_slot
 * Returns: 0 or failure codes
 */
static int enable_slot(struct hotplug_slot *hs)
{
	int rc, i, rcpr;
	struct slot *slot_cur;
	u8 function;
	struct pci_func *tmp_func;

	ibmphp_lock_operations();

	debug("ENABLING SLOT........\n");
	slot_cur = hs->private;

	if ((rc = validate(slot_cur, ENABLE))) {
		err("validate function failed\n");
		goto error_nopower;
	}

	attn_LED_blink(slot_cur);
	
	rc = set_bus(slot_cur);
	if (rc) {
		err("was not able to set the bus\n");
		goto error_nopower;
	}

	/*-----------------debugging------------------------------*/
	get_cur_bus_info(&slot_cur);
	debug("the current bus speed right after set_bus = %x\n",
					slot_cur->bus_on->current_speed);
	/*----------------------------------------------------------*/

	rc = check_limitations(slot_cur);
	if (rc) {
		err("Adding this card exceeds the limitations of this bus.\n");
		err("(i.e., >1 133MHz cards running on same bus, or "
		     ">2 66 PCI cards running on same bus.\n");
		err("Try hot-adding into another bus\n");
		rc = -EINVAL;
		goto error_nopower;
	}

	rc = power_on(slot_cur);

	if (rc) {
		err("something wrong when powering up... please see below for details\n");
		/* need to turn off before on, otherwise, blinking overwrites */
		attn_off(slot_cur);
		attn_on(slot_cur);
		if (slot_update(&slot_cur)) {
			attn_off(slot_cur);
			attn_on(slot_cur);
			rc = -ENODEV;
			goto exit;
		}
		/* Check to see the error of why it failed */
		if ((SLOT_POWER(slot_cur->status)) &&
					!(SLOT_PWRGD(slot_cur->status)))
			err("power fault occurred trying to power up\n");
		else if (SLOT_BUS_SPEED(slot_cur->status)) {
			err("bus speed mismatch occurred.  please check "
				"current bus speed and card capability\n");
			print_card_capability(slot_cur);
		} else if (SLOT_BUS_MODE(slot_cur->ext_status)) {
			err("bus mode mismatch occurred.  please check "
				"current bus mode and card capability\n");
			print_card_capability(slot_cur);
		}
		ibmphp_update_slot_info(slot_cur);
		goto exit;
	}
	debug("after power_on\n");
	/*-----------------------debugging---------------------------*/
	get_cur_bus_info(&slot_cur);
	debug("the current bus speed right after power_on = %x\n",
					slot_cur->bus_on->current_speed);
	/*----------------------------------------------------------*/

	rc = slot_update(&slot_cur);
	if (rc)
		goto error_power;
	
	rc = -EINVAL;
	if (SLOT_POWER(slot_cur->status) && !(SLOT_PWRGD(slot_cur->status))) {
		err("power fault occurred trying to power up...\n");
		goto error_power;
	}
	if (SLOT_POWER(slot_cur->status) && (SLOT_BUS_SPEED(slot_cur->status))) {
		err("bus speed mismatch occurred.  please check current bus "
					"speed and card capability\n");
		print_card_capability(slot_cur);
		goto error_power;
	} 
	/* Don't think this case will happen after above checks...
	 * but just in case, for paranoia sake */
	if (!(SLOT_POWER(slot_cur->status))) {
		err("power on failed...\n");
		goto error_power;
	}

	slot_cur->func = kzalloc(sizeof(struct pci_func), GFP_KERNEL);
	if (!slot_cur->func) {
		/* We cannot do update_slot_info here, since no memory for
		 * kmalloc n.e.ways, and update_slot_info allocates some */
		err("out of system memory\n");
		rc = -ENOMEM;
		goto error_power;
	}
	slot_cur->func->busno = slot_cur->bus;
	slot_cur->func->device = slot_cur->device;
	for (i = 0; i < 4; i++)
		slot_cur->func->irq[i] = slot_cur->irq[i];

	debug("b4 configure_card, slot_cur->bus = %x, slot_cur->device = %x\n",
					slot_cur->bus, slot_cur->device);

	if (ibmphp_configure_card(slot_cur->func, slot_cur->number)) {
		err("configure_card was unsuccessful...\n");
		/* true because don't need to actually deallocate resources,
		 * just remove references */
		ibmphp_unconfigure_card(&slot_cur, 1);
		debug("after unconfigure_card\n");
		slot_cur->func = NULL;
		rc = -ENOMEM;
		goto error_power;
	}

	function = 0x00;
	do {
		tmp_func = ibm_slot_find(slot_cur->bus, slot_cur->func->device,
							function++);
		if (tmp_func && !(tmp_func->dev))
			ibm_configure_device(tmp_func);
	} while (tmp_func);

	attn_off(slot_cur);
	if (slot_update(&slot_cur)) {
		rc = -EFAULT;
		goto exit;
	}
	ibmphp_print_test();
	rc = ibmphp_update_slot_info(slot_cur);
exit:
	ibmphp_unlock_operations(); 
	return rc;

error_nopower:
	attn_off(slot_cur);	/* need to turn off if was blinking b4 */
	attn_on(slot_cur);
error_cont:
	rcpr = slot_update(&slot_cur);
	if (rcpr) {
		rc = rcpr;
		goto exit;
	}
	ibmphp_update_slot_info(slot_cur);
	goto exit;

error_power:
	attn_off(slot_cur);	/* need to turn off if was blinking b4 */
	attn_on(slot_cur);
	rcpr = power_off(slot_cur);
	if (rcpr) {
		rc = rcpr;
		goto exit;
	}
	goto error_cont;
}

/**************************************************************
* HOT REMOVING ADAPTER CARD                                   *
* INPUT: POINTER TO THE HOTPLUG SLOT STRUCTURE                *
* OUTPUT: SUCCESS 0 ; FAILURE: UNCONFIGURE , VALIDATE         *
          DISABLE POWER ,                                    *
**************************************************************/
static int ibmphp_disable_slot(struct hotplug_slot *hotplug_slot)
{
	struct slot *slot = hotplug_slot->private;
	int rc;
	
	ibmphp_lock_operations();
	rc = ibmphp_do_disable_slot(slot);
	ibmphp_unlock_operations();
	return rc;
}

int ibmphp_do_disable_slot(struct slot *slot_cur)
{
	int rc;
	u8 flag;

	debug("DISABLING SLOT...\n"); 
		
	if ((slot_cur == NULL) || (slot_cur->ctrl == NULL)) {
		return -ENODEV;
	}
	
	flag = slot_cur->flag;
	slot_cur->flag = 1;

	if (flag == 1) {
		rc = validate(slot_cur, DISABLE);
			/* checking if powered off already & valid slot # */
		if (rc)
			goto error;
	}
	attn_LED_blink(slot_cur);

	if (slot_cur->func == NULL) {
		/* We need this for fncs's that were there on bootup */
		slot_cur->func = kzalloc(sizeof(struct pci_func), GFP_KERNEL);
		if (!slot_cur->func) {
			err("out of system memory\n");
			rc = -ENOMEM;
			goto error;
		}
		slot_cur->func->busno = slot_cur->bus;
		slot_cur->func->device = slot_cur->device;
	}

	ibm_unconfigure_device(slot_cur->func);
        
	/* If we got here from latch suddenly opening on operating card or 
	a power fault, there's no power to the card, so cannot
	read from it to determine what resources it occupied.  This operation
	is forbidden anyhow.  The best we can do is remove it from kernel
	lists at least */

	if (!flag) {
		attn_off(slot_cur);
		return 0;
	}

	rc = ibmphp_unconfigure_card(&slot_cur, 0);
	slot_cur->func = NULL;
	debug("in disable_slot. after unconfigure_card\n");
	if (rc) {
		err("could not unconfigure card.\n");
		goto error;
	}

	rc = ibmphp_hpc_writeslot(slot_cur, HPC_SLOT_OFF);
	if (rc)
		goto error;

	attn_off(slot_cur);
	rc = slot_update(&slot_cur);
	if (rc)
		goto exit;

	rc = ibmphp_update_slot_info(slot_cur);
	ibmphp_print_test();
exit:
	return rc;

error:
	/*  Need to turn off if was blinking b4 */
	attn_off(slot_cur);
	attn_on(slot_cur);
	if (slot_update(&slot_cur)) {
		rc = -EFAULT;
		goto exit;
	}
	if (flag)		
		ibmphp_update_slot_info(slot_cur);
	goto exit;
}

struct hotplug_slot_ops ibmphp_hotplug_slot_ops = {
	.owner =			THIS_MODULE,
	.set_attention_status =		set_attention_status,
	.enable_slot =			enable_slot,
	.disable_slot =			ibmphp_disable_slot,
	.hardware_test =		NULL,
	.get_power_status =		get_power_status,
	.get_attention_status =		get_attention_status,
	.get_latch_status =		get_latch_status,
	.get_adapter_status =		get_adapter_present,
	.get_max_bus_speed =		get_max_bus_speed,
	.get_cur_bus_speed =		get_cur_bus_speed,
/*	.get_max_adapter_speed =	get_max_adapter_speed,
	.get_bus_name_status =		get_bus_name,
*/
};

static void ibmphp_unload(void)
{
	free_slots();
	debug("after slots\n");
	ibmphp_free_resources();
	debug("after resources\n");
	ibmphp_free_bus_info_queue();
	debug("after bus info\n");
	ibmphp_free_ebda_hpc_queue();
	debug("after ebda hpc\n");
	ibmphp_free_ebda_pci_rsrc_queue();
	debug("after ebda pci rsrc\n");
	kfree(ibmphp_pci_bus);
}

static int __init ibmphp_init(void)
{
	struct pci_bus *bus;
	int i = 0;
	int rc = 0;

	init_flag = 1;

	info(DRIVER_DESC " version: " DRIVER_VERSION "\n");

	ibmphp_pci_bus = kmalloc(sizeof(*ibmphp_pci_bus), GFP_KERNEL);
	if (!ibmphp_pci_bus) {
		err("out of memory\n");
		rc = -ENOMEM;
		goto exit;
	}

	bus = pci_find_bus(0, 0);
	if (!bus) {
		err("Can't find the root pci bus, can not continue\n");
		rc = -ENODEV;
		goto error;
	}
	memcpy(ibmphp_pci_bus, bus, sizeof(*ibmphp_pci_bus));

	ibmphp_debug = debug;

	ibmphp_hpc_initvars();

	for (i = 0; i < 16; i++)
		irqs[i] = 0;

	if ((rc = ibmphp_access_ebda()))
		goto error;
	debug("after ibmphp_access_ebda()\n");

	if ((rc = ibmphp_rsrc_init()))
		goto error;
	debug("AFTER Resource & EBDA INITIALIZATIONS\n");

	max_slots = get_max_slots();
	
	if ((rc = ibmphp_register_pci()))
		goto error;

	if (init_ops()) {
		rc = -ENODEV;
		goto error;
	}

	ibmphp_print_test();
	if ((rc = ibmphp_hpc_start_poll_thread())) {
		goto error;
	}

	/* lock ourselves into memory with a module 
	 * count of -1 so that no one can unload us. */
	module_put(THIS_MODULE);

exit:
	return rc;

error:
	ibmphp_unload();
	goto exit;
}

static void __exit ibmphp_exit(void)
{
	ibmphp_hpc_stop_poll_thread();
	debug("after polling\n");
	ibmphp_unload();
	debug("done\n");
}

module_init(ibmphp_init);
module_exit(ibmphp_exit);
