(unsigned long int)cpu_to_be64(u64_crq[0]),
                   (unsigned long int)cpu_to_be64(u64_crq[1]));
 
+       if (!adapter->crq.active &&
+           crq->generic.first != IBMVNIC_CRQ_INIT_CMD) {
+               dev_warn(dev, "Invalid request detected while CRQ is inactive, possible device state change during reset\n");
+               return -EINVAL;
+       }
+
        /* Make sure the hypervisor sees the complete request */
        mb();
 
                        break;
                case IBMVNIC_CRQ_INIT_COMPLETE:
                        dev_info(dev, "Partner initialization complete\n");
+                       adapter->crq.active = true;
                        send_version_xchg(adapter);
                        break;
                default:
                return;
        case IBMVNIC_CRQ_XPORT_EVENT:
                netif_carrier_off(netdev);
+               adapter->crq.active = false;
                if (gen_crq->cmd == IBMVNIC_PARTITION_MIGRATED) {
                        dev_info(dev, "Migrated, re-enabling adapter\n");
                        ibmvnic_reset(adapter, VNIC_RESET_MOBILITY);
        /* Clean out the queue */
        memset(crq->msgs, 0, PAGE_SIZE);
        crq->cur = 0;
+       crq->active = false;
 
        /* And re-open it again */
        rc = plpar_hcall_norets(H_REG_CRQ, vdev->unit_address,
                         DMA_BIDIRECTIONAL);
        free_page((unsigned long)crq->msgs);
        crq->msgs = NULL;
+       crq->active = false;
 }
 
 static int init_crq_queue(struct ibmvnic_adapter *adapter)