]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/infiniband/hw/nes/nes_hw.c
RDMA/core: Add local DMA L_Key support
[linux-2.6-omap-h63xx.git] / drivers / infiniband / hw / nes / nes_hw.c
index 8dc70f9bad2f49f828b95dca4544ec46c1aa95b2..85f26d19a32b26187a9289a90fa6c600e33fc0b3 100644 (file)
 
 #include "nes.h"
 
+static unsigned int nes_lro_max_aggr = NES_LRO_MAX_AGGR;
+module_param(nes_lro_max_aggr, uint, 0444);
+MODULE_PARM_DESC(nes_lro_max_aggr, "NIC LRO max packet aggregation");
+
 static u32 crit_err_count;
 u32 int_mod_timer_init;
 u32 int_mod_cq_depth_256;
@@ -394,7 +398,7 @@ struct nes_adapter *nes_init_adapter(struct nes_device *nesdev, u8 hw_rev) {
        nesadapter->base_pd = 1;
 
        nesadapter->device_cap_flags =
-               IB_DEVICE_ZERO_STAG | IB_DEVICE_MEM_WINDOW;
+               IB_DEVICE_LOCAL_DMA_LKEY | IB_DEVICE_MEM_WINDOW;
 
        nesadapter->allocated_qps = (unsigned long *)&(((unsigned char *)nesadapter)
                        [(sizeof(struct nes_adapter)+(sizeof(unsigned long)-1))&(~(sizeof(unsigned long)-1))]);
@@ -1738,7 +1742,7 @@ int nes_init_nic_qp(struct nes_device *nesdev, struct net_device *netdev)
                        jumbomode = 1;
                nes_nic_init_timer_defaults(nesdev, jumbomode);
        }
-       nesvnic->lro_mgr.max_aggr       = NES_LRO_MAX_AGGR;
+       nesvnic->lro_mgr.max_aggr       = nes_lro_max_aggr;
        nesvnic->lro_mgr.max_desc       = NES_MAX_LRO_DESCRIPTORS;
        nesvnic->lro_mgr.lro_arr        = nesvnic->lro_desc;
        nesvnic->lro_mgr.get_skb_header = nes_lro_get_skb_hdr;
@@ -2706,39 +2710,11 @@ static void nes_cqp_ce_handler(struct nes_device *nesdev, struct nes_hw_cq *cq)
                                        barrier();
                                        cqp_request->request_done = 1;
                                        wake_up(&cqp_request->waitq);
-                                       if (atomic_dec_and_test(&cqp_request->refcount)) {
-                                               nes_debug(NES_DBG_CQP, "CQP request %p (opcode 0x%02X) freed.\n",
-                                                               cqp_request,
-                                                               le32_to_cpu(cqp_request->cqp_wqe.wqe_words[NES_CQP_WQE_OPCODE_IDX])&0x3f);
-                                               if (cqp_request->dynamic) {
-                                                       kfree(cqp_request);
-                                               } else {
-                                                       spin_lock_irqsave(&nesdev->cqp.lock, flags);
-                                                       list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
-                                                       spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
-                                               }
-                                       }
-                               } else if (cqp_request->callback) {
-                                       /* Envoke the callback routine */
-                                       cqp_request->cqp_callback(nesdev, cqp_request);
-                                       if (cqp_request->dynamic) {
-                                               kfree(cqp_request);
-                                       } else {
-                                               spin_lock_irqsave(&nesdev->cqp.lock, flags);
-                                               list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
-                                               spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
-                                       }
+                                       nes_put_cqp_request(nesdev, cqp_request);
                                } else {
-                                       nes_debug(NES_DBG_CQP, "CQP request %p (opcode 0x%02X) freed.\n",
-                                                       cqp_request,
-                                                       le32_to_cpu(cqp_request->cqp_wqe.wqe_words[NES_CQP_WQE_OPCODE_IDX]) & 0x3f);
-                                       if (cqp_request->dynamic) {
-                                               kfree(cqp_request);
-                                       } else {
-                                               spin_lock_irqsave(&nesdev->cqp.lock, flags);
-                                               list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
-                                               spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
-                                       }
+                                       if (cqp_request->callback)
+                                               cqp_request->cqp_callback(nesdev, cqp_request);
+                                       nes_free_cqp_request(nesdev, cqp_request);
                                }
                        } else {
                                wake_up(&nesdev->cqp.waitq);
@@ -3145,7 +3121,6 @@ int nes_manage_apbvt(struct nes_vnic *nesvnic, u32 accel_local_port,
 {
        struct nes_device *nesdev = nesvnic->nesdev;
        struct nes_hw_cqp_wqe *cqp_wqe;
-       unsigned long flags;
        struct nes_cqp_request *cqp_request;
        int ret = 0;
        u16 major_code;
@@ -3172,7 +3147,7 @@ int nes_manage_apbvt(struct nes_vnic *nesvnic, u32 accel_local_port,
        nes_debug(NES_DBG_QP, "Waiting for CQP completion for APBVT.\n");
 
        atomic_set(&cqp_request->refcount, 2);
-       nes_post_cqp_request(nesdev, cqp_request, NES_CQP_REQUEST_RING_DOORBELL);
+       nes_post_cqp_request(nesdev, cqp_request);
 
        if (add_port == NES_MANAGE_APBVT_ADD)
                ret = wait_event_timeout(cqp_request->waitq, (cqp_request->request_done != 0),
@@ -3180,15 +3155,9 @@ int nes_manage_apbvt(struct nes_vnic *nesvnic, u32 accel_local_port,
        nes_debug(NES_DBG_QP, "Completed, ret=%u,  CQP Major:Minor codes = 0x%04X:0x%04X\n",
                        ret, cqp_request->major_code, cqp_request->minor_code);
        major_code = cqp_request->major_code;
-       if (atomic_dec_and_test(&cqp_request->refcount)) {
-               if (cqp_request->dynamic) {
-                       kfree(cqp_request);
-               } else {
-                       spin_lock_irqsave(&nesdev->cqp.lock, flags);
-                       list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
-                       spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
-               }
-       }
+
+       nes_put_cqp_request(nesdev, cqp_request);
+
        if (!ret)
                return -ETIME;
        else if (major_code)
@@ -3248,7 +3217,7 @@ void nes_manage_arp_cache(struct net_device *netdev, unsigned char *mac_addr,
                        nesdev->cqp.sq_head, nesdev->cqp.sq_tail);
 
        atomic_set(&cqp_request->refcount, 1);
-       nes_post_cqp_request(nesdev, cqp_request, NES_CQP_REQUEST_RING_DOORBELL);
+       nes_post_cqp_request(nesdev, cqp_request);
 }
 
 
@@ -3258,7 +3227,6 @@ void nes_manage_arp_cache(struct net_device *netdev, unsigned char *mac_addr,
 void flush_wqes(struct nes_device *nesdev, struct nes_qp *nesqp,
                u32 which_wq, u32 wait_completion)
 {
-       unsigned long flags;
        struct nes_cqp_request *cqp_request;
        struct nes_hw_cqp_wqe *cqp_wqe;
        int ret;
@@ -3281,7 +3249,7 @@ void flush_wqes(struct nes_device *nesdev, struct nes_qp *nesqp,
                        cpu_to_le32(NES_CQP_FLUSH_WQES | which_wq);
        cqp_wqe->wqe_words[NES_CQP_WQE_ID_IDX] = cpu_to_le32(nesqp->hwqp.qp_id);
 
-       nes_post_cqp_request(nesdev, cqp_request, NES_CQP_REQUEST_RING_DOORBELL);
+       nes_post_cqp_request(nesdev, cqp_request);
 
        if (wait_completion) {
                /* Wait for CQP */
@@ -3290,14 +3258,6 @@ void flush_wqes(struct nes_device *nesdev, struct nes_qp *nesqp,
                nes_debug(NES_DBG_QP, "Flush SQ QP WQEs completed, ret=%u,"
                                " CQP Major:Minor codes = 0x%04X:0x%04X\n",
                                ret, cqp_request->major_code, cqp_request->minor_code);
-               if (atomic_dec_and_test(&cqp_request->refcount)) {
-                       if (cqp_request->dynamic) {
-                               kfree(cqp_request);
-                       } else {
-                               spin_lock_irqsave(&nesdev->cqp.lock, flags);
-                               list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
-                               spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
-                       }
-               }
+               nes_put_cqp_request(nesdev, cqp_request);
        }
 }