return err;
}
-int rtsx_transfer_sglist(struct rtsx_chip *chip, u8 card,
- struct scatterlist *sg, int num_sg,
- enum dma_data_direction dma_dir, int timeout)
-{
- struct rtsx_dev *rtsx = chip->rtsx;
- struct completion trans_done;
- u8 dir;
- int buf_cnt, i;
- int err = 0;
- long timeleft;
-
- if ((sg == NULL) || (num_sg <= 0))
- return -EIO;
-
- if (dma_dir == DMA_TO_DEVICE) {
- dir = HOST_TO_DEVICE;
- } else if (dma_dir == DMA_FROM_DEVICE) {
- dir = DEVICE_TO_HOST;
- } else {
- return -ENXIO;
- }
-
- if (card == SD_CARD) {
- rtsx->check_card_cd = SD_EXIST;
- } else if (card == MS_CARD) {
- rtsx->check_card_cd = MS_EXIST;
- } else if (card == XD_CARD) {
- rtsx->check_card_cd = XD_EXIST;
- } else {
- rtsx->check_card_cd = 0;
- }
-
- spin_lock_irq(&rtsx->reg_lock);
-
- /* set up data structures for the wakeup system */
- rtsx->done = &trans_done;
-
- rtsx->trans_state = STATE_TRANS_SG;
- rtsx->trans_result = TRANS_NOT_READY;
-
- spin_unlock_irq(&rtsx->reg_lock);
-
- buf_cnt = dma_map_sg(&(rtsx->pci->dev), sg, num_sg, dma_dir);
-
- for (i = 0; i < buf_cnt; i++) {
- u32 bier = 0;
- u32 val = (1 << 31);
- dma_addr_t addr = sg_dma_address(sg + i);
- unsigned int len = sg_dma_len(sg + i);
-
- RTSX_DEBUGP("dma_addr = 0x%x, dma_len = %d\n",
- (unsigned int)addr, len);
-
- val |= (u32)(dir & 0x01) << 29;
- val |= (u32)(len & 0x00FFFFFF);
-
- spin_lock_irq(&rtsx->reg_lock);
-
- init_completion(&trans_done);
-
- if (i == (buf_cnt - 1)) {
- /* If last transfer, disable data interrupt */
- bier = rtsx_readl(chip, RTSX_BIER);
- rtsx_writel(chip, RTSX_BIER, bier & 0xBFFFFFFF);
- }
-
- rtsx_writel(chip, RTSX_HDBAR, addr);
- rtsx_writel(chip, RTSX_HDBCTLR, val);
-
- spin_unlock_irq(&rtsx->reg_lock);
-
- timeleft = wait_for_completion_interruptible_timeout(
- &trans_done, timeout * HZ / 1000);
- if (timeleft <= 0) {
- RTSX_DEBUGP("Timeout (%s %d)\n", __func__, __LINE__);
- RTSX_DEBUGP("chip->int_reg = 0x%x\n", chip->int_reg);
- err = -ETIMEDOUT;
- if (i == (buf_cnt - 1))
- rtsx_writel(chip, RTSX_BIER, bier);
- goto out;
- }
-
- spin_lock_irq(&rtsx->reg_lock);
- if (rtsx->trans_result == TRANS_RESULT_FAIL) {
- err = -EIO;
- spin_unlock_irq(&rtsx->reg_lock);
- if (i == (buf_cnt - 1))
- rtsx_writel(chip, RTSX_BIER, bier);
- goto out;
- }
- spin_unlock_irq(&rtsx->reg_lock);
-
- if (i == (buf_cnt - 1)) {
- /* If last transfer, enable data interrupt
- * after transfer finished
- */
- rtsx_writel(chip, RTSX_BIER, bier);
- }
- }
-
- /* Wait for TRANS_OK_INT */
- spin_lock_irq(&rtsx->reg_lock);
- if (rtsx->trans_result == TRANS_NOT_READY) {
- init_completion(&trans_done);
- spin_unlock_irq(&rtsx->reg_lock);
- timeleft = wait_for_completion_interruptible_timeout(
- &trans_done, timeout * HZ / 1000);
- if (timeleft <= 0) {
- RTSX_DEBUGP("Timeout (%s %d)\n", __func__, __LINE__);
- RTSX_DEBUGP("chip->int_reg = 0x%x\n", chip->int_reg);
- err = -ETIMEDOUT;
- goto out;
- }
- } else {
- spin_unlock_irq(&rtsx->reg_lock);
- }
-
- spin_lock_irq(&rtsx->reg_lock);
- if (rtsx->trans_result == TRANS_RESULT_FAIL) {
- err = -EIO;
- } else if (rtsx->trans_result == TRANS_RESULT_OK) {
- err = 0;
- }
- spin_unlock_irq(&rtsx->reg_lock);
-
-out:
- rtsx->done = NULL;
- rtsx->trans_state = STATE_TRANS_NONE;
- dma_unmap_sg(&(rtsx->pci->dev), sg, num_sg, dma_dir);
-
- if (err < 0)
- rtsx_stop_cmd(chip, card);
-
- return err;
-}
-
int rtsx_transfer_data_partial(struct rtsx_chip *chip, u8 card,
void *buf, size_t len, int use_sg, unsigned int *index,
unsigned int *offset, enum dma_data_direction dma_dir,