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