diff options
Diffstat (limited to 'drivers/thunderbolt/switch.c')
| -rw-r--r-- | drivers/thunderbolt/switch.c | 52 | 
1 files changed, 41 insertions, 11 deletions
diff --git a/drivers/thunderbolt/switch.c b/drivers/thunderbolt/switch.c index 5668a44e0653..410bf1bceeee 100644 --- a/drivers/thunderbolt/switch.c +++ b/drivers/thunderbolt/switch.c @@ -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  |