Hi Lukas, May I know the related patch has upstream schedule? or this patch not go to kernel? > Hi Lukas, > > I tested this patch and the result looks good, but if the two SSD has same VID, > PID and capacity it still has problem. > So I think add S/N to compare is necessary if it can do > > And I also tested SD7.0 card the result is same with M.2 SSD > > > > --- a/drivers/pci/hotplug/pciehp_core.c > > > +++ b/drivers/pci/hotplug/pciehp_core.c > > > @@ -152,6 +152,25 @@ static int get_adapter_status(struct > > > hotplug_slot > > *hotplug_slot, u8 *value) > > > return 0; > > > } > > > > > > +static bool pciehp_device_replaced(struct controller *ctrl) { > > > + struct pci_dev *pdev; > > > > I've realized this needs to be > > > > + struct pci_dev *pdev __free(pci_dev_put); > > > > to avoid leaking a ref on the child device. For testing purposes, the > > patch should still be fine without this change, but I'll have to fix > > this up if/when submitting a proper patch. > > > > > + u32 reg; > > > + > > > + pdev = pci_get_slot(ctrl->pcie->port->subordinate, PCI_DEVFN(0, > 0)); > > > + if (!pdev) > > > + return true; > > > + > > > + if (!pci_bus_read_dev_vendor_id(ctrl->pcie->port->subordinate, > > > + PCI_DEVFN(0, 0), ®, 0)) > > > + return true; > > > + > > > + if (reg != (pdev->vendor | (pdev->device << 16))) > > > + return true; > > > + > > > + return false; > > > +} > > > + > > > /** > > > * pciehp_check_presence() - synthesize event if presence has changed > > > * @ctrl: controller to check > > > @@ -172,7 +191,8 @@ static void pciehp_check_presence(struct > > > controller *ctrl) > > > > > > occupied = pciehp_card_present_or_link_active(ctrl); > > > if ((occupied > 0 && (ctrl->state == OFF_STATE || > > > - ctrl->state == BLINKINGON_STATE)) || > > > + ctrl->state == BLINKINGON_STATE || > > > + pciehp_device_replaced(ctrl))) || > > > (!occupied && (ctrl->state == ON_STATE || > > > ctrl->state == BLINKINGOFF_STATE))) > > > pciehp_request(ctrl, PCI_EXP_SLTSTA_PDC);