diff options
| -rw-r--r-- | drivers/misc/mei/hw-me.c | 13 | ||||
| -rw-r--r-- | drivers/misc/mei/hw-txe.c | 15 | ||||
| -rw-r--r-- | drivers/misc/mei/init.c | 6 | ||||
| -rw-r--r-- | drivers/misc/mei/mei_dev.h | 8 |
4 files changed, 38 insertions, 4 deletions
diff --git a/drivers/misc/mei/hw-me.c b/drivers/misc/mei/hw-me.c index 998f7fc0e920..e2b56e8cf745 100644 --- a/drivers/misc/mei/hw-me.c +++ b/drivers/misc/mei/hw-me.c | |||
| @@ -285,6 +285,18 @@ static void mei_me_intr_disable(struct mei_device *dev) | |||
| 285 | } | 285 | } |
| 286 | 286 | ||
| 287 | /** | 287 | /** |
| 288 | * mei_me_synchronize_irq - wait for pending IRQ handlers | ||
| 289 | * | ||
| 290 | * @dev: the device structure | ||
| 291 | */ | ||
| 292 | static void mei_me_synchronize_irq(struct mei_device *dev) | ||
| 293 | { | ||
| 294 | struct pci_dev *pdev = to_pci_dev(dev->dev); | ||
| 295 | |||
| 296 | synchronize_irq(pdev->irq); | ||
| 297 | } | ||
| 298 | |||
| 299 | /** | ||
| 288 | * mei_me_hw_reset_release - release device from the reset | 300 | * mei_me_hw_reset_release - release device from the reset |
| 289 | * | 301 | * |
| 290 | * @dev: the device structure | 302 | * @dev: the device structure |
| @@ -1238,6 +1250,7 @@ static const struct mei_hw_ops mei_me_hw_ops = { | |||
| 1238 | .intr_clear = mei_me_intr_clear, | 1250 | .intr_clear = mei_me_intr_clear, |
| 1239 | .intr_enable = mei_me_intr_enable, | 1251 | .intr_enable = mei_me_intr_enable, |
| 1240 | .intr_disable = mei_me_intr_disable, | 1252 | .intr_disable = mei_me_intr_disable, |
| 1253 | .synchronize_irq = mei_me_synchronize_irq, | ||
| 1241 | 1254 | ||
| 1242 | .hbuf_free_slots = mei_me_hbuf_empty_slots, | 1255 | .hbuf_free_slots = mei_me_hbuf_empty_slots, |
| 1243 | .hbuf_is_ready = mei_me_hbuf_is_empty, | 1256 | .hbuf_is_ready = mei_me_hbuf_is_empty, |
diff --git a/drivers/misc/mei/hw-txe.c b/drivers/misc/mei/hw-txe.c index b7a2f622f23c..e9f8c0aeec13 100644 --- a/drivers/misc/mei/hw-txe.c +++ b/drivers/misc/mei/hw-txe.c | |||
| @@ -19,7 +19,7 @@ | |||
| 19 | #include <linux/ktime.h> | 19 | #include <linux/ktime.h> |
| 20 | #include <linux/delay.h> | 20 | #include <linux/delay.h> |
| 21 | #include <linux/kthread.h> | 21 | #include <linux/kthread.h> |
| 22 | #include <linux/irqreturn.h> | 22 | #include <linux/interrupt.h> |
| 23 | #include <linux/pm_runtime.h> | 23 | #include <linux/pm_runtime.h> |
| 24 | 24 | ||
| 25 | #include <linux/mei.h> | 25 | #include <linux/mei.h> |
| @@ -441,6 +441,18 @@ static void mei_txe_intr_enable(struct mei_device *dev) | |||
| 441 | } | 441 | } |
| 442 | 442 | ||
| 443 | /** | 443 | /** |
| 444 | * mei_txe_synchronize_irq - wait for pending IRQ handlers | ||
| 445 | * | ||
| 446 | * @dev: the device structure | ||
| 447 | */ | ||
| 448 | static void mei_txe_synchronize_irq(struct mei_device *dev) | ||
| 449 | { | ||
| 450 | struct pci_dev *pdev = to_pci_dev(dev->dev); | ||
| 451 | |||
| 452 | synchronize_irq(pdev->irq); | ||
| 453 | } | ||
| 454 | |||
| 455 | /** | ||
| 444 | * mei_txe_pending_interrupts - check if there are pending interrupts | 456 | * mei_txe_pending_interrupts - check if there are pending interrupts |
| 445 | * only Aliveness, Input ready, and output doorbell are of relevance | 457 | * only Aliveness, Input ready, and output doorbell are of relevance |
| 446 | * | 458 | * |
| @@ -1168,6 +1180,7 @@ static const struct mei_hw_ops mei_txe_hw_ops = { | |||
| 1168 | .intr_clear = mei_txe_intr_clear, | 1180 | .intr_clear = mei_txe_intr_clear, |
| 1169 | .intr_enable = mei_txe_intr_enable, | 1181 | .intr_enable = mei_txe_intr_enable, |
| 1170 | .intr_disable = mei_txe_intr_disable, | 1182 | .intr_disable = mei_txe_intr_disable, |
| 1183 | .synchronize_irq = mei_txe_synchronize_irq, | ||
| 1171 | 1184 | ||
| 1172 | .hbuf_free_slots = mei_txe_hbuf_empty_slots, | 1185 | .hbuf_free_slots = mei_txe_hbuf_empty_slots, |
| 1173 | .hbuf_is_ready = mei_txe_is_input_ready, | 1186 | .hbuf_is_ready = mei_txe_is_input_ready, |
diff --git a/drivers/misc/mei/init.c b/drivers/misc/mei/init.c index 9a9c2484d107..41e5760a6886 100644 --- a/drivers/misc/mei/init.c +++ b/drivers/misc/mei/init.c | |||
| @@ -122,6 +122,10 @@ int mei_reset(struct mei_device *dev) | |||
| 122 | mei_dev_state_str(state), fw_sts_str); | 122 | mei_dev_state_str(state), fw_sts_str); |
| 123 | } | 123 | } |
| 124 | 124 | ||
| 125 | mei_clear_interrupts(dev); | ||
| 126 | |||
| 127 | mei_synchronize_irq(dev); | ||
| 128 | |||
| 125 | /* we're already in reset, cancel the init timer | 129 | /* we're already in reset, cancel the init timer |
| 126 | * if the reset was called due the hbm protocol error | 130 | * if the reset was called due the hbm protocol error |
| 127 | * we need to call it before hw start | 131 | * we need to call it before hw start |
| @@ -273,8 +277,6 @@ int mei_restart(struct mei_device *dev) | |||
| 273 | 277 | ||
| 274 | mutex_lock(&dev->device_lock); | 278 | mutex_lock(&dev->device_lock); |
| 275 | 279 | ||
| 276 | mei_clear_interrupts(dev); | ||
| 277 | |||
| 278 | dev->dev_state = MEI_DEV_POWER_UP; | 280 | dev->dev_state = MEI_DEV_POWER_UP; |
| 279 | dev->reset_count = 0; | 281 | dev->reset_count = 0; |
| 280 | 282 | ||
diff --git a/drivers/misc/mei/mei_dev.h b/drivers/misc/mei/mei_dev.h index 82e69a00b7a1..0e94df517410 100644 --- a/drivers/misc/mei/mei_dev.h +++ b/drivers/misc/mei/mei_dev.h | |||
| @@ -267,6 +267,7 @@ struct mei_cl { | |||
| 267 | * @intr_clear : clear pending interrupts | 267 | * @intr_clear : clear pending interrupts |
| 268 | * @intr_enable : enable interrupts | 268 | * @intr_enable : enable interrupts |
| 269 | * @intr_disable : disable interrupts | 269 | * @intr_disable : disable interrupts |
| 270 | * @synchronize_irq : synchronize irqs | ||
| 270 | * | 271 | * |
| 271 | * @hbuf_free_slots : query for write buffer empty slots | 272 | * @hbuf_free_slots : query for write buffer empty slots |
| 272 | * @hbuf_is_ready : query if write buffer is empty | 273 | * @hbuf_is_ready : query if write buffer is empty |
| @@ -288,7 +289,6 @@ struct mei_hw_ops { | |||
| 288 | int (*hw_start)(struct mei_device *dev); | 289 | int (*hw_start)(struct mei_device *dev); |
| 289 | void (*hw_config)(struct mei_device *dev); | 290 | void (*hw_config)(struct mei_device *dev); |
| 290 | 291 | ||
| 291 | |||
| 292 | int (*fw_status)(struct mei_device *dev, struct mei_fw_status *fw_sts); | 292 | int (*fw_status)(struct mei_device *dev, struct mei_fw_status *fw_sts); |
| 293 | enum mei_pg_state (*pg_state)(struct mei_device *dev); | 293 | enum mei_pg_state (*pg_state)(struct mei_device *dev); |
| 294 | bool (*pg_in_transition)(struct mei_device *dev); | 294 | bool (*pg_in_transition)(struct mei_device *dev); |
| @@ -297,6 +297,7 @@ struct mei_hw_ops { | |||
| 297 | void (*intr_clear)(struct mei_device *dev); | 297 | void (*intr_clear)(struct mei_device *dev); |
| 298 | void (*intr_enable)(struct mei_device *dev); | 298 | void (*intr_enable)(struct mei_device *dev); |
| 299 | void (*intr_disable)(struct mei_device *dev); | 299 | void (*intr_disable)(struct mei_device *dev); |
| 300 | void (*synchronize_irq)(struct mei_device *dev); | ||
| 300 | 301 | ||
| 301 | int (*hbuf_free_slots)(struct mei_device *dev); | 302 | int (*hbuf_free_slots)(struct mei_device *dev); |
| 302 | bool (*hbuf_is_ready)(struct mei_device *dev); | 303 | bool (*hbuf_is_ready)(struct mei_device *dev); |
| @@ -640,6 +641,11 @@ static inline void mei_disable_interrupts(struct mei_device *dev) | |||
| 640 | dev->ops->intr_disable(dev); | 641 | dev->ops->intr_disable(dev); |
| 641 | } | 642 | } |
| 642 | 643 | ||
| 644 | static inline void mei_synchronize_irq(struct mei_device *dev) | ||
| 645 | { | ||
| 646 | dev->ops->synchronize_irq(dev); | ||
| 647 | } | ||
| 648 | |||
| 643 | static inline bool mei_host_is_ready(struct mei_device *dev) | 649 | static inline bool mei_host_is_ready(struct mei_device *dev) |
| 644 | { | 650 | { |
| 645 | return dev->ops->host_is_ready(dev); | 651 | return dev->ops->host_is_ready(dev); |
