diff --git a/repos/os/src/drivers/ahci/README b/repos/os/src/drivers/ahci/README index 01447b37d3..e112014ba8 100644 --- a/repos/os/src/drivers/ahci/README +++ b/repos/os/src/drivers/ahci/README @@ -17,7 +17,7 @@ which client can access a certain device: ! ! ! -! +! ! ! ! @@ -27,4 +27,5 @@ which client can access a certain device: In the example above, a session request labeled with "test-ahci" gains access to a device with certain model and serial numbers, while "bench" gains access to -device at port 1. +device at port 1. ATAPI support is by default disabled and can be enabled by +setting the config attribute "atapi" to "yes". diff --git a/repos/os/src/drivers/ahci/ahci.cc b/repos/os/src/drivers/ahci/ahci.cc index 9feec71d74..9a27dfda82 100644 --- a/repos/os/src/drivers/ahci/ahci.cc +++ b/repos/os/src/drivers/ahci/ahci.cc @@ -49,10 +49,12 @@ struct Ahci Signal_rpc_member irq; Signal_rpc_member device_ready; unsigned ready_count = 0; + bool enable_atapi; - Ahci(Ahci_root &root) + Ahci(Ahci_root &root, bool support_atapi) : root(root), irq(root.entrypoint(), *this, &Ahci::handle_irq), - device_ready(root.entrypoint(), *this, &Ahci::ready) + device_ready(root.entrypoint(), *this, &Ahci::ready), + enable_atapi(support_atapi) { info(); @@ -68,7 +70,7 @@ struct Ahci bool atapi(unsigned sig) { - return sig == ATAPI_SIG_QEMU || sig == ATAPI_SIG; + return enable_atapi && (sig == ATAPI_SIG_QEMU || sig == ATAPI_SIG); } bool ata(unsigned sig) @@ -208,9 +210,9 @@ static Ahci *sata_ahci(Ahci *ahci = 0) } -void Ahci_driver::init(Ahci_root &root) +void Ahci_driver::init(Ahci_root &root, bool support_atapi) { - static Ahci ahci(root); + static Ahci ahci(root, support_atapi); sata_ahci(&ahci); } diff --git a/repos/os/src/drivers/ahci/ahci.h b/repos/os/src/drivers/ahci/ahci.h index a316a31d11..ff7e152310 100644 --- a/repos/os/src/drivers/ahci/ahci.h +++ b/repos/os/src/drivers/ahci/ahci.h @@ -36,7 +36,7 @@ struct Ahci_root namespace Ahci_driver { - void init(Ahci_root &ep); + void init(Ahci_root &ep, bool support_atapi); bool avail(long device_num); long device_number(char const *model_num, char const *serial_num); diff --git a/repos/os/src/drivers/ahci/main.cc b/repos/os/src/drivers/ahci/main.cc index c7e2e9b114..455cff9d9a 100644 --- a/repos/os/src/drivers/ahci/main.cc +++ b/repos/os/src/drivers/ahci/main.cc @@ -155,7 +155,8 @@ struct Main : root(ep, Genode::env()->heap()) { PINF("--- Starting AHCI driver -> done right .-) --\n"); - Ahci_driver::init(root); + bool support_atapi = Genode::config()->xml_node().attribute_value("atapi", false); + Ahci_driver::init(root, support_atapi); } };