@@ -54,8 +54,7 @@ struct cfcnfg {
54
54
static void cfcnfg_linkup_rsp (struct cflayer * layer , u8 channel_id ,
55
55
enum cfctrl_srv serv , u8 phyid ,
56
56
struct cflayer * adapt_layer );
57
- static void cfcnfg_linkdestroy_rsp (struct cflayer * layer , u8 channel_id ,
58
- struct cflayer * client_layer );
57
+ static void cfcnfg_linkdestroy_rsp (struct cflayer * layer , u8 channel_id );
59
58
static void cfcnfg_reject_rsp (struct cflayer * layer , u8 channel_id ,
60
59
struct cflayer * adapt_layer );
61
60
static void cfctrl_resp_func (void );
@@ -175,73 +174,65 @@ int cfcnfg_get_named(struct cfcnfg *cnfg, char *name)
175
174
return 0 ;
176
175
}
177
176
178
- /*
179
- * NOTE: What happens on destroy failure:
180
- * 1a) No response - Too early
181
- * This will not happen because enumerate has already
182
- * completed.
183
- * 1b) No response - FATAL
184
- * Not handled, but this should be a CAIF PROTOCOL ERROR
185
- * Modem error, response is really expected - this
186
- * case is not really handled.
187
- * 2) O/E-bit indicate error
188
- * Ignored - this link is destroyed anyway.
189
- * 3) Not able to match on request
190
- * Not handled, but this should be a CAIF PROTOCOL ERROR
191
- * 4) Link-Error - (no response)
192
- * Not handled, but this should be a CAIF PROTOCOL ERROR
193
- */
194
177
int cfcnfg_disconn_adapt_layer (struct cfcnfg * cnfg , struct cflayer * adap_layer )
195
178
{
196
179
u8 channel_id = 0 ;
197
180
int ret = 0 ;
181
+ struct cflayer * servl = NULL ;
198
182
struct cfcnfg_phyinfo * phyinfo = NULL ;
199
183
u8 phyid = 0 ;
200
-
201
184
caif_assert (adap_layer != NULL );
202
185
channel_id = adap_layer -> id ;
203
- if (channel_id == 0 ) {
186
+ if (adap_layer -> dn == NULL || channel_id == 0 ) {
204
187
pr_err ("CAIF: %s():adap_layer->id is 0\n" , __func__ );
205
188
ret = - ENOTCONN ;
206
189
goto end ;
207
190
}
208
-
209
- if (adap_layer -> dn == NULL ) {
210
- pr_err ("CAIF: %s():adap_layer->dn is NULL\n" , __func__ );
211
- ret = - ENODEV ;
212
- goto end ;
213
- }
214
-
215
- if (adap_layer -> dn != NULL )
216
- phyid = cfsrvl_getphyid (adap_layer -> dn );
217
-
218
- phyinfo = cfcnfg_get_phyinfo (cnfg , phyid );
219
- if (phyinfo == NULL ) {
220
- pr_warning ("CAIF: %s(): No interface to send disconnect to\n" ,
221
- __func__ );
222
- ret = - ENODEV ;
191
+ servl = cfmuxl_remove_uplayer (cnfg -> mux , channel_id );
192
+ if (servl == NULL )
223
193
goto end ;
224
- }
225
-
226
- if (phyinfo -> id != phyid
227
- || phyinfo -> phy_layer -> id != phyid
228
- || phyinfo -> frm_layer -> id != phyid ) {
229
-
230
- pr_err ("CAIF: %s(): Inconsistency in phy registration\n" ,
231
- __func__ );
194
+ layer_set_up (servl , NULL );
195
+ ret = cfctrl_linkdown_req (cnfg -> ctrl , channel_id , adap_layer );
196
+ if (servl == NULL ) {
197
+ pr_err ("CAIF: %s(): PROTOCOL ERROR "
198
+ "- Error removing service_layer Channel_Id(%d)" ,
199
+ __func__ , channel_id );
232
200
ret = - EINVAL ;
233
201
goto end ;
234
202
}
203
+ caif_assert (channel_id == servl -> id );
204
+ if (adap_layer -> dn != NULL ) {
205
+ phyid = cfsrvl_getphyid (adap_layer -> dn );
235
206
236
- ret = cfctrl_linkdown_req (cnfg -> ctrl , channel_id , adap_layer );
237
-
238
- end :
207
+ phyinfo = cfcnfg_get_phyinfo (cnfg , phyid );
208
+ if (phyinfo == NULL ) {
209
+ pr_warning ("CAIF: %s(): "
210
+ "No interface to send disconnect to\n" ,
211
+ __func__ );
212
+ ret = - ENODEV ;
213
+ goto end ;
214
+ }
215
+ if (phyinfo -> id != phyid ||
216
+ phyinfo -> phy_layer -> id != phyid ||
217
+ phyinfo -> frm_layer -> id != phyid ) {
218
+ pr_err ("CAIF: %s(): "
219
+ "Inconsistency in phy registration\n" ,
220
+ __func__ );
221
+ ret = - EINVAL ;
222
+ goto end ;
223
+ }
224
+ }
239
225
if (phyinfo != NULL && -- phyinfo -> phy_ref_count == 0 &&
240
226
phyinfo -> phy_layer != NULL &&
241
227
phyinfo -> phy_layer -> modemcmd != NULL ) {
242
228
phyinfo -> phy_layer -> modemcmd (phyinfo -> phy_layer ,
243
229
_CAIF_MODEMCMD_PHYIF_USELESS );
244
230
}
231
+ end :
232
+ cfsrvl_put (servl );
233
+ cfctrl_cancel_req (cnfg -> ctrl , adap_layer );
234
+ if (adap_layer -> ctrlcmd != NULL )
235
+ adap_layer -> ctrlcmd (adap_layer , CAIF_CTRLCMD_DEINIT_RSP , 0 );
245
236
return ret ;
246
237
247
238
}
@@ -254,69 +245,11 @@ void cfcnfg_release_adap_layer(struct cflayer *adap_layer)
254
245
}
255
246
EXPORT_SYMBOL (cfcnfg_release_adap_layer );
256
247
257
- static void cfcnfg_linkdestroy_rsp (struct cflayer * layer , u8 channel_id ,
258
- struct cflayer * client_layer )
248
+ static void cfcnfg_linkdestroy_rsp (struct cflayer * layer , u8 channel_id )
259
249
{
260
- struct cfcnfg * cnfg = container_obj (layer );
261
- struct cflayer * servl ;
262
-
263
- /*
264
- * 1) Remove service from the MUX layer. The MUX must
265
- * guarante that no more payload sent "upwards" (receive)
266
- */
267
- servl = cfmuxl_remove_uplayer (cnfg -> mux , channel_id );
268
-
269
- if (servl == NULL ) {
270
- pr_err ("CAIF: %s(): PROTOCOL ERROR "
271
- "- Error removing service_layer Channel_Id(%d)" ,
272
- __func__ , channel_id );
273
- return ;
274
- }
275
- caif_assert (channel_id == servl -> id );
276
-
277
- if (servl != client_layer && servl -> up != client_layer ) {
278
- pr_err ("CAIF: %s(): Error removing service_layer "
279
- "Channel_Id(%d) %p %p" ,
280
- __func__ , channel_id , (void * ) servl ,
281
- (void * ) client_layer );
282
- return ;
283
- }
284
-
285
- /*
286
- * 2) DEINIT_RSP must guarantee that no more packets are transmitted
287
- * from client (adap_layer) when it returns.
288
- */
289
-
290
- if (servl -> ctrlcmd == NULL ) {
291
- pr_err ("CAIF: %s(): Error servl->ctrlcmd == NULL" , __func__ );
292
- return ;
293
- }
294
-
295
- servl -> ctrlcmd (servl , CAIF_CTRLCMD_DEINIT_RSP , 0 );
296
-
297
- /* 3) It is now safe to destroy the service layer. */
298
- cfservl_destroy (servl );
299
250
}
300
251
301
- /*
302
- * NOTE: What happens on linksetup failure:
303
- * 1a) No response - Too early
304
- * This will not happen because enumerate is secured
305
- * before using interface.
306
- * 1b) No response - FATAL
307
- * Not handled, but this should be a CAIF PROTOCOL ERROR
308
- * Modem error, response is really expected - this case is
309
- * not really handled.
310
- * 2) O/E-bit indicate error
311
- * Handled in cnfg_reject_rsp
312
- * 3) Not able to match on request
313
- * Not handled, but this should be a CAIF PROTOCOL ERROR
314
- * 4) Link-Error - (no response)
315
- * Not handled, but this should be a CAIF PROTOCOL ERROR
316
- */
317
-
318
- int
319
- cfcnfg_add_adaptation_layer (struct cfcnfg * cnfg ,
252
+ int cfcnfg_add_adaptation_layer (struct cfcnfg * cnfg ,
320
253
struct cfctrl_link_param * param ,
321
254
struct cflayer * adap_layer )
322
255
{
@@ -346,8 +279,7 @@ cfcnfg_add_adaptation_layer(struct cfcnfg *cnfg,
346
279
param -> phyid );
347
280
/* FIXME: ENUMERATE INITIALLY WHEN ACTIVATING PHYSICAL INTERFACE */
348
281
cfctrl_enum_req (cnfg -> ctrl , param -> phyid );
349
- cfctrl_linkup_request (cnfg -> ctrl , param , adap_layer );
350
- return 0 ;
282
+ return cfctrl_linkup_request (cnfg -> ctrl , param , adap_layer );
351
283
}
352
284
EXPORT_SYMBOL (cfcnfg_add_adaptation_layer );
353
285
@@ -367,8 +299,10 @@ cfcnfg_linkup_rsp(struct cflayer *layer, u8 channel_id, enum cfctrl_srv serv,
367
299
struct cflayer * servicel = NULL ;
368
300
struct cfcnfg_phyinfo * phyinfo ;
369
301
if (adapt_layer == NULL ) {
370
- pr_err ("CAIF: %s(): PROTOCOL ERROR "
371
- "- LinkUp Request/Response did not match\n" , __func__ );
302
+ pr_debug ("CAIF: %s(): link setup response "
303
+ "but no client exist, send linkdown back\n" ,
304
+ __func__ );
305
+ cfctrl_linkdown_req (cnfg -> ctrl , channel_id , NULL );
372
306
return ;
373
307
}
374
308
@@ -424,6 +358,7 @@ cfcnfg_linkup_rsp(struct cflayer *layer, u8 channel_id, enum cfctrl_srv serv,
424
358
cfmuxl_set_uplayer (cnfg -> mux , servicel , channel_id );
425
359
layer_set_up (servicel , adapt_layer );
426
360
layer_set_dn (adapt_layer , servicel );
361
+ cfsrvl_get (servicel );
427
362
servicel -> ctrlcmd (servicel , CAIF_CTRLCMD_INIT_RSP , 0 );
428
363
}
429
364
0 commit comments