2005-04-17 02:20:36 +04:00
/*
* Copyright ( C ) 1995 - 1998 Linus Torvalds & author ( see below )
*/
/*
* Principal Author : mlord @ pobox . com ( Mark Lord )
*
* See linux / MAINTAINERS for address of current maintainer .
*
* This file provides support for disabling the buggy read - ahead
* mode of the RZ1000 IDE chipset , commonly used on Intel motherboards .
*
* Dunno if this fixes both ports , or only the primary port ( ? ) .
*/
# include <linux/types.h>
# include <linux/module.h>
# include <linux/kernel.h>
# include <linux/hdreg.h>
# include <linux/pci.h>
# include <linux/ide.h>
# include <linux/init.h>
static void __devinit init_hwif_rz1000 ( ide_hwif_t * hwif )
{
2008-02-02 01:09:31 +03:00
struct pci_dev * dev = to_pci_dev ( hwif - > dev ) ;
2005-04-17 02:20:36 +04:00
u16 reg ;
if ( ! pci_read_config_word ( dev , 0x40 , & reg ) & &
! pci_write_config_word ( dev , 0x40 , reg & 0xdfff ) ) {
printk ( KERN_INFO " %s: disabled chipset read-ahead "
" (buggy RZ1000/RZ1001) \n " , hwif - > name ) ;
} else {
2007-10-20 02:32:29 +04:00
if ( hwif - > mate )
hwif - > mate - > serialized = hwif - > serialized = 1 ;
2008-02-02 21:56:40 +03:00
hwif - > host_flags | = IDE_HFLAG_NO_UNMASK_IRQS ;
2005-04-17 02:20:36 +04:00
printk ( KERN_INFO " %s: serialized, disabled unmasking "
" (buggy RZ1000/RZ1001) \n " , hwif - > name ) ;
}
}
2007-10-20 02:32:34 +04:00
static const struct ide_port_info rz1000_chipset __devinitdata = {
2005-04-17 02:20:36 +04:00
. name = " RZ100x " ,
. init_hwif = init_hwif_rz1000 ,
2007-10-20 02:32:30 +04:00
. chipset = ide_rz1000 ,
2008-04-26 19:36:35 +04:00
. host_flags = IDE_HFLAG_NO_DMA ,
2005-04-17 02:20:36 +04:00
} ;
static int __devinit rz1000_init_one ( struct pci_dev * dev , const struct pci_device_id * id )
{
2008-07-25 00:53:14 +04:00
return ide_pci_init_one ( dev , & rz1000_chipset , NULL ) ;
2005-04-17 02:20:36 +04:00
}
2007-10-17 00:29:56 +04:00
static const struct pci_device_id rz1000_pci_tbl [ ] = {
{ PCI_VDEVICE ( PCTECH , PCI_DEVICE_ID_PCTECH_RZ1000 ) , 0 } ,
{ PCI_VDEVICE ( PCTECH , PCI_DEVICE_ID_PCTECH_RZ1001 ) , 0 } ,
2005-04-17 02:20:36 +04:00
{ 0 , } ,
} ;
MODULE_DEVICE_TABLE ( pci , rz1000_pci_tbl ) ;
static struct pci_driver driver = {
. name = " RZ1000_IDE " ,
. id_table = rz1000_pci_tbl ,
. probe = rz1000_init_one ,
2008-07-25 00:53:24 +04:00
. remove = ide_pci_remove ,
2005-04-17 02:20:36 +04:00
} ;
2007-01-27 15:46:56 +03:00
static int __init rz1000_ide_init ( void )
2005-04-17 02:20:36 +04:00
{
return ide_pci_register_driver ( & driver ) ;
}
2008-07-25 00:53:24 +04:00
static void __exit rz1000_ide_exit ( void )
{
pci_unregister_driver ( & driver ) ;
}
2005-04-17 02:20:36 +04:00
module_init ( rz1000_ide_init ) ;
2008-07-25 00:53:24 +04:00
module_exit ( rz1000_ide_exit ) ;
2005-04-17 02:20:36 +04:00
MODULE_AUTHOR ( " Andre Hedrick " ) ;
MODULE_DESCRIPTION ( " PCI driver module for RZ1000 IDE " ) ;
MODULE_LICENSE ( " GPL " ) ;