diff options
Diffstat (limited to 'drivers/infiniband')
-rw-r--r-- | drivers/infiniband/hw/mthca/mthca_qp.c | 99 |
1 files changed, 40 insertions, 59 deletions
diff --git a/drivers/infiniband/hw/mthca/mthca_qp.c b/drivers/infiniband/hw/mthca/mthca_qp.c index 2548250a822d..43d4d771f2d2 100644 --- a/drivers/infiniband/hw/mthca/mthca_qp.c +++ b/drivers/infiniband/hw/mthca/mthca_qp.c | |||
@@ -1578,6 +1578,27 @@ static inline int mthca_wq_overflow(struct mthca_wq *wq, int nreq, | |||
1578 | return cur + nreq >= wq->max; | 1578 | return cur + nreq >= wq->max; |
1579 | } | 1579 | } |
1580 | 1580 | ||
1581 | static __always_inline void set_raddr_seg(struct mthca_raddr_seg *rseg, | ||
1582 | u64 remote_addr, u32 rkey) | ||
1583 | { | ||
1584 | rseg->raddr = cpu_to_be64(remote_addr); | ||
1585 | rseg->rkey = cpu_to_be32(rkey); | ||
1586 | rseg->reserved = 0; | ||
1587 | } | ||
1588 | |||
1589 | static __always_inline void set_atomic_seg(struct mthca_atomic_seg *aseg, | ||
1590 | struct ib_send_wr *wr) | ||
1591 | { | ||
1592 | if (wr->opcode == IB_WR_ATOMIC_CMP_AND_SWP) { | ||
1593 | aseg->swap_add = cpu_to_be64(wr->wr.atomic.swap); | ||
1594 | aseg->compare = cpu_to_be64(wr->wr.atomic.compare_add); | ||
1595 | } else { | ||
1596 | aseg->swap_add = cpu_to_be64(wr->wr.atomic.compare_add); | ||
1597 | aseg->compare = 0; | ||
1598 | } | ||
1599 | |||
1600 | } | ||
1601 | |||
1581 | int mthca_tavor_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, | 1602 | int mthca_tavor_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, |
1582 | struct ib_send_wr **bad_wr) | 1603 | struct ib_send_wr **bad_wr) |
1583 | { | 1604 | { |
@@ -1642,25 +1663,11 @@ int mthca_tavor_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, | |||
1642 | switch (wr->opcode) { | 1663 | switch (wr->opcode) { |
1643 | case IB_WR_ATOMIC_CMP_AND_SWP: | 1664 | case IB_WR_ATOMIC_CMP_AND_SWP: |
1644 | case IB_WR_ATOMIC_FETCH_AND_ADD: | 1665 | case IB_WR_ATOMIC_FETCH_AND_ADD: |
1645 | ((struct mthca_raddr_seg *) wqe)->raddr = | 1666 | set_raddr_seg(wqe, wr->wr.atomic.remote_addr, |
1646 | cpu_to_be64(wr->wr.atomic.remote_addr); | 1667 | wr->wr.atomic.rkey); |
1647 | ((struct mthca_raddr_seg *) wqe)->rkey = | ||
1648 | cpu_to_be32(wr->wr.atomic.rkey); | ||
1649 | ((struct mthca_raddr_seg *) wqe)->reserved = 0; | ||
1650 | |||
1651 | wqe += sizeof (struct mthca_raddr_seg); | 1668 | wqe += sizeof (struct mthca_raddr_seg); |
1652 | 1669 | ||
1653 | if (wr->opcode == IB_WR_ATOMIC_CMP_AND_SWP) { | 1670 | set_atomic_seg(wqe, wr); |
1654 | ((struct mthca_atomic_seg *) wqe)->swap_add = | ||
1655 | cpu_to_be64(wr->wr.atomic.swap); | ||
1656 | ((struct mthca_atomic_seg *) wqe)->compare = | ||
1657 | cpu_to_be64(wr->wr.atomic.compare_add); | ||
1658 | } else { | ||
1659 | ((struct mthca_atomic_seg *) wqe)->swap_add = | ||
1660 | cpu_to_be64(wr->wr.atomic.compare_add); | ||
1661 | ((struct mthca_atomic_seg *) wqe)->compare = 0; | ||
1662 | } | ||
1663 | |||
1664 | wqe += sizeof (struct mthca_atomic_seg); | 1671 | wqe += sizeof (struct mthca_atomic_seg); |
1665 | size += (sizeof (struct mthca_raddr_seg) + | 1672 | size += (sizeof (struct mthca_raddr_seg) + |
1666 | sizeof (struct mthca_atomic_seg)) / 16; | 1673 | sizeof (struct mthca_atomic_seg)) / 16; |
@@ -1669,12 +1676,9 @@ int mthca_tavor_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, | |||
1669 | case IB_WR_RDMA_WRITE: | 1676 | case IB_WR_RDMA_WRITE: |
1670 | case IB_WR_RDMA_WRITE_WITH_IMM: | 1677 | case IB_WR_RDMA_WRITE_WITH_IMM: |
1671 | case IB_WR_RDMA_READ: | 1678 | case IB_WR_RDMA_READ: |
1672 | ((struct mthca_raddr_seg *) wqe)->raddr = | 1679 | set_raddr_seg(wqe, wr->wr.rdma.remote_addr, |
1673 | cpu_to_be64(wr->wr.rdma.remote_addr); | 1680 | wr->wr.rdma.rkey); |
1674 | ((struct mthca_raddr_seg *) wqe)->rkey = | 1681 | wqe += sizeof (struct mthca_raddr_seg); |
1675 | cpu_to_be32(wr->wr.rdma.rkey); | ||
1676 | ((struct mthca_raddr_seg *) wqe)->reserved = 0; | ||
1677 | wqe += sizeof (struct mthca_raddr_seg); | ||
1678 | size += sizeof (struct mthca_raddr_seg) / 16; | 1682 | size += sizeof (struct mthca_raddr_seg) / 16; |
1679 | break; | 1683 | break; |
1680 | 1684 | ||
@@ -1689,12 +1693,9 @@ int mthca_tavor_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, | |||
1689 | switch (wr->opcode) { | 1693 | switch (wr->opcode) { |
1690 | case IB_WR_RDMA_WRITE: | 1694 | case IB_WR_RDMA_WRITE: |
1691 | case IB_WR_RDMA_WRITE_WITH_IMM: | 1695 | case IB_WR_RDMA_WRITE_WITH_IMM: |
1692 | ((struct mthca_raddr_seg *) wqe)->raddr = | 1696 | set_raddr_seg(wqe, wr->wr.rdma.remote_addr, |
1693 | cpu_to_be64(wr->wr.rdma.remote_addr); | 1697 | wr->wr.rdma.rkey); |
1694 | ((struct mthca_raddr_seg *) wqe)->rkey = | 1698 | wqe += sizeof (struct mthca_raddr_seg); |
1695 | cpu_to_be32(wr->wr.rdma.rkey); | ||
1696 | ((struct mthca_raddr_seg *) wqe)->reserved = 0; | ||
1697 | wqe += sizeof (struct mthca_raddr_seg); | ||
1698 | size += sizeof (struct mthca_raddr_seg) / 16; | 1699 | size += sizeof (struct mthca_raddr_seg) / 16; |
1699 | break; | 1700 | break; |
1700 | 1701 | ||
@@ -2019,26 +2020,12 @@ int mthca_arbel_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, | |||
2019 | switch (wr->opcode) { | 2020 | switch (wr->opcode) { |
2020 | case IB_WR_ATOMIC_CMP_AND_SWP: | 2021 | case IB_WR_ATOMIC_CMP_AND_SWP: |
2021 | case IB_WR_ATOMIC_FETCH_AND_ADD: | 2022 | case IB_WR_ATOMIC_FETCH_AND_ADD: |
2022 | ((struct mthca_raddr_seg *) wqe)->raddr = | 2023 | set_raddr_seg(wqe, wr->wr.atomic.remote_addr, |
2023 | cpu_to_be64(wr->wr.atomic.remote_addr); | 2024 | wr->wr.atomic.rkey); |
2024 | ((struct mthca_raddr_seg *) wqe)->rkey = | ||
2025 | cpu_to_be32(wr->wr.atomic.rkey); | ||
2026 | ((struct mthca_raddr_seg *) wqe)->reserved = 0; | ||
2027 | |||
2028 | wqe += sizeof (struct mthca_raddr_seg); | 2025 | wqe += sizeof (struct mthca_raddr_seg); |
2029 | 2026 | ||
2030 | if (wr->opcode == IB_WR_ATOMIC_CMP_AND_SWP) { | 2027 | set_atomic_seg(wqe, wr); |
2031 | ((struct mthca_atomic_seg *) wqe)->swap_add = | 2028 | wqe += sizeof (struct mthca_atomic_seg); |
2032 | cpu_to_be64(wr->wr.atomic.swap); | ||
2033 | ((struct mthca_atomic_seg *) wqe)->compare = | ||
2034 | cpu_to_be64(wr->wr.atomic.compare_add); | ||
2035 | } else { | ||
2036 | ((struct mthca_atomic_seg *) wqe)->swap_add = | ||
2037 | cpu_to_be64(wr->wr.atomic.compare_add); | ||
2038 | ((struct mthca_atomic_seg *) wqe)->compare = 0; | ||
2039 | } | ||
2040 | |||
2041 | wqe += sizeof (struct mthca_atomic_seg); | ||
2042 | size += (sizeof (struct mthca_raddr_seg) + | 2029 | size += (sizeof (struct mthca_raddr_seg) + |
2043 | sizeof (struct mthca_atomic_seg)) / 16; | 2030 | sizeof (struct mthca_atomic_seg)) / 16; |
2044 | break; | 2031 | break; |
@@ -2046,12 +2033,9 @@ int mthca_arbel_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, | |||
2046 | case IB_WR_RDMA_READ: | 2033 | case IB_WR_RDMA_READ: |
2047 | case IB_WR_RDMA_WRITE: | 2034 | case IB_WR_RDMA_WRITE: |
2048 | case IB_WR_RDMA_WRITE_WITH_IMM: | 2035 | case IB_WR_RDMA_WRITE_WITH_IMM: |
2049 | ((struct mthca_raddr_seg *) wqe)->raddr = | 2036 | set_raddr_seg(wqe, wr->wr.rdma.remote_addr, |
2050 | cpu_to_be64(wr->wr.rdma.remote_addr); | 2037 | wr->wr.rdma.rkey); |
2051 | ((struct mthca_raddr_seg *) wqe)->rkey = | 2038 | wqe += sizeof (struct mthca_raddr_seg); |
2052 | cpu_to_be32(wr->wr.rdma.rkey); | ||
2053 | ((struct mthca_raddr_seg *) wqe)->reserved = 0; | ||
2054 | wqe += sizeof (struct mthca_raddr_seg); | ||
2055 | size += sizeof (struct mthca_raddr_seg) / 16; | 2039 | size += sizeof (struct mthca_raddr_seg) / 16; |
2056 | break; | 2040 | break; |
2057 | 2041 | ||
@@ -2066,12 +2050,9 @@ int mthca_arbel_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, | |||
2066 | switch (wr->opcode) { | 2050 | switch (wr->opcode) { |
2067 | case IB_WR_RDMA_WRITE: | 2051 | case IB_WR_RDMA_WRITE: |
2068 | case IB_WR_RDMA_WRITE_WITH_IMM: | 2052 | case IB_WR_RDMA_WRITE_WITH_IMM: |
2069 | ((struct mthca_raddr_seg *) wqe)->raddr = | 2053 | set_raddr_seg(wqe, wr->wr.rdma.remote_addr, |
2070 | cpu_to_be64(wr->wr.rdma.remote_addr); | 2054 | wr->wr.rdma.rkey); |
2071 | ((struct mthca_raddr_seg *) wqe)->rkey = | 2055 | wqe += sizeof (struct mthca_raddr_seg); |
2072 | cpu_to_be32(wr->wr.rdma.rkey); | ||
2073 | ((struct mthca_raddr_seg *) wqe)->reserved = 0; | ||
2074 | wqe += sizeof (struct mthca_raddr_seg); | ||
2075 | size += sizeof (struct mthca_raddr_seg) / 16; | 2056 | size += sizeof (struct mthca_raddr_seg) / 16; |
2076 | break; | 2057 | break; |
2077 | 2058 | ||