[dev][rtl8111] Teach Realtek ethernet about BTIs

ZX-693 #comment

Change-Id: I7c1e4b25dd917e1398b985ae67cc10e3507b7875
diff --git a/system/dev/ethernet/realtek-rtl8111/rtl8111.c b/system/dev/ethernet/realtek-rtl8111/rtl8111.c
index 8ef37e1..3cdadda 100644
--- a/system/dev/ethernet/realtek-rtl8111/rtl8111.c
+++ b/system/dev/ethernet/realtek-rtl8111/rtl8111.c
@@ -46,6 +46,7 @@
     zx_handle_t irqh;
     zx_handle_t ioh;
     thrd_t irq_thread;
+    zx_handle_t btih;
     io_buffer_t buffer;
     uintptr_t iobase;
 
@@ -326,7 +327,9 @@
     thrd_join(edev->irq_thread, NULL);
 
     zx_handle_close(edev->ioh);
+
     io_buffer_release(&edev->buffer);
+    zx_handle_close(edev->btih);
 
     free(edev);
 }
@@ -387,12 +390,18 @@
         goto fail;
     }
 
+    if ((r = pci_get_bti(&edev->pci, 0, &edev->btih)) != ZX_OK) {
+        zxlogf(ERROR, "rtl8111: could not get bti %d\n", r);
+        goto fail;
+    }
+
     uint32_t mac_version = readl(RTL_TCR) & 0x7cf00000;
     zxlogf(TRACE, "rtl8111: version 0x%08x\n", mac_version);
 
     // TODO(stevensd): Don't require a contiguous buffer
     uint32_t alloc_size = ((ETH_BUF_SIZE + ETH_DESC_ELT_SIZE) * ETH_BUF_COUNT) * 2;
-    r = io_buffer_init(&edev->buffer, alloc_size, IO_BUFFER_RW | IO_BUFFER_CONTIG);
+    r = io_buffer_init_with_bti(&edev->buffer, edev->btih, alloc_size,
+                                IO_BUFFER_RW | IO_BUFFER_CONTIG);
     if (r != ZX_OK) {
         zxlogf(ERROR, "rtl8111: cannot alloc io-buffer %d\n", r);
         goto fail;
@@ -427,13 +436,16 @@
     return ZX_OK;
 
 fail:
+    io_buffer_release(&edev->buffer);
+    if (edev->btih) {
+        zx_handle_close(edev->btih);
+    }
     if (edev->irqh) {
         zx_handle_close(edev->irqh);
     }
     if (edev->ioh) {
         zx_handle_close(edev->ioh);
     }
-    io_buffer_release(&edev->buffer);
     free(edev);
     return r != ZX_OK ? r : ZX_ERR_INTERNAL;
 }