void usb_attach(USBPort *port, USBDevice *dev)

{

    if (dev != NULL) {

        /* attach */

        if (port->dev) {

            usb_attach(port, NULL);

        }

        dev->port = port;

        port->dev = dev;

        port->ops->attach(port);

        usb_send_msg(dev, USB_MSG_ATTACH);

    } else {

        /* detach */

        dev = port->dev;

        port->ops->detach(port);

        if (dev) {

            usb_send_msg(dev, USB_MSG_DETACH);

            dev->port = NULL;

            port->dev = NULL;

        }

    }

}

void usb_attach(USBPort *port, USBDevice *dev)

{

    if (dev != NULL) {

        

        if (port->dev) {

            usb_attach(port, NULL);

        }

        dev->port = port;

        port->dev = dev;

        port->ops->attach(port);

        usb_send_msg(dev, USB_MSG_ATTACH);

    } else {

        

        dev = port->dev;

        port->ops->detach(port);

        if (dev) {

            usb_send_msg(dev, USB_MSG_DETACH);

            dev->port = NULL;

            port->dev = NULL;

        }

    }

}

void FUNC_0(USBPort *VAR_0, USBDevice *VAR_1)

{

    if (VAR_1 != NULL) {

        

        if (VAR_0->VAR_1) {

            FUNC_0(VAR_0, NULL);

        }

        VAR_1->VAR_0 = VAR_0;

        VAR_0->VAR_1 = VAR_1;

        VAR_0->ops->attach(VAR_0);

        usb_send_msg(VAR_1, USB_MSG_ATTACH);

    } else {

        

        VAR_1 = VAR_0->VAR_1;

        VAR_0->ops->detach(VAR_0);

        if (VAR_1) {

            usb_send_msg(VAR_1, USB_MSG_DETACH);

            VAR_1->VAR_0 = NULL;

            VAR_0->VAR_1 = NULL;

        }

    }

}

void FUNC_0(USBPort *VAR_0, USBDevice *VAR_1)
{ if (VAR_1 != NULL) { if (VAR_0->VAR_1) { FUNC_0(VAR_0, NULL); } VAR_1->VAR_0 = VAR_0; VAR_0->VAR_1 = VAR_1; VAR_0->ops->attach(VAR_0); usb_send_msg(VAR_1, USB_MSG_ATTACH); } else { VAR_1 = VAR_0->VAR_1; VAR_0->ops->detach(VAR_0); if (VAR_1) { usb_send_msg(VAR_1, USB_MSG_DETACH); VAR_1->VAR_0 = NULL; VAR_0->VAR_1 = NULL; } } }