Beispiel #1
0
/* Called by xenbus when our backend node changes state */
static void
pcifront_backend_changed(struct xenbus_device *xdev,
						 XenbusState be_state)
{
	struct pcifront_device *pdev = xdev->data;

	switch (be_state) {
	case XenbusStateClosing:
		DPRINTF("backend closing (%s)\n", xdev->nodename);
		pcifront_disconnect(pdev);
		break;

	case XenbusStateClosed:
		DPRINTF("backend closed (%s)\n", xdev->nodename);
		pcifront_disconnect(pdev);
		break;

	case XenbusStateConnected:
		DPRINTF("backend connected (%s)\n", xdev->nodename);
		pcifront_connect(pdev);
		break;
		
	default:
		break;
	}
}
Beispiel #2
0
static int pcifront_try_disconnect(struct pcifront_device *pdev)
{
	int err = 0;
	enum xenbus_state prev_state;

	spin_lock(&pdev->dev_lock);

	prev_state = xenbus_read_driver_state(pdev->xdev->nodename);

	if (prev_state >= XenbusStateClosing)
		goto out;

	if(prev_state == XenbusStateConnected) {
		pcifront_free_roots(pdev);
		pcifront_disconnect(pdev);
	}

	err = xenbus_switch_state(pdev->xdev, XenbusStateClosed);

      out:
	spin_unlock(&pdev->dev_lock);

	return err;
}