From cc30d340c388f8b14b8e5fc8684f05ad731c7141 Mon Sep 17 00:00:00 2001 From: Marcus Overhagen Date: Sun, 28 Jan 2007 12:59:45 +0000 Subject: [PATCH] When getting the memory map, ask only for 2046 bytes instead of 2048 bytes. This should fix bugs #993 and #997. On BeOS R5 asking for 2 bytes too much wasn't a problem, as we only need the first page_entry, and it didn't return any Error. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@19992 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/add-ons/kernel/drivers/network/ipro1000/if_em_osdep.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/add-ons/kernel/drivers/network/ipro1000/if_em_osdep.h b/src/add-ons/kernel/drivers/network/ipro1000/if_em_osdep.h index 23c5b47cda..db384243fb 100644 --- a/src/add-ons/kernel/drivers/network/ipro1000/if_em_osdep.h +++ b/src/add-ons/kernel/drivers/network/ipro1000/if_em_osdep.h @@ -127,7 +127,11 @@ static inline unsigned long vtophys(unsigned long virtual_addr) { physical_entry pe; status_t err; - err = get_memory_map((void *)virtual_addr, 2048, &pe, 1); + // vtophys is called for the start of any page aligned contiguous large buffer, + // and also with offset 2 into 2048 byte aligned (non-contiguous) rx/tx buffer. + // Thus we only ask for 2046 bytes to get exactly one physical_entry. If the + // next physical page is non-contiguous, using 2048 may return B_BUFFER_OVERFLOW. + err = get_memory_map((void *)virtual_addr, 2046, &pe, 1); if (err < 0) panic("ipro1000: get_memory_map failed for %p, error %08lx\n", (void *)virtual_addr, err); return (unsigned long) pe.address;