diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-11-13 01:18:22 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-11-13 01:18:22 -0500 |
| commit | 13aa7e0bc20f7f7e5ef45f0defc4ff4380802302 (patch) | |
| tree | 6516c4a1dabd8dcf7c1856f1671b6e37dbca37c8 | |
| parent | c08acff0544c5dadf892e3908799a5ca1d98e592 (diff) | |
| parent | 9f961a5f6efc87a79571d7166257b36af28ffcfe (diff) | |
Merge branch 'for-3.13' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata
Pull libata changes from Tejun Heo:
"Nothing too interesting. Only two minor fixes in libata core. Most
changes are specific to hardware which isn't too common"
* 'for-3.13' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata:
ahci: Add Device IDs for Intel Wildcat Point-LP
sata_rcar: Convert to clk_prepare/unprepare
drivers/libata: Set max sector to 65535 for Slimtype DVD A DS8A9SH drive
libata: Add some missing command descriptions
sata_highbank: clear whole array in highbank_initialize_phys()
ahci: disabled FBS prior to issuing software reset
libata: Fix display of sata speed
ahci: imx: setup power saving methods
ata_piix: minor typo and a printk fix
ahci: Changing two module params with static and __read_mostly
| -rw-r--r-- | drivers/ata/ahci.c | 4 | ||||
| -rw-r--r-- | drivers/ata/ahci.h | 2 | ||||
| -rw-r--r-- | drivers/ata/ahci_imx.c | 101 | ||||
| -rw-r--r-- | drivers/ata/ahci_platform.c | 3 | ||||
| -rw-r--r-- | drivers/ata/ata_piix.c | 19 | ||||
| -rw-r--r-- | drivers/ata/libahci.c | 27 | ||||
| -rw-r--r-- | drivers/ata/libata-core.c | 1 | ||||
| -rw-r--r-- | drivers/ata/libata-eh.c | 8 | ||||
| -rw-r--r-- | drivers/ata/libata-transport.c | 16 | ||||
| -rw-r--r-- | drivers/ata/sata_highbank.c | 8 | ||||
| -rw-r--r-- | drivers/ata/sata_rcar.c | 10 | ||||
| -rw-r--r-- | include/linux/ata.h | 7 |
12 files changed, 171 insertions, 35 deletions
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index 8e28f923cf7f..e2903d03180e 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
| @@ -292,6 +292,10 @@ static const struct pci_device_id ahci_pci_tbl[] = { | |||
| 292 | { PCI_VDEVICE(INTEL, 0x8d66), board_ahci }, /* Wellsburg RAID */ | 292 | { PCI_VDEVICE(INTEL, 0x8d66), board_ahci }, /* Wellsburg RAID */ |
| 293 | { PCI_VDEVICE(INTEL, 0x8d6e), board_ahci }, /* Wellsburg RAID */ | 293 | { PCI_VDEVICE(INTEL, 0x8d6e), board_ahci }, /* Wellsburg RAID */ |
| 294 | { PCI_VDEVICE(INTEL, 0x23a3), board_ahci }, /* Coleto Creek AHCI */ | 294 | { PCI_VDEVICE(INTEL, 0x23a3), board_ahci }, /* Coleto Creek AHCI */ |
| 295 | { PCI_VDEVICE(INTEL, 0x9c83), board_ahci }, /* Wildcat Point-LP AHCI */ | ||
| 296 | { PCI_VDEVICE(INTEL, 0x9c85), board_ahci }, /* Wildcat Point-LP RAID */ | ||
| 297 | { PCI_VDEVICE(INTEL, 0x9c87), board_ahci }, /* Wildcat Point-LP RAID */ | ||
| 298 | { PCI_VDEVICE(INTEL, 0x9c8f), board_ahci }, /* Wildcat Point-LP RAID */ | ||
| 295 | 299 | ||
| 296 | /* JMicron 360/1/3/5/6, match class to avoid IDE function */ | 300 | /* JMicron 360/1/3/5/6, match class to avoid IDE function */ |
| 297 | { PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, | 301 | { PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, |
diff --git a/drivers/ata/ahci.h b/drivers/ata/ahci.h index 11456371f29b..2289efdf8203 100644 --- a/drivers/ata/ahci.h +++ b/drivers/ata/ahci.h | |||
| @@ -339,6 +339,7 @@ extern struct device_attribute *ahci_sdev_attrs[]; | |||
| 339 | .sdev_attrs = ahci_sdev_attrs | 339 | .sdev_attrs = ahci_sdev_attrs |
| 340 | 340 | ||
| 341 | extern struct ata_port_operations ahci_ops; | 341 | extern struct ata_port_operations ahci_ops; |
| 342 | extern struct ata_port_operations ahci_platform_ops; | ||
| 342 | extern struct ata_port_operations ahci_pmp_retry_srst_ops; | 343 | extern struct ata_port_operations ahci_pmp_retry_srst_ops; |
| 343 | 344 | ||
| 344 | unsigned int ahci_dev_classify(struct ata_port *ap); | 345 | unsigned int ahci_dev_classify(struct ata_port *ap); |
| @@ -368,6 +369,7 @@ irqreturn_t ahci_hw_interrupt(int irq, void *dev_instance); | |||
| 368 | irqreturn_t ahci_thread_fn(int irq, void *dev_instance); | 369 | irqreturn_t ahci_thread_fn(int irq, void *dev_instance); |
| 369 | void ahci_print_info(struct ata_host *host, const char *scc_s); | 370 | void ahci_print_info(struct ata_host *host, const char *scc_s); |
| 370 | int ahci_host_activate(struct ata_host *host, int irq, unsigned int n_msis); | 371 | int ahci_host_activate(struct ata_host *host, int irq, unsigned int n_msis); |
| 372 | void ahci_error_handler(struct ata_port *ap); | ||
| 371 | 373 | ||
| 372 | static inline void __iomem *__ahci_port_base(struct ata_host *host, | 374 | static inline void __iomem *__ahci_port_base(struct ata_host *host, |
| 373 | unsigned int port_no) | 375 | unsigned int port_no) |
diff --git a/drivers/ata/ahci_imx.c b/drivers/ata/ahci_imx.c index 58debb0acc3a..ae2d73fe321e 100644 --- a/drivers/ata/ahci_imx.c +++ b/drivers/ata/ahci_imx.c | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * copyright (c) 2013 Freescale Semiconductor, Inc. | ||
| 2 | * Freescale IMX AHCI SATA platform driver | 3 | * Freescale IMX AHCI SATA platform driver |
| 3 | * Copyright 2013 Freescale Semiconductor, Inc. | ||
| 4 | * | 4 | * |
| 5 | * based on the AHCI SATA platform driver by Jeff Garzik and Anton Vorontsov | 5 | * based on the AHCI SATA platform driver by Jeff Garzik and Anton Vorontsov |
| 6 | * | 6 | * |
| @@ -25,10 +25,13 @@ | |||
| 25 | #include <linux/of_device.h> | 25 | #include <linux/of_device.h> |
| 26 | #include <linux/mfd/syscon.h> | 26 | #include <linux/mfd/syscon.h> |
| 27 | #include <linux/mfd/syscon/imx6q-iomuxc-gpr.h> | 27 | #include <linux/mfd/syscon/imx6q-iomuxc-gpr.h> |
| 28 | #include <linux/libata.h> | ||
| 28 | #include "ahci.h" | 29 | #include "ahci.h" |
| 29 | 30 | ||
| 30 | enum { | 31 | enum { |
| 31 | HOST_TIMER1MS = 0xe0, /* Timer 1-ms */ | 32 | PORT_PHY_CTL = 0x178, /* Port0 PHY Control */ |
| 33 | PORT_PHY_CTL_PDDQ_LOC = 0x100000, /* PORT_PHY_CTL bits */ | ||
| 34 | HOST_TIMER1MS = 0xe0, /* Timer 1-ms */ | ||
| 32 | }; | 35 | }; |
| 33 | 36 | ||
| 34 | struct imx_ahci_priv { | 37 | struct imx_ahci_priv { |
| @@ -36,6 +39,56 @@ struct imx_ahci_priv { | |||
| 36 | struct clk *sata_ref_clk; | 39 | struct clk *sata_ref_clk; |
| 37 | struct clk *ahb_clk; | 40 | struct clk *ahb_clk; |
| 38 | struct regmap *gpr; | 41 | struct regmap *gpr; |
| 42 | bool no_device; | ||
| 43 | bool first_time; | ||
| 44 | }; | ||
| 45 | |||
| 46 | static int ahci_imx_hotplug; | ||
| 47 | module_param_named(hotplug, ahci_imx_hotplug, int, 0644); | ||
| 48 | MODULE_PARM_DESC(hotplug, "AHCI IMX hot-plug support (0=Don't support, 1=support)"); | ||
| 49 | |||
| 50 | static void ahci_imx_error_handler(struct ata_port *ap) | ||
| 51 | { | ||
| 52 | u32 reg_val; | ||
| 53 | struct ata_device *dev; | ||
| 54 | struct ata_host *host = dev_get_drvdata(ap->dev); | ||
| 55 | struct ahci_host_priv *hpriv = host->private_data; | ||
| 56 | void __iomem *mmio = hpriv->mmio; | ||
| 57 | struct imx_ahci_priv *imxpriv = dev_get_drvdata(ap->dev->parent); | ||
| 58 | |||
| 59 | ahci_error_handler(ap); | ||
| 60 | |||
| 61 | if (!(imxpriv->first_time) || ahci_imx_hotplug) | ||
| 62 | return; | ||
| 63 | |||
| 64 | imxpriv->first_time = false; | ||
| 65 | |||
| 66 | ata_for_each_dev(dev, &ap->link, ENABLED) | ||
| 67 | return; | ||
| 68 | /* | ||
| 69 | * Disable link to save power. An imx ahci port can't be recovered | ||
| 70 | * without full reset once the pddq mode is enabled making it | ||
| 71 | * impossible to use as part of libata LPM. | ||
| 72 | */ | ||
| 73 | reg_val = readl(mmio + PORT_PHY_CTL); | ||
| 74 | writel(reg_val | PORT_PHY_CTL_PDDQ_LOC, mmio + PORT_PHY_CTL); | ||
| 75 | regmap_update_bits(imxpriv->gpr, IOMUXC_GPR13, | ||
| 76 | IMX6Q_GPR13_SATA_MPLL_CLK_EN, | ||
| 77 | !IMX6Q_GPR13_SATA_MPLL_CLK_EN); | ||
| 78 | clk_disable_unprepare(imxpriv->sata_ref_clk); | ||
| 79 | imxpriv->no_device = true; | ||
| 80 | } | ||
| 81 | |||
| 82 | static struct ata_port_operations ahci_imx_ops = { | ||
| 83 | .inherits = &ahci_platform_ops, | ||
| 84 | .error_handler = ahci_imx_error_handler, | ||
| 85 | }; | ||
| 86 | |||
| 87 | static const struct ata_port_info ahci_imx_port_info = { | ||
| 88 | .flags = AHCI_FLAG_COMMON, | ||
| 89 | .pio_mask = ATA_PIO4, | ||
| 90 | .udma_mask = ATA_UDMA6, | ||
| 91 | .port_ops = &ahci_imx_ops, | ||
| 39 | }; | 92 | }; |
| 40 | 93 | ||
| 41 | static int imx6q_sata_init(struct device *dev, void __iomem *mmio) | 94 | static int imx6q_sata_init(struct device *dev, void __iomem *mmio) |
| @@ -117,9 +170,51 @@ static void imx6q_sata_exit(struct device *dev) | |||
| 117 | clk_disable_unprepare(imxpriv->sata_ref_clk); | 170 | clk_disable_unprepare(imxpriv->sata_ref_clk); |
| 118 | } | 171 | } |
| 119 | 172 | ||
| 173 | static int imx_ahci_suspend(struct device *dev) | ||
| 174 | { | ||
| 175 | struct imx_ahci_priv *imxpriv = dev_get_drvdata(dev->parent); | ||
| 176 | |||
| 177 | /* | ||
| 178 | * If no_device is set, The CLKs had been gated off in the | ||
| 179 | * initialization so don't do it again here. | ||
| 180 | */ | ||
| 181 | if (!imxpriv->no_device) { | ||
| 182 | regmap_update_bits(imxpriv->gpr, IOMUXC_GPR13, | ||
| 183 | IMX6Q_GPR13_SATA_MPLL_CLK_EN, | ||
| 184 | !IMX6Q_GPR13_SATA_MPLL_CLK_EN); | ||
| 185 | clk_disable_unprepare(imxpriv->sata_ref_clk); | ||
| 186 | } | ||
| 187 | |||
| 188 | return 0; | ||
| 189 | } | ||
| 190 | |||
| 191 | static int imx_ahci_resume(struct device *dev) | ||
| 192 | { | ||
| 193 | struct imx_ahci_priv *imxpriv = dev_get_drvdata(dev->parent); | ||
| 194 | int ret; | ||
| 195 | |||
| 196 | if (!imxpriv->no_device) { | ||
| 197 | ret = clk_prepare_enable(imxpriv->sata_ref_clk); | ||
| 198 | if (ret < 0) { | ||
| 199 | dev_err(dev, "pre-enable sata_ref clock err:%d\n", ret); | ||
| 200 | return ret; | ||
| 201 | } | ||
| 202 | |||
| 203 | regmap_update_bits(imxpriv->gpr, IOMUXC_GPR13, | ||
| 204 | IMX6Q_GPR13_SATA_MPLL_CLK_EN, | ||
| 205 | IMX6Q_GPR13_SATA_MPLL_CLK_EN); | ||
| 206 | usleep_range(1000, 2000); | ||
| 207 | } | ||
| 208 | |||
| 209 | return 0; | ||
| 210 | } | ||
| 211 | |||
| 120 | static struct ahci_platform_data imx6q_sata_pdata = { | 212 | static struct ahci_platform_data imx6q_sata_pdata = { |
| 121 | .init = imx6q_sata_init, | 213 | .init = imx6q_sata_init, |
| 122 | .exit = imx6q_sata_exit, | 214 | .exit = imx6q_sata_exit, |
| 215 | .ata_port_info = &ahci_imx_port_info, | ||
| 216 | .suspend = imx_ahci_suspend, | ||
| 217 | .resume = imx_ahci_resume, | ||
| 123 | }; | 218 | }; |
| 124 | 219 | ||
| 125 | static const struct of_device_id imx_ahci_of_match[] = { | 220 | static const struct of_device_id imx_ahci_of_match[] = { |
| @@ -152,6 +247,8 @@ static int imx_ahci_probe(struct platform_device *pdev) | |||
| 152 | ahci_dev = &ahci_pdev->dev; | 247 | ahci_dev = &ahci_pdev->dev; |
| 153 | ahci_dev->parent = dev; | 248 | ahci_dev->parent = dev; |
| 154 | 249 | ||
| 250 | imxpriv->no_device = false; | ||
| 251 | imxpriv->first_time = true; | ||
| 155 | imxpriv->ahb_clk = devm_clk_get(dev, "ahb"); | 252 | imxpriv->ahb_clk = devm_clk_get(dev, "ahb"); |
| 156 | if (IS_ERR(imxpriv->ahb_clk)) { | 253 | if (IS_ERR(imxpriv->ahb_clk)) { |
| 157 | dev_err(dev, "can't get ahb clock.\n"); | 254 | dev_err(dev, "can't get ahb clock.\n"); |
diff --git a/drivers/ata/ahci_platform.c b/drivers/ata/ahci_platform.c index 7d3b85385bfc..f9554318504f 100644 --- a/drivers/ata/ahci_platform.c +++ b/drivers/ata/ahci_platform.c | |||
| @@ -49,10 +49,11 @@ static struct platform_device_id ahci_devtype[] = { | |||
| 49 | }; | 49 | }; |
| 50 | MODULE_DEVICE_TABLE(platform, ahci_devtype); | 50 | MODULE_DEVICE_TABLE(platform, ahci_devtype); |
| 51 | 51 | ||
| 52 | static struct ata_port_operations ahci_platform_ops = { | 52 | struct ata_port_operations ahci_platform_ops = { |
| 53 | .inherits = &ahci_ops, | 53 | .inherits = &ahci_ops, |
| 54 | .host_stop = ahci_host_stop, | 54 | .host_stop = ahci_host_stop, |
| 55 | }; | 55 | }; |
| 56 | EXPORT_SYMBOL_GPL(ahci_platform_ops); | ||
| 56 | 57 | ||
| 57 | static struct ata_port_operations ahci_platform_retry_srst_ops = { | 58 | static struct ata_port_operations ahci_platform_retry_srst_ops = { |
| 58 | .inherits = &ahci_pmp_retry_srst_ops, | 59 | .inherits = &ahci_pmp_retry_srst_ops, |
diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c index 513ad7ed0c99..6334c8d7c3f1 100644 --- a/drivers/ata/ata_piix.c +++ b/drivers/ata/ata_piix.c | |||
| @@ -100,7 +100,7 @@ | |||
| 100 | 100 | ||
| 101 | enum { | 101 | enum { |
| 102 | PIIX_IOCFG = 0x54, /* IDE I/O configuration register */ | 102 | PIIX_IOCFG = 0x54, /* IDE I/O configuration register */ |
| 103 | ICH5_PMR = 0x90, /* port mapping register */ | 103 | ICH5_PMR = 0x90, /* address map register */ |
| 104 | ICH5_PCS = 0x92, /* port control and status */ | 104 | ICH5_PCS = 0x92, /* port control and status */ |
| 105 | PIIX_SIDPR_BAR = 5, | 105 | PIIX_SIDPR_BAR = 5, |
| 106 | PIIX_SIDPR_LEN = 16, | 106 | PIIX_SIDPR_LEN = 16, |
| @@ -233,7 +233,7 @@ static const struct pci_device_id piix_pci_tbl[] = { | |||
| 233 | PCI_CLASS_STORAGE_IDE << 8, 0xffff00, ich6m_sata }, | 233 | PCI_CLASS_STORAGE_IDE << 8, 0xffff00, ich6m_sata }, |
| 234 | /* 82801GB/GR/GH (ICH7, identical to ICH6) */ | 234 | /* 82801GB/GR/GH (ICH7, identical to ICH6) */ |
| 235 | { 0x8086, 0x27c0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata }, | 235 | { 0x8086, 0x27c0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata }, |
| 236 | /* 2801GBM/GHM (ICH7M, identical to ICH6M) */ | 236 | /* 82801GBM/GHM (ICH7M, identical to ICH6M) */ |
| 237 | { 0x8086, 0x27c4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6m_sata }, | 237 | { 0x8086, 0x27c4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6m_sata }, |
| 238 | /* Enterprise Southbridge 2 (631xESB/632xESB) */ | 238 | /* Enterprise Southbridge 2 (631xESB/632xESB) */ |
| 239 | { 0x8086, 0x2680, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata }, | 239 | { 0x8086, 0x2680, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata }, |
| @@ -517,7 +517,7 @@ static int ich_pata_cable_detect(struct ata_port *ap) | |||
| 517 | const struct ich_laptop *lap = &ich_laptop[0]; | 517 | const struct ich_laptop *lap = &ich_laptop[0]; |
| 518 | u8 mask; | 518 | u8 mask; |
| 519 | 519 | ||
| 520 | /* Check for specials - Acer Aspire 5602WLMi */ | 520 | /* Check for specials */ |
| 521 | while (lap->device) { | 521 | while (lap->device) { |
| 522 | if (lap->device == pdev->device && | 522 | if (lap->device == pdev->device && |
| 523 | lap->subvendor == pdev->subsystem_vendor && | 523 | lap->subvendor == pdev->subsystem_vendor && |
| @@ -1366,38 +1366,39 @@ static const int *piix_init_sata_map(struct pci_dev *pdev, | |||
| 1366 | const int *map; | 1366 | const int *map; |
| 1367 | int i, invalid_map = 0; | 1367 | int i, invalid_map = 0; |
| 1368 | u8 map_value; | 1368 | u8 map_value; |
| 1369 | char buf[32]; | ||
| 1370 | char *p = buf, *end = buf + sizeof(buf); | ||
| 1369 | 1371 | ||
| 1370 | pci_read_config_byte(pdev, ICH5_PMR, &map_value); | 1372 | pci_read_config_byte(pdev, ICH5_PMR, &map_value); |
| 1371 | 1373 | ||
| 1372 | map = map_db->map[map_value & map_db->mask]; | 1374 | map = map_db->map[map_value & map_db->mask]; |
| 1373 | 1375 | ||
| 1374 | dev_info(&pdev->dev, "MAP ["); | ||
| 1375 | for (i = 0; i < 4; i++) { | 1376 | for (i = 0; i < 4; i++) { |
| 1376 | switch (map[i]) { | 1377 | switch (map[i]) { |
| 1377 | case RV: | 1378 | case RV: |
| 1378 | invalid_map = 1; | 1379 | invalid_map = 1; |
| 1379 | pr_cont(" XX"); | 1380 | p += scnprintf(p, end - p, " XX"); |
| 1380 | break; | 1381 | break; |
| 1381 | 1382 | ||
| 1382 | case NA: | 1383 | case NA: |
| 1383 | pr_cont(" --"); | 1384 | p += scnprintf(p, end - p, " --"); |
| 1384 | break; | 1385 | break; |
| 1385 | 1386 | ||
| 1386 | case IDE: | 1387 | case IDE: |
| 1387 | WARN_ON((i & 1) || map[i + 1] != IDE); | 1388 | WARN_ON((i & 1) || map[i + 1] != IDE); |
| 1388 | pinfo[i / 2] = piix_port_info[ich_pata_100]; | 1389 | pinfo[i / 2] = piix_port_info[ich_pata_100]; |
| 1389 | i++; | 1390 | i++; |
| 1390 | pr_cont(" IDE IDE"); | 1391 | p += scnprintf(p, end - p, " IDE IDE"); |
| 1391 | break; | 1392 | break; |
| 1392 | 1393 | ||
| 1393 | default: | 1394 | default: |
| 1394 | pr_cont(" P%d", map[i]); | 1395 | p += scnprintf(p, end - p, " P%d", map[i]); |
| 1395 | if (i & 1) | 1396 | if (i & 1) |
| 1396 | pinfo[i / 2].flags |= ATA_FLAG_SLAVE_POSS; | 1397 | pinfo[i / 2].flags |= ATA_FLAG_SLAVE_POSS; |
| 1397 | break; | 1398 | break; |
| 1398 | } | 1399 | } |
| 1399 | } | 1400 | } |
| 1400 | pr_cont(" ]\n"); | 1401 | dev_info(&pdev->dev, "MAP [%s ]\n", buf); |
| 1401 | 1402 | ||
| 1402 | if (invalid_map) | 1403 | if (invalid_map) |
| 1403 | dev_err(&pdev->dev, "invalid MAP value %u\n", map_value); | 1404 | dev_err(&pdev->dev, "invalid MAP value %u\n", map_value); |
diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c index aaac4fb0d564..c482f8cadd7a 100644 --- a/drivers/ata/libahci.c +++ b/drivers/ata/libahci.c | |||
| @@ -89,7 +89,6 @@ static int ahci_pmp_retry_softreset(struct ata_link *link, unsigned int *class, | |||
| 89 | static int ahci_hardreset(struct ata_link *link, unsigned int *class, | 89 | static int ahci_hardreset(struct ata_link *link, unsigned int *class, |
| 90 | unsigned long deadline); | 90 | unsigned long deadline); |
| 91 | static void ahci_postreset(struct ata_link *link, unsigned int *class); | 91 | static void ahci_postreset(struct ata_link *link, unsigned int *class); |
| 92 | static void ahci_error_handler(struct ata_port *ap); | ||
| 93 | static void ahci_post_internal_cmd(struct ata_queued_cmd *qc); | 92 | static void ahci_post_internal_cmd(struct ata_queued_cmd *qc); |
| 94 | static void ahci_dev_config(struct ata_device *dev); | 93 | static void ahci_dev_config(struct ata_device *dev); |
| 95 | #ifdef CONFIG_PM | 94 | #ifdef CONFIG_PM |
| @@ -189,14 +188,15 @@ struct ata_port_operations ahci_pmp_retry_srst_ops = { | |||
| 189 | }; | 188 | }; |
| 190 | EXPORT_SYMBOL_GPL(ahci_pmp_retry_srst_ops); | 189 | EXPORT_SYMBOL_GPL(ahci_pmp_retry_srst_ops); |
| 191 | 190 | ||
| 192 | int ahci_em_messages = 1; | 191 | static bool ahci_em_messages __read_mostly = true; |
| 193 | EXPORT_SYMBOL_GPL(ahci_em_messages); | 192 | EXPORT_SYMBOL_GPL(ahci_em_messages); |
| 194 | module_param(ahci_em_messages, int, 0444); | 193 | module_param(ahci_em_messages, bool, 0444); |
| 195 | /* add other LED protocol types when they become supported */ | 194 | /* add other LED protocol types when they become supported */ |
| 196 | MODULE_PARM_DESC(ahci_em_messages, | 195 | MODULE_PARM_DESC(ahci_em_messages, |
| 197 | "AHCI Enclosure Management Message control (0 = off, 1 = on)"); | 196 | "AHCI Enclosure Management Message control (0 = off, 1 = on)"); |
| 198 | 197 | ||
| 199 | int devslp_idle_timeout = 1000; /* device sleep idle timeout in ms */ | 198 | /* device sleep idle timeout in ms */ |
| 199 | static int devslp_idle_timeout __read_mostly = 1000; | ||
| 200 | module_param(devslp_idle_timeout, int, 0644); | 200 | module_param(devslp_idle_timeout, int, 0644); |
| 201 | MODULE_PARM_DESC(devslp_idle_timeout, "device sleep idle timeout"); | 201 | MODULE_PARM_DESC(devslp_idle_timeout, "device sleep idle timeout"); |
| 202 | 202 | ||
| @@ -1275,9 +1275,11 @@ int ahci_do_softreset(struct ata_link *link, unsigned int *class, | |||
| 1275 | { | 1275 | { |
| 1276 | struct ata_port *ap = link->ap; | 1276 | struct ata_port *ap = link->ap; |
| 1277 | struct ahci_host_priv *hpriv = ap->host->private_data; | 1277 | struct ahci_host_priv *hpriv = ap->host->private_data; |
| 1278 | struct ahci_port_priv *pp = ap->private_data; | ||
| 1278 | const char *reason = NULL; | 1279 | const char *reason = NULL; |
| 1279 | unsigned long now, msecs; | 1280 | unsigned long now, msecs; |
| 1280 | struct ata_taskfile tf; | 1281 | struct ata_taskfile tf; |
| 1282 | bool fbs_disabled = false; | ||
| 1281 | int rc; | 1283 | int rc; |
| 1282 | 1284 | ||
| 1283 | DPRINTK("ENTER\n"); | 1285 | DPRINTK("ENTER\n"); |
| @@ -1287,6 +1289,16 @@ int ahci_do_softreset(struct ata_link *link, unsigned int *class, | |||
| 1287 | if (rc && rc != -EOPNOTSUPP) | 1289 | if (rc && rc != -EOPNOTSUPP) |
| 1288 | ata_link_warn(link, "failed to reset engine (errno=%d)\n", rc); | 1290 | ata_link_warn(link, "failed to reset engine (errno=%d)\n", rc); |
| 1289 | 1291 | ||
| 1292 | /* | ||
| 1293 | * According to AHCI-1.2 9.3.9: if FBS is enable, software shall | ||
| 1294 | * clear PxFBS.EN to '0' prior to issuing software reset to devices | ||
| 1295 | * that is attached to port multiplier. | ||
| 1296 | */ | ||
| 1297 | if (!ata_is_host_link(link) && pp->fbs_enabled) { | ||
| 1298 | ahci_disable_fbs(ap); | ||
| 1299 | fbs_disabled = true; | ||
| 1300 | } | ||
| 1301 | |||
| 1290 | ata_tf_init(link->device, &tf); | 1302 | ata_tf_init(link->device, &tf); |
| 1291 | 1303 | ||
| 1292 | /* issue the first D2H Register FIS */ | 1304 | /* issue the first D2H Register FIS */ |
| @@ -1327,6 +1339,10 @@ int ahci_do_softreset(struct ata_link *link, unsigned int *class, | |||
| 1327 | } else | 1339 | } else |
| 1328 | *class = ahci_dev_classify(ap); | 1340 | *class = ahci_dev_classify(ap); |
| 1329 | 1341 | ||
| 1342 | /* re-enable FBS if disabled before */ | ||
| 1343 | if (fbs_disabled) | ||
| 1344 | ahci_enable_fbs(ap); | ||
| 1345 | |||
| 1330 | DPRINTK("EXIT, class=%u\n", *class); | 1346 | DPRINTK("EXIT, class=%u\n", *class); |
| 1331 | return 0; | 1347 | return 0; |
| 1332 | 1348 | ||
| @@ -1989,7 +2005,7 @@ static void ahci_thaw(struct ata_port *ap) | |||
| 1989 | writel(pp->intr_mask, port_mmio + PORT_IRQ_MASK); | 2005 | writel(pp->intr_mask, port_mmio + PORT_IRQ_MASK); |
| 1990 | } | 2006 | } |
| 1991 | 2007 | ||
| 1992 | static void ahci_error_handler(struct ata_port *ap) | 2008 | void ahci_error_handler(struct ata_port *ap) |
| 1993 | { | 2009 | { |
| 1994 | if (!(ap->pflags & ATA_PFLAG_FROZEN)) { | 2010 | if (!(ap->pflags & ATA_PFLAG_FROZEN)) { |
| 1995 | /* restart engine */ | 2011 | /* restart engine */ |
| @@ -2002,6 +2018,7 @@ static void ahci_error_handler(struct ata_port *ap) | |||
| 2002 | if (!ata_dev_enabled(ap->link.device)) | 2018 | if (!ata_dev_enabled(ap->link.device)) |
| 2003 | ahci_stop_engine(ap); | 2019 | ahci_stop_engine(ap); |
| 2004 | } | 2020 | } |
| 2021 | EXPORT_SYMBOL_GPL(ahci_error_handler); | ||
| 2005 | 2022 | ||
| 2006 | static void ahci_post_internal_cmd(struct ata_queued_cmd *qc) | 2023 | static void ahci_post_internal_cmd(struct ata_queued_cmd *qc) |
| 2007 | { | 2024 | { |
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 83b1a9fb2d44..81a94a3919db 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
| @@ -4126,6 +4126,7 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { | |||
| 4126 | { "TORiSAN DVD-ROM DRD-N216", NULL, ATA_HORKAGE_MAX_SEC_128 }, | 4126 | { "TORiSAN DVD-ROM DRD-N216", NULL, ATA_HORKAGE_MAX_SEC_128 }, |
| 4127 | { "QUANTUM DAT DAT72-000", NULL, ATA_HORKAGE_ATAPI_MOD16_DMA }, | 4127 | { "QUANTUM DAT DAT72-000", NULL, ATA_HORKAGE_ATAPI_MOD16_DMA }, |
| 4128 | { "Slimtype DVD A DS8A8SH", NULL, ATA_HORKAGE_MAX_SEC_LBA48 }, | 4128 | { "Slimtype DVD A DS8A8SH", NULL, ATA_HORKAGE_MAX_SEC_LBA48 }, |
| 4129 | { "Slimtype DVD A DS8A9SH", NULL, ATA_HORKAGE_MAX_SEC_LBA48 }, | ||
| 4129 | 4130 | ||
| 4130 | /* Devices we expect to fail diagnostics */ | 4131 | /* Devices we expect to fail diagnostics */ |
| 4131 | 4132 | ||
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c index 370462fa8e01..77bbc8266883 100644 --- a/drivers/ata/libata-eh.c +++ b/drivers/ata/libata-eh.c | |||
| @@ -2293,6 +2293,7 @@ const char *ata_get_cmd_descript(u8 command) | |||
| 2293 | { ATA_CMD_IDLE, "IDLE" }, | 2293 | { ATA_CMD_IDLE, "IDLE" }, |
| 2294 | { ATA_CMD_EDD, "EXECUTE DEVICE DIAGNOSTIC" }, | 2294 | { ATA_CMD_EDD, "EXECUTE DEVICE DIAGNOSTIC" }, |
| 2295 | { ATA_CMD_DOWNLOAD_MICRO, "DOWNLOAD MICROCODE" }, | 2295 | { ATA_CMD_DOWNLOAD_MICRO, "DOWNLOAD MICROCODE" }, |
| 2296 | { ATA_CMD_DOWNLOAD_MICRO_DMA, "DOWNLOAD MICROCODE DMA" }, | ||
| 2296 | { ATA_CMD_NOP, "NOP" }, | 2297 | { ATA_CMD_NOP, "NOP" }, |
| 2297 | { ATA_CMD_FLUSH, "FLUSH CACHE" }, | 2298 | { ATA_CMD_FLUSH, "FLUSH CACHE" }, |
| 2298 | { ATA_CMD_FLUSH_EXT, "FLUSH CACHE EXT" }, | 2299 | { ATA_CMD_FLUSH_EXT, "FLUSH CACHE EXT" }, |
| @@ -2313,6 +2314,8 @@ const char *ata_get_cmd_descript(u8 command) | |||
| 2313 | { ATA_CMD_WRITE_QUEUED_FUA_EXT, "WRITE DMA QUEUED FUA EXT" }, | 2314 | { ATA_CMD_WRITE_QUEUED_FUA_EXT, "WRITE DMA QUEUED FUA EXT" }, |
| 2314 | { ATA_CMD_FPDMA_READ, "READ FPDMA QUEUED" }, | 2315 | { ATA_CMD_FPDMA_READ, "READ FPDMA QUEUED" }, |
| 2315 | { ATA_CMD_FPDMA_WRITE, "WRITE FPDMA QUEUED" }, | 2316 | { ATA_CMD_FPDMA_WRITE, "WRITE FPDMA QUEUED" }, |
| 2317 | { ATA_CMD_FPDMA_SEND, "SEND FPDMA QUEUED" }, | ||
| 2318 | { ATA_CMD_FPDMA_RECV, "RECEIVE FPDMA QUEUED" }, | ||
| 2316 | { ATA_CMD_PIO_READ, "READ SECTOR(S)" }, | 2319 | { ATA_CMD_PIO_READ, "READ SECTOR(S)" }, |
| 2317 | { ATA_CMD_PIO_READ_EXT, "READ SECTOR(S) EXT" }, | 2320 | { ATA_CMD_PIO_READ_EXT, "READ SECTOR(S) EXT" }, |
| 2318 | { ATA_CMD_PIO_WRITE, "WRITE SECTOR(S)" }, | 2321 | { ATA_CMD_PIO_WRITE, "WRITE SECTOR(S)" }, |
| @@ -2339,12 +2342,15 @@ const char *ata_get_cmd_descript(u8 command) | |||
| 2339 | { ATA_CMD_WRITE_LOG_EXT, "WRITE LOG EXT" }, | 2342 | { ATA_CMD_WRITE_LOG_EXT, "WRITE LOG EXT" }, |
| 2340 | { ATA_CMD_READ_LOG_DMA_EXT, "READ LOG DMA EXT" }, | 2343 | { ATA_CMD_READ_LOG_DMA_EXT, "READ LOG DMA EXT" }, |
| 2341 | { ATA_CMD_WRITE_LOG_DMA_EXT, "WRITE LOG DMA EXT" }, | 2344 | { ATA_CMD_WRITE_LOG_DMA_EXT, "WRITE LOG DMA EXT" }, |
| 2345 | { ATA_CMD_TRUSTED_NONDATA, "TRUSTED NON-DATA" }, | ||
| 2342 | { ATA_CMD_TRUSTED_RCV, "TRUSTED RECEIVE" }, | 2346 | { ATA_CMD_TRUSTED_RCV, "TRUSTED RECEIVE" }, |
| 2343 | { ATA_CMD_TRUSTED_RCV_DMA, "TRUSTED RECEIVE DMA" }, | 2347 | { ATA_CMD_TRUSTED_RCV_DMA, "TRUSTED RECEIVE DMA" }, |
| 2344 | { ATA_CMD_TRUSTED_SND, "TRUSTED SEND" }, | 2348 | { ATA_CMD_TRUSTED_SND, "TRUSTED SEND" }, |
| 2345 | { ATA_CMD_TRUSTED_SND_DMA, "TRUSTED SEND DMA" }, | 2349 | { ATA_CMD_TRUSTED_SND_DMA, "TRUSTED SEND DMA" }, |
| 2346 | { ATA_CMD_PMP_READ, "READ BUFFER" }, | 2350 | { ATA_CMD_PMP_READ, "READ BUFFER" }, |
| 2351 | { ATA_CMD_PMP_READ_DMA, "READ BUFFER DMA" }, | ||
| 2347 | { ATA_CMD_PMP_WRITE, "WRITE BUFFER" }, | 2352 | { ATA_CMD_PMP_WRITE, "WRITE BUFFER" }, |
| 2353 | { ATA_CMD_PMP_WRITE_DMA, "WRITE BUFFER DMA" }, | ||
| 2348 | { ATA_CMD_CONF_OVERLAY, "DEVICE CONFIGURATION OVERLAY" }, | 2354 | { ATA_CMD_CONF_OVERLAY, "DEVICE CONFIGURATION OVERLAY" }, |
| 2349 | { ATA_CMD_SEC_SET_PASS, "SECURITY SET PASSWORD" }, | 2355 | { ATA_CMD_SEC_SET_PASS, "SECURITY SET PASSWORD" }, |
| 2350 | { ATA_CMD_SEC_UNLOCK, "SECURITY UNLOCK" }, | 2356 | { ATA_CMD_SEC_UNLOCK, "SECURITY UNLOCK" }, |
| @@ -2363,6 +2369,8 @@ const char *ata_get_cmd_descript(u8 command) | |||
| 2363 | { ATA_CMD_CFA_TRANS_SECT, "CFA TRANSLATE SECTOR" }, | 2369 | { ATA_CMD_CFA_TRANS_SECT, "CFA TRANSLATE SECTOR" }, |
| 2364 | { ATA_CMD_CFA_ERASE, "CFA ERASE SECTORS" }, | 2370 | { ATA_CMD_CFA_ERASE, "CFA ERASE SECTORS" }, |
| 2365 | { ATA_CMD_CFA_WRITE_MULT_NE, "CFA WRITE MULTIPLE WITHOUT ERASE" }, | 2371 | { ATA_CMD_CFA_WRITE_MULT_NE, "CFA WRITE MULTIPLE WITHOUT ERASE" }, |
| 2372 | { ATA_CMD_REQ_SENSE_DATA, "REQUEST SENSE DATA EXT" }, | ||
| 2373 | { ATA_CMD_SANITIZE_DEVICE, "SANITIZE DEVICE" }, | ||
| 2366 | { ATA_CMD_READ_LONG, "READ LONG (with retries)" }, | 2374 | { ATA_CMD_READ_LONG, "READ LONG (with retries)" }, |
| 2367 | { ATA_CMD_READ_LONG_ONCE, "READ LONG (without retries)" }, | 2375 | { ATA_CMD_READ_LONG_ONCE, "READ LONG (without retries)" }, |
| 2368 | { ATA_CMD_WRITE_LONG, "WRITE LONG (with retries)" }, | 2376 | { ATA_CMD_WRITE_LONG, "WRITE LONG (with retries)" }, |
diff --git a/drivers/ata/libata-transport.c b/drivers/ata/libata-transport.c index 150a917f0c3c..e37413228228 100644 --- a/drivers/ata/libata-transport.c +++ b/drivers/ata/libata-transport.c | |||
| @@ -321,25 +321,25 @@ int ata_tport_add(struct device *parent, | |||
| 321 | /* | 321 | /* |
| 322 | * ATA link attributes | 322 | * ATA link attributes |
| 323 | */ | 323 | */ |
| 324 | static int noop(int x) { return x; } | ||
| 324 | 325 | ||
| 325 | 326 | #define ata_link_show_linkspeed(field, format) \ | |
| 326 | #define ata_link_show_linkspeed(field) \ | ||
| 327 | static ssize_t \ | 327 | static ssize_t \ |
| 328 | show_ata_link_##field(struct device *dev, \ | 328 | show_ata_link_##field(struct device *dev, \ |
| 329 | struct device_attribute *attr, char *buf) \ | 329 | struct device_attribute *attr, char *buf) \ |
| 330 | { \ | 330 | { \ |
| 331 | struct ata_link *link = transport_class_to_link(dev); \ | 331 | struct ata_link *link = transport_class_to_link(dev); \ |
| 332 | \ | 332 | \ |
| 333 | return sprintf(buf,"%s\n", sata_spd_string(fls(link->field))); \ | 333 | return sprintf(buf, "%s\n", sata_spd_string(format(link->field))); \ |
| 334 | } | 334 | } |
| 335 | 335 | ||
| 336 | #define ata_link_linkspeed_attr(field) \ | 336 | #define ata_link_linkspeed_attr(field, format) \ |
| 337 | ata_link_show_linkspeed(field) \ | 337 | ata_link_show_linkspeed(field, format) \ |
| 338 | static DEVICE_ATTR(field, S_IRUGO, show_ata_link_##field, NULL) | 338 | static DEVICE_ATTR(field, S_IRUGO, show_ata_link_##field, NULL) |
| 339 | 339 | ||
| 340 | ata_link_linkspeed_attr(hw_sata_spd_limit); | 340 | ata_link_linkspeed_attr(hw_sata_spd_limit, fls); |
| 341 | ata_link_linkspeed_attr(sata_spd_limit); | 341 | ata_link_linkspeed_attr(sata_spd_limit, fls); |
| 342 | ata_link_linkspeed_attr(sata_spd); | 342 | ata_link_linkspeed_attr(sata_spd, noop); |
| 343 | 343 | ||
| 344 | 344 | ||
| 345 | static DECLARE_TRANSPORT_CLASS(ata_link_class, | 345 | static DECLARE_TRANSPORT_CLASS(ata_link_class, |
diff --git a/drivers/ata/sata_highbank.c b/drivers/ata/sata_highbank.c index 7f5e5d96327f..ea3b3dc10f33 100644 --- a/drivers/ata/sata_highbank.c +++ b/drivers/ata/sata_highbank.c | |||
| @@ -343,13 +343,11 @@ static int highbank_initialize_phys(struct device *dev, void __iomem *addr) | |||
| 343 | { | 343 | { |
| 344 | struct device_node *sata_node = dev->of_node; | 344 | struct device_node *sata_node = dev->of_node; |
| 345 | int phy_count = 0, phy, port = 0, i; | 345 | int phy_count = 0, phy, port = 0, i; |
| 346 | void __iomem *cphy_base[CPHY_PHY_COUNT]; | 346 | void __iomem *cphy_base[CPHY_PHY_COUNT] = {}; |
| 347 | struct device_node *phy_nodes[CPHY_PHY_COUNT]; | 347 | struct device_node *phy_nodes[CPHY_PHY_COUNT] = {}; |
| 348 | u32 tx_atten[CPHY_PORT_COUNT]; | 348 | u32 tx_atten[CPHY_PORT_COUNT] = {}; |
| 349 | 349 | ||
| 350 | memset(port_data, 0, sizeof(struct phy_lane_info) * CPHY_PORT_COUNT); | 350 | memset(port_data, 0, sizeof(struct phy_lane_info) * CPHY_PORT_COUNT); |
| 351 | memset(phy_nodes, 0, sizeof(struct device_node*) * CPHY_PHY_COUNT); | ||
| 352 | memset(tx_atten, 0xff, CPHY_PORT_COUNT); | ||
| 353 | 351 | ||
| 354 | do { | 352 | do { |
| 355 | u32 tmp; | 353 | u32 tmp; |
diff --git a/drivers/ata/sata_rcar.c b/drivers/ata/sata_rcar.c index c2d95e9fb971..1dae9a9009f7 100644 --- a/drivers/ata/sata_rcar.c +++ b/drivers/ata/sata_rcar.c | |||
| @@ -792,7 +792,7 @@ static int sata_rcar_probe(struct platform_device *pdev) | |||
| 792 | dev_err(&pdev->dev, "failed to get access to sata clock\n"); | 792 | dev_err(&pdev->dev, "failed to get access to sata clock\n"); |
| 793 | return PTR_ERR(priv->clk); | 793 | return PTR_ERR(priv->clk); |
| 794 | } | 794 | } |
| 795 | clk_enable(priv->clk); | 795 | clk_prepare_enable(priv->clk); |
| 796 | 796 | ||
| 797 | host = ata_host_alloc(&pdev->dev, 1); | 797 | host = ata_host_alloc(&pdev->dev, 1); |
| 798 | if (!host) { | 798 | if (!host) { |
| @@ -822,7 +822,7 @@ static int sata_rcar_probe(struct platform_device *pdev) | |||
| 822 | return 0; | 822 | return 0; |
| 823 | 823 | ||
| 824 | cleanup: | 824 | cleanup: |
| 825 | clk_disable(priv->clk); | 825 | clk_disable_unprepare(priv->clk); |
| 826 | 826 | ||
| 827 | return ret; | 827 | return ret; |
| 828 | } | 828 | } |
| @@ -841,7 +841,7 @@ static int sata_rcar_remove(struct platform_device *pdev) | |||
| 841 | iowrite32(0, base + SATAINTSTAT_REG); | 841 | iowrite32(0, base + SATAINTSTAT_REG); |
| 842 | iowrite32(0x7ff, base + SATAINTMASK_REG); | 842 | iowrite32(0x7ff, base + SATAINTMASK_REG); |
| 843 | 843 | ||
| 844 | clk_disable(priv->clk); | 844 | clk_disable_unprepare(priv->clk); |
| 845 | 845 | ||
| 846 | return 0; | 846 | return 0; |
| 847 | } | 847 | } |
| @@ -861,7 +861,7 @@ static int sata_rcar_suspend(struct device *dev) | |||
| 861 | /* mask */ | 861 | /* mask */ |
| 862 | iowrite32(0x7ff, base + SATAINTMASK_REG); | 862 | iowrite32(0x7ff, base + SATAINTMASK_REG); |
| 863 | 863 | ||
| 864 | clk_disable(priv->clk); | 864 | clk_disable_unprepare(priv->clk); |
| 865 | } | 865 | } |
| 866 | 866 | ||
| 867 | return ret; | 867 | return ret; |
| @@ -873,7 +873,7 @@ static int sata_rcar_resume(struct device *dev) | |||
| 873 | struct sata_rcar_priv *priv = host->private_data; | 873 | struct sata_rcar_priv *priv = host->private_data; |
| 874 | void __iomem *base = priv->base; | 874 | void __iomem *base = priv->base; |
| 875 | 875 | ||
| 876 | clk_enable(priv->clk); | 876 | clk_prepare_enable(priv->clk); |
| 877 | 877 | ||
| 878 | /* ack and mask */ | 878 | /* ack and mask */ |
| 879 | iowrite32(0, base + SATAINTSTAT_REG); | 879 | iowrite32(0, base + SATAINTSTAT_REG); |
diff --git a/include/linux/ata.h b/include/linux/ata.h index bf4c69ca76df..f2f4d8da97c0 100644 --- a/include/linux/ata.h +++ b/include/linux/ata.h | |||
| @@ -219,6 +219,7 @@ enum { | |||
| 219 | ATA_CMD_IDLE = 0xE3, /* place in idle power mode */ | 219 | ATA_CMD_IDLE = 0xE3, /* place in idle power mode */ |
| 220 | ATA_CMD_EDD = 0x90, /* execute device diagnostic */ | 220 | ATA_CMD_EDD = 0x90, /* execute device diagnostic */ |
| 221 | ATA_CMD_DOWNLOAD_MICRO = 0x92, | 221 | ATA_CMD_DOWNLOAD_MICRO = 0x92, |
| 222 | ATA_CMD_DOWNLOAD_MICRO_DMA = 0x93, | ||
| 222 | ATA_CMD_NOP = 0x00, | 223 | ATA_CMD_NOP = 0x00, |
| 223 | ATA_CMD_FLUSH = 0xE7, | 224 | ATA_CMD_FLUSH = 0xE7, |
| 224 | ATA_CMD_FLUSH_EXT = 0xEA, | 225 | ATA_CMD_FLUSH_EXT = 0xEA, |
| @@ -268,12 +269,15 @@ enum { | |||
| 268 | ATA_CMD_WRITE_LOG_EXT = 0x3F, | 269 | ATA_CMD_WRITE_LOG_EXT = 0x3F, |
| 269 | ATA_CMD_READ_LOG_DMA_EXT = 0x47, | 270 | ATA_CMD_READ_LOG_DMA_EXT = 0x47, |
| 270 | ATA_CMD_WRITE_LOG_DMA_EXT = 0x57, | 271 | ATA_CMD_WRITE_LOG_DMA_EXT = 0x57, |
| 272 | ATA_CMD_TRUSTED_NONDATA = 0x5B, | ||
| 271 | ATA_CMD_TRUSTED_RCV = 0x5C, | 273 | ATA_CMD_TRUSTED_RCV = 0x5C, |
| 272 | ATA_CMD_TRUSTED_RCV_DMA = 0x5D, | 274 | ATA_CMD_TRUSTED_RCV_DMA = 0x5D, |
| 273 | ATA_CMD_TRUSTED_SND = 0x5E, | 275 | ATA_CMD_TRUSTED_SND = 0x5E, |
| 274 | ATA_CMD_TRUSTED_SND_DMA = 0x5F, | 276 | ATA_CMD_TRUSTED_SND_DMA = 0x5F, |
| 275 | ATA_CMD_PMP_READ = 0xE4, | 277 | ATA_CMD_PMP_READ = 0xE4, |
| 278 | ATA_CMD_PMP_READ_DMA = 0xE9, | ||
| 276 | ATA_CMD_PMP_WRITE = 0xE8, | 279 | ATA_CMD_PMP_WRITE = 0xE8, |
| 280 | ATA_CMD_PMP_WRITE_DMA = 0xEB, | ||
| 277 | ATA_CMD_CONF_OVERLAY = 0xB1, | 281 | ATA_CMD_CONF_OVERLAY = 0xB1, |
| 278 | ATA_CMD_SEC_SET_PASS = 0xF1, | 282 | ATA_CMD_SEC_SET_PASS = 0xF1, |
| 279 | ATA_CMD_SEC_UNLOCK = 0xF2, | 283 | ATA_CMD_SEC_UNLOCK = 0xF2, |
| @@ -292,6 +296,9 @@ enum { | |||
| 292 | ATA_CMD_CFA_TRANS_SECT = 0x87, | 296 | ATA_CMD_CFA_TRANS_SECT = 0x87, |
| 293 | ATA_CMD_CFA_ERASE = 0xC0, | 297 | ATA_CMD_CFA_ERASE = 0xC0, |
| 294 | ATA_CMD_CFA_WRITE_MULT_NE = 0xCD, | 298 | ATA_CMD_CFA_WRITE_MULT_NE = 0xCD, |
| 299 | ATA_CMD_REQ_SENSE_DATA = 0x0B, | ||
| 300 | ATA_CMD_SANITIZE_DEVICE = 0xB4, | ||
| 301 | |||
| 295 | /* marked obsolete in the ATA/ATAPI-7 spec */ | 302 | /* marked obsolete in the ATA/ATAPI-7 spec */ |
| 296 | ATA_CMD_RESTORE = 0x10, | 303 | ATA_CMD_RESTORE = 0x10, |
| 297 | 304 | ||
