sata_promise.c 29.5 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"
M
Mikael Pettersson 已提交
49
#define DRV_VERSION	"2.11"
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

M
Mikael Pettersson 已提交
56 57 58 59 60 61 62 63
	/* register offsets */
	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 已提交
64
	PDC_ALTSTATUS		= 0x38, /* Alternate-status/device-control reg (per port) */
L
Linus Torvalds 已提交
65 66 67 68 69 70
	PDC_PKT_SUBMIT		= 0x40, /* Command packet pointer addr */
	PDC_INT_SEQMASK		= 0x40,	/* Mask of asserted SEQ INTs */
	PDC_FLASH_CTL		= 0x44, /* Flash control register */
	PDC_GLOBAL_CTL		= 0x48, /* Global control/status (per port) */
	PDC_CTLSTAT		= 0x60,	/* IDE control and status (per port) */
	PDC_SATA_PLUG_CSR	= 0x6C, /* SATA Plug control/status reg */
71
	PDC2_SATA_PLUG_CSR	= 0x60, /* SATAII Plug control/status reg */
72 73
	PDC_TBG_MODE		= 0x41C, /* TBG mode (not SATAII) */
	PDC_SLEW_CTL		= 0x470, /* slew rate control reg (not SATAII) */
L
Linus Torvalds 已提交
74

75 76 77 78 79 80 81 82 83 84 85 86 87
	/* 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,
88 89 90 91 92 93
	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 已提交
94 95

	board_2037x		= 0,	/* FastTrak S150 TX2plus */
96 97 98 99
	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 已提交
100
	board_2057x_pata	= 5,	/* SATAII150 Tx2plus PATA port */
101
	board_40518		= 6,	/* SATAII150 Tx4 */
L
Linus Torvalds 已提交
102

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

M
Mikael Pettersson 已提交
105 106 107 108 109 110 111 112 113 114
	/* 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 */

115 116 117
	/* PDC_CTLSTAT bit definitions */
	PDC_DMA_ENABLE		= (1 << 7),
	PDC_IRQ_DISABLE		= (1 << 10),
L
Linus Torvalds 已提交
118
	PDC_RESET		= (1 << 11), /* HDMA reset */
119

120
	PDC_COMMON_FLAGS	= ATA_FLAG_NO_LEGACY |
M
Mikael Pettersson 已提交
121
				  ATA_FLAG_MMIO |
122
				  ATA_FLAG_PIO_POLLING,
123

124 125 126 127
	/* 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 已提交
128 129 130 131 132 133 134
};

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

135 136
static int pdc_sata_scr_read(struct ata_port *ap, unsigned int sc_reg, u32 *val);
static int pdc_sata_scr_write(struct ata_port *ap, unsigned int sc_reg, u32 val);
L
Linus Torvalds 已提交
137
static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *ent);
138 139
static int pdc_common_port_start(struct ata_port *ap);
static int pdc_sata_port_start(struct ata_port *ap);
L
Linus Torvalds 已提交
140
static void pdc_qc_prep(struct ata_queued_cmd *qc);
J
Jeff Garzik 已提交
141 142
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 已提交
143
static int pdc_check_atapi_dma(struct ata_queued_cmd *qc);
144
static int pdc_old_sata_check_atapi_dma(struct ata_queued_cmd *qc);
L
Linus Torvalds 已提交
145
static void pdc_irq_clear(struct ata_port *ap);
146
static unsigned int pdc_qc_issue_prot(struct ata_queued_cmd *qc);
147 148
static void pdc_freeze(struct ata_port *ap);
static void pdc_thaw(struct ata_port *ap);
149 150
static void pdc_pata_error_handler(struct ata_port *ap);
static void pdc_sata_error_handler(struct ata_port *ap);
151
static void pdc_post_internal_cmd(struct ata_queued_cmd *qc);
152 153
static int pdc_pata_cable_detect(struct ata_port *ap);
static int pdc_sata_cable_detect(struct ata_port *ap);
154

155
static struct scsi_host_template pdc_ata_sht = {
L
Linus Torvalds 已提交
156 157 158 159 160 161
	.module			= THIS_MODULE,
	.name			= DRV_NAME,
	.ioctl			= ata_scsi_ioctl,
	.queuecommand		= ata_scsi_queuecmd,
	.can_queue		= ATA_DEF_QUEUE,
	.this_id		= ATA_SHT_THIS_ID,
162
	.sg_tablesize		= PDC_MAX_PRD,
L
Linus Torvalds 已提交
163 164 165 166 167 168
	.cmd_per_lun		= ATA_SHT_CMD_PER_LUN,
	.emulated		= ATA_SHT_EMULATED,
	.use_clustering		= ATA_SHT_USE_CLUSTERING,
	.proc_name		= DRV_NAME,
	.dma_boundary		= ATA_DMA_BOUNDARY,
	.slave_configure	= ata_scsi_slave_config,
T
Tejun Heo 已提交
169
	.slave_destroy		= ata_scsi_slave_destroy,
L
Linus Torvalds 已提交
170 171 172
	.bios_param		= ata_std_bios_param,
};

J
Jeff Garzik 已提交
173
static const struct ata_port_operations pdc_sata_ops = {
L
Linus Torvalds 已提交
174 175 176 177 178
	.tf_load		= pdc_tf_load_mmio,
	.tf_read		= ata_tf_read,
	.check_status		= ata_check_status,
	.exec_command		= pdc_exec_command_mmio,
	.dev_select		= ata_std_dev_select,
M
Mikael Pettersson 已提交
179 180 181 182 183 184
	.check_atapi_dma	= pdc_check_atapi_dma,

	.qc_prep		= pdc_qc_prep,
	.qc_issue		= pdc_qc_issue_prot,
	.freeze			= pdc_freeze,
	.thaw			= pdc_thaw,
185
	.error_handler		= pdc_sata_error_handler,
M
Mikael Pettersson 已提交
186
	.post_internal_cmd	= pdc_post_internal_cmd,
187
	.cable_detect		= pdc_sata_cable_detect,
T
Tejun Heo 已提交
188
	.data_xfer		= ata_data_xfer,
M
Mikael Pettersson 已提交
189
	.irq_clear		= pdc_irq_clear,
190
	.irq_on			= ata_irq_on,
M
Mikael Pettersson 已提交
191 192 193

	.scr_read		= pdc_sata_scr_read,
	.scr_write		= pdc_sata_scr_write,
194
	.port_start		= pdc_sata_port_start,
M
Mikael Pettersson 已提交
195 196 197 198 199 200 201 202 203
};

/* First-generation chips need a more restrictive ->check_atapi_dma op */
static const struct ata_port_operations pdc_old_sata_ops = {
	.tf_load		= pdc_tf_load_mmio,
	.tf_read		= ata_tf_read,
	.check_status		= ata_check_status,
	.exec_command		= pdc_exec_command_mmio,
	.dev_select		= ata_std_dev_select,
204
	.check_atapi_dma	= pdc_old_sata_check_atapi_dma,
205

L
Linus Torvalds 已提交
206 207
	.qc_prep		= pdc_qc_prep,
	.qc_issue		= pdc_qc_issue_prot,
208 209
	.freeze			= pdc_freeze,
	.thaw			= pdc_thaw,
210
	.error_handler		= pdc_sata_error_handler,
211
	.post_internal_cmd	= pdc_post_internal_cmd,
212
	.cable_detect		= pdc_sata_cable_detect,
T
Tejun Heo 已提交
213
	.data_xfer		= ata_data_xfer,
L
Linus Torvalds 已提交
214
	.irq_clear		= pdc_irq_clear,
215
	.irq_on			= ata_irq_on,
216

L
Linus Torvalds 已提交
217 218
	.scr_read		= pdc_sata_scr_read,
	.scr_write		= pdc_sata_scr_write,
219
	.port_start		= pdc_sata_port_start,
L
Linus Torvalds 已提交
220 221
};

J
Jeff Garzik 已提交
222
static const struct ata_port_operations pdc_pata_ops = {
223 224 225 226 227
	.tf_load		= pdc_tf_load_mmio,
	.tf_read		= ata_tf_read,
	.check_status		= ata_check_status,
	.exec_command		= pdc_exec_command_mmio,
	.dev_select		= ata_std_dev_select,
M
Mikael Pettersson 已提交
228
	.check_atapi_dma	= pdc_check_atapi_dma,
229 230 231

	.qc_prep		= pdc_qc_prep,
	.qc_issue		= pdc_qc_issue_prot,
232 233
	.freeze			= pdc_freeze,
	.thaw			= pdc_thaw,
234
	.error_handler		= pdc_pata_error_handler,
235
	.post_internal_cmd	= pdc_post_internal_cmd,
236
	.cable_detect		= pdc_pata_cable_detect,
T
Tejun Heo 已提交
237
	.data_xfer		= ata_data_xfer,
238
	.irq_clear		= pdc_irq_clear,
239
	.irq_on			= ata_irq_on,
240

241
	.port_start		= pdc_common_port_start,
242 243
};

244
static const struct ata_port_info pdc_port_info[] = {
M
Mikael Pettersson 已提交
245
	[board_2037x] =
L
Linus Torvalds 已提交
246
	{
247 248
		.flags		= PDC_COMMON_FLAGS | ATA_FLAG_SATA |
				  PDC_FLAG_SATA_PATA,
L
Linus Torvalds 已提交
249 250
		.pio_mask	= 0x1f, /* pio0-4 */
		.mwdma_mask	= 0x07, /* mwdma0-2 */
251
		.udma_mask	= ATA_UDMA6,
M
Mikael Pettersson 已提交
252
		.port_ops	= &pdc_old_sata_ops,
L
Linus Torvalds 已提交
253 254
	},

M
Mikael Pettersson 已提交
255
	[board_2037x_pata] =
256 257 258 259
	{
		.flags		= PDC_COMMON_FLAGS | ATA_FLAG_SLAVE_POSS,
		.pio_mask	= 0x1f, /* pio0-4 */
		.mwdma_mask	= 0x07, /* mwdma0-2 */
260
		.udma_mask	= ATA_UDMA6,
261 262 263
		.port_ops	= &pdc_pata_ops,
	},

M
Mikael Pettersson 已提交
264
	[board_20319] =
L
Linus Torvalds 已提交
265
	{
266 267
		.flags		= PDC_COMMON_FLAGS | ATA_FLAG_SATA |
				  PDC_FLAG_4_PORTS,
L
Linus Torvalds 已提交
268 269
		.pio_mask	= 0x1f, /* pio0-4 */
		.mwdma_mask	= 0x07, /* mwdma0-2 */
270
		.udma_mask	= ATA_UDMA6,
M
Mikael Pettersson 已提交
271
		.port_ops	= &pdc_old_sata_ops,
L
Linus Torvalds 已提交
272
	},
273

M
Mikael Pettersson 已提交
274
	[board_20619] =
275
	{
276 277
		.flags		= PDC_COMMON_FLAGS | ATA_FLAG_SLAVE_POSS |
				  PDC_FLAG_4_PORTS,
278 279
		.pio_mask	= 0x1f, /* pio0-4 */
		.mwdma_mask	= 0x07, /* mwdma0-2 */
280
		.udma_mask	= ATA_UDMA6,
281
		.port_ops	= &pdc_pata_ops,
282
	},
283

M
Mikael Pettersson 已提交
284
	[board_2057x] =
285
	{
286 287
		.flags		= PDC_COMMON_FLAGS | ATA_FLAG_SATA |
				  PDC_FLAG_GEN_II | PDC_FLAG_SATA_PATA,
288 289
		.pio_mask	= 0x1f, /* pio0-4 */
		.mwdma_mask	= 0x07, /* mwdma0-2 */
290
		.udma_mask	= ATA_UDMA6,
291 292 293
		.port_ops	= &pdc_sata_ops,
	},

M
Mikael Pettersson 已提交
294
	[board_2057x_pata] =
295
	{
296
		.flags		= PDC_COMMON_FLAGS | ATA_FLAG_SLAVE_POSS |
297 298 299
				  PDC_FLAG_GEN_II,
		.pio_mask	= 0x1f, /* pio0-4 */
		.mwdma_mask	= 0x07, /* mwdma0-2 */
300
		.udma_mask	= ATA_UDMA6,
301 302 303
		.port_ops	= &pdc_pata_ops,
	},

M
Mikael Pettersson 已提交
304
	[board_40518] =
305
	{
306 307
		.flags		= PDC_COMMON_FLAGS | ATA_FLAG_SATA |
				  PDC_FLAG_GEN_II | PDC_FLAG_4_PORTS,
308 309
		.pio_mask	= 0x1f, /* pio0-4 */
		.mwdma_mask	= 0x07, /* mwdma0-2 */
310
		.udma_mask	= ATA_UDMA6,
311 312
		.port_ops	= &pdc_sata_ops,
	},
L
Linus Torvalds 已提交
313 314
};

315
static const struct pci_device_id pdc_ata_pci_tbl[] = {
316 317 318 319
	{ PCI_VDEVICE(PROMISE, 0x3371), board_2037x },
	{ PCI_VDEVICE(PROMISE, 0x3373), board_2037x },
	{ PCI_VDEVICE(PROMISE, 0x3375), board_2037x },
	{ PCI_VDEVICE(PROMISE, 0x3376), board_2037x },
320 321
	{ PCI_VDEVICE(PROMISE, 0x3570), board_2057x },
	{ PCI_VDEVICE(PROMISE, 0x3571), board_2057x },
322
	{ PCI_VDEVICE(PROMISE, 0x3574), board_2057x },
323
	{ PCI_VDEVICE(PROMISE, 0x3577), board_2057x },
324
	{ PCI_VDEVICE(PROMISE, 0x3d73), board_2057x },
325 326 327 328
	{ PCI_VDEVICE(PROMISE, 0x3d75), board_2057x },

	{ PCI_VDEVICE(PROMISE, 0x3318), board_20319 },
	{ PCI_VDEVICE(PROMISE, 0x3319), board_20319 },
329 330
	{ PCI_VDEVICE(PROMISE, 0x3515), board_40518 },
	{ PCI_VDEVICE(PROMISE, 0x3519), board_40518 },
331
	{ PCI_VDEVICE(PROMISE, 0x3d17), board_40518 },
332 333 334
	{ PCI_VDEVICE(PROMISE, 0x3d18), board_40518 },

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

L
Linus Torvalds 已提交
336 337 338 339 340 341 342 343 344 345
	{ }	/* 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,
};

346
static int pdc_common_port_start(struct ata_port *ap)
L
Linus Torvalds 已提交
347
{
J
Jeff Garzik 已提交
348
	struct device *dev = ap->host->dev;
L
Linus Torvalds 已提交
349 350 351 352 353 354 355
	struct pdc_port_priv *pp;
	int rc;

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

356 357 358
	pp = devm_kzalloc(dev, sizeof(*pp), GFP_KERNEL);
	if (!pp)
		return -ENOMEM;
L
Linus Torvalds 已提交
359

360 361 362
	pp->pkt = dmam_alloc_coherent(dev, 128, &pp->pkt_dma, GFP_KERNEL);
	if (!pp->pkt)
		return -ENOMEM;
L
Linus Torvalds 已提交
363 364 365

	ap->private_data = pp;

366 367 368 369 370 371 372 373 374 375 376
	return 0;
}

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

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

377
	/* fix up PHYMODE4 align timing */
378
	if (ap->flags & PDC_FLAG_GEN_II) {
379
		void __iomem *mmio = ap->ioaddr.scr_addr;
380 381 382 383 384 385 386
		unsigned int tmp;

		tmp = readl(mmio + 0x014);
		tmp = (tmp & ~3) | 1;	/* set bits 1:0 = 0:1 */
		writel(tmp, mmio + 0x014);
	}

L
Linus Torvalds 已提交
387 388 389 390 391
	return 0;
}

static void pdc_reset_port(struct ata_port *ap)
{
T
Tejun Heo 已提交
392
	void __iomem *mmio = ap->ioaddr.cmd_addr + PDC_CTLSTAT;
L
Linus Torvalds 已提交
393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411
	unsigned int i;
	u32 tmp;

	for (i = 11; i > 0; i--) {
		tmp = readl(mmio);
		if (tmp & PDC_RESET)
			break;

		udelay(100);

		tmp |= PDC_RESET;
		writel(tmp, mmio);
	}

	tmp &= ~PDC_RESET;
	writel(tmp, mmio);
	readl(mmio);	/* flush */
}

412
static int pdc_pata_cable_detect(struct ata_port *ap)
413
{
414
	u8 tmp;
415
	void __iomem *mmio = ap->ioaddr.cmd_addr + PDC_CTLSTAT + 0x03;
416

417 418 419 420 421 422 423 424
	tmp = readb(mmio);
	if (tmp & 0x01)
		return ATA_CBL_PATA40;
	return ATA_CBL_PATA80;
}

static int pdc_sata_cable_detect(struct ata_port *ap)
{
425
	return ATA_CBL_SATA;
426
}
427

428
static int pdc_sata_scr_read(struct ata_port *ap, unsigned int sc_reg, u32 *val)
L
Linus Torvalds 已提交
429
{
430
	if (sc_reg > SCR_CONTROL)
431 432 433
		return -EINVAL;
	*val = readl(ap->ioaddr.scr_addr + (sc_reg * 4));
	return 0;
L
Linus Torvalds 已提交
434 435
}

436
static int pdc_sata_scr_write(struct ata_port *ap, unsigned int sc_reg, u32 val)
L
Linus Torvalds 已提交
437
{
438
	if (sc_reg > SCR_CONTROL)
439
		return -EINVAL;
T
Tejun Heo 已提交
440
	writel(val, ap->ioaddr.scr_addr + (sc_reg * 4));
441
	return 0;
L
Linus Torvalds 已提交
442 443
}

444
static void pdc_atapi_pkt(struct ata_queued_cmd *qc)
M
Mikael Pettersson 已提交
445
{
446 447 448 449 450 451
	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;
M
Mikael Pettersson 已提交
452
	u32 *buf32 = (u32 *) buf;
453
	unsigned int dev_sel, feature;
M
Mikael Pettersson 已提交
454 455 456 457

	/* set control bits (byte 0), zero delay seq id (byte 3),
	 * and seq id (byte 2)
	 */
458
	switch (qc->tf.protocol) {
459
	case ATAPI_PROT_DMA:
460 461 462 463 464
		if (!(qc->tf.flags & ATA_TFLAG_WRITE))
			buf32[0] = cpu_to_le32(PDC_PKT_READ);
		else
			buf32[0] = 0;
		break;
465
	case ATAPI_PROT_NODATA:
466 467 468 469 470 471
		buf32[0] = cpu_to_le32(PDC_PKT_NODATA);
		break;
	default:
		BUG();
		break;
	}
M
Mikael Pettersson 已提交
472 473 474
	buf32[1] = cpu_to_le32(sg_table);	/* S/G table addr */
	buf32[2] = 0;				/* no next-packet */

475
	/* select drive */
476
	if (sata_scr_valid(&ap->link))
477
		dev_sel = PDC_DEVICE_SATA;
478 479 480
	else
		dev_sel = qc->tf.device;

481 482 483 484 485 486
	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;
487
	buf[17] = qc->tf.nsect;
488
	buf[18] = (1 << 5) | ATA_REG_LBAL;
489
	buf[19] = qc->tf.lbal;
490 491

	/* set feature and byte counter registers */
492
	if (qc->tf.protocol != ATAPI_PROT_DMA)
493
		feature = PDC_FEATURE_ATAPI_PIO;
494
	else
495
		feature = PDC_FEATURE_ATAPI_DMA;
496

497 498 499
	buf[20] = (1 << 5) | ATA_REG_FEATURE;
	buf[21] = feature;
	buf[22] = (1 << 5) | ATA_REG_BYTEL;
500
	buf[23] = qc->tf.lbam;
501
	buf[24] = (1 << 5) | ATA_REG_BYTEH;
502
	buf[25] = qc->tf.lbah;
503 504 505

	/* send ATAPI packet command 0xA0 */
	buf[26] = (1 << 5) | ATA_REG_CMD;
506
	buf[27] = qc->tf.command;
507 508 509 510 511

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

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

515 516 517
	/* 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 已提交
518 519
}

520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536
/**
 *	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 已提交
537 538
	unsigned int si, idx;
	u32 len;
539 540 541 542 543

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

	idx = 0;
T
Tejun Heo 已提交
544
	for_each_sg(qc->sg, sg, qc->n_elem, si) {
545
		u32 addr, offset;
546
		u32 sg_len;
547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570

		/* 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 已提交
571
	len = le32_to_cpu(ap->prd[idx - 1].flags_len);
572

T
Tejun Heo 已提交
573 574
	if (len > SG_COUNT_ASIC_BUG) {
		u32 addr;
575

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

T
Tejun Heo 已提交
578 579 580
		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);
581

T
Tejun Heo 已提交
582 583 584 585 586
		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);
587

T
Tejun Heo 已提交
588
		idx++;
589
	}
T
Tejun Heo 已提交
590 591

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

L
Linus Torvalds 已提交
594 595 596 597 598 599 600 601 602
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:
603
		pdc_fill_sg(qc);
L
Linus Torvalds 已提交
604 605 606 607 608 609 610 611 612 613 614 615 616 617
		/* fall through */

	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;

618
	case ATAPI_PROT_PIO:
619
		pdc_fill_sg(qc);
M
Mikael Pettersson 已提交
620 621
		break;

622
	case ATAPI_PROT_DMA:
623
		pdc_fill_sg(qc);
624
		/*FALLTHROUGH*/
625
	case ATAPI_PROT_NODATA:
626
		pdc_atapi_pkt(qc);
M
Mikael Pettersson 已提交
627 628
		break;

L
Linus Torvalds 已提交
629 630 631 632 633
	default:
		break;
	}
}

634 635
static void pdc_freeze(struct ata_port *ap)
{
636
	void __iomem *mmio = ap->ioaddr.cmd_addr;
637 638 639 640 641 642 643 644 645 646 647
	u32 tmp;

	tmp = readl(mmio + PDC_CTLSTAT);
	tmp |= PDC_IRQ_DISABLE;
	tmp &= ~PDC_DMA_ENABLE;
	writel(tmp, mmio + PDC_CTLSTAT);
	readl(mmio + PDC_CTLSTAT); /* flush */
}

static void pdc_thaw(struct ata_port *ap)
{
648
	void __iomem *mmio = ap->ioaddr.cmd_addr;
649 650 651 652 653 654 655 656 657 658 659 660
	u32 tmp;

	/* clear IRQ */
	readl(mmio + PDC_INT_SEQMASK);

	/* turn IRQ back on */
	tmp = readl(mmio + PDC_CTLSTAT);
	tmp &= ~PDC_IRQ_DISABLE;
	writel(tmp, mmio + PDC_CTLSTAT);
	readl(mmio + PDC_CTLSTAT); /* flush */
}

661
static void pdc_common_error_handler(struct ata_port *ap, ata_reset_fn_t hardreset)
662 663 664 665 666
{
	if (!(ap->pflags & ATA_PFLAG_FROZEN))
		pdc_reset_port(ap);

	/* perform recovery */
667
	ata_do_eh(ap, ata_std_prereset, ata_std_softreset, hardreset,
668 669 670
		  ata_std_postreset);
}

671 672 673 674 675 676 677 678 679 680
static void pdc_pata_error_handler(struct ata_port *ap)
{
	pdc_common_error_handler(ap, NULL);
}

static void pdc_sata_error_handler(struct ata_port *ap)
{
	pdc_common_error_handler(ap, sata_std_hardreset);
}

681 682 683 684 685
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 */
686
	if (qc->flags & ATA_QCFLAG_FAILED)
687 688 689
		pdc_reset_port(ap);
}

690 691 692
static void pdc_error_intr(struct ata_port *ap, struct ata_queued_cmd *qc,
			   u32 port_status, u32 err_mask)
{
T
Tejun Heo 已提交
693
	struct ata_eh_info *ehi = &ap->link.eh_info;
694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709
	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;

710
	if (sata_scr_valid(&ap->link)) {
711 712 713 714 715
		u32 serror;

		pdc_sata_scr_read(ap, SCR_ERROR, &serror);
		ehi->serror |= serror;
	}
716

717
	qc->err_mask |= ac_err_mask;
718 719

	pdc_reset_port(ap);
720 721

	ata_port_abort(ap);
722 723
}

M
Mikael Pettersson 已提交
724 725
static inline unsigned int pdc_host_intr(struct ata_port *ap,
					 struct ata_queued_cmd *qc)
L
Linus Torvalds 已提交
726
{
727
	unsigned int handled = 0;
728 729 730 731
	void __iomem *port_mmio = ap->ioaddr.cmd_addr;
	u32 port_status, err_mask;

	err_mask = PDC_ERR_MASK;
732
	if (ap->flags & PDC_FLAG_GEN_II)
733 734 735 736 737 738 739
		err_mask &= ~PDC1_ERR_MASK;
	else
		err_mask &= ~PDC2_ERR_MASK;
	port_status = readl(port_mmio + PDC_GLOBAL_CTL);
	if (unlikely(port_status & err_mask)) {
		pdc_error_intr(ap, qc, port_status, err_mask);
		return 1;
L
Linus Torvalds 已提交
740 741 742 743 744
	}

	switch (qc->tf.protocol) {
	case ATA_PROT_DMA:
	case ATA_PROT_NODATA:
745 746
	case ATAPI_PROT_DMA:
	case ATAPI_PROT_NODATA:
747 748
		qc->err_mask |= ac_err_mask(ata_wait_idle(ap));
		ata_qc_complete(qc);
L
Linus Torvalds 已提交
749 750 751
		handled = 1;
		break;

M
Mikael Pettersson 已提交
752
	default:
753 754
		ap->stats.idle_irq++;
		break;
M
Mikael Pettersson 已提交
755
	}
L
Linus Torvalds 已提交
756

757
	return handled;
L
Linus Torvalds 已提交
758 759 760 761
}

static void pdc_irq_clear(struct ata_port *ap)
{
J
Jeff Garzik 已提交
762
	struct ata_host *host = ap->host;
T
Tejun Heo 已提交
763
	void __iomem *mmio = host->iomap[PDC_MMIO_BAR];
L
Linus Torvalds 已提交
764 765 766 767

	readl(mmio + PDC_INT_SEQMASK);
}

768
static int pdc_is_sataii_tx4(unsigned long flags)
M
Mikael Pettersson 已提交
769 770 771 772 773
{
	const unsigned long mask = PDC_FLAG_GEN_II | PDC_FLAG_4_PORTS;
	return (flags & mask) == mask;
}

774 775
static unsigned int pdc_port_no_to_ata_no(unsigned int port_no,
					  int is_sataii_tx4)
M
Mikael Pettersson 已提交
776 777 778 779 780
{
	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;
}

781
static irqreturn_t pdc_interrupt(int irq, void *dev_instance)
L
Linus Torvalds 已提交
782
{
J
Jeff Garzik 已提交
783
	struct ata_host *host = dev_instance;
L
Linus Torvalds 已提交
784 785 786 787
	struct ata_port *ap;
	u32 mask = 0;
	unsigned int i, tmp;
	unsigned int handled = 0;
788
	void __iomem *mmio_base;
789 790 791
	unsigned int hotplug_offset, ata_no;
	u32 hotplug_status;
	int is_sataii_tx4;
L
Linus Torvalds 已提交
792 793 794

	VPRINTK("ENTER\n");

T
Tejun Heo 已提交
795
	if (!host || !host->iomap[PDC_MMIO_BAR]) {
L
Linus Torvalds 已提交
796 797 798 799
		VPRINTK("QUICK EXIT\n");
		return IRQ_NONE;
	}

T
Tejun Heo 已提交
800
	mmio_base = host->iomap[PDC_MMIO_BAR];
L
Linus Torvalds 已提交
801

802 803 804 805 806 807 808 809 810 811
	/* read and clear hotplug flags for all ports */
	if (host->ports[0]->flags & PDC_FLAG_GEN_II)
		hotplug_offset = PDC2_SATA_PLUG_CSR;
	else
		hotplug_offset = PDC_SATA_PLUG_CSR;
	hotplug_status = readl(mmio_base + hotplug_offset);
	if (hotplug_status & 0xff)
		writel(hotplug_status | 0xff, mmio_base + hotplug_offset);
	hotplug_status &= 0xff;	/* clear uninteresting bits */

L
Linus Torvalds 已提交
812 813 814
	/* reading should also clear interrupts */
	mask = readl(mmio_base + PDC_INT_SEQMASK);

815
	if (mask == 0xffffffff && hotplug_status == 0) {
L
Linus Torvalds 已提交
816 817 818
		VPRINTK("QUICK EXIT 2\n");
		return IRQ_NONE;
	}
819

J
Jeff Garzik 已提交
820
	spin_lock(&host->lock);
821

L
Linus Torvalds 已提交
822
	mask &= 0xffff;		/* only 16 tags possible */
823
	if (mask == 0 && hotplug_status == 0) {
L
Linus Torvalds 已提交
824
		VPRINTK("QUICK EXIT 3\n");
825
		goto done_irq;
L
Linus Torvalds 已提交
826 827 828 829
	}

	writel(mask, mmio_base + PDC_INT_SEQMASK);

830 831
	is_sataii_tx4 = pdc_is_sataii_tx4(host->ports[0]->flags);

J
Jeff Garzik 已提交
832
	for (i = 0; i < host->n_ports; i++) {
L
Linus Torvalds 已提交
833
		VPRINTK("port %u\n", i);
J
Jeff Garzik 已提交
834
		ap = host->ports[i];
835 836 837 838 839 840

		/* 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 已提交
841
			struct ata_eh_info *ehi = &ap->link.eh_info;
842 843 844 845 846 847 848 849 850
			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 已提交
851
		tmp = mask & (1 << (i + 1));
852
		if (tmp && ap &&
J
Jeff Garzik 已提交
853
		    !(ap->flags & ATA_FLAG_DISABLED)) {
L
Linus Torvalds 已提交
854 855
			struct ata_queued_cmd *qc;

T
Tejun Heo 已提交
856
			qc = ata_qc_from_tag(ap, ap->link.active_tag);
857
			if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING)))
L
Linus Torvalds 已提交
858 859 860 861 862 863
				handled += pdc_host_intr(ap, qc);
		}
	}

	VPRINTK("EXIT\n");

864
done_irq:
J
Jeff Garzik 已提交
865
	spin_unlock(&host->lock);
L
Linus Torvalds 已提交
866 867 868 869 870 871 872
	return IRQ_RETVAL(handled);
}

static inline void pdc_packet_start(struct ata_queued_cmd *qc)
{
	struct ata_port *ap = qc->ap;
	struct pdc_port_priv *pp = ap->private_data;
T
Tejun Heo 已提交
873
	void __iomem *mmio = ap->host->iomap[PDC_MMIO_BAR];
L
Linus Torvalds 已提交
874 875 876 877 878
	unsigned int port_no = ap->port_no;
	u8 seq = (u8) (port_no + 1);

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

T
Tejun Heo 已提交
879 880
	writel(0x00000001, mmio + (seq * 4));
	readl(mmio + (seq * 4));	/* flush */
L
Linus Torvalds 已提交
881 882 883

	pp->pkt[2] = seq;
	wmb();			/* flush PRD, pkt writes */
T
Tejun Heo 已提交
884 885
	writel(pp->pkt_dma, ap->ioaddr.cmd_addr + PDC_PKT_SUBMIT);
	readl(ap->ioaddr.cmd_addr + PDC_PKT_SUBMIT); /* flush */
L
Linus Torvalds 已提交
886 887
}

888
static unsigned int pdc_qc_issue_prot(struct ata_queued_cmd *qc)
L
Linus Torvalds 已提交
889 890
{
	switch (qc->tf.protocol) {
891
	case ATAPI_PROT_NODATA:
892 893 894
		if (qc->dev->flags & ATA_DFLAG_CDB_INTR)
			break;
		/*FALLTHROUGH*/
895 896 897 898
	case ATA_PROT_NODATA:
		if (qc->tf.flags & ATA_TFLAG_POLLING)
			break;
		/*FALLTHROUGH*/
899
	case ATAPI_PROT_DMA:
L
Linus Torvalds 已提交
900 901 902 903 904 905 906 907 908 909 910
	case ATA_PROT_DMA:
		pdc_packet_start(qc);
		return 0;

	default:
		break;
	}

	return ata_qc_issue_prot(qc);
}

J
Jeff Garzik 已提交
911
static void pdc_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile *tf)
L
Linus Torvalds 已提交
912
{
913
	WARN_ON(tf->protocol == ATA_PROT_DMA || tf->protocol == ATAPI_PROT_DMA);
L
Linus Torvalds 已提交
914 915 916
	ata_tf_load(ap, tf);
}

917 918
static void pdc_exec_command_mmio(struct ata_port *ap,
				  const struct ata_taskfile *tf)
L
Linus Torvalds 已提交
919
{
920
	WARN_ON(tf->protocol == ATA_PROT_DMA || tf->protocol == ATAPI_PROT_DMA);
L
Linus Torvalds 已提交
921 922 923
	ata_exec_command(ap, tf);
}

M
Mikael Pettersson 已提交
924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942
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) {
943 944 945 946 947
		unsigned int lba =
			(scsicmd[2] << 24) |
			(scsicmd[3] << 16) |
			(scsicmd[4] << 8) |
			scsicmd[5];
M
Mikael Pettersson 已提交
948 949 950 951 952 953
		if (lba >= 0xFFFF4FA2)
			pio = 1;
	}
	return pio;
}

954
static int pdc_old_sata_check_atapi_dma(struct ata_queued_cmd *qc)
M
Mikael Pettersson 已提交
955 956
{
	/* First generation chips cannot use ATAPI DMA on SATA ports */
957
	return 1;
M
Mikael Pettersson 已提交
958
}
L
Linus Torvalds 已提交
959

960 961
static void pdc_ata_setup_port(struct ata_port *ap,
			       void __iomem *base, void __iomem *scr_addr)
L
Linus Torvalds 已提交
962
{
963 964 965 966 967 968 969 970 971 972 973 974 975 976
	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 已提交
977 978
}

979
static void pdc_host_init(struct ata_host *host)
L
Linus Torvalds 已提交
980
{
981 982
	void __iomem *mmio = host->iomap[PDC_MMIO_BAR];
	int is_gen2 = host->ports[0]->flags & PDC_FLAG_GEN_II;
983
	int hotplug_offset;
L
Linus Torvalds 已提交
984 985
	u32 tmp;

986
	if (is_gen2)
987 988 989 990
		hotplug_offset = PDC2_SATA_PLUG_CSR;
	else
		hotplug_offset = PDC_SATA_PLUG_CSR;

L
Linus Torvalds 已提交
991 992 993 994 995 996
	/*
	 * Except for the hotplug stuff, this is voodoo from the
	 * Promise driver.  Label this entire section
	 * "TODO: figure out why we do this"
	 */

997
	/* enable BMR_BURST, maybe change FIFO_SHD to 8 dwords */
L
Linus Torvalds 已提交
998
	tmp = readl(mmio + PDC_FLASH_CTL);
999
	tmp |= 0x02000;	/* bit 13 (enable bmr burst) */
1000
	if (!is_gen2)
1001
		tmp |= 0x10000;	/* bit 16 (fifo threshold at 8 dw) */
L
Linus Torvalds 已提交
1002 1003 1004
	writel(tmp, mmio + PDC_FLASH_CTL);

	/* clear plug/unplug flags for all ports */
1005 1006
	tmp = readl(mmio + hotplug_offset);
	writel(tmp | 0xff, mmio + hotplug_offset);
L
Linus Torvalds 已提交
1007

1008
	/* unmask plug/unplug ints */
1009
	tmp = readl(mmio + hotplug_offset);
1010
	writel(tmp & ~0xff0000, mmio + hotplug_offset);
L
Linus Torvalds 已提交
1011

1012
	/* don't initialise TBG or SLEW on 2nd generation chips */
1013
	if (is_gen2)
1014 1015
		return;

L
Linus Torvalds 已提交
1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031
	/* reduce TBG clock to 133 Mhz. */
	tmp = readl(mmio + PDC_TBG_MODE);
	tmp &= ~0x30000; /* clear bit 17, 16*/
	tmp |= 0x10000;  /* set bit 17:16 = 0:1 */
	writel(tmp, mmio + PDC_TBG_MODE);

	readl(mmio + PDC_TBG_MODE);	/* flush */
	msleep(10);

	/* adjust slew rate control register. */
	tmp = readl(mmio + PDC_SLEW_CTL);
	tmp &= 0xFFFFF03F; /* clear bit 11 ~ 6 */
	tmp  |= 0x00000900; /* set bit 11-9 = 100b , bit 8-6 = 100 */
	writel(tmp, mmio + PDC_SLEW_CTL);
}

1032 1033
static int pdc_ata_init_one(struct pci_dev *pdev,
			    const struct pci_device_id *ent)
L
Linus Torvalds 已提交
1034 1035
{
	static int printed_version;
1036 1037 1038
	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;
T
Tejun Heo 已提交
1039
	void __iomem *base;
1040
	int n_ports, i, rc;
1041
	int is_sataii_tx4;
L
Linus Torvalds 已提交
1042 1043

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

1046
	/* enable and acquire resources */
1047
	rc = pcim_enable_device(pdev);
L
Linus Torvalds 已提交
1048 1049 1050
	if (rc)
		return rc;

T
Tejun Heo 已提交
1051 1052
	rc = pcim_iomap_regions(pdev, 1 << PDC_MMIO_BAR, DRV_NAME);
	if (rc == -EBUSY)
1053
		pcim_pin_device(pdev);
T
Tejun Heo 已提交
1054
	if (rc)
1055
		return rc;
1056
	base = pcim_iomap_table(pdev)[PDC_MMIO_BAR];
L
Linus Torvalds 已提交
1057

1058 1059 1060 1061 1062 1063
	/* 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 已提交
1064

1065 1066
	if (pi->flags & PDC_FLAG_SATA_PATA) {
		u8 tmp = readb(base + PDC_FLASH_CTL+1);
M
Mikael Pettersson 已提交
1067
		if (!(tmp & 0x80))
1068 1069
			ppi[n_ports++] = pi + 1;
	}
L
Linus Torvalds 已提交
1070

1071 1072 1073
	host = ata_host_alloc_pinfo(&pdev->dev, ppi, n_ports);
	if (!host) {
		dev_printk(KERN_ERR, &pdev->dev, "failed to allocate host\n");
1074
		return -ENOMEM;
L
Linus Torvalds 已提交
1075
	}
1076
	host->iomap = pcim_iomap_table(pdev);
L
Linus Torvalds 已提交
1077

M
Mikael Pettersson 已提交
1078
	is_sataii_tx4 = pdc_is_sataii_tx4(pi->flags);
1079
	for (i = 0; i < host->n_ports; i++) {
1080
		struct ata_port *ap = host->ports[i];
M
Mikael Pettersson 已提交
1081
		unsigned int ata_no = pdc_port_no_to_ata_no(i, is_sataii_tx4);
1082 1083 1084 1085 1086 1087 1088
		unsigned int port_offset = 0x200 + ata_no * 0x80;
		unsigned int scr_offset = 0x400 + ata_no * 0x100;

		pdc_ata_setup_port(ap, base + port_offset, base + scr_offset);

		ata_port_pbar_desc(ap, PDC_MMIO_BAR, -1, "mmio");
		ata_port_pbar_desc(ap, PDC_MMIO_BAR, port_offset, "port");
1089
	}
L
Linus Torvalds 已提交
1090 1091

	/* initialize adapter */
1092
	pdc_host_init(host);
L
Linus Torvalds 已提交
1093

1094 1095 1096 1097 1098 1099
	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 已提交
1100

1101 1102 1103 1104
	/* 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 已提交
1105 1106 1107 1108
}

static int __init pdc_ata_init(void)
{
1109
	return pci_register_driver(&pdc_ata_pci_driver);
L
Linus Torvalds 已提交
1110 1111 1112 1113 1114 1115 1116 1117
}

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

MODULE_AUTHOR("Jeff Garzik");
1118
MODULE_DESCRIPTION("Promise ATA TX2/TX4/TX4000 low-level driver");
L
Linus Torvalds 已提交
1119 1120 1121 1122 1123 1124
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);