public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Andrew Morton <akpm@linux-foundation.org>,
	Stephen Rothwell <sfr@canb.auug.org.au>,
	linux-ide@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: [git pull] IDE fixes for 2.6.28-rc7
Date: Tue, 2 Dec 2008 21:02:14 +0100	[thread overview]
Message-ID: <200812022102.14690.bzolnier@gmail.com> (raw)


* amd74xx host driver fix for nVidia controllers (this should take  care of most bugreports about ATAPI devices not working properly) 
  [ libata developers are encouraged to copy the fix to pata_amd    (the issue manifests itself with pata_amd reporting diagnostics    failure on good devices) ]
* quirk for SAMSUNG SP0822N with firmware WA100-10 to allow UDMA > 33
* fix ide_release_lock imbalance for Atari (from Michael Schmitz)
+ few misc fixes

Linus, please pull from:
master.kernel.org:/pub/scm/linux/kernel/git/bart/ide-2.6.git/
to receive the following updates:
 drivers/ide/alim15x3.c  |    2 +- drivers/ide/amd74xx.c   |   11 ++++++++++- drivers/ide/ide-io.c    |   30 ++++++++++++++---------------- drivers/ide/ide-iops.c  |    9 +++------ drivers/ide/ide-probe.c |    3 ++- include/linux/ide.h     |    8 ++++++++ 6 files changed, 38 insertions(+), 25 deletions(-)

Bartlomiej Zolnierkiewicz (5):      amd74xx: workaround unreliable AltStatus register for nVidia controllers      ide: add SAMSUNG SP0822N with firmware WA100-10 to ivb_list[]      ide: respect current DMA setting during resume      ide: fix build for DEBUG_PM      ide: remove dead code from drive_is_ready()
Hannes Eder (1):      alim15x3: fix sparse warning
Michael Schmitz (1):      ide: fix the ide_release_lock imbalance

diff --git a/drivers/ide/alim15x3.c b/drivers/ide/alim15x3.cindex e56c7b7..45d2356 100644--- a/drivers/ide/alim15x3.c+++ b/drivers/ide/alim15x3.c@@ -591,7 +591,7 @@ static int __init ali15x3_ide_init(void)  static void __exit ali15x3_ide_exit(void) {-	return pci_unregister_driver(&alim15x3_pci_driver);+	pci_unregister_driver(&alim15x3_pci_driver); }  module_init(ali15x3_ide_init);diff --git a/drivers/ide/amd74xx.c b/drivers/ide/amd74xx.cindex 81ec731..c6bcd30 100644--- a/drivers/ide/amd74xx.c+++ b/drivers/ide/amd74xx.c@@ -3,7 +3,7 @@  * IDE driver for Linux.  *  * Copyright (c) 2000-2002 Vojtech Pavlik- * Copyright (c) 2007 Bartlomiej Zolnierkiewicz+ * Copyright (c) 2007-2008 Bartlomiej Zolnierkiewicz  *  * Based on the work of:  *      Andre Hedrick@@ -263,6 +263,15 @@ static int __devinit amd74xx_probe(struct pci_dev *dev, const struct pci_device_ 			d.udma_mask = ATA_UDMA5; 	} +	/*+	 * It seems that on some nVidia controllers using AltStatus+	 * register can be unreliable so default to Status register+	 * if the device is in Compatibility Mode.+	 */+	if (dev->vendor == PCI_VENDOR_ID_NVIDIA &&+	    ide_pci_is_in_compatibility_mode(dev))+		d.host_flags |= IDE_HFLAG_BROKEN_ALTSTATUS;+ 	printk(KERN_INFO "%s %s: UDMA%s controller\n", 		d.name, pci_name(dev), amd_dma[fls(d.udma_mask) - 1]); diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.cindex 7162d67..7d275b2 100644--- a/drivers/ide/ide-io.c+++ b/drivers/ide/ide-io.c@@ -132,10 +132,14 @@ int ide_end_request (ide_drive_t *drive, int uptodate, int nr_sectors) } EXPORT_SYMBOL(ide_end_request); -static void ide_complete_power_step(ide_drive_t *drive, struct request *rq, u8 stat, u8 error)+static void ide_complete_power_step(ide_drive_t *drive, struct request *rq) { 	struct request_pm_state *pm = rq->data; +#ifdef DEBUG_PM+	printk(KERN_INFO "%s: complete_power_step(step: %d)\n",+		drive->name, pm->pm_step);+#endif 	if (drive->media != ide_disk) 		return; @@ -172,7 +176,7 @@ static ide_startstop_t ide_start_power_step(ide_drive_t *drive, struct request * 		/* Not supported? Switch to next step now. */ 		if (ata_id_flush_enabled(drive->id) == 0 || 		    (drive->dev_flags & IDE_DFLAG_WCACHE) == 0) {-			ide_complete_power_step(drive, rq, 0, 0);+			ide_complete_power_step(drive, rq); 			return ide_stopped; 		} 		if (ata_id_flush_ext_enabled(drive->id))@@ -191,7 +195,7 @@ static ide_startstop_t ide_start_power_step(ide_drive_t *drive, struct request * 		if (drive->media != ide_disk) 			pm->pm_step = IDE_PM_RESTORE_DMA; 		else-			ide_complete_power_step(drive, rq, 0, 0);+			ide_complete_power_step(drive, rq); 		return ide_stopped; 	case IDE_PM_IDLE:		/* Resume step 2 (idle) */ 		args->tf.command = ATA_CMD_IDLEIMMEDIATE;@@ -204,10 +208,8 @@ static ide_startstop_t ide_start_power_step(ide_drive_t *drive, struct request * 		 */ 		if (drive->hwif->dma_ops == NULL) 			break;-		/*-		 * TODO: respect IDE_DFLAG_USING_DMA-		 */-		ide_set_dma(drive);+		if (drive->dev_flags & IDE_DFLAG_USING_DMA)+			ide_set_dma(drive); 		break; 	} @@ -322,11 +324,8 @@ void ide_end_drive_cmd (ide_drive_t *drive, u8 stat, u8 err) 		} 	} else if (blk_pm_request(rq)) { 		struct request_pm_state *pm = rq->data;-#ifdef DEBUG_PM-		printk("%s: complete_power_step(step: %d, stat: %x, err: %x)\n",-			drive->name, rq->pm->pm_step, stat, err);-#endif-		ide_complete_power_step(drive, rq, stat, err);++		ide_complete_power_step(drive, rq); 		if (pm->pm_step == IDE_PM_COMPLETED) 			ide_complete_pm_request(drive, rq); 		return;@@ -804,7 +803,7 @@ static ide_startstop_t start_request (ide_drive_t *drive, struct request *rq) 			struct request_pm_state *pm = rq->data; #ifdef DEBUG_PM 			printk("%s: start_power_step(step: %d)\n",-				drive->name, rq->pm->pm_step);+				drive->name, pm->pm_step); #endif 			startstop = ide_start_power_step(drive, rq); 			if (startstop == ide_stopped &&@@ -967,14 +966,13 @@ static void ide_do_request (ide_hwgroup_t *hwgroup, int masked_irq) 	ide_startstop_t	startstop; 	int             loops = 0; -	/* for atari only: POSSIBLY BROKEN HERE(?) */-	ide_get_lock(ide_intr, hwgroup);- 	/* caller must own ide_lock */ 	BUG_ON(!irqs_disabled());  	while (!hwgroup->busy) { 		hwgroup->busy = 1;+		/* for atari only */+		ide_get_lock(ide_intr, hwgroup); 		drive = choose_drive(hwgroup); 		if (drive == NULL) { 			int sleeping = 0;diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.cindex 5d6ba14..c41c3b9 100644--- a/drivers/ide/ide-iops.c+++ b/drivers/ide/ide-iops.c@@ -457,18 +457,14 @@ int drive_is_ready (ide_drive_t *drive) 	if (drive->waiting_for_dma) 		return hwif->dma_ops->dma_test_irq(drive); -#if 0-	/* need to guarantee 400ns since last command was issued */-	udelay(1);-#endif- 	/* 	 * We do a passive status test under shared PCI interrupts on 	 * cards that truly share the ATA side interrupt, but may also share 	 * an interrupt with another pci card/device.  We make no assumptions 	 * about possible isa-pnp and pci-pnp issues yet. 	 */-	if (hwif->io_ports.ctl_addr)+	if (hwif->io_ports.ctl_addr &&+	    (hwif->host_flags & IDE_HFLAG_BROKEN_ALTSTATUS) == 0) 		stat = hwif->tp_ops->read_altstatus(hwif); 	else 		/* Note: this may clear a pending IRQ!! */@@ -610,6 +606,7 @@ static const struct drive_list_entry ivb_list[] = { 	{ "TSSTcorp CDDVDW SH-S202N"	, "SB01"	}, 	{ "TSSTcorp CDDVDW SH-S202H"	, "SB00"	}, 	{ "TSSTcorp CDDVDW SH-S202H"	, "SB01"	},+	{ "SAMSUNG SP0822N"		, "WA100-10"	}, 	{ NULL				, NULL		} }; diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.cindex 1649ea5..c55bdbd 100644--- a/drivers/ide/ide-probe.c+++ b/drivers/ide/ide-probe.c@@ -266,7 +266,8 @@ static int actual_try_to_identify (ide_drive_t *drive, u8 cmd) 	/* take a deep breath */ 	msleep(50); -	if (io_ports->ctl_addr) {+	if (io_ports->ctl_addr &&+	    (hwif->host_flags & IDE_HFLAG_BROKEN_ALTSTATUS) == 0) { 		a = tp_ops->read_altstatus(hwif); 		s = tp_ops->read_status(hwif); 		if ((a ^ s) & ~ATA_IDX)diff --git a/include/linux/ide.h b/include/linux/ide.hindex 54525be..010fb26 100644--- a/include/linux/ide.h+++ b/include/linux/ide.h@@ -1296,6 +1296,13 @@ extern int __ide_pci_register_driver(struct pci_driver *driver, struct module *o #define ide_pci_register_driver(d) pci_register_driver(d) #endif +static inline int ide_pci_is_in_compatibility_mode(struct pci_dev *dev)+{+	if ((dev->class >> 8) == PCI_CLASS_STORAGE_IDE && (dev->class & 5) != 5)+		return 1;+	return 0;+}+ void ide_pci_setup_ports(struct pci_dev *, const struct ide_port_info *, int, 			 hw_regs_t *, hw_regs_t **); void ide_setup_pci_noise(struct pci_dev *, const struct ide_port_info *);@@ -1375,6 +1382,7 @@ enum { 	IDE_HFLAG_IO_32BIT		= (1 << 24), 	/* unmask IRQs */ 	IDE_HFLAG_UNMASK_IRQS		= (1 << 25),+	IDE_HFLAG_BROKEN_ALTSTATUS	= (1 << 26), 	/* serialize ports if DMA is possible (for sl82c105) */ 	IDE_HFLAG_SERIALIZE_DMA		= (1 << 27), 	/* force host out of "simplex" mode */\0ÿôèº{.nÇ+‰·Ÿ®‰­†+%ŠËÿ±éݶ\x17¥Šwÿº{.nÇ+‰·¥Š{±þG«éÿŠ{ayº\x1dʇڙë,j\a­¢f£¢·hšïêÿ‘êçz_è®\x03(­éšŽŠÝ¢j"ú\x1a¶^[m§ÿÿ¾\a«þG«éÿ¢¸?™¨è­Ú&£ø§~á¶iO•æ¬z·švØ^\x14\x04\x1a¶^[m§ÿÿÃ\fÿ¶ìÿ¢¸?–I¥

                 reply	other threads:[~2008-12-02 20:06 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=200812022102.14690.bzolnier@gmail.com \
    --to=bzolnier@gmail.com \
    --cc=akpm@linux-foundation.org \
    --cc=linux-ide@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=sfr@canb.auug.org.au \
    --cc=torvalds@linux-foundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox