diff options
Diffstat (limited to 'drivers/infiniband/hw/cxgb3')
-rw-r--r-- | drivers/infiniband/hw/cxgb3/cxio_hal.c | 4 | ||||
-rw-r--r-- | drivers/infiniband/hw/cxgb3/cxio_wr.h | 5 | ||||
-rw-r--r-- | drivers/infiniband/hw/cxgb3/iwch_cm.c | 4 | ||||
-rw-r--r-- | drivers/infiniband/hw/cxgb3/iwch_mem.c | 7 | ||||
-rw-r--r-- | drivers/infiniband/hw/cxgb3/iwch_provider.c | 7 | ||||
-rw-r--r-- | drivers/infiniband/hw/cxgb3/iwch_qp.c | 29 |
6 files changed, 28 insertions, 28 deletions
diff --git a/drivers/infiniband/hw/cxgb3/cxio_hal.c b/drivers/infiniband/hw/cxgb3/cxio_hal.c index eec6a30840ca..03c5ff62889a 100644 --- a/drivers/infiniband/hw/cxgb3/cxio_hal.c +++ b/drivers/infiniband/hw/cxgb3/cxio_hal.c | |||
@@ -179,7 +179,7 @@ int cxio_create_cq(struct cxio_rdev *rdev_p, struct t3_cq *cq) | |||
179 | setup.size = 1UL << cq->size_log2; | 179 | setup.size = 1UL << cq->size_log2; |
180 | setup.credits = 65535; | 180 | setup.credits = 65535; |
181 | setup.credit_thres = 1; | 181 | setup.credit_thres = 1; |
182 | if (rdev_p->t3cdev_p->type == T3B) | 182 | if (rdev_p->t3cdev_p->type != T3A) |
183 | setup.ovfl_mode = 0; | 183 | setup.ovfl_mode = 0; |
184 | else | 184 | else |
185 | setup.ovfl_mode = 1; | 185 | setup.ovfl_mode = 1; |
@@ -584,7 +584,7 @@ static int cxio_hal_ctrl_qp_write_mem(struct cxio_rdev *rdev_p, u32 addr, | |||
584 | { | 584 | { |
585 | u32 i, nr_wqe, copy_len; | 585 | u32 i, nr_wqe, copy_len; |
586 | u8 *copy_data; | 586 | u8 *copy_data; |
587 | u8 wr_len, utx_len; /* lenght in 8 byte flit */ | 587 | u8 wr_len, utx_len; /* length in 8 byte flit */ |
588 | enum t3_wr_flags flag; | 588 | enum t3_wr_flags flag; |
589 | __be64 *wqe; | 589 | __be64 *wqe; |
590 | u64 utx_cmd; | 590 | u64 utx_cmd; |
diff --git a/drivers/infiniband/hw/cxgb3/cxio_wr.h b/drivers/infiniband/hw/cxgb3/cxio_wr.h index c84d4ac49355..969d4d928455 100644 --- a/drivers/infiniband/hw/cxgb3/cxio_wr.h +++ b/drivers/infiniband/hw/cxgb3/cxio_wr.h | |||
@@ -315,7 +315,7 @@ struct t3_rdma_init_wr { | |||
315 | __be32 ird; | 315 | __be32 ird; |
316 | __be64 qp_dma_addr; /* 7 */ | 316 | __be64 qp_dma_addr; /* 7 */ |
317 | __be32 qp_dma_size; /* 8 */ | 317 | __be32 qp_dma_size; /* 8 */ |
318 | u32 irs; | 318 | __be32 irs; |
319 | }; | 319 | }; |
320 | 320 | ||
321 | struct t3_genbit { | 321 | struct t3_genbit { |
@@ -324,7 +324,8 @@ struct t3_genbit { | |||
324 | }; | 324 | }; |
325 | 325 | ||
326 | enum rdma_init_wr_flags { | 326 | enum rdma_init_wr_flags { |
327 | RECVS_POSTED = 1, | 327 | RECVS_POSTED = (1<<0), |
328 | PRIV_QP = (1<<1), | ||
328 | }; | 329 | }; |
329 | 330 | ||
330 | union t3_wr { | 331 | union t3_wr { |
diff --git a/drivers/infiniband/hw/cxgb3/iwch_cm.c b/drivers/infiniband/hw/cxgb3/iwch_cm.c index 20ba372dd182..f8cb0fe748c3 100644 --- a/drivers/infiniband/hw/cxgb3/iwch_cm.c +++ b/drivers/infiniband/hw/cxgb3/iwch_cm.c | |||
@@ -1118,7 +1118,7 @@ static int act_open_rpl(struct t3cdev *tdev, struct sk_buff *skb, void *ctx) | |||
1118 | status2errno(rpl->status)); | 1118 | status2errno(rpl->status)); |
1119 | connect_reply_upcall(ep, status2errno(rpl->status)); | 1119 | connect_reply_upcall(ep, status2errno(rpl->status)); |
1120 | state_set(&ep->com, DEAD); | 1120 | state_set(&ep->com, DEAD); |
1121 | if (ep->com.tdev->type == T3B && act_open_has_tid(rpl->status)) | 1121 | if (ep->com.tdev->type != T3A && act_open_has_tid(rpl->status)) |
1122 | release_tid(ep->com.tdev, GET_TID(rpl), NULL); | 1122 | release_tid(ep->com.tdev, GET_TID(rpl), NULL); |
1123 | cxgb3_free_atid(ep->com.tdev, ep->atid); | 1123 | cxgb3_free_atid(ep->com.tdev, ep->atid); |
1124 | dst_release(ep->dst); | 1124 | dst_release(ep->dst); |
@@ -1249,7 +1249,7 @@ static void reject_cr(struct t3cdev *tdev, u32 hwtid, __be32 peer_ip, | |||
1249 | skb_trim(skb, sizeof(struct cpl_tid_release)); | 1249 | skb_trim(skb, sizeof(struct cpl_tid_release)); |
1250 | skb_get(skb); | 1250 | skb_get(skb); |
1251 | 1251 | ||
1252 | if (tdev->type == T3B) | 1252 | if (tdev->type != T3A) |
1253 | release_tid(tdev, hwtid, skb); | 1253 | release_tid(tdev, hwtid, skb); |
1254 | else { | 1254 | else { |
1255 | struct cpl_pass_accept_rpl *rpl; | 1255 | struct cpl_pass_accept_rpl *rpl; |
diff --git a/drivers/infiniband/hw/cxgb3/iwch_mem.c b/drivers/infiniband/hw/cxgb3/iwch_mem.c index a6c2c4ba29e6..73bfd1656f86 100644 --- a/drivers/infiniband/hw/cxgb3/iwch_mem.c +++ b/drivers/infiniband/hw/cxgb3/iwch_mem.c | |||
@@ -122,6 +122,13 @@ int build_phys_page_list(struct ib_phys_buf *buffer_list, | |||
122 | *total_size += buffer_list[i].size; | 122 | *total_size += buffer_list[i].size; |
123 | if (i > 0) | 123 | if (i > 0) |
124 | mask |= buffer_list[i].addr; | 124 | mask |= buffer_list[i].addr; |
125 | else | ||
126 | mask |= buffer_list[i].addr & PAGE_MASK; | ||
127 | if (i != num_phys_buf - 1) | ||
128 | mask |= buffer_list[i].addr + buffer_list[i].size; | ||
129 | else | ||
130 | mask |= (buffer_list[i].addr + buffer_list[i].size + | ||
131 | PAGE_SIZE - 1) & PAGE_MASK; | ||
125 | } | 132 | } |
126 | 133 | ||
127 | if (*total_size > 0xFFFFFFFFULL) | 134 | if (*total_size > 0xFFFFFFFFULL) |
diff --git a/drivers/infiniband/hw/cxgb3/iwch_provider.c b/drivers/infiniband/hw/cxgb3/iwch_provider.c index b5436ca92e68..df1838f8f94d 100644 --- a/drivers/infiniband/hw/cxgb3/iwch_provider.c +++ b/drivers/infiniband/hw/cxgb3/iwch_provider.c | |||
@@ -39,6 +39,7 @@ | |||
39 | #include <linux/list.h> | 39 | #include <linux/list.h> |
40 | #include <linux/spinlock.h> | 40 | #include <linux/spinlock.h> |
41 | #include <linux/ethtool.h> | 41 | #include <linux/ethtool.h> |
42 | #include <linux/rtnetlink.h> | ||
42 | 43 | ||
43 | #include <asm/io.h> | 44 | #include <asm/io.h> |
44 | #include <asm/irq.h> | 45 | #include <asm/irq.h> |
@@ -645,7 +646,7 @@ static struct ib_mr *iwch_reg_user_mr(struct ib_pd *pd, u64 start, u64 length, | |||
645 | if (err) | 646 | if (err) |
646 | goto err; | 647 | goto err; |
647 | 648 | ||
648 | if (udata && t3b_device(rhp)) { | 649 | if (udata && !t3a_device(rhp)) { |
649 | uresp.pbl_addr = (mhp->attr.pbl_addr - | 650 | uresp.pbl_addr = (mhp->attr.pbl_addr - |
650 | rhp->rdev.rnic_info.pbl_base) >> 3; | 651 | rhp->rdev.rnic_info.pbl_base) >> 3; |
651 | PDBG("%s user resp pbl_addr 0x%x\n", __FUNCTION__, | 652 | PDBG("%s user resp pbl_addr 0x%x\n", __FUNCTION__, |
@@ -1053,7 +1054,9 @@ static ssize_t show_fw_ver(struct class_device *cdev, char *buf) | |||
1053 | struct net_device *lldev = dev->rdev.t3cdev_p->lldev; | 1054 | struct net_device *lldev = dev->rdev.t3cdev_p->lldev; |
1054 | 1055 | ||
1055 | PDBG("%s class dev 0x%p\n", __FUNCTION__, cdev); | 1056 | PDBG("%s class dev 0x%p\n", __FUNCTION__, cdev); |
1057 | rtnl_lock(); | ||
1056 | lldev->ethtool_ops->get_drvinfo(lldev, &info); | 1058 | lldev->ethtool_ops->get_drvinfo(lldev, &info); |
1059 | rtnl_unlock(); | ||
1057 | return sprintf(buf, "%s\n", info.fw_version); | 1060 | return sprintf(buf, "%s\n", info.fw_version); |
1058 | } | 1061 | } |
1059 | 1062 | ||
@@ -1065,7 +1068,9 @@ static ssize_t show_hca(struct class_device *cdev, char *buf) | |||
1065 | struct net_device *lldev = dev->rdev.t3cdev_p->lldev; | 1068 | struct net_device *lldev = dev->rdev.t3cdev_p->lldev; |
1066 | 1069 | ||
1067 | PDBG("%s class dev 0x%p\n", __FUNCTION__, cdev); | 1070 | PDBG("%s class dev 0x%p\n", __FUNCTION__, cdev); |
1071 | rtnl_lock(); | ||
1068 | lldev->ethtool_ops->get_drvinfo(lldev, &info); | 1072 | lldev->ethtool_ops->get_drvinfo(lldev, &info); |
1073 | rtnl_unlock(); | ||
1069 | return sprintf(buf, "%s\n", info.driver); | 1074 | return sprintf(buf, "%s\n", info.driver); |
1070 | } | 1075 | } |
1071 | 1076 | ||
diff --git a/drivers/infiniband/hw/cxgb3/iwch_qp.c b/drivers/infiniband/hw/cxgb3/iwch_qp.c index dd89b6b91f9c..ea2cdd73dd85 100644 --- a/drivers/infiniband/hw/cxgb3/iwch_qp.c +++ b/drivers/infiniband/hw/cxgb3/iwch_qp.c | |||
@@ -208,36 +208,19 @@ static int iwch_sgl2pbl_map(struct iwch_dev *rhp, struct ib_sge *sg_list, | |||
208 | static int iwch_build_rdma_recv(struct iwch_dev *rhp, union t3_wr *wqe, | 208 | static int iwch_build_rdma_recv(struct iwch_dev *rhp, union t3_wr *wqe, |
209 | struct ib_recv_wr *wr) | 209 | struct ib_recv_wr *wr) |
210 | { | 210 | { |
211 | int i, err = 0; | 211 | int i; |
212 | u32 pbl_addr[4]; | ||
213 | u8 page_size[4]; | ||
214 | if (wr->num_sge > T3_MAX_SGE) | 212 | if (wr->num_sge > T3_MAX_SGE) |
215 | return -EINVAL; | 213 | return -EINVAL; |
216 | err = iwch_sgl2pbl_map(rhp, wr->sg_list, wr->num_sge, pbl_addr, | ||
217 | page_size); | ||
218 | if (err) | ||
219 | return err; | ||
220 | wqe->recv.pagesz[0] = page_size[0]; | ||
221 | wqe->recv.pagesz[1] = page_size[1]; | ||
222 | wqe->recv.pagesz[2] = page_size[2]; | ||
223 | wqe->recv.pagesz[3] = page_size[3]; | ||
224 | wqe->recv.num_sgle = cpu_to_be32(wr->num_sge); | 214 | wqe->recv.num_sgle = cpu_to_be32(wr->num_sge); |
225 | for (i = 0; i < wr->num_sge; i++) { | 215 | for (i = 0; i < wr->num_sge; i++) { |
226 | wqe->recv.sgl[i].stag = cpu_to_be32(wr->sg_list[i].lkey); | 216 | wqe->recv.sgl[i].stag = cpu_to_be32(wr->sg_list[i].lkey); |
227 | wqe->recv.sgl[i].len = cpu_to_be32(wr->sg_list[i].length); | 217 | wqe->recv.sgl[i].len = cpu_to_be32(wr->sg_list[i].length); |
228 | 218 | wqe->recv.sgl[i].to = cpu_to_be64(wr->sg_list[i].addr); | |
229 | /* to in the WQE == the offset into the page */ | ||
230 | wqe->recv.sgl[i].to = cpu_to_be64(((u32) wr->sg_list[i].addr) % | ||
231 | (1UL << (12 + page_size[i]))); | ||
232 | |||
233 | /* pbl_addr is the adapters address in the PBL */ | ||
234 | wqe->recv.pbl_addr[i] = cpu_to_be32(pbl_addr[i]); | ||
235 | } | 219 | } |
236 | for (; i < T3_MAX_SGE; i++) { | 220 | for (; i < T3_MAX_SGE; i++) { |
237 | wqe->recv.sgl[i].stag = 0; | 221 | wqe->recv.sgl[i].stag = 0; |
238 | wqe->recv.sgl[i].len = 0; | 222 | wqe->recv.sgl[i].len = 0; |
239 | wqe->recv.sgl[i].to = 0; | 223 | wqe->recv.sgl[i].to = 0; |
240 | wqe->recv.pbl_addr[i] = 0; | ||
241 | } | 224 | } |
242 | return 0; | 225 | return 0; |
243 | } | 226 | } |
@@ -659,6 +642,7 @@ static void __flush_qp(struct iwch_qp *qhp, unsigned long *flag) | |||
659 | cxio_flush_rq(&qhp->wq, &rchp->cq, count); | 642 | cxio_flush_rq(&qhp->wq, &rchp->cq, count); |
660 | spin_unlock(&qhp->lock); | 643 | spin_unlock(&qhp->lock); |
661 | spin_unlock_irqrestore(&rchp->lock, *flag); | 644 | spin_unlock_irqrestore(&rchp->lock, *flag); |
645 | (*rchp->ibcq.comp_handler)(&rchp->ibcq, rchp->ibcq.cq_context); | ||
662 | 646 | ||
663 | /* locking heirarchy: cq lock first, then qp lock. */ | 647 | /* locking heirarchy: cq lock first, then qp lock. */ |
664 | spin_lock_irqsave(&schp->lock, *flag); | 648 | spin_lock_irqsave(&schp->lock, *flag); |
@@ -668,6 +652,7 @@ static void __flush_qp(struct iwch_qp *qhp, unsigned long *flag) | |||
668 | cxio_flush_sq(&qhp->wq, &schp->cq, count); | 652 | cxio_flush_sq(&qhp->wq, &schp->cq, count); |
669 | spin_unlock(&qhp->lock); | 653 | spin_unlock(&qhp->lock); |
670 | spin_unlock_irqrestore(&schp->lock, *flag); | 654 | spin_unlock_irqrestore(&schp->lock, *flag); |
655 | (*schp->ibcq.comp_handler)(&schp->ibcq, schp->ibcq.cq_context); | ||
671 | 656 | ||
672 | /* deref */ | 657 | /* deref */ |
673 | if (atomic_dec_and_test(&qhp->refcnt)) | 658 | if (atomic_dec_and_test(&qhp->refcnt)) |
@@ -678,7 +663,7 @@ static void __flush_qp(struct iwch_qp *qhp, unsigned long *flag) | |||
678 | 663 | ||
679 | static void flush_qp(struct iwch_qp *qhp, unsigned long *flag) | 664 | static void flush_qp(struct iwch_qp *qhp, unsigned long *flag) |
680 | { | 665 | { |
681 | if (t3b_device(qhp->rhp)) | 666 | if (qhp->ibqp.uobject) |
682 | cxio_set_wq_in_error(&qhp->wq); | 667 | cxio_set_wq_in_error(&qhp->wq); |
683 | else | 668 | else |
684 | __flush_qp(qhp, flag); | 669 | __flush_qp(qhp, flag); |
@@ -732,6 +717,7 @@ static int rdma_init(struct iwch_dev *rhp, struct iwch_qp *qhp, | |||
732 | init_attr.qp_dma_addr = qhp->wq.dma_addr; | 717 | init_attr.qp_dma_addr = qhp->wq.dma_addr; |
733 | init_attr.qp_dma_size = (1UL << qhp->wq.size_log2); | 718 | init_attr.qp_dma_size = (1UL << qhp->wq.size_log2); |
734 | init_attr.flags = rqes_posted(qhp) ? RECVS_POSTED : 0; | 719 | init_attr.flags = rqes_posted(qhp) ? RECVS_POSTED : 0; |
720 | init_attr.flags |= capable(CAP_NET_BIND_SERVICE) ? PRIV_QP : 0; | ||
735 | init_attr.irs = qhp->ep->rcv_seq; | 721 | init_attr.irs = qhp->ep->rcv_seq; |
736 | PDBG("%s init_attr.rq_addr 0x%x init_attr.rq_size = %d " | 722 | PDBG("%s init_attr.rq_addr 0x%x init_attr.rq_size = %d " |
737 | "flags 0x%x qpcaps 0x%x\n", __FUNCTION__, | 723 | "flags 0x%x qpcaps 0x%x\n", __FUNCTION__, |
@@ -847,10 +833,11 @@ int iwch_modify_qp(struct iwch_dev *rhp, struct iwch_qp *qhp, | |||
847 | disconnect = 1; | 833 | disconnect = 1; |
848 | ep = qhp->ep; | 834 | ep = qhp->ep; |
849 | } | 835 | } |
836 | flush_qp(qhp, &flag); | ||
850 | break; | 837 | break; |
851 | case IWCH_QP_STATE_TERMINATE: | 838 | case IWCH_QP_STATE_TERMINATE: |
852 | qhp->attr.state = IWCH_QP_STATE_TERMINATE; | 839 | qhp->attr.state = IWCH_QP_STATE_TERMINATE; |
853 | if (t3b_device(qhp->rhp)) | 840 | if (qhp->ibqp.uobject) |
854 | cxio_set_wq_in_error(&qhp->wq); | 841 | cxio_set_wq_in_error(&qhp->wq); |
855 | if (!internal) | 842 | if (!internal) |
856 | terminate = 1; | 843 | terminate = 1; |