Index: alpha/alpha/busdma_machdep.c =================================================================== RCS file: /home/ncvs/src/sys/alpha/alpha/busdma_machdep.c,v retrieving revision 1.28 diff -u -r1.28 busdma_machdep.c --- alpha/alpha/busdma_machdep.c 4 Feb 2003 16:30:26 -0000 1.28 +++ alpha/alpha/busdma_machdep.c 16 Feb 2003 07:36:30 -0000 @@ -425,11 +425,8 @@ { vm_offset_t vaddr; vm_offset_t paddr; -#ifdef __GNUC__ - bus_dma_segment_t dm_segments[dmat->nsegments]; -#else - bus_dma_segment_t dm_segments[BUS_DMAMAP_NSEGS]; -#endif + bus_dma_segment_t stack_dm_segments[BUS_DMAMAP_NSEGS]; + bus_dma_segment_t *dm_segments; bus_dma_segment_t *sg; int seg; int error; @@ -444,16 +441,16 @@ * of the bus address space. */ vaddr = trunc_page((vm_offset_t) buf); - dm_segments[0].ds_addr = + stack_dm_segments[0].ds_addr = map->busaddress + (vm_offset_t) buf - vaddr; - dm_segments[0].ds_len = buflen; + stack_dm_segments[0].ds_len = buflen; buflen = round_page((vm_offset_t) buf + buflen) - vaddr; sgmap_load_region(chipset.sgmap, map->busaddress, vaddr, buflen); map->buflen = buflen; - (*callback)(callback_arg, dm_segments, 1, error); + (*callback)(callback_arg, stack_dm_segments, 1, error); return (0); } @@ -504,6 +501,14 @@ splx(s); } + if (dmat->nsegments > BUS_DMAMAP_NSEGS) { + dm_segments = malloc(dmat->nsegments * sizeof(bus_dma_segment_t), + M_DEVBUF, (flags & BUS_DMA_NOWAIT) ? M_NOWAIT : 0); + if (dm_segments == NULL) + return ENOMEM; + } else + dm_segments = stack_dm_segments; + vaddr = (vm_offset_t)buf; sg = &dm_segments[0]; seg = 1; @@ -526,7 +531,8 @@ if (sg->ds_len == 0) { sg->ds_addr = paddr + alpha_XXX_dmamap_or; sg->ds_len = size; - } else if (paddr == nextpaddr) { + } else if (paddr == nextpaddr && + sg->ds_len + size < dmat->maxsegsz) { sg->ds_len += size; } else { /* Go to the next segment */ @@ -550,6 +556,9 @@ } (*callback)(callback_arg, dm_segments, seg, error); + + if (dm_segments != stack_dm_segments) + free(dm_segments, M_DEVBUF); return (0); } Index: i386/i386/busdma_machdep.c =================================================================== RCS file: /home/ncvs/src/sys/i386/i386/busdma_machdep.c,v retrieving revision 1.32 diff -u -r1.32 busdma_machdep.c --- i386/i386/busdma_machdep.c 4 Feb 2003 16:30:27 -0000 1.32 +++ i386/i386/busdma_machdep.c 16 Feb 2003 02:21:08 -0000 @@ -403,11 +403,8 @@ { vm_offset_t vaddr; vm_offset_t paddr; -#ifdef __GNUC__ - bus_dma_segment_t dm_segments[dmat->nsegments]; -#else - bus_dma_segment_t dm_segments[BUS_DMAMAP_NSEGS]; -#endif + bus_dma_segment_t stack_dm_segments[BUS_DMAMAP_NSEGS]; + bus_dma_segment_t *dm_segments; bus_dma_segment_t *sg; int seg; int error; @@ -463,6 +460,14 @@ splx(s); } + if (dmat->nsegments > BUS_DMAMAP_NSEGS) { + dm_segments = malloc(dmat->nsegments * sizeof(bus_dma_segment_t), + M_DEVBUF, (flags & BUS_DMA_NOWAIT) ? M_NOWAIT : 0); + if (dm_segments == NULL) + return ENOMEM; + } else + dm_segments = stack_dm_segments; + vaddr = (vm_offset_t)buf; sg = &dm_segments[0]; seg = 1; @@ -484,7 +489,8 @@ if (sg->ds_len == 0) { sg->ds_addr = paddr; sg->ds_len = size; - } else if (paddr == nextpaddr) { + } else if (paddr == nextpaddr && + sg->ds_len + size < dmat->maxsegsz) { sg->ds_len += size; } else { /* Go to the next segment */ @@ -508,6 +514,9 @@ } (*callback)(callback_arg, dm_segments, seg, error); + + if (dm_segments != stack_dm_segments) + free(dm_segments, M_DEVBUF); return (0); } Index: ia64/ia64/busdma_machdep.c =================================================================== RCS file: /home/ncvs/src/sys/ia64/ia64/busdma_machdep.c,v retrieving revision 1.14 diff -u -r1.14 busdma_machdep.c --- ia64/ia64/busdma_machdep.c 4 Feb 2003 16:30:27 -0000 1.14 +++ ia64/ia64/busdma_machdep.c 16 Feb 2003 18:36:58 -0000 @@ -393,11 +393,8 @@ { vm_offset_t vaddr; vm_offset_t paddr; -#ifdef __GNUC__ - bus_dma_segment_t dm_segments[dmat->nsegments]; -#else - bus_dma_segment_t dm_segments[BUS_DMAMAP_NSEGS]; -#endif + bus_dma_segment_t stack_dm_segments[BUS_DMAMAP_NSEGS]; + bus_dma_segment_t *dm_segments; bus_dma_segment_t *sg; int seg; int error; @@ -412,9 +409,9 @@ * of the bus address space. */ vaddr = trunc_page((vm_offset_t) buf); - dm_segments[0].ds_addr = + stack_dm_segments[0].ds_addr = map->busaddress + (vm_offset_t) buf - vaddr; - dm_segments[0].ds_len = buflen; + stack_dm_segments[0].ds_len = buflen; buflen = round_page((vm_offset_t) buf + buflen) - vaddr; #if 0 sgmap_load_region(chipset.sgmap, @@ -423,7 +420,7 @@ buflen); #endif map->buflen = buflen; - (*callback)(callback_arg, dm_segments, 1, error); + (*callback)(callback_arg, stack_dm_segments, 1, error); return (0); } @@ -474,6 +471,14 @@ splx(s); } + if (dmat->nsegments > BUS_DMAMAP_NSEGS) { + dm_segments = malloc(dmat->nsegments * sizeof(bus_dma_segment_t), + M_DEVBUF, (flags & BUS_DMA_NOWAIT) ? M_NOWAIT : 0); + if (dm_segments == NULL) + return ENOMEM; + } else + dm_segments = stack_dm_segments; + vaddr = (vm_offset_t)buf; sg = &dm_segments[0]; seg = 1; @@ -496,7 +501,8 @@ if (sg->ds_len == 0) { sg->ds_addr = paddr; sg->ds_len = size; - } else if (paddr == nextpaddr) { + } else if (paddr == nextpaddr && + sg->ds_len + size < dmat->maxsegsz) { sg->ds_len += size; } else { /* Go to the next segment */ @@ -520,6 +526,9 @@ } (*callback)(callback_arg, dm_segments, seg, error); + + if (dm_segments != stack_dm_segments) + free(dm_segments, M_DEVBUF); return (0); } Index: powerpc/powerpc/busdma_machdep.c =================================================================== RCS file: /home/ncvs/src/sys/powerpc/powerpc/busdma_machdep.c,v retrieving revision 1.7 diff -u -r1.7 busdma_machdep.c --- powerpc/powerpc/busdma_machdep.c 4 Feb 2003 16:30:26 -0000 1.7 +++ powerpc/powerpc/busdma_machdep.c 16 Feb 2003 18:36:04 -0000 @@ -254,11 +254,8 @@ { vm_offset_t vaddr; vm_offset_t paddr; -#ifdef __GNUC__ - bus_dma_segment_t dm_segments[dmat->nsegments]; -#else - bus_dma_segment_t dm_segments[BUS_DMAMAP_NSEGS]; -#endif + bus_dma_segment_t stack_dm_segments[BUS_DMAMAP_NSEGS]; + bus_dma_segment_t *dm_segments; bus_dma_segment_t *sg; int seg; int error = 0; @@ -267,7 +264,15 @@ if (map != NULL) panic("bus_dmamap_load: Invalid map\n"); - vaddr = (vm_offset_t)buf; + if (dmat->nsegments > BUS_DMAMAP_NSEGS) { + dm_segments = malloc(dmat->nsegments * sizeof(bus_dma_segment_t), + M_DEVBUF, (flags & BUS_DMA_NOWAIT) ? M_NOWAIT : 0); + if (dm_segments == NULL) + return ENOMEM; + } else + dm_segments = stack_dm_segments; + + vaddr = (vm_offset_t)buf; sg = &dm_segments[0]; seg = 1; sg->ds_len = 0; @@ -284,7 +289,8 @@ if (sg->ds_len == 0) { sg->ds_addr = paddr; sg->ds_len = size; - } else if (paddr == nextpaddr) { + } else if (paddr == nextpaddr && + sg->ds_len + size < dmat->maxsegsz) { sg->ds_len += size; } else { /* Go to the next segment */ @@ -308,7 +314,10 @@ } (*callback)(callback_arg, dm_segments, seg, error); - + + if (dm_segments != stack_dm_segments) + free(dm_segments, M_DEVBUF); + return (0); } Index: sparc64/sparc64/bus_machdep.c =================================================================== RCS file: /home/ncvs/src/sys/sparc64/sparc64/bus_machdep.c,v retrieving revision 1.19 diff -u -r1.19 bus_machdep.c --- sparc64/sparc64/bus_machdep.c 4 Feb 2003 16:30:27 -0000 1.19 +++ sparc64/sparc64/bus_machdep.c 16 Feb 2003 18:33:06 -0000 @@ -408,14 +408,19 @@ void *buf, bus_size_t buflen, bus_dmamap_callback_t *callback, void *callback_arg, int flags) { -#ifdef __GNUC__ - bus_dma_segment_t dm_segments[ddmat->dt_nsegments]; -#else - bus_dma_segment_t dm_segments[BUS_DMAMAP_NSEGS]; -#endif + bus_dma_segment_t stack_dm_segments[BUS_DMAMAP_NSEGS]; + bus_dma_segment_t *dm_segments; vm_offset_t lastaddr; int error, nsegs; + if (dmat->nsegments > BUS_DMAMAP_NSEGS) { + dm_segments = malloc(dmat->nsegments * sizeof(bus_dma_segment_t), + M_DEVBUF, (flags & BUS_DMA_NOWAIT) ? M_NOWAIT : 0); + if (dm_segments == NULL) + return ENOMEM; + } else + dm_segments = stack_dm_segments; + error = _nexus_dmamap_load_buffer(ddmat, dm_segments, buf, buflen, NULL, flags, &lastaddr, &nsegs, 1); @@ -424,6 +429,9 @@ map->dm_loaded = 1; } else (*callback)(callback_arg, NULL, 0, error); + + if (dm_segments != stack_dm_segments) + free(dm_segments, M_DEVBUF); return (0); }