Blame view
drivers/ata/pata_netcell.c
2.8 KB
669a5db41
|
1 2 3 |
/* * pata_netcell.c - Netcell PATA driver * |
ab7716300
|
4 |
* (c) 2006 Red Hat |
669a5db41
|
5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
*/ #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 |
/* No PIO or DMA methods needed for this device */ |
d3ae33efb
|
22 23 24 25 26 27 |
static unsigned int netcell_read_id(struct ata_device *adev, struct ata_taskfile *tf, u16 *id) { unsigned int err_mask = ata_do_dev_read_id(adev, tf, id); /* Firmware forgets to mark words 85-87 valid */ if (err_mask == 0) |
5284c6b99
|
28 |
id[ATA_ID_CSF_DEFAULT] |= 0x4000; |
d3ae33efb
|
29 30 |
return err_mask; } |
669a5db41
|
31 |
static struct scsi_host_template netcell_sht = { |
68d1d07b5
|
32 |
ATA_BMDMA_SHT(DRV_NAME), |
669a5db41
|
33 |
}; |
029cfd6b7
|
34 35 |
static struct ata_port_operations netcell_ops = { .inherits = &ata_bmdma_port_ops, |
d3ae33efb
|
36 37 |
.cable_detect = ata_cable_80wire, .read_id = netcell_read_id, |
669a5db41
|
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
}; /** * 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) { |
1626aeb88
|
57 |
static const struct ata_port_info info = { |
1d2808fd3
|
58 |
.flags = ATA_FLAG_SLAVE_POSS, |
669a5db41
|
59 60 |
/* Actually we don't really care about these as the firmware deals with it */ |
14bdef982
|
61 62 |
.pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA2, |
bf6263a85
|
63 |
.udma_mask = ATA_UDMA5, /* UDMA 133 */ |
669a5db41
|
64 65 |
.port_ops = &netcell_ops, }; |
1626aeb88
|
66 |
const struct ata_port_info *port_info[] = { &info, NULL }; |
f08048e94
|
67 |
int rc; |
669a5db41
|
68 |
|
06296a1e6
|
69 |
ata_print_version_once(&pdev->dev, DRV_VERSION); |
669a5db41
|
70 |
|
f08048e94
|
71 72 73 |
rc = pcim_enable_device(pdev); if (rc) return rc; |
669a5db41
|
74 |
/* Any chip specific setup/optimisation/messages here */ |
9363c3825
|
75 |
ata_pci_bmdma_clear_simplex(pdev); |
85cd7251b
|
76 |
|
669a5db41
|
77 |
/* And let the library code do the work */ |
1c5afdf7a
|
78 |
return ata_pci_bmdma_init_one(pdev, port_info, &netcell_sht, NULL, 0); |
669a5db41
|
79 80 81 |
} static const struct pci_device_id netcell_pci_tbl[] = { |
2d2744fc8
|
82 |
{ PCI_VDEVICE(NETCELL, PCI_DEVICE_ID_REVOLUTION), }, |
669a5db41
|
83 84 85 86 87 88 89 90 |
{ } /* 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
|
91 |
#ifdef CONFIG_PM |
30ced0f0d
|
92 93 |
.suspend = ata_pci_device_suspend, .resume = ata_pci_device_resume, |
438ac6d5e
|
94 |
#endif |
669a5db41
|
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
}; 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); |