Merge branches 'cxgb3', 'ipoib', 'misc' and 'nes' into for-next
authorRoland Dreier <rolandd@cisco.com>
Fri, 12 Mar 2010 18:54:20 +0000 (10:54 -0800)
committerRoland Dreier <rolandd@cisco.com>
Fri, 12 Mar 2010 18:54:20 +0000 (10:54 -0800)
drivers/infiniband/core/mad.c
drivers/infiniband/hw/cxgb3/iwch.c
drivers/infiniband/hw/nes/nes_hw.c
drivers/infiniband/hw/nes/nes_hw.h
drivers/infiniband/hw/nes/nes_nic.c
drivers/infiniband/hw/nes/nes_verbs.c

index 58463da814d1c671272df2ab4f778986ef84f4dc..e351b15485356b5489c1e2e668bcd7eb19bfb8c0 100644 (file)
@@ -2953,6 +2953,9 @@ static void ib_mad_remove_device(struct ib_device *device)
 {
        int i, num_ports, cur_port;
 
+       if (rdma_node_get_transport(device->node_type) != RDMA_TRANSPORT_IB)
+               return;
+
        if (device->node_type == RDMA_NODE_IB_SWITCH) {
                num_ports = 1;
                cur_port = 0;
index ee1d8b4d45410cbf0f358e1a152f58edfb26a5dc..63f975f3e30fc8e1c289fc2341d5386ea22b79df 100644 (file)
@@ -189,6 +189,7 @@ static void close_rnic_dev(struct t3cdev *tdev)
        list_for_each_entry_safe(dev, tmp, &dev_list, entry) {
                if (dev->rdev.t3cdev_p == tdev) {
                        dev->rdev.flags = CXIO_ERROR_FATAL;
+                       synchronize_net();
                        cancel_delayed_work_sync(&dev->db_drop_task);
                        list_del(&dev->entry);
                        iwch_unregister_device(dev);
@@ -217,6 +218,7 @@ static void iwch_event_handler(struct t3cdev *tdev, u32 evt, u32 port_id)
        switch (evt) {
        case OFFLOAD_STATUS_DOWN: {
                rdev->flags = CXIO_ERROR_FATAL;
+               synchronize_net();
                event.event  = IB_EVENT_DEVICE_FATAL;
                dispatch = 1;
                break;
index ce7f538335778c9182cee9ff94e5482342fc2226..925075557dc251d449e15a3adcb5ab5039621362 100644 (file)
@@ -1899,9 +1899,14 @@ void nes_destroy_nic_qp(struct nes_vnic *nesvnic)
        u16  wqe_fragment_index;
        u64 wqe_frag;
        u32 cqp_head;
+       u32 wqm_cfg0;
        unsigned long flags;
        int ret;
 
+       /* clear wqe stall before destroying NIC QP */
+       wqm_cfg0 = nes_read_indexed(nesdev, NES_IDX_WQM_CONFIG0);
+       nes_write_indexed(nesdev, NES_IDX_WQM_CONFIG0, wqm_cfg0 & 0xFFFF7FFF);
+
        /* Free remaining NIC receive buffers */
        while (nesvnic->nic.rq_head != nesvnic->nic.rq_tail) {
                nic_rqe   = &nesvnic->nic.rq_vbase[nesvnic->nic.rq_tail];
@@ -2020,6 +2025,9 @@ void nes_destroy_nic_qp(struct nes_vnic *nesvnic)
 
        pci_free_consistent(nesdev->pcidev, nesvnic->nic_mem_size, nesvnic->nic_vbase,
                        nesvnic->nic_pbase);
+
+       /* restore old wqm_cfg0 value */
+       nes_write_indexed(nesdev, NES_IDX_WQM_CONFIG0, wqm_cfg0);
 }
 
 /**
index 9b1e7f869d835b660d3f06d6cc14033c73236793..bbbfe9fc5a5a4dbf4642ecbbf954c5093c73e861 100644 (file)
@@ -160,6 +160,7 @@ enum indexed_regs {
        NES_IDX_ENDNODE0_NSTAT_TX_OCTETS_HI = 0x7004,
        NES_IDX_ENDNODE0_NSTAT_TX_FRAMES_LO = 0x7008,
        NES_IDX_ENDNODE0_NSTAT_TX_FRAMES_HI = 0x700c,
+       NES_IDX_WQM_CONFIG0 = 0x5000,
        NES_IDX_WQM_CONFIG1 = 0x5004,
        NES_IDX_CM_CONFIG = 0x5100,
        NES_IDX_NIC_LOGPORT_TO_PHYPORT = 0x6000,
index a1d79b6856ac59c1961b1cb3f58267ce2a7da2a6..91fdde382e82e9d936d263d012993415aa2ca640 100644 (file)
@@ -1595,7 +1595,6 @@ struct net_device *nes_netdev_init(struct nes_device *nesdev,
        struct nes_vnic *nesvnic;
        struct net_device *netdev;
        struct nic_qp_map *curr_qp_map;
-       u32 u32temp;
        u8 phy_type = nesdev->nesadapter->phy_type[nesdev->mac_index];
 
        netdev = alloc_etherdev(sizeof(struct nes_vnic));
@@ -1707,6 +1706,10 @@ struct net_device *nes_netdev_init(struct nes_device *nesdev,
             ((phy_type == NES_PHY_TYPE_PUMA_1G) &&
              (((PCI_FUNC(nesdev->pcidev->devfn) == 1) && (nesdev->mac_index == 2)) ||
               ((PCI_FUNC(nesdev->pcidev->devfn) == 2) && (nesdev->mac_index == 1)))))) {
+               u32 u32temp;
+               u32 link_mask;
+               u32 link_val;
+
                u32temp = nes_read_indexed(nesdev, NES_IDX_PHY_PCS_CONTROL_STATUS0 +
                                (0x200 * (nesdev->mac_index & 1)));
                if (phy_type != NES_PHY_TYPE_PUMA_1G) {
@@ -1715,13 +1718,36 @@ struct net_device *nes_netdev_init(struct nes_device *nesdev,
                                (0x200 * (nesdev->mac_index & 1)), u32temp);
                }
 
+               /* Check and set linkup here.  This is for back to back */
+               /* configuration where second port won't get link interrupt */
+               switch (phy_type) {
+               case NES_PHY_TYPE_PUMA_1G:
+                       if (nesdev->mac_index < 2) {
+                               link_mask = 0x01010000;
+                               link_val = 0x01010000;
+                       } else {
+                               link_mask = 0x02020000;
+                               link_val = 0x02020000;
+                       }
+                       break;
+               default:
+                       link_mask = 0x0f1f0000;
+                       link_val = 0x0f0f0000;
+                       break;
+               }
+
+               u32temp = nes_read_indexed(nesdev,
+                                          NES_IDX_PHY_PCS_CONTROL_STATUS0 +
+                                          (0x200 * (nesdev->mac_index & 1)));
+               if ((u32temp & link_mask) == link_val)
+                       nesvnic->linkup = 1;
+
                /* clear the MAC interrupt status, assumes direct logical to physical mapping */
                u32temp = nes_read_indexed(nesdev, NES_IDX_MAC_INT_STATUS + (0x200 * nesdev->mac_index));
                nes_debug(NES_DBG_INIT, "Phy interrupt status = 0x%X.\n", u32temp);
                nes_write_indexed(nesdev, NES_IDX_MAC_INT_STATUS + (0x200 * nesdev->mac_index), u32temp);
 
                nes_init_phy(nesdev);
-
        }
 
        return netdev;
index 815725f886c449dbde3e65c6ec999229b1fbf17c..69928296d74bf3b8f41e5f80449ecc66b4fc6375 100644 (file)
@@ -1323,6 +1323,7 @@ static struct ib_qp *nes_create_qp(struct ib_pd *ibpd,
                        nesqp->nesqp_context->aeq_token_low =  cpu_to_le32((u32)((unsigned long)(nesqp)));
                        nesqp->nesqp_context->aeq_token_high =  cpu_to_le32((u32)(upper_32_bits((unsigned long)(nesqp))));
                        nesqp->nesqp_context->ird_ord_sizes = cpu_to_le32(NES_QPCONTEXT_ORDIRD_ALSMM |
+                                       NES_QPCONTEXT_ORDIRD_AAH |
                                        ((((u32)nesadapter->max_irrq_wr) <<
                                        NES_QPCONTEXT_ORDIRD_IRDSIZE_SHIFT) & NES_QPCONTEXT_ORDIRD_IRDSIZE_MASK));
                        if (disable_mpa_crc) {