1/* 2 * Copyright (C) 2006 Red Hat <evan_ko@phison.com> 3 * 4 * May be copied or modified under the terms of the GNU General Public License 5 * 6 * [Modify History] 7 * #0001, Evan, 2008.10.22, V0.00, New release. 8 * #0002, Evan, 2008.11.01, V0.90, Test Work In Ubuntu Linux 8.04. 9 * #0003, Evan, 2008.01.08, V0.91, Change Name "PCIE-SSD" to "E-BOX". 10 */ 11 12#include <linux/kernel.h> 13#include <linux/module.h> 14#include <linux/pci.h> 15#include <linux/init.h> 16#include <linux/blkdev.h> 17#include <linux/delay.h> 18#include <linux/device.h> 19#include <scsi/scsi_host.h> 20#include <linux/libata.h> 21#include <linux/ata.h> 22 23#define PHISON_DEBUG 24 25#define DRV_NAME "phison_e-box" /* #0003 */ 26#define DRV_VERSION "0.91" /* #0003 */ 27 28#define PCI_VENDOR_ID_PHISON 0x1987 29#define PCI_DEVICE_ID_PS5000 0x5000 30 31static int phison_pre_reset(struct ata_link *link, unsigned long deadline) 32{ 33 int ret; 34 struct ata_port *ap = link->ap; 35 36 ap->cbl = ATA_CBL_NONE; 37 ret = ata_std_prereset(link, deadline); 38 dev_dbg(ap->dev, "phison_pre_reset(), ret = %x\n", ret); 39 return ret; 40} 41 42static struct scsi_host_template phison_sht = { 43 ATA_BMDMA_SHT(DRV_NAME), 44}; 45 46static struct ata_port_operations phison_ops = { 47 .inherits = &ata_bmdma_port_ops, 48 .prereset = phison_pre_reset, 49}; 50 51static int phison_init_one(struct pci_dev *pdev, const struct pci_device_id *id) 52{ 53 int ret; 54 struct ata_port_info info = { 55 .flags = ATA_FLAG_NO_ATAPI, 56 57 .pio_mask = 0x1f, 58 .mwdma_mask = 0x07, 59 .udma_mask = ATA_UDMA5, 60 61 .port_ops = &phison_ops, 62 }; 63 const struct ata_port_info *ppi[] = { &info, NULL }; 64 65 ret = ata_pci_bmdma_init_one(pdev, ppi, &phison_sht, NULL, 0); 66 67 dev_dbg(&pdev->dev, "phison_init_one(), ret = %x\n", ret); 68 69 return ret; 70} 71 72static const struct pci_device_id phison_pci_tbl[] = { 73 { PCI_VENDOR_ID_PHISON, PCI_DEVICE_ID_PS5000, PCI_ANY_ID, PCI_ANY_ID, 74 PCI_CLASS_STORAGE_IDE << 8, 0xffff00, 0 }, 75 { 0, }, 76}; 77MODULE_DEVICE_TABLE(pci, phison_pci_tbl); 78 79static struct pci_driver phison_pci_driver = { 80 .name = DRV_NAME, 81 .id_table = phison_pci_tbl, 82 .probe = phison_init_one, 83 .remove = ata_pci_remove_one, 84#ifdef CONFIG_PM /* haven't tested it. */ 85 .suspend = ata_pci_device_suspend, 86 .resume = ata_pci_device_resume, 87#endif 88}; 89 90static int __init phison_ide_init(void) 91{ 92 return pci_register_driver(&phison_pci_driver); 93} 94 95static void __exit phison_ide_exit(void) 96{ 97 pci_unregister_driver(&phison_pci_driver); 98} 99 100module_init(phison_ide_init); 101module_exit(phison_ide_exit); 102 103MODULE_AUTHOR("Evan Ko"); 104MODULE_DESCRIPTION("PCIE driver module for PHISON PS5000 E-BOX"); 105MODULE_LICENSE("GPL"); 106MODULE_VERSION(DRV_VERSION); 107