• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/components/opensource/linux/linux-2.6.36/drivers/uwb/

Lines Matching defs:rsv

56 bool uwb_rsv_has_two_drp_ies(struct uwb_rsv *rsv)
78 return has_two_drp_ies[rsv->state];
105 void uwb_rsv_dump(char *text, struct uwb_rsv *rsv)
107 struct device *dev = &rsv->rc->uwb_dev.dev;
111 uwb_dev_addr_print(owner, sizeof(owner), &rsv->owner->dev_addr);
112 if (rsv->target.type == UWB_RSV_TARGET_DEV)
113 devaddr = rsv->target.dev->dev_addr;
115 devaddr = rsv->target.devaddr;
118 dev_dbg(dev, "rsv %s %s -> %s: %s\n",
119 text, owner, target, uwb_rsv_state_str(rsv->state));
124 struct uwb_rsv *rsv = container_of(kref, struct uwb_rsv, kref);
126 kfree(rsv);
129 void uwb_rsv_get(struct uwb_rsv *rsv)
131 kref_get(&rsv->kref);
134 void uwb_rsv_put(struct uwb_rsv *rsv)
136 kref_put(&rsv->kref, uwb_rsv_release);
146 static int uwb_rsv_get_stream(struct uwb_rsv *rsv)
148 struct uwb_rc *rc = rsv->rc;
153 switch (rsv->target.type) {
155 streams_bm = rsv->target.dev->streams;
168 rsv->stream = stream;
171 dev_dbg(dev, "get stream %d\n", rsv->stream);
176 static void uwb_rsv_put_stream(struct uwb_rsv *rsv)
178 struct uwb_rc *rc = rsv->rc;
182 switch (rsv->target.type) {
184 streams_bm = rsv->target.dev->streams;
193 clear_bit(rsv->stream, streams_bm);
195 dev_dbg(dev, "put stream %d\n", rsv->stream);
242 static void uwb_rsv_stroke_timer(struct uwb_rsv *rsv)
251 if (rsv->is_multicast) {
252 if (rsv->state == UWB_RSV_STATE_O_INITIATED
253 || rsv->state == UWB_RSV_STATE_O_MOVE_EXPANDING
254 || rsv->state == UWB_RSV_STATE_O_MOVE_COMBINING
255 || rsv->state == UWB_RSV_STATE_O_MOVE_REDUCING)
257 if (rsv->state == UWB_RSV_STATE_O_ESTABLISHED)
268 mod_timer(&rsv->timer, jiffies + usecs_to_jiffies(timeout_us));
270 del_timer(&rsv->timer);
277 static void uwb_rsv_state_update(struct uwb_rsv *rsv,
280 rsv->state = new_state;
281 rsv->ie_valid = false;
283 uwb_rsv_dump("SU", rsv);
285 uwb_rsv_stroke_timer(rsv);
286 uwb_rsv_sched_update(rsv->rc);
289 static void uwb_rsv_callback(struct uwb_rsv *rsv)
291 if (rsv->callback)
292 rsv->callback(rsv);
295 void uwb_rsv_set_state(struct uwb_rsv *rsv, enum uwb_rsv_state new_state)
297 struct uwb_rsv_move *mv = &rsv->mv;
299 if (rsv->state == new_state) {
300 switch (rsv->state) {
309 uwb_rsv_stroke_timer(rsv);
319 uwb_rsv_dump("SC", rsv);
323 uwb_rsv_state_update(rsv, UWB_RSV_STATE_NONE);
324 uwb_rsv_callback(rsv);
327 uwb_rsv_state_update(rsv, UWB_RSV_STATE_O_INITIATED);
330 uwb_rsv_state_update(rsv, UWB_RSV_STATE_O_PENDING);
334 bitmap_andnot(rsv->mas.bm, rsv->mas.bm, mv->companion_mas.bm, UWB_NUM_MAS);
335 uwb_rsv_state_update(rsv, UWB_RSV_STATE_O_MODIFIED);
338 if (rsv->state == UWB_RSV_STATE_O_MODIFIED
339 || rsv->state == UWB_RSV_STATE_O_MOVE_REDUCING) {
340 uwb_drp_avail_release(rsv->rc, &mv->companion_mas);
341 rsv->needs_release_companion_mas = false;
343 uwb_drp_avail_reserve(rsv->rc, &rsv->mas);
344 uwb_rsv_state_update(rsv, UWB_RSV_STATE_O_ESTABLISHED);
345 uwb_rsv_callback(rsv);
348 rsv->needs_release_companion_mas = true;
349 uwb_rsv_state_update(rsv, UWB_RSV_STATE_O_MOVE_EXPANDING);
352 rsv->needs_release_companion_mas = false;
353 uwb_drp_avail_reserve(rsv->rc, &mv->companion_mas);
354 bitmap_or(rsv->mas.bm, rsv->mas.bm, mv->companion_mas.bm, UWB_NUM_MAS);
355 rsv->mas.safe += mv->companion_mas.safe;
356 rsv->mas.unsafe += mv->companion_mas.unsafe;
357 uwb_rsv_state_update(rsv, UWB_RSV_STATE_O_MOVE_COMBINING);
360 bitmap_andnot(mv->companion_mas.bm, rsv->mas.bm, mv->final_mas.bm, UWB_NUM_MAS);
361 rsv->needs_release_companion_mas = true;
362 rsv->mas.safe = mv->final_mas.safe;
363 rsv->mas.unsafe = mv->final_mas.unsafe;
364 bitmap_copy(rsv->mas.bm, mv->final_mas.bm, UWB_NUM_MAS);
365 bitmap_copy(rsv->mas.unsafe_bm, mv->final_mas.unsafe_bm, UWB_NUM_MAS);
366 uwb_rsv_state_update(rsv, UWB_RSV_STATE_O_MOVE_REDUCING);
370 rsv->needs_release_companion_mas = false;
371 uwb_drp_avail_reserve(rsv->rc, &rsv->mas);
372 uwb_rsv_state_update(rsv, UWB_RSV_STATE_T_ACCEPTED);
373 uwb_rsv_callback(rsv);
376 uwb_rsv_state_update(rsv, UWB_RSV_STATE_T_DENIED);
379 uwb_rsv_state_update(rsv, UWB_RSV_STATE_T_CONFLICT);
382 uwb_rsv_state_update(rsv, UWB_RSV_STATE_T_PENDING);
385 rsv->needs_release_companion_mas = true;
386 uwb_drp_avail_reserve(rsv->rc, &mv->companion_mas);
387 uwb_rsv_state_update(rsv, UWB_RSV_STATE_T_EXPANDING_ACCEPTED);
390 dev_err(&rsv->rc->uwb_dev.dev, "unhandled state: %s (%d)\n",
397 struct uwb_rsv *rsv = container_of(work, struct uwb_rsv,
399 struct uwb_rc *rc = rsv->rc;
403 uwb_rsv_dump("TO", rsv);
405 switch (rsv->state) {
407 if (rsv->is_multicast) {
408 uwb_rsv_set_state(rsv, UWB_RSV_STATE_O_ESTABLISHED);
413 if (rsv->is_multicast) {
414 uwb_rsv_set_state(rsv, UWB_RSV_STATE_O_MOVE_COMBINING);
419 if (rsv->is_multicast) {
420 uwb_rsv_set_state(rsv, UWB_RSV_STATE_O_MOVE_REDUCING);
425 if (rsv->is_multicast) {
426 uwb_rsv_set_state(rsv, UWB_RSV_STATE_O_ESTABLISHED);
431 if (rsv->is_multicast)
441 uwb_rsv_set_state(rsv, UWB_RSV_STATE_T_ACCEPTED);
442 uwb_drp_avail_release(rsv->rc, &rsv->mv.companion_mas);
448 uwb_rsv_remove(rsv);
456 struct uwb_rsv *rsv;
458 rsv = kzalloc(sizeof(struct uwb_rsv), GFP_KERNEL);
459 if (!rsv)
462 INIT_LIST_HEAD(&rsv->rc_node);
463 INIT_LIST_HEAD(&rsv->pal_node);
464 kref_init(&rsv->kref);
465 init_timer(&rsv->timer);
466 rsv->timer.function = uwb_rsv_timer;
467 rsv->timer.data = (unsigned long)rsv;
469 rsv->rc = rc;
470 INIT_WORK(&rsv->handle_timeout_work, uwb_rsv_handle_timeout_work);
472 return rsv;
490 struct uwb_rsv *rsv;
492 rsv = uwb_rsv_alloc(rc);
493 if (!rsv)
496 rsv->callback = cb;
497 rsv->pal_priv = pal_priv;
499 return rsv;
503 void uwb_rsv_remove(struct uwb_rsv *rsv)
505 uwb_rsv_dump("RM", rsv);
507 if (rsv->state != UWB_RSV_STATE_NONE)
508 uwb_rsv_set_state(rsv, UWB_RSV_STATE_NONE);
510 if (rsv->needs_release_companion_mas)
511 uwb_drp_avail_release(rsv->rc, &rsv->mv.companion_mas);
512 uwb_drp_avail_release(rsv->rc, &rsv->mas);
514 if (uwb_rsv_is_owner(rsv))
515 uwb_rsv_put_stream(rsv);
517 uwb_dev_put(rsv->owner);
518 if (rsv->target.type == UWB_RSV_TARGET_DEV)
519 uwb_dev_put(rsv->target.dev);
521 list_del_init(&rsv->rc_node);
522 uwb_rsv_put(rsv);
527 * @rsv: the reservation to free
531 void uwb_rsv_destroy(struct uwb_rsv *rsv)
533 uwb_rsv_put(rsv);
539 * @rsv: the reservation
541 * The PAL should fill in @rsv's owner, target, type, max_mas,
548 int uwb_rsv_establish(struct uwb_rsv *rsv)
550 struct uwb_rc *rc = rsv->rc;
555 ret = uwb_rsv_get_stream(rsv);
559 rsv->tiebreaker = random32() & 1;
563 ret = uwb_rsv_find_best_allocation(rsv, &available, &rsv->mas);
566 uwb_rsv_put_stream(rsv);
570 ret = uwb_drp_avail_reserve_pending(rc, &rsv->mas);
572 uwb_rsv_put_stream(rsv);
576 uwb_rsv_get(rsv);
577 list_add_tail(&rsv->rc_node, &rc->reservations);
578 rsv->owner = &rc->uwb_dev;
579 uwb_dev_get(rsv->owner);
580 uwb_rsv_set_state(rsv, UWB_RSV_STATE_O_INITIATED);
587 int uwb_rsv_modify(struct uwb_rsv *rsv, int max_mas, int min_mas, int max_interval)
597 int uwb_rsv_try_move(struct uwb_rsv *rsv, struct uwb_mas_bm *available)
599 struct uwb_rc *rc = rsv->rc;
608 mv = &rsv->mv;
610 if (uwb_rsv_find_best_allocation(rsv, available, &mv->final_mas) == UWB_RSV_ALLOC_FOUND) {
612 if (!bitmap_equal(rsv->mas.bm, mv->final_mas.bm, UWB_NUM_MAS)) {
614 bitmap_andnot(mv->companion_mas.bm, mv->final_mas.bm, rsv->mas.bm, UWB_NUM_MAS);
616 uwb_rsv_set_state(rsv, UWB_RSV_STATE_O_MOVE_EXPANDING);
631 struct uwb_rsv *rsv;
637 list_for_each_entry(rsv, &rc->reservations, rc_node) {
638 if (rsv->state == UWB_RSV_STATE_O_ESTABLISHED ||
639 rsv->state == UWB_RSV_STATE_O_TO_BE_MOVED) {
641 bitmap_or(mas.bm, mas.bm, rsv->mas.bm, UWB_NUM_MAS);
642 uwb_rsv_try_move(rsv, &mas);
650 * @rsv: the reservation to terminate
658 void uwb_rsv_terminate(struct uwb_rsv *rsv)
660 struct uwb_rc *rc = rsv->rc;
664 if (rsv->state != UWB_RSV_STATE_NONE)
665 uwb_rsv_set_state(rsv, UWB_RSV_STATE_NONE);
673 * @rsv: the reservation
683 void uwb_rsv_accept(struct uwb_rsv *rsv, uwb_rsv_cb_f cb, void *pal_priv)
685 uwb_rsv_get(rsv);
687 rsv->callback = cb;
688 rsv->pal_priv = pal_priv;
689 rsv->state = UWB_RSV_STATE_T_ACCEPTED;
696 static bool uwb_rsv_match(struct uwb_rsv *rsv, struct uwb_dev *src,
704 if (rsv->stream != stream)
707 switch (rsv->target.type) {
709 return rsv->stream == stream;
712 rsv_src = &rsv->owner->dev_addr;
714 rsv_src = &rsv->target.dev->dev_addr;
724 struct uwb_rsv *rsv;
728 rsv = uwb_rsv_alloc(rc);
729 if (!rsv)
732 rsv->rc = rc;
733 rsv->owner = src;
734 uwb_dev_get(rsv->owner);
735 rsv->target.type = UWB_RSV_TARGET_DEV;
736 rsv->target.dev = &rc->uwb_dev;
738 rsv->type = uwb_ie_drp_type(drp_ie);
739 rsv->stream = uwb_ie_drp_stream_index(drp_ie);
740 uwb_drp_ie_to_bm(&rsv->mas, drp_ie);
746 rsv->state = UWB_RSV_STATE_T_DENIED;
750 pal->new_rsv(pal, rsv);
751 if (rsv->state == UWB_RSV_STATE_T_ACCEPTED)
756 list_add_tail(&rsv->rc_node, &rc->reservations);
757 state = rsv->state;
758 rsv->state = UWB_RSV_STATE_NONE;
761 && uwb_drp_avail_reserve_pending(rc, &rsv->mas) == -EBUSY) {
763 uwb_rsv_set_state(rsv, state);
766 return rsv;
771 * @rsv: the reservation.
777 void uwb_rsv_get_usable_mas(struct uwb_rsv *rsv, struct uwb_mas_bm *mas)
780 bitmap_andnot(mas->bm, rsv->mas.bm, rsv->rc->cnflt_alien_bitmap.bm, UWB_NUM_MAS);
797 struct uwb_rsv *rsv;
799 list_for_each_entry(rsv, &rc->reservations, rc_node) {
800 if (uwb_rsv_match(rsv, src, drp_ie))
801 return rsv;
812 struct uwb_rsv *rsv, *t;
815 list_for_each_entry_safe(rsv, t, &rc->reservations, rc_node) {
816 if (!rsv->ie_valid) {
817 uwb_drp_ie_update(rsv);
875 struct uwb_rsv *rsv;
879 list_for_each_entry(rsv, &rc->reservations, rc_node) {
880 if (rsv->type != UWB_DRP_TYPE_ALIEN_BP) {
881 rsv->callback(rsv);
890 struct uwb_rsv *rsv = (struct uwb_rsv *)arg;
892 queue_work(rsv->rc->rsv_workq, &rsv->handle_timeout_work);
903 struct uwb_rsv *rsv, *t;
906 list_for_each_entry_safe(rsv, t, &rc->reservations, rc_node) {
907 if (rsv->state != UWB_RSV_STATE_NONE)
908 uwb_rsv_set_state(rsv, UWB_RSV_STATE_NONE);
909 del_timer_sync(&rsv->timer);
919 list_for_each_entry_safe(rsv, t, &rc->reservations, rc_node) {
920 uwb_rsv_remove(rsv);