Lines Matching refs:lapb
45 static void lapb_free_cb(struct lapb_cb *lapb) in lapb_free_cb() argument
47 kfree(lapb); in lapb_free_cb()
50 static __inline__ void lapb_hold(struct lapb_cb *lapb) in lapb_hold() argument
52 refcount_inc(&lapb->refcnt); in lapb_hold()
55 static __inline__ void lapb_put(struct lapb_cb *lapb) in lapb_put() argument
57 if (refcount_dec_and_test(&lapb->refcnt)) in lapb_put()
58 lapb_free_cb(lapb); in lapb_put()
64 static void __lapb_remove_cb(struct lapb_cb *lapb) in __lapb_remove_cb() argument
66 if (lapb->node.next) { in __lapb_remove_cb()
67 list_del(&lapb->node); in __lapb_remove_cb()
68 lapb_put(lapb); in __lapb_remove_cb()
75 static void __lapb_insert_cb(struct lapb_cb *lapb) in __lapb_insert_cb() argument
77 list_add(&lapb->node, &lapb_list); in __lapb_insert_cb()
78 lapb_hold(lapb); in __lapb_insert_cb()
84 struct lapb_cb *lapb, *use = NULL; in __lapb_devtostruct() local
87 lapb = list_entry(entry, struct lapb_cb, node); in __lapb_devtostruct()
88 if (lapb->dev == dev) { in __lapb_devtostruct()
89 use = lapb; in __lapb_devtostruct()
115 struct lapb_cb *lapb = kzalloc(sizeof(*lapb), GFP_ATOMIC); in lapb_create_cb() local
117 if (!lapb) in lapb_create_cb()
120 skb_queue_head_init(&lapb->write_queue); in lapb_create_cb()
121 skb_queue_head_init(&lapb->ack_queue); in lapb_create_cb()
123 timer_setup(&lapb->t1timer, NULL, 0); in lapb_create_cb()
124 timer_setup(&lapb->t2timer, NULL, 0); in lapb_create_cb()
126 lapb->t1 = LAPB_DEFAULT_T1; in lapb_create_cb()
127 lapb->t2 = LAPB_DEFAULT_T2; in lapb_create_cb()
128 lapb->n2 = LAPB_DEFAULT_N2; in lapb_create_cb()
129 lapb->mode = LAPB_DEFAULT_MODE; in lapb_create_cb()
130 lapb->window = LAPB_DEFAULT_WINDOW; in lapb_create_cb()
131 lapb->state = LAPB_STATE_0; in lapb_create_cb()
132 refcount_set(&lapb->refcnt, 1); in lapb_create_cb()
134 return lapb; in lapb_create_cb()
140 struct lapb_cb *lapb; in lapb_register() local
145 lapb = __lapb_devtostruct(dev); in lapb_register()
146 if (lapb) { in lapb_register()
147 lapb_put(lapb); in lapb_register()
151 lapb = lapb_create_cb(); in lapb_register()
153 if (!lapb) in lapb_register()
156 lapb->dev = dev; in lapb_register()
157 lapb->callbacks = callbacks; in lapb_register()
159 __lapb_insert_cb(lapb); in lapb_register()
161 lapb_start_t1timer(lapb); in lapb_register()
172 struct lapb_cb *lapb; in lapb_unregister() local
176 lapb = __lapb_devtostruct(dev); in lapb_unregister()
177 if (!lapb) in lapb_unregister()
179 lapb_put(lapb); in lapb_unregister()
181 lapb_stop_t1timer(lapb); in lapb_unregister()
182 lapb_stop_t2timer(lapb); in lapb_unregister()
184 lapb_clear_queues(lapb); in lapb_unregister()
186 __lapb_remove_cb(lapb); in lapb_unregister()
188 lapb_put(lapb); in lapb_unregister()
199 struct lapb_cb *lapb = lapb_devtostruct(dev); in lapb_getparms() local
201 if (!lapb) in lapb_getparms()
204 parms->t1 = lapb->t1 / HZ; in lapb_getparms()
205 parms->t2 = lapb->t2 / HZ; in lapb_getparms()
206 parms->n2 = lapb->n2; in lapb_getparms()
207 parms->n2count = lapb->n2count; in lapb_getparms()
208 parms->state = lapb->state; in lapb_getparms()
209 parms->window = lapb->window; in lapb_getparms()
210 parms->mode = lapb->mode; in lapb_getparms()
212 if (!timer_pending(&lapb->t1timer)) in lapb_getparms()
215 parms->t1timer = (lapb->t1timer.expires - jiffies) / HZ; in lapb_getparms()
217 if (!timer_pending(&lapb->t2timer)) in lapb_getparms()
220 parms->t2timer = (lapb->t2timer.expires - jiffies) / HZ; in lapb_getparms()
222 lapb_put(lapb); in lapb_getparms()
232 struct lapb_cb *lapb = lapb_devtostruct(dev); in lapb_setparms() local
234 if (!lapb) in lapb_setparms()
241 if (lapb->state == LAPB_STATE_0) { in lapb_setparms()
249 lapb->mode = parms->mode; in lapb_setparms()
250 lapb->window = parms->window; in lapb_setparms()
253 lapb->t1 = parms->t1 * HZ; in lapb_setparms()
254 lapb->t2 = parms->t2 * HZ; in lapb_setparms()
255 lapb->n2 = parms->n2; in lapb_setparms()
259 lapb_put(lapb); in lapb_setparms()
267 struct lapb_cb *lapb = lapb_devtostruct(dev); in lapb_connect_request() local
270 if (!lapb) in lapb_connect_request()
274 if (lapb->state == LAPB_STATE_1) in lapb_connect_request()
278 if (lapb->state == LAPB_STATE_3 || lapb->state == LAPB_STATE_4) in lapb_connect_request()
281 lapb_establish_data_link(lapb); in lapb_connect_request()
283 lapb_dbg(0, "(%p) S0 -> S1\n", lapb->dev); in lapb_connect_request()
284 lapb->state = LAPB_STATE_1; in lapb_connect_request()
288 lapb_put(lapb); in lapb_connect_request()
296 struct lapb_cb *lapb = lapb_devtostruct(dev); in lapb_disconnect_request() local
299 if (!lapb) in lapb_disconnect_request()
302 switch (lapb->state) { in lapb_disconnect_request()
308 lapb_dbg(1, "(%p) S1 TX DISC(1)\n", lapb->dev); in lapb_disconnect_request()
309 lapb_dbg(0, "(%p) S1 -> S0\n", lapb->dev); in lapb_disconnect_request()
310 lapb_send_control(lapb, LAPB_DISC, LAPB_POLLON, LAPB_COMMAND); in lapb_disconnect_request()
311 lapb->state = LAPB_STATE_0; in lapb_disconnect_request()
312 lapb_start_t1timer(lapb); in lapb_disconnect_request()
321 lapb_clear_queues(lapb); in lapb_disconnect_request()
322 lapb->n2count = 0; in lapb_disconnect_request()
323 lapb_send_control(lapb, LAPB_DISC, LAPB_POLLON, LAPB_COMMAND); in lapb_disconnect_request()
324 lapb_start_t1timer(lapb); in lapb_disconnect_request()
325 lapb_stop_t2timer(lapb); in lapb_disconnect_request()
326 lapb->state = LAPB_STATE_2; in lapb_disconnect_request()
328 lapb_dbg(1, "(%p) S3 DISC(1)\n", lapb->dev); in lapb_disconnect_request()
329 lapb_dbg(0, "(%p) S3 -> S2\n", lapb->dev); in lapb_disconnect_request()
333 lapb_put(lapb); in lapb_disconnect_request()
341 struct lapb_cb *lapb = lapb_devtostruct(dev); in lapb_data_request() local
344 if (!lapb) in lapb_data_request()
348 if (lapb->state != LAPB_STATE_3 && lapb->state != LAPB_STATE_4) in lapb_data_request()
351 skb_queue_tail(&lapb->write_queue, skb); in lapb_data_request()
352 lapb_kick(lapb); in lapb_data_request()
355 lapb_put(lapb); in lapb_data_request()
363 struct lapb_cb *lapb = lapb_devtostruct(dev); in lapb_data_received() local
366 if (lapb) { in lapb_data_received()
367 lapb_data_input(lapb, skb); in lapb_data_received()
368 lapb_put(lapb); in lapb_data_received()
376 void lapb_connect_confirmation(struct lapb_cb *lapb, int reason) in lapb_connect_confirmation() argument
378 if (lapb->callbacks->connect_confirmation) in lapb_connect_confirmation()
379 lapb->callbacks->connect_confirmation(lapb->dev, reason); in lapb_connect_confirmation()
382 void lapb_connect_indication(struct lapb_cb *lapb, int reason) in lapb_connect_indication() argument
384 if (lapb->callbacks->connect_indication) in lapb_connect_indication()
385 lapb->callbacks->connect_indication(lapb->dev, reason); in lapb_connect_indication()
388 void lapb_disconnect_confirmation(struct lapb_cb *lapb, int reason) in lapb_disconnect_confirmation() argument
390 if (lapb->callbacks->disconnect_confirmation) in lapb_disconnect_confirmation()
391 lapb->callbacks->disconnect_confirmation(lapb->dev, reason); in lapb_disconnect_confirmation()
394 void lapb_disconnect_indication(struct lapb_cb *lapb, int reason) in lapb_disconnect_indication() argument
396 if (lapb->callbacks->disconnect_indication) in lapb_disconnect_indication()
397 lapb->callbacks->disconnect_indication(lapb->dev, reason); in lapb_disconnect_indication()
400 int lapb_data_indication(struct lapb_cb *lapb, struct sk_buff *skb) in lapb_data_indication() argument
402 if (lapb->callbacks->data_indication) in lapb_data_indication()
403 return lapb->callbacks->data_indication(lapb->dev, skb); in lapb_data_indication()
409 int lapb_data_transmit(struct lapb_cb *lapb, struct sk_buff *skb) in lapb_data_transmit() argument
413 if (lapb->callbacks->data_transmit) { in lapb_data_transmit()
414 lapb->callbacks->data_transmit(lapb->dev, skb); in lapb_data_transmit()