]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/blobdiff - drivers/thunderbolt/switch.c
Merge tag 'backlight-next-5.4' of git://git.kernel.org/pub/scm/linux/kernel/git/lee...
[mirror_ubuntu-hirsute-kernel.git] / drivers / thunderbolt / switch.c
index 5668a44e0653b2685825ddb1b9105110d021590c..410bf1bceeee4f661850af632f49a11db672c5b8 100644 (file)
@@ -364,12 +364,14 @@ static int tb_switch_nvm_add(struct tb_switch *sw)
                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;
@@ -398,7 +400,8 @@ static void tb_switch_nvm_remove(struct tb_switch *sw)
        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);
@@ -611,8 +614,14 @@ static int tb_init_port(struct tb_port *port)
        int cap;
 
        res = tb_port_read(port, &port->config, TB_CFG_PORT, 0, 8);
-       if (res)
+       if (res) {
+               if (res == -ENODEV) {
+                       tb_dbg(port->sw->tb, " Port %d: not implemented\n",
+                              port->port);
+                       return 0;
+               }
                return res;
+       }
 
        /* Port 0 is the switch itself and has no PHY. */
        if (port->config.type == TB_TYPE_PORT && port->port != 0) {
@@ -1331,14 +1340,29 @@ static umode_t switch_attr_is_visible(struct kobject *kobj,
        struct device *dev = container_of(kobj, struct device, kobj);
        struct tb_switch *sw = tb_to_switch(dev);
 
-       if (attr == &dev_attr_key.attr) {
+       if (attr == &dev_attr_device.attr) {
+               if (!sw->device)
+                       return 0;
+       } else if (attr == &dev_attr_device_name.attr) {
+               if (!sw->device_name)
+                       return 0;
+       } else if (attr == &dev_attr_vendor.attr)  {
+               if (!sw->vendor)
+                       return 0;
+       } else if (attr == &dev_attr_vendor_name.attr)  {
+               if (!sw->vendor_name)
+                       return 0;
+       } else if (attr == &dev_attr_key.attr) {
                if (tb_route(sw) &&
                    sw->tb->security_level == TB_SECURITY_SECURE &&
                    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;
@@ -1446,6 +1470,8 @@ static int tb_switch_get_generation(struct tb_switch *sw)
        case PCI_DEVICE_ID_INTEL_TITAN_RIDGE_2C_BRIDGE:
        case PCI_DEVICE_ID_INTEL_TITAN_RIDGE_4C_BRIDGE:
        case PCI_DEVICE_ID_INTEL_TITAN_RIDGE_DD_BRIDGE:
+       case PCI_DEVICE_ID_INTEL_ICL_NHI0:
+       case PCI_DEVICE_ID_INTEL_ICL_NHI1:
                return 3;
 
        default:
@@ -1689,13 +1715,17 @@ static int tb_switch_add_dma_port(struct tb_switch *sw)
                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