linux/net/caif/cfcnfg.c
<<
val12 val12>> v val val12 "> val12 val12Search val12Prefs. 12 v v "> al12 2.
2 21/*2 22 * Copyright (C) ST-EricssionAB 200" spav3.2 23 * Author:al12 2Sjur Brendeland/sjur.brandeland@stericssio.com spav3.2 24 * License terms: GNU General Public License (GPL) verstion2 spav3.2 25 */ spav3.2 26 2 27#define2pr_fmt(fmt)2KBUILD_MODNAME ":%s(): " spav32fmt,2__func__ 2 28 2 29#include < a href="include/linux/kernel.h" class="fref">linux/kernel.h> 2 0" a>#include < a href="include/linux/stddef.h" class="fref">linux/stddef.h> 2 11 a>#include < a href="include/linux/slab.h" class="fref">linux/slab.h> 2 12 a>#include < a href="include/linux/netdevice.h" class="fref">linux/netdevice.h> 2 13 a>#include < a href="include/linux/module.h" class="fref">linux/module.h> 2 14 a>#include < a href="include/net/caif/caif_layer.h" class="fref">net/caif/caif_layer.h> 2 15 a>#include < a href="include/net/caif/cfpkt.h" class="fref">net/caif/cfpkt.h> 2 16 a>#include < a href="include/net/caif/cfcnfg.h" class="fref">net/caif/cfcnfg.h> 2 17 a>#include < a href="include/net/caif/cfctrl.h" class="fref">net/caif/cfctrl.h> 2 18 a>#include < a href="include/net/caif/cfmuxl.h" class="fref">net/caif/cfmuxl.h> 2 19#include < a href="include/net/caif/cffrml.h" class="fref">net/caif/cffrml.h> 2 2" a>#include < a href="include/net/caif/cfserl.h" class="fref">net/caif/cfserl.h> 2 21 a>#include < a href="include/net/caif/cfsrvl.h" class="fref">net/caif/cfsrvl.h> 2 22 a>#include < a href="include/net/caif/caif_dev.h" class="fref">net/caif/caif_dev.h> 2 23 2 24#define2container_obj(layr)2container_of(layr, struct2cfcnfg,2layer) 2 25 2 26/* Informaptionabout CAIF physical interfaces held by Config Module in order2 27 * to manage physical interfaces2 28 */ spav3.2 29struct2cfcnfg_phyinfo {.2 3" a> struct2list_head node; 2 31 a> bool up; 2 32 2 33 a> /* Pointer to the layer below the MUX (framing layer) */ spav3.2 34 a> struct2cflayer a> *frm_layer; 2 35 a> /* Pointer to the lowest ac ual physical layer */ spav3.2 36 a> struct2cflayer a> *phy_layer; 2 37 a> /* Unique identifier of the physical interface */ spav3.2 38 a> unsigned int2id; 2 39 a> /* Preference of the physical in interface */ spav3.2 4" a> enum2cfcnfg_phy_preference pref; 2 41 2 42 a> /* Informaptionabout the physical device */ spav3.2 43 a> struct2dev_info dev_info; 2 44 2 45 a> /* Interface index */ spav3.2 46 a> int2ifindex; 2 47 2 48 a> /* Protocol head room added for CAIF link layer */ spav3.2 49 a> int2head_room; 2 50 2 51 a> /* Use Start of frame checksum2*/ spav3.2 52 a> bool use_fcs; 2 53 a>}; 2 54 2 55struct2cfcnfg {.2 56 a> struct2cflayer a> layer; 2 57 a> struct2cflayer a> *ctrl; 2 58 a> struct2cflayer a> *mux; 2 59 a> struct2list_head phys; 2 6" a> struct2mutex a> lock; 2 61 a>}; 2 62 2 63static void2cfcnfg_linkup_rsp(struct2cflayer a> *layer,2u8 a> channel_id, 2 64 a> enum2cfctrl_srv a> serv,2u8 a> phyid, 2 65 a> struct2cflayer a> *adapt_layer); 2 66static void2cfcnfg_linkdestroy_rsp(struct2cflayer a> *layer,2u8 a> channel_id); 2 67static void2cfcnfg_reject_rsp(struct2cflayer a> *layer,2u8 a> channel_id, 2 68 a> struct2cflayer a> *adapt_layer); 2 69static void2cfctrl_resp_func(void); 2 70static void2cfctrl_enum_resp(void); 2 71 2 72struct2cfcnfg *cfcnfg_create(void) 2 73{.2 74 a> struct2cfcnfg *this; 2 75 a> struct2cfctrl_rsp *resp; 2 76 2 77 a> might_sleep(); 2 78 2 79 a> /* Initiate this layer */ spav3.2 80 a> this = kzalloc(sizeof(struct2cfcnfg),2GFP_ATOMIC); 2 81 a> if (!this) 2 82 a> return NULL; 2 83 a> this->mux = cfmuxl_create(); 2 84 a> if (!this->mux) 2 85 a> goto out_of_mem; 2 86 a> this->ctrl = cfctrl_create(); 2 87 a> if (!this->ctrl) 2 88 a> goto out_of_mem; 2 89 a> /* Initiate response funcptios */ spav3.2 90 a> resp = cfctrl_get_respfuncs(this->ctrl); 2 91 a> resp->enum_rsp = cfctrl_enum_resp; 2 92 a> resp->linkerror_ind = cfctrl_resp_func; 2 93 a> resp->linkdestroy_rsp = cfcnfg_linkdestroy_rsp; 2 94 a> resp->sleep_rsp = cfctrl_resp_func; 2 95 a> resp->wake_rsp = cfctrl_resp_func; 2 96 a> resp->restart_rsp = cfctrl_resp_func; 2 97 a> resp->radioset_rsp = cfctrl_resp_func; 2 98 a> resp->linksetup_rsp = cfcnfg_linkup_rsp; 2 99 a> resp->reject_rsp = cfcnfg_reject_rsp; 2100 a> INIT_LIST_HEAD(&this->phys); 2101 2102 a> cfmuxl_set_uplayer(this->mux,2this->ctrl, 0); 2103 a> layer_set_dn(this->ctrl,2this->mux); 2104 a> layer_set_up(this->ctrl,2this); 2105 a> mutex_init(&this->lock); 2106 2107 a> return this; 2108out_of_mem: 2109 a> synchronize_rcu(); 2110 2111 a> kfree(this->mux); 2112 a> kfree(this->ctrl); 2113 a> kfree(this); 2114 a> return NULL; 2115 a>} 2116 2117 a>void2cfcnfg_remove(struct2cfcnfg *cfg) 2118 a>{.2119 a> might_sleep(); 2120 a> if (cfg) {.2121 a> synchronize_rcu(); 2122 2123 a> kfree(cfg->mux); 2124 a> cfctrl_remove(cfg->ctrl); 2125 a> kfree(cfg); 2126 a> } 2127} 2128 2129static void2cfctrl_resp_func(void) 213" a>{.2131 a>} 2132 2133static struct2cfcnfg_phyinfo *cfcnfg_get_phyinfo_rcu(struct2cfcnfg *cnfg, 2134 a> u8 a> phyid) 2135 a>{.2136 a> struct2cfcnfg_phyinfo *phy; 2137 2138 a> list_for_each_entry_rcu(phy, &cnfg->phys,2node) 2139 a> if (phy->id == phyid) 214" a> return phy; 2141 a> return NULL; 2142 a>} 2143 2144static void2cfctrl_enum_resp(void) 2145 a>{.2146 a>} 2147 2148 a>static struct2dev_info *cfcnfg_get_phyid(struct2cfcnfg *cnfg, 2149 a> enum2cfcnfg_phy_preference phy_pref) 215" a>{.2151 a> /* Try to match with specified preference */ spav3.2152 a> struct2cfcnfg_phyinfo *phy; 2153 2154 a> list_for_each_entry_rcu(phy, &cnfg->phys,2node) {.2155 a> if (phy->up && phy->pref == phy_pref &&.2156 a> phy->frm_layer != NULL) 2157 2158 a> return &phy->dev_info; 2159 a> } 2160 2161 a> /* Otherwise just return something */ spav3.2162 a> list_for_each_entry_rcu(phy, &cnfg->phys,2node).2163 a> if (phy->up).2164 a> return &phy->dev_info; 2165 2166 a> return NULL; 2167} 2168 2169static int2cfcnfg_get_id_from_ifi(struct2cfcnfg *cnfg, int2ifi).217" a>{.2171 a> struct2cfcnfg_phyinfo *phy; 2172 2173 a> list_for_each_entry_rcu(phy, &cnfg->phys,2node).2174 a> if (phy->ifindex == ifi && phy->up).2175 a> return phy->id; 2176 a> return -ENODEV; 2177} 2178 2179 a>int2caif_disconnect_client(struct2net *net, struct2cflayer a> *adap_layer) 218" a>{.2181 a> u8 a> channel_id; 2182 a> struct2cfcnfg *cfg = get_cfcnfg(net); 2183 2184 a> caif_assert(adap_layer != NULL); 2185 a> cfctrl_cancel_req(cfg->ctrl,2adap_layer); 2186 a> channel_id = adap_layer->id; 2187 a> if (channel_id != 0) {.2188 a> struct2cflayer a> *servl; 2189 a> servl = cfmuxl_remove_uplayer(cfg->mux,2channel_id); 219" a> cfctrl_linkdown_req(cfg->ctrl,2channel_id,2adap_layer); 2191 a> if (servl != NULL) 2192 a> layer_set_up(servl,2NULL); 2193 a> } else 2194 a> pr_debug("nothing to disconnect\n" spav3); 2195 2196 a> /* Do RCU sync before initiating cleanup */ spav3.2197 a> synchronize_rcu(); 2198 a> if (adap_layer->ctrlcmd != NULL) 2199 a> adap_layer->ctrlcmd(adap_layer,2CAIF_CTRLCMD_DEINIT_RSP,20); 2200 a> return 0; 2201 2202 a>} 2203 a>EXPORT_SYMBOL(caif_disconnect_client); 2204 2205static void2cfcnfg_linkdestroy_rsp(struct2cflayer a> *layer,2u8 a> channel_id) 2206{.2207} 2208 2209static const int2protohead[CFCTRL_SRV_MASK] = {.2210 a> [CFCTRL_SRV_VEI] = 4, 2211 a> [CFCTRL_SRV_DATAGRAM] = 7, 2212 a> [CFCTRL_SRV_UTIL] = 4, 2213 a> [CFCTRL_SRV_RFM] = 3, 2214 a> [CFCTRL_SRV_DBG] = 3, 2215 a>}; 2216 2217 2218 a>static int2caif_connect_req_to_link_param(struct2cfcnfg *cnfg, 2219 a> struct2caif_connect_request a> *s, 222" a> struct2cfctrl_link_param a> *l) 2221 a>{.2222 a> struct2dev_info *dev_info; 2223 a> enum2cfcnfg_phy_preference pref; 2224 a> int2res; 2225 2226 a> memset(l,20, sizeof(*l)); 2227 a> /* In caif protocol low value is high priority */ spav3.2228 a> l->priority = CAIF_PRIO_MAX - s->priority + 1; 2229 2230 a> if (s->ifindex != 0) {.2231 a> res = cfcnfg_get_id_from_ifi(cnfg, s->ifindex); 2232 a> if (res < 0) 2233 a> return res; 2234 a> l->phyid = res; 2235 a> } else {.2236 a> switch (s->link_selector) {.2237 a> case CAIF_LINK_HIGH_BANDW a>: 2238 a> pref = CFPHYPREF_HIGH_BW; 2239 a> break; 224" a> case CAIF_LINK_LOW_LATENCY a>: 2241 a> pref = CFPHYPREF_LOW_LAT; 2242 a> break; 2243 a> default: 2244 a> return -EINVAL; 2245 a> } 2246 a> dev_info = cfcnfg_get_phyid(cnfg, pref); 2247 a> if (dev_info == NULL) 2248 a> return -ENODEV; 2249 a> l->phyid = dev_info->id; 225" a> } 2251 a> switch (s->protocol) {.2252 a> case CAIFPROTO_AT a>: 2253 a> l->linktype = CFCTRL_SRV_VEI; 2254 a> l->endpoint = (s->sockaddr.u.at.type >> 2) & 0x3; 2255 a> l->chtype = s->sockaddr.u.at.type & 0x3; 2256 a> break; 2257 a> case CAIFPROTO_DATAGRAM a>: 2258 a> l->linktype = CFCTRL_SRV_DATAGRAM; 2259 a> l->chtype = 0x00; 226" a> l->u.datagram.connid = s->sockaddr.u.dgm.connecptio_id; 2261 a> break; 2262 a> case CAIFPROTO_DATAGRAM_LOOP a>: 2263 a> l->linktype = CFCTRL_SRV_DATAGRAM; 2264 a> l->chtype = 0x03; 2265 a> l->endpoint = 0x00; 2266 a> l->u.datagram.connid = s->sockaddr.u.dgm.connecptio_id; 2267 a> break; 2268 a> case CAIFPROTO_RFM a>: 2269 a> l->linktype = CFCTRL_SRV_RFM; 227" a> l->u.datagram.connid = s->sockaddr.u.rfm.connecptio_id; 2271 a> strncpy(l->u.rfm.volume, s->sockaddr.u.rfm.volume, 2272 a> sizeof(l->u.rfm.volume)-1); 2273 a> l->u.rfm.volume[sizeof(l->u.rfm.volume)-1] = 0; 2274 a> break; 2275 a> case CAIFPROTO_UTIL a>: 2276 a> l->linktype = CFCTRL_SRV_UTIL; 2277 a> l->endpoint = 0x00; l->chtype = 0x00; strncpy(l->u.prioutil cl.prio L1, s->sockaddr.u.prioutil.cfcnl of(l->u.prioutil cl.prio L1, l->u.prioutil cl.prio L1, l->u.prioutil cl.prio L1, f="+code=lichtypassert" class="sref">caif_assert(l->u.prioutil cl.prio L1, l->u.prioutil cl.lenass="sref">priom a>len = s->cfctm a> *sf(<; breal->u.prioutil cl.lenass="sref">priom a>len = l->u.prioutil cl.lass="sref">phys< a>l, l->u.prioutil cl.lenass="sref">priom a>len = l->u.prioutil cl.lass="sref">phys< a>l, strnmem cl(l->u.prioutil cl.lass="sref">phys< a>l, s->cfctm a> *datagram, stru l->u.prioutil cl.lenass="sref">priom a>len = <; href="net/caif/cfcnfg.c#L277" id L179"2class="line" nam L189"22189 28> CFCTRROTO_DATAGEBUl: ref="+code=l" class="sref">l->linktype = CFCTRL_SRV_DBG] = href="net/caif/cfcnfg.c#L275" id L183"2class="line" nam L193"22193 29> l->endpoint = 0x00ref="+code=s" class="sref">s->sockaddr.u.cnfgdbl.cfcnl l->chtype = s->sockaddr.u.cnfgdbl.type &am href="net/caif/cfcnfg.c#L275" id L185"2class="line" nam L195"22195<29> EINVAL; if ( href="net/caif/cfcnfg.c#L251" id L199"2class="line" nam L199"22199 2a> rn 0; href="net/caif/cfcnfg.c#L251"3id L201"3class="line" nam L201"32201<3a> } caif_discect_client(struct2net *net, struct2caif_connect_request a> *cfctrct_" cl, retuct2cflayer a> *adap_layer) ifindex); < href="net/caif/cfcnfg.c#L272"3i4 L203"3class="line" nam L194"32204<30> retuuuuuuuuuprotohead_[ prioocol<_tail = <;href="net/caif/cfcnfg.c#L272"3i6 L203"3class="line" nam L196"32206<3a>{. ct2cflayer a> *priofrml; cfcnfg_phyinfo *phy; cflaerl; [cfctrl_link_param a> *cfctm a> * struct2cfcnfg_phy *cfg = get_cfcnfg(net); [net [cflaerl; caif_connect_req_to_link_param(struref="+code=s" ceclass="sref">cfg = < href="+code=channct_" class="sref">cfctrct_" cl, cfctm a> * cflaerl; net phy; " class="sref">syncfg_get_phyid" c/a>" cl(struref="+code=s" ceclass="sref">cfg = < href="+code=chanm" class="sref">cfctm a> *phyid = phy; ref="+code=caiferlass="sref">cflaerl; ENODEV; net stru href="net/caif/cfcnfg.c#L251"3id L223"3class="line" nam L223"32223 32> [cflaerl; EINVAL; adap_layer != NULL) cflapr_erl(strur class="string">"noth_layerhighzerouot; spav3); net if ( href="net/caif/cfcnfg.c#L251"3id L229"3class="line" nam L229"32229<32> adap_layer != ;typereceivl != NULL) ref="+code=caifpr_erlass="sref">cflapr_erl(strur class="string">"noth_layer;uot; spav3); net stru href="net/caif/cfcnfg.c#L251"3id L233"3class="line" nam L233"32233 3a> adap_layer->ctrlcmd != NULL) cflapr_erl(strur class="string">"noth_layer;uot; spav3); net href="net/caif/cfcnfg.c#L251"3id L227"3class="line" nam L237"32237 33> cflaerl; ENODEV; ref="+code=adapfrmlass="sref">priofrml; phy; adapfrmer" cl; if (priofrml; NULL) ref="+code=l" cpr_erlass="sref">cflapr_erl(strur class="string">"nothSpecified PHY does not exist!uot; spav3); golnet href="net/caif/cfcnfg.c#L251"3id L244"3class="line" nam L244"32244 34> [caif_assert(cfctm a> *phyid = phy; id; ref="+code=caifpassert" class="sref">caif_assert(phy; adapfrmer" cl; id; cfctm a> *phyid = caif_assert(phy; adapprefr" cl; id; rref="+code=l" cp" class="sref">cfctm a> *phyid = } ifindex); phy; ifindex); < href="net/caif/cfcnfg.c#L183"3id L251"3class="line" nam L251"32251 3a> swithref="+code=adapocol<_tailass="sref">prioocol<_tail = casehref="+code=adapocol<_" class="sref">protohead_[protohead[cfctm a> *linktype = <] +href="+code=cfcn class="sref">phy; cfct_rool); < href="net/caif/cfcnfg.c#L183"3id L243"3class="line" nam L253"32253 3a> href="net/caif/cfcnfg.c#L183"3id L244"3class="line" nam L254"32254 35> [net /* Do RFIXME: ENUMERATE _RSPIALLY WHEN ACTIVATING PHYSICAL _RTERFACE spav3. cfctrl_link2cfg = <;ctrlcmd< = < href="+code=chanm" class="sref">cfctm a> *phyid = rn caif_l_link_parupuest" cl(struref="+code=s" ceclass="sref">cfg = <;ctrlcmd< = < h;cfctm a> *adap_layer->a href="net/caif/cfcnfg.c#L183"3id L239"3class="line" nam L259"32259 35> ref="+code=u8" cnlddrass="sref">net ref="+code=caifrcu" cad_cnlddrass="sref">net casern cflaerl; href="net/caif/cfcnfg.c#L251"3id L264"3class="line" nam L264"32264 3a> ref="+code=ENODET_SYMBOL" class="sref">EXPORT_SYMBOL(caif_discect_client(stra href="net/caif/cfcnfg.c#L183"3id L255"3class="line" nam L265"32265 36> ic void2cfcnfg_linkrejreq_tcl(cflayer a> *layer,2u8 a> channel_id) breaaaaaaaaaaaaaact2cflayer a> *adap_layter->ahref="net/caif/cfcnfg.c#L272"3id L258"3class="line" nam L268"32268 3a> href="net/caif/cfcnfg.c#L252"3id L269"3class="line" nam L269"32269 36> adap_layter->0) {ref="+code=NULL" class="sref">NULL) adap_layter->ctrlcmd != <) {ref="+code=NULL" class="sref">NULL) adap_layter->ctrlcmd != href="+code=dev__layter" class="sref">adap_layter-> href="net/caif/cfcnfg.c#L272"3id L271"3class="line" nam L271"32271 3a> CAIFPROTK_SRVCMD__RSP_FAIL_RSl,2 href="net/caif/cfcnfg.c#L251"3id L273"3class="line" nam L273"32273 37> href="net/caif/cfcnfg.c#L183"3id L274"3class="line" nam L274"32274 3a> ic void2 ref="+code=cfcnfg_link_parupueclass="sref">cfcnfg_link_parupuecl(cflayer a> *layer,2u8 a> channel_id) caif_l_linksrv caifl u8 a> phyid = cflayer a> *adap_layter->ahref="net/caif/cfcnfg.c#L272"3id L277"3class="line" nam L277"32277 3a> href="net/caif/cfcnfg.c#L252"3id L278"3class="line" nam L2 L3727 a378 ct2cfcnfg_lin *cfcnfna> = cfcnfctta nar_obj != href="+code=dev_r" class="sref">layer,2 ct2cflayer a> *ctrllNULL) [cfcnfg_phyinfo *cfcnnfo * struct2cfcncai_deaicl *cfcncaidea * channel_id) brearef="+code=l" cpr_warnass="sref">priomr_warn(strur class="string">"nothreceivld nel_idhzerouot; spav3); adap_layter->0) {ref="+code=NULL" class="sref">NULL) adap_layter->ctrlcmd != <) {ref="+code=NULL" class="sref">NULL) adap_layter->ctrlcmd != href="+code=dev__layter" class="sref">adap_layter-> href="net/caif/cfcnfg.c#L272"3id L187"3class="line" nam L187"32187 38> CAIFPROTK_SRVCMD__RSP_FAIL_RSl,2 strurn href="net/caif/cfcnfg.c#L251"3id L190"3class="line" nam L190"3219" 3a> href="net/caif/cfcnfg.c#L251"3id L271"3class="line" nam L191"32191 39> ref="+code=caifrcu" cad_lddrass="sref">net adap_layter->0 href="+code=NULL" class="sref">NULL) cfcnmr_debuy(strur class="string">"noth_par sn exist,t; spav3); "nothsend _pardown backuot; spav3); cfctrl_link_pardown" cl(cfcnfna> = <;ctrlcmd< = < href="+code=channel_id" class="sref">channel_id) NULL) net if ( href="net/caif/cfcnfg.c#L251"3id L199"3class="line" nam L199"32199 39> caif_assert(cfcnfna> = NULL) ref="+code=caifpassert" class="sref">caif_assert(phyid = [cfcnnfo *" class="sref">syncfg_get_phyid" c/a>" cl(struref="+code=s" cephyass="sref">cfcnfna> = < href="+code=chanm" class="sref">phyid = cfcnnfo *NULL) cflapr_erl(strur class="string">"nothERROR: Lpar LhDeaicl dissapearedt; spav3); "nothwhile ecptio_inguot; spav3); net if ( href="net/caif/cfcnfg.c#L251"4id L209"4class="line" nam L209"42209<40> caif_assert(cfcnnfo *NULL) ref="+code=caifpassert" class="sref">caif_assert(cfcnnfo *id; phyid = caif_assert(cfcnnfo *adapprefr" cl; NULL) [caif_assert(cfcnnfo *adapprefr" cl; id; phyid = ref="+code=caif_layter" class="sref">adap_layter->id; channel_id) cwitch href="+code=adaplcaifl case CAIFPL_SRV_DBG ref="+code=caiflctrllcfcncfvei_creatl(struref="+code=s" ceel_id" class="sref">channel_id) cfcnnfo *cfcndev_c cl = k; CFCTRL_SRV_DATAGRAM; stru ref="+code=caiflctrllcfcncfdgml_creatl(struref="+code=s" ceel_id" class="sref">channel_id) retuuuuuuuuuuuuuuuuu;cfcnnfo *cfcndev_c cl = break; CFCTRL_SRV_RFM; cfcncaidea *cfcnnfo *cfcndev_c cl = cfcndea * ctrllcfcncfrfml_creatl(struref="+code=s" ceel_id" class="sref">channel_id) cfcnnfo *cfcndev_c cl = < href="net/caif/cfcnfg.c#L244"4id L218"4class="line" nam L228"42228 42> stru cfcncaidea *syncmtl = k; CFCTRL_SRV_UTIL; ctrllcfcncfutill_creatl(struref="+code=s" ceel_id" class="sref">channel_id) cfcnnfo *cfcndev_c cl = stru k; CAIFPL_SRV_DBG ctrllcfcncfvidl_creatl(struref="+code=s" ceel_id" class="sref">channel_id) cfcnnfo *cfcndev_c cl = CFCTRL_SRV_DBG] = href="net/caif/cfcnfg.c#L244"4id L227"4class="line" nam L237"42237 43> ctrllcfcncfdbgl_creatl"lass="lin3id L250"3class="line" nam L250"3225" 3a> } ifix" class="sref">ifix" class="sref">ificd L209"3class="line" nam L219"32219 3hdline" nam L217"0s="sref">cfcnto_link_param(strureV" cl4ss="sref">ENOD k; NULL) cflapr_erl(strur class="sref">prio4rml; NULL) NULL) &quo4;nothSpecified PHY 4oes n4t exist!uot; spav3); 4 4 golnetphyid = ; 4f">adapfr4er" cl; idef="net/caif/cf03"4c_s1"3cnfg.c#L231"3id 03"4c_s1"3cniflifinmulf="+code=adapdex" class="sref">ifix"sref">cfc4m a> *phyid = cfcnnfo *ifinmulf="+href="+code=rfm"utf/cfcnfg.c#L244"4id L227"4class="cl(ifix"sclass="srfr" cl; phyid = ifix"ssref">cfcm a> *ENODEV; adap_layter->ifix"aif/cfcnf4.c#L183"3id L239"3class4"line459"32189 38> href="net/4>phy;4net 4 swithre4="+code=adapocol<_tailas4="sre45ef">phyid = _r4olass45ss="sref">NULL) 4532274 3a> ic void idef="net/caif/cf="net/caif/cfcnfg.c#L244"3id L261"3class="line" nam L261"32261 3a> 4 ref">cfc4E _RSPIALLY WHEN ACTIVAT4NG PH4SICAL cnlddr *cfc4m a> *cfcref="+code=chan_layer" c4ass="4ref">a2273 37> href="net/caif/cfcnfg4aif/cfcnf4.c#L183"3id L239"3class4"line4 nam L259"32259 35>ode=netadd_="sref">caif_assert(ode=netadd_="sref">cne" n77 3a> href="net/caif/cfcnfg.c#L252"3id L278"3class="line" nam L2 L3727 a378 code=phy" clc class="sref">cfcnn L260"3224" 3a> ref="+code=u8" 4nlddr46s="sref">NULL) Nfo *cfcnnfo *u8 a> caif_assert(cfcnn swithre4caifrcu" cad_cnlddrass="4ref">46 exist!uot; spav3); href="+code=u8" class="ss="lin_pde=erenfg.c#L200"3id L2s="ss="lin_pde=erenfgexist a href="net/caif Lfg.c#L252"3id Lef+codode=phy" clc class="sref">cfcnn /a>; channel_id) ref="+code=cfcnfg_link_parupueclass="sref">cfc>cflsuppof/cfcnfg.c#L172"4c>cflsuppof/+codode=phy" clc class="sref">cfcnn if/cfcnf4c#L172"3id L263"3class=4line"46="sref">ifindex); < hrclass="sref">cfboofg.c#L244"4id Lboofexist a href="net/cafce=pr_dlass="sreffce *; linktype = <] +hr href="+code=ctrlcmd" class="s4de=caif_d4scect_req_nt" class="sre4">cai4_discelass="line" nam L217"42217<41aif/cfcnf4.c#L183"3id L255"3class4"line46ass="sref">id06<3a>{. ct2 channel_LL) [cflayer a> *; cflayer i*cfcc#L272"3id L258"3class=4line"46s="sref">ENODEV; href="+code=adaplctrlc4d != <) {ref="+code=4ULL" 479"32189 38> href="net/4 != h4ef="+code=dev__layter" c4ass="47s="sref">netcf href="+code=cfcnfg_get_phyink_pardown" class="f/cfcnfg.c#L251"3idf/cfne" am L261"32261 3a> 4MD__RSP_F4IL_RSlass="sref">CAIFPRO4K_SRV47ef">phyid = NULL55 35> /* Do RFIXM4aif/cfcnf4.c#L251"3id L273"3class4"line47="sref">ifindfor> cflayer i*cflayer i*cflayer i*NULL) caif_assert> cfcnnfo *ifindex); cflayer i* 4Mif/cfcnf4_linksrv caifl = caif_assert(<0 href="+code=ctrlcmd" class="s4 a> *adap_layter-> href=in *inuem L261"32261 3a> 4Ma> * [cfcnnfo *" class="sref">syncfg_get_phyid" c/a>" lass="line" nam L194"42204<40> 4Msref">cfcr_obj != href="+code=dev4r" cl47ass="sref">syncmtl = syncfg_get_phyctrll4/aicl" = NUcnlddr *netToo manyf href="net/448am L263"32263 3a> syncfg_get_phy"nothreceivld 4el_id48nam L214"42214 41> href="net/caif/cfcnfg.c#L200"3id L180"3class="line" nam )id" c/a>" class="GFP_ATOMIC200"3id L180"3GFP_ATOMICne" am L261"32261 3a> 4ef">ctrlc4d != <) {ref="+code=4ULL" 4lass="sref">NUd = 4 != h4ef="+code=dev__layter" c4ass="4ref">adap_layter-&CAIFPRO4K_SRV48s="srnlddr * 48s="sref">ENODEV; caif_assert(cfcnnfo * href="+code=adapl [ href11"42211 41> ref="+code=caifpassert" class="sref">caif_assert(<6"3class="line" nam L276"32276 3a> href="+code=adaplphyid = cfcncaidea *caif_assert(<6"3class="line" nam L276"32276 3a> href="+code=adapl cfcncaidea *cfcnnfo *cfcnnfo *NULL209<40> [caif_assert(caif_assert( ifindex); cfcnnfo *ifindex); "nothsen4 _par49ass="sref">idef="net/caif/cf [linktype = <] +hrr<6"3class="line" e" class="sref">linktype = <] +href="+code=cfcn class="sref">ph4">channel4id) phyid = ph4"a> *ENODEV; cfcnnfo * "3class="line" fce=pr_dlass="sreffce * 5aif/cfcnf5.c#L251"3id L199"3class5"line509"32189 38> href="net/5sref">cfc5fna> = NULd = 5assert caif_assert( ct2cfc5fna> = < href="+code=cha5m" cl50s="sref">NULL209<40> ct2cl(ifinmulf="+code=adapdex" class="sref">ifix5">cfcnnfo5/a> *(stra href="net/5tring">&q5ot;nothERROR: Lpar L5Deaic50ass="sref">NUdcfc>cflsuppof/cfcnfg.c#L172"4c>cflsuppof/+code=chanmclc class="sref">cfcnnfo *"nothw5ile e5ptio_inguot; spav3); class="sref">cfc>cflsuppof/cfcnfg.c#L172"4c>cflsuppof/+code=caifpassert" class="sref">caif_assert(<6"3class="line" nam L276"32276 3a> href="+code=adapl ct2cl(cflsuppof/+codcode=adapdex" class="sref">ifix5"9 5CAIFPL_SRV_DBGcflsuppof/cfcnfg.c#L172"4c>cflsuppof/+codo6"3class="line" f7"32207<30> ct2code=adapdex" class="sref">ifix5aif/cfcnf5.c#L251"4id L209"4class5"line51s="sref">NULL) cflsuppof/cfcnfg.c#L172"4c>cflsuppof/+codo6"3class="line" namref">caif_assert(ifix5aref">cfc5 *; caif_assert(cflsuppof/cfcnfg.c#L172"4c>cflsuppof/+codcode=adapdex" class="sref">ifix5sref">id<5a>; phyi} elseclass="line" nam L217"42217<45>adappref5" cl; channel_id) 209<40> ct2cl(caif_assert(ifix5aref">cfc5a>; caif_assert( ct2code=adapdex" class="sref">ifix5a>cfcnnfo5.c#L183"4i4 L203"4class5"line5 nam L214"42cnlddr *channel_id) phyid = cfcncfdbgl_creatl"lass="lin3id L250"3class="line" nam nnaml_creatl"lass="nnam+codol_creatlass="sref">cf href="+code=cfcnfg_get_phyink_pardown" class="line=pr_dlass="srefline ct2code=adapdex" class="sref">ifix5a 5 cwitch href="+code=ad5plENODEV; cf href="+code=cfcnfg_get_phyink_pardown" class="f/cfcnfg.c#L251"3idf/cfne" am L261"32261 3a> 5o *cfcndev5 ="net/caif/cfcnfg.c#L200"3id 5 ref">id<5_SRV_DATAGRAM" class="sr5f">CF5TRL_SRef="net/caif/cfou//cfcnfg.c#L252"3id ou//cfc 0"3id L260"3class="line" nam 5creatl(st5uref="+code=s" ceel_id" 5lass=52nam L202"42202 40> cfcnnfo *cfc5NULL209<40> cf href="+code=cfcnfg_get_phyink_pardown" class="f/cfcnfg.c#L251"3idf/cfne" am L261"32261 3a> 5o>cfcnnfo5ss="line" nam L224"42254 42>5 cnlddr *CFCTardown" class=" href="net/caif/cfcnfg.c#L251"3id L264"3class="line" nam de=netadd_="sref">caif_assert(ode=netadd_="sref">cne" am L261"32261 3a> 5oif/cfcnf5cndev_c cl = 5o 5;; href="net/caif/cfcnfg.c#L252"3id L278"3class="line" nam L2 L3727 a378 co u8 a> caif_assert(cfcn5ref">cfcn5aidea *syncmtl = ode=chand" clasboofg.c#L244"4id Lboofexist a href="net/cauif/cfcnfg.c#L183uiifl< L261"32261 3a> 5 L209"4cl5ss="line" nam L229"42259<42>5 lass="line" nam L217"42217<45href="+co5e=CAIFPL_SRV_DATA" class5"sref53="sref">cfcnnfo * [ 5o *phyid = 53nam L202"42202 40> 5ef="+code5CAIFPL_SRV_DBGNULL209<40> [ [cfcnnfo *" class="sreref">caif_assert(cfcnnfo * 5e>cfcnnfo5cfcndevd = 53>CFCTRL_SRV_RFM; 5a href="+5ode=CAIFPL_SRV_DATAGclas5="sre5">CFCTRL_SRV_DBG] 5o 5ef">ifix" class="sref">i5icd 53s="sref">netcf5nto_link_param(strur5V" cl538"42208<40> if ( href="net/5; NULLd = prio5rml; NULL) 5ing">&quo5;nothSpecified PHY 5oes n5t exist!uot; spav3); 5iL232"4cl5 golnetNULL209<40> [ 5i>cfcnnfo5phy; adapfr5er" cl; NUdcfuif/cfcnfg.c#L183uiifl< href="+code=adap cl" class="sre5r href="+5m a> *cfre#L243hol cfcnnfo *caif_assert( 5i 5fr" cl; cfcnnfo *ifinmulf="+href="+code=rfm"unam [caif_assert(cfcn5ssref">cf5m a> *syncmtl = lass="line" nam 209<40> caif_assert(cfcnnfo * 5aif/cfcnf5.c#L183"3id L239"3class5"line55ass="sref">NUc elseclass="line" nam L217"42217<45>phy;5NULL) cfcnnfo *ifinmulf="+href="+code=rfm"unamref">caif_assert(cfcnnfo * 5ang">&quo5="+code=adapocol<_tailas5="sre55RL_SRV_DATAGRAM; cfcnnfo *caif_assert( 5; netphyid = 55nam L214"42214 41> 5aif/cfcnf5.c#L183"3id L255"3class5"line55ass="sref">id 5 ref">cfc5E _RSPIALLY WHEN ACTIVAT5NG PH5SICAL cnlddr *cfc5m a> * 5asref">cf5ref="+code=chan_layer" c5ass="558"42208<40> if ( href="net/5aif/cfcnf5.c#L183"3id L239"3class5"line5 nam hy; caif_assert(ode=netdel_="sref">c4"3cl77 3a> href="net/caif/cfcnfg.c#L252"3id L278"3class="line" nam L2 L3727 a378 co u8 a> caif_assert( 5 L260"3225" 3a> ref="+code=u8" 5nlddr56s="srlass="line" nam L217"42217<45 swithre5caifrcu" cad_cnlddrass="5ref">56 exist!uot; 06<3a>{. ct2,s="line" nam L207"33cnfg.c#L231"3id 07"33cnifl 5 /a>; 6"3class="line" nam L276"32276 3a> href="+code=adaplifindfo * [ 5de=caif_d5scect_req_nt" class="sre5">cai56discect_client(stra href="net/5aif/cfcnf5.c#L183"3id L255"3class5"line56ass="sref">idef="net/caif/cfmight_sleeif/cfcnfg.c#L183might_sleeine" nam L261"32261 3a> 5u8 a> 5 a> * cf href="+code=cfcnfg_get_phyink_pardown" class="f/cfcnfg.c#L251"3idf/cfne" am L261"32261 3a> 5 sref">cf5c#L272"3id L258"3class=5line"568"42208<40> if ( href="net/5ef">ctrlc5d != <) {ref="+code=5ULL" 57nam L209"42209<40> caif_assert>ef="+code=rfm"unamref">caif_assert(cfcnnfo * 5 != h5ef="+code=dev__layter" c5ass="57s="sref">net [ [cfcnnfo *" class="sre class="sref">adapprefr" cl; CAIFPRO5K_SRV57ef">phyid = NULd = cf href="+code=cfcnfg_get_phyink_pardown" class="f/cfcnfg.c#L251"3idf/cfne" am L261"32261 3a> 5c#L183"3i5 L274"3class="line" nam5 L2757s="sref">NULL) 5Mif/cfcnf5_linksrv cacnlddr *phyid = ref="+ref="+code=ctrlprefr" 2211 41> ref="+code=caifpassert" class="sref">caif_assertam L261"32261 3a> 5ca> * caif_assert( ref="+code=caifpassert" classnamref">caif_assert(ifix5Msref">cf5r_obj != href="+code=dev5r" cl57s="sref">ENODEV; caif_assert(cfcnnfo *adapprefr" cl; ctrll5/aicl" = caif_assert(cfcnnfo *adapprefr" cl; cfcncfdbgl_creatl"lass="lin3id L250"3class="line" nam nnaml_creatl"lass="nnam+codl; NULL) 558s="sref">phyid = "nothreceivld 5el_id58nam L214"42255 35> /* Do RFIXM5ef">ctrlc5d != <) {ref="+code=5ULL" 5lass="sref">NUdcfcnnfo *caif_assert(adap_layter-&fcnnfo *cfcncaidea *nr="sreef">cfline" nam L184"32184 38>Waitdfor>class= inus L196"42206<40> *CAIFPRO5K_SRV5809"3class="line" nam 209<40> cfcncfdbgl_creatl"lass="lin3id L250"3class="line" nam nnaml_creatl"lass="nnam+codol_creatlass="sref">cf href="+code=cfcnfg_get_phyink_pardown" class="line=pr_dlass="srefline ct2code=adapdex" classa h rea 5esref">cf5s="line" nam L188"32185 3a> 58ass="sref">syncmtl = ode=chand" clasmutexif/cfcnfg.c#L244"3id mutexif/cfcniflcf href="+code=cfcnfg_get_phyink_pardown" class="f/cfcnfg.c#L251"3idf/cfne" am L261"32261 3a> 5g.c#L200"5id L269"3class="line" n5m L59s="sref">NULL) 5ghyinfophyid = caif_assert( 5ga href="5/a>->0 href="+code=NU5L" cl5ss="sref">NULL209<40> ct2ef="+code=l" ccaideaanfg.c#L231"3id cnifl 5alass="st5oth_par sn cfcnnfo * ct2cl( 5af">ctrlc5s="string">"nothsen5 _par59ass="sref">idef="net/caif/cf L#L243s1"3dnf/cfcnfg.c#L200"3id L#L243s1"3dnf/cfcef">cfcnnfo * ct2cl( 5a/a> != h5id) phyid = caif_assert( * 5asref">cf5id L198"3class="line" n5m L59>CAIFPL_SRV_DBG 6aif/cfcnf6.c#L251"3id L199"3class6"line60ass="sref">NUcnlddr *cfc6fna> = netcaif_assert( 6a2ef">cfc6fde=caifrcu" cad_lddrass6ass="60ef">phyid = NULd = caif_assert( = cfcnnfo * 6a5f/cfcnf6.th_par sn (stra href="net/6tring">&q6ot;nothERROR: Lpar L6Deaic60ass="sref">idef="net/caif/cf L#L243freml_creatl"lass=" L#L243fremef">cfcnnfo * ct2 m L261"32261 3a> 6a7ing">&q6od) phyid = cfcnnfo * cf href="+code=cfcnfg_get_phyink_pardown" class="f/cfcnfg.c#L251"3idf/cfne" am L261"32261 3a> 6"9 6 if ( href="net/6aif/cfcnf6.c#L251"4id L209"4class6"line61sref">cfcndev 6aref">cfc6 *id<6a>; caif_assert(ode=netdel_="sref">c4"3cam L261"32261 3a> 6>adappref6" cl;
ca> The original LXR software by th k; LXR ef="unity+codolthis experi"netal version by k; ca> fxc.{reux.no kindly hosted by k;