mirror of
https://github.com/genodelabs/genode.git
synced 2025-06-14 05:08:19 +00:00
committed by
Norman Feske
parent
1508fdc276
commit
873eb687b0
@ -55,12 +55,9 @@ class genode_usb_session : public Usb::Session_rpc_object
|
|||||||
|
|
||||||
friend class ::Root;
|
friend class ::Root;
|
||||||
|
|
||||||
enum { MAX_PACKETS_IN_FLY = 32 };
|
enum { MAX_PACKETS_IN_FLY = 10 };
|
||||||
|
|
||||||
struct Packet {
|
Constructible<Usb::Packet_descriptor> packets[MAX_PACKETS_IN_FLY] { };
|
||||||
enum State { FREE, USED } state;
|
|
||||||
Usb::Packet_descriptor pd;
|
|
||||||
} packets[MAX_PACKETS_IN_FLY] { Packet::FREE, {} };
|
|
||||||
|
|
||||||
::Root & _root;
|
::Root & _root;
|
||||||
Attached_dataspace & _ds;
|
Attached_dataspace & _ds;
|
||||||
@ -354,7 +351,7 @@ bool genode_usb_session::request(genode_usb_request_callbacks & req, void * data
|
|||||||
|
|
||||||
/* find free packet slot */
|
/* find free packet slot */
|
||||||
for (idx = 0; idx < MAX_PACKETS_IN_FLY; idx++) {
|
for (idx = 0; idx < MAX_PACKETS_IN_FLY; idx++) {
|
||||||
if (packets[idx].state == Packet::FREE)
|
if (!packets[idx].constructed())
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (idx == MAX_PACKETS_IN_FLY)
|
if (idx == MAX_PACKETS_IN_FLY)
|
||||||
@ -389,20 +386,17 @@ bool genode_usb_session::request(genode_usb_request_callbacks & req, void * data
|
|||||||
addr, p.size(), data), p);
|
addr, p.size(), data), p);
|
||||||
break;
|
break;
|
||||||
case Packet_descriptor::BULK:
|
case Packet_descriptor::BULK:
|
||||||
packets[idx].state = Packet::USED;
|
packets[idx].construct(p);
|
||||||
packets[idx].pd = p;
|
|
||||||
req.transfer_fn((genode_usb_request_transfer*)&p.transfer, BULK,
|
req.transfer_fn((genode_usb_request_transfer*)&p.transfer, BULK,
|
||||||
_id, idx, addr, p.size(), data);
|
_id, idx, addr, p.size(), data);
|
||||||
break;
|
break;
|
||||||
case Packet_descriptor::IRQ:
|
case Packet_descriptor::IRQ:
|
||||||
packets[idx].state = Packet::USED;
|
packets[idx].construct(p);
|
||||||
packets[idx].pd = p;
|
|
||||||
req.transfer_fn((genode_usb_request_transfer*)&p.transfer, IRQ,
|
req.transfer_fn((genode_usb_request_transfer*)&p.transfer, IRQ,
|
||||||
_id, idx, addr, p.size(), data);
|
_id, idx, addr, p.size(), data);
|
||||||
break;
|
break;
|
||||||
case Packet_descriptor::ISOC:
|
case Packet_descriptor::ISOC:
|
||||||
packets[idx].state = Packet::USED;
|
packets[idx].construct(p);
|
||||||
packets[idx].pd = p;
|
|
||||||
req.transfer_fn((genode_usb_request_transfer*)&p.transfer, ISOC,
|
req.transfer_fn((genode_usb_request_transfer*)&p.transfer, ISOC,
|
||||||
_id, idx, addr, p.size(), data);
|
_id, idx, addr, p.size(), data);
|
||||||
break;
|
break;
|
||||||
@ -429,9 +423,10 @@ void genode_usb_session::handle_response(genode_usb_request_handle_t id,
|
|||||||
genode_usb_response_t callback,
|
genode_usb_response_t callback,
|
||||||
void * callback_data)
|
void * callback_data)
|
||||||
{
|
{
|
||||||
Usb::Packet_descriptor p = packets[id].pd;
|
Usb::Packet_descriptor p = *packets[id];
|
||||||
_ack(callback((genode_usb_request_transfer*)&p.transfer, callback_data), p);
|
_ack(callback((genode_usb_request_transfer*)&p.transfer,
|
||||||
packets[id].state = Packet::FREE;
|
callback_data), p);
|
||||||
|
packets[id].destruct();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user