diff options
author | Tejun Heo <htejun@gmail.com> | 2007-11-27 05:43:40 -0500 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2008-01-23 05:24:11 -0500 |
commit | 70cd071e4ecc06c985189665af75c108601fd5a3 (patch) | |
tree | f28aae811d01f8ef44f27e5d469fe330ff834980 /drivers/ata/libata-core.c | |
parent | 6357357cae7794dcb89cace758108dec612e7ed5 (diff) |
libata: clean up xfermode / PATA timing related stuff
* s/ATA_BITS_(PIO|MWDMA|UDMA)/ATA_NR_\1_MODES/g
* Consistently use 0xff to indicate invalid transfer mode (0x00 is
valid for PIO_SLOW).
* Make ata_xfer_mode2mask() return proper mode mask instead of just
the highest bit.
* Sort ata_timing table in increasing xfermode order and update
ata_timing_find_mode() accordingly.
This patch doesn't introduce any behavior change.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to 'drivers/ata/libata-core.c')
-rw-r--r-- | drivers/ata/libata-core.c | 82 |
1 files changed, 40 insertions, 42 deletions
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index a2f2ff864b37..a70ed7b3bc55 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
@@ -487,9 +487,9 @@ static const struct ata_xfer_ent { | |||
487 | int shift, bits; | 487 | int shift, bits; |
488 | u8 base; | 488 | u8 base; |
489 | } ata_xfer_tbl[] = { | 489 | } ata_xfer_tbl[] = { |
490 | { ATA_SHIFT_PIO, ATA_BITS_PIO, XFER_PIO_0 }, | 490 | { ATA_SHIFT_PIO, ATA_NR_PIO_MODES, XFER_PIO_0 }, |
491 | { ATA_SHIFT_MWDMA, ATA_BITS_MWDMA, XFER_MW_DMA_0 }, | 491 | { ATA_SHIFT_MWDMA, ATA_NR_MWDMA_MODES, XFER_MW_DMA_0 }, |
492 | { ATA_SHIFT_UDMA, ATA_BITS_UDMA, XFER_UDMA_0 }, | 492 | { ATA_SHIFT_UDMA, ATA_NR_UDMA_MODES, XFER_UDMA_0 }, |
493 | { -1, }, | 493 | { -1, }, |
494 | }; | 494 | }; |
495 | 495 | ||
@@ -504,7 +504,7 @@ static const struct ata_xfer_ent { | |||
504 | * None. | 504 | * None. |
505 | * | 505 | * |
506 | * RETURNS: | 506 | * RETURNS: |
507 | * Matching XFER_* value, 0 if no match found. | 507 | * Matching XFER_* value, 0xff if no match found. |
508 | */ | 508 | */ |
509 | u8 ata_xfer_mask2mode(unsigned int xfer_mask) | 509 | u8 ata_xfer_mask2mode(unsigned int xfer_mask) |
510 | { | 510 | { |
@@ -514,7 +514,7 @@ u8 ata_xfer_mask2mode(unsigned int xfer_mask) | |||
514 | for (ent = ata_xfer_tbl; ent->shift >= 0; ent++) | 514 | for (ent = ata_xfer_tbl; ent->shift >= 0; ent++) |
515 | if (highbit >= ent->shift && highbit < ent->shift + ent->bits) | 515 | if (highbit >= ent->shift && highbit < ent->shift + ent->bits) |
516 | return ent->base + highbit - ent->shift; | 516 | return ent->base + highbit - ent->shift; |
517 | return 0; | 517 | return 0xff; |
518 | } | 518 | } |
519 | 519 | ||
520 | /** | 520 | /** |
@@ -535,7 +535,8 @@ unsigned int ata_xfer_mode2mask(u8 xfer_mode) | |||
535 | 535 | ||
536 | for (ent = ata_xfer_tbl; ent->shift >= 0; ent++) | 536 | for (ent = ata_xfer_tbl; ent->shift >= 0; ent++) |
537 | if (xfer_mode >= ent->base && xfer_mode < ent->base + ent->bits) | 537 | if (xfer_mode >= ent->base && xfer_mode < ent->base + ent->bits) |
538 | return 1 << (ent->shift + xfer_mode - ent->base); | 538 | return ((2 << (ent->shift + xfer_mode - ent->base)) - 1) |
539 | & ~((1 << ent->shift) - 1); | ||
539 | return 0; | 540 | return 0; |
540 | } | 541 | } |
541 | 542 | ||
@@ -1314,7 +1315,7 @@ void ata_id_to_dma_mode(struct ata_device *dev, u8 unknown) | |||
1314 | /* Select the mode in use */ | 1315 | /* Select the mode in use */ |
1315 | mode = ata_xfer_mask2mode(mask); | 1316 | mode = ata_xfer_mask2mode(mask); |
1316 | 1317 | ||
1317 | if (mode != 0) { | 1318 | if (mode != 0xff) { |
1318 | ata_dev_printk(dev, KERN_INFO, "configured for %s\n", | 1319 | ata_dev_printk(dev, KERN_INFO, "configured for %s\n", |
1319 | ata_mode_string(mask)); | 1320 | ata_mode_string(mask)); |
1320 | } else { | 1321 | } else { |
@@ -2788,38 +2789,33 @@ int sata_set_spd(struct ata_link *link) | |||
2788 | */ | 2789 | */ |
2789 | 2790 | ||
2790 | static const struct ata_timing ata_timing[] = { | 2791 | static const struct ata_timing ata_timing[] = { |
2792 | /* { XFER_PIO_SLOW, 120, 290, 240, 960, 290, 240, 960, 0 }, */ | ||
2793 | { XFER_PIO_0, 70, 290, 240, 600, 165, 150, 600, 0 }, | ||
2794 | { XFER_PIO_1, 50, 290, 93, 383, 125, 100, 383, 0 }, | ||
2795 | { XFER_PIO_2, 30, 290, 40, 330, 100, 90, 240, 0 }, | ||
2796 | { XFER_PIO_3, 30, 80, 70, 180, 80, 70, 180, 0 }, | ||
2797 | { XFER_PIO_4, 25, 70, 25, 120, 70, 25, 120, 0 }, | ||
2798 | { XFER_PIO_5, 15, 65, 25, 100, 65, 25, 100, 0 }, | ||
2799 | { XFER_PIO_6, 10, 55, 20, 80, 55, 20, 80, 0 }, | ||
2791 | 2800 | ||
2792 | { XFER_UDMA_6, 0, 0, 0, 0, 0, 0, 0, 15 }, | 2801 | { XFER_SW_DMA_0, 120, 0, 0, 0, 480, 480, 960, 0 }, |
2793 | { XFER_UDMA_5, 0, 0, 0, 0, 0, 0, 0, 20 }, | 2802 | { XFER_SW_DMA_1, 90, 0, 0, 0, 240, 240, 480, 0 }, |
2794 | { XFER_UDMA_4, 0, 0, 0, 0, 0, 0, 0, 30 }, | 2803 | { XFER_SW_DMA_2, 60, 0, 0, 0, 120, 120, 240, 0 }, |
2795 | { XFER_UDMA_3, 0, 0, 0, 0, 0, 0, 0, 45 }, | ||
2796 | 2804 | ||
2797 | { XFER_MW_DMA_4, 25, 0, 0, 0, 55, 20, 80, 0 }, | 2805 | { XFER_MW_DMA_0, 60, 0, 0, 0, 215, 215, 480, 0 }, |
2806 | { XFER_MW_DMA_1, 45, 0, 0, 0, 80, 50, 150, 0 }, | ||
2807 | { XFER_MW_DMA_2, 25, 0, 0, 0, 70, 25, 120, 0 }, | ||
2798 | { XFER_MW_DMA_3, 25, 0, 0, 0, 65, 25, 100, 0 }, | 2808 | { XFER_MW_DMA_3, 25, 0, 0, 0, 65, 25, 100, 0 }, |
2799 | { XFER_UDMA_2, 0, 0, 0, 0, 0, 0, 0, 60 }, | 2809 | { XFER_MW_DMA_4, 25, 0, 0, 0, 55, 20, 80, 0 }, |
2800 | { XFER_UDMA_1, 0, 0, 0, 0, 0, 0, 0, 80 }, | ||
2801 | { XFER_UDMA_0, 0, 0, 0, 0, 0, 0, 0, 120 }, | ||
2802 | 2810 | ||
2803 | /* { XFER_UDMA_SLOW, 0, 0, 0, 0, 0, 0, 0, 150 }, */ | 2811 | /* { XFER_UDMA_SLOW, 0, 0, 0, 0, 0, 0, 0, 150 }, */ |
2804 | 2812 | { XFER_UDMA_0, 0, 0, 0, 0, 0, 0, 0, 120 }, | |
2805 | { XFER_MW_DMA_2, 25, 0, 0, 0, 70, 25, 120, 0 }, | 2813 | { XFER_UDMA_1, 0, 0, 0, 0, 0, 0, 0, 80 }, |
2806 | { XFER_MW_DMA_1, 45, 0, 0, 0, 80, 50, 150, 0 }, | 2814 | { XFER_UDMA_2, 0, 0, 0, 0, 0, 0, 0, 60 }, |
2807 | { XFER_MW_DMA_0, 60, 0, 0, 0, 215, 215, 480, 0 }, | 2815 | { XFER_UDMA_3, 0, 0, 0, 0, 0, 0, 0, 45 }, |
2808 | 2816 | { XFER_UDMA_4, 0, 0, 0, 0, 0, 0, 0, 30 }, | |
2809 | { XFER_SW_DMA_2, 60, 0, 0, 0, 120, 120, 240, 0 }, | 2817 | { XFER_UDMA_5, 0, 0, 0, 0, 0, 0, 0, 20 }, |
2810 | { XFER_SW_DMA_1, 90, 0, 0, 0, 240, 240, 480, 0 }, | 2818 | { XFER_UDMA_6, 0, 0, 0, 0, 0, 0, 0, 15 }, |
2811 | { XFER_SW_DMA_0, 120, 0, 0, 0, 480, 480, 960, 0 }, | ||
2812 | |||
2813 | { XFER_PIO_6, 10, 55, 20, 80, 55, 20, 80, 0 }, | ||
2814 | { XFER_PIO_5, 15, 65, 25, 100, 65, 25, 100, 0 }, | ||
2815 | { XFER_PIO_4, 25, 70, 25, 120, 70, 25, 120, 0 }, | ||
2816 | { XFER_PIO_3, 30, 80, 70, 180, 80, 70, 180, 0 }, | ||
2817 | |||
2818 | { XFER_PIO_2, 30, 290, 40, 330, 100, 90, 240, 0 }, | ||
2819 | { XFER_PIO_1, 50, 290, 93, 383, 125, 100, 383, 0 }, | ||
2820 | { XFER_PIO_0, 70, 290, 240, 600, 165, 150, 600, 0 }, | ||
2821 | |||
2822 | /* { XFER_PIO_SLOW, 120, 290, 240, 960, 290, 240, 960, 0 }, */ | ||
2823 | 2819 | ||
2824 | { 0xFF } | 2820 | { 0xFF } |
2825 | }; | 2821 | }; |
@@ -2854,12 +2850,14 @@ void ata_timing_merge(const struct ata_timing *a, const struct ata_timing *b, | |||
2854 | 2850 | ||
2855 | const struct ata_timing *ata_timing_find_mode(u8 xfer_mode) | 2851 | const struct ata_timing *ata_timing_find_mode(u8 xfer_mode) |
2856 | { | 2852 | { |
2857 | const struct ata_timing *t; | 2853 | const struct ata_timing *t = ata_timing; |
2854 | |||
2855 | while (xfer_mode > t->mode) | ||
2856 | t++; | ||
2858 | 2857 | ||
2859 | for (t = ata_timing; t->mode != xfer_mode; t++) | 2858 | if (xfer_mode == t->mode) |
2860 | if (t->mode == 0xFF) | 2859 | return t; |
2861 | return NULL; | 2860 | return NULL; |
2862 | return t; | ||
2863 | } | 2861 | } |
2864 | 2862 | ||
2865 | int ata_timing_compute(struct ata_device *adev, unsigned short speed, | 2863 | int ata_timing_compute(struct ata_device *adev, unsigned short speed, |
@@ -3122,7 +3120,7 @@ int ata_do_set_mode(struct ata_link *link, struct ata_device **r_failed_dev) | |||
3122 | dev->dma_mode = ata_xfer_mask2mode(dma_mask); | 3120 | dev->dma_mode = ata_xfer_mask2mode(dma_mask); |
3123 | 3121 | ||
3124 | found = 1; | 3122 | found = 1; |
3125 | if (dev->dma_mode) | 3123 | if (dev->dma_mode != 0xff) |
3126 | used_dma = 1; | 3124 | used_dma = 1; |
3127 | } | 3125 | } |
3128 | if (!found) | 3126 | if (!found) |
@@ -3133,7 +3131,7 @@ int ata_do_set_mode(struct ata_link *link, struct ata_device **r_failed_dev) | |||
3133 | if (!ata_dev_enabled(dev)) | 3131 | if (!ata_dev_enabled(dev)) |
3134 | continue; | 3132 | continue; |
3135 | 3133 | ||
3136 | if (!dev->pio_mode) { | 3134 | if (dev->pio_mode == 0xff) { |
3137 | ata_dev_printk(dev, KERN_WARNING, "no PIO support\n"); | 3135 | ata_dev_printk(dev, KERN_WARNING, "no PIO support\n"); |
3138 | rc = -EINVAL; | 3136 | rc = -EINVAL; |
3139 | goto out; | 3137 | goto out; |
@@ -3147,7 +3145,7 @@ int ata_do_set_mode(struct ata_link *link, struct ata_device **r_failed_dev) | |||
3147 | 3145 | ||
3148 | /* step 3: set host DMA timings */ | 3146 | /* step 3: set host DMA timings */ |
3149 | ata_link_for_each_dev(dev, link) { | 3147 | ata_link_for_each_dev(dev, link) { |
3150 | if (!ata_dev_enabled(dev) || !dev->dma_mode) | 3148 | if (!ata_dev_enabled(dev) || dev->dma_mode == 0xff) |
3151 | continue; | 3149 | continue; |
3152 | 3150 | ||
3153 | dev->xfer_mode = dev->dma_mode; | 3151 | dev->xfer_mode = dev->dma_mode; |