BXE: slightly better memory management
Trying to work with the existing interface, so as to not replace it everywhere.
diff --git a/kern/drivers/net/bxe/bsd_bus.h b/kern/drivers/net/bxe/bsd_bus.h
index 329ba0f..4c9f8ce 100644
--- a/kern/drivers/net/bxe/bsd_bus.h
+++ b/kern/drivers/net/bxe/bsd_bus.h
@@ -108,9 +108,28 @@
typedef uintptr_t bus_dma_segment_t;
typedef uintptr_t bus_space_tag_t;
-#define bus_dma_tag_create(...) (0)
+/* ret is the location of the tag we create, which is just the size */
+#define bus_get_dma_tag(pcidev) (0)
+#define bus_dma_tag_create(_tag, _align, _bound, _low, _hi, _fil, _filarg, \
+ _size, _num, _size2, _flag2, _lock, _lockarg, _ret) \
+({ \
+ *(size_t*)(_ret) = (size_t)(_size); \
+ 0; \
+})
#define bus_dma_tag_destroy(...)
+#define bus_dmamem_alloc(_tag, _vaddraddr, _flags, _map) \
+({ \
+ *(_vaddraddr) = kzmalloc((size_t)(_tag), KMALLOC_WAIT); \
+ 0; \
+})
+#define bus_dmamem_free(_tag, _vaddr, _map) kfree(_vaddr)
#define bus_dmamap_sync(...)
+/* bxe_dma_map_addr is actually a callback tht does the paddr assignment */
+#define bus_dmamap_load(_tag, _map, _vaddr, _size, _map_addr, _dma, _flag) \
+({ \
+ (_dma)->paddr = PADDR((_dma)->vaddr); \
+ 0; \
+})
#define bus_dmamap_unload(...)
#define bus_dmamap_create(...) (0)
#define bus_dmamap_destroy(...)
diff --git a/kern/drivers/net/bxe/bxe.c b/kern/drivers/net/bxe/bxe.c
index 3a72767..3fec514 100644
--- a/kern/drivers/net/bxe/bxe.c
+++ b/kern/drivers/net/bxe/bxe.c
@@ -844,11 +844,6 @@
dma->size = size;
snprintf(dma->msg, sizeof(dma->msg), "%s", msg);
- /* Akaros style */
- dma->vaddr = kzmalloc(size, KMALLOC_WAIT);
- dma->paddr = PADDR(dma->vaddr);
-
-#if 0 /* the BSD way */
rc = bus_dma_tag_create(sc->parent_dma_tag, /* parent tag */
BCM_PAGE_SIZE, /* alignment */
0, /* boundary limit */
@@ -894,7 +889,9 @@
memset(dma, 0, sizeof(*dma));
return (1);
}
-#endif
+
+ /* might catch buggy BSD-compat macros */
+ assert(dma->paddr == PADDR(dma->vaddr));
return (0);
}
@@ -903,23 +900,18 @@
struct bxe_dma *dma)
{
if (dma->size > 0) {
-#if 0
BLOGD(sc, DBG_LOAD,
"DMA free '%s': vaddr=%p paddr=%p nseg=%d size=%lu\n",
dma->msg, dma->vaddr, (void *)dma->paddr,
dma->nseg, dma->size);
-#endif
DBASSERT(sc, (dma->tag != NULL), ("dma tag is NULL"));
- kfree(dma->vaddr);
- #if 0 /* the BSD way */
bus_dmamap_sync(dma->tag, dma->map,
(BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE));
bus_dmamap_unload(dma->tag, dma->map);
bus_dmamem_free(dma->tag, dma->vaddr, dma->map);
bus_dma_tag_destroy(dma->tag);
- #endif
}
memset(dma, 0, sizeof(*dma));
}
diff --git a/kern/drivers/net/bxe/bxe.h b/kern/drivers/net/bxe/bxe.h
index ffc67bb..db606db 100644
--- a/kern/drivers/net/bxe/bxe.h
+++ b/kern/drivers/net/bxe/bxe.h
@@ -52,6 +52,7 @@
#define __noinline
#define ETH_ADDR_LEN 6
#define MCLBYTES 2048
+#define MJUM9BYTES (9 * 1024) /* jumbo cluster 9k */
/* TYPEDEFS for conversion to AKAROS. These are temporary, but it makes it easier to see what is in need of change. */
typedef struct netif *if_t;
typedef uint64_t ift_counter;