Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3b91e550 authored by Pierre Ossman's avatar Pierre Ossman
Browse files

mmc: Flush pending detects on host removal



Make sure we kill of any pending detection runs when the host
is removed instead of when it is freed. Also add some debugging
to make sure the driver doesn't queue up more detection after it
has removed the host.

Signed-off-by: default avatarPierre Ossman <drzeus@drzeus.cx>
parent 1c6a0718
Loading
Loading
Loading
Loading
+14 −1
Original line number Original line Diff line number Diff line
@@ -1550,6 +1550,12 @@ static void mmc_setup(struct mmc_host *host)
 */
 */
void mmc_detect_change(struct mmc_host *host, unsigned long delay)
void mmc_detect_change(struct mmc_host *host, unsigned long delay)
{
{
#ifdef CONFIG_MMC_DEBUG
	mmc_claim_host(host);
	BUG_ON(host->removed);
	mmc_release_host(host);
#endif

	mmc_schedule_delayed_work(&host->detect, delay);
	mmc_schedule_delayed_work(&host->detect, delay);
}
}


@@ -1690,6 +1696,14 @@ void mmc_remove_host(struct mmc_host *host)
{
{
	struct list_head *l, *n;
	struct list_head *l, *n;


#ifdef CONFIG_MMC_DEBUG
	mmc_claim_host(host);
	host->removed = 1;
	mmc_release_host(host);
#endif

	mmc_flush_scheduled_work();

	list_for_each_safe(l, n, &host->cards) {
	list_for_each_safe(l, n, &host->cards) {
		struct mmc_card *card = mmc_list_to_card(l);
		struct mmc_card *card = mmc_list_to_card(l);


@@ -1710,7 +1724,6 @@ EXPORT_SYMBOL(mmc_remove_host);
 */
 */
void mmc_free_host(struct mmc_host *host)
void mmc_free_host(struct mmc_host *host)
{
{
	mmc_flush_scheduled_work();
	mmc_free_host_sysfs(host);
	mmc_free_host_sysfs(host);
}
}


+3 −0
Original line number Original line Diff line number Diff line
@@ -147,6 +147,9 @@ struct mmc_host {
	struct mmc_card		*card_selected;	/* the selected MMC card */
	struct mmc_card		*card_selected;	/* the selected MMC card */


	struct delayed_work	detect;
	struct delayed_work	detect;
#ifdef CONFIG_MMC_DEBUG
	unsigned int		removed:1;	/* host is being removed */
#endif


	unsigned long		private[0] ____cacheline_aligned;
	unsigned long		private[0] ____cacheline_aligned;
};
};