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 --- |