Index: build/jam/HaikuImage
===================================================================
--- build/jam/HaikuImage	(revision 27868)
+++ build/jam/HaikuImage	(working copy)
@@ -134,7 +134,7 @@
 	$(X86_ONLY)rtl8139 rtl8169 sis900 $(X86_ONLY)via_rhine wb840
 	$(X86_ONLY)ipro100 $(X86_ONLY)nforce #vlance
 	$(X86_ONLY)marvell_yukon $(X86_ONLY)syskonnect usb_ecm
-	$(GPL_ONLY)bcm440x $(GPL_ONLY)bcm570x
+	$(GPL_ONLY)bcm440x $(GPL_ONLY)bcm570x broadcom_bcm570x
 ;
 #BEOS_ADD_ONS_DRIVERS_ACPI = $(X86_ONLY)acpi_button ;
 BEOS_ADD_ONS_BUS_MANAGERS = pci $(X86_ONLY)ps2 $(X86_ONLY)isa ide scsi
Index: src/add-ons/kernel/drivers/network/broadcom_bcm570x/dev/bge/if_bgereg.h
===================================================================
--- src/add-ons/kernel/drivers/network/broadcom_bcm570x/dev/bge/if_bgereg.h	(revision 27868)
+++ src/add-ons/kernel/drivers/network/broadcom_bcm570x/dev/bge/if_bgereg.h	(working copy)
@@ -2506,6 +2506,9 @@
 #ifdef DEVICE_POLLING
 	int			rxcycles;
 #endif /* DEVICE_POLLING */
+#ifdef __HAIKU__
+	u_int32_t		bge_intr_status;
+#endif
 };
 
 #define	BGE_LOCK_INIT(_sc, _name) \
Index: src/add-ons/kernel/drivers/network/broadcom_bcm570x/dev/bge/if_bge.c
===================================================================
--- src/add-ons/kernel/drivers/network/broadcom_bcm570x/dev/bge/if_bge.c	(revision 27868)
+++ src/add-ons/kernel/drivers/network/broadcom_bcm570x/dev/bge/if_bge.c	(working copy)
@@ -3168,12 +3168,20 @@
 	 * the status check).  So toggling would probably be a pessimization
 	 * even with MSI.  It would only be needed for using a task queue.
 	 */
+#ifndef __HAIKU__ 
+	// already done in __haiku_disable_interrupts
 	CSR_WRITE_4(sc, BGE_MBX_IRQ0_LO, 0);
-
+#endif
 	/*
 	 * Do the mandatory PCI flush as well as get the link status.
 	 */
+#ifndef __HAIKU__
 	statusword = CSR_READ_4(sc, BGE_MAC_STS) & BGE_MACSTAT_LINK_CHANGED;
+#else
+	/* Get the statusword as saved in __haiku_disable_interrupts
+	 * and clear the saved value */
+	statusword = atomic_and((int32 *)&sc->bge_intr_status, 0);
+#endif
 
 	/* Make sure the descriptor ring indexes are coherent. */
 	bus_dmamap_sync(sc->bge_cdata.bge_status_tag,
@@ -3181,6 +3189,8 @@
 	bus_dmamap_sync(sc->bge_cdata.bge_status_tag,
 	    sc->bge_cdata.bge_status_map, BUS_DMASYNC_PREREAD);
 
+	/* TODO: bge_link_upd is probably not correct with interrupt changes
+	 * May need to also use the saved statusword... */
 	if ((sc->bge_asicrev == BGE_ASICREV_BCM5700 &&
 	    sc->bge_chipid != BGE_CHIPID_BCM5700_B2) ||
 	    statusword || sc->bge_link_evt)
Index: src/add-ons/kernel/drivers/network/broadcom_bcm570x/dev/bge/glue.c
===================================================================
--- src/add-ons/kernel/drivers/network/broadcom_bcm570x/dev/bge/glue.c	(revision 27868)
+++ src/add-ons/kernel/drivers/network/broadcom_bcm570x/dev/bge/glue.c	(working copy)
@@ -5,6 +5,7 @@
 
 
 #include <sys/bus.h>
+#include "if_bgereg.h"
 
 
 HAIKU_FBSD_DRIVER_GLUE(broadcom_bcm570x, bge, pci);
@@ -25,3 +26,34 @@
 	return __haiku_probe_miibus(dev, drivers);
 }
 
+int
+__haiku_disable_interrupts(device_t dev)
+{
+	struct bge_softc *sc = device_get_softc(dev);
+
+	// Obtain the status and return 0 if the bge did not set the intr
+	u_int32_t status = CSR_READ_4(sc, BGE_MAC_STS);
+	if ((status & BGE_MACSTAT_MI_INTERRUPT) == 0) {
+		return 0;
+	}
+
+	// Clear the interrupt, the bge intr handler will take care of it
+	BGE_SETBIT(sc, BGE_PCI_MISC_CTL, BGE_PCIMISCCTL_MASK_PCI_INTR);
+	CSR_WRITE_4(sc, BGE_MBX_IRQ0_LO, 1);
+
+	// save the status for the interrupt handler
+	atomic_or((int32 *)&sc->bge_intr_status, status);
+	return 1;
+}
+
+
+void
+__haiku_reenable_interrupts(device_t dev)
+{
+	// Honestly, I don't know if this is correct. 
+	// I just copied it from if_bge searching for enable interrupts
+	struct bge_softc *sc = device_get_softc(dev);
+	BGE_SETBIT(sc, BGE_PCI_MISC_CTL, BGE_PCIMISCCTL_CLEAR_INTA);
+	BGE_CLRBIT(sc, BGE_PCI_MISC_CTL, BGE_PCIMISCCTL_MASK_PCI_INTR);
+	CSR_WRITE_4(sc, BGE_MBX_IRQ0_LO, 0);
+}
Index: src/libs/compat/freebsd_network/compat/sys/mbuf.h
===================================================================
--- src/libs/compat/freebsd_network/compat/sys/mbuf.h	(revision 27868)
+++ src/libs/compat/freebsd_network/compat/sys/mbuf.h	(working copy)
@@ -82,6 +82,9 @@
 
 #define M_BCAST			0x00000200
 #define M_MCAST			0x00000400
+#define	M_FRAG			0x00000800
+#define	M_FIRSTFRAG		0x00001000
+#define	M_LASTFRAG		0x00002000
 #define	M_VLANTAG		0x00010000
 
 #define CSUM_IP			0x0001
@@ -124,6 +127,7 @@
 struct mbuf *m_get(int how, short type);
 struct mbuf *m_gethdr(int how, short type);
 void m_clget(struct mbuf *m, int how);
+void * m_cljget(struct mbuf *m, int how, int size);
 
 void m_extadd(struct mbuf *m, caddr_t buffer, u_int size,
     void (*freeHook)(void *, void *), void *args, int flags, int type);
Index: src/libs/compat/freebsd_network/mbuf.c
===================================================================
--- src/libs/compat/freebsd_network/mbuf.c	(revision 27868)
+++ src/libs/compat/freebsd_network/mbuf.c	(working copy)
@@ -150,7 +150,36 @@
 	construct_ext_mbuf(m, how);
 }
 
+/*
+ * Comment from the freebsd (mbuf.h):
+ * m_cljget() is different from m_clget() as it can allocate clusters without
+ * attaching them to an mbuf.  In that case the return value is the pointer
+ * to the cluster of the requested size.  If an mbuf was specified, it gets
+ * the cluster attached to it and the return value can be safely ignored.
+ * For size it takes MCLBYTES, MJUMPAGESIZE, MJUM9BYTES, MJUM16BYTES.
+ */
+void *
+m_cljget(struct mbuf *m, int how, int size)
+{
+	// TODO: implement this
+	panic("m_cljget not yet implemented");
+	return (void *) NULL;
 
+/*
+//	This is the freebsd code
+	uma_zone_t zone;
+
+	if (m && m->m_flags & M_EXT)
+		printf("%s: %p mbuf already has cluster\n", __func__, m);
+	if (m != NULL)
+		m->m_ext.ext_buf = NULL;
+
+	zone = m_getzone(size);
+	return (uma_zalloc_arg(zone, m, how));
+*/
+}
+
+
 void
 m_freem(struct mbuf *mb)
 {
