diff options
Diffstat (limited to 'drivers/infiniband/ulp/ipoib/ipoib_ib.c')
-rw-r--r-- | drivers/infiniband/ulp/ipoib/ipoib_ib.c | 31 |
1 files changed, 19 insertions, 12 deletions
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_ib.c b/drivers/infiniband/ulp/ipoib/ipoib_ib.c index c1aad06eb4e..8404f05b2b6 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_ib.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_ib.c | |||
@@ -550,13 +550,30 @@ static int recvs_pending(struct net_device *dev) | |||
550 | return pending; | 550 | return pending; |
551 | } | 551 | } |
552 | 552 | ||
553 | void ipoib_drain_cq(struct net_device *dev) | ||
554 | { | ||
555 | struct ipoib_dev_priv *priv = netdev_priv(dev); | ||
556 | int i, n; | ||
557 | do { | ||
558 | n = ib_poll_cq(priv->cq, IPOIB_NUM_WC, priv->ibwc); | ||
559 | for (i = 0; i < n; ++i) { | ||
560 | if (priv->ibwc[i].wr_id & IPOIB_CM_OP_SRQ) | ||
561 | ipoib_cm_handle_rx_wc(dev, priv->ibwc + i); | ||
562 | else if (priv->ibwc[i].wr_id & IPOIB_OP_RECV) | ||
563 | ipoib_ib_handle_rx_wc(dev, priv->ibwc + i); | ||
564 | else | ||
565 | ipoib_ib_handle_tx_wc(dev, priv->ibwc + i); | ||
566 | } | ||
567 | } while (n == IPOIB_NUM_WC); | ||
568 | } | ||
569 | |||
553 | int ipoib_ib_dev_stop(struct net_device *dev, int flush) | 570 | int ipoib_ib_dev_stop(struct net_device *dev, int flush) |
554 | { | 571 | { |
555 | struct ipoib_dev_priv *priv = netdev_priv(dev); | 572 | struct ipoib_dev_priv *priv = netdev_priv(dev); |
556 | struct ib_qp_attr qp_attr; | 573 | struct ib_qp_attr qp_attr; |
557 | unsigned long begin; | 574 | unsigned long begin; |
558 | struct ipoib_tx_buf *tx_req; | 575 | struct ipoib_tx_buf *tx_req; |
559 | int i, n; | 576 | int i; |
560 | 577 | ||
561 | clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags); | 578 | clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags); |
562 | netif_poll_disable(dev); | 579 | netif_poll_disable(dev); |
@@ -611,17 +628,7 @@ int ipoib_ib_dev_stop(struct net_device *dev, int flush) | |||
611 | goto timeout; | 628 | goto timeout; |
612 | } | 629 | } |
613 | 630 | ||
614 | do { | 631 | ipoib_drain_cq(dev); |
615 | n = ib_poll_cq(priv->cq, IPOIB_NUM_WC, priv->ibwc); | ||
616 | for (i = 0; i < n; ++i) { | ||
617 | if (priv->ibwc[i].wr_id & IPOIB_CM_OP_SRQ) | ||
618 | ipoib_cm_handle_rx_wc(dev, priv->ibwc + i); | ||
619 | else if (priv->ibwc[i].wr_id & IPOIB_OP_RECV) | ||
620 | ipoib_ib_handle_rx_wc(dev, priv->ibwc + i); | ||
621 | else | ||
622 | ipoib_ib_handle_tx_wc(dev, priv->ibwc + i); | ||
623 | } | ||
624 | } while (n == IPOIB_NUM_WC); | ||
625 | 632 | ||
626 | msleep(1); | 633 | msleep(1); |
627 | } | 634 | } |