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()
83 struct lapb_cb *lapb, *use = NULL; in __lapb_devtostruct() local
85 list_for_each_entry(lapb, &lapb_list, node) { in __lapb_devtostruct()
86 if (lapb->dev == dev) { in __lapb_devtostruct()
87 use = lapb; in __lapb_devtostruct()
113 struct lapb_cb *lapb = kzalloc(sizeof(*lapb), GFP_ATOMIC); in lapb_create_cb() local
115 if (!lapb) in lapb_create_cb()
118 skb_queue_head_init(&lapb->write_queue); in lapb_create_cb()
119 skb_queue_head_init(&lapb->ack_queue); in lapb_create_cb()
121 timer_setup(&lapb->t1timer, NULL, 0); in lapb_create_cb()
122 timer_setup(&lapb->t2timer, NULL, 0); in lapb_create_cb()
123 lapb->t1timer_running = false; in lapb_create_cb()
124 lapb->t2timer_running = false; 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()
133 spin_lock_init(&lapb->lock); in lapb_create_cb()
134 refcount_set(&lapb->refcnt, 1); in lapb_create_cb()
136 return lapb; in lapb_create_cb()
142 struct lapb_cb *lapb; in lapb_register() local
147 lapb = __lapb_devtostruct(dev); in lapb_register()
148 if (lapb) { in lapb_register()
149 lapb_put(lapb); in lapb_register()
153 lapb = lapb_create_cb(); in lapb_register()
155 if (!lapb) in lapb_register()
158 lapb->dev = dev; in lapb_register()
159 lapb->callbacks = callbacks; in lapb_register()
161 __lapb_insert_cb(lapb); in lapb_register()
163 lapb_start_t1timer(lapb); in lapb_register()
174 struct lapb_cb *lapb; in lapb_unregister() local
178 lapb = __lapb_devtostruct(dev); in lapb_unregister()
179 if (!lapb) in lapb_unregister()
181 lapb_put(lapb); in lapb_unregister()
184 while (refcount_read(&lapb->refcnt) > 2) in lapb_unregister()
187 spin_lock_bh(&lapb->lock); in lapb_unregister()
189 lapb_stop_t1timer(lapb); in lapb_unregister()
190 lapb_stop_t2timer(lapb); in lapb_unregister()
192 lapb_clear_queues(lapb); in lapb_unregister()
194 spin_unlock_bh(&lapb->lock); in lapb_unregister()
197 del_timer_sync(&lapb->t1timer); in lapb_unregister()
198 del_timer_sync(&lapb->t2timer); in lapb_unregister()
200 __lapb_remove_cb(lapb); in lapb_unregister()
202 lapb_put(lapb); in lapb_unregister()
213 struct lapb_cb *lapb = lapb_devtostruct(dev); in lapb_getparms() local
215 if (!lapb) in lapb_getparms()
218 spin_lock_bh(&lapb->lock); in lapb_getparms()
220 parms->t1 = lapb->t1 / HZ; in lapb_getparms()
221 parms->t2 = lapb->t2 / HZ; in lapb_getparms()
222 parms->n2 = lapb->n2; in lapb_getparms()
223 parms->n2count = lapb->n2count; in lapb_getparms()
224 parms->state = lapb->state; in lapb_getparms()
225 parms->window = lapb->window; in lapb_getparms()
226 parms->mode = lapb->mode; in lapb_getparms()
228 if (!timer_pending(&lapb->t1timer)) in lapb_getparms()
231 parms->t1timer = (lapb->t1timer.expires - jiffies) / HZ; in lapb_getparms()
233 if (!timer_pending(&lapb->t2timer)) in lapb_getparms()
236 parms->t2timer = (lapb->t2timer.expires - jiffies) / HZ; in lapb_getparms()
238 spin_unlock_bh(&lapb->lock); in lapb_getparms()
239 lapb_put(lapb); in lapb_getparms()
249 struct lapb_cb *lapb = lapb_devtostruct(dev); in lapb_setparms() local
251 if (!lapb) in lapb_setparms()
254 spin_lock_bh(&lapb->lock); in lapb_setparms()
260 if (lapb->state == LAPB_STATE_0) { in lapb_setparms()
268 lapb->mode = parms->mode; in lapb_setparms()
269 lapb->window = parms->window; in lapb_setparms()
272 lapb->t1 = parms->t1 * HZ; in lapb_setparms()
273 lapb->t2 = parms->t2 * HZ; in lapb_setparms()
274 lapb->n2 = parms->n2; in lapb_setparms()
278 spin_unlock_bh(&lapb->lock); in lapb_setparms()
279 lapb_put(lapb); in lapb_setparms()
287 struct lapb_cb *lapb = lapb_devtostruct(dev); in lapb_connect_request() local
290 if (!lapb) in lapb_connect_request()
293 spin_lock_bh(&lapb->lock); in lapb_connect_request()
296 if (lapb->state == LAPB_STATE_1) in lapb_connect_request()
300 if (lapb->state == LAPB_STATE_3 || lapb->state == LAPB_STATE_4) in lapb_connect_request()
303 lapb_establish_data_link(lapb); in lapb_connect_request()
305 lapb_dbg(0, "(%p) S0 -> S1\n", lapb->dev); in lapb_connect_request()
306 lapb->state = LAPB_STATE_1; in lapb_connect_request()
310 spin_unlock_bh(&lapb->lock); in lapb_connect_request()
311 lapb_put(lapb); in lapb_connect_request()
317 static int __lapb_disconnect_request(struct lapb_cb *lapb) in __lapb_disconnect_request() argument
319 switch (lapb->state) { in __lapb_disconnect_request()
324 lapb_dbg(1, "(%p) S1 TX DISC(1)\n", lapb->dev); in __lapb_disconnect_request()
325 lapb_dbg(0, "(%p) S1 -> S0\n", lapb->dev); in __lapb_disconnect_request()
326 lapb_send_control(lapb, LAPB_DISC, LAPB_POLLON, LAPB_COMMAND); in __lapb_disconnect_request()
327 lapb->state = LAPB_STATE_0; in __lapb_disconnect_request()
328 lapb_start_t1timer(lapb); in __lapb_disconnect_request()
335 lapb_clear_queues(lapb); in __lapb_disconnect_request()
336 lapb->n2count = 0; in __lapb_disconnect_request()
337 lapb_send_control(lapb, LAPB_DISC, LAPB_POLLON, LAPB_COMMAND); in __lapb_disconnect_request()
338 lapb_start_t1timer(lapb); in __lapb_disconnect_request()
339 lapb_stop_t2timer(lapb); in __lapb_disconnect_request()
340 lapb->state = LAPB_STATE_2; in __lapb_disconnect_request()
342 lapb_dbg(1, "(%p) S3 DISC(1)\n", lapb->dev); in __lapb_disconnect_request()
343 lapb_dbg(0, "(%p) S3 -> S2\n", lapb->dev); in __lapb_disconnect_request()
350 struct lapb_cb *lapb = lapb_devtostruct(dev); in lapb_disconnect_request() local
353 if (!lapb) in lapb_disconnect_request()
356 spin_lock_bh(&lapb->lock); in lapb_disconnect_request()
358 rc = __lapb_disconnect_request(lapb); in lapb_disconnect_request()
360 spin_unlock_bh(&lapb->lock); in lapb_disconnect_request()
361 lapb_put(lapb); in lapb_disconnect_request()
369 struct lapb_cb *lapb = lapb_devtostruct(dev); in lapb_data_request() local
372 if (!lapb) in lapb_data_request()
375 spin_lock_bh(&lapb->lock); in lapb_data_request()
378 if (lapb->state != LAPB_STATE_3 && lapb->state != LAPB_STATE_4) in lapb_data_request()
381 skb_queue_tail(&lapb->write_queue, skb); in lapb_data_request()
382 lapb_kick(lapb); in lapb_data_request()
385 spin_unlock_bh(&lapb->lock); in lapb_data_request()
386 lapb_put(lapb); in lapb_data_request()
394 struct lapb_cb *lapb = lapb_devtostruct(dev); in lapb_data_received() local
397 if (lapb) { in lapb_data_received()
398 spin_lock_bh(&lapb->lock); in lapb_data_received()
399 lapb_data_input(lapb, skb); in lapb_data_received()
400 spin_unlock_bh(&lapb->lock); in lapb_data_received()
401 lapb_put(lapb); in lapb_data_received()
409 void lapb_connect_confirmation(struct lapb_cb *lapb, int reason) in lapb_connect_confirmation() argument
411 if (lapb->callbacks->connect_confirmation) in lapb_connect_confirmation()
412 lapb->callbacks->connect_confirmation(lapb->dev, reason); in lapb_connect_confirmation()
415 void lapb_connect_indication(struct lapb_cb *lapb, int reason) in lapb_connect_indication() argument
417 if (lapb->callbacks->connect_indication) in lapb_connect_indication()
418 lapb->callbacks->connect_indication(lapb->dev, reason); in lapb_connect_indication()
421 void lapb_disconnect_confirmation(struct lapb_cb *lapb, int reason) in lapb_disconnect_confirmation() argument
423 if (lapb->callbacks->disconnect_confirmation) in lapb_disconnect_confirmation()
424 lapb->callbacks->disconnect_confirmation(lapb->dev, reason); in lapb_disconnect_confirmation()
427 void lapb_disconnect_indication(struct lapb_cb *lapb, int reason) in lapb_disconnect_indication() argument
429 if (lapb->callbacks->disconnect_indication) in lapb_disconnect_indication()
430 lapb->callbacks->disconnect_indication(lapb->dev, reason); in lapb_disconnect_indication()
433 int lapb_data_indication(struct lapb_cb *lapb, struct sk_buff *skb) in lapb_data_indication() argument
435 if (lapb->callbacks->data_indication) in lapb_data_indication()
436 return lapb->callbacks->data_indication(lapb->dev, skb); in lapb_data_indication()
442 int lapb_data_transmit(struct lapb_cb *lapb, struct sk_buff *skb) in lapb_data_transmit() argument
446 if (lapb->callbacks->data_transmit) { in lapb_data_transmit()
447 lapb->callbacks->data_transmit(lapb->dev, skb); in lapb_data_transmit()
459 struct lapb_cb *lapb; in lapb_device_event() local
467 lapb = lapb_devtostruct(dev); in lapb_device_event()
468 if (!lapb) in lapb_device_event()
471 spin_lock_bh(&lapb->lock); in lapb_device_event()
480 if (lapb->mode & LAPB_DCE) { in lapb_device_event()
481 lapb_start_t1timer(lapb); in lapb_device_event()
483 if (lapb->state == LAPB_STATE_0) { in lapb_device_event()
484 lapb->state = LAPB_STATE_1; in lapb_device_event()
485 lapb_establish_data_link(lapb); in lapb_device_event()
492 __lapb_disconnect_request(lapb); in lapb_device_event()
496 lapb_dbg(0, "(%p) S%d -> S0\n", dev, lapb->state); in lapb_device_event()
497 lapb_clear_queues(lapb); in lapb_device_event()
498 lapb->state = LAPB_STATE_0; in lapb_device_event()
499 lapb->n2count = 0; in lapb_device_event()
500 lapb_stop_t1timer(lapb); in lapb_device_event()
501 lapb_stop_t2timer(lapb); in lapb_device_event()
507 if (lapb->mode & LAPB_DCE) { in lapb_device_event()
508 lapb_start_t1timer(lapb); in lapb_device_event()
510 if (lapb->state == LAPB_STATE_0) { in lapb_device_event()
511 lapb->state = LAPB_STATE_1; in lapb_device_event()
512 lapb_establish_data_link(lapb); in lapb_device_event()
517 lapb_dbg(0, "(%p) S%d -> S0\n", dev, lapb->state); in lapb_device_event()
518 lapb_clear_queues(lapb); in lapb_device_event()
519 lapb->state = LAPB_STATE_0; in lapb_device_event()
520 lapb->n2count = 0; in lapb_device_event()
521 lapb_stop_t1timer(lapb); in lapb_device_event()
522 lapb_stop_t2timer(lapb); in lapb_device_event()
527 spin_unlock_bh(&lapb->lock); in lapb_device_event()
528 lapb_put(lapb); in lapb_device_event()