From: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
To: linux-ide@vger.kernel.org
Cc: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>,
linux-kernel@vger.kernel.org
Subject: [PATCH 31/64] cmd64x: fix PIO and MWDMA timings calculations
Date: Mon, 18 Jan 2010 18:18:26 +0100 [thread overview]
Message-ID: <20100118171826.14623.15282.sendpatchset@localhost> (raw)
In-Reply-To: <20100118171349.14623.90030.sendpatchset@localhost>
From: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Subject: [PATCH] cmd64x: fix PIO and MWDMA timings calculations
Just use the standard ide_timing_compute() helper to calculate
PIO and MWDMA timings. This fixes some issues with the open-coded
version like allowing faster MWDMA timings than the ones required
by the current PIO mode or not accounting for the enhanced MWDMA
cycle time specified by the device.
Based on libata pata_cmd64x host driver.
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
---
drivers/ide/cmd64x.c | 88 ++++++++++++++++-----------------------------------
1 file changed, 29 insertions(+), 59 deletions(-)
Index: b/drivers/ide/cmd64x.c
===================================================================
--- a/drivers/ide/cmd64x.c
+++ b/drivers/ide/cmd64x.c
@@ -7,6 +7,7 @@
* Copyright (C) 1998 David S. Miller (davem@redhat.com)
*
* Copyright (C) 1999-2002 Andre Hedrick <andre@linux-ide.org>
+ * Copyright (C) 2007-2010 Bartlomiej Zolnierkiewicz
* Copyright (C) 2007,2009 MontaVista Software, Inc. <source@mvista.com>
*/
@@ -50,72 +51,45 @@
#define UDIDETCR1 0x7B
#define DTPR1 0x7C
-static u8 quantize_timing(int timing, int quant)
-{
- return (timing + quant - 1) / quant;
-}
-
-/*
- * This routine calculates active/recovery counts and then writes them into
- * the chipset registers.
- */
-static void program_cycle_times (ide_drive_t *drive, int cycle_time, int active_time)
+static void cmd64x_program_timings(ide_drive_t *drive, u8 mode)
{
+ ide_hwif_t *hwif = drive->hwif;
struct pci_dev *dev = to_pci_dev(drive->hwif->dev);
- int clock_time = 1000 / (ide_pci_clk ? ide_pci_clk : 33);
- u8 cycle_count, active_count, recovery_count, drwtim;
+ int bus_speed = ide_pci_clk ? ide_pci_clk : 33;
+ const unsigned long T = 1000000 / bus_speed;
static const u8 recovery_values[] =
{15, 15, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 0};
+ static const u8 setup_values[] = {0x40, 0x40, 0x40, 0x80, 0, 0xc0};
+ static const u8 arttim_regs[4] = {ARTTIM0, ARTTIM1, ARTTIM23, ARTTIM23};
static const u8 drwtim_regs[4] = {DRWTIM0, DRWTIM1, DRWTIM2, DRWTIM3};
+ struct ide_timing t;
+ u8 arttim = 0;
- cycle_count = quantize_timing( cycle_time, clock_time);
- active_count = quantize_timing(active_time, clock_time);
- recovery_count = cycle_count - active_count;
+ ide_timing_compute(drive, mode, &t, T, 0);
/*
* In case we've got too long recovery phase, try to lengthen
* the active phase
*/
- if (recovery_count > 16) {
- active_count += recovery_count - 16;
- recovery_count = 16;
+ if (t.recover > 16) {
+ t.active += t.recover - 16;
+ t.recover = 16;
}
- if (active_count > 16) /* shouldn't actually happen... */
- active_count = 16;
+ if (t.active > 16) /* shouldn't actually happen... */
+ t.active = 16;
/*
* Convert values to internal chipset representation
*/
- recovery_count = recovery_values[recovery_count];
- active_count &= 0x0f;
+ t.recover = recovery_values[t.recover];
+ t.active &= 0x0f;
/* Program the active/recovery counts into the DRWTIM register */
- drwtim = (active_count << 4) | recovery_count;
- (void) pci_write_config_byte(dev, drwtim_regs[drive->dn], drwtim);
-}
+ pci_write_config_byte(dev, drwtim_regs[drive->dn],
+ (t.active << 4) | t.recover);
-/*
- * This routine writes into the chipset registers
- * PIO setup/active/recovery timings.
- */
-static void cmd64x_tune_pio(ide_drive_t *drive, const u8 pio)
-{
- ide_hwif_t *hwif = drive->hwif;
- struct pci_dev *dev = to_pci_dev(hwif->dev);
- struct ide_timing *t = ide_timing_find_mode(XFER_PIO_0 + pio);
- unsigned long setup_count;
- unsigned int cycle_time;
- u8 arttim = 0;
-
- static const u8 setup_values[] = {0x40, 0x40, 0x40, 0x80, 0, 0xc0};
- static const u8 arttim_regs[4] = {ARTTIM0, ARTTIM1, ARTTIM23, ARTTIM23};
-
- cycle_time = ide_pio_cycle_time(drive, pio);
-
- program_cycle_times(drive, cycle_time, t->active);
-
- setup_count = quantize_timing(t->setup,
- 1000 / (ide_pci_clk ? ide_pci_clk : 33));
+ if (mode >= XFER_SW_DMA_0)
+ return;
/*
* The primary channel has individual address setup timing registers
@@ -126,15 +100,15 @@ static void cmd64x_tune_pio(ide_drive_t
if (hwif->channel) {
ide_drive_t *pair = ide_get_pair_dev(drive);
- ide_set_drivedata(drive, (void *)setup_count);
+ ide_set_drivedata(drive, (void *)(unsigned long)t.setup);
if (pair)
- setup_count = max_t(u8, setup_count,
+ t.setup = max_t(u8, t.setup,
(unsigned long)ide_get_drivedata(pair));
}
- if (setup_count > 5) /* shouldn't actually happen... */
- setup_count = 5;
+ if (t.setup > 5) /* shouldn't actually happen... */
+ t.setup = 5;
/*
* Program the address setup clocks into the ARTTIM registers.
@@ -144,7 +118,7 @@ static void cmd64x_tune_pio(ide_drive_t
if (hwif->channel)
arttim &= ~ARTTIM23_INTR_CH1;
arttim &= ~0xc0;
- arttim |= setup_values[setup_count];
+ arttim |= setup_values[t.setup];
(void) pci_write_config_byte(dev, arttim_regs[drive->dn], arttim);
}
@@ -162,7 +136,7 @@ static void cmd64x_set_pio_mode(ide_driv
if (pio == 8 || pio == 9)
return;
- cmd64x_tune_pio(drive, pio);
+ cmd64x_program_timings(drive, XFER_PIO_0 + pio);
}
static void cmd64x_set_dma_mode(ide_drive_t *drive, const u8 speed)
@@ -197,13 +171,9 @@ static void cmd64x_set_dma_mode(ide_driv
regU |= unit ? 0xC2 : 0x31;
break;
case XFER_MW_DMA_2:
- program_cycle_times(drive, 120, 70);
- break;
case XFER_MW_DMA_1:
- program_cycle_times(drive, 150, 80);
- break;
case XFER_MW_DMA_0:
- program_cycle_times(drive, 480, 215);
+ cmd64x_program_timings(drive, speed);
break;
}
@@ -471,6 +441,6 @@ static void __exit cmd64x_ide_exit(void)
module_init(cmd64x_ide_init);
module_exit(cmd64x_ide_exit);
-MODULE_AUTHOR("Eddie Dost, David Miller, Andre Hedrick");
+MODULE_AUTHOR("Eddie Dost, David Miller, Andre Hedrick, Bartlomiej Zolnierkiewicz");
MODULE_DESCRIPTION("PCI driver module for CMD64x IDE");
MODULE_LICENSE("GPL");
next prev parent reply other threads:[~2010-01-18 17:20 UTC|newest]
Thread overview: 149+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-01-18 17:13 [PATCH 00/64] more PATA fixes Bartlomiej Zolnierkiewicz
2010-01-18 17:13 ` [PATCH 01/64] libata: fix CFA handling in ide_timing_compute() Bartlomiej Zolnierkiewicz
2010-01-18 18:23 ` Sergei Shtylyov
2010-01-18 18:29 ` Bartlomiej Zolnierkiewicz
2010-01-18 18:57 ` Sergei Shtylyov
2010-01-18 19:04 ` Bartlomiej Zolnierkiewicz
2010-01-21 4:06 ` Jeff Garzik
2010-01-18 17:14 ` [PATCH 02/64] pata_ali: documentation fixes Bartlomiej Zolnierkiewicz
2010-01-21 4:06 ` Jeff Garzik
2010-01-18 17:14 ` [PATCH 03/64] pata_ali: cleanup ali_set_piomode() Bartlomiej Zolnierkiewicz
2010-01-18 17:46 ` Alan Cox
2010-01-18 18:16 ` Bartlomiej Zolnierkiewicz
2010-01-18 17:14 ` [PATCH 04/64] pata_amd: remove bogus code from timing_setup() Bartlomiej Zolnierkiewicz
2010-01-18 17:50 ` Alan Cox
2010-01-18 18:18 ` Bartlomiej Zolnierkiewicz
2010-01-18 17:14 ` [PATCH 05/64] pata_atiixp: remove superfluous wrapper function Bartlomiej Zolnierkiewicz
2010-01-21 4:07 ` Jeff Garzik
2010-01-21 4:09 ` Jeff Garzik
2010-01-21 11:23 ` Bartlomiej Zolnierkiewicz
2010-01-21 16:50 ` Jeff Garzik
2010-01-18 17:14 ` [PATCH 06/64] pata_atiixp: add locking for parallel scanning Bartlomiej Zolnierkiewicz
2010-01-21 4:07 ` Jeff Garzik
2010-01-18 17:14 ` [PATCH 07/64] pata_atiixp: enable parallel scan Bartlomiej Zolnierkiewicz
2010-01-18 17:52 ` Alan Cox
2010-01-18 18:18 ` Bartlomiej Zolnierkiewicz
2010-01-18 17:14 ` [PATCH 08/64] pata_cmd64x: fix PIO setup Bartlomiej Zolnierkiewicz
2010-01-21 4:14 ` Jeff Garzik
2010-01-18 17:15 ` [PATCH 09/64] pata_cmd64x: fix handling of address setup timings Bartlomiej Zolnierkiewicz
2010-01-18 18:46 ` Sergei Shtylyov
2010-01-18 17:15 ` [PATCH 10/64] pata_cmd64x: cmd648_bmdma_stop() fix Bartlomiej Zolnierkiewicz
2010-01-18 17:15 ` [PATCH 11/64] pata_cmd64x: remove unused definitions Bartlomiej Zolnierkiewicz
2010-01-18 17:15 ` [PATCH 12/64] pata_cs5520: convert to use ->init_host method Bartlomiej Zolnierkiewicz
2010-01-18 17:15 ` [PATCH 13/64] pata_cs5535: use correct values for PIO1 and PIO2 data timings Bartlomiej Zolnierkiewicz
2010-01-21 4:16 ` Jeff Garzik
2010-01-18 17:15 ` [PATCH 14/64] pata_cypress: fix PIO timings underclocking Bartlomiej Zolnierkiewicz
2010-01-18 19:05 ` Sergei Shtylyov
2010-01-18 17:15 ` [PATCH 15/64] pata_efar: always program master_data before slave_data Bartlomiej Zolnierkiewicz
2010-01-18 17:55 ` Alan Cox
2010-01-21 4:16 ` Jeff Garzik
2010-01-18 17:16 ` [PATCH 16/64] pata_efar: fix secondary port support Bartlomiej Zolnierkiewicz
2010-01-21 4:17 ` Jeff Garzik
2010-01-18 17:16 ` [PATCH 17/64] pata_efar: add locking for parallel scanning Bartlomiej Zolnierkiewicz
2010-01-18 17:16 ` [PATCH 18/64] pata_efar: enable parallel scan Bartlomiej Zolnierkiewicz
2010-01-18 17:16 ` [PATCH 19/64] pata_serverworks: fix PIO setup for the second channel Bartlomiej Zolnierkiewicz
2010-01-21 4:18 ` Jeff Garzik
2010-01-18 17:16 ` [PATCH 20/64] pata_serverworks: fix error message Bartlomiej Zolnierkiewicz
2010-01-18 17:16 ` [PATCH 21/64] pata_serverworks: cleanup cable detection Bartlomiej Zolnierkiewicz
2010-01-21 4:18 ` Jeff Garzik
2010-01-18 17:17 ` [PATCH 22/64] pata_via: fix address setup timings underlocking Bartlomiej Zolnierkiewicz
2010-01-18 18:00 ` Alan Cox
2010-01-21 4:19 ` Jeff Garzik
2010-01-18 17:17 ` [PATCH 23/64] pata_via: store UDMA masks in via_isa_bridges table Bartlomiej Zolnierkiewicz
2010-01-18 18:03 ` Alan Cox
2010-01-21 4:25 ` Jeff Garzik
2010-01-18 17:17 ` [PATCH 24/64] ide: fix for ide_timing quantisation errors Bartlomiej Zolnierkiewicz
2010-01-18 19:09 ` Sergei Shtylyov
2010-01-19 9:05 ` David Miller
2010-01-18 17:17 ` [PATCH 25/64] ide: use standard timing for XFER_PIO_SLOW mode in ide_timing_compute() Bartlomiej Zolnierkiewicz
2010-01-18 19:11 ` Sergei Shtylyov
2010-01-19 9:25 ` David Miller
2010-01-19 15:09 ` Bartlomiej Zolnierkiewicz
2010-01-19 19:30 ` David Miller
2010-01-19 19:42 ` Sergei Shtylyov
2010-01-19 19:48 ` David Miller
2010-01-19 20:25 ` Bartlomiej Zolnierkiewicz
2010-01-18 17:17 ` [PATCH 26/64] alim15x3: fix PIO timings calculations Bartlomiej Zolnierkiewicz
2010-01-19 9:25 ` David Miller
2010-01-18 17:17 ` [PATCH 27/64] alim15x3: add ali_fifo_control() helper Bartlomiej Zolnierkiewicz
2010-01-19 9:25 ` David Miller
2010-01-18 17:17 ` [PATCH 28/64] alim15x3: remove superfluous locking from ali_set_pio_mode() Bartlomiej Zolnierkiewicz
2010-01-19 9:25 ` David Miller
2010-01-18 17:18 ` [PATCH 29/64] alim15x3: cleanup ali_cable_detect() Bartlomiej Zolnierkiewicz
2010-01-19 9:25 ` David Miller
2010-01-18 17:18 ` [PATCH 30/64] amd74xx: don't change UDMA settings when programming PIO timings Bartlomiej Zolnierkiewicz
2010-01-19 9:26 ` David Miller
2010-01-18 17:18 ` Bartlomiej Zolnierkiewicz [this message]
2010-01-19 9:26 ` [PATCH 31/64] cmd64x: fix PIO and MWDMA timings calculations David Miller
2010-01-18 17:18 ` [PATCH 32/64] cmd64x: remove superfluous checks from cmd64x_set_dma_mode() Bartlomiej Zolnierkiewicz
2010-01-19 9:26 ` David Miller
2010-01-18 17:18 ` [PATCH 33/64] cy82c693: fix PIO timings calculations Bartlomiej Zolnierkiewicz
2010-01-19 9:26 ` David Miller
2010-01-18 17:18 ` [PATCH 34/64] cy82c693: remove stale driver history Bartlomiej Zolnierkiewicz
2010-01-19 9:26 ` David Miller
2010-01-18 17:19 ` [PATCH 35/64] opti621: " Bartlomiej Zolnierkiewicz
2010-01-19 9:26 ` David Miller
2010-01-18 17:19 ` [PATCH 36/64] pdc202xx_old: add ->init_hwif method Bartlomiej Zolnierkiewicz
2010-01-19 9:26 ` David Miller
2010-01-18 17:19 ` [PATCH 37/64] serverworks: cleanup svwks_udma_filter() Bartlomiej Zolnierkiewicz
2010-01-19 9:26 ` David Miller
2010-01-18 17:19 ` [PATCH 38/64] serverworks: add missing pci_dev_put() call Bartlomiej Zolnierkiewicz
2010-01-19 9:27 ` David Miller
2010-01-18 17:19 ` [PATCH 39/64] via82cxxx: vx855 is a single channel controller Bartlomiej Zolnierkiewicz
2010-01-19 9:27 ` David Miller
2010-01-18 17:19 ` [PATCH 40/64] ide: add SATA cable detection support Bartlomiej Zolnierkiewicz
2010-01-19 9:42 ` David Miller
2010-01-18 17:19 ` [PATCH 41/64] via82cxxx: fix SATA cable detection Bartlomiej Zolnierkiewicz
2010-01-19 9:42 ` David Miller
2010-01-18 17:20 ` [PATCH 42/64] via82cxxx: workaround h/w bugs Bartlomiej Zolnierkiewicz
2010-01-19 9:42 ` David Miller
2010-01-18 17:20 ` [PATCH 43/64] via82cxxx: add support for vt8261 and future chips Bartlomiej Zolnierkiewicz
2010-01-19 9:42 ` David Miller
2010-01-18 17:20 ` [PATCH 44/64] via82cxxx: add support for VT6415 PCIE PATA IDE Host Controller Bartlomiej Zolnierkiewicz
2010-01-19 9:42 ` David Miller
2010-01-18 17:20 ` [PATCH 45/64] via82cxxx: fix UDMA settings programming Bartlomiej Zolnierkiewicz
2010-01-19 9:43 ` David Miller
2010-01-18 17:20 ` [PATCH 46/64] ide: add drive->pio_mode field Bartlomiej Zolnierkiewicz
2010-01-18 19:28 ` Sergei Shtylyov
2010-01-19 15:09 ` Bartlomiej Zolnierkiewicz
2010-01-21 17:48 ` Sergei Shtylyov
2010-01-19 9:43 ` David Miller
2010-01-18 17:20 ` [PATCH 47/64] ide: add drive->dma_mode field Bartlomiej Zolnierkiewicz
2010-01-19 9:43 ` David Miller
2010-04-12 14:12 ` Sergei Shtylyov
2010-01-18 17:20 ` [PATCH 48/64] ide: change ->set_pio_mode method parameters Bartlomiej Zolnierkiewicz
2010-01-19 9:45 ` David Miller
2010-01-18 17:20 ` [PATCH 49/64] ide: change ->set_dma_mode " Bartlomiej Zolnierkiewicz
2010-01-19 9:45 ` David Miller
2010-01-18 17:20 ` [PATCH 50/64] ide-timings: use ->pio_mode value to determine fastest PIO speed Bartlomiej Zolnierkiewicz
2010-01-19 9:48 ` David Miller
2010-01-18 17:21 ` [PATCH 51/64] alim15x3: fix handling of address setup timings Bartlomiej Zolnierkiewicz
2010-01-19 9:53 ` David Miller
2010-01-18 17:21 ` [PATCH 52/64] alim15x3: fix handling of command timings Bartlomiej Zolnierkiewicz
2010-01-19 9:53 ` David Miller
2010-01-18 17:21 ` [PATCH 53/64] alim15x3: fix handling of DMA timings Bartlomiej Zolnierkiewicz
2010-01-19 9:53 ` David Miller
2010-01-18 17:21 ` [PATCH 54/64] alim15x3: fix handling of UDMA enable bit Bartlomiej Zolnierkiewicz
2010-01-19 9:53 ` David Miller
2010-04-12 13:53 ` Sergei Shtylyov
2010-04-13 15:15 ` Bartlomiej Zolnierkiewicz
2010-01-18 17:21 ` [PATCH 55/64] amd74xx: use ->pio_mode value to determine pair device speed Bartlomiej Zolnierkiewicz
2010-01-19 9:53 ` David Miller
2010-01-18 17:21 ` [PATCH 56/64] cmd64x: fix handling of address setup timings Bartlomiej Zolnierkiewicz
2010-01-19 9:53 ` David Miller
2010-01-18 17:21 ` [PATCH 57/64] cs5535: use ->pio_mode value to determine pair device speed Bartlomiej Zolnierkiewicz
2010-01-19 9:54 ` David Miller
2010-01-18 17:21 ` [PATCH 58/64] cs5536: " Bartlomiej Zolnierkiewicz
2010-01-19 9:54 ` David Miller
2010-01-18 17:22 ` [PATCH 59/64] it821x: " Bartlomiej Zolnierkiewicz
2010-01-19 9:54 ` David Miller
2010-01-18 17:22 ` [PATCH 60/64] palm_bk3710: " Bartlomiej Zolnierkiewicz
2010-01-19 9:54 ` David Miller
2010-01-18 17:22 ` [PATCH 61/64] siimage: " Bartlomiej Zolnierkiewicz
2010-01-19 9:54 ` David Miller
2010-01-18 17:22 ` [PATCH 62/64] tx493xide: " Bartlomiej Zolnierkiewicz
2010-01-19 9:54 ` David Miller
2010-01-18 17:22 ` [PATCH 63/64] via82cxxx: " Bartlomiej Zolnierkiewicz
2010-01-19 9:54 ` David Miller
2010-01-18 17:22 ` [PATCH 64/64] ide: make ide_get_best_pio_mode() static Bartlomiej Zolnierkiewicz
2010-01-19 9:54 ` David Miller
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=20100118171826.14623.15282.sendpatchset@localhost \
--to=bzolnier@gmail.com \
--cc=linux-ide@vger.kernel.org \
--cc=linux-kernel@vger.kernel.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