xtttp://'checlass=" ix = [];va://'checlass=" ix top" ty'ch> [];va://spnstclass=" ge_s=arg= [ /spnstclass=" ge_logo" targs,fname">LXRnet/wimax/onsck.c[ //spns [ /!-- -- [];va:/://spnstid=" ge_pri} "[];va:/:/> xt ://jxCo aethod="+pri} =net/wimax/onsck.c"){ var a", re"tid="pri} _jxCo= [ :/ buttod;ux.no/submie"tclass="pri} " [];va:/ va:/://imget" href="../.stavascpri} // xt ://jxCo aethod="+save=net/wimax/onsck.c"){ var a", re"tid="save_jxCo= [ :/ buttod;ux.no/submie"tclass="save" [];va:/ va:/://imget" href="../.stavascsave// [];d;t/spa op d;t/formop d;ta [];d; href="../linux+v3 [];d;timg src="../.static/gfx/right.png" alt=">>"> [t/spa op [tspa class="lxr_search"> [];
[];d;tinput typ13"hidden" nam13"navtarget" 3.4.13""> [];d;tinput typ13"text" nam13"search" id3"search"> [];d;tbutta"vtyp13"submit">Search [];d;Prefsp d;t/a> [t/spa op];d; ;t/divop];d; ;tform ac; ="ajax+*" method="post" onsubmit="return false;"> [tinput typ13"hidden" nam13"ajax_lookup" id3"ajax_lookup" 3.4.13""> ];d; ;t/formop ];d; ;tdiv class="headingbottam">p tdiv id3"file_contents"o
; ;1t/a>tspa  class="comment">/*t/spa op; ;2t/a>tspa  class="comment"> * Linux WiMAXt/spa op; ;3t/a>tspa  class="comment"> * Initializa;
  , addi].a"vand remo3.4 of wimax devicest/spa op; ;4t/a>tspa  class="comment"> *t/spa op; ;5t/a>tspa  class="comment"> *t/spa op; ;6t/a>tspa  class="comment"> * Copyright (C) 2005-2006 Intel Corpora;
   <linux-wimax@intel.com>t/spa op; ;7t/a>tspa  class="comment"> * Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com>t/spa op; ;8t/a>tspa  class="comment"> *t/spa op; ;9t/a>tspa  class="comment"> * This program is free software; you ca  redistribute itvand/ort/spa op; od [a>tspa  class="comment"> * modify itvunder the terms of the GNU Gener.4 Public License vers
  t/spa op; 11t/a>tspa  class="comment"> * 2 as published by the Free Software Founda;
  .t/spa op; 12t/a>tspa  class="comment"> *t/spa op; 13t/a>tspa  class="comment"> * This program is distributed in the hope that itvwill be useful,t/spa op; 14t/a>tspa  class="comment"> * but WITHOUT ANY WARRANTY;vwithout even the implied warranty oft/spa op; 15t/a>tspa  class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See thet/spa op; 16t/a>tspa  class="comment"> * GNU Gener.4 Public License for more details.t/spa op; 17t/a>tspa  class="comment"> *t/spa op; 18t/a>tspa  class="comment"> * You should have received a copy of the GNU Gener.4 Public Licenset/spa op; 19t/a>tspa  class="comment"> * alongvwith this program; if not, write to the Free Softwaret/spa op; 2d [a>tspa  class="comment"> * Founda;
  , Inc., 51 Franklin Street, Fifth Floor, Bost  , MAt/spa op; 21t/a>tspa  class="comment"> * 02110-1301, USA.t/spa op; 22t/a>tspa  class="comment"> *t/spa op; 23t/a>tspa  class="comment"> *t/spa op; 24t/a>tspa  class="comment"> * This implements:t/spa op; 25t/a>tspa  class="comment"> *t/spa op; 26t/a>tspa  class="comment"> *   - basic life cycle of 'struct wimax_dev' [wimax_dev_*()];   t/spa op; 27t/a>tspa  class="comment"> *     addi].a"/registra;
   initialize all subfieldsvand allocatet/spa op; 28t/a>tspa  class="comment"> *     generic netlink resources for user space communica;
  . O t/spa op; 29t/a>tspa  class="comment"> *     remo3.4/unregistra;
  ,vundo all that.t/spa op; 3d [a>tspa  class="comment"> *t/spa op; 31t/a>tspa  class="comment"> *   - device state machine [wimax_state_change()]vand support to sendt/spa op; 32t/a>tspa  class="comment"> *     reports to user space when the state changest/spa op; 33t/a>tspa  class="comment"> *     [wimax_gnl_re_state_change*()].t/spa op; 34t/a>tspa  class="comment"> *t/spa op; 35t/a>tspa  class="comment"> * See include/net/wimax.h for ra;
  alesvand desig .t/spa op; 36t/a>tspa  class="comment"> *t/spa op; 37t/a>tspa  class="comment"> * ROADMAPt/spa op; 38t/a>tspa  class="comment"> *t/spa op; 39t/a>tspa  class="comment"> * [__]wimax_state_change()     Called by drivers to update device's statet/spa op; 4d [a>tspa  class="comment"> *   wimax_gnl_re_state_change_alloc()t/spa op; 41t/a>tspa  class="comment"> *   wimax_gnl_re_state_change_send()t/spa op; 42t/a>tspa  class="comment"> *t/spa op; 43t/a>tspa  class="comment"> * wimax_dev_init()             Init a devicet/spa op; 44t/a>tspa  class="comment"> * wimax_dev_add()              Registert/spa op; 45t/a>tspa  class="comment"> *   wimax_rfkill_add()t/spa op; 46t/a>tspa  class="comment"> *   wimax_gnl_add()            Register all the generic netlink resources.t/spa op; 47t/a>tspa  class="comment"> *   wimax_id_table_add()t/spa op; 48t/a>tspa  class="comment"> * wimax_dev_rm()               Unregistert/spa op; 49t/a>tspa  class="comment"> *   wimax_id_table_rm()t/spa op; 5d [a>tspa  class="comment"> *   wimax_gnl_rm()t/spa op; 51t/a>tspa  class="comment"> *   wimax_rfkill_rm()t/spa op; 52t/a>tspa  class="comment"> */t/spa op; 53t/a>#include <linux/device.ht/a>>p; 54t/a>#include <linux/gfp.ht/a>>p; 55t/a>#include <net/genetlink.ht/a>>p; 56t/a>#include <linux/netdevice.ht/a>>p; 57t/a>#include <linux/wimax.ht/a>>p; 58t/a>#include <linux/module.ht/a>>p; 59t/a>#include "wimax-inter al.ht/a>"p; 6d [a>p; 61 [a>p; 62t/a>#define ta href="+code=D_SUBMODULE" class="sref">D_SUBMODULEt/a> ta href="+code=stack" class="sref">stack [a>p; 63t/a>#include "debug-levels.ht/a>"p; 64 [a>p; 65t/a>static char ta href="+code=wimax_debug_params" class="sref">wimax_debug_paramst/a>[128];p; 66t/a>ta href="+code=module_param_string" class="sref">module_param_stringt/a>(ta href="+code=debug" class="sref">debugt/a>, ta href="+code=wimax_debug_params" class="sref">wimax_debug_paramst/a>, sizeof(ta href="+code=wimax_debug_params" class="sref">wimax_debug_paramst/a>),p; 67t/a>                    0644);p; 68t/a>ta href="+code=MODULE_PARM_DESC" class="sref">MODULE_PARM_DESCt/a>(ta href="+code=debug" class="sref">debugt/a>,p; 69t/a>                 tspa  class="string">"String of space-separated NAME:VALUE pairs, where NAMEs "; 70t/a>                 tspa  class="string">"are the different debug submodulesvand VALUE are the "; 71t/a>                 tspa  class="string">"initial debug 3.4.1 to set."; 72 [a>p; 73t/a>tspa  class="comment">/*t/spa op; 74t/a>tspa  class="comment"> * Authoritative source for the RE_STATE_CHANGE attribute policyt/spa op; 75t/a>tspa  class="comment"> *t/spa op; 76t/a>tspa  class="comment"> * We don't really use itvhere, but /me likes to keep the defini].a"t/spa op; 77t/a>tspa  class="comment"> * clos1 to where the data is generated.t/spa op; 78t/a>tspa  class="comment"> */t/spa op; 79t/a>tspa  class="comment">/*t/spa op; 8d [a>tspa  class="comment">static const struct nla_policy wimax_gnl_re_status_change[WIMAX_GNL_ATTR_MAX + 1] = {t/spa op; 81t/a>tspa  class="comment">        [WIMAX_GNL_STCH_STATE_OLD] = { .typ1 = NLA_U8 },t/spa op; 82t/a>tspa  class="comment">        [WIMAX_GNL_STCH_STATE_NEW] = { .typ1 = NLA_U8 },t/spa op; 83t/a>tspa  class="comment">};t/spa op; 84t/a>tspa  class="comment">*/t/spa op; 85 [a>p; 86 [a>p; 87t/a>tspa  class="comment">/*t/spa op; 88t/a>tspa  class="comment"> * Allocate a Report State Change messaget/spa op; 89t/a>tspa  class="comment"> *t/spa op; 9d [a>tspa  class="comment"> * @header: save it, you need it for _send()t/spa op; 91t/a>tspa  class="comment"> *t/spa op; 92t/a>tspa  class="comment"> * Createsvand fillsva basic state change message; different codet/spa op; 93t/a>tspa  class="comment"> * paths ca  then add more attributes to the message as needed.t/spa op; 94t/a>tspa  class="comment"> *t/spa op; 95t/a>tspa  class="comment"> * Us1 wimax_gnl_re_state_change_send() to send the returned skb.t/spa op; 96t/a>tspa  class="comment"> *t/spa op; 97t/a>tspa  class="comment"> * Returns: skbvwith the genl message if ok, IS_ERR() ptr on errort/spa op; 98t/a>tspa  class="comment"> *     with an errno code.t/spa op; 99t/a>tspa  class="comment"> */t/spa op;100t/a>staticp;101t/a>struct ta href="+code=sk_buff" class="sref">sk_bufft/a> *ta href="+code=wimax_gnl_re_state_change_alloc" class="sref">wimax_gnl_re_state_change_alloct/a>(p;102t/a>        struct ta href="+code=wimax_dev" class="sref">wimax_devt/a> *ta href="+code=wimax_dev" class="sref">wimax_devt/a>,p;103t/a>        enum ta href="+code=wimax_st" class="sref">wimax_stt/a> ta href="+code=new_state" class="sref">new_statet/a>, enum ta href="+code=wimax_st" class="sref">wimax_stt/a> ta href="+code=old_state" class="sref">old_statet/a>,p;104t/a>        void **ta href="+code=header" class="sref">headert/a>)p;105t/a>{p;106t/a>        int ta href="+code=result" class="sref">resultt/a>;p;107t/a>        struct ta href="+code=device" class="sref">devicet/a> *ta href="+code=dev" class="sref">devt/a> = ta href="+code=wimax_dev_to_dev" class="sref">wimax_dev_to_devt/a>(ta href="+code=wimax_dev" class="sref">wimax_devt/a>);p;108t/a>        void *ta href="+code=data" class="sref">datat/a>;p;109t/a>        struct ta href="+code=sk_buff" class="sref">sk_bufft/a> *ta href="+code=report_skb" class="sref">report_skbt/a>;p;11d [a>p;111t/a>        ta href="+code=d_fnstart" class="sref">d_fnstartt/a>(3, ta href="+code=dev" class="sref">devt/a>, tspa  class="string">"(wimax_dev %p new_state %u old_state %u)\n";112t/a>                  ta href="+code=wimax_dev" class="sref">wimax_devt/a>, ta href="+code=new_state" class="sref">new_statet/a>, ta href="+code=old_state" class="sref">old_statet/a>);p;113t/a>        ta href="+code=result" class="sref">resultt/a> = -ta href="+code=ENOMEM" class="sref">ENOMEMt/a>;p;114t/a>        ta href="+code=report_skb" class="sref">report_skbt/a> = ta href="+code=nlmsg_new" class="sref">nlmsg_newt/a>(ta href="+code=NLMSG_DEFAULT_SIZE" class="sref">NLMSG_DEFAULT_SIZEt/a>, ta href="+code=GFP_KERNEL" class="sref">GFP_KERNELt/a>);p;115t/a>        if (ta href="+code=report_skb" class="sref">report_skbt/a> == ta href="+code=NULL" class="sref">NULLt/a>) {p;116t/a>                ta href="+code=dev_err" class="sref">dev_errt/a>(ta href="+code=dev" class="sref">devt/a>, tspa  class="string">"RE_STCH: ca 't create message\n";117t/a>                goto ta href="+code=error_new" class="sref">error_newt/a>;p;118t/a>        }p;119t/a>        ta href="+code=data" class="sref">datat/a> = ta href="+code=genlmsg_put" class="sref">genlmsg_putt/a>(ta href="+code=report_skb" class="sref">report_skbt/a>, 0, ta href="+code=wimax_gnl_mcg" class="sref">wimax_gnl_mcgt/a>.ta href="+code=id" class="sref">idt/a>, &ta href="+code=wimax_gnl_family" class="sref">wimax_gnl_familyt/a>,p;120t/a>                           0, ta href="+code=WIMAX_GNL_RE_STATE_CHANGE" class="sref">WIMAX_GNL_RE_STATE_CHANGEt/a>);p;121t/a>        if (ta href="+code=data" class="sref">datat/a> == ta href="+code=NULL" class="sref">NULLt/a>) {p;122t/a>                ta href="+code=dev_err" class="sref">dev_errt/a>(ta href="+code=dev" class="sref">devt/a>, tspa  class="string">"RE_STCH: ca 't put data into message\n";123t/a>                goto ta href="+code=error_put" class="sref">error_putt/a>;p;124t/a>        }p;125t/a>        *ta href="+code=header" class="sref">headert/a> = ta href="+code=data" class="sref">datat/a>;p;126 [a>p;127t/a>        ta href="+code=result" class="sref">resultt/a> = ta href="+code=nla_put_u8" class="sref">nla_put_u8t/a>(ta href="+code=report_skb" class="sref">report_skbt/a>, ta href="+code=WIMAX_GNL_STCH_STATE_OLD" class="sref">WIMAX_GNL_STCH_STATE_OLDt/a>, ta href="+code=old_state" class="sref">old_statet/a>);p;128t/a>        if (ta href="+code=result" class="sref">resultt/a> < 0) {p;129t/a>                ta href="+code=dev_err" class="sref">dev_errt/a>(ta href="+code=dev" class="sref">devt/a>, tspa  class="string">"RE_STCH: Error adding OLD attr: %d\n"resultt/a>);p;130t/a>                goto ta href="+code=error_put" class="sref">error_putt/a>;p;131t/a>        }p;132t/a>        ta href="+code=result" class="sref">resultt/a> = ta href="+code=nla_put_u8" class="sref">nla_put_u8t/a>(ta href="+code=report_skb" class="sref">report_skbt/a>, ta href="+code=WIMAX_GNL_STCH_STATE_NEW" class="sref">WIMAX_GNL_STCH_STATE_NEWt/a>, ta href="+code=new_state" class="sref">new_statet/a>);p;133t/a>        if (ta href="+code=result" class="sref">resultt/a> < 0) {p;134t/a>                ta href="+code=dev_err" class="sref">dev_errt/a>(ta href="+code=dev" class="sref">devt/a>, tspa  class="string">"RE_STCH: Error adding NEW attr: %d\n"resultt/a>);p;135t/a>                goto ta href="+code=error_put" class="sref">error_putt/a>;p;136t/a>        }p;137t/a>        ta href="+code=result" class="sref">resultt/a> = ta href="+code=nla_put_u32" class="sref">nla_put_u32t/a>(ta href="+code=report_skb" class="sref">report_skbt/a>, ta href="+code=WIMAX_GNL_STCH_IFIDX" class="sref">WIMAX_GNL_STCH_IFIDXt/a>,p                             ta href="+code=wimax_dev" class="sref">wimax_devt/a>->ta href="+code=net_dev" class="sref">net_devt/a>->ta href="+code=ifindex" class="sref">ifindext/a>);p;139t/a>        if (ta href="+code=result" class="sref">resultt/a> < 0) {p;140t/a>                ta href="+code=dev_err" class="sref">dev_errt/a>(ta href="+code=dev" class="sref">devt/a>, tspa  class="string">"RE_STCH: Error adding IFINDEX attribute\n";141t/a>                goto ta href="+code=error_put" class="sref">error_putt/a>;p;142t/a>        }p;143t/a>        ta href="+code=d_fnend" class="sref">d_fnendt/a>(3, ta href="+code=dev" class="sref">devt/a>, tspa  class="string">"(wimax_dev %p new_state %u old_state %u) = %p\n";144t/a>                ta href="+code=wimax_dev" class="sref">wimax_devt/a>, ta href="+code=new_state" class="sref">new_statet/a>, ta href="+code=old_state" class="sref">old_statet/a>, ta href="+code=report_skb" class="sref">report_skbt/a>);p;145t/a>        return ta href="+code=report_skb" class="sref">report_skbt/a>;p;146 [a>p;147t/a>ta href="+code=error_put" class="sref">error_putt/a>:p;148t/a>        ta href="+code=nlmsg_free" class="sref">nlmsg_freet/a>(ta href="+code=report_skb" class="sref">report_skbt/a>);p;149t/a>ta href="+code=error_new" class="sref">error_newt/a>:p;150t/a>        ta href="+code=d_fnend" class="sref">d_fnendt/a>(3, ta href="+code=dev" class="sref">devt/a>, tspa  class="string">"(wimax_dev %p new_state %u old_state %u) = %d\n";151t/a>                ta href="+code=wimax_dev" class="sref">wimax_devt/a>, ta href="+code=new_state" class="sref">new_statet/a>, ta href="+code=old_state" class="sref">old_statet/a>, ta href="+code=result" class="sref">resultt/a>);p;152t/a>        return ta href="+code=ERR_PTR" class="sref">ERR_PTRt/a>(ta href="+code=result" class="sref">resultt/a>);p;153t/a>}p;154 [a>p;155 [a>p;156t/a>tspa  class="comment">/*t/spa op;157t/a>tspa  class="comment"> * Send a Report State Change message (as created with _alloc).t/spa op;158t/a>tspa  class="comment"> *t/spa op;159t/a>tspa  class="comment"> * @report_skb: as returned by wimax_gnl_re_state_change_alloc()t/spa op;16d [a>tspa  class="comment"> * @header: as returned by wimax_gnl_re_state_change_alloc()t/spa op;161t/a>tspa  class="comment"> *t/spa op;162t/a>tspa  class="comment"> * Returns: 0 if ok, < 0 errno code on error.t/spa op;163t/a>tspa  class="comment"> *t/spa op;164t/a>tspa  class="comment"> * If the message is  NULL, pretend it did 't happe .t/spa op;165t/a>tspa  class="comment"> */t/spa op;166t/a>staticp;167t/a>int ta href="+code=wimax_gnl_re_state_change_send" class="sref">wimax_gnl_re_state_change_sendt/a>(p;168t/a>        struct ta href="+code=wimax_dev" class="sref">wimax_devt/a> *ta href="+code=wimax_dev" class="sref">wimax_devt/a>, struct ta href="+code=sk_buff" class="sref">sk_bufft/a> *ta href="+code=report_skb" class="sref">report_skbt/a>,p;169t/a>        void *ta href="+code=header" class="sref">headert/a>)p;170t/a>{p;171t/a>        int ta href="+code=result" class="sref">resultt/a> = 0;p;172t/a>        struct ta href="+code=device" class="sref">devicet/a> *ta href="+code=dev" class="sref">devt/a> = ta href="+code=wimax_dev_to_dev" class="sref">wimax_dev_to_devt/a>(ta href="+code=wimax_dev" class="sref">wimax_devt/a>);p;173t/a>        ta href="+code=d_fnstart" class="sref">d_fnstartt/a>(3, ta href="+code=dev" class="sref">devt/a>, tspa  class="string">"(wimax_dev %p report_skb %p)\n";174t/a>                  ta href="+code=wimax_dev" class="sref">wimax_devt/a>, ta href="+code=report_skb" class="sref">report_skbt/a>);p;175t/a>        if (ta href="+code=report_skb" class="sref">report_skbt/a> == ta href="+code=NULL" class="sref">NULLt/a>) {p;176t/a>                ta href="+code=result" class="sref">resultt/a> = -ta href="+code=ENOMEM" class="sref">ENOMEMt/a>;p;177t/a>                goto ta href="+code=out" class="sref">outt/a>;p;178t/a>        }p;179t/a>        ta href="+code=genlmsg_end" class="sref">genlmsg_endt/a>(ta href="+code=report_skb" class="sref">report_skbt/a>, ta href="+code=header" class="sref">headert/a>);p;180t/a>        ta href="+code=genlmsg_multicast" class="sref">genlmsg_multicastt/a>(ta href="+code=report_skb" class="sref">report_skbt/a>, 0, ta href="+code=wimax_gnl_mcg" class="sref">wimax_gnl_mcgt/a>.ta href="+code=id" class="sref">idt/a>, ta href="+code=GFP_KERNEL" class="sref">GFP_KERNELt/a>);p;181t/a>ta href="+code=out" class="sref">outt/a>:p;182t/a>        ta href="+code=d_fnend" class="sref">d_fnendt/a>(3, ta href="+code=dev" class="sref">devt/a>, tspa  class="string">"(wimax_dev %p report_skb %p) = %d\n";183t/a>                ta href="+code=wimax_dev" class="sref">wimax_devt/a>, ta href="+code=report_skb" class="sref">report_skbt/a>, ta href="+code=result" class="sref">resultt/a>);p;184t/a>        return ta href="+code=result" class="sref">resultt/a>;p;185 [a>}p;186 [a>p;187t/a>p;188t/a>staticp;189t/a>void ta href="+code=__check_new_state" class="sref">__check_new_statet/a>(enum ta href="+code=wimax_st" class="sref">wimax_stt/a> ta href="+code=old_state" class="sref">old_statet/a>, enum ta href="+code=wimax_st" class="sref">wimax_stt/a> ta href="+code=new_state" class="sref">new_statet/a>,p;190t/a>                       unsig ed int ta href="+code=allowed_states_bm" class="sref">allowed_states_bmt/a>)p;191t/a>{p;192t/a>        if (ta href="+code=WARN_ON" class="sref">WARN_ONt/a>(((1 << ta href="+code=new_state" class="sref">new_statet/a>) & ta href="+code=allowed_states_bm" class="sref">allowed_states_bmt/a>) == 0)) {p;193t/a>                ta href="+code=printk" class="sref">printkt/a>(ta href="+code=KERN_ERR" class="sref">KERN_ERRt/a> tspa  class="string">"SW BUG! Forbidden state change %u -> %u\n";194t/a>                        ta href="+code=old_state" class="sref">old_statet/a>, ta href="+code=new_state" class="sref">new_statet/a>);p;195t/a>        }p;196t/a>}p;197t/a>p;198t/a>p;199t/a>tspa  class="comment">/*t/spa op;20d [a>tspa  class="comment"> * Set the current state of a WiMAX device [unlocking vers
   oft/spa op;201t/a>tspa  class="comment"> * wimax_state_change().t/spa op;202t/a>tspa  class="comment"> */t/spa op;203t/a>void ta href="+code=__wimax_state_change" class="sref">__wimax_state_changet/a>(struct ta href="+code=wimax_dev" class="sref">wimax_devt/a> *ta href="+code=wimax_dev" class="sref">wimax_devt/a>, enum ta href="+code=wimax_st" class="sref">wimax_stt/a> ta href="+code=new_state" class="sref">new_statet/a>)p;204t/a>{p;205t/a>        struct ta href="+code=device" class="sref">devicet/a> *ta href="+code=dev" class="sref">devt/a> = ta href="+code=wimax_dev_to_dev" class="sref">wimax_dev_to_devt/a>(ta href="+code=wimax_dev" class="sref">wimax_devt/a>);p;206t/a>        enum ta href="+code=wimax_st" class="sref">wimax_stt/a> ta href="+code=old_state" class="sref">old_statet/a> = ta href="+code=wimax_dev" class="sref">wimax_devt/a>->ta href="+code=state" class="sref">statet/a>;p;207t/a>        struct ta href="+code=sk_buff" class="sref">sk_bufft/a> *ta href="+code=stch_skb" class="sref">stch_skbt/a>;p;208t/a>        void *ta href="+code=header" class="sref">headert/a>;p;209t/a>p;210t/a>        ta href="+code=d_fnstart" class="sref">d_fnstartt/a>(3, ta href="+code=dev" class="sref">devt/a>, tspa  class="string">"(wimax_dev %p new_state %u [old %u])\n";211t/a>                  ta href="+code=wimax_dev" class="sref">wimax_devt/a>, ta href="+code=new_state" class="sref">new_statet/a>, ta href="+code=old_state" class="sref">old_statet/a>);p;212 [a>p;213t/a>        if (ta href="+code=WARN_ON" class="sref">WARN_ONt/a>(ta href="+code=new_state" class="sref">new_statet/a> >= ta href="+code=__WIMAX_ST_INVALID" class="sref">__WIMAX_ST_INVALIDt/a>)) {p;214t/a>                ta href="+code=dev_err" class="sref">dev_errt/a>(ta href="+code=dev" class="sref">devt/a>, tspa  class="string">"SW BUG: requesting invalid state %u\n";215t/a>                        ta href="+code=new_state" class="sref">new_statet/a>);p;216t/a>                goto ta href="+code=out" class="sref">outt/a>;p;217t/a>        }p;218t/a>        if (ta href="+code=old_state" class="sref">old_statet/a> == ta href="+code=new_state" class="sref">new_statet/a>)p;219t/a>                goto ta href="+code=out" class="sref">outt/a>;p;220t/a>        ta href="+code=header" class="sref">headert/a> = ta href="+code=NULL" class="sref">NULLt/a>;  tspa  class="comment">/* gcc complains? ca 't grok why */t/spa op;221t/a>        ta href="+code=stch_skb" class="sref">stch_skbt/a> = ta href="+code=wimax_gnl_re_state_change_alloc" class="sref">wimax_gnl_re_state_change_alloct/a>(p;222t/a>                ta href="+code=wimax_dev" class="sref">wimax_devt/a>, ta href="+code=new_state" class="sref">new_statet/a>, ta href="+code=old_state" class="sref">old_statet/a>, &ta href="+code=header" class="sref">headert/a>);p;223t/a>p;224t/a>        tspa  class="comment">/* Verify the state transi].a"vand do exit-from-state ac].a"s */t/spa op;225t/a>        switch (ta href="+code=old_state" class="sref">old_statet/a>) {p;226t/a>        case ta href="+code=__WIMAX_ST_NULL" class="sref">__WIMAX_ST_NULLt/a>:p;227t/a>                ta href="+code=__check_new_state" class="sref">__check_new_statet/a>(ta href="+code=old_state" class="sref">old_statet/a>, ta href="+code=new_state" class="sref">new_statet/a>,p;228t/a>                                  1 << ta href="+code=WIMAX_ST_DOWN" class="sref">WIMAX_ST_DOWNt/a>);p;229t/a>                break;p;230t/a>        case ta href="+code=WIMAX_ST_DOWN" class="sref">WIMAX_ST_DOWNt/a>:p;231t/a>                ta href="+code=__check_new_state" class="sref">__check_new_statet/a>(ta href="+code=old_state" class="sref">old_statet/a>, ta href="+code=new_state" class="sref">new_statet/a>,p;232t/a>                                  1 << ta href="+code=__WIMAX_ST_QUIESCING" class="sref">__WIMAX_ST_QUIESCINGt/a>p;233t/a>                                  | 1 << ta href="+code=WIMAX_ST_UNINITIALIZED" class="sref">WIMAX_ST_UNINITIALIZEDt/a>p;234t/a>                                  | 1 << ta href="+code=WIMAX_ST_RADIO_OFF" class="sref">WIMAX_ST_RADIO_OFFt/a>);p;235t/a>                break;p;236t/a>        case ta href="+code=__WIMAX_ST_QUIESCING" class="sref">__WIMAX_ST_QUIESCINGt/a>:p;237t/a>                ta href="+code=__check_new_state" class="sref">__check_new_statet/a>(ta href="+code=old_state" class="sref">old_statet/a>, ta href="+code=new_state" class="sref">new_statet/a>, 1 << ta href="+code=WIMAX_ST_DOWN" class="sref">WIMAX_ST_DOWNt/a>);p                break;p;239t/a>        case ta href="+code=WIMAX_ST_UNINITIALIZED" class="sref">WIMAX_ST_UNINITIALIZEDt/a>:p;240t/a>                ta href="+code=__check_new_state" class="sref">__check_new_statet/a>(ta href="+code=old_state" class="sref">old_statet/a>, ta href="+code=new_state" class="sref">new_statet/a>,p;241t/a>                                  1 << ta href="+code=__WIMAX_ST_QUIESCING" class="sref">__WIMAX_ST_QUIESCINGt/a>p;242t/a>                                  | 1 << ta href="+code=WIMAX_ST_RADIO_OFF" class="sref">WIMAX_ST_RADIO_OFFt/a>);p;243t/a>                break;p;244t/a>        case ta href="+code=WIMAX_ST_RADIO_OFF" class="sref">WIMAX_ST_RADIO_OFFt/a>:p;245t/a>                ta href="+code=__check_new_state" class="sref">__check_new_statet/a>(ta href="+code=old_state" class="sref">old_statet/a>, ta href="+code=new_state" class="sref">new_statet/a>,p;246t/a>                                  1 << ta href="+code=__WIMAX_ST_QUIESCING" class="sref">__WIMAX_ST_QUIESCINGt/a>p;247t/a>                                  | 1 << ta href="+code=WIMAX_ST_READY" class="sref">WIMAX_ST_READYt/a>);p;248t/a>                break;p;249t/a>        case ta href="+code=WIMAX_ST_READY" class="sref">WIMAX_ST_READYt/a>:p;250t/a>                ta href="+code=__check_new_state" class="sref">__check_new_statet/a>(ta href="+code=old_state" class="sref">old_statet/a>, ta href="+code=new_state" class="sref">new_statet/a>,p;251t/a>                                  1 << ta href="+code=__WIMAX_ST_QUIESCING" class="sref">__WIMAX_ST_QUIESCINGt/a>p;252t/a>                                  | 1 << ta href="+code=WIMAX_ST_RADIO_OFF" class="sref">WIMAX_ST_RADIO_OFFt/a>p;253t/a>                                  | 1 << ta href="+code=WIMAX_ST_SCANNING" class="sref">WIMAX_ST_SCANNINGt/a>p;254t/a>                                  | 1 << ta href="+code=WIMAX_ST_CONNECTING" class="sref">WIMAX_ST_CONNECTINGt/a>p;255t/a>                                  | 1 << ta href="+code=WIMAX_ST_CONNECTED" class="sref">WIMAX_ST_CONNECTEDt/a>);p;256t/a>                break;p;257t/a>        case ta href="+code=WIMAX_ST_SCANNING" class="sref">WIMAX_ST_SCANNINGt/a>:p;258t/a>                ta href="+code=__check_new_state" class="sref">__check_new_statet/a>(ta href="+code=old_state" class="sref">old_statet/a>, ta href="+code=new_state" class="sref">new_statet/a>,p;259t/a>                                  1 << ta href="+code=__WIMAX_ST_QUIESCING" class="sref">__WIMAX_ST_QUIESCINGt/a>p;260t/a>                                  | 1 << ta href="+code=WIMAX_ST_RADIO_OFF" class="sref">WIMAX_ST_RADIO_OFFt/a>p;261t/a>                                  | 1 << ta href="+code=WIMAX_ST_READY" class="sref">WIMAX_ST_READYt/a>p;262t/a>                                  | 1 << ta href="+code=WIMAX_ST_CONNECTING" class="sref">WIMAX_ST_CONNECTINGt/a>p;263t/a>                                  | 1 << ta href="+code=WIMAX_ST_CONNECTED" class="sref">WIMAX_ST_CONNECTEDt/a>);p;264t/a>                break;p;265t/a>        case ta href="+code=WIMAX_ST_CONNECTING" class="sref">WIMAX_ST_CONNECTINGt/a>:p;266t/a>                ta href="+code=__check_new_state" class="sref">__check_new_statet/a>(ta href="+code=old_state" class="sref">old_statet/a>, ta href="+code=new_state" class="sref">new_statet/a>,p;267t/a>                                  1 << ta href="+code=__WIMAX_ST_QUIESCING" class="sref">__WIMAX_ST_QUIESCINGt/a>p;268t/a>                                  | 1 << ta href="+code=WIMAX_ST_RADIO_OFF" class="sref">WIMAX_ST_RADIO_OFFt/a>p;269t/a>                                  | 1 << ta href="+code=WIMAX_ST_READY" class="sref">WIMAX_ST_READYt/a>p;270t/a>                                  | 1 << ta href="+code=WIMAX_ST_SCANNING" class="sref">WIMAX_ST_SCANNINGt/a>p;271t/a>                                  | 1 << ta href="+code=WIMAX_ST_CONNECTED" class="sref">WIMAX_ST_CONNECTEDt/a>);p;272t/a>                break;p;273t/a>        case ta href="+code=WIMAX_ST_CONNECTED" class="sref">WIMAX_ST_CONNECTEDt/a>:p;274t/a>                ta href="+code=__check_new_state" class="sref">__check_new_statet/a>(ta href="+code=old_state" class="sref">old_statet/a>, ta href="+code=new_state" class="sref">new_statet/a>,p;275t/a>                                  1 << ta href="+code=__WIMAX_ST_QUIESCING" class="sref">__WIMAX_ST_QUIESCINGt/a>p;276t/a>                                  | 1 << ta href="+code=WIMAX_ST_RADIO_OFF" class="sref">WIMAX_ST_RADIO_OFFt/a>p;277t/a>                                  | 1 << ta href="+code=WIMAX_ST_READY" class="sref">WIMAX_ST_READYt/a>);p;278t/a>                ta href="+code=netif_tx_disable" class="sref">netif_tx_disablet/a>(ta href="+code=wimax_dev" class="sref">wimax_devt/a>->ta href="+code=net_dev" class="sref">net_devt/a>);p;279t/a>                ta href="+code=netif_carrier_off" class="sref">netif_carrier_offt/a>(ta href="+code=wimax_dev" class="sref">wimax_devt/a>->ta href="+code=net_dev" class="sref">net_devt/a>);p;280t/a>                break;p;281t/a>        case ta href="+code=__WIMAX_ST_INVALID" class="sref">__WIMAX_ST_INVALIDt/a>:p;282t/a>        default:p;283t/a>                ta href="+code=dev_err" class="sref">dev_errt/a>(ta href="+code=dev" class="sref">devt/a>, tspa  class="string">"SW BUG: wimax_dev %p is in unknown state %u\n";284t/a>                        ta href="+code=wimax_dev" class="sref">wimax_devt/a>, ta href="+code=wimax_dev" class="sref">wimax_devt/a>->ta href="+code=state" class="sref">statet/a>);p;285t/a>                ta href="+code=WARN_ON" class="sref">WARN_ONt/a>(1);p;286t/a>                goto ta href="+code=out" class="sref">outt/a>;p;287t/a>        }p;288t/a>p;289t/a>        tspa  class="comment">/* Execute the ac].a"s of entry to the new state */t/spa op;290t/a>        switch (ta href="+code=new_state" class="sref">new_statet/a>) {p;291t/a>        case ta href="+code=__WIMAX_ST_NULL" class="sref">__WIMAX_ST_NULLt/a>:p;292t/a>                ta href="+code=dev_err" class="sref">dev_errt/a>(ta href="+code=dev" class="sref">devt/a>, tspa  class="string">"SW BUG: wimax_dev %p entering NULL state ";293t/a>                        tspa  class="string">"from %u\n"wimax_devt/a>, ta href="+code=wimax_dev" class="sref">wimax_devt/a>->ta href="+code=state" class="sref">statet/a>);p;294t/a>                ta href="+code=WARN_ON" class="sref">WARN_ONt/a>(1);             tspa  class="comment">/* Nobody ca  enter this state */t/spa op;295t/a>                break;p;296t/a>        case ta href="+code=WIMAX_ST_DOWN" class="sref">WIMAX_ST_DOWNt/a>:p;297t/a>                break;p;298t/a>        case ta href="+code=__WIMAX_ST_QUIESCING" class="sref">__WIMAX_ST_QUIESCINGt/a>:p;299t/a>                break;p;300t/a>        case ta href="+code=WIMAX_ST_UNINITIALIZED" class="sref">WIMAX_ST_UNINITIALIZEDt/a>:p;301t/a>                break;p;302t/a>        case ta href="+code=WIMAX_ST_RADIO_OFF" class="sref">WIMAX_ST_RADIO_OFFt/a>:p;303t/a>                break;p;304t/a>        case ta href="+code=WIMAX_ST_READY" class="sref">WIMAX_ST_READYt/a>:p;305t/a>                break;p;306t/a>        case ta href="+code=WIMAX_ST_SCANNING" class="sref">WIMAX_ST_SCANNINGt/a>:p;307t/a>                break;p;308t/a>        case ta href="+code=WIMAX_ST_CONNECTING" class="sref">WIMAX_ST_CONNECTINGt/a>:p;309t/a>                break;p;310t/a>        case ta href="+code=WIMAX_ST_CONNECTED" class="sref">WIMAX_ST_CONNECTEDt/a>:p;311t/a>                ta href="+code=netif_carrier_on" class="sref">netif_carrier_ont/a>(ta href="+code=wimax_dev" class="sref">wimax_devt/a>->ta href="+code=net_dev" class="sref">net_devt/a>);p;312t/a>                ta href="+code=netif_wake_queue" class="sref">netif_wake_queuet/a>(ta href="+code=wimax_dev" class="sref">wimax_devt/a>->ta href="+code=net_dev" class="sref">net_devt/a>);p;313t/a>                break;p;314t/a>        case ta href="+code=__WIMAX_ST_INVALID" class="sref">__WIMAX_ST_INVALIDt/a>:p;315t/a>        default:p;316t/a>                ta href="+code=BUG" class="sref">BUGt/a>();p;317t/a>        }p;318t/a>        ta href="+code=__wimax_state_set" class="sref">__wimax_state_sett/a>(ta href="+code=wimax_dev" class="sref">wimax_devt/a>, ta href="+code=new_state" class="sref">new_statet/a>);p;319t/a>        if (!ta href="+code=IS_ERR" class="sref">IS_ERRt/a>(ta href="+code=stch_skb" class="sref">stch_skbt/a>))p;320t/a>                ta href="+code=wimax_gnl_re_state_change_send" class="sref">wimax_gnl_re_state_change_sendt/a>(ta href="+code=wimax_dev" class="sref">wimax_devt/a>, ta href="+code=stch_skb" class="sref">stch_skbt/a>, ta href="+code=header" class="sref">headert/a>);p;321t/a>ta href="+code=out" class="sref">outt/a>:p;322t/a>        ta href="+code=d_fnend" class="sref">d_fnendt/a>(3, ta href="+code=dev" class="sref">devt/a>, tspa  class="string">"(wimax_dev %p new_state %u [old %u]) = void\n";323t/a>                ta href="+code=wimax_dev" class="sref">wimax_devt/a>, ta href="+code=new_state" class="sref">new_statet/a>, ta href="+code=old_state" class="sref">old_statet/a>);p;324t/a>}p;325 [a>p;326 [a>p;327t/a>tspa  class="comment">/**t/spa op;328t/a>tspa  class="comment"> * wimax_state_change - Set the current state of a WiMAX devicet/spa op;329t/a>tspa  class="comment"> *t/spa op;33d [a>tspa  class="comment"> * @wimax_dev: WiMAX device descriptor (properly referenced)t/spa op;331t/a>tspa  class="comment"> * @new_state: New state to switch tot/spa op;332t/a>tspa  class="comment"> *t/spa op;333t/a>tspa  class="comment"> * This implements the state changes for the wimax devices. It willt/spa op;334t/a>tspa  class="comment"> *t/spa op;335t/a>tspa  class="comment"> * - verify that the state transi].a"vis legal (for now it'll justt/spa op;336t/a>tspa  class="comment"> *   print a warning if not) according to the table int/spa op;337t/a>tspa  class="comment"> *   linux/wimax.h's documenta].a"vfor 'enum wimax_st'.t/spa optspa  class="comment"> *t/spa op;339t/a>tspa  class="comment"> * - perform the ac].a"s neededvfor leaving the current state andt/spa op;34d [a>tspa  class="comment"> *   whichever are neededvfor entering the new state.t/spa op;341t/a>tspa  class="comment"> *t/spa op;342t/a>tspa  class="comment"> * -vissue a report to user space indicating the new state (and ant/spa op;343t/a>tspa  class="comment"> *   op].a"al payload with informa].a"vabout the new state).t/spa op;344t/a>tspa  class="comment"> *t/spa op;345t/a>tspa  class="comment"> * NOTE: @wimax_dev must be lockedt/spa op;346t/a>tspa  class="comment"> */t/spa op;347t/a>void ta href="+code=wimax_state_change" class="sref">wimax_state_changet/a>(struct ta href="+code=wimax_dev" class="sref">wimax_devt/a> *ta href="+code=wimax_dev" class="sref">wimax_devt/a>, enum ta href="+code=wimax_st" class="sref">wimax_stt/a> ta href="+code=new_state" class="sref">new_statet/a>)p;348t/a>{p;349t/a>        tspa  class="comment">/*t/spa op;35d [a>tspa  class="comment">         * A driver cannot take the wimax_dev out of thet/spa op;351t/a>tspa  class="comment">         * __WIMAX_ST_NULL state unless by calling wimax_dev_add(). Ift/spa op;352t/a>tspa  class="comment">         * the wimax_dev's state is still NULL, we ignore any requestt/spa op;353t/a>tspa  class="comment">         * to change its state because it means it has 't been yett/spa op;354t/a>tspa  class="comment">         * registered.t/spa op;355t/a>tspa  class="comment">         *t/spa op;356t/a>tspa  class="comment">         * There is no need to complainvabout it, as routines thatt/spa op;357t/a>tspa  class="comment">         * call this might be sharedvfrom different code paths thatt/spa op;358t/a>tspa  class="comment">         * are calledvbefore or after wimax_dev_add() has done itst/spa op;359t/a>tspa  class="comment">         * job.t/spa op;36d [a>tspa  class="comment">         */t/spa op;361t/a>        ta href="+code=mutex_lock" class="sref">mutex_lockt/a>(&ta href="+code=wimax_dev" class="sref">wimax_devt/a>->ta href="+code=mutex" class="sref">mutext/a>);p;362t/a>        if (ta href="+code=wimax_dev" class="sref">wimax_devt/a>->ta href="+code=state" class="sref">statet/a> > ta href="+code=__WIMAX_ST_NULL" class="sref">__WIMAX_ST_NULLt/a>)p;363t/a>                ta href="+code=__wimax_state_change" class="sref">__wimax_state_changet/a>(ta href="+code=wimax_dev" class="sref">wimax_devt/a>, ta href="+code=new_state" class="sref">new_statet/a>);p;364t/a>        ta href="+code=mutex_unlock" class="sref">mutex_unlockt/a>(&ta href="+code=wimax_dev" class="sref">wimax_devt/a>->ta href="+code=mutex" class="sref">mutext/a>);p;365 [a>}p;366t/a>ta href="+code=EXPORT_SYMBOL_GPL" class="sref">EXPORT_SYMBOL_GPLt/a>(ta href="+code=wimax_state_change" class="sref">wimax_state_changet/a>);p;367t/a>p;368t/a>p;369t/a>tspa  class="comment">/**t/spa op;37d [a>tspa  class="comment"> * wimax_state_get() - Return the current state of a WiMAX devicet/spa op;371t/a>tspa  class="comment"> *t/spa op;372t/a>tspa  class="comment"> * @wimax_dev: WiMAX device descriptort/spa op;373t/a>tspa  class="comment"> *t/spa op;374t/a>tspa  class="comment"> * Returns: Current state of the device according to its driver.t/spa op;375t/a>tspa  class="comment"> */t/spa op;376t/a>enum ta href="+code=wimax_st" class="sref">wimax_stt/a> ta href="+code=wimax_state_get" class="sref">wimax_state_gett/a>(struct ta href="+code=wimax_dev" class="sref">wimax_devt/a> *ta href="+code=wimax_dev" class="sref">wimax_devt/a>)p;377t/a>{p;378t/a>        enum ta href="+code=wimax_st" class="sref">wimax_stt/a> ta href="+code=state" class="sref">statet/a>;p;379t/a>        ta href="+code=mutex_lock" class="sref">mutex_lockt/a>(&ta href="+code=wimax_dev" class="sref">wimax_devt/a>->ta href="+code=mutex" class="sref">mutext/a>);p;380t/a>        ta href="+code=state" class="sref">statet/a> = ta href="+code=wimax_dev" class="sref">wimax_devt/a>->ta href="+code=state" class="sref">statet/a>;p;381t/a>        ta href="+code=mutex_unlock" class="sref">mutex_unlockt/a>(&ta href="+code=wimax_dev" class="sref">wimax_devt/a>->ta href="+code=mutex" class="sref">mutext/a>);p;382t/a>        return ta href="+code=state" class="sref">statet/a>;p;383t/a>}p;384t/a>ta href="+code=EXPORT_SYMBOL_GPL" class="sref">EXPORT_SYMBOL_GPLt/a>(ta href="+code=wimax_state_get" class="sref">wimax_state_gett/a>);p;385 [a>p;386 [a>p;387t/a>tspa  class="comment">/**t/spa op;388t/a>tspa  class="comment"> * wimax_dev_init -vinitialize a newly allocatedvinstancet/spa op;389t/a>tspa  class="comment"> *t/spa op;39d [a>tspa  class="comment"> * @wimax_dev: WiMAX device descriptor to initialize.t/spa op;391t/a>tspa  class="comment"> *t/spa op;392t/a>tspa  class="comment"> * Initializes fields of a freshly allocatedv@wimax_dev instance. Thist/spa op;393t/a>tspa  class="comment"> * func].a"vassumes that after allocat.a", the memory occupiedvbyt/spa op;394t/a>tspa  class="comment"> * @wimax_dev was zeroed.t/spa op;395t/a>tspa  class="comment"> */t/spa op;396t/a>void ta href="+code=wimax_dev_init" class="sref">wimax_dev_initt/a>(struct ta href="+code=wimax_dev" class="sref">wimax_devt/a> *ta href="+code=wimax_dev" class="sref">wimax_devt/a>)p;397t/a>{p;398t/a>        ta href="+code=INIT_LIST_HEAD" class="sref">INIT_LIST_HEADt/a>(&ta href="+code=wimax_dev" class="sref">wimax_devt/a>->ta href="+code=id_table_node" class="sref">id_table_nodet/a>);p;399t/a>        ta href="+code=__wimax_state_set" class="sref">__wimax_state_sett/a>(ta href="+code=wimax_dev" class="sref">wimax_devt/a>, ta href="+code=__WIMAX_ST_NULL" class="sref">__WIMAX_ST_NULLt/a>);p;400t/a>        ta href="+code=mutex_init" class="sref">mutex_initt/a>(&ta href="+code=wimax_dev" class="sref">wimax_devt/a>->ta href="+code=mutex" class="sref">mutext/a>);p;401t/a>        ta href="+code=mutex_init" class="sref">mutex_initt/a>(&ta href="+code=wimax_dev" class="sref">wimax_devt/a>->ta href="+code=mutex_reset" class="sref">mutex_resett/a>);p;402t/a>}p;403t/a>ta href="+code=EXPORT_SYMBOL_GPL" class="sref">EXPORT_SYMBOL_GPLt/a>(ta href="+code=wimax_dev_init" class="sref">wimax_dev_initt/a>);p;404t/a>p;405t/a>tspa  class="comment">/*t/spa op;406t/a>tspa  class="comment"> * This exter"vis declaredvhere because it's easier to keep track --t/spa op;407t/a>tspa  class="comment"> * both declara].a"s are a list of the sam1t/spa op;408t/a>tspa  class="comment"> */t/spa op;409t/a>exter"vstruct ta href="+code=genl_ops" class="sref">genl_opst/a>p;410t/a>        ta href="+code=wimax_gnl_msg_from_user" class="sref">wimax_gnl_msg_from_usert/a>,p;411t/a>        ta href="+code=wimax_gnl_reset" class="sref">wimax_gnl_resett/a>,p;412t/a>        ta href="+code=wimax_gnl_rfkill" class="sref">wimax_gnl_rfkillt/a>,p;413t/a>        ta href="+code=wimax_gnl_state_get" class="sref">wimax_gnl_state_gett/a>;p;414t/a>p;415t/a>staticp;416t/a>struct ta href="+code=genl_ops" class="sref">genl_opst/a> *ta href="+code=wimax_gnl_ops" class="sref">wimax_gnl_opst/a>[] = {p;417t/a>        &ta href="+code=wimax_gnl_msg_from_user" class="sref">wimax_gnl_msg_from_usert/a>,p;418t/a>        &ta href="+code=wimax_gnl_reset" class="sref">wimax_gnl_resett/a>,p;419t/a>        &ta href="+code=wimax_gnl_rfkill" class="sref">wimax_gnl_rfkillt/a>,p;420t/a>        &ta href="+code=wimax_gnl_state_get" class="sref">wimax_gnl_state_gett/a>,p;421t/a>};p;422t/a>p;423t/a>p;424t/a>staticp;425 [a>ta href="+code=size_t" class="sref">size_tt/a> ta href="+code=wimax_addr_scnprint" class="sref">wimax_addr_scnprintt/a>(char *ta href="+code=addr_str" class="sref">addr_strt/a>, ta href="+code=size_t" class="sref">size_tt/a> ta href="+code=addr_str_size" class="sref">addr_str_sizet/a>,p;426t/a>                           unsignedvchar *ta href="+code=addr" class="sref">addrt/a>, ta href="+code=size_t" class="sref">size_tt/a> ta href="+code=addr_len" class="sref">addr_lent/a>)p;427t/a>{p;428t/a>        unsignedvint ta href="+code=cnt" class="sref">cntt/a>, ta href="+code=total" class="sref">totalt/a>;p;429t/a>p;430t/a>        for (ta href="+code=total" class="sref">totalt/a> = ta href="+code=cnt" class="sref">cntt/a> = 0; ta href="+code=cnt" class="sref">cntt/a> < ta href="+code=addr_len" class="sref">addr_lent/a>; ta href="+code=cnt" class="sref">cntt/a>++)p;431t/a>                ta href="+code=total" class="sref">totalt/a> += ta href="+code=scnprintf" class="sref">scnprintft/a>(ta href="+code=addr_str" class="sref">addr_strt/a> + ta href="+code=total" class="sref">totalt/a>, ta href="+code=addr_str_size" class="sref">addr_str_sizet/a> - ta href="+code=total" class="sref">totalt/a>,p;432t/a>                                   tspa  class="string">"%02x%c"addrt/a>[ta href="+code=cnt" class="sref">cntt/a>],p;433t/a>                                   ta href="+code=cnt" class="sref">cntt/a> == ta href="+code=addr_len" class="sref">addr_lent/a> - 1 ? tspa  class="string">'\0'':';434t/a>        return ta href="+code=total" class="sref">totalt/a>;p;435 [a>}p;436 [a>p;437t/a>ptspa  class="comment">/**t/spa op;439t/a>tspa  class="comment"> * wimax_dev_add - Register a new WiMAX devicet/spa op;44d [a>tspa  class="comment"> *t/spa op;441t/a>tspa  class="comment"> * @wimax_dev: WiMAX device descriptor (as embeddedvin your @net_dev'st/spa op;442t/a>tspa  class="comment"> *     priv data). You must have calledvwimax_dev_init() a"vitvbefore.t/spa op;443t/a>tspa  class="comment"> *t/spa op;444t/a>tspa  class="comment"> * @net_dev: net device the @wimax_dev isvassociatedvwith. Thet/spa op;445t/a>tspa  class="comment"> *     func].a"vexpects SET_NETDEV_DEV() and register_netdev() weret/spa op;446t/a>tspa  class="comment"> *     already calledva"vit.t/spa op;447t/a>tspa  class="comment"> *t/spa op;448t/a>tspa  class="comment"> * Registers the new WiMAX device, sets up the user-kernel controlt/spa op;449t/a>tspa  class="comment"> * interface (generic netlink) and comma"vWiMAX infrastructure.t/spa op;45d [a>tspa  class="comment"> *t/spa op;451t/a>tspa  class="comment"> * Note that the parts that will allow interac].a" with user space aret/spa op;452t/a>tspa  class="comment"> * setup at the very end, when the rest is in place, as once thatt/spa op;453t/a>tspa  class="comment"> * happens, the driver might get user space control requests viat/spa op;454t/a>tspa  class="comment"> * netlink or from debugfs that might translate into calls intot/spa op;455t/a>tspa  class="comment"> * wimax_dev->op_*().t/spa op;456t/a>tspa  class="comment"> */t/spa op;457t/a>int ta href="+code=wimax_dev_add" class="sref">wimax_dev_addt/a>(struct ta href="+code=wimax_dev" class="sref">wimax_devt/a> *ta href="+code=wimax_dev" class="sref">wimax_devt/a>,vstruct ta href="+code=net_device" class="sref">net_devicet/a> *ta href="+code=net_dev" class="sref">net_devt/a>)p;458t/a>{p;459t/a>        int ta href="+code=result" class="sref">resultt/a>;p;460t/a>        struct ta href="+code=device" class="sref">devicet/a> *ta href="+code=dev" class="sref">devt/a> = ta href="+code=net_dev" class="sref">net_devt/a>->ta href="+code=dev" class="sref">devt/a>.ta href="+code=parent" class="sref">parentt/a>;p;461t/a>        char ta href="+code=addr_str" class="sref">addr_strt/a>[32];p;462t/a>p;463t/a>        ta href="+code=d_fnstart" class="sref">d_fnstartt/a>(3, ta href="+code=dev" class="sref">devt/a>, tspa  class="string">"(wimax_dev %p net_dev %p)\n"wimax_devt/a>, ta href="+code=net_dev" class="sref">net_devt/a>);p;464t/a>p;465t/a>        tspa  class="comment">/* Do the RFKILL setup before locking, as RFKILL will callt/spa op;466t/a>tspa  class="comment">         * into our func].a"s. */t/spa op;467t/a>        ta href="+code=wimax_dev" class="sref">wimax_devt/a>->ta href="+code=net_dev" class="sref">net_devt/a> = ta href="+code=net_dev" class="sref">net_devt/a>;p;468t/a>        ta href="+code=result" class="sref">resultt/a> = ta href="+code=wimax_rfkill_add" class="sref">wimax_rfkill_addt/a>(ta href="+code=wimax_dev" class="sref">wimax_devt/a>);p;469t/a>        if (ta href="+code=result" class="sref">resultt/a> < 0)p;470t/a>                goto ta href="+code=error_rfkill_add" class="sref">error_rfkill_addt/a>;p;471t/a>p;472t/a>        tspa  class="comment">/* Set up user-space interac].a" */t/spa op;473t/a>        ta href="+code=mutex_lock" class="sref">mutex_lockt/a>(&ta href="+code=wimax_dev" class="sref">wimax_devt/a>->ta href="+code=mutex" class="sref">mutext/a>);p;474t/a>        ta href="+code=wimax_id_table_add" class="sref">wimax_id_table_addt/a>(ta href="+code=wimax_dev" class="sref">wimax_devt/a>);p;475t/a>        ta href="+code=result" class="sref">resultt/a> = ta href="+code=wimax_debugfs_add" class="sref">wimax_debugfs_addt/a>(ta href="+code=wimax_dev" class="sref">wimax_devt/a>);p;476t/a>        if (ta href="+code=result" class="sref">resultt/a> < 0) {p;477t/a>                ta href="+code=dev_err" class="sref">dev_errt/a>(ta href="+code=dev" class="sref">devt/a>, tspa  class="string">"cannot initialize debugfs: %d\n";478t/a>                        ta href="+code=result" class="sref">resultt/a>);p;479t/a>                goto ta href="+code=error_debugfs_add" class="sref">error_debugfs_addt/a>;p;480t/a>        }p;481t/a>p;482t/a>        ta href="+code=__wimax_state_set" class="sref">__wimax_state_sett/a>(ta href="+code=wimax_dev" class="sref">wimax_devt/a>, ta href="+code=WIMAX_ST_DOWN" class="sref">WIMAX_ST_DOWNt/a>);p;483t/a>        ta href="+code=mutex_unlock" class="sref">mutex_unlockt/a>(&ta href="+code=wimax_dev" class="sref">wimax_devt/a>->ta href="+code=mutex" class="sref">mutext/a>);p;484t/a>p;485t/a>        ta href="+code=wimax_addr_scnprint" class="sref">wimax_addr_scnprintt/a>(ta href="+code=addr_str" class="sref">addr_strt/a>, sizeof(ta href="+code=addr_str" class="sref">addr_strt/a>),p;486t/a>                            ta href="+code=net_dev" class="sref">net_devt/a>->ta href="+code=dev_addr" class="sref">dev_addrt/a>, ta href="+code=net_dev" class="sref">net_devt/a>->ta href="+code=addr_len" class="sref">addr_lent/a>);p;487t/a>        ta href="+code=dev_err" class="sref">dev_errt/a>(ta href="+code=dev" class="sref">devt/a>, tspa  class="string">"WiMAX interface %s (%s) ready\n";488t/a>                ta href="+code=net_dev" class="sref">net_devt/a>->ta href="+code=nam1" class="sref">nam1t/a>, ta href="+code=addr_str" class="sref">addr_strt/a>);p;489t/a>        ta href="+code=d_fnend" class="sref">d_fnendt/a>(3, ta href="+code=dev" class="sref">devt/a>, tspa  class="string">"(wimax_dev %p net_dev %p) = 0\n"wimax_devt/a>, ta href="+code=net_dev" class="sref">net_devt/a>);p;490t/a>        return 0;p;491t/a>p;492t/a>ta href="+code=error_debugfs_add" class="sref">error_debugfs_addt/a>:p;493t/a>        ta href="+code=wimax_id_table_rm" class="sref">wimax_id_table_rmt/a>(ta href="+code=wimax_dev" class="sref">wimax_devt/a>);p;494t/a>        ta href="+code=mutex_unlock" class="sref">mutex_unlockt/a>(&ta href="+code=wimax_dev" class="sref">wimax_devt/a>->ta href="+code=mutex" class="sref">mutext/a>);p;495t/a>        ta href="+code=wimax_rfkill_rm" class="sref">wimax_rfkill_rmt/a>(ta href="+code=wimax_dev" class="sref">wimax_devt/a>);p;496t/a>ta href="+code=error_rfkill_add" class="sref">error_rfkill_addt/a>:p;497t/a>        ta href="+code=d_fnend" class="sref">d_fnendt/a>(3, ta href="+code=dev" class="sref">devt/a>, tspa  class="string">"(wimax_dev %p net_dev %p) = %d\n";498t/a>                ta href="+code=wimax_dev" class="sref">wimax_devt/a>, ta href="+code=net_dev" class="sref">net_devt/a>, ta href="+code=result" class="sref">resultt/a>);p;499t/a>        return ta href="+code=result" class="sref">resultt/a>;p;500t/a>}p;501t/a>ta href="+code=EXPORT_SYMBOL_GPL" class="sref">EXPORT_SYMBOL_GPLt/a>(ta href="+code=wimax_dev_add" class="sref">wimax_dev_addt/a>);p;502t/a>p;503t/a>p;504t/a>tspa  class="comment">/**t/spa op;505t/a>tspa  class="comment"> * wimax_dev_rm - Unregister a"vexisting WiMAX devicet/spa op;506t/a>tspa  class="comment"> *t/spa op;507t/a>tspa  class="comment"> * @wimax_dev: WiMAX device descriptort/spa op;508t/a>tspa  class="comment"> *t/spa op;509t/a>tspa  class="comment"> * Unregisters a WiMAX device previously registered for use witht/spa op;51d [a>tspa  class="comment"> * wimax_add_rm().t/spa op;511t/a>tspa  class="comment"> *t/spa op;512t/a>tspa  class="comment"> * IMPORTANT! Must call before calling unregister_netdev().t/spa op;513t/a>tspa  class="comment"> *t/spa op;514t/a>tspa  class="comment"> * After this func].a"vreturns, you will not get any more user spacet/spa op;515t/a>tspa  class="comment"> * control requests (via netlink or debugfs) and thus to wimax_dev->ops.t/spa op;516t/a>tspa  class="comment"> *t/spa op;517t/a>tspa  class="comment"> * Reentrancy control is ensuredvby setting the state tot/spa op;518t/a>tspa  class="comment"> * %__WIMAX_ST_QUIESCING. rfkill opera].a"s coming throught/spa op;519t/a>tspa  class="comment"> * wimax_*rfkill*() will be stoppedvby the quiescing state; ops comingt/spa op;52d [a>tspa  class="comment"> * from the rfkill subsystem will be stoppedvby the support beingt/spa op;521t/a>tspa  class="comment"> * removedvby wimax_rfkill_rm().t/spa op;522t/a>tspa  class="comment"> */t/spa op;523t/a>void ta href="+code=wimax_dev_rm" class="sref">wimax_dev_rmt/a>(struct ta href="+code=wimax_dev" class="sref">wimax_devt/a> *ta href="+code=wimax_dev" class="sref">wimax_devt/a>)p;524t/a>{p;525t/a>        ta href="+code=d_fnstart" class="sref">d_fnstartt/a>(3, ta href="+code=NULL" class="sref">NULLt/a>, tspa  class="string">"(wimax_dev %p)\n"wimax_devt/a>);p;526 [a>p;527t/a>        ta href="+code=mutex_lock" class="sref">mutex_lockt/a>(&ta href="+code=wimax_dev" class="sref">wimax_devt/a>->ta href="+code=mutex" class="sref">mutext/a>);p;528t/a>        ta href="+code=__wimax_state_change" class="sref">__wimax_state_changet/a>(ta href="+code=wimax_dev" class="sref">wimax_devt/a>, ta href="+code=__WIMAX_ST_QUIESCING" class="sref">__WIMAX_ST_QUIESCINGt/a>);p;529t/a>        ta href="+code=wimax_debugfs_rm" class="sref">wimax_debugfs_rmt/a>(ta href="+code=wimax_dev" class="sref">wimax_devt/a>);p;530t/a>        ta href="+code=wimax_id_table_rm" class="sref">wimax_id_table_rmt/a>(ta href="+code=wimax_dev" class="sref">wimax_devt/a>);p;531t/a>        ta href="+code=__wimax_state_change" class="sref">__wimax_state_changet/a>(ta href="+code=wimax_dev" class="sref">wimax_devt/a>, ta href="+code=WIMAX_ST_DOWN" class="sref">WIMAX_ST_DOWNt/a>);p;532t/a>        ta href="+code=mutex_unlock" class="sref">mutex_unlockt/a>(&ta href="+code=wimax_dev" class="sref">wimax_devt/a>->ta href="+code=mutex" class="sref">mutext/a>);p;533t/a>        ta href="+code=wimax_rfkill_rm" class="sref">wimax_rfkill_rmt/a>(ta href="+code=wimax_dev" class="sref">wimax_devt/a>);p;534t/a>        ta href="+code=d_fnend" class="sref">d_fnendt/a>(3, ta href="+code=NULL" class="sref">NULLt/a>, tspa  class="string">"(wimax_dev %p) = void\n"wimax_devt/a>);p;535 [a>}p;536t/a>ta href="+code=EXPORT_SYMBOL_GPL" class="sref">EXPORT_SYMBOL_GPLt/a>(ta href="+code=wimax_dev_rm" class="sref">wimax_dev_rmt/a>);p;537t/a>pp;539t/a>tspa  class="comment">/* Debug fram1work control of debug levels */t/spa op;54d [a>struct ta href="+code=d_level" class="sref">d_levelt/a> ta href="+code=D_LEVEL" class="sref">D_LEVELt/a>[] = {p;541t/a>        ta href="+code=D_SUBMODULE_DEFINE" class="sref">D_SUBMODULE_DEFINEt/a>(ta href="+code=debugfs" class="sref">debugfst/a>),p;542t/a>        ta href="+code=D_SUBMODULE_DEFINE" class="sref">D_SUBMODULE_DEFINEt/a>(ta href="+code=id_table" class="sref">id_tablet/a>),p;543t/a>        ta href="+code=D_SUBMODULE_DEFINE" class="sref">D_SUBMODULE_DEFINEt/a>(ta href="+code=op_msg" class="sref">op_msgt/a>),p;544t/a>        ta href="+code=D_SUBMODULE_DEFINE" class="sref">D_SUBMODULE_DEFINEt/a>(ta href="+code=op_reset" class="sref">op_resett/a>),p;545t/a>        ta href="+code=D_SUBMODULE_DEFINE" class="sref">D_SUBMODULE_DEFINEt/a>(ta href="+code=op_rfkill" class="sref">op_rfkillt/a>),p;546t/a>        ta href="+code=D_SUBMODULE_DEFINE" class="sref">D_SUBMODULE_DEFINEt/a>(ta href="+code=op_state_get" class="sref">op_state_gett/a>),p;547t/a>        ta href="+code=D_SUBMODULE_DEFINE" class="sref">D_SUBMODULE_DEFINEt/a>(ta href="+code=stack" class="sref">stackt/a>),p;548t/a>};p;549t/a>ta href="+code=size_t" class="sref">size_tt/a> ta href="+code=D_LEVEL_SIZE" class="sref">D_LEVEL_SIZEt/a> = ta href="+code=ARRAY_SIZE" class="sref">ARRAY_SIZEt/a>(ta href="+code=D_LEVEL" class="sref">D_LEVELt/a>);p;55d [a>p;551t/a>p;552t/a>struct ta href="+code=genl_family" class="sref">genl_familyt/a> ta href="+code=wimax_gnl_family" class="sref">wimax_gnl_familyt/a> = {p;553t/a>        .ta href="+code=id" class="sref">idt/a> = ta href="+code=GENL_ID_GENERATE" class="sref">GENL_ID_GENERATEt/a>,p;554t/a>        .ta href="+code=nam1" class="sref">nam1t/a> = tspa  class="string">"WiMAX";555t/a>        .ta href="+code=version" class="sref">versiont/a> = ta href="+code=WIMAX_GNL_VERSION" class="sref">WIMAX_GNL_VERSIONt/a>,p;556t/a>        .ta href="+code=hdrsize" class="sref">hdrsizet/a> = 0,p;557t/a>        .ta href="+code=maxattr" class="sref">maxattrt/a> = ta href="+code=WIMAX_GNL_ATTR_MAX" class="sref">WIMAX_GNL_ATTR_MAXt/a>,p;558t/a>};p;559t/a>p;56d [a>struct ta href="+code=genl_multicast_group" class="sref">genl_multicast_groupt/a> ta href="+code=wimax_gnl_mcg" class="sref">wimax_gnl_mcgt/a> = {p;561t/a>        .ta href="+code=nam1" class="sref">nam1t/a> = tspa  class="string">"msg";562t/a>};p;563t/a>p;564t/a>p;565 [a>p;566t/a>tspa  class="comment">/* Shutdown the wimax stack */t/spa op;567t/a>staticp;568t/a>int ta href="+code=__init" class="sref">__initt/a> ta href="+code=wimax_subsys_init" class="sref">wimax_subsys_initt/a>(void)p;569t/a>{p;570t/a>        int ta href="+code=result" class="sref">resultt/a>, ta href="+code=cnt" class="sref">cntt/a>;p;571t/a>p;572t/a>        ta href="+code=d_fnstart" class="sref">d_fnstartt/a>(4, ta href="+code=NULL" class="sref">NULLt/a>, tspa  class="string">"()\n";573t/a>        ta href="+code=d_parse_params" class="sref">d_parse_paramst/a>(ta href="+code=D_LEVEL" class="sref">D_LEVELt/a>, ta href="+code=D_LEVEL_SIZE" class="sref">D_LEVEL_SIZEt/a>, ta href="+code=wimax_debug_params" class="sref">wimax_debug_paramst/a>,p;574t/a>                       tspa  class="string">"wimax.debug";575 [a>p;576t/a>        ta href="+code=snprintf" class="sref">snprintft/a>(ta href="+code=wimax_gnl_family" class="sref">wimax_gnl_familyt/a>.ta href="+code=nam1" class="sref">nam1t/a>, sizeof(ta href="+code=wimax_gnl_family" class="sref">wimax_gnl_familyt/a>.ta href="+code=nam1" class="sref">nam1t/a>),p;577t/a>                 tspa  class="string">"WiMAX";578t/a>        ta href="+code=result" class="sref">resultt/a> = ta href="+code=genl_register_family" class="sref">genl_register_familyt/a>(&ta href="+code=wimax_gnl_family" class="sref">wimax_gnl_familyt/a>);p;579t/a>        if (ta href="+code=unlikely" class="sref">unlikelyt/a>(ta href="+code=result" class="sref">resultt/a> < 0)) {p;580t/a>                ta href="+code=printk" class="sref">printkt/a>(ta href="+code=KERN_ERR" class="sref">KERN_ERRt/a> tspa  class="string">"cannot register generic netlink family: %d\n";581t/a>                       ta href="+code=result" class="sref">resultt/a>);p;582t/a>                goto ta href="+code=error_register_family" class="sref">error_register_familyt/a>;p;583t/a>        }p;584t/a>p;585t/a>        for (ta href="+code=cnt" class="sref">cntt/a> = 0; ta href="+code=cnt" class="sref">cntt/a> < ta href="+code=ARRAY_SIZE" class="sref">ARRAY_SIZEt/a>(ta href="+code=wimax_gnl_ops" class="sref">wimax_gnl_opst/a>); ta href="+code=cnt" class="sref">cntt/a>++) {p;586t/a>                ta href="+code=result" class="sref">resultt/a> = ta href="+code=genl_register_ops" class="sref">genl_register_opst/a>(&ta href="+code=wimax_gnl_family" class="sref">wimax_gnl_familyt/a>,p;587t/a>                                           ta href="+code=wimax_gnl_ops" class="sref">wimax_gnl_opst/a>[ta href="+code=cnt" class="sref">cntt/a>]);p;588t/a>                ta href="+code=d_printf" class="sref">d_printft/a>(4, ta href="+code=NULL" class="sref">NULLt/a>, tspa  class="string">"registering generic netlink op code ";589t/a>                         tspa  class="string">"%u: %d\n"wimax_gnl_opst/a>[ta href="+code=cnt" class="sref">cntt/a>]->ta href="+code=cmd" class="sref">cmdt/a>, ta href="+code=result" class="sref">resultt/a>);p;590t/a>                if (ta href="+code=unlikely" class="sref">unlikelyt/a>(ta href="+code=result" class="sref">resultt/a> < 0)) {p;591t/a>                        ta href="+code=printk" class="sref">printkt/a>(ta href="+code=KERN_ERR" class="sref">KERN_ERRt/a> tspa  class="string">"cannot register generic netlink op ";592t/a>                               tspa  class="string">"code %u: %d\n";593t/a>                               ta href="+code=wimax_gnl_ops" class="sref">wimax_gnl_opst/a>[ta href="+code=cnt" class="sref">cntt/a>]->ta href="+code=cmd" class="sref">cmdt/a>, ta href="+code=result" class="sref">resultt/a>);p;594t/a>                        goto ta href="+code=error_register_ops" class="sref">error_register_opst/a>;p;595t/a>                }p;596t/a>        }p;597t/a>p;598t/a>        ta href="+code=result" class="sref">resultt/a> = ta href="+code=genl_register_mc_group" class="sref">genl_register_mc_groupt/a>(&ta href="+code=wimax_gnl_family" class="sref">wimax_gnl_familyt/a>, &ta href="+code=wimax_gnl_mcg" class="sref">wimax_gnl_mcgt/a>);p;599t/a>        if (ta href="+code=result" class="sref">resultt/a> < 0)p;600t/a>                goto ta href="+code=error_mc_group" class="sref">error_mc_groupt/a>;p;601t/a>        ta href="+code=d_fnend" class="sref">d_fnendt/a>(4, ta href="+code=NULL" class="sref">NULLt/a>, tspa  class="string">"() = 0\n";602t/a>        return 0;p;603t/a>p;604t/a>ta href="+code=error_mc_group" class="sref">error_mc_groupt/a>:p;605 [a>ta href="+code=error_register_ops" class="sref">error_register_opst/a>:p;606t/a>        for (ta href="+code=cnt" class="sref">cntt/a>--; ta href="+code=cnt" class="sref">cntt/a> >= 0; ta href="+code=cnt" class="sref">cntt/a>--)p;607t/a>                ta href="+code=genl_unregister_ops" class="sref">genl_unregister_opst/a>(&ta href="+code=wimax_gnl_family" class="sref">wimax_gnl_familyt/a>,p;608t/a>                                    ta href="+code=wimax_gnl_ops" class="sref">wimax_gnl_opst/a>[ta href="+code=cnt" class="sref">cntt/a>]);p;609t/a>        ta href="+code=genl_unregister_family" class="sref">genl_unregister_familyt/a>(&ta href="+code=wimax_gnl_family" class="sref">wimax_gnl_familyt/a>);p;61d [a>ta href="+code=error_register_family" class="sref">error_register_familyt/a>:p;611t/a>        ta href="+code=d_fnend" class="sref">d_fnendt/a>(4, ta href="+code=NULL" class="sref">NULLt/a>, tspa  class="string">"() = %d\n"resultt/a>);p;612t/a>        return ta href="+code=result" class="sref">resultt/a>;p;613t/a>p;614t/a>}p;615 [a>ta href="+code=module_init" class="sref">module_initt/a>(ta href="+code=wimax_subsys_init" class="sref">wimax_subsys_initt/a>);p;616 [a>p;617t/a>p;618t/a>tspa  class="comment">/* Shutdown the wimax stack */t/spa op;619t/a>staticp;62d [a>void ta href="+code=__exit" class="sref">__exitt/a> ta href="+code=wimax_subsys_exit" class="sref">wimax_subsys_exitt/a>(void)p;621t/a>{p;622t/a>        int ta href="+code=cnt" class="sref">cntt/a>;p;623t/a>        ta href="+code=wimax_id_table_releas1" class="sref">wimax_id_table_releas1t/a>();p;624t/a>        ta href="+code=genl_unregister_mc_group" class="sref">genl_unregister_mc_groupt/a>(&ta href="+code=wimax_gnl_family" class="sref">wimax_gnl_familyt/a>, &ta href="+code=wimax_gnl_mcg" class="sref">wimax_gnl_mcgt/a>);p;625t/a>        for (ta href="+code=cnt" class="sref">cntt/a> = ta href="+code=ARRAY_SIZE" class="sref">ARRAY_SIZEt/a>(ta href="+code=wimax_gnl_ops" class="sref">wimax_gnl_opst/a>) - 1; ta href="+code=cnt" class="sref">cntt/a> >= 0; ta href="+code=cnt" class="sref">cntt/a>--)p;626t/a>                ta href="+code=genl_unregister_ops" class="sref">genl_unregister_opst/a>(&ta href="+code=wimax_gnl_family" class="sref">wimax_gnl_familyt/a>,p;627t/a>                                    ta href="+code=wimax_gnl_ops" class="sref">wimax_gnl_opst/a>[ta href="+code=cnt" class="sref">cntt/a>]);p;628t/a>        ta href="+code=genl_unregister_family" class="sref">genl_unregister_familyt/a>(&ta href="+code=wimax_gnl_family" class="sref">wimax_gnl_familyt/a>);p;629t/a>}p;63d [a>ta href="+code=module_exit" class="sref">module_exitt/a>(ta href="+code=wimax_subsys_exit" class="sref">wimax_subsys_exitt/a>);p;631t/a>p;632t/a>ta href="+code=MODULE_AUTHOR" class="sref">MODULE_AUTHORt/a>(tspa  class="string">"Intel Corpora].a" <linux-wimax@intel.com>";633t/a>ta href="+code=MODULE_DESCRIPTION" class="sref">MODULE_DESCRIPTIONt/a>(tspa  class="string">"Linux WiMAX stack";634t/a>ta href="+code=MODULE_LICENSE" class="sref">MODULE_LICENSEt/a>(tspa  class="string">"GPL";635 [a>p;636t/a>t/pre>t/div>


t/div>