|
@@ -3147,6 +3147,12 @@ static int ibmvnic_send_crq(struct ibmvnic_adapter *adapter,
|
|
|
(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();
|
|
|
|
|
@@ -4225,6 +4231,7 @@ static void ibmvnic_handle_crq(union ibmvnic_crq *crq,
|
|
|
break;
|
|
|
case IBMVNIC_CRQ_INIT_COMPLETE:
|
|
|
dev_info(dev, "Partner initialization complete\n");
|
|
|
+ adapter->crq.active = true;
|
|
|
send_version_xchg(adapter);
|
|
|
break;
|
|
|
default:
|
|
@@ -4233,6 +4240,7 @@ static void ibmvnic_handle_crq(union ibmvnic_crq *crq,
|
|
|
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);
|
|
@@ -4420,6 +4428,7 @@ static int ibmvnic_reset_crq(struct ibmvnic_adapter *adapter)
|
|
|
/* 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,
|
|
@@ -4454,6 +4463,7 @@ static void release_crq_queue(struct ibmvnic_adapter *adapter)
|
|
|
DMA_BIDIRECTIONAL);
|
|
|
free_page((unsigned long)crq->msgs);
|
|
|
crq->msgs = NULL;
|
|
|
+ crq->active = false;
|
|
|
}
|
|
|
|
|
|
static int init_crq_queue(struct ibmvnic_adapter *adapter)
|