nvm->active = nvm_dev;
        }
 
-       nvm_dev = register_nvmem(sw, nvm->id, NVM_MAX_SIZE, false);
-       if (IS_ERR(nvm_dev)) {
-               ret = PTR_ERR(nvm_dev);
-               goto err_nvm_active;
+       if (!sw->no_nvm_upgrade) {
+               nvm_dev = register_nvmem(sw, nvm->id, NVM_MAX_SIZE, false);
+               if (IS_ERR(nvm_dev)) {
+                       ret = PTR_ERR(nvm_dev);
+                       goto err_nvm_active;
+               }
+               nvm->non_active = nvm_dev;
        }
-       nvm->non_active = nvm_dev;
 
        sw->nvm = nvm;
        return 0;
        if (!nvm->authenticating)
                nvm_clear_auth_status(sw);
 
-       nvmem_unregister(nvm->non_active);
+       if (nvm->non_active)
+               nvmem_unregister(nvm->non_active);
        if (nvm->active)
                nvmem_unregister(nvm->active);
        ida_simple_remove(&nvm_ida, nvm->id);
                    sw->security_level == TB_SECURITY_SECURE)
                        return attr->mode;
                return 0;
-       } else if (attr == &dev_attr_nvm_authenticate.attr ||
-                  attr == &dev_attr_nvm_version.attr) {
+       } else if (attr == &dev_attr_nvm_authenticate.attr) {
+               if (sw->dma_port && !sw->no_nvm_upgrade)
+                       return attr->mode;
+               return 0;
+       } else if (attr == &dev_attr_nvm_version.attr) {
                if (sw->dma_port)
                        return attr->mode;
                return 0;
                break;
        }
 
-       if (sw->no_nvm_upgrade)
+       /* Root switch DMA port requires running firmware */
+       if (!tb_route(sw) && sw->config.enabled)
                return 0;
 
        sw->dma_port = dma_port_alloc(sw);
        if (!sw->dma_port)
                return 0;
 
+       if (sw->no_nvm_upgrade)
+               return 0;
+
        /*
         * Check status of the previous flash authentication. If there
         * is one we need to power cycle the switch in any case to make