Version:  2.0.40 2.2.26 2.4.37 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11 3.12 3.13 3.14 3.15 3.16 3.17

Linux/drivers/ide/rz1000.c

  1 /*
  2  *  Copyright (C) 1995-1998  Linus Torvalds & author (see below)
  3  */
  4 
  5 /*
  6  *  Principal Author:  mlord@pobox.com (Mark Lord)
  7  *
  8  *  See linux/MAINTAINERS for address of current maintainer.
  9  *
 10  *  This file provides support for disabling the buggy read-ahead
 11  *  mode of the RZ1000 IDE chipset, commonly used on Intel motherboards.
 12  *
 13  *  Dunno if this fixes both ports, or only the primary port (?).
 14  */
 15 
 16 #include <linux/types.h>
 17 #include <linux/module.h>
 18 #include <linux/kernel.h>
 19 #include <linux/pci.h>
 20 #include <linux/ide.h>
 21 #include <linux/init.h>
 22 
 23 #define DRV_NAME "rz1000"
 24 
 25 static int rz1000_disable_readahead(struct pci_dev *dev)
 26 {
 27         u16 reg;
 28 
 29         if (!pci_read_config_word (dev, 0x40, &reg) &&
 30             !pci_write_config_word(dev, 0x40, reg & 0xdfff)) {
 31                 printk(KERN_INFO "%s: disabled chipset read-ahead "
 32                         "(buggy RZ1000/RZ1001)\n", pci_name(dev));
 33                 return 0;
 34         } else {
 35                 printk(KERN_INFO "%s: serialized, disabled unmasking "
 36                         "(buggy RZ1000/RZ1001)\n", pci_name(dev));
 37                 return 1;
 38         }
 39 }
 40 
 41 static const struct ide_port_info rz1000_chipset = {
 42         .name           = DRV_NAME,
 43         .host_flags     = IDE_HFLAG_NO_DMA,
 44 };
 45 
 46 static int rz1000_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 47 {
 48         struct ide_port_info d = rz1000_chipset;
 49         int rc;
 50 
 51         rc = pci_enable_device(dev);
 52         if (rc)
 53                 return rc;
 54 
 55         if (rz1000_disable_readahead(dev)) {
 56                 d.host_flags |= IDE_HFLAG_SERIALIZE;
 57                 d.host_flags |= IDE_HFLAG_NO_UNMASK_IRQS;
 58         }
 59 
 60         return ide_pci_init_one(dev, &d, NULL);
 61 }
 62 
 63 static void rz1000_remove(struct pci_dev *dev)
 64 {
 65         ide_pci_remove(dev);
 66         pci_disable_device(dev);
 67 }
 68 
 69 static const struct pci_device_id rz1000_pci_tbl[] = {
 70         { PCI_VDEVICE(PCTECH, PCI_DEVICE_ID_PCTECH_RZ1000), 0 },
 71         { PCI_VDEVICE(PCTECH, PCI_DEVICE_ID_PCTECH_RZ1001), 0 },
 72         { 0, },
 73 };
 74 MODULE_DEVICE_TABLE(pci, rz1000_pci_tbl);
 75 
 76 static struct pci_driver rz1000_pci_driver = {
 77         .name           = "RZ1000_IDE",
 78         .id_table       = rz1000_pci_tbl,
 79         .probe          = rz1000_init_one,
 80         .remove         = rz1000_remove,
 81 };
 82 
 83 static int __init rz1000_ide_init(void)
 84 {
 85         return ide_pci_register_driver(&rz1000_pci_driver);
 86 }
 87 
 88 static void __exit rz1000_ide_exit(void)
 89 {
 90         pci_unregister_driver(&rz1000_pci_driver);
 91 }
 92 
 93 module_init(rz1000_ide_init);
 94 module_exit(rz1000_ide_exit);
 95 
 96 MODULE_AUTHOR("Andre Hedrick");
 97 MODULE_DESCRIPTION("PCI driver module for RZ1000 IDE");
 98 MODULE_LICENSE("GPL");
 99 
100 

This page was automatically generated by LXR 0.3.1 (source).  •  Linux is a registered trademark of Linus Torvalds  •  Contact us