Lines Matching refs:host
37 static int ahci_fill_sg(struct rt_ahci_host *host, int id, in ahci_fill_sg() argument
42 struct rt_ahci_port *port = &host->ports[id]; in ahci_fill_sg()
59 if (ahci_sg->addr_hi && !(host->cap & RT_AHCI_CAP_64)) in ahci_fill_sg()
74 static rt_err_t ahci_request_io(struct rt_ahci_host *host, int id, in ahci_request_io() argument
80 struct rt_ahci_port *port = &host->ports[id]; in ahci_request_io()
87 if ((sg_count = ahci_fill_sg(host, id, buffer, buffer_size)) <= 0) in ahci_request_io()
112 static rt_err_t ahci_scsi_cmd_rw(struct rt_ahci_host *host, int id, in ahci_scsi_cmd_rw() argument
117 struct rt_ahci_port *port = &host->ports[id]; in ahci_scsi_cmd_rw()
128 t_lba = rt_min_t(rt_size_t, host->max_blocks, size); in ahci_scsi_cmd_rw()
142 if ((err = ahci_request_io(host, id, fis, sizeof(fis), buffer, t_size, is_read))) in ahci_scsi_cmd_rw()
155 static rt_err_t ahci_scsi_synchronize_cache(struct rt_ahci_host *host, int id, in ahci_scsi_synchronize_cache() argument
160 struct rt_ahci_port *port = &host->ports[id]; in ahci_scsi_synchronize_cache()
192 static rt_err_t ahci_scsi_cmd_write_same(struct rt_ahci_host *host, int id, in ahci_scsi_cmd_write_same() argument
196 struct rt_ahci_port *port = &host->ports[id]; in ahci_scsi_cmd_write_same()
218 static rt_err_t ahci_scsi_cmd_read_capacity(struct rt_ahci_host *host, int id, in ahci_scsi_cmd_read_capacity() argument
221 struct rt_ahci_port *port = &host->ports[id]; in ahci_scsi_cmd_read_capacity()
234 static rt_err_t ahci_scsi_cmd_test_unit_ready(struct rt_ahci_host *host, int id) in ahci_scsi_cmd_test_unit_ready() argument
236 struct rt_ahci_port *port = &host->ports[id]; in ahci_scsi_cmd_test_unit_ready()
241 static rt_err_t ahci_scsi_cmd_inquiry(struct rt_ahci_host *host, int id, in ahci_scsi_cmd_inquiry() argument
247 struct rt_ahci_port *port = &host->ports[id]; in ahci_scsi_cmd_inquiry()
265 if ((err = ahci_request_io(host, id, fis, sizeof(fis), in ahci_scsi_cmd_inquiry()
297 struct rt_ahci_host *host; in ahci_scsi_transfer() local
299 host = rt_container_of(sdev->host, struct rt_ahci_host, parent); in ahci_scsi_transfer()
317 err = ahci_scsi_cmd_rw(host, sdev->id, in ahci_scsi_transfer()
329 err = ahci_scsi_cmd_rw(host, sdev->id, in ahci_scsi_transfer()
341 err = ahci_scsi_cmd_rw(host, sdev->id, in ahci_scsi_transfer()
353 err = ahci_scsi_cmd_rw(host, sdev->id, in ahci_scsi_transfer()
365 err = ahci_scsi_cmd_rw(host, sdev->id, in ahci_scsi_transfer()
377 err = ahci_scsi_cmd_rw(host, sdev->id, in ahci_scsi_transfer()
389 err = ahci_scsi_synchronize_cache(host, sdev->id, in ahci_scsi_transfer()
399 err = ahci_scsi_synchronize_cache(host, sdev->id, in ahci_scsi_transfer()
409 err = ahci_scsi_cmd_write_same(host, sdev->id, in ahci_scsi_transfer()
418 err = ahci_scsi_cmd_write_same(host, sdev->id, in ahci_scsi_transfer()
428 err = ahci_scsi_cmd_read_capacity(host, sdev->id, &last_block, &block_size); in ahci_scsi_transfer()
448 err = ahci_scsi_cmd_read_capacity(host, sdev->id, &last_block, &block_size); in ahci_scsi_transfer()
459 err = ahci_scsi_cmd_test_unit_ready(host, sdev->id); in ahci_scsi_transfer()
464 struct rt_ahci_port *port = &host->ports[sdev->id]; in ahci_scsi_transfer()
467 err = ahci_scsi_cmd_inquiry(host, sdev->id, in ahci_scsi_transfer()
515 struct rt_ahci_host *host = param; in ahci_isr() local
517 int_map = HWREG32(host->regs + RT_AHCI_HBA_INTS); in ahci_isr()
519 rt_bitmap_for_each_set_bit(&int_map, id, host->ports_nr) in ahci_isr()
521 port = &host->ports[id]; in ahci_isr()
527 if (host->ops->port_isr) in ahci_isr()
529 host->ops->port_isr(host, port, isr); in ahci_isr()
538 HWREG32(host->regs + RT_AHCI_HBA_INTS) = int_map; in ahci_isr()
541 rt_err_t rt_ahci_host_register(struct rt_ahci_host *host) in rt_ahci_host_register() argument
548 if (!host || !host->parent.dev || !host->ops) in rt_ahci_host_register()
553 host->max_blocks = host->max_blocks ? : 0x80; in rt_ahci_host_register()
559 value = HWREG32(host->regs + RT_AHCI_HBA_GHC); in rt_ahci_host_register()
563 HWREG32_FLUSH(host->regs + RT_AHCI_HBA_GHC, value | RT_AHCI_GHC_RESET); in rt_ahci_host_register()
570 if (!(HWREG32(host->regs + RT_AHCI_HBA_GHC) & RT_AHCI_GHC_RESET)) in rt_ahci_host_register()
585 HWREG32_FLUSH(host->regs + RT_AHCI_HBA_GHC, RT_AHCI_GHC_AHCI_EN); in rt_ahci_host_register()
587 host->cap = HWREG32(host->regs + RT_AHCI_HBA_CAP); in rt_ahci_host_register()
588 host->cap &= RT_AHCI_CAP_SPM | RT_AHCI_CAP_SSS | RT_AHCI_CAP_SIS; in rt_ahci_host_register()
589 HWREG32(host->regs + RT_AHCI_HBA_CAP) = host->cap; in rt_ahci_host_register()
590 host->cap = HWREG32(host->regs + RT_AHCI_HBA_CAP); in rt_ahci_host_register()
592 HWREG32_FLUSH(host->regs + RT_AHCI_HBA_PI, 0xf); in rt_ahci_host_register()
594 if (host->ops->host_init && (err = host->ops->host_init(host))) in rt_ahci_host_register()
599 host->ports_nr = (host->cap & RT_AHCI_CAP_NP) + 1; in rt_ahci_host_register()
600 host->ports_map = HWREG32(host->regs + RT_AHCI_HBA_PI); in rt_ahci_host_register()
603 rt_dm_dev_prop_read_u32(host->parent.dev, "ports-implemented", &host->ports_map); in rt_ahci_host_register()
605 for (int i = 0; i < host->ports_nr; ++i) in rt_ahci_host_register()
609 if (!(host->ports_map & RT_BIT(i))) in rt_ahci_host_register()
613 port = &host->ports[i]; in rt_ahci_host_register()
618 port->regs = host->regs + 0x100 + (i * 0x80); in rt_ahci_host_register()
635 if (host->ops->port_init && (err = host->ops->port_init(host, port))) in rt_ahci_host_register()
648 if (host->ops->port_link_up) in rt_ahci_host_register()
650 err = host->ops->port_link_up(host, port); in rt_ahci_host_register()
725 HWREG32(host->regs + RT_AHCI_HBA_INTS) = RT_BIT(i); in rt_ahci_host_register()
734 HWREG32(host->regs + RT_AHCI_HBA_GHC) |= RT_AHCI_GHC_IRQ_EN; in rt_ahci_host_register()
736 for (int i = 0; i < host->ports_nr; ++i) in rt_ahci_host_register()
741 struct rt_ahci_port *port = &host->ports[i]; in rt_ahci_host_register()
751 port->dma = rt_dma_alloc_coherent(host->parent.dev, in rt_ahci_host_register()
783 if (host->ops->port_dma_init && (err = host->ops->port_dma_init(host, port))) in rt_ahci_host_register()
808 rt_dma_free_coherent(host->parent.dev, RT_AHCI_DMA_SIZE, port->dma, in rt_ahci_host_register()
830 rt_dm_dev_get_name(host->parent.dev)); in rt_ahci_host_register()
832 rt_hw_interrupt_install(host->irq, ahci_isr, host, dev_name); in rt_ahci_host_register()
833 rt_hw_interrupt_umask(host->irq); in rt_ahci_host_register()
835 scsi = &host->parent; in rt_ahci_host_register()
837 scsi->max_id = host->ports_nr; in rt_ahci_host_register()
848 rt_hw_interrupt_mask(host->irq); in rt_ahci_host_register()
849 rt_pic_detach_irq(host->irq, host); in rt_ahci_host_register()
854 rt_err_t rt_ahci_host_unregister(struct rt_ahci_host *host) in rt_ahci_host_unregister() argument
859 if (!host) in rt_ahci_host_unregister()
864 scsi = &host->parent; in rt_ahci_host_unregister()
871 rt_hw_interrupt_mask(host->irq); in rt_ahci_host_unregister()
872 rt_pic_detach_irq(host->irq, host); in rt_ahci_host_unregister()
874 for (int i = 0; i < host->ports_nr; ++i) in rt_ahci_host_unregister()
876 struct rt_ahci_port *port = &host->ports[i]; in rt_ahci_host_unregister()
888 rt_dma_free_coherent(host->parent.dev, RT_AHCI_DMA_SIZE, port->dma, in rt_ahci_host_unregister()
893 HWREG32(host->regs + RT_AHCI_HBA_GHC) &= ~(RT_AHCI_GHC_AHCI_EN | RT_AHCI_GHC_IRQ_EN); in rt_ahci_host_unregister()