Fix bug in ofwbus_release_resource() for non-ofwbus descendants
Resource list for devices that are not ofwbus descendants, but got to ofwbus method via bus_generic_release_resource() call chain, cannot be found using BUS_GET_RESOURCE_LIST() used by ofwbus. In that case, changing device's resource list should be avoided (will not contain resource list prepared by ofw or simplebus). Pointy-hat to: zbb Reviewed by: wma Obtained from: Semihalf Sponsored by: Cavium Differential Revision: https://reviews.freebsd.org/D5304
This commit is contained in:
parent
98bc9384c5
commit
e2d4f32f4e
@ -271,12 +271,17 @@ ofwbus_release_resource(device_t bus, device_t child, int type,
|
||||
int rid, struct resource *r)
|
||||
{
|
||||
struct resource_list_entry *rle;
|
||||
int passthrough;
|
||||
int error;
|
||||
|
||||
/* Clean resource list entry */
|
||||
rle = resource_list_find(BUS_GET_RESOURCE_LIST(bus, child), type, rid);
|
||||
if (rle != NULL)
|
||||
rle->res = NULL;
|
||||
passthrough = (device_get_parent(child) != bus);
|
||||
if (!passthrough) {
|
||||
/* Clean resource list entry */
|
||||
rle = resource_list_find(BUS_GET_RESOURCE_LIST(bus, child),
|
||||
type, rid);
|
||||
if (rle != NULL)
|
||||
rle->res = NULL;
|
||||
}
|
||||
|
||||
if ((rman_get_flags(r) & RF_ACTIVE) != 0) {
|
||||
error = bus_deactivate_resource(child, type, rid, r);
|
||||
|
Loading…
Reference in New Issue
Block a user