ia->ri_dma_lkey = ia->ri_id->device->local_dma_lkey;
        }
 
-       switch (memreg) {
-       case RPCRDMA_MTHCAFMR:
-               if (!ia->ri_id->device->alloc_fmr) {
-                       dprintk("RPC:       %s: MTHCAFMR registration "
-                               "specified but not supported by adapter, "
-                               "using riskier RPCRDMA_ALLPHYSICAL\n",
-                               __func__);
-                       memreg = RPCRDMA_ALLPHYSICAL;
-               }
-               break;
-       case RPCRDMA_FRMR:
+       if (memreg == RPCRDMA_FRMR) {
                /* Requires both frmr reg and local dma lkey */
                if ((devattr.device_cap_flags &
                     (IB_DEVICE_MEM_MGT_EXTENSIONS|IB_DEVICE_LOCAL_DMA_LKEY)) !=
                    (IB_DEVICE_MEM_MGT_EXTENSIONS|IB_DEVICE_LOCAL_DMA_LKEY)) {
                        dprintk("RPC:       %s: FRMR registration "
-                               "specified but not supported by adapter, "
-                               "using riskier RPCRDMA_ALLPHYSICAL\n",
-                               __func__);
-                       memreg = RPCRDMA_ALLPHYSICAL;
+                               "not supported by HCA\n", __func__);
+                       memreg = RPCRDMA_MTHCAFMR;
                } else {
                        /* Mind the ia limit on FRMR page list depth */
                        ia->ri_max_frmr_depth = min_t(unsigned int,
                                RPCRDMA_MAX_DATA_SEGS,
                                devattr.max_fast_reg_page_list_len);
                }
-               break;
+       }
+       if (memreg == RPCRDMA_MTHCAFMR) {
+               if (!ia->ri_id->device->alloc_fmr) {
+                       dprintk("RPC:       %s: MTHCAFMR registration "
+                               "not supported by HCA\n", __func__);
+#if RPCRDMA_PERSISTENT_REGISTRATION
+                       memreg = RPCRDMA_ALLPHYSICAL;
+#else
+                       rc = -EINVAL;
+                       goto out2;
+#endif
+               }
        }
 
        /*