Re: [PATCH v2] pci: quirks: Disable native PCIe hotplug on MSI Claw A8 root bridge

Derek John Clark <[email protected]>
Newsgroups org.kernel.vger.linux-pci,org.kernel.vger.linux-kernel
Message-ID <CAFqHKT=X9gR2_NVmdFJz7SEgu3LutmYTQZ1CQKmKC9aOgTKwKQ@mail.gmail.com>
On Wed, Aug 12, 2026 at 11:13 AM Lukas Wunner <[email protected]> wrote:
>
> On Tue, Aug 11, 2026 at 10:59:09AM +0200, Lukas Wunner wrote:
> > So the completely untested patch below might be an upstreamable approach.
>
> Sorry, I was OOO for a day and sent out the patch without compile-testing
> right before hitting the road.  I'm back now and it turns out that
> an #include statement was mising.  Rectified patch below.
>
No problem. Thanks for catching it after. I only got around to testing
today. It works well.

Tested-by: Derek J. Clark <[email protected]>

Thanks,
Derek

> -- >8 --
>
> diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c
> index 0274e8d07660..1a82233a30d0 100644
> --- a/drivers/mmc/core/block.c
> +++ b/drivers/mmc/core/block.c
> @@ -2978,8 +2978,11 @@ static int mmc_blk_alloc_parts(struct mmc_card *card, struct mmc_blk_data *md)
>         return 0;
>  }
>
> -static void mmc_blk_remove_req(struct mmc_blk_data *md)
> +static void mmc_blk_remove_req(struct mmc_card *card, struct mmc_blk_data *md)
>  {
> +       if (mmc_card_removed(card))
> +               blk_mark_disk_dead(md->disk);
> +
>         /*
>          * Flush remaining requests and free queues. It is freeing the queue
>          * that stops new requests from being accepted.
> @@ -3006,7 +3009,7 @@ static void mmc_blk_remove_parts(struct mmc_card *card,
>         list_for_each_safe(pos, q, &md->part) {
>                 part_md = list_entry(pos, struct mmc_blk_data, part);
>                 list_del(pos);
> -               mmc_blk_remove_req(part_md);
> +               mmc_blk_remove_req(card, part_md);
>         }
>  }
>
> @@ -3252,7 +3255,7 @@ static int mmc_blk_probe(struct mmc_card *card)
>
>  out:
>         mmc_blk_remove_parts(card, md);
> -       mmc_blk_remove_req(md);
> +       mmc_blk_remove_req(card, md);
>  out_free:
>         destroy_workqueue(card->complete_wq);
>         return ret;
> @@ -3273,7 +3276,7 @@ static void mmc_blk_remove(struct mmc_card *card)
>         if (!mmc_card_sd_combo(card))
>                 pm_runtime_disable(&card->dev);
>         pm_runtime_put_noidle(&card->dev);
> -       mmc_blk_remove_req(md);
> +       mmc_blk_remove_req(card, md);
>         destroy_workqueue(card->complete_wq);
>  }
>
> diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c
> index b7ce3137d452..2625d918081b 100644
> --- a/drivers/mmc/core/host.c
> +++ b/drivers/mmc/core/host.c
> @@ -22,6 +22,7 @@
>  #include <linux/mmc/card.h>
>  #include <linux/mmc/slot-gpio.h>
>
> +#include "card.h"
>  #include "core.h"
>  #include "crypto.h"
>  #include "host.h"
> @@ -703,3 +704,17 @@ void mmc_free_host(struct mmc_host *host)
>  }
>
>  EXPORT_SYMBOL(mmc_free_host);
> +
> +/**
> + *     mmc_host_set_removed - declare host removed
> + *     @host: mmc host
> + *
> + *     Declare the host (and any inserted card) removed and inaccessible.
> + */
> +void mmc_host_set_removed(struct mmc_host *host)
> +{
> +       if (host->card)
> +               mmc_card_set_removed(host->card);
> +}
> +
> +EXPORT_SYMBOL(mmc_host_set_removed);
> diff --git a/drivers/mmc/host/rtsx_pci_sdmmc.c b/drivers/mmc/host/rtsx_pci_sdmmc.c
> index 8dfbc62f165b..3f97659fba7c 100644
> --- a/drivers/mmc/host/rtsx_pci_sdmmc.c
> +++ b/drivers/mmc/host/rtsx_pci_sdmmc.c
> @@ -1511,6 +1511,9 @@ static void rtsx_pci_sdmmc_drv_remove(struct platform_device *pdev)
>         pcr->slots[RTSX_SD_CARD].card_event = NULL;
>         mmc = host->mmc;
>
> +       if (pci_dev_is_disconnected(pcr->pci))
> +               mmc_host_set_removed(mmc);
> +
>         cancel_work_sync(&host->work);
>
>         mutex_lock(&host->host_mutex);
> diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h
> index ba84f02c2a10..a2403062d770 100644
> --- a/include/linux/mmc/host.h
> +++ b/include/linux/mmc/host.h
> @@ -588,6 +588,7 @@ struct mmc_host *devm_mmc_alloc_host(struct device *dev, int extra);
>  int mmc_add_host(struct mmc_host *);
>  void mmc_remove_host(struct mmc_host *);
>  void mmc_free_host(struct mmc_host *);
> +void mmc_host_set_removed(struct mmc_host *host);
>  void mmc_of_parse_clk_phase(struct device *dev,
>                             struct mmc_clk_phase_map *map);
>  int mmc_of_parse(struct mmc_host *host);
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.