vmd: don't create new buses in hotplug
This doesn't work anyway and can cause creating duplicate bus objects if vmd_scan_single_bus() is called on a parent bus with previously allocated child buses. Also, while here, removed a few unused functions and flags in struct vmd_adapter. Signed-off-by: Konrad Sztyber <konrad.sztyber@intel.com> Change-Id: Ic757070188157d9851f648acd074ca4943a14c39 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/13955 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Tom Nabarro <tom.nabarro@intel.com>
This commit is contained in:
parent
ee1ab6f6be
commit
4c482a623b
@ -663,30 +663,16 @@ vmd_create_new_bus(struct vmd_pci_bus *parent, struct vmd_pci_device *bridge, ui
|
||||
return new_bus;
|
||||
}
|
||||
|
||||
/*
|
||||
* Assigns a bus number from the list of available
|
||||
* bus numbers. If the device is downstream of a hot plug port,
|
||||
* assign the bus number from those assigned to the HP port. Otherwise,
|
||||
* assign the next bus number from the vmd bus number list.
|
||||
*/
|
||||
static uint8_t
|
||||
vmd_get_next_bus_number(struct vmd_pci_device *dev, struct vmd_adapter *vmd)
|
||||
vmd_get_next_bus_number(struct vmd_adapter *vmd)
|
||||
{
|
||||
uint8_t bus = 0xff;
|
||||
struct vmd_pci_bus *hp_bus;
|
||||
|
||||
if (dev) {
|
||||
hp_bus = vmd_is_dev_in_hotplug_path(dev);
|
||||
if (hp_bus && hp_bus->self && hp_bus->self->hotplug_capable) {
|
||||
return vmd_hp_get_next_bus_number(&hp_bus->self->hp);
|
||||
}
|
||||
}
|
||||
|
||||
/* Device is not under a hot plug path. Return next global bus number */
|
||||
if ((vmd->next_bus_number + 1) < vmd->max_pci_bus) {
|
||||
bus = vmd->next_bus_number;
|
||||
vmd->next_bus_number++;
|
||||
}
|
||||
|
||||
return bus;
|
||||
}
|
||||
|
||||
@ -951,7 +937,7 @@ vmd_init_end_device(struct vmd_pci_device *dev)
|
||||
* Return count of how many devices found(type1 + type 0 header devices)
|
||||
*/
|
||||
static uint8_t
|
||||
vmd_scan_single_bus(struct vmd_pci_bus *bus, struct vmd_pci_device *parent_bridge)
|
||||
vmd_scan_single_bus(struct vmd_pci_bus *bus, struct vmd_pci_device *parent_bridge, bool hotplug)
|
||||
{
|
||||
/* assuming only single function devices are on the bus */
|
||||
struct vmd_pci_device *new_dev;
|
||||
@ -968,12 +954,17 @@ vmd_scan_single_bus(struct vmd_pci_bus *bus, struct vmd_pci_device *parent_bridg
|
||||
}
|
||||
|
||||
if (new_dev->header->common.header_type & PCI_HEADER_TYPE_BRIDGE) {
|
||||
if (hotplug) {
|
||||
free(new_dev);
|
||||
continue;
|
||||
}
|
||||
|
||||
slot_cap.as_uint32_t = 0;
|
||||
if (new_dev->pcie_cap != NULL) {
|
||||
slot_cap.as_uint32_t = new_dev->pcie_cap->slot_cap.as_uint32_t;
|
||||
}
|
||||
|
||||
new_bus_num = vmd_get_next_bus_number(bus->vmd->is_hotplug_scan ? new_dev : NULL, bus->vmd);
|
||||
new_bus_num = vmd_get_next_bus_number(bus->vmd);
|
||||
if (new_bus_num == 0xff) {
|
||||
vmd_dev_free(new_dev);
|
||||
return dev_cnt;
|
||||
@ -1015,7 +1006,7 @@ vmd_scan_single_bus(struct vmd_pci_bus *bus, struct vmd_pci_device *parent_bridg
|
||||
vmd_init_hotplug(new_dev, new_bus);
|
||||
}
|
||||
|
||||
dev_cnt += vmd_scan_single_bus(new_bus, new_dev);
|
||||
dev_cnt += vmd_scan_single_bus(new_bus, new_dev, hotplug);
|
||||
if (new_dev->pcie_cap != NULL) {
|
||||
if (new_dev->pcie_cap->express_cap_register.bit_field.device_type == SwitchUpstreamPort) {
|
||||
return dev_cnt;
|
||||
@ -1142,7 +1133,7 @@ vmd_scan_pcibus(struct vmd_pci_bus *bus)
|
||||
g_end_device_count = 0;
|
||||
TAILQ_INSERT_TAIL(&bus->vmd->bus_list, bus, tailq);
|
||||
bus->vmd->next_bus_number = bus->bus_number + 1;
|
||||
dev_cnt = vmd_scan_single_bus(bus, NULL);
|
||||
dev_cnt = vmd_scan_single_bus(bus, NULL, false);
|
||||
|
||||
SPDK_INFOLOG(vmd, "VMD scan found %u devices\n", dev_cnt);
|
||||
SPDK_INFOLOG(vmd, "VMD scan found %u END DEVICES\n", g_end_device_count);
|
||||
@ -1355,7 +1346,7 @@ vmd_bus_handle_hotplug(struct vmd_pci_bus *bus)
|
||||
|
||||
for (sleep_count = 0; sleep_count < 20; ++sleep_count) {
|
||||
/* Scan until a new device is found */
|
||||
num_devices = vmd_scan_single_bus(bus, bus->self);
|
||||
num_devices = vmd_scan_single_bus(bus, bus->self, true);
|
||||
if (num_devices > 0) {
|
||||
break;
|
||||
}
|
||||
|
@ -129,13 +129,9 @@ struct vmd_adapter {
|
||||
|
||||
uint32_t next_bus_number : 10;
|
||||
uint32_t max_pci_bus : 10;
|
||||
uint32_t is_hotplug_scan : 1;
|
||||
uint32_t is_ready : 1;
|
||||
uint32_t processing_hp : 1;
|
||||
uint32_t max_payload_size: 3;
|
||||
uint32_t root_port_updated : 1;
|
||||
uint32_t scan_completed : 1;
|
||||
uint32_t rsv : 4;
|
||||
uint32_t rsv : 10;
|
||||
|
||||
/* end devices attached to vmd adapters */
|
||||
struct vmd_pci_device *target[MAX_VMD_TARGET];
|
||||
@ -150,26 +146,6 @@ struct vmd_adapter {
|
||||
struct event_fifo *hp_queue;
|
||||
};
|
||||
|
||||
/* TODO: Temporary stubs for Hot Plug interface */
|
||||
static inline struct vmd_pci_bus *
|
||||
vmd_is_dev_in_hotplug_path(struct vmd_pci_device *dev)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline void
|
||||
vmd_hp_enable_hotplug(struct vmd_hot_plug *hp)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
static inline uint8_t
|
||||
vmd_hp_get_next_bus_number(struct vmd_hot_plug *hp)
|
||||
{
|
||||
assert(false);
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct vmd_pci_device *vmd_find_device(const struct spdk_pci_addr *addr);
|
||||
|
||||
#endif /* VMD_H */
|
||||
|
Loading…
Reference in New Issue
Block a user