Commit 181bb5ba authored by Jamie Lenehan's avatar Jamie Lenehan Committed by Christoph Hellwig

[PATCH] dc395x [4/6] - cleanup adapter uninit

Clean up the initialization sequence for the adapter. Makes it easier
to follow.
parent 46205e40
...@@ -5554,6 +5554,61 @@ int __init adapter_init(struct AdapterCtlBlk *acb, u32 io_port, u32 io_port_len, ...@@ -5554,6 +5554,61 @@ int __init adapter_init(struct AdapterCtlBlk *acb, u32 io_port, u32 io_port_len,
} }
/**
* adapter_uninit_chip - cleanly shut down the scsi controller chip,
* stopping all operations and disabling interrupt generation on the
* card.
*
* @acb: The adapter which we are to shutdown.
**/
static
void adapter_uninit_chip(struct AdapterCtlBlk *acb)
{
/* disable interrupts */
DC395x_write8(acb, TRM_S1040_DMA_INTEN, 0);
DC395x_write8(acb, TRM_S1040_SCSI_INTEN, 0);
/* reset the scsi bus */
if (acb->config & HCC_SCSI_RESET)
reset_scsi_bus(acb);
/* clear any pending interupt state */
DC395x_read8(acb, TRM_S1040_SCSI_INTSTATUS);
}
/**
* adapter_uninit - Shut down the chip and release any resources that
* we had allocated. Once this returns the adapter should not be used
* anymore.
*
* @acb: The adapter which we are to un-initialize.
**/
static
void adapter_uninit(struct AdapterCtlBlk *acb)
{
unsigned long flags;
DC395x_LOCK_IO(acb->scsi_host, flags);
/* remove timers */
if (timer_pending(&acb->waiting_timer))
del_timer(&acb->waiting_timer);
if (timer_pending(&acb->selto_timer))
del_timer(&acb->selto_timer);
adapter_uninit_chip(acb);
adapter_remove_and_free_all_devices(acb);
DC395x_UNLOCK_IO(acb->scsi_host, flags);
if (acb->irq_level)
free_irq(acb->irq_level, acb);
if (acb->io_port_base)
release_region(acb->io_port_base, acb->io_port_len);
adapter_sg_tables_free(acb);
free_tracebufs(acb);
}
/* /*
...@@ -5714,65 +5769,6 @@ int dc395x_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t o ...@@ -5714,65 +5769,6 @@ int dc395x_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t o
} }
/**
* chip_shutdown - cleanly shut down the scsi controller chip,
* stopping all operations and disablig interrupt generation on the
* card.
*
* @acb: The scsi adapter control block of the adapter to shut down.
**/
static
void chip_shutdown(struct AdapterCtlBlk *acb)
{
/* disable interrupt */
DC395x_write8(acb, TRM_S1040_DMA_INTEN, 0);
DC395x_write8(acb, TRM_S1040_SCSI_INTEN, 0);
/* remove timers */
if (timer_pending(&acb->waiting_timer))
del_timer(&acb->waiting_timer);
if (timer_pending(&acb->selto_timer))
del_timer(&acb->selto_timer);
/* reset the scsi bus */
if (acb->config & HCC_SCSI_RESET)
reset_scsi_bus(acb);
/* clear any pending interupt state */
DC395x_read8(acb, TRM_S1040_SCSI_INTSTATUS);
/* release chip resources */
#if debug_enabled(DBG_TRACE|DBG_TRACEALL)
free_tracebufs(acb);
#endif
adapter_sg_tables_free(acb);
}
/**
* host_release - shutdown device and release resources that were
* allocate for it. Called once for each card as it is shutdown.
*
* @host: The adapter instance to shutdown.
**/
static
void host_release(struct Scsi_Host *host)
{
struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)(host->hostdata);
unsigned long flags;
dprintkl(KERN_DEBUG, "DC395x release\n");
DC395x_LOCK_IO(acb->scsi_host, flags);
chip_shutdown(acb);
adapter_remove_and_free_all_devices(acb);
free_irq(host->irq, acb);
release_region(host->io_port, host->n_io_port);
DC395x_UNLOCK_IO(acb->scsi_host, flags);
}
/* /*
...@@ -5868,15 +5864,15 @@ int __devinit dc395x_init_one(struct pci_dev *dev, ...@@ -5868,15 +5864,15 @@ int __devinit dc395x_init_one(struct pci_dev *dev,
} }
pci_set_master(dev); pci_set_master(dev);
pci_set_drvdata(dev, scsi_host);
/* get the scsi mid level to scan for new devices on the bus */ /* get the scsi mid level to scan for new devices on the bus */
if (scsi_add_host(scsi_host, &dev->dev)) { if (scsi_add_host(scsi_host, &dev->dev)) {
dprintkl(KERN_ERR, "scsi_add_host failed\n"); dprintkl(KERN_ERR, "scsi_add_host failed\n");
host_release(scsi_host); adapter_uninit(acb);
scsi_host_put(scsi_host); scsi_host_put(scsi_host);
return -ENODEV; return -ENODEV;
} }
pci_set_drvdata(dev, scsi_host);
scsi_scan_host(scsi_host); scsi_scan_host(scsi_host);
return 0; return 0;
...@@ -5891,16 +5887,14 @@ int __devinit dc395x_init_one(struct pci_dev *dev, ...@@ -5891,16 +5887,14 @@ int __devinit dc395x_init_one(struct pci_dev *dev,
**/ **/
static void __devexit dc395x_remove_one(struct pci_dev *dev) static void __devexit dc395x_remove_one(struct pci_dev *dev)
{ {
struct Scsi_Host *host = pci_get_drvdata(dev); struct Scsi_Host *scsi_host = pci_get_drvdata(dev);
struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)(scsi_host->hostdata);
dprintkdbg(DBG_0, "Removing instance\n"); dprintkdbg(DBG_0, "Removing instance\n");
if (!host) {
dprintkl(KERN_ERR, "no host allocated\n"); scsi_remove_host(scsi_host);
return; adapter_uninit(acb);
} scsi_host_put(scsi_host);
scsi_remove_host(host);
host_release(host);
scsi_host_put(host);
pci_set_drvdata(dev, NULL); pci_set_drvdata(dev, NULL);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment