diff options
author | Jeff Garzik <jgarzik@pobox.com> | 2005-08-29 19:10:39 -0400 |
---|---|---|
committer | Jeff Garzik <jgarzik@pobox.com> | 2005-08-29 19:10:39 -0400 |
commit | 739cdbf1d8f0739b80035b80d69d871e33749b86 (patch) | |
tree | 15134df8723ab7d7a5524c99070f02d5739bad0d /drivers/scsi | |
parent | 83bbecc905b3431c60fe282830e09aaaab97b26a (diff) | |
parent | 8f3d17fb7bcb7c255197d11469fb5e9695c9d2f4 (diff) |
Merge /spare/repo/linux-2.6/
Diffstat (limited to 'drivers/scsi')
-rw-r--r-- | drivers/scsi/Kconfig | 6 | ||||
-rw-r--r-- | drivers/scsi/ahci.c | 53 | ||||
-rw-r--r-- | drivers/scsi/arm/Kconfig | 2 | ||||
-rw-r--r-- | drivers/scsi/ata_piix.c | 74 | ||||
-rw-r--r-- | drivers/scsi/libata-core.c | 324 | ||||
-rw-r--r-- | drivers/scsi/libata-scsi.c | 119 | ||||
-rw-r--r-- | drivers/scsi/libata.h | 49 | ||||
-rw-r--r-- | drivers/scsi/sata_nv.c | 62 | ||||
-rw-r--r-- | drivers/scsi/sata_promise.c | 47 | ||||
-rw-r--r-- | drivers/scsi/sata_promise.h | 31 | ||||
-rw-r--r-- | drivers/scsi/sata_qstor.c | 43 | ||||
-rw-r--r-- | drivers/scsi/sata_sil.c | 69 | ||||
-rw-r--r-- | drivers/scsi/sata_sis.c | 35 | ||||
-rw-r--r-- | drivers/scsi/sata_svw.c | 43 | ||||
-rw-r--r-- | drivers/scsi/sata_sx4.c | 179 | ||||
-rw-r--r-- | drivers/scsi/sata_uli.c | 35 | ||||
-rw-r--r-- | drivers/scsi/sata_via.c | 64 | ||||
-rw-r--r-- | drivers/scsi/sata_vsc.c | 31 | ||||
-rw-r--r-- | drivers/scsi/sg.c | 13 |
19 files changed, 832 insertions, 447 deletions
diff --git a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig index 4955167a7a92..79ba45c1e9c0 100644 --- a/drivers/scsi/Kconfig +++ b/drivers/scsi/Kconfig | |||
@@ -1704,7 +1704,7 @@ config TT_DMA_EMUL | |||
1704 | 1704 | ||
1705 | config MAC_SCSI | 1705 | config MAC_SCSI |
1706 | bool "Macintosh NCR5380 SCSI" | 1706 | bool "Macintosh NCR5380 SCSI" |
1707 | depends on MAC && SCSI | 1707 | depends on MAC && SCSI=y |
1708 | help | 1708 | help |
1709 | This is the NCR 5380 SCSI controller included on most of the 68030 | 1709 | This is the NCR 5380 SCSI controller included on most of the 68030 |
1710 | based Macintoshes. If you have one of these say Y and read the | 1710 | based Macintoshes. If you have one of these say Y and read the |
@@ -1725,7 +1725,7 @@ config SCSI_MAC_ESP | |||
1725 | 1725 | ||
1726 | config MVME147_SCSI | 1726 | config MVME147_SCSI |
1727 | bool "WD33C93 SCSI driver for MVME147" | 1727 | bool "WD33C93 SCSI driver for MVME147" |
1728 | depends on MVME147 && SCSI | 1728 | depends on MVME147 && SCSI=y |
1729 | help | 1729 | help |
1730 | Support for the on-board SCSI controller on the Motorola MVME147 | 1730 | Support for the on-board SCSI controller on the Motorola MVME147 |
1731 | single-board computer. | 1731 | single-board computer. |
@@ -1766,7 +1766,7 @@ config SUN3_SCSI | |||
1766 | 1766 | ||
1767 | config SUN3X_ESP | 1767 | config SUN3X_ESP |
1768 | bool "Sun3x ESP SCSI" | 1768 | bool "Sun3x ESP SCSI" |
1769 | depends on SUN3X && SCSI | 1769 | depends on SUN3X && SCSI=y |
1770 | help | 1770 | help |
1771 | The ESP was an on-board SCSI controller used on Sun 3/80 | 1771 | The ESP was an on-board SCSI controller used on Sun 3/80 |
1772 | machines. Say Y here to compile in support for it. | 1772 | machines. Say Y here to compile in support for it. |
diff --git a/drivers/scsi/ahci.c b/drivers/scsi/ahci.c index c5623694d10f..179c95c878ac 100644 --- a/drivers/scsi/ahci.c +++ b/drivers/scsi/ahci.c | |||
@@ -1,26 +1,34 @@ | |||
1 | /* | 1 | /* |
2 | * ahci.c - AHCI SATA support | 2 | * ahci.c - AHCI SATA support |
3 | * | 3 | * |
4 | * Copyright 2004 Red Hat, Inc. | 4 | * Maintained by: Jeff Garzik <jgarzik@pobox.com> |
5 | * Please ALWAYS copy linux-ide@vger.kernel.org | ||
6 | * on emails. | ||
5 | * | 7 | * |
6 | * The contents of this file are subject to the Open | 8 | * Copyright 2004-2005 Red Hat, Inc. |
7 | * Software License version 1.1 that can be found at | ||
8 | * http://www.opensource.org/licenses/osl-1.1.txt and is included herein | ||
9 | * by reference. | ||
10 | * | 9 | * |
11 | * Alternatively, the contents of this file may be used under the terms | ||
12 | * of the GNU General Public License version 2 (the "GPL") as distributed | ||
13 | * in the kernel source COPYING file, in which case the provisions of | ||
14 | * the GPL are applicable instead of the above. If you wish to allow | ||
15 | * the use of your version of this file only under the terms of the | ||
16 | * GPL and not to allow others to use your version of this file under | ||
17 | * the OSL, indicate your decision by deleting the provisions above and | ||
18 | * replace them with the notice and other provisions required by the GPL. | ||
19 | * If you do not delete the provisions above, a recipient may use your | ||
20 | * version of this file under either the OSL or the GPL. | ||
21 | * | 10 | * |
22 | * Version 1.0 of the AHCI specification: | 11 | * This program is free software; you can redistribute it and/or modify |
12 | * it under the terms of the GNU General Public License as published by | ||
13 | * the Free Software Foundation; either version 2, or (at your option) | ||
14 | * any later version. | ||
15 | * | ||
16 | * This program is distributed in the hope that it will be useful, | ||
17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
19 | * GNU General Public License for more details. | ||
20 | * | ||
21 | * You should have received a copy of the GNU General Public License | ||
22 | * along with this program; see the file COPYING. If not, write to | ||
23 | * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. | ||
24 | * | ||
25 | * | ||
26 | * libata documentation is available via 'make {ps|pdf}docs', | ||
27 | * as Documentation/DocBook/libata.* | ||
28 | * | ||
29 | * AHCI hardware documentation: | ||
23 | * http://www.intel.com/technology/serialata/pdf/rev1_0.pdf | 30 | * http://www.intel.com/technology/serialata/pdf/rev1_0.pdf |
31 | * http://www.intel.com/technology/serialata/pdf/rev1_1.pdf | ||
24 | * | 32 | * |
25 | */ | 33 | */ |
26 | 34 | ||
@@ -269,6 +277,8 @@ static struct pci_device_id ahci_pci_tbl[] = { | |||
269 | board_ahci }, /* ESB2 */ | 277 | board_ahci }, /* ESB2 */ |
270 | { PCI_VENDOR_ID_INTEL, 0x2683, PCI_ANY_ID, PCI_ANY_ID, 0, 0, | 278 | { PCI_VENDOR_ID_INTEL, 0x2683, PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
271 | board_ahci }, /* ESB2 */ | 279 | board_ahci }, /* ESB2 */ |
280 | { PCI_VENDOR_ID_INTEL, 0x27c6, PCI_ANY_ID, PCI_ANY_ID, 0, 0, | ||
281 | board_ahci }, /* ICH7-M DH */ | ||
272 | { } /* terminate list */ | 282 | { } /* terminate list */ |
273 | }; | 283 | }; |
274 | 284 | ||
@@ -584,12 +594,16 @@ static void ahci_intr_error(struct ata_port *ap, u32 irq_stat) | |||
584 | 594 | ||
585 | static void ahci_eng_timeout(struct ata_port *ap) | 595 | static void ahci_eng_timeout(struct ata_port *ap) |
586 | { | 596 | { |
587 | void *mmio = ap->host_set->mmio_base; | 597 | struct ata_host_set *host_set = ap->host_set; |
598 | void *mmio = host_set->mmio_base; | ||
588 | void *port_mmio = ahci_port_base(mmio, ap->port_no); | 599 | void *port_mmio = ahci_port_base(mmio, ap->port_no); |
589 | struct ata_queued_cmd *qc; | 600 | struct ata_queued_cmd *qc; |
601 | unsigned long flags; | ||
590 | 602 | ||
591 | DPRINTK("ENTER\n"); | 603 | DPRINTK("ENTER\n"); |
592 | 604 | ||
605 | spin_lock_irqsave(&host_set->lock, flags); | ||
606 | |||
593 | ahci_intr_error(ap, readl(port_mmio + PORT_IRQ_STAT)); | 607 | ahci_intr_error(ap, readl(port_mmio + PORT_IRQ_STAT)); |
594 | 608 | ||
595 | qc = ata_qc_from_tag(ap, ap->active_tag); | 609 | qc = ata_qc_from_tag(ap, ap->active_tag); |
@@ -607,6 +621,7 @@ static void ahci_eng_timeout(struct ata_port *ap) | |||
607 | ata_qc_complete(qc, ATA_ERR); | 621 | ata_qc_complete(qc, ATA_ERR); |
608 | } | 622 | } |
609 | 623 | ||
624 | spin_unlock_irqrestore(&host_set->lock, flags); | ||
610 | } | 625 | } |
611 | 626 | ||
612 | static inline int ahci_host_intr(struct ata_port *ap, struct ata_queued_cmd *qc) | 627 | static inline int ahci_host_intr(struct ata_port *ap, struct ata_queued_cmd *qc) |
@@ -696,9 +711,6 @@ static int ahci_qc_issue(struct ata_queued_cmd *qc) | |||
696 | struct ata_port *ap = qc->ap; | 711 | struct ata_port *ap = qc->ap; |
697 | void *port_mmio = (void *) ap->ioaddr.cmd_addr; | 712 | void *port_mmio = (void *) ap->ioaddr.cmd_addr; |
698 | 713 | ||
699 | writel(1, port_mmio + PORT_SCR_ACT); | ||
700 | readl(port_mmio + PORT_SCR_ACT); /* flush */ | ||
701 | |||
702 | writel(1, port_mmio + PORT_CMD_ISSUE); | 714 | writel(1, port_mmio + PORT_CMD_ISSUE); |
703 | readl(port_mmio + PORT_CMD_ISSUE); /* flush */ | 715 | readl(port_mmio + PORT_CMD_ISSUE); /* flush */ |
704 | 716 | ||
@@ -1105,6 +1117,7 @@ MODULE_AUTHOR("Jeff Garzik"); | |||
1105 | MODULE_DESCRIPTION("AHCI SATA low-level driver"); | 1117 | MODULE_DESCRIPTION("AHCI SATA low-level driver"); |
1106 | MODULE_LICENSE("GPL"); | 1118 | MODULE_LICENSE("GPL"); |
1107 | MODULE_DEVICE_TABLE(pci, ahci_pci_tbl); | 1119 | MODULE_DEVICE_TABLE(pci, ahci_pci_tbl); |
1120 | MODULE_VERSION(DRV_VERSION); | ||
1108 | 1121 | ||
1109 | module_init(ahci_init); | 1122 | module_init(ahci_init); |
1110 | module_exit(ahci_exit); | 1123 | module_exit(ahci_exit); |
diff --git a/drivers/scsi/arm/Kconfig b/drivers/scsi/arm/Kconfig index 54b32868aaf7..13f23043c8a3 100644 --- a/drivers/scsi/arm/Kconfig +++ b/drivers/scsi/arm/Kconfig | |||
@@ -3,7 +3,7 @@ | |||
3 | # | 3 | # |
4 | config SCSI_ACORNSCSI_3 | 4 | config SCSI_ACORNSCSI_3 |
5 | tristate "Acorn SCSI card (aka30) support" | 5 | tristate "Acorn SCSI card (aka30) support" |
6 | depends on ARCH_ACORN && SCSI | 6 | depends on ARCH_ACORN && SCSI && BROKEN |
7 | help | 7 | help |
8 | This enables support for the Acorn SCSI card (aka30). If you have an | 8 | This enables support for the Acorn SCSI card (aka30). If you have an |
9 | Acorn system with one of these, say Y. If unsure, say N. | 9 | Acorn system with one of these, say Y. If unsure, say N. |
diff --git a/drivers/scsi/ata_piix.c b/drivers/scsi/ata_piix.c index a2cfade2c1c6..fb28c1261848 100644 --- a/drivers/scsi/ata_piix.c +++ b/drivers/scsi/ata_piix.c | |||
@@ -1,24 +1,42 @@ | |||
1 | /* | 1 | /* |
2 | 2 | * ata_piix.c - Intel PATA/SATA controllers | |
3 | ata_piix.c - Intel PATA/SATA controllers | 3 | * |
4 | 4 | * Maintained by: Jeff Garzik <jgarzik@pobox.com> | |
5 | Maintained by: Jeff Garzik <jgarzik@pobox.com> | 5 | * Please ALWAYS copy linux-ide@vger.kernel.org |
6 | Please ALWAYS copy linux-ide@vger.kernel.org | 6 | * on emails. |
7 | on emails. | 7 | * |
8 | 8 | * | |
9 | 9 | * Copyright 2003-2005 Red Hat Inc | |
10 | Copyright 2003-2004 Red Hat Inc | 10 | * Copyright 2003-2005 Jeff Garzik |
11 | Copyright 2003-2004 Jeff Garzik | 11 | * |
12 | 12 | * | |
13 | 13 | * Copyright header from piix.c: | |
14 | Copyright header from piix.c: | 14 | * |
15 | 15 | * Copyright (C) 1998-1999 Andrzej Krzysztofowicz, Author and Maintainer | |
16 | Copyright (C) 1998-1999 Andrzej Krzysztofowicz, Author and Maintainer | 16 | * Copyright (C) 1998-2000 Andre Hedrick <andre@linux-ide.org> |
17 | Copyright (C) 1998-2000 Andre Hedrick <andre@linux-ide.org> | 17 | * Copyright (C) 2003 Red Hat Inc <alan@redhat.com> |
18 | Copyright (C) 2003 Red Hat Inc <alan@redhat.com> | 18 | * |
19 | 19 | * | |
20 | May be copied or modified under the terms of the GNU General Public License | 20 | * This program is free software; you can redistribute it and/or modify |
21 | 21 | * it under the terms of the GNU General Public License as published by | |
22 | * the Free Software Foundation; either version 2, or (at your option) | ||
23 | * any later version. | ||
24 | * | ||
25 | * This program is distributed in the hope that it will be useful, | ||
26 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
27 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
28 | * GNU General Public License for more details. | ||
29 | * | ||
30 | * You should have received a copy of the GNU General Public License | ||
31 | * along with this program; see the file COPYING. If not, write to | ||
32 | * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. | ||
33 | * | ||
34 | * | ||
35 | * libata documentation is available via 'make {ps|pdf}docs', | ||
36 | * as Documentation/DocBook/libata.* | ||
37 | * | ||
38 | * Hardware documentation available at http://developer.intel.com/ | ||
39 | * | ||
22 | */ | 40 | */ |
23 | 41 | ||
24 | #include <linux/kernel.h> | 42 | #include <linux/kernel.h> |
@@ -32,7 +50,7 @@ | |||
32 | #include <linux/libata.h> | 50 | #include <linux/libata.h> |
33 | 51 | ||
34 | #define DRV_NAME "ata_piix" | 52 | #define DRV_NAME "ata_piix" |
35 | #define DRV_VERSION "1.03" | 53 | #define DRV_VERSION "1.04" |
36 | 54 | ||
37 | enum { | 55 | enum { |
38 | PIIX_IOCFG = 0x54, /* IDE I/O configuration register */ | 56 | PIIX_IOCFG = 0x54, /* IDE I/O configuration register */ |
@@ -629,13 +647,13 @@ static int piix_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) | |||
629 | port_info[1] = NULL; | 647 | port_info[1] = NULL; |
630 | 648 | ||
631 | if (port_info[0]->host_flags & PIIX_FLAG_AHCI) { | 649 | if (port_info[0]->host_flags & PIIX_FLAG_AHCI) { |
632 | u8 tmp; | 650 | u8 tmp; |
633 | pci_read_config_byte(pdev, PIIX_SCC, &tmp); | 651 | pci_read_config_byte(pdev, PIIX_SCC, &tmp); |
634 | if (tmp == PIIX_AHCI_DEVICE) { | 652 | if (tmp == PIIX_AHCI_DEVICE) { |
635 | int rc = piix_disable_ahci(pdev); | 653 | int rc = piix_disable_ahci(pdev); |
636 | if (rc) | 654 | if (rc) |
637 | return rc; | 655 | return rc; |
638 | } | 656 | } |
639 | } | 657 | } |
640 | 658 | ||
641 | if (port_info[0]->host_flags & PIIX_FLAG_COMBINED) { | 659 | if (port_info[0]->host_flags & PIIX_FLAG_COMBINED) { |
diff --git a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c index 73b1f72b7e43..dee4b12b0342 100644 --- a/drivers/scsi/libata-core.c +++ b/drivers/scsi/libata-core.c | |||
@@ -1,25 +1,35 @@ | |||
1 | /* | 1 | /* |
2 | libata-core.c - helper library for ATA | 2 | * libata-core.c - helper library for ATA |
3 | 3 | * | |
4 | Copyright 2003-2004 Red Hat, Inc. All rights reserved. | 4 | * Maintained by: Jeff Garzik <jgarzik@pobox.com> |
5 | Copyright 2003-2004 Jeff Garzik | 5 | * Please ALWAYS copy linux-ide@vger.kernel.org |
6 | 6 | * on emails. | |
7 | The contents of this file are subject to the Open | 7 | * |
8 | Software License version 1.1 that can be found at | 8 | * Copyright 2003-2004 Red Hat, Inc. All rights reserved. |
9 | http://www.opensource.org/licenses/osl-1.1.txt and is included herein | 9 | * Copyright 2003-2004 Jeff Garzik |
10 | by reference. | 10 | * |
11 | 11 | * | |
12 | Alternatively, the contents of this file may be used under the terms | 12 | * This program is free software; you can redistribute it and/or modify |
13 | of the GNU General Public License version 2 (the "GPL") as distributed | 13 | * it under the terms of the GNU General Public License as published by |
14 | in the kernel source COPYING file, in which case the provisions of | 14 | * the Free Software Foundation; either version 2, or (at your option) |
15 | the GPL are applicable instead of the above. If you wish to allow | 15 | * any later version. |
16 | the use of your version of this file only under the terms of the | 16 | * |
17 | GPL and not to allow others to use your version of this file under | 17 | * This program is distributed in the hope that it will be useful, |
18 | the OSL, indicate your decision by deleting the provisions above and | 18 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
19 | replace them with the notice and other provisions required by the GPL. | 19 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
20 | If you do not delete the provisions above, a recipient may use your | 20 | * GNU General Public License for more details. |
21 | version of this file under either the OSL or the GPL. | 21 | * |
22 | 22 | * You should have received a copy of the GNU General Public License | |
23 | * along with this program; see the file COPYING. If not, write to | ||
24 | * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. | ||
25 | * | ||
26 | * | ||
27 | * libata documentation is available via 'make {ps|pdf}docs', | ||
28 | * as Documentation/DocBook/libata.* | ||
29 | * | ||
30 | * Hardware documentation available from http://www.t13.org/ and | ||
31 | * http://www.sata-io.org/ | ||
32 | * | ||
23 | */ | 33 | */ |
24 | 34 | ||
25 | #include <linux/config.h> | 35 | #include <linux/config.h> |
@@ -1304,12 +1314,12 @@ static inline u8 ata_dev_knobble(struct ata_port *ap) | |||
1304 | /** | 1314 | /** |
1305 | * ata_dev_config - Run device specific handlers and check for | 1315 | * ata_dev_config - Run device specific handlers and check for |
1306 | * SATA->PATA bridges | 1316 | * SATA->PATA bridges |
1307 | * @ap: Bus | 1317 | * @ap: Bus |
1308 | * @i: Device | 1318 | * @i: Device |
1309 | * | 1319 | * |
1310 | * LOCKING: | 1320 | * LOCKING: |
1311 | */ | 1321 | */ |
1312 | 1322 | ||
1313 | void ata_dev_config(struct ata_port *ap, unsigned int i) | 1323 | void ata_dev_config(struct ata_port *ap, unsigned int i) |
1314 | { | 1324 | { |
1315 | /* limit bridge transfers to udma5, 200 sectors */ | 1325 | /* limit bridge transfers to udma5, 200 sectors */ |
@@ -2268,19 +2278,6 @@ void ata_qc_prep(struct ata_queued_cmd *qc) | |||
2268 | * spin_lock_irqsave(host_set lock) | 2278 | * spin_lock_irqsave(host_set lock) |
2269 | */ | 2279 | */ |
2270 | 2280 | ||
2271 | |||
2272 | |||
2273 | /** | ||
2274 | * ata_sg_init_one - Prepare a one-entry scatter-gather list. | ||
2275 | * @qc: Queued command | ||
2276 | * @buf: transfer buffer | ||
2277 | * @buflen: length of buf | ||
2278 | * | ||
2279 | * Builds a single-entry scatter-gather list to initiate a | ||
2280 | * transfer utilizing the specified buffer. | ||
2281 | * | ||
2282 | * LOCKING: | ||
2283 | */ | ||
2284 | void ata_sg_init_one(struct ata_queued_cmd *qc, void *buf, unsigned int buflen) | 2281 | void ata_sg_init_one(struct ata_queued_cmd *qc, void *buf, unsigned int buflen) |
2285 | { | 2282 | { |
2286 | struct scatterlist *sg; | 2283 | struct scatterlist *sg; |
@@ -2312,18 +2309,6 @@ void ata_sg_init_one(struct ata_queued_cmd *qc, void *buf, unsigned int buflen) | |||
2312 | * spin_lock_irqsave(host_set lock) | 2309 | * spin_lock_irqsave(host_set lock) |
2313 | */ | 2310 | */ |
2314 | 2311 | ||
2315 | |||
2316 | /** | ||
2317 | * ata_sg_init - Assign a scatter gather list to a queued command | ||
2318 | * @qc: Queued command | ||
2319 | * @sg: Scatter-gather list | ||
2320 | * @n_elem: length of sg list | ||
2321 | * | ||
2322 | * Attaches a scatter-gather list to a queued command. | ||
2323 | * | ||
2324 | * LOCKING: | ||
2325 | */ | ||
2326 | |||
2327 | void ata_sg_init(struct ata_queued_cmd *qc, struct scatterlist *sg, | 2312 | void ata_sg_init(struct ata_queued_cmd *qc, struct scatterlist *sg, |
2328 | unsigned int n_elem) | 2313 | unsigned int n_elem) |
2329 | { | 2314 | { |
@@ -2402,6 +2387,27 @@ static int ata_sg_setup(struct ata_queued_cmd *qc) | |||
2402 | } | 2387 | } |
2403 | 2388 | ||
2404 | /** | 2389 | /** |
2390 | * ata_poll_qc_complete - turn irq back on and finish qc | ||
2391 | * @qc: Command to complete | ||
2392 | * @drv_stat: ATA status register content | ||
2393 | * | ||
2394 | * LOCKING: | ||
2395 | * None. (grabs host lock) | ||
2396 | */ | ||
2397 | |||
2398 | void ata_poll_qc_complete(struct ata_queued_cmd *qc, u8 drv_stat) | ||
2399 | { | ||
2400 | struct ata_port *ap = qc->ap; | ||
2401 | unsigned long flags; | ||
2402 | |||
2403 | spin_lock_irqsave(&ap->host_set->lock, flags); | ||
2404 | ap->flags &= ~ATA_FLAG_NOINTR; | ||
2405 | ata_irq_on(ap); | ||
2406 | ata_qc_complete(qc, drv_stat); | ||
2407 | spin_unlock_irqrestore(&ap->host_set->lock, flags); | ||
2408 | } | ||
2409 | |||
2410 | /** | ||
2405 | * ata_pio_poll - | 2411 | * ata_pio_poll - |
2406 | * @ap: | 2412 | * @ap: |
2407 | * | 2413 | * |
@@ -2463,11 +2469,10 @@ static void ata_pio_complete (struct ata_port *ap) | |||
2463 | u8 drv_stat; | 2469 | u8 drv_stat; |
2464 | 2470 | ||
2465 | /* | 2471 | /* |
2466 | * This is purely hueristic. This is a fast path. | 2472 | * This is purely heuristic. This is a fast path. Sometimes when |
2467 | * Sometimes when we enter, BSY will be cleared in | 2473 | * we enter, BSY will be cleared in a chk-status or two. If not, |
2468 | * a chk-status or two. If not, the drive is probably seeking | 2474 | * the drive is probably seeking or something. Snooze for a couple |
2469 | * or something. Snooze for a couple msecs, then | 2475 | * msecs, then chk-status again. If still busy, fall back to |
2470 | * chk-status again. If still busy, fall back to | ||
2471 | * PIO_ST_POLL state. | 2476 | * PIO_ST_POLL state. |
2472 | */ | 2477 | */ |
2473 | drv_stat = ata_busy_wait(ap, ATA_BUSY | ATA_DRQ, 10); | 2478 | drv_stat = ata_busy_wait(ap, ATA_BUSY | ATA_DRQ, 10); |
@@ -2492,9 +2497,7 @@ static void ata_pio_complete (struct ata_port *ap) | |||
2492 | 2497 | ||
2493 | ap->pio_task_state = PIO_ST_IDLE; | 2498 | ap->pio_task_state = PIO_ST_IDLE; |
2494 | 2499 | ||
2495 | ata_irq_on(ap); | 2500 | ata_poll_qc_complete(qc, drv_stat); |
2496 | |||
2497 | ata_qc_complete(qc, drv_stat); | ||
2498 | } | 2501 | } |
2499 | 2502 | ||
2500 | 2503 | ||
@@ -2519,6 +2522,20 @@ void swap_buf_le16(u16 *buf, unsigned int buf_words) | |||
2519 | #endif /* __BIG_ENDIAN */ | 2522 | #endif /* __BIG_ENDIAN */ |
2520 | } | 2523 | } |
2521 | 2524 | ||
2525 | /** | ||
2526 | * ata_mmio_data_xfer - Transfer data by MMIO | ||
2527 | * @ap: port to read/write | ||
2528 | * @buf: data buffer | ||
2529 | * @buflen: buffer length | ||
2530 | * @do_write: read/write | ||
2531 | * | ||
2532 | * Transfer data from/to the device data register by MMIO. | ||
2533 | * | ||
2534 | * LOCKING: | ||
2535 | * Inherited from caller. | ||
2536 | * | ||
2537 | */ | ||
2538 | |||
2522 | static void ata_mmio_data_xfer(struct ata_port *ap, unsigned char *buf, | 2539 | static void ata_mmio_data_xfer(struct ata_port *ap, unsigned char *buf, |
2523 | unsigned int buflen, int write_data) | 2540 | unsigned int buflen, int write_data) |
2524 | { | 2541 | { |
@@ -2527,6 +2544,7 @@ static void ata_mmio_data_xfer(struct ata_port *ap, unsigned char *buf, | |||
2527 | u16 *buf16 = (u16 *) buf; | 2544 | u16 *buf16 = (u16 *) buf; |
2528 | void __iomem *mmio = (void __iomem *)ap->ioaddr.data_addr; | 2545 | void __iomem *mmio = (void __iomem *)ap->ioaddr.data_addr; |
2529 | 2546 | ||
2547 | /* Transfer multiple of 2 bytes */ | ||
2530 | if (write_data) { | 2548 | if (write_data) { |
2531 | for (i = 0; i < words; i++) | 2549 | for (i = 0; i < words; i++) |
2532 | writew(le16_to_cpu(buf16[i]), mmio); | 2550 | writew(le16_to_cpu(buf16[i]), mmio); |
@@ -2534,19 +2552,76 @@ static void ata_mmio_data_xfer(struct ata_port *ap, unsigned char *buf, | |||
2534 | for (i = 0; i < words; i++) | 2552 | for (i = 0; i < words; i++) |
2535 | buf16[i] = cpu_to_le16(readw(mmio)); | 2553 | buf16[i] = cpu_to_le16(readw(mmio)); |
2536 | } | 2554 | } |
2555 | |||
2556 | /* Transfer trailing 1 byte, if any. */ | ||
2557 | if (unlikely(buflen & 0x01)) { | ||
2558 | u16 align_buf[1] = { 0 }; | ||
2559 | unsigned char *trailing_buf = buf + buflen - 1; | ||
2560 | |||
2561 | if (write_data) { | ||
2562 | memcpy(align_buf, trailing_buf, 1); | ||
2563 | writew(le16_to_cpu(align_buf[0]), mmio); | ||
2564 | } else { | ||
2565 | align_buf[0] = cpu_to_le16(readw(mmio)); | ||
2566 | memcpy(trailing_buf, align_buf, 1); | ||
2567 | } | ||
2568 | } | ||
2537 | } | 2569 | } |
2538 | 2570 | ||
2571 | /** | ||
2572 | * ata_pio_data_xfer - Transfer data by PIO | ||
2573 | * @ap: port to read/write | ||
2574 | * @buf: data buffer | ||
2575 | * @buflen: buffer length | ||
2576 | * @do_write: read/write | ||
2577 | * | ||
2578 | * Transfer data from/to the device data register by PIO. | ||
2579 | * | ||
2580 | * LOCKING: | ||
2581 | * Inherited from caller. | ||
2582 | * | ||
2583 | */ | ||
2584 | |||
2539 | static void ata_pio_data_xfer(struct ata_port *ap, unsigned char *buf, | 2585 | static void ata_pio_data_xfer(struct ata_port *ap, unsigned char *buf, |
2540 | unsigned int buflen, int write_data) | 2586 | unsigned int buflen, int write_data) |
2541 | { | 2587 | { |
2542 | unsigned int dwords = buflen >> 1; | 2588 | unsigned int words = buflen >> 1; |
2543 | 2589 | ||
2590 | /* Transfer multiple of 2 bytes */ | ||
2544 | if (write_data) | 2591 | if (write_data) |
2545 | outsw(ap->ioaddr.data_addr, buf, dwords); | 2592 | outsw(ap->ioaddr.data_addr, buf, words); |
2546 | else | 2593 | else |
2547 | insw(ap->ioaddr.data_addr, buf, dwords); | 2594 | insw(ap->ioaddr.data_addr, buf, words); |
2595 | |||
2596 | /* Transfer trailing 1 byte, if any. */ | ||
2597 | if (unlikely(buflen & 0x01)) { | ||
2598 | u16 align_buf[1] = { 0 }; | ||
2599 | unsigned char *trailing_buf = buf + buflen - 1; | ||
2600 | |||
2601 | if (write_data) { | ||
2602 | memcpy(align_buf, trailing_buf, 1); | ||
2603 | outw(le16_to_cpu(align_buf[0]), ap->ioaddr.data_addr); | ||
2604 | } else { | ||
2605 | align_buf[0] = cpu_to_le16(inw(ap->ioaddr.data_addr)); | ||
2606 | memcpy(trailing_buf, align_buf, 1); | ||
2607 | } | ||
2608 | } | ||
2548 | } | 2609 | } |
2549 | 2610 | ||
2611 | /** | ||
2612 | * ata_data_xfer - Transfer data from/to the data register. | ||
2613 | * @ap: port to read/write | ||
2614 | * @buf: data buffer | ||
2615 | * @buflen: buffer length | ||
2616 | * @do_write: read/write | ||
2617 | * | ||
2618 | * Transfer data from/to the device data register. | ||
2619 | * | ||
2620 | * LOCKING: | ||
2621 | * Inherited from caller. | ||
2622 | * | ||
2623 | */ | ||
2624 | |||
2550 | static void ata_data_xfer(struct ata_port *ap, unsigned char *buf, | 2625 | static void ata_data_xfer(struct ata_port *ap, unsigned char *buf, |
2551 | unsigned int buflen, int do_write) | 2626 | unsigned int buflen, int do_write) |
2552 | { | 2627 | { |
@@ -2556,6 +2631,16 @@ static void ata_data_xfer(struct ata_port *ap, unsigned char *buf, | |||
2556 | ata_pio_data_xfer(ap, buf, buflen, do_write); | 2631 | ata_pio_data_xfer(ap, buf, buflen, do_write); |
2557 | } | 2632 | } |
2558 | 2633 | ||
2634 | /** | ||
2635 | * ata_pio_sector - Transfer ATA_SECT_SIZE (512 bytes) of data. | ||
2636 | * @qc: Command on going | ||
2637 | * | ||
2638 | * Transfer ATA_SECT_SIZE of data from/to the ATA device. | ||
2639 | * | ||
2640 | * LOCKING: | ||
2641 | * Inherited from caller. | ||
2642 | */ | ||
2643 | |||
2559 | static void ata_pio_sector(struct ata_queued_cmd *qc) | 2644 | static void ata_pio_sector(struct ata_queued_cmd *qc) |
2560 | { | 2645 | { |
2561 | int do_write = (qc->tf.flags & ATA_TFLAG_WRITE); | 2646 | int do_write = (qc->tf.flags & ATA_TFLAG_WRITE); |
@@ -2594,6 +2679,18 @@ static void ata_pio_sector(struct ata_queued_cmd *qc) | |||
2594 | kunmap(page); | 2679 | kunmap(page); |
2595 | } | 2680 | } |
2596 | 2681 | ||
2682 | /** | ||
2683 | * __atapi_pio_bytes - Transfer data from/to the ATAPI device. | ||
2684 | * @qc: Command on going | ||
2685 | * @bytes: number of bytes | ||
2686 | * | ||
2687 | * Transfer Transfer data from/to the ATAPI device. | ||
2688 | * | ||
2689 | * LOCKING: | ||
2690 | * Inherited from caller. | ||
2691 | * | ||
2692 | */ | ||
2693 | |||
2597 | static void __atapi_pio_bytes(struct ata_queued_cmd *qc, unsigned int bytes) | 2694 | static void __atapi_pio_bytes(struct ata_queued_cmd *qc, unsigned int bytes) |
2598 | { | 2695 | { |
2599 | int do_write = (qc->tf.flags & ATA_TFLAG_WRITE); | 2696 | int do_write = (qc->tf.flags & ATA_TFLAG_WRITE); |
@@ -2603,10 +2700,33 @@ static void __atapi_pio_bytes(struct ata_queued_cmd *qc, unsigned int bytes) | |||
2603 | unsigned char *buf; | 2700 | unsigned char *buf; |
2604 | unsigned int offset, count; | 2701 | unsigned int offset, count; |
2605 | 2702 | ||
2606 | if (qc->curbytes == qc->nbytes - bytes) | 2703 | if (qc->curbytes + bytes >= qc->nbytes) |
2607 | ap->pio_task_state = PIO_ST_LAST; | 2704 | ap->pio_task_state = PIO_ST_LAST; |
2608 | 2705 | ||
2609 | next_sg: | 2706 | next_sg: |
2707 | if (unlikely(qc->cursg >= qc->n_elem)) { | ||
2708 | /* | ||
2709 | * The end of qc->sg is reached and the device expects | ||
2710 | * more data to transfer. In order not to overrun qc->sg | ||
2711 | * and fulfill length specified in the byte count register, | ||
2712 | * - for read case, discard trailing data from the device | ||
2713 | * - for write case, padding zero data to the device | ||
2714 | */ | ||
2715 | u16 pad_buf[1] = { 0 }; | ||
2716 | unsigned int words = bytes >> 1; | ||
2717 | unsigned int i; | ||
2718 | |||
2719 | if (words) /* warning if bytes > 1 */ | ||
2720 | printk(KERN_WARNING "ata%u: %u bytes trailing data\n", | ||
2721 | ap->id, bytes); | ||
2722 | |||
2723 | for (i = 0; i < words; i++) | ||
2724 | ata_data_xfer(ap, (unsigned char*)pad_buf, 2, do_write); | ||
2725 | |||
2726 | ap->pio_task_state = PIO_ST_LAST; | ||
2727 | return; | ||
2728 | } | ||
2729 | |||
2610 | sg = &qc->sg[qc->cursg]; | 2730 | sg = &qc->sg[qc->cursg]; |
2611 | 2731 | ||
2612 | page = sg->page; | 2732 | page = sg->page; |
@@ -2640,11 +2760,21 @@ next_sg: | |||
2640 | 2760 | ||
2641 | kunmap(page); | 2761 | kunmap(page); |
2642 | 2762 | ||
2643 | if (bytes) { | 2763 | if (bytes) |
2644 | goto next_sg; | 2764 | goto next_sg; |
2645 | } | ||
2646 | } | 2765 | } |
2647 | 2766 | ||
2767 | /** | ||
2768 | * atapi_pio_bytes - Transfer data from/to the ATAPI device. | ||
2769 | * @qc: Command on going | ||
2770 | * | ||
2771 | * Transfer Transfer data from/to the ATAPI device. | ||
2772 | * | ||
2773 | * LOCKING: | ||
2774 | * Inherited from caller. | ||
2775 | * | ||
2776 | */ | ||
2777 | |||
2648 | static void atapi_pio_bytes(struct ata_queued_cmd *qc) | 2778 | static void atapi_pio_bytes(struct ata_queued_cmd *qc) |
2649 | { | 2779 | { |
2650 | struct ata_port *ap = qc->ap; | 2780 | struct ata_port *ap = qc->ap; |
@@ -2717,9 +2847,7 @@ static void ata_pio_block(struct ata_port *ap) | |||
2717 | if ((status & ATA_DRQ) == 0) { | 2847 | if ((status & ATA_DRQ) == 0) { |
2718 | ap->pio_task_state = PIO_ST_IDLE; | 2848 | ap->pio_task_state = PIO_ST_IDLE; |
2719 | 2849 | ||
2720 | ata_irq_on(ap); | 2850 | ata_poll_qc_complete(qc, status); |
2721 | |||
2722 | ata_qc_complete(qc, status); | ||
2723 | return; | 2851 | return; |
2724 | } | 2852 | } |
2725 | 2853 | ||
@@ -2749,9 +2877,7 @@ static void ata_pio_error(struct ata_port *ap) | |||
2749 | 2877 | ||
2750 | ap->pio_task_state = PIO_ST_IDLE; | 2878 | ap->pio_task_state = PIO_ST_IDLE; |
2751 | 2879 | ||
2752 | ata_irq_on(ap); | 2880 | ata_poll_qc_complete(qc, drv_stat | ATA_ERR); |
2753 | |||
2754 | ata_qc_complete(qc, drv_stat | ATA_ERR); | ||
2755 | } | 2881 | } |
2756 | 2882 | ||
2757 | static void ata_pio_task(void *_data) | 2883 | static void ata_pio_task(void *_data) |
@@ -2857,8 +2983,10 @@ static void atapi_request_sense(struct ata_port *ap, struct ata_device *dev, | |||
2857 | static void ata_qc_timeout(struct ata_queued_cmd *qc) | 2983 | static void ata_qc_timeout(struct ata_queued_cmd *qc) |
2858 | { | 2984 | { |
2859 | struct ata_port *ap = qc->ap; | 2985 | struct ata_port *ap = qc->ap; |
2986 | struct ata_host_set *host_set = ap->host_set; | ||
2860 | struct ata_device *dev = qc->dev; | 2987 | struct ata_device *dev = qc->dev; |
2861 | u8 host_stat = 0, drv_stat; | 2988 | u8 host_stat = 0, drv_stat; |
2989 | unsigned long flags; | ||
2862 | 2990 | ||
2863 | DPRINTK("ENTER\n"); | 2991 | DPRINTK("ENTER\n"); |
2864 | 2992 | ||
@@ -2869,7 +2997,9 @@ static void ata_qc_timeout(struct ata_queued_cmd *qc) | |||
2869 | if (!(cmd->eh_eflags & SCSI_EH_CANCEL_CMD)) { | 2997 | if (!(cmd->eh_eflags & SCSI_EH_CANCEL_CMD)) { |
2870 | 2998 | ||
2871 | /* finish completing original command */ | 2999 | /* finish completing original command */ |
3000 | spin_lock_irqsave(&host_set->lock, flags); | ||
2872 | __ata_qc_complete(qc); | 3001 | __ata_qc_complete(qc); |
3002 | spin_unlock_irqrestore(&host_set->lock, flags); | ||
2873 | 3003 | ||
2874 | atapi_request_sense(ap, dev, cmd); | 3004 | atapi_request_sense(ap, dev, cmd); |
2875 | 3005 | ||
@@ -2880,6 +3010,8 @@ static void ata_qc_timeout(struct ata_queued_cmd *qc) | |||
2880 | } | 3010 | } |
2881 | } | 3011 | } |
2882 | 3012 | ||
3013 | spin_lock_irqsave(&host_set->lock, flags); | ||
3014 | |||
2883 | /* hack alert! We cannot use the supplied completion | 3015 | /* hack alert! We cannot use the supplied completion |
2884 | * function from inside the ->eh_strategy_handler() thread. | 3016 | * function from inside the ->eh_strategy_handler() thread. |
2885 | * libata is the only user of ->eh_strategy_handler() in | 3017 | * libata is the only user of ->eh_strategy_handler() in |
@@ -2895,7 +3027,7 @@ static void ata_qc_timeout(struct ata_queued_cmd *qc) | |||
2895 | host_stat = ap->ops->bmdma_status(ap); | 3027 | host_stat = ap->ops->bmdma_status(ap); |
2896 | 3028 | ||
2897 | /* before we do anything else, clear DMA-Start bit */ | 3029 | /* before we do anything else, clear DMA-Start bit */ |
2898 | ap->ops->bmdma_stop(ap); | 3030 | ap->ops->bmdma_stop(qc); |
2899 | 3031 | ||
2900 | /* fall through */ | 3032 | /* fall through */ |
2901 | 3033 | ||
@@ -2913,6 +3045,9 @@ static void ata_qc_timeout(struct ata_queued_cmd *qc) | |||
2913 | ata_qc_complete(qc, drv_stat); | 3045 | ata_qc_complete(qc, drv_stat); |
2914 | break; | 3046 | break; |
2915 | } | 3047 | } |
3048 | |||
3049 | spin_unlock_irqrestore(&host_set->lock, flags); | ||
3050 | |||
2916 | out: | 3051 | out: |
2917 | DPRINTK("EXIT\n"); | 3052 | DPRINTK("EXIT\n"); |
2918 | } | 3053 | } |
@@ -3086,9 +3221,14 @@ void ata_qc_complete(struct ata_queued_cmd *qc, u8 drv_stat) | |||
3086 | if (likely(qc->flags & ATA_QCFLAG_DMAMAP)) | 3221 | if (likely(qc->flags & ATA_QCFLAG_DMAMAP)) |
3087 | ata_sg_clean(qc); | 3222 | ata_sg_clean(qc); |
3088 | 3223 | ||
3224 | /* atapi: mark qc as inactive to prevent the interrupt handler | ||
3225 | * from completing the command twice later, before the error handler | ||
3226 | * is called. (when rc != 0 and atapi request sense is needed) | ||
3227 | */ | ||
3228 | qc->flags &= ~ATA_QCFLAG_ACTIVE; | ||
3229 | |||
3089 | /* call completion callback */ | 3230 | /* call completion callback */ |
3090 | rc = qc->complete_fn(qc, drv_stat); | 3231 | rc = qc->complete_fn(qc, drv_stat); |
3091 | qc->flags &= ~ATA_QCFLAG_ACTIVE; | ||
3092 | 3232 | ||
3093 | /* if callback indicates not to complete command (non-zero), | 3233 | /* if callback indicates not to complete command (non-zero), |
3094 | * return immediately | 3234 | * return immediately |
@@ -3218,11 +3358,13 @@ int ata_qc_issue_prot(struct ata_queued_cmd *qc) | |||
3218 | break; | 3358 | break; |
3219 | 3359 | ||
3220 | case ATA_PROT_ATAPI_NODATA: | 3360 | case ATA_PROT_ATAPI_NODATA: |
3361 | ap->flags |= ATA_FLAG_NOINTR; | ||
3221 | ata_tf_to_host_nolock(ap, &qc->tf); | 3362 | ata_tf_to_host_nolock(ap, &qc->tf); |
3222 | queue_work(ata_wq, &ap->packet_task); | 3363 | queue_work(ata_wq, &ap->packet_task); |
3223 | break; | 3364 | break; |
3224 | 3365 | ||
3225 | case ATA_PROT_ATAPI_DMA: | 3366 | case ATA_PROT_ATAPI_DMA: |
3367 | ap->flags |= ATA_FLAG_NOINTR; | ||
3226 | ap->ops->tf_load(ap, &qc->tf); /* load tf registers */ | 3368 | ap->ops->tf_load(ap, &qc->tf); /* load tf registers */ |
3227 | ap->ops->bmdma_setup(qc); /* set up bmdma */ | 3369 | ap->ops->bmdma_setup(qc); /* set up bmdma */ |
3228 | queue_work(ata_wq, &ap->packet_task); | 3370 | queue_work(ata_wq, &ap->packet_task); |
@@ -3267,7 +3409,7 @@ static void ata_bmdma_setup_mmio (struct ata_queued_cmd *qc) | |||
3267 | } | 3409 | } |
3268 | 3410 | ||
3269 | /** | 3411 | /** |
3270 | * ata_bmdma_start - Start a PCI IDE BMDMA transaction | 3412 | * ata_bmdma_start_mmio - Start a PCI IDE BMDMA transaction |
3271 | * @qc: Info associated with this ATA transaction. | 3413 | * @qc: Info associated with this ATA transaction. |
3272 | * | 3414 | * |
3273 | * LOCKING: | 3415 | * LOCKING: |
@@ -3438,7 +3580,7 @@ u8 ata_bmdma_status(struct ata_port *ap) | |||
3438 | 3580 | ||
3439 | /** | 3581 | /** |
3440 | * ata_bmdma_stop - Stop PCI IDE BMDMA transfer | 3582 | * ata_bmdma_stop - Stop PCI IDE BMDMA transfer |
3441 | * @ap: Port associated with this ATA transaction. | 3583 | * @qc: Command we are ending DMA for |
3442 | * | 3584 | * |
3443 | * Clears the ATA_DMA_START flag in the dma control register | 3585 | * Clears the ATA_DMA_START flag in the dma control register |
3444 | * | 3586 | * |
@@ -3448,8 +3590,9 @@ u8 ata_bmdma_status(struct ata_port *ap) | |||
3448 | * spin_lock_irqsave(host_set lock) | 3590 | * spin_lock_irqsave(host_set lock) |
3449 | */ | 3591 | */ |
3450 | 3592 | ||
3451 | void ata_bmdma_stop(struct ata_port *ap) | 3593 | void ata_bmdma_stop(struct ata_queued_cmd *qc) |
3452 | { | 3594 | { |
3595 | struct ata_port *ap = qc->ap; | ||
3453 | if (ap->flags & ATA_FLAG_MMIO) { | 3596 | if (ap->flags & ATA_FLAG_MMIO) { |
3454 | void __iomem *mmio = (void __iomem *) ap->ioaddr.bmdma_addr; | 3597 | void __iomem *mmio = (void __iomem *) ap->ioaddr.bmdma_addr; |
3455 | 3598 | ||
@@ -3501,7 +3644,7 @@ inline unsigned int ata_host_intr (struct ata_port *ap, | |||
3501 | goto idle_irq; | 3644 | goto idle_irq; |
3502 | 3645 | ||
3503 | /* before we do anything else, clear DMA-Start bit */ | 3646 | /* before we do anything else, clear DMA-Start bit */ |
3504 | ap->ops->bmdma_stop(ap); | 3647 | ap->ops->bmdma_stop(qc); |
3505 | 3648 | ||
3506 | /* fall through */ | 3649 | /* fall through */ |
3507 | 3650 | ||
@@ -3576,7 +3719,8 @@ irqreturn_t ata_interrupt (int irq, void *dev_instance, struct pt_regs *regs) | |||
3576 | struct ata_port *ap; | 3719 | struct ata_port *ap; |
3577 | 3720 | ||
3578 | ap = host_set->ports[i]; | 3721 | ap = host_set->ports[i]; |
3579 | if (ap && (!(ap->flags & ATA_FLAG_PORT_DISABLED))) { | 3722 | if (ap && |
3723 | !(ap->flags & (ATA_FLAG_PORT_DISABLED | ATA_FLAG_NOINTR))) { | ||
3580 | struct ata_queued_cmd *qc; | 3724 | struct ata_queued_cmd *qc; |
3581 | 3725 | ||
3582 | qc = ata_qc_from_tag(ap, ap->active_tag); | 3726 | qc = ata_qc_from_tag(ap, ap->active_tag); |
@@ -3628,19 +3772,27 @@ static void atapi_packet_task(void *_data) | |||
3628 | /* send SCSI cdb */ | 3772 | /* send SCSI cdb */ |
3629 | DPRINTK("send cdb\n"); | 3773 | DPRINTK("send cdb\n"); |
3630 | assert(ap->cdb_len >= 12); | 3774 | assert(ap->cdb_len >= 12); |
3631 | ata_data_xfer(ap, qc->cdb, ap->cdb_len, 1); | ||
3632 | 3775 | ||
3633 | /* if we are DMA'ing, irq handler takes over from here */ | 3776 | if (qc->tf.protocol == ATA_PROT_ATAPI_DMA || |
3634 | if (qc->tf.protocol == ATA_PROT_ATAPI_DMA) | 3777 | qc->tf.protocol == ATA_PROT_ATAPI_NODATA) { |
3635 | ap->ops->bmdma_start(qc); /* initiate bmdma */ | 3778 | unsigned long flags; |
3636 | 3779 | ||
3637 | /* non-data commands are also handled via irq */ | 3780 | /* Once we're done issuing command and kicking bmdma, |
3638 | else if (qc->tf.protocol == ATA_PROT_ATAPI_NODATA) { | 3781 | * irq handler takes over. To not lose irq, we need |
3639 | /* do nothing */ | 3782 | * to clear NOINTR flag before sending cdb, but |
3640 | } | 3783 | * interrupt handler shouldn't be invoked before we're |
3784 | * finished. Hence, the following locking. | ||
3785 | */ | ||
3786 | spin_lock_irqsave(&ap->host_set->lock, flags); | ||
3787 | ap->flags &= ~ATA_FLAG_NOINTR; | ||
3788 | ata_data_xfer(ap, qc->cdb, ap->cdb_len, 1); | ||
3789 | if (qc->tf.protocol == ATA_PROT_ATAPI_DMA) | ||
3790 | ap->ops->bmdma_start(qc); /* initiate bmdma */ | ||
3791 | spin_unlock_irqrestore(&ap->host_set->lock, flags); | ||
3792 | } else { | ||
3793 | ata_data_xfer(ap, qc->cdb, ap->cdb_len, 1); | ||
3641 | 3794 | ||
3642 | /* PIO commands are handled by polling */ | 3795 | /* PIO commands are handled by polling */ |
3643 | else { | ||
3644 | ap->pio_task_state = PIO_ST; | 3796 | ap->pio_task_state = PIO_ST; |
3645 | queue_work(ata_wq, &ap->pio_task); | 3797 | queue_work(ata_wq, &ap->pio_task); |
3646 | } | 3798 | } |
@@ -3648,7 +3800,7 @@ static void atapi_packet_task(void *_data) | |||
3648 | return; | 3800 | return; |
3649 | 3801 | ||
3650 | err_out: | 3802 | err_out: |
3651 | ata_qc_complete(qc, ATA_ERR); | 3803 | ata_poll_qc_complete(qc, ATA_ERR); |
3652 | } | 3804 | } |
3653 | 3805 | ||
3654 | 3806 | ||
diff --git a/drivers/scsi/libata-scsi.c b/drivers/scsi/libata-scsi.c index 6a75ec2187fd..346eb36b1e31 100644 --- a/drivers/scsi/libata-scsi.c +++ b/drivers/scsi/libata-scsi.c | |||
@@ -1,25 +1,36 @@ | |||
1 | /* | 1 | /* |
2 | libata-scsi.c - helper library for ATA | 2 | * libata-scsi.c - helper library for ATA |
3 | 3 | * | |
4 | Copyright 2003-2004 Red Hat, Inc. All rights reserved. | 4 | * Maintained by: Jeff Garzik <jgarzik@pobox.com> |
5 | Copyright 2003-2004 Jeff Garzik | 5 | * Please ALWAYS copy linux-ide@vger.kernel.org |
6 | 6 | * on emails. | |
7 | The contents of this file are subject to the Open | 7 | * |
8 | Software License version 1.1 that can be found at | 8 | * Copyright 2003-2004 Red Hat, Inc. All rights reserved. |
9 | http://www.opensource.org/licenses/osl-1.1.txt and is included herein | 9 | * Copyright 2003-2004 Jeff Garzik |
10 | by reference. | 10 | * |
11 | 11 | * | |
12 | Alternatively, the contents of this file may be used under the terms | 12 | * This program is free software; you can redistribute it and/or modify |
13 | of the GNU General Public License version 2 (the "GPL") as distributed | 13 | * it under the terms of the GNU General Public License as published by |
14 | in the kernel source COPYING file, in which case the provisions of | 14 | * the Free Software Foundation; either version 2, or (at your option) |
15 | the GPL are applicable instead of the above. If you wish to allow | 15 | * any later version. |
16 | the use of your version of this file only under the terms of the | 16 | * |
17 | GPL and not to allow others to use your version of this file under | 17 | * This program is distributed in the hope that it will be useful, |
18 | the OSL, indicate your decision by deleting the provisions above and | 18 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
19 | replace them with the notice and other provisions required by the GPL. | 19 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
20 | If you do not delete the provisions above, a recipient may use your | 20 | * GNU General Public License for more details. |
21 | version of this file under either the OSL or the GPL. | 21 | * |
22 | 22 | * You should have received a copy of the GNU General Public License | |
23 | * along with this program; see the file COPYING. If not, write to | ||
24 | * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. | ||
25 | * | ||
26 | * | ||
27 | * libata documentation is available via 'make {ps|pdf}docs', | ||
28 | * as Documentation/DocBook/libata.* | ||
29 | * | ||
30 | * Hardware documentation available from | ||
31 | * - http://www.t10.org/ | ||
32 | * - http://www.t13.org/ | ||
33 | * | ||
23 | */ | 34 | */ |
24 | 35 | ||
25 | #include <linux/kernel.h> | 36 | #include <linux/kernel.h> |
@@ -392,6 +403,60 @@ int ata_scsi_error(struct Scsi_Host *host) | |||
392 | } | 403 | } |
393 | 404 | ||
394 | /** | 405 | /** |
406 | * ata_scsi_start_stop_xlat - Translate SCSI START STOP UNIT command | ||
407 | * @qc: Storage for translated ATA taskfile | ||
408 | * @scsicmd: SCSI command to translate | ||
409 | * | ||
410 | * Sets up an ATA taskfile to issue STANDBY (to stop) or READ VERIFY | ||
411 | * (to start). Perhaps these commands should be preceded by | ||
412 | * CHECK POWER MODE to see what power mode the device is already in. | ||
413 | * [See SAT revision 5 at www.t10.org] | ||
414 | * | ||
415 | * LOCKING: | ||
416 | * spin_lock_irqsave(host_set lock) | ||
417 | * | ||
418 | * RETURNS: | ||
419 | * Zero on success, non-zero on error. | ||
420 | */ | ||
421 | |||
422 | static unsigned int ata_scsi_start_stop_xlat(struct ata_queued_cmd *qc, | ||
423 | u8 *scsicmd) | ||
424 | { | ||
425 | struct ata_taskfile *tf = &qc->tf; | ||
426 | |||
427 | tf->flags |= ATA_TFLAG_DEVICE | ATA_TFLAG_ISADDR; | ||
428 | tf->protocol = ATA_PROT_NODATA; | ||
429 | if (scsicmd[1] & 0x1) { | ||
430 | ; /* ignore IMMED bit, violates sat-r05 */ | ||
431 | } | ||
432 | if (scsicmd[4] & 0x2) | ||
433 | return 1; /* LOEJ bit set not supported */ | ||
434 | if (((scsicmd[4] >> 4) & 0xf) != 0) | ||
435 | return 1; /* power conditions not supported */ | ||
436 | if (scsicmd[4] & 0x1) { | ||
437 | tf->nsect = 1; /* 1 sector, lba=0 */ | ||
438 | tf->lbah = 0x0; | ||
439 | tf->lbam = 0x0; | ||
440 | tf->lbal = 0x0; | ||
441 | tf->device |= ATA_LBA; | ||
442 | tf->command = ATA_CMD_VERIFY; /* READ VERIFY */ | ||
443 | } else { | ||
444 | tf->nsect = 0; /* time period value (0 implies now) */ | ||
445 | tf->command = ATA_CMD_STANDBY; | ||
446 | /* Consider: ATA STANDBY IMMEDIATE command */ | ||
447 | } | ||
448 | /* | ||
449 | * Standby and Idle condition timers could be implemented but that | ||
450 | * would require libata to implement the Power condition mode page | ||
451 | * and allow the user to change it. Changing mode pages requires | ||
452 | * MODE SELECT to be implemented. | ||
453 | */ | ||
454 | |||
455 | return 0; | ||
456 | } | ||
457 | |||
458 | |||
459 | /** | ||
395 | * ata_scsi_flush_xlat - Translate SCSI SYNCHRONIZE CACHE command | 460 | * ata_scsi_flush_xlat - Translate SCSI SYNCHRONIZE CACHE command |
396 | * @qc: Storage for translated ATA taskfile | 461 | * @qc: Storage for translated ATA taskfile |
397 | * @scsicmd: SCSI command to translate (ignored) | 462 | * @scsicmd: SCSI command to translate (ignored) |
@@ -576,11 +641,19 @@ static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc, u8 *scsicmd) | |||
576 | tf->lbah = scsicmd[3]; | 641 | tf->lbah = scsicmd[3]; |
577 | 642 | ||
578 | VPRINTK("ten-byte command\n"); | 643 | VPRINTK("ten-byte command\n"); |
644 | if (qc->nsect == 0) /* we don't support length==0 cmds */ | ||
645 | return 1; | ||
579 | return 0; | 646 | return 0; |
580 | } | 647 | } |
581 | 648 | ||
582 | if (scsicmd[0] == READ_6 || scsicmd[0] == WRITE_6) { | 649 | if (scsicmd[0] == READ_6 || scsicmd[0] == WRITE_6) { |
583 | qc->nsect = tf->nsect = scsicmd[4]; | 650 | qc->nsect = tf->nsect = scsicmd[4]; |
651 | if (!qc->nsect) { | ||
652 | qc->nsect = 256; | ||
653 | if (lba48) | ||
654 | tf->hob_nsect = 1; | ||
655 | } | ||
656 | |||
584 | tf->lbal = scsicmd[3]; | 657 | tf->lbal = scsicmd[3]; |
585 | tf->lbam = scsicmd[2]; | 658 | tf->lbam = scsicmd[2]; |
586 | tf->lbah = scsicmd[1] & 0x1f; /* mask out reserved bits */ | 659 | tf->lbah = scsicmd[1] & 0x1f; /* mask out reserved bits */ |
@@ -620,6 +693,8 @@ static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc, u8 *scsicmd) | |||
620 | tf->lbah = scsicmd[7]; | 693 | tf->lbah = scsicmd[7]; |
621 | 694 | ||
622 | VPRINTK("sixteen-byte command\n"); | 695 | VPRINTK("sixteen-byte command\n"); |
696 | if (qc->nsect == 0) /* we don't support length==0 cmds */ | ||
697 | return 1; | ||
623 | return 0; | 698 | return 0; |
624 | } | 699 | } |
625 | 700 | ||
@@ -1435,6 +1510,8 @@ static inline ata_xlat_func_t ata_get_xlat_func(struct ata_device *dev, u8 cmd) | |||
1435 | case VERIFY: | 1510 | case VERIFY: |
1436 | case VERIFY_16: | 1511 | case VERIFY_16: |
1437 | return ata_scsi_verify_xlat; | 1512 | return ata_scsi_verify_xlat; |
1513 | case START_STOP: | ||
1514 | return ata_scsi_start_stop_xlat; | ||
1438 | } | 1515 | } |
1439 | 1516 | ||
1440 | return NULL; | 1517 | return NULL; |
diff --git a/drivers/scsi/libata.h b/drivers/scsi/libata.h index d90430bbb0de..809c634afbcd 100644 --- a/drivers/scsi/libata.h +++ b/drivers/scsi/libata.h | |||
@@ -1,32 +1,35 @@ | |||
1 | /* | 1 | /* |
2 | libata.h - helper library for ATA | 2 | * libata.h - helper library for ATA |
3 | 3 | * | |
4 | Copyright 2003-2004 Red Hat, Inc. All rights reserved. | 4 | * Copyright 2003-2004 Red Hat, Inc. All rights reserved. |
5 | Copyright 2003-2004 Jeff Garzik | 5 | * Copyright 2003-2004 Jeff Garzik |
6 | 6 | * | |
7 | The contents of this file are subject to the Open | 7 | * |
8 | Software License version 1.1 that can be found at | 8 | * This program is free software; you can redistribute it and/or modify |
9 | http://www.opensource.org/licenses/osl-1.1.txt and is included herein | 9 | * it under the terms of the GNU General Public License as published by |
10 | by reference. | 10 | * the Free Software Foundation; either version 2, or (at your option) |
11 | 11 | * any later version. | |
12 | Alternatively, the contents of this file may be used under the terms | 12 | * |
13 | of the GNU General Public License version 2 (the "GPL") as distributed | 13 | * This program is distributed in the hope that it will be useful, |
14 | in the kernel source COPYING file, in which case the provisions of | 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | the GPL are applicable instead of the above. If you wish to allow | 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
16 | the use of your version of this file only under the terms of the | 16 | * GNU General Public License for more details. |
17 | GPL and not to allow others to use your version of this file under | 17 | * |
18 | the OSL, indicate your decision by deleting the provisions above and | 18 | * You should have received a copy of the GNU General Public License |
19 | replace them with the notice and other provisions required by the GPL. | 19 | * along with this program; see the file COPYING. If not, write to |
20 | If you do not delete the provisions above, a recipient may use your | 20 | * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. |
21 | version of this file under either the OSL or the GPL. | 21 | * |
22 | 22 | * | |
23 | * libata documentation is available via 'make {ps|pdf}docs', | ||
24 | * as Documentation/DocBook/libata.* | ||
25 | * | ||
23 | */ | 26 | */ |
24 | 27 | ||
25 | #ifndef __LIBATA_H__ | 28 | #ifndef __LIBATA_H__ |
26 | #define __LIBATA_H__ | 29 | #define __LIBATA_H__ |
27 | 30 | ||
28 | #define DRV_NAME "libata" | 31 | #define DRV_NAME "libata" |
29 | #define DRV_VERSION "1.11" /* must be exactly four chars */ | 32 | #define DRV_VERSION "1.12" /* must be exactly four chars */ |
30 | 33 | ||
31 | struct ata_scsi_args { | 34 | struct ata_scsi_args { |
32 | u16 *id; | 35 | u16 *id; |
@@ -72,7 +75,7 @@ extern unsigned int ata_scsiop_report_luns(struct ata_scsi_args *args, u8 *rbuf, | |||
72 | extern void ata_scsi_badcmd(struct scsi_cmnd *cmd, | 75 | extern void ata_scsi_badcmd(struct scsi_cmnd *cmd, |
73 | void (*done)(struct scsi_cmnd *), | 76 | void (*done)(struct scsi_cmnd *), |
74 | u8 asc, u8 ascq); | 77 | u8 asc, u8 ascq); |
75 | extern void ata_scsi_rbuf_fill(struct ata_scsi_args *args, | 78 | extern void ata_scsi_rbuf_fill(struct ata_scsi_args *args, |
76 | unsigned int (*actor) (struct ata_scsi_args *args, | 79 | unsigned int (*actor) (struct ata_scsi_args *args, |
77 | u8 *rbuf, unsigned int buflen)); | 80 | u8 *rbuf, unsigned int buflen)); |
78 | 81 | ||
diff --git a/drivers/scsi/sata_nv.c b/drivers/scsi/sata_nv.c index b0403ccd8a25..03d9bc6e69df 100644 --- a/drivers/scsi/sata_nv.c +++ b/drivers/scsi/sata_nv.c | |||
@@ -4,21 +4,37 @@ | |||
4 | * Copyright 2004 NVIDIA Corp. All rights reserved. | 4 | * Copyright 2004 NVIDIA Corp. All rights reserved. |
5 | * Copyright 2004 Andrew Chew | 5 | * Copyright 2004 Andrew Chew |
6 | * | 6 | * |
7 | * The contents of this file are subject to the Open | ||
8 | * Software License version 1.1 that can be found at | ||
9 | * http://www.opensource.org/licenses/osl-1.1.txt and is included herein | ||
10 | * by reference. | ||
11 | * | 7 | * |
12 | * Alternatively, the contents of this file may be used under the terms | 8 | * This program is free software; you can redistribute it and/or modify |
13 | * of the GNU General Public License version 2 (the "GPL") as distributed | 9 | * it under the terms of the GNU General Public License as published by |
14 | * in the kernel source COPYING file, in which case the provisions of | 10 | * the Free Software Foundation; either version 2, or (at your option) |
15 | * the GPL are applicable instead of the above. If you wish to allow | 11 | * any later version. |
16 | * the use of your version of this file only under the terms of the | 12 | * |
17 | * GPL and not to allow others to use your version of this file under | 13 | * This program is distributed in the hope that it will be useful, |
18 | * the OSL, indicate your decision by deleting the provisions above and | 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
19 | * replace them with the notice and other provisions required by the GPL. | 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
20 | * If you do not delete the provisions above, a recipient may use your | 16 | * GNU General Public License for more details. |
21 | * version of this file under either the OSL or the GPL. | 17 | * |
18 | * You should have received a copy of the GNU General Public License | ||
19 | * along with this program; see the file COPYING. If not, write to | ||
20 | * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. | ||
21 | * | ||
22 | * | ||
23 | * libata documentation is available via 'make {ps|pdf}docs', | ||
24 | * as Documentation/DocBook/libata.* | ||
25 | * | ||
26 | * No hardware documentation available outside of NVIDIA. | ||
27 | * This driver programs the NVIDIA SATA controller in a similar | ||
28 | * fashion as with other PCI IDE BMDMA controllers, with a few | ||
29 | * NV-specific details such as register offsets, SATA phy location, | ||
30 | * hotplug info, etc. | ||
31 | * | ||
32 | * | ||
33 | * 0.08 | ||
34 | * - Added support for MCP51 and MCP55. | ||
35 | * | ||
36 | * 0.07 | ||
37 | * - Added support for RAID class code. | ||
22 | * | 38 | * |
23 | * 0.06 | 39 | * 0.06 |
24 | * - Added generic SATA support by using a pci_device_id that filters on | 40 | * - Added generic SATA support by using a pci_device_id that filters on |
@@ -48,7 +64,7 @@ | |||
48 | #include <linux/libata.h> | 64 | #include <linux/libata.h> |
49 | 65 | ||
50 | #define DRV_NAME "sata_nv" | 66 | #define DRV_NAME "sata_nv" |
51 | #define DRV_VERSION "0.6" | 67 | #define DRV_VERSION "0.8" |
52 | 68 | ||
53 | #define NV_PORTS 2 | 69 | #define NV_PORTS 2 |
54 | #define NV_PIO_MASK 0x1f | 70 | #define NV_PIO_MASK 0x1f |
@@ -116,7 +132,9 @@ enum nv_host_type | |||
116 | GENERIC, | 132 | GENERIC, |
117 | NFORCE2, | 133 | NFORCE2, |
118 | NFORCE3, | 134 | NFORCE3, |
119 | CK804 | 135 | CK804, |
136 | MCP51, | ||
137 | MCP55 | ||
120 | }; | 138 | }; |
121 | 139 | ||
122 | static struct pci_device_id nv_pci_tbl[] = { | 140 | static struct pci_device_id nv_pci_tbl[] = { |
@@ -134,9 +152,18 @@ static struct pci_device_id nv_pci_tbl[] = { | |||
134 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, CK804 }, | 152 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, CK804 }, |
135 | { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_SATA2, | 153 | { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_SATA2, |
136 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, CK804 }, | 154 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, CK804 }, |
155 | { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_SATA, | ||
156 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, MCP51 }, | ||
157 | { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_SATA2, | ||
158 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, MCP51 }, | ||
159 | { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_SATA, | ||
160 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, MCP55 }, | ||
137 | { PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID, | 161 | { PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID, |
138 | PCI_ANY_ID, PCI_ANY_ID, | 162 | PCI_ANY_ID, PCI_ANY_ID, |
139 | PCI_CLASS_STORAGE_IDE<<8, 0xffff00, GENERIC }, | 163 | PCI_CLASS_STORAGE_IDE<<8, 0xffff00, GENERIC }, |
164 | { PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID, | ||
165 | PCI_ANY_ID, PCI_ANY_ID, | ||
166 | PCI_CLASS_STORAGE_RAID<<8, 0xffff00, GENERIC }, | ||
140 | { 0, } /* terminate list */ | 167 | { 0, } /* terminate list */ |
141 | }; | 168 | }; |
142 | 169 | ||
@@ -274,7 +301,8 @@ static irqreturn_t nv_interrupt (int irq, void *dev_instance, | |||
274 | struct ata_port *ap; | 301 | struct ata_port *ap; |
275 | 302 | ||
276 | ap = host_set->ports[i]; | 303 | ap = host_set->ports[i]; |
277 | if (ap && (!(ap->flags & ATA_FLAG_PORT_DISABLED))) { | 304 | if (ap && |
305 | !(ap->flags & (ATA_FLAG_PORT_DISABLED | ATA_FLAG_NOINTR))) { | ||
278 | struct ata_queued_cmd *qc; | 306 | struct ata_queued_cmd *qc; |
279 | 307 | ||
280 | qc = ata_qc_from_tag(ap, ap->active_tag); | 308 | qc = ata_qc_from_tag(ap, ap->active_tag); |
diff --git a/drivers/scsi/sata_promise.c b/drivers/scsi/sata_promise.c index 5c1d4411457a..4d8201422a12 100644 --- a/drivers/scsi/sata_promise.c +++ b/drivers/scsi/sata_promise.c | |||
@@ -7,21 +7,26 @@ | |||
7 | * | 7 | * |
8 | * Copyright 2003-2004 Red Hat, Inc. | 8 | * Copyright 2003-2004 Red Hat, Inc. |
9 | * | 9 | * |
10 | * The contents of this file are subject to the Open | ||
11 | * Software License version 1.1 that can be found at | ||
12 | * http://www.opensource.org/licenses/osl-1.1.txt and is included herein | ||
13 | * by reference. | ||
14 | * | 10 | * |
15 | * Alternatively, the contents of this file may be used under the terms | 11 | * This program is free software; you can redistribute it and/or modify |
16 | * of the GNU General Public License version 2 (the "GPL") as distributed | 12 | * it under the terms of the GNU General Public License as published by |
17 | * in the kernel source COPYING file, in which case the provisions of | 13 | * the Free Software Foundation; either version 2, or (at your option) |
18 | * the GPL are applicable instead of the above. If you wish to allow | 14 | * any later version. |
19 | * the use of your version of this file only under the terms of the | 15 | * |
20 | * GPL and not to allow others to use your version of this file under | 16 | * This program is distributed in the hope that it will be useful, |
21 | * the OSL, indicate your decision by deleting the provisions above and | 17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
22 | * replace them with the notice and other provisions required by the GPL. | 18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
23 | * If you do not delete the provisions above, a recipient may use your | 19 | * GNU General Public License for more details. |
24 | * version of this file under either the OSL or the GPL. | 20 | * |
21 | * You should have received a copy of the GNU General Public License | ||
22 | * along with this program; see the file COPYING. If not, write to | ||
23 | * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. | ||
24 | * | ||
25 | * | ||
26 | * libata documentation is available via 'make {ps|pdf}docs', | ||
27 | * as Documentation/DocBook/libata.* | ||
28 | * | ||
29 | * Hardware information only available under NDA. | ||
25 | * | 30 | * |
26 | */ | 31 | */ |
27 | 32 | ||
@@ -40,7 +45,7 @@ | |||
40 | #include "sata_promise.h" | 45 | #include "sata_promise.h" |
41 | 46 | ||
42 | #define DRV_NAME "sata_promise" | 47 | #define DRV_NAME "sata_promise" |
43 | #define DRV_VERSION "1.01" | 48 | #define DRV_VERSION "1.02" |
44 | 49 | ||
45 | 50 | ||
46 | enum { | 51 | enum { |
@@ -181,6 +186,10 @@ static struct pci_device_id pdc_ata_pci_tbl[] = { | |||
181 | board_20319 }, | 186 | board_20319 }, |
182 | { PCI_VENDOR_ID_PROMISE, 0x3319, PCI_ANY_ID, PCI_ANY_ID, 0, 0, | 187 | { PCI_VENDOR_ID_PROMISE, 0x3319, PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
183 | board_20319 }, | 188 | board_20319 }, |
189 | { PCI_VENDOR_ID_PROMISE, 0x3519, PCI_ANY_ID, PCI_ANY_ID, 0, 0, | ||
190 | board_20319 }, | ||
191 | { PCI_VENDOR_ID_PROMISE, 0x3d17, PCI_ANY_ID, PCI_ANY_ID, 0, 0, | ||
192 | board_20319 }, | ||
184 | { PCI_VENDOR_ID_PROMISE, 0x3d18, PCI_ANY_ID, PCI_ANY_ID, 0, 0, | 193 | { PCI_VENDOR_ID_PROMISE, 0x3d18, PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
185 | board_20319 }, | 194 | board_20319 }, |
186 | 195 | ||
@@ -321,11 +330,15 @@ static void pdc_qc_prep(struct ata_queued_cmd *qc) | |||
321 | 330 | ||
322 | static void pdc_eng_timeout(struct ata_port *ap) | 331 | static void pdc_eng_timeout(struct ata_port *ap) |
323 | { | 332 | { |
333 | struct ata_host_set *host_set = ap->host_set; | ||
324 | u8 drv_stat; | 334 | u8 drv_stat; |
325 | struct ata_queued_cmd *qc; | 335 | struct ata_queued_cmd *qc; |
336 | unsigned long flags; | ||
326 | 337 | ||
327 | DPRINTK("ENTER\n"); | 338 | DPRINTK("ENTER\n"); |
328 | 339 | ||
340 | spin_lock_irqsave(&host_set->lock, flags); | ||
341 | |||
329 | qc = ata_qc_from_tag(ap, ap->active_tag); | 342 | qc = ata_qc_from_tag(ap, ap->active_tag); |
330 | if (!qc) { | 343 | if (!qc) { |
331 | printk(KERN_ERR "ata%u: BUG: timeout without command\n", | 344 | printk(KERN_ERR "ata%u: BUG: timeout without command\n", |
@@ -359,6 +372,7 @@ static void pdc_eng_timeout(struct ata_port *ap) | |||
359 | } | 372 | } |
360 | 373 | ||
361 | out: | 374 | out: |
375 | spin_unlock_irqrestore(&host_set->lock, flags); | ||
362 | DPRINTK("EXIT\n"); | 376 | DPRINTK("EXIT\n"); |
363 | } | 377 | } |
364 | 378 | ||
@@ -441,7 +455,8 @@ static irqreturn_t pdc_interrupt (int irq, void *dev_instance, struct pt_regs *r | |||
441 | VPRINTK("port %u\n", i); | 455 | VPRINTK("port %u\n", i); |
442 | ap = host_set->ports[i]; | 456 | ap = host_set->ports[i]; |
443 | tmp = mask & (1 << (i + 1)); | 457 | tmp = mask & (1 << (i + 1)); |
444 | if (tmp && ap && (!(ap->flags & ATA_FLAG_PORT_DISABLED))) { | 458 | if (tmp && ap && |
459 | !(ap->flags & (ATA_FLAG_PORT_DISABLED | ATA_FLAG_NOINTR))) { | ||
445 | struct ata_queued_cmd *qc; | 460 | struct ata_queued_cmd *qc; |
446 | 461 | ||
447 | qc = ata_qc_from_tag(ap, ap->active_tag); | 462 | qc = ata_qc_from_tag(ap, ap->active_tag); |
diff --git a/drivers/scsi/sata_promise.h b/drivers/scsi/sata_promise.h index 6e7e96b9ee13..6ee5e190262d 100644 --- a/drivers/scsi/sata_promise.h +++ b/drivers/scsi/sata_promise.h | |||
@@ -3,21 +3,24 @@ | |||
3 | * | 3 | * |
4 | * Copyright 2003-2004 Red Hat, Inc. | 4 | * Copyright 2003-2004 Red Hat, Inc. |
5 | * | 5 | * |
6 | * The contents of this file are subject to the Open | ||
7 | * Software License version 1.1 that can be found at | ||
8 | * http://www.opensource.org/licenses/osl-1.1.txt and is included herein | ||
9 | * by reference. | ||
10 | * | 6 | * |
11 | * Alternatively, the contents of this file may be used under the terms | 7 | * This program is free software; you can redistribute it and/or modify |
12 | * of the GNU General Public License version 2 (the "GPL") as distributed | 8 | * it under the terms of the GNU General Public License as published by |
13 | * in the kernel source COPYING file, in which case the provisions of | 9 | * the Free Software Foundation; either version 2, or (at your option) |
14 | * the GPL are applicable instead of the above. If you wish to allow | 10 | * any later version. |
15 | * the use of your version of this file only under the terms of the | 11 | * |
16 | * GPL and not to allow others to use your version of this file under | 12 | * This program is distributed in the hope that it will be useful, |
17 | * the OSL, indicate your decision by deleting the provisions above and | 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
18 | * replace them with the notice and other provisions required by the GPL. | 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
19 | * If you do not delete the provisions above, a recipient may use your | 15 | * GNU General Public License for more details. |
20 | * version of this file under either the OSL or the GPL. | 16 | * |
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; see the file COPYING. If not, write to | ||
19 | * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. | ||
20 | * | ||
21 | * | ||
22 | * libata documentation is available via 'make {ps|pdf}docs', | ||
23 | * as Documentation/DocBook/libata.* | ||
21 | * | 24 | * |
22 | */ | 25 | */ |
23 | 26 | ||
diff --git a/drivers/scsi/sata_qstor.c b/drivers/scsi/sata_qstor.c index 1383e8a28d72..9c99ab433bd3 100644 --- a/drivers/scsi/sata_qstor.c +++ b/drivers/scsi/sata_qstor.c | |||
@@ -6,21 +6,24 @@ | |||
6 | * Copyright 2005 Pacific Digital Corporation. | 6 | * Copyright 2005 Pacific Digital Corporation. |
7 | * (OSL/GPL code release authorized by Jalil Fadavi). | 7 | * (OSL/GPL code release authorized by Jalil Fadavi). |
8 | * | 8 | * |
9 | * The contents of this file are subject to the Open | ||
10 | * Software License version 1.1 that can be found at | ||
11 | * http://www.opensource.org/licenses/osl-1.1.txt and is included herein | ||
12 | * by reference. | ||
13 | * | 9 | * |
14 | * Alternatively, the contents of this file may be used under the terms | 10 | * This program is free software; you can redistribute it and/or modify |
15 | * of the GNU General Public License version 2 (the "GPL") as distributed | 11 | * it under the terms of the GNU General Public License as published by |
16 | * in the kernel source COPYING file, in which case the provisions of | 12 | * the Free Software Foundation; either version 2, or (at your option) |
17 | * the GPL are applicable instead of the above. If you wish to allow | 13 | * any later version. |
18 | * the use of your version of this file only under the terms of the | 14 | * |
19 | * GPL and not to allow others to use your version of this file under | 15 | * This program is distributed in the hope that it will be useful, |
20 | * the OSL, indicate your decision by deleting the provisions above and | 16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
21 | * replace them with the notice and other provisions required by the GPL. | 17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
22 | * If you do not delete the provisions above, a recipient may use your | 18 | * GNU General Public License for more details. |
23 | * version of this file under either the OSL or the GPL. | 19 | * |
20 | * You should have received a copy of the GNU General Public License | ||
21 | * along with this program; see the file COPYING. If not, write to | ||
22 | * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. | ||
23 | * | ||
24 | * | ||
25 | * libata documentation is available via 'make {ps|pdf}docs', | ||
26 | * as Documentation/DocBook/libata.* | ||
24 | * | 27 | * |
25 | */ | 28 | */ |
26 | 29 | ||
@@ -117,7 +120,7 @@ static void qs_phy_reset(struct ata_port *ap); | |||
117 | static void qs_qc_prep(struct ata_queued_cmd *qc); | 120 | static void qs_qc_prep(struct ata_queued_cmd *qc); |
118 | static int qs_qc_issue(struct ata_queued_cmd *qc); | 121 | static int qs_qc_issue(struct ata_queued_cmd *qc); |
119 | static int qs_check_atapi_dma(struct ata_queued_cmd *qc); | 122 | static int qs_check_atapi_dma(struct ata_queued_cmd *qc); |
120 | static void qs_bmdma_stop(struct ata_port *ap); | 123 | static void qs_bmdma_stop(struct ata_queued_cmd *qc); |
121 | static u8 qs_bmdma_status(struct ata_port *ap); | 124 | static u8 qs_bmdma_status(struct ata_port *ap); |
122 | static void qs_irq_clear(struct ata_port *ap); | 125 | static void qs_irq_clear(struct ata_port *ap); |
123 | static void qs_eng_timeout(struct ata_port *ap); | 126 | static void qs_eng_timeout(struct ata_port *ap); |
@@ -198,7 +201,7 @@ static int qs_check_atapi_dma(struct ata_queued_cmd *qc) | |||
198 | return 1; /* ATAPI DMA not supported */ | 201 | return 1; /* ATAPI DMA not supported */ |
199 | } | 202 | } |
200 | 203 | ||
201 | static void qs_bmdma_stop(struct ata_port *ap) | 204 | static void qs_bmdma_stop(struct ata_queued_cmd *qc) |
202 | { | 205 | { |
203 | /* nothing */ | 206 | /* nothing */ |
204 | } | 207 | } |
@@ -386,7 +389,8 @@ static inline unsigned int qs_intr_pkt(struct ata_host_set *host_set) | |||
386 | DPRINTK("SFF=%08x%08x: sCHAN=%u sHST=%d sDST=%02x\n", | 389 | DPRINTK("SFF=%08x%08x: sCHAN=%u sHST=%d sDST=%02x\n", |
387 | sff1, sff0, port_no, sHST, sDST); | 390 | sff1, sff0, port_no, sHST, sDST); |
388 | handled = 1; | 391 | handled = 1; |
389 | if (ap && (!(ap->flags & ATA_FLAG_PORT_DISABLED))) { | 392 | if (ap && !(ap->flags & |
393 | (ATA_FLAG_PORT_DISABLED|ATA_FLAG_NOINTR))) { | ||
390 | struct ata_queued_cmd *qc; | 394 | struct ata_queued_cmd *qc; |
391 | struct qs_port_priv *pp = ap->private_data; | 395 | struct qs_port_priv *pp = ap->private_data; |
392 | if (!pp || pp->state != qs_state_pkt) | 396 | if (!pp || pp->state != qs_state_pkt) |
@@ -417,7 +421,8 @@ static inline unsigned int qs_intr_mmio(struct ata_host_set *host_set) | |||
417 | for (port_no = 0; port_no < host_set->n_ports; ++port_no) { | 421 | for (port_no = 0; port_no < host_set->n_ports; ++port_no) { |
418 | struct ata_port *ap; | 422 | struct ata_port *ap; |
419 | ap = host_set->ports[port_no]; | 423 | ap = host_set->ports[port_no]; |
420 | if (ap && (!(ap->flags & ATA_FLAG_PORT_DISABLED))) { | 424 | if (ap && |
425 | !(ap->flags & (ATA_FLAG_PORT_DISABLED | ATA_FLAG_NOINTR))) { | ||
421 | struct ata_queued_cmd *qc; | 426 | struct ata_queued_cmd *qc; |
422 | struct qs_port_priv *pp = ap->private_data; | 427 | struct qs_port_priv *pp = ap->private_data; |
423 | if (!pp || pp->state != qs_state_mmio) | 428 | if (!pp || pp->state != qs_state_mmio) |
@@ -431,7 +436,7 @@ static inline unsigned int qs_intr_mmio(struct ata_host_set *host_set) | |||
431 | continue; | 436 | continue; |
432 | DPRINTK("ata%u: protocol %d (dev_stat 0x%X)\n", | 437 | DPRINTK("ata%u: protocol %d (dev_stat 0x%X)\n", |
433 | ap->id, qc->tf.protocol, status); | 438 | ap->id, qc->tf.protocol, status); |
434 | 439 | ||
435 | /* complete taskfile transaction */ | 440 | /* complete taskfile transaction */ |
436 | pp->state = qs_state_idle; | 441 | pp->state = qs_state_idle; |
437 | ata_qc_complete(qc, status); | 442 | ata_qc_complete(qc, status); |
diff --git a/drivers/scsi/sata_sil.c b/drivers/scsi/sata_sil.c index 49ed557a4b66..71d49548f0a3 100644 --- a/drivers/scsi/sata_sil.c +++ b/drivers/scsi/sata_sil.c | |||
@@ -5,24 +5,32 @@ | |||
5 | * Please ALWAYS copy linux-ide@vger.kernel.org | 5 | * Please ALWAYS copy linux-ide@vger.kernel.org |
6 | * on emails. | 6 | * on emails. |
7 | * | 7 | * |
8 | * Copyright 2003 Red Hat, Inc. | 8 | * Copyright 2003-2005 Red Hat, Inc. |
9 | * Copyright 2003 Benjamin Herrenschmidt | 9 | * Copyright 2003 Benjamin Herrenschmidt |
10 | * | 10 | * |
11 | * The contents of this file are subject to the Open | ||
12 | * Software License version 1.1 that can be found at | ||
13 | * http://www.opensource.org/licenses/osl-1.1.txt and is included herein | ||
14 | * by reference. | ||
15 | * | 11 | * |
16 | * Alternatively, the contents of this file may be used under the terms | 12 | * This program is free software; you can redistribute it and/or modify |
17 | * of the GNU General Public License version 2 (the "GPL") as distributed | 13 | * it under the terms of the GNU General Public License as published by |
18 | * in the kernel source COPYING file, in which case the provisions of | 14 | * the Free Software Foundation; either version 2, or (at your option) |
19 | * the GPL are applicable instead of the above. If you wish to allow | 15 | * any later version. |
20 | * the use of your version of this file only under the terms of the | 16 | * |
21 | * GPL and not to allow others to use your version of this file under | 17 | * This program is distributed in the hope that it will be useful, |
22 | * the OSL, indicate your decision by deleting the provisions above and | 18 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
23 | * replace them with the notice and other provisions required by the GPL. | 19 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
24 | * If you do not delete the provisions above, a recipient may use your | 20 | * GNU General Public License for more details. |
25 | * version of this file under either the OSL or the GPL. | 21 | * |
22 | * You should have received a copy of the GNU General Public License | ||
23 | * along with this program; see the file COPYING. If not, write to | ||
24 | * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. | ||
25 | * | ||
26 | * | ||
27 | * libata documentation is available via 'make {ps|pdf}docs', | ||
28 | * as Documentation/DocBook/libata.* | ||
29 | * | ||
30 | * Documentation for SiI 3112: | ||
31 | * http://gkernel.sourceforge.net/specs/sii/3112A_SiI-DS-0095-B2.pdf.bz2 | ||
32 | * | ||
33 | * Other errata and documentation available under NDA. | ||
26 | * | 34 | * |
27 | */ | 35 | */ |
28 | 36 | ||
@@ -41,8 +49,11 @@ | |||
41 | #define DRV_VERSION "0.9" | 49 | #define DRV_VERSION "0.9" |
42 | 50 | ||
43 | enum { | 51 | enum { |
52 | SIL_FLAG_MOD15WRITE = (1 << 30), | ||
53 | |||
44 | sil_3112 = 0, | 54 | sil_3112 = 0, |
45 | sil_3114 = 1, | 55 | sil_3112_m15w = 1, |
56 | sil_3114 = 2, | ||
46 | 57 | ||
47 | SIL_FIFO_R0 = 0x40, | 58 | SIL_FIFO_R0 = 0x40, |
48 | SIL_FIFO_W0 = 0x41, | 59 | SIL_FIFO_W0 = 0x41, |
@@ -76,13 +87,13 @@ static void sil_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val); | |||
76 | static void sil_post_set_mode (struct ata_port *ap); | 87 | static void sil_post_set_mode (struct ata_port *ap); |
77 | 88 | ||
78 | static struct pci_device_id sil_pci_tbl[] = { | 89 | static struct pci_device_id sil_pci_tbl[] = { |
79 | { 0x1095, 0x3112, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112 }, | 90 | { 0x1095, 0x3112, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112_m15w }, |
80 | { 0x1095, 0x0240, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112 }, | 91 | { 0x1095, 0x0240, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112_m15w }, |
81 | { 0x1095, 0x3512, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112 }, | 92 | { 0x1095, 0x3512, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112 }, |
82 | { 0x1095, 0x3114, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3114 }, | 93 | { 0x1095, 0x3114, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3114 }, |
83 | { 0x1002, 0x436e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112 }, | 94 | { 0x1002, 0x436e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112_m15w }, |
84 | { 0x1002, 0x4379, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112 }, | 95 | { 0x1002, 0x4379, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112_m15w }, |
85 | { 0x1002, 0x437a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112 }, | 96 | { 0x1002, 0x437a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112_m15w }, |
86 | { } /* terminate list */ | 97 | { } /* terminate list */ |
87 | }; | 98 | }; |
88 | 99 | ||
@@ -174,6 +185,16 @@ static struct ata_port_info sil_port_info[] = { | |||
174 | .mwdma_mask = 0x07, /* mwdma0-2 */ | 185 | .mwdma_mask = 0x07, /* mwdma0-2 */ |
175 | .udma_mask = 0x3f, /* udma0-5 */ | 186 | .udma_mask = 0x3f, /* udma0-5 */ |
176 | .port_ops = &sil_ops, | 187 | .port_ops = &sil_ops, |
188 | }, /* sil_3112_15w - keep it sync'd w/ sil_3112 */ | ||
189 | { | ||
190 | .sht = &sil_sht, | ||
191 | .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | | ||
192 | ATA_FLAG_SRST | ATA_FLAG_MMIO | | ||
193 | SIL_FLAG_MOD15WRITE, | ||
194 | .pio_mask = 0x1f, /* pio0-4 */ | ||
195 | .mwdma_mask = 0x07, /* mwdma0-2 */ | ||
196 | .udma_mask = 0x3f, /* udma0-5 */ | ||
197 | .port_ops = &sil_ops, | ||
177 | }, /* sil_3114 */ | 198 | }, /* sil_3114 */ |
178 | { | 199 | { |
179 | .sht = &sil_sht, | 200 | .sht = &sil_sht, |
@@ -323,15 +344,15 @@ static void sil_dev_config(struct ata_port *ap, struct ata_device *dev) | |||
323 | while ((len > 0) && (s[len - 1] == ' ')) | 344 | while ((len > 0) && (s[len - 1] == ' ')) |
324 | len--; | 345 | len--; |
325 | 346 | ||
326 | for (n = 0; sil_blacklist[n].product; n++) | 347 | for (n = 0; sil_blacklist[n].product; n++) |
327 | if (!memcmp(sil_blacklist[n].product, s, | 348 | if (!memcmp(sil_blacklist[n].product, s, |
328 | strlen(sil_blacklist[n].product))) { | 349 | strlen(sil_blacklist[n].product))) { |
329 | quirks = sil_blacklist[n].quirk; | 350 | quirks = sil_blacklist[n].quirk; |
330 | break; | 351 | break; |
331 | } | 352 | } |
332 | 353 | ||
333 | /* limit requests to 15 sectors */ | 354 | /* limit requests to 15 sectors */ |
334 | if (quirks & SIL_QUIRK_MOD15WRITE) { | 355 | if ((ap->flags & SIL_FLAG_MOD15WRITE) && (quirks & SIL_QUIRK_MOD15WRITE)) { |
335 | printk(KERN_INFO "ata%u(%u): applying Seagate errata fix\n", | 356 | printk(KERN_INFO "ata%u(%u): applying Seagate errata fix\n", |
336 | ap->id, dev->devno); | 357 | ap->id, dev->devno); |
337 | ap->host->max_sectors = 15; | 358 | ap->host->max_sectors = 15; |
diff --git a/drivers/scsi/sata_sis.c b/drivers/scsi/sata_sis.c index e418b89c6b9d..43af445b3ad2 100644 --- a/drivers/scsi/sata_sis.c +++ b/drivers/scsi/sata_sis.c | |||
@@ -7,21 +7,26 @@ | |||
7 | * | 7 | * |
8 | * Copyright 2004 Uwe Koziolek | 8 | * Copyright 2004 Uwe Koziolek |
9 | * | 9 | * |
10 | * The contents of this file are subject to the Open | ||
11 | * Software License version 1.1 that can be found at | ||
12 | * http://www.opensource.org/licenses/osl-1.1.txt and is included herein | ||
13 | * by reference. | ||
14 | * | 10 | * |
15 | * Alternatively, the contents of this file may be used under the terms | 11 | * This program is free software; you can redistribute it and/or modify |
16 | * of the GNU General Public License version 2 (the "GPL") as distributed | 12 | * it under the terms of the GNU General Public License as published by |
17 | * in the kernel source COPYING file, in which case the provisions of | 13 | * the Free Software Foundation; either version 2, or (at your option) |
18 | * the GPL are applicable instead of the above. If you wish to allow | 14 | * any later version. |
19 | * the use of your version of this file only under the terms of the | 15 | * |
20 | * GPL and not to allow others to use your version of this file under | 16 | * This program is distributed in the hope that it will be useful, |
21 | * the OSL, indicate your decision by deleting the provisions above and | 17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
22 | * replace them with the notice and other provisions required by the GPL. | 18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
23 | * If you do not delete the provisions above, a recipient may use your | 19 | * GNU General Public License for more details. |
24 | * version of this file under either the OSL or the GPL. | 20 | * |
21 | * You should have received a copy of the GNU General Public License | ||
22 | * along with this program; see the file COPYING. If not, write to | ||
23 | * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. | ||
24 | * | ||
25 | * | ||
26 | * libata documentation is available via 'make {ps|pdf}docs', | ||
27 | * as Documentation/DocBook/libata.* | ||
28 | * | ||
29 | * Hardware documentation available under NDA. | ||
25 | * | 30 | * |
26 | */ | 31 | */ |
27 | 32 | ||
@@ -234,7 +239,7 @@ static int sis_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) | |||
234 | pci_read_config_dword(pdev, SIS_GENCTL, &genctl); | 239 | pci_read_config_dword(pdev, SIS_GENCTL, &genctl); |
235 | if ((genctl & GENCTL_IOMAPPED_SCR) == 0) | 240 | if ((genctl & GENCTL_IOMAPPED_SCR) == 0) |
236 | probe_ent->host_flags |= SIS_FLAG_CFGSCR; | 241 | probe_ent->host_flags |= SIS_FLAG_CFGSCR; |
237 | 242 | ||
238 | /* if hardware thinks SCRs are in IO space, but there are | 243 | /* if hardware thinks SCRs are in IO space, but there are |
239 | * no IO resources assigned, change to PCI cfg space. | 244 | * no IO resources assigned, change to PCI cfg space. |
240 | */ | 245 | */ |
diff --git a/drivers/scsi/sata_svw.c b/drivers/scsi/sata_svw.c index 858e07185dbd..19d3bb3b0fb6 100644 --- a/drivers/scsi/sata_svw.c +++ b/drivers/scsi/sata_svw.c | |||
@@ -13,21 +13,26 @@ | |||
13 | * This driver probably works with non-Apple versions of the | 13 | * This driver probably works with non-Apple versions of the |
14 | * Broadcom chipset... | 14 | * Broadcom chipset... |
15 | * | 15 | * |
16 | * The contents of this file are subject to the Open | ||
17 | * Software License version 1.1 that can be found at | ||
18 | * http://www.opensource.org/licenses/osl-1.1.txt and is included herein | ||
19 | * by reference. | ||
20 | * | 16 | * |
21 | * Alternatively, the contents of this file may be used under the terms | 17 | * This program is free software; you can redistribute it and/or modify |
22 | * of the GNU General Public License version 2 (the "GPL") as distributed | 18 | * it under the terms of the GNU General Public License as published by |
23 | * in the kernel source COPYING file, in which case the provisions of | 19 | * the Free Software Foundation; either version 2, or (at your option) |
24 | * the GPL are applicable instead of the above. If you wish to allow | 20 | * any later version. |
25 | * the use of your version of this file only under the terms of the | 21 | * |
26 | * GPL and not to allow others to use your version of this file under | 22 | * This program is distributed in the hope that it will be useful, |
27 | * the OSL, indicate your decision by deleting the provisions above and | 23 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
28 | * replace them with the notice and other provisions required by the GPL. | 24 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
29 | * If you do not delete the provisions above, a recipient may use your | 25 | * GNU General Public License for more details. |
30 | * version of this file under either the OSL or the GPL. | 26 | * |
27 | * You should have received a copy of the GNU General Public License | ||
28 | * along with this program; see the file COPYING. If not, write to | ||
29 | * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. | ||
30 | * | ||
31 | * | ||
32 | * libata documentation is available via 'make {ps|pdf}docs', | ||
33 | * as Documentation/DocBook/libata.* | ||
34 | * | ||
35 | * Hardware documentation available under NDA. | ||
31 | * | 36 | * |
32 | */ | 37 | */ |
33 | 38 | ||
@@ -195,18 +200,18 @@ static void k2_bmdma_start_mmio (struct ata_queued_cmd *qc) | |||
195 | /* start host DMA transaction */ | 200 | /* start host DMA transaction */ |
196 | dmactl = readb(mmio + ATA_DMA_CMD); | 201 | dmactl = readb(mmio + ATA_DMA_CMD); |
197 | writeb(dmactl | ATA_DMA_START, mmio + ATA_DMA_CMD); | 202 | writeb(dmactl | ATA_DMA_START, mmio + ATA_DMA_CMD); |
198 | /* There is a race condition in certain SATA controllers that can | 203 | /* There is a race condition in certain SATA controllers that can |
199 | be seen when the r/w command is given to the controller before the | 204 | be seen when the r/w command is given to the controller before the |
200 | host DMA is started. On a Read command, the controller would initiate | 205 | host DMA is started. On a Read command, the controller would initiate |
201 | the command to the drive even before it sees the DMA start. When there | 206 | the command to the drive even before it sees the DMA start. When there |
202 | are very fast drives connected to the controller, or when the data request | 207 | are very fast drives connected to the controller, or when the data request |
203 | hits in the drive cache, there is the possibility that the drive returns a part | 208 | hits in the drive cache, there is the possibility that the drive returns a part |
204 | or all of the requested data to the controller before the DMA start is issued. | 209 | or all of the requested data to the controller before the DMA start is issued. |
205 | In this case, the controller would become confused as to what to do with the data. | 210 | In this case, the controller would become confused as to what to do with the data. |
206 | In the worst case when all the data is returned back to the controller, the | 211 | In the worst case when all the data is returned back to the controller, the |
207 | controller could hang. In other cases it could return partial data returning | 212 | controller could hang. In other cases it could return partial data returning |
208 | in data corruption. This problem has been seen in PPC systems and can also appear | 213 | in data corruption. This problem has been seen in PPC systems and can also appear |
209 | on an system with very fast disks, where the SATA controller is sitting behind a | 214 | on an system with very fast disks, where the SATA controller is sitting behind a |
210 | number of bridges, and hence there is significant latency between the r/w command | 215 | number of bridges, and hence there is significant latency between the r/w command |
211 | and the start command. */ | 216 | and the start command. */ |
212 | /* issue r/w command if the access is to ATA*/ | 217 | /* issue r/w command if the access is to ATA*/ |
@@ -214,7 +219,7 @@ static void k2_bmdma_start_mmio (struct ata_queued_cmd *qc) | |||
214 | ap->ops->exec_command(ap, &qc->tf); | 219 | ap->ops->exec_command(ap, &qc->tf); |
215 | } | 220 | } |
216 | 221 | ||
217 | 222 | ||
218 | static u8 k2_stat_check_status(struct ata_port *ap) | 223 | static u8 k2_stat_check_status(struct ata_port *ap) |
219 | { | 224 | { |
220 | return readl((void *) ap->ioaddr.status_addr); | 225 | return readl((void *) ap->ioaddr.status_addr); |
diff --git a/drivers/scsi/sata_sx4.c b/drivers/scsi/sata_sx4.c index efd7d7a61135..c72fcc46f0fa 100644 --- a/drivers/scsi/sata_sx4.c +++ b/drivers/scsi/sata_sx4.c | |||
@@ -7,21 +7,26 @@ | |||
7 | * | 7 | * |
8 | * Copyright 2003-2004 Red Hat, Inc. | 8 | * Copyright 2003-2004 Red Hat, Inc. |
9 | * | 9 | * |
10 | * The contents of this file are subject to the Open | ||
11 | * Software License version 1.1 that can be found at | ||
12 | * http://www.opensource.org/licenses/osl-1.1.txt and is included herein | ||
13 | * by reference. | ||
14 | * | 10 | * |
15 | * Alternatively, the contents of this file may be used under the terms | 11 | * This program is free software; you can redistribute it and/or modify |
16 | * of the GNU General Public License version 2 (the "GPL") as distributed | 12 | * it under the terms of the GNU General Public License as published by |
17 | * in the kernel source COPYING file, in which case the provisions of | 13 | * the Free Software Foundation; either version 2, or (at your option) |
18 | * the GPL are applicable instead of the above. If you wish to allow | 14 | * any later version. |
19 | * the use of your version of this file only under the terms of the | 15 | * |
20 | * GPL and not to allow others to use your version of this file under | 16 | * This program is distributed in the hope that it will be useful, |
21 | * the OSL, indicate your decision by deleting the provisions above and | 17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
22 | * replace them with the notice and other provisions required by the GPL. | 18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
23 | * If you do not delete the provisions above, a recipient may use your | 19 | * GNU General Public License for more details. |
24 | * version of this file under either the OSL or the GPL. | 20 | * |
21 | * You should have received a copy of the GNU General Public License | ||
22 | * along with this program; see the file COPYING. If not, write to | ||
23 | * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. | ||
24 | * | ||
25 | * | ||
26 | * libata documentation is available via 'make {ps|pdf}docs', | ||
27 | * as Documentation/DocBook/libata.* | ||
28 | * | ||
29 | * Hardware documentation available under NDA. | ||
25 | * | 30 | * |
26 | */ | 31 | */ |
27 | 32 | ||
@@ -94,7 +99,7 @@ enum { | |||
94 | PDC_DIMM1_CONTROL_OFFSET = 0x84, | 99 | PDC_DIMM1_CONTROL_OFFSET = 0x84, |
95 | PDC_SDRAM_CONTROL_OFFSET = 0x88, | 100 | PDC_SDRAM_CONTROL_OFFSET = 0x88, |
96 | PDC_I2C_WRITE = 0x00000000, | 101 | PDC_I2C_WRITE = 0x00000000, |
97 | PDC_I2C_READ = 0x00000040, | 102 | PDC_I2C_READ = 0x00000040, |
98 | PDC_I2C_START = 0x00000080, | 103 | PDC_I2C_START = 0x00000080, |
99 | PDC_I2C_MASK_INT = 0x00000020, | 104 | PDC_I2C_MASK_INT = 0x00000020, |
100 | PDC_I2C_COMPLETE = 0x00010000, | 105 | PDC_I2C_COMPLETE = 0x00010000, |
@@ -105,16 +110,16 @@ enum { | |||
105 | PDC_DIMM_SPD_COLUMN_NUM = 4, | 110 | PDC_DIMM_SPD_COLUMN_NUM = 4, |
106 | PDC_DIMM_SPD_MODULE_ROW = 5, | 111 | PDC_DIMM_SPD_MODULE_ROW = 5, |
107 | PDC_DIMM_SPD_TYPE = 11, | 112 | PDC_DIMM_SPD_TYPE = 11, |
108 | PDC_DIMM_SPD_FRESH_RATE = 12, | 113 | PDC_DIMM_SPD_FRESH_RATE = 12, |
109 | PDC_DIMM_SPD_BANK_NUM = 17, | 114 | PDC_DIMM_SPD_BANK_NUM = 17, |
110 | PDC_DIMM_SPD_CAS_LATENCY = 18, | 115 | PDC_DIMM_SPD_CAS_LATENCY = 18, |
111 | PDC_DIMM_SPD_ATTRIBUTE = 21, | 116 | PDC_DIMM_SPD_ATTRIBUTE = 21, |
112 | PDC_DIMM_SPD_ROW_PRE_CHARGE = 27, | 117 | PDC_DIMM_SPD_ROW_PRE_CHARGE = 27, |
113 | PDC_DIMM_SPD_ROW_ACTIVE_DELAY = 28, | 118 | PDC_DIMM_SPD_ROW_ACTIVE_DELAY = 28, |
114 | PDC_DIMM_SPD_RAS_CAS_DELAY = 29, | 119 | PDC_DIMM_SPD_RAS_CAS_DELAY = 29, |
115 | PDC_DIMM_SPD_ACTIVE_PRECHARGE = 30, | 120 | PDC_DIMM_SPD_ACTIVE_PRECHARGE = 30, |
116 | PDC_DIMM_SPD_SYSTEM_FREQ = 126, | 121 | PDC_DIMM_SPD_SYSTEM_FREQ = 126, |
117 | PDC_CTL_STATUS = 0x08, | 122 | PDC_CTL_STATUS = 0x08, |
118 | PDC_DIMM_WINDOW_CTLR = 0x0C, | 123 | PDC_DIMM_WINDOW_CTLR = 0x0C, |
119 | PDC_TIME_CONTROL = 0x3C, | 124 | PDC_TIME_CONTROL = 0x3C, |
120 | PDC_TIME_PERIOD = 0x40, | 125 | PDC_TIME_PERIOD = 0x40, |
@@ -157,15 +162,15 @@ static void pdc_exec_command_mmio(struct ata_port *ap, struct ata_taskfile *tf); | |||
157 | static void pdc20621_host_stop(struct ata_host_set *host_set); | 162 | static void pdc20621_host_stop(struct ata_host_set *host_set); |
158 | static unsigned int pdc20621_dimm_init(struct ata_probe_ent *pe); | 163 | static unsigned int pdc20621_dimm_init(struct ata_probe_ent *pe); |
159 | static int pdc20621_detect_dimm(struct ata_probe_ent *pe); | 164 | static int pdc20621_detect_dimm(struct ata_probe_ent *pe); |
160 | static unsigned int pdc20621_i2c_read(struct ata_probe_ent *pe, | 165 | static unsigned int pdc20621_i2c_read(struct ata_probe_ent *pe, |
161 | u32 device, u32 subaddr, u32 *pdata); | 166 | u32 device, u32 subaddr, u32 *pdata); |
162 | static int pdc20621_prog_dimm0(struct ata_probe_ent *pe); | 167 | static int pdc20621_prog_dimm0(struct ata_probe_ent *pe); |
163 | static unsigned int pdc20621_prog_dimm_global(struct ata_probe_ent *pe); | 168 | static unsigned int pdc20621_prog_dimm_global(struct ata_probe_ent *pe); |
164 | #ifdef ATA_VERBOSE_DEBUG | 169 | #ifdef ATA_VERBOSE_DEBUG |
165 | static void pdc20621_get_from_dimm(struct ata_probe_ent *pe, | 170 | static void pdc20621_get_from_dimm(struct ata_probe_ent *pe, |
166 | void *psource, u32 offset, u32 size); | 171 | void *psource, u32 offset, u32 size); |
167 | #endif | 172 | #endif |
168 | static void pdc20621_put_to_dimm(struct ata_probe_ent *pe, | 173 | static void pdc20621_put_to_dimm(struct ata_probe_ent *pe, |
169 | void *psource, u32 offset, u32 size); | 174 | void *psource, u32 offset, u32 size); |
170 | static void pdc20621_irq_clear(struct ata_port *ap); | 175 | static void pdc20621_irq_clear(struct ata_port *ap); |
171 | static int pdc20621_qc_issue_prot(struct ata_queued_cmd *qc); | 176 | static int pdc20621_qc_issue_prot(struct ata_queued_cmd *qc); |
@@ -825,7 +830,8 @@ static irqreturn_t pdc20621_interrupt (int irq, void *dev_instance, struct pt_re | |||
825 | ap = host_set->ports[port_no]; | 830 | ap = host_set->ports[port_no]; |
826 | tmp = mask & (1 << i); | 831 | tmp = mask & (1 << i); |
827 | VPRINTK("seq %u, port_no %u, ap %p, tmp %x\n", i, port_no, ap, tmp); | 832 | VPRINTK("seq %u, port_no %u, ap %p, tmp %x\n", i, port_no, ap, tmp); |
828 | if (tmp && ap && (!(ap->flags & ATA_FLAG_PORT_DISABLED))) { | 833 | if (tmp && ap && |
834 | !(ap->flags & (ATA_FLAG_PORT_DISABLED | ATA_FLAG_NOINTR))) { | ||
829 | struct ata_queued_cmd *qc; | 835 | struct ata_queued_cmd *qc; |
830 | 836 | ||
831 | qc = ata_qc_from_tag(ap, ap->active_tag); | 837 | qc = ata_qc_from_tag(ap, ap->active_tag); |
@@ -847,10 +853,14 @@ static irqreturn_t pdc20621_interrupt (int irq, void *dev_instance, struct pt_re | |||
847 | static void pdc_eng_timeout(struct ata_port *ap) | 853 | static void pdc_eng_timeout(struct ata_port *ap) |
848 | { | 854 | { |
849 | u8 drv_stat; | 855 | u8 drv_stat; |
856 | struct ata_host_set *host_set = ap->host_set; | ||
850 | struct ata_queued_cmd *qc; | 857 | struct ata_queued_cmd *qc; |
858 | unsigned long flags; | ||
851 | 859 | ||
852 | DPRINTK("ENTER\n"); | 860 | DPRINTK("ENTER\n"); |
853 | 861 | ||
862 | spin_lock_irqsave(&host_set->lock, flags); | ||
863 | |||
854 | qc = ata_qc_from_tag(ap, ap->active_tag); | 864 | qc = ata_qc_from_tag(ap, ap->active_tag); |
855 | if (!qc) { | 865 | if (!qc) { |
856 | printk(KERN_ERR "ata%u: BUG: timeout without command\n", | 866 | printk(KERN_ERR "ata%u: BUG: timeout without command\n", |
@@ -884,6 +894,7 @@ static void pdc_eng_timeout(struct ata_port *ap) | |||
884 | } | 894 | } |
885 | 895 | ||
886 | out: | 896 | out: |
897 | spin_unlock_irqrestore(&host_set->lock, flags); | ||
887 | DPRINTK("EXIT\n"); | 898 | DPRINTK("EXIT\n"); |
888 | } | 899 | } |
889 | 900 | ||
@@ -922,7 +933,7 @@ static void pdc_sata_setup_port(struct ata_ioports *port, unsigned long base) | |||
922 | 933 | ||
923 | 934 | ||
924 | #ifdef ATA_VERBOSE_DEBUG | 935 | #ifdef ATA_VERBOSE_DEBUG |
925 | static void pdc20621_get_from_dimm(struct ata_probe_ent *pe, void *psource, | 936 | static void pdc20621_get_from_dimm(struct ata_probe_ent *pe, void *psource, |
926 | u32 offset, u32 size) | 937 | u32 offset, u32 size) |
927 | { | 938 | { |
928 | u32 window_size; | 939 | u32 window_size; |
@@ -936,9 +947,9 @@ static void pdc20621_get_from_dimm(struct ata_probe_ent *pe, void *psource, | |||
936 | /* hard-code chip #0 */ | 947 | /* hard-code chip #0 */ |
937 | mmio += PDC_CHIP0_OFS; | 948 | mmio += PDC_CHIP0_OFS; |
938 | 949 | ||
939 | page_mask = 0x00; | 950 | page_mask = 0x00; |
940 | window_size = 0x2000 * 4; /* 32K byte uchar size */ | 951 | window_size = 0x2000 * 4; /* 32K byte uchar size */ |
941 | idx = (u16) (offset / window_size); | 952 | idx = (u16) (offset / window_size); |
942 | 953 | ||
943 | writel(0x01, mmio + PDC_GENERAL_CTLR); | 954 | writel(0x01, mmio + PDC_GENERAL_CTLR); |
944 | readl(mmio + PDC_GENERAL_CTLR); | 955 | readl(mmio + PDC_GENERAL_CTLR); |
@@ -947,19 +958,19 @@ static void pdc20621_get_from_dimm(struct ata_probe_ent *pe, void *psource, | |||
947 | 958 | ||
948 | offset -= (idx * window_size); | 959 | offset -= (idx * window_size); |
949 | idx++; | 960 | idx++; |
950 | dist = ((long) (window_size - (offset + size))) >= 0 ? size : | 961 | dist = ((long) (window_size - (offset + size))) >= 0 ? size : |
951 | (long) (window_size - offset); | 962 | (long) (window_size - offset); |
952 | memcpy_fromio((char *) psource, (char *) (dimm_mmio + offset / 4), | 963 | memcpy_fromio((char *) psource, (char *) (dimm_mmio + offset / 4), |
953 | dist); | 964 | dist); |
954 | 965 | ||
955 | psource += dist; | 966 | psource += dist; |
956 | size -= dist; | 967 | size -= dist; |
957 | for (; (long) size >= (long) window_size ;) { | 968 | for (; (long) size >= (long) window_size ;) { |
958 | writel(0x01, mmio + PDC_GENERAL_CTLR); | 969 | writel(0x01, mmio + PDC_GENERAL_CTLR); |
959 | readl(mmio + PDC_GENERAL_CTLR); | 970 | readl(mmio + PDC_GENERAL_CTLR); |
960 | writel(((idx) << page_mask), mmio + PDC_DIMM_WINDOW_CTLR); | 971 | writel(((idx) << page_mask), mmio + PDC_DIMM_WINDOW_CTLR); |
961 | readl(mmio + PDC_DIMM_WINDOW_CTLR); | 972 | readl(mmio + PDC_DIMM_WINDOW_CTLR); |
962 | memcpy_fromio((char *) psource, (char *) (dimm_mmio), | 973 | memcpy_fromio((char *) psource, (char *) (dimm_mmio), |
963 | window_size / 4); | 974 | window_size / 4); |
964 | psource += window_size; | 975 | psource += window_size; |
965 | size -= window_size; | 976 | size -= window_size; |
@@ -971,14 +982,14 @@ static void pdc20621_get_from_dimm(struct ata_probe_ent *pe, void *psource, | |||
971 | readl(mmio + PDC_GENERAL_CTLR); | 982 | readl(mmio + PDC_GENERAL_CTLR); |
972 | writel(((idx) << page_mask), mmio + PDC_DIMM_WINDOW_CTLR); | 983 | writel(((idx) << page_mask), mmio + PDC_DIMM_WINDOW_CTLR); |
973 | readl(mmio + PDC_DIMM_WINDOW_CTLR); | 984 | readl(mmio + PDC_DIMM_WINDOW_CTLR); |
974 | memcpy_fromio((char *) psource, (char *) (dimm_mmio), | 985 | memcpy_fromio((char *) psource, (char *) (dimm_mmio), |
975 | size / 4); | 986 | size / 4); |
976 | } | 987 | } |
977 | } | 988 | } |
978 | #endif | 989 | #endif |
979 | 990 | ||
980 | 991 | ||
981 | static void pdc20621_put_to_dimm(struct ata_probe_ent *pe, void *psource, | 992 | static void pdc20621_put_to_dimm(struct ata_probe_ent *pe, void *psource, |
982 | u32 offset, u32 size) | 993 | u32 offset, u32 size) |
983 | { | 994 | { |
984 | u32 window_size; | 995 | u32 window_size; |
@@ -989,16 +1000,16 @@ static void pdc20621_put_to_dimm(struct ata_probe_ent *pe, void *psource, | |||
989 | struct pdc_host_priv *hpriv = pe->private_data; | 1000 | struct pdc_host_priv *hpriv = pe->private_data; |
990 | void *dimm_mmio = hpriv->dimm_mmio; | 1001 | void *dimm_mmio = hpriv->dimm_mmio; |
991 | 1002 | ||
992 | /* hard-code chip #0 */ | 1003 | /* hard-code chip #0 */ |
993 | mmio += PDC_CHIP0_OFS; | 1004 | mmio += PDC_CHIP0_OFS; |
994 | 1005 | ||
995 | page_mask = 0x00; | 1006 | page_mask = 0x00; |
996 | window_size = 0x2000 * 4; /* 32K byte uchar size */ | 1007 | window_size = 0x2000 * 4; /* 32K byte uchar size */ |
997 | idx = (u16) (offset / window_size); | 1008 | idx = (u16) (offset / window_size); |
998 | 1009 | ||
999 | writel(((idx) << page_mask), mmio + PDC_DIMM_WINDOW_CTLR); | 1010 | writel(((idx) << page_mask), mmio + PDC_DIMM_WINDOW_CTLR); |
1000 | readl(mmio + PDC_DIMM_WINDOW_CTLR); | 1011 | readl(mmio + PDC_DIMM_WINDOW_CTLR); |
1001 | offset -= (idx * window_size); | 1012 | offset -= (idx * window_size); |
1002 | idx++; | 1013 | idx++; |
1003 | dist = ((long)(s32)(window_size - (offset + size))) >= 0 ? size : | 1014 | dist = ((long)(s32)(window_size - (offset + size))) >= 0 ? size : |
1004 | (long) (window_size - offset); | 1015 | (long) (window_size - offset); |
@@ -1006,12 +1017,12 @@ static void pdc20621_put_to_dimm(struct ata_probe_ent *pe, void *psource, | |||
1006 | writel(0x01, mmio + PDC_GENERAL_CTLR); | 1017 | writel(0x01, mmio + PDC_GENERAL_CTLR); |
1007 | readl(mmio + PDC_GENERAL_CTLR); | 1018 | readl(mmio + PDC_GENERAL_CTLR); |
1008 | 1019 | ||
1009 | psource += dist; | 1020 | psource += dist; |
1010 | size -= dist; | 1021 | size -= dist; |
1011 | for (; (long) size >= (long) window_size ;) { | 1022 | for (; (long) size >= (long) window_size ;) { |
1012 | writel(((idx) << page_mask), mmio + PDC_DIMM_WINDOW_CTLR); | 1023 | writel(((idx) << page_mask), mmio + PDC_DIMM_WINDOW_CTLR); |
1013 | readl(mmio + PDC_DIMM_WINDOW_CTLR); | 1024 | readl(mmio + PDC_DIMM_WINDOW_CTLR); |
1014 | memcpy_toio((char *) (dimm_mmio), (char *) psource, | 1025 | memcpy_toio((char *) (dimm_mmio), (char *) psource, |
1015 | window_size / 4); | 1026 | window_size / 4); |
1016 | writel(0x01, mmio + PDC_GENERAL_CTLR); | 1027 | writel(0x01, mmio + PDC_GENERAL_CTLR); |
1017 | readl(mmio + PDC_GENERAL_CTLR); | 1028 | readl(mmio + PDC_GENERAL_CTLR); |
@@ -1019,7 +1030,7 @@ static void pdc20621_put_to_dimm(struct ata_probe_ent *pe, void *psource, | |||
1019 | size -= window_size; | 1030 | size -= window_size; |
1020 | idx ++; | 1031 | idx ++; |
1021 | } | 1032 | } |
1022 | 1033 | ||
1023 | if (size) { | 1034 | if (size) { |
1024 | writel(((idx) << page_mask), mmio + PDC_DIMM_WINDOW_CTLR); | 1035 | writel(((idx) << page_mask), mmio + PDC_DIMM_WINDOW_CTLR); |
1025 | readl(mmio + PDC_DIMM_WINDOW_CTLR); | 1036 | readl(mmio + PDC_DIMM_WINDOW_CTLR); |
@@ -1030,12 +1041,12 @@ static void pdc20621_put_to_dimm(struct ata_probe_ent *pe, void *psource, | |||
1030 | } | 1041 | } |
1031 | 1042 | ||
1032 | 1043 | ||
1033 | static unsigned int pdc20621_i2c_read(struct ata_probe_ent *pe, u32 device, | 1044 | static unsigned int pdc20621_i2c_read(struct ata_probe_ent *pe, u32 device, |
1034 | u32 subaddr, u32 *pdata) | 1045 | u32 subaddr, u32 *pdata) |
1035 | { | 1046 | { |
1036 | void *mmio = pe->mmio_base; | 1047 | void *mmio = pe->mmio_base; |
1037 | u32 i2creg = 0; | 1048 | u32 i2creg = 0; |
1038 | u32 status; | 1049 | u32 status; |
1039 | u32 count =0; | 1050 | u32 count =0; |
1040 | 1051 | ||
1041 | /* hard-code chip #0 */ | 1052 | /* hard-code chip #0 */ |
@@ -1049,7 +1060,7 @@ static unsigned int pdc20621_i2c_read(struct ata_probe_ent *pe, u32 device, | |||
1049 | readl(mmio + PDC_I2C_ADDR_DATA_OFFSET); | 1060 | readl(mmio + PDC_I2C_ADDR_DATA_OFFSET); |
1050 | 1061 | ||
1051 | /* Write Control to perform read operation, mask int */ | 1062 | /* Write Control to perform read operation, mask int */ |
1052 | writel(PDC_I2C_READ | PDC_I2C_START | PDC_I2C_MASK_INT, | 1063 | writel(PDC_I2C_READ | PDC_I2C_START | PDC_I2C_MASK_INT, |
1053 | mmio + PDC_I2C_CONTROL_OFFSET); | 1064 | mmio + PDC_I2C_CONTROL_OFFSET); |
1054 | 1065 | ||
1055 | for (count = 0; count <= 1000; count ++) { | 1066 | for (count = 0; count <= 1000; count ++) { |
@@ -1062,26 +1073,26 @@ static unsigned int pdc20621_i2c_read(struct ata_probe_ent *pe, u32 device, | |||
1062 | } | 1073 | } |
1063 | 1074 | ||
1064 | *pdata = (status >> 8) & 0x000000ff; | 1075 | *pdata = (status >> 8) & 0x000000ff; |
1065 | return 1; | 1076 | return 1; |
1066 | } | 1077 | } |
1067 | 1078 | ||
1068 | 1079 | ||
1069 | static int pdc20621_detect_dimm(struct ata_probe_ent *pe) | 1080 | static int pdc20621_detect_dimm(struct ata_probe_ent *pe) |
1070 | { | 1081 | { |
1071 | u32 data=0 ; | 1082 | u32 data=0 ; |
1072 | if (pdc20621_i2c_read(pe, PDC_DIMM0_SPD_DEV_ADDRESS, | 1083 | if (pdc20621_i2c_read(pe, PDC_DIMM0_SPD_DEV_ADDRESS, |
1073 | PDC_DIMM_SPD_SYSTEM_FREQ, &data)) { | 1084 | PDC_DIMM_SPD_SYSTEM_FREQ, &data)) { |
1074 | if (data == 100) | 1085 | if (data == 100) |
1075 | return 100; | 1086 | return 100; |
1076 | } else | 1087 | } else |
1077 | return 0; | 1088 | return 0; |
1078 | 1089 | ||
1079 | if (pdc20621_i2c_read(pe, PDC_DIMM0_SPD_DEV_ADDRESS, 9, &data)) { | 1090 | if (pdc20621_i2c_read(pe, PDC_DIMM0_SPD_DEV_ADDRESS, 9, &data)) { |
1080 | if(data <= 0x75) | 1091 | if(data <= 0x75) |
1081 | return 133; | 1092 | return 133; |
1082 | } else | 1093 | } else |
1083 | return 0; | 1094 | return 0; |
1084 | 1095 | ||
1085 | return 0; | 1096 | return 0; |
1086 | } | 1097 | } |
1087 | 1098 | ||
@@ -1091,15 +1102,15 @@ static int pdc20621_prog_dimm0(struct ata_probe_ent *pe) | |||
1091 | u32 spd0[50]; | 1102 | u32 spd0[50]; |
1092 | u32 data = 0; | 1103 | u32 data = 0; |
1093 | int size, i; | 1104 | int size, i; |
1094 | u8 bdimmsize; | 1105 | u8 bdimmsize; |
1095 | void *mmio = pe->mmio_base; | 1106 | void *mmio = pe->mmio_base; |
1096 | static const struct { | 1107 | static const struct { |
1097 | unsigned int reg; | 1108 | unsigned int reg; |
1098 | unsigned int ofs; | 1109 | unsigned int ofs; |
1099 | } pdc_i2c_read_data [] = { | 1110 | } pdc_i2c_read_data [] = { |
1100 | { PDC_DIMM_SPD_TYPE, 11 }, | 1111 | { PDC_DIMM_SPD_TYPE, 11 }, |
1101 | { PDC_DIMM_SPD_FRESH_RATE, 12 }, | 1112 | { PDC_DIMM_SPD_FRESH_RATE, 12 }, |
1102 | { PDC_DIMM_SPD_COLUMN_NUM, 4 }, | 1113 | { PDC_DIMM_SPD_COLUMN_NUM, 4 }, |
1103 | { PDC_DIMM_SPD_ATTRIBUTE, 21 }, | 1114 | { PDC_DIMM_SPD_ATTRIBUTE, 21 }, |
1104 | { PDC_DIMM_SPD_ROW_NUM, 3 }, | 1115 | { PDC_DIMM_SPD_ROW_NUM, 3 }, |
1105 | { PDC_DIMM_SPD_BANK_NUM, 17 }, | 1116 | { PDC_DIMM_SPD_BANK_NUM, 17 }, |
@@ -1108,7 +1119,7 @@ static int pdc20621_prog_dimm0(struct ata_probe_ent *pe) | |||
1108 | { PDC_DIMM_SPD_ROW_ACTIVE_DELAY, 28 }, | 1119 | { PDC_DIMM_SPD_ROW_ACTIVE_DELAY, 28 }, |
1109 | { PDC_DIMM_SPD_RAS_CAS_DELAY, 29 }, | 1120 | { PDC_DIMM_SPD_RAS_CAS_DELAY, 29 }, |
1110 | { PDC_DIMM_SPD_ACTIVE_PRECHARGE, 30 }, | 1121 | { PDC_DIMM_SPD_ACTIVE_PRECHARGE, 30 }, |
1111 | { PDC_DIMM_SPD_CAS_LATENCY, 18 }, | 1122 | { PDC_DIMM_SPD_CAS_LATENCY, 18 }, |
1112 | }; | 1123 | }; |
1113 | 1124 | ||
1114 | /* hard-code chip #0 */ | 1125 | /* hard-code chip #0 */ |
@@ -1116,17 +1127,17 @@ static int pdc20621_prog_dimm0(struct ata_probe_ent *pe) | |||
1116 | 1127 | ||
1117 | for(i=0; i<ARRAY_SIZE(pdc_i2c_read_data); i++) | 1128 | for(i=0; i<ARRAY_SIZE(pdc_i2c_read_data); i++) |
1118 | pdc20621_i2c_read(pe, PDC_DIMM0_SPD_DEV_ADDRESS, | 1129 | pdc20621_i2c_read(pe, PDC_DIMM0_SPD_DEV_ADDRESS, |
1119 | pdc_i2c_read_data[i].reg, | 1130 | pdc_i2c_read_data[i].reg, |
1120 | &spd0[pdc_i2c_read_data[i].ofs]); | 1131 | &spd0[pdc_i2c_read_data[i].ofs]); |
1121 | 1132 | ||
1122 | data |= (spd0[4] - 8) | ((spd0[21] != 0) << 3) | ((spd0[3]-11) << 4); | 1133 | data |= (spd0[4] - 8) | ((spd0[21] != 0) << 3) | ((spd0[3]-11) << 4); |
1123 | data |= ((spd0[17] / 4) << 6) | ((spd0[5] / 2) << 7) | | 1134 | data |= ((spd0[17] / 4) << 6) | ((spd0[5] / 2) << 7) | |
1124 | ((((spd0[27] + 9) / 10) - 1) << 8) ; | 1135 | ((((spd0[27] + 9) / 10) - 1) << 8) ; |
1125 | data |= (((((spd0[29] > spd0[28]) | 1136 | data |= (((((spd0[29] > spd0[28]) |
1126 | ? spd0[29] : spd0[28]) + 9) / 10) - 1) << 10; | 1137 | ? spd0[29] : spd0[28]) + 9) / 10) - 1) << 10; |
1127 | data |= ((spd0[30] - spd0[29] + 9) / 10 - 2) << 12; | 1138 | data |= ((spd0[30] - spd0[29] + 9) / 10 - 2) << 12; |
1128 | 1139 | ||
1129 | if (spd0[18] & 0x08) | 1140 | if (spd0[18] & 0x08) |
1130 | data |= ((0x03) << 14); | 1141 | data |= ((0x03) << 14); |
1131 | else if (spd0[18] & 0x04) | 1142 | else if (spd0[18] & 0x04) |
1132 | data |= ((0x02) << 14); | 1143 | data |= ((0x02) << 14); |
@@ -1135,7 +1146,7 @@ static int pdc20621_prog_dimm0(struct ata_probe_ent *pe) | |||
1135 | else | 1146 | else |
1136 | data |= (0 << 14); | 1147 | data |= (0 << 14); |
1137 | 1148 | ||
1138 | /* | 1149 | /* |
1139 | Calculate the size of bDIMMSize (power of 2) and | 1150 | Calculate the size of bDIMMSize (power of 2) and |
1140 | merge the DIMM size by program start/end address. | 1151 | merge the DIMM size by program start/end address. |
1141 | */ | 1152 | */ |
@@ -1145,9 +1156,9 @@ static int pdc20621_prog_dimm0(struct ata_probe_ent *pe) | |||
1145 | data |= (((size / 16) - 1) << 16); | 1156 | data |= (((size / 16) - 1) << 16); |
1146 | data |= (0 << 23); | 1157 | data |= (0 << 23); |
1147 | data |= 8; | 1158 | data |= 8; |
1148 | writel(data, mmio + PDC_DIMM0_CONTROL_OFFSET); | 1159 | writel(data, mmio + PDC_DIMM0_CONTROL_OFFSET); |
1149 | readl(mmio + PDC_DIMM0_CONTROL_OFFSET); | 1160 | readl(mmio + PDC_DIMM0_CONTROL_OFFSET); |
1150 | return size; | 1161 | return size; |
1151 | } | 1162 | } |
1152 | 1163 | ||
1153 | 1164 | ||
@@ -1167,12 +1178,12 @@ static unsigned int pdc20621_prog_dimm_global(struct ata_probe_ent *pe) | |||
1167 | Refresh Enable (bit 17) | 1178 | Refresh Enable (bit 17) |
1168 | */ | 1179 | */ |
1169 | 1180 | ||
1170 | data = 0x022259F1; | 1181 | data = 0x022259F1; |
1171 | writel(data, mmio + PDC_SDRAM_CONTROL_OFFSET); | 1182 | writel(data, mmio + PDC_SDRAM_CONTROL_OFFSET); |
1172 | readl(mmio + PDC_SDRAM_CONTROL_OFFSET); | 1183 | readl(mmio + PDC_SDRAM_CONTROL_OFFSET); |
1173 | 1184 | ||
1174 | /* Turn on for ECC */ | 1185 | /* Turn on for ECC */ |
1175 | pdc20621_i2c_read(pe, PDC_DIMM0_SPD_DEV_ADDRESS, | 1186 | pdc20621_i2c_read(pe, PDC_DIMM0_SPD_DEV_ADDRESS, |
1176 | PDC_DIMM_SPD_TYPE, &spd0); | 1187 | PDC_DIMM_SPD_TYPE, &spd0); |
1177 | if (spd0 == 0x02) { | 1188 | if (spd0 == 0x02) { |
1178 | data |= (0x01 << 16); | 1189 | data |= (0x01 << 16); |
@@ -1186,22 +1197,22 @@ static unsigned int pdc20621_prog_dimm_global(struct ata_probe_ent *pe) | |||
1186 | data |= (1<<19); | 1197 | data |= (1<<19); |
1187 | writel(data, mmio + PDC_SDRAM_CONTROL_OFFSET); | 1198 | writel(data, mmio + PDC_SDRAM_CONTROL_OFFSET); |
1188 | 1199 | ||
1189 | error = 1; | 1200 | error = 1; |
1190 | for (i = 1; i <= 10; i++) { /* polling ~5 secs */ | 1201 | for (i = 1; i <= 10; i++) { /* polling ~5 secs */ |
1191 | data = readl(mmio + PDC_SDRAM_CONTROL_OFFSET); | 1202 | data = readl(mmio + PDC_SDRAM_CONTROL_OFFSET); |
1192 | if (!(data & (1<<19))) { | 1203 | if (!(data & (1<<19))) { |
1193 | error = 0; | 1204 | error = 0; |
1194 | break; | 1205 | break; |
1195 | } | 1206 | } |
1196 | msleep(i*100); | 1207 | msleep(i*100); |
1197 | } | 1208 | } |
1198 | return error; | 1209 | return error; |
1199 | } | 1210 | } |
1200 | 1211 | ||
1201 | 1212 | ||
1202 | static unsigned int pdc20621_dimm_init(struct ata_probe_ent *pe) | 1213 | static unsigned int pdc20621_dimm_init(struct ata_probe_ent *pe) |
1203 | { | 1214 | { |
1204 | int speed, size, length; | 1215 | int speed, size, length; |
1205 | u32 addr,spd0,pci_status; | 1216 | u32 addr,spd0,pci_status; |
1206 | u32 tmp=0; | 1217 | u32 tmp=0; |
1207 | u32 time_period=0; | 1218 | u32 time_period=0; |
@@ -1228,7 +1239,7 @@ static unsigned int pdc20621_dimm_init(struct ata_probe_ent *pe) | |||
1228 | /* Wait 3 seconds */ | 1239 | /* Wait 3 seconds */ |
1229 | msleep(3000); | 1240 | msleep(3000); |
1230 | 1241 | ||
1231 | /* | 1242 | /* |
1232 | When timer is enabled, counter is decreased every internal | 1243 | When timer is enabled, counter is decreased every internal |
1233 | clock cycle. | 1244 | clock cycle. |
1234 | */ | 1245 | */ |
@@ -1236,24 +1247,24 @@ static unsigned int pdc20621_dimm_init(struct ata_probe_ent *pe) | |||
1236 | tcount = readl(mmio + PDC_TIME_COUNTER); | 1247 | tcount = readl(mmio + PDC_TIME_COUNTER); |
1237 | VPRINTK("Time Counter Register (0x44): 0x%x\n", tcount); | 1248 | VPRINTK("Time Counter Register (0x44): 0x%x\n", tcount); |
1238 | 1249 | ||
1239 | /* | 1250 | /* |
1240 | If SX4 is on PCI-X bus, after 3 seconds, the timer counter | 1251 | If SX4 is on PCI-X bus, after 3 seconds, the timer counter |
1241 | register should be >= (0xffffffff - 3x10^8). | 1252 | register should be >= (0xffffffff - 3x10^8). |
1242 | */ | 1253 | */ |
1243 | if(tcount >= PCI_X_TCOUNT) { | 1254 | if(tcount >= PCI_X_TCOUNT) { |
1244 | ticks = (time_period - tcount); | 1255 | ticks = (time_period - tcount); |
1245 | VPRINTK("Num counters 0x%x (%d)\n", ticks, ticks); | 1256 | VPRINTK("Num counters 0x%x (%d)\n", ticks, ticks); |
1246 | 1257 | ||
1247 | clock = (ticks / 300000); | 1258 | clock = (ticks / 300000); |
1248 | VPRINTK("10 * Internal clk = 0x%x (%d)\n", clock, clock); | 1259 | VPRINTK("10 * Internal clk = 0x%x (%d)\n", clock, clock); |
1249 | 1260 | ||
1250 | clock = (clock * 33); | 1261 | clock = (clock * 33); |
1251 | VPRINTK("10 * Internal clk * 33 = 0x%x (%d)\n", clock, clock); | 1262 | VPRINTK("10 * Internal clk * 33 = 0x%x (%d)\n", clock, clock); |
1252 | 1263 | ||
1253 | /* PLL F Param (bit 22:16) */ | 1264 | /* PLL F Param (bit 22:16) */ |
1254 | fparam = (1400000 / clock) - 2; | 1265 | fparam = (1400000 / clock) - 2; |
1255 | VPRINTK("PLL F Param: 0x%x (%d)\n", fparam, fparam); | 1266 | VPRINTK("PLL F Param: 0x%x (%d)\n", fparam, fparam); |
1256 | 1267 | ||
1257 | /* OD param = 0x2 (bit 31:30), R param = 0x5 (bit 29:25) */ | 1268 | /* OD param = 0x2 (bit 31:30), R param = 0x5 (bit 29:25) */ |
1258 | pci_status = (0x8a001824 | (fparam << 16)); | 1269 | pci_status = (0x8a001824 | (fparam << 16)); |
1259 | } else | 1270 | } else |
@@ -1264,21 +1275,21 @@ static unsigned int pdc20621_dimm_init(struct ata_probe_ent *pe) | |||
1264 | writel(pci_status, mmio + PDC_CTL_STATUS); | 1275 | writel(pci_status, mmio + PDC_CTL_STATUS); |
1265 | readl(mmio + PDC_CTL_STATUS); | 1276 | readl(mmio + PDC_CTL_STATUS); |
1266 | 1277 | ||
1267 | /* | 1278 | /* |
1268 | Read SPD of DIMM by I2C interface, | 1279 | Read SPD of DIMM by I2C interface, |
1269 | and program the DIMM Module Controller. | 1280 | and program the DIMM Module Controller. |
1270 | */ | 1281 | */ |
1271 | if (!(speed = pdc20621_detect_dimm(pe))) { | 1282 | if (!(speed = pdc20621_detect_dimm(pe))) { |
1272 | printk(KERN_ERR "Detect Local DIMM Fail\n"); | 1283 | printk(KERN_ERR "Detect Local DIMM Fail\n"); |
1273 | return 1; /* DIMM error */ | 1284 | return 1; /* DIMM error */ |
1274 | } | 1285 | } |
1275 | VPRINTK("Local DIMM Speed = %d\n", speed); | 1286 | VPRINTK("Local DIMM Speed = %d\n", speed); |
1276 | 1287 | ||
1277 | /* Programming DIMM0 Module Control Register (index_CID0:80h) */ | 1288 | /* Programming DIMM0 Module Control Register (index_CID0:80h) */ |
1278 | size = pdc20621_prog_dimm0(pe); | 1289 | size = pdc20621_prog_dimm0(pe); |
1279 | VPRINTK("Local DIMM Size = %dMB\n",size); | 1290 | VPRINTK("Local DIMM Size = %dMB\n",size); |
1280 | 1291 | ||
1281 | /* Programming DIMM Module Global Control Register (index_CID0:88h) */ | 1292 | /* Programming DIMM Module Global Control Register (index_CID0:88h) */ |
1282 | if (pdc20621_prog_dimm_global(pe)) { | 1293 | if (pdc20621_prog_dimm_global(pe)) { |
1283 | printk(KERN_ERR "Programming DIMM Module Global Control Register Fail\n"); | 1294 | printk(KERN_ERR "Programming DIMM Module Global Control Register Fail\n"); |
1284 | return 1; | 1295 | return 1; |
@@ -1297,30 +1308,30 @@ static unsigned int pdc20621_dimm_init(struct ata_probe_ent *pe) | |||
1297 | 1308 | ||
1298 | pdc20621_put_to_dimm(pe, (void *) test_parttern1, 0x10040, 40); | 1309 | pdc20621_put_to_dimm(pe, (void *) test_parttern1, 0x10040, 40); |
1299 | pdc20621_get_from_dimm(pe, (void *) test_parttern2, 0x40, 40); | 1310 | pdc20621_get_from_dimm(pe, (void *) test_parttern2, 0x40, 40); |
1300 | printk(KERN_ERR "%x, %x, %s\n", test_parttern2[0], | 1311 | printk(KERN_ERR "%x, %x, %s\n", test_parttern2[0], |
1301 | test_parttern2[1], &(test_parttern2[2])); | 1312 | test_parttern2[1], &(test_parttern2[2])); |
1302 | pdc20621_get_from_dimm(pe, (void *) test_parttern2, 0x10040, | 1313 | pdc20621_get_from_dimm(pe, (void *) test_parttern2, 0x10040, |
1303 | 40); | 1314 | 40); |
1304 | printk(KERN_ERR "%x, %x, %s\n", test_parttern2[0], | 1315 | printk(KERN_ERR "%x, %x, %s\n", test_parttern2[0], |
1305 | test_parttern2[1], &(test_parttern2[2])); | 1316 | test_parttern2[1], &(test_parttern2[2])); |
1306 | 1317 | ||
1307 | pdc20621_put_to_dimm(pe, (void *) test_parttern1, 0x40, 40); | 1318 | pdc20621_put_to_dimm(pe, (void *) test_parttern1, 0x40, 40); |
1308 | pdc20621_get_from_dimm(pe, (void *) test_parttern2, 0x40, 40); | 1319 | pdc20621_get_from_dimm(pe, (void *) test_parttern2, 0x40, 40); |
1309 | printk(KERN_ERR "%x, %x, %s\n", test_parttern2[0], | 1320 | printk(KERN_ERR "%x, %x, %s\n", test_parttern2[0], |
1310 | test_parttern2[1], &(test_parttern2[2])); | 1321 | test_parttern2[1], &(test_parttern2[2])); |
1311 | } | 1322 | } |
1312 | #endif | 1323 | #endif |
1313 | 1324 | ||
1314 | /* ECC initiliazation. */ | 1325 | /* ECC initiliazation. */ |
1315 | 1326 | ||
1316 | pdc20621_i2c_read(pe, PDC_DIMM0_SPD_DEV_ADDRESS, | 1327 | pdc20621_i2c_read(pe, PDC_DIMM0_SPD_DEV_ADDRESS, |
1317 | PDC_DIMM_SPD_TYPE, &spd0); | 1328 | PDC_DIMM_SPD_TYPE, &spd0); |
1318 | if (spd0 == 0x02) { | 1329 | if (spd0 == 0x02) { |
1319 | VPRINTK("Start ECC initialization\n"); | 1330 | VPRINTK("Start ECC initialization\n"); |
1320 | addr = 0; | 1331 | addr = 0; |
1321 | length = size * 1024 * 1024; | 1332 | length = size * 1024 * 1024; |
1322 | while (addr < length) { | 1333 | while (addr < length) { |
1323 | pdc20621_put_to_dimm(pe, (void *) &tmp, addr, | 1334 | pdc20621_put_to_dimm(pe, (void *) &tmp, addr, |
1324 | sizeof(u32)); | 1335 | sizeof(u32)); |
1325 | addr += sizeof(u32); | 1336 | addr += sizeof(u32); |
1326 | } | 1337 | } |
diff --git a/drivers/scsi/sata_uli.c b/drivers/scsi/sata_uli.c index a71fb54eebd3..1566886815fb 100644 --- a/drivers/scsi/sata_uli.c +++ b/drivers/scsi/sata_uli.c | |||
@@ -1,21 +1,26 @@ | |||
1 | /* | 1 | /* |
2 | * sata_uli.c - ULi Electronics SATA | 2 | * sata_uli.c - ULi Electronics SATA |
3 | * | 3 | * |
4 | * The contents of this file are subject to the Open | ||
5 | * Software License version 1.1 that can be found at | ||
6 | * http://www.opensource.org/licenses/osl-1.1.txt and is included herein | ||
7 | * by reference. | ||
8 | * | 4 | * |
9 | * Alternatively, the contents of this file may be used under the terms | 5 | * This program is free software; you can redistribute it and/or modify |
10 | * of the GNU General Public License version 2 (the "GPL") as distributed | 6 | * it under the terms of the GNU General Public License as published by |
11 | * in the kernel source COPYING file, in which case the provisions of | 7 | * the Free Software Foundation; either version 2, or (at your option) |
12 | * the GPL are applicable instead of the above. If you wish to allow | 8 | * any later version. |
13 | * the use of your version of this file only under the terms of the | 9 | * |
14 | * GPL and not to allow others to use your version of this file under | 10 | * This program is distributed in the hope that it will be useful, |
15 | * the OSL, indicate your decision by deleting the provisions above and | 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | * replace them with the notice and other provisions required by the GPL. | 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
17 | * If you do not delete the provisions above, a recipient may use your | 13 | * GNU General Public License for more details. |
18 | * version of this file under either the OSL or the GPL. | 14 | * |
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program; see the file COPYING. If not, write to | ||
17 | * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. | ||
18 | * | ||
19 | * | ||
20 | * libata documentation is available via 'make {ps|pdf}docs', | ||
21 | * as Documentation/DocBook/libata.* | ||
22 | * | ||
23 | * Hardware documentation available under NDA. | ||
19 | * | 24 | * |
20 | */ | 25 | */ |
21 | 26 | ||
@@ -214,7 +219,7 @@ static int uli_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) | |||
214 | rc = -ENOMEM; | 219 | rc = -ENOMEM; |
215 | goto err_out_regions; | 220 | goto err_out_regions; |
216 | } | 221 | } |
217 | 222 | ||
218 | switch (board_idx) { | 223 | switch (board_idx) { |
219 | case uli_5287: | 224 | case uli_5287: |
220 | probe_ent->port[0].scr_addr = ULI5287_BASE; | 225 | probe_ent->port[0].scr_addr = ULI5287_BASE; |
diff --git a/drivers/scsi/sata_via.c b/drivers/scsi/sata_via.c index f43183c19a12..128b996b07b7 100644 --- a/drivers/scsi/sata_via.c +++ b/drivers/scsi/sata_via.c | |||
@@ -1,34 +1,38 @@ | |||
1 | /* | 1 | /* |
2 | sata_via.c - VIA Serial ATA controllers | 2 | * sata_via.c - VIA Serial ATA controllers |
3 | 3 | * | |
4 | Maintained by: Jeff Garzik <jgarzik@pobox.com> | 4 | * Maintained by: Jeff Garzik <jgarzik@pobox.com> |
5 | Please ALWAYS copy linux-ide@vger.kernel.org | 5 | * Please ALWAYS copy linux-ide@vger.kernel.org |
6 | on emails. | 6 | on emails. |
7 | 7 | * | |
8 | Copyright 2003-2004 Red Hat, Inc. All rights reserved. | 8 | * Copyright 2003-2004 Red Hat, Inc. All rights reserved. |
9 | Copyright 2003-2004 Jeff Garzik | 9 | * Copyright 2003-2004 Jeff Garzik |
10 | 10 | * | |
11 | The contents of this file are subject to the Open | 11 | * |
12 | Software License version 1.1 that can be found at | 12 | * This program is free software; you can redistribute it and/or modify |
13 | http://www.opensource.org/licenses/osl-1.1.txt and is included herein | 13 | * it under the terms of the GNU General Public License as published by |
14 | by reference. | 14 | * the Free Software Foundation; either version 2, or (at your option) |
15 | 15 | * any later version. | |
16 | Alternatively, the contents of this file may be used under the terms | 16 | * |
17 | of the GNU General Public License version 2 (the "GPL") as distributed | 17 | * This program is distributed in the hope that it will be useful, |
18 | in the kernel source COPYING file, in which case the provisions of | 18 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
19 | the GPL are applicable instead of the above. If you wish to allow | 19 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
20 | the use of your version of this file only under the terms of the | 20 | * GNU General Public License for more details. |
21 | GPL and not to allow others to use your version of this file under | 21 | * |
22 | the OSL, indicate your decision by deleting the provisions above and | 22 | * You should have received a copy of the GNU General Public License |
23 | replace them with the notice and other provisions required by the GPL. | 23 | * along with this program; see the file COPYING. If not, write to |
24 | If you do not delete the provisions above, a recipient may use your | 24 | * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. |
25 | version of this file under either the OSL or the GPL. | 25 | * |
26 | 26 | * | |
27 | ---------------------------------------------------------------------- | 27 | * libata documentation is available via 'make {ps|pdf}docs', |
28 | 28 | * as Documentation/DocBook/libata.* | |
29 | To-do list: | 29 | * |
30 | * VT6421 PATA support | 30 | * Hardware documentation available under NDA. |
31 | 31 | * | |
32 | * | ||
33 | * To-do list: | ||
34 | * - VT6421 PATA support | ||
35 | * | ||
32 | */ | 36 | */ |
33 | 37 | ||
34 | #include <linux/kernel.h> | 38 | #include <linux/kernel.h> |
@@ -347,7 +351,7 @@ static int svia_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) | |||
347 | probe_ent = vt6420_init_probe_ent(pdev); | 351 | probe_ent = vt6420_init_probe_ent(pdev); |
348 | else | 352 | else |
349 | probe_ent = vt6421_init_probe_ent(pdev); | 353 | probe_ent = vt6421_init_probe_ent(pdev); |
350 | 354 | ||
351 | if (!probe_ent) { | 355 | if (!probe_ent) { |
352 | printk(KERN_ERR DRV_NAME "(%s): out of memory\n", | 356 | printk(KERN_ERR DRV_NAME "(%s): out of memory\n", |
353 | pci_name(pdev)); | 357 | pci_name(pdev)); |
diff --git a/drivers/scsi/sata_vsc.c b/drivers/scsi/sata_vsc.c index c5e09dc6f3de..3985f344da4d 100644 --- a/drivers/scsi/sata_vsc.c +++ b/drivers/scsi/sata_vsc.c | |||
@@ -9,9 +9,29 @@ | |||
9 | * | 9 | * |
10 | * Bits from Jeff Garzik, Copyright RedHat, Inc. | 10 | * Bits from Jeff Garzik, Copyright RedHat, Inc. |
11 | * | 11 | * |
12 | * This file is subject to the terms and conditions of the GNU General Public | 12 | * |
13 | * License. See the file "COPYING" in the main directory of this archive | 13 | * This program is free software; you can redistribute it and/or modify |
14 | * for more details. | 14 | * it under the terms of the GNU General Public License as published by |
15 | * the Free Software Foundation; either version 2, or (at your option) | ||
16 | * any later version. | ||
17 | * | ||
18 | * This program is distributed in the hope that it will be useful, | ||
19 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
20 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
21 | * GNU General Public License for more details. | ||
22 | * | ||
23 | * You should have received a copy of the GNU General Public License | ||
24 | * along with this program; see the file COPYING. If not, write to | ||
25 | * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. | ||
26 | * | ||
27 | * | ||
28 | * libata documentation is available via 'make {ps|pdf}docs', | ||
29 | * as Documentation/DocBook/libata.* | ||
30 | * | ||
31 | * Vitesse hardware documentation presumably available under NDA. | ||
32 | * Intel 31244 (same hardware interface) documentation presumably | ||
33 | * available from http://developer.intel.com/ | ||
34 | * | ||
15 | */ | 35 | */ |
16 | 36 | ||
17 | #include <linux/kernel.h> | 37 | #include <linux/kernel.h> |
@@ -173,7 +193,8 @@ static irqreturn_t vsc_sata_interrupt (int irq, void *dev_instance, | |||
173 | struct ata_port *ap; | 193 | struct ata_port *ap; |
174 | 194 | ||
175 | ap = host_set->ports[i]; | 195 | ap = host_set->ports[i]; |
176 | if (ap && (!(ap->flags & ATA_FLAG_PORT_DISABLED))) { | 196 | if (ap && !(ap->flags & |
197 | (ATA_FLAG_PORT_DISABLED|ATA_FLAG_NOINTR))) { | ||
177 | struct ata_queued_cmd *qc; | 198 | struct ata_queued_cmd *qc; |
178 | 199 | ||
179 | qc = ata_qc_from_tag(ap, ap->active_tag); | 200 | qc = ata_qc_from_tag(ap, ap->active_tag); |
@@ -342,7 +363,7 @@ static int __devinit vsc_sata_init_one (struct pci_dev *pdev, const struct pci_d | |||
342 | 363 | ||
343 | pci_set_master(pdev); | 364 | pci_set_master(pdev); |
344 | 365 | ||
345 | /* | 366 | /* |
346 | * Config offset 0x98 is "Extended Control and Status Register 0" | 367 | * Config offset 0x98 is "Extended Control and Status Register 0" |
347 | * Default value is (1 << 28). All bits except bit 28 are reserved in | 368 | * Default value is (1 << 28). All bits except bit 28 are reserved in |
348 | * DPA mode. If bit 28 is set, LED 0 reflects all ports' activity. | 369 | * DPA mode. If bit 28 is set, LED 0 reflects all ports' activity. |
diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c index 51292f269ce5..e822ca0e97cf 100644 --- a/drivers/scsi/sg.c +++ b/drivers/scsi/sg.c | |||
@@ -2971,23 +2971,22 @@ static void * dev_seq_start(struct seq_file *s, loff_t *pos) | |||
2971 | { | 2971 | { |
2972 | struct sg_proc_deviter * it = kmalloc(sizeof(*it), GFP_KERNEL); | 2972 | struct sg_proc_deviter * it = kmalloc(sizeof(*it), GFP_KERNEL); |
2973 | 2973 | ||
2974 | s->private = it; | ||
2974 | if (! it) | 2975 | if (! it) |
2975 | return NULL; | 2976 | return NULL; |
2977 | |||
2976 | if (NULL == sg_dev_arr) | 2978 | if (NULL == sg_dev_arr) |
2977 | goto err1; | 2979 | return NULL; |
2978 | it->index = *pos; | 2980 | it->index = *pos; |
2979 | it->max = sg_last_dev(); | 2981 | it->max = sg_last_dev(); |
2980 | if (it->index >= it->max) | 2982 | if (it->index >= it->max) |
2981 | goto err1; | 2983 | return NULL; |
2982 | return it; | 2984 | return it; |
2983 | err1: | ||
2984 | kfree(it); | ||
2985 | return NULL; | ||
2986 | } | 2985 | } |
2987 | 2986 | ||
2988 | static void * dev_seq_next(struct seq_file *s, void *v, loff_t *pos) | 2987 | static void * dev_seq_next(struct seq_file *s, void *v, loff_t *pos) |
2989 | { | 2988 | { |
2990 | struct sg_proc_deviter * it = (struct sg_proc_deviter *) v; | 2989 | struct sg_proc_deviter * it = s->private; |
2991 | 2990 | ||
2992 | *pos = ++it->index; | 2991 | *pos = ++it->index; |
2993 | return (it->index < it->max) ? it : NULL; | 2992 | return (it->index < it->max) ? it : NULL; |
@@ -2995,7 +2994,7 @@ static void * dev_seq_next(struct seq_file *s, void *v, loff_t *pos) | |||
2995 | 2994 | ||
2996 | static void dev_seq_stop(struct seq_file *s, void *v) | 2995 | static void dev_seq_stop(struct seq_file *s, void *v) |
2997 | { | 2996 | { |
2998 | kfree (v); | 2997 | kfree(s->private); |
2999 | } | 2998 | } |
3000 | 2999 | ||
3001 | static int sg_proc_open_dev(struct inode *inode, struct file *file) | 3000 | static int sg_proc_open_dev(struct inode *inode, struct file *file) |