Blame view

drivers/ata/pata_rz1000.c 3.97 KB
669a5db41   Jeff Garzik   [libata] Add a bu...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  /*
   *  RZ1000/1001 driver based upon
   *
   *  linux/drivers/ide/pci/rz1000.c	Version 0.06	January 12, 2003
   *  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.
   */
  
  #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 <scsi/scsi_host.h>
  #include <linux/libata.h>
  
  #define DRV_NAME	"pata_rz1000"
8bc3fc470   Jeff Garzik   libata: bump vers...
24
  #define DRV_VERSION	"0.2.4"
669a5db41   Jeff Garzik   [libata] Add a bu...
25
26
27
  
  
  /**
669a5db41   Jeff Garzik   [libata] Add a bu...
28
   *	rz1000_set_mode		-	mode setting function
0260731f0   Tejun Heo   libata-link: link...
29
   *	@link: ATA link
b229a7b0a   Alan Cox   libata: set_mode,...
30
   *	@unused: returned device on set_mode failure
669a5db41   Jeff Garzik   [libata] Add a bu...
31
32
33
34
35
   *
   *	Use a non standard set_mode function. We don't want to be tuned. We
   *	would prefer to be BIOS generic but for the fact our hardware is
   *	whacked out.
   */
0260731f0   Tejun Heo   libata-link: link...
36
  static int rz1000_set_mode(struct ata_link *link, struct ata_device **unused)
669a5db41   Jeff Garzik   [libata] Add a bu...
37
  {
f58229f80   Tejun Heo   libata-link: impl...
38
  	struct ata_device *dev;
669a5db41   Jeff Garzik   [libata] Add a bu...
39

1eca4365b   Tejun Heo   libata: beef up i...
40
41
42
43
44
45
  	ata_for_each_dev(dev, link, ENABLED) {
  		/* We don't really care */
  		dev->pio_mode = XFER_PIO_0;
  		dev->xfer_mode = XFER_PIO_0;
  		dev->xfer_shift = ATA_SHIFT_PIO;
  		dev->flags |= ATA_DFLAG_PIO;
a9a79dfec   Joe Perches   ata: Convert ata_...
46
47
  		ata_dev_info(dev, "configured for PIO
  ");
669a5db41   Jeff Garzik   [libata] Add a bu...
48
  	}
b229a7b0a   Alan Cox   libata: set_mode,...
49
  	return 0;
669a5db41   Jeff Garzik   [libata] Add a bu...
50
51
52
53
  }
  
  
  static struct scsi_host_template rz1000_sht = {
68d1d07b5   Tejun Heo   libata: implement...
54
  	ATA_PIO_SHT(DRV_NAME),
669a5db41   Jeff Garzik   [libata] Add a bu...
55
56
57
  };
  
  static struct ata_port_operations rz1000_port_ops = {
029cfd6b7   Tejun Heo   libata: implement...
58
  	.inherits	= &ata_sff_port_ops,
2a25dfe4f   Alan Cox   pata_rz1000: supp...
59
  	.cable_detect	= ata_cable_40wire,
029cfd6b7   Tejun Heo   libata: implement...
60
  	.set_mode	= rz1000_set_mode,
669a5db41   Jeff Garzik   [libata] Add a bu...
61
  };
ad4a42d28   Alan Cox   [PATCH] pata_rz10...
62
63
64
65
66
67
68
69
70
71
72
73
74
  static int rz1000_fifo_disable(struct pci_dev *pdev)
  {
  	u16 reg;
  	/* Be exceptionally paranoid as we must be sure to apply the fix */
  	if (pci_read_config_word(pdev, 0x40, &reg) != 0)
  		return -1;
  	reg &= 0xDFFF;
  	if (pci_write_config_word(pdev, 0x40, reg) != 0)
  		return -1;
  	printk(KERN_INFO DRV_NAME ": disabled chipset readahead.
  ");
  	return 0;
  }
669a5db41   Jeff Garzik   [libata] Add a bu...
75
76
77
78
79
80
81
82
83
84
85
86
  /**
   *	rz1000_init_one - Register RZ1000 ATA PCI device with kernel services
   *	@pdev: PCI device to register
   *	@ent: Entry in rz1000_pci_tbl matching with @pdev
   *
   *	Configure an RZ1000 interface. This doesn't require much special
   *	handling except that we *MUST* kill the chipset readahead or the
   *	user may experience data corruption.
   */
  
  static int rz1000_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
  {
1626aeb88   Tejun Heo   libata: clean up ...
87
  	static const struct ata_port_info info = {
1d2808fd3   Jeff Garzik   [libata] PATA dri...
88
  		.flags = ATA_FLAG_SLAVE_POSS,
14bdef982   Erik Inge Bolsø   [libata] convert ...
89
  		.pio_mask = ATA_PIO4,
669a5db41   Jeff Garzik   [libata] Add a bu...
90
91
  		.port_ops = &rz1000_port_ops
  	};
1626aeb88   Tejun Heo   libata: clean up ...
92
  	const struct ata_port_info *ppi[] = { &info, NULL };
669a5db41   Jeff Garzik   [libata] Add a bu...
93

06296a1e6   Joe Perches   ata: Add and use ...
94
  	ata_print_version_once(&pdev->dev, DRV_VERSION);
669a5db41   Jeff Garzik   [libata] Add a bu...
95

1626aeb88   Tejun Heo   libata: clean up ...
96
  	if (rz1000_fifo_disable(pdev) == 0)
16ea0fc98   Alan Cox   libata: Pass host...
97
  		return ata_pci_sff_init_one(pdev, ppi, &rz1000_sht, NULL, 0);
1626aeb88   Tejun Heo   libata: clean up ...
98

669a5db41   Jeff Garzik   [libata] Add a bu...
99
100
101
102
103
  	printk(KERN_ERR DRV_NAME ": failed to disable read-ahead on chipset..
  ");
  	/* Not safe to use so skip */
  	return -ENODEV;
  }
438ac6d5e   Tejun Heo   libata: add missi...
104
  #ifdef CONFIG_PM
ad4a42d28   Alan Cox   [PATCH] pata_rz10...
105
106
  static int rz1000_reinit_one(struct pci_dev *pdev)
  {
0826ef5f6   Bartlomiej Zolnierkiewicz   pata_rz1000: Powe...
107
108
109
110
111
112
  	struct ata_host *host = dev_get_drvdata(&pdev->dev);
  	int rc;
  
  	rc = ata_pci_device_do_resume(pdev);
  	if (rc)
  		return rc;
25985edce   Lucas De Marchi   Fix common misspe...
113
  	/* If this fails on resume (which is a "can't happen" case), we
ad4a42d28   Alan Cox   [PATCH] pata_rz10...
114
115
116
  	   must stop as any progress risks data loss */
  	if (rz1000_fifo_disable(pdev))
  		panic("rz1000 fifo");
0826ef5f6   Bartlomiej Zolnierkiewicz   pata_rz1000: Powe...
117
118
119
  
  	ata_host_resume(host);
  	return 0;
ad4a42d28   Alan Cox   [PATCH] pata_rz10...
120
  }
438ac6d5e   Tejun Heo   libata: add missi...
121
  #endif
ad4a42d28   Alan Cox   [PATCH] pata_rz10...
122

2d2744fc8   Jeff Garzik   [libata] PCI ID t...
123
124
125
126
127
  static const struct pci_device_id pata_rz1000[] = {
  	{ PCI_VDEVICE(PCTECH, PCI_DEVICE_ID_PCTECH_RZ1000), },
  	{ PCI_VDEVICE(PCTECH, PCI_DEVICE_ID_PCTECH_RZ1001), },
  
  	{ },
669a5db41   Jeff Garzik   [libata] Add a bu...
128
129
130
  };
  
  static struct pci_driver rz1000_pci_driver = {
2d2744fc8   Jeff Garzik   [libata] PCI ID t...
131
  	.name 		= DRV_NAME,
669a5db41   Jeff Garzik   [libata] Add a bu...
132
133
  	.id_table	= pata_rz1000,
  	.probe 		= rz1000_init_one,
ad4a42d28   Alan Cox   [PATCH] pata_rz10...
134
  	.remove		= ata_pci_remove_one,
438ac6d5e   Tejun Heo   libata: add missi...
135
  #ifdef CONFIG_PM
ad4a42d28   Alan Cox   [PATCH] pata_rz10...
136
137
  	.suspend	= ata_pci_device_suspend,
  	.resume		= rz1000_reinit_one,
438ac6d5e   Tejun Heo   libata: add missi...
138
  #endif
669a5db41   Jeff Garzik   [libata] Add a bu...
139
  };
669a5db41   Jeff Garzik   [libata] Add a bu...
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
  static int __init rz1000_init(void)
  {
  	return pci_register_driver(&rz1000_pci_driver);
  }
  
  static void __exit rz1000_exit(void)
  {
  	pci_unregister_driver(&rz1000_pci_driver);
  }
  
  MODULE_AUTHOR("Alan Cox");
  MODULE_DESCRIPTION("low-level driver for RZ1000 PCI ATA");
  MODULE_LICENSE("GPL");
  MODULE_DEVICE_TABLE(pci, pata_rz1000);
  MODULE_VERSION(DRV_VERSION);
  
  module_init(rz1000_init);
  module_exit(rz1000_exit);