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/pci.h>
# include <linux/ide.h>
# include <linux/init.h>
2008-07-25 00:53:32 +04:00
# define DRV_NAME "rz1000"
2012-12-22 01:21:03 +04:00
static int rz1000_disable_readahead ( struct pci_dev * 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 "
2008-12-29 22:27:33 +03:00
" (buggy RZ1000/RZ1001) \n " , pci_name ( dev ) ) ;
return 0 ;
2005-04-17 02:20:36 +04:00
} else {
printk ( KERN_INFO " %s: serialized, disabled unmasking "
2008-12-29 22:27:33 +03:00
" (buggy RZ1000/RZ1001) \n " , pci_name ( dev ) ) ;
return 1 ;
2005-04-17 02:20:36 +04:00
}
}
2012-12-22 01:21:03 +04:00
static const struct ide_port_info rz1000_chipset = {
2008-07-25 00:53:32 +04:00
. name = DRV_NAME ,
2008-04-26 19:36:35 +04:00
. host_flags = IDE_HFLAG_NO_DMA ,
2005-04-17 02:20:36 +04:00
} ;
2012-12-22 01:21:03 +04:00
static int rz1000_init_one ( struct pci_dev * dev , const struct pci_device_id * id )
2005-04-17 02:20:36 +04:00
{
2008-12-29 22:27:33 +03:00
struct ide_port_info d = rz1000_chipset ;
int rc ;
rc = pci_enable_device ( dev ) ;
if ( rc )
return rc ;
if ( rz1000_disable_readahead ( dev ) ) {
d . host_flags | = IDE_HFLAG_SERIALIZE ;
d . host_flags | = IDE_HFLAG_NO_UNMASK_IRQS ;
}
return ide_pci_init_one ( dev , & d , NULL ) ;
}
static void rz1000_remove ( struct pci_dev * dev )
{
ide_pci_remove ( dev ) ;
pci_disable_device ( dev ) ;
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 ) ;
2008-10-13 23:39:41 +04:00
static struct pci_driver rz1000_pci_driver = {
2005-04-17 02:20:36 +04:00
. name = " RZ1000_IDE " ,
. id_table = rz1000_pci_tbl ,
. probe = rz1000_init_one ,
2008-12-29 22:27:33 +03:00
. remove = rz1000_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
{
2008-10-13 23:39:41 +04:00
return ide_pci_register_driver ( & rz1000_pci_driver ) ;
2005-04-17 02:20:36 +04:00
}
2008-07-25 00:53:24 +04:00
static void __exit rz1000_ide_exit ( void )
{
2008-10-13 23:39:41 +04:00
pci_unregister_driver ( & rz1000_pci_driver ) ;
2008-07-25 00:53:24 +04:00
}
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 " ) ;