Modified the driver to support the 2.6.24 napi interface changes. The napi interface is now used by default.
Signed-off-by: Glenn Grundstrom <[EMAIL PROTECTED]> --- diff --git a/drivers/infiniband/hw/nes/Makefile b/drivers/infiniband/hw/nes/Makefile index 3514851..15a1a13 100644 --- a/drivers/infiniband/hw/nes/Makefile +++ b/drivers/infiniband/hw/nes/Makefile @@ -1,3 +1,5 @@ +EXTRA_CFLAGS += -DNES_NAPI + obj-$(CONFIG_INFINIBAND_NES) += iw_nes.o iw_nes-objs := nes.o nes_hw.o nes_nic.o nes_utils.o nes_verbs.o nes_cm.o diff --git a/drivers/infiniband/hw/nes/nes_cm.c b/drivers/infiniband/hw/nes/nes_cm.c index 623037d..d101117 100644 --- a/drivers/infiniband/hw/nes/nes_cm.c +++ b/drivers/infiniband/hw/nes/nes_cm.c @@ -2102,7 +2102,6 @@ int nes_cm_disconn_true(struct nes_qp *nesqp) struct iw_cm_id *cm_id; struct iw_cm_event cm_event; struct nes_vnic *nesvnic; - /* struct nes_cm_node *cm_node = NULL; */ u16 last_ae; u8 original_hw_tcp_state; u8 original_ibqp_state; diff --git a/drivers/infiniband/hw/nes/nes_hw.c b/drivers/infiniband/hw/nes/nes_hw.c index 8b0193d..3a21a08 100644 --- a/drivers/infiniband/hw/nes/nes_hw.c +++ b/drivers/infiniband/hw/nes/nes_hw.c @@ -1232,6 +1232,12 @@ static void nes_replenish_nic_rq(struct nes_vnic *nesvnic) nesnic = &nesvnic->nic; nesdev = nesvnic->nesdev; spin_lock_irqsave(&nesnic->rq_lock, flags); + if (nesnic->replenishing_rq !=0) { + spin_unlock_irqrestore(&nesnic->rq_lock, flags); + return; + } + nesnic->replenishing_rq = 1; + spin_unlock_irqrestore(&nesnic->rq_lock, flags); do { skb = dev_alloc_skb(nesvnic->max_frame_size); if (skb) { @@ -1275,7 +1281,7 @@ static void nes_replenish_nic_rq(struct nes_vnic *nesvnic) if (rx_wqes_posted) { nes_write32(nesdev->regs+NES_WQE_ALLOC, (rx_wqes_posted << 24) | nesnic->qp_id); } - spin_unlock_irqrestore(&nesnic->rq_lock, flags); + nesnic->replenishing_rq = 0; } @@ -2121,10 +2127,11 @@ void nes_nic_napi_ce_handler(struct nes_device *nesdev, struct nes_hw_nic_cq *cq { struct nes_vnic *nesvnic = container_of(cq, struct nes_vnic, nic_cq); - netif_rx_schedule(nesdev->netdev[nesvnic->netdev_index]); + netif_rx_schedule(nesdev->netdev[nesvnic->netdev_index], &nesvnic->napi); } #endif + /* The MAX_RQES_TO_PROCESS defines how many max read requests to complete before * getting out of nic_ce_handler */ @@ -2160,7 +2167,7 @@ void nes_nic_ce_handler(struct nes_device *nesdev, struct nes_hw_nic_cq *cq) head = cq->cq_head; cq_size = cq->cq_size; #ifdef NES_NAPI - nesvnic->cqes_pending = 1; + cq->cqes_pending = 1; #endif do { if (le32_to_cpu(cq->cq_vbase[head].cqe_words[NES_NIC_CQE_MISC_IDX]) & @@ -2210,7 +2217,8 @@ void nes_nic_ce_handler(struct nes_device *nesdev, struct nes_hw_nic_cq *cq) } else { rqes_processed ++; #ifdef NES_NAPI - nesvnic->rx_cqes_completed++; + cq->rx_cqes_completed++; + cq->rx_pkts_indicated++; #endif rx_pkt_size = cqe_misc & 0x0000ffff; nic_rqe = &nesnic->rq_vbase[nesnic->rq_tail]; @@ -2281,18 +2289,9 @@ void nes_nic_ce_handler(struct nes_device *nesdev, struct nes_hw_nic_cq *cq) >> 16); nes_debug(NES_DBG_CQ, "%s: Reporting stripped VLAN packet. Tag = 0x%04X\n", nesvnic->netdev->name, vlan_tag); - -#ifdef NES_NAPI - vlan_hwaccel_receive_skb(rx_skb, nesvnic->vlan_grp, vlan_tag); -#else - vlan_hwaccel_rx(rx_skb, nesvnic->vlan_grp, vlan_tag); -#endif + nes_vlan_rx(rx_skb, nesvnic->vlan_grp, vlan_tag); } else { -#ifdef NES_NAPI - netif_receive_skb(rx_skb); -#else - netif_rx(rx_skb); -#endif + nes_netif_rx(rx_skb); } } @@ -2314,11 +2313,11 @@ void nes_nic_ce_handler(struct nes_device *nesdev, struct nes_hw_nic_cq *cq) cqe_count = 0; } #ifdef NES_NAPI - if (nesvnic->rx_cqes_completed >= nesvnic->budget) + if (cq->rx_cqes_completed >= nesvnic->budget) break; #endif } else { - nesvnic->cqes_pending = 0; + cq->cqes_pending = 0; break; } #ifndef NES_NAPI @@ -2332,7 +2331,7 @@ void nes_nic_ce_handler(struct nes_device *nesdev, struct nes_hw_nic_cq *cq) /* nes_debug(NES_DBG_CQ, "CQ%u Processed = %u cqes, new head = %u.\n", cq->cq_number, cqe_count, cq->cq_head); */ #ifdef NES_NAPI - nesvnic->cqe_allocs_pending = cqe_count; + cq->cqe_allocs_pending = cqe_count; #else /* Arm the CCQ */ nes_write32(nesdev->regs+NES_CQE_ALLOC, NES_CQE_ALLOC_NOTIFY_NEXT | diff --git a/drivers/infiniband/hw/nes/nes_hw.h b/drivers/infiniband/hw/nes/nes_hw.h index 21ec22c..51bb87f 100644 --- a/drivers/infiniband/hw/nes/nes_hw.h +++ b/drivers/infiniband/hw/nes/nes_hw.h @@ -361,6 +361,7 @@ enum nes_cqe_opcode_bits { NES_CQE_VALID = (1<<31), }; + enum nes_cqe_word_idx { NES_CQE_PAYLOAD_LENGTH_IDX = 0, NES_CQE_COMP_COMP_CTX_LOW_IDX = 2, @@ -810,6 +811,7 @@ struct nes_hw_aeqe { __le32 aeqe_words[4]; }; + struct nes_cqp_request { wait_queue_head_t waitq; struct nes_hw_cqp_wqe cqp_wqe; @@ -857,6 +859,8 @@ struct nes_hw_nic { u16 rq_head; u16 rq_tail; u16 rq_size; + u8 replenishing_rq; + u8 reserved; spinlock_t sq_lock; spinlock_t rq_lock; @@ -866,9 +870,13 @@ struct nes_hw_nic_cq { struct nes_hw_nic_cqe volatile *cq_vbase; /* PCI memory for host rings */ void (*ce_handler)(struct nes_device *nesdev, struct nes_hw_nic_cq *cq); dma_addr_t cq_pbase; /* PCI memory for host rings */ + int rx_cqes_completed; + int cqe_allocs_pending; + int rx_pkts_indicated; u16 cq_head; u16 cq_size; u16 cq_number; + u8 cqes_pending; }; struct nes_hw_qp { @@ -1131,12 +1139,12 @@ struct nes_vnic { atomic_t rx_skbs_needed; atomic_t rx_skb_timer_running; int budget; - int rx_cqes_completed; - int cqe_allocs_pending; u32 msg_enable; /* u32 tx_avail; */ __be32 local_ipaddr; - +#ifdef NES_NAPI + struct napi_struct napi; +#endif spinlock_t tx_lock; /* could use netdev tx lock? */ struct timer_list rq_wqes_timer; u32 nic_mem_size; @@ -1159,7 +1167,6 @@ struct nes_vnic { u8 next_qp_nic_index; u8 of_device_registered; u8 rdma_enabled; - u8 cqes_pending; u8 rx_checksum_disabled; }; @@ -1178,5 +1185,13 @@ struct nes_ib_device { u32 num_pd; }; +#ifdef NES_NAPI +#define nes_vlan_rx vlan_hwaccel_receive_skb +#define nes_netif_rx netif_receive_skb +#else +#define nes_vlan_rx vlan_hwaccel_rx +#define nes_netif_rx netif_rx +#endif + #endif /* __NES_HW_H */ diff --git a/drivers/infiniband/hw/nes/nes_nic.c b/drivers/infiniband/hw/nes/nes_nic.c index 5c9ab37..4133a44 100644 --- a/drivers/infiniband/hw/nes/nes_nic.c +++ b/drivers/infiniband/hw/nes/nes_nic.c @@ -139,37 +139,36 @@ static int nes_netdev_change_mtu(struct net_device *, int); /** * nes_netdev_poll */ -static int nes_netdev_poll(struct net_device* netdev, int* budget) +static int nes_netdev_poll(struct napi_struct *napi, int budget) { - struct nes_vnic *nesvnic = netdev_priv(netdev); + struct nes_vnic *nesvnic = container_of(napi, struct nes_vnic, napi); + struct net_device *netdev = nesvnic->netdev; struct nes_device *nesdev = nesvnic->nesdev; struct nes_hw_nic_cq *nescq = &nesvnic->nic_cq; - nesvnic->budget = *budget; - nesvnic->cqes_pending = 0; - nesvnic->rx_cqes_completed = 0; - nesvnic->cqe_allocs_pending = 0; + nesvnic->budget = budget; + nescq->cqes_pending = 0; + nescq->rx_cqes_completed = 0; + nescq->cqe_allocs_pending = 0; + nescq->rx_pkts_indicated = 0; nes_nic_ce_handler(nesdev, nescq); - netdev->quota -= nesvnic->rx_cqes_completed; - *budget -= nesvnic->rx_cqes_completed; - - if (nesvnic->cqes_pending == 0) { - netif_rx_complete(netdev); + if (nescq->cqes_pending == 0) { + netif_rx_complete(netdev, napi); /* clear out completed cqes and arm */ nes_write32(nesdev->regs+NES_CQE_ALLOC, NES_CQE_ALLOC_NOTIFY_NEXT | - nescq->cq_number | (nesvnic->cqe_allocs_pending << 16)); + nescq->cq_number | (nescq->cqe_allocs_pending << 16)); nes_read32(nesdev->regs+NES_CQE_ALLOC); } else { /* clear out completed cqes but don't arm */ nes_write32(nesdev->regs+NES_CQE_ALLOC, - nescq->cq_number | (nesvnic->cqe_allocs_pending << 16)); + nescq->cq_number | (nescq->cqe_allocs_pending << 16)); nes_debug(NES_DBG_NETDEV, "%s: exiting with work pending\n", nesvnic->netdev->name); } - return (nesvnic->cqes_pending == 0) ? 0 : 1; + return nescq->rx_pkts_indicated; } #endif @@ -277,9 +276,11 @@ static int nes_netdev_open(struct net_device *netdev) /* Enable network packets */ nesvnic->linkup = 1; netif_start_queue(netdev); - } else { - netif_carrier_off(netdev); + netif_carrier_on(netdev); } +#ifdef NES_NAPI + napi_enable(&nesvnic->napi); +#endif nesvnic->netdev_open = 1; return 0; @@ -305,6 +306,9 @@ static int nes_netdev_stop(struct net_device *netdev) printk(KERN_INFO PFX "%s: disabling interface\n", netdev->name); /* Disable network packets */ +#ifdef NES_NAPI + napi_disable(&nesvnic->napi); +#endif netif_stop_queue(netdev); if ((nesdev->netdev[0] == netdev) & (nesvnic->logical_port == nesdev->mac_index)) { nes_write_indexed(nesdev, @@ -1548,6 +1552,9 @@ struct net_device *nes_netdev_init(struct nes_device *nesdev, SET_NETDEV_DEV(netdev, &nesdev->pcidev->dev); + nesvnic = netdev_priv(netdev); + memset(nesvnic, 0, sizeof(*nesvnic)); + netdev->open = nes_netdev_open; netdev->stop = nes_netdev_stop; netdev->hard_start_xmit = nes_netdev_start_xmit; @@ -1567,8 +1574,7 @@ struct net_device *nes_netdev_init(struct nes_device *nesdev, netdev->features = NETIF_F_HIGHDMA; netdev->ethtool_ops = &nes_ethtool_ops; #ifdef NES_NAPI - netdev->poll = nes_netdev_poll; - netdev->weight = 128; + netif_napi_add(netdev, &nesvnic->napi, nes_netdev_poll, 128); #endif #ifdef NETIF_F_HW_VLAN_TX nes_debug(NES_DBG_INIT, "Enabling VLAN Insert/Delete.\n"); @@ -1580,9 +1586,6 @@ struct net_device *nes_netdev_init(struct nes_device *nesdev, #endif /* Fill in the port structure */ - nesvnic = netdev_priv(netdev); - - memset(nesvnic, 0, sizeof(*nesvnic)); nesvnic->netdev = netdev; nesvnic->nesdev = nesdev; nesvnic->msg_enable = netif_msg_init(debug, default_msg); diff --git a/drivers/infiniband/hw/nes/nes_verbs.c b/drivers/infiniband/hw/nes/nes_verbs.c index 5fb241a..36d34f4 100644 --- a/drivers/infiniband/hw/nes/nes_verbs.c +++ b/drivers/infiniband/hw/nes/nes_verbs.c @@ -1099,8 +1099,6 @@ static int nes_setup_virt_qp(struct nes_qp *nesqp, struct nes_pbl *nespbl, nesqp->hwqp.sq_vbase = kmap(nespbl->page); nesqp->page = nespbl->page; - - nesqp->hwqp.sq_vbase = ioremap(nesqp->hwqp.sq_pbase, PAGE_SIZE); if (!nesqp->hwqp.sq_vbase) { nes_debug(NES_DBG_QP, "QP sq_vbase kmap failed\n"); kfree(nespbl); @@ -2712,7 +2710,6 @@ static struct ib_mr *nes_reg_user_mr(struct ib_pd *pd, u64 start, u64 length, list_for_each_entry(chunk, ®ion->chunk_list, list) { for (nmap_index = 0; nmap_index < chunk->nmap; ++nmap_index) { chunk_pages = sg_dma_len(&chunk->page_list[nmap_index]) >> PAGE_SHIFT; - /* nespbl->page = chunk->page_list[0].page; */ nespbl->page = sg_page(&chunk->page_list[0]); for (page_index=0; page_index<chunk_pages; page_index++) { ((u32 *)pbl)[0] = cpu_to_le32((u32) _______________________________________________ ewg mailing list ewg@lists.openfabrics.org http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ewg