diff options
Diffstat (limited to 'sys/compat/ndis')
-rw-r--r-- | sys/compat/ndis/kern_ndis.c | 14 | ||||
-rw-r--r-- | sys/compat/ndis/ntoskrnl_var.h | 14 | ||||
-rw-r--r-- | sys/compat/ndis/subr_ndis.c | 24 |
3 files changed, 34 insertions, 18 deletions
diff --git a/sys/compat/ndis/kern_ndis.c b/sys/compat/ndis/kern_ndis.c index 29eb774..1a41a54 100644 --- a/sys/compat/ndis/kern_ndis.c +++ b/sys/compat/ndis/kern_ndis.c @@ -486,11 +486,8 @@ ndis_ptom(m0, p) *m0 = NULL; return(ENOBUFS); } - if (buf->nb_bytecount > buf->nb_size) - m->m_len = buf->nb_size; - else - m->m_len = buf->nb_bytecount; - m->m_data = buf->nb_mappedsystemva; + m->m_len = buf->nb_bytecount; + m->m_data = MDL_VA(buf); MEXTADD(m, m->m_data, m->m_len, ndis_return_packet, p->np_rsvd[0], 0, EXT_NDIS); m->m_ext.ext_buf = (void *)p; /* XXX */ @@ -557,8 +554,7 @@ ndis_mtop(m0, p) return(ENOMEM); } - buf->nb_bytecount = m->m_len; - buf->nb_mappedsystemva = m->m_data; + MDL_INIT(buf, m->m_data, m->m_len); if (priv->npp_head == NULL) priv->npp_head = buf; else @@ -628,7 +624,7 @@ ndis_set_info(arg, oid, buf, buflen) tv.tv_sec = 60; tv.tv_usec = 0; error = tsleep(&sc->ndis_block.nmb_wkupdpctimer, - PPAUSE|PCATCH, "ndis", tvtohz(&tv)); + PPAUSE|PCATCH, "ndisset", tvtohz(&tv)); rval = sc->ndis_block.nmb_setstat; } @@ -956,7 +952,7 @@ ndis_get_info(arg, oid, buf, buflen) tv.tv_sec = 60; tv.tv_usec = 0; error = tsleep(&sc->ndis_block.nmb_wkupdpctimer, - PPAUSE|PCATCH, "ndis", tvtohz(&tv)); + PPAUSE|PCATCH, "ndisget", tvtohz(&tv)); rval = sc->ndis_block.nmb_getstat; } diff --git a/sys/compat/ndis/ntoskrnl_var.h b/sys/compat/ndis/ntoskrnl_var.h index 9447d1b..5d87ff3 100644 --- a/sys/compat/ndis/ntoskrnl_var.h +++ b/sys/compat/ndis/ntoskrnl_var.h @@ -40,6 +40,20 @@ #define SPAN_PAGES(ptr, len) \ ((uint32_t)((((uintptr_t)(ptr) & (PAGE_SIZE -1)) + \ (len) + (PAGE_SIZE - 1)) >> PAGE_SHIFT)) +#define PAGE_ALIGN(ptr) \ + ((void *)((uintptr_t)(ptr) & ~(PAGE_SIZE - 1))) +#define BYTE_OFFSET(ptr) \ + ((uint32_t)((uintptr_t)(ptr) & (PAGE_SIZE - 1))) +#define MDL_INIT(b, baseva, len) \ + (b)->nb_next = NULL; \ + (b)->nb_size = (uint16_t)(sizeof(struct ndis_buffer) + \ + (sizeof(uint32_t) * SPAN_PAGES((baseva), (len)))); \ + (b)->nb_flags = 0; \ + (b)->nb_startva = (void *)PAGE_ALIGN((baseva)); \ + (b)->nb_byteoffset = BYTE_OFFSET((baseva)); \ + (b)->nb_bytecount = (uint32_t)(len); +#define MDL_VA(b) \ + ((void *)((char *)((b)->nb_startva) + (b)->nb_byteoffset)) typedef uint32_t kspin_lock; diff --git a/sys/compat/ndis/subr_ndis.c b/sys/compat/ndis/subr_ndis.c index e3c971d..7e271a3 100644 --- a/sys/compat/ndis/subr_ndis.c +++ b/sys/compat/ndis/subr_ndis.c @@ -822,7 +822,7 @@ ndis_vtophys_load(adapter, buf, mapreg, writedev, addrarray, arraysize) nma.nma_fraglist = addrarray; error = bus_dmamap_load(sc->ndis_mtag, map, - buf->nb_mappedsystemva, buf->nb_bytecount, ndis_map_cb, + MDL_VA(buf), buf->nb_bytecount, ndis_map_cb, (void *)&nma, BUS_DMA_NOWAIT); if (error) @@ -1612,9 +1612,7 @@ ndis_alloc_buf(status, buffer, pool, vaddr, len) /* Save pointer to the pool. */ buf->nb_process = head; - buf->nb_mappedsystemva = vaddr; - buf->nb_size = len; - buf->nb_next = NULL; + MDL_INIT(buf, vaddr, len); *buffer = buf; @@ -1654,7 +1652,7 @@ ndis_query_buf(buf, vaddr, len) uint32_t *len; { if (vaddr != NULL) - *vaddr = buf->nb_mappedsystemva; + *vaddr = MDL_VA(buf); *len = buf->nb_bytecount; return; @@ -1670,7 +1668,7 @@ ndis_query_buf_safe(buf, vaddr, len, prio) uint32_t prio; { if (vaddr != NULL) - *vaddr = buf->nb_mappedsystemva; + *vaddr = MDL_VA(buf); *len = buf->nb_bytecount; return; @@ -1876,9 +1874,11 @@ __stdcall static uint32_t ndis_numpages(buf) ndis_buffer *buf; { + if (buf == NULL) + return(0); if (buf->nb_bytecount == 0) return(1); - return(SPAN_PAGES(buf->nb_mappedsystemva, buf->nb_bytecount)); + return(SPAN_PAGES(MDL_VA(buf), buf->nb_bytecount)); } __stdcall static void @@ -1886,6 +1886,9 @@ ndis_buf_physpages(buf, pages) ndis_buffer *buf; uint32_t *pages; { + if (buf == NULL) + return; + *pages = ndis_numpages(buf); return; } @@ -1896,7 +1899,10 @@ ndis_query_bufoffset(buf, off, len) uint32_t *off; uint32_t *len; { - *off = (uint32_t)buf->nb_mappedsystemva & (PAGE_SIZE - 1); + if (buf == NULL) + return; + + *off = buf->nb_byteoffset; *len = buf->nb_bytecount; return; @@ -2149,7 +2155,7 @@ ndis_firstbuf(packet, buf, firstva, firstlen, totlen) *firstva = NULL; *firstlen = *totlen = 0; } else { - *firstva = tmp->nb_mappedsystemva; + *firstva = MDL_VA(tmp); *firstlen = *totlen = tmp->nb_bytecount; for (tmp = tmp->nb_next; tmp != NULL; tmp = tmp->nb_next) *totlen += tmp->nb_bytecount; |