diff options
| -rw-r--r-- | drivers/scsi/libata-core.c | 91 |
1 files changed, 35 insertions, 56 deletions
diff --git a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c index 913e378eca7f..f04561abf6d8 100644 --- a/drivers/scsi/libata-core.c +++ b/drivers/scsi/libata-core.c | |||
| @@ -1771,47 +1771,6 @@ static int ata_dev_set_mode(struct ata_port *ap, struct ata_device *dev) | |||
| 1771 | return 0; | 1771 | return 0; |
| 1772 | } | 1772 | } |
| 1773 | 1773 | ||
| 1774 | static int ata_host_set_pio(struct ata_port *ap) | ||
| 1775 | { | ||
| 1776 | int i; | ||
| 1777 | |||
| 1778 | for (i = 0; i < ATA_MAX_DEVICES; i++) { | ||
| 1779 | struct ata_device *dev = &ap->device[i]; | ||
| 1780 | |||
| 1781 | if (!ata_dev_enabled(dev)) | ||
| 1782 | continue; | ||
| 1783 | |||
| 1784 | if (!dev->pio_mode) { | ||
| 1785 | printk(KERN_WARNING "ata%u: no PIO support for device %d.\n", ap->id, i); | ||
| 1786 | return -1; | ||
| 1787 | } | ||
| 1788 | |||
| 1789 | dev->xfer_mode = dev->pio_mode; | ||
| 1790 | dev->xfer_shift = ATA_SHIFT_PIO; | ||
| 1791 | if (ap->ops->set_piomode) | ||
| 1792 | ap->ops->set_piomode(ap, dev); | ||
| 1793 | } | ||
| 1794 | |||
| 1795 | return 0; | ||
| 1796 | } | ||
| 1797 | |||
| 1798 | static void ata_host_set_dma(struct ata_port *ap) | ||
| 1799 | { | ||
| 1800 | int i; | ||
| 1801 | |||
| 1802 | for (i = 0; i < ATA_MAX_DEVICES; i++) { | ||
| 1803 | struct ata_device *dev = &ap->device[i]; | ||
| 1804 | |||
| 1805 | if (!ata_dev_enabled(dev) || !dev->dma_mode) | ||
| 1806 | continue; | ||
| 1807 | |||
| 1808 | dev->xfer_mode = dev->dma_mode; | ||
| 1809 | dev->xfer_shift = ata_xfer_mode2shift(dev->dma_mode); | ||
| 1810 | if (ap->ops->set_dmamode) | ||
| 1811 | ap->ops->set_dmamode(ap, dev); | ||
| 1812 | } | ||
| 1813 | } | ||
| 1814 | |||
| 1815 | /** | 1774 | /** |
| 1816 | * ata_set_mode - Program timings and issue SET FEATURES - XFER | 1775 | * ata_set_mode - Program timings and issue SET FEATURES - XFER |
| 1817 | * @ap: port on which timings will be programmed | 1776 | * @ap: port on which timings will be programmed |
| @@ -1823,20 +1782,20 @@ static void ata_host_set_dma(struct ata_port *ap) | |||
| 1823 | */ | 1782 | */ |
| 1824 | static void ata_set_mode(struct ata_port *ap) | 1783 | static void ata_set_mode(struct ata_port *ap) |
| 1825 | { | 1784 | { |
| 1785 | struct ata_device *dev; | ||
| 1826 | int i, rc, used_dma = 0, found = 0; | 1786 | int i, rc, used_dma = 0, found = 0; |
| 1827 | 1787 | ||
| 1828 | /* step 1: calculate xfer_mask */ | 1788 | /* step 1: calculate xfer_mask */ |
| 1829 | for (i = 0; i < ATA_MAX_DEVICES; i++) { | 1789 | for (i = 0; i < ATA_MAX_DEVICES; i++) { |
| 1830 | struct ata_device *dev = &ap->device[i]; | ||
| 1831 | unsigned int pio_mask, dma_mask; | 1790 | unsigned int pio_mask, dma_mask; |
| 1832 | 1791 | ||
| 1792 | dev = &ap->device[i]; | ||
| 1793 | |||
| 1833 | if (!ata_dev_enabled(dev)) | 1794 | if (!ata_dev_enabled(dev)) |
| 1834 | continue; | 1795 | continue; |
| 1835 | 1796 | ||
| 1836 | ata_dev_xfermask(ap, dev); | 1797 | ata_dev_xfermask(ap, dev); |
| 1837 | 1798 | ||
| 1838 | /* TODO: let LLDD filter dev->*_mask here */ | ||
| 1839 | |||
| 1840 | pio_mask = ata_pack_xfermask(dev->pio_mask, 0, 0); | 1799 | pio_mask = ata_pack_xfermask(dev->pio_mask, 0, 0); |
| 1841 | dma_mask = ata_pack_xfermask(0, dev->mwdma_mask, dev->udma_mask); | 1800 | dma_mask = ata_pack_xfermask(0, dev->mwdma_mask, dev->udma_mask); |
| 1842 | dev->pio_mode = ata_xfer_mask2mode(pio_mask); | 1801 | dev->pio_mode = ata_xfer_mask2mode(pio_mask); |
| @@ -1850,16 +1809,40 @@ static void ata_set_mode(struct ata_port *ap) | |||
| 1850 | return; | 1809 | return; |
| 1851 | 1810 | ||
| 1852 | /* step 2: always set host PIO timings */ | 1811 | /* step 2: always set host PIO timings */ |
| 1853 | rc = ata_host_set_pio(ap); | 1812 | for (i = 0; i < ATA_MAX_DEVICES; i++) { |
| 1854 | if (rc) | 1813 | dev = &ap->device[i]; |
| 1855 | goto err_out; | 1814 | if (!ata_dev_enabled(dev)) |
| 1815 | continue; | ||
| 1816 | |||
| 1817 | if (!dev->pio_mode) { | ||
| 1818 | printk(KERN_WARNING "ata%u: dev %u no PIO support\n", | ||
| 1819 | ap->id, dev->devno); | ||
| 1820 | rc = -EINVAL; | ||
| 1821 | goto err_out; | ||
| 1822 | } | ||
| 1823 | |||
| 1824 | dev->xfer_mode = dev->pio_mode; | ||
| 1825 | dev->xfer_shift = ATA_SHIFT_PIO; | ||
| 1826 | if (ap->ops->set_piomode) | ||
| 1827 | ap->ops->set_piomode(ap, dev); | ||
| 1828 | } | ||
| 1856 | 1829 | ||
| 1857 | /* step 3: set host DMA timings */ | 1830 | /* step 3: set host DMA timings */ |
| 1858 | ata_host_set_dma(ap); | 1831 | for (i = 0; i < ATA_MAX_DEVICES; i++) { |
| 1832 | dev = &ap->device[i]; | ||
| 1833 | |||
| 1834 | if (!ata_dev_enabled(dev) || !dev->dma_mode) | ||
| 1835 | continue; | ||
| 1836 | |||
| 1837 | dev->xfer_mode = dev->dma_mode; | ||
| 1838 | dev->xfer_shift = ata_xfer_mode2shift(dev->dma_mode); | ||
| 1839 | if (ap->ops->set_dmamode) | ||
| 1840 | ap->ops->set_dmamode(ap, dev); | ||
| 1841 | } | ||
| 1859 | 1842 | ||
| 1860 | /* step 4: update devices' xfer mode */ | 1843 | /* step 4: update devices' xfer mode */ |
| 1861 | for (i = 0; i < ATA_MAX_DEVICES; i++) { | 1844 | for (i = 0; i < ATA_MAX_DEVICES; i++) { |
| 1862 | struct ata_device *dev = &ap->device[i]; | 1845 | dev = &ap->device[i]; |
| 1863 | 1846 | ||
| 1864 | if (!ata_dev_enabled(dev)) | 1847 | if (!ata_dev_enabled(dev)) |
| 1865 | continue; | 1848 | continue; |
| @@ -1869,17 +1852,13 @@ static void ata_set_mode(struct ata_port *ap) | |||
| 1869 | goto err_out; | 1852 | goto err_out; |
| 1870 | } | 1853 | } |
| 1871 | 1854 | ||
| 1872 | /* | 1855 | /* Record simplex status. If we selected DMA then the other |
| 1873 | * Record simplex status. If we selected DMA then the other | 1856 | * host channels are not permitted to do so. |
| 1874 | * host channels are not permitted to do so. | ||
| 1875 | */ | 1857 | */ |
| 1876 | |||
| 1877 | if (used_dma && (ap->host_set->flags & ATA_HOST_SIMPLEX)) | 1858 | if (used_dma && (ap->host_set->flags & ATA_HOST_SIMPLEX)) |
| 1878 | ap->host_set->simplex_claimed = 1; | 1859 | ap->host_set->simplex_claimed = 1; |
| 1879 | 1860 | ||
| 1880 | /* | 1861 | /* step5: chip specific finalisation */ |
| 1881 | * Chip specific finalisation | ||
| 1882 | */ | ||
| 1883 | if (ap->ops->post_set_mode) | 1862 | if (ap->ops->post_set_mode) |
| 1884 | ap->ops->post_set_mode(ap); | 1863 | ap->ops->post_set_mode(ap); |
| 1885 | 1864 | ||
