case PDS_EVENT_LINK_CHANGE:
                        dev_info(pdsc->dev, "NotifyQ LINK_CHANGE ecode %d eid %lld\n",
                                 ecode, eid);
+                       pdsc_notify(PDS_EVENT_LINK_CHANGE, comp);
                        break;
 
                case PDS_EVENT_RESET:
                        dev_info(pdsc->dev, "NotifyQ RESET ecode %d eid %lld\n",
                                 ecode, eid);
+                       pdsc_notify(PDS_EVENT_RESET, comp);
                        break;
 
                case PDS_EVENT_XCVR:
 
 
 #include "core.h"
 
+static BLOCKING_NOTIFIER_HEAD(pds_notify_chain);
+
+int pdsc_register_notify(struct notifier_block *nb)
+{
+       return blocking_notifier_chain_register(&pds_notify_chain, nb);
+}
+EXPORT_SYMBOL_GPL(pdsc_register_notify);
+
+void pdsc_unregister_notify(struct notifier_block *nb)
+{
+       blocking_notifier_chain_unregister(&pds_notify_chain, nb);
+}
+EXPORT_SYMBOL_GPL(pdsc_unregister_notify);
+
+void pdsc_notify(unsigned long event, void *data)
+{
+       blocking_notifier_call_chain(&pds_notify_chain, event, data);
+}
+
 void pdsc_intr_free(struct pdsc *pdsc, int index)
 {
        struct pdsc_intr_info *intr_info;
 
 static void pdsc_fw_down(struct pdsc *pdsc)
 {
+       union pds_core_notifyq_comp reset_event = {
+               .reset.ecode = cpu_to_le16(PDS_EVENT_RESET),
+               .reset.state = 0,
+       };
+
        if (test_and_set_bit(PDSC_S_FW_DEAD, &pdsc->state)) {
                dev_err(pdsc->dev, "%s: already happening\n", __func__);
                return;
        }
 
+       /* Notify clients of fw_down */
        devlink_health_report(pdsc->fw_reporter, "FW down reported", pdsc);
+       pdsc_notify(PDS_EVENT_RESET, &reset_event);
 
        pdsc_stop(pdsc);
        pdsc_teardown(pdsc, PDSC_TEARDOWN_RECOVERY);
 
 static void pdsc_fw_up(struct pdsc *pdsc)
 {
+       union pds_core_notifyq_comp reset_event = {
+               .reset.ecode = cpu_to_le16(PDS_EVENT_RESET),
+               .reset.state = 1,
+       };
        int err;
 
        if (!test_bit(PDSC_S_FW_DEAD, &pdsc->state)) {
        if (err)
                goto err_out;
 
+       /* Notify clients of fw_up */
        pdsc->fw_recoveries++;
        devlink_health_reporter_state_update(pdsc->fw_reporter,
                                             DEVLINK_HEALTH_REPORTER_STATE_HEALTHY);
+       pdsc_notify(PDS_EVENT_RESET, &reset_event);
 
        return;
 
 
 void pdsc_stop(struct pdsc *pdsc);
 void pdsc_health_thread(struct work_struct *work);
 
+int pdsc_register_notify(struct notifier_block *nb);
+void pdsc_unregister_notify(struct notifier_block *nb);
+void pdsc_notify(unsigned long event, void *data);
 int pdsc_auxbus_dev_add(struct pdsc *cf, struct pdsc *pf);
 int pdsc_auxbus_dev_del(struct pdsc *cf, struct pdsc *pf);
 
 
        PDS_CORE_QTYPE_MAX     = 16   /* don't change - used in struct size */
 };
 
+int pdsc_register_notify(struct notifier_block *nb);
+void pdsc_unregister_notify(struct notifier_block *nb);
 void *pdsc_get_pf_struct(struct pci_dev *vf_pdev);
 int pds_client_register(struct pci_dev *pf_pdev, char *devname);
 int pds_client_unregister(struct pci_dev *pf_pdev, u16 client_id);