BNX2X: hacked up receive Can receive ARPs and forwards them to devether. Will panic on tx_int.
diff --git a/kern/drivers/net/bnx2x/akaros_compat.h b/kern/drivers/net/bnx2x/akaros_compat.h index e7a10b3..ce9015d 100644 --- a/kern/drivers/net/bnx2x/akaros_compat.h +++ b/kern/drivers/net/bnx2x/akaros_compat.h
@@ -659,7 +659,7 @@ #define netif_running(dev) (TRUE) #define EPROBE_DEFER 1 -#define NET_SKB_PAD 32 /* we'll probably delete code using this */ +#define NET_SKB_PAD 0 /* padding for SKBs. Ignoring it for now */ #define MAX_SKB_FRAGS 16 /* we'll probably delete code using this */ #define VLAN_VID_MASK 0x0fff /* VLAN Identifier */
diff --git a/kern/drivers/net/bnx2x/bnx2x_cmn.c b/kern/drivers/net/bnx2x/bnx2x_cmn.c index 3353423..0553809 100644 --- a/kern/drivers/net/bnx2x/bnx2x_cmn.c +++ b/kern/drivers/net/bnx2x/bnx2x_cmn.c
@@ -901,6 +901,8 @@ union eth_rx_cqe *cqe; struct eth_fast_path_rx_cqe *cqe_fp; + struct block *block; + #ifdef BNX2X_STOP_ON_ERROR if (unlikely(bp->panic)) return 0; @@ -966,8 +968,6 @@ goto next_cqe; } -panic("Not implemented"); -#if 0 // AKAROS_PORT rx_buf = &fp->rx_buf_ring[bd_cons]; data = rx_buf->data; @@ -1042,16 +1042,19 @@ /* Since we don't have a jumbo ring * copy small packets if mtu > 1500 */ - if ((bp->dev->maxmtu > ETH_MAX_PACKET_SIZE) && - (len <= RX_COPY_THRESH)) { - skb = napi_alloc_skb(&fp->napi, len); - if (skb == NULL) { + /* TODO: AKAROS_PORT always copy out the packet for now. */ + if (1) { +// if ((bp->dev->maxmtu > ETH_MAX_PACKET_SIZE) && +// (len <= RX_COPY_THRESH)) { + block = iallocb(len); + if (block == NULL) { DP(NETIF_MSG_RX_ERR | NETIF_MSG_RX_STATUS, "ERROR packet dropped because of alloc failure\n"); bnx2x_fp_qstats(bp, fp)->rx_skb_alloc_failed++; goto reuse_rx; } - memcpy(skb->data, data + pad, len); + memcpy(block->wp, data + pad, len); + block->wp += len; bnx2x_reuse_rx_data(fp, bd_cons, bd_prod); } else { if (likely(bnx2x_alloc_rx_data(bp, fp, bd_prod, @@ -1060,6 +1063,9 @@ dma_unmap_addr(rx_buf, mapping), fp->rx_buf_size, DMA_FROM_DEVICE); + /* TODO: block extra data here */ + panic("Extra-data not implemented"); + #if 0 // AKAROS_PORT skb = build_skb(data, fp->rx_frag_size); if (unlikely(!skb)) { bnx2x_frag_free(fp, data); @@ -1068,6 +1074,7 @@ goto next_rx; } skb_reserve(skb, pad); + #endif } else { DP(NETIF_MSG_RX_ERR | NETIF_MSG_RX_STATUS, "ERROR packet dropped because of alloc failure\n"); @@ -1078,6 +1085,8 @@ } } + // AKAROS_PORT TODO: set hash and checksum stuff +#if 0 skb_put(skb, len); skb->protocol = eth_type_trans(skb, bp->dev); @@ -1104,6 +1113,8 @@ netif_receive_skb(skb); else napi_gro_receive(&fp->napi, skb); +#endif + etheriq(bp->edev, block, TRUE); next_rx: rx_buf->data = NULL; @@ -1111,7 +1122,6 @@ bd_prod = NEXT_RX_IDX(bd_prod); bd_prod_fw = NEXT_RX_IDX(bd_prod_fw); rx_pkt++; -#endif next_cqe: sw_comp_prod = NEXT_RCQ_IDX(sw_comp_prod); sw_comp_cons = NEXT_RCQ_IDX(sw_comp_cons);
diff --git a/kern/drivers/net/bnx2x/bnx2x_dev.c b/kern/drivers/net/bnx2x/bnx2x_dev.c index e414149..730b628 100644 --- a/kern/drivers/net/bnx2x/bnx2x_dev.c +++ b/kern/drivers/net/bnx2x/bnx2x_dev.c
@@ -33,6 +33,7 @@ struct pci_device *pdev, const struct pci_device_id *ent); extern int bnx2x_open(struct ether *dev); +extern void bnx2x_set_rx_mode(struct ether *dev); spinlock_t bnx2x_tq_lock = SPINLOCK_INITIALIZER; TAILQ_HEAD(bnx2x_tq, bnx2x); @@ -268,8 +269,7 @@ } bnx2x_open(ctlr->edev); - - //do this next: ndo_set_rx_mode + bnx2x_set_rx_mode(edev); /* shut it up for now. too much stats output */ ctlr->msg_enable = 0;
diff --git a/kern/drivers/net/bnx2x/bnx2x_main.c b/kern/drivers/net/bnx2x/bnx2x_main.c index 768882b..18c14a4 100644 --- a/kern/drivers/net/bnx2x/bnx2x_main.c +++ b/kern/drivers/net/bnx2x/bnx2x_main.c
@@ -12498,7 +12498,7 @@ } /* If bp->state is OPEN, should be called with netif_addr_lock_bh() */ -static void bnx2x_set_rx_mode(struct ether *dev) +void bnx2x_set_rx_mode(struct ether *dev) { struct bnx2x *bp = netdev_priv(dev);