Blame view

drivers/ata/sata_promise.c 33.9 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
  /*
   *  sata_promise.c - Promise SATA
   *
   *  Maintained by:  Jeff Garzik <jgarzik@pobox.com>
5595ddf98   Mikael Pettersson   sata_promise: cle...
5
   *		    Mikael Pettersson <mikpe@it.uu.se>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6
7
8
9
10
   *  		    Please ALWAYS copy linux-ide@vger.kernel.org
   *		    on emails.
   *
   *  Copyright 2003-2004 Red Hat, Inc.
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
11
   *
af36d7f0d   Jeff Garzik   [libata] license ...
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
   *  This program is free software; you can redistribute it and/or modify
   *  it under the terms of the GNU General Public License as published by
   *  the Free Software Foundation; either version 2, or (at your option)
   *  any later version.
   *
   *  This program is distributed in the hope that it will be useful,
   *  but WITHOUT ANY WARRANTY; without even the implied warranty of
   *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   *  GNU General Public License for more details.
   *
   *  You should have received a copy of the GNU General Public License
   *  along with this program; see the file COPYING.  If not, write to
   *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
   *
   *
   *  libata documentation is available via 'make {ps|pdf}docs',
   *  as Documentation/DocBook/libata.*
   *
   *  Hardware information only available under NDA.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
31
32
33
34
35
   *
   */
  
  #include <linux/kernel.h>
  #include <linux/module.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
36
  #include <linux/gfp.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
37
38
39
40
41
  #include <linux/pci.h>
  #include <linux/init.h>
  #include <linux/blkdev.h>
  #include <linux/delay.h>
  #include <linux/interrupt.h>
a9524a76f   Jeff Garzik   [libata] use dev_...
42
  #include <linux/device.h>
95006188c   Mikael Pettersson   sata_promise: ATA...
43
  #include <scsi/scsi.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
44
  #include <scsi/scsi_host.h>
193515d51   Jeff Garzik   [libata] eliminat...
45
  #include <scsi/scsi_cmnd.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
46
  #include <linux/libata.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
47
48
49
  #include "sata_promise.h"
  
  #define DRV_NAME	"sata_promise"
c07a9c499   Mikael Pettersson   sata_promise: fix...
50
  #define DRV_VERSION	"2.12"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
51
52
  
  enum {
eca25dca1   Tejun Heo   libata: convert d...
53
  	PDC_MAX_PORTS		= 4,
0d5ff5667   Tejun Heo   libata: convert t...
54
  	PDC_MMIO_BAR		= 3,
b9ccd4a90   Mikael Pettersson   sata_promise: ASI...
55
  	PDC_MAX_PRD		= LIBATA_MAX_PRD - 1, /* -1 for ASIC PRD bug workaround */
0d5ff5667   Tejun Heo   libata: convert t...
56

821d22cdc   Mikael Pettersson   sata_promise: mmi...
57
58
59
  	/* host register offsets (from host->iomap[PDC_MMIO_BAR]) */
  	PDC_INT_SEQMASK		= 0x40,	/* Mask of asserted SEQ INTs */
  	PDC_FLASH_CTL		= 0x44, /* Flash control register */
ff7cddf59   Mikael Pettersson   sata_promise: upd...
60
  	PDC_PCI_CTL		= 0x48, /* PCI control/status reg */
821d22cdc   Mikael Pettersson   sata_promise: mmi...
61
62
63
64
65
66
  	PDC_SATA_PLUG_CSR	= 0x6C, /* SATA Plug control/status reg */
  	PDC2_SATA_PLUG_CSR	= 0x60, /* SATAII Plug control/status reg */
  	PDC_TBG_MODE		= 0x41C, /* TBG mode (not SATAII) */
  	PDC_SLEW_CTL		= 0x470, /* slew rate control reg (not SATAII) */
  
  	/* per-port ATA register offsets (from ap->ioaddr.cmd_addr) */
95006188c   Mikael Pettersson   sata_promise: ATA...
67
68
69
70
71
72
73
  	PDC_FEATURE		= 0x04, /* Feature/Error reg (per port) */
  	PDC_SECTOR_COUNT	= 0x08, /* Sector count reg (per port) */
  	PDC_SECTOR_NUMBER	= 0x0C, /* Sector number reg (per port) */
  	PDC_CYLINDER_LOW	= 0x10, /* Cylinder low reg (per port) */
  	PDC_CYLINDER_HIGH	= 0x14, /* Cylinder high reg (per port) */
  	PDC_DEVICE		= 0x18, /* Device/Head reg (per port) */
  	PDC_COMMAND		= 0x1C, /* Command/status reg (per port) */
73fd456b2   Mikael Pettersson   sata_promise: ATA...
74
  	PDC_ALTSTATUS		= 0x38, /* Alternate-status/device-control reg (per port) */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
75
  	PDC_PKT_SUBMIT		= 0x40, /* Command packet pointer addr */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
76
77
  	PDC_GLOBAL_CTL		= 0x48, /* Global control/status (per port) */
  	PDC_CTLSTAT		= 0x60,	/* IDE control and status (per port) */
821d22cdc   Mikael Pettersson   sata_promise: mmi...
78
79
  
  	/* per-port SATA register offsets (from ap->ioaddr.scr_addr) */
ff7cddf59   Mikael Pettersson   sata_promise: upd...
80
  	PDC_SATA_ERROR		= 0x04,
821d22cdc   Mikael Pettersson   sata_promise: mmi...
81
  	PDC_PHYMODE4		= 0x14,
ff7cddf59   Mikael Pettersson   sata_promise: upd...
82
83
84
85
86
87
88
89
90
  	PDC_LINK_LAYER_ERRORS	= 0x6C,
  	PDC_FPDMA_CTLSTAT	= 0xD8,
  	PDC_INTERNAL_DEBUG_1	= 0xF8,	/* also used for PATA */
  	PDC_INTERNAL_DEBUG_2	= 0xFC,	/* also used for PATA */
  
  	/* PDC_FPDMA_CTLSTAT bit definitions */
  	PDC_FPDMA_CTLSTAT_RESET			= 1 << 3,
  	PDC_FPDMA_CTLSTAT_DMASETUP_INT_FLAG	= 1 << 10,
  	PDC_FPDMA_CTLSTAT_SETDB_INT_FLAG	= 1 << 11,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
91

176efb054   Mikael Pettersson   sata_promise: dec...
92
93
94
95
96
97
98
99
100
101
102
103
104
  	/* PDC_GLOBAL_CTL bit definitions */
  	PDC_PH_ERR		= (1 <<  8), /* PCI error while loading packet */
  	PDC_SH_ERR		= (1 <<  9), /* PCI error while loading S/G table */
  	PDC_DH_ERR		= (1 << 10), /* PCI error while loading data */
  	PDC2_HTO_ERR		= (1 << 12), /* host bus timeout */
  	PDC2_ATA_HBA_ERR	= (1 << 13), /* error during SATA DATA FIS transmission */
  	PDC2_ATA_DMA_CNT_ERR	= (1 << 14), /* DMA DATA FIS size differs from S/G count */
  	PDC_OVERRUN_ERR		= (1 << 19), /* S/G byte count larger than HD requires */
  	PDC_UNDERRUN_ERR	= (1 << 20), /* S/G byte count less than HD requires */
  	PDC_DRIVE_ERR		= (1 << 21), /* drive error */
  	PDC_PCI_SYS_ERR		= (1 << 22), /* PCI system error */
  	PDC1_PCI_PARITY_ERR	= (1 << 23), /* PCI parity error (from SATA150 driver) */
  	PDC1_ERR_MASK		= PDC1_PCI_PARITY_ERR,
5796d1c4c   Jeff Garzik   [libata] Address ...
105
106
107
108
109
110
  	PDC2_ERR_MASK		= PDC2_HTO_ERR | PDC2_ATA_HBA_ERR |
  				  PDC2_ATA_DMA_CNT_ERR,
  	PDC_ERR_MASK		= PDC_PH_ERR | PDC_SH_ERR | PDC_DH_ERR |
  				  PDC_OVERRUN_ERR | PDC_UNDERRUN_ERR |
  				  PDC_DRIVE_ERR | PDC_PCI_SYS_ERR |
  				  PDC1_ERR_MASK | PDC2_ERR_MASK,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
111
112
  
  	board_2037x		= 0,	/* FastTrak S150 TX2plus */
eca25dca1   Tejun Heo   libata: convert d...
113
114
115
116
  	board_2037x_pata	= 1,	/* FastTrak S150 TX2plus PATA port */
  	board_20319		= 2,	/* FastTrak S150 TX4 */
  	board_20619		= 3,	/* FastTrak TX4000 */
  	board_2057x		= 4,	/* SATAII150 Tx2plus */
d0e580316   Mikael Pettersson   sata_promise: cle...
117
  	board_2057x_pata	= 5,	/* SATAII150 Tx2plus PATA port */
eca25dca1   Tejun Heo   libata: convert d...
118
  	board_40518		= 6,	/* SATAII150 Tx4 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
119

6340f0196   Luke Kosewski   [libata sata_prom...
120
  	PDC_HAS_PATA		= (1 << 1), /* PDC20375/20575 has PATA */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
121

95006188c   Mikael Pettersson   sata_promise: ATA...
122
123
124
125
126
127
128
129
130
  	/* Sequence counter control registers bit definitions */
  	PDC_SEQCNTRL_INT_MASK	= (1 << 5), /* Sequence Interrupt Mask */
  
  	/* Feature register values */
  	PDC_FEATURE_ATAPI_PIO	= 0x00, /* ATAPI data xfer by PIO */
  	PDC_FEATURE_ATAPI_DMA	= 0x01, /* ATAPI data xfer by DMA */
  
  	/* Device/Head register values */
  	PDC_DEVICE_SATA		= 0xE0, /* Device/Head value for SATA devices */
25b93d81b   Mikael Pettersson   [PATCH] sata_prom...
131
132
133
  	/* PDC_CTLSTAT bit definitions */
  	PDC_DMA_ENABLE		= (1 << 7),
  	PDC_IRQ_DISABLE		= (1 << 10),
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
134
  	PDC_RESET		= (1 << 11), /* HDMA reset */
50630195b   Jeff Garzik   [libata] mark cer...
135

9cbe056f6   Sergei Shtylyov   libata: remove AT...
136
  	PDC_COMMON_FLAGS	= ATA_FLAG_PIO_POLLING,
b2d1eee1e   Mikael Pettersson   [PATCH] sata_prom...
137

eca25dca1   Tejun Heo   libata: convert d...
138
139
140
141
  	/* ap->flags bits */
  	PDC_FLAG_GEN_II		= (1 << 24),
  	PDC_FLAG_SATA_PATA	= (1 << 25), /* supports SATA + PATA */
  	PDC_FLAG_4_PORTS	= (1 << 26), /* 4 ports */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
142
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
143
144
145
146
  struct pdc_port_priv {
  	u8			*pkt;
  	dma_addr_t		pkt_dma;
  };
82ef04fb4   Tejun Heo   libata: make SCR ...
147
148
  static int pdc_sata_scr_read(struct ata_link *link, unsigned int sc_reg, u32 *val);
  static int pdc_sata_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val);
7715a6f9c   Mikael Pettersson   sata_promise: oth...
149
  static int pdc_ata_init_one(struct pci_dev *pdev, const struct pci_device_id *ent);
eca25dca1   Tejun Heo   libata: convert d...
150
151
  static int pdc_common_port_start(struct ata_port *ap);
  static int pdc_sata_port_start(struct ata_port *ap);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
152
  static void pdc_qc_prep(struct ata_queued_cmd *qc);
057ace5e7   Jeff Garzik   libata: const-ifi...
153
154
  static void pdc_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile *tf);
  static void pdc_exec_command_mmio(struct ata_port *ap, const struct ata_taskfile *tf);
95006188c   Mikael Pettersson   sata_promise: ATA...
155
  static int pdc_check_atapi_dma(struct ata_queued_cmd *qc);
724114a57   Mikael Pettersson   sata_promise: sep...
156
  static int pdc_old_sata_check_atapi_dma(struct ata_queued_cmd *qc);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
157
  static void pdc_irq_clear(struct ata_port *ap);
9363c3825   Tejun Heo   libata: rename SF...
158
  static unsigned int pdc_qc_issue(struct ata_queued_cmd *qc);
25b93d81b   Mikael Pettersson   [PATCH] sata_prom...
159
  static void pdc_freeze(struct ata_port *ap);
c07a9c499   Mikael Pettersson   sata_promise: fix...
160
  static void pdc_sata_freeze(struct ata_port *ap);
25b93d81b   Mikael Pettersson   [PATCH] sata_prom...
161
  static void pdc_thaw(struct ata_port *ap);
c07a9c499   Mikael Pettersson   sata_promise: fix...
162
  static void pdc_sata_thaw(struct ata_port *ap);
cadef677e   Mikael Pettersson   sata_promise: add...
163
164
165
166
  static int pdc_pata_softreset(struct ata_link *link, unsigned int *class,
  			      unsigned long deadline);
  static int pdc_sata_hardreset(struct ata_link *link, unsigned int *class,
  			      unsigned long deadline);
a1efdaba2   Tejun Heo   libata: make rese...
167
  static void pdc_error_handler(struct ata_port *ap);
25b93d81b   Mikael Pettersson   [PATCH] sata_prom...
168
  static void pdc_post_internal_cmd(struct ata_queued_cmd *qc);
724114a57   Mikael Pettersson   sata_promise: sep...
169
170
  static int pdc_pata_cable_detect(struct ata_port *ap);
  static int pdc_sata_cable_detect(struct ata_port *ap);
374b18735   Jeff Garzik   [libata] update s...
171

193515d51   Jeff Garzik   [libata] eliminat...
172
  static struct scsi_host_template pdc_ata_sht = {
68d1d07b5   Tejun Heo   libata: implement...
173
  	ATA_BASE_SHT(DRV_NAME),
b9ccd4a90   Mikael Pettersson   sata_promise: ASI...
174
  	.sg_tablesize		= PDC_MAX_PRD,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
175
  	.dma_boundary		= ATA_DMA_BOUNDARY,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
176
  };
029cfd6b7   Tejun Heo   libata: implement...
177
178
  static const struct ata_port_operations pdc_common_ops = {
  	.inherits		= &ata_sff_port_ops,
5682ed33a   Tejun Heo   libata: rename SF...
179
180
  	.sff_tf_load		= pdc_tf_load_mmio,
  	.sff_exec_command	= pdc_exec_command_mmio,
95006188c   Mikael Pettersson   sata_promise: ATA...
181
  	.check_atapi_dma	= pdc_check_atapi_dma,
95006188c   Mikael Pettersson   sata_promise: ATA...
182
  	.qc_prep		= pdc_qc_prep,
9363c3825   Tejun Heo   libata: rename SF...
183
  	.qc_issue		= pdc_qc_issue,
c96f1732e   Alan Cox   [libata] Improve ...
184

5682ed33a   Tejun Heo   libata: rename SF...
185
  	.sff_irq_clear		= pdc_irq_clear,
c96f1732e   Alan Cox   [libata] Improve ...
186
  	.lost_interrupt		= ATA_OP_NULL,
95006188c   Mikael Pettersson   sata_promise: ATA...
187

029cfd6b7   Tejun Heo   libata: implement...
188
  	.post_internal_cmd	= pdc_post_internal_cmd,
a1efdaba2   Tejun Heo   libata: make rese...
189
  	.error_handler		= pdc_error_handler,
95006188c   Mikael Pettersson   sata_promise: ATA...
190
  };
029cfd6b7   Tejun Heo   libata: implement...
191
192
193
  static struct ata_port_operations pdc_sata_ops = {
  	.inherits		= &pdc_common_ops,
  	.cable_detect		= pdc_sata_cable_detect,
c07a9c499   Mikael Pettersson   sata_promise: fix...
194
195
  	.freeze			= pdc_sata_freeze,
  	.thaw			= pdc_sata_thaw,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
196
197
  	.scr_read		= pdc_sata_scr_read,
  	.scr_write		= pdc_sata_scr_write,
eca25dca1   Tejun Heo   libata: convert d...
198
  	.port_start		= pdc_sata_port_start,
cadef677e   Mikael Pettersson   sata_promise: add...
199
  	.hardreset		= pdc_sata_hardreset,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
200
  };
0ae6654da   Mikael Pettersson   sata_promise: dis...
201
202
  /* First-generation chips need a more restrictive ->check_atapi_dma op,
     and ->freeze/thaw that ignore the hotplug controls. */
029cfd6b7   Tejun Heo   libata: implement...
203
204
  static struct ata_port_operations pdc_old_sata_ops = {
  	.inherits		= &pdc_sata_ops,
0ae6654da   Mikael Pettersson   sata_promise: dis...
205
206
  	.freeze			= pdc_freeze,
  	.thaw			= pdc_thaw,
029cfd6b7   Tejun Heo   libata: implement...
207
208
  	.check_atapi_dma	= pdc_old_sata_check_atapi_dma,
  };
2cba582a4   Jeff Garzik   [libata sata_prom...
209

029cfd6b7   Tejun Heo   libata: implement...
210
211
212
  static struct ata_port_operations pdc_pata_ops = {
  	.inherits		= &pdc_common_ops,
  	.cable_detect		= pdc_pata_cable_detect,
5387373bf   Mikael Pettersson   sata_promise: new...
213
214
  	.freeze			= pdc_freeze,
  	.thaw			= pdc_thaw,
eca25dca1   Tejun Heo   libata: convert d...
215
  	.port_start		= pdc_common_port_start,
cadef677e   Mikael Pettersson   sata_promise: add...
216
  	.softreset		= pdc_pata_softreset,
2cba582a4   Jeff Garzik   [libata sata_prom...
217
  };
98ac62def   Arjan van de Ven   [PATCH] mark seve...
218
  static const struct ata_port_info pdc_port_info[] = {
5595ddf98   Mikael Pettersson   sata_promise: cle...
219
  	[board_2037x] =
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
220
  	{
eca25dca1   Tejun Heo   libata: convert d...
221
222
  		.flags		= PDC_COMMON_FLAGS | ATA_FLAG_SATA |
  				  PDC_FLAG_SATA_PATA,
14bdef982   Erik Inge Bolsø   [libata] convert ...
223
224
  		.pio_mask	= ATA_PIO4,
  		.mwdma_mask	= ATA_MWDMA2,
469248abf   Jeff Garzik   [libata] Clean up...
225
  		.udma_mask	= ATA_UDMA6,
95006188c   Mikael Pettersson   sata_promise: ATA...
226
  		.port_ops	= &pdc_old_sata_ops,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
227
  	},
5595ddf98   Mikael Pettersson   sata_promise: cle...
228
  	[board_2037x_pata] =
eca25dca1   Tejun Heo   libata: convert d...
229
230
  	{
  		.flags		= PDC_COMMON_FLAGS | ATA_FLAG_SLAVE_POSS,
14bdef982   Erik Inge Bolsø   [libata] convert ...
231
232
  		.pio_mask	= ATA_PIO4,
  		.mwdma_mask	= ATA_MWDMA2,
469248abf   Jeff Garzik   [libata] Clean up...
233
  		.udma_mask	= ATA_UDMA6,
eca25dca1   Tejun Heo   libata: convert d...
234
235
  		.port_ops	= &pdc_pata_ops,
  	},
5595ddf98   Mikael Pettersson   sata_promise: cle...
236
  	[board_20319] =
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
237
  	{
eca25dca1   Tejun Heo   libata: convert d...
238
239
  		.flags		= PDC_COMMON_FLAGS | ATA_FLAG_SATA |
  				  PDC_FLAG_4_PORTS,
14bdef982   Erik Inge Bolsø   [libata] convert ...
240
241
  		.pio_mask	= ATA_PIO4,
  		.mwdma_mask	= ATA_MWDMA2,
469248abf   Jeff Garzik   [libata] Clean up...
242
  		.udma_mask	= ATA_UDMA6,
95006188c   Mikael Pettersson   sata_promise: ATA...
243
  		.port_ops	= &pdc_old_sata_ops,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
244
  	},
f497ba735   Tobias Lorenz   [libata sata_prom...
245

5595ddf98   Mikael Pettersson   sata_promise: cle...
246
  	[board_20619] =
f497ba735   Tobias Lorenz   [libata sata_prom...
247
  	{
eca25dca1   Tejun Heo   libata: convert d...
248
249
  		.flags		= PDC_COMMON_FLAGS | ATA_FLAG_SLAVE_POSS |
  				  PDC_FLAG_4_PORTS,
14bdef982   Erik Inge Bolsø   [libata] convert ...
250
251
  		.pio_mask	= ATA_PIO4,
  		.mwdma_mask	= ATA_MWDMA2,
469248abf   Jeff Garzik   [libata] Clean up...
252
  		.udma_mask	= ATA_UDMA6,
2cba582a4   Jeff Garzik   [libata sata_prom...
253
  		.port_ops	= &pdc_pata_ops,
f497ba735   Tobias Lorenz   [libata sata_prom...
254
  	},
5a46fe89a   Yusuf Iskenderoglu   [libata] sata_pro...
255

5595ddf98   Mikael Pettersson   sata_promise: cle...
256
  	[board_2057x] =
6340f0196   Luke Kosewski   [libata sata_prom...
257
  	{
eca25dca1   Tejun Heo   libata: convert d...
258
259
  		.flags		= PDC_COMMON_FLAGS | ATA_FLAG_SATA |
  				  PDC_FLAG_GEN_II | PDC_FLAG_SATA_PATA,
14bdef982   Erik Inge Bolsø   [libata] convert ...
260
261
  		.pio_mask	= ATA_PIO4,
  		.mwdma_mask	= ATA_MWDMA2,
469248abf   Jeff Garzik   [libata] Clean up...
262
  		.udma_mask	= ATA_UDMA6,
6340f0196   Luke Kosewski   [libata sata_prom...
263
264
  		.port_ops	= &pdc_sata_ops,
  	},
5595ddf98   Mikael Pettersson   sata_promise: cle...
265
  	[board_2057x_pata] =
eca25dca1   Tejun Heo   libata: convert d...
266
  	{
bb3122359   Jeff Garzik   [libata] sata_pro...
267
  		.flags		= PDC_COMMON_FLAGS | ATA_FLAG_SLAVE_POSS |
eca25dca1   Tejun Heo   libata: convert d...
268
  				  PDC_FLAG_GEN_II,
14bdef982   Erik Inge Bolsø   [libata] convert ...
269
270
  		.pio_mask	= ATA_PIO4,
  		.mwdma_mask	= ATA_MWDMA2,
469248abf   Jeff Garzik   [libata] Clean up...
271
  		.udma_mask	= ATA_UDMA6,
eca25dca1   Tejun Heo   libata: convert d...
272
273
  		.port_ops	= &pdc_pata_ops,
  	},
5595ddf98   Mikael Pettersson   sata_promise: cle...
274
  	[board_40518] =
6340f0196   Luke Kosewski   [libata sata_prom...
275
  	{
eca25dca1   Tejun Heo   libata: convert d...
276
277
  		.flags		= PDC_COMMON_FLAGS | ATA_FLAG_SATA |
  				  PDC_FLAG_GEN_II | PDC_FLAG_4_PORTS,
14bdef982   Erik Inge Bolsø   [libata] convert ...
278
279
  		.pio_mask	= ATA_PIO4,
  		.mwdma_mask	= ATA_MWDMA2,
469248abf   Jeff Garzik   [libata] Clean up...
280
  		.udma_mask	= ATA_UDMA6,
6340f0196   Luke Kosewski   [libata sata_prom...
281
282
  		.port_ops	= &pdc_sata_ops,
  	},
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
283
  };
3b7d697df   Jeff Garzik   [libata] constify...
284
  static const struct pci_device_id pdc_ata_pci_tbl[] = {
54bb3a94b   Jeff Garzik   [libata] Use new ...
285
  	{ PCI_VDEVICE(PROMISE, 0x3371), board_2037x },
54bb3a94b   Jeff Garzik   [libata] Use new ...
286
287
288
  	{ PCI_VDEVICE(PROMISE, 0x3373), board_2037x },
  	{ PCI_VDEVICE(PROMISE, 0x3375), board_2037x },
  	{ PCI_VDEVICE(PROMISE, 0x3376), board_2037x },
b2d1eee1e   Mikael Pettersson   [PATCH] sata_prom...
289
290
  	{ PCI_VDEVICE(PROMISE, 0x3570), board_2057x },
  	{ PCI_VDEVICE(PROMISE, 0x3571), board_2057x },
54bb3a94b   Jeff Garzik   [libata] Use new ...
291
  	{ PCI_VDEVICE(PROMISE, 0x3574), board_2057x },
d324d4627   Mikael Pettersson   [PATCH] sata_prom...
292
  	{ PCI_VDEVICE(PROMISE, 0x3577), board_2057x },
b2d1eee1e   Mikael Pettersson   [PATCH] sata_prom...
293
  	{ PCI_VDEVICE(PROMISE, 0x3d73), board_2057x },
54bb3a94b   Jeff Garzik   [libata] Use new ...
294
  	{ PCI_VDEVICE(PROMISE, 0x3d75), board_2057x },
54bb3a94b   Jeff Garzik   [libata] Use new ...
295
296
297
  
  	{ PCI_VDEVICE(PROMISE, 0x3318), board_20319 },
  	{ PCI_VDEVICE(PROMISE, 0x3319), board_20319 },
7f9992a23   Mikael Pettersson   sata_promise: Fas...
298
299
  	{ PCI_VDEVICE(PROMISE, 0x3515), board_40518 },
  	{ PCI_VDEVICE(PROMISE, 0x3519), board_40518 },
b2d1eee1e   Mikael Pettersson   [PATCH] sata_prom...
300
  	{ PCI_VDEVICE(PROMISE, 0x3d17), board_40518 },
54bb3a94b   Jeff Garzik   [libata] Use new ...
301
302
303
  	{ PCI_VDEVICE(PROMISE, 0x3d18), board_40518 },
  
  	{ PCI_VDEVICE(PROMISE, 0x6629), board_20619 },
f497ba735   Tobias Lorenz   [libata sata_prom...
304

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
305
306
  	{ }	/* terminate list */
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
307
308
309
310
311
312
  static struct pci_driver pdc_ata_pci_driver = {
  	.name			= DRV_NAME,
  	.id_table		= pdc_ata_pci_tbl,
  	.probe			= pdc_ata_init_one,
  	.remove			= ata_pci_remove_one,
  };
724114a57   Mikael Pettersson   sata_promise: sep...
313
  static int pdc_common_port_start(struct ata_port *ap)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
314
  {
cca3974e4   Jeff Garzik   libata: Grand ren...
315
  	struct device *dev = ap->host->dev;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
316
317
  	struct pdc_port_priv *pp;
  	int rc;
c7087652e   Tejun Heo   libata-sff: clean...
318
319
  	/* we use the same prd table as bmdma, allocate it */
  	rc = ata_bmdma_port_start(ap);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
320
321
  	if (rc)
  		return rc;
24dc5f33e   Tejun Heo   libata: update li...
322
323
324
  	pp = devm_kzalloc(dev, sizeof(*pp), GFP_KERNEL);
  	if (!pp)
  		return -ENOMEM;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
325

24dc5f33e   Tejun Heo   libata: update li...
326
327
328
  	pp->pkt = dmam_alloc_coherent(dev, 128, &pp->pkt_dma, GFP_KERNEL);
  	if (!pp->pkt)
  		return -ENOMEM;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
329
330
  
  	ap->private_data = pp;
724114a57   Mikael Pettersson   sata_promise: sep...
331
332
333
334
335
  	return 0;
  }
  
  static int pdc_sata_port_start(struct ata_port *ap)
  {
724114a57   Mikael Pettersson   sata_promise: sep...
336
337
338
339
340
  	int rc;
  
  	rc = pdc_common_port_start(ap);
  	if (rc)
  		return rc;
599b7202c   Mikael Pettersson   [PATCH] sata_prom...
341
  	/* fix up PHYMODE4 align timing */
eca25dca1   Tejun Heo   libata: convert d...
342
  	if (ap->flags & PDC_FLAG_GEN_II) {
821d22cdc   Mikael Pettersson   sata_promise: mmi...
343
  		void __iomem *sata_mmio = ap->ioaddr.scr_addr;
599b7202c   Mikael Pettersson   [PATCH] sata_prom...
344
  		unsigned int tmp;
821d22cdc   Mikael Pettersson   sata_promise: mmi...
345
  		tmp = readl(sata_mmio + PDC_PHYMODE4);
599b7202c   Mikael Pettersson   [PATCH] sata_prom...
346
  		tmp = (tmp & ~3) | 1;	/* set bits 1:0 = 0:1 */
821d22cdc   Mikael Pettersson   sata_promise: mmi...
347
  		writel(tmp, sata_mmio + PDC_PHYMODE4);
599b7202c   Mikael Pettersson   [PATCH] sata_prom...
348
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
349
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
350
  }
ff7cddf59   Mikael Pettersson   sata_promise: upd...
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
  static void pdc_fpdma_clear_interrupt_flag(struct ata_port *ap)
  {
  	void __iomem *sata_mmio = ap->ioaddr.scr_addr;
  	u32 tmp;
  
  	tmp = readl(sata_mmio + PDC_FPDMA_CTLSTAT);
  	tmp |= PDC_FPDMA_CTLSTAT_DMASETUP_INT_FLAG;
  	tmp |= PDC_FPDMA_CTLSTAT_SETDB_INT_FLAG;
  
  	/* It's not allowed to write to the entire FPDMA_CTLSTAT register
  	   when NCQ is running. So do a byte-sized write to bits 10 and 11. */
  	writeb(tmp >> 8, sata_mmio + PDC_FPDMA_CTLSTAT + 1);
  	readb(sata_mmio + PDC_FPDMA_CTLSTAT + 1); /* flush */
  }
  
  static void pdc_fpdma_reset(struct ata_port *ap)
  {
  	void __iomem *sata_mmio = ap->ioaddr.scr_addr;
  	u8 tmp;
  
  	tmp = (u8)readl(sata_mmio + PDC_FPDMA_CTLSTAT);
  	tmp &= 0x7F;
  	tmp |= PDC_FPDMA_CTLSTAT_RESET;
  	writeb(tmp, sata_mmio + PDC_FPDMA_CTLSTAT);
  	readl(sata_mmio + PDC_FPDMA_CTLSTAT); /* flush */
  	udelay(100);
  	tmp &= ~PDC_FPDMA_CTLSTAT_RESET;
  	writeb(tmp, sata_mmio + PDC_FPDMA_CTLSTAT);
  	readl(sata_mmio + PDC_FPDMA_CTLSTAT); /* flush */
  
  	pdc_fpdma_clear_interrupt_flag(ap);
  }
  
  static void pdc_not_at_command_packet_phase(struct ata_port *ap)
  {
  	void __iomem *sata_mmio = ap->ioaddr.scr_addr;
  	unsigned int i;
  	u32 tmp;
  
  	/* check not at ASIC packet command phase */
  	for (i = 0; i < 100; ++i) {
  		writel(0, sata_mmio + PDC_INTERNAL_DEBUG_1);
  		tmp = readl(sata_mmio + PDC_INTERNAL_DEBUG_2);
  		if ((tmp & 0xF) != 1)
  			break;
  		udelay(100);
  	}
  }
  
  static void pdc_clear_internal_debug_record_error_register(struct ata_port *ap)
  {
  	void __iomem *sata_mmio = ap->ioaddr.scr_addr;
  
  	writel(0xffffffff, sata_mmio + PDC_SATA_ERROR);
  	writel(0xffff0000, sata_mmio + PDC_LINK_LAYER_ERRORS);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
407
408
  static void pdc_reset_port(struct ata_port *ap)
  {
821d22cdc   Mikael Pettersson   sata_promise: mmi...
409
  	void __iomem *ata_ctlstat_mmio = ap->ioaddr.cmd_addr + PDC_CTLSTAT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
410
411
  	unsigned int i;
  	u32 tmp;
ff7cddf59   Mikael Pettersson   sata_promise: upd...
412
413
414
415
416
417
  	if (ap->flags & PDC_FLAG_GEN_II)
  		pdc_not_at_command_packet_phase(ap);
  
  	tmp = readl(ata_ctlstat_mmio);
  	tmp |= PDC_RESET;
  	writel(tmp, ata_ctlstat_mmio);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
418
  	for (i = 11; i > 0; i--) {
821d22cdc   Mikael Pettersson   sata_promise: mmi...
419
  		tmp = readl(ata_ctlstat_mmio);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
420
421
422
423
424
425
  		if (tmp & PDC_RESET)
  			break;
  
  		udelay(100);
  
  		tmp |= PDC_RESET;
821d22cdc   Mikael Pettersson   sata_promise: mmi...
426
  		writel(tmp, ata_ctlstat_mmio);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
427
428
429
  	}
  
  	tmp &= ~PDC_RESET;
821d22cdc   Mikael Pettersson   sata_promise: mmi...
430
431
  	writel(tmp, ata_ctlstat_mmio);
  	readl(ata_ctlstat_mmio);	/* flush */
ff7cddf59   Mikael Pettersson   sata_promise: upd...
432
433
434
435
436
  
  	if (sata_scr_valid(&ap->link) && (ap->flags & PDC_FLAG_GEN_II)) {
  		pdc_fpdma_reset(ap);
  		pdc_clear_internal_debug_record_error_register(ap);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
437
  }
724114a57   Mikael Pettersson   sata_promise: sep...
438
  static int pdc_pata_cable_detect(struct ata_port *ap)
2cba582a4   Jeff Garzik   [libata sata_prom...
439
  {
d3fb4e8dd   Jeff Garzik   [libata sata_prom...
440
  	u8 tmp;
821d22cdc   Mikael Pettersson   sata_promise: mmi...
441
  	void __iomem *ata_mmio = ap->ioaddr.cmd_addr;
d3fb4e8dd   Jeff Garzik   [libata sata_prom...
442

821d22cdc   Mikael Pettersson   sata_promise: mmi...
443
  	tmp = readb(ata_mmio + PDC_CTLSTAT + 3);
724114a57   Mikael Pettersson   sata_promise: sep...
444
445
446
447
448
449
450
  	if (tmp & 0x01)
  		return ATA_CBL_PATA40;
  	return ATA_CBL_PATA80;
  }
  
  static int pdc_sata_cable_detect(struct ata_port *ap)
  {
e2a9752a2   Alan Cox   sata_promise: Swi...
451
  	return ATA_CBL_SATA;
d3fb4e8dd   Jeff Garzik   [libata sata_prom...
452
  }
2cba582a4   Jeff Garzik   [libata sata_prom...
453

82ef04fb4   Tejun Heo   libata: make SCR ...
454
455
  static int pdc_sata_scr_read(struct ata_link *link,
  			     unsigned int sc_reg, u32 *val)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
456
  {
724114a57   Mikael Pettersson   sata_promise: sep...
457
  	if (sc_reg > SCR_CONTROL)
da3dbb17a   Tejun Heo   libata: make ->sc...
458
  		return -EINVAL;
82ef04fb4   Tejun Heo   libata: make SCR ...
459
  	*val = readl(link->ap->ioaddr.scr_addr + (sc_reg * 4));
da3dbb17a   Tejun Heo   libata: make ->sc...
460
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
461
  }
82ef04fb4   Tejun Heo   libata: make SCR ...
462
463
  static int pdc_sata_scr_write(struct ata_link *link,
  			      unsigned int sc_reg, u32 val)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
464
  {
724114a57   Mikael Pettersson   sata_promise: sep...
465
  	if (sc_reg > SCR_CONTROL)
da3dbb17a   Tejun Heo   libata: make ->sc...
466
  		return -EINVAL;
82ef04fb4   Tejun Heo   libata: make SCR ...
467
  	writel(val, link->ap->ioaddr.scr_addr + (sc_reg * 4));
da3dbb17a   Tejun Heo   libata: make ->sc...
468
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
469
  }
fba6edbd3   Mikael Pettersson   sata_promise: han...
470
  static void pdc_atapi_pkt(struct ata_queued_cmd *qc)
95006188c   Mikael Pettersson   sata_promise: ATA...
471
  {
4113bb6b6   Mikael Pettersson   sata_promise: iss...
472
  	struct ata_port *ap = qc->ap;
f60d70113   Tejun Heo   libata-sff: prd i...
473
  	dma_addr_t sg_table = ap->bmdma_prd_dma;
4113bb6b6   Mikael Pettersson   sata_promise: iss...
474
475
476
477
  	unsigned int cdb_len = qc->dev->cdb_len;
  	u8 *cdb = qc->cdb;
  	struct pdc_port_priv *pp = ap->private_data;
  	u8 *buf = pp->pkt;
826cd156d   Al Viro   libata annotations
478
  	__le32 *buf32 = (__le32 *) buf;
46a671430   Tejun Heo   sata_promise: mak...
479
  	unsigned int dev_sel, feature;
95006188c   Mikael Pettersson   sata_promise: ATA...
480
481
482
483
  
  	/* set control bits (byte 0), zero delay seq id (byte 3),
  	 * and seq id (byte 2)
  	 */
fba6edbd3   Mikael Pettersson   sata_promise: han...
484
  	switch (qc->tf.protocol) {
0dc36888d   Tejun Heo   libata: rename AT...
485
  	case ATAPI_PROT_DMA:
fba6edbd3   Mikael Pettersson   sata_promise: han...
486
487
488
489
490
  		if (!(qc->tf.flags & ATA_TFLAG_WRITE))
  			buf32[0] = cpu_to_le32(PDC_PKT_READ);
  		else
  			buf32[0] = 0;
  		break;
0dc36888d   Tejun Heo   libata: rename AT...
491
  	case ATAPI_PROT_NODATA:
fba6edbd3   Mikael Pettersson   sata_promise: han...
492
493
494
495
496
497
  		buf32[0] = cpu_to_le32(PDC_PKT_NODATA);
  		break;
  	default:
  		BUG();
  		break;
  	}
95006188c   Mikael Pettersson   sata_promise: ATA...
498
499
  	buf32[1] = cpu_to_le32(sg_table);	/* S/G table addr */
  	buf32[2] = 0;				/* no next-packet */
4113bb6b6   Mikael Pettersson   sata_promise: iss...
500
  	/* select drive */
46a671430   Tejun Heo   sata_promise: mak...
501
  	if (sata_scr_valid(&ap->link))
4113bb6b6   Mikael Pettersson   sata_promise: iss...
502
  		dev_sel = PDC_DEVICE_SATA;
46a671430   Tejun Heo   sata_promise: mak...
503
504
  	else
  		dev_sel = qc->tf.device;
4113bb6b6   Mikael Pettersson   sata_promise: iss...
505
506
507
508
509
510
  	buf[12] = (1 << 5) | ATA_REG_DEVICE;
  	buf[13] = dev_sel;
  	buf[14] = (1 << 5) | ATA_REG_DEVICE | PDC_PKT_CLEAR_BSY;
  	buf[15] = dev_sel; /* once more, waiting for BSY to clear */
  
  	buf[16] = (1 << 5) | ATA_REG_NSECT;
46a671430   Tejun Heo   sata_promise: mak...
511
  	buf[17] = qc->tf.nsect;
4113bb6b6   Mikael Pettersson   sata_promise: iss...
512
  	buf[18] = (1 << 5) | ATA_REG_LBAL;
46a671430   Tejun Heo   sata_promise: mak...
513
  	buf[19] = qc->tf.lbal;
4113bb6b6   Mikael Pettersson   sata_promise: iss...
514
515
  
  	/* set feature and byte counter registers */
0dc36888d   Tejun Heo   libata: rename AT...
516
  	if (qc->tf.protocol != ATAPI_PROT_DMA)
4113bb6b6   Mikael Pettersson   sata_promise: iss...
517
  		feature = PDC_FEATURE_ATAPI_PIO;
46a671430   Tejun Heo   sata_promise: mak...
518
  	else
4113bb6b6   Mikael Pettersson   sata_promise: iss...
519
  		feature = PDC_FEATURE_ATAPI_DMA;
46a671430   Tejun Heo   sata_promise: mak...
520

4113bb6b6   Mikael Pettersson   sata_promise: iss...
521
522
523
  	buf[20] = (1 << 5) | ATA_REG_FEATURE;
  	buf[21] = feature;
  	buf[22] = (1 << 5) | ATA_REG_BYTEL;
46a671430   Tejun Heo   sata_promise: mak...
524
  	buf[23] = qc->tf.lbam;
4113bb6b6   Mikael Pettersson   sata_promise: iss...
525
  	buf[24] = (1 << 5) | ATA_REG_BYTEH;
46a671430   Tejun Heo   sata_promise: mak...
526
  	buf[25] = qc->tf.lbah;
4113bb6b6   Mikael Pettersson   sata_promise: iss...
527
528
529
  
  	/* send ATAPI packet command 0xA0 */
  	buf[26] = (1 << 5) | ATA_REG_CMD;
46a671430   Tejun Heo   sata_promise: mak...
530
  	buf[27] = qc->tf.command;
4113bb6b6   Mikael Pettersson   sata_promise: iss...
531
532
533
534
  
  	/* select drive and check DRQ */
  	buf[28] = (1 << 5) | ATA_REG_DEVICE | PDC_PKT_WAIT_DRDY;
  	buf[29] = dev_sel;
95006188c   Mikael Pettersson   sata_promise: ATA...
535
536
  	/* we can represent cdb lengths 2/4/6/8/10/12/14/16 */
  	BUG_ON(cdb_len & ~0x1E);
4113bb6b6   Mikael Pettersson   sata_promise: iss...
537
538
539
  	/* append the CDB as the final part */
  	buf[30] = (((cdb_len >> 1) & 7) << 5) | ATA_REG_DATA | PDC_LAST_REG;
  	memcpy(buf+31, cdb, cdb_len);
95006188c   Mikael Pettersson   sata_promise: ATA...
540
  }
b9ccd4a90   Mikael Pettersson   sata_promise: ASI...
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
  /**
   *	pdc_fill_sg - Fill PCI IDE PRD table
   *	@qc: Metadata associated with taskfile to be transferred
   *
   *	Fill PCI IDE PRD (scatter-gather) table with segments
   *	associated with the current disk command.
   *	Make sure hardware does not choke on it.
   *
   *	LOCKING:
   *	spin_lock_irqsave(host lock)
   *
   */
  static void pdc_fill_sg(struct ata_queued_cmd *qc)
  {
  	struct ata_port *ap = qc->ap;
f60d70113   Tejun Heo   libata-sff: prd i...
556
  	struct ata_bmdma_prd *prd = ap->bmdma_prd;
b9ccd4a90   Mikael Pettersson   sata_promise: ASI...
557
  	struct scatterlist *sg;
b9ccd4a90   Mikael Pettersson   sata_promise: ASI...
558
  	const u32 SG_COUNT_ASIC_BUG = 41*4;
ff2aeb1eb   Tejun Heo   libata: convert t...
559
560
  	unsigned int si, idx;
  	u32 len;
b9ccd4a90   Mikael Pettersson   sata_promise: ASI...
561
562
563
  
  	if (!(qc->flags & ATA_QCFLAG_DMAMAP))
  		return;
b9ccd4a90   Mikael Pettersson   sata_promise: ASI...
564
  	idx = 0;
ff2aeb1eb   Tejun Heo   libata: convert t...
565
  	for_each_sg(qc->sg, sg, qc->n_elem, si) {
b9ccd4a90   Mikael Pettersson   sata_promise: ASI...
566
  		u32 addr, offset;
6903c0f7e   Harvey Harrison   ata: fix sparse w...
567
  		u32 sg_len;
b9ccd4a90   Mikael Pettersson   sata_promise: ASI...
568
569
570
571
572
573
574
575
576
577
578
579
580
  
  		/* determine if physical DMA addr spans 64K boundary.
  		 * Note h/w doesn't support 64-bit, so we unconditionally
  		 * truncate dma_addr_t to u32.
  		 */
  		addr = (u32) sg_dma_address(sg);
  		sg_len = sg_dma_len(sg);
  
  		while (sg_len) {
  			offset = addr & 0xffff;
  			len = sg_len;
  			if ((offset + sg_len) > 0x10000)
  				len = 0x10000 - offset;
f60d70113   Tejun Heo   libata-sff: prd i...
581
582
  			prd[idx].addr = cpu_to_le32(addr);
  			prd[idx].flags_len = cpu_to_le32(len & 0xffff);
b9ccd4a90   Mikael Pettersson   sata_promise: ASI...
583
584
585
586
587
588
589
590
  			VPRINTK("PRD[%u] = (0x%X, 0x%X)
  ", idx, addr, len);
  
  			idx++;
  			sg_len -= len;
  			addr += len;
  		}
  	}
f60d70113   Tejun Heo   libata-sff: prd i...
591
  	len = le32_to_cpu(prd[idx - 1].flags_len);
b9ccd4a90   Mikael Pettersson   sata_promise: ASI...
592

ff2aeb1eb   Tejun Heo   libata: convert t...
593
594
  	if (len > SG_COUNT_ASIC_BUG) {
  		u32 addr;
b9ccd4a90   Mikael Pettersson   sata_promise: ASI...
595

ff2aeb1eb   Tejun Heo   libata: convert t...
596
597
  		VPRINTK("Splitting last PRD.
  ");
b9ccd4a90   Mikael Pettersson   sata_promise: ASI...
598

f60d70113   Tejun Heo   libata-sff: prd i...
599
600
  		addr = le32_to_cpu(prd[idx - 1].addr);
  		prd[idx - 1].flags_len = cpu_to_le32(len - SG_COUNT_ASIC_BUG);
ff2aeb1eb   Tejun Heo   libata: convert t...
601
602
  		VPRINTK("PRD[%u] = (0x%X, 0x%X)
  ", idx - 1, addr, SG_COUNT_ASIC_BUG);
b9ccd4a90   Mikael Pettersson   sata_promise: ASI...
603

ff2aeb1eb   Tejun Heo   libata: convert t...
604
605
  		addr = addr + len - SG_COUNT_ASIC_BUG;
  		len = SG_COUNT_ASIC_BUG;
f60d70113   Tejun Heo   libata-sff: prd i...
606
607
  		prd[idx].addr = cpu_to_le32(addr);
  		prd[idx].flags_len = cpu_to_le32(len);
ff2aeb1eb   Tejun Heo   libata: convert t...
608
609
  		VPRINTK("PRD[%u] = (0x%X, 0x%X)
  ", idx, addr, len);
b9ccd4a90   Mikael Pettersson   sata_promise: ASI...
610

ff2aeb1eb   Tejun Heo   libata: convert t...
611
  		idx++;
b9ccd4a90   Mikael Pettersson   sata_promise: ASI...
612
  	}
ff2aeb1eb   Tejun Heo   libata: convert t...
613

f60d70113   Tejun Heo   libata-sff: prd i...
614
  	prd[idx - 1].flags_len |= cpu_to_le32(ATA_PRD_EOT);
b9ccd4a90   Mikael Pettersson   sata_promise: ASI...
615
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
616
617
618
619
620
621
622
623
624
625
  static void pdc_qc_prep(struct ata_queued_cmd *qc)
  {
  	struct pdc_port_priv *pp = qc->ap->private_data;
  	unsigned int i;
  
  	VPRINTK("ENTER
  ");
  
  	switch (qc->tf.protocol) {
  	case ATA_PROT_DMA:
b9ccd4a90   Mikael Pettersson   sata_promise: ASI...
626
  		pdc_fill_sg(qc);
7715a6f9c   Mikael Pettersson   sata_promise: oth...
627
  		/*FALLTHROUGH*/
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
628
  	case ATA_PROT_NODATA:
f60d70113   Tejun Heo   libata-sff: prd i...
629
  		i = pdc_pkt_header(&qc->tf, qc->ap->bmdma_prd_dma,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
630
  				   qc->dev->devno, pp->pkt);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
631
632
633
634
  		if (qc->tf.flags & ATA_TFLAG_LBA48)
  			i = pdc_prep_lba48(&qc->tf, pp->pkt, i);
  		else
  			i = pdc_prep_lba28(&qc->tf, pp->pkt, i);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
635
636
  		pdc_pkt_footer(&qc->tf, pp->pkt, i);
  		break;
0dc36888d   Tejun Heo   libata: rename AT...
637
  	case ATAPI_PROT_PIO:
b9ccd4a90   Mikael Pettersson   sata_promise: ASI...
638
  		pdc_fill_sg(qc);
95006188c   Mikael Pettersson   sata_promise: ATA...
639
  		break;
0dc36888d   Tejun Heo   libata: rename AT...
640
  	case ATAPI_PROT_DMA:
b9ccd4a90   Mikael Pettersson   sata_promise: ASI...
641
  		pdc_fill_sg(qc);
fba6edbd3   Mikael Pettersson   sata_promise: han...
642
  		/*FALLTHROUGH*/
0dc36888d   Tejun Heo   libata: rename AT...
643
  	case ATAPI_PROT_NODATA:
fba6edbd3   Mikael Pettersson   sata_promise: han...
644
  		pdc_atapi_pkt(qc);
95006188c   Mikael Pettersson   sata_promise: ATA...
645
  		break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
646
647
648
649
  	default:
  		break;
  	}
  }
c07a9c499   Mikael Pettersson   sata_promise: fix...
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
  static int pdc_is_sataii_tx4(unsigned long flags)
  {
  	const unsigned long mask = PDC_FLAG_GEN_II | PDC_FLAG_4_PORTS;
  	return (flags & mask) == mask;
  }
  
  static unsigned int pdc_port_no_to_ata_no(unsigned int port_no,
  					  int is_sataii_tx4)
  {
  	static const unsigned char sataii_tx4_port_remap[4] = { 3, 1, 0, 2};
  	return is_sataii_tx4 ? sataii_tx4_port_remap[port_no] : port_no;
  }
  
  static unsigned int pdc_sata_nr_ports(const struct ata_port *ap)
  {
  	return (ap->flags & PDC_FLAG_4_PORTS) ? 4 : 2;
  }
  
  static unsigned int pdc_sata_ata_port_to_ata_no(const struct ata_port *ap)
  {
  	const struct ata_host *host = ap->host;
  	unsigned int nr_ports = pdc_sata_nr_ports(ap);
  	unsigned int i;
7715a6f9c   Mikael Pettersson   sata_promise: oth...
673
  	for (i = 0; i < nr_ports && host->ports[i] != ap; ++i)
c07a9c499   Mikael Pettersson   sata_promise: fix...
674
675
676
677
  		;
  	BUG_ON(i >= nr_ports);
  	return pdc_port_no_to_ata_no(i, pdc_is_sataii_tx4(ap->flags));
  }
25b93d81b   Mikael Pettersson   [PATCH] sata_prom...
678
679
  static void pdc_freeze(struct ata_port *ap)
  {
821d22cdc   Mikael Pettersson   sata_promise: mmi...
680
  	void __iomem *ata_mmio = ap->ioaddr.cmd_addr;
25b93d81b   Mikael Pettersson   [PATCH] sata_prom...
681
  	u32 tmp;
821d22cdc   Mikael Pettersson   sata_promise: mmi...
682
  	tmp = readl(ata_mmio + PDC_CTLSTAT);
25b93d81b   Mikael Pettersson   [PATCH] sata_prom...
683
684
  	tmp |= PDC_IRQ_DISABLE;
  	tmp &= ~PDC_DMA_ENABLE;
821d22cdc   Mikael Pettersson   sata_promise: mmi...
685
686
  	writel(tmp, ata_mmio + PDC_CTLSTAT);
  	readl(ata_mmio + PDC_CTLSTAT); /* flush */
25b93d81b   Mikael Pettersson   [PATCH] sata_prom...
687
  }
c07a9c499   Mikael Pettersson   sata_promise: fix...
688
689
690
691
  static void pdc_sata_freeze(struct ata_port *ap)
  {
  	struct ata_host *host = ap->host;
  	void __iomem *host_mmio = host->iomap[PDC_MMIO_BAR];
0ae6654da   Mikael Pettersson   sata_promise: dis...
692
  	unsigned int hotplug_offset = PDC2_SATA_PLUG_CSR;
c07a9c499   Mikael Pettersson   sata_promise: fix...
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
  	unsigned int ata_no = pdc_sata_ata_port_to_ata_no(ap);
  	u32 hotplug_status;
  
  	/* Disable hotplug events on this port.
  	 *
  	 * Locking:
  	 * 1) hotplug register accesses must be serialised via host->lock
  	 * 2) ap->lock == &ap->host->lock
  	 * 3) ->freeze() and ->thaw() are called with ap->lock held
  	 */
  	hotplug_status = readl(host_mmio + hotplug_offset);
  	hotplug_status |= 0x11 << (ata_no + 16);
  	writel(hotplug_status, host_mmio + hotplug_offset);
  	readl(host_mmio + hotplug_offset); /* flush */
  
  	pdc_freeze(ap);
  }
25b93d81b   Mikael Pettersson   [PATCH] sata_prom...
710
711
  static void pdc_thaw(struct ata_port *ap)
  {
821d22cdc   Mikael Pettersson   sata_promise: mmi...
712
  	void __iomem *ata_mmio = ap->ioaddr.cmd_addr;
25b93d81b   Mikael Pettersson   [PATCH] sata_prom...
713
714
715
  	u32 tmp;
  
  	/* clear IRQ */
821d22cdc   Mikael Pettersson   sata_promise: mmi...
716
  	readl(ata_mmio + PDC_COMMAND);
25b93d81b   Mikael Pettersson   [PATCH] sata_prom...
717
718
  
  	/* turn IRQ back on */
821d22cdc   Mikael Pettersson   sata_promise: mmi...
719
  	tmp = readl(ata_mmio + PDC_CTLSTAT);
25b93d81b   Mikael Pettersson   [PATCH] sata_prom...
720
  	tmp &= ~PDC_IRQ_DISABLE;
821d22cdc   Mikael Pettersson   sata_promise: mmi...
721
722
  	writel(tmp, ata_mmio + PDC_CTLSTAT);
  	readl(ata_mmio + PDC_CTLSTAT); /* flush */
25b93d81b   Mikael Pettersson   [PATCH] sata_prom...
723
  }
c07a9c499   Mikael Pettersson   sata_promise: fix...
724
725
726
727
  static void pdc_sata_thaw(struct ata_port *ap)
  {
  	struct ata_host *host = ap->host;
  	void __iomem *host_mmio = host->iomap[PDC_MMIO_BAR];
0ae6654da   Mikael Pettersson   sata_promise: dis...
728
  	unsigned int hotplug_offset = PDC2_SATA_PLUG_CSR;
c07a9c499   Mikael Pettersson   sata_promise: fix...
729
730
731
732
733
734
735
736
737
738
739
740
741
742
  	unsigned int ata_no = pdc_sata_ata_port_to_ata_no(ap);
  	u32 hotplug_status;
  
  	pdc_thaw(ap);
  
  	/* Enable hotplug events on this port.
  	 * Locking: see pdc_sata_freeze().
  	 */
  	hotplug_status = readl(host_mmio + hotplug_offset);
  	hotplug_status |= 0x11 << ata_no;
  	hotplug_status &= ~(0x11 << (ata_no + 16));
  	writel(hotplug_status, host_mmio + hotplug_offset);
  	readl(host_mmio + hotplug_offset); /* flush */
  }
cadef677e   Mikael Pettersson   sata_promise: add...
743
744
745
746
747
748
  static int pdc_pata_softreset(struct ata_link *link, unsigned int *class,
  			      unsigned long deadline)
  {
  	pdc_reset_port(link->ap);
  	return ata_sff_softreset(link, class, deadline);
  }
ff7cddf59   Mikael Pettersson   sata_promise: upd...
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
  static unsigned int pdc_ata_port_to_ata_no(const struct ata_port *ap)
  {
  	void __iomem *ata_mmio = ap->ioaddr.cmd_addr;
  	void __iomem *host_mmio = ap->host->iomap[PDC_MMIO_BAR];
  
  	/* ata_mmio == host_mmio + 0x200 + ata_no * 0x80 */
  	return (ata_mmio - host_mmio - 0x200) / 0x80;
  }
  
  static void pdc_hard_reset_port(struct ata_port *ap)
  {
  	void __iomem *host_mmio = ap->host->iomap[PDC_MMIO_BAR];
  	void __iomem *pcictl_b1_mmio = host_mmio + PDC_PCI_CTL + 1;
  	unsigned int ata_no = pdc_ata_port_to_ata_no(ap);
  	u8 tmp;
  
  	spin_lock(&ap->host->lock);
  
  	tmp = readb(pcictl_b1_mmio);
  	tmp &= ~(0x10 << ata_no);
  	writeb(tmp, pcictl_b1_mmio);
  	readb(pcictl_b1_mmio); /* flush */
  	udelay(100);
  	tmp |= (0x10 << ata_no);
  	writeb(tmp, pcictl_b1_mmio);
  	readb(pcictl_b1_mmio); /* flush */
  
  	spin_unlock(&ap->host->lock);
  }
cadef677e   Mikael Pettersson   sata_promise: add...
778
779
780
  static int pdc_sata_hardreset(struct ata_link *link, unsigned int *class,
  			      unsigned long deadline)
  {
ff7cddf59   Mikael Pettersson   sata_promise: upd...
781
782
783
784
  	if (link->ap->flags & PDC_FLAG_GEN_II)
  		pdc_not_at_command_packet_phase(link->ap);
  	/* hotplug IRQs should have been masked by pdc_sata_freeze() */
  	pdc_hard_reset_port(link->ap);
cadef677e   Mikael Pettersson   sata_promise: add...
785
  	pdc_reset_port(link->ap);
ff7cddf59   Mikael Pettersson   sata_promise: upd...
786
787
788
789
790
791
  
  	/* sata_promise can't reliably acquire the first D2H Reg FIS
  	 * after hardreset.  Do non-waiting hardreset and request
  	 * follow-up SRST.
  	 */
  	return sata_std_hardreset(link, class, deadline);
cadef677e   Mikael Pettersson   sata_promise: add...
792
  }
a1efdaba2   Tejun Heo   libata: make rese...
793
  static void pdc_error_handler(struct ata_port *ap)
25b93d81b   Mikael Pettersson   [PATCH] sata_prom...
794
  {
25b93d81b   Mikael Pettersson   [PATCH] sata_prom...
795
796
  	if (!(ap->pflags & ATA_PFLAG_FROZEN))
  		pdc_reset_port(ap);
fe06e5f9b   Tejun Heo   libata-sff: separ...
797
  	ata_sff_error_handler(ap);
724114a57   Mikael Pettersson   sata_promise: sep...
798
  }
25b93d81b   Mikael Pettersson   [PATCH] sata_prom...
799
800
801
  static void pdc_post_internal_cmd(struct ata_queued_cmd *qc)
  {
  	struct ata_port *ap = qc->ap;
25b93d81b   Mikael Pettersson   [PATCH] sata_prom...
802
  	/* make DMA engine forget about the failed command */
a51d644af   Tejun Heo   libata: improve A...
803
  	if (qc->flags & ATA_QCFLAG_FAILED)
25b93d81b   Mikael Pettersson   [PATCH] sata_prom...
804
805
  		pdc_reset_port(ap);
  }
176efb054   Mikael Pettersson   sata_promise: dec...
806
807
808
  static void pdc_error_intr(struct ata_port *ap, struct ata_queued_cmd *qc,
  			   u32 port_status, u32 err_mask)
  {
9af5c9c97   Tejun Heo   libata-link: intr...
809
  	struct ata_eh_info *ehi = &ap->link.eh_info;
176efb054   Mikael Pettersson   sata_promise: dec...
810
811
812
813
814
815
816
817
818
  	unsigned int ac_err_mask = 0;
  
  	ata_ehi_clear_desc(ehi);
  	ata_ehi_push_desc(ehi, "port_status 0x%08x", port_status);
  	port_status &= err_mask;
  
  	if (port_status & PDC_DRIVE_ERR)
  		ac_err_mask |= AC_ERR_DEV;
  	if (port_status & (PDC_OVERRUN_ERR | PDC_UNDERRUN_ERR))
a2342f464   Mikael Pettersson   sata_promise: don...
819
  		ac_err_mask |= AC_ERR_OTHER;
176efb054   Mikael Pettersson   sata_promise: dec...
820
821
822
823
824
  	if (port_status & (PDC2_ATA_HBA_ERR | PDC2_ATA_DMA_CNT_ERR))
  		ac_err_mask |= AC_ERR_ATA_BUS;
  	if (port_status & (PDC_PH_ERR | PDC_SH_ERR | PDC_DH_ERR | PDC2_HTO_ERR
  			   | PDC_PCI_SYS_ERR | PDC1_PCI_PARITY_ERR))
  		ac_err_mask |= AC_ERR_HOST_BUS;
936fd7328   Tejun Heo   libata-link: link...
825
  	if (sata_scr_valid(&ap->link)) {
da3dbb17a   Tejun Heo   libata: make ->sc...
826
  		u32 serror;
82ef04fb4   Tejun Heo   libata: make SCR ...
827
  		pdc_sata_scr_read(&ap->link, SCR_ERROR, &serror);
da3dbb17a   Tejun Heo   libata: make ->sc...
828
829
  		ehi->serror |= serror;
  	}
ce2d3abc2   Mikael Pettersson   sata_promise: fix...
830

176efb054   Mikael Pettersson   sata_promise: dec...
831
  	qc->err_mask |= ac_err_mask;
ce2d3abc2   Mikael Pettersson   sata_promise: fix...
832
833
  
  	pdc_reset_port(ap);
8ffcfd9d0   Mikael Pettersson   sata_promise: fix...
834
835
  
  	ata_port_abort(ap);
176efb054   Mikael Pettersson   sata_promise: dec...
836
  }
7715a6f9c   Mikael Pettersson   sata_promise: oth...
837
838
  static unsigned int pdc_host_intr(struct ata_port *ap,
  				  struct ata_queued_cmd *qc)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
839
  {
a22e2eb07   Albert Lee   [PATCH] libata: m...
840
  	unsigned int handled = 0;
821d22cdc   Mikael Pettersson   sata_promise: mmi...
841
  	void __iomem *ata_mmio = ap->ioaddr.cmd_addr;
176efb054   Mikael Pettersson   sata_promise: dec...
842
843
844
  	u32 port_status, err_mask;
  
  	err_mask = PDC_ERR_MASK;
eca25dca1   Tejun Heo   libata: convert d...
845
  	if (ap->flags & PDC_FLAG_GEN_II)
176efb054   Mikael Pettersson   sata_promise: dec...
846
847
848
  		err_mask &= ~PDC1_ERR_MASK;
  	else
  		err_mask &= ~PDC2_ERR_MASK;
821d22cdc   Mikael Pettersson   sata_promise: mmi...
849
  	port_status = readl(ata_mmio + PDC_GLOBAL_CTL);
176efb054   Mikael Pettersson   sata_promise: dec...
850
851
852
  	if (unlikely(port_status & err_mask)) {
  		pdc_error_intr(ap, qc, port_status, err_mask);
  		return 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
853
854
855
856
857
  	}
  
  	switch (qc->tf.protocol) {
  	case ATA_PROT_DMA:
  	case ATA_PROT_NODATA:
0dc36888d   Tejun Heo   libata: rename AT...
858
859
  	case ATAPI_PROT_DMA:
  	case ATAPI_PROT_NODATA:
a22e2eb07   Albert Lee   [PATCH] libata: m...
860
861
  		qc->err_mask |= ac_err_mask(ata_wait_idle(ap));
  		ata_qc_complete(qc);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
862
863
  		handled = 1;
  		break;
d0e580316   Mikael Pettersson   sata_promise: cle...
864
  	default:
ee500aabf   Albert Lee   [PATCH] libata: i...
865
866
  		ap->stats.idle_irq++;
  		break;
d0e580316   Mikael Pettersson   sata_promise: cle...
867
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
868

ee500aabf   Albert Lee   [PATCH] libata: i...
869
  	return handled;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
870
871
872
873
  }
  
  static void pdc_irq_clear(struct ata_port *ap)
  {
821d22cdc   Mikael Pettersson   sata_promise: mmi...
874
  	void __iomem *ata_mmio = ap->ioaddr.cmd_addr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
875

821d22cdc   Mikael Pettersson   sata_promise: mmi...
876
  	readl(ata_mmio + PDC_COMMAND);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
877
  }
5796d1c4c   Jeff Garzik   [libata] Address ...
878
  static irqreturn_t pdc_interrupt(int irq, void *dev_instance)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
879
  {
cca3974e4   Jeff Garzik   libata: Grand ren...
880
  	struct ata_host *host = dev_instance;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
881
882
883
884
  	struct ata_port *ap;
  	u32 mask = 0;
  	unsigned int i, tmp;
  	unsigned int handled = 0;
821d22cdc   Mikael Pettersson   sata_promise: mmi...
885
  	void __iomem *host_mmio;
a77720ad0   Mikael Pettersson   sata_promise: SAT...
886
887
888
  	unsigned int hotplug_offset, ata_no;
  	u32 hotplug_status;
  	int is_sataii_tx4;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
889
890
891
  
  	VPRINTK("ENTER
  ");
0d5ff5667   Tejun Heo   libata: convert t...
892
  	if (!host || !host->iomap[PDC_MMIO_BAR]) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
893
894
895
896
  		VPRINTK("QUICK EXIT
  ");
  		return IRQ_NONE;
  	}
821d22cdc   Mikael Pettersson   sata_promise: mmi...
897
  	host_mmio = host->iomap[PDC_MMIO_BAR];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
898

c07a9c499   Mikael Pettersson   sata_promise: fix...
899
  	spin_lock(&host->lock);
a77720ad0   Mikael Pettersson   sata_promise: SAT...
900
  	/* read and clear hotplug flags for all ports */
0ae6654da   Mikael Pettersson   sata_promise: dis...
901
  	if (host->ports[0]->flags & PDC_FLAG_GEN_II) {
a77720ad0   Mikael Pettersson   sata_promise: SAT...
902
  		hotplug_offset = PDC2_SATA_PLUG_CSR;
0ae6654da   Mikael Pettersson   sata_promise: dis...
903
904
905
906
907
908
  		hotplug_status = readl(host_mmio + hotplug_offset);
  		if (hotplug_status & 0xff)
  			writel(hotplug_status | 0xff, host_mmio + hotplug_offset);
  		hotplug_status &= 0xff;	/* clear uninteresting bits */
  	} else
  		hotplug_status = 0;
a77720ad0   Mikael Pettersson   sata_promise: SAT...
909

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
910
  	/* reading should also clear interrupts */
821d22cdc   Mikael Pettersson   sata_promise: mmi...
911
  	mask = readl(host_mmio + PDC_INT_SEQMASK);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
912

a77720ad0   Mikael Pettersson   sata_promise: SAT...
913
  	if (mask == 0xffffffff && hotplug_status == 0) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
914
915
  		VPRINTK("QUICK EXIT 2
  ");
c07a9c499   Mikael Pettersson   sata_promise: fix...
916
  		goto done_irq;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
917
  	}
6340f0196   Luke Kosewski   [libata sata_prom...
918

7715a6f9c   Mikael Pettersson   sata_promise: oth...
919
  	mask &= 0xffff;		/* only 16 SEQIDs possible */
a77720ad0   Mikael Pettersson   sata_promise: SAT...
920
  	if (mask == 0 && hotplug_status == 0) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
921
922
  		VPRINTK("QUICK EXIT 3
  ");
6340f0196   Luke Kosewski   [libata sata_prom...
923
  		goto done_irq;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
924
  	}
821d22cdc   Mikael Pettersson   sata_promise: mmi...
925
  	writel(mask, host_mmio + PDC_INT_SEQMASK);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
926

a77720ad0   Mikael Pettersson   sata_promise: SAT...
927
  	is_sataii_tx4 = pdc_is_sataii_tx4(host->ports[0]->flags);
cca3974e4   Jeff Garzik   libata: Grand ren...
928
  	for (i = 0; i < host->n_ports; i++) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
929
930
  		VPRINTK("port %u
  ", i);
cca3974e4   Jeff Garzik   libata: Grand ren...
931
  		ap = host->ports[i];
a77720ad0   Mikael Pettersson   sata_promise: SAT...
932
933
934
935
  
  		/* check for a plug or unplug event */
  		ata_no = pdc_port_no_to_ata_no(i, is_sataii_tx4);
  		tmp = hotplug_status & (0x11 << ata_no);
3e4ec3443   Tejun Heo   libata: kill ATA_...
936
  		if (tmp) {
9af5c9c97   Tejun Heo   libata-link: intr...
937
  			struct ata_eh_info *ehi = &ap->link.eh_info;
a77720ad0   Mikael Pettersson   sata_promise: SAT...
938
939
940
941
942
943
944
945
946
  			ata_ehi_clear_desc(ehi);
  			ata_ehi_hotplugged(ehi);
  			ata_ehi_push_desc(ehi, "hotplug_status %#x", tmp);
  			ata_port_freeze(ap);
  			++handled;
  			continue;
  		}
  
  		/* check for a packet interrupt */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
947
  		tmp = mask & (1 << (i + 1));
3e4ec3443   Tejun Heo   libata: kill ATA_...
948
  		if (tmp) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
949
  			struct ata_queued_cmd *qc;
9af5c9c97   Tejun Heo   libata-link: intr...
950
  			qc = ata_qc_from_tag(ap, ap->link.active_tag);
e50362ecc   Albert Lee   [PATCH] libata: i...
951
  			if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING)))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
952
953
954
  				handled += pdc_host_intr(ap, qc);
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
955
956
  	VPRINTK("EXIT
  ");
6340f0196   Luke Kosewski   [libata sata_prom...
957
  done_irq:
cca3974e4   Jeff Garzik   libata: Grand ren...
958
  	spin_unlock(&host->lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
959
960
  	return IRQ_RETVAL(handled);
  }
7715a6f9c   Mikael Pettersson   sata_promise: oth...
961
  static void pdc_packet_start(struct ata_queued_cmd *qc)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
962
963
964
  {
  	struct ata_port *ap = qc->ap;
  	struct pdc_port_priv *pp = ap->private_data;
821d22cdc   Mikael Pettersson   sata_promise: mmi...
965
966
  	void __iomem *host_mmio = ap->host->iomap[PDC_MMIO_BAR];
  	void __iomem *ata_mmio = ap->ioaddr.cmd_addr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
967
968
969
970
971
  	unsigned int port_no = ap->port_no;
  	u8 seq = (u8) (port_no + 1);
  
  	VPRINTK("ENTER, ap %p
  ", ap);
821d22cdc   Mikael Pettersson   sata_promise: mmi...
972
973
  	writel(0x00000001, host_mmio + (seq * 4));
  	readl(host_mmio + (seq * 4));	/* flush */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
974
975
976
  
  	pp->pkt[2] = seq;
  	wmb();			/* flush PRD, pkt writes */
821d22cdc   Mikael Pettersson   sata_promise: mmi...
977
978
  	writel(pp->pkt_dma, ata_mmio + PDC_PKT_SUBMIT);
  	readl(ata_mmio + PDC_PKT_SUBMIT); /* flush */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
979
  }
9363c3825   Tejun Heo   libata: rename SF...
980
  static unsigned int pdc_qc_issue(struct ata_queued_cmd *qc)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
981
982
  {
  	switch (qc->tf.protocol) {
0dc36888d   Tejun Heo   libata: rename AT...
983
  	case ATAPI_PROT_NODATA:
fba6edbd3   Mikael Pettersson   sata_promise: han...
984
985
986
  		if (qc->dev->flags & ATA_DFLAG_CDB_INTR)
  			break;
  		/*FALLTHROUGH*/
51b94d2a5   Tejun Heo   sata_promise: use...
987
988
989
990
  	case ATA_PROT_NODATA:
  		if (qc->tf.flags & ATA_TFLAG_POLLING)
  			break;
  		/*FALLTHROUGH*/
0dc36888d   Tejun Heo   libata: rename AT...
991
  	case ATAPI_PROT_DMA:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
992
  	case ATA_PROT_DMA:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
993
994
  		pdc_packet_start(qc);
  		return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
995
996
997
  	default:
  		break;
  	}
9363c3825   Tejun Heo   libata: rename SF...
998
  	return ata_sff_qc_issue(qc);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
999
  }
057ace5e7   Jeff Garzik   libata: const-ifi...
1000
  static void pdc_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile *tf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1001
  {
0dc36888d   Tejun Heo   libata: rename AT...
1002
  	WARN_ON(tf->protocol == ATA_PROT_DMA || tf->protocol == ATAPI_PROT_DMA);
9363c3825   Tejun Heo   libata: rename SF...
1003
  	ata_sff_tf_load(ap, tf);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1004
  }
5796d1c4c   Jeff Garzik   [libata] Address ...
1005
1006
  static void pdc_exec_command_mmio(struct ata_port *ap,
  				  const struct ata_taskfile *tf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1007
  {
0dc36888d   Tejun Heo   libata: rename AT...
1008
  	WARN_ON(tf->protocol == ATA_PROT_DMA || tf->protocol == ATAPI_PROT_DMA);
9363c3825   Tejun Heo   libata: rename SF...
1009
  	ata_sff_exec_command(ap, tf);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1010
  }
95006188c   Mikael Pettersson   sata_promise: ATA...
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
  static int pdc_check_atapi_dma(struct ata_queued_cmd *qc)
  {
  	u8 *scsicmd = qc->scsicmd->cmnd;
  	int pio = 1; /* atapi dma off by default */
  
  	/* Whitelist commands that may use DMA. */
  	switch (scsicmd[0]) {
  	case WRITE_12:
  	case WRITE_10:
  	case WRITE_6:
  	case READ_12:
  	case READ_10:
  	case READ_6:
  	case 0xad: /* READ_DVD_STRUCTURE */
  	case 0xbe: /* READ_CD */
  		pio = 0;
  	}
  	/* -45150 (FFFF4FA2) to -1 (FFFFFFFF) shall use PIO mode */
  	if (scsicmd[0] == WRITE_10) {
5796d1c4c   Jeff Garzik   [libata] Address ...
1030
1031
1032
1033
1034
  		unsigned int lba =
  			(scsicmd[2] << 24) |
  			(scsicmd[3] << 16) |
  			(scsicmd[4] << 8) |
  			scsicmd[5];
95006188c   Mikael Pettersson   sata_promise: ATA...
1035
1036
1037
1038
1039
  		if (lba >= 0xFFFF4FA2)
  			pio = 1;
  	}
  	return pio;
  }
724114a57   Mikael Pettersson   sata_promise: sep...
1040
  static int pdc_old_sata_check_atapi_dma(struct ata_queued_cmd *qc)
95006188c   Mikael Pettersson   sata_promise: ATA...
1041
  {
95006188c   Mikael Pettersson   sata_promise: ATA...
1042
  	/* First generation chips cannot use ATAPI DMA on SATA ports */
724114a57   Mikael Pettersson   sata_promise: sep...
1043
  	return 1;
95006188c   Mikael Pettersson   sata_promise: ATA...
1044
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1045

eca25dca1   Tejun Heo   libata: convert d...
1046
1047
  static void pdc_ata_setup_port(struct ata_port *ap,
  			       void __iomem *base, void __iomem *scr_addr)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1048
  {
eca25dca1   Tejun Heo   libata: convert d...
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
  	ap->ioaddr.cmd_addr		= base;
  	ap->ioaddr.data_addr		= base;
  	ap->ioaddr.feature_addr		=
  	ap->ioaddr.error_addr		= base + 0x4;
  	ap->ioaddr.nsect_addr		= base + 0x8;
  	ap->ioaddr.lbal_addr		= base + 0xc;
  	ap->ioaddr.lbam_addr		= base + 0x10;
  	ap->ioaddr.lbah_addr		= base + 0x14;
  	ap->ioaddr.device_addr		= base + 0x18;
  	ap->ioaddr.command_addr		=
  	ap->ioaddr.status_addr		= base + 0x1c;
  	ap->ioaddr.altstatus_addr	=
  	ap->ioaddr.ctl_addr		= base + 0x38;
  	ap->ioaddr.scr_addr		= scr_addr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1063
  }
eca25dca1   Tejun Heo   libata: convert d...
1064
  static void pdc_host_init(struct ata_host *host)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1065
  {
821d22cdc   Mikael Pettersson   sata_promise: mmi...
1066
  	void __iomem *host_mmio = host->iomap[PDC_MMIO_BAR];
eca25dca1   Tejun Heo   libata: convert d...
1067
  	int is_gen2 = host->ports[0]->flags & PDC_FLAG_GEN_II;
d324d4627   Mikael Pettersson   [PATCH] sata_prom...
1068
  	int hotplug_offset;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1069
  	u32 tmp;
eca25dca1   Tejun Heo   libata: convert d...
1070
  	if (is_gen2)
d324d4627   Mikael Pettersson   [PATCH] sata_prom...
1071
1072
1073
  		hotplug_offset = PDC2_SATA_PLUG_CSR;
  	else
  		hotplug_offset = PDC_SATA_PLUG_CSR;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1074
1075
1076
1077
1078
  	/*
  	 * Except for the hotplug stuff, this is voodoo from the
  	 * Promise driver.  Label this entire section
  	 * "TODO: figure out why we do this"
  	 */
b2d1eee1e   Mikael Pettersson   [PATCH] sata_prom...
1079
  	/* enable BMR_BURST, maybe change FIFO_SHD to 8 dwords */
821d22cdc   Mikael Pettersson   sata_promise: mmi...
1080
  	tmp = readl(host_mmio + PDC_FLASH_CTL);
b2d1eee1e   Mikael Pettersson   [PATCH] sata_prom...
1081
  	tmp |= 0x02000;	/* bit 13 (enable bmr burst) */
eca25dca1   Tejun Heo   libata: convert d...
1082
  	if (!is_gen2)
b2d1eee1e   Mikael Pettersson   [PATCH] sata_prom...
1083
  		tmp |= 0x10000;	/* bit 16 (fifo threshold at 8 dw) */
821d22cdc   Mikael Pettersson   sata_promise: mmi...
1084
  	writel(tmp, host_mmio + PDC_FLASH_CTL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1085
1086
  
  	/* clear plug/unplug flags for all ports */
821d22cdc   Mikael Pettersson   sata_promise: mmi...
1087
1088
  	tmp = readl(host_mmio + hotplug_offset);
  	writel(tmp | 0xff, host_mmio + hotplug_offset);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1089

821d22cdc   Mikael Pettersson   sata_promise: mmi...
1090
  	tmp = readl(host_mmio + hotplug_offset);
0ae6654da   Mikael Pettersson   sata_promise: dis...
1091
1092
1093
1094
  	if (is_gen2)	/* unmask plug/unplug ints */
  		writel(tmp & ~0xff0000, host_mmio + hotplug_offset);
  	else		/* mask plug/unplug ints */
  		writel(tmp | 0xff0000, host_mmio + hotplug_offset);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1095

b2d1eee1e   Mikael Pettersson   [PATCH] sata_prom...
1096
  	/* don't initialise TBG or SLEW on 2nd generation chips */
eca25dca1   Tejun Heo   libata: convert d...
1097
  	if (is_gen2)
b2d1eee1e   Mikael Pettersson   [PATCH] sata_prom...
1098
  		return;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1099
  	/* reduce TBG clock to 133 Mhz. */
821d22cdc   Mikael Pettersson   sata_promise: mmi...
1100
  	tmp = readl(host_mmio + PDC_TBG_MODE);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1101
1102
  	tmp &= ~0x30000; /* clear bit 17, 16*/
  	tmp |= 0x10000;  /* set bit 17:16 = 0:1 */
821d22cdc   Mikael Pettersson   sata_promise: mmi...
1103
  	writel(tmp, host_mmio + PDC_TBG_MODE);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1104

821d22cdc   Mikael Pettersson   sata_promise: mmi...
1105
  	readl(host_mmio + PDC_TBG_MODE);	/* flush */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1106
1107
1108
  	msleep(10);
  
  	/* adjust slew rate control register. */
821d22cdc   Mikael Pettersson   sata_promise: mmi...
1109
  	tmp = readl(host_mmio + PDC_SLEW_CTL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1110
1111
  	tmp &= 0xFFFFF03F; /* clear bit 11 ~ 6 */
  	tmp  |= 0x00000900; /* set bit 11-9 = 100b , bit 8-6 = 100 */
821d22cdc   Mikael Pettersson   sata_promise: mmi...
1112
  	writel(tmp, host_mmio + PDC_SLEW_CTL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1113
  }
5796d1c4c   Jeff Garzik   [libata] Address ...
1114
1115
  static int pdc_ata_init_one(struct pci_dev *pdev,
  			    const struct pci_device_id *ent)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1116
  {
eca25dca1   Tejun Heo   libata: convert d...
1117
1118
1119
  	const struct ata_port_info *pi = &pdc_port_info[ent->driver_data];
  	const struct ata_port_info *ppi[PDC_MAX_PORTS];
  	struct ata_host *host;
821d22cdc   Mikael Pettersson   sata_promise: mmi...
1120
  	void __iomem *host_mmio;
eca25dca1   Tejun Heo   libata: convert d...
1121
  	int n_ports, i, rc;
5ac2fe575   Mikael Pettersson   sata_promise: SAT...
1122
  	int is_sataii_tx4;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1123

06296a1e6   Joe Perches   ata: Add and use ...
1124
  	ata_print_version_once(&pdev->dev, DRV_VERSION);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1125

eca25dca1   Tejun Heo   libata: convert d...
1126
  	/* enable and acquire resources */
24dc5f33e   Tejun Heo   libata: update li...
1127
  	rc = pcim_enable_device(pdev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1128
1129
  	if (rc)
  		return rc;
0d5ff5667   Tejun Heo   libata: convert t...
1130
1131
  	rc = pcim_iomap_regions(pdev, 1 << PDC_MMIO_BAR, DRV_NAME);
  	if (rc == -EBUSY)
24dc5f33e   Tejun Heo   libata: update li...
1132
  		pcim_pin_device(pdev);
0d5ff5667   Tejun Heo   libata: convert t...
1133
  	if (rc)
24dc5f33e   Tejun Heo   libata: update li...
1134
  		return rc;
821d22cdc   Mikael Pettersson   sata_promise: mmi...
1135
  	host_mmio = pcim_iomap_table(pdev)[PDC_MMIO_BAR];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1136

eca25dca1   Tejun Heo   libata: convert d...
1137
1138
1139
1140
1141
1142
  	/* determine port configuration and setup host */
  	n_ports = 2;
  	if (pi->flags & PDC_FLAG_4_PORTS)
  		n_ports = 4;
  	for (i = 0; i < n_ports; i++)
  		ppi[i] = pi;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1143

eca25dca1   Tejun Heo   libata: convert d...
1144
  	if (pi->flags & PDC_FLAG_SATA_PATA) {
821d22cdc   Mikael Pettersson   sata_promise: mmi...
1145
  		u8 tmp = readb(host_mmio + PDC_FLASH_CTL + 1);
d0e580316   Mikael Pettersson   sata_promise: cle...
1146
  		if (!(tmp & 0x80))
eca25dca1   Tejun Heo   libata: convert d...
1147
  			ppi[n_ports++] = pi + 1;
eca25dca1   Tejun Heo   libata: convert d...
1148
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1149

eca25dca1   Tejun Heo   libata: convert d...
1150
1151
  	host = ata_host_alloc_pinfo(&pdev->dev, ppi, n_ports);
  	if (!host) {
a44fec1fc   Joe Perches   ata: Convert dev_...
1152
1153
  		dev_err(&pdev->dev, "failed to allocate host
  ");
24dc5f33e   Tejun Heo   libata: update li...
1154
  		return -ENOMEM;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1155
  	}
eca25dca1   Tejun Heo   libata: convert d...
1156
  	host->iomap = pcim_iomap_table(pdev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1157

d0e580316   Mikael Pettersson   sata_promise: cle...
1158
  	is_sataii_tx4 = pdc_is_sataii_tx4(pi->flags);
5ac2fe575   Mikael Pettersson   sata_promise: SAT...
1159
  	for (i = 0; i < host->n_ports; i++) {
cbcdd8759   Tejun Heo   libata: implement...
1160
  		struct ata_port *ap = host->ports[i];
d0e580316   Mikael Pettersson   sata_promise: cle...
1161
  		unsigned int ata_no = pdc_port_no_to_ata_no(i, is_sataii_tx4);
821d22cdc   Mikael Pettersson   sata_promise: mmi...
1162
  		unsigned int ata_offset = 0x200 + ata_no * 0x80;
cbcdd8759   Tejun Heo   libata: implement...
1163
  		unsigned int scr_offset = 0x400 + ata_no * 0x100;
821d22cdc   Mikael Pettersson   sata_promise: mmi...
1164
  		pdc_ata_setup_port(ap, host_mmio + ata_offset, host_mmio + scr_offset);
cbcdd8759   Tejun Heo   libata: implement...
1165
1166
  
  		ata_port_pbar_desc(ap, PDC_MMIO_BAR, -1, "mmio");
821d22cdc   Mikael Pettersson   sata_promise: mmi...
1167
  		ata_port_pbar_desc(ap, PDC_MMIO_BAR, ata_offset, "ata");
5ac2fe575   Mikael Pettersson   sata_promise: SAT...
1168
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1169
1170
  
  	/* initialize adapter */
eca25dca1   Tejun Heo   libata: convert d...
1171
  	pdc_host_init(host);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1172

eca25dca1   Tejun Heo   libata: convert d...
1173
1174
1175
1176
1177
1178
  	rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
  	if (rc)
  		return rc;
  	rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
  	if (rc)
  		return rc;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1179

eca25dca1   Tejun Heo   libata: convert d...
1180
1181
1182
1183
  	/* start host, request IRQ and attach */
  	pci_set_master(pdev);
  	return ata_host_activate(host, pdev->irq, pdc_interrupt, IRQF_SHARED,
  				 &pdc_ata_sht);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1184
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1185
1186
  static int __init pdc_ata_init(void)
  {
b7887196e   Pavel Roskin   [PATCH] libata: r...
1187
  	return pci_register_driver(&pdc_ata_pci_driver);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1188
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1189
1190
1191
1192
  static void __exit pdc_ata_exit(void)
  {
  	pci_unregister_driver(&pdc_ata_pci_driver);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1193
  MODULE_AUTHOR("Jeff Garzik");
f497ba735   Tobias Lorenz   [libata sata_prom...
1194
  MODULE_DESCRIPTION("Promise ATA TX2/TX4/TX4000 low-level driver");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1195
1196
1197
1198
1199
1200
  MODULE_LICENSE("GPL");
  MODULE_DEVICE_TABLE(pci, pdc_ata_pci_tbl);
  MODULE_VERSION(DRV_VERSION);
  
  module_init(pdc_ata_init);
  module_exit(pdc_ata_exit);