diff options
author | Alex Dubov <oakad@yahoo.com> | 2008-03-10 14:43:42 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2008-03-10 21:01:18 -0400 |
commit | 593672582e71a688cf8c3fc1c59ec7c44d3799e5 (patch) | |
tree | 7ce71db28639146c9302bb2b03880638661f417d /drivers/memstick/core | |
parent | 251cc9b9df065cb2c170ea45f566c0d9456186c2 (diff) |
memstick: try harder to recover from unsuccessful interface mode switch
Signed-off-by: Alex Dubov <oakad@yahoo.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/memstick/core')
-rw-r--r-- | drivers/memstick/core/mspro_block.c | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/drivers/memstick/core/mspro_block.c b/drivers/memstick/core/mspro_block.c index 62b913ba9b97..1d637e4561d3 100644 --- a/drivers/memstick/core/mspro_block.c +++ b/drivers/memstick/core/mspro_block.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/idr.h> | 16 | #include <linux/idr.h> |
17 | #include <linux/hdreg.h> | 17 | #include <linux/hdreg.h> |
18 | #include <linux/kthread.h> | 18 | #include <linux/kthread.h> |
19 | #include <linux/delay.h> | ||
19 | #include <linux/memstick.h> | 20 | #include <linux/memstick.h> |
20 | 21 | ||
21 | #define DRIVER_NAME "mspro_block" | 22 | #define DRIVER_NAME "mspro_block" |
@@ -820,7 +821,7 @@ static int mspro_block_switch_to_parallel(struct memstick_dev *card) | |||
820 | struct memstick_host *host = card->host; | 821 | struct memstick_host *host = card->host; |
821 | struct mspro_block_data *msb = memstick_get_drvdata(card); | 822 | struct mspro_block_data *msb = memstick_get_drvdata(card); |
822 | struct mspro_param_register param = { | 823 | struct mspro_param_register param = { |
823 | .system = 0, | 824 | .system = MEMSTICK_SYS_PAR4, |
824 | .data_count = 0, | 825 | .data_count = 0, |
825 | .data_address = 0, | 826 | .data_address = 0, |
826 | .tpc_param = 0 | 827 | .tpc_param = 0 |
@@ -845,8 +846,24 @@ static int mspro_block_switch_to_parallel(struct memstick_dev *card) | |||
845 | wait_for_completion(&card->mrq_complete); | 846 | wait_for_completion(&card->mrq_complete); |
846 | 847 | ||
847 | if (card->current_mrq.error) { | 848 | if (card->current_mrq.error) { |
848 | msb->system = 0x80; | 849 | msb->system = MEMSTICK_SYS_SERIAL; |
850 | host->set_param(host, MEMSTICK_POWER, MEMSTICK_POWER_OFF); | ||
851 | msleep(1000); | ||
852 | host->set_param(host, MEMSTICK_POWER, MEMSTICK_POWER_ON); | ||
849 | host->set_param(host, MEMSTICK_INTERFACE, MEMSTICK_SERIAL); | 853 | host->set_param(host, MEMSTICK_INTERFACE, MEMSTICK_SERIAL); |
854 | |||
855 | if (memstick_set_rw_addr(card)) | ||
856 | return card->current_mrq.error; | ||
857 | |||
858 | param.system = msb->system; | ||
859 | |||
860 | card->next_request = h_mspro_block_req_init; | ||
861 | msb->mrq_handler = h_mspro_block_default; | ||
862 | memstick_init_req(&card->current_mrq, MS_TPC_WRITE_REG, ¶m, | ||
863 | sizeof(param)); | ||
864 | memstick_new_req(host); | ||
865 | wait_for_completion(&card->mrq_complete); | ||
866 | |||
850 | return -EFAULT; | 867 | return -EFAULT; |
851 | } | 868 | } |
852 | 869 | ||