if_sk.c (111119) | if_sk.c (112872) |
---|---|
1/* 2 * Copyright (c) 1997, 1998, 1999, 2000 3 * Bill Paul <wpaul@ctr.columbia.edu>. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 15 unchanged lines hidden (view full) --- 24 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 30 * THE POSSIBILITY OF SUCH DAMAGE. 31 * | 1/* 2 * Copyright (c) 1997, 1998, 1999, 2000 3 * Bill Paul <wpaul@ctr.columbia.edu>. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 15 unchanged lines hidden (view full) --- 24 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 30 * THE POSSIBILITY OF SUCH DAMAGE. 31 * |
32 * $FreeBSD: head/sys/dev/sk/if_sk.c 111119 2003-02-19 05:47:46Z imp $ | 32 * $FreeBSD: head/sys/dev/sk/if_sk.c 112872 2003-03-31 17:29:43Z njl $ |
33 */ 34 35/* 36 * SysKonnect SK-NET gigabit ethernet driver for FreeBSD. Supports 37 * the SK-984x series adapters, both single port and dual port. 38 * References: 39 * The XaQti XMAC II datasheet, 40 * http://www.freebsd.org/~wpaul/SysKonnect/xmacii_datasheet_rev_c_9-29.pdf --- 67 unchanged lines hidden (view full) --- 108 109MODULE_DEPEND(sk, miibus, 1, 1, 1); 110 111/* "controller miibus0" required. See GENERIC if you get errors here. */ 112#include "miibus_if.h" 113 114#ifndef lint 115static const char rcsid[] = | 33 */ 34 35/* 36 * SysKonnect SK-NET gigabit ethernet driver for FreeBSD. Supports 37 * the SK-984x series adapters, both single port and dual port. 38 * References: 39 * The XaQti XMAC II datasheet, 40 * http://www.freebsd.org/~wpaul/SysKonnect/xmacii_datasheet_rev_c_9-29.pdf --- 67 unchanged lines hidden (view full) --- 108 109MODULE_DEPEND(sk, miibus, 1, 1, 1); 110 111/* "controller miibus0" required. See GENERIC if you get errors here. */ 112#include "miibus_if.h" 113 114#ifndef lint 115static const char rcsid[] = |
116 "$FreeBSD: head/sys/dev/sk/if_sk.c 111119 2003-02-19 05:47:46Z imp $"; | 116 "$FreeBSD: head/sys/dev/sk/if_sk.c 112872 2003-03-31 17:29:43Z njl $"; |
117#endif 118 119static struct sk_type sk_devs[] = { 120 { SK_VENDORID, SK_DEVICEID_GE, "SysKonnect Gigabit Ethernet" }, 121 { 0, 0, NULL } 122}; 123 124static int sk_probe (device_t); --- 909 unchanged lines hidden (view full) --- 1034 */ 1035static int 1036sk_attach_xmac(dev) 1037 device_t dev; 1038{ 1039 struct sk_softc *sc; 1040 struct sk_if_softc *sc_if; 1041 struct ifnet *ifp; | 117#endif 118 119static struct sk_type sk_devs[] = { 120 { SK_VENDORID, SK_DEVICEID_GE, "SysKonnect Gigabit Ethernet" }, 121 { 0, 0, NULL } 122}; 123 124static int sk_probe (device_t); --- 909 unchanged lines hidden (view full) --- 1034 */ 1035static int 1036sk_attach_xmac(dev) 1037 device_t dev; 1038{ 1039 struct sk_softc *sc; 1040 struct sk_if_softc *sc_if; 1041 struct ifnet *ifp; |
1042 int i, port; | 1042 int i, port, error; |
1043 1044 if (dev == NULL) 1045 return(EINVAL); 1046 | 1043 1044 if (dev == NULL) 1045 return(EINVAL); 1046 |
1047 error = 0; |
|
1047 sc_if = device_get_softc(dev); 1048 sc = device_get_softc(device_get_parent(dev)); 1049 SK_LOCK(sc); 1050 port = *(int *)device_get_ivars(dev); 1051 free(device_get_ivars(dev), M_DEVBUF); 1052 device_set_ivars(dev, NULL); | 1048 sc_if = device_get_softc(dev); 1049 sc = device_get_softc(device_get_parent(dev)); 1050 SK_LOCK(sc); 1051 port = *(int *)device_get_ivars(dev); 1052 free(device_get_ivars(dev), M_DEVBUF); 1053 device_set_ivars(dev, NULL); |
1053 sc_if->sk_dev = dev; | |
1054 | 1054 |
1055 bzero((char *)sc_if, sizeof(struct sk_if_softc)); 1056 | |
1057 sc_if->sk_dev = dev; 1058 sc_if->sk_unit = device_get_unit(dev); 1059 sc_if->sk_port = port; 1060 sc_if->sk_softc = sc; 1061 sc->sk_if[port] = sc_if; 1062 if (port == SK_PORT_A) 1063 sc_if->sk_tx_bmu = SK_BMU_TXS_CSR0; 1064 if (port == SK_PORT_B) --- 55 unchanged lines hidden (view full) --- 1120 sc_if->sk_phyaddr = SK_PHYADDR_XMAC; 1121 break; 1122 case SK_PHYTYPE_BCOM: 1123 sc_if->sk_phyaddr = SK_PHYADDR_BCOM; 1124 break; 1125 default: 1126 printf("skc%d: unsupported PHY type: %d\n", 1127 sc->sk_unit, sc_if->sk_phytype); | 1055 sc_if->sk_dev = dev; 1056 sc_if->sk_unit = device_get_unit(dev); 1057 sc_if->sk_port = port; 1058 sc_if->sk_softc = sc; 1059 sc->sk_if[port] = sc_if; 1060 if (port == SK_PORT_A) 1061 sc_if->sk_tx_bmu = SK_BMU_TXS_CSR0; 1062 if (port == SK_PORT_B) --- 55 unchanged lines hidden (view full) --- 1118 sc_if->sk_phyaddr = SK_PHYADDR_XMAC; 1119 break; 1120 case SK_PHYTYPE_BCOM: 1121 sc_if->sk_phyaddr = SK_PHYADDR_BCOM; 1122 break; 1123 default: 1124 printf("skc%d: unsupported PHY type: %d\n", 1125 sc->sk_unit, sc_if->sk_phytype); |
1128 SK_UNLOCK(sc); 1129 return(ENODEV); | 1126 error = ENODEV; 1127 goto fail_xmac; |
1130 } 1131 1132 /* Allocate the descriptor queues. */ 1133 sc_if->sk_rdata = contigmalloc(sizeof(struct sk_ring_data), M_DEVBUF, 1134 M_NOWAIT, 0, 0xffffffff, PAGE_SIZE, 0); 1135 1136 if (sc_if->sk_rdata == NULL) { 1137 printf("sk%d: no memory for list buffers!\n", sc_if->sk_unit); | 1128 } 1129 1130 /* Allocate the descriptor queues. */ 1131 sc_if->sk_rdata = contigmalloc(sizeof(struct sk_ring_data), M_DEVBUF, 1132 M_NOWAIT, 0, 0xffffffff, PAGE_SIZE, 0); 1133 1134 if (sc_if->sk_rdata == NULL) { 1135 printf("sk%d: no memory for list buffers!\n", sc_if->sk_unit); |
1138 sc->sk_if[port] = NULL; 1139 SK_UNLOCK(sc); 1140 return(ENOMEM); | 1136 error = ENOMEM; 1137 goto fail_xmac; |
1141 } 1142 1143 bzero(sc_if->sk_rdata, sizeof(struct sk_ring_data)); 1144 1145 /* Try to allocate memory for jumbo buffers. */ 1146 if (sk_alloc_jumbo_mem(sc_if)) { 1147 printf("sk%d: jumbo buffer allocation failed\n", 1148 sc_if->sk_unit); | 1138 } 1139 1140 bzero(sc_if->sk_rdata, sizeof(struct sk_ring_data)); 1141 1142 /* Try to allocate memory for jumbo buffers. */ 1143 if (sk_alloc_jumbo_mem(sc_if)) { 1144 printf("sk%d: jumbo buffer allocation failed\n", 1145 sc_if->sk_unit); |
1149 contigfree(sc_if->sk_rdata, 1150 sizeof(struct sk_ring_data), M_DEVBUF); 1151 sc->sk_if[port] = NULL; 1152 SK_UNLOCK(sc); 1153 return(ENOMEM); | 1146 error = ENOMEM; 1147 goto fail_xmac; |
1154 } 1155 1156 ifp = &sc_if->arpcom.ac_if; 1157 ifp->if_softc = sc_if; 1158 ifp->if_unit = sc_if->sk_unit; 1159 ifp->if_name = "sk"; 1160 ifp->if_mtu = ETHERMTU; 1161 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; 1162 ifp->if_ioctl = sk_ioctl; 1163 ifp->if_output = ether_output; 1164 ifp->if_start = sk_start; 1165 ifp->if_watchdog = sk_watchdog; 1166 ifp->if_init = sk_init; 1167 ifp->if_baudrate = 1000000000; 1168 ifp->if_snd.ifq_maxlen = SK_TX_RING_CNT - 1; 1169 | 1148 } 1149 1150 ifp = &sc_if->arpcom.ac_if; 1151 ifp->if_softc = sc_if; 1152 ifp->if_unit = sc_if->sk_unit; 1153 ifp->if_name = "sk"; 1154 ifp->if_mtu = ETHERMTU; 1155 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; 1156 ifp->if_ioctl = sk_ioctl; 1157 ifp->if_output = ether_output; 1158 ifp->if_start = sk_start; 1159 ifp->if_watchdog = sk_watchdog; 1160 ifp->if_init = sk_init; 1161 ifp->if_baudrate = 1000000000; 1162 ifp->if_snd.ifq_maxlen = SK_TX_RING_CNT - 1; 1163 |
1164 callout_handle_init(&sc_if->sk_tick_ch); 1165 |
|
1170 /* 1171 * Call MI attach routine. 1172 */ 1173 ether_ifattach(ifp, sc_if->arpcom.ac_enaddr); | 1166 /* 1167 * Call MI attach routine. 1168 */ 1169 ether_ifattach(ifp, sc_if->arpcom.ac_enaddr); |
1174 callout_handle_init(&sc_if->sk_tick_ch); | |
1175 1176 /* 1177 * Do miibus setup. 1178 */ 1179 sk_init_xmac(sc_if); 1180 if (mii_phy_probe(dev, &sc_if->sk_miibus, 1181 sk_ifmedia_upd, sk_ifmedia_sts)) { 1182 printf("skc%d: no PHY found!\n", sc_if->sk_unit); | 1170 1171 /* 1172 * Do miibus setup. 1173 */ 1174 sk_init_xmac(sc_if); 1175 if (mii_phy_probe(dev, &sc_if->sk_miibus, 1176 sk_ifmedia_upd, sk_ifmedia_sts)) { 1177 printf("skc%d: no PHY found!\n", sc_if->sk_unit); |
1183 contigfree(sc_if->sk_rdata, 1184 sizeof(struct sk_ring_data), M_DEVBUF); 1185 ether_ifdetach(ifp); 1186 SK_UNLOCK(sc); 1187 return(ENXIO); | 1178 error = ENXIO; 1179 goto fail_xmac; |
1188 } 1189 | 1180 } 1181 |
1182fail_xmac: |
|
1190 SK_UNLOCK(sc); | 1183 SK_UNLOCK(sc); |
1184 if (error) { 1185 /* Access should be ok even though lock has been dropped */ 1186 sc->sk_if[port] = NULL; 1187 sk_detach_xmac(dev); 1188 } |
|
1191 | 1189 |
1192 return(0); | 1190 return(error); |
1193} 1194 1195/* 1196 * Attach the interface. Allocate softc structures, do ifmedia 1197 * setup and ethernet/BPF attach. 1198 */ 1199static int 1200sk_attach(dev) 1201 device_t dev; 1202{ 1203 u_int32_t command; 1204 struct sk_softc *sc; 1205 int unit, error = 0, rid, *port; 1206 1207 sc = device_get_softc(dev); 1208 unit = device_get_unit(dev); | 1191} 1192 1193/* 1194 * Attach the interface. Allocate softc structures, do ifmedia 1195 * setup and ethernet/BPF attach. 1196 */ 1197static int 1198sk_attach(dev) 1199 device_t dev; 1200{ 1201 u_int32_t command; 1202 struct sk_softc *sc; 1203 int unit, error = 0, rid, *port; 1204 1205 sc = device_get_softc(dev); 1206 unit = device_get_unit(dev); |
1209 bzero(sc, sizeof(struct sk_softc)); | |
1210 1211 mtx_init(&sc->sk_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK, 1212 MTX_DEF | MTX_RECURSE); | 1207 1208 mtx_init(&sc->sk_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK, 1209 MTX_DEF | MTX_RECURSE); |
1213 SK_LOCK(sc); | |
1214 1215 /* 1216 * Handle power management nonsense. 1217 */ 1218 if (pci_get_powerstate(dev) != PCI_POWERSTATE_D0) { 1219 u_int32_t iobase, membase, irq; 1220 1221 /* Save important PCI config data. */ --- 50 unchanged lines hidden (view full) --- 1272 1273 /* Allocate interrupt */ 1274 rid = 0; 1275 sc->sk_irq = bus_alloc_resource(dev, SYS_RES_IRQ, &rid, 0, ~0, 1, 1276 RF_SHAREABLE | RF_ACTIVE); 1277 1278 if (sc->sk_irq == NULL) { 1279 printf("skc%d: couldn't map interrupt\n", unit); | 1210 1211 /* 1212 * Handle power management nonsense. 1213 */ 1214 if (pci_get_powerstate(dev) != PCI_POWERSTATE_D0) { 1215 u_int32_t iobase, membase, irq; 1216 1217 /* Save important PCI config data. */ --- 50 unchanged lines hidden (view full) --- 1268 1269 /* Allocate interrupt */ 1270 rid = 0; 1271 sc->sk_irq = bus_alloc_resource(dev, SYS_RES_IRQ, &rid, 0, ~0, 1, 1272 RF_SHAREABLE | RF_ACTIVE); 1273 1274 if (sc->sk_irq == NULL) { 1275 printf("skc%d: couldn't map interrupt\n", unit); |
1280 bus_release_resource(dev, SK_RES, SK_RID, sc->sk_res); | |
1281 error = ENXIO; 1282 goto fail; 1283 } 1284 | 1276 error = ENXIO; 1277 goto fail; 1278 } 1279 |
1285 error = bus_setup_intr(dev, sc->sk_irq, INTR_TYPE_NET, 1286 sk_intr, sc, &sc->sk_intrhand); 1287 1288 if (error) { 1289 printf("skc%d: couldn't set up irq\n", unit); 1290 bus_release_resource(dev, SK_RES, SK_RID, sc->sk_res); 1291 bus_release_resource(dev, SYS_RES_IRQ, 0, sc->sk_irq); 1292 goto fail; 1293 } 1294 | |
1295 /* Reset the adapter. */ 1296 sk_reset(sc); 1297 1298 sc->sk_unit = unit; 1299 1300 /* Read and save vital product data from EEPROM. */ 1301 sk_vpd_read(sc); 1302 --- 13 unchanged lines hidden (view full) --- 1316 break; 1317 case SK_RAMSIZE_2048K_128: 1318 sc->sk_ramsize = 0x200000; 1319 sc->sk_rboff = SK_RBOFF_0; 1320 break; 1321 default: 1322 printf("skc%d: unknown ram size: %d\n", 1323 sc->sk_unit, sk_win_read_1(sc, SK_EPROM0)); | 1280 /* Reset the adapter. */ 1281 sk_reset(sc); 1282 1283 sc->sk_unit = unit; 1284 1285 /* Read and save vital product data from EEPROM. */ 1286 sk_vpd_read(sc); 1287 --- 13 unchanged lines hidden (view full) --- 1301 break; 1302 case SK_RAMSIZE_2048K_128: 1303 sc->sk_ramsize = 0x200000; 1304 sc->sk_rboff = SK_RBOFF_0; 1305 break; 1306 default: 1307 printf("skc%d: unknown ram size: %d\n", 1308 sc->sk_unit, sk_win_read_1(sc, SK_EPROM0)); |
1324 bus_teardown_intr(dev, sc->sk_irq, sc->sk_intrhand); 1325 bus_release_resource(dev, SYS_RES_IRQ, 0, sc->sk_irq); 1326 bus_release_resource(dev, SK_RES, SK_RID, sc->sk_res); | |
1327 error = ENXIO; 1328 goto fail; | 1309 error = ENXIO; 1310 goto fail; |
1329 break; | |
1330 } 1331 1332 /* Read and save physical media type */ 1333 switch(sk_win_read_1(sc, SK_PMDTYPE)) { 1334 case SK_PMD_1000BASESX: 1335 sc->sk_pmd = IFM_1000_SX; 1336 break; 1337 case SK_PMD_1000BASELX: 1338 sc->sk_pmd = IFM_1000_LX; 1339 break; 1340 case SK_PMD_1000BASECX: 1341 sc->sk_pmd = IFM_1000_CX; 1342 break; 1343 case SK_PMD_1000BASETX: 1344 sc->sk_pmd = IFM_1000_T; 1345 break; 1346 default: 1347 printf("skc%d: unknown media type: 0x%x\n", 1348 sc->sk_unit, sk_win_read_1(sc, SK_PMDTYPE)); | 1311 } 1312 1313 /* Read and save physical media type */ 1314 switch(sk_win_read_1(sc, SK_PMDTYPE)) { 1315 case SK_PMD_1000BASESX: 1316 sc->sk_pmd = IFM_1000_SX; 1317 break; 1318 case SK_PMD_1000BASELX: 1319 sc->sk_pmd = IFM_1000_LX; 1320 break; 1321 case SK_PMD_1000BASECX: 1322 sc->sk_pmd = IFM_1000_CX; 1323 break; 1324 case SK_PMD_1000BASETX: 1325 sc->sk_pmd = IFM_1000_T; 1326 break; 1327 default: 1328 printf("skc%d: unknown media type: 0x%x\n", 1329 sc->sk_unit, sk_win_read_1(sc, SK_PMDTYPE)); |
1349 bus_teardown_intr(dev, sc->sk_irq, sc->sk_intrhand); 1350 bus_release_resource(dev, SYS_RES_IRQ, 0, sc->sk_irq); 1351 bus_release_resource(dev, SK_RES, SK_RID, sc->sk_res); | |
1352 error = ENXIO; 1353 goto fail; 1354 } 1355 1356 /* Announce the product name. */ 1357 printf("skc%d: %s\n", sc->sk_unit, sc->sk_vpd_prodname); 1358 sc->sk_devs[SK_PORT_A] = device_add_child(dev, "sk", -1); 1359 port = malloc(sizeof(int), M_DEVBUF, M_NOWAIT); --- 6 unchanged lines hidden (view full) --- 1366 *port = SK_PORT_B; 1367 device_set_ivars(sc->sk_devs[SK_PORT_B], port); 1368 } 1369 1370 /* Turn on the 'driver is loaded' LED. */ 1371 CSR_WRITE_2(sc, SK_LED, SK_LED_GREEN_ON); 1372 1373 bus_generic_attach(dev); | 1330 error = ENXIO; 1331 goto fail; 1332 } 1333 1334 /* Announce the product name. */ 1335 printf("skc%d: %s\n", sc->sk_unit, sc->sk_vpd_prodname); 1336 sc->sk_devs[SK_PORT_A] = device_add_child(dev, "sk", -1); 1337 port = malloc(sizeof(int), M_DEVBUF, M_NOWAIT); --- 6 unchanged lines hidden (view full) --- 1344 *port = SK_PORT_B; 1345 device_set_ivars(sc->sk_devs[SK_PORT_B], port); 1346 } 1347 1348 /* Turn on the 'driver is loaded' LED. */ 1349 CSR_WRITE_2(sc, SK_LED, SK_LED_GREEN_ON); 1350 1351 bus_generic_attach(dev); |
1374 SK_UNLOCK(sc); 1375 return(0); | |
1376 | 1352 |
1353 error = bus_setup_intr(dev, sc->sk_irq, INTR_TYPE_NET, 1354 sk_intr, sc, &sc->sk_intrhand); 1355 1356 if (error) { 1357 printf("skc%d: couldn't set up irq\n", unit); 1358 goto fail; 1359 } 1360 |
|
1377fail: | 1361fail: |
1378 SK_UNLOCK(sc); 1379 mtx_destroy(&sc->sk_mtx); | 1362 if (error) 1363 sk_detach(dev); 1364 |
1380 return(error); 1381} 1382 1383static int 1384sk_detach_xmac(dev) 1385 device_t dev; 1386{ 1387 struct sk_softc *sc; 1388 struct sk_if_softc *sc_if; 1389 struct ifnet *ifp; 1390 1391 sc = device_get_softc(device_get_parent(dev)); 1392 sc_if = device_get_softc(dev); | 1365 return(error); 1366} 1367 1368static int 1369sk_detach_xmac(dev) 1370 device_t dev; 1371{ 1372 struct sk_softc *sc; 1373 struct sk_if_softc *sc_if; 1374 struct ifnet *ifp; 1375 1376 sc = device_get_softc(device_get_parent(dev)); 1377 sc_if = device_get_softc(dev); |
1378 KASSERT(mtx_initialized(&sc_if->sk_softc->sk_mtx), 1379 "sk mutex not initialized in sk_detach_xmac"); |
|
1393 SK_IF_LOCK(sc_if); 1394 1395 ifp = &sc_if->arpcom.ac_if; | 1380 SK_IF_LOCK(sc_if); 1381 1382 ifp = &sc_if->arpcom.ac_if; |
1396 sk_stop(sc_if); 1397 ether_ifdetach(ifp); 1398 bus_generic_detach(dev); 1399 if (sc_if->sk_miibus != NULL) | 1383 if (device_is_alive(dev)) { 1384 if (bus_child_present(dev)) 1385 sk_stop(sc_if); 1386 ether_ifdetach(ifp); |
1400 device_delete_child(dev, sc_if->sk_miibus); | 1387 device_delete_child(dev, sc_if->sk_miibus); |
1401 contigfree(sc_if->sk_cdata.sk_jumbo_buf, SK_JMEM, M_DEVBUF); 1402 contigfree(sc_if->sk_rdata, sizeof(struct sk_ring_data), M_DEVBUF); | 1388 bus_generic_detach(dev); 1389 } 1390 if (sc_if->sk_cdata.sk_jumbo_buf) 1391 contigfree(sc_if->sk_cdata.sk_jumbo_buf, SK_JMEM, M_DEVBUF); 1392 if (sc_if->sk_rdata) { 1393 contigfree(sc_if->sk_rdata, sizeof(struct sk_ring_data), 1394 M_DEVBUF); 1395 } |
1403 SK_IF_UNLOCK(sc_if); 1404 1405 return(0); 1406} 1407 1408static int 1409sk_detach(dev) 1410 device_t dev; 1411{ 1412 struct sk_softc *sc; 1413 1414 sc = device_get_softc(dev); | 1396 SK_IF_UNLOCK(sc_if); 1397 1398 return(0); 1399} 1400 1401static int 1402sk_detach(dev) 1403 device_t dev; 1404{ 1405 struct sk_softc *sc; 1406 1407 sc = device_get_softc(dev); |
1408 KASSERT(mtx_initialized(&sc->sk_mtx), "sk mutex not initialized"); |
|
1415 SK_LOCK(sc); 1416 | 1409 SK_LOCK(sc); 1410 |
1417 bus_generic_detach(dev); 1418 if (sc->sk_devs[SK_PORT_A] != NULL) 1419 device_delete_child(dev, sc->sk_devs[SK_PORT_A]); 1420 if (sc->sk_devs[SK_PORT_B] != NULL) 1421 device_delete_child(dev, sc->sk_devs[SK_PORT_B]); | 1411 if (device_is_alive(dev)) { 1412 if (sc->sk_devs[SK_PORT_A] != NULL) 1413 device_delete_child(dev, sc->sk_devs[SK_PORT_A]); 1414 if (sc->sk_devs[SK_PORT_B] != NULL) 1415 device_delete_child(dev, sc->sk_devs[SK_PORT_B]); 1416 bus_generic_detach(dev); 1417 } |
1422 | 1418 |
1423 bus_teardown_intr(dev, sc->sk_irq, sc->sk_intrhand); 1424 bus_release_resource(dev, SYS_RES_IRQ, 0, sc->sk_irq); 1425 bus_release_resource(dev, SK_RES, SK_RID, sc->sk_res); | 1419 if (sc->sk_intrhand) 1420 bus_teardown_intr(dev, sc->sk_irq, sc->sk_intrhand); 1421 if (sc->sk_irq) 1422 bus_release_resource(dev, SYS_RES_IRQ, 0, sc->sk_irq); 1423 if (sc->sk_res) 1424 bus_release_resource(dev, SK_RES, SK_RID, sc->sk_res); |
1426 1427 SK_UNLOCK(sc); 1428 mtx_destroy(&sc->sk_mtx); 1429 1430 return(0); 1431} 1432 1433static int --- 819 unchanged lines hidden --- | 1425 1426 SK_UNLOCK(sc); 1427 mtx_destroy(&sc->sk_mtx); 1428 1429 return(0); 1430} 1431 1432static int --- 819 unchanged lines hidden --- |