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()
551 qc->ap->link.active_tag = tag; in sata_dwc_isr()
557 sata_dwc_scr_read(&ap->link, SCR_ACTIVE, &sactive); in sata_dwc_isr()
558 tag_mask = (hsdev->sactive_issued | sactive) ^ sactive; in sata_dwc_isr()
561 if (hsdev->sactive_issued == 0 && tag_mask == 0) { in sata_dwc_isr()
562 if (ap->link.active_tag == ATA_TAG_POISON) in sata_dwc_isr()
565 tag = ap->link.active_tag; in sata_dwc_isr()
569 if (unlikely(!qc || (qc->tf.flags & ATA_TFLAG_POLLING))) { in sata_dwc_isr()
570 dev_err(ap->dev, in sata_dwc_isr()
573 ap->ops->sff_check_status(ap); in sata_dwc_isr()
577 status = ap->ops->sff_check_status(ap); in sata_dwc_isr()
579 qc->ap->link.active_tag = tag; in sata_dwc_isr()
580 hsdevp->cmd_issued[tag] = SATA_DWC_CMD_ISSUED_NOT; in sata_dwc_isr()
583 dev_dbg(ap->dev, "interrupt ATA_ERR (0x%x)\n", status); in sata_dwc_isr()
589 dev_dbg(ap->dev, "%s non-NCQ cmd interrupt, protocol: %s\n", in sata_dwc_isr()
590 __func__, get_prot_descript(qc->tf.protocol)); in sata_dwc_isr()
592 if (ata_is_dma(qc->tf.protocol)) { in sata_dwc_isr()
599 hsdevp->dma_interrupt_count++; in sata_dwc_isr()
600 if (hsdevp->dma_pending[tag] == \ in sata_dwc_isr()
602 dev_err(ap->dev, in sata_dwc_isr()
605 hsdevp->dma_pending[tag]); in sata_dwc_isr()
608 if ((hsdevp->dma_interrupt_count % 2) == 0) in sata_dwc_isr()
610 } else if (ata_is_pio(qc->tf.protocol)) { in sata_dwc_isr()
624 * This is a NCQ command. At this point we need to figure out for which in sata_dwc_isr()
625 * tags we have gotten a completion interrupt. One interrupt may serve in sata_dwc_isr()
631 sata_dwc_scr_read(&ap->link, SCR_ACTIVE, &sactive); in sata_dwc_isr()
632 tag_mask = (hsdev->sactive_issued | sactive) ^ sactive; in sata_dwc_isr()
634 if (sactive != 0 || hsdev->sactive_issued > 1 || tag_mask > 1) { in sata_dwc_isr()
635 dev_dbg(ap->dev, in sata_dwc_isr()
637 __func__, sactive, hsdev->sactive_issued, tag_mask); in sata_dwc_isr()
640 if ((tag_mask | hsdev->sactive_issued) != hsdev->sactive_issued) { in sata_dwc_isr()
641 dev_warn(ap->dev, in sata_dwc_isr()
643 sactive, hsdev->sactive_issued, tag_mask); in sata_dwc_isr()
647 status = ap->ops->sff_check_status(ap); in sata_dwc_isr()
648 dev_dbg(ap->dev, "%s ATA status register=0x%x\n", __func__, status); in sata_dwc_isr()
663 qc->ap->link.active_tag = tag; in sata_dwc_isr()
664 hsdevp->cmd_issued[tag] = SATA_DWC_CMD_ISSUED_NOT; in sata_dwc_isr()
668 dev_dbg(ap->dev, "%s ATA_ERR (0x%x)\n", __func__, in sata_dwc_isr()
676 dev_dbg(ap->dev, "%s NCQ command, protocol: %s\n", __func__, in sata_dwc_isr()
677 get_prot_descript(qc->tf.protocol)); in sata_dwc_isr()
678 if (ata_is_dma(qc->tf.protocol)) { in sata_dwc_isr()
679 hsdevp->dma_interrupt_count++; in sata_dwc_isr()
680 if (hsdevp->dma_pending[tag] == \ in sata_dwc_isr()
682 dev_warn(ap->dev, "%s: DMA not pending?\n", in sata_dwc_isr()
684 if ((hsdevp->dma_interrupt_count % 2) == 0) in sata_dwc_isr()
693 ap->stats.idle_irq++; in sata_dwc_isr()
694 dev_warn(ap->dev, "STILL BUSY IRQ ata%d: irq trap\n", in sata_dwc_isr()
695 ap->print_id); in sata_dwc_isr()
701 * so we might miss a completed command interrupt if one came in while in sata_dwc_isr()
702 * we were processing --we read status as part of processing a completed in sata_dwc_isr()
705 sata_dwc_scr_read(&ap->link, SCR_ACTIVE, &sactive2); in sata_dwc_isr()
707 dev_dbg(ap->dev, in sata_dwc_isr()
708 "More completed - sactive=0x%x sactive2=0x%x\n", in sata_dwc_isr()
714 spin_unlock_irqrestore(&host->lock, flags); in sata_dwc_isr()
721 u32 dmacr = sata_dwc_readl(&hsdev->sata_dwc_regs->dmacr); in sata_dwc_clear_dmacr()
723 if (hsdevp->dma_pending[tag] == SATA_DWC_DMA_PENDING_RX) { in sata_dwc_clear_dmacr()
725 sata_dwc_writel(&hsdev->sata_dwc_regs->dmacr, dmacr); in sata_dwc_clear_dmacr()
726 } else if (hsdevp->dma_pending[tag] == SATA_DWC_DMA_PENDING_TX) { in sata_dwc_clear_dmacr()
728 sata_dwc_writel(&hsdev->sata_dwc_regs->dmacr, dmacr); in sata_dwc_clear_dmacr()
734 dev_err(hsdev->dev, in sata_dwc_clear_dmacr()
736 __func__, tag, hsdevp->dma_pending[tag], dmacr); in sata_dwc_clear_dmacr()
737 sata_dwc_writel(&hsdev->sata_dwc_regs->dmacr, in sata_dwc_clear_dmacr()
749 tag = ap->link.active_tag; in sata_dwc_dma_xfer_complete()
752 dev_err(ap->dev, "failed to get qc"); in sata_dwc_dma_xfer_complete()
758 dev_info(ap->dev, in sata_dwc_dma_xfer_complete()
760 __func__, qc->hw_tag, qc->tf.command, in sata_dwc_dma_xfer_complete()
761 get_dma_dir_descript(qc->dma_dir), in sata_dwc_dma_xfer_complete()
762 get_prot_descript(qc->tf.protocol), in sata_dwc_dma_xfer_complete()
763 sata_dwc_readl(&hsdev->sata_dwc_regs->dmacr)); in sata_dwc_dma_xfer_complete()
767 if (ata_is_dma(qc->tf.protocol)) { in sata_dwc_dma_xfer_complete()
768 if (hsdevp->dma_pending[tag] == SATA_DWC_DMA_PENDING_NONE) { in sata_dwc_dma_xfer_complete()
769 dev_err(ap->dev, in sata_dwc_dma_xfer_complete()
772 sata_dwc_readl(&hsdev->sata_dwc_regs->dmacr)); in sata_dwc_dma_xfer_complete()
775 hsdevp->dma_pending[tag] = SATA_DWC_DMA_PENDING_NONE; in sata_dwc_dma_xfer_complete()
777 ap->link.active_tag = ATA_TAG_POISON; in sata_dwc_dma_xfer_complete()
788 u8 tag = qc->hw_tag; in sata_dwc_qc_complete()
791 hsdev->sactive_queued = 0; in sata_dwc_qc_complete()
792 dev_dbg(ap->dev, "%s checkstatus? %x\n", __func__, check_status); in sata_dwc_qc_complete()
794 if (hsdevp->dma_pending[tag] == SATA_DWC_DMA_PENDING_TX) in sata_dwc_qc_complete()
795 dev_err(ap->dev, "TX DMA PENDING\n"); in sata_dwc_qc_complete()
796 else if (hsdevp->dma_pending[tag] == SATA_DWC_DMA_PENDING_RX) in sata_dwc_qc_complete()
797 dev_err(ap->dev, "RX DMA PENDING\n"); in sata_dwc_qc_complete()
798 dev_dbg(ap->dev, in sata_dwc_qc_complete()
800 qc->tf.command, status, ap->print_id, qc->tf.protocol); in sata_dwc_qc_complete()
804 hsdev->sactive_queued = hsdev->sactive_queued & mask; in sata_dwc_qc_complete()
805 hsdev->sactive_issued = hsdev->sactive_issued & mask; in sata_dwc_qc_complete()
813 sata_dwc_writel(&hsdev->sata_dwc_regs->intmr, in sata_dwc_enable_interrupts()
822 sata_dwc_writel(&hsdev->sata_dwc_regs->errmr, SATA_DWC_SERROR_ERR_BITS); in sata_dwc_enable_interrupts()
824 dev_dbg(hsdev->dev, "%s: INTMR = 0x%08x, ERRMR = 0x%08x\n", in sata_dwc_enable_interrupts()
825 __func__, sata_dwc_readl(&hsdev->sata_dwc_regs->intmr), in sata_dwc_enable_interrupts()
826 sata_dwc_readl(&hsdev->sata_dwc_regs->errmr)); in sata_dwc_enable_interrupts()
831 port->cmd_addr = base + 0x00; in sata_dwc_setup_port()
832 port->data_addr = base + 0x00; in sata_dwc_setup_port()
834 port->error_addr = base + 0x04; in sata_dwc_setup_port()
835 port->feature_addr = base + 0x04; in sata_dwc_setup_port()
837 port->nsect_addr = base + 0x08; in sata_dwc_setup_port()
839 port->lbal_addr = base + 0x0c; in sata_dwc_setup_port()
840 port->lbam_addr = base + 0x10; in sata_dwc_setup_port()
841 port->lbah_addr = base + 0x14; in sata_dwc_setup_port()
843 port->device_addr = base + 0x18; in sata_dwc_setup_port()
844 port->command_addr = base + 0x1c; in sata_dwc_setup_port()
845 port->status_addr = base + 0x1c; in sata_dwc_setup_port()
847 port->altstatus_addr = base + 0x20; in sata_dwc_setup_port()
848 port->ctl_addr = base + 0x20; in sata_dwc_setup_port()
853 struct sata_dwc_device *hsdev = hsdevp->hsdev; in sata_dwc_dma_get_channel()
854 struct device *dev = hsdev->dev; in sata_dwc_dma_get_channel()
857 if (!of_find_property(dev->of_node, "dmas", NULL)) in sata_dwc_dma_get_channel()
861 hsdevp->chan = dma_request_chan(dev, "sata-dma"); in sata_dwc_dma_get_channel()
862 if (IS_ERR(hsdevp->chan)) { in sata_dwc_dma_get_channel()
864 PTR_ERR(hsdevp->chan)); in sata_dwc_dma_get_channel()
865 return PTR_ERR(hsdevp->chan); in sata_dwc_dma_get_channel()
887 dev_dbg(ap->dev, "%s: port_no=%d\n", __func__, ap->port_no); in sata_dwc_port_start()
889 hsdev->host = ap->host; in sata_dwc_port_start()
890 pdev = ap->host->dev; in sata_dwc_port_start()
892 dev_err(ap->dev, "%s: no ap->host->dev\n", __func__); in sata_dwc_port_start()
893 err = -ENODEV; in sata_dwc_port_start()
900 err = -ENOMEM; in sata_dwc_port_start()
903 hsdevp->hsdev = hsdev; in sata_dwc_port_start()
909 err = phy_power_on(hsdev->phy); in sata_dwc_port_start()
914 hsdevp->cmd_issued[i] = SATA_DWC_CMD_ISSUED_NOT; in sata_dwc_port_start()
916 ap->bmdma_prd = NULL; /* set these so libata doesn't use them */ in sata_dwc_port_start()
917 ap->bmdma_prd_dma = 0; in sata_dwc_port_start()
919 if (ap->port_no == 0) { in sata_dwc_port_start()
920 dev_dbg(ap->dev, "%s: clearing TXCHEN, RXCHEN in DMAC\n", in sata_dwc_port_start()
922 sata_dwc_writel(&hsdev->sata_dwc_regs->dmacr, in sata_dwc_port_start()
925 dev_dbg(ap->dev, "%s: setting burst size in DBTSR\n", in sata_dwc_port_start()
927 sata_dwc_writel(&hsdev->sata_dwc_regs->dbtsr, in sata_dwc_port_start()
934 ap->private_data = hsdevp; in sata_dwc_port_start()
935 dev_dbg(ap->dev, "%s: done\n", __func__); in sata_dwc_port_start()
941 dev_dbg(ap->dev, "%s: fail. ap->id = %d\n", __func__, ap->print_id); in sata_dwc_port_start()
950 dev_dbg(ap->dev, "%s: ap->id = %d\n", __func__, ap->print_id); in sata_dwc_port_stop()
952 dmaengine_terminate_sync(hsdevp->chan); in sata_dwc_port_stop()
953 dma_release_channel(hsdevp->chan); in sata_dwc_port_stop()
954 phy_power_off(hsdev->phy); in sata_dwc_port_stop()
957 ap->private_data = NULL; in sata_dwc_port_stop()
962 * arguments : ata_port *ap, ata_taskfile *tf, u8 tag, u32 cmd_issued
968 struct ata_taskfile *tf, in sata_dwc_exec_command_by_tag() argument
973 dev_dbg(ap->dev, "%s cmd(0x%02x): %s tag=%d\n", __func__, tf->command, in sata_dwc_exec_command_by_tag()
974 ata_get_cmd_descript(tf->command), tag); in sata_dwc_exec_command_by_tag()
976 hsdevp->cmd_issued[tag] = cmd_issued; in sata_dwc_exec_command_by_tag()
979 * Clear SError before executing a new command. in sata_dwc_exec_command_by_tag()
985 ata_sff_exec_command(ap, tf); in sata_dwc_exec_command_by_tag()
990 sata_dwc_exec_command_by_tag(qc->ap, &qc->tf, tag, in sata_dwc_bmdma_setup_by_tag()
996 u8 tag = qc->hw_tag; in sata_dwc_bmdma_setup()
998 if (ata_is_ncq(qc->tf.protocol)) { in sata_dwc_bmdma_setup()
999 dev_dbg(qc->ap->dev, "%s: ap->link.sactive=0x%08x tag=%d\n", in sata_dwc_bmdma_setup()
1000 __func__, qc->ap->link.sactive, tag); in sata_dwc_bmdma_setup()
1012 struct ata_port *ap = qc->ap; in sata_dwc_bmdma_start_by_tag()
1014 struct dma_async_tx_descriptor *desc = hsdevp->desc[tag]; in sata_dwc_bmdma_start_by_tag()
1015 int dir = qc->dma_dir; in sata_dwc_bmdma_start_by_tag()
1017 if (hsdevp->cmd_issued[tag] != SATA_DWC_CMD_ISSUED_NOT) { in sata_dwc_bmdma_start_by_tag()
1020 hsdevp->dma_pending[tag] = SATA_DWC_DMA_PENDING_TX; in sata_dwc_bmdma_start_by_tag()
1022 hsdevp->dma_pending[tag] = SATA_DWC_DMA_PENDING_RX; in sata_dwc_bmdma_start_by_tag()
1024 dev_err(ap->dev, in sata_dwc_bmdma_start_by_tag()
1026 __func__, hsdevp->cmd_issued[tag], tag); in sata_dwc_bmdma_start_by_tag()
1030 dev_dbg(ap->dev, in sata_dwc_bmdma_start_by_tag()
1032 __func__, qc, tag, qc->tf.command, in sata_dwc_bmdma_start_by_tag()
1033 get_dma_dir_descript(qc->dma_dir), start_dma); in sata_dwc_bmdma_start_by_tag()
1034 sata_dwc_tf_dump(ap, &qc->tf); in sata_dwc_bmdma_start_by_tag()
1037 sata_dwc_scr_read(&ap->link, SCR_ERROR, ®); in sata_dwc_bmdma_start_by_tag()
1039 dev_err(ap->dev, "%s: ****** SError=0x%08x ******\n", in sata_dwc_bmdma_start_by_tag()
1044 sata_dwc_writel(&hsdev->sata_dwc_regs->dmacr, in sata_dwc_bmdma_start_by_tag()
1047 sata_dwc_writel(&hsdev->sata_dwc_regs->dmacr, in sata_dwc_bmdma_start_by_tag()
1052 dma_async_issue_pending(hsdevp->chan); in sata_dwc_bmdma_start_by_tag()
1058 u8 tag = qc->hw_tag; in sata_dwc_bmdma_start()
1060 if (ata_is_ncq(qc->tf.protocol)) { in sata_dwc_bmdma_start()
1061 dev_dbg(qc->ap->dev, "%s: ap->link.sactive=0x%08x tag=%d\n", in sata_dwc_bmdma_start()
1062 __func__, qc->ap->link.sactive, tag); in sata_dwc_bmdma_start()
1066 dev_dbg(qc->ap->dev, "%s\n", __func__); in sata_dwc_bmdma_start()
1073 u8 tag = qc->hw_tag; in sata_dwc_qc_issue()
1074 struct ata_port *ap = qc->ap; in sata_dwc_qc_issue()
1078 if (qc->hw_tag > 0 || ap->link.sactive > 1) in sata_dwc_qc_issue()
1079 dev_info(ap->dev, in sata_dwc_qc_issue()
1081 __func__, ap->print_id, qc->tf.command, in sata_dwc_qc_issue()
1082 ata_get_cmd_descript(qc->tf.command), in sata_dwc_qc_issue()
1083 qc->hw_tag, get_prot_descript(qc->tf.protocol), in sata_dwc_qc_issue()
1084 ap->link.active_tag, ap->link.sactive); in sata_dwc_qc_issue()
1087 if (!ata_is_ncq(qc->tf.protocol)) in sata_dwc_qc_issue()
1090 if (ata_is_dma(qc->tf.protocol)) { in sata_dwc_qc_issue()
1091 hsdevp->desc[tag] = dma_dwc_xfer_setup(qc); in sata_dwc_qc_issue()
1092 if (!hsdevp->desc[tag]) in sata_dwc_qc_issue()
1095 hsdevp->desc[tag] = NULL; in sata_dwc_qc_issue()
1098 if (ata_is_ncq(qc->tf.protocol)) { in sata_dwc_qc_issue()
1099 sata_dwc_scr_read(&ap->link, SCR_ACTIVE, &sactive); in sata_dwc_qc_issue()
1101 sata_dwc_scr_write(&ap->link, SCR_ACTIVE, sactive); in sata_dwc_qc_issue()
1103 dev_dbg(qc->ap->dev, in sata_dwc_qc_issue()
1104 "%s: tag=%d ap->link.sactive = 0x%08x sactive=0x%08x\n", in sata_dwc_qc_issue()
1105 __func__, tag, qc->ap->link.sactive, sactive); in sata_dwc_qc_issue()
1107 ap->ops->sff_tf_load(ap, &qc->tf); in sata_dwc_qc_issue()
1108 sata_dwc_exec_command_by_tag(ap, &qc->tf, tag, in sata_dwc_qc_issue()
1124 struct sata_dwc_device *hsdev = HSDEV_FROM_AP(link->ap); in sata_dwc_hardreset()
1132 sata_dwc_writel(&hsdev->sata_dwc_regs->dmacr, in sata_dwc_hardreset()
1136 sata_dwc_writel(&hsdev->sata_dwc_regs->dbtsr, in sata_dwc_hardreset()
1149 * scsi mid-layer and libata interface structures
1154 * test-only: Currently this driver doesn't handle NCQ
1155 * correctly. We enable NCQ but set the queue depth to a
1156 * max of 1. This will get fixed in in a future release.
1161 * Make sure a LLI block is not created that will span 8K max FIS
1162 * boundary. If the block spans such a FIS boundary, there is a chance
1163 * that a DMA burst will cross that boundary -- this results in an
1209 struct device_node *np = ofdev->dev.of_node; in sata_dwc_probe()
1213 host = ata_host_alloc_pinfo(&ofdev->dev, ppi, SATA_DWC_MAX_PORTS); in sata_dwc_probe()
1214 hsdev = devm_kzalloc(&ofdev->dev, sizeof(*hsdev), GFP_KERNEL); in sata_dwc_probe()
1216 return -ENOMEM; in sata_dwc_probe()
1218 host->private_data = hsdev; in sata_dwc_probe()
1222 base = devm_ioremap_resource(&ofdev->dev, res); in sata_dwc_probe()
1225 dev_dbg(&ofdev->dev, "ioremap done for SATA register address\n"); in sata_dwc_probe()
1228 hsdev->sata_dwc_regs = base + SATA_DWC_REG_OFFSET; in sata_dwc_probe()
1229 hsdev->dmadr = res->start + SATA_DWC_REG_OFFSET + offsetof(struct sata_dwc_regs, dmadr); in sata_dwc_probe()
1232 host->ports[0]->ioaddr.cmd_addr = base; in sata_dwc_probe()
1233 host->ports[0]->ioaddr.scr_addr = base + SATA_DWC_SCR_OFFSET; in sata_dwc_probe()
1234 sata_dwc_setup_port(&host->ports[0]->ioaddr, base); in sata_dwc_probe()
1237 idr = sata_dwc_readl(&hsdev->sata_dwc_regs->idr); in sata_dwc_probe()
1238 versionr = sata_dwc_readl(&hsdev->sata_dwc_regs->versionr); in sata_dwc_probe()
1239 dev_notice(&ofdev->dev, "id %d, controller version %c.%c%c\n", in sata_dwc_probe()
1243 hsdev->dev = &ofdev->dev; in sata_dwc_probe()
1251 dev_err(&ofdev->dev, "no SATA DMA irq\n"); in sata_dwc_probe()
1252 err = -ENODEV; in sata_dwc_probe()
1264 hsdev->phy = devm_phy_optional_get(hsdev->dev, "sata-phy"); in sata_dwc_probe()
1265 if (IS_ERR(hsdev->phy)) { in sata_dwc_probe()
1266 err = PTR_ERR(hsdev->phy); in sata_dwc_probe()
1267 hsdev->phy = NULL; in sata_dwc_probe()
1271 err = phy_init(hsdev->phy); in sata_dwc_probe()
1278 * error_handler() to execute a dummy Softreset EH session in sata_dwc_probe()
1282 dev_err(&ofdev->dev, "failed to activate host"); in sata_dwc_probe()
1287 phy_exit(hsdev->phy); in sata_dwc_probe()
1293 struct device *dev = &ofdev->dev; in sata_dwc_remove()
1295 struct sata_dwc_device *hsdev = host->private_data; in sata_dwc_remove()
1299 phy_exit(hsdev->phy); in sata_dwc_remove()
1306 dev_dbg(&ofdev->dev, "done\n"); in sata_dwc_remove()
1311 { .compatible = "amcc,sata-460ex", },