diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-03-13 16:25:32 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-03-13 16:25:32 -0400 |
| commit | dba92d3bc49c036056a48661d2d8fefe4c78375a (patch) | |
| tree | e8ef6b2f0f62477dab50fe7d0435c76460c20f49 | |
| parent | b1881fb148a67a5b694ac9701672ce6b359abfa4 (diff) | |
| parent | 10313cbb92206450b450e14f2b3f6ccde42d9a34 (diff) | |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband:
IPoIB: Allocate priv->tx_ring with vmalloc()
IPoIB/cm: Set tx_wr.num_sge in connected mode post_send()
IPoIB: Don't drop multicast sends when they can be queued
IB/ipath: Reset the retry counter for RDMA_READ_RESPONSE_MIDDLE packets
IB/ipath: Fix error completion put on send CQ instead of recv CQ
IB/ipath: Fix RC QP initialization
IB/ipath: Fix potentially wrong RNR retry counter returned in ipath_query_qp()
IB/ipath: Fix IB compliance problems with link state vs physical state
| -rw-r--r-- | drivers/infiniband/hw/ipath/ipath_common.h | 2 | ||||
| -rw-r--r-- | drivers/infiniband/hw/ipath/ipath_driver.c | 28 | ||||
| -rw-r--r-- | drivers/infiniband/hw/ipath/ipath_kernel.h | 1 | ||||
| -rw-r--r-- | drivers/infiniband/hw/ipath/ipath_mad.c | 7 | ||||
| -rw-r--r-- | drivers/infiniband/hw/ipath/ipath_qp.c | 13 | ||||
| -rw-r--r-- | drivers/infiniband/hw/ipath/ipath_rc.c | 4 | ||||
| -rw-r--r-- | drivers/infiniband/hw/ipath/ipath_registers.h | 2 | ||||
| -rw-r--r-- | drivers/infiniband/ulp/ipoib/ipoib_cm.c | 9 | ||||
| -rw-r--r-- | drivers/infiniband/ulp/ipoib/ipoib_main.c | 9 | ||||
| -rw-r--r-- | drivers/infiniband/ulp/ipoib/ipoib_multicast.c | 2 |
10 files changed, 41 insertions, 36 deletions
diff --git a/drivers/infiniband/hw/ipath/ipath_common.h b/drivers/infiniband/hw/ipath/ipath_common.h index 414621095540..591901aab6b7 100644 --- a/drivers/infiniband/hw/ipath/ipath_common.h +++ b/drivers/infiniband/hw/ipath/ipath_common.h | |||
| @@ -75,7 +75,7 @@ | |||
| 75 | #define IPATH_IB_LINKDOWN 0 | 75 | #define IPATH_IB_LINKDOWN 0 |
| 76 | #define IPATH_IB_LINKARM 1 | 76 | #define IPATH_IB_LINKARM 1 |
| 77 | #define IPATH_IB_LINKACTIVE 2 | 77 | #define IPATH_IB_LINKACTIVE 2 |
| 78 | #define IPATH_IB_LINKINIT 3 | 78 | #define IPATH_IB_LINKDOWN_ONLY 3 |
| 79 | #define IPATH_IB_LINKDOWN_SLEEP 4 | 79 | #define IPATH_IB_LINKDOWN_SLEEP 4 |
| 80 | #define IPATH_IB_LINKDOWN_DISABLE 5 | 80 | #define IPATH_IB_LINKDOWN_DISABLE 5 |
| 81 | #define IPATH_IB_LINK_LOOPBACK 6 /* enable local loopback */ | 81 | #define IPATH_IB_LINK_LOOPBACK 6 /* enable local loopback */ |
diff --git a/drivers/infiniband/hw/ipath/ipath_driver.c b/drivers/infiniband/hw/ipath/ipath_driver.c index d5ff6ca2db30..ca4d0acc6786 100644 --- a/drivers/infiniband/hw/ipath/ipath_driver.c +++ b/drivers/infiniband/hw/ipath/ipath_driver.c | |||
| @@ -851,8 +851,7 @@ void ipath_disarm_piobufs(struct ipath_devdata *dd, unsigned first, | |||
| 851 | * -ETIMEDOUT state can have multiple states set, for any of several | 851 | * -ETIMEDOUT state can have multiple states set, for any of several |
| 852 | * transitions. | 852 | * transitions. |
| 853 | */ | 853 | */ |
| 854 | static int ipath_wait_linkstate(struct ipath_devdata *dd, u32 state, | 854 | int ipath_wait_linkstate(struct ipath_devdata *dd, u32 state, int msecs) |
| 855 | int msecs) | ||
| 856 | { | 855 | { |
| 857 | dd->ipath_state_wanted = state; | 856 | dd->ipath_state_wanted = state; |
| 858 | wait_event_interruptible_timeout(ipath_state_wait, | 857 | wait_event_interruptible_timeout(ipath_state_wait, |
| @@ -1656,8 +1655,8 @@ void ipath_cancel_sends(struct ipath_devdata *dd, int restore_sendctrl) | |||
| 1656 | static void ipath_set_ib_lstate(struct ipath_devdata *dd, int which) | 1655 | static void ipath_set_ib_lstate(struct ipath_devdata *dd, int which) |
| 1657 | { | 1656 | { |
| 1658 | static const char *what[4] = { | 1657 | static const char *what[4] = { |
| 1659 | [0] = "DOWN", | 1658 | [0] = "NOP", |
| 1660 | [INFINIPATH_IBCC_LINKCMD_INIT] = "INIT", | 1659 | [INFINIPATH_IBCC_LINKCMD_DOWN] = "DOWN", |
| 1661 | [INFINIPATH_IBCC_LINKCMD_ARMED] = "ARMED", | 1660 | [INFINIPATH_IBCC_LINKCMD_ARMED] = "ARMED", |
| 1662 | [INFINIPATH_IBCC_LINKCMD_ACTIVE] = "ACTIVE" | 1661 | [INFINIPATH_IBCC_LINKCMD_ACTIVE] = "ACTIVE" |
| 1663 | }; | 1662 | }; |
| @@ -1672,9 +1671,9 @@ static void ipath_set_ib_lstate(struct ipath_devdata *dd, int which) | |||
| 1672 | (dd, dd->ipath_kregs->kr_ibcstatus) >> | 1671 | (dd, dd->ipath_kregs->kr_ibcstatus) >> |
| 1673 | INFINIPATH_IBCS_LINKTRAININGSTATE_SHIFT) & | 1672 | INFINIPATH_IBCS_LINKTRAININGSTATE_SHIFT) & |
| 1674 | INFINIPATH_IBCS_LINKTRAININGSTATE_MASK]); | 1673 | INFINIPATH_IBCS_LINKTRAININGSTATE_MASK]); |
| 1675 | /* flush all queued sends when going to DOWN or INIT, to be sure that | 1674 | /* flush all queued sends when going to DOWN to be sure that |
| 1676 | * they don't block MAD packets */ | 1675 | * they don't block MAD packets */ |
| 1677 | if (!linkcmd || linkcmd == INFINIPATH_IBCC_LINKCMD_INIT) | 1676 | if (linkcmd == INFINIPATH_IBCC_LINKCMD_DOWN) |
| 1678 | ipath_cancel_sends(dd, 1); | 1677 | ipath_cancel_sends(dd, 1); |
| 1679 | 1678 | ||
| 1680 | ipath_write_kreg(dd, dd->ipath_kregs->kr_ibcctrl, | 1679 | ipath_write_kreg(dd, dd->ipath_kregs->kr_ibcctrl, |
| @@ -1687,6 +1686,13 @@ int ipath_set_linkstate(struct ipath_devdata *dd, u8 newstate) | |||
| 1687 | int ret; | 1686 | int ret; |
| 1688 | 1687 | ||
| 1689 | switch (newstate) { | 1688 | switch (newstate) { |
| 1689 | case IPATH_IB_LINKDOWN_ONLY: | ||
| 1690 | ipath_set_ib_lstate(dd, INFINIPATH_IBCC_LINKCMD_DOWN << | ||
| 1691 | INFINIPATH_IBCC_LINKCMD_SHIFT); | ||
| 1692 | /* don't wait */ | ||
| 1693 | ret = 0; | ||
| 1694 | goto bail; | ||
| 1695 | |||
| 1690 | case IPATH_IB_LINKDOWN: | 1696 | case IPATH_IB_LINKDOWN: |
| 1691 | ipath_set_ib_lstate(dd, INFINIPATH_IBCC_LINKINITCMD_POLL << | 1697 | ipath_set_ib_lstate(dd, INFINIPATH_IBCC_LINKINITCMD_POLL << |
| 1692 | INFINIPATH_IBCC_LINKINITCMD_SHIFT); | 1698 | INFINIPATH_IBCC_LINKINITCMD_SHIFT); |
| @@ -1709,16 +1715,6 @@ int ipath_set_linkstate(struct ipath_devdata *dd, u8 newstate) | |||
| 1709 | ret = 0; | 1715 | ret = 0; |
| 1710 | goto bail; | 1716 | goto bail; |
| 1711 | 1717 | ||
| 1712 | case IPATH_IB_LINKINIT: | ||
| 1713 | if (dd->ipath_flags & IPATH_LINKINIT) { | ||
| 1714 | ret = 0; | ||
| 1715 | goto bail; | ||
| 1716 | } | ||
| 1717 | ipath_set_ib_lstate(dd, INFINIPATH_IBCC_LINKCMD_INIT << | ||
| 1718 | INFINIPATH_IBCC_LINKCMD_SHIFT); | ||
| 1719 | lstate = IPATH_LINKINIT; | ||
| 1720 | break; | ||
| 1721 | |||
| 1722 | case IPATH_IB_LINKARM: | 1718 | case IPATH_IB_LINKARM: |
| 1723 | if (dd->ipath_flags & IPATH_LINKARMED) { | 1719 | if (dd->ipath_flags & IPATH_LINKARMED) { |
| 1724 | ret = 0; | 1720 | ret = 0; |
diff --git a/drivers/infiniband/hw/ipath/ipath_kernel.h b/drivers/infiniband/hw/ipath/ipath_kernel.h index 4cc0f95ea877..ecf3f7ff7717 100644 --- a/drivers/infiniband/hw/ipath/ipath_kernel.h +++ b/drivers/infiniband/hw/ipath/ipath_kernel.h | |||
| @@ -767,6 +767,7 @@ void ipath_kreceive(struct ipath_portdata *); | |||
| 767 | int ipath_setrcvhdrsize(struct ipath_devdata *, unsigned); | 767 | int ipath_setrcvhdrsize(struct ipath_devdata *, unsigned); |
| 768 | int ipath_reset_device(int); | 768 | int ipath_reset_device(int); |
| 769 | void ipath_get_faststats(unsigned long); | 769 | void ipath_get_faststats(unsigned long); |
| 770 | int ipath_wait_linkstate(struct ipath_devdata *, u32, int); | ||
| 770 | int ipath_set_linkstate(struct ipath_devdata *, u8); | 771 | int ipath_set_linkstate(struct ipath_devdata *, u8); |
| 771 | int ipath_set_mtu(struct ipath_devdata *, u16); | 772 | int ipath_set_mtu(struct ipath_devdata *, u16); |
| 772 | int ipath_set_lid(struct ipath_devdata *, u32, u8); | 773 | int ipath_set_lid(struct ipath_devdata *, u32, u8); |
diff --git a/drivers/infiniband/hw/ipath/ipath_mad.c b/drivers/infiniband/hw/ipath/ipath_mad.c index d98d5f103700..b34b91d3723a 100644 --- a/drivers/infiniband/hw/ipath/ipath_mad.c +++ b/drivers/infiniband/hw/ipath/ipath_mad.c | |||
| @@ -555,10 +555,7 @@ static int recv_subn_set_portinfo(struct ib_smp *smp, | |||
| 555 | /* FALLTHROUGH */ | 555 | /* FALLTHROUGH */ |
| 556 | case IB_PORT_DOWN: | 556 | case IB_PORT_DOWN: |
| 557 | if (lstate == 0) | 557 | if (lstate == 0) |
| 558 | if (get_linkdowndefaultstate(dd)) | 558 | lstate = IPATH_IB_LINKDOWN_ONLY; |
| 559 | lstate = IPATH_IB_LINKDOWN_SLEEP; | ||
| 560 | else | ||
| 561 | lstate = IPATH_IB_LINKDOWN; | ||
| 562 | else if (lstate == 1) | 559 | else if (lstate == 1) |
| 563 | lstate = IPATH_IB_LINKDOWN_SLEEP; | 560 | lstate = IPATH_IB_LINKDOWN_SLEEP; |
| 564 | else if (lstate == 2) | 561 | else if (lstate == 2) |
| @@ -568,6 +565,8 @@ static int recv_subn_set_portinfo(struct ib_smp *smp, | |||
| 568 | else | 565 | else |
| 569 | goto err; | 566 | goto err; |
| 570 | ipath_set_linkstate(dd, lstate); | 567 | ipath_set_linkstate(dd, lstate); |
| 568 | ipath_wait_linkstate(dd, IPATH_LINKINIT | IPATH_LINKARMED | | ||
| 569 | IPATH_LINKACTIVE, 1000); | ||
| 571 | break; | 570 | break; |
| 572 | case IB_PORT_ARMED: | 571 | case IB_PORT_ARMED: |
| 573 | ipath_set_linkstate(dd, IPATH_IB_LINKARM); | 572 | ipath_set_linkstate(dd, IPATH_IB_LINKARM); |
diff --git a/drivers/infiniband/hw/ipath/ipath_qp.c b/drivers/infiniband/hw/ipath/ipath_qp.c index 80dc623cee40..087ed3166479 100644 --- a/drivers/infiniband/hw/ipath/ipath_qp.c +++ b/drivers/infiniband/hw/ipath/ipath_qp.c | |||
| @@ -329,8 +329,9 @@ struct ipath_qp *ipath_lookup_qpn(struct ipath_qp_table *qpt, u32 qpn) | |||
| 329 | /** | 329 | /** |
| 330 | * ipath_reset_qp - initialize the QP state to the reset state | 330 | * ipath_reset_qp - initialize the QP state to the reset state |
| 331 | * @qp: the QP to reset | 331 | * @qp: the QP to reset |
| 332 | * @type: the QP type | ||
| 332 | */ | 333 | */ |
| 333 | static void ipath_reset_qp(struct ipath_qp *qp) | 334 | static void ipath_reset_qp(struct ipath_qp *qp, enum ib_qp_type type) |
| 334 | { | 335 | { |
| 335 | qp->remote_qpn = 0; | 336 | qp->remote_qpn = 0; |
| 336 | qp->qkey = 0; | 337 | qp->qkey = 0; |
| @@ -342,7 +343,7 @@ static void ipath_reset_qp(struct ipath_qp *qp) | |||
| 342 | qp->s_psn = 0; | 343 | qp->s_psn = 0; |
| 343 | qp->r_psn = 0; | 344 | qp->r_psn = 0; |
| 344 | qp->r_msn = 0; | 345 | qp->r_msn = 0; |
| 345 | if (qp->ibqp.qp_type == IB_QPT_RC) { | 346 | if (type == IB_QPT_RC) { |
| 346 | qp->s_state = IB_OPCODE_RC_SEND_LAST; | 347 | qp->s_state = IB_OPCODE_RC_SEND_LAST; |
| 347 | qp->r_state = IB_OPCODE_RC_SEND_LAST; | 348 | qp->r_state = IB_OPCODE_RC_SEND_LAST; |
| 348 | } else { | ||
