sata_promise.c 34 KB
Newer Older
Linus Torvalds's avatar
Linus Torvalds committed
1 2 3
/*
 *  sata_promise.c - Promise SATA
 *
4
 *  Maintained by:  Tejun Heo <tj@kernel.org>
5
 *		    Mikael Pettersson
Linus Torvalds's avatar
Linus Torvalds committed
6 7 8 9 10 11
 *  		    Please ALWAYS copy linux-ide@vger.kernel.org
 *		    on emails.
 *
 *  Copyright 2003-2004 Red Hat, Inc.
 *
 *
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
 *  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',
28
 *  as Documentation/driver-api/libata.rst
29 30
 *
 *  Hardware information only available under NDA.
Linus Torvalds's avatar
Linus Torvalds committed
31 32 33 34 35
 *
 */

#include <linux/kernel.h>
#include <linux/module.h>
36
#include <linux/gfp.h>
Linus Torvalds's avatar
Linus Torvalds committed
37 38 39 40
#include <linux/pci.h>
#include <linux/blkdev.h>
#include <linux/delay.h>
#include <linux/interrupt.h>
41
#include <linux/device.h>
42
#include <scsi/scsi.h>
Linus Torvalds's avatar
Linus Torvalds committed
43
#include <scsi/scsi_host.h>
44
#include <scsi/scsi_cmnd.h>
Linus Torvalds's avatar
Linus Torvalds committed
45 46 47 48
#include <linux/libata.h>
#include "sata_promise.h"

#define DRV_NAME	"sata_promise"
49
#define DRV_VERSION	"2.12"
Linus Torvalds's avatar
Linus Torvalds committed
50 51

enum {
52
	PDC_MAX_PORTS		= 4,
Tejun Heo's avatar
Tejun Heo committed
53
	PDC_MMIO_BAR		= 3,
54
	PDC_MAX_PRD		= LIBATA_MAX_PRD - 1, /* -1 for ASIC PRD bug workaround */
Tejun Heo's avatar
Tejun Heo committed
55

56 57 58
	/* 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 */
59
	PDC_PCI_CTL		= 0x48, /* PCI control/status reg */
60 61 62 63 64 65
	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) */
66 67 68 69 70 71 72
	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) */
73
	PDC_ALTSTATUS		= 0x38, /* Alternate-status/device-control reg (per port) */
Linus Torvalds's avatar
Linus Torvalds committed
74 75 76
	PDC_PKT_SUBMIT		= 0x40, /* Command packet pointer addr */
	PDC_GLOBAL_CTL		= 0x48, /* Global control/status (per port) */
	PDC_CTLSTAT		= 0x60,	/* IDE control and status (per port) */
77 78

	/* per-port SATA register offsets (from ap->ioaddr.scr_addr) */
79
	PDC_SATA_ERROR		= 0x04,
80
	PDC_PHYMODE4		= 0x14,
81 82 83 84 85 86 87 88 89
	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,
Linus Torvalds's avatar
Linus Torvalds committed
90

91 92 93 94 95 96 97 98 99 100 101 102 103
	/* 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,
104 105 106 107 108 109
	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,
Linus Torvalds's avatar
Linus Torvalds committed
110 111

	board_2037x		= 0,	/* FastTrak S150 TX2plus */
112 113 114 115
	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 */
Mikael Pettersson's avatar
Mikael Pettersson committed
116
	board_2057x_pata	= 5,	/* SATAII150 Tx2plus PATA port */
117
	board_40518		= 6,	/* SATAII150 Tx4 */
Linus Torvalds's avatar
Linus Torvalds committed
118

119
	PDC_HAS_PATA		= (1 << 1), /* PDC20375/20575 has PATA */
Linus Torvalds's avatar
Linus Torvalds committed
120

121 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 */

131 132 133
	/* PDC_CTLSTAT bit definitions */
	PDC_DMA_ENABLE		= (1 << 7),
	PDC_IRQ_DISABLE		= (1 << 10),
Linus Torvalds's avatar
Linus Torvalds committed
134
	PDC_RESET		= (1 << 11), /* HDMA reset */
135

136
	PDC_COMMON_FLAGS	= ATA_FLAG_PIO_POLLING,
137

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 */
Linus Torvalds's avatar
Linus Torvalds committed
142 143 144 145 146 147 148
};

struct pdc_port_priv {
	u8			*pkt;
	dma_addr_t		pkt_dma;
};

149 150 151 152
struct pdc_host_priv {
	spinlock_t hard_reset_lock;
};

153 154
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);
155
static int pdc_ata_init_one(struct pci_dev *pdev, const struct pci_device_id *ent);
156 157
static int pdc_common_port_start(struct ata_port *ap);
static int pdc_sata_port_start(struct ata_port *ap);
Linus Torvalds's avatar
Linus Torvalds committed
158
static void pdc_qc_prep(struct ata_queued_cmd *qc);
159 160
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);
161
static int pdc_check_atapi_dma(struct ata_queued_cmd *qc);
162
static int pdc_old_sata_check_atapi_dma(struct ata_queued_cmd *qc);
Linus Torvalds's avatar
Linus Torvalds committed
163
static void pdc_irq_clear(struct ata_port *ap);
Tejun Heo's avatar
Tejun Heo committed
164
static unsigned int pdc_qc_issue(struct ata_queued_cmd *qc);
165
static void pdc_freeze(struct ata_port *ap);
166
static void pdc_sata_freeze(struct ata_port *ap);
167
static void pdc_thaw(struct ata_port *ap);
168
static void pdc_sata_thaw(struct ata_port *ap);
169 170 171 172
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);
173
static void pdc_error_handler(struct ata_port *ap);
174
static void pdc_post_internal_cmd(struct ata_queued_cmd *qc);
175 176
static int pdc_pata_cable_detect(struct ata_port *ap);
static int pdc_sata_cable_detect(struct ata_port *ap);
177

178
static struct scsi_host_template pdc_ata_sht = {
179
	ATA_BASE_SHT(DRV_NAME),
180
	.sg_tablesize		= PDC_MAX_PRD,
Linus Torvalds's avatar
Linus Torvalds committed
181 182 183
	.dma_boundary		= ATA_DMA_BOUNDARY,
};

184 185 186
static const struct ata_port_operations pdc_common_ops = {
	.inherits		= &ata_sff_port_ops,

Tejun Heo's avatar
Tejun Heo committed
187 188
	.sff_tf_load		= pdc_tf_load_mmio,
	.sff_exec_command	= pdc_exec_command_mmio,
189 190
	.check_atapi_dma	= pdc_check_atapi_dma,
	.qc_prep		= pdc_qc_prep,
Tejun Heo's avatar
Tejun Heo committed
191
	.qc_issue		= pdc_qc_issue,
Alan Cox's avatar
Alan Cox committed
192

Tejun Heo's avatar
Tejun Heo committed
193
	.sff_irq_clear		= pdc_irq_clear,
Alan Cox's avatar
Alan Cox committed
194
	.lost_interrupt		= ATA_OP_NULL,
195

196
	.post_internal_cmd	= pdc_post_internal_cmd,
197
	.error_handler		= pdc_error_handler,
198 199
};

200 201 202
static struct ata_port_operations pdc_sata_ops = {
	.inherits		= &pdc_common_ops,
	.cable_detect		= pdc_sata_cable_detect,
203 204
	.freeze			= pdc_sata_freeze,
	.thaw			= pdc_sata_thaw,
Linus Torvalds's avatar
Linus Torvalds committed
205 206
	.scr_read		= pdc_sata_scr_read,
	.scr_write		= pdc_sata_scr_write,
207
	.port_start		= pdc_sata_port_start,
208
	.hardreset		= pdc_sata_hardreset,
Linus Torvalds's avatar
Linus Torvalds committed
209 210
};

211 212
/* First-generation chips need a more restrictive ->check_atapi_dma op,
   and ->freeze/thaw that ignore the hotplug controls. */
213 214
static struct ata_port_operations pdc_old_sata_ops = {
	.inherits		= &pdc_sata_ops,
215 216
	.freeze			= pdc_freeze,
	.thaw			= pdc_thaw,
217 218
	.check_atapi_dma	= pdc_old_sata_check_atapi_dma,
};
219

220 221 222
static struct ata_port_operations pdc_pata_ops = {
	.inherits		= &pdc_common_ops,
	.cable_detect		= pdc_pata_cable_detect,
223 224
	.freeze			= pdc_freeze,
	.thaw			= pdc_thaw,
225
	.port_start		= pdc_common_port_start,
226
	.softreset		= pdc_pata_softreset,
227 228
};

229
static const struct ata_port_info pdc_port_info[] = {
Mikael Pettersson's avatar
Mikael Pettersson committed
230
	[board_2037x] =
Linus Torvalds's avatar
Linus Torvalds committed
231
	{
232 233
		.flags		= PDC_COMMON_FLAGS | ATA_FLAG_SATA |
				  PDC_FLAG_SATA_PATA,
234 235
		.pio_mask	= ATA_PIO4,
		.mwdma_mask	= ATA_MWDMA2,
236
		.udma_mask	= ATA_UDMA6,
237
		.port_ops	= &pdc_old_sata_ops,
Linus Torvalds's avatar
Linus Torvalds committed
238 239
	},

Mikael Pettersson's avatar
Mikael Pettersson committed
240
	[board_2037x_pata] =
241 242
	{
		.flags		= PDC_COMMON_FLAGS | ATA_FLAG_SLAVE_POSS,
243 244
		.pio_mask	= ATA_PIO4,
		.mwdma_mask	= ATA_MWDMA2,
245
		.udma_mask	= ATA_UDMA6,
246 247 248
		.port_ops	= &pdc_pata_ops,
	},

Mikael Pettersson's avatar
Mikael Pettersson committed
249
	[board_20319] =
Linus Torvalds's avatar
Linus Torvalds committed
250
	{
251 252
		.flags		= PDC_COMMON_FLAGS | ATA_FLAG_SATA |
				  PDC_FLAG_4_PORTS,
253 254
		.pio_mask	= ATA_PIO4,
		.mwdma_mask	= ATA_MWDMA2,
255
		.udma_mask	= ATA_UDMA6,
256
		.port_ops	= &pdc_old_sata_ops,
Linus Torvalds's avatar
Linus Torvalds committed
257
	},
258

Mikael Pettersson's avatar
Mikael Pettersson committed
259
	[board_20619] =
260
	{
261 262
		.flags		= PDC_COMMON_FLAGS | ATA_FLAG_SLAVE_POSS |
				  PDC_FLAG_4_PORTS,
263 264
		.pio_mask	= ATA_PIO4,
		.mwdma_mask	= ATA_MWDMA2,
265
		.udma_mask	= ATA_UDMA6,
266
		.port_ops	= &pdc_pata_ops,
267
	},
268

Mikael Pettersson's avatar
Mikael Pettersson committed
269
	[board_2057x] =
270
	{
271 272
		.flags		= PDC_COMMON_FLAGS | ATA_FLAG_SATA |
				  PDC_FLAG_GEN_II | PDC_FLAG_SATA_PATA,
273 274
		.pio_mask	= ATA_PIO4,
		.mwdma_mask	= ATA_MWDMA2,
275
		.udma_mask	= ATA_UDMA6,
276 277 278
		.port_ops	= &pdc_sata_ops,
	},

Mikael Pettersson's avatar
Mikael Pettersson committed
279
	[board_2057x_pata] =
280
	{
281
		.flags		= PDC_COMMON_FLAGS | ATA_FLAG_SLAVE_POSS |
282
				  PDC_FLAG_GEN_II,
283 284
		.pio_mask	= ATA_PIO4,
		.mwdma_mask	= ATA_MWDMA2,
285
		.udma_mask	= ATA_UDMA6,
286 287 288
		.port_ops	= &pdc_pata_ops,
	},

Mikael Pettersson's avatar
Mikael Pettersson committed
289
	[board_40518] =
290
	{
291 292
		.flags		= PDC_COMMON_FLAGS | ATA_FLAG_SATA |
				  PDC_FLAG_GEN_II | PDC_FLAG_4_PORTS,
293 294
		.pio_mask	= ATA_PIO4,
		.mwdma_mask	= ATA_MWDMA2,
295
		.udma_mask	= ATA_UDMA6,
296 297
		.port_ops	= &pdc_sata_ops,
	},
Linus Torvalds's avatar
Linus Torvalds committed
298 299
};

300
static const struct pci_device_id pdc_ata_pci_tbl[] = {
301 302 303 304
	{ PCI_VDEVICE(PROMISE, 0x3371), board_2037x },
	{ PCI_VDEVICE(PROMISE, 0x3373), board_2037x },
	{ PCI_VDEVICE(PROMISE, 0x3375), board_2037x },
	{ PCI_VDEVICE(PROMISE, 0x3376), board_2037x },
305 306
	{ PCI_VDEVICE(PROMISE, 0x3570), board_2057x },
	{ PCI_VDEVICE(PROMISE, 0x3571), board_2057x },
307
	{ PCI_VDEVICE(PROMISE, 0x3574), board_2057x },
308
	{ PCI_VDEVICE(PROMISE, 0x3577), board_2057x },
309
	{ PCI_VDEVICE(PROMISE, 0x3d73), board_2057x },
310 311 312 313
	{ PCI_VDEVICE(PROMISE, 0x3d75), board_2057x },

	{ PCI_VDEVICE(PROMISE, 0x3318), board_20319 },
	{ PCI_VDEVICE(PROMISE, 0x3319), board_20319 },
314 315
	{ PCI_VDEVICE(PROMISE, 0x3515), board_40518 },
	{ PCI_VDEVICE(PROMISE, 0x3519), board_40518 },
316
	{ PCI_VDEVICE(PROMISE, 0x3d17), board_40518 },
317 318 319
	{ PCI_VDEVICE(PROMISE, 0x3d18), board_40518 },

	{ PCI_VDEVICE(PROMISE, 0x6629), board_20619 },
320

Linus Torvalds's avatar
Linus Torvalds committed
321 322 323 324 325 326 327 328 329 330
	{ }	/* terminate list */
};

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,
};

331
static int pdc_common_port_start(struct ata_port *ap)
Linus Torvalds's avatar
Linus Torvalds committed
332
{
Jeff Garzik's avatar
Jeff Garzik committed
333
	struct device *dev = ap->host->dev;
Linus Torvalds's avatar
Linus Torvalds committed
334 335 336
	struct pdc_port_priv *pp;
	int rc;

337 338
	/* we use the same prd table as bmdma, allocate it */
	rc = ata_bmdma_port_start(ap);
Linus Torvalds's avatar
Linus Torvalds committed
339 340 341
	if (rc)
		return rc;

342 343 344
	pp = devm_kzalloc(dev, sizeof(*pp), GFP_KERNEL);
	if (!pp)
		return -ENOMEM;
Linus Torvalds's avatar
Linus Torvalds committed
345

346 347 348
	pp->pkt = dmam_alloc_coherent(dev, 128, &pp->pkt_dma, GFP_KERNEL);
	if (!pp->pkt)
		return -ENOMEM;
Linus Torvalds's avatar
Linus Torvalds committed
349 350 351

	ap->private_data = pp;

352 353 354 355 356 357 358 359 360 361 362
	return 0;
}

static int pdc_sata_port_start(struct ata_port *ap)
{
	int rc;

	rc = pdc_common_port_start(ap);
	if (rc)
		return rc;

363
	/* fix up PHYMODE4 align timing */
364
	if (ap->flags & PDC_FLAG_GEN_II) {
365
		void __iomem *sata_mmio = ap->ioaddr.scr_addr;
366 367
		unsigned int tmp;

368
		tmp = readl(sata_mmio + PDC_PHYMODE4);
369
		tmp = (tmp & ~3) | 1;	/* set bits 1:0 = 0:1 */
370
		writel(tmp, sata_mmio + PDC_PHYMODE4);
371 372
	}

Linus Torvalds's avatar
Linus Torvalds committed
373 374 375
	return 0;
}

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 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432
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);
}

Linus Torvalds's avatar
Linus Torvalds committed
433 434
static void pdc_reset_port(struct ata_port *ap)
{
435
	void __iomem *ata_ctlstat_mmio = ap->ioaddr.cmd_addr + PDC_CTLSTAT;
Linus Torvalds's avatar
Linus Torvalds committed
436 437 438
	unsigned int i;
	u32 tmp;

439 440 441 442 443 444 445
	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);

Linus Torvalds's avatar
Linus Torvalds committed
446
	for (i = 11; i > 0; i--) {
447
		tmp = readl(ata_ctlstat_mmio);
Linus Torvalds's avatar
Linus Torvalds committed
448 449 450 451 452 453
		if (tmp & PDC_RESET)
			break;

		udelay(100);

		tmp |= PDC_RESET;
454
		writel(tmp, ata_ctlstat_mmio);
Linus Torvalds's avatar
Linus Torvalds committed
455 456 457
	}

	tmp &= ~PDC_RESET;
458 459
	writel(tmp, ata_ctlstat_mmio);
	readl(ata_ctlstat_mmio);	/* flush */
460 461 462 463 464

	if (sata_scr_valid(&ap->link) && (ap->flags & PDC_FLAG_GEN_II)) {
		pdc_fpdma_reset(ap);
		pdc_clear_internal_debug_record_error_register(ap);
	}
Linus Torvalds's avatar
Linus Torvalds committed
465 466
}

467
static int pdc_pata_cable_detect(struct ata_port *ap)
468
{
469
	u8 tmp;
470
	void __iomem *ata_mmio = ap->ioaddr.cmd_addr;
471

472
	tmp = readb(ata_mmio + PDC_CTLSTAT + 3);
473 474 475 476 477 478 479
	if (tmp & 0x01)
		return ATA_CBL_PATA40;
	return ATA_CBL_PATA80;
}

static int pdc_sata_cable_detect(struct ata_port *ap)
{
480
	return ATA_CBL_SATA;
481
}
482

483 484
static int pdc_sata_scr_read(struct ata_link *link,
			     unsigned int sc_reg, u32 *val)
Linus Torvalds's avatar
Linus Torvalds committed
485
{
486
	if (sc_reg > SCR_CONTROL)
487
		return -EINVAL;
488
	*val = readl(link->ap->ioaddr.scr_addr + (sc_reg * 4));
489
	return 0;
Linus Torvalds's avatar
Linus Torvalds committed
490 491
}

492 493
static int pdc_sata_scr_write(struct ata_link *link,
			      unsigned int sc_reg, u32 val)
Linus Torvalds's avatar
Linus Torvalds committed
494
{
495
	if (sc_reg > SCR_CONTROL)
496
		return -EINVAL;
497
	writel(val, link->ap->ioaddr.scr_addr + (sc_reg * 4));
498
	return 0;
Linus Torvalds's avatar
Linus Torvalds committed
499 500
}

501
static void pdc_atapi_pkt(struct ata_queued_cmd *qc)
502
{
503
	struct ata_port *ap = qc->ap;
504
	dma_addr_t sg_table = ap->bmdma_prd_dma;
505 506 507 508
	unsigned int cdb_len = qc->dev->cdb_len;
	u8 *cdb = qc->cdb;
	struct pdc_port_priv *pp = ap->private_data;
	u8 *buf = pp->pkt;
Al Viro's avatar
Al Viro committed
509
	__le32 *buf32 = (__le32 *) buf;
510
	unsigned int dev_sel, feature;
511 512 513 514

	/* set control bits (byte 0), zero delay seq id (byte 3),
	 * and seq id (byte 2)
	 */
515
	switch (qc->tf.protocol) {
516
	case ATAPI_PROT_DMA:
517 518 519 520 521
		if (!(qc->tf.flags & ATA_TFLAG_WRITE))
			buf32[0] = cpu_to_le32(PDC_PKT_READ);
		else
			buf32[0] = 0;
		break;
522
	case ATAPI_PROT_NODATA:
523 524 525 526 527 528
		buf32[0] = cpu_to_le32(PDC_PKT_NODATA);
		break;
	default:
		BUG();
		break;
	}
529 530 531
	buf32[1] = cpu_to_le32(sg_table);	/* S/G table addr */
	buf32[2] = 0;				/* no next-packet */

532
	/* select drive */
533
	if (sata_scr_valid(&ap->link))
534
		dev_sel = PDC_DEVICE_SATA;
535 536 537
	else
		dev_sel = qc->tf.device;

538 539 540 541 542 543
	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;
544
	buf[17] = qc->tf.nsect;
545
	buf[18] = (1 << 5) | ATA_REG_LBAL;
546
	buf[19] = qc->tf.lbal;
547 548

	/* set feature and byte counter registers */
549
	if (qc->tf.protocol != ATAPI_PROT_DMA)
550
		feature = PDC_FEATURE_ATAPI_PIO;
551
	else
552
		feature = PDC_FEATURE_ATAPI_DMA;
553

554 555 556
	buf[20] = (1 << 5) | ATA_REG_FEATURE;
	buf[21] = feature;
	buf[22] = (1 << 5) | ATA_REG_BYTEL;
557
	buf[23] = qc->tf.lbam;
558
	buf[24] = (1 << 5) | ATA_REG_BYTEH;
559
	buf[25] = qc->tf.lbah;
560 561 562

	/* send ATAPI packet command 0xA0 */
	buf[26] = (1 << 5) | ATA_REG_CMD;
563
	buf[27] = qc->tf.command;
564 565 566 567 568

	/* select drive and check DRQ */
	buf[28] = (1 << 5) | ATA_REG_DEVICE | PDC_PKT_WAIT_DRDY;
	buf[29] = dev_sel;

569 570 571
	/* we can represent cdb lengths 2/4/6/8/10/12/14/16 */
	BUG_ON(cdb_len & ~0x1E);

572 573 574
	/* 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);
575 576
}

577 578 579 580 581 582 583 584 585 586 587 588 589 590 591
/**
 *	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;
592
	struct ata_bmdma_prd *prd = ap->bmdma_prd;
593 594
	struct scatterlist *sg;
	const u32 SG_COUNT_ASIC_BUG = 41*4;
Tejun Heo's avatar
Tejun Heo committed
595 596
	unsigned int si, idx;
	u32 len;
597 598 599 600 601

	if (!(qc->flags & ATA_QCFLAG_DMAMAP))
		return;

	idx = 0;
Tejun Heo's avatar
Tejun Heo committed
602
	for_each_sg(qc->sg, sg, qc->n_elem, si) {
603
		u32 addr, offset;
604
		u32 sg_len;
605 606 607 608 609 610 611 612 613 614 615 616 617 618

		/* 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;

619 620
			prd[idx].addr = cpu_to_le32(addr);
			prd[idx].flags_len = cpu_to_le32(len & 0xffff);
621 622 623 624 625 626 627 628
			VPRINTK("PRD[%u] = (0x%X, 0x%X)\n", idx, addr, len);

			idx++;
			sg_len -= len;
			addr += len;
		}
	}

629
	len = le32_to_cpu(prd[idx - 1].flags_len);
630

Tejun Heo's avatar
Tejun Heo committed
631 632
	if (len > SG_COUNT_ASIC_BUG) {
		u32 addr;
633

Tejun Heo's avatar
Tejun Heo committed
634
		VPRINTK("Splitting last PRD.\n");
635

636 637
		addr = le32_to_cpu(prd[idx - 1].addr);
		prd[idx - 1].flags_len = cpu_to_le32(len - SG_COUNT_ASIC_BUG);
Tejun Heo's avatar
Tejun Heo committed
638
		VPRINTK("PRD[%u] = (0x%X, 0x%X)\n", idx - 1, addr, SG_COUNT_ASIC_BUG);
639

Tejun Heo's avatar
Tejun Heo committed
640 641
		addr = addr + len - SG_COUNT_ASIC_BUG;
		len = SG_COUNT_ASIC_BUG;
642 643
		prd[idx].addr = cpu_to_le32(addr);
		prd[idx].flags_len = cpu_to_le32(len);
Tejun Heo's avatar
Tejun Heo committed
644
		VPRINTK("PRD[%u] = (0x%X, 0x%X)\n", idx, addr, len);
645

Tejun Heo's avatar
Tejun Heo committed
646
		idx++;
647
	}
Tejun Heo's avatar
Tejun Heo committed
648

649
	prd[idx - 1].flags_len |= cpu_to_le32(ATA_PRD_EOT);
650 651
}

Linus Torvalds's avatar
Linus Torvalds committed
652 653 654 655 656 657 658 659 660
static void pdc_qc_prep(struct ata_queued_cmd *qc)
{
	struct pdc_port_priv *pp = qc->ap->private_data;
	unsigned int i;

	VPRINTK("ENTER\n");

	switch (qc->tf.protocol) {
	case ATA_PROT_DMA:
661
		pdc_fill_sg(qc);
662
		/*FALLTHROUGH*/
Linus Torvalds's avatar
Linus Torvalds committed
663
	case ATA_PROT_NODATA:
664
		i = pdc_pkt_header(&qc->tf, qc->ap->bmdma_prd_dma,
Linus Torvalds's avatar
Linus Torvalds committed
665 666 667 668 669 670 671
				   qc->dev->devno, pp->pkt);
		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);
		pdc_pkt_footer(&qc->tf, pp->pkt, i);
		break;
672
	case ATAPI_PROT_PIO:
673
		pdc_fill_sg(qc);
674
		break;
675
	case ATAPI_PROT_DMA:
676
		pdc_fill_sg(qc);
677
		/*FALLTHROUGH*/
678
	case ATAPI_PROT_NODATA:
679
		pdc_atapi_pkt(qc);
680
		break;
Linus Torvalds's avatar
Linus Torvalds committed
681 682 683 684 685
	default:
		break;
	}
}

686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709
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;

710
	for (i = 0; i < nr_ports && host->ports[i] != ap; ++i)
711 712 713 714 715
		;
	BUG_ON(i >= nr_ports);
	return pdc_port_no_to_ata_no(i, pdc_is_sataii_tx4(ap->flags));
}

716 717
static void pdc_freeze(struct ata_port *ap)
{
718
	void __iomem *ata_mmio = ap->ioaddr.cmd_addr;
719 720
	u32 tmp;

721
	tmp = readl(ata_mmio + PDC_CTLSTAT);
722 723
	tmp |= PDC_IRQ_DISABLE;
	tmp &= ~PDC_DMA_ENABLE;
724 725
	writel(tmp, ata_mmio + PDC_CTLSTAT);
	readl(ata_mmio + PDC_CTLSTAT); /* flush */
726 727
}

728 729 730 731
static void pdc_sata_freeze(struct ata_port *ap)
{
	struct ata_host *host = ap->host;
	void __iomem *host_mmio = host->iomap[PDC_MMIO_BAR];
732
	unsigned int hotplug_offset = PDC2_SATA_PLUG_CSR;
733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750
	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);
}

751 752
static void pdc_thaw(struct ata_port *ap)
{
753
	void __iomem *ata_mmio = ap->ioaddr.cmd_addr;
754 755 756
	u32 tmp;

	/* clear IRQ */
757
	readl(ata_mmio + PDC_COMMAND);
758 759

	/* turn IRQ back on */
760
	tmp = readl(ata_mmio + PDC_CTLSTAT);
761
	tmp &= ~PDC_IRQ_DISABLE;
762 763
	writel(tmp, ata_mmio + PDC_CTLSTAT);
	readl(ata_mmio + PDC_CTLSTAT); /* flush */
764 765
}

766 767 768 769
static void pdc_sata_thaw(struct ata_port *ap)
{
	struct ata_host *host = ap->host;
	void __iomem *host_mmio = host->iomap[PDC_MMIO_BAR];
770
	unsigned int hotplug_offset = PDC2_SATA_PLUG_CSR;
771 772 773 774 775 776 777 778 779 780 781 782 783 784 785
	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 */
}

786 787 788 789 790 791 792
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);
}

793 794 795 796 797 798 799 800 801 802 803 804 805 806
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);
807
	struct pdc_host_priv *hpriv = ap->host->private_data;
808 809
	u8 tmp;

810
	spin_lock(&hpriv->hard_reset_lock);
811 812 813 814 815 816 817 818 819 820

	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 */

821
	spin_unlock(&hpriv->hard_reset_lock);
822 823
}

824 825 826
static int pdc_sata_hardreset(struct ata_link *link, unsigned int *class,
			      unsigned long deadline)
{
827 828 829 830
	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);
831
	pdc_reset_port(link->ap);
832 833 834 835 836 837

	/* 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);
838 839
}

840
static void pdc_error_handler(struct ata_port *ap)
841 842 843 844
{
	if (!(ap->pflags & ATA_PFLAG_FROZEN))
		pdc_reset_port(ap);

845
	ata_sff_error_handler(ap);
846 847
}

848 849 850 851 852
static void pdc_post_internal_cmd(struct ata_queued_cmd *qc)
{
	struct ata_port *ap = qc->ap;

	/* make DMA engine forget about the failed command */
853
	if (qc->flags & ATA_QCFLAG_FAILED)
854 855 856
		pdc_reset_port(ap);
}

857 858 859
static void pdc_error_intr(struct ata_port *ap, struct ata_queued_cmd *qc,
			   u32 port_status, u32 err_mask)
{
Tejun Heo's avatar
Tejun Heo committed
860
	struct ata_eh_info *ehi = &ap->link.eh_info;
861 862 863 864 865 866 867 868 869
	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))
870
		ac_err_mask |= AC_ERR_OTHER;
871 872 873 874 875 876
	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;

877
	if (sata_scr_valid(&ap->link)) {
878 879
		u32 serror;

880
		pdc_sata_scr_read(&ap->link, SCR_ERROR, &serror);
881 882
		ehi->serror |= serror;
	}
883

884
	qc->err_mask |= ac_err_mask;
885 886

	pdc_reset_port(ap);
887 888

	ata_port_abort(ap);
889 890
}

891 892
static unsigned int pdc_host_intr(struct ata_port *ap,
				  struct ata_queued_cmd *qc)
Linus Torvalds's avatar
Linus Torvalds committed
893
{
894
	unsigned int handled = 0;
895
	void __iomem *ata_mmio = ap->ioaddr.cmd_addr;
896 897 898
	u32 port_status, err_mask;

	err_mask = PDC_ERR_MASK;
899
	if (ap->flags & PDC_FLAG_GEN_II)
900 901 902
		err_mask &= ~PDC1_ERR_MASK;
	else
		err_mask &= ~PDC2_ERR_MASK;
903
	port_status = readl(ata_mmio + PDC_GLOBAL_CTL);
904 905 906
	if (unlikely(port_status & err_mask)) {
		pdc_error_intr(ap, qc, port_status, err_mask);
		return 1;
Linus Torvalds's avatar
Linus Torvalds committed
907 908 909 910 911
	}

	switch (qc->tf.protocol) {
	case ATA_PROT_DMA:
	case ATA_PROT_NODATA:
912 913
	case ATAPI_PROT_DMA:
	case ATAPI_PROT_NODATA:
914 915
		qc->err_mask |= ac_err_mask(ata_wait_idle(ap));
		ata_qc_complete(qc);
Linus Torvalds's avatar
Linus Torvalds committed
916 917
		handled = 1;
		break;
Mikael Pettersson's avatar
Mikael Pettersson committed
918
	default:
919 920
		ap->stats.idle_irq++;
		break;
Mikael Pettersson's avatar
Mikael Pettersson committed
921
	}
Linus Torvalds's avatar
Linus Torvalds committed
922

923
	return handled;
Linus Torvalds's avatar
Linus Torvalds committed
924 925 926 927
}

static void pdc_irq_clear(struct ata_port *ap)
{
928
	void __iomem *ata_mmio = ap->ioaddr.cmd_addr;
Linus Torvalds's avatar
Linus Torvalds committed
929

930
	readl(ata_mmio + PDC_COMMAND);
Linus Torvalds's avatar
Linus Torvalds committed
931 932
}

933
static irqreturn_t pdc_interrupt(int irq, void *dev_instance)
Linus Torvalds's avatar
Linus Torvalds committed
934
{
Jeff Garzik's avatar
Jeff Garzik committed
935
	struct ata_host *host = dev_instance;
Linus Torvalds's avatar
Linus Torvalds committed
936 937 938 939
	struct ata_port *ap;
	u32 mask = 0;
	unsigned int i, tmp;
	unsigned int handled = 0;
940
	void __iomem *host_mmio;
941 942 943
	unsigned int hotplug_offset, ata_no;
	u32 hotplug_status;
	int is_sataii_tx4;
Linus Torvalds's avatar
Linus Torvalds committed
944 945 946

	VPRINTK("ENTER\n");

Tejun Heo's avatar
Tejun Heo committed
947
	if (!host || !host->iomap[PDC_MMIO_BAR]) {
Linus Torvalds's avatar
Linus Torvalds committed
948 949 950 951
		VPRINTK("QUICK EXIT\n");
		return IRQ_NONE;
	}

952
	host_mmio = host->iomap[PDC_MMIO_BAR];
Linus Torvalds's avatar
Linus Torvalds committed
953

954 955
	spin_lock(&host->lock);

956
	/* read and clear hotplug flags for all ports */
957
	if (host->ports[0]->flags & PDC_FLAG_GEN_II) {
958
		hotplug_offset = PDC2_SATA_PLUG_CSR;
959 960 961 962 963 964
		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;
965

Linus Torvalds's avatar
Linus Torvalds committed
966
	/* reading should also clear interrupts */
967
	mask = readl(host_mmio + PDC_INT_SEQMASK);
Linus Torvalds's avatar
Linus Torvalds committed
968

969
	if (mask == 0xffffffff && hotplug_status == 0) {
Linus Torvalds's avatar
Linus Torvalds committed
970
		VPRINTK("QUICK EXIT 2\n");
971
		goto done_irq;
Linus Torvalds's avatar
Linus Torvalds committed
972
	}
973

974
	mask &= 0xffff;		/* only 16 SEQIDs possible */
975
	if (mask == 0 && hotplug_status == 0) {
Linus Torvalds's avatar
Linus Torvalds committed
976
		VPRINTK("QUICK EXIT 3\n");
977
		goto done_irq;
Linus Torvalds's avatar
Linus Torvalds committed
978 979
	}

980
	writel(mask, host_mmio + PDC_INT_SEQMASK);
Linus Torvalds's avatar
Linus Torvalds committed
981

982 983
	is_sataii_tx4 = pdc_is_sataii_tx4(host->ports[0]->flags);

Jeff Garzik's avatar
Jeff Garzik committed
984
	for (i = 0; i < host->n_ports; i++) {
Linus Torvalds's avatar
Linus Torvalds committed
985
		VPRINTK("port %u\n", i);
Jeff Garzik's avatar
Jeff Garzik committed
986
		ap = host->ports[i];
987 988 989 990

		/* 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);
Tejun Heo's avatar
Tejun Heo committed
991
		if (tmp) {
Tejun Heo's avatar
Tejun Heo committed
992
			struct ata_eh_info *ehi = &ap->link.eh_info;
993 994 995 996 997 998 999 1000 1001
			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 */
Linus Torvalds's avatar
Linus Torvalds committed
1002
		tmp = mask & (1 << (i + 1));
Tejun Heo's avatar
Tejun Heo committed
1003
		if (tmp) {
Linus Torvalds's avatar
Linus Torvalds committed
1004 1005
			struct ata_queued_cmd *qc;

Tejun Heo's avatar
Tejun Heo committed
1006
			qc = ata_qc_from_tag(ap, ap->link.active_tag);
1007
			if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING)))
Linus Torvalds's avatar
Linus Torvalds committed
1008 1009 1010 1011 1012 1013
				handled += pdc_host_intr(ap, qc);
		}
	}

	VPRINTK("EXIT\n");

1014
done_irq:
Jeff Garzik's avatar
Jeff Garzik committed
1015
	spin_unlock(&host->lock);
Linus Torvalds's avatar
Linus Torvalds committed
1016 1017 1018
	return IRQ_RETVAL(handled);
}

1019
static void pdc_packet_start(struct ata_queued_cmd *qc)
Linus Torvalds's avatar
Linus Torvalds committed
1020 1021 1022
{
	struct ata_port *ap = qc->ap;
	struct pdc_port_priv *pp = ap->private_data;
1023 1024
	void __iomem *host_mmio = ap->host->iomap[PDC_MMIO_BAR];
	void __iomem *ata_mmio = ap->ioaddr.cmd_addr;
Linus Torvalds's avatar
Linus Torvalds committed
1025 1026 1027 1028 1029
	unsigned int port_no = ap->port_no;
	u8 seq = (u8) (port_no + 1);

	VPRINTK("ENTER, ap %p\n", ap);

1030 1031
	writel(0x00000001, host_mmio + (seq * 4));
	readl(host_mmio + (seq * 4));	/* flush */
Linus Torvalds's avatar
Linus Torvalds committed
1032 1033 1034

	pp->pkt[2] = seq;
	wmb();			/* flush PRD, pkt writes */
1035 1036
	writel(pp->pkt_dma, ata_mmio + PDC_PKT_SUBMIT);
	readl(ata_mmio + PDC_PKT_SUBMIT); /* flush */
Linus Torvalds's avatar
Linus Torvalds committed
1037 1038
}

Tejun Heo's avatar
Tejun Heo committed
1039
static unsigned int pdc_qc_issue(struct ata_queued_cmd *qc)
Linus Torvalds's avatar
Linus Torvalds committed
1040 1041
{
	switch (qc->tf.protocol) {
1042
	case ATAPI_PROT_NODATA:
1043 1044 1045
		if (qc->dev->flags & ATA_DFLAG_CDB_INTR)
			break;
		/*FALLTHROUGH*/
1046 1047 1048 1049
	case ATA_PROT_NODATA:
		if (qc->tf.flags & ATA_TFLAG_POLLING)
			break;
		/*FALLTHROUGH*/
1050
	case ATAPI_PROT_DMA:
Linus Torvalds's avatar
Linus Torvalds committed
1051 1052 1053 1054 1055 1056
	case ATA_PROT_DMA:
		pdc_packet_start(qc);
		return 0;
	default:
		break;
	}
Tejun Heo's avatar
Tejun Heo committed
1057
	return ata_sff_qc_issue(qc);
Linus Torvalds's avatar
Linus Torvalds committed
1058 1059
}

1060
static void pdc_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile *tf)
Linus Torvalds's avatar
Linus Torvalds committed
1061
{
1062
	WARN_ON(tf->protocol == ATA_PROT_DMA || tf->protocol == ATAPI_PROT_DMA);
Tejun Heo's avatar
Tejun Heo committed
1063
	ata_sff_tf_load(ap, tf);
Linus Torvalds's avatar
Linus Torvalds committed
1064 1065
}

1066 1067
static void pdc_exec_command_mmio(struct ata_port *ap,
				  const struct ata_taskfile *tf)
Linus Torvalds's avatar
Linus Torvalds committed
1068
{
1069
	WARN_ON(tf->protocol == ATA_PROT_DMA || tf->protocol == ATAPI_PROT_DMA);
Tejun Heo's avatar
Tejun Heo committed
1070
	ata_sff_exec_command(ap, tf);
Linus Torvalds's avatar
Linus Torvalds committed
1071 1072
}

1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091
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) {
1092 1093 1094 1095 1096
		unsigned int lba =
			(scsicmd[2] << 24) |
			(scsicmd[3] << 16) |
			(scsicmd[4] << 8) |
			scsicmd[5];
1097 1098 1099 1100 1101 1102
		if (lba >= 0xFFFF4FA2)
			pio = 1;
	}
	return pio;
}

1103
static int pdc_old_sata_check_atapi_dma(struct ata_queued_cmd *qc)
1104 1105
{
	/* First generation chips cannot use ATAPI DMA on SATA ports */
1106
	return 1;
1107
}
Linus Torvalds's avatar
Linus Torvalds committed
1108

1109 1110
static void pdc_ata_setup_port(struct ata_port *ap,
			       void __iomem *base, void __iomem *scr_addr)
Linus Torvalds's avatar
Linus Torvalds committed
1111
{
1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125
	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;
Linus Torvalds's avatar
Linus Torvalds committed
1126 1127
}

1128
static void pdc_host_init(struct ata_host *host)
Linus Torvalds's avatar
Linus Torvalds committed
1129
{
1130
	void __iomem *host_mmio = host->iomap[PDC_MMIO_BAR];
1131
	int is_gen2 = host->ports[0]->flags & PDC_FLAG_GEN_II;
1132
	int hotplug_offset;
Linus Torvalds's avatar
Linus Torvalds committed
1133 1134
	u32 tmp;

1135
	if (is_gen2)
1136 1137 1138 1139
		hotplug_offset = PDC2_SATA_PLUG_CSR;
	else
		hotplug_offset = PDC_SATA_PLUG_CSR;

Linus Torvalds's avatar
Linus Torvalds committed
1140 1141 1142 1143 1144 1145
	/*
	 * Except for the hotplug stuff, this is voodoo from the
	 * Promise driver.  Label this entire section
	 * "TODO: figure out why we do this"
	 */

1146
	/* enable BMR_BURST, maybe change FIFO_SHD to 8 dwords */
1147
	tmp = readl(host_mmio + PDC_FLASH_CTL);
1148
	tmp |= 0x02000;	/* bit 13 (enable bmr burst) */
1149
	if (!is_gen2)
1150
		tmp |= 0x10000;	/* bit 16 (fifo threshold at 8 dw) */
1151
	writel(tmp, host_mmio + PDC_FLASH_CTL);
Linus Torvalds's avatar
Linus Torvalds committed
1152 1153

	/* clear plug/unplug flags for all ports */
1154 1155
	tmp = readl(host_mmio + hotplug_offset);
	writel(tmp | 0xff, host_mmio + hotplug_offset);
Linus Torvalds's avatar
Linus Torvalds committed
1156

1157
	tmp = readl(host_mmio + hotplug_offset);
1158 1159 1160 1161
	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);
Linus Torvalds's avatar
Linus Torvalds committed
1162

1163
	/* don't initialise TBG or SLEW on 2nd generation chips */
1164
	if (is_gen2)
1165 1166
		return;

Linus Torvalds's avatar
Linus Torvalds committed
1167
	/* reduce TBG clock to 133 Mhz. */
1168
	tmp = readl(host_mmio + PDC_TBG_MODE);
Linus Torvalds's avatar
Linus Torvalds committed
1169 1170
	tmp &= ~0x30000; /* clear bit 17, 16*/
	tmp |= 0x10000;  /* set bit 17:16 = 0:1 */
1171
	writel(tmp, host_mmio + PDC_TBG_MODE);
Linus Torvalds's avatar
Linus Torvalds committed
1172

1173
	readl(host_mmio + PDC_TBG_MODE);	/* flush */
Linus Torvalds's avatar
Linus Torvalds committed
1174 1175 1176
	msleep(10);

	/* adjust slew rate control register. */
1177
	tmp = readl(host_mmio + PDC_SLEW_CTL);
Linus Torvalds's avatar
Linus Torvalds committed
1178 1179
	tmp &= 0xFFFFF03F; /* clear bit 11 ~ 6 */
	tmp  |= 0x00000900; /* set bit 11-9 = 100b , bit 8-6 = 100 */
1180
	writel(tmp, host_mmio + PDC_SLEW_CTL);
Linus Torvalds's avatar
Linus Torvalds committed
1181 1182
}

1183 1184
static int pdc_ata_init_one(struct pci_dev *pdev,
			    const struct pci_device_id *ent)
Linus Torvalds's avatar
Linus Torvalds committed
1185
{
1186 1187 1188
	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;
1189
	struct pdc_host_priv *hpriv;
1190
	void __iomem *host_mmio;
1191
	int n_ports, i, rc;
1192
	int is_sataii_tx4;
Linus Torvalds's avatar
Linus Torvalds committed
1193

1194
	ata_print_version_once(&pdev->dev, DRV_VERSION);
Linus Torvalds's avatar
Linus Torvalds committed
1195

1196
	/* enable and acquire resources */
1197
	rc = pcim_enable_device(pdev);
Linus Torvalds's avatar
Linus Torvalds committed
1198 1199 1200
	if (rc)
		return rc;

Tejun Heo's avatar
Tejun Heo committed
1201 1202
	rc = pcim_iomap_regions(pdev, 1 << PDC_MMIO_BAR, DRV_NAME);
	if (rc == -EBUSY)
1203
		pcim_pin_device(pdev);
Tejun Heo's avatar
Tejun Heo committed
1204
	if (rc)
1205
		return rc;
1206
	host_mmio = pcim_iomap_table(pdev)[PDC_MMIO_BAR];
Linus Torvalds's avatar
Linus Torvalds committed
1207

1208 1209 1210 1211 1212 1213
	/* 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;
Linus Torvalds's avatar
Linus Torvalds committed
1214

1215
	if (pi->flags & PDC_FLAG_SATA_PATA) {
1216
		u8 tmp = readb(host_mmio + PDC_FLASH_CTL + 1);
Mikael Pettersson's avatar
Mikael Pettersson committed
1217
		if (!(tmp & 0x80))
1218 1219
			ppi[n_ports++] = pi + 1;
	}
Linus Torvalds's avatar
Linus Torvalds committed
1220

1221 1222
	host = ata_host_alloc_pinfo(&pdev->dev, ppi, n_ports);
	if (!host) {
1223
		dev_err(&pdev->dev, "failed to allocate host\n");
1224
		return -ENOMEM;
Linus Torvalds's avatar
Linus Torvalds committed
1225
	}
1226 1227 1228 1229 1230
	hpriv = devm_kzalloc(&pdev->dev, sizeof *hpriv, GFP_KERNEL);
	if (!hpriv)
		return -ENOMEM;
	spin_lock_init(&hpriv->hard_reset_lock);
	host->private_data = hpriv;
1231
	host->iomap = pcim_iomap_table(pdev);
Linus Torvalds's avatar
Linus Torvalds committed
1232

Mikael Pettersson's avatar
Mikael Pettersson committed
1233
	is_sataii_tx4 = pdc_is_sataii_tx4(pi->flags);
1234
	for (i = 0; i < host->n_ports; i++) {
1235
		struct ata_port *ap = host->ports[i];
Mikael Pettersson's avatar
Mikael Pettersson committed
1236
		unsigned int ata_no = pdc_port_no_to_ata_no(i, is_sataii_tx4);
1237
		unsigned int ata_offset = 0x200 + ata_no * 0x80;
1238 1239
		unsigned int scr_offset = 0x400 + ata_no * 0x100;

1240
		pdc_ata_setup_port(ap, host_mmio + ata_offset, host_mmio + scr_offset);
1241 1242

		ata_port_pbar_desc(ap, PDC_MMIO_BAR, -1, "mmio");
1243
		ata_port_pbar_desc(ap, PDC_MMIO_BAR, ata_offset, "ata");
1244
	}
Linus Torvalds's avatar
Linus Torvalds committed
1245 1246

	/* initialize adapter */
1247
	pdc_host_init(host);
Linus Torvalds's avatar
Linus Torvalds committed
1248

1249
	rc = dma_set_mask(&pdev->dev, ATA_DMA_MASK);
1250 1251
	if (rc)
		return rc;
1252
	rc = dma_set_coherent_mask(&pdev->dev, ATA_DMA_MASK);
1253 1254
	if (rc)
		return rc;
Linus Torvalds's avatar
Linus Torvalds committed
1255

1256 1257 1258 1259
	/* start host, request IRQ and attach */
	pci_set_master(pdev);
	return ata_host_activate(host, pdev->irq, pdc_interrupt, IRQF_SHARED,
				 &pdc_ata_sht);
Linus Torvalds's avatar
Linus Torvalds committed
1260 1261
}

Axel Lin's avatar
Axel Lin committed
1262
module_pci_driver(pdc_ata_pci_driver);
Linus Torvalds's avatar
Linus Torvalds committed
1263 1264

MODULE_AUTHOR("Jeff Garzik");
1265
MODULE_DESCRIPTION("Promise ATA TX2/TX4/TX4000 low-level driver");
Linus Torvalds's avatar
Linus Torvalds committed
1266 1267 1268
MODULE_LICENSE("GPL");
MODULE_DEVICE_TABLE(pci, pdc_ata_pci_tbl);
MODULE_VERSION(DRV_VERSION);