usb-bus c -> c++ wip

Change-Id: I08fff42facc2dcf8b23ebadaee6015bf16353d23
diff --git a/system/dev/usb/usb-bus/rules.mk b/system/dev/usb/usb-bus/rules.mk
index d9c0df6..34fd27d 100644
--- a/system/dev/usb/usb-bus/rules.mk
+++ b/system/dev/usb/usb-bus/rules.mk
@@ -9,13 +9,14 @@
 MODULE_TYPE := driver
 
 MODULE_SRCS := \
-    $(LOCAL_DIR)/usb-bus.c \
-    $(LOCAL_DIR)/usb-device.c \
-    $(LOCAL_DIR)/util.c \
+    $(LOCAL_DIR)/usb-bus.cpp \
+    $(LOCAL_DIR)/usb-device.cpp \
+    $(LOCAL_DIR)/util.cpp \
 
 MODULE_STATIC_LIBS := \
     system/dev/lib/usb \
     system/ulib/ddk \
+    system/ulib/fbl \
     system/ulib/fidl \
     system/ulib/sync \
     system/ulib/utf_conversion \
diff --git a/system/dev/usb/usb-bus/usb-bus.c b/system/dev/usb/usb-bus/usb-bus.cpp
similarity index 87%
rename from system/dev/usb/usb-bus/usb-bus.c
rename to system/dev/usb/usb-bus/usb-bus.cpp
index c7618b7..29d9506 100644
--- a/system/dev/usb/usb-bus/usb-bus.c
+++ b/system/dev/usb/usb-bus/usb-bus.cpp
@@ -14,7 +14,7 @@
 
 static zx_status_t bus_add_device(void* ctx, uint32_t device_id, uint32_t hub_id,
                                       usb_speed_t speed) {
-    usb_bus_t* bus = ctx;
+    auto* bus = static_cast<usb_bus_t*>(ctx);
 
     if (device_id >= bus->max_device_count) return ZX_ERR_INVALID_ARGS;
 
@@ -24,7 +24,7 @@
 }
 
 static zx_status_t bus_remove_device(void* ctx, uint32_t device_id) {
-    usb_bus_t* bus = ctx;
+    auto* bus = static_cast<usb_bus_t*>(ctx);
     if (device_id >= bus->max_device_count) {
         zxlogf(ERROR, "device_id out of range in usb_bus_remove_device\n");
         return ZX_ERR_INVALID_ARGS;
@@ -39,7 +39,7 @@
 }
 
 static zx_status_t bus_reset_hub_port(void* ctx, uint32_t hub_id, uint32_t port) {
-    usb_bus_t* bus = ctx;
+    auto* bus = static_cast<usb_bus_t*>(ctx);
     if (hub_id >= bus->max_device_count) {
         zxlogf(ERROR, "hub_id out of range in usb_bus_reset_hub_port\n");
         return ZX_ERR_INVALID_ARGS;
@@ -73,7 +73,7 @@
 
 static zx_status_t bus_configure_hub(void* ctx, zx_device_t* hub_device, usb_speed_t speed,
                                      const usb_hub_descriptor_t* desc) {
-    usb_bus_t* bus = ctx;
+    auto* bus = static_cast<usb_bus_t*>(ctx);
     uint32_t hub_id;
     if (bus_get_device_id(hub_device, &hub_id) != ZX_OK) {
         return ZX_ERR_INTERNAL;
@@ -83,7 +83,7 @@
 
 static zx_status_t bus_device_added(void* ctx, zx_device_t* hub_device, uint32_t port,
                                     usb_speed_t speed) {
-    usb_bus_t* bus = ctx;
+    auto* bus = static_cast<usb_bus_t*>(ctx);
     uint32_t hub_id;
     if (bus_get_device_id(hub_device, &hub_id) != ZX_OK) {
         return ZX_ERR_INTERNAL;
@@ -92,7 +92,7 @@
 }
 
 static zx_status_t bus_device_removed(void* ctx, zx_device_t* hub_device, uint32_t port) {
-    usb_bus_t* bus = ctx;
+    auto* bus = static_cast<usb_bus_t*>(ctx);
     uint32_t hub_id;
     if (bus_get_device_id(hub_device, &hub_id) != ZX_OK) {
         return ZX_ERR_INTERNAL;
@@ -102,7 +102,7 @@
 
 static zx_status_t bus_set_hub_interface(void* ctx, zx_device_t* usb_device,
                                          const usb_hub_interface_t* hub) {
-    usb_bus_t* bus = ctx;
+    auto* bus = static_cast<usb_bus_t*>(ctx);
     uint32_t usb_device_id;
     if (bus_get_device_id(usb_device, &usb_device_id) != ZX_OK) {
         return ZX_ERR_INTERNAL;
@@ -125,7 +125,7 @@
 
 static void usb_bus_unbind(void* ctx) {
     zxlogf(INFO, "usb_bus_unbind\n");
-    usb_bus_t* bus = ctx;
+    auto* bus = static_cast<usb_bus_t*>(ctx);
     usb_hci_set_bus_interface(&bus->hci, NULL);
 
     for (size_t i = 0; i < bus->max_device_count; i++) {
@@ -140,19 +140,21 @@
 
 static void usb_bus_release(void* ctx) {
     zxlogf(INFO, "usb_bus_release\n");
-    usb_bus_t* bus = ctx;
+    auto* bus = static_cast<usb_bus_t*>(ctx);
     free(bus->devices);
     free(bus);
 }
 
-static zx_protocol_device_t usb_bus_device_proto = {
-    .version = DEVICE_OPS_VERSION,
-    .unbind = usb_bus_unbind,
-    .release = usb_bus_release,
-};
+static zx_protocol_device_t usb_bus_device_proto = [](){
+    zx_protocol_device_t proto;
+    proto.version = DEVICE_OPS_VERSION;
+    proto.unbind = usb_bus_unbind;
+    proto.release = usb_bus_release;
+    return proto;
+}();
 
 static zx_status_t usb_bus_bind(void* ctx, zx_device_t* device) {
-    usb_bus_t* bus = calloc(1, sizeof(usb_bus_t));
+    auto* bus = static_cast<usb_bus_t*>(calloc(1, sizeof(usb_bus_t)));
     if (!bus) {
         zxlogf(ERROR, "Not enough memory for usb_bus_t.\n");
         return ZX_ERR_NO_MEMORY;
@@ -165,7 +167,7 @@
 
     bus->hci_zxdev = device;
     bus->max_device_count = usb_hci_get_max_device_count(&bus->hci);
-    bus->devices = calloc(bus->max_device_count, sizeof(usb_device_t *));
+    bus->devices = static_cast<usb_device_t**>(calloc(bus->max_device_count, sizeof(usb_device_t *)));
     if (!bus->devices) {
         zxlogf(ERROR, "Not enough memory for usb_bus_t->devices. max_device_count: %zu\n",
                bus->max_device_count);
diff --git a/system/dev/usb/usb-bus/usb-device.c b/system/dev/usb/usb-bus/usb-device.cpp
similarity index 93%
rename from system/dev/usb/usb-bus/usb-device.c
rename to system/dev/usb/usb-bus/usb-device.cpp
index a674369..013db48 100644
--- a/system/dev/usb/usb-bus/usb-device.c
+++ b/system/dev/usb/usb-bus/usb-device.cpp
@@ -93,7 +93,7 @@
 
 // usb request completion for the requests passed down to the HCI driver
 static void request_complete(void* ctx, usb_request_t* req) {
-    usb_device_t* dev = ctx;
+    auto* dev = static_cast<usb_device_t*>(ctx);
 
     mtx_lock(&dev->callback_lock);
     // move original request to completed_reqs list so it can be completed on the callback_thread
@@ -133,12 +133,12 @@
 }
 
 static void usb_device_unbind(void* ctx) {
-    usb_device_t* dev = ctx;
+    auto* dev = static_cast<usb_device_t*>(ctx);
     device_remove(dev->zxdev);
 }
 
 static void usb_device_release(void* ctx) {
-    usb_device_t* dev = ctx;
+    auto* dev = static_cast<usb_device_t*>(ctx);
 
     stop_callback_thread(dev);
 
@@ -159,7 +159,7 @@
 static zx_status_t usb_device_control(void* ctx, uint8_t request_type, uint8_t request,
                                       uint16_t value, uint16_t index, void* data, size_t length,
                                       zx_time_t timeout, size_t* out_length) {
-    usb_device_t* dev = ctx;
+    auto* dev = static_cast<usb_device_t*>(ctx);
 
     usb_request_t* req = NULL;
     bool use_free_list = length == 0;
@@ -234,7 +234,7 @@
 
 static void usb_device_request_queue(void* ctx, usb_request_t* req, usb_request_complete_cb cb,
                                      void* cookie) {
-    usb_device_t* dev = ctx;
+    auto* dev = static_cast<usb_device_t*>(ctx);
 
     usb_device_req_internal_t* req_int = USB_REQ_TO_DEV_INTERNAL(req, dev->parent_req_size);
     req_int->complete_cb = cb;
@@ -258,24 +258,24 @@
 }
 
 static usb_speed_t usb_device_get_speed(void* ctx) {
-    usb_device_t* dev = ctx;
+    auto* dev = static_cast<usb_device_t*>(ctx);
     return dev->speed;
 }
 
 static zx_status_t usb_device_set_interface(void* ctx, uint8_t interface_number,
                                             uint8_t alt_setting) {
-    usb_device_t* dev = ctx;
+    auto* dev = static_cast<usb_device_t*>(ctx);
     return usb_util_control(dev, USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_INTERFACE,
                             USB_REQ_SET_INTERFACE, alt_setting, interface_number, NULL, 0);
 }
 
 static uint8_t usb_device_get_configuration(void* ctx) {
-    usb_device_t* dev = ctx;
+    auto* dev = static_cast<usb_device_t*>(ctx);
     return dev->config_descs[dev->current_config_index]->bConfigurationValue;
 }
 
 static zx_status_t usb_device_set_configuration(void* ctx, uint8_t configuration) {
-    usb_device_t* dev = ctx;
+    auto* dev = static_cast<usb_device_t*>(ctx);
     for (uint8_t i = 0; i < dev->num_configurations; i++) {
         usb_configuration_descriptor_t* descriptor = dev->config_descs[i];
         if (descriptor->bConfigurationValue == configuration) {
@@ -294,34 +294,34 @@
 static zx_status_t usb_device_enable_endpoint(void* ctx, usb_endpoint_descriptor_t* ep_desc,
                                               usb_ss_ep_comp_descriptor_t* ss_comp_desc,
                                               bool enable) {
-    usb_device_t* dev = ctx;
+    auto* dev = static_cast<usb_device_t*>(ctx);
     return usb_hci_enable_endpoint(&dev->hci, dev->device_id, ep_desc, ss_comp_desc, enable);
 }
 
 static zx_status_t usb_device_reset_endpoint(void* ctx, uint8_t ep_address) {
-    usb_device_t* dev = ctx;
+    auto* dev = static_cast<usb_device_t*>(ctx);
     return usb_hci_reset_endpoint(&dev->hci, dev->device_id, ep_address);
 }
 
 static size_t usb_device_get_max_transfer_size(void* ctx, uint8_t ep_address) {
-    usb_device_t* dev = ctx;
+    auto* dev = static_cast<usb_device_t*>(ctx);
     return usb_hci_get_max_transfer_size(&dev->hci, dev->device_id, ep_address);
 }
 
 static uint32_t _usb_device_get_device_id(void* ctx) {
-    usb_device_t* dev = ctx;
+    auto* dev = static_cast<usb_device_t*>(ctx);
     return dev->device_id;
 }
 
 static void usb_device_get_device_descriptor(void* ctx, usb_device_descriptor_t* out_desc) {
-    usb_device_t* dev = ctx;
+    auto* dev = static_cast<usb_device_t*>(ctx);
     memcpy(out_desc, &dev->device_desc, sizeof(usb_device_descriptor_t));
 }
 
 static zx_status_t usb_device_get_configuration_descriptor(void* ctx, uint8_t configuration,
                                                            usb_configuration_descriptor_t** out,
                                                            size_t* out_length) {
-    usb_device_t* dev = ctx;
+    auto* dev = static_cast<usb_device_t*>(ctx);
     for (int i = 0; i <  dev->num_configurations; i++) {
         usb_configuration_descriptor_t* config_desc = dev->config_descs[i];
         if (config_desc->bConfigurationValue == configuration) {
@@ -343,7 +343,7 @@
 
 static zx_status_t usb_device_get_descriptor_list(void* ctx, void** out_descriptors,
                                                   size_t* out_length) {
-    usb_device_t* dev = ctx;
+    auto* dev = static_cast<usb_device_t*>(ctx);
     usb_configuration_descriptor_t* config_desc = dev->config_descs[dev->current_config_index];
     size_t length = le16toh(config_desc->wTotalLength);
 
@@ -362,23 +362,23 @@
 zx_status_t usb_device_get_string_descriptor(void* ctx, uint8_t desc_id, uint16_t lang_id,
                                              uint8_t* buf, size_t buflen, size_t* out_actual,
                                              uint16_t* out_actual_lang_id) {
-    usb_device_t* dev = ctx;
+    auto* dev = static_cast<usb_device_t*>(ctx);
     return usb_util_get_string_descriptor(dev, desc_id, lang_id, buf, buflen,
                                           out_actual, out_actual_lang_id);
 }
 
 static zx_status_t usb_device_cancel_all(void* ctx, uint8_t ep_address) {
-    usb_device_t* dev = ctx;
+    auto* dev = static_cast<usb_device_t*>(ctx);
     return usb_hci_cancel_all(&dev->hci, dev->device_id, ep_address);
 }
 
 static uint64_t usb_device_get_current_frame(void* ctx) {
-    usb_device_t* dev = ctx;
+    auto* dev = static_cast<usb_device_t*>(ctx);
     return usb_hci_get_current_frame(&dev->hci);
 }
 
 static size_t usb_device_get_request_size(void* ctx) {
-    usb_device_t* dev = ctx;
+    auto* dev = static_cast<usb_device_t*>(ctx);
     return dev->req_size;
 }
 
@@ -404,17 +404,17 @@
 };
 
 static zx_status_t fidl_GetDeviceSpeed(void* ctx, fidl_txn_t* txn) {
-    usb_device_t* dev = ctx;
+    auto* dev = static_cast<usb_device_t*>(ctx);
     return zircon_usb_device_DeviceGetDeviceSpeed_reply(txn, dev->speed);
 }
 
 static zx_status_t fidl_GetDeviceDescriptor(void* ctx, fidl_txn_t* txn) {
-    usb_device_t* dev = ctx;
+    auto* dev = static_cast<usb_device_t*>(ctx);
     return zircon_usb_device_DeviceGetDeviceDescriptor_reply(txn, (uint8_t*)&dev->device_desc);
 }
 
 static zx_status_t fidl_GetConfigurationDescriptorSize(void* ctx, uint8_t config, fidl_txn_t* txn) {
-    usb_device_t* dev = ctx;
+    auto* dev = static_cast<usb_device_t*>(ctx);
     usb_configuration_descriptor_t* descriptor = get_config_desc(dev, config);
     if (!descriptor) {
         return zircon_usb_device_DeviceGetConfigurationDescriptorSize_reply(txn,
@@ -426,7 +426,7 @@
 }
 
 static zx_status_t fidl_GetConfigurationDescriptor(void* ctx, uint8_t config, fidl_txn_t* txn) {
-    usb_device_t* dev = ctx;
+    auto* dev = static_cast<usb_device_t*>(ctx);
     usb_configuration_descriptor_t* descriptor = get_config_desc(dev, config);
     if (!descriptor) {
         return zircon_usb_device_DeviceGetConfigurationDescriptor_reply(txn, ZX_ERR_INVALID_ARGS,
@@ -440,7 +440,7 @@
 
 static zx_status_t fidl_GetStringDescriptor(void* ctx, uint8_t desc_id, uint16_t lang_id,
                                             fidl_txn_t* txn) {
-    usb_device_t* dev = ctx;
+    auto* dev = static_cast<usb_device_t*>(ctx);
     uint8_t buffer[zircon_usb_device_MAX_STRING_DESC_SIZE];
     size_t actual;
     zx_status_t status = usb_util_get_string_descriptor(dev, desc_id, lang_id, buffer,
@@ -450,29 +450,29 @@
 
 static zx_status_t fidl_SetInterface(void* ctx, uint8_t interface_number, uint8_t alt_setting,
                                      fidl_txn_t* txn) {
-    usb_device_t* dev = ctx;
+    auto* dev = static_cast<usb_device_t*>(ctx);
     zx_status_t status = usb_device_set_interface(dev, interface_number, alt_setting);
     return zircon_usb_device_DeviceSetInterface_reply(txn, status);
 }
 
 static zx_status_t fidl_GetDeviceId(void* ctx, fidl_txn_t* txn) {
-    usb_device_t* dev = ctx;
+    auto* dev = static_cast<usb_device_t*>(ctx);
     return zircon_usb_device_DeviceGetDeviceId_reply(txn, dev->device_id);
 }
 
 static zx_status_t fidl_GetHubDeviceId(void* ctx, fidl_txn_t* txn) {
-    usb_device_t* dev = ctx;
+    auto* dev = static_cast<usb_device_t*>(ctx);
     return zircon_usb_device_DeviceGetHubDeviceId_reply(txn, dev->hub_id);
 }
 
 static zx_status_t fidl_GetConfiguration(void* ctx, fidl_txn_t* txn) {
-    usb_device_t* dev = ctx;
+    auto* dev = static_cast<usb_device_t*>(ctx);
     usb_configuration_descriptor_t* descriptor = dev->config_descs[dev->current_config_index];
     return zircon_usb_device_DeviceGetConfiguration_reply(txn, descriptor->bConfigurationValue);
 }
 
 static zx_status_t fidl_SetConfiguration(void* ctx, uint8_t configuration, fidl_txn_t* txn) {
-    usb_device_t* dev = ctx;
+    auto* dev = static_cast<usb_device_t*>(ctx);
     zx_status_t status = usb_device_set_configuration(dev, configuration);
     return zircon_usb_device_DeviceSetConfiguration_reply(txn, status);
 }
diff --git a/system/dev/usb/usb-bus/usb-device.h b/system/dev/usb/usb-bus/usb-device.h
index 69516f3..e969033 100644
--- a/system/dev/usb/usb-bus/usb-device.h
+++ b/system/dev/usb/usb-bus/usb-device.h
@@ -9,12 +9,12 @@
 #include <ddk/protocol/usb/hci.h>
 #include <ddk/protocol/usb/hub.h>
 #include <ddk/protocol/usb-old.h>
+#include <fbl/atomic.h>
 #include <usb/usb-request.h>
 #include <lib/sync/completion.h>
 #include <zircon/hw/usb.h>
 
 #include <threads.h>
-#include <stdatomic.h>
 
 typedef struct usb_bus usb_bus_t;
 
@@ -39,8 +39,8 @@
     uint8_t current_config_index;
     uint8_t num_configurations;
 
-    atomic_bool langids_fetched;
-    atomic_uintptr_t lang_ids;
+    fbl::atomic<bool> langids_fetched;
+    fbl::atomic<uintptr_t> lang_ids;
 
     // thread for calling client's usb request complete callback
     thrd_t callback_thread;
diff --git a/system/dev/usb/usb-bus/util.c b/system/dev/usb/usb-bus/util.cpp
similarity index 94%
rename from system/dev/usb/usb-bus/util.c
rename to system/dev/usb/usb-bus/util.cpp
index 5c556f6..75cd06f 100644
--- a/system/dev/usb/usb-bus/util.c
+++ b/system/dev/usb/usb-bus/util.cpp
@@ -28,7 +28,8 @@
 }
 
 zx_status_t usb_util_control(usb_device_t* dev, uint8_t request_type, uint8_t request,
-                             uint16_t value, uint16_t index, void* data, size_t length) {
+                             uint16_t value, uint16_t index, void* data, size_t length,
+                             size_t* out_actual) {
     usb_request_t* req = NULL;
     bool use_free_list = length == 0;
     if (use_free_list) {
@@ -43,9 +44,9 @@
     usb_setup_t* setup = &req->setup;
     setup->bmRequestType = request_type;
     setup->bRequest = request;
-    setup->wValue = value;
-    setup->wIndex = index;
-    setup->wLength = length;
+    setup->wValue = htole16(value);
+    setup->wIndex = htole16(index);
+    setup->wLength = htole16(static_cast<uint16_t>(length));
     req->header.device_id = dev->device_id;
 
     bool out = !!((request_type & USB_DIR_MASK) == USB_DIR_OUT);
@@ -53,7 +54,7 @@
         usb_request_copy_to(req, data, length, 0);
     }
 
-    sync_completion_t completion = SYNC_COMPLETION_INIT;
+    sync_completion_t completion;
 
     req->header.length = length;
 
@@ -104,7 +105,7 @@
     //  If we have never attempted to load our language ID table, do so now.
     zx_status_t result;
     if (!atomic_load_explicit(&dev->langids_fetched, memory_order_relaxed)) {
-        usb_langid_desc_t* id_desc = calloc(1, sizeof(usb_langid_desc_t));
+        auto* id_desc = static_cast<usb_langid_desc_t*>(calloc(1, sizeof(usb_langid_desc_t)));
 
         if (id_desc != NULL) {
             result = usb_util_get_descriptor(dev, USB_DT_STRING, 0, 0, id_desc, sizeof(*id_desc));
@@ -155,7 +156,7 @@
     // tried to obtain or synthesize one in the past, we are not going to get
     // one.  Just fail.
     usb_langid_desc_t* lang_ids =
-        (usb_langid_desc_t*)(atomic_load_explicit(&dev->lang_ids, memory_order_relaxed));
+        (usb_langid_desc_t*)(dev->lang_ids.load(memory_order_relaxed));
     if (!lang_ids) {
         return ZX_ERR_BAD_STATE;
     }