Merge branches 'core', 'cxgb4', 'iser', 'mlx5' and 'ocrdma' into for-next
authorRoland Dreier <roland@purestorage.com>
Tue, 14 Oct 2014 21:09:12 +0000 (14:09 -0700)
committerRoland Dreier <roland@purestorage.com>
Tue, 14 Oct 2014 21:09:12 +0000 (14:09 -0700)
1  2  3  4  5 
drivers/infiniband/core/uverbs_main.c
drivers/infiniband/hw/mlx5/qp.c

index bb6fea12ce31b97ae549338a097e0a2302fd441c,c73b22a257fe3c92c9398e5318acbc4ffa569b90,c73b22a257fe3c92c9398e5318acbc4ffa569b90,b21af1eaf5030c8b00003ccf102c79e5d3c8aef8,c73b22a257fe3c92c9398e5318acbc4ffa569b90..71ab83fde47292e95315c2170b00fec6277b7861
@@@@@@ -477,6 -477,6 -477,6 -477,7 -477,6 +477,7 @@@@@@ static void ib_uverbs_async_handler(str
     
        entry->desc.async.element    = element;
        entry->desc.async.event_type = event;
+++ +   entry->desc.async.reserved   = 0;
        entry->counter               = counter;
     
        list_add_tail(&entry->list, &file->async_file->event_list);
@@@@@@ -502,10 -502,6 -502,6 -503,6 -502,6 +503,10 @@@@@@ void ib_uverbs_qp_event_handler(struct 
     {
        struct ib_uevent_object *uobj;
     
 ++++   /* for XRC target qp's, check that qp is live */
 ++++   if (!event->element.qp->uobject || !event->element.qp->uobject->live)
 ++++           return;
 ++++
        uobj = container_of(event->element.qp->uobject,
                            struct ib_uevent_object, uobject);
     
index 8c574b63d77b900768a71ffe334d5cf046b7d83d,8c574b63d77b900768a71ffe334d5cf046b7d83d,d7f35e9e6522342b44258ac1bd75d956142f5b5a,34b92fc345b797904651397090d288b208f63039,8c574b63d77b900768a71ffe334d5cf046b7d83d..f1b49e024664a117bfbafecc7683cd08463c7afc
@@@@@@ -1302,6 -1302,6 -1302,6 -1302,11 -1302,6 +1302,11 @@@@@@ static int mlx5_set_path(struct mlx5_ib
        path->rlid      = cpu_to_be16(ah->dlid);
     
        if (ah->ah_flags & IB_AH_GRH) {
+++ +           if (ah->grh.sgid_index >= dev->mdev->caps.port[port - 1].gid_table_len) {
+++ +                   pr_err(KERN_ERR "sgid_index (%u) too large. max is %d\n",
+++ +                          ah->grh.sgid_index, dev->mdev->caps.port[port - 1].gid_table_len);
+++ +                   return -EINVAL;
+++ +           }
                path->grh_mlid |= 1 << 7;
                path->mgid_index = ah->grh.sgid_index;
                path->hop_limit  = ah->grh.hop_limit;
        path->static_rate = err;
        path->port = port;
     
--- -   if (ah->ah_flags & IB_AH_GRH) {
--- -           if (ah->grh.sgid_index >= dev->mdev->caps.port[port - 1].gid_table_len) {
--- -                   pr_err(KERN_ERR "sgid_index (%u) too large. max is %d\n",
--- -                          ah->grh.sgid_index, dev->mdev->caps.port[port - 1].gid_table_len);
--- -                   return -EINVAL;
--- -           }
--- -
--- -           path->grh_mlid |= 1 << 7;
--- -           path->mgid_index = ah->grh.sgid_index;
--- -           path->hop_limit  = ah->grh.hop_limit;
--- -           path->tclass_flowlabel =
--- -                   cpu_to_be32((ah->grh.traffic_class << 20) |
--- -                               (ah->grh.flow_label));
--- -           memcpy(path->rgid, ah->grh.dgid.raw, 16);
--- -   }
--- -
        if (attr_mask & IB_QP_TIMEOUT)
                path->ackto_lt = attr->timeout << 3;
     
@@@@@@ -2020,56 -2020,56 -2020,31 -2009,56 -2020,56 +2009,31 @@@@@@ static u8 bs_selector(int block_size
        }
     }
     
-- --static int format_selector(struct ib_sig_attrs *attr,
-- --                      struct ib_sig_domain *domain,
-- --                      int *selector)
   - {
   - 
   - #define FORMAT_DIF_NONE            0
   - #define FORMAT_DIF_CRC_INC 8
   - #define FORMAT_DIF_CRC_NO_INC      12
   - #define FORMAT_DIF_CSUM_INC        13
   - #define FORMAT_DIF_CSUM_NO_INC     14
   - 
   -    switch (domain->sig.dif.type) {
   -    case IB_T10DIF_NONE:
   -            /* No DIF */
   -            *selector = FORMAT_DIF_NONE;
   -            break;
   -    case IB_T10DIF_TYPE1: /* Fall through */
   -    case IB_T10DIF_TYPE2:
   -            switch (domain->sig.dif.bg_type) {
   -            case IB_T10DIF_CRC:
   -                    *selector = FORMAT_DIF_CRC_INC;
   -                    break;
   -            case IB_T10DIF_CSUM:
   -                    *selector = FORMAT_DIF_CSUM_INC;
   -                    break;
   -            default:
   -                    return 1;
   -            }
   -            break;
   -    case IB_T10DIF_TYPE3:
   -            switch (domain->sig.dif.bg_type) {
   -            case IB_T10DIF_CRC:
   -                    *selector = domain->sig.dif.type3_inc_reftag ?
   -                                       FORMAT_DIF_CRC_INC :
   -                                       FORMAT_DIF_CRC_NO_INC;
   -                    break;
   -            case IB_T10DIF_CSUM:
   -                    *selector = domain->sig.dif.type3_inc_reftag ?
   -                                       FORMAT_DIF_CSUM_INC :
   -                                       FORMAT_DIF_CSUM_NO_INC;
   -                    break;
   -            default:
   -                    return 1;
   -            }
   -            break;
   -    default:
   -            return 1;
++ ++static void mlx5_fill_inl_bsf(struct ib_sig_domain *domain,
++ ++                         struct mlx5_bsf_inl *inl)
   + {
++ ++   /* Valid inline section and allow BSF refresh */
++ ++   inl->vld_refresh = cpu_to_be16(MLX5_BSF_INL_VALID |
++ ++                                  MLX5_BSF_REFRESH_DIF);
++ ++   inl->dif_apptag = cpu_to_be16(domain->sig.dif.app_tag);
++ ++   inl->dif_reftag = cpu_to_be32(domain->sig.dif.ref_tag);
++ ++   /* repeating block */
++ ++   inl->rp_inv_seed = MLX5_BSF_REPEAT_BLOCK;
++ ++   inl->sig_type = domain->sig.dif.bg_type == IB_T10DIF_CRC ?
++ ++                   MLX5_DIF_CRC : MLX5_DIF_IPCS;
   + 
--  -#define FORMAT_DIF_NONE            0
--  -#define FORMAT_DIF_CRC_INC 8
--  -#define FORMAT_DIF_CRC_NO_INC      12
--  -#define FORMAT_DIF_CSUM_INC        13
--  -#define FORMAT_DIF_CSUM_NO_INC     14
++ ++   if (domain->sig.dif.ref_remap)
++ ++           inl->dif_inc_ref_guard_check |= MLX5_BSF_INC_REFTAG;
   + 
--  -   switch (domain->sig.dif.type) {
--  -   case IB_T10DIF_NONE:
--  -           /* No DIF */
--  -           *selector = FORMAT_DIF_NONE;
--  -           break;
--  -   case IB_T10DIF_TYPE1: /* Fall through */
--  -   case IB_T10DIF_TYPE2:
--  -           switch (domain->sig.dif.bg_type) {
--  -           case IB_T10DIF_CRC:
--  -                   *selector = FORMAT_DIF_CRC_INC;
--  -                   break;
--  -           case IB_T10DIF_CSUM:
--  -                   *selector = FORMAT_DIF_CSUM_INC;
--  -                   break;
--  -           default:
--  -                   return 1;
--  -           }
--  -           break;
--  -   case IB_T10DIF_TYPE3:
--  -           switch (domain->sig.dif.bg_type) {
--  -           case IB_T10DIF_CRC:
--  -                   *selector = domain->sig.dif.type3_inc_reftag ?
--  -                                      FORMAT_DIF_CRC_INC :
--  -                                      FORMAT_DIF_CRC_NO_INC;
--  -                   break;
--  -           case IB_T10DIF_CSUM:
--  -                   *selector = domain->sig.dif.type3_inc_reftag ?
--  -                                      FORMAT_DIF_CSUM_INC :
--  -                                      FORMAT_DIF_CSUM_NO_INC;
--  -                   break;
--  -           default:
--  -                   return 1;
--  -           }
--  -           break;
--  -   default:
--  -           return 1;
++ ++   if (domain->sig.dif.app_escape) {
++ ++           if (domain->sig.dif.ref_escape)
++ ++                   inl->dif_inc_ref_guard_check |= MLX5_BSF_APPREF_ESCAPE;
++ ++           else
++ ++                   inl->dif_inc_ref_guard_check |= MLX5_BSF_APPTAG_ESCAPE;
        }
     
-- --   return 0;
++ ++   inl->dif_app_bitmask_check =
++ ++           cpu_to_be16(domain->sig.dif.apptag_check_mask);
     }
     
     static int mlx5_set_bsf(struct ib_mr *sig_mr,
        struct mlx5_bsf_basic *basic = &bsf->basic;
        struct ib_sig_domain *mem = &sig_attrs->mem;
        struct ib_sig_domain *wire = &sig_attrs->wire;
-- --   int ret, selector;
     
        memset(bsf, 0, sizeof(*bsf));
++ ++
++ ++   /* Basic + Extended + Inline */
++ ++   basic->bsf_size_sbs = 1 << 7;
++ ++   /* Input domain check byte mask */
++ ++   basic->check_byte_mask = sig_attrs->check_mask;
++ ++   basic->raw_data_size = cpu_to_be32(data_size);
++ ++
++ ++   /* Memory domain */
        switch (sig_attrs->mem.sig_type) {
++ ++   case IB_SIG_TYPE_NONE:
++ ++           break;
        case IB_SIG_TYPE_T10_DIF:
-- --           if (sig_attrs->wire.sig_type != IB_SIG_TYPE_T10_DIF)
-- --                   return -EINVAL;
++ ++           basic->mem.bs_selector = bs_selector(mem->sig.dif.pi_interval);
++ ++           basic->m_bfs_psv = cpu_to_be32(msig->psv_memory.psv_idx);
++ ++           mlx5_fill_inl_bsf(mem, &bsf->m_inl);
++ ++           break;
++ ++   default:
++ ++           return -EINVAL;
++ ++   }
     
-- --           /* Input domain check byte mask */
-- --           basic->check_byte_mask = sig_attrs->check_mask;
++ ++   /* Wire domain */
++ ++   switch (sig_attrs->wire.sig_type) {
++ ++   case IB_SIG_TYPE_NONE:
++ ++           break;
++ ++   case IB_SIG_TYPE_T10_DIF:
                if (mem->sig.dif.pi_interval == wire->sig.dif.pi_interval &&
-- --               mem->sig.dif.type == wire->sig.dif.type) {
++ ++               mem->sig_type == wire->sig_type) {
                        /* Same block structure */
-- --                   basic->bsf_size_sbs = 1 << 4;
++ ++                   basic->bsf_size_sbs |= 1 << 4;
                        if (mem->sig.dif.bg_type == wire->sig.dif.bg_type)
-- --                           basic->wire.copy_byte_mask |= 0xc0;
++ ++                           basic->wire.copy_byte_mask |= MLX5_CPY_GRD_MASK;
                        if (mem->sig.dif.app_tag == wire->sig.dif.app_tag)
-- --                           basic->wire.copy_byte_mask |= 0x30;
++ ++                           basic->wire.copy_byte_mask |= MLX5_CPY_APP_MASK;
                        if (mem->sig.dif.ref_tag == wire->sig.dif.ref_tag)
-- --                           basic->wire.copy_byte_mask |= 0x0f;
++ ++                           basic->wire.copy_byte_mask |= MLX5_CPY_REF_MASK;
                } else
                        basic->wire.bs_selector = bs_selector(wire->sig.dif.pi_interval);
     
-- --           basic->mem.bs_selector = bs_selector(mem->sig.dif.pi_interval);
-- --           basic->raw_data_size = cpu_to_be32(data_size);
-- --
-- --           ret = format_selector(sig_attrs, mem, &selector);
-- --           if (ret)
-- --                   return -EINVAL;
-- --           basic->m_bfs_psv = cpu_to_be32(selector << 24 |
-- --                                          msig->psv_memory.psv_idx);
-- --
-- --           ret = format_selector(sig_attrs, wire, &selector);
-- --           if (ret)
-- --                   return -EINVAL;
-- --           basic->w_bfs_psv = cpu_to_be32(selector << 24 |
-- --                                          msig->psv_wire.psv_idx);
++ ++           basic->w_bfs_psv = cpu_to_be32(msig->psv_wire.psv_idx);
++ ++           mlx5_fill_inl_bsf(wire, &bsf->w_inl);
                break;
-- --
        default:
                return -EINVAL;
        }
@@@@@@ -2317,20 -2317,20 -2296,21 -2306,20 -2317,20 +2285,21 @@@@@@ static int set_psv_wr(struct ib_sig_dom
        memset(psv_seg, 0, sizeof(*psv_seg));
        psv_seg->psv_num = cpu_to_be32(psv_idx);
        switch (domain->sig_type) {
++ ++   case IB_SIG_TYPE_NONE:
++ ++           break;
        case IB_SIG_TYPE_T10_DIF:
                psv_seg->transient_sig = cpu_to_be32(domain->sig.dif.bg << 16 |
                                                     domain->sig.dif.app_tag);
                psv_seg->ref_tag = cpu_to_be32(domain->sig.dif.ref_tag);
-- --
-- --           *seg += sizeof(*psv_seg);
-- --           *size += sizeof(*psv_seg) / 16;
                break;
-- --
        default:
                pr_err("Bad signature type given.\n");
                return 1;
        }
     
++ ++   *seg += sizeof(*psv_seg);
++ ++   *size += sizeof(*psv_seg) / 16;
++ ++
        return 0;
     }