Merge tag 'clk-for-linus-3.14-part2' of git://git.linaro.org/people/mike.turquette...
[firefly-linux-kernel-4.4.55.git] / drivers / misc / mei / hw-me.c
index 3412adcdaeb08ec16fa4a060b32a9eaa2cc540b0..6f656c053b144a44b20b798e75e16f3efab49f7f 100644 (file)
@@ -185,7 +185,7 @@ static int mei_me_hw_reset(struct mei_device *dev, bool intr_enable)
 
        mei_me_reg_write(hw, H_CSR, hcsr);
 
-       if (dev->dev_state == MEI_DEV_POWER_DOWN)
+       if (intr_enable == false)
                mei_me_hw_reset_release(dev);
 
        return 0;
@@ -469,7 +469,7 @@ irqreturn_t mei_me_irq_thread_handler(int irq, void *dev_id)
        struct mei_device *dev = (struct mei_device *) dev_id;
        struct mei_cl_cb complete_list;
        s32 slots;
-       int rets;
+       int rets = 0;
 
        dev_dbg(&dev->pdev->dev, "function called after ISR to handle the interrupt processing.\n");
        /* initialize our complete list */
@@ -482,15 +482,10 @@ irqreturn_t mei_me_irq_thread_handler(int irq, void *dev_id)
                mei_clear_interrupts(dev);
 
        /* check if ME wants a reset */
-       if (!mei_hw_is_ready(dev) &&
-           dev->dev_state != MEI_DEV_RESETTING &&
-           dev->dev_state != MEI_DEV_INITIALIZING &&
-           dev->dev_state != MEI_DEV_POWER_DOWN &&
-           dev->dev_state != MEI_DEV_POWER_UP) {
-               dev_dbg(&dev->pdev->dev, "FW not ready.\n");
-               mei_reset(dev, 1);
-               mutex_unlock(&dev->device_lock);
-               return IRQ_HANDLED;
+       if (!mei_hw_is_ready(dev) && dev->dev_state != MEI_DEV_RESETTING) {
+               dev_warn(&dev->pdev->dev, "FW not ready: resetting.\n");
+               schedule_work(&dev->reset_work);
+               goto end;
        }
 
        /*  check if we need to start the dev */
@@ -500,15 +495,12 @@ irqreturn_t mei_me_irq_thread_handler(int irq, void *dev_id)
 
                        dev->recvd_hw_ready = true;
                        wake_up_interruptible(&dev->wait_hw_ready);
-
-                       mutex_unlock(&dev->device_lock);
-                       return IRQ_HANDLED;
                } else {
+
                        dev_dbg(&dev->pdev->dev, "Reset Completed.\n");
                        mei_me_hw_reset_release(dev);
-                       mutex_unlock(&dev->device_lock);
-                       return IRQ_HANDLED;
                }
+               goto end;
        }
        /* check slots available for reading */
        slots = mei_count_full_read_slots(dev);
@@ -516,21 +508,23 @@ irqreturn_t mei_me_irq_thread_handler(int irq, void *dev_id)
                /* we have urgent data to send so break the read */
                if (dev->wr_ext_msg.hdr.length)
                        break;
-               dev_dbg(&dev->pdev->dev, "slots =%08x\n", slots);
-               dev_dbg(&dev->pdev->dev, "call mei_irq_read_handler.\n");
+               dev_dbg(&dev->pdev->dev, "slots to read = %08x\n", slots);
                rets = mei_irq_read_handler(dev, &complete_list, &slots);
-               if (rets)
+               if (rets && dev->dev_state != MEI_DEV_RESETTING) {
+                       schedule_work(&dev->reset_work);
                        goto end;
+               }
        }
+
        rets = mei_irq_write_handler(dev, &complete_list);
-end:
-       dev_dbg(&dev->pdev->dev, "end of bottom half function.\n");
-       dev->hbuf_is_ready = mei_hbuf_is_ready(dev);
 
-       mutex_unlock(&dev->device_lock);
+       dev->hbuf_is_ready = mei_hbuf_is_ready(dev);
 
        mei_irq_compl_handler(dev, &complete_list);
 
+end:
+       dev_dbg(&dev->pdev->dev, "interrupt thread end ret = %d\n", rets);
+       mutex_unlock(&dev->device_lock);
        return IRQ_HANDLED;
 }
 static const struct mei_hw_ops mei_me_hw_ops = {