/*
 * CompactPCI Hot Plug Driver
 *
 * Copyright (C) 2002,2005 SOMA Networks, Inc.
 * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com)
 * Copyright (C) 2001 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 <scottm@somanetworks.com>
 */

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/pci.h>
#include <linux/pci_hotplug.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/atomic.h>
#include <linux/delay.h>
#include <linux/kthread.h>
#include "cpci_hotplug.h"

#define DRIVER_AUTHOR	"Scott Murray <scottm@somanetworks.com>"
#define DRIVER_DESC	"CompactPCI Hot Plug Core"

#define MY_NAME	"cpci_hotplug"

#define dbg(format, arg...)					\
	do {							\
		if (cpci_debug)					\
			printk (KERN_DEBUG "%s: " format "\n",	\
				MY_NAME , ## arg); 		\
	} while (0)
#define err(format, arg...) printk(KERN_ERR "%s: " format "\n", MY_NAME , ## arg)
#define info(format, arg...) printk(KERN_INFO "%s: " format "\n", MY_NAME , ## arg)
#define warn(format, arg...) printk(KERN_WARNING "%s: " format "\n", MY_NAME , ## arg)

/* local variables */
static DECLARE_RWSEM(list_rwsem);
static LIST_HEAD(slot_list);
static int slots;
static atomic_t extracting;
int cpci_debug;
static struct cpci_hp_controller *controller;
static struct task_struct *cpci_thread;
static int thread_finished;

static int enable_slot(struct hotplug_slot *slot);
static int disable_slot(struct hotplug_slot *slot);
static int set_attention_status(struct hotplug_slot *slot, u8 value);
static int get_power_status(struct hotplug_slot *slot, u8 * value);
static int get_attention_status(struct hotplug_slot *slot, u8 * value);
static int get_adapter_status(struct hotplug_slot *slot, u8 * value);
static int get_latch_status(struct hotplug_slot *slot, u8 * value);

static struct hotplug_slot_ops cpci_hotplug_slot_ops = {
	.enable_slot = enable_slot,
	.disable_slot = disable_slot,
	.set_attention_status = set_attention_status,
	.get_power_status = get_power_status,
	.get_attention_status = get_attention_status,
	.get_adapter_status = get_adapter_status,
	.get_latch_status = get_latch_status,
};

static int
update_latch_status(struct hotplug_slot *hotplug_slot, u8 value)
{
	struct hotplug_slot_info info;

	memcpy(&info, hotplug_slot->info, sizeof(struct hotplug_slot_info));
	info.latch_status = value;
	return pci_hp_change_slot_info(hotplug_slot, &info);
}

static int
update_adapter_status(struct hotplug_slot *hotplug_slot, u8 value)
{
	struct hotplug_slot_info info;

	memcpy(&info, hotplug_slot->info, sizeof(struct hotplug_slot_info));
	info.adapter_status = value;
	return pci_hp_change_slot_info(hotplug_slot, &info);
}

static int
enable_slot(struct hotplug_slot *hotplug_slot)
{
	struct slot *slot = hotplug_slot->private;
	int retval = 0;

	dbg("%s - physical_slot = %s", __func__, slot_name(slot));

	if (controller->ops->set_power)
		retval = controller->ops->set_power(slot, 1);
	return retval;
}

static int
disable_slot(struct hotplug_slot *hotplug_slot)
{
	struct slot *slot = hotplug_slot->private;
	int retval = 0;

	dbg("%s - physical_slot = %s", __func__, slot_name(slot));

	down_write(&list_rwsem);

	/* Unconfigure device */
	dbg("%s - unconfiguring slot %s", __func__, slot_name(slot));
	if ((retval = cpci_unconfigure_slot(slot))) {
		err("%s - could not unconfigure slot %s",
		    __func__, slot_name(slot));
		goto disable_error;
	}
	dbg("%s - finished unconfiguring slot %s", __func__, slot_name(slot));

	/* Clear EXT (by setting it) */
	if (cpci_clear_ext(slot)) {
		err("%s - could not clear EXT for slot %s",
		    __func__, slot_name(slot));
		retval = -ENODEV;
		goto disable_error;
	}
	cpci_led_on(slot);

	if (controller->ops->set_power)
		if ((retval = controller->ops->set_power(slot, 0)))
			goto disable_error;

	if (update_adapter_status(slot->hotplug_slot, 0))
		warn("failure to update adapter file");

	if (slot->extracting) {
		slot->extracting = 0;
		atomic_dec(&extracting);
	}
disable_error:
	up_write(&list_rwsem);
	return retval;
}

static u8
cpci_get_power_status(struct slot *slot)
{
	u8 power = 1;

	if (controller->ops->get_power)
		power = controller->ops->get_power(slot);
	return power;
}

static int
get_power_status(struct hotplug_slot *hotplug_slot, u8 * value)
{
	struct slot *slot = hotplug_slot->private;

	*value = cpci_get_power_status(slot);
	return 0;
}

static int
get_attention_status(struct hotplug_slot *hotplug_slot, u8 * value)
{
	struct slot *slot = hotplug_slot->private;

	*value = cpci_get_attention_status(slot);
	return 0;
}

static int
set_attention_status(struct hotplug_slot *hotplug_slot, u8 status)
{
	return cpci_set_attention_status(hotplug_slot->private, status);
}

static int
get_adapter_status(struct hotplug_slot *hotplug_slot, u8 * value)
{
	*value = hotplug_slot->info->adapter_status;
	return 0;
}

static int
get_latch_status(struct hotplug_slot *hotplug_slot, u8 * value)
{
	*value = hotplug_slot->info->latch_status;
	return 0;
}

static void release_slot(struct hotplug_slot *hotplug_slot)
{
	struct slot *slot = hotplug_slot->private;

	kfree(slot->hotplug_slot->info);
	kfree(slot->hotplug_slot);
	if (slot->dev)
		pci_dev_put(slot->dev);
	kfree(slot);
}

#define SLOT_NAME_SIZE	6

int
cpci_hp_register_bus(struct pci_bus *bus, u8 first, u8 last)
{
	struct slot *slot;
	struct hotplug_slot *hotplug_slot;
	struct hotplug_slot_info *info;
	char name[SLOT_NAME_SIZE];
	int status = -ENOMEM;
	int i;

	if (!(controller && bus))
		return -ENODEV;

	/*
	 * Create a structure for each slot, and register that slot
	 * with the pci_hotplug subsystem.
	 */
	for (i = first; i <= last; ++i) {
		slot = kzalloc(sizeof (struct slot), GFP_KERNEL);
		if (!slot)
			goto error;

		hotplug_slot =
			kzalloc(sizeof (struct hotplug_slot), GFP_KERNEL);
		if (!hotplug_slot)
			goto error_slot;
		slot->hotplug_slot = hotplug_slot;

		info = kzalloc(sizeof (struct hotplug_slot_info), GFP_KERNEL);
		if (!info)
			goto error_hpslot;
		hotplug_slot->info = info;

		slot->bus = bus;
		slot->number = i;
		slot->devfn = PCI_DEVFN(i, 0);

		snprintf(name, SLOT_NAME_SIZE, "%02x:%02x", bus->number, i);

		hotplug_slot->private = slot;
		hotplug_slot->release = &release_slot;
		hotplug_slot->ops = &cpci_hotplug_slot_ops;

		/*
		 * Initialize the slot info structure with some known
		 * good values.
		 */
		dbg("initializing slot %s", name);
		info->power_status = cpci_get_power_status(slot);
		info->attention_status = cpci_get_attention_status(slot);

		dbg("registering slot %s", name);
		status = pci_hp_register(slot->hotplug_slot, bus, i, name);
		if (status) {
			err("pci_hp_register failed with error %d", status);
			goto error_info;
		}
		dbg("slot registered with name: %s", slot_name(slot));

		/* Add slot to our internal list */
		down_write(&list_rwsem);
		list_add(&slot->slot_list, &slot_list);
		slots++;
		up_write(&list_rwsem);
	}
	return 0;
error_info:
	kfree(info);
error_hpslot:
	kfree(hotplug_slot);
error_slot:
	kfree(slot);
error:
	return status;
}

int
cpci_hp_unregister_bus(struct pci_bus *bus)
{
	struct slot *slot;
	struct slot *tmp;
	int status = 0;

	down_write(&list_rwsem);
	if (!slots) {
		up_write(&list_rwsem);
		return -1;
	}
	list_for_each_entry_safe(slot, tmp, &slot_list, slot_list) {
		if (slot->bus == bus) {
			list_del(&slot->slot_list);
			slots--;

			dbg("deregistering slot %s", slot_name(slot));
			status = pci_hp_deregister(slot->hotplug_slot);
			if (status) {
				err("pci_hp_deregister failed with error %d",
				    status);
				break;
			}
		}
	}
	up_write(&list_rwsem);
	return status;
}

/* This is the interrupt mode interrupt handler */
static irqreturn_t
cpci_hp_intr(int irq, void *data)
{
	dbg("entered cpci_hp_intr");

	/* Check to see if it was our interrupt */
	if ((controller->irq_flags & IRQF_SHARED) &&
	    !controller->ops->check_irq(controller->dev_id)) {
		dbg("exited cpci_hp_intr, not our interrupt");
		return IRQ_NONE;
	}

	/* Disable ENUM interrupt */
	controller->ops->disable_irq();

	/* Trigger processing by the event thread */
	wake_up_process(cpci_thread);
	return IRQ_HANDLED;
}

/*
 * According to PICMG 2.1 R2.0, section 6.3.2, upon
 * initialization, the system driver shall clear the
 * INS bits of the cold-inserted devices.
 */
static int
init_slots(int clear_ins)
{
	struct slot *slot;
	struct pci_dev* dev;

	dbg("%s - enter", __func__);
	down_read(&list_rwsem);
	if (!slots) {
		up_read(&list_rwsem);
		return -1;
	}
	list_for_each_entry(slot, &slot_list, slot_list) {
		dbg("%s - looking at slot %s", __func__, slot_name(slot));
		if (clear_ins && cpci_check_and_clear_ins(slot))
			dbg("%s - cleared INS for slot %s",
			    __func__, slot_name(slot));
		dev = pci_get_slot(slot->bus, PCI_DEVFN(slot->number, 0));
		if (dev) {
			if (update_adapter_status(slot->hotplug_slot, 1))
				warn("failure to update adapter file");
			if (update_latch_status(slot->hotplug_slot, 1))
				warn("failure to update latch file");
			slot->dev = dev;
		}
	}
	up_read(&list_rwsem);
	dbg("%s - exit", __func__);
	return 0;
}

static int
check_slots(void)
{
	struct slot *slot;
	int extracted;
	int inserted;
	u16 hs_csr;

	down_read(&list_rwsem);
	if (!slots) {
		up_read(&list_rwsem);
		err("no slots registered, shutting down");
		return -1;
	}
	extracted = inserted = 0;
	list_for_each_entry(slot, &slot_list, slot_list) {
		dbg("%s - looking at slot %s", __func__, slot_name(slot));
		if (cpci_check_and_clear_ins(slot)) {
			/*
			 * Some broken hardware (e.g. PLX 9054AB) asserts
			 * ENUM# twice...
			 */
			if (slot->dev) {
				warn("slot %s already inserted",
				     slot_name(slot));
				inserted++;
				continue;
			}

			/* Process insertion */
			dbg("%s - slot %s inserted", __func__, slot_name(slot));

			/* GSM, debug */
			hs_csr = cpci_get_hs_csr(slot);
			dbg("%s - slot %s HS_CSR (1) = %04x",
			    __func__, slot_name(slot), hs_csr);

			/* Configure device */
			dbg("%s - configuring slot %s",
			    __func__, slot_name(slot));
			if (cpci_configure_slot(slot)) {
				err("%s - could not configure slot %s",
				    __func__, slot_name(slot));
				continue;
			}
			dbg("%s - finished configuring slot %s",
			    __func__, slot_name(slot));

			/* GSM, debug */
			hs_csr = cpci_get_hs_csr(slot);
			dbg("%s - slot %s HS_CSR (2) = %04x",
			    __func__, slot_name(slot), hs_csr);

			if (update_latch_status(slot->hotplug_slot, 1))
				warn("failure to update latch file");

			if (update_adapter_status(slot->hotplug_slot, 1))
				warn("failure to update adapter file");

			cpci_led_off(slot);

			/* GSM, debug */
			hs_csr = cpci_get_hs_csr(slot);
			dbg("%s - slot %s HS_CSR (3) = %04x",
			    __func__, slot_name(slot), hs_csr);

			inserted++;
		} else if (cpci_check_ext(slot)) {
			/* Process extraction request */
			dbg("%s - slot %s extracted",
			    __func__, slot_name(slot));

			/* GSM, debug */
			hs_csr = cpci_get_hs_csr(slot);
			dbg("%s - slot %s HS_CSR = %04x",
			    __func__, slot_name(slot), hs_csr);

			if (!slot->extracting) {
				if (update_latch_status(slot->hotplug_slot, 0)) {
					warn("failure to update latch file");
				}
				slot->extracting = 1;
				atomic_inc(&extracting);
			}
			extracted++;
		} else if (slot->extracting) {
			hs_csr = cpci_get_hs_csr(slot);
			if (hs_csr == 0xffff) {
				/*
				 * Hmmm, we're likely hosed at this point, should we
				 * bother trying to tell the driver or not?
				 */
				err("card in slot %s was improperly removed",
				    slot_name(slot));
				if (update_adapter_status(slot->hotplug_slot, 0))
					warn("failure to update adapter file");
				slot->extracting = 0;
				atomic_dec(&extracting);
			}
		}
	}
	up_read(&list_rwsem);
	dbg("inserted=%d, extracted=%d, extracting=%d",
	    inserted, extracted, atomic_read(&extracting));
	if (inserted || extracted)
		return extracted;
	else if (!atomic_read(&extracting)) {
		err("cannot find ENUM# source, shutting down");
		return -1;
	}
	return 0;
}

/* This is the interrupt mode worker thread body */
static int
event_thread(void *data)
{
	int rc;

	dbg("%s - event thread started", __func__);
	while (1) {
		dbg("event thread sleeping");
		set_current_state(TASK_INTERRUPTIBLE);
		schedule();
		if (kthread_should_stop())
			break;
		do {
			rc = check_slots();
			if (rc > 0) {
				/* Give userspace a chance to handle extraction */
				msleep(500);
			} else if (rc < 0) {
				dbg("%s - error checking slots", __func__);
				thread_finished = 1;
				goto out;
			}
		} while (atomic_read(&extracting) && !kthread_should_stop());
		if (kthread_should_stop())
			break;

		/* Re-enable ENUM# interrupt */
		dbg("%s - re-enabling irq", __func__);
		controller->ops->enable_irq();
	}
 out:
	return 0;
}

/* This is the polling mode worker thread body */
static int
poll_thread(void *data)
{
	int rc;

	while (1) {
		if (kthread_should_stop() || signal_pending(current))
			break;
		if (controller->ops->query_enum()) {
			do {
				rc = check_slots();
				if (rc > 0) {
					/* Give userspace a chance to handle extraction */
					msleep(500);
				} else if (rc < 0) {
					dbg("%s - error checking slots", __func__);
					thread_finished = 1;
					goto out;
				}
			} while (atomic_read(&extracting) && !kthread_should_stop());
		}
		msleep(100);
	}
 out:
	return 0;
}

static int
cpci_start_thread(void)
{
	if (controller->irq)
		cpci_thread = kthread_run(event_thread, NULL, "cpci_hp_eventd");
	else
		cpci_thread = kthread_run(poll_thread, NULL, "cpci_hp_polld");
	if (IS_ERR(cpci_thread)) {
		err("Can't start up our thread");
		return PTR_ERR(cpci_thread);
	}
	thread_finished = 0;
	return 0;
}

static void
cpci_stop_thread(void)
{
	kthread_stop(cpci_thread);
	thread_finished = 1;
}

int
cpci_hp_register_controller(struct cpci_hp_controller *new_controller)
{
	int status = 0;

	if (controller)
		return -1;
	if (!(new_controller && new_controller->ops))
		return -EINVAL;
	if (new_controller->irq) {
		if (!(new_controller->ops->enable_irq &&
		     new_controller->ops->disable_irq))
			status = -EINVAL;
		if (request_irq(new_controller->irq,
			       cpci_hp_intr,
			       new_controller->irq_flags,
			       MY_NAME,
			       new_controller->dev_id)) {
			err("Can't get irq %d for the hotplug cPCI controller",
			    new_controller->irq);
			status = -ENODEV;
		}
		dbg("%s - acquired controller irq %d",
		    __func__, new_controller->irq);
	}
	if (!status)
		controller = new_controller;
	return status;
}

static void
cleanup_slots(void)
{
	struct slot *slot;
	struct slot *tmp;

	/*
	 * Unregister all of our slots with the pci_hotplug subsystem,
	 * and free up all memory that we had allocated.
	 */
	down_write(&list_rwsem);
	if (!slots)
		goto cleanup_null;
	list_for_each_entry_safe(slot, tmp, &slot_list, slot_list) {
		list_del(&slot->slot_list);
		pci_hp_deregister(slot->hotplug_slot);
	}
cleanup_null:
	up_write(&list_rwsem);
	return;
}

int
cpci_hp_unregister_controller(struct cpci_hp_controller *old_controller)
{
	int status = 0;

	if (controller) {
		if (!thread_finished)
			cpci_stop_thread();
		if (controller->irq)
			free_irq(controller->irq, controller->dev_id);
		controller = NULL;
		cleanup_slots();
	} else
		status = -ENODEV;
	return status;
}

int
cpci_hp_start(void)
{
	static int first = 1;
	int status;

	dbg("%s - enter", __func__);
	if (!controller)
		return -ENODEV;

	down_read(&list_rwsem);
	if (list_empty(&slot_list)) {
		up_read(&list_rwsem);
		return -ENODEV;
	}
	up_read(&list_rwsem);

	status = init_slots(first);
	if (first)
		first = 0;
	if (status)
		return status;

	status = cpci_start_thread();
	if (status)
		return status;
	dbg("%s - thread started", __func__);

	if (controller->irq) {
		/* Start enum interrupt processing */
		dbg("%s - enabling irq", __func__);
		controller->ops->enable_irq();
	}
	dbg("%s - exit", __func__);
	return 0;
}

int
cpci_hp_stop(void)
{
	if (!controller)
		return -ENODEV;
	if (controller->irq) {
		/* Stop enum interrupt processing */
		dbg("%s - disabling irq", __func__);
		controller->ops->disable_irq();
	}
	cpci_stop_thread();
	return 0;
}

int __init
cpci_hotplug_init(int debug)
{
	cpci_debug = debug;
	return 0;
}

void __exit
cpci_hotplug_exit(void)
{
	/*
	 * Clean everything up.
	 */
	cpci_hp_stop();
	cpci_hp_unregister_controller(controller);
}

EXPORT_SYMBOL_GPL(cpci_hp_register_controller);
EXPORT_SYMBOL_GPL(cpci_hp_unregister_controller);
EXPORT_SYMBOL_GPL(cpci_hp_register_bus);
EXPORT_SYMBOL_GPL(cpci_hp_unregister_bus);
EXPORT_SYMBOL_GPL(cpci_hp_start);
EXPORT_SYMBOL_GPL(cpci_hp_stop);
