diff options
Diffstat (limited to 'drivers/memstick/host/jmb38x_ms.c')
-rw-r--r-- | drivers/memstick/host/jmb38x_ms.c | 48 |
1 files changed, 27 insertions, 21 deletions
diff --git a/drivers/memstick/host/jmb38x_ms.c b/drivers/memstick/host/jmb38x_ms.c index 9a57504183c7..f91037d50422 100644 --- a/drivers/memstick/host/jmb38x_ms.c +++ b/drivers/memstick/host/jmb38x_ms.c | |||
@@ -57,8 +57,6 @@ struct jmb38x_ms_host { | |||
57 | unsigned long timeout_jiffies; | 57 | unsigned long timeout_jiffies; |
58 | struct timer_list timer; | 58 | struct timer_list timer; |
59 | struct memstick_request *req; | 59 | struct memstick_request *req; |
60 | unsigned char eject:1, | ||
61 | use_dma:1; | ||
62 | unsigned char cmd_flags; | 60 | unsigned char cmd_flags; |
63 | unsigned char io_pos; | 61 | unsigned char io_pos; |
64 | unsigned int io_word[2]; | 62 | unsigned int io_word[2]; |
@@ -95,9 +93,22 @@ struct jmb38x_ms { | |||
95 | #define HOST_CONTROL_IF_PAR4 0x1 | 93 | #define HOST_CONTROL_IF_PAR4 0x1 |
96 | #define HOST_CONTROL_IF_PAR8 0x3 | 94 | #define HOST_CONTROL_IF_PAR8 0x3 |
97 | 95 | ||
96 | #define STATUS_BUSY 0x00080000 | ||
97 | #define STATUS_MS_DAT7 0x00040000 | ||
98 | #define STATUS_MS_DAT6 0x00020000 | ||
99 | #define STATUS_MS_DAT5 0x00010000 | ||
100 | #define STATUS_MS_DAT4 0x00008000 | ||
101 | #define STATUS_MS_DAT3 0x00004000 | ||
102 | #define STATUS_MS_DAT2 0x00002000 | ||
103 | #define STATUS_MS_DAT1 0x00001000 | ||
104 | #define STATUS_MS_DAT0 0x00000800 | ||
98 | #define STATUS_HAS_MEDIA 0x00000400 | 105 | #define STATUS_HAS_MEDIA 0x00000400 |
99 | #define STATUS_FIFO_EMPTY 0x00000200 | 106 | #define STATUS_FIFO_EMPTY 0x00000200 |
100 | #define STATUS_FIFO_FULL 0x00000100 | 107 | #define STATUS_FIFO_FULL 0x00000100 |
108 | #define STATUS_MS_CED 0x00000080 | ||
109 | #define STATUS_MS_ERR 0x00000040 | ||
110 | #define STATUS_MS_BRQ 0x00000020 | ||
111 | #define STATUS_MS_CNK 0x00000001 | ||
101 | 112 | ||
102 | #define INT_STATUS_TPC_ERR 0x00080000 | 113 | #define INT_STATUS_TPC_ERR 0x00080000 |
103 | #define INT_STATUS_CRC_ERR 0x00040000 | 114 | #define INT_STATUS_CRC_ERR 0x00040000 |
@@ -124,7 +135,7 @@ enum { | |||
124 | CMD_READY = 0x01, | 135 | CMD_READY = 0x01, |
125 | FIFO_READY = 0x02, | 136 | FIFO_READY = 0x02, |
126 | REG_DATA = 0x04, | 137 | REG_DATA = 0x04, |
127 | AUTO_GET_INT = 0x08 | 138 | DMA_DATA = 0x08 |
128 | }; | 139 | }; |
129 | 140 | ||
130 | static unsigned int jmb38x_ms_read_data(struct jmb38x_ms_host *host, | 141 | static unsigned int jmb38x_ms_read_data(struct jmb38x_ms_host *host, |
@@ -367,28 +378,27 @@ static int jmb38x_ms_issue_cmd(struct memstick_host *msh) | |||
367 | cmd |= TPC_DIR; | 378 | cmd |= TPC_DIR; |
368 | if (host->req->need_card_int) | 379 | if (host->req->need_card_int) |
369 | cmd |= TPC_WAIT_INT; | 380 | cmd |= TPC_WAIT_INT; |
370 | if (host->req->get_int_reg) | ||
371 | cmd |= TPC_GET_INT; | ||
372 | 381 | ||
373 | data = host->req->data; | 382 | data = host->req->data; |
374 | 383 | ||
375 | host->use_dma = !no_dma; | 384 | if (!no_dma) |
385 | host->cmd_flags |= DMA_DATA; | ||
376 | 386 | ||
377 | if (host->req->long_data) { | 387 | if (host->req->long_data) { |
378 | data_len = host->req->sg.length; | 388 | data_len = host->req->sg.length; |
379 | } else { | 389 | } else { |
380 | data_len = host->req->data_len; | 390 | data_len = host->req->data_len; |
381 | host->use_dma = 0; | 391 | host->cmd_flags &= ~DMA_DATA; |
382 | } | 392 | } |
383 | 393 | ||
384 | if (data_len <= 8) { | 394 | if (data_len <= 8) { |
385 | cmd &= ~(TPC_DATA_SEL | 0xf); | 395 | cmd &= ~(TPC_DATA_SEL | 0xf); |
386 | host->cmd_flags |= REG_DATA; | 396 | host->cmd_flags |= REG_DATA; |
387 | cmd |= data_len & 0xf; | 397 | cmd |= data_len & 0xf; |
388 | host->use_dma = 0; | 398 | host->cmd_flags &= ~DMA_DATA; |
389 | } | 399 | } |
390 | 400 | ||
391 | if (host->use_dma) { | 401 | if (host->cmd_flags & DMA_DATA) { |
392 | if (1 != pci_map_sg(host->chip->pdev, &host->req->sg, 1, | 402 | if (1 != pci_map_sg(host->chip->pdev, &host->req->sg, 1, |
393 | host->req->data_dir == READ | 403 | host->req->data_dir == READ |
394 | ? PCI_DMA_FROMDEVICE | 404 | ? PCI_DMA_FROMDEVICE |
@@ -451,13 +461,12 @@ static void jmb38x_ms_complete_cmd(struct memstick_host *msh, int last) | |||
451 | readl(host->addr + INT_STATUS)); | 461 | readl(host->addr + INT_STATUS)); |
452 | dev_dbg(msh->cdev.dev, "c hstatus %08x\n", readl(host->addr + STATUS)); | 462 | dev_dbg(msh->cdev.dev, "c hstatus %08x\n", readl(host->addr + STATUS)); |
453 | 463 | ||
454 | if (host->req->get_int_reg) { | 464 | host->req->int_reg = readl(host->addr + STATUS) & 0xff; |
455 | t_val = readl(host->addr + TPC_P0); | 465 | |
456 | host->req->int_reg = (t_val & 0xff); | 466 | writel(0, host->addr + BLOCK); |
457 | } | 467 | writel(0, host->addr + DMA_CONTROL); |
458 | 468 | ||
459 | if (host->use_dma) { | 469 | if (host->cmd_flags & DMA_DATA) { |
460 | writel(0, host->addr + DMA_CONTROL); | ||
461 | pci_unmap_sg(host->chip->pdev, &host->req->sg, 1, | 470 | pci_unmap_sg(host->chip->pdev, &host->req->sg, 1, |
462 | host->req->data_dir == READ | 471 | host->req->data_dir == READ |
463 | ? PCI_DMA_FROMDEVICE : PCI_DMA_TODEVICE); | 472 | ? PCI_DMA_FROMDEVICE : PCI_DMA_TODEVICE); |
@@ -509,7 +518,7 @@ static irqreturn_t jmb38x_ms_isr(int irq, void *dev_id) | |||
509 | else | 518 | else |
510 | host->req->error = -ETIME; | 519 | host->req->error = -ETIME; |
511 | } else { | 520 | } else { |
512 | if (host->use_dma) { | 521 | if (host->cmd_flags & DMA_DATA) { |
513 | if (irq_status & INT_STATUS_EOTRAN) | 522 | if (irq_status & INT_STATUS_EOTRAN) |
514 | host->cmd_flags |= FIFO_READY; | 523 | host->cmd_flags |= FIFO_READY; |
515 | } else { | 524 | } else { |
@@ -775,13 +784,10 @@ static struct memstick_host *jmb38x_ms_alloc_host(struct jmb38x_ms *jm, int cnt) | |||
775 | snprintf(host->host_id, DEVICE_ID_SIZE, DRIVER_NAME ":slot%d", | 784 | snprintf(host->host_id, DEVICE_ID_SIZE, DRIVER_NAME ":slot%d", |
776 | host->id); | 785 | host->id); |
777 | host->irq = jm->pdev->irq; | 786 | host->irq = jm->pdev->irq; |
778 | host->timeout_jiffies = msecs_to_jiffies(4000); | 787 | host->timeout_jiffies = msecs_to_jiffies(1000); |
779 | msh->request = jmb38x_ms_request; | 788 | msh->request = jmb38x_ms_request; |
780 | msh->set_param = jmb38x_ms_set_param; | 789 | msh->set_param = jmb38x_ms_set_param; |
781 | /* | 790 | |
782 | msh->caps = MEMSTICK_CAP_AUTO_GET_INT | MEMSTICK_CAP_PAR4 | ||
783 | | MEMSTICK_CAP_PAR8; | ||
784 | */ | ||
785 | msh->caps = MEMSTICK_CAP_PAR4 | MEMSTICK_CAP_PAR8; | 791 | msh->caps = MEMSTICK_CAP_PAR4 | MEMSTICK_CAP_PAR8; |
786 | 792 | ||
787 | setup_timer(&host->timer, jmb38x_ms_abort, (unsigned long)msh); | 793 | setup_timer(&host->timer, jmb38x_ms_abort, (unsigned long)msh); |