Deleted Added
full compact
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 ---