2     dmx3191d.c - driver for the Domex DMX3191D SCSI card.
 
   3     Copyright (C) 2000 by Massimo Piccioni <dafastidio@libero.it>
 
   4     Portions Copyright (C) 2004 by Christoph Hellwig <hch@lst.de>
 
   6     Based on the generic NCR5380 driver by Drew Eckhardt et al.
 
   8     This program is free software; you can redistribute it and/or modify
 
   9     it under the terms of the GNU General Public License as published by
 
  10     the Free Software Foundation; either version 2 of the License, or
 
  11     (at your option) any later version.
 
  13     This program is distributed in the hope that it will be useful,
 
  14     but WITHOUT ANY WARRANTY; without even the implied warranty of
 
  15     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
  16     GNU General Public License for more details.
 
  18     You should have received a copy of the GNU General Public License
 
  19     along with this program; if not, write to the Free Software
 
  20     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
  23 #include <linux/init.h>
 
  24 #include <linux/ioport.h>
 
  25 #include <linux/kernel.h>
 
  26 #include <linux/module.h>
 
  27 #include <linux/pci.h>
 
  28 #include <linux/interrupt.h>
 
  31 #include <scsi/scsi_host.h>
 
  34  * Defintions for the generic 5380 driver.
 
  38 #define NCR5380_read(reg)               inb(port + reg)
 
  39 #define NCR5380_write(reg, value)       outb(value, port + reg)
 
  41 #define NCR5380_implementation_fields   unsigned int port
 
  42 #define NCR5380_local_declare()         NCR5380_implementation_fields
 
  43 #define NCR5380_setup(instance)         port = instance->io_port
 
  46  * Includes needed for NCR5380.[ch] (XXX: Move them to NCR5380.h)
 
  48 #include <linux/delay.h>
 
  54 #define DMX3191D_DRIVER_NAME    "dmx3191d"
 
  55 #define DMX3191D_REGION_LEN     8
 
  58 static struct scsi_host_template dmx3191d_driver_template = {
 
  59         .proc_name              = DMX3191D_DRIVER_NAME,
 
  60         .name                   = "Domex DMX3191D",
 
  61         .queuecommand           = NCR5380_queue_command,
 
  62         .eh_abort_handler       = NCR5380_abort,
 
  63         .eh_bus_reset_handler   = NCR5380_bus_reset,
 
  66         .sg_tablesize           = SG_ALL,
 
  68         .use_clustering         = DISABLE_CLUSTERING,
 
  71 static int __devinit dmx3191d_probe_one(struct pci_dev *pdev,
 
  72                 const struct pci_device_id *id)
 
  74         struct Scsi_Host *shost;
 
  78         if (pci_enable_device(pdev))
 
  81         io = pci_resource_start(pdev, 0);
 
  82         if (!request_region(io, DMX3191D_REGION_LEN, DMX3191D_DRIVER_NAME)) {
 
  83                 printk(KERN_ERR "dmx3191: region 0x%lx-0x%lx already reserved\n",
 
  84                                 io, io + DMX3191D_REGION_LEN);
 
  85                 goto out_disable_device;
 
  88         shost = scsi_host_alloc(&dmx3191d_driver_template,
 
  89                         sizeof(struct NCR5380_hostdata));
 
  91                 goto out_release_region;       
 
  93         shost->irq = pdev->irq;
 
  95         NCR5380_init(shost, FLAG_NO_PSEUDO_DMA | FLAG_DTC3181E);
 
  97         if (request_irq(pdev->irq, NCR5380_intr, SA_SHIRQ,
 
  98                                 DMX3191D_DRIVER_NAME, shost)) {
 
 100                  * Steam powered scsi controllers run without an IRQ anyway
 
 102                 printk(KERN_WARNING "dmx3191: IRQ %d not available - "
 
 103                                     "switching to polled mode.\n", pdev->irq);
 
 104                 shost->irq = SCSI_IRQ_NONE;
 
 107         pci_set_drvdata(pdev, shost);
 
 109         error = scsi_add_host(shost, &pdev->dev);
 
 113         scsi_scan_host(shost);
 
 117         free_irq(shost->irq, shost);
 
 119         release_region(shost->io_port, DMX3191D_REGION_LEN);
 
 121         pci_disable_device(pdev);
 
 126 static void __devexit dmx3191d_remove_one(struct pci_dev *pdev)
 
 128         struct Scsi_Host *shost = pci_get_drvdata(pdev);
 
 130         scsi_remove_host(shost);
 
 134         if (shost->irq != SCSI_IRQ_NONE)
 
 135                 free_irq(shost->irq, shost);
 
 136         release_region(shost->io_port, DMX3191D_REGION_LEN);
 
 137         pci_disable_device(pdev);
 
 139         scsi_host_put(shost);
 
 142 static struct pci_device_id dmx3191d_pci_tbl[] = {
 
 143         {PCI_VENDOR_ID_DOMEX, PCI_DEVICE_ID_DOMEX_DMX3191D,
 
 144                 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 4},
 
 147 MODULE_DEVICE_TABLE(pci, dmx3191d_pci_tbl);
 
 149 static struct pci_driver dmx3191d_pci_driver = {
 
 150         .name           = DMX3191D_DRIVER_NAME,
 
 151         .id_table       = dmx3191d_pci_tbl,
 
 152         .probe          = dmx3191d_probe_one,
 
 153         .remove         = __devexit_p(dmx3191d_remove_one),
 
 156 static int __init dmx3191d_init(void)
 
 158         return pci_module_init(&dmx3191d_pci_driver);
 
 161 static void __exit dmx3191d_exit(void)
 
 163         pci_unregister_driver(&dmx3191d_pci_driver);
 
 166 module_init(dmx3191d_init);
 
 167 module_exit(dmx3191d_exit);
 
 169 MODULE_AUTHOR("Massimo Piccioni <dafastidio@libero.it>");
 
 170 MODULE_DESCRIPTION("Domex DMX3191D SCSI driver");
 
 171 MODULE_LICENSE("GPL");