sata_promise.c 34.1 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4
/*
 *  sata_promise.c - Promise SATA
 *
 *  Maintained by:  Jeff Garzik <jgarzik@pobox.com>
M
Mikael Pettersson 已提交
5
 *		    Mikael Pettersson <mikpe@it.uu.se>
L
Linus Torvalds 已提交
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 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.
L
Linus Torvalds 已提交
31 32 33 34 35 36 37 38 39 40
 *
 */

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/pci.h>
#include <linux/init.h>
#include <linux/blkdev.h>
#include <linux/delay.h>
#include <linux/interrupt.h>
41
#include <linux/device.h>
M
Mikael Pettersson 已提交
42
#include <scsi/scsi.h>
L
Linus Torvalds 已提交
43
#include <scsi/scsi_host.h>
44
#include <scsi/scsi_cmnd.h>
L
Linus Torvalds 已提交
45 46 47 48
#include <linux/libata.h>
#include "sata_promise.h"

#define DRV_NAME	"sata_promise"
49
#define DRV_VERSION	"2.12"
L
Linus Torvalds 已提交
50 51

enum {
52
	PDC_MAX_PORTS		= 4,
T
Tejun Heo 已提交
53
	PDC_MMIO_BAR		= 3,
54
	PDC_MAX_PRD		= LIBATA_MAX_PRD - 1, /* -1 for ASIC PRD bug workaround */
T
Tejun Heo 已提交
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) */
M
Mikael Pettersson 已提交
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) */
M
Mikael Pettersson 已提交
73
	PDC_ALTSTATUS		= 0x38, /* Alternate-status/device-control reg (per port) */
L
Linus Torvalds 已提交
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,
L
Linus Torvalds 已提交
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,
L
Linus Torvalds 已提交
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 */
M
Mikael Pettersson 已提交
116
	board_2057x_pata	= 5,	/* SATAII150 Tx2plus PATA port */
117
	board_40518		= 6,	/* SATAII150 Tx4 */
L
Linus Torvalds 已提交
118

119
	PDC_HAS_PATA		= (1 << 1), /* PDC20375/20575 has PATA */
L
Linus Torvalds 已提交
120

M
Mikael Pettersson 已提交
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),
L
Linus Torvalds 已提交
134
	PDC_RESET		= (1 << 11), /* HDMA reset */
135

136
	PDC_COMMON_FLAGS	= ATA_FLAG_NO_LEGACY |
M
Mikael Pettersson 已提交
137
				  ATA_FLAG_MMIO |
138
				  ATA_FLAG_PIO_POLLING,
139

140 141 142 143
	/* 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 */
L
Linus Torvalds 已提交
144 145 146 147 148 149 150
};

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

T
Tejun Heo 已提交
151 152
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);
M
Mikael Pettersson 已提交
153
static int pdc_ata_init_one(struct pci_dev *pdev, const struct pci_device_id *ent);
154 155
static int pdc_common_port_start(struct ata_port *ap);
static int pdc_sata_port_start(struct ata_port *ap);
L
Linus Torvalds 已提交
156
static void pdc_qc_prep(struct ata_queued_cmd *qc);
J
Jeff Garzik 已提交
157 158
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);
M
Mikael Pettersson 已提交
159
static int pdc_check_atapi_dma(struct ata_queued_cmd *qc);
160
static int pdc_old_sata_check_atapi_dma(struct ata_queued_cmd *qc);
L
Linus Torvalds 已提交
161
static void pdc_irq_clear(struct ata_port *ap);
T
Tejun Heo 已提交
162
static unsigned int pdc_qc_issue(struct ata_queued_cmd *qc);
163
static void pdc_freeze(struct ata_port *ap);
164
static void pdc_sata_freeze(struct ata_port *ap);
165
static void pdc_thaw(struct ata_port *ap);
166
static void pdc_sata_thaw(struct ata_port *ap);
167 168 169 170
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);
171
static void pdc_error_handler(struct ata_port *ap);
172
static void pdc_post_internal_cmd(struct ata_queued_cmd *qc);
173 174
static int pdc_pata_cable_detect(struct ata_port *ap);
static int pdc_sata_cable_detect(struct ata_port *ap);
175

176
static struct scsi_host_template pdc_ata_sht = {
177
	ATA_BASE_SHT(DRV_NAME),
178
	.sg_tablesize		= PDC_MAX_PRD,
L
Linus Torvalds 已提交
179 180 181
	.dma_boundary		= ATA_DMA_BOUNDARY,
};

182 183 184
static const struct ata_port_operations pdc_common_ops = {
	.inherits		= &ata_sff_port_ops,

T
Tejun Heo 已提交
185 186
	.sff_tf_load		= pdc_tf_load_mmio,
	.sff_exec_command	= pdc_exec_command_mmio,
M
Mikael Pettersson 已提交
187 188
	.check_atapi_dma	= pdc_check_atapi_dma,
	.qc_prep		= pdc_qc_prep,
T
Tejun Heo 已提交
189
	.qc_issue		= pdc_qc_issue,
A
Alan Cox 已提交
190

T
Tejun Heo 已提交
191
	.sff_irq_clear		= pdc_irq_clear,
A
Alan Cox 已提交
192
	.lost_interrupt		= ATA_OP_NULL,
M
Mikael Pettersson 已提交
193

194
	.post_internal_cmd	= pdc_post_internal_cmd,
195
	.error_handler		= pdc_error_handler,
M
Mikael Pettersson 已提交
196 197
};

198 199 200
static struct ata_port_operations pdc_sata_ops = {
	.inherits		= &pdc_common_ops,
	.cable_detect		= pdc_sata_cable_detect,
201 202
	.freeze			= pdc_sata_freeze,
	.thaw			= pdc_sata_thaw,
L
Linus Torvalds 已提交
203 204
	.scr_read		= pdc_sata_scr_read,
	.scr_write		= pdc_sata_scr_write,
205
	.port_start		= pdc_sata_port_start,
206
	.hardreset		= pdc_sata_hardreset,
L
Linus Torvalds 已提交
207 208
};

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

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

227
static const struct ata_port_info pdc_port_info[] = {
M
Mikael Pettersson 已提交
228
	[board_2037x] =
L
Linus Torvalds 已提交
229
	{
230 231
		.flags		= PDC_COMMON_FLAGS | ATA_FLAG_SATA |
				  PDC_FLAG_SATA_PATA,
232 233
		.pio_mask	= ATA_PIO4,
		.mwdma_mask	= ATA_MWDMA2,
234
		.udma_mask	= ATA_UDMA6,
M
Mikael Pettersson 已提交
235
		.port_ops	= &pdc_old_sata_ops,
L
Linus Torvalds 已提交
236 237
	},

M
Mikael Pettersson 已提交
238
	[board_2037x_pata] =
239 240
	{
		.flags		= PDC_COMMON_FLAGS | ATA_FLAG_SLAVE_POSS,
241 242
		.pio_mask	= ATA_PIO4,
		.mwdma_mask	= ATA_MWDMA2,
243
		.udma_mask	= ATA_UDMA6,
244 245 246
		.port_ops	= &pdc_pata_ops,
	},

M
Mikael Pettersson 已提交
247
	[board_20319] =
L
Linus Torvalds 已提交
248
	{
249 250
		.flags		= PDC_COMMON_FLAGS | ATA_FLAG_SATA |
				  PDC_FLAG_4_PORTS,
251 252
		.pio_mask	= ATA_PIO4,
		.mwdma_mask	= ATA_MWDMA2,
253
		.udma_mask	= ATA_UDMA6,
M
Mikael Pettersson 已提交
254
		.port_ops	= &pdc_old_sata_ops,
L
Linus Torvalds 已提交
255
	},
256

M
Mikael Pettersson 已提交
257
	[board_20619] =
258
	{
259 260
		.flags		= PDC_COMMON_FLAGS | ATA_FLAG_SLAVE_POSS |
				  PDC_FLAG_4_PORTS,
261 262
		.pio_mask	= ATA_PIO4,
		.mwdma_mask	= ATA_MWDMA2,
263
		.udma_mask	= ATA_UDMA6,
264
		.port_ops	= &pdc_pata_ops,
265
	},
266

M
Mikael Pettersson 已提交
267
	[board_2057x] =
268
	{
269 270
		.flags		= PDC_COMMON_FLAGS | ATA_FLAG_SATA |
				  PDC_FLAG_GEN_II | PDC_FLAG_SATA_PATA,
271 272
		.pio_mask	= ATA_PIO4,
		.mwdma_mask	= ATA_MWDMA2,
273
		.udma_mask	= ATA_UDMA6,
274 275 276
		.port_ops	= &pdc_sata_ops,
	},

M
Mikael Pettersson 已提交
277
	[board_2057x_pata] =
278
	{
279
		.flags		= PDC_COMMON_FLAGS | ATA_FLAG_SLAVE_POSS |
280
				  PDC_FLAG_GEN_II,
281 282
		.pio_mask	= ATA_PIO4,
		.mwdma_mask	= ATA_MWDMA2,
283
		.udma_mask	= ATA_UDMA6,
284 285 286
		.port_ops	= &pdc_pata_ops,
	},

M
Mikael Pettersson 已提交
287
	[board_40518] =
288
	{
289 290
		.flags		= PDC_COMMON_FLAGS | ATA_FLAG_SATA |
				  PDC_FLAG_GEN_II | PDC_FLAG_4_PORTS,
291 292
		.pio_mask	= ATA_PIO4,
		.mwdma_mask	= ATA_MWDMA2,
293
		.udma_mask	= ATA_UDMA6,
294 295
		.port_ops	= &pdc_sata_ops,
	},
L
Linus Torvalds 已提交
296 297
};

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

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

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

L
Linus Torvalds 已提交
319 320 321 322 323 324 325 326 327 328
	{ }	/* 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,
};

329
static int pdc_common_port_start(struct ata_port *ap)
L
Linus Torvalds 已提交
330
{
J
Jeff Garzik 已提交
331
	struct device *dev = ap->host->dev;
L
Linus Torvalds 已提交
332 333 334 335 336 337 338
	struct pdc_port_priv *pp;
	int rc;

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

339 340 341
	pp = devm_kzalloc(dev, sizeof(*pp), GFP_KERNEL);
	if (!pp)
		return -ENOMEM;
L
Linus Torvalds 已提交
342

343 344 345
	pp->pkt = dmam_alloc_coherent(dev, 128, &pp->pkt_dma, GFP_KERNEL);
	if (!pp->pkt)
		return -ENOMEM;
L
Linus Torvalds 已提交
346 347 348

	ap->private_data = pp;

349 350 351 352 353 354 355 356 357 358 359
	return 0;
}

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

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

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

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

L
Linus Torvalds 已提交
370 371 372
	return 0;
}

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

L
Linus Torvalds 已提交
430 431
static void pdc_reset_port(struct ata_port *ap)
{
432
	void __iomem *ata_ctlstat_mmio = ap->ioaddr.cmd_addr + PDC_CTLSTAT;
L
Linus Torvalds 已提交
433 434 435
	unsigned int i;
	u32 tmp;

436 437 438 439 440 441 442
	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);

L
Linus Torvalds 已提交
443
	for (i = 11; i > 0; i--) {
444
		tmp = readl(ata_ctlstat_mmio);
L
Linus Torvalds 已提交
445 446 447 448 449 450
		if (tmp & PDC_RESET)
			break;

		udelay(100);

		tmp |= PDC_RESET;
451
		writel(tmp, ata_ctlstat_mmio);
L
Linus Torvalds 已提交
452 453 454
	}

	tmp &= ~PDC_RESET;
455 456
	writel(tmp, ata_ctlstat_mmio);
	readl(ata_ctlstat_mmio);	/* flush */
457 458 459 460 461

	if (sata_scr_valid(&ap->link) && (ap->flags & PDC_FLAG_GEN_II)) {
		pdc_fpdma_reset(ap);
		pdc_clear_internal_debug_record_error_register(ap);
	}
L
Linus Torvalds 已提交
462 463
}

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

469
	tmp = readb(ata_mmio + PDC_CTLSTAT + 3);
470 471 472 473 474 475 476
	if (tmp & 0x01)
		return ATA_CBL_PATA40;
	return ATA_CBL_PATA80;
}

static int pdc_sata_cable_detect(struct ata_port *ap)
{
477
	return ATA_CBL_SATA;
478
}
479

T
Tejun Heo 已提交
480 481
static int pdc_sata_scr_read(struct ata_link *link,
			     unsigned int sc_reg, u32 *val)
L
Linus Torvalds 已提交
482
{
483
	if (sc_reg > SCR_CONTROL)
484
		return -EINVAL;
T
Tejun Heo 已提交
485
	*val = readl(link->ap->ioaddr.scr_addr + (sc_reg * 4));
486
	return 0;
L
Linus Torvalds 已提交
487 488
}

T
Tejun Heo 已提交
489 490
static int pdc_sata_scr_write(struct ata_link *link,
			      unsigned int sc_reg, u32 val)
L
Linus Torvalds 已提交
491
{
492
	if (sc_reg > SCR_CONTROL)
493
		return -EINVAL;
T
Tejun Heo 已提交
494
	writel(val, link->ap->ioaddr.scr_addr + (sc_reg * 4));
495
	return 0;
L
Linus Torvalds 已提交
496 497
}

498
static void pdc_atapi_pkt(struct ata_queued_cmd *qc)
M
Mikael Pettersson 已提交
499
{
500 501 502 503 504 505
	struct ata_port *ap = qc->ap;
	dma_addr_t sg_table = ap->prd_dma;
	unsigned int cdb_len = qc->dev->cdb_len;
	u8 *cdb = qc->cdb;
	struct pdc_port_priv *pp = ap->private_data;
	u8 *buf = pp->pkt;
A
Al Viro 已提交
506
	__le32 *buf32 = (__le32 *) buf;
507
	unsigned int dev_sel, feature;
M
Mikael Pettersson 已提交
508 509 510 511

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

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

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

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

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

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

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

M
Mikael Pettersson 已提交
566 567 568
	/* we can represent cdb lengths 2/4/6/8/10/12/14/16 */
	BUG_ON(cdb_len & ~0x1E);

569 570 571
	/* 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);
M
Mikael Pettersson 已提交
572 573
}

574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590
/**
 *	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;
	struct scatterlist *sg;
	const u32 SG_COUNT_ASIC_BUG = 41*4;
T
Tejun Heo 已提交
591 592
	unsigned int si, idx;
	u32 len;
593 594 595 596 597

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

	idx = 0;
T
Tejun Heo 已提交
598
	for_each_sg(qc->sg, sg, qc->n_elem, si) {
599
		u32 addr, offset;
600
		u32 sg_len;
601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624

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

			ap->prd[idx].addr = cpu_to_le32(addr);
			ap->prd[idx].flags_len = cpu_to_le32(len & 0xffff);
			VPRINTK("PRD[%u] = (0x%X, 0x%X)\n", idx, addr, len);

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

T
Tejun Heo 已提交
625
	len = le32_to_cpu(ap->prd[idx - 1].flags_len);
626

T
Tejun Heo 已提交
627 628
	if (len > SG_COUNT_ASIC_BUG) {
		u32 addr;
629

T
Tejun Heo 已提交
630
		VPRINTK("Splitting last PRD.\n");
631

T
Tejun Heo 已提交
632 633 634
		addr = le32_to_cpu(ap->prd[idx - 1].addr);
		ap->prd[idx - 1].flags_len = cpu_to_le32(len - SG_COUNT_ASIC_BUG);
		VPRINTK("PRD[%u] = (0x%X, 0x%X)\n", idx - 1, addr, SG_COUNT_ASIC_BUG);
635

T
Tejun Heo 已提交
636 637 638 639 640
		addr = addr + len - SG_COUNT_ASIC_BUG;
		len = SG_COUNT_ASIC_BUG;
		ap->prd[idx].addr = cpu_to_le32(addr);
		ap->prd[idx].flags_len = cpu_to_le32(len);
		VPRINTK("PRD[%u] = (0x%X, 0x%X)\n", idx, addr, len);
641

T
Tejun Heo 已提交
642
		idx++;
643
	}
T
Tejun Heo 已提交
644 645

	ap->prd[idx - 1].flags_len |= cpu_to_le32(ATA_PRD_EOT);
646 647
}

L
Linus Torvalds 已提交
648 649 650 651 652 653 654 655 656
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:
657
		pdc_fill_sg(qc);
M
Mikael Pettersson 已提交
658
		/*FALLTHROUGH*/
L
Linus Torvalds 已提交
659 660 661 662 663 664 665 666 667
	case ATA_PROT_NODATA:
		i = pdc_pkt_header(&qc->tf, qc->ap->prd_dma,
				   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;
668
	case ATAPI_PROT_PIO:
669
		pdc_fill_sg(qc);
M
Mikael Pettersson 已提交
670
		break;
671
	case ATAPI_PROT_DMA:
672
		pdc_fill_sg(qc);
673
		/*FALLTHROUGH*/
674
	case ATAPI_PROT_NODATA:
675
		pdc_atapi_pkt(qc);
M
Mikael Pettersson 已提交
676
		break;
L
Linus Torvalds 已提交
677 678 679 680 681
	default:
		break;
	}
}

682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705
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;

M
Mikael Pettersson 已提交
706
	for (i = 0; i < nr_ports && host->ports[i] != ap; ++i)
707 708 709 710 711
		;
	BUG_ON(i >= nr_ports);
	return pdc_port_no_to_ata_no(i, pdc_is_sataii_tx4(ap->flags));
}

712 713
static void pdc_freeze(struct ata_port *ap)
{
714
	void __iomem *ata_mmio = ap->ioaddr.cmd_addr;
715 716
	u32 tmp;

717
	tmp = readl(ata_mmio + PDC_CTLSTAT);
718 719
	tmp |= PDC_IRQ_DISABLE;
	tmp &= ~PDC_DMA_ENABLE;
720 721
	writel(tmp, ata_mmio + PDC_CTLSTAT);
	readl(ata_mmio + PDC_CTLSTAT); /* flush */
722 723
}

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

747 748
static void pdc_thaw(struct ata_port *ap)
{
749
	void __iomem *ata_mmio = ap->ioaddr.cmd_addr;
750 751 752
	u32 tmp;

	/* clear IRQ */
753
	readl(ata_mmio + PDC_COMMAND);
754 755

	/* turn IRQ back on */
756
	tmp = readl(ata_mmio + PDC_CTLSTAT);
757
	tmp &= ~PDC_IRQ_DISABLE;
758 759
	writel(tmp, ata_mmio + PDC_CTLSTAT);
	readl(ata_mmio + PDC_CTLSTAT); /* flush */
760 761
}

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

782 783 784 785 786 787 788
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);
}

789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818
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);
}

819 820 821
static int pdc_sata_hardreset(struct ata_link *link, unsigned int *class,
			      unsigned long deadline)
{
822 823 824 825
	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);
826
	pdc_reset_port(link->ap);
827 828 829 830 831 832

	/* 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);
833 834
}

835
static void pdc_error_handler(struct ata_port *ap)
836 837 838 839
{
	if (!(ap->pflags & ATA_PFLAG_FROZEN))
		pdc_reset_port(ap);

840
	ata_std_error_handler(ap);
841 842
}

843 844 845 846 847
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 */
848
	if (qc->flags & ATA_QCFLAG_FAILED)
849 850 851
		pdc_reset_port(ap);
}

852 853 854
static void pdc_error_intr(struct ata_port *ap, struct ata_queued_cmd *qc,
			   u32 port_status, u32 err_mask)
{
T
Tejun Heo 已提交
855
	struct ata_eh_info *ehi = &ap->link.eh_info;
856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871
	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))
		ac_err_mask |= AC_ERR_HSM;
	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;

872
	if (sata_scr_valid(&ap->link)) {
873 874
		u32 serror;

T
Tejun Heo 已提交
875
		pdc_sata_scr_read(&ap->link, SCR_ERROR, &serror);
876 877
		ehi->serror |= serror;
	}
878

879
	qc->err_mask |= ac_err_mask;
880 881

	pdc_reset_port(ap);
882 883

	ata_port_abort(ap);
884 885
}

M
Mikael Pettersson 已提交
886 887
static unsigned int pdc_host_intr(struct ata_port *ap,
				  struct ata_queued_cmd *qc)
L
Linus Torvalds 已提交
888
{
889
	unsigned int handled = 0;
890
	void __iomem *ata_mmio = ap->ioaddr.cmd_addr;
891 892 893
	u32 port_status, err_mask;

	err_mask = PDC_ERR_MASK;
894
	if (ap->flags & PDC_FLAG_GEN_II)
895 896 897
		err_mask &= ~PDC1_ERR_MASK;
	else
		err_mask &= ~PDC2_ERR_MASK;
898
	port_status = readl(ata_mmio + PDC_GLOBAL_CTL);
899 900 901
	if (unlikely(port_status & err_mask)) {
		pdc_error_intr(ap, qc, port_status, err_mask);
		return 1;
L
Linus Torvalds 已提交
902 903 904 905 906
	}

	switch (qc->tf.protocol) {
	case ATA_PROT_DMA:
	case ATA_PROT_NODATA:
907 908
	case ATAPI_PROT_DMA:
	case ATAPI_PROT_NODATA:
909 910
		qc->err_mask |= ac_err_mask(ata_wait_idle(ap));
		ata_qc_complete(qc);
L
Linus Torvalds 已提交
911 912
		handled = 1;
		break;
M
Mikael Pettersson 已提交
913
	default:
914 915
		ap->stats.idle_irq++;
		break;
M
Mikael Pettersson 已提交
916
	}
L
Linus Torvalds 已提交
917

918
	return handled;
L
Linus Torvalds 已提交
919 920 921 922
}

static void pdc_irq_clear(struct ata_port *ap)
{
923
	void __iomem *ata_mmio = ap->ioaddr.cmd_addr;
L
Linus Torvalds 已提交
924

925
	readl(ata_mmio + PDC_COMMAND);
L
Linus Torvalds 已提交
926 927
}

928
static irqreturn_t pdc_interrupt(int irq, void *dev_instance)
L
Linus Torvalds 已提交
929
{
J
Jeff Garzik 已提交
930
	struct ata_host *host = dev_instance;
L
Linus Torvalds 已提交
931 932 933 934
	struct ata_port *ap;
	u32 mask = 0;
	unsigned int i, tmp;
	unsigned int handled = 0;
935
	void __iomem *host_mmio;
936 937 938
	unsigned int hotplug_offset, ata_no;
	u32 hotplug_status;
	int is_sataii_tx4;
L
Linus Torvalds 已提交
939 940 941

	VPRINTK("ENTER\n");

T
Tejun Heo 已提交
942
	if (!host || !host->iomap[PDC_MMIO_BAR]) {
L
Linus Torvalds 已提交
943 944 945 946
		VPRINTK("QUICK EXIT\n");
		return IRQ_NONE;
	}

947
	host_mmio = host->iomap[PDC_MMIO_BAR];
L
Linus Torvalds 已提交
948

949 950
	spin_lock(&host->lock);

951
	/* read and clear hotplug flags for all ports */
952
	if (host->ports[0]->flags & PDC_FLAG_GEN_II) {
953
		hotplug_offset = PDC2_SATA_PLUG_CSR;
954 955 956 957 958 959
		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;
960

L
Linus Torvalds 已提交
961
	/* reading should also clear interrupts */
962
	mask = readl(host_mmio + PDC_INT_SEQMASK);
L
Linus Torvalds 已提交
963

964
	if (mask == 0xffffffff && hotplug_status == 0) {
L
Linus Torvalds 已提交
965
		VPRINTK("QUICK EXIT 2\n");
966
		goto done_irq;
L
Linus Torvalds 已提交
967
	}
968

M
Mikael Pettersson 已提交
969
	mask &= 0xffff;		/* only 16 SEQIDs possible */
970
	if (mask == 0 && hotplug_status == 0) {
L
Linus Torvalds 已提交
971
		VPRINTK("QUICK EXIT 3\n");
972
		goto done_irq;
L
Linus Torvalds 已提交
973 974
	}

975
	writel(mask, host_mmio + PDC_INT_SEQMASK);
L
Linus Torvalds 已提交
976

977 978
	is_sataii_tx4 = pdc_is_sataii_tx4(host->ports[0]->flags);

J
Jeff Garzik 已提交
979
	for (i = 0; i < host->n_ports; i++) {
L
Linus Torvalds 已提交
980
		VPRINTK("port %u\n", i);
J
Jeff Garzik 已提交
981
		ap = host->ports[i];
982 983 984 985 986 987

		/* 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);
		if (tmp && ap &&
		    !(ap->flags & ATA_FLAG_DISABLED)) {
T
Tejun Heo 已提交
988
			struct ata_eh_info *ehi = &ap->link.eh_info;
989 990 991 992 993 994 995 996 997
			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 */
L
Linus Torvalds 已提交
998
		tmp = mask & (1 << (i + 1));
999
		if (tmp && ap &&
J
Jeff Garzik 已提交
1000
		    !(ap->flags & ATA_FLAG_DISABLED)) {
L
Linus Torvalds 已提交
1001 1002
			struct ata_queued_cmd *qc;

T
Tejun Heo 已提交
1003
			qc = ata_qc_from_tag(ap, ap->link.active_tag);
1004
			if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING)))
L
Linus Torvalds 已提交
1005 1006 1007 1008 1009 1010
				handled += pdc_host_intr(ap, qc);
		}
	}

	VPRINTK("EXIT\n");

1011
done_irq:
J
Jeff Garzik 已提交
1012
	spin_unlock(&host->lock);
L
Linus Torvalds 已提交
1013 1014 1015
	return IRQ_RETVAL(handled);
}

M
Mikael Pettersson 已提交
1016
static void pdc_packet_start(struct ata_queued_cmd *qc)
L
Linus Torvalds 已提交
1017 1018 1019
{
	struct ata_port *ap = qc->ap;
	struct pdc_port_priv *pp = ap->private_data;
1020 1021
	void __iomem *host_mmio = ap->host->iomap[PDC_MMIO_BAR];
	void __iomem *ata_mmio = ap->ioaddr.cmd_addr;
L
Linus Torvalds 已提交
1022 1023 1024 1025 1026
	unsigned int port_no = ap->port_no;
	u8 seq = (u8) (port_no + 1);

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

1027 1028
	writel(0x00000001, host_mmio + (seq * 4));
	readl(host_mmio + (seq * 4));	/* flush */
L
Linus Torvalds 已提交
1029 1030 1031

	pp->pkt[2] = seq;
	wmb();			/* flush PRD, pkt writes */
1032 1033
	writel(pp->pkt_dma, ata_mmio + PDC_PKT_SUBMIT);
	readl(ata_mmio + PDC_PKT_SUBMIT); /* flush */
L
Linus Torvalds 已提交
1034 1035
}

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

J
Jeff Garzik 已提交
1057
static void pdc_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile *tf)
L
Linus Torvalds 已提交
1058
{
1059
	WARN_ON(tf->protocol == ATA_PROT_DMA || tf->protocol == ATAPI_PROT_DMA);
T
Tejun Heo 已提交
1060
	ata_sff_tf_load(ap, tf);
L
Linus Torvalds 已提交
1061 1062
}

1063 1064
static void pdc_exec_command_mmio(struct ata_port *ap,
				  const struct ata_taskfile *tf)
L
Linus Torvalds 已提交
1065
{
1066
	WARN_ON(tf->protocol == ATA_PROT_DMA || tf->protocol == ATAPI_PROT_DMA);
T
Tejun Heo 已提交
1067
	ata_sff_exec_command(ap, tf);
L
Linus Torvalds 已提交
1068 1069
}

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

1100
static int pdc_old_sata_check_atapi_dma(struct ata_queued_cmd *qc)
M
Mikael Pettersson 已提交
1101 1102
{
	/* First generation chips cannot use ATAPI DMA on SATA ports */
1103
	return 1;
M
Mikael Pettersson 已提交
1104
}
L
Linus Torvalds 已提交
1105

1106 1107
static void pdc_ata_setup_port(struct ata_port *ap,
			       void __iomem *base, void __iomem *scr_addr)
L
Linus Torvalds 已提交
1108
{
1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122
	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;
L
Linus Torvalds 已提交
1123 1124
}

1125
static void pdc_host_init(struct ata_host *host)
L
Linus Torvalds 已提交
1126
{
1127
	void __iomem *host_mmio = host->iomap[PDC_MMIO_BAR];
1128
	int is_gen2 = host->ports[0]->flags & PDC_FLAG_GEN_II;
1129
	int hotplug_offset;
L
Linus Torvalds 已提交
1130 1131
	u32 tmp;

1132
	if (is_gen2)
1133 1134 1135 1136
		hotplug_offset = PDC2_SATA_PLUG_CSR;
	else
		hotplug_offset = PDC_SATA_PLUG_CSR;

L
Linus Torvalds 已提交
1137 1138 1139 1140 1141 1142
	/*
	 * Except for the hotplug stuff, this is voodoo from the
	 * Promise driver.  Label this entire section
	 * "TODO: figure out why we do this"
	 */

1143
	/* enable BMR_BURST, maybe change FIFO_SHD to 8 dwords */
1144
	tmp = readl(host_mmio + PDC_FLASH_CTL);
1145
	tmp |= 0x02000;	/* bit 13 (enable bmr burst) */
1146
	if (!is_gen2)
1147
		tmp |= 0x10000;	/* bit 16 (fifo threshold at 8 dw) */
1148
	writel(tmp, host_mmio + PDC_FLASH_CTL);
L
Linus Torvalds 已提交
1149 1150

	/* clear plug/unplug flags for all ports */
1151 1152
	tmp = readl(host_mmio + hotplug_offset);
	writel(tmp | 0xff, host_mmio + hotplug_offset);
L
Linus Torvalds 已提交
1153

1154
	tmp = readl(host_mmio + hotplug_offset);
1155 1156 1157 1158
	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);
L
Linus Torvalds 已提交
1159

1160
	/* don't initialise TBG or SLEW on 2nd generation chips */
1161
	if (is_gen2)
1162 1163
		return;

L
Linus Torvalds 已提交
1164
	/* reduce TBG clock to 133 Mhz. */
1165
	tmp = readl(host_mmio + PDC_TBG_MODE);
L
Linus Torvalds 已提交
1166 1167
	tmp &= ~0x30000; /* clear bit 17, 16*/
	tmp |= 0x10000;  /* set bit 17:16 = 0:1 */
1168
	writel(tmp, host_mmio + PDC_TBG_MODE);
L
Linus Torvalds 已提交
1169

1170
	readl(host_mmio + PDC_TBG_MODE);	/* flush */
L
Linus Torvalds 已提交
1171 1172 1173
	msleep(10);

	/* adjust slew rate control register. */
1174
	tmp = readl(host_mmio + PDC_SLEW_CTL);
L
Linus Torvalds 已提交
1175 1176
	tmp &= 0xFFFFF03F; /* clear bit 11 ~ 6 */
	tmp  |= 0x00000900; /* set bit 11-9 = 100b , bit 8-6 = 100 */
1177
	writel(tmp, host_mmio + PDC_SLEW_CTL);
L
Linus Torvalds 已提交
1178 1179
}

1180 1181
static int pdc_ata_init_one(struct pci_dev *pdev,
			    const struct pci_device_id *ent)
L
Linus Torvalds 已提交
1182 1183
{
	static int printed_version;
1184 1185 1186
	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;
1187
	void __iomem *host_mmio;
1188
	int n_ports, i, rc;
1189
	int is_sataii_tx4;
L
Linus Torvalds 已提交
1190 1191

	if (!printed_version++)
1192
		dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n");
L
Linus Torvalds 已提交
1193

1194
	/* enable and acquire resources */
1195
	rc = pcim_enable_device(pdev);
L
Linus Torvalds 已提交
1196 1197 1198
	if (rc)
		return rc;

T
Tejun Heo 已提交
1199 1200
	rc = pcim_iomap_regions(pdev, 1 << PDC_MMIO_BAR, DRV_NAME);
	if (rc == -EBUSY)
1201
		pcim_pin_device(pdev);
T
Tejun Heo 已提交
1202
	if (rc)
1203
		return rc;
1204
	host_mmio = pcim_iomap_table(pdev)[PDC_MMIO_BAR];
L
Linus Torvalds 已提交
1205

1206 1207 1208 1209 1210 1211
	/* 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;
L
Linus Torvalds 已提交
1212

1213
	if (pi->flags & PDC_FLAG_SATA_PATA) {
1214
		u8 tmp = readb(host_mmio + PDC_FLASH_CTL + 1);
M
Mikael Pettersson 已提交
1215
		if (!(tmp & 0x80))
1216 1217
			ppi[n_ports++] = pi + 1;
	}
L
Linus Torvalds 已提交
1218

1219 1220 1221
	host = ata_host_alloc_pinfo(&pdev->dev, ppi, n_ports);
	if (!host) {
		dev_printk(KERN_ERR, &pdev->dev, "failed to allocate host\n");
1222
		return -ENOMEM;
L
Linus Torvalds 已提交
1223
	}
1224
	host->iomap = pcim_iomap_table(pdev);
L
Linus Torvalds 已提交
1225

M
Mikael Pettersson 已提交
1226
	is_sataii_tx4 = pdc_is_sataii_tx4(pi->flags);
1227
	for (i = 0; i < host->n_ports; i++) {
1228
		struct ata_port *ap = host->ports[i];
M
Mikael Pettersson 已提交
1229
		unsigned int ata_no = pdc_port_no_to_ata_no(i, is_sataii_tx4);
1230
		unsigned int ata_offset = 0x200 + ata_no * 0x80;
1231 1232
		unsigned int scr_offset = 0x400 + ata_no * 0x100;

1233
		pdc_ata_setup_port(ap, host_mmio + ata_offset, host_mmio + scr_offset);
1234 1235

		ata_port_pbar_desc(ap, PDC_MMIO_BAR, -1, "mmio");
1236
		ata_port_pbar_desc(ap, PDC_MMIO_BAR, ata_offset, "ata");
1237
	}
L
Linus Torvalds 已提交
1238 1239

	/* initialize adapter */
1240
	pdc_host_init(host);
L
Linus Torvalds 已提交
1241

1242 1243 1244 1245 1246 1247
	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;
L
Linus Torvalds 已提交
1248

1249 1250 1251 1252
	/* start host, request IRQ and attach */
	pci_set_master(pdev);
	return ata_host_activate(host, pdev->irq, pdc_interrupt, IRQF_SHARED,
				 &pdc_ata_sht);
L
Linus Torvalds 已提交
1253 1254 1255 1256
}

static int __init pdc_ata_init(void)
{
1257
	return pci_register_driver(&pdc_ata_pci_driver);
L
Linus Torvalds 已提交
1258 1259 1260 1261 1262 1263 1264 1265
}

static void __exit pdc_ata_exit(void)
{
	pci_unregister_driver(&pdc_ata_pci_driver);
}

MODULE_AUTHOR("Jeff Garzik");
1266
MODULE_DESCRIPTION("Promise ATA TX2/TX4/TX4000 low-level driver");
L
Linus Torvalds 已提交
1267 1268 1269 1270 1271 1272
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);