Increase drive strength, fix driver binding, add logging

Change-Id: I3d7dd5e163841c54bbcd967e74905a784f1d8322
diff --git a/boards/vim3.gni b/boards/vim3.gni
index bae9308..4d781ff 100644
--- a/boards/vim3.gni
+++ b/boards/vim3.gni
@@ -42,6 +42,7 @@
 board_system_image_deps += [
   "//garnet/packages/prod:magma-arm-mali-system",
   "//garnet/packages/prod:magma-vsi-vip",
+  "//src/connectivity/wlan/drivers/third_party/broadcom/brcmfmac:brcmfmac-sherlock",
   "//src/media/drivers/amlogic_decoder",
 ]
 
diff --git a/src/devices/block/drivers/aml-sdmmc/aml-sdmmc.cc b/src/devices/block/drivers/aml-sdmmc/aml-sdmmc.cc
index bde93f6..ee284f6 100644
--- a/src/devices/block/drivers/aml-sdmmc/aml-sdmmc.cc
+++ b/src/devices/block/drivers/aml-sdmmc/aml-sdmmc.cc
@@ -110,18 +110,39 @@
 
   if (rxd_err) {
     if (req->probe_tuning_cmd) {
-      AML_SDMMC_ERROR("RX Data CRC Error cmd%d, status=0x%x, RXD_ERR:%d", req->cmd_idx,
-                      status_irq.reg_value(), rxd_err);
+      
+      AML_SDMMC_TRACE("RX Data CRC Error cmd%d (%zu), arg=0x%08x, status=0x%08x", req->cmd_idx,
+                      request_count_, req->arg, status_irq.reg_value());
     } else {
       AML_SDMMC_ERROR("RX Data CRC Error cmd%d, status=0x%x, RXD_ERR:%d", req->cmd_idx,
                       status_irq.reg_value(), rxd_err);
+	AML_SDMMC_ERROR("Current: 0x%08x 0x%08x 0x%08x 0x%08x",
+                      AmlSdmmcCurCfg::Get().ReadFrom(&mmio_).reg_value(),
+                      AmlSdmmcCurArg::Get().ReadFrom(&mmio_).reg_value(),
+                      AmlSdmmcCurDat::Get().ReadFrom(&mmio_).reg_value(),
+                      AmlSdmmcCurResp::Get().ReadFrom(&mmio_).reg_value());
+      AML_SDMMC_ERROR("Next: 0x%08x 0x%08x 0x%08x 0x%08x",
+                      AmlSdmmcNextCfg::Get().ReadFrom(&mmio_).reg_value(),
+                      AmlSdmmcNextArg::Get().ReadFrom(&mmio_).reg_value(),
+                      AmlSdmmcNextDat::Get().ReadFrom(&mmio_).reg_value(),
+                      AmlSdmmcNextResp::Get().ReadFrom(&mmio_).reg_value());		    
     }
     return ZX_ERR_IO_DATA_INTEGRITY;
   }
   if (status_irq.txd_err()) {
-    AML_SDMMC_ERROR("TX Data CRC Error, cmd%d, status=0x%x TXD_ERR", req->cmd_idx,
-                    status_irq.reg_value());
-    return ZX_ERR_IO_DATA_INTEGRITY;
+   AML_SDMMC_ERROR("TX Data CRC Error, cmd%d (%zu), arg=0x%08x, status=0x%08x", req->cmd_idx,
+                    request_count_, req->arg, status_irq.reg_value());
+      AML_SDMMC_ERROR("Current: 0x%08x 0x%08x 0x%08x 0x%08x",
+                    AmlSdmmcCurCfg::Get().ReadFrom(&mmio_).reg_value(),
+                    AmlSdmmcCurArg::Get().ReadFrom(&mmio_).reg_value(),
+                    AmlSdmmcCurDat::Get().ReadFrom(&mmio_).reg_value(),
+                    AmlSdmmcCurResp::Get().ReadFrom(&mmio_).reg_value());
+    AML_SDMMC_ERROR("Next: 0x%08x 0x%08x 0x%08x 0x%08x",
+                    AmlSdmmcNextCfg::Get().ReadFrom(&mmio_).reg_value(),
+                    AmlSdmmcNextArg::Get().ReadFrom(&mmio_).reg_value(),
+                    AmlSdmmcNextDat::Get().ReadFrom(&mmio_).reg_value(),
+                    AmlSdmmcNextResp::Get().ReadFrom(&mmio_).reg_value()); 
+   return ZX_ERR_IO_DATA_INTEGRITY;
   }
   if (status_irq.desc_err()) {
     AML_SDMMC_ERROR("Controller does not own the descriptor, cmd%d, status=0x%x", req->cmd_idx,
@@ -373,6 +394,7 @@
                             .set_resp_timeout(AmlSdmmcCfg::kDefaultRespTimeout)
                             .set_rc_cc(AmlSdmmcCfg::kDefaultRcCc)
                             .set_bus_width(AmlSdmmcCfg::kBusWidth1Bit)
+			   // .set_auto_clk(1)
                             .reg_value();
   AmlSdmmcCfg::Get().ReadFrom(&mmio_).set_reg_value(config_val).WriteTo(&mmio_);
   AmlSdmmcStatus::Get()
@@ -976,7 +998,7 @@
   }
 
   ClearStatus();
-
+  request_count_++;
   start_reg.set_desc_busy(1).set_desc_addr((static_cast<uint32_t>(desc_phys)) >> 2).WriteTo(&mmio_);
 
   zx_status_t res = WaitForInterrupt(req);
diff --git a/src/devices/block/drivers/aml-sdmmc/aml-sdmmc.h b/src/devices/block/drivers/aml-sdmmc/aml-sdmmc.h
index 6af7223..e9c34c2 100644
--- a/src/devices/block/drivers/aml-sdmmc/aml-sdmmc.h
+++ b/src/devices/block/drivers/aml-sdmmc/aml-sdmmc.h
@@ -152,6 +152,7 @@
   std::atomic<bool> dead_ TA_GUARDED(mtx_);
   std::atomic<bool> pending_txn_ TA_GUARDED(mtx_);
   std::optional<SdmmcVmoStore> registered_vmos_[SDMMC_MAX_CLIENT_ID + 1];
+  size_t request_count_ = 0;
 };
 
 }  // namespace sdmmc
diff --git a/src/devices/board/drivers/vim3/vim3-sd.cc b/src/devices/board/drivers/vim3/vim3-sd.cc
index 04e7b24..cb8c0e7 100644
--- a/src/devices/board/drivers/vim3/vim3-sd.cc
+++ b/src/devices/board/drivers/vim3/vim3-sd.cc
@@ -53,16 +53,12 @@
     },
 };
 
-static const zx_bind_inst_t root_match[] = {
-    BI_MATCH(),
-};
 static const zx_bind_inst_t i2c_match[] = {
       BI_ABORT_IF(NE, BIND_PROTOCOL, ZX_PROTOCOL_I2C),
       BI_ABORT_IF(NE, BIND_I2C_BUS_ID, 0),
       BI_MATCH_IF(EQ, BIND_I2C_ADDRESS, 0x20),
 };
 static const device_fragment_part_t i2c_fragment[] = {
-    {countof(root_match), root_match},
     {countof(i2c_match), i2c_match},
 };
 static const device_fragment_t fragments[] = {
@@ -86,15 +82,12 @@
     BI_MATCH_IF(EQ, BIND_GPIO_PIN, A311D_GPIOC(6)),  // CD pin
 };
 static const device_fragment_part_t sdio_fn1_fragment[] = {
-    {std::size(root_match), root_match},
     {std::size(sdio_fn1_match), sdio_fn1_match},
 };
 static const device_fragment_part_t sdio_fn2_fragment[] = {
-    {std::size(root_match), root_match},
     {std::size(sdio_fn2_match), sdio_fn2_match},
 };
 static const device_fragment_part_t oob_gpio_fragment[] = {
-    {std::size(root_match), root_match},
     {std::size(oob_gpio_match), oob_gpio_match},
 };
 static const device_fragment_t wifi_fragments[] = {
@@ -127,6 +120,13 @@
   gpio_impl_.SetAltFunction(A311D_GPIOC(4), A311D_GPIOC_4_SDCARD_CLK_FN);
   gpio_impl_.SetAltFunction(A311D_GPIOC(5), A311D_GPIOC_5_SDCARD_CMD_FN);
 
+  gpio_impl_.SetDriveStrength(A311D_GPIOC(0), 4000, nullptr);
+gpio_impl_.SetDriveStrength(A311D_GPIOC(1), 4000, nullptr);
+gpio_impl_.SetDriveStrength(A311D_GPIOC(2), 4000, nullptr);
+gpio_impl_.SetDriveStrength(A311D_GPIOC(3), 4000, nullptr);
+gpio_impl_.SetDriveStrength(A311D_GPIOC(4), 4000, nullptr);
+gpio_impl_.SetDriveStrength(A311D_GPIOC(5), 4000, nullptr); 
+
   if ((status = pbus_.CompositeDeviceAdd(&sd_dev, reinterpret_cast<uint64_t>(fragments),
                                          countof(fragments), UINT32_MAX)) != ZX_OK) {
     zxlogf(ERROR, "SdInit could not add sd_dev: %d", status);