Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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:
RDMA/nes: Fix CX4 link problem in back-to-back configuration
RDMA/nes: Clear stall bit before destroying NIC QP
RDMA/nes: Set assume_aligned_header bit
RDMA/cxgb3: Wait at least one schedule cycle during device removal
IB/mad: Ignore iWARP devices on device removal
IPoIB: Include return code in trace message for ib_post_send() failures
IPoIB: Fix TX queue lockup with mixed UD/CM traffic

+55 -9
+3
drivers/infiniband/core/mad.c
··· 2953 2953 { 2954 2954 int i, num_ports, cur_port; 2955 2955 2956 + if (rdma_node_get_transport(device->node_type) != RDMA_TRANSPORT_IB) 2957 + return; 2958 + 2956 2959 if (device->node_type == RDMA_NODE_IB_SWITCH) { 2957 2960 num_ports = 1; 2958 2961 cur_port = 0;
+2
drivers/infiniband/hw/cxgb3/iwch.c
··· 189 189 list_for_each_entry_safe(dev, tmp, &dev_list, entry) { 190 190 if (dev->rdev.t3cdev_p == tdev) { 191 191 dev->rdev.flags = CXIO_ERROR_FATAL; 192 + synchronize_net(); 192 193 cancel_delayed_work_sync(&dev->db_drop_task); 193 194 list_del(&dev->entry); 194 195 iwch_unregister_device(dev); ··· 218 217 switch (evt) { 219 218 case OFFLOAD_STATUS_DOWN: { 220 219 rdev->flags = CXIO_ERROR_FATAL; 220 + synchronize_net(); 221 221 event.event = IB_EVENT_DEVICE_FATAL; 222 222 dispatch = 1; 223 223 break;
+8
drivers/infiniband/hw/nes/nes_hw.c
··· 1899 1899 u16 wqe_fragment_index; 1900 1900 u64 wqe_frag; 1901 1901 u32 cqp_head; 1902 + u32 wqm_cfg0; 1902 1903 unsigned long flags; 1903 1904 int ret; 1905 + 1906 + /* clear wqe stall before destroying NIC QP */ 1907 + wqm_cfg0 = nes_read_indexed(nesdev, NES_IDX_WQM_CONFIG0); 1908 + nes_write_indexed(nesdev, NES_IDX_WQM_CONFIG0, wqm_cfg0 & 0xFFFF7FFF); 1904 1909 1905 1910 /* Free remaining NIC receive buffers */ 1906 1911 while (nesvnic->nic.rq_head != nesvnic->nic.rq_tail) { ··· 2025 2020 2026 2021 pci_free_consistent(nesdev->pcidev, nesvnic->nic_mem_size, nesvnic->nic_vbase, 2027 2022 nesvnic->nic_pbase); 2023 + 2024 + /* restore old wqm_cfg0 value */ 2025 + nes_write_indexed(nesdev, NES_IDX_WQM_CONFIG0, wqm_cfg0); 2028 2026 } 2029 2027 2030 2028 /**
+1
drivers/infiniband/hw/nes/nes_hw.h
··· 160 160 NES_IDX_ENDNODE0_NSTAT_TX_OCTETS_HI = 0x7004, 161 161 NES_IDX_ENDNODE0_NSTAT_TX_FRAMES_LO = 0x7008, 162 162 NES_IDX_ENDNODE0_NSTAT_TX_FRAMES_HI = 0x700c, 163 + NES_IDX_WQM_CONFIG0 = 0x5000, 163 164 NES_IDX_WQM_CONFIG1 = 0x5004, 164 165 NES_IDX_CM_CONFIG = 0x5100, 165 166 NES_IDX_NIC_LOGPORT_TO_PHYPORT = 0x6000,
+28 -2
drivers/infiniband/hw/nes/nes_nic.c
··· 1595 1595 struct nes_vnic *nesvnic; 1596 1596 struct net_device *netdev; 1597 1597 struct nic_qp_map *curr_qp_map; 1598 - u32 u32temp; 1599 1598 u8 phy_type = nesdev->nesadapter->phy_type[nesdev->mac_index]; 1600 1599 1601 1600 netdev = alloc_etherdev(sizeof(struct nes_vnic)); ··· 1706 1707 ((phy_type == NES_PHY_TYPE_PUMA_1G) && 1707 1708 (((PCI_FUNC(nesdev->pcidev->devfn) == 1) && (nesdev->mac_index == 2)) || 1708 1709 ((PCI_FUNC(nesdev->pcidev->devfn) == 2) && (nesdev->mac_index == 1)))))) { 1710 + u32 u32temp; 1711 + u32 link_mask; 1712 + u32 link_val; 1713 + 1709 1714 u32temp = nes_read_indexed(nesdev, NES_IDX_PHY_PCS_CONTROL_STATUS0 + 1710 1715 (0x200 * (nesdev->mac_index & 1))); 1711 1716 if (phy_type != NES_PHY_TYPE_PUMA_1G) { ··· 1718 1715 (0x200 * (nesdev->mac_index & 1)), u32temp); 1719 1716 } 1720 1717 1718 + /* Check and set linkup here. This is for back to back */ 1719 + /* configuration where second port won't get link interrupt */ 1720 + switch (phy_type) { 1721 + case NES_PHY_TYPE_PUMA_1G: 1722 + if (nesdev->mac_index < 2) { 1723 + link_mask = 0x01010000; 1724 + link_val = 0x01010000; 1725 + } else { 1726 + link_mask = 0x02020000; 1727 + link_val = 0x02020000; 1728 + } 1729 + break; 1730 + default: 1731 + link_mask = 0x0f1f0000; 1732 + link_val = 0x0f0f0000; 1733 + break; 1734 + } 1735 + 1736 + u32temp = nes_read_indexed(nesdev, 1737 + NES_IDX_PHY_PCS_CONTROL_STATUS0 + 1738 + (0x200 * (nesdev->mac_index & 1))); 1739 + if ((u32temp & link_mask) == link_val) 1740 + nesvnic->linkup = 1; 1741 + 1721 1742 /* clear the MAC interrupt status, assumes direct logical to physical mapping */ 1722 1743 u32temp = nes_read_indexed(nesdev, NES_IDX_MAC_INT_STATUS + (0x200 * nesdev->mac_index)); 1723 1744 nes_debug(NES_DBG_INIT, "Phy interrupt status = 0x%X.\n", u32temp); 1724 1745 nes_write_indexed(nesdev, NES_IDX_MAC_INT_STATUS + (0x200 * nesdev->mac_index), u32temp); 1725 1746 1726 1747 nes_init_phy(nesdev); 1727 - 1728 1748 } 1729 1749 1730 1750 return netdev;
+1
drivers/infiniband/hw/nes/nes_verbs.c
··· 1323 1323 nesqp->nesqp_context->aeq_token_low = cpu_to_le32((u32)((unsigned long)(nesqp))); 1324 1324 nesqp->nesqp_context->aeq_token_high = cpu_to_le32((u32)(upper_32_bits((unsigned long)(nesqp)))); 1325 1325 nesqp->nesqp_context->ird_ord_sizes = cpu_to_le32(NES_QPCONTEXT_ORDIRD_ALSMM | 1326 + NES_QPCONTEXT_ORDIRD_AAH | 1326 1327 ((((u32)nesadapter->max_irrq_wr) << 1327 1328 NES_QPCONTEXT_ORDIRD_IRDSIZE_SHIFT) & NES_QPCONTEXT_ORDIRD_IRDSIZE_MASK)); 1328 1329 if (disable_mpa_crc) {
+7 -3
drivers/infiniband/ulp/ipoib/ipoib_cm.c
··· 708 708 struct ipoib_dev_priv *priv = netdev_priv(dev); 709 709 struct ipoib_cm_tx_buf *tx_req; 710 710 u64 addr; 711 + int rc; 711 712 712 713 if (unlikely(skb->len > tx->mtu)) { 713 714 ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n", ··· 740 739 741 740 tx_req->mapping = addr; 742 741 743 - if (unlikely(post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1), 744 - addr, skb->len))) { 745 - ipoib_warn(priv, "post_send failed\n"); 742 + rc = post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1), 743 + addr, skb->len); 744 + if (unlikely(rc)) { 745 + ipoib_warn(priv, "post_send failed, error %d\n", rc); 746 746 ++dev->stats.tx_errors; 747 747 ib_dma_unmap_single(priv->ca, addr, skb->len, DMA_TO_DEVICE); 748 748 dev_kfree_skb_any(skb); ··· 754 752 if (++priv->tx_outstanding == ipoib_sendq_size) { 755 753 ipoib_dbg(priv, "TX ring 0x%x full, stopping kernel net queue\n", 756 754 tx->qp->qp_num); 755 + if (ib_req_notify_cq(priv->send_cq, IB_CQ_NEXT_COMP)) 756 + ipoib_warn(priv, "request notify on send CQ failed\n"); 757 757 netif_stop_queue(dev); 758 758 } 759 759 }
+5 -4
drivers/infiniband/ulp/ipoib/ipoib_ib.c
··· 529 529 { 530 530 struct ipoib_dev_priv *priv = netdev_priv(dev); 531 531 struct ipoib_tx_buf *tx_req; 532 - int hlen; 532 + int hlen, rc; 533 533 void *phead; 534 534 535 535 if (skb_is_gso(skb)) { ··· 585 585 netif_stop_queue(dev); 586 586 } 587 587 588 - if (unlikely(post_send(priv, priv->tx_head & (ipoib_sendq_size - 1), 589 - address->ah, qpn, tx_req, phead, hlen))) { 590 - ipoib_warn(priv, "post_send failed\n"); 588 + rc = post_send(priv, priv->tx_head & (ipoib_sendq_size - 1), 589 + address->ah, qpn, tx_req, phead, hlen); 590 + if (unlikely(rc)) { 591 + ipoib_warn(priv, "post_send failed, error %d\n", rc); 591 592 ++dev->stats.tx_errors; 592 593 --priv->tx_outstanding; 593 594 ipoib_dma_unmap_tx(priv->ca, tx_req);