Low level drivers need to be able to check incoming attributes as well as be
able to adjust their private data on queue pair modification.  Add 2 driver
callbacks, check_modify_qp and modify_qp, to facilitate this.
Signed-off-by: Ira Weiny <ira.weiny@intel.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
                                attr_mask, link))
                goto inval;
 
+       if (rdi->driver_f.check_modify_qp &&
+           rdi->driver_f.check_modify_qp(qp, attr, attr_mask, udata))
+               goto inval;
+
        if (attr_mask & IB_QP_AV) {
                if (attr->ah_attr.dlid >= be16_to_cpu(IB_MULTICAST_LID_BASE))
                        goto inval;
        if (attr_mask & IB_QP_MAX_QP_RD_ATOMIC)
                qp->s_max_rd_atomic = attr->max_rd_atomic;
 
+       if (rdi->driver_f.modify_qp)
+               rdi->driver_f.modify_qp(qp, attr, attr_mask, udata);
+
        spin_unlock(&qp->s_lock);
        spin_unlock_irq(&qp->r_lock);
 
 
                              struct rvt_ah *);
        int (*alloc_qpn)(struct rvt_dev_info *rdi, struct rvt_qpn_table *qpt,
                         enum ib_qp_type type, u8 port, gfp_t gfp);
+       /**
+        * Return 0 if modification is valid, -errno otherwise
+        */
+       int (*check_modify_qp)(struct rvt_qp *qp, struct ib_qp_attr *attr,
+                              int attr_mask, struct ib_udata *udata);
+       void (*modify_qp)(struct rvt_qp *qp, struct ib_qp_attr *attr,
+                         int attr_mask, struct ib_udata *udata);
 };
 
 struct rvt_dev_info {