diff options
| -rw-r--r-- | drivers/misc/mei/hw-me.c | 17 | ||||
| -rw-r--r-- | drivers/misc/mei/interrupt.c | 2 | ||||
| -rw-r--r-- | drivers/misc/mei/main.c | 2 |
3 files changed, 12 insertions, 9 deletions
diff --git a/drivers/misc/mei/hw-me.c b/drivers/misc/mei/hw-me.c index ec4ab895f03d..ed61659fd388 100644 --- a/drivers/misc/mei/hw-me.c +++ b/drivers/misc/mei/hw-me.c | |||
| @@ -106,8 +106,9 @@ void mei_hcsr_set(struct mei_device *dev) | |||
| 106 | */ | 106 | */ |
| 107 | void mei_clear_interrupts(struct mei_device *dev) | 107 | void mei_clear_interrupts(struct mei_device *dev) |
| 108 | { | 108 | { |
| 109 | if ((dev->host_hw_state & H_IS) == H_IS) | 109 | u32 hcsr = mei_hcsr_read(dev); |
| 110 | mei_reg_write(dev, H_CSR, dev->host_hw_state); | 110 | if ((hcsr & H_IS) == H_IS) |
| 111 | mei_reg_write(dev, H_CSR, hcsr); | ||
| 111 | } | 112 | } |
| 112 | 113 | ||
| 113 | /** | 114 | /** |
| @@ -117,8 +118,10 @@ void mei_clear_interrupts(struct mei_device *dev) | |||
| 117 | */ | 118 | */ |
| 118 | void mei_enable_interrupts(struct mei_device *dev) | 119 | void mei_enable_interrupts(struct mei_device *dev) |
| 119 | { | 120 | { |
| 120 | dev->host_hw_state |= H_IE; | 121 | u32 hcsr = mei_hcsr_read(dev); |
| 121 | mei_hcsr_set(dev); | 122 | hcsr |= H_IE; |
| 123 | hcsr &= ~H_IS; | ||
| 124 | mei_reg_write(dev, H_CSR, hcsr); | ||
| 122 | } | 125 | } |
| 123 | 126 | ||
| 124 | /** | 127 | /** |
| @@ -128,8 +131,10 @@ void mei_enable_interrupts(struct mei_device *dev) | |||
| 128 | */ | 131 | */ |
| 129 | void mei_disable_interrupts(struct mei_device *dev) | 132 | void mei_disable_interrupts(struct mei_device *dev) |
| 130 | { | 133 | { |
| 131 | dev->host_hw_state &= ~H_IE; | 134 | u32 hcsr = mei_hcsr_read(dev); |
| 132 | mei_hcsr_set(dev); | 135 | hcsr &= ~H_IE; |
| 136 | hcsr &= ~H_IS; | ||
| 137 | mei_reg_write(dev, H_CSR, hcsr); | ||
| 133 | } | 138 | } |
| 134 | 139 | ||
| 135 | /** | 140 | /** |
diff --git a/drivers/misc/mei/interrupt.c b/drivers/misc/mei/interrupt.c index d1ef92617c19..d7e1b797e87b 100644 --- a/drivers/misc/mei/interrupt.c +++ b/drivers/misc/mei/interrupt.c | |||
| @@ -691,7 +691,6 @@ irqreturn_t mei_interrupt_thread_handler(int irq, void *dev_id) | |||
| 691 | /* initialize our complete list */ | 691 | /* initialize our complete list */ |
| 692 | mutex_lock(&dev->device_lock); | 692 | mutex_lock(&dev->device_lock); |
| 693 | mei_io_list_init(&complete_list); | 693 | mei_io_list_init(&complete_list); |
| 694 | dev->host_hw_state = mei_hcsr_read(dev); | ||
| 695 | 694 | ||
| 696 | /* Ack the interrupt here | 695 | /* Ack the interrupt here |
| 697 | * In case of MSI we don't go through the quick handler */ | 696 | * In case of MSI we don't go through the quick handler */ |
| @@ -710,6 +709,7 @@ irqreturn_t mei_interrupt_thread_handler(int irq, void *dev_id) | |||
| 710 | return IRQ_HANDLED; | 709 | return IRQ_HANDLED; |
| 711 | } | 710 | } |
| 712 | 711 | ||
| 712 | dev->host_hw_state = mei_hcsr_read(dev); | ||
| 713 | /* check if we need to start the dev */ | 713 | /* check if we need to start the dev */ |
| 714 | if ((dev->host_hw_state & H_RDY) == 0) { | 714 | if ((dev->host_hw_state & H_RDY) == 0) { |
| 715 | if ((dev->me_hw_state & ME_RDY_HRA) == ME_RDY_HRA) { | 715 | if ((dev->me_hw_state & ME_RDY_HRA) == ME_RDY_HRA) { |
diff --git a/drivers/misc/mei/main.c b/drivers/misc/mei/main.c index ec5fd7a0e289..f72bb77fc279 100644 --- a/drivers/misc/mei/main.c +++ b/drivers/misc/mei/main.c | |||
| @@ -915,8 +915,6 @@ static int mei_probe(struct pci_dev *pdev, | |||
| 915 | return 0; | 915 | return 0; |
| 916 | 916 | ||
| 917 | release_irq: | 917 | release_irq: |
| 918 | /* disable interrupts */ | ||
| 919 | dev->host_hw_state = mei_hcsr_read(dev); | ||
| 920 | mei_disable_interrupts(dev); | 918 | mei_disable_interrupts(dev); |
| 921 | flush_scheduled_work(); | 919 | flush_scheduled_work(); |
| 922 | free_irq(pdev->irq, dev); | 920 | free_irq(pdev->irq, dev); |
