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;