Beispiel #1
0
static int
octusb_octeon_detach(device_t dev)
{
	struct octusb_octeon_softc *sc = device_get_softc(dev);
	device_t bdev;
	int err;

	if (sc->sc_dci.sc_bus.bdev) {
		bdev = sc->sc_dci.sc_bus.bdev;
		device_detach(bdev);
		device_delete_child(dev, bdev);
	}
	/* during module unload there are lots of children leftover */
	device_delete_children(dev);

	if (sc->sc_dci.sc_irq_res && sc->sc_dci.sc_intr_hdl) {
		/*
		 * only call octusb_octeon_uninit() after octusb_octeon_init()
		 */
		octusb_uninit(&sc->sc_dci);

		err = bus_teardown_intr(dev, sc->sc_dci.sc_irq_res,
		    sc->sc_dci.sc_intr_hdl);
		sc->sc_dci.sc_intr_hdl = NULL;
	}
	if (sc->sc_dci.sc_irq_res) {
		bus_release_resource(dev, SYS_RES_IRQ, 0,
		    sc->sc_dci.sc_irq_res);
		sc->sc_dci.sc_irq_res = NULL;
	}
	usb_bus_mem_free_all(&sc->sc_dci.sc_bus, NULL);

	return (0);
}
Beispiel #2
0
static int
octusb_octeon_shutdown(device_t dev)
{
	struct octusb_octeon_softc *sc = device_get_softc(dev);
	int err;

	err = bus_generic_shutdown(dev);
	if (err)
		return (err);

	octusb_uninit(&sc->sc_dci);

	return (0);
}
Beispiel #3
0
static int
octusb_octeon_detach(device_t dev)
{
    struct octusb_octeon_softc *sc = device_get_softc(dev);
    device_t bdev;
    int err;
    int nports;
    int i;

    if (sc->sc_dci.sc_bus.bdev) {
        bdev = sc->sc_dci.sc_bus.bdev;
        device_detach(bdev);
        device_delete_child(dev, bdev);
    }
    /* during module unload there are lots of children leftover */
    device_delete_children(dev);

    if (sc->sc_dci.sc_irq_res[0] && sc->sc_dci.sc_intr_hdl[0])
        /*
         * only call octusb_octeon_uninit() after octusb_octeon_init()
         */
        octusb_uninit(&sc->sc_dci);

    nports = cvmx_usb_get_num_ports();
    if (nports > OCTUSB_MAX_PORTS)
        panic("octusb: too many USB ports %d", nports);
    for (i = 0; i < nports; i++) {
        if (sc->sc_dci.sc_irq_res[0] && sc->sc_dci.sc_intr_hdl[0]) {
            err = bus_teardown_intr(dev, sc->sc_dci.sc_irq_res[i],
                                    sc->sc_dci.sc_intr_hdl[i]);
            sc->sc_dci.sc_intr_hdl[i] = NULL;
        }
        if (sc->sc_dci.sc_irq_res) {
            bus_release_resource(dev, SYS_RES_IRQ, 0,
                                 sc->sc_dci.sc_irq_res[i]);
            sc->sc_dci.sc_irq_res[i] = NULL;
        }
    }
    usb_bus_mem_free_all(&sc->sc_dci.sc_bus, NULL);

    return (0);
}