Lines Matching +full:tf +full:- +full:a

1 // SPDX-License-Identifier: GPL-2.0-or-later
47 #define DRV_NAME "sata-dwc"
50 #define sata_dwc_writel(a, v) writel_relaxed(v, a) argument
51 #define sata_dwc_readl(a) readl_relaxed(a) argument
136 struct ata_probe_ent *pe; /* ptr to probe-ent */
164 #define HSDEV_FROM_HOST(host) ((struct sata_dwc_device *)(host)->private_data)
165 #define HSDEV_FROM_AP(ap) ((struct sata_dwc_device *)(ap)->host->private_data)
166 #define HSDEVP_FROM_AP(ap) ((struct sata_dwc_device_port *)(ap)->private_data)
167 #define HSDEV_FROM_QC(qc) ((struct sata_dwc_device *)(qc)->ap->host->private_data)
168 #define HSDEV_FROM_HSDEVP(p) ((struct sata_dwc_device *)(p)->hsdev)
193 #include <linux/platform_data/dma-dw.h>
207 if (dws->dma_dev != chan->device->dev) in sata_dwc_dma_filter()
210 chan->private = dws; in sata_dwc_dma_filter()
216 struct sata_dwc_device *hsdev = hsdevp->hsdev; in sata_dwc_dma_get_channel_old()
220 dws->dma_dev = hsdev->dev; in sata_dwc_dma_get_channel_old()
226 hsdevp->chan = dma_request_channel(mask, sata_dwc_dma_filter, hsdevp); in sata_dwc_dma_get_channel_old()
227 if (!hsdevp->chan) { in sata_dwc_dma_get_channel_old()
228 dev_err(hsdev->dev, "%s: dma channel unavailable\n", in sata_dwc_dma_get_channel_old()
230 return -EAGAIN; in sata_dwc_dma_get_channel_old()
239 struct device_node *np = pdev->dev.of_node; in sata_dwc_dma_init_old()
242 hsdev->dma = devm_kzalloc(&pdev->dev, sizeof(*hsdev->dma), GFP_KERNEL); in sata_dwc_dma_init_old()
243 if (!hsdev->dma) in sata_dwc_dma_init_old()
244 return -ENOMEM; in sata_dwc_dma_init_old()
246 hsdev->dma->dev = &pdev->dev; in sata_dwc_dma_init_old()
247 hsdev->dma->id = pdev->id; in sata_dwc_dma_init_old()
250 hsdev->dma->irq = irq_of_parse_and_map(np, 1); in sata_dwc_dma_init_old()
251 if (hsdev->dma->irq == NO_IRQ) { in sata_dwc_dma_init_old()
252 dev_err(&pdev->dev, "no SATA DMA irq\n"); in sata_dwc_dma_init_old()
253 return -ENODEV; in sata_dwc_dma_init_old()
258 hsdev->dma->regs = devm_ioremap_resource(&pdev->dev, res); in sata_dwc_dma_init_old()
259 if (IS_ERR(hsdev->dma->regs)) in sata_dwc_dma_init_old()
260 return PTR_ERR(hsdev->dma->regs); in sata_dwc_dma_init_old()
263 return dw_dma_probe(hsdev->dma); in sata_dwc_dma_init_old()
268 if (!hsdev->dma) in sata_dwc_dma_exit_old()
271 dw_dma_remove(hsdev->dma); in sata_dwc_dma_exit_old()
314 static void sata_dwc_tf_dump(struct ata_port *ap, struct ata_taskfile *tf) in sata_dwc_tf_dump() argument
316 dev_vdbg(ap->dev, in sata_dwc_tf_dump()
318 tf->command, get_prot_descript(tf->protocol), tf->flags, in sata_dwc_tf_dump()
319 tf->device); in sata_dwc_tf_dump()
320 dev_vdbg(ap->dev, in sata_dwc_tf_dump()
322 tf->feature, tf->nsect, tf->lbal, tf->lbam, tf->lbah); in sata_dwc_tf_dump()
323 dev_vdbg(ap->dev, in sata_dwc_tf_dump()
325 tf->hob_feature, tf->hob_nsect, tf->hob_lbal, tf->hob_lbam, in sata_dwc_tf_dump()
326 tf->hob_lbah); in sata_dwc_tf_dump()
333 struct ata_host *host = (struct ata_host *)hsdev->host; in dma_dwc_xfer_done()
339 spin_lock_irqsave(&host->lock, flags); in dma_dwc_xfer_done()
340 ap = host->ports[port]; in dma_dwc_xfer_done()
342 tag = ap->link.active_tag; in dma_dwc_xfer_done()
349 hsdevp->dma_interrupt_count++; in dma_dwc_xfer_done()
352 if (hsdevp->dma_pending[tag] == SATA_DWC_DMA_PENDING_NONE) { in dma_dwc_xfer_done()
353 dev_err(ap->dev, "DMA not pending tag=0x%02x pending=%d\n", in dma_dwc_xfer_done()
354 tag, hsdevp->dma_pending[tag]); in dma_dwc_xfer_done()
357 if ((hsdevp->dma_interrupt_count % 2) == 0) in dma_dwc_xfer_done()
360 spin_unlock_irqrestore(&host->lock, flags); in dma_dwc_xfer_done()
365 struct ata_port *ap = qc->ap; in dma_dwc_xfer_setup()
371 if (qc->dma_dir == DMA_DEV_TO_MEM) { in dma_dwc_xfer_setup()
372 sconf.src_addr = hsdev->dmadr; in dma_dwc_xfer_setup()
375 sconf.dst_addr = hsdev->dmadr; in dma_dwc_xfer_setup()
379 sconf.direction = qc->dma_dir; in dma_dwc_xfer_setup()
385 dmaengine_slave_config(hsdevp->chan, &sconf); in dma_dwc_xfer_setup()
388 desc = dmaengine_prep_slave_sg(hsdevp->chan, qc->sg, qc->n_elem, in dma_dwc_xfer_setup()
389 qc->dma_dir, in dma_dwc_xfer_setup()
395 desc->callback = dma_dwc_xfer_done; in dma_dwc_xfer_setup()
396 desc->callback_param = hsdev; in dma_dwc_xfer_setup()
398 dev_dbg(hsdev->dev, "%s sg: 0x%p, count: %d addr: %pa\n", __func__, in dma_dwc_xfer_setup()
399 qc->sg, qc->n_elem, &hsdev->dmadr); in dma_dwc_xfer_setup()
407 dev_err(link->ap->dev, "%s: Incorrect SCR offset 0x%02x\n", in sata_dwc_scr_read()
409 return -EINVAL; in sata_dwc_scr_read()
412 *val = sata_dwc_readl(link->ap->ioaddr.scr_addr + (scr * 4)); in sata_dwc_scr_read()
413 dev_dbg(link->ap->dev, "%s: id=%d reg=%d val=0x%08x\n", __func__, in sata_dwc_scr_read()
414 link->ap->print_id, scr, *val); in sata_dwc_scr_read()
421 dev_dbg(link->ap->dev, "%s: id=%d reg=%d val=0x%08x\n", __func__, in sata_dwc_scr_write()
422 link->ap->print_id, scr, val); in sata_dwc_scr_write()
424 dev_err(link->ap->dev, "%s: Incorrect SCR offset 0x%02x\n", in sata_dwc_scr_write()
426 return -EINVAL; in sata_dwc_scr_write()
428 sata_dwc_writel(link->ap->ioaddr.scr_addr + (scr * 4), val); in sata_dwc_scr_write()
436 sata_dwc_scr_read(&ap->link, SCR_ERROR, &val); in clear_serror()
437 sata_dwc_scr_write(&ap->link, SCR_ERROR, val); in clear_serror()
442 sata_dwc_writel(&hsdev->sata_dwc_regs->intpr, in clear_interrupt_bit()
443 sata_dwc_readl(&hsdev->sata_dwc_regs->intpr)); in clear_interrupt_bit()
456 struct ata_eh_info *ehi = &ap->link.eh_info; in sata_dwc_error_intr()
464 sata_dwc_scr_read(&ap->link, SCR_ERROR, &serror); in sata_dwc_error_intr()
465 status = ap->ops->sff_check_status(ap); in sata_dwc_error_intr()
467 tag = ap->link.active_tag; in sata_dwc_error_intr()
469 dev_err(ap->dev, in sata_dwc_error_intr()
471 __func__, serror, intpr, status, hsdevp->dma_interrupt_count, in sata_dwc_error_intr()
472 hsdevp->dma_pending[tag], hsdevp->cmd_issued[tag]); in sata_dwc_error_intr()
484 ehi->serror |= serror; in sata_dwc_error_intr()
485 ehi->action |= action; in sata_dwc_error_intr()
489 qc->err_mask |= err_mask; in sata_dwc_error_intr()
491 ehi->err_mask |= err_mask; in sata_dwc_error_intr()
499 * Return value : irqreturn_t - status of IRQ
514 hsdev->sactive_issued = 0; in sata_dwc_isr()
516 spin_lock_irqsave(&host->lock, flags); in sata_dwc_isr()
519 intpr = sata_dwc_readl(&hsdev->sata_dwc_regs->intpr); in sata_dwc_isr()
521 ap = host->ports[port]; in sata_dwc_isr()
524 dev_dbg(ap->dev, "%s intpr=0x%08x active_tag=%d\n", __func__, intpr, in sata_dwc_isr()
525 ap->link.active_tag); in sata_dwc_isr()
538 tag = (u8)(sata_dwc_readl(&hsdev->sata_dwc_regs->fptagr)); in sata_dwc_isr()
539 dev_dbg(ap->dev, "%s: NEWFP tag=%d\n", __func__, tag); in sata_dwc_isr()
540 if (hsdevp->cmd_issued[tag] != SATA_DWC_CMD_ISSUED_PEND) in sata_dwc_isr()
541 dev_warn(ap->dev, "CMD tag=%d not pending?\n", tag); in sata_dwc_isr()
543 hsdev->sactive_issued |= qcmd_tag_to_mask(tag); in sata_dwc_isr()
547 dev_err(ap->dev, "failed to get qc"); in sata_dwc_isr()
556 qc->ap->link.active_tag = tag; in sata_dwc_isr()
562 sata_dwc_scr_read(&ap->link, SCR_ACTIVE, &sactive); in sata_dwc_isr()
563 tag_mask = (hsdev->sactive_issued | sactive) ^ sactive; in sata_dwc_isr()
566 if (hsdev->sactive_issued == 0 && tag_mask == 0) { in sata_dwc_isr()
567 if (ap->link.active_tag == ATA_TAG_POISON) in sata_dwc_isr()
570 tag = ap->link.active_tag; in sata_dwc_isr()
574 if (unlikely(!qc || (qc->tf.flags & ATA_TFLAG_POLLING))) { in sata_dwc_isr()
575 dev_err(ap->dev, in sata_dwc_isr()
578 ap->ops->sff_check_status(ap); in sata_dwc_isr()
582 status = ap->ops->sff_check_status(ap); in sata_dwc_isr()
584 qc->ap->link.active_tag = tag; in sata_dwc_isr()
585 hsdevp->cmd_issued[tag] = SATA_DWC_CMD_ISSUED_NOT; in sata_dwc_isr()
588 dev_dbg(ap->dev, "interrupt ATA_ERR (0x%x)\n", status); in sata_dwc_isr()
594 dev_dbg(ap->dev, "%s non-NCQ cmd interrupt, protocol: %s\n", in sata_dwc_isr()
595 __func__, get_prot_descript(qc->tf.protocol)); in sata_dwc_isr()
597 if (ata_is_dma(qc->tf.protocol)) { in sata_dwc_isr()
604 hsdevp->dma_interrupt_count++; in sata_dwc_isr()
605 if (hsdevp->dma_pending[tag] == \ in sata_dwc_isr()
607 dev_err(ap->dev, in sata_dwc_isr()
610 hsdevp->dma_pending[tag]); in sata_dwc_isr()
613 if ((hsdevp->dma_interrupt_count % 2) == 0) in sata_dwc_isr()
615 } else if (ata_is_pio(qc->tf.protocol)) { in sata_dwc_isr()
629 * This is a NCQ command. At this point we need to figure out for which in sata_dwc_isr()
630 * tags we have gotten a completion interrupt. One interrupt may serve in sata_dwc_isr()
636 sata_dwc_scr_read(&ap->link, SCR_ACTIVE, &sactive); in sata_dwc_isr()
637 tag_mask = (hsdev->sactive_issued | sactive) ^ sactive; in sata_dwc_isr()
639 if (sactive != 0 || hsdev->sactive_issued > 1 || tag_mask > 1) { in sata_dwc_isr()
640 dev_dbg(ap->dev, in sata_dwc_isr()
642 __func__, sactive, hsdev->sactive_issued, tag_mask); in sata_dwc_isr()
645 if ((tag_mask | hsdev->sactive_issued) != hsdev->sactive_issued) { in sata_dwc_isr()
646 dev_warn(ap->dev, in sata_dwc_isr()
648 sactive, hsdev->sactive_issued, tag_mask); in sata_dwc_isr()
652 status = ap->ops->sff_check_status(ap); in sata_dwc_isr()
653 dev_dbg(ap->dev, "%s ATA status register=0x%x\n", __func__, status); in sata_dwc_isr()
667 dev_err(ap->dev, "failed to get qc"); in sata_dwc_isr()
673 qc->ap->link.active_tag = tag; in sata_dwc_isr()
674 hsdevp->cmd_issued[tag] = SATA_DWC_CMD_ISSUED_NOT; in sata_dwc_isr()
678 dev_dbg(ap->dev, "%s ATA_ERR (0x%x)\n", __func__, in sata_dwc_isr()
686 dev_dbg(ap->dev, "%s NCQ command, protocol: %s\n", __func__, in sata_dwc_isr()
687 get_prot_descript(qc->tf.protocol)); in sata_dwc_isr()
688 if (ata_is_dma(qc->tf.protocol)) { in sata_dwc_isr()
689 hsdevp->dma_interrupt_count++; in sata_dwc_isr()
690 if (hsdevp->dma_pending[tag] == \ in sata_dwc_isr()
692 dev_warn(ap->dev, "%s: DMA not pending?\n", in sata_dwc_isr()
694 if ((hsdevp->dma_interrupt_count % 2) == 0) in sata_dwc_isr()
703 ap->stats.idle_irq++; in sata_dwc_isr()
704 dev_warn(ap->dev, "STILL BUSY IRQ ata%d: irq trap\n", in sata_dwc_isr()
705 ap->print_id); in sata_dwc_isr()
711 * so we might miss a completed command interrupt if one came in while in sata_dwc_isr()
712 * we were processing --we read status as part of processing a completed in sata_dwc_isr()
715 sata_dwc_scr_read(&ap->link, SCR_ACTIVE, &sactive2); in sata_dwc_isr()
717 dev_dbg(ap->dev, in sata_dwc_isr()
718 "More completed - sactive=0x%x sactive2=0x%x\n", in sata_dwc_isr()
724 spin_unlock_irqrestore(&host->lock, flags); in sata_dwc_isr()
731 u32 dmacr = sata_dwc_readl(&hsdev->sata_dwc_regs->dmacr); in sata_dwc_clear_dmacr()
733 if (hsdevp->dma_pending[tag] == SATA_DWC_DMA_PENDING_RX) { in sata_dwc_clear_dmacr()
735 sata_dwc_writel(&hsdev->sata_dwc_regs->dmacr, dmacr); in sata_dwc_clear_dmacr()
736 } else if (hsdevp->dma_pending[tag] == SATA_DWC_DMA_PENDING_TX) { in sata_dwc_clear_dmacr()
738 sata_dwc_writel(&hsdev->sata_dwc_regs->dmacr, dmacr); in sata_dwc_clear_dmacr()
744 dev_err(hsdev->dev, in sata_dwc_clear_dmacr()
746 __func__, tag, hsdevp->dma_pending[tag], dmacr); in sata_dwc_clear_dmacr()
747 sata_dwc_writel(&hsdev->sata_dwc_regs->dmacr, in sata_dwc_clear_dmacr()
759 tag = ap->link.active_tag; in sata_dwc_dma_xfer_complete()
762 dev_err(ap->dev, "failed to get qc"); in sata_dwc_dma_xfer_complete()
768 dev_info(ap->dev, in sata_dwc_dma_xfer_complete()
770 __func__, qc->hw_tag, qc->tf.command, in sata_dwc_dma_xfer_complete()
771 get_dma_dir_descript(qc->dma_dir), in sata_dwc_dma_xfer_complete()
772 get_prot_descript(qc->tf.protocol), in sata_dwc_dma_xfer_complete()
773 sata_dwc_readl(&hsdev->sata_dwc_regs->dmacr)); in sata_dwc_dma_xfer_complete()
777 if (ata_is_dma(qc->tf.protocol)) { in sata_dwc_dma_xfer_complete()
778 if (hsdevp->dma_pending[tag] == SATA_DWC_DMA_PENDING_NONE) { in sata_dwc_dma_xfer_complete()
779 dev_err(ap->dev, in sata_dwc_dma_xfer_complete()
782 sata_dwc_readl(&hsdev->sata_dwc_regs->dmacr)); in sata_dwc_dma_xfer_complete()
785 hsdevp->dma_pending[tag] = SATA_DWC_DMA_PENDING_NONE; in sata_dwc_dma_xfer_complete()
787 ap->link.active_tag = ATA_TAG_POISON; in sata_dwc_dma_xfer_complete()
798 u8 tag = qc->hw_tag; in sata_dwc_qc_complete()
801 hsdev->sactive_queued = 0; in sata_dwc_qc_complete()
802 dev_dbg(ap->dev, "%s checkstatus? %x\n", __func__, check_status); in sata_dwc_qc_complete()
804 if (hsdevp->dma_pending[tag] == SATA_DWC_DMA_PENDING_TX) in sata_dwc_qc_complete()
805 dev_err(ap->dev, "TX DMA PENDING\n"); in sata_dwc_qc_complete()
806 else if (hsdevp->dma_pending[tag] == SATA_DWC_DMA_PENDING_RX) in sata_dwc_qc_complete()
807 dev_err(ap->dev, "RX DMA PENDING\n"); in sata_dwc_qc_complete()
808 dev_dbg(ap->dev, in sata_dwc_qc_complete()
810 qc->tf.command, status, ap->print_id, qc->tf.protocol); in sata_dwc_qc_complete()
814 hsdev->sactive_queued = hsdev->sactive_queued & mask; in sata_dwc_qc_complete()
815 hsdev->sactive_issued = hsdev->sactive_issued & mask; in sata_dwc_qc_complete()
823 sata_dwc_writel(&hsdev->sata_dwc_regs->intmr, in sata_dwc_enable_interrupts()
832 sata_dwc_writel(&hsdev->sata_dwc_regs->errmr, SATA_DWC_SERROR_ERR_BITS); in sata_dwc_enable_interrupts()
834 dev_dbg(hsdev->dev, "%s: INTMR = 0x%08x, ERRMR = 0x%08x\n", in sata_dwc_enable_interrupts()
835 __func__, sata_dwc_readl(&hsdev->sata_dwc_regs->intmr), in sata_dwc_enable_interrupts()
836 sata_dwc_readl(&hsdev->sata_dwc_regs->errmr)); in sata_dwc_enable_interrupts()
841 port->cmd_addr = base + 0x00; in sata_dwc_setup_port()
842 port->data_addr = base + 0x00; in sata_dwc_setup_port()
844 port->error_addr = base + 0x04; in sata_dwc_setup_port()
845 port->feature_addr = base + 0x04; in sata_dwc_setup_port()
847 port->nsect_addr = base + 0x08; in sata_dwc_setup_port()
849 port->lbal_addr = base + 0x0c; in sata_dwc_setup_port()
850 port->lbam_addr = base + 0x10; in sata_dwc_setup_port()
851 port->lbah_addr = base + 0x14; in sata_dwc_setup_port()
853 port->device_addr = base + 0x18; in sata_dwc_setup_port()
854 port->command_addr = base + 0x1c; in sata_dwc_setup_port()
855 port->status_addr = base + 0x1c; in sata_dwc_setup_port()
857 port->altstatus_addr = base + 0x20; in sata_dwc_setup_port()
858 port->ctl_addr = base + 0x20; in sata_dwc_setup_port()
863 struct sata_dwc_device *hsdev = hsdevp->hsdev; in sata_dwc_dma_get_channel()
864 struct device *dev = hsdev->dev; in sata_dwc_dma_get_channel()
867 if (!of_find_property(dev->of_node, "dmas", NULL)) in sata_dwc_dma_get_channel()
871 hsdevp->chan = dma_request_chan(dev, "sata-dma"); in sata_dwc_dma_get_channel()
872 if (IS_ERR(hsdevp->chan)) { in sata_dwc_dma_get_channel()
874 PTR_ERR(hsdevp->chan)); in sata_dwc_dma_get_channel()
875 return PTR_ERR(hsdevp->chan); in sata_dwc_dma_get_channel()
897 dev_dbg(ap->dev, "%s: port_no=%d\n", __func__, ap->port_no); in sata_dwc_port_start()
899 hsdev->host = ap->host; in sata_dwc_port_start()
900 pdev = ap->host->dev; in sata_dwc_port_start()
902 dev_err(ap->dev, "%s: no ap->host->dev\n", __func__); in sata_dwc_port_start()
903 err = -ENODEV; in sata_dwc_port_start()
910 err = -ENOMEM; in sata_dwc_port_start()
913 hsdevp->hsdev = hsdev; in sata_dwc_port_start()
919 err = phy_power_on(hsdev->phy); in sata_dwc_port_start()
924 hsdevp->cmd_issued[i] = SATA_DWC_CMD_ISSUED_NOT; in sata_dwc_port_start()
926 ap->bmdma_prd = NULL; /* set these so libata doesn't use them */ in sata_dwc_port_start()
927 ap->bmdma_prd_dma = 0; in sata_dwc_port_start()
929 if (ap->port_no == 0) { in sata_dwc_port_start()
930 dev_dbg(ap->dev, "%s: clearing TXCHEN, RXCHEN in DMAC\n", in sata_dwc_port_start()
932 sata_dwc_writel(&hsdev->sata_dwc_regs->dmacr, in sata_dwc_port_start()
935 dev_dbg(ap->dev, "%s: setting burst size in DBTSR\n", in sata_dwc_port_start()
937 sata_dwc_writel(&hsdev->sata_dwc_regs->dbtsr, in sata_dwc_port_start()
944 ap->private_data = hsdevp; in sata_dwc_port_start()
945 dev_dbg(ap->dev, "%s: done\n", __func__); in sata_dwc_port_start()
951 dev_dbg(ap->dev, "%s: fail. ap->id = %d\n", __func__, ap->print_id); in sata_dwc_port_start()
960 dev_dbg(ap->dev, "%s: ap->id = %d\n", __func__, ap->print_id); in sata_dwc_port_stop()
962 dmaengine_terminate_sync(hsdevp->chan); in sata_dwc_port_stop()
963 dma_release_channel(hsdevp->chan); in sata_dwc_port_stop()
964 phy_power_off(hsdev->phy); in sata_dwc_port_stop()
967 ap->private_data = NULL; in sata_dwc_port_stop()
972 * arguments : ata_port *ap, ata_taskfile *tf, u8 tag, u32 cmd_issued
978 struct ata_taskfile *tf, in sata_dwc_exec_command_by_tag() argument
983 dev_dbg(ap->dev, "%s cmd(0x%02x): %s tag=%d\n", __func__, tf->command, in sata_dwc_exec_command_by_tag()
984 ata_get_cmd_descript(tf->command), tag); in sata_dwc_exec_command_by_tag()
986 hsdevp->cmd_issued[tag] = cmd_issued; in sata_dwc_exec_command_by_tag()
989 * Clear SError before executing a new command. in sata_dwc_exec_command_by_tag()
995 ata_sff_exec_command(ap, tf); in sata_dwc_exec_command_by_tag()
1000 sata_dwc_exec_command_by_tag(qc->ap, &qc->tf, tag, in sata_dwc_bmdma_setup_by_tag()
1006 u8 tag = qc->hw_tag; in sata_dwc_bmdma_setup()
1008 if (ata_is_ncq(qc->tf.protocol)) { in sata_dwc_bmdma_setup()
1009 dev_dbg(qc->ap->dev, "%s: ap->link.sactive=0x%08x tag=%d\n", in sata_dwc_bmdma_setup()
1010 __func__, qc->ap->link.sactive, tag); in sata_dwc_bmdma_setup()
1022 struct ata_port *ap = qc->ap; in sata_dwc_bmdma_start_by_tag()
1024 struct dma_async_tx_descriptor *desc = hsdevp->desc[tag]; in sata_dwc_bmdma_start_by_tag()
1025 int dir = qc->dma_dir; in sata_dwc_bmdma_start_by_tag()
1027 if (hsdevp->cmd_issued[tag] != SATA_DWC_CMD_ISSUED_NOT) { in sata_dwc_bmdma_start_by_tag()
1030 hsdevp->dma_pending[tag] = SATA_DWC_DMA_PENDING_TX; in sata_dwc_bmdma_start_by_tag()
1032 hsdevp->dma_pending[tag] = SATA_DWC_DMA_PENDING_RX; in sata_dwc_bmdma_start_by_tag()
1034 dev_err(ap->dev, in sata_dwc_bmdma_start_by_tag()
1036 __func__, hsdevp->cmd_issued[tag], tag); in sata_dwc_bmdma_start_by_tag()
1040 dev_dbg(ap->dev, in sata_dwc_bmdma_start_by_tag()
1042 __func__, qc, tag, qc->tf.command, in sata_dwc_bmdma_start_by_tag()
1043 get_dma_dir_descript(qc->dma_dir), start_dma); in sata_dwc_bmdma_start_by_tag()
1044 sata_dwc_tf_dump(ap, &qc->tf); in sata_dwc_bmdma_start_by_tag()
1047 sata_dwc_scr_read(&ap->link, SCR_ERROR, &reg); in sata_dwc_bmdma_start_by_tag()
1049 dev_err(ap->dev, "%s: ****** SError=0x%08x ******\n", in sata_dwc_bmdma_start_by_tag()
1054 sata_dwc_writel(&hsdev->sata_dwc_regs->dmacr, in sata_dwc_bmdma_start_by_tag()
1057 sata_dwc_writel(&hsdev->sata_dwc_regs->dmacr, in sata_dwc_bmdma_start_by_tag()
1062 dma_async_issue_pending(hsdevp->chan); in sata_dwc_bmdma_start_by_tag()
1068 u8 tag = qc->hw_tag; in sata_dwc_bmdma_start()
1070 if (ata_is_ncq(qc->tf.protocol)) { in sata_dwc_bmdma_start()
1071 dev_dbg(qc->ap->dev, "%s: ap->link.sactive=0x%08x tag=%d\n", in sata_dwc_bmdma_start()
1072 __func__, qc->ap->link.sactive, tag); in sata_dwc_bmdma_start()
1076 dev_dbg(qc->ap->dev, "%s\n", __func__); in sata_dwc_bmdma_start()
1083 u8 tag = qc->hw_tag; in sata_dwc_qc_issue()
1084 struct ata_port *ap = qc->ap; in sata_dwc_qc_issue()
1088 if (qc->hw_tag > 0 || ap->link.sactive > 1) in sata_dwc_qc_issue()
1089 dev_info(ap->dev, in sata_dwc_qc_issue()
1091 __func__, ap->print_id, qc->tf.command, in sata_dwc_qc_issue()
1092 ata_get_cmd_descript(qc->tf.command), in sata_dwc_qc_issue()
1093 qc->hw_tag, get_prot_descript(qc->tf.protocol), in sata_dwc_qc_issue()
1094 ap->link.active_tag, ap->link.sactive); in sata_dwc_qc_issue()
1097 if (!ata_is_ncq(qc->tf.protocol)) in sata_dwc_qc_issue()
1100 if (ata_is_dma(qc->tf.protocol)) { in sata_dwc_qc_issue()
1101 hsdevp->desc[tag] = dma_dwc_xfer_setup(qc); in sata_dwc_qc_issue()
1102 if (!hsdevp->desc[tag]) in sata_dwc_qc_issue()
1105 hsdevp->desc[tag] = NULL; in sata_dwc_qc_issue()
1108 if (ata_is_ncq(qc->tf.protocol)) { in sata_dwc_qc_issue()
1109 sata_dwc_scr_read(&ap->link, SCR_ACTIVE, &sactive); in sata_dwc_qc_issue()
1111 sata_dwc_scr_write(&ap->link, SCR_ACTIVE, sactive); in sata_dwc_qc_issue()
1113 dev_dbg(qc->ap->dev, in sata_dwc_qc_issue()
1114 "%s: tag=%d ap->link.sactive = 0x%08x sactive=0x%08x\n", in sata_dwc_qc_issue()
1115 __func__, tag, qc->ap->link.sactive, sactive); in sata_dwc_qc_issue()
1117 ap->ops->sff_tf_load(ap, &qc->tf); in sata_dwc_qc_issue()
1118 sata_dwc_exec_command_by_tag(ap, &qc->tf, tag, in sata_dwc_qc_issue()
1134 struct sata_dwc_device *hsdev = HSDEV_FROM_AP(link->ap); in sata_dwc_hardreset()
1142 sata_dwc_writel(&hsdev->sata_dwc_regs->dmacr, in sata_dwc_hardreset()
1146 sata_dwc_writel(&hsdev->sata_dwc_regs->dbtsr, in sata_dwc_hardreset()
1159 * scsi mid-layer and libata interface structures
1164 * test-only: Currently this driver doesn't handle NCQ
1165 * correctly. We enable NCQ but set the queue depth to a
1166 * max of 1. This will get fixed in in a future release.
1171 * Make sure a LLI block is not created that will span 8K max FIS
1172 * boundary. If the block spans such a FIS boundary, there is a chance
1173 * that a DMA burst will cross that boundary -- this results in an
1219 struct device_node *np = ofdev->dev.of_node; in sata_dwc_probe()
1223 host = ata_host_alloc_pinfo(&ofdev->dev, ppi, SATA_DWC_MAX_PORTS); in sata_dwc_probe()
1224 hsdev = devm_kzalloc(&ofdev->dev, sizeof(*hsdev), GFP_KERNEL); in sata_dwc_probe()
1226 return -ENOMEM; in sata_dwc_probe()
1228 host->private_data = hsdev; in sata_dwc_probe()
1232 base = devm_ioremap_resource(&ofdev->dev, res); in sata_dwc_probe()
1235 dev_dbg(&ofdev->dev, "ioremap done for SATA register address\n"); in sata_dwc_probe()
1238 hsdev->sata_dwc_regs = base + SATA_DWC_REG_OFFSET; in sata_dwc_probe()
1239 hsdev->dmadr = res->start + SATA_DWC_REG_OFFSET + offsetof(struct sata_dwc_regs, dmadr); in sata_dwc_probe()
1242 host->ports[0]->ioaddr.cmd_addr = base; in sata_dwc_probe()
1243 host->ports[0]->ioaddr.scr_addr = base + SATA_DWC_SCR_OFFSET; in sata_dwc_probe()
1244 sata_dwc_setup_port(&host->ports[0]->ioaddr, base); in sata_dwc_probe()
1247 idr = sata_dwc_readl(&hsdev->sata_dwc_regs->idr); in sata_dwc_probe()
1248 versionr = sata_dwc_readl(&hsdev->sata_dwc_regs->versionr); in sata_dwc_probe()
1249 dev_notice(&ofdev->dev, "id %d, controller version %c.%c%c\n", in sata_dwc_probe()
1253 hsdev->dev = &ofdev->dev; in sata_dwc_probe()
1261 dev_err(&ofdev->dev, "no SATA DMA irq\n"); in sata_dwc_probe()
1262 return -ENODEV; in sata_dwc_probe()
1273 hsdev->phy = devm_phy_optional_get(hsdev->dev, "sata-phy"); in sata_dwc_probe()
1274 if (IS_ERR(hsdev->phy)) in sata_dwc_probe()
1275 return PTR_ERR(hsdev->phy); in sata_dwc_probe()
1277 err = phy_init(hsdev->phy); in sata_dwc_probe()
1284 * error_handler() to execute a dummy Softreset EH session in sata_dwc_probe()
1288 dev_err(&ofdev->dev, "failed to activate host"); in sata_dwc_probe()
1293 phy_exit(hsdev->phy); in sata_dwc_probe()
1299 struct device *dev = &ofdev->dev; in sata_dwc_remove()
1301 struct sata_dwc_device *hsdev = host->private_data; in sata_dwc_remove()
1305 phy_exit(hsdev->phy); in sata_dwc_remove()
1312 dev_dbg(&ofdev->dev, "done\n"); in sata_dwc_remove()
1317 { .compatible = "amcc,sata-460ex", },