ATAPI driver support for re-opening sessions

The probing and I/O resource allocation is done only once at the
creation time of the first session. When closing and re-opening the
session, the '_device' object is simply reused. This patch fixes #92.
This commit is contained in:
Norman Feske 2012-01-25 12:58:41 +01:00
parent b1b59fe8a6
commit 834f433222
1 changed files with 11 additions and 9 deletions

View File

@ -147,7 +147,6 @@ namespace Block {
_startup_sema.down();
}
void info(Genode::size_t *blk_count, Genode::size_t *blk_size,
Operations *ops)
{
@ -183,6 +182,7 @@ namespace Block {
private:
Genode::Rpc_entrypoint &_ep;
Ata::Device *_device;
protected:
@ -223,31 +223,33 @@ namespace Block {
catch (...) {}
int type = probe_ata ? REG_CONFIG_TYPE_ATA : REG_CONFIG_TYPE_ATAPI;
/*
* Probe for ATA(PI) device
*/
Ata::Device *device = Ata::Device::probe_legacy(type);
if (!device) {
/*
* Probe for ATA(PI) device, but only once
*/
if (!_device)
_device = Ata::Device::probe_legacy(type);
if (!_device) {
PERR("No device present");
throw Root::Unavailable();
}
if (Atapi_device *atapi_device = dynamic_cast<Atapi_device *>(device))
if (Atapi_device *atapi_device = dynamic_cast<Atapi_device *>(_device))
if (!atapi_device->test_unit_ready()) {
PERR("No disc present");
throw Root::Unavailable();
}
return new (md_alloc())
Session_component(env()->ram_session()->alloc(tx_buf_size), _ep, device);
Session_component(env()->ram_session()->alloc(tx_buf_size), _ep, _device);
}
public:
Root(Genode::Rpc_entrypoint *session_ep,
Genode::Allocator *md_alloc)
: Root_component(session_ep, md_alloc), _ep(*session_ep) { }
: Root_component(session_ep, md_alloc), _ep(*session_ep), _device(0) { }
};
}