struct ibmvnic_adapter *adapter = netdev_priv(netdev);
        int i, rc;
 
-       if (adapter->is_closed) {
+       adapter->state = VNIC_OPENING;
+
+       if (adapter->state == VNIC_CLOSED) {
                rc = ibmvnic_init(adapter);
                if (rc)
                        return rc;
                release_resources(adapter);
        } else {
                netif_tx_start_all_queues(netdev);
-               adapter->is_closed = false;
+               adapter->state = VNIC_OPEN;
        }
 
        return rc;
        int rc = 0;
        int i;
 
-       adapter->closing = true;
+       adapter->state = VNIC_CLOSING;
        disable_sub_crqs(adapter);
 
        if (adapter->napi) {
 
        release_resources(adapter);
 
-       adapter->is_closed = true;
-       adapter->closing = false;
+       adapter->state = VNIC_CLOSED;
        return rc;
 }
 
 {
        union sub_crq *entry = &scrq->msgs[scrq->cur];
 
-       if (entry->generic.first & IBMVNIC_CRQ_CMD_RSP || adapter->closing)
+       if (entry->generic.first & IBMVNIC_CRQ_CMD_RSP ||
+           adapter->state == VNIC_CLOSING)
                return 1;
        else
                return 0;
                return -ENOMEM;
 
        adapter = netdev_priv(netdev);
+       adapter->state = VNIC_PROBING;
        dev_set_drvdata(&dev->dev, netdev);
        adapter->vdev = dev;
        adapter->netdev = netdev;
        }
 
        netdev->mtu = adapter->req_mtu - ETH_HLEN;
-       adapter->is_closed = false;
 
        rc = register_netdev(netdev);
        if (rc) {
        }
        dev_info(&dev->dev, "ibmvnic registered\n");
 
+       adapter->state = VNIC_PROBED;
        return 0;
 }
 
        struct net_device *netdev = dev_get_drvdata(&dev->dev);
        struct ibmvnic_adapter *adapter = netdev_priv(netdev);
 
+       adapter->state = VNIC_REMOVING;
        unregister_netdev(netdev);
 
        release_resources(adapter);
        release_sub_crqs(adapter);
        release_crq_queue(adapter);
 
+       adapter->state = VNIC_REMOVED;
+
        free_netdev(netdev);
        dev_set_drvdata(&dev->dev, NULL);