diff --git a/drivers/misc/mei/bus.c b/drivers/misc/mei/bus.c index 162cd542cac9..c626dc9937eb 100644 --- a/drivers/misc/mei/bus.c +++ b/drivers/misc/mei/bus.c @@ -441,3 +441,25 @@ int mei_cl_register_event_cb(struct mei_cl_device *device, return 0; } EXPORT_SYMBOL_GPL(mei_cl_register_event_cb); + +void mei_cl_bus_rx_event(struct mei_cl *cl) +{ + struct mei_cl_device *device = cl->device; + + if (!device || !device->event_cb) + return; + + set_bit(MEI_CL_EVENT_RX, &device->events); + + schedule_work(&device->event_work); +} + +int __init mei_cl_bus_init(void) +{ + return bus_register(&mei_cl_bus_type); +} + +void __exit mei_cl_bus_exit(void) +{ + bus_unregister(&mei_cl_bus_type); +} diff --git a/drivers/misc/mei/interrupt.c b/drivers/misc/mei/interrupt.c index 6ce45ef2cd6c..255e0853479c 100644 --- a/drivers/misc/mei/interrupt.c +++ b/drivers/misc/mei/interrupt.c @@ -50,6 +50,8 @@ static void mei_cl_complete_handler(struct mei_cl *cl, struct mei_cl_cb *cb) cl->reading_state = MEI_READ_COMPLETE; if (waitqueue_active(&cl->rx_wait)) wake_up_interruptible(&cl->rx_wait); + else + mei_cl_bus_rx_event(cl); } } diff --git a/drivers/misc/mei/main.c b/drivers/misc/mei/main.c index 27b3df2ba070..872de9d1494b 100644 --- a/drivers/misc/mei/main.c +++ b/drivers/misc/mei/main.c @@ -767,6 +767,19 @@ void mei_deregister(void) } EXPORT_SYMBOL_GPL(mei_deregister); +static int __init mei_init(void) +{ + return mei_cl_bus_init(); +} + +static void __exit mei_exit(void) +{ + mei_cl_bus_exit(); +} + +module_init(mei_init); +module_exit(mei_exit); + MODULE_AUTHOR("Intel Corporation"); MODULE_DESCRIPTION("Intel(R) Management Engine Interface"); MODULE_LICENSE("GPL v2"); diff --git a/drivers/misc/mei/mei_dev.h b/drivers/misc/mei/mei_dev.h index 0313c24a1a49..7d594bedc685 100644 --- a/drivers/misc/mei/mei_dev.h +++ b/drivers/misc/mei/mei_dev.h @@ -292,6 +292,11 @@ struct mei_cl_transport_ops { int (*recv)(struct mei_cl_device *device, u8 *buf, size_t length); }; +void mei_cl_bus_rx_event(struct mei_cl *cl); +int mei_cl_bus_init(void); +void mei_cl_bus_exit(void); + + /** * struct mei_cl_device - MEI device handle * An mei_cl_device pointer is returned from mei_add_device() @@ -451,7 +456,6 @@ static inline u32 mei_data2slots(size_t length) return DIV_ROUND_UP(sizeof(struct mei_msg_hdr) + length, 4); } - /* * mei init function prototypes */ diff --git a/drivers/misc/mei/pci-me.c b/drivers/misc/mei/pci-me.c index 178928eaf6cf..a1a582b66f0d 100644 --- a/drivers/misc/mei/pci-me.c +++ b/drivers/misc/mei/pci-me.c @@ -197,7 +197,6 @@ static int mei_me_probe(struct pci_dev *pdev, const struct pci_device_id *ent) mei_pdev = pdev; pci_set_drvdata(pdev, dev); - schedule_delayed_work(&dev->timer_work, HZ); mutex_unlock(&mei_mutex);