scatter


static void dw_mci_write_data_pio(struct dw_mci *host)
{
    struct sg_mapping_iter *sg_miter = &host->sg_miter;
    void *buf;
    unsigned int offset;
    struct mmc_data *data = host->data;
    int shift = host->data_shift;
    u32 status;
    unsigned int len;
    unsigned int fifo_depth = host->fifo_depth;
    unsigned int remain, fcnt;
    printk("[=============== enter %s==============]\n", __func__);

    if(!host->mmc->bus_refs){
        printk("Note: %s host->mmc->bus_refs is 0!!!\n", __func__);
        goto host_put;
    }

    do {
        if (!sg_miter_next(sg_miter)) {
            printk("[=============== do complete %s sg_next 0 ==============]\n", __func__);
            goto done;
        }

        host->sg = sg_miter->piter.sg;
        buf = sg_miter->addr;
        remain = sg_miter->length;
        offset = 0;
        printk("sg: %p, sg_addr: %p, sg_length: %d.\n", host->sg, buf, remain);

        do {
            fcnt = ((fifo_depth -
                 SDMMC_GET_FCNT(mci_readl(host, STATUS)))
                    << shift) - host->part_buf_count;
            len = min(remain, fcnt);
            printk("    fcnt: %d, remain: %d, len: %d\n", fcnt, remain, len);

            if (!len)
                break;
            host->push_data(host, (void *)(buf + offset), len);
            data->bytes_xfered += len;
            offset += len;
            remain -= len;
        } while (remain);

        sg_miter->consumed = offset;
        status = mci_readl(host, MINTSTS);
        printk("sg_consumed: %d, status: 0x%08x.\n", offset, status);
        mci_writel(host, RINTSTS, SDMMC_INT_TXDR);
    } while (status & SDMMC_INT_TXDR); /* if TXDR write again */

    if (!remain) {
        if (!sg_miter_next(sg_miter)) {
            printk("[=============== complete %s sg_next 0, remain 0 ==============]\n", __func__);
            goto done;
        }
        sg_miter->consumed = 0;
        printk("[===============not complete %s sg_miter->consumed = 0, remain 0 ==============]\n", __func__);
    }
    sg_miter_stop(sg_miter);
    printk("[=============== exit no complete %s remain: %d==============]\n", __func__, remain);
    return;

done:
    sg_miter_stop(sg_miter);
host_put:   
    host->sg = NULL;
    smp_wmb();  
    printk("[=============== exit complete %s==============]\n", __func__);
    set_bit(EVENT_XFER_COMPLETE, &host->pending_events);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值