* [PATCH 2.6.31] sata_promise: disable hotplug on 1st gen chips
@ 2009-09-15 13:07 Mikael Pettersson
2009-09-17 20:51 ` Jeff Garzik
0 siblings, 1 reply; 2+ messages in thread
From: Mikael Pettersson @ 2009-09-15 13:07 UTC (permalink / raw)
To: Jeff Garzik; +Cc: Kurt Roeckx, linux-ide
1st generation Promise SATA chips are prone to generating spurious
hotplug events which can disrupt normal operation. This has been
observed on 20376 and 20378 chips. This patch thus disables hotplug
support on 1st gen chips while leaving it enabled for 2nd gen chips.
The pdc_sata_hotplug_offset() function becomes redundant so it is
removed.
Tested on 1st gen 20376 and 20378 mainboard chips and on a 2nd gen
SATA300 PCI card.
Signed-off-by: Mikael Pettersson <mikpe@it.uu.se>
Tested-by: Kurt Roeckx <kurt@roeckx.be>
---
Kurt: you tested this so I added your Tested-by, I hope that's Ok?
Jeff: this is a safe patch that I think should go to -stable soonish
drivers/ata/sata_promise.c | 34 +++++++++++++++++-----------------
1 file changed, 17 insertions(+), 17 deletions(-)
diff -rupN linux-2.6.31/drivers/ata/sata_promise.c linux-2.6.31.sata_promise-disable-gen1-hotplug/drivers/ata/sata_promise.c
--- linux-2.6.31/drivers/ata/sata_promise.c 2009-06-10 12:00:44.000000000 +0200
+++ linux-2.6.31.sata_promise-disable-gen1-hotplug/drivers/ata/sata_promise.c 2009-09-10 14:07:17.000000000 +0200
@@ -195,9 +195,12 @@ static struct ata_port_operations pdc_sa
.hardreset = pdc_sata_hardreset,
};
-/* First-generation chips need a more restrictive ->check_atapi_dma op */
+/* First-generation chips need a more restrictive ->check_atapi_dma op,
+ and ->freeze/thaw that ignore the hotplug controls. */
static struct ata_port_operations pdc_old_sata_ops = {
.inherits = &pdc_sata_ops,
+ .freeze = pdc_freeze,
+ .thaw = pdc_thaw,
.check_atapi_dma = pdc_old_sata_check_atapi_dma,
};
@@ -626,11 +629,6 @@ static unsigned int pdc_sata_ata_port_to
return pdc_port_no_to_ata_no(i, pdc_is_sataii_tx4(ap->flags));
}
-static unsigned int pdc_sata_hotplug_offset(const struct ata_port *ap)
-{
- return (ap->flags & PDC_FLAG_GEN_II) ? PDC2_SATA_PLUG_CSR : PDC_SATA_PLUG_CSR;
-}
-
static void pdc_freeze(struct ata_port *ap)
{
void __iomem *ata_mmio = ap->ioaddr.cmd_addr;
@@ -647,7 +645,7 @@ static void pdc_sata_freeze(struct ata_p
{
struct ata_host *host = ap->host;
void __iomem *host_mmio = host->iomap[PDC_MMIO_BAR];
- unsigned int hotplug_offset = pdc_sata_hotplug_offset(ap);
+ unsigned int hotplug_offset = PDC2_SATA_PLUG_CSR;
unsigned int ata_no = pdc_sata_ata_port_to_ata_no(ap);
u32 hotplug_status;
@@ -685,7 +683,7 @@ static void pdc_sata_thaw(struct ata_por
{
struct ata_host *host = ap->host;
void __iomem *host_mmio = host->iomap[PDC_MMIO_BAR];
- unsigned int hotplug_offset = pdc_sata_hotplug_offset(ap);
+ unsigned int hotplug_offset = PDC2_SATA_PLUG_CSR;
unsigned int ata_no = pdc_sata_ata_port_to_ata_no(ap);
u32 hotplug_status;
@@ -832,14 +830,14 @@ static irqreturn_t pdc_interrupt(int irq
spin_lock(&host->lock);
/* read and clear hotplug flags for all ports */
- if (host->ports[0]->flags & PDC_FLAG_GEN_II)
+ if (host->ports[0]->flags & PDC_FLAG_GEN_II) {
hotplug_offset = PDC2_SATA_PLUG_CSR;
- else
- hotplug_offset = PDC_SATA_PLUG_CSR;
- hotplug_status = readl(host_mmio + hotplug_offset);
- if (hotplug_status & 0xff)
- writel(hotplug_status | 0xff, host_mmio + hotplug_offset);
- hotplug_status &= 0xff; /* clear uninteresting bits */
+ hotplug_status = readl(host_mmio + hotplug_offset);
+ if (hotplug_status & 0xff)
+ writel(hotplug_status | 0xff, host_mmio + hotplug_offset);
+ hotplug_status &= 0xff; /* clear uninteresting bits */
+ } else
+ hotplug_status = 0;
/* reading should also clear interrupts */
mask = readl(host_mmio + PDC_INT_SEQMASK);
@@ -1034,9 +1032,11 @@ static void pdc_host_init(struct ata_hos
tmp = readl(host_mmio + hotplug_offset);
writel(tmp | 0xff, host_mmio + hotplug_offset);
- /* unmask plug/unplug ints */
tmp = readl(host_mmio + hotplug_offset);
- writel(tmp & ~0xff0000, host_mmio + hotplug_offset);
+ if (is_gen2) /* unmask plug/unplug ints */
+ writel(tmp & ~0xff0000, host_mmio + hotplug_offset);
+ else /* mask plug/unplug ints */
+ writel(tmp | 0xff0000, host_mmio + hotplug_offset);
/* don't initialise TBG or SLEW on 2nd generation chips */
if (is_gen2)
^ permalink raw reply [flat|nested] 2+ messages in thread* Re: [PATCH 2.6.31] sata_promise: disable hotplug on 1st gen chips
2009-09-15 13:07 [PATCH 2.6.31] sata_promise: disable hotplug on 1st gen chips Mikael Pettersson
@ 2009-09-17 20:51 ` Jeff Garzik
0 siblings, 0 replies; 2+ messages in thread
From: Jeff Garzik @ 2009-09-17 20:51 UTC (permalink / raw)
To: Mikael Pettersson; +Cc: Kurt Roeckx, linux-ide
On 09/15/2009 09:07 AM, Mikael Pettersson wrote:
> 1st generation Promise SATA chips are prone to generating spurious
> hotplug events which can disrupt normal operation. This has been
> observed on 20376 and 20378 chips. This patch thus disables hotplug
> support on 1st gen chips while leaving it enabled for 2nd gen chips.
>
> The pdc_sata_hotplug_offset() function becomes redundant so it is
> removed.
>
> Tested on 1st gen 20376 and 20378 mainboard chips and on a 2nd gen
> SATA300 PCI card.
>
> Signed-off-by: Mikael Pettersson<mikpe@it.uu.se>
> Tested-by: Kurt Roeckx<kurt@roeckx.be>
> ---
> Kurt: you tested this so I added your Tested-by, I hope that's Ok?
> Jeff: this is a safe patch that I think should go to -stable soonish
>
> drivers/ata/sata_promise.c | 34 +++++++++++++++++-----------------
> 1 file changed, 17 insertions(+), 17 deletions(-)
Applied, though I would rather see hotplug be made a runtime decision:
default off, but with an option to enable
Jeff
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2009-09-17 20:51 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-09-15 13:07 [PATCH 2.6.31] sata_promise: disable hotplug on 1st gen chips Mikael Pettersson
2009-09-17 20:51 ` Jeff Garzik
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).