Deleted Added
full compact
if_mwl.c (195377) if_mwl.c (195618)
1/*-
2 * Copyright (c) 2007-2009 Sam Leffler, Errno Consulting
3 * Copyright (c) 2007-2008 Marvell Semiconductor, Inc.
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:

--- 15 unchanged lines hidden (view full) ---

24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
26 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
28 * THE POSSIBILITY OF SUCH DAMAGES.
29 */
30
31#include <sys/cdefs.h>
1/*-
2 * Copyright (c) 2007-2009 Sam Leffler, Errno Consulting
3 * Copyright (c) 2007-2008 Marvell Semiconductor, Inc.
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:

--- 15 unchanged lines hidden (view full) ---

24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
26 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
28 * THE POSSIBILITY OF SUCH DAMAGES.
29 */
30
31#include <sys/cdefs.h>
32__FBSDID("$FreeBSD: head/sys/dev/mwl/if_mwl.c 195377 2009-07-05 17:59:19Z sam $");
32__FBSDID("$FreeBSD: head/sys/dev/mwl/if_mwl.c 195618 2009-07-11 15:02:45Z rpaulo $");
33
34/*
35 * Driver for the Marvell 88W8363 Wireless LAN controller.
36 */
37
38#include "opt_inet.h"
39#include "opt_mwl.h"
40

--- 374 unchanged lines hidden (view full) ---

415 ic->ic_caps =
416 IEEE80211_C_STA /* station mode supported */
417 | IEEE80211_C_HOSTAP /* hostap mode */
418 | IEEE80211_C_MONITOR /* monitor mode */
419#if 0
420 | IEEE80211_C_IBSS /* ibss, nee adhoc, mode */
421 | IEEE80211_C_AHDEMO /* adhoc demo mode */
422#endif
33
34/*
35 * Driver for the Marvell 88W8363 Wireless LAN controller.
36 */
37
38#include "opt_inet.h"
39#include "opt_mwl.h"
40

--- 374 unchanged lines hidden (view full) ---

415 ic->ic_caps =
416 IEEE80211_C_STA /* station mode supported */
417 | IEEE80211_C_HOSTAP /* hostap mode */
418 | IEEE80211_C_MONITOR /* monitor mode */
419#if 0
420 | IEEE80211_C_IBSS /* ibss, nee adhoc, mode */
421 | IEEE80211_C_AHDEMO /* adhoc demo mode */
422#endif
423 | IEEE80211_C_MBSS /* mesh point link mode */
423 | IEEE80211_C_WDS /* WDS supported */
424 | IEEE80211_C_SHPREAMBLE /* short preamble supported */
425 | IEEE80211_C_SHSLOT /* short slot time supported */
426 | IEEE80211_C_WME /* WME/WMM supported */
427 | IEEE80211_C_BURST /* xmit bursting supported */
428 | IEEE80211_C_WPA /* capable of WPA1+WPA2 */
429 | IEEE80211_C_BGSCAN /* capable of bg scanning */
430 | IEEE80211_C_TXFRAG /* handle tx frags */

--- 179 unchanged lines hidden (view full) ---

610 struct ieee80211vap *vap, *apvap;
611 struct mwl_hal_vap *hvap;
612 struct mwl_vap *mvp;
613 uint8_t mac[IEEE80211_ADDR_LEN];
614
615 IEEE80211_ADDR_COPY(mac, mac0);
616 switch (opmode) {
617 case IEEE80211_M_HOSTAP:
424 | IEEE80211_C_WDS /* WDS supported */
425 | IEEE80211_C_SHPREAMBLE /* short preamble supported */
426 | IEEE80211_C_SHSLOT /* short slot time supported */
427 | IEEE80211_C_WME /* WME/WMM supported */
428 | IEEE80211_C_BURST /* xmit bursting supported */
429 | IEEE80211_C_WPA /* capable of WPA1+WPA2 */
430 | IEEE80211_C_BGSCAN /* capable of bg scanning */
431 | IEEE80211_C_TXFRAG /* handle tx frags */

--- 179 unchanged lines hidden (view full) ---

611 struct ieee80211vap *vap, *apvap;
612 struct mwl_hal_vap *hvap;
613 struct mwl_vap *mvp;
614 uint8_t mac[IEEE80211_ADDR_LEN];
615
616 IEEE80211_ADDR_COPY(mac, mac0);
617 switch (opmode) {
618 case IEEE80211_M_HOSTAP:
619 case IEEE80211_M_MBSS:
618 if ((flags & IEEE80211_CLONE_MACADDR) == 0)
619 assign_address(sc, mac, flags & IEEE80211_CLONE_BSSID);
620 hvap = mwl_hal_newvap(mh, MWL_HAL_AP, mac);
621 if (hvap == NULL) {
622 if ((flags & IEEE80211_CLONE_MACADDR) == 0)
623 reclaim_address(sc, mac);
624 return NULL;
625 }

--- 55 unchanged lines hidden (view full) ---

681 /* override with driver methods */
682 mvp->mv_newstate = vap->iv_newstate;
683 vap->iv_newstate = mwl_newstate;
684 vap->iv_max_keyix = 0; /* XXX */
685 vap->iv_key_alloc = mwl_key_alloc;
686 vap->iv_key_delete = mwl_key_delete;
687 vap->iv_key_set = mwl_key_set;
688#ifdef MWL_HOST_PS_SUPPORT
620 if ((flags & IEEE80211_CLONE_MACADDR) == 0)
621 assign_address(sc, mac, flags & IEEE80211_CLONE_BSSID);
622 hvap = mwl_hal_newvap(mh, MWL_HAL_AP, mac);
623 if (hvap == NULL) {
624 if ((flags & IEEE80211_CLONE_MACADDR) == 0)
625 reclaim_address(sc, mac);
626 return NULL;
627 }

--- 55 unchanged lines hidden (view full) ---

683 /* override with driver methods */
684 mvp->mv_newstate = vap->iv_newstate;
685 vap->iv_newstate = mwl_newstate;
686 vap->iv_max_keyix = 0; /* XXX */
687 vap->iv_key_alloc = mwl_key_alloc;
688 vap->iv_key_delete = mwl_key_delete;
689 vap->iv_key_set = mwl_key_set;
690#ifdef MWL_HOST_PS_SUPPORT
689 if (opmode == IEEE80211_M_HOSTAP) {
691 if (opmode == IEEE80211_M_HOSTAP || opmode == IEEE80211_M_MBSS) {
690 vap->iv_update_ps = mwl_update_ps;
691 mvp->mv_set_tim = vap->iv_set_tim;
692 vap->iv_set_tim = mwl_set_tim;
693 }
694#endif
695 vap->iv_reset = mwl_reset;
696 vap->iv_update_beacon = mwl_beacon_update;
697
698 /* override max aid so sta's cannot assoc when we're out of sta id's */
699 vap->iv_max_aid = MWL_MAXSTAID;
700 /* override default A-MPDU rx parameters */
701 vap->iv_ampdu_rxmax = IEEE80211_HTCAP_MAXRXAMPDU_64K;
702 vap->iv_ampdu_density = IEEE80211_HTCAP_MPDUDENSITY_4;
703
704 /* complete setup */
705 ieee80211_vap_attach(vap, mwl_media_change, ieee80211_media_status);
706
707 switch (vap->iv_opmode) {
708 case IEEE80211_M_HOSTAP:
692 vap->iv_update_ps = mwl_update_ps;
693 mvp->mv_set_tim = vap->iv_set_tim;
694 vap->iv_set_tim = mwl_set_tim;
695 }
696#endif
697 vap->iv_reset = mwl_reset;
698 vap->iv_update_beacon = mwl_beacon_update;
699
700 /* override max aid so sta's cannot assoc when we're out of sta id's */
701 vap->iv_max_aid = MWL_MAXSTAID;
702 /* override default A-MPDU rx parameters */
703 vap->iv_ampdu_rxmax = IEEE80211_HTCAP_MAXRXAMPDU_64K;
704 vap->iv_ampdu_density = IEEE80211_HTCAP_MPDUDENSITY_4;
705
706 /* complete setup */
707 ieee80211_vap_attach(vap, mwl_media_change, ieee80211_media_status);
708
709 switch (vap->iv_opmode) {
710 case IEEE80211_M_HOSTAP:
711 case IEEE80211_M_MBSS:
709 case IEEE80211_M_STA:
710 /*
711 * Setup sta db entry for local address.
712 */
713 mwl_localstadb(vap);
712 case IEEE80211_M_STA:
713 /*
714 * Setup sta db entry for local address.
715 */
716 mwl_localstadb(vap);
714 if (vap->iv_opmode == IEEE80211_M_HOSTAP)
717 if (vap->iv_opmode == IEEE80211_M_HOSTAP ||
718 vap->iv_opmode == IEEE80211_M_MBSS)
715 sc->sc_napvaps++;
716 else
717 sc->sc_nstavaps++;
718 break;
719 case IEEE80211_M_WDS:
720 sc->sc_nwdsvaps++;
721 break;
722 default:

--- 25 unchanged lines hidden (view full) ---

748 /* XXX disallow ap vap delete if WDS still present */
749 if (parent->if_drv_flags & IFF_DRV_RUNNING) {
750 /* quiesce h/w while we remove the vap */
751 mwl_hal_intrset(mh, 0); /* disable interrupts */
752 }
753 ieee80211_vap_detach(vap);
754 switch (opmode) {
755 case IEEE80211_M_HOSTAP:
719 sc->sc_napvaps++;
720 else
721 sc->sc_nstavaps++;
722 break;
723 case IEEE80211_M_WDS:
724 sc->sc_nwdsvaps++;
725 break;
726 default:

--- 25 unchanged lines hidden (view full) ---

752 /* XXX disallow ap vap delete if WDS still present */
753 if (parent->if_drv_flags & IFF_DRV_RUNNING) {
754 /* quiesce h/w while we remove the vap */
755 mwl_hal_intrset(mh, 0); /* disable interrupts */
756 }
757 ieee80211_vap_detach(vap);
758 switch (opmode) {
759 case IEEE80211_M_HOSTAP:
760 case IEEE80211_M_MBSS:
756 case IEEE80211_M_STA:
757 KASSERT(hvap != NULL, ("no hal vap handle"));
758 (void) mwl_hal_delstation(hvap, vap->iv_myaddr);
759 mwl_hal_delvap(hvap);
761 case IEEE80211_M_STA:
762 KASSERT(hvap != NULL, ("no hal vap handle"));
763 (void) mwl_hal_delstation(hvap, vap->iv_myaddr);
764 mwl_hal_delvap(hvap);
760 if (opmode == IEEE80211_M_HOSTAP)
765 if (opmode == IEEE80211_M_HOSTAP || opmode == IEEE80211_M_MBSS)
761 sc->sc_napvaps--;
762 else
763 sc->sc_nstavaps--;
764 /* XXX don't do it for IEEE80211_CLONE_MACADDR */
765 reclaim_address(sc, vap->iv_myaddr);
766 break;
767 case IEEE80211_M_WDS:
768 sc->sc_nwdsvaps--;

--- 507 unchanged lines hidden (view full) ---

1276 (IEEE80211_FHT_SHORTGI20|IEEE80211_FHT_SHORTGI40)) ? 1 : 0);
1277 mwl_hal_setnprot(hvap, ic->ic_htprotmode == IEEE80211_PROT_NONE ?
1278 HTPROTECT_NONE : HTPROTECT_AUTO);
1279 /* XXX txpower cap */
1280
1281 /* re-setup beacons */
1282 if (state == IEEE80211_S_RUN &&
1283 (vap->iv_opmode == IEEE80211_M_HOSTAP ||
766 sc->sc_napvaps--;
767 else
768 sc->sc_nstavaps--;
769 /* XXX don't do it for IEEE80211_CLONE_MACADDR */
770 reclaim_address(sc, vap->iv_myaddr);
771 break;
772 case IEEE80211_M_WDS:
773 sc->sc_nwdsvaps--;

--- 507 unchanged lines hidden (view full) ---

1281 (IEEE80211_FHT_SHORTGI20|IEEE80211_FHT_SHORTGI40)) ? 1 : 0);
1282 mwl_hal_setnprot(hvap, ic->ic_htprotmode == IEEE80211_PROT_NONE ?
1283 HTPROTECT_NONE : HTPROTECT_AUTO);
1284 /* XXX txpower cap */
1285
1286 /* re-setup beacons */
1287 if (state == IEEE80211_S_RUN &&
1288 (vap->iv_opmode == IEEE80211_M_HOSTAP ||
1289 vap->iv_opmode == IEEE80211_M_MBSS ||
1284 vap->iv_opmode == IEEE80211_M_IBSS)) {
1285 mwl_setapmode(vap, vap->iv_bss->ni_chan);
1286 mwl_hal_setnprotmode(hvap,
1287 MS(ic->ic_curhtprotmode, IEEE80211_HTINFO_OPMODE));
1288 return mwl_beacon_setup(vap);
1289 }
1290 return 0;
1291}

--- 2887 unchanged lines hidden (view full) ---

4179 mkpeerinfo(&pi, bss) : NULL,
4180 (bss->ni_flags & (IEEE80211_NODE_QOS | IEEE80211_NODE_HT)),
4181 bss->ni_ies.wme_ie != NULL ?
4182 WME(bss->ni_ies.wme_ie)->wme_info : 0);
4183 if (error == 0)
4184 mwl_setglobalkeys(vap);
4185 break;
4186 case IEEE80211_M_HOSTAP:
1290 vap->iv_opmode == IEEE80211_M_IBSS)) {
1291 mwl_setapmode(vap, vap->iv_bss->ni_chan);
1292 mwl_hal_setnprotmode(hvap,
1293 MS(ic->ic_curhtprotmode, IEEE80211_HTINFO_OPMODE));
1294 return mwl_beacon_setup(vap);
1295 }
1296 return 0;
1297}

--- 2887 unchanged lines hidden (view full) ---

4185 mkpeerinfo(&pi, bss) : NULL,
4186 (bss->ni_flags & (IEEE80211_NODE_QOS | IEEE80211_NODE_HT)),
4187 bss->ni_ies.wme_ie != NULL ?
4188 WME(bss->ni_ies.wme_ie)->wme_info : 0);
4189 if (error == 0)
4190 mwl_setglobalkeys(vap);
4191 break;
4192 case IEEE80211_M_HOSTAP:
4193 case IEEE80211_M_MBSS:
4187 error = mwl_hal_newstation(hvap, vap->iv_myaddr,
4188 0, 0, NULL, vap->iv_flags & IEEE80211_F_WME, 0);
4189 if (error == 0)
4190 mwl_setglobalkeys(vap);
4191 break;
4192 default:
4193 error = 0;
4194 break;

--- 48 unchanged lines hidden (view full) ---

4243 * be plumbed. This entry will be overwritten if we
4244 * associate; otherwise it will be reclaimed on node free.
4245 */
4246 ni = vap->iv_bss;
4247 MWL_NODE(ni)->mn_hvap = hvap;
4248 (void) mwl_peerstadb(ni, 0, 0, NULL);
4249 } else if (nstate == IEEE80211_S_CSA) {
4250 /* XXX move to below? */
4194 error = mwl_hal_newstation(hvap, vap->iv_myaddr,
4195 0, 0, NULL, vap->iv_flags & IEEE80211_F_WME, 0);
4196 if (error == 0)
4197 mwl_setglobalkeys(vap);
4198 break;
4199 default:
4200 error = 0;
4201 break;

--- 48 unchanged lines hidden (view full) ---

4250 * be plumbed. This entry will be overwritten if we
4251 * associate; otherwise it will be reclaimed on node free.
4252 */
4253 ni = vap->iv_bss;
4254 MWL_NODE(ni)->mn_hvap = hvap;
4255 (void) mwl_peerstadb(ni, 0, 0, NULL);
4256 } else if (nstate == IEEE80211_S_CSA) {
4257 /* XXX move to below? */
4251 if (vap->iv_opmode == IEEE80211_M_HOSTAP)
4258 if (vap->iv_opmode == IEEE80211_M_HOSTAP ||
4259 vap->iv_opmode == IEEE80211_M_MBSS)
4252 mwl_startcsa(vap);
4253 } else if (nstate == IEEE80211_S_CAC) {
4254 /* XXX move to below? */
4255 /* stop ap xmit and enable quiet mode radar detection */
4256 mwl_hal_setradardetection(mh, DR_CHK_CHANNEL_AVAILABLE_START);
4257 }
4258
4259 /*

--- 17 unchanged lines hidden (view full) ---

4277 ieee80211_chan2ieee(ic, ic->ic_curchan));
4278
4279 /*
4280 * Recreate local sta db entry to update WME/HT state.
4281 */
4282 mwl_localstadb(vap);
4283 switch (vap->iv_opmode) {
4284 case IEEE80211_M_HOSTAP:
4260 mwl_startcsa(vap);
4261 } else if (nstate == IEEE80211_S_CAC) {
4262 /* XXX move to below? */
4263 /* stop ap xmit and enable quiet mode radar detection */
4264 mwl_hal_setradardetection(mh, DR_CHK_CHANNEL_AVAILABLE_START);
4265 }
4266
4267 /*

--- 17 unchanged lines hidden (view full) ---

4285 ieee80211_chan2ieee(ic, ic->ic_curchan));
4286
4287 /*
4288 * Recreate local sta db entry to update WME/HT state.
4289 */
4290 mwl_localstadb(vap);
4291 switch (vap->iv_opmode) {
4292 case IEEE80211_M_HOSTAP:
4293 case IEEE80211_M_MBSS:
4285 if (ostate == IEEE80211_S_CAC) {
4286 /* enable in-service radar detection */
4287 mwl_hal_setradardetection(mh,
4288 DR_IN_SERVICE_MONITOR_START);
4289 sc->sc_radarena = 1;
4290 }
4291 /*
4292 * Allocate and setup the beacon frame

--- 725 unchanged lines hidden ---
4294 if (ostate == IEEE80211_S_CAC) {
4295 /* enable in-service radar detection */
4296 mwl_hal_setradardetection(mh,
4297 DR_IN_SERVICE_MONITOR_START);
4298 sc->sc_radarena = 1;
4299 }
4300 /*
4301 * Allocate and setup the beacon frame

--- 725 unchanged lines hidden ---