* @flags:             Boolean state flags
  * @version:           IPA hardware version
  * @pdev:              Platform device
+ * @completion:                Used to signal pipeline clear transfer complete
  * @smp2p:             SMP2P information
  * @clock:             IPA clocking information
  * @table_addr:                DMA address of filter/route table content
        DECLARE_BITMAP(flags, IPA_FLAG_COUNT);
        enum ipa_version version;
        struct platform_device *pdev;
+       struct completion completion;
        struct notifier_block nb;
        void *notifier;
        struct ipa_smp2p *smp2p;
 
        struct ipa *ipa = container_of(trans->gsi, struct ipa, gsi);
        struct ipa_endpoint *endpoint;
 
+       /* This will complete when the transfer is received */
+       reinit_completion(&ipa->completion);
+
        /* Issue a no-op register write command (mask 0 means no write) */
        ipa_cmd_register_write_add(trans, 0, 0, 0, true);
 
        return 4;
 }
 
+void ipa_cmd_pipeline_clear_wait(struct ipa *ipa)
+{
+       wait_for_completion(&ipa->completion);
+}
+
 void ipa_cmd_pipeline_clear(struct ipa *ipa)
 {
        u32 count = ipa_cmd_pipeline_clear_count();
        if (trans) {
                ipa_cmd_pipeline_clear_add(trans);
                gsi_trans_commit_wait(trans);
+               ipa_cmd_pipeline_clear_wait(ipa);
        } else {
                dev_err(&ipa->pdev->dev,
                        "error allocating %u entry tag transaction\n", count);
 
  */
 u32 ipa_cmd_pipeline_clear_count(void);
 
+/**
+ * ipa_cmd_pipeline_clear_wait() - Wait pipeline clear to complete
+ * @ipa:       - IPA pointer
+ */
+void ipa_cmd_pipeline_clear_wait(struct ipa *ipa);
+
 /**
  * ipa_cmd_pipeline_clear() - Clear the hardware pipeline
+ * @ipa:       - IPA pointer
  */
 void ipa_cmd_pipeline_clear(struct ipa *ipa);
 
 
        /* XXX This should have a 1 second timeout */
        gsi_trans_commit_wait(trans);
 
+       ipa_cmd_pipeline_clear_wait(ipa);
+
        return 0;
 }
 
 static bool ipa_endpoint_status_tag(struct ipa_endpoint *endpoint,
                                    const struct ipa_status *status)
 {
-       return !!le16_get_bits(status->mask, IPA_STATUS_MASK_TAG_VALID_FMASK);
+       struct ipa_endpoint *command_endpoint;
+       struct ipa *ipa = endpoint->ipa;
+       u32 endpoint_id;
+
+       if (!le16_get_bits(status->mask, IPA_STATUS_MASK_TAG_VALID_FMASK))
+               return false;   /* No valid tag */
+
+       /* The status contains a valid tag.  We know the packet was sent to
+        * this endpoint (already verified by ipa_endpoint_status_skip()).
+        * If the packet came from the AP->command TX endpoint we know
+        * this packet was sent as part of the pipeline clear process.
+        */
+       endpoint_id = u8_get_bits(status->endp_src_idx,
+                                 IPA_STATUS_SRC_IDX_FMASK);
+       command_endpoint = ipa->name_map[IPA_ENDPOINT_AP_COMMAND_TX];
+       if (endpoint_id == command_endpoint->endpoint_id) {
+               complete(&ipa->completion);
+       } else {
+               dev_err(&ipa->pdev->dev,
+                       "unexpected tagged packet from endpoint %u\n",
+                       endpoint_id);
+       }
+
+       return true;
 }
 
 /* Return whether the status indicates the packet should be dropped */
 
        dev_set_drvdata(dev, ipa);
        ipa->clock = clock;
        ipa->version = data->version;
+       init_completion(&ipa->completion);
 
        ret = ipa_reg_init(ipa);
        if (ret)