lkml.org 
[lkml]   [2002]   [Jun]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
Subject[PATCH] 2.5.24: generic ATA PCI auto-dma tuning (4/5)

- in ata-timing.h rework XFER_* defines

- convert alim15x3.c and hpt366.c to new scheme

- small fix for hpt34x.c

--
Bartlomiej Zolnierkiewicz
diff -ur linux-ata-hosts-9/drivers/ide/alim15x3.c linux/drivers/ide/alim15x3.c
--- linux-ata-hosts-9/drivers/ide/alim15x3.c Mon Jun 24 22:40:40 2002
+++ linux/drivers/ide/alim15x3.c Mon Jun 24 22:43:20 2002
@@ -99,24 +99,6 @@
__restore_flags(flags);
}

-/* FIXME: unfold --bkz */
-static byte ali15x3_can_ultra(struct ata_device *drive)
-{
- if (m5229_revision <= 0x20) {
- return 0;
- } else if ((m5229_revision < 0xC2) &&
-#ifndef CONFIG_WDC_ALI15X3
- ((chip_is_1543c_e && strstr(drive->id->model, "WDC ")) ||
- (drive->type != ATA_DISK))) {
-#else
- (drive->type != ATA_DISK)) {
-#endif
- return 0;
- } else {
- return 1;
- }
-}
-
static int ali15x3_tune_chipset(struct ata_device *drive, byte speed)
{
struct pci_dev *dev = drive->channel->pci_dev;
@@ -158,85 +140,14 @@
}

#ifdef CONFIG_BLK_DEV_IDEDMA
-static int config_chipset_for_dma(struct ata_device *drive, u8 udma)
-{
- int map = drive->channel->modes_map;
- u8 mode;
-
- if (!eighty_ninty_three(drive))
- map &= ~XFER_UDMA_80W;
-
- if (!udma)
- map &= ~XFER_UDMA_ALL;
-
- mode = ata_timing_mode(drive, map);
-
- if (mode < XFER_SW_DMA_0)
- return 0;
-
- return !ali15x3_tune_chipset(drive, mode);
-}
-
static int ali15x3_udma_setup(struct ata_device *drive, int map)
{
- struct hd_driveid *id = drive->id;
- struct ata_channel *hwif = drive->channel;
- int on = 1;
- int verbose = 1;
- byte can_ultra_dma = ali15x3_can_ultra(drive);
-
- if ((m5229_revision<=0x20) && (drive->type != ATA_DISK)) {
- udma_enable(drive, 0, 0);
- return 0;
- }
-
- if ((id != NULL) && ((id->capability & 1) != 0) && hwif->autodma) {
- /* Consult the list of known "bad" drives */
- if (udma_black_list(drive)) {
- on = 0;
- goto fast_ata_pio;
- }
- on = 0;
- verbose = 0;
- if ((id->field_valid & 4) && (m5229_revision >= 0xC2)) {
- if (id->dma_ultra & 0x003F) {
- /* Force if Capable UltraDMA */
- on = config_chipset_for_dma(drive, can_ultra_dma);
- if ((id->field_valid & 2) &&
- (!on))
- goto try_dma_modes;
- }
- } else if (id->field_valid & 2) {
-try_dma_modes:
- if ((id->dma_mword & 0x0007) ||
- (id->dma_1word & 0x0007)) {
- /* Force if Capable regular DMA modes */
- on = config_chipset_for_dma(drive, can_ultra_dma);
- if (!on)
- goto no_dma_set;
- }
- } else if (udma_white_list(drive)) {
- if (id->eide_dma_time > 150) {
- goto no_dma_set;
- }
- /* Consult the list of known "good" drives */
- on = config_chipset_for_dma(drive, can_ultra_dma);
- if (!on)
- goto no_dma_set;
- } else {
- goto fast_ata_pio;
- }
- } else if ((id->capability & 8) || (id->field_valid & 2)) {
-fast_ata_pio:
- on = 0;
- verbose = 0;
-no_dma_set:
- ali15x3_tune_drive(drive, 255);
- }
-
- udma_enable(drive, on, verbose);
-
- return 0;
+#ifndef CONFIG_WDC_ALI15X3
+ if ((m5229_revision < 0xC2) && chip_is_1543c_e &&
+ strstr(drive->id->model, "WDC "))
+ map &= ~XFER_UDMA_ALL;
+#endif
+ return udma_generic_setup(drive, map);
}

static int ali15x3_udma_init(struct ata_device *drive, struct request *rq)
@@ -251,7 +162,7 @@
{
int map = XFER_EPIO | XFER_SWDMA | XFER_MWDMA;

- if (!ali15x3_can_ultra(ch->drive))
+ if (m5229_revision <= 0x20)
return map;

map |= XFER_UDMA;
@@ -439,8 +350,10 @@
* M1543C or newer for DMAing
*/
hwif->modes_map = ali15x3_modes_map(hwif);
- hwif->udma_init = ali15x3_udma_init;
+ if (m5229_revision < 0xC2)
+ hwif->no_atapi_autodma = 1;
hwif->udma_setup = ali15x3_udma_setup;
+ hwif->udma_init = ali15x3_udma_init;
hwif->autodma = 1;
}

diff -ur linux-ata-hosts-9/drivers/ide/ata-timing.c linux/drivers/ide/ata-timing.c
--- linux-ata-hosts-9/drivers/ide/ata-timing.c Mon Jun 24 22:15:05 2002
+++ linux/drivers/ide/ata-timing.c Mon Jun 24 22:43:20 2002
@@ -86,9 +86,11 @@
if ((map & XFER_UDMA_100) == XFER_UDMA_100)
if ((best = (id->dma_ultra & 0x0020) ? XFER_UDMA_5 : 0)) return best;

- if ((map & XFER_UDMA_66) == XFER_UDMA_66)
- if ((best = (id->dma_ultra & 0x0010) ? XFER_UDMA_4 :
- (id->dma_ultra & 0x0008) ? XFER_UDMA_3 : 0)) return best;
+ if ((map & XFER_UDMA_66_4) == XFER_UDMA_66_4)
+ if ((best = (id->dma_ultra & 0x0010) ? XFER_UDMA_4 : 0)) return best;
+
+ if ((map & XFER_UDMA_66_3) == XFER_UDMA_66_3)
+ if ((best = (id->dma_ultra & 0x0008) ? XFER_UDMA_3 : 0)) return best;

if ((best = (id->dma_ultra & 0x0004) ? XFER_UDMA_2 :
(id->dma_ultra & 0x0002) ? XFER_UDMA_1 :
diff -ur linux-ata-hosts-9/drivers/ide/ata-timing.h linux/drivers/ide/ata-timing.h
--- linux-ata-hosts-9/drivers/ide/ata-timing.h Mon Jun 24 22:24:30 2002
+++ linux/drivers/ide/ata-timing.h Mon Jun 24 22:43:20 2002
@@ -59,18 +59,22 @@
#define ENOUGH(v,unit) (((v)-1)/(unit)+1)
#define EZ(v,unit) ((v)?ENOUGH(v,unit):0)

-#define XFER_MODE 0xf0
-#define XFER_UDMA_133 0x48
-#define XFER_UDMA_100 0x44
-#define XFER_UDMA_66 0x42
-#define XFER_UDMA 0x40
-#define XFER_MWDMA 0x20
-#define XFER_SWDMA 0x10
-#define XFER_EPIO 0x01
-#define XFER_PIO 0x00
+/* see hpt366.c for details */
+#define XFER_UDMA_66_3 0x100
+#define XFER_UDMA_66_4 0x200

-#define XFER_UDMA_ALL 0x4e
-#define XFER_UDMA_80W 0x0e
+#define XFER_MODE 0xff0
+#define XFER_UDMA_133 0x800
+#define XFER_UDMA_100 0x400
+#define XFER_UDMA_66 0x300
+#define XFER_UDMA 0x040
+#define XFER_MWDMA 0x020
+#define XFER_SWDMA 0x010
+#define XFER_EPIO 0x001
+#define XFER_PIO 0x000
+
+#define XFER_UDMA_ALL 0xf40
+#define XFER_UDMA_80W 0xf00

/* External interface to host chips channel timing setup.
*
diff -ur linux-ata-hosts-9/drivers/ide/hpt34x.c linux/drivers/ide/hpt34x.c
--- linux-ata-hosts-9/drivers/ide/hpt34x.c Mon Jun 24 22:40:40 2002
+++ linux/drivers/ide/hpt34x.c Mon Jun 24 22:43:20 2002
@@ -75,10 +75,10 @@
static int hpt34x_udma_setup(struct ata_device *drive, int map)
{
#ifdef CONFIG_HPT34X_AUTODMA
- udma_generic_setup(drive, map);
-#endif
-
+ return udma_generic_setup(drive, map);
+#else
return 0;
+#endif
}

static int hpt34x_udma_stop(struct ata_device *drive)
diff -ur linux-ata-hosts-9/drivers/ide/hpt366.c linux/drivers/ide/hpt366.c
--- linux-ata-hosts-9/drivers/ide/hpt366.c Mon Jun 24 22:40:40 2002
+++ linux/drivers/ide/hpt366.c Mon Jun 24 22:43:20 2002
@@ -648,65 +648,42 @@
return ide_config_drive_speed(drive, speed);
}

+/* FIXME: pio == 255 -> ata_best_pio_mode(drive) --bkz */
static void hpt3xx_tune_drive(struct ata_device *drive, u8 pio)
{
(void) hpt3xx_tune_chipset(drive, XFER_PIO_0 + min_t(u8, pio, 4));
}

#ifdef CONFIG_BLK_DEV_IDEDMA
-static int config_chipset_for_dma(struct ata_device *drive)
+static int hpt3xx_udma_setup(struct ata_device *drive, int map)
{
- int map;
u32 rev;
- u8 mode;

if (drive->type != ATA_DISK)
return 0;

rev = hpt_revision(drive->channel->pci_dev);

- map = drive->channel->modes_map;
+ /* FIXME: badlists need futher investigation --bkz */

- if (!eighty_ninty_three(drive))
- map &= ~XFER_UDMA_80W;
+ /* bad_ata100_5 is for HPT370/370A,
+ bad_ata66_4, bad_ata66_3 and bad_ata33 are for HPT366/368 */

- mode = ata_timing_mode(drive, map);
+ if (rev < 5 && check_in_drive_lists(drive, bad_ata100_5))
+ map &= ~XFER_UDMA_100;

- /* FIXME: badlists need futher investigation --bkz
- bad_ata100_5 is for HPT370/370A,
- bad_ata66_4, bad_ata66_3 and bad_ata33 are for HPT366/368
- */
- if (mode == XFER_UDMA_5 && rev < 5) {
- if (check_in_drive_lists(drive, bad_ata100_5)) {
- /* FIXME: make XFER_UDMA_66/100/133
- independent of XFER_UDMA --bkz */
- map &= ~XFER_UDMA_100;
- map |= XFER_UDMA;
- mode = ata_timing_mode(drive, map);
- }
- }
- if (mode == XFER_UDMA_4 && rev < 3) {
- if (check_in_drive_lists(drive, bad_ata66_4)) {
- if (drive->id->dma_ultra & 0x0008) {
- mode = XFER_UDMA_3;
- } else {
- map &= ~XFER_UDMA_66;
- map |= XFER_UDMA;
- mode = ata_timing_mode(drive, map);
- }
- }
- }
- if (mode == XFER_UDMA_3 && rev < 3) {
- if (check_in_drive_lists(drive, bad_ata66_3)) {
- map &= ~XFER_UDMA_66;
- map |= XFER_UDMA;
- mode = ata_timing_mode(drive, map);
- }
+ if (rev < 3) {
+ if (check_in_drive_lists(drive, bad_ata66_4))
+ map &= ~XFER_UDMA_66_4;
+
+ if (check_in_drive_lists(drive, bad_ata66_3))
+ map &= ~XFER_UDMA_66_3;
+
+ if (check_in_drive_lists(drive, bad_ata33))
+ map &= ~XFER_UDMA_ALL;
}
- if (check_in_drive_lists(drive, bad_ata33) && rev < 3)
- mode = ata_timing_mode(drive, XFER_MWDMA);

- return !hpt3xx_tune_chipset(drive, mode);
+ return udma_generic_setup(drive, map);
}

static int hpt3xx_quirkproc(struct ata_device *drive)
@@ -743,59 +720,6 @@
}
}

-static int hpt3xx_udma_setup(struct ata_device *drive, int map)
-{
- struct hd_driveid *id = drive->id;
- int on = 1;
- int verbose = 1;
-
- if (id && (id->capability & 1) && drive->channel->autodma) {
- /* Consult the list of known "bad" drives */
- if (udma_black_list(drive)) {
- on = 0;
- goto fast_ata_pio;
- }
- on = 0;
- verbose = 0;
- if (id->field_valid & 4) {
- if (id->dma_ultra & 0x007F) {
- /* Force if Capable UltraDMA */
- on = config_chipset_for_dma(drive);
- if ((id->field_valid & 2) &&
- (!on))
- goto try_dma_modes;
- }
- } else if (id->field_valid & 2) {
-try_dma_modes:
- if (id->dma_mword & 0x0007) {
- /* Force if Capable regular DMA modes */
- on = config_chipset_for_dma(drive);
- if (!on)
- goto no_dma_set;
- }
- } else if (udma_white_list(drive)) {
- if (id->eide_dma_time > 150) {
- goto no_dma_set;
- }
- /* Consult the list of known "good" drives */
- on = config_chipset_for_dma(drive);
- if (!on)
- goto no_dma_set;
- } else {
- goto fast_ata_pio;
- }
- } else if ((id->capability & 8) || (id->field_valid & 2)) {
-fast_ata_pio:
- on = 0;
- verbose = 0;
-no_dma_set:
- hpt3xx_tune_chipset(drive, ata_best_pio_mode(drive));
- }
- udma_enable(drive, on, verbose);
-
- return 0;
-}
-
static void hpt366_udma_irq_lost(struct ata_device *drive)
{
struct pci_dev *dev = drive->channel->pci_dev;
\
 
 \ /
  Last update: 2005-03-22 13:27    [W:0.021 / U:2.496 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site