| 672 | } |
| 673 | |
| 674 | static int _chn0_actor(unsigned char *dp, size_t dsize) |
| 675 | { |
| 676 | if (*dp != RT_VBUS_CHN0_CMD_SUSPEND && *dp != RT_VBUS_CHN0_CMD_RESUME) |
| 677 | vbus_verbose("local <-- %s\n", dump_cmd_pkt(dp, dsize)); |
| 678 | |
| 679 | switch (*dp) |
| 680 | { |
| 681 | case RT_VBUS_CHN0_CMD_ENABLE: |
| 682 | { |
| 683 | int i, chnr; |
| 684 | rt_err_t err; |
| 685 | unsigned char *resp; |
| 686 | |
| 687 | i = _sess_find(dp+1, SESSIOM_LISTENING); |
| 688 | if (i == ARRAY_SIZE(_sess)) |
| 689 | { |
| 690 | _chn0_nak(dsize, dp); |
| 691 | break; |
| 692 | } |
| 693 | |
| 694 | for (chnr = 0; chnr < ARRAY_SIZE(_chn_status); chnr++) |
| 695 | { |
| 696 | if (_chn_status[chnr] == RT_VBUS_CHN_ST_AVAILABLE) |
| 697 | break; |
| 698 | } |
| 699 | if (chnr == ARRAY_SIZE(_chn_status)) |
| 700 | { |
| 701 | _chn0_nak(dsize, dp); |
| 702 | break; |
| 703 | } |
| 704 | |
| 705 | resp = rt_malloc(dsize + 1); |
| 706 | if (!resp) |
| 707 | break; |
| 708 | |
| 709 | *resp = RT_VBUS_CHN0_CMD_SET; |
| 710 | rt_memcpy(resp+1, dp+1, dsize-1); |
| 711 | resp[dsize] = chnr; |
| 712 | |
| 713 | rt_vbus_set_recv_wm(chnr, _sess[i].req->recv_wm.low, _sess[i].req->recv_wm.high); |
| 714 | rt_vbus_set_post_wm(chnr, _sess[i].req->post_wm.low, _sess[i].req->post_wm.high); |
| 715 | |
| 716 | vbus_verbose("%s --> remote\n", dump_cmd_pkt(resp, dsize+1)); |
| 717 | err = _chn0_post(resp, dsize+1, RT_WAITING_FOREVER); |
| 718 | |
| 719 | if (err == RT_EOK) |
| 720 | { |
| 721 | _sess[i].st = SESSIOM_ESTABLISHING; |
| 722 | vbus_debug("set sess %d st: %s\n", i, |
| 723 | rt_vbus_sess_st2str[_sess[i].st]); |
| 724 | _sess[i].chnr = chnr; |
| 725 | _chn_status[chnr] = RT_VBUS_CHN_ST_ESTABLISHING; |
| 726 | } |
| 727 | rt_free(resp); |
| 728 | } |
| 729 | break; |
| 730 | case RT_VBUS_CHN0_CMD_SET: |
| 731 | { |
no test coverage detected