Index: tw_cl_io.c =================================================================== --- tw_cl_io.c (revision 183724) +++ tw_cl_io.c (working copy) @@ -1388,37 +1388,31 @@ TW_VOID tw_cli_fill_sg_list(struct tw_cli_ctlr_context *ctlr, TW_VOID *sgl_src, TW_VOID *sgl_dest, TW_INT32 num_sgl_entries) { + bus_dma_segment_t *sgl_s; TW_INT32 i; + sgl_s = sgl_src; tw_cli_dbg_printf(10, ctlr->ctlr_handle, tw_osl_cur_func(), "entered"); if (ctlr->flags & TW_CL_64BIT_ADDRESSES) { - struct tw_cl_sg_desc64 *sgl_s = - (struct tw_cl_sg_desc64 *)sgl_src; struct tw_cl_sg_desc64 *sgl_d = (struct tw_cl_sg_desc64 *)sgl_dest; tw_cli_dbg_printf(10, ctlr->ctlr_handle, tw_osl_cur_func(), "64 bit addresses"); for (i = 0; i < num_sgl_entries; i++) { - sgl_d[i].address = TW_CL_SWAP64(sgl_s->address); - sgl_d[i].length = TW_CL_SWAP32(sgl_s->length); - sgl_s++; - if (ctlr->flags & TW_CL_64BIT_SG_LENGTH) - sgl_s = (struct tw_cl_sg_desc64 *) - (((TW_INT8 *)(sgl_s)) + 4); + sgl_d[i].address = TW_CL_SWAP64(sgl_s[i].ds_addr); + sgl_d[i].length = TW_CL_SWAP32(sgl_s[i].ds_len); } } else { - struct tw_cl_sg_desc32 *sgl_s = - (struct tw_cl_sg_desc32 *)sgl_src; struct tw_cl_sg_desc32 *sgl_d = (struct tw_cl_sg_desc32 *)sgl_dest; tw_cli_dbg_printf(10, ctlr->ctlr_handle, tw_osl_cur_func(), "32 bit addresses"); for (i = 0; i < num_sgl_entries; i++) { - sgl_d[i].address = TW_CL_SWAP32(sgl_s[i].address); - sgl_d[i].length = TW_CL_SWAP32(sgl_s[i].length); + sgl_d[i].address = TW_CL_SWAP32(sgl_s[i].ds_addr); + sgl_d[i].length = TW_CL_SWAP32(sgl_s[i].ds_len); } } } Index: tw_osl_freebsd.c =================================================================== --- tw_osl_freebsd.c (revision 183724) +++ tw_osl_freebsd.c (working copy) @@ -491,8 +491,8 @@ tw_osli_alloc_mem(struct twa_softc *sc) /* Create the parent dma tag. */ if (bus_dma_tag_create(NULL, /* parent */ sc->alignment, /* alignment */ - 0, /* boundary */ - BUS_SPACE_MAXADDR_32BIT,/* lowaddr */ + TW_OSLI_DMA_BOUNDARY, /* boundary */ + BUS_SPACE_MAXADDR, /* lowaddr */ BUS_SPACE_MAXADDR, /* highaddr */ NULL, NULL, /* filter, filterarg */ TW_CL_MAX_IO_SIZE, /* maxsize */ @@ -515,7 +515,7 @@ tw_osli_alloc_mem(struct twa_softc *sc) if (bus_dma_tag_create(sc->parent_tag, /* parent */ sc->alignment, /* alignment */ 0, /* boundary */ - BUS_SPACE_MAXADDR_32BIT,/* lowaddr */ + BUS_SPACE_MAXADDR, /* lowaddr */ BUS_SPACE_MAXADDR, /* highaddr */ NULL, NULL, /* filter, filterarg */ dma_mem_size, /* maxsize */ @@ -562,7 +562,7 @@ tw_osli_alloc_mem(struct twa_softc *sc) if (bus_dma_tag_create(sc->parent_tag, /* parent */ sc->alignment, /* alignment */ 0, /* boundary */ - BUS_SPACE_MAXADDR_32BIT,/* lowaddr */ + BUS_SPACE_MAXADDR, /* lowaddr */ BUS_SPACE_MAXADDR, /* highaddr */ NULL, NULL, /* filter, filterarg */ TW_CL_MAX_IO_SIZE, /* maxsize */ @@ -588,7 +588,7 @@ tw_osli_alloc_mem(struct twa_softc *sc) if (bus_dma_tag_create(sc->parent_tag, /* parent */ sc->alignment, /* alignment */ 0, /* boundary */ - BUS_SPACE_MAXADDR_32BIT,/* lowaddr */ + BUS_SPACE_MAXADDR, /* lowaddr */ BUS_SPACE_MAXADDR, /* highaddr */ NULL, NULL, /* filter, filterarg */ TW_CL_MAX_IO_SIZE, /* maxsize */ @@ -1347,7 +1347,7 @@ static TW_VOID twa_map_load_callback(TW_VOID *arg, bus_dma_segment_t *segs, TW_INT32 nsegments, TW_INT32 error) { - *((bus_addr_t *)arg) = segs[0].ds_addr; + *((TW_UINT64 *)arg) = segs[0].ds_addr; } Index: tw_osl.h =================================================================== --- tw_osl.h (revision 183724) +++ tw_osl.h (working copy) @@ -57,6 +57,12 @@ #define TW_OSLI_DEFERRED_INTR_USED */ +#ifdef PAE +#define TW_OSLI_DMA_BOUNDARY (1u << 31) +#else +#define TW_OSLI_DMA_BOUNDARY ((bus_size_t)((uint64_t)1 << 32)) +#endif + /* Possible values of req->state. */ #define TW_OSLI_REQ_STATE_INIT 0x0 /* being initialized */ #define TW_OSLI_REQ_STATE_BUSY 0x1 /* submitted to CL */ Index: tw_cl_init.c =================================================================== --- tw_cl_init.c (revision 183724) +++ tw_cl_init.c (working copy) @@ -692,7 +692,7 @@ tw_cli_init_connection(struct tw_cli_ctlr_context init_connect->message_credits = TW_CL_SWAP16(message_credits); init_connect->features = TW_CL_SWAP32(set_features); if (ctlr->flags & TW_CL_64BIT_ADDRESSES) - init_connect->features |= TWA_64BIT_SG_ADDRESSES; + init_connect->features |= TW_CL_SWAP32(TWA_64BIT_SG_ADDRESSES); if (set_features & TWA_EXTENDED_INIT_CONNECT) { /* * Fill in the extra fields needed for an extended