if_zyd.c (243857) | if_zyd.c (246614) |
---|---|
1/* $OpenBSD: if_zyd.c,v 1.52 2007/02/11 00:08:04 jsg Exp $ */ 2/* $NetBSD: if_zyd.c,v 1.7 2007/06/21 04:04:29 kiyohara Exp $ */ | 1/* $OpenBSD: if_zyd.c,v 1.52 2007/02/11 00:08:04 jsg Exp $ */ 2/* $NetBSD: if_zyd.c,v 1.7 2007/06/21 04:04:29 kiyohara Exp $ */ |
3/* $FreeBSD: head/sys/dev/usb/wlan/if_zyd.c 243857 2012-12-04 09:32:43Z glebius $ */ | 3/* $FreeBSD: head/sys/dev/usb/wlan/if_zyd.c 246614 2013-02-10 10:36:16Z hselasky $ */ |
4 5/*- 6 * Copyright (c) 2006 by Damien Bergamini <damien.bergamini@free.fr> 7 * Copyright (c) 2006 by Florian Stoehr <ich@florian-stoehr.de> 8 * 9 * Permission to use, copy, modify, and distribute this software for any 10 * purpose with or without fee is hereby granted, provided that the above 11 * copyright notice and this permission notice appear in all copies. 12 * 13 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 14 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 15 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 16 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 17 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 18 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 19 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 20 */ 21 22#include <sys/cdefs.h> | 4 5/*- 6 * Copyright (c) 2006 by Damien Bergamini <damien.bergamini@free.fr> 7 * Copyright (c) 2006 by Florian Stoehr <ich@florian-stoehr.de> 8 * 9 * Permission to use, copy, modify, and distribute this software for any 10 * purpose with or without fee is hereby granted, provided that the above 11 * copyright notice and this permission notice appear in all copies. 12 * 13 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 14 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 15 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 16 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 17 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 18 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 19 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 20 */ 21 22#include <sys/cdefs.h> |
23__FBSDID("$FreeBSD: head/sys/dev/usb/wlan/if_zyd.c 243857 2012-12-04 09:32:43Z glebius $"); | 23__FBSDID("$FreeBSD: head/sys/dev/usb/wlan/if_zyd.c 246614 2013-02-10 10:36:16Z hselasky $"); |
24 25/* 26 * ZyDAS ZD1211/ZD1211B USB WLAN driver. 27 */ 28 29#include <sys/param.h> 30#include <sys/sockio.h> 31#include <sys/sysctl.h> --- 401 unchanged lines hidden (view full) --- 433} 434 435static int 436zyd_detach(device_t dev) 437{ 438 struct zyd_softc *sc = device_get_softc(dev); 439 struct ifnet *ifp = sc->sc_ifp; 440 struct ieee80211com *ic; | 24 25/* 26 * ZyDAS ZD1211/ZD1211B USB WLAN driver. 27 */ 28 29#include <sys/param.h> 30#include <sys/sockio.h> 31#include <sys/sysctl.h> --- 401 unchanged lines hidden (view full) --- 433} 434 435static int 436zyd_detach(device_t dev) 437{ 438 struct zyd_softc *sc = device_get_softc(dev); 439 struct ifnet *ifp = sc->sc_ifp; 440 struct ieee80211com *ic; |
441 unsigned int x; |
|
441 | 442 |
442 /* stop all USB transfers */ 443 usbd_transfer_unsetup(sc->sc_xfer, ZYD_N_TRANSFER); | 443 /* 444 * Prevent further allocations from RX/TX data 445 * lists and ioctls: 446 */ 447 ZYD_LOCK(sc); 448 sc->sc_flags |= ZYD_FLAG_DETACHED; 449 STAILQ_INIT(&sc->tx_q); 450 STAILQ_INIT(&sc->tx_free); 451 ZYD_UNLOCK(sc); |
444 | 452 |
453 /* drain USB transfers */ 454 for (x = 0; x != ZYD_N_TRANSFER; x++) 455 usbd_transfer_drain(sc->sc_xfer[x]); 456 |
|
445 /* free TX list, if any */ | 457 /* free TX list, if any */ |
458 ZYD_LOCK(sc); |
|
446 zyd_unsetup_tx_list(sc); | 459 zyd_unsetup_tx_list(sc); |
460 ZYD_UNLOCK(sc); |
|
447 | 461 |
462 /* free USB transfers and some data buffers */ 463 usbd_transfer_unsetup(sc->sc_xfer, ZYD_N_TRANSFER); 464 |
|
448 if (ifp) { 449 ic = ifp->if_l2com; 450 ieee80211_ifdetach(ic); 451 if_free(ifp); 452 } 453 mtx_destroy(&sc->sc_mtx); 454 455 return (0); --- 2176 unchanged lines hidden (view full) --- 2632} 2633 2634static int 2635zyd_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) 2636{ 2637 struct zyd_softc *sc = ifp->if_softc; 2638 struct ieee80211com *ic = ifp->if_l2com; 2639 struct ifreq *ifr = (struct ifreq *) data; | 465 if (ifp) { 466 ic = ifp->if_l2com; 467 ieee80211_ifdetach(ic); 468 if_free(ifp); 469 } 470 mtx_destroy(&sc->sc_mtx); 471 472 return (0); --- 2176 unchanged lines hidden (view full) --- 2649} 2650 2651static int 2652zyd_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) 2653{ 2654 struct zyd_softc *sc = ifp->if_softc; 2655 struct ieee80211com *ic = ifp->if_l2com; 2656 struct ifreq *ifr = (struct ifreq *) data; |
2640 int error = 0, startall = 0; | 2657 int error; 2658 int startall = 0; |
2641 | 2659 |
2660 ZYD_LOCK(sc); 2661 error = (sc->sc_flags & ZYD_FLAG_DETACHED) ? ENXIO : 0; 2662 ZYD_UNLOCK(sc); 2663 if (error) 2664 return (error); 2665 |
|
2642 switch (cmd) { 2643 case SIOCSIFFLAGS: 2644 ZYD_LOCK(sc); 2645 if (ifp->if_flags & IFF_UP) { 2646 if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) { 2647 zyd_init_locked(sc); 2648 startall = 1; 2649 } else --- 273 unchanged lines hidden (view full) --- 2923 ZYD_UNLOCK(sc); 2924} 2925 2926static device_method_t zyd_methods[] = { 2927 /* Device interface */ 2928 DEVMETHOD(device_probe, zyd_match), 2929 DEVMETHOD(device_attach, zyd_attach), 2930 DEVMETHOD(device_detach, zyd_detach), | 2666 switch (cmd) { 2667 case SIOCSIFFLAGS: 2668 ZYD_LOCK(sc); 2669 if (ifp->if_flags & IFF_UP) { 2670 if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) { 2671 zyd_init_locked(sc); 2672 startall = 1; 2673 } else --- 273 unchanged lines hidden (view full) --- 2947 ZYD_UNLOCK(sc); 2948} 2949 2950static device_method_t zyd_methods[] = { 2951 /* Device interface */ 2952 DEVMETHOD(device_probe, zyd_match), 2953 DEVMETHOD(device_attach, zyd_attach), 2954 DEVMETHOD(device_detach, zyd_detach), |
2931 2932 { 0, 0 } | 2955 DEVMETHOD_END |
2933}; 2934 2935static driver_t zyd_driver = { 2936 .name = "zyd", 2937 .methods = zyd_methods, 2938 .size = sizeof(struct zyd_softc) 2939}; 2940 2941static devclass_t zyd_devclass; 2942 2943DRIVER_MODULE(zyd, uhub, zyd_driver, zyd_devclass, NULL, 0); 2944MODULE_DEPEND(zyd, usb, 1, 1, 1); 2945MODULE_DEPEND(zyd, wlan, 1, 1, 1); 2946MODULE_VERSION(zyd, 1); | 2956}; 2957 2958static driver_t zyd_driver = { 2959 .name = "zyd", 2960 .methods = zyd_methods, 2961 .size = sizeof(struct zyd_softc) 2962}; 2963 2964static devclass_t zyd_devclass; 2965 2966DRIVER_MODULE(zyd, uhub, zyd_driver, zyd_devclass, NULL, 0); 2967MODULE_DEPEND(zyd, usb, 1, 1, 1); 2968MODULE_DEPEND(zyd, wlan, 1, 1, 1); 2969MODULE_VERSION(zyd, 1); |