Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 106163
b: refs/heads/master
c: 17017d8
h: refs/heads/master
i:
  106161: 09ac4e5
  106159: 9c12095
v: v3
  • Loading branch information
Alex Dubov authored and Linus Torvalds committed Jul 26, 2008
1 parent b2a8596 commit eea65cd
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 4 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: b77899985bdfd85a8e5a6e485033a9b4713d2471
refs/heads/master: 17017d8d2c005734d7088d8281ce2daab8fcb097
11 changes: 8 additions & 3 deletions trunk/drivers/memstick/core/memstick.c
Original file line number Diff line number Diff line change
Expand Up @@ -433,8 +433,11 @@ static void memstick_check(struct work_struct *work)

dev_dbg(&host->dev, "memstick_check started\n");
mutex_lock(&host->lock);
if (!host->card)
memstick_power_on(host);
if (!host->card) {
if (memstick_power_on(host))
goto out_power_off;
} else
host->card->stop(host->card);

card = memstick_alloc_card(host);

Expand All @@ -452,7 +455,8 @@ static void memstick_check(struct work_struct *work)
|| !(host->card->check(host->card))) {
device_unregister(&host->card->dev);
host->card = NULL;
}
} else
host->card->start(host->card);
}

if (!host->card) {
Expand All @@ -465,6 +469,7 @@ static void memstick_check(struct work_struct *work)
kfree(card);
}

out_power_off:
if (!host->card)
host->set_param(host, MEMSTICK_POWER, MEMSTICK_POWER_OFF);

Expand Down
33 changes: 33 additions & 0 deletions trunk/drivers/memstick/core/mspro_block.c
Original file line number Diff line number Diff line change
Expand Up @@ -752,6 +752,37 @@ static int mspro_block_has_request(struct mspro_block_data *msb)
return rc;
}

static void mspro_block_stop(struct memstick_dev *card)
{
struct mspro_block_data *msb = memstick_get_drvdata(card);
int rc = 0;
unsigned long flags;

while (1) {
spin_lock_irqsave(&msb->q_lock, flags);
if (!msb->has_request) {
blk_stop_queue(msb->queue);
rc = 1;
}
spin_unlock_irqrestore(&msb->q_lock, flags);

if (rc)
break;

wait_for_completion(&card->mrq_complete);
}
}

static void mspro_block_start(struct memstick_dev *card)
{
struct mspro_block_data *msb = memstick_get_drvdata(card);
unsigned long flags;

spin_lock_irqsave(&msb->q_lock, flags);
blk_start_queue(msb->queue);
spin_unlock_irqrestore(&msb->q_lock, flags);
}

static int mspro_block_queue_thread(void *data)
{
struct memstick_dev *card = data;
Expand Down Expand Up @@ -1272,6 +1303,8 @@ static int mspro_block_probe(struct memstick_dev *card)
rc = mspro_block_init_disk(card);
if (!rc) {
card->check = mspro_block_check_card;
card->stop = mspro_block_stop;
card->start = mspro_block_start;
return 0;
}

Expand Down
4 changes: 4 additions & 0 deletions trunk/include/linux/memstick.h
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,10 @@ struct memstick_dev {
/* Get next request from the media driver. */
int (*next_request)(struct memstick_dev *card,
struct memstick_request **mrq);
/* Tell the media driver to stop doing things */
void (*stop)(struct memstick_dev *card);
/* Allow the media driver to continue */
void (*start)(struct memstick_dev *card);

struct device dev;
};
Expand Down

0 comments on commit eea65cd

Please sign in to comment.