ipro1000: Haiku changes to have it compiled again.

* a lot of gcc2 specific changes...
This commit is contained in:
Jerome Duval
2013-01-08 22:45:31 +01:00
parent 648db7333e
commit d997b26243
6 changed files with 107 additions and 41 deletions
@@ -18,6 +18,7 @@ KernelAddon ipro1000 :
e1000_82571.c e1000_82571.c
e1000_82575.c e1000_82575.c
e1000_api.c e1000_api.c
e1000_i210.c
e1000_ich8lan.c e1000_ich8lan.c
e1000_mac.c e1000_mac.c
e1000_manage.c e1000_manage.c
@@ -40,9 +40,11 @@
#include <sys/param.h> #include <sys/param.h>
#include <sys/systm.h> #include <sys/systm.h>
#ifndef __HAIKU__
#if __FreeBSD_version >= 800000 #if __FreeBSD_version >= 800000
#include <sys/buf_ring.h> #include <sys/buf_ring.h>
#endif #endif
#endif
#include <sys/bus.h> #include <sys/bus.h>
#include <sys/endian.h> #include <sys/endian.h>
#include <sys/kernel.h> #include <sys/kernel.h>
@@ -78,7 +80,9 @@
#include <netinet/udp.h> #include <netinet/udp.h>
#include <machine/in_cksum.h> #include <machine/in_cksum.h>
#ifndef __HAIKU__
#include <dev/led/led.h> #include <dev/led/led.h>
#endif
#include <dev/pci/pcivar.h> #include <dev/pci/pcivar.h>
#include <dev/pci/pcireg.h> #include <dev/pci/pcireg.h>
@@ -472,10 +476,12 @@ em_attach(device_t dev)
INIT_DEBUGOUT("em_attach: begin"); INIT_DEBUGOUT("em_attach: begin");
#ifndef __HAIKU__
if (resource_disabled("em", device_get_unit(dev))) { if (resource_disabled("em", device_get_unit(dev))) {
device_printf(dev, "Disabled by device hint\n"); device_printf(dev, "Disabled by device hint\n");
return (ENXIO); return (ENXIO);
} }
#endif
adapter = device_get_softc(dev); adapter = device_get_softc(dev);
adapter->dev = adapter->osdep.dev = dev; adapter->dev = adapter->osdep.dev = dev;
@@ -724,8 +730,10 @@ em_attach(device_t dev)
adapter->ifp->if_drv_flags &= ~IFF_DRV_RUNNING; adapter->ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
adapter->ifp->if_drv_flags |= IFF_DRV_OACTIVE; adapter->ifp->if_drv_flags |= IFF_DRV_OACTIVE;
#ifndef __HAIKU__
adapter->led_dev = led_create(em_led_func, adapter, adapter->led_dev = led_create(em_led_func, adapter,
device_get_nameunit(dev)); device_get_nameunit(dev));
#endif
#ifdef DEV_NETMAP #ifdef DEV_NETMAP
em_netmap_attach(adapter); em_netmap_attach(adapter);
#endif /* DEV_NETMAP */ #endif /* DEV_NETMAP */
@@ -776,9 +784,10 @@ em_detach(device_t dev)
if (ifp->if_capenable & IFCAP_POLLING) if (ifp->if_capenable & IFCAP_POLLING)
ether_poll_deregister(ifp); ether_poll_deregister(ifp);
#endif #endif
#ifndef __HAIKU__
if (adapter->led_dev != NULL) if (adapter->led_dev != NULL)
led_destroy(adapter->led_dev); led_destroy(adapter->led_dev);
#endif
EM_CORE_LOCK(adapter); EM_CORE_LOCK(adapter);
adapter->in_detach = 1; adapter->in_detach = 1;
@@ -863,7 +872,8 @@ em_resume(device_t dev)
if ((ifp->if_flags & IFF_UP) && if ((ifp->if_flags & IFF_UP) &&
(ifp->if_drv_flags & IFF_DRV_RUNNING) && adapter->link_active) { (ifp->if_drv_flags & IFF_DRV_RUNNING) && adapter->link_active) {
for (int i = 0; i < adapter->num_queues; i++, txr++) { int i;
for (i = 0; i < adapter->num_queues; i++, txr++) {
EM_TX_LOCK(txr); EM_TX_LOCK(txr);
#ifdef EM_MULTIQUEUE #ifdef EM_MULTIQUEUE
if (!drbr_empty(ifp, txr->br)) if (!drbr_empty(ifp, txr->br))
@@ -967,11 +977,12 @@ em_mq_start(struct ifnet *ifp, struct mbuf *m)
static void static void
em_qflush(struct ifnet *ifp) em_qflush(struct ifnet *ifp)
{ {
int i;
struct adapter *adapter = ifp->if_softc; struct adapter *adapter = ifp->if_softc;
struct tx_ring *txr = adapter->tx_rings; struct tx_ring *txr = adapter->tx_rings;
struct mbuf *m; struct mbuf *m;
for (int i = 0; i < adapter->num_queues; i++, txr++) { for (i = 0; i < adapter->num_queues; i++, txr++) {
EM_TX_LOCK(txr); EM_TX_LOCK(txr);
while ((m = buf_ring_dequeue_sc(txr->br)) != NULL) while ((m = buf_ring_dequeue_sc(txr->br)) != NULL)
m_freem(m); m_freem(m);
@@ -1654,7 +1665,8 @@ em_handle_link(void *context, int pending)
E1000_WRITE_REG(&adapter->hw, E1000_IMS, E1000_WRITE_REG(&adapter->hw, E1000_IMS,
EM_MSIX_LINK | E1000_IMS_LSC); EM_MSIX_LINK | E1000_IMS_LSC);
if (adapter->link_active) { if (adapter->link_active) {
for (int i = 0; i < adapter->num_queues; i++, txr++) { int i;
for (i = 0; i < adapter->num_queues; i++, txr++) {
EM_TX_LOCK(txr); EM_TX_LOCK(txr);
#ifdef EM_MULTIQUEUE #ifdef EM_MULTIQUEUE
if (!drbr_empty(ifp, txr->br)) if (!drbr_empty(ifp, txr->br))
@@ -2214,6 +2226,7 @@ em_set_multi(struct adapter *adapter)
static void static void
em_local_timer(void *arg) em_local_timer(void *arg)
{ {
int i;
struct adapter *adapter = arg; struct adapter *adapter = arg;
struct ifnet *ifp = adapter->ifp; struct ifnet *ifp = adapter->ifp;
struct tx_ring *txr = adapter->tx_rings; struct tx_ring *txr = adapter->tx_rings;
@@ -2241,7 +2254,7 @@ em_local_timer(void *arg)
** can be done without the lock because its RO ** can be done without the lock because its RO
** and the HUNG state will be static if set. ** and the HUNG state will be static if set.
*/ */
for (int i = 0; i < adapter->num_queues; i++, txr++) { for (i = 0; i < adapter->num_queues; i++, txr++) {
if ((txr->queue_status == EM_QUEUE_HUNG) && if ((txr->queue_status == EM_QUEUE_HUNG) &&
(adapter->pause_frames == 0)) (adapter->pause_frames == 0))
goto hung; goto hung;
@@ -2332,13 +2345,14 @@ em_update_link_status(struct adapter *adapter)
ifp->if_baudrate = adapter->link_speed * 1000000; ifp->if_baudrate = adapter->link_speed * 1000000;
if_link_state_change(ifp, LINK_STATE_UP); if_link_state_change(ifp, LINK_STATE_UP);
} else if (!link_check && (adapter->link_active == 1)) { } else if (!link_check && (adapter->link_active == 1)) {
int i;
ifp->if_baudrate = adapter->link_speed = 0; ifp->if_baudrate = adapter->link_speed = 0;
adapter->link_duplex = 0; adapter->link_duplex = 0;
if (bootverbose) if (bootverbose)
device_printf(dev, "Link is Down\n"); device_printf(dev, "Link is Down\n");
adapter->link_active = 0; adapter->link_active = 0;
/* Link down, disable watchdog */ /* Link down, disable watchdog */
for (int i = 0; i < adapter->num_queues; i++, txr++) for (i = 0; i < adapter->num_queues; i++, txr++)
txr->queue_status = EM_QUEUE_IDLE; txr->queue_status = EM_QUEUE_IDLE;
if_link_state_change(ifp, LINK_STATE_DOWN); if_link_state_change(ifp, LINK_STATE_DOWN);
} }
@@ -2356,6 +2370,7 @@ em_update_link_status(struct adapter *adapter)
static void static void
em_stop(void *arg) em_stop(void *arg)
{ {
int i;
struct adapter *adapter = arg; struct adapter *adapter = arg;
struct ifnet *ifp = adapter->ifp; struct ifnet *ifp = adapter->ifp;
struct tx_ring *txr = adapter->tx_rings; struct tx_ring *txr = adapter->tx_rings;
@@ -2372,7 +2387,7 @@ em_stop(void *arg)
ifp->if_drv_flags |= IFF_DRV_OACTIVE; ifp->if_drv_flags |= IFF_DRV_OACTIVE;
/* Unarm watchdog timer. */ /* Unarm watchdog timer. */
for (int i = 0; i < adapter->num_queues; i++, txr++) { for (i = 0; i < adapter->num_queues; i++, txr++) {
EM_TX_LOCK(txr); EM_TX_LOCK(txr);
txr->queue_status = EM_QUEUE_IDLE; txr->queue_status = EM_QUEUE_IDLE;
EM_TX_UNLOCK(txr); EM_TX_UNLOCK(txr);
@@ -2521,6 +2536,7 @@ em_allocate_legacy(struct adapter *adapter)
int int
em_allocate_msix(struct adapter *adapter) em_allocate_msix(struct adapter *adapter)
{ {
int i;
device_t dev = adapter->dev; device_t dev = adapter->dev;
struct tx_ring *txr = adapter->tx_rings; struct tx_ring *txr = adapter->tx_rings;
struct rx_ring *rxr = adapter->rx_rings; struct rx_ring *rxr = adapter->rx_rings;
@@ -2531,7 +2547,7 @@ em_allocate_msix(struct adapter *adapter)
E1000_WRITE_REG(&adapter->hw, E1000_IMC, 0xffffffff); E1000_WRITE_REG(&adapter->hw, E1000_IMC, 0xffffffff);
/* First set up ring resources */ /* First set up ring resources */
for (int i = 0; i < adapter->num_queues; i++, txr++, rxr++) { for (i = 0; i < adapter->num_queues; i++, txr++, rxr++) {
/* RX ring */ /* RX ring */
rid = vector + 1; rid = vector + 1;
@@ -2635,6 +2651,7 @@ em_allocate_msix(struct adapter *adapter)
static void static void
em_free_pci_resources(struct adapter *adapter) em_free_pci_resources(struct adapter *adapter)
{ {
int i;
device_t dev = adapter->dev; device_t dev = adapter->dev;
struct tx_ring *txr; struct tx_ring *txr;
struct rx_ring *rxr; struct rx_ring *rxr;
@@ -2644,7 +2661,7 @@ em_free_pci_resources(struct adapter *adapter)
/* /*
** Release all the queue interrupt resources: ** Release all the queue interrupt resources:
*/ */
for (int i = 0; i < adapter->num_queues; i++) { for (i = 0; i < adapter->num_queues; i++) {
txr = &adapter->tx_rings[i]; txr = &adapter->tx_rings[i];
rxr = &adapter->rx_rings[i]; rxr = &adapter->rx_rings[i];
/* an early abort? */ /* an early abort? */
@@ -3115,6 +3132,7 @@ em_dma_free(struct adapter *adapter, struct em_dma_alloc *dma)
static int static int
em_allocate_queues(struct adapter *adapter) em_allocate_queues(struct adapter *adapter)
{ {
int i;
device_t dev = adapter->dev; device_t dev = adapter->dev;
struct tx_ring *txr = NULL; struct tx_ring *txr = NULL;
struct rx_ring *rxr = NULL; struct rx_ring *rxr = NULL;
@@ -3147,7 +3165,7 @@ em_allocate_queues(struct adapter *adapter)
* possibility that things fail midcourse and we need to * possibility that things fail midcourse and we need to
* undo memory gracefully * undo memory gracefully
*/ */
for (int i = 0; i < adapter->num_queues; i++, txconf++) { for (i = 0; i < adapter->num_queues; i++, txconf++) {
/* Set up some basics */ /* Set up some basics */
txr = &adapter->tx_rings[i]; txr = &adapter->tx_rings[i];
txr->adapter = adapter; txr->adapter = adapter;
@@ -3174,10 +3192,12 @@ em_allocate_queues(struct adapter *adapter)
error = ENOMEM; error = ENOMEM;
goto err_tx_desc; goto err_tx_desc;
} }
#ifndef __HAIKU__
#if __FreeBSD_version >= 800000 #if __FreeBSD_version >= 800000
/* Allocate a buf ring */ /* Allocate a buf ring */
txr->br = buf_ring_alloc(4096, M_DEVBUF, txr->br = buf_ring_alloc(4096, M_DEVBUF,
M_WAITOK, &txr->tx_mtx); M_WAITOK, &txr->tx_mtx);
#endif
#endif #endif
} }
@@ -3186,7 +3206,7 @@ em_allocate_queues(struct adapter *adapter)
*/ */
rsize = roundup2(adapter->num_rx_desc * rsize = roundup2(adapter->num_rx_desc *
sizeof(struct e1000_rx_desc), EM_DBA_ALIGN); sizeof(struct e1000_rx_desc), EM_DBA_ALIGN);
for (int i = 0; i < adapter->num_queues; i++, rxconf++) { for (i = 0; i < adapter->num_queues; i++, rxconf++) {
rxr = &adapter->rx_rings[i]; rxr = &adapter->rx_rings[i];
rxr->adapter = adapter; rxr->adapter = adapter;
rxr->me = i; rxr->me = i;
@@ -3225,8 +3245,10 @@ err_tx_desc:
em_dma_free(adapter, &txr->txdma); em_dma_free(adapter, &txr->txdma);
free(adapter->rx_rings, M_DEVBUF); free(adapter->rx_rings, M_DEVBUF);
rx_fail: rx_fail:
#ifndef __HAIKU__
#if __FreeBSD_version >= 800000 #if __FreeBSD_version >= 800000
buf_ring_free(txr->br, M_DEVBUF); buf_ring_free(txr->br, M_DEVBUF);
#endif
#endif #endif
free(adapter->tx_rings, M_DEVBUF); free(adapter->tx_rings, M_DEVBUF);
fail: fail:
@@ -3372,9 +3394,10 @@ em_setup_transmit_ring(struct tx_ring *txr)
static void static void
em_setup_transmit_structures(struct adapter *adapter) em_setup_transmit_structures(struct adapter *adapter)
{ {
int i;
struct tx_ring *txr = adapter->tx_rings; struct tx_ring *txr = adapter->tx_rings;
for (int i = 0; i < adapter->num_queues; i++, txr++) for (i = 0; i < adapter->num_queues; i++, txr++)
em_setup_transmit_ring(txr); em_setup_transmit_ring(txr);
return; return;
@@ -3388,13 +3411,14 @@ em_setup_transmit_structures(struct adapter *adapter)
static void static void
em_initialize_transmit_unit(struct adapter *adapter) em_initialize_transmit_unit(struct adapter *adapter)
{ {
int i;
struct tx_ring *txr = adapter->tx_rings; struct tx_ring *txr = adapter->tx_rings;
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
u32 tctl, tarc, tipg = 0; u32 tctl, tarc, tipg = 0;
INIT_DEBUGOUT("em_initialize_transmit_unit: begin"); INIT_DEBUGOUT("em_initialize_transmit_unit: begin");
for (int i = 0; i < adapter->num_queues; i++, txr++) { for (i = 0; i < adapter->num_queues; i++, txr++) {
u64 bus_addr = txr->txdma.dma_paddr; u64 bus_addr = txr->txdma.dma_paddr;
/* Base and Len of TX Ring */ /* Base and Len of TX Ring */
E1000_WRITE_REG(hw, E1000_TDLEN(i), E1000_WRITE_REG(hw, E1000_TDLEN(i),
@@ -3480,9 +3504,10 @@ em_initialize_transmit_unit(struct adapter *adapter)
static void static void
em_free_transmit_structures(struct adapter *adapter) em_free_transmit_structures(struct adapter *adapter)
{ {
int i;
struct tx_ring *txr = adapter->tx_rings; struct tx_ring *txr = adapter->tx_rings;
for (int i = 0; i < adapter->num_queues; i++, txr++) { for (i = 0; i < adapter->num_queues; i++, txr++) {
EM_TX_LOCK(txr); EM_TX_LOCK(txr);
em_free_transmit_buffers(txr); em_free_transmit_buffers(txr);
em_dma_free(adapter, &txr->txdma); em_dma_free(adapter, &txr->txdma);
@@ -3501,6 +3526,7 @@ em_free_transmit_structures(struct adapter *adapter)
static void static void
em_free_transmit_buffers(struct tx_ring *txr) em_free_transmit_buffers(struct tx_ring *txr)
{ {
int i;
struct adapter *adapter = txr->adapter; struct adapter *adapter = txr->adapter;
struct em_buffer *txbuf; struct em_buffer *txbuf;
@@ -3509,7 +3535,7 @@ em_free_transmit_buffers(struct tx_ring *txr)
if (txr->tx_buffers == NULL) if (txr->tx_buffers == NULL)
return; return;
for (int i = 0; i < adapter->num_tx_desc; i++) { for (i = 0; i < adapter->num_tx_desc; i++) {
txbuf = &txr->tx_buffers[i]; txbuf = &txr->tx_buffers[i];
if (txbuf->m_head != NULL) { if (txbuf->m_head != NULL) {
bus_dmamap_sync(txr->txtag, txbuf->map, bus_dmamap_sync(txr->txtag, txbuf->map,
@@ -3531,9 +3557,11 @@ em_free_transmit_buffers(struct tx_ring *txr)
txbuf->map = NULL; txbuf->map = NULL;
} }
} }
#ifndef __HAIKU__
#if __FreeBSD_version >= 800000 #if __FreeBSD_version >= 800000
if (txr->br != NULL) if (txr->br != NULL)
buf_ring_free(txr->br, M_DEVBUF); buf_ring_free(txr->br, M_DEVBUF);
#endif
#endif #endif
if (txr->tx_buffers != NULL) { if (txr->tx_buffers != NULL) {
free(txr->tx_buffers, M_DEVBUF); free(txr->tx_buffers, M_DEVBUF);
@@ -3989,6 +4017,7 @@ update:
static int static int
em_allocate_receive_buffers(struct rx_ring *rxr) em_allocate_receive_buffers(struct rx_ring *rxr)
{ {
int i;
struct adapter *adapter = rxr->adapter; struct adapter *adapter = rxr->adapter;
device_t dev = adapter->dev; device_t dev = adapter->dev;
struct em_buffer *rxbuf; struct em_buffer *rxbuf;
@@ -4020,7 +4049,7 @@ em_allocate_receive_buffers(struct rx_ring *rxr)
} }
rxbuf = rxr->rx_buffers; rxbuf = rxr->rx_buffers;
for (int i = 0; i < adapter->num_rx_desc; i++, rxbuf++) { for (i = 0; i < adapter->num_rx_desc; i++, rxbuf++) {
rxbuf = &rxr->rx_buffers[i]; rxbuf = &rxr->rx_buffers[i];
error = bus_dmamap_create(rxr->rxtag, BUS_DMA_NOWAIT, error = bus_dmamap_create(rxr->rxtag, BUS_DMA_NOWAIT,
&rxbuf->map); &rxbuf->map);
@@ -4047,6 +4076,7 @@ fail:
static int static int
em_setup_receive_ring(struct rx_ring *rxr) em_setup_receive_ring(struct rx_ring *rxr)
{ {
int i, j;
struct adapter *adapter = rxr->adapter; struct adapter *adapter = rxr->adapter;
struct em_buffer *rxbuf; struct em_buffer *rxbuf;
bus_dma_segment_t seg[1]; bus_dma_segment_t seg[1];
@@ -4069,7 +4099,7 @@ em_setup_receive_ring(struct rx_ring *rxr)
/* /*
** Free current RX buffer structs and their mbufs ** Free current RX buffer structs and their mbufs
*/ */
for (int i = 0; i < adapter->num_rx_desc; i++) { for (i = 0; i < adapter->num_rx_desc; i++) {
rxbuf = &rxr->rx_buffers[i]; rxbuf = &rxr->rx_buffers[i];
if (rxbuf->m_head != NULL) { if (rxbuf->m_head != NULL) {
bus_dmamap_sync(rxr->rxtag, rxbuf->map, bus_dmamap_sync(rxr->rxtag, rxbuf->map,
@@ -4081,7 +4111,7 @@ em_setup_receive_ring(struct rx_ring *rxr)
} }
/* Now replenish the mbufs */ /* Now replenish the mbufs */
for (int j = 0; j != adapter->num_rx_desc; ++j) { for (j = 0; j != adapter->num_rx_desc; ++j) {
rxbuf = &rxr->rx_buffers[j]; rxbuf = &rxr->rx_buffers[j];
#ifdef DEV_NETMAP #ifdef DEV_NETMAP
if (slot) { if (slot) {
@@ -4139,6 +4169,7 @@ fail:
static int static int
em_setup_receive_structures(struct adapter *adapter) em_setup_receive_structures(struct adapter *adapter)
{ {
int i, n;
struct rx_ring *rxr = adapter->rx_rings; struct rx_ring *rxr = adapter->rx_rings;
int q; int q;
@@ -4153,9 +4184,9 @@ fail:
* the rings that completed, the failing case will have * the rings that completed, the failing case will have
* cleaned up for itself. 'q' failed, so its the terminus. * cleaned up for itself. 'q' failed, so its the terminus.
*/ */
for (int i = 0; i < q; ++i) { for (i = 0; i < q; ++i) {
rxr = &adapter->rx_rings[i]; rxr = &adapter->rx_rings[i];
for (int n = 0; n < adapter->num_rx_desc; n++) { for (n = 0; n < adapter->num_rx_desc; n++) {
struct em_buffer *rxbuf; struct em_buffer *rxbuf;
rxbuf = &rxr->rx_buffers[n]; rxbuf = &rxr->rx_buffers[n];
if (rxbuf->m_head != NULL) { if (rxbuf->m_head != NULL) {
@@ -4181,9 +4212,10 @@ fail:
static void static void
em_free_receive_structures(struct adapter *adapter) em_free_receive_structures(struct adapter *adapter)
{ {
int i;
struct rx_ring *rxr = adapter->rx_rings; struct rx_ring *rxr = adapter->rx_rings;
for (int i = 0; i < adapter->num_queues; i++, rxr++) { for (i = 0; i < adapter->num_queues; i++, rxr++) {
em_free_receive_buffers(rxr); em_free_receive_buffers(rxr);
/* Free the ring memory as well */ /* Free the ring memory as well */
em_dma_free(adapter, &rxr->rxdma); em_dma_free(adapter, &rxr->rxdma);
@@ -4208,7 +4240,8 @@ em_free_receive_buffers(struct rx_ring *rxr)
INIT_DEBUGOUT("free_receive_buffers: begin"); INIT_DEBUGOUT("free_receive_buffers: begin");
if (rxr->rx_buffers != NULL) { if (rxr->rx_buffers != NULL) {
for (int i = 0; i < adapter->num_rx_desc; i++) { int i;
for (i = 0; i < adapter->num_rx_desc; i++) {
rxbuf = &rxr->rx_buffers[i]; rxbuf = &rxr->rx_buffers[i];
if (rxbuf->map != NULL) { if (rxbuf->map != NULL) {
bus_dmamap_sync(rxr->rxtag, rxbuf->map, bus_dmamap_sync(rxr->rxtag, rxbuf->map,
@@ -4247,6 +4280,7 @@ em_free_receive_buffers(struct rx_ring *rxr)
static void static void
em_initialize_receive_unit(struct adapter *adapter) em_initialize_receive_unit(struct adapter *adapter)
{ {
int i;
struct rx_ring *rxr = adapter->rx_rings; struct rx_ring *rxr = adapter->rx_rings;
struct ifnet *ifp = adapter->ifp; struct ifnet *ifp = adapter->ifp;
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
@@ -4277,7 +4311,8 @@ em_initialize_receive_unit(struct adapter *adapter)
** using the EITR register (82574 only) ** using the EITR register (82574 only)
*/ */
if (hw->mac.type == e1000_82574) { if (hw->mac.type == e1000_82574) {
for (int i = 0; i < 4; i++) int i;
for (i = 0; i < 4; i++)
E1000_WRITE_REG(hw, E1000_EITR_82574(i), E1000_WRITE_REG(hw, E1000_EITR_82574(i),
DEFAULT_ITR); DEFAULT_ITR);
/* Disable accelerated acknowledge */ /* Disable accelerated acknowledge */
@@ -4300,7 +4335,7 @@ em_initialize_receive_unit(struct adapter *adapter)
if (hw->mac.type == e1000_82573) if (hw->mac.type == e1000_82573)
E1000_WRITE_REG(hw, E1000_RDTR, 0x20); E1000_WRITE_REG(hw, E1000_RDTR, 0x20);
for (int i = 0; i < adapter->num_queues; i++, rxr++) { for (i = 0; i < adapter->num_queues; i++, rxr++) {
/* Setup the Base and Length of the Rx Descriptor Ring */ /* Setup the Base and Length of the Rx Descriptor Ring */
bus_addr = rxr->rxdma.dma_paddr; bus_addr = rxr->rxdma.dma_paddr;
E1000_WRITE_REG(hw, E1000_RDLEN(i), E1000_WRITE_REG(hw, E1000_RDLEN(i),
@@ -4691,6 +4726,7 @@ em_unregister_vlan(void *arg, struct ifnet *ifp, u16 vtag)
static void static void
em_setup_vlan_hw_support(struct adapter *adapter) em_setup_vlan_hw_support(struct adapter *adapter)
{ {
int i;
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
u32 reg; u32 reg;
@@ -4707,7 +4743,7 @@ em_setup_vlan_hw_support(struct adapter *adapter)
** A soft reset zero's out the VFTA, so ** A soft reset zero's out the VFTA, so
** we need to repopulate it now. ** we need to repopulate it now.
*/ */
for (int i = 0; i < EM_VFTA_SIZE; i++) for (i = 0; i < EM_VFTA_SIZE; i++)
if (adapter->shadow_vfta[i] != 0) if (adapter->shadow_vfta[i] != 0)
E1000_WRITE_REG_ARRAY(hw, E1000_VFTA, E1000_WRITE_REG_ARRAY(hw, E1000_VFTA,
i, adapter->shadow_vfta[i]); i, adapter->shadow_vfta[i]);
@@ -5008,6 +5044,7 @@ em_enable_wakeup(device_t dev)
static int static int
em_enable_phy_wakeup(struct adapter *adapter) em_enable_phy_wakeup(struct adapter *adapter)
{ {
int i;
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
u32 mreg, ret = 0; u32 mreg, ret = 0;
u16 preg; u16 preg;
@@ -5016,7 +5053,7 @@ em_enable_phy_wakeup(struct adapter *adapter)
e1000_copy_rx_addrs_to_phy_ich8lan(hw); e1000_copy_rx_addrs_to_phy_ich8lan(hw);
/* copy MAC MTA to PHY MTA */ /* copy MAC MTA to PHY MTA */
for (int i = 0; i < adapter->hw.mac.mta_reg_count; i++) { for (i = 0; i < adapter->hw.mac.mta_reg_count; i++) {
mreg = E1000_READ_REG_ARRAY(hw, E1000_MTA, i); mreg = E1000_READ_REG_ARRAY(hw, E1000_MTA, i);
e1000_write_phy_reg(hw, BM_MTA(i), (u16)(mreg & 0xFFFF)); e1000_write_phy_reg(hw, BM_MTA(i), (u16)(mreg & 0xFFFF));
e1000_write_phy_reg(hw, BM_MTA(i) + 1, e1000_write_phy_reg(hw, BM_MTA(i) + 1,
@@ -5244,8 +5281,10 @@ em_sysctl_reg_handler(SYSCTL_HANDLER_ARGS)
struct adapter *adapter; struct adapter *adapter;
u_int val; u_int val;
#ifndef __HAIKU__
adapter = oidp->oid_arg1; adapter = oidp->oid_arg1;
val = E1000_READ_REG(&adapter->hw, oidp->oid_arg2); val = E1000_READ_REG(&adapter->hw, oidp->oid_arg2);
#endif
return (sysctl_handle_int(oidp, &val, 0, req)); return (sysctl_handle_int(oidp, &val, 0, req));
} }
@@ -5255,6 +5294,7 @@ em_sysctl_reg_handler(SYSCTL_HANDLER_ARGS)
static void static void
em_add_hw_stats(struct adapter *adapter) em_add_hw_stats(struct adapter *adapter)
{ {
int i;
device_t dev = adapter->dev; device_t dev = adapter->dev;
struct tx_ring *txr = adapter->tx_rings; struct tx_ring *txr = adapter->tx_rings;
@@ -5309,7 +5349,7 @@ em_add_hw_stats(struct adapter *adapter)
CTLFLAG_RD, &adapter->hw.fc.low_water, 0, CTLFLAG_RD, &adapter->hw.fc.low_water, 0,
"Flow Control Low Watermark"); "Flow Control Low Watermark");
for (int i = 0; i < adapter->num_queues; i++, rxr++, txr++) { for (i = 0; i < adapter->num_queues; i++, rxr++, txr++) {
snprintf(namebuf, QUEUE_NAME_LEN, "queue%d", i); snprintf(namebuf, QUEUE_NAME_LEN, "queue%d", i);
queue_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, namebuf, queue_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, namebuf,
CTLFLAG_RD, NULL, "Queue Name"); CTLFLAG_RD, NULL, "Queue Name");
@@ -213,9 +213,11 @@
#define EM_MSIX_BAR 3 /* On 82575 */ #define EM_MSIX_BAR 3 /* On 82575 */
/* More backward compatibility */ /* More backward compatibility */
#ifndef __HAIKU__
#if __FreeBSD_version < 900000 #if __FreeBSD_version < 900000
#define SYSCTL_ADD_UQUAD SYSCTL_ADD_QUAD #define SYSCTL_ADD_UQUAD SYSCTL_ADD_QUAD
#endif #endif
#endif
/* Defines for printing debug information */ /* Defines for printing debug information */
#define DEBUG_INIT 0 #define DEBUG_INIT 0
@@ -75,7 +75,9 @@
#include <netinet/udp.h> #include <netinet/udp.h>
#include <machine/in_cksum.h> #include <machine/in_cksum.h>
#ifndef __HAIKU__
#include <dev/led/led.h> #include <dev/led/led.h>
#endif
#include <dev/pci/pcivar.h> #include <dev/pci/pcivar.h>
#include <dev/pci/pcireg.h> #include <dev/pci/pcireg.h>
@@ -268,12 +270,21 @@ static device_method_t lem_methods[] = {
{0, 0} {0, 0}
}; };
#ifndef __HAIKU__
static driver_t lem_driver = { static driver_t lem_driver = {
"em", lem_methods, sizeof(struct adapter), "em", lem_methods, sizeof(struct adapter),
}; };
extern devclass_t em_devclass; extern devclass_t em_devclass;
DRIVER_MODULE(lem, pci, lem_driver, em_devclass, 0, 0); DRIVER_MODULE(lem, pci, lem_driver, em_devclass, 0, 0);
#else
static driver_t lem_driver = {
"lem", lem_methods, sizeof(struct adapter),
};
devclass_t lem_devclass;
DRIVER_MODULE(lem, pci, lem_driver, lem_devclass, 0, 0);
#endif
MODULE_DEPEND(lem, pci, 1, 1, 1); MODULE_DEPEND(lem, pci, 1, 1, 1);
MODULE_DEPEND(lem, ether, 1, 1, 1); MODULE_DEPEND(lem, ether, 1, 1, 1);
@@ -391,10 +402,12 @@ lem_attach(device_t dev)
INIT_DEBUGOUT("lem_attach: begin"); INIT_DEBUGOUT("lem_attach: begin");
#ifndef __HAIKU__
if (resource_disabled("lem", device_get_unit(dev))) { if (resource_disabled("lem", device_get_unit(dev))) {
device_printf(dev, "Disabled by device hint\n"); device_printf(dev, "Disabled by device hint\n");
return (ENXIO); return (ENXIO);
} }
#endif
adapter = device_get_softc(dev); adapter = device_get_softc(dev);
adapter->dev = adapter->osdep.dev = dev; adapter->dev = adapter->osdep.dev = dev;
@@ -653,8 +666,10 @@ lem_attach(device_t dev)
/* Tell the stack that the interface is not active */ /* Tell the stack that the interface is not active */
adapter->ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); adapter->ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
#ifndef __HAIKU__
adapter->led_dev = led_create(lem_led_func, adapter, adapter->led_dev = led_create(lem_led_func, adapter,
device_get_nameunit(dev)); device_get_nameunit(dev));
#endif
#ifdef DEV_NETMAP #ifdef DEV_NETMAP
lem_netmap_attach(adapter); lem_netmap_attach(adapter);
@@ -713,8 +728,10 @@ lem_detach(device_t dev)
ether_poll_deregister(ifp); ether_poll_deregister(ifp);
#endif #endif
#ifndef __HAIKU__
if (adapter->led_dev != NULL) if (adapter->led_dev != NULL)
led_destroy(adapter->led_dev); led_destroy(adapter->led_dev);
#endif
EM_CORE_LOCK(adapter); EM_CORE_LOCK(adapter);
EM_TX_LOCK(adapter); EM_TX_LOCK(adapter);
@@ -2591,6 +2608,7 @@ lem_dma_free(struct adapter *adapter, struct em_dma_alloc *dma)
static int static int
lem_allocate_transmit_structures(struct adapter *adapter) lem_allocate_transmit_structures(struct adapter *adapter)
{ {
int i;
device_t dev = adapter->dev; device_t dev = adapter->dev;
struct em_buffer *tx_buffer; struct em_buffer *tx_buffer;
int error; int error;
@@ -2623,7 +2641,7 @@ lem_allocate_transmit_structures(struct adapter *adapter)
} }
/* Create the descriptor buffer dma maps */ /* Create the descriptor buffer dma maps */
for (int i = 0; i < adapter->num_tx_desc; i++) { for (i = 0; i < adapter->num_tx_desc; i++) {
tx_buffer = &adapter->tx_buffer_area[i]; tx_buffer = &adapter->tx_buffer_area[i];
error = bus_dmamap_create(adapter->txtag, 0, &tx_buffer->map); error = bus_dmamap_create(adapter->txtag, 0, &tx_buffer->map);
if (error != 0) { if (error != 0) {
@@ -2647,6 +2665,7 @@ fail:
static void static void
lem_setup_transmit_structures(struct adapter *adapter) lem_setup_transmit_structures(struct adapter *adapter)
{ {
int i;
struct em_buffer *tx_buffer; struct em_buffer *tx_buffer;
#ifdef DEV_NETMAP #ifdef DEV_NETMAP
/* we are already locked */ /* we are already locked */
@@ -2659,7 +2678,7 @@ lem_setup_transmit_structures(struct adapter *adapter)
(sizeof(struct e1000_tx_desc)) * adapter->num_tx_desc); (sizeof(struct e1000_tx_desc)) * adapter->num_tx_desc);
/* Free any existing TX buffers */ /* Free any existing TX buffers */
for (int i = 0; i < adapter->num_tx_desc; i++, tx_buffer++) { for (i = 0; i < adapter->num_tx_desc; i++, tx_buffer++) {
tx_buffer = &adapter->tx_buffer_area[i]; tx_buffer = &adapter->tx_buffer_area[i];
bus_dmamap_sync(adapter->txtag, tx_buffer->map, bus_dmamap_sync(adapter->txtag, tx_buffer->map,
BUS_DMASYNC_POSTWRITE); BUS_DMASYNC_POSTWRITE);
@@ -2775,7 +2794,8 @@ lem_free_transmit_structures(struct adapter *adapter)
INIT_DEBUGOUT("free_transmit_structures: begin"); INIT_DEBUGOUT("free_transmit_structures: begin");
if (adapter->tx_buffer_area != NULL) { if (adapter->tx_buffer_area != NULL) {
for (int i = 0; i < adapter->num_tx_desc; i++) { int i;
for (i = 0; i < adapter->num_tx_desc; i++) {
tx_buffer = &adapter->tx_buffer_area[i]; tx_buffer = &adapter->tx_buffer_area[i];
if (tx_buffer->m_head != NULL) { if (tx_buffer->m_head != NULL) {
bus_dmamap_sync(adapter->txtag, tx_buffer->map, bus_dmamap_sync(adapter->txtag, tx_buffer->map,
@@ -2802,10 +2822,12 @@ lem_free_transmit_structures(struct adapter *adapter)
bus_dma_tag_destroy(adapter->txtag); bus_dma_tag_destroy(adapter->txtag);
adapter->txtag = NULL; adapter->txtag = NULL;
} }
#ifndef __HAIKU__
#if __FreeBSD_version >= 800000 #if __FreeBSD_version >= 800000
if (adapter->br != NULL) if (adapter->br != NULL)
buf_ring_free(adapter->br, M_DEVBUF); buf_ring_free(adapter->br, M_DEVBUF);
#endif #endif
#endif
} }
/********************************************************************* /*********************************************************************
@@ -3278,6 +3300,7 @@ lem_setup_receive_structures(struct adapter *adapter)
static void static void
lem_initialize_receive_unit(struct adapter *adapter) lem_initialize_receive_unit(struct adapter *adapter)
{ {
int i;
struct ifnet *ifp = adapter->ifp; struct ifnet *ifp = adapter->ifp;
u64 bus_addr; u64 bus_addr;
u32 rctl, rxcsum; u32 rctl, rxcsum;
@@ -3306,7 +3329,7 @@ lem_initialize_receive_unit(struct adapter *adapter)
** using the EITR register (82574 only) ** using the EITR register (82574 only)
*/ */
if (adapter->msix) if (adapter->msix)
for (int i = 0; i < 4; i++) for (i = 0; i < 4; i++)
E1000_WRITE_REG(&adapter->hw, E1000_WRITE_REG(&adapter->hw,
E1000_EITR_82574(i), DEFAULT_ITR); E1000_EITR_82574(i), DEFAULT_ITR);
@@ -3460,7 +3483,7 @@ lem_free_receive_structures(struct adapter *adapter)
static bool static bool
lem_rxeof(struct adapter *adapter, int count, int *done) lem_rxeof(struct adapter *adapter, int count, int *done)
{ {
struct ifnet *ifp = adapter->ifp;; struct ifnet *ifp = adapter->ifp;
struct mbuf *mp; struct mbuf *mp;
u8 status = 0, accept_frame = 0, eop = 0; u8 status = 0, accept_frame = 0, eop = 0;
u16 len, desc_len, prev_len_adj; u16 len, desc_len, prev_len_adj;
@@ -3792,6 +3815,7 @@ lem_unregister_vlan(void *arg, struct ifnet *ifp, u16 vtag)
static void static void
lem_setup_vlan_hw_support(struct adapter *adapter) lem_setup_vlan_hw_support(struct adapter *adapter)
{ {
int i;
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
u32 reg; u32 reg;
@@ -3808,7 +3832,7 @@ lem_setup_vlan_hw_support(struct adapter *adapter)
** A soft reset zero's out the VFTA, so ** A soft reset zero's out the VFTA, so
** we need to repopulate it now. ** we need to repopulate it now.
*/ */
for (int i = 0; i < EM_VFTA_SIZE; i++) for (i = 0; i < EM_VFTA_SIZE; i++)
if (adapter->shadow_vfta[i] != 0) if (adapter->shadow_vfta[i] != 0)
E1000_WRITE_REG_ARRAY(hw, E1000_VFTA, E1000_WRITE_REG_ARRAY(hw, E1000_VFTA,
i, adapter->shadow_vfta[i]); i, adapter->shadow_vfta[i]);
@@ -4073,12 +4097,13 @@ lem_enable_wakeup(device_t dev)
static int static int
lem_enable_phy_wakeup(struct adapter *adapter) lem_enable_phy_wakeup(struct adapter *adapter)
{ {
int i;
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
u32 mreg, ret = 0; u32 mreg, ret = 0;
u16 preg; u16 preg;
/* copy MAC RARs to PHY RARs */ /* copy MAC RARs to PHY RARs */
for (int i = 0; i < adapter->hw.mac.rar_entry_count; i++) { for (i = 0; i < adapter->hw.mac.rar_entry_count; i++) {
mreg = E1000_READ_REG(hw, E1000_RAL(i)); mreg = E1000_READ_REG(hw, E1000_RAL(i));
e1000_write_phy_reg(hw, BM_RAR_L(i), (u16)(mreg & 0xFFFF)); e1000_write_phy_reg(hw, BM_RAR_L(i), (u16)(mreg & 0xFFFF));
e1000_write_phy_reg(hw, BM_RAR_M(i), e1000_write_phy_reg(hw, BM_RAR_M(i),
@@ -4090,7 +4115,7 @@ lem_enable_phy_wakeup(struct adapter *adapter)
} }
/* copy MAC MTA to PHY MTA */ /* copy MAC MTA to PHY MTA */
for (int i = 0; i < adapter->hw.mac.mta_reg_count; i++) { for (i = 0; i < adapter->hw.mac.mta_reg_count; i++) {
mreg = E1000_READ_REG_ARRAY(hw, E1000_MTA, i); mreg = E1000_READ_REG_ARRAY(hw, E1000_MTA, i);
e1000_write_phy_reg(hw, BM_MTA(i), (u16)(mreg & 0xFFFF)); e1000_write_phy_reg(hw, BM_MTA(i), (u16)(mreg & 0xFFFF));
e1000_write_phy_reg(hw, BM_MTA(i) + 1, e1000_write_phy_reg(hw, BM_MTA(i) + 1,
@@ -4325,8 +4350,10 @@ lem_sysctl_reg_handler(SYSCTL_HANDLER_ARGS)
struct adapter *adapter; struct adapter *adapter;
u_int val; u_int val;
#ifndef __HAIKU__
adapter = oidp->oid_arg1; adapter = oidp->oid_arg1;
val = E1000_READ_REG(&adapter->hw, oidp->oid_arg2); val = E1000_READ_REG(&adapter->hw, oidp->oid_arg2);
#endif
return (sysctl_handle_int(oidp, &val, 0, req)); return (sysctl_handle_int(oidp, &val, 0, req));
} }
@@ -217,9 +217,11 @@
#define EM_BAR_MEM_TYPE_64BIT 0x00000004 #define EM_BAR_MEM_TYPE_64BIT 0x00000004
#define EM_MSIX_BAR 3 /* On 82575 */ #define EM_MSIX_BAR 3 /* On 82575 */
#ifndef __HAIKU__
#if __FreeBSD_version < 900000 #if __FreeBSD_version < 900000
#define SYSCTL_ADD_UQUAD SYSCTL_ADD_QUAD #define SYSCTL_ADD_UQUAD SYSCTL_ADD_QUAD
#endif #endif
#endif
/* Defines for printing debug information */ /* Defines for printing debug information */
#define DEBUG_INIT 0 #define DEBUG_INIT 0
@@ -122,12 +122,6 @@ struct ifmedia
uint32 ifm_media; uint32 ifm_media;
}; };
struct ifmediareq
{
uint32 ifm_status;
uint32 ifm_active;
};
struct if_queue struct if_queue
{ {
volatile struct mbuf * ifq_head; volatile struct mbuf * ifq_head;