* [PATCH #upstream-fixes 1/3] pata_hpt366: fix clock detection
@ 2008-12-08 9:48 Tejun Heo
2008-12-08 9:52 ` [PATCH #upstream-fixes 2/3] pata_hpt366: fix cable detection Tejun Heo
2008-12-09 5:49 ` [PATCH #upstream-fixes 1/3] pata_hpt366: fix clock detection Jeff Garzik
0 siblings, 2 replies; 9+ messages in thread
From: Tejun Heo @ 2008-12-08 9:48 UTC (permalink / raw)
To: Jeff Garzik, IDE/ATA development list, Alan Cox, Mark Lord,
rob.opensuse.linux
pata_hpt366 had its clock detection wrong and detected 25Mhz as 40Mhz
and vice-versa. Fix it.
Signed-off-by: Tejun Heo <tj@kernel.org>
---
drivers/ata/pata_hpt366.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
Index: work/drivers/ata/pata_hpt366.c
===================================================================
--- work.orig/drivers/ata/pata_hpt366.c
+++ work/drivers/ata/pata_hpt366.c
@@ -382,10 +382,10 @@ static int hpt36x_init_one(struct pci_de
/* PCI clocking determines the ATA timing values to use */
/* info_hpt366 is safe against re-entry so we can scribble on it */
switch((reg1 & 0x700) >> 8) {
- case 5:
+ case 9:
hpriv = &hpt366_40;
break;
- case 9:
+ case 5:
hpriv = &hpt366_25;
break;
default:
^ permalink raw reply [flat|nested] 9+ messages in thread* [PATCH #upstream-fixes 2/3] pata_hpt366: fix cable detection 2008-12-08 9:48 [PATCH #upstream-fixes 1/3] pata_hpt366: fix clock detection Tejun Heo @ 2008-12-08 9:52 ` Tejun Heo 2008-12-08 10:01 ` [PATCH #upstream-fixes 3/3] pata_hpt366: update mode programming Tejun Heo 2008-12-08 11:23 ` [PATCH #upstream-fixes 2/3] pata_hpt366: fix cable detection Sergei Shtylyov 2008-12-09 5:49 ` [PATCH #upstream-fixes 1/3] pata_hpt366: fix clock detection Jeff Garzik 1 sibling, 2 replies; 9+ messages in thread From: Tejun Heo @ 2008-12-08 9:52 UTC (permalink / raw) To: Jeff Garzik, IDE/ATA development list, Alan Cox, Mark Lord, rob.opensuse.linux hpt366 is strange in that its cable detection register uses the higher bit for master, so the testing should be 2 >> port_no instead of 1 << port_no. Fix it. Info provided by Alan Cox. Signed-off-by: Tejun Heo <tj@kernel.org> Cc: Alan Cox <alan@lxorguk.ukuu.org.uk> --- drivers/ata/pata_hpt366.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) Index: work/drivers/ata/pata_hpt366.c =================================================================== --- work.orig/drivers/ata/pata_hpt366.c +++ work/drivers/ata/pata_hpt366.c @@ -215,7 +215,7 @@ static int hpt36x_cable_detect(struct at struct pci_dev *pdev = to_pci_dev(ap->host->dev); pci_read_config_byte(pdev, 0x5A, &ata66); - if (ata66 & (1 << ap->port_no)) + if (ata66 & (2 >> ap->port_no)) return ATA_CBL_PATA40; return ATA_CBL_PATA80; } ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH #upstream-fixes 3/3] pata_hpt366: update mode programming 2008-12-08 9:52 ` [PATCH #upstream-fixes 2/3] pata_hpt366: fix cable detection Tejun Heo @ 2008-12-08 10:01 ` Tejun Heo 2008-12-08 11:23 ` [PATCH #upstream-fixes 2/3] pata_hpt366: fix cable detection Sergei Shtylyov 1 sibling, 0 replies; 9+ messages in thread From: Tejun Heo @ 2008-12-08 10:01 UTC (permalink / raw) To: Jeff Garzik, IDE/ATA development list, Alan Cox, Mark Lord, rob.opensuse.linux Update mode programming logic of pata_hpt366 such that it's identical to that of IDE hpt366 driver. The differences were... * pata_hpt366 used 0xCFFF8FFFF to mask pio modes and 0x3FFFFFFF dma modes. IDE hpt366 uses 0xC1F8FFFF for PIO, 0x303800FF for MWDMA and 0x30070000 for UDMA. * pata_hpt366 doesn't set 0x08000000 for PIO unless it's already set and always turns it on for MWDMA/UDMA. IDE hpt366 doesn't bother with the bit. It always uses what was there. * IDE hpt366 always clears 0xC0000000. pata_hpt366 doesn't. Signed-off-by: Tejun Heo <tj@kernel.org> Cc: Alan Cox <alan@lxorguk.ukuu.org.uk> --- Alan, can you please ack this if you think it's okay. Jeff, please don't commit till Alan acks. Thanks. drivers/ata/pata_hpt366.c | 50 ++++++++++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 21 deletions(-) Index: work/drivers/ata/pata_hpt366.c =================================================================== --- work.orig/drivers/ata/pata_hpt366.c +++ work/drivers/ata/pata_hpt366.c @@ -188,25 +188,41 @@ static unsigned long hpt366_filter(struc } /** - * hpt36x_find_mode - reset the hpt36x bus + * hpt36x_calc_timing - calculate timing value for transfer mode * @ap: ATA port - * @speed: transfer mode + * @cur_timing: current timing value + * @speed: target transfer mode * * Return the 32bit register programming information for this channel * that matches the speed provided. */ -static u32 hpt36x_find_mode(struct ata_port *ap, int speed) +static u32 hpt36x_calc_timing(struct ata_port *ap, u32 cur_timing, int speed) { struct hpt_clock *clocks = ap->host->private_data; + u32 mask; - while(clocks->xfer_speed) { + if (speed < XFER_MW_DMA_0) + mask = 0xc1f8ffff; + else if (speed < XFER_UDMA_0) + mask = 0x303800ff; + else + mask = 0x30070000; + + while (clocks->xfer_speed) { if (clocks->xfer_speed == speed) - return clocks->timing; + break; clocks++; } - BUG(); - return 0xffffffffU; /* silence compiler warning */ + if (!clocks->xfer_speed) + BUG(); + + /* + * Combine new mode bits with old config bits and disable + * on-chip PIO FIFO/buffer (and PIO MST mode as well) to avoid + * problems handling I/O errors later. + */ + return ((cur_timing & ~mask) | (clocks->timing & mask)) & ~0xc0000000; } static int hpt36x_cable_detect(struct ata_port *ap) @@ -232,8 +248,7 @@ static void hpt366_set_piomode(struct at { struct pci_dev *pdev = to_pci_dev(ap->host->dev); u32 addr1, addr2; - u32 reg; - u32 mode; + u32 reg, timing; u8 fast; addr1 = 0x40 + 4 * (adev->devno + 2 * ap->port_no); @@ -247,11 +262,8 @@ static void hpt366_set_piomode(struct at } pci_read_config_dword(pdev, addr1, ®); - mode = hpt36x_find_mode(ap, adev->pio_mode); - mode &= ~0x8000000; /* No FIFO in PIO */ - mode &= ~0x30070000; /* Leave config bits alone */ - reg &= 0x30070000; /* Strip timing bits */ - pci_write_config_dword(pdev, addr1, reg | mode); + timing = hpt36x_calc_timing(ap, reg, adev->pio_mode); + pci_write_config_dword(pdev, addr1, timing); } /** @@ -267,8 +279,7 @@ static void hpt366_set_dmamode(struct at { struct pci_dev *pdev = to_pci_dev(ap->host->dev); u32 addr1, addr2; - u32 reg; - u32 mode; + u32 reg, timing; u8 fast; addr1 = 0x40 + 4 * (adev->devno + 2 * ap->port_no); @@ -282,11 +293,8 @@ static void hpt366_set_dmamode(struct at } pci_read_config_dword(pdev, addr1, ®); - mode = hpt36x_find_mode(ap, adev->dma_mode); - mode |= 0x8000000; /* FIFO in MWDMA or UDMA */ - mode &= ~0xC0000000; /* Leave config bits alone */ - reg &= 0xC0000000; /* Strip timing bits */ - pci_write_config_dword(pdev, addr1, reg | mode); + timing = hpt36x_calc_timing(ap, reg, adev->dma_mode); + pci_write_config_dword(pdev, addr1, timing); } static struct scsi_host_template hpt36x_sht = { ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH #upstream-fixes 2/3] pata_hpt366: fix cable detection 2008-12-08 9:52 ` [PATCH #upstream-fixes 2/3] pata_hpt366: fix cable detection Tejun Heo 2008-12-08 10:01 ` [PATCH #upstream-fixes 3/3] pata_hpt366: update mode programming Tejun Heo @ 2008-12-08 11:23 ` Sergei Shtylyov 2008-12-08 11:44 ` Alan Cox 2008-12-08 14:04 ` Sergei Shtylyov 1 sibling, 2 replies; 9+ messages in thread From: Sergei Shtylyov @ 2008-12-08 11:23 UTC (permalink / raw) To: Tejun Heo Cc: Jeff Garzik, IDE/ATA development list, Alan Cox, Mark Lord, rob.opensuse.linux Hello. Tejun Heo wrote: > hpt366 is strange in that its cable detection register uses the higher > bit for master, so the testing should be 2 >> port_no instead of 1 << > For primary -- the cable bits are per-channel, not per-device. > port_no. Fix it. > > Info provided by Alan Cox. > > Signed-off-by: Tejun Heo <tj@kernel.org> > Acked-by: Sergei Shtylyov <sshtylyov@ru.mvista.com> > Index: work/drivers/ata/pata_hpt366.c > =================================================================== > --- work.orig/drivers/ata/pata_hpt366.c > +++ work/drivers/ata/pata_hpt366.c > @@ -215,7 +215,7 @@ static int hpt36x_cable_detect(struct at > struct pci_dev *pdev = to_pci_dev(ap->host->dev); > > pci_read_config_byte(pdev, 0x5A, &ata66); > - if (ata66 & (1 << ap->port_no)) > + if (ata66 & (2 >> ap->port_no)) > HPT36x are single channel per function, so the shift can be removed. MBR, Sergei ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH #upstream-fixes 2/3] pata_hpt366: fix cable detection 2008-12-08 11:23 ` [PATCH #upstream-fixes 2/3] pata_hpt366: fix cable detection Sergei Shtylyov @ 2008-12-08 11:44 ` Alan Cox 2008-12-08 13:59 ` Sergei Shtylyov 2008-12-08 14:04 ` Sergei Shtylyov 1 sibling, 1 reply; 9+ messages in thread From: Alan Cox @ 2008-12-08 11:44 UTC (permalink / raw) To: Sergei Shtylyov Cc: Tejun Heo, Jeff Garzik, IDE/ATA development list, Mark Lord, rob.opensuse.linux > > pci_read_config_byte(pdev, 0x5A, &ata66); > > - if (ata66 & (1 << ap->port_no)) > > + if (ata66 & (2 >> ap->port_no)) > > > > HPT36x are single channel per function, so the shift can be removed. In the case of two channels are you sure the bits appear as bit 2 in both cases ? Alan ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH #upstream-fixes 2/3] pata_hpt366: fix cable detection 2008-12-08 11:44 ` Alan Cox @ 2008-12-08 13:59 ` Sergei Shtylyov 0 siblings, 0 replies; 9+ messages in thread From: Sergei Shtylyov @ 2008-12-08 13:59 UTC (permalink / raw) To: Alan Cox Cc: Tejun Heo, Jeff Garzik, IDE/ATA development list, Mark Lord, rob.opensuse.linux Hello. Alan Cox wrote: >>> pci_read_config_byte(pdev, 0x5A, &ata66); >>>- if (ata66 & (1 << ap->port_no)) >>>+ if (ata66 & (2 >> ap->port_no)) >> HPT36x are single channel per function, so the shift can be removed. > In the case of two channels are you sure the bits appear as bit 2 in both > cases ? Oops, they don't. The cable select register (0x5a) seems to be shared by both functions (with function 0 representing "primary" and the function 1 "secondary" channel). But in this case, the logic remains broken -- I don't think that function #1 has its ap->port_no set to 1. The IDE driver appears broken as well then. Damn Highpoint for their brain damaged design... > Alan MBR, Sergei ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH #upstream-fixes 2/3] pata_hpt366: fix cable detection 2008-12-08 11:23 ` [PATCH #upstream-fixes 2/3] pata_hpt366: fix cable detection Sergei Shtylyov 2008-12-08 11:44 ` Alan Cox @ 2008-12-08 14:04 ` Sergei Shtylyov 2008-12-09 1:17 ` Tejun Heo 1 sibling, 1 reply; 9+ messages in thread From: Sergei Shtylyov @ 2008-12-08 14:04 UTC (permalink / raw) To: Sergei Shtylyov Cc: Tejun Heo, Jeff Garzik, IDE/ATA development list, Alan Cox, Mark Lord, rob.opensuse.linux Hello, I wrote: >> hpt366 is strange in that its cable detection register uses the higher >> bit for master, so the testing should be 2 >> port_no instead of 1 << > For primary -- the cable bits are per-channel, not per-device. >> port_no. Fix it. >> Info provided by Alan Cox. >> Signed-off-by: Tejun Heo <tj@kernel.org> > Acked-by: Sergei Shtylyov <sshtylyov@ru.mvista.com> I have to NAK this. HPT366 design is just too brain damaged for both IDE and libata drivers to get it right so far. >> Index: work/drivers/ata/pata_hpt366.c >> =================================================================== >> --- work.orig/drivers/ata/pata_hpt366.c >> +++ work/drivers/ata/pata_hpt366.c >> @@ -215,7 +215,7 @@ static int hpt36x_cable_detect(struct at >> struct pci_dev *pdev = to_pci_dev(ap->host->dev); >> >> pci_read_config_byte(pdev, 0x5A, &ata66); >> - if (ata66 & (1 << ap->port_no)) >> + if (ata66 & (2 >> ap->port_no)) >> > HPT36x are single channel per function, so the shift can be removed. It should be replaced by more sophisticated logic for function 1 in fact... MBR, Sergei ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH #upstream-fixes 2/3] pata_hpt366: fix cable detection 2008-12-08 14:04 ` Sergei Shtylyov @ 2008-12-09 1:17 ` Tejun Heo 0 siblings, 0 replies; 9+ messages in thread From: Tejun Heo @ 2008-12-09 1:17 UTC (permalink / raw) To: Sergei Shtylyov Cc: Jeff Garzik, IDE/ATA development list, Alan Cox, Mark Lord, rob.opensuse.linux Sergei Shtylyov wrote: > Hello, I wrote: > >>> hpt366 is strange in that its cable detection register uses the higher >>> bit for master, so the testing should be 2 >> port_no instead of 1 << > >> For primary -- the cable bits are per-channel, not per-device. > >>> port_no. Fix it. > >>> Info provided by Alan Cox. > >>> Signed-off-by: Tejun Heo <tj@kernel.org> > >> Acked-by: Sergei Shtylyov <sshtylyov@ru.mvista.com> > > I have to NAK this. HPT366 design is just too brain damaged for both > IDE and libata drivers to get it right so far. > >>> Index: work/drivers/ata/pata_hpt366.c >>> =================================================================== >>> --- work.orig/drivers/ata/pata_hpt366.c >>> +++ work/drivers/ata/pata_hpt366.c >>> @@ -215,7 +215,7 @@ static int hpt36x_cable_detect(struct at >>> struct pci_dev *pdev = to_pci_dev(ap->host->dev); >>> >>> pci_read_config_byte(pdev, 0x5A, &ata66); >>> - if (ata66 & (1 << ap->port_no)) >>> + if (ata66 & (2 >> ap->port_no)) >>> > >> HPT36x are single channel per function, so the shift can be removed. > > It should be replaced by more sophisticated logic for function 1 in > fact... Ah... crap. I don't know anything about this controller. Care to post the correct patch? I'll be happy to test. Thanks. -- tejun ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH #upstream-fixes 1/3] pata_hpt366: fix clock detection 2008-12-08 9:48 [PATCH #upstream-fixes 1/3] pata_hpt366: fix clock detection Tejun Heo 2008-12-08 9:52 ` [PATCH #upstream-fixes 2/3] pata_hpt366: fix cable detection Tejun Heo @ 2008-12-09 5:49 ` Jeff Garzik 1 sibling, 0 replies; 9+ messages in thread From: Jeff Garzik @ 2008-12-09 5:49 UTC (permalink / raw) To: Tejun Heo Cc: IDE/ATA development list, Alan Cox, Mark Lord, rob.opensuse.linux Tejun Heo wrote: > pata_hpt366 had its clock detection wrong and detected 25Mhz as 40Mhz > and vice-versa. Fix it. > > Signed-off-by: Tejun Heo <tj@kernel.org> > --- > drivers/ata/pata_hpt366.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > Index: work/drivers/ata/pata_hpt366.c > =================================================================== > --- work.orig/drivers/ata/pata_hpt366.c > +++ work/drivers/ata/pata_hpt366.c > @@ -382,10 +382,10 @@ static int hpt36x_init_one(struct pci_de > /* PCI clocking determines the ATA timing values to use */ > /* info_hpt366 is safe against re-entry so we can scribble on it */ > switch((reg1 & 0x700) >> 8) { > - case 5: > + case 9: > hpriv = &hpt366_40; > break; > - case 9: > + case 5: > hpriv = &hpt366_25; applied #upstream-fixes Avoiding patch #2 in this series b/c the thread seemed to indicate it needed more work Avoiding patch #3 in this series awaiting Alan's ack (did I miss it?) ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2008-12-09 5:50 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2008-12-08 9:48 [PATCH #upstream-fixes 1/3] pata_hpt366: fix clock detection Tejun Heo 2008-12-08 9:52 ` [PATCH #upstream-fixes 2/3] pata_hpt366: fix cable detection Tejun Heo 2008-12-08 10:01 ` [PATCH #upstream-fixes 3/3] pata_hpt366: update mode programming Tejun Heo 2008-12-08 11:23 ` [PATCH #upstream-fixes 2/3] pata_hpt366: fix cable detection Sergei Shtylyov 2008-12-08 11:44 ` Alan Cox 2008-12-08 13:59 ` Sergei Shtylyov 2008-12-08 14:04 ` Sergei Shtylyov 2008-12-09 1:17 ` Tejun Heo 2008-12-09 5:49 ` [PATCH #upstream-fixes 1/3] pata_hpt366: fix clock detection 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).