|
@@ -212,13 +212,23 @@ static int create_qp(struct c4iw_rdev *rdev, struct t4_wq *wq,
|
|
|
|
|
|
wq->db = rdev->lldi.db_reg;
|
|
|
wq->gts = rdev->lldi.gts_reg;
|
|
|
- if (user) {
|
|
|
- wq->sq.udb = (u64)pci_resource_start(rdev->lldi.pdev, 2) +
|
|
|
- (wq->sq.qid << rdev->qpshift);
|
|
|
- wq->sq.udb &= PAGE_MASK;
|
|
|
- wq->rq.udb = (u64)pci_resource_start(rdev->lldi.pdev, 2) +
|
|
|
- (wq->rq.qid << rdev->qpshift);
|
|
|
- wq->rq.udb &= PAGE_MASK;
|
|
|
+ if (user || is_t5(rdev->lldi.adapter_type)) {
|
|
|
+ u32 off;
|
|
|
+
|
|
|
+ off = (wq->sq.qid << rdev->qpshift) & PAGE_MASK;
|
|
|
+ if (user) {
|
|
|
+ wq->sq.udb = (u64 __iomem *)(rdev->bar2_pa + off);
|
|
|
+ } else {
|
|
|
+ off += 128 * (wq->sq.qid & rdev->qpmask) + 8;
|
|
|
+ wq->sq.udb = (u64 __iomem *)(rdev->bar2_kva + off);
|
|
|
+ }
|
|
|
+ off = (wq->rq.qid << rdev->qpshift) & PAGE_MASK;
|
|
|
+ if (user) {
|
|
|
+ wq->rq.udb = (u64 __iomem *)(rdev->bar2_pa + off);
|
|
|
+ } else {
|
|
|
+ off += 128 * (wq->rq.qid & rdev->qpmask) + 8;
|
|
|
+ wq->rq.udb = (u64 __iomem *)(rdev->bar2_kva + off);
|
|
|
+ }
|
|
|
}
|
|
|
wq->rdev = rdev;
|
|
|
wq->rq.msn = 1;
|
|
@@ -299,9 +309,10 @@ static int create_qp(struct c4iw_rdev *rdev, struct t4_wq *wq,
|
|
|
if (ret)
|
|
|
goto free_dma;
|
|
|
|
|
|
- PDBG("%s sqid 0x%x rqid 0x%x kdb 0x%p squdb 0x%llx rqudb 0x%llx\n",
|
|
|
+ PDBG("%s sqid 0x%x rqid 0x%x kdb 0x%p squdb 0x%lx rqudb 0x%lx\n",
|
|
|
__func__, wq->sq.qid, wq->rq.qid, wq->db,
|
|
|
- (unsigned long long)wq->sq.udb, (unsigned long long)wq->rq.udb);
|
|
|
+ (__force unsigned long) wq->sq.udb,
|
|
|
+ (__force unsigned long) wq->rq.udb);
|
|
|
|
|
|
return 0;
|
|
|
free_dma:
|
|
@@ -650,9 +661,10 @@ static int ring_kernel_sq_db(struct c4iw_qp *qhp, u16 inc)
|
|
|
|
|
|
spin_lock_irqsave(&qhp->rhp->lock, flags);
|
|
|
spin_lock(&qhp->lock);
|
|
|
- if (qhp->rhp->db_state == NORMAL) {
|
|
|
- t4_ring_sq_db(&qhp->wq, inc);
|
|
|
- } else {
|
|
|
+ if (qhp->rhp->db_state == NORMAL)
|
|
|
+ t4_ring_sq_db(&qhp->wq, inc,
|
|
|
+ is_t5(qhp->rhp->rdev.lldi.adapter_type), NULL);
|
|
|
+ else {
|
|
|
add_to_fc_list(&qhp->rhp->db_fc_list, &qhp->db_fc_entry);
|
|
|
qhp->wq.sq.wq_pidx_inc += inc;
|
|
|
}
|
|
@@ -667,9 +679,10 @@ static int ring_kernel_rq_db(struct c4iw_qp *qhp, u16 inc)
|
|
|
|
|
|
spin_lock_irqsave(&qhp->rhp->lock, flags);
|
|
|
spin_lock(&qhp->lock);
|
|
|
- if (qhp->rhp->db_state == NORMAL) {
|
|
|
- t4_ring_rq_db(&qhp->wq, inc);
|
|
|
- } else {
|
|
|
+ if (qhp->rhp->db_state == NORMAL)
|
|
|
+ t4_ring_rq_db(&qhp->wq, inc,
|
|
|
+ is_t5(qhp->rhp->rdev.lldi.adapter_type), NULL);
|
|
|
+ else {
|
|
|
add_to_fc_list(&qhp->rhp->db_fc_list, &qhp->db_fc_entry);
|
|
|
qhp->wq.rq.wq_pidx_inc += inc;
|
|
|
}
|
|
@@ -686,7 +699,7 @@ int c4iw_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
|
|
|
enum fw_wr_opcodes fw_opcode = 0;
|
|
|
enum fw_ri_wr_flags fw_flags;
|
|
|
struct c4iw_qp *qhp;
|
|
|
- union t4_wr *wqe;
|
|
|
+ union t4_wr *wqe = NULL;
|
|
|
u32 num_wrs;
|
|
|
struct t4_swsqe *swsqe;
|
|
|
unsigned long flag;
|
|
@@ -792,7 +805,8 @@ int c4iw_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
|
|
|
idx += DIV_ROUND_UP(len16*16, T4_EQ_ENTRY_SIZE);
|
|
|
}
|
|
|
if (!qhp->rhp->rdev.status_page->db_off) {
|
|
|
- t4_ring_sq_db(&qhp->wq, idx);
|
|
|
+ t4_ring_sq_db(&qhp->wq, idx,
|
|
|
+ is_t5(qhp->rhp->rdev.lldi.adapter_type), wqe);
|
|
|
spin_unlock_irqrestore(&qhp->lock, flag);
|
|
|
} else {
|
|
|
spin_unlock_irqrestore(&qhp->lock, flag);
|
|
@@ -806,7 +820,7 @@ int c4iw_post_receive(struct ib_qp *ibqp, struct ib_recv_wr *wr,
|
|
|
{
|
|
|
int err = 0;
|
|
|
struct c4iw_qp *qhp;
|
|
|
- union t4_recv_wr *wqe;
|
|
|
+ union t4_recv_wr *wqe = NULL;
|
|
|
u32 num_wrs;
|
|
|
u8 len16 = 0;
|
|
|
unsigned long flag;
|
|
@@ -858,7 +872,8 @@ int c4iw_post_receive(struct ib_qp *ibqp, struct ib_recv_wr *wr,
|
|
|
num_wrs--;
|
|
|
}
|
|
|
if (!qhp->rhp->rdev.status_page->db_off) {
|
|
|
- t4_ring_rq_db(&qhp->wq, idx);
|
|
|
+ t4_ring_rq_db(&qhp->wq, idx,
|
|
|
+ is_t5(qhp->rhp->rdev.lldi.adapter_type), wqe);
|
|
|
spin_unlock_irqrestore(&qhp->lock, flag);
|
|
|
} else {
|
|
|
spin_unlock_irqrestore(&qhp->lock, flag);
|
|
@@ -1677,11 +1692,11 @@ struct ib_qp *c4iw_create_qp(struct ib_pd *pd, struct ib_qp_init_attr *attrs,
|
|
|
mm2->len = PAGE_ALIGN(qhp->wq.rq.memsize);
|
|
|
insert_mmap(ucontext, mm2);
|
|
|
mm3->key = uresp.sq_db_gts_key;
|
|
|
- mm3->addr = qhp->wq.sq.udb;
|
|
|
+ mm3->addr = (__force unsigned long) qhp->wq.sq.udb;
|
|
|
mm3->len = PAGE_SIZE;
|
|
|
insert_mmap(ucontext, mm3);
|
|
|
mm4->key = uresp.rq_db_gts_key;
|
|
|
- mm4->addr = qhp->wq.rq.udb;
|
|
|
+ mm4->addr = (__force unsigned long) qhp->wq.rq.udb;
|
|
|
mm4->len = PAGE_SIZE;
|
|
|
insert_mmap(ucontext, mm4);
|
|
|
if (mm5) {
|