Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  1 /*
  2  *    pata_netcell.c - Netcell PATA driver
  3  *
  4  *      (c) 2006 Red Hat  <alan@redhat.com>
  5  */
  6 
  7 #include <linux/kernel.h>
  8 #include <linux/module.h>
  9 #include <linux/pci.h>
 10 #include <linux/init.h>
 11 #include <linux/blkdev.h>
 12 #include <linux/delay.h>
 13 #include <linux/device.h>
 14 #include <scsi/scsi_host.h>
 15 #include <linux/libata.h>
 16 #include <linux/ata.h>
 17 
 18 #define DRV_NAME        "pata_netcell"
 19 #define DRV_VERSION     "0.1.7"
 20 
 21 /* No PIO or DMA methods needed for this device */
 22 
 23 static struct scsi_host_template netcell_sht = {
 24         .module                 = THIS_MODULE,
 25         .name                   = DRV_NAME,
 26         .ioctl                  = ata_scsi_ioctl,
 27         .queuecommand           = ata_scsi_queuecmd,
 28         .can_queue              = ATA_DEF_QUEUE,
 29         .this_id                = ATA_SHT_THIS_ID,
 30         .sg_tablesize           = LIBATA_MAX_PRD,
 31         .cmd_per_lun            = ATA_SHT_CMD_PER_LUN,
 32         .emulated               = ATA_SHT_EMULATED,
 33         .use_clustering         = ATA_SHT_USE_CLUSTERING,
 34         .proc_name              = DRV_NAME,
 35         .dma_boundary           = ATA_DMA_BOUNDARY,
 36         .slave_configure        = ata_scsi_slave_config,
 37         .slave_destroy          = ata_scsi_slave_destroy,
 38         /* Use standard CHS mapping rules */
 39         .bios_param             = ata_std_bios_param,
 40 };
 41 
 42 static const struct ata_port_operations netcell_ops = {
 43         /* Task file is PCI ATA format, use helpers */
 44         .tf_load                = ata_tf_load,
 45         .tf_read                = ata_tf_read,
 46         .check_status           = ata_check_status,
 47         .exec_command           = ata_exec_command,
 48         .dev_select             = ata_std_dev_select,
 49 
 50         .freeze                 = ata_bmdma_freeze,
 51         .thaw                   = ata_bmdma_thaw,
 52         .error_handler          = ata_bmdma_error_handler,
 53         .post_internal_cmd      = ata_bmdma_post_internal_cmd,
 54         .cable_detect           = ata_cable_80wire,
 55 
 56         /* BMDMA handling is PCI ATA format, use helpers */
 57         .bmdma_setup            = ata_bmdma_setup,
 58         .bmdma_start            = ata_bmdma_start,
 59         .bmdma_stop             = ata_bmdma_stop,
 60         .bmdma_status           = ata_bmdma_status,
 61         .qc_prep                = ata_qc_prep,
 62         .qc_issue               = ata_qc_issue_prot,
 63         .data_xfer              = ata_data_xfer,
 64 
 65         /* IRQ-related hooks */
 66         .irq_handler            = ata_interrupt,
 67         .irq_clear              = ata_bmdma_irq_clear,
 68         .irq_on                 = ata_irq_on,
 69 
 70         /* Generic PATA PCI ATA helpers */
 71         .port_start             = ata_sff_port_start,
 72 };
 73 
 74 
 75 /**
 76  *      netcell_init_one - Register Netcell ATA PCI device with kernel services
 77  *      @pdev: PCI device to register
 78  *      @ent: Entry in netcell_pci_tbl matching with @pdev
 79  *
 80  *      Called from kernel PCI layer.
 81  *
 82  *      LOCKING:
 83  *      Inherited from PCI layer (may sleep).
 84  *
 85  *      RETURNS:
 86  *      Zero on success, or -ERRNO value.
 87  */
 88 
 89 static int netcell_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
 90 {
 91         static int printed_version;
 92         static const struct ata_port_info info = {
 93                 .sht            = &netcell_sht,
 94                 .flags          = ATA_FLAG_SLAVE_POSS,
 95                 /* Actually we don't really care about these as the
 96                    firmware deals with it */
 97                 .pio_mask       = 0x1f, /* pio0-4 */
 98                 .mwdma_mask     = 0x07, /* mwdma0-2 */
 99                 .udma_mask      = ATA_UDMA5, /* UDMA 133 */
100                 .port_ops       = &netcell_ops,
101         };
102         const struct ata_port_info *port_info[] = { &info, NULL };
103 
104         if (!printed_version++)
105                 dev_printk(KERN_DEBUG, &pdev->dev,
106                            "version " DRV_VERSION "\n");
107 
108         /* Any chip specific setup/optimisation/messages here */
109         ata_pci_clear_simplex(pdev);
110 
111         /* And let the library code do the work */
112         return ata_pci_init_one(pdev, port_info);
113 }
114 
115 static const struct pci_device_id netcell_pci_tbl[] = {
116         { PCI_VDEVICE(NETCELL, PCI_DEVICE_ID_REVOLUTION), },
117 
118         { }     /* terminate list */
119 };
120 
121 static struct pci_driver netcell_pci_driver = {
122         .name                   = DRV_NAME,
123         .id_table               = netcell_pci_tbl,
124         .probe                  = netcell_init_one,
125         .remove                 = ata_pci_remove_one,
126 #ifdef CONFIG_PM
127         .suspend                = ata_pci_device_suspend,
128         .resume                 = ata_pci_device_resume,
129 #endif
130 };
131 
132 static int __init netcell_init(void)
133 {
134         return pci_register_driver(&netcell_pci_driver);
135 }
136 
137 static void __exit netcell_exit(void)
138 {
139         pci_unregister_driver(&netcell_pci_driver);
140 }
141 
142 module_init(netcell_init);
143 module_exit(netcell_exit);
144 
145 MODULE_AUTHOR("Alan Cox");
146 MODULE_DESCRIPTION("SCSI low-level driver for Netcell PATA RAID");
147 MODULE_LICENSE("GPL");
148 MODULE_DEVICE_TABLE(pci, netcell_pci_tbl);
149 MODULE_VERSION(DRV_VERSION);
150 
151 
  This page was automatically generated by the LXR engine.