diff --git a/drivers/net/wireless/cnss2/pci.c b/drivers/net/wireless/cnss2/pci.c index a44954f2d4e2..e275e8468493 100644 --- a/drivers/net/wireless/cnss2/pci.c +++ b/drivers/net/wireless/cnss2/pci.c @@ -1220,6 +1220,17 @@ void cnss_pci_allow_l1(struct device *dev) } EXPORT_SYMBOL(cnss_pci_allow_l1); +static void cnss_pci_update_link_event(struct cnss_pci_data *pci_priv, + enum cnss_bus_event_type type, + void *data) +{ + struct cnss_bus_event bus_event; + + bus_event.etype = type; + bus_event.event_data = data; + cnss_pci_call_driver_uevent(pci_priv, CNSS_BUS_EVENT, &bus_event); +} + static void cnss_pci_handle_linkdown(struct cnss_pci_data *pci_priv) { struct cnss_plat_data *plat_priv = pci_priv->plat_priv; @@ -1242,6 +1253,12 @@ static void cnss_pci_handle_linkdown(struct cnss_pci_data *pci_priv) if (pci_dev->device == QCA6174_DEVICE_ID) disable_irq(pci_dev->irq); + /* Notify bus related event. Now for all supported chips. + * Here PCIe LINK_DOWN notification taken care. + * uevent buffer can be extended later, to cover more bus info. + */ + cnss_pci_update_link_event(pci_priv, BUS_EVENT_PCI_LINK_DOWN, NULL); + cnss_fatal_err("PCI link down, schedule recovery\n"); cnss_schedule_recovery(&pci_dev->dev, CNSS_REASON_LINK_DOWN); } diff --git a/include/net/cnss2.h b/include/net/cnss2.h index 72a88998d1d1..cbcfac90f960 100644 --- a/include/net/cnss2.h +++ b/include/net/cnss2.h @@ -82,6 +82,13 @@ enum cnss_driver_status { CNSS_RECOVERY, CNSS_FW_DOWN, CNSS_HANG_EVENT, + CNSS_BUS_EVENT, +}; + +enum cnss_bus_event_type { + BUS_EVENT_PCI_LINK_DOWN = 0, + + BUS_EVENT_INVALID = 0xFFFF, }; struct cnss_hang_event { @@ -89,6 +96,11 @@ struct cnss_hang_event { u16 hang_event_data_len; }; +struct cnss_bus_event { + enum cnss_bus_event_type etype; + void *event_data; +}; + struct cnss_uevent_data { enum cnss_driver_status status; void *data;