octusb_octeon.c (228640) | octusb_octeon.c (229168) |
---|---|
1#include <sys/cdefs.h> | 1#include <sys/cdefs.h> |
2__FBSDID("$FreeBSD: head/sys/mips/cavium/usb/octusb_octeon.c 228640 2011-12-17 15:42:37Z bz $"); | 2__FBSDID("$FreeBSD: head/sys/mips/cavium/usb/octusb_octeon.c 229168 2012-01-01 09:12:21Z gonzo $"); |
3 4/*- 5 * Copyright (c) 2007-2008 Hans Petter Selasky. All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright --- 78 unchanged lines hidden (view full) --- 89} 90 91static int 92octusb_octeon_attach(device_t dev) 93{ 94 struct octusb_octeon_softc *sc = device_get_softc(dev); 95 int err; 96 int rid; | 3 4/*- 5 * Copyright (c) 2007-2008 Hans Petter Selasky. All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright --- 78 unchanged lines hidden (view full) --- 89} 90 91static int 92octusb_octeon_attach(device_t dev) 93{ 94 struct octusb_octeon_softc *sc = device_get_softc(dev); 95 int err; 96 int rid; |
97 int nports; 98 int i; |
|
97 98 /* setup controller interface softc */ 99 100 /* initialise some bus fields */ 101 sc->sc_dci.sc_bus.parent = dev; 102 sc->sc_dci.sc_bus.devices = sc->sc_dci.sc_devices; 103 sc->sc_dci.sc_bus.devices_max = OCTUSB_MAX_DEVICES; 104 105 /* get all DMA memory */ 106 if (usb_bus_mem_alloc_all(&sc->sc_dci.sc_bus, 107 USB_GET_DMA_TAG(dev), NULL)) { 108 return (ENOMEM); 109 } | 99 100 /* setup controller interface softc */ 101 102 /* initialise some bus fields */ 103 sc->sc_dci.sc_bus.parent = dev; 104 sc->sc_dci.sc_bus.devices = sc->sc_dci.sc_devices; 105 sc->sc_dci.sc_bus.devices_max = OCTUSB_MAX_DEVICES; 106 107 /* get all DMA memory */ 108 if (usb_bus_mem_alloc_all(&sc->sc_dci.sc_bus, 109 USB_GET_DMA_TAG(dev), NULL)) { 110 return (ENOMEM); 111 } |
110 rid = 0; 111 sc->sc_dci.sc_irq_res = 112 bus_alloc_resource(dev, SYS_RES_IRQ, &rid, 113 CVMX_IRQ_USB, CVMX_IRQ_USB, 1, RF_ACTIVE); 114 if (!(sc->sc_dci.sc_irq_res)) { 115 goto error; | 112 nports = cvmx_usb_get_num_ports(); 113 if (nports > OCTUSB_MAX_PORTS) 114 panic("octusb: too many USB ports %d", nports); 115 for (i = 0; i < nports; i++) { 116 rid = 0; 117 sc->sc_dci.sc_irq_res[i] = 118 bus_alloc_resource(dev, SYS_RES_IRQ, &rid, 119 CVMX_IRQ_USB0 + i, CVMX_IRQ_USB0 + i, 1, RF_ACTIVE); 120 if (!(sc->sc_dci.sc_irq_res[i])) { 121 goto error; 122 } 123 124#if (__FreeBSD_version >= 700031) 125 err = bus_setup_intr(dev, sc->sc_dci.sc_irq_res[i], INTR_TYPE_BIO | INTR_MPSAFE, 126 NULL, (driver_intr_t *)octusb_interrupt, sc, &sc->sc_dci.sc_intr_hdl[i]); 127#else 128 err = bus_setup_intr(dev, sc->sc_dci.sc_irq_res[i], INTR_TYPE_BIO | INTR_MPSAFE, 129 (driver_intr_t *)octusb_interrupt, sc, &sc->sc_dci.sc_intr_hdl[i]); 130#endif 131 if (err) { 132 sc->sc_dci.sc_intr_hdl[i] = NULL; 133 goto error; 134 } |
116 } 117 118 sc->sc_dci.sc_bus.bdev = device_add_child(dev, "usbus", -1); 119 if (!(sc->sc_dci.sc_bus.bdev)) { 120 goto error; 121 } 122 device_set_ivars(sc->sc_dci.sc_bus.bdev, &sc->sc_dci.sc_bus); 123 | 135 } 136 137 sc->sc_dci.sc_bus.bdev = device_add_child(dev, "usbus", -1); 138 if (!(sc->sc_dci.sc_bus.bdev)) { 139 goto error; 140 } 141 device_set_ivars(sc->sc_dci.sc_bus.bdev, &sc->sc_dci.sc_bus); 142 |
124#if (__FreeBSD_version >= 700031) 125 err = bus_setup_intr(dev, sc->sc_dci.sc_irq_res, INTR_TYPE_BIO | INTR_MPSAFE, 126 NULL, (driver_intr_t *)octusb_interrupt, sc, &sc->sc_dci.sc_intr_hdl); 127#else 128 err = bus_setup_intr(dev, sc->sc_dci.sc_irq_res, INTR_TYPE_BIO | INTR_MPSAFE, 129 (driver_intr_t *)octusb_interrupt, sc, &sc->sc_dci.sc_intr_hdl); 130#endif 131 if (err) { 132 sc->sc_dci.sc_intr_hdl = NULL; 133 goto error; 134 } | 143 |
135 err = octusb_init(&sc->sc_dci); 136 if (!err) { 137 err = device_probe_and_attach(sc->sc_dci.sc_bus.bdev); 138 } 139 if (err) { 140 goto error; 141 } 142 return (0); --- 4 unchanged lines hidden (view full) --- 147} 148 149static int 150octusb_octeon_detach(device_t dev) 151{ 152 struct octusb_octeon_softc *sc = device_get_softc(dev); 153 device_t bdev; 154 int err; | 144 err = octusb_init(&sc->sc_dci); 145 if (!err) { 146 err = device_probe_and_attach(sc->sc_dci.sc_bus.bdev); 147 } 148 if (err) { 149 goto error; 150 } 151 return (0); --- 4 unchanged lines hidden (view full) --- 156} 157 158static int 159octusb_octeon_detach(device_t dev) 160{ 161 struct octusb_octeon_softc *sc = device_get_softc(dev); 162 device_t bdev; 163 int err; |
164 int nports; 165 int i; |
|
155 156 if (sc->sc_dci.sc_bus.bdev) { 157 bdev = sc->sc_dci.sc_bus.bdev; 158 device_detach(bdev); 159 device_delete_child(dev, bdev); 160 } 161 /* during module unload there are lots of children leftover */ 162 device_delete_children(dev); 163 | 166 167 if (sc->sc_dci.sc_bus.bdev) { 168 bdev = sc->sc_dci.sc_bus.bdev; 169 device_detach(bdev); 170 device_delete_child(dev, bdev); 171 } 172 /* during module unload there are lots of children leftover */ 173 device_delete_children(dev); 174 |
164 if (sc->sc_dci.sc_irq_res && sc->sc_dci.sc_intr_hdl) { | 175 if (sc->sc_dci.sc_irq_res[0] && sc->sc_dci.sc_intr_hdl[0]) |
165 /* | 176 /* |
166 * only call octusb_octeon_uninit() after octusb_octeon_init() 167 */ | 177 * only call octusb_octeon_uninit() after octusb_octeon_init() 178 */ |
168 octusb_uninit(&sc->sc_dci); 169 | 179 octusb_uninit(&sc->sc_dci); 180 |
170 err = bus_teardown_intr(dev, sc->sc_dci.sc_irq_res, 171 sc->sc_dci.sc_intr_hdl); 172 sc->sc_dci.sc_intr_hdl = NULL; | 181 nports = cvmx_usb_get_num_ports(); 182 if (nports > OCTUSB_MAX_PORTS) 183 panic("octusb: too many USB ports %d", nports); 184 for (i = 0; i < nports; i++) { 185 if (sc->sc_dci.sc_irq_res[0] && sc->sc_dci.sc_intr_hdl[0]) { 186 err = bus_teardown_intr(dev, sc->sc_dci.sc_irq_res[i], 187 sc->sc_dci.sc_intr_hdl[i]); 188 sc->sc_dci.sc_intr_hdl[i] = NULL; 189 } 190 if (sc->sc_dci.sc_irq_res) { 191 bus_release_resource(dev, SYS_RES_IRQ, 0, 192 sc->sc_dci.sc_irq_res[i]); 193 sc->sc_dci.sc_irq_res[i] = NULL; 194 } |
173 } | 195 } |
174 if (sc->sc_dci.sc_irq_res) { 175 bus_release_resource(dev, SYS_RES_IRQ, 0, 176 sc->sc_dci.sc_irq_res); 177 sc->sc_dci.sc_irq_res = NULL; 178 } | |
179 usb_bus_mem_free_all(&sc->sc_dci.sc_bus, NULL); 180 181 return (0); 182} 183 184static device_method_t octusb_octeon_methods[] = { 185 /* Device interface */ 186 DEVMETHOD(device_identify, octusb_octeon_identify), --- 19 unchanged lines hidden --- | 196 usb_bus_mem_free_all(&sc->sc_dci.sc_bus, NULL); 197 198 return (0); 199} 200 201static device_method_t octusb_octeon_methods[] = { 202 /* Device interface */ 203 DEVMETHOD(device_identify, octusb_octeon_identify), --- 19 unchanged lines hidden --- |