Lines Matching +full:en +full:- +full:esata
2 * libahci.c - Common AHCI SATA low-level routines
5 * Please ALWAYS copy linux-ide@vger.kernel.org
8 * Copyright 2004-2005 Red Hat, Inc.
27 * as Documentation/driver-api/libata.rst
42 #include <linux/dma-mapping.h>
230 * ahci_rpm_get_port - Make sure the port is powered on
239 return pm_runtime_get_sync(ap->dev); in ahci_rpm_get_port()
243 * ahci_rpm_put_port - Undoes ahci_rpm_get_port()
251 pm_runtime_put(ap->dev); in ahci_rpm_put_port()
259 struct ahci_host_priv *hpriv = ap->host->private_data; in ahci_show_host_caps()
261 return sprintf(buf, "%x\n", hpriv->cap); in ahci_show_host_caps()
269 struct ahci_host_priv *hpriv = ap->host->private_data; in ahci_show_host_cap2()
271 return sprintf(buf, "%x\n", hpriv->cap2); in ahci_show_host_cap2()
279 struct ahci_host_priv *hpriv = ap->host->private_data; in ahci_show_host_version()
281 return sprintf(buf, "%x\n", hpriv->version); in ahci_show_host_version()
304 struct ahci_host_priv *hpriv = ap->host->private_data; in ahci_read_em_buffer()
305 void __iomem *mmio = hpriv->mmio; in ahci_read_em_buffer()
306 void __iomem *em_mmio = mmio + hpriv->em_loc; in ahci_read_em_buffer()
313 spin_lock_irqsave(ap->lock, flags); in ahci_read_em_buffer()
316 if (!(ap->flags & ATA_FLAG_EM) || em_ctl & EM_CTL_XMT || in ahci_read_em_buffer()
317 !(hpriv->em_msg_type & EM_MSG_TYPE_SGPIO)) { in ahci_read_em_buffer()
318 spin_unlock_irqrestore(ap->lock, flags); in ahci_read_em_buffer()
320 return -EINVAL; in ahci_read_em_buffer()
324 spin_unlock_irqrestore(ap->lock, flags); in ahci_read_em_buffer()
326 return -EAGAIN; in ahci_read_em_buffer()
330 em_mmio += hpriv->em_buf_sz; in ahci_read_em_buffer()
332 count = hpriv->em_buf_sz; in ahci_read_em_buffer()
340 hpriv->em_buf_sz, PAGE_SIZE); in ahci_read_em_buffer()
352 spin_unlock_irqrestore(ap->lock, flags); in ahci_read_em_buffer()
364 struct ahci_host_priv *hpriv = ap->host->private_data; in ahci_store_em_buffer()
365 void __iomem *mmio = hpriv->mmio; in ahci_store_em_buffer()
366 void __iomem *em_mmio = mmio + hpriv->em_loc; in ahci_store_em_buffer()
373 if (!(ap->flags & ATA_FLAG_EM) || in ahci_store_em_buffer()
374 !(hpriv->em_msg_type & EM_MSG_TYPE_SGPIO) || in ahci_store_em_buffer()
375 size % 4 || size > hpriv->em_buf_sz) in ahci_store_em_buffer()
376 return -EINVAL; in ahci_store_em_buffer()
379 spin_lock_irqsave(ap->lock, flags); in ahci_store_em_buffer()
383 spin_unlock_irqrestore(ap->lock, flags); in ahci_store_em_buffer()
385 return -EBUSY; in ahci_store_em_buffer()
396 spin_unlock_irqrestore(ap->lock, flags); in ahci_store_em_buffer()
407 struct ahci_host_priv *hpriv = ap->host->private_data; in ahci_show_em_supported()
408 void __iomem *mmio = hpriv->mmio; in ahci_show_em_supported()
417 em_ctl & EM_CTL_SAFTE ? "saf-te " : "", in ahci_show_em_supported()
418 em_ctl & EM_CTL_SES ? "ses-2 " : "", in ahci_show_em_supported()
423 * ahci_save_initial_config - Save and fixup initial config values
434 * If it is not set already this function sets hpriv->start_engine to
442 void __iomem *mmio = hpriv->mmio; in ahci_save_initial_config()
452 hpriv->saved_cap = cap = readl(mmio + HOST_CAP); in ahci_save_initial_config()
453 hpriv->saved_port_map = port_map = readl(mmio + HOST_PORTS_IMPL); in ahci_save_initial_config()
459 hpriv->saved_cap2 = cap2 = readl(mmio + HOST_CAP2); in ahci_save_initial_config()
461 hpriv->saved_cap2 = cap2 = 0; in ahci_save_initial_config()
464 if ((cap & HOST_CAP_64) && (hpriv->flags & AHCI_HFLAG_32BIT_ONLY)) { in ahci_save_initial_config()
469 if ((cap & HOST_CAP_NCQ) && (hpriv->flags & AHCI_HFLAG_NO_NCQ)) { in ahci_save_initial_config()
474 if (!(cap & HOST_CAP_NCQ) && (hpriv->flags & AHCI_HFLAG_YES_NCQ)) { in ahci_save_initial_config()
479 if ((cap & HOST_CAP_PMP) && (hpriv->flags & AHCI_HFLAG_NO_PMP)) { in ahci_save_initial_config()
484 if ((cap & HOST_CAP_SNTF) && (hpriv->flags & AHCI_HFLAG_NO_SNTF)) { in ahci_save_initial_config()
490 if ((cap2 & HOST_CAP2_SDS) && (hpriv->flags & AHCI_HFLAG_NO_DEVSLP)) { in ahci_save_initial_config()
497 if (!(cap & HOST_CAP_FBS) && (hpriv->flags & AHCI_HFLAG_YES_FBS)) { in ahci_save_initial_config()
502 if ((cap & HOST_CAP_FBS) && (hpriv->flags & AHCI_HFLAG_NO_FBS)) { in ahci_save_initial_config()
507 if (!(cap & HOST_CAP_ALPM) && (hpriv->flags & AHCI_HFLAG_YES_ALPM)) { in ahci_save_initial_config()
512 if (hpriv->force_port_map && port_map != hpriv->force_port_map) { in ahci_save_initial_config()
513 dev_info(dev, "forcing port_map 0x%x -> 0x%x\n", in ahci_save_initial_config()
514 port_map, hpriv->force_port_map); in ahci_save_initial_config()
515 port_map = hpriv->force_port_map; in ahci_save_initial_config()
516 hpriv->saved_port_map = port_map; in ahci_save_initial_config()
519 if (hpriv->mask_port_map) { in ahci_save_initial_config()
520 dev_warn(dev, "masking port_map 0x%x -> 0x%x\n", in ahci_save_initial_config()
522 port_map & hpriv->mask_port_map); in ahci_save_initial_config()
523 port_map &= hpriv->mask_port_map; in ahci_save_initial_config()
547 port_map = (1 << ahci_nr_ports(cap)) - 1; in ahci_save_initial_config()
551 hpriv->saved_port_map = port_map; in ahci_save_initial_config()
555 hpriv->cap = cap; in ahci_save_initial_config()
556 hpriv->cap2 = cap2; in ahci_save_initial_config()
557 hpriv->version = readl(mmio + HOST_VERSION); in ahci_save_initial_config()
558 hpriv->port_map = port_map; in ahci_save_initial_config()
560 if (!hpriv->start_engine) in ahci_save_initial_config()
561 hpriv->start_engine = ahci_start_engine; in ahci_save_initial_config()
563 if (!hpriv->stop_engine) in ahci_save_initial_config()
564 hpriv->stop_engine = ahci_stop_engine; in ahci_save_initial_config()
566 if (!hpriv->irq_handler) in ahci_save_initial_config()
567 hpriv->irq_handler = ahci_single_level_irq_intr; in ahci_save_initial_config()
572 * ahci_restore_initial_config - Restore initial config
582 struct ahci_host_priv *hpriv = host->private_data; in ahci_restore_initial_config()
583 void __iomem *mmio = hpriv->mmio; in ahci_restore_initial_config()
585 writel(hpriv->saved_cap, mmio + HOST_CAP); in ahci_restore_initial_config()
586 if (hpriv->saved_cap2) in ahci_restore_initial_config()
587 writel(hpriv->saved_cap2, mmio + HOST_CAP2); in ahci_restore_initial_config()
588 writel(hpriv->saved_port_map, mmio + HOST_PORTS_IMPL); in ahci_restore_initial_config()
601 struct ahci_host_priv *hpriv = ap->host->private_data; in ahci_scr_offset()
604 (sc_reg != SCR_NOTIFICATION || (hpriv->cap & HOST_CAP_SNTF))) in ahci_scr_offset()
611 void __iomem *port_mmio = ahci_port_base(link->ap); in ahci_scr_read()
612 int offset = ahci_scr_offset(link->ap, sc_reg); in ahci_scr_read()
618 return -EINVAL; in ahci_scr_read()
623 void __iomem *port_mmio = ahci_port_base(link->ap); in ahci_scr_write()
624 int offset = ahci_scr_offset(link->ap, sc_reg); in ahci_scr_write()
630 return -EINVAL; in ahci_scr_write()
649 struct ahci_host_priv *hpriv = ap->host->private_data; in ahci_stop_engine()
658 if ((hpriv->flags & AHCI_HFLAG_WAKE_BEFORE_STOP) && in ahci_stop_engine()
659 (ap->link.lpm_policy > ATA_LPM_MAX_POWER) && in ahci_stop_engine()
660 ahci_set_lpm(&ap->link, ATA_LPM_MAX_POWER, ATA_LPM_WAKE_ONLY)) { in ahci_stop_engine()
661 dev_err(ap->host->dev, "Failed to wake up port before engine stop\n"); in ahci_stop_engine()
662 return -EIO; in ahci_stop_engine()
677 dev_err(ap->host->dev, "AHCI controller unavailable!\n"); in ahci_stop_engine()
678 return -ENODEV; in ahci_stop_engine()
689 return -EIO; in ahci_stop_engine()
698 struct ahci_host_priv *hpriv = ap->host->private_data; in ahci_start_fis_rx()
699 struct ahci_port_priv *pp = ap->private_data; in ahci_start_fis_rx()
703 if (hpriv->cap & HOST_CAP_64) in ahci_start_fis_rx()
704 writel((pp->cmd_slot_dma >> 16) >> 16, in ahci_start_fis_rx()
706 writel(pp->cmd_slot_dma & 0xffffffff, port_mmio + PORT_LST_ADDR); in ahci_start_fis_rx()
708 if (hpriv->cap & HOST_CAP_64) in ahci_start_fis_rx()
709 writel((pp->rx_fis_dma >> 16) >> 16, in ahci_start_fis_rx()
711 writel(pp->rx_fis_dma & 0xffffffff, port_mmio + PORT_FIS_ADDR); in ahci_start_fis_rx()
737 return -EBUSY; in ahci_stop_fis_rx()
744 struct ahci_host_priv *hpriv = ap->host->private_data; in ahci_power_up()
751 if (hpriv->cap & HOST_CAP_SSS) { in ahci_power_up()
763 struct ata_port *ap = link->ap; in ahci_set_lpm()
764 struct ahci_host_priv *hpriv = ap->host->private_data; in ahci_set_lpm()
765 struct ahci_port_priv *pp = ap->private_data; in ahci_set_lpm()
777 pp->intr_mask &= ~PORT_IRQ_PHYRDY; in ahci_set_lpm()
778 writel(pp->intr_mask, port_mmio + PORT_IRQ_MASK); in ahci_set_lpm()
783 if (hpriv->cap & HOST_CAP_ALPM) { in ahci_set_lpm()
812 if ((hpriv->cap2 & HOST_CAP2_SDS) && in ahci_set_lpm()
813 (hpriv->cap2 & HOST_CAP2_SADM) && in ahci_set_lpm()
814 (link->device->flags & ATA_DFLAG_DEVSLP)) { in ahci_set_lpm()
826 pp->intr_mask |= PORT_IRQ_PHYRDY; in ahci_set_lpm()
827 writel(pp->intr_mask, port_mmio + PORT_IRQ_MASK); in ahci_set_lpm()
836 struct ahci_host_priv *hpriv = ap->host->private_data; in ahci_power_down()
840 if (!(hpriv->cap & HOST_CAP_SSS)) in ahci_power_down()
857 struct ahci_host_priv *hpriv = ap->host->private_data; in ahci_start_port()
858 struct ahci_port_priv *pp = ap->private_data; in ahci_start_port()
868 if (!(hpriv->flags & AHCI_HFLAG_DELAY_ENGINE)) in ahci_start_port()
869 hpriv->start_engine(ap); in ahci_start_port()
872 if (ap->flags & ATA_FLAG_EM) { in ahci_start_port()
874 emp = &pp->em_priv[link->pmp]; in ahci_start_port()
878 rc = ap->ops->transmit_led_message(ap, in ahci_start_port()
879 emp->led_state, in ahci_start_port()
889 if (rc == -EBUSY) in ahci_start_port()
897 if (ap->flags & ATA_FLAG_SW_ACTIVITY) in ahci_start_port()
906 struct ahci_host_priv *hpriv = ap->host->private_data; in ahci_deinit_port()
909 rc = hpriv->stop_engine(ap); in ahci_deinit_port()
927 struct ahci_host_priv *hpriv = host->private_data; in ahci_reset_controller()
928 void __iomem *mmio = hpriv->mmio; in ahci_reset_controller()
932 * AHCI-specific, such as HOST_RESET. in ahci_reset_controller()
954 dev_err(host->dev, "controller reset failed (0x%x)\n", in ahci_reset_controller()
956 return -EIO; in ahci_reset_controller()
965 if (!(hpriv->flags & AHCI_HFLAG_NO_WRITE_TO_RO)) in ahci_reset_controller()
968 dev_info(host->dev, "skipping global host reset\n"); in ahci_reset_controller()
976 struct ata_port *ap = link->ap; in ahci_sw_activity()
977 struct ahci_port_priv *pp = ap->private_data; in ahci_sw_activity()
978 struct ahci_em_priv *emp = &pp->em_priv[link->pmp]; in ahci_sw_activity()
980 if (!(link->flags & ATA_LFLAG_SW_ACTIVITY)) in ahci_sw_activity()
983 emp->activity++; in ahci_sw_activity()
984 if (!timer_pending(&emp->timer)) in ahci_sw_activity()
985 mod_timer(&emp->timer, jiffies + msecs_to_jiffies(10)); in ahci_sw_activity()
991 struct ata_link *link = emp->link; in ahci_sw_activity_blink()
992 struct ata_port *ap = link->ap; in ahci_sw_activity_blink()
994 unsigned long led_message = emp->led_state; in ahci_sw_activity_blink()
999 led_message |= ap->port_no | (link->pmp << 8); in ahci_sw_activity_blink()
1005 spin_lock_irqsave(ap->lock, flags); in ahci_sw_activity_blink()
1006 if (emp->saved_activity != emp->activity) { in ahci_sw_activity_blink()
1007 emp->saved_activity = emp->activity; in ahci_sw_activity_blink()
1021 mod_timer(&emp->timer, jiffies + msecs_to_jiffies(100)); in ahci_sw_activity_blink()
1025 if (emp->blink_policy == BLINK_OFF) in ahci_sw_activity_blink()
1028 spin_unlock_irqrestore(ap->lock, flags); in ahci_sw_activity_blink()
1029 ap->ops->transmit_led_message(ap, led_message, 4); in ahci_sw_activity_blink()
1034 struct ata_port *ap = link->ap; in ahci_init_sw_activity()
1035 struct ahci_port_priv *pp = ap->private_data; in ahci_init_sw_activity()
1036 struct ahci_em_priv *emp = &pp->em_priv[link->pmp]; in ahci_init_sw_activity()
1039 emp->saved_activity = emp->activity = 0; in ahci_init_sw_activity()
1040 emp->link = link; in ahci_init_sw_activity()
1041 timer_setup(&emp->timer, ahci_sw_activity_blink, 0); in ahci_init_sw_activity()
1044 if (emp->blink_policy) in ahci_init_sw_activity()
1045 link->flags |= ATA_LFLAG_SW_ACTIVITY; in ahci_init_sw_activity()
1050 struct ahci_host_priv *hpriv = host->private_data; in ahci_reset_em()
1051 void __iomem *mmio = hpriv->mmio; in ahci_reset_em()
1056 return -EINVAL; in ahci_reset_em()
1066 struct ahci_host_priv *hpriv = ap->host->private_data; in ahci_transmit_led_message()
1067 struct ahci_port_priv *pp = ap->private_data; in ahci_transmit_led_message()
1068 void __iomem *mmio = hpriv->mmio; in ahci_transmit_led_message()
1078 emp = &pp->em_priv[pmp]; in ahci_transmit_led_message()
1080 return -EINVAL; in ahci_transmit_led_message()
1083 spin_lock_irqsave(ap->lock, flags); in ahci_transmit_led_message()
1091 spin_unlock_irqrestore(ap->lock, flags); in ahci_transmit_led_message()
1093 return -EBUSY; in ahci_transmit_led_message()
1096 if (hpriv->em_msg_type & EM_MSG_TYPE_LED) { in ahci_transmit_led_message()
1098 * create message header - this is all zero except for in ahci_transmit_led_message()
1104 message[1] = ((state & ~EM_MSG_LED_HBA_PORT) | ap->port_no); in ahci_transmit_led_message()
1107 writel(message[0], mmio + hpriv->em_loc); in ahci_transmit_led_message()
1108 writel(message[1], mmio + hpriv->em_loc+4); in ahci_transmit_led_message()
1117 emp->led_state = state; in ahci_transmit_led_message()
1119 spin_unlock_irqrestore(ap->lock, flags); in ahci_transmit_led_message()
1127 struct ahci_port_priv *pp = ap->private_data; in ahci_led_show()
1133 emp = &pp->em_priv[link->pmp]; in ahci_led_show()
1134 rc += sprintf(buf, "%lx\n", emp->led_state); in ahci_led_show()
1144 struct ahci_port_priv *pp = ap->private_data; in ahci_led_store()
1148 return -EINVAL; in ahci_led_store()
1154 emp = &pp->em_priv[pmp]; in ahci_led_store()
1156 return -EINVAL; in ahci_led_store()
1163 if (emp->blink_policy) in ahci_led_store()
1166 return ap->ops->transmit_led_message(ap, state, size); in ahci_led_store()
1171 struct ata_link *link = dev->link; in ahci_activity_store()
1172 struct ata_port *ap = link->ap; in ahci_activity_store()
1173 struct ahci_port_priv *pp = ap->private_data; in ahci_activity_store()
1174 struct ahci_em_priv *emp = &pp->em_priv[link->pmp]; in ahci_activity_store()
1175 u32 port_led_state = emp->led_state; in ahci_activity_store()
1180 link->flags &= ~(ATA_LFLAG_SW_ACTIVITY); in ahci_activity_store()
1184 port_led_state |= (ap->port_no | (link->pmp << 8)); in ahci_activity_store()
1185 ap->ops->transmit_led_message(ap, port_led_state, 4); in ahci_activity_store()
1187 link->flags |= ATA_LFLAG_SW_ACTIVITY; in ahci_activity_store()
1191 port_led_state |= (ap->port_no | (link->pmp << 8)); in ahci_activity_store()
1193 ap->ops->transmit_led_message(ap, port_led_state, 4); in ahci_activity_store()
1196 emp->blink_policy = val; in ahci_activity_store()
1202 struct ata_link *link = dev->link; in ahci_activity_show()
1203 struct ata_port *ap = link->ap; in ahci_activity_show()
1204 struct ahci_port_priv *pp = ap->private_data; in ahci_activity_show()
1205 struct ahci_em_priv *emp = &pp->em_priv[link->pmp]; in ahci_activity_show()
1210 return sprintf(buf, "%d\n", emp->blink_policy); in ahci_activity_show()
1217 struct ahci_host_priv *hpriv = ap->host->private_data; in ahci_port_init()
1240 /* mark esata ports */ in ahci_port_init()
1242 if ((tmp & PORT_CMD_ESP) && (hpriv->cap & HOST_CAP_SXS)) in ahci_port_init()
1243 ap->pflags |= ATA_PFLAG_EXTERNAL; in ahci_port_init()
1248 struct ahci_host_priv *hpriv = host->private_data; in ahci_init_controller()
1249 void __iomem *mmio = hpriv->mmio; in ahci_init_controller()
1254 for (i = 0; i < host->n_ports; i++) { in ahci_init_controller()
1255 struct ata_port *ap = host->ports[i]; in ahci_init_controller()
1261 ahci_port_init(host->dev, ap, i, mmio, port_mmio); in ahci_init_controller()
1274 struct ahci_host_priv *hpriv = dev->link->ap->host->private_data; in ahci_dev_config()
1276 if (hpriv->flags & AHCI_HFLAG_SECT255) { in ahci_dev_config()
1277 dev->max_sectors = 255; in ahci_dev_config()
1304 cmd_tbl_dma = pp->cmd_tbl_dma + tag * AHCI_CMD_TBL_SZ; in ahci_fill_cmd_slot()
1306 pp->cmd_slot[tag].opts = cpu_to_le32(opts); in ahci_fill_cmd_slot()
1307 pp->cmd_slot[tag].status = 0; in ahci_fill_cmd_slot()
1308 pp->cmd_slot[tag].tbl_addr = cpu_to_le32(cmd_tbl_dma & 0xffffffff); in ahci_fill_cmd_slot()
1309 pp->cmd_slot[tag].tbl_addr_hi = cpu_to_le32((cmd_tbl_dma >> 16) >> 16); in ahci_fill_cmd_slot()
1316 struct ahci_host_priv *hpriv = ap->host->private_data; in ahci_kick_engine()
1322 rc = hpriv->stop_engine(ap); in ahci_kick_engine()
1327 * always do CLO if PMP is attached (AHCI-1.3 9.2) in ahci_kick_engine()
1335 if (!(hpriv->cap & HOST_CAP_CLO)) { in ahci_kick_engine()
1336 rc = -EOPNOTSUPP; in ahci_kick_engine()
1349 rc = -EIO; in ahci_kick_engine()
1353 hpriv->start_engine(ap); in ahci_kick_engine()
1363 struct ahci_port_priv *pp = ap->private_data; in ahci_exec_polled_cmd()
1365 u8 *fis = pp->cmd_tbl; in ahci_exec_polled_cmd()
1373 if (pp->fbs_enabled && pp->fbs_last_dev != pmp) { in ahci_exec_polled_cmd()
1378 pp->fbs_last_dev = pmp; in ahci_exec_polled_cmd()
1389 return -EBUSY; in ahci_exec_polled_cmd()
1401 struct ata_port *ap = link->ap; in ahci_do_softreset()
1402 struct ahci_host_priv *hpriv = ap->host->private_data; in ahci_do_softreset()
1403 struct ahci_port_priv *pp = ap->private_data; in ahci_do_softreset()
1412 /* prepare for SRST (AHCI-1.1 10.4.1) */ in ahci_do_softreset()
1414 if (rc && rc != -EOPNOTSUPP) in ahci_do_softreset()
1418 * According to AHCI-1.2 9.3.9: if FBS is enable, software shall in ahci_do_softreset()
1419 * clear PxFBS.EN to '0' prior to issuing software reset to devices in ahci_do_softreset()
1422 if (!ata_is_host_link(link) && pp->fbs_enabled) { in ahci_do_softreset()
1427 ata_tf_init(link->device, &tf); in ahci_do_softreset()
1433 msecs = jiffies_to_msecs(deadline - now); in ahci_do_softreset()
1438 rc = -EIO; in ahci_do_softreset()
1452 if (rc == -EBUSY && hpriv->flags & AHCI_HFLAG_SRST_TOUT_IS_OFFLINE) { in ahci_do_softreset()
1461 /* link occupied, -ENODEV too is an error */ in ahci_do_softreset()
1467 /* re-enable FBS if disabled before */ in ahci_do_softreset()
1481 void __iomem *port_mmio = ahci_port_base(link->ap); in ahci_check_ready()
1501 void __iomem *port_mmio = ahci_port_base(link->ap); in ahci_bad_pmp_check_ready()
1510 return -EIO; in ahci_bad_pmp_check_ready()
1518 struct ata_port *ap = link->ap; in ahci_pmp_retry_softreset()
1534 if (rc == -EIO) { in ahci_pmp_retry_softreset()
1551 const unsigned long *timing = sata_ehc_deb_timing(&link->eh_context); in ahci_do_hardreset()
1552 struct ata_port *ap = link->ap; in ahci_do_hardreset()
1553 struct ahci_port_priv *pp = ap->private_data; in ahci_do_hardreset()
1554 struct ahci_host_priv *hpriv = ap->host->private_data; in ahci_do_hardreset()
1555 u8 *d2h_fis = pp->rx_fis + RX_FIS_D2H_REG; in ahci_do_hardreset()
1561 hpriv->stop_engine(ap); in ahci_do_hardreset()
1564 ata_tf_init(link->device, &tf); in ahci_do_hardreset()
1571 hpriv->start_engine(ap); in ahci_do_hardreset()
1591 struct ata_port *ap = link->ap; in ahci_postreset()
1620 for_each_sg(qc->sg, sg, qc->n_elem, si) { in ahci_fill_sg()
1626 ahci_sg[si].flags_size = cpu_to_le32(sg_len - 1); in ahci_fill_sg()
1634 struct ata_port *ap = qc->ap; in ahci_pmp_qc_defer()
1635 struct ahci_port_priv *pp = ap->private_data; in ahci_pmp_qc_defer()
1637 if (!sata_pmp_attached(ap) || pp->fbs_enabled) in ahci_pmp_qc_defer()
1645 struct ata_port *ap = qc->ap; in ahci_qc_prep()
1646 struct ahci_port_priv *pp = ap->private_data; in ahci_qc_prep()
1647 int is_atapi = ata_is_atapi(qc->tf.protocol); in ahci_qc_prep()
1655 * a SATA Register - Host to Device command FIS. in ahci_qc_prep()
1657 cmd_tbl = pp->cmd_tbl + qc->hw_tag * AHCI_CMD_TBL_SZ; in ahci_qc_prep()
1659 ata_tf_to_fis(&qc->tf, qc->dev->link->pmp, 1, cmd_tbl); in ahci_qc_prep()
1662 memcpy(cmd_tbl + AHCI_CMD_TBL_CDB, qc->cdb, qc->dev->cdb_len); in ahci_qc_prep()
1666 if (qc->flags & ATA_QCFLAG_DMAMAP) in ahci_qc_prep()
1672 opts = cmd_fis_len | n_elem << 16 | (qc->dev->link->pmp << 12); in ahci_qc_prep()
1673 if (qc->tf.flags & ATA_TFLAG_WRITE) in ahci_qc_prep()
1678 ahci_fill_cmd_slot(pp, qc->hw_tag, opts); in ahci_qc_prep()
1685 struct ahci_port_priv *pp = ap->private_data; in ahci_fbs_dec_intr()
1691 BUG_ON(!pp->fbs_enabled); in ahci_fbs_dec_intr()
1698 while ((fbs & PORT_FBS_DEC) && retries--) { in ahci_fbs_dec_intr()
1704 dev_err(ap->host->dev, "failed to clear device error\n"); in ahci_fbs_dec_intr()
1709 struct ahci_host_priv *hpriv = ap->host->private_data; in ahci_error_intr()
1710 struct ahci_port_priv *pp = ap->private_data; in ahci_error_intr()
1711 struct ata_eh_info *host_ehi = &ap->link.eh_info; in ahci_error_intr()
1719 if (pp->fbs_enabled) { in ahci_error_intr()
1724 if ((fbs & PORT_FBS_SDE) && (pmp < ap->nr_pmp_links)) { in ahci_error_intr()
1725 link = &ap->pmp_link[pmp]; in ahci_error_intr()
1735 link = &ap->link; in ahci_error_intr()
1737 active_qc = ata_qc_from_tag(ap, link->active_tag); in ahci_error_intr()
1738 active_ehi = &link->eh_info; in ahci_error_intr()
1745 ahci_scr_read(&ap->link, SCR_ERROR, &serror); in ahci_error_intr()
1746 ahci_scr_write(&ap->link, SCR_ERROR, serror); in ahci_error_intr()
1747 host_ehi->serror |= serror; in ahci_error_intr()
1750 if (hpriv->flags & AHCI_HFLAG_IGN_IRQ_IF_ERR) in ahci_error_intr()
1759 active_qc->err_mask |= AC_ERR_DEV; in ahci_error_intr()
1761 active_ehi->err_mask |= AC_ERR_DEV; in ahci_error_intr()
1763 if (hpriv->flags & AHCI_HFLAG_IGN_SERR_INTERNAL) in ahci_error_intr()
1764 host_ehi->serror &= ~SERR_INTERNAL; in ahci_error_intr()
1768 u32 *unk = pp->rx_fis + RX_FIS_UNK; in ahci_error_intr()
1770 active_ehi->err_mask |= AC_ERR_HSM; in ahci_error_intr()
1771 active_ehi->action |= ATA_EH_RESET; in ahci_error_intr()
1778 active_ehi->err_mask |= AC_ERR_HSM; in ahci_error_intr()
1779 active_ehi->action |= ATA_EH_RESET; in ahci_error_intr()
1784 host_ehi->err_mask |= AC_ERR_HOST_BUS; in ahci_error_intr()
1785 host_ehi->action |= ATA_EH_RESET; in ahci_error_intr()
1791 active_ehi->err_mask |= AC_ERR_DEV; in ahci_error_intr()
1793 host_ehi->err_mask |= AC_ERR_ATA_BUS; in ahci_error_intr()
1794 host_ehi->action |= ATA_EH_RESET; in ahci_error_intr()
1821 struct ata_eh_info *ehi = &ap->link.eh_info; in ahci_handle_port_interrupt()
1822 struct ahci_port_priv *pp = ap->private_data; in ahci_handle_port_interrupt()
1823 struct ahci_host_priv *hpriv = ap->host->private_data; in ahci_handle_port_interrupt()
1824 int resetting = !!(ap->pflags & ATA_PFLAG_RESETTING); in ahci_handle_port_interrupt()
1832 if (sata_lpm_ignore_phy_events(&ap->link)) { in ahci_handle_port_interrupt()
1834 ahci_scr_write(&ap->link, SCR_ERROR, SERR_PHYRDY_CHG); in ahci_handle_port_interrupt()
1852 if (hpriv->cap & HOST_CAP_SNTF) in ahci_handle_port_interrupt()
1863 if (pp->fbs_enabled) in ahci_handle_port_interrupt()
1866 const __le32 *f = pp->rx_fis + RX_FIS_SDB; in ahci_handle_port_interrupt()
1874 /* pp->active_link is not reliable once FBS is enabled, both in ahci_handle_port_interrupt()
1876 * NCQ and non-NCQ commands may be in flight at the same time. in ahci_handle_port_interrupt()
1878 if (pp->fbs_enabled) { in ahci_handle_port_interrupt()
1879 if (ap->qc_active) { in ahci_handle_port_interrupt()
1884 /* pp->active_link is valid iff any command is in flight */ in ahci_handle_port_interrupt()
1885 if (ap->qc_active && pp->active_link->sactive) in ahci_handle_port_interrupt()
1896 ehi->err_mask |= AC_ERR_HSM; in ahci_handle_port_interrupt()
1897 ehi->action |= ATA_EH_RESET; in ahci_handle_port_interrupt()
1924 spin_lock(ap->lock); in ahci_multi_irqs_intr_hard()
1926 spin_unlock(ap->lock); in ahci_multi_irqs_intr_hard()
1937 for (i = 0; i < host->n_ports; i++) { in ahci_handle_port_intr()
1943 ap = host->ports[i]; in ahci_handle_port_intr()
1950 dev_warn(host->dev, in ahci_handle_port_intr()
1971 hpriv = host->private_data; in ahci_single_level_irq_intr()
1972 mmio = hpriv->mmio; in ahci_single_level_irq_intr()
1979 irq_masked = irq_stat & hpriv->port_map; in ahci_single_level_irq_intr()
1981 spin_lock(&host->lock); in ahci_single_level_irq_intr()
1996 spin_unlock(&host->lock); in ahci_single_level_irq_intr()
2005 struct ata_port *ap = qc->ap; in ahci_qc_issue()
2007 struct ahci_port_priv *pp = ap->private_data; in ahci_qc_issue()
2013 pp->active_link = qc->dev->link; in ahci_qc_issue()
2015 if (ata_is_ncq(qc->tf.protocol)) in ahci_qc_issue()
2016 writel(1 << qc->hw_tag, port_mmio + PORT_SCR_ACT); in ahci_qc_issue()
2018 if (pp->fbs_enabled && pp->fbs_last_dev != qc->dev->link->pmp) { in ahci_qc_issue()
2021 fbs |= qc->dev->link->pmp << PORT_FBS_DEV_OFFSET; in ahci_qc_issue()
2023 pp->fbs_last_dev = qc->dev->link->pmp; in ahci_qc_issue()
2026 writel(1 << qc->hw_tag, port_mmio + PORT_CMD_ISSUE); in ahci_qc_issue()
2028 ahci_sw_activity(qc->dev->link); in ahci_qc_issue()
2036 struct ahci_port_priv *pp = qc->ap->private_data; in ahci_qc_fill_rtf()
2037 u8 *rx_fis = pp->rx_fis; in ahci_qc_fill_rtf()
2039 if (pp->fbs_enabled) in ahci_qc_fill_rtf()
2040 rx_fis += qc->dev->link->pmp * AHCI_RX_FIS_SZ; in ahci_qc_fill_rtf()
2043 * After a successful execution of an ATA PIO data-in command, in ahci_qc_fill_rtf()
2048 if (qc->tf.protocol == ATA_PROT_PIO && qc->dma_dir == DMA_FROM_DEVICE && in ahci_qc_fill_rtf()
2049 !(qc->flags & ATA_QCFLAG_FAILED)) { in ahci_qc_fill_rtf()
2050 ata_tf_from_fis(rx_fis + RX_FIS_PIO_SETUP, &qc->result_tf); in ahci_qc_fill_rtf()
2051 qc->result_tf.command = (rx_fis + RX_FIS_PIO_SETUP)[15]; in ahci_qc_fill_rtf()
2053 ata_tf_from_fis(rx_fis + RX_FIS_D2H_REG, &qc->result_tf); in ahci_qc_fill_rtf()
2068 struct ahci_host_priv *hpriv = ap->host->private_data; in ahci_thaw()
2069 void __iomem *mmio = hpriv->mmio; in ahci_thaw()
2072 struct ahci_port_priv *pp = ap->private_data; in ahci_thaw()
2077 writel(1 << ap->port_no, mmio + HOST_IRQ_STAT); in ahci_thaw()
2080 writel(pp->intr_mask, port_mmio + PORT_IRQ_MASK); in ahci_thaw()
2085 struct ahci_host_priv *hpriv = ap->host->private_data; in ahci_error_handler()
2087 if (!(ap->pflags & ATA_PFLAG_FROZEN)) { in ahci_error_handler()
2089 hpriv->stop_engine(ap); in ahci_error_handler()
2090 hpriv->start_engine(ap); in ahci_error_handler()
2095 if (!ata_dev_enabled(ap->link.device)) in ahci_error_handler()
2096 hpriv->stop_engine(ap); in ahci_error_handler()
2102 struct ata_port *ap = qc->ap; in ahci_post_internal_cmd()
2105 if (qc->flags & ATA_QCFLAG_FAILED) in ahci_post_internal_cmd()
2111 struct ahci_host_priv *hpriv = ap->host->private_data; in ahci_set_aggressive_devslp()
2113 struct ata_device *dev = ap->link.device; in ahci_set_aggressive_devslp()
2120 dev_info(ap->host->dev, "port does not support device sleep\n"); in ahci_set_aggressive_devslp()
2150 rc = hpriv->stop_engine(ap); in ahci_set_aggressive_devslp()
2157 if (dev->devslp_timing[ATA_LOG_DEVSLP_VALID] & in ahci_set_aggressive_devslp()
2159 mdat = dev->devslp_timing[ATA_LOG_DEVSLP_MDAT] & in ahci_set_aggressive_devslp()
2163 deto = dev->devslp_timing[ATA_LOG_DEVSLP_DETO]; in ahci_set_aggressive_devslp()
2179 hpriv->start_engine(ap); in ahci_set_aggressive_devslp()
2191 struct ahci_host_priv *hpriv = ap->host->private_data; in ahci_enable_fbs()
2192 struct ahci_port_priv *pp = ap->private_data; in ahci_enable_fbs()
2197 if (!pp->fbs_supported) in ahci_enable_fbs()
2202 pp->fbs_enabled = true; in ahci_enable_fbs()
2203 pp->fbs_last_dev = -1; /* initialization */ in ahci_enable_fbs()
2207 rc = hpriv->stop_engine(ap); in ahci_enable_fbs()
2214 dev_info(ap->host->dev, "FBS is enabled\n"); in ahci_enable_fbs()
2215 pp->fbs_enabled = true; in ahci_enable_fbs()
2216 pp->fbs_last_dev = -1; /* initialization */ in ahci_enable_fbs()
2218 dev_err(ap->host->dev, "Failed to enable FBS\n"); in ahci_enable_fbs()
2220 hpriv->start_engine(ap); in ahci_enable_fbs()
2225 struct ahci_host_priv *hpriv = ap->host->private_data; in ahci_disable_fbs()
2226 struct ahci_port_priv *pp = ap->private_data; in ahci_disable_fbs()
2231 if (!pp->fbs_supported) in ahci_disable_fbs()
2236 pp->fbs_enabled = false; in ahci_disable_fbs()
2240 rc = hpriv->stop_engine(ap); in ahci_disable_fbs()
2247 dev_err(ap->host->dev, "Failed to disable FBS\n"); in ahci_disable_fbs()
2249 dev_info(ap->host->dev, "FBS is disabled\n"); in ahci_disable_fbs()
2250 pp->fbs_enabled = false; in ahci_disable_fbs()
2253 hpriv->start_engine(ap); in ahci_disable_fbs()
2259 struct ahci_port_priv *pp = ap->private_data; in ahci_pmp_attach()
2268 pp->intr_mask |= PORT_IRQ_BAD_PMP; in ahci_pmp_attach()
2272 * port is marked frozen, the value in pp->intr_mask will be in ahci_pmp_attach()
2278 if (!(ap->pflags & ATA_PFLAG_FROZEN)) in ahci_pmp_attach()
2279 writel(pp->intr_mask, port_mmio + PORT_IRQ_MASK); in ahci_pmp_attach()
2285 struct ahci_port_priv *pp = ap->private_data; in ahci_pmp_detach()
2294 pp->intr_mask &= ~PORT_IRQ_BAD_PMP; in ahci_pmp_detach()
2297 if (!(ap->pflags & ATA_PFLAG_FROZEN)) in ahci_pmp_detach()
2298 writel(pp->intr_mask, port_mmio + PORT_IRQ_MASK); in ahci_pmp_detach()
2338 struct ahci_host_priv *hpriv = ap->host->private_data; in ahci_port_start()
2339 struct device *dev = ap->host->dev; in ahci_port_start()
2347 return -ENOMEM; in ahci_port_start()
2349 if (ap->host->n_ports > 1) { in ahci_port_start()
2350 pp->irq_desc = devm_kzalloc(dev, 8, GFP_KERNEL); in ahci_port_start()
2351 if (!pp->irq_desc) { in ahci_port_start()
2353 return -ENOMEM; in ahci_port_start()
2355 snprintf(pp->irq_desc, 8, in ahci_port_start()
2356 "%s%d", dev_driver_string(dev), ap->port_no); in ahci_port_start()
2360 if ((hpriv->cap & HOST_CAP_FBS) && sata_pmp_supported(ap)) { in ahci_port_start()
2364 pp->fbs_supported = true; in ahci_port_start()
2365 else if (hpriv->flags & AHCI_HFLAG_YES_FBS) { in ahci_port_start()
2367 ap->port_no); in ahci_port_start()
2368 pp->fbs_supported = true; in ahci_port_start()
2371 ap->port_no); in ahci_port_start()
2374 if (pp->fbs_supported) { in ahci_port_start()
2384 return -ENOMEM; in ahci_port_start()
2388 * First item in chunk of DMA memory: 32-slot command table, in ahci_port_start()
2391 pp->cmd_slot = mem; in ahci_port_start()
2392 pp->cmd_slot_dma = mem_dma; in ahci_port_start()
2398 * Second item: Received-FIS area in ahci_port_start()
2400 pp->rx_fis = mem; in ahci_port_start()
2401 pp->rx_fis_dma = mem_dma; in ahci_port_start()
2408 * and its scatter-gather table in ahci_port_start()
2410 pp->cmd_tbl = mem; in ahci_port_start()
2411 pp->cmd_tbl_dma = mem_dma; in ahci_port_start()
2417 pp->intr_mask = DEF_PORT_IRQ; in ahci_port_start()
2420 * Switch to per-port locking in case each port has its own MSI vector. in ahci_port_start()
2422 if (hpriv->flags & AHCI_HFLAG_MULTI_MSI) { in ahci_port_start()
2423 spin_lock_init(&pp->lock); in ahci_port_start()
2424 ap->lock = &pp->lock; in ahci_port_start()
2427 ap->private_data = pp; in ahci_port_start()
2436 struct ahci_host_priv *hpriv = ap->host->private_data; in ahci_port_stop()
2437 void __iomem *host_mmio = hpriv->mmio; in ahci_port_stop()
2440 /* de-initialize port */ in ahci_port_stop()
2447 * re-enabling INTx. in ahci_port_stop()
2449 writel(1 << ap->port_no, host_mmio + HOST_IRQ_STAT); in ahci_port_stop()
2456 struct ahci_host_priv *hpriv = host->private_data; in ahci_print_info()
2460 vers = hpriv->version; in ahci_print_info()
2461 cap = hpriv->cap; in ahci_print_info()
2462 cap2 = hpriv->cap2; in ahci_print_info()
2463 impl = hpriv->port_map; in ahci_print_info()
2475 dev_info(host->dev, in ahci_print_info()
2491 dev_info(host->dev, in ahci_print_info()
2530 void __iomem *mmio = hpriv->mmio; in ahci_set_em_messages()
2534 if (!ahci_em_messages || !(hpriv->cap & HOST_CAP_EMS)) in ahci_set_em_messages()
2541 hpriv->em_loc = ((em_loc >> 16) * 4); in ahci_set_em_messages()
2542 hpriv->em_buf_sz = ((em_loc & 0xff) * 4); in ahci_set_em_messages()
2543 hpriv->em_msg_type = messages; in ahci_set_em_messages()
2544 pi->flags |= ATA_FLAG_EM; in ahci_set_em_messages()
2546 pi->flags |= ATA_FLAG_SW_ACTIVITY; in ahci_set_em_messages()
2554 struct ahci_host_priv *hpriv = host->private_data; in ahci_host_activate_multi_irqs()
2561 * Requests IRQs according to AHCI-1.1 when multiple MSIs were in ahci_host_activate_multi_irqs()
2564 for (i = 0; i < host->n_ports; i++) { in ahci_host_activate_multi_irqs()
2565 struct ahci_port_priv *pp = host->ports[i]->private_data; in ahci_host_activate_multi_irqs()
2566 int irq = hpriv->get_irq_vector(host, i); in ahci_host_activate_multi_irqs()
2574 rc = devm_request_irq(host->dev, irq, ahci_multi_irqs_intr_hard, in ahci_host_activate_multi_irqs()
2575 0, pp->irq_desc, host->ports[i]); in ahci_host_activate_multi_irqs()
2579 ata_port_desc(host->ports[i], "irq %d", irq); in ahci_host_activate_multi_irqs()
2586 * ahci_host_activate - start AHCI host, request IRQs and register it
2594 * 0 on success, -errno otherwise.
2598 struct ahci_host_priv *hpriv = host->private_data; in ahci_host_activate()
2599 int irq = hpriv->irq; in ahci_host_activate()
2602 if (hpriv->flags & AHCI_HFLAG_MULTI_MSI) { in ahci_host_activate()
2603 if (hpriv->irq_handler) in ahci_host_activate()
2604 dev_warn(host->dev, in ahci_host_activate()
2606 if (!hpriv->get_irq_vector) { in ahci_host_activate()
2607 dev_err(host->dev, in ahci_host_activate()
2608 "AHCI_HFLAG_MULTI_MSI requires ->get_irq_vector!\n"); in ahci_host_activate()
2609 return -EIO; in ahci_host_activate()
2614 rc = ata_host_activate(host, irq, hpriv->irq_handler, in ahci_host_activate()
2624 MODULE_DESCRIPTION("Common AHCI SATA low-level routines");