Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7726f813 authored by Don Zickus's avatar Don Zickus Committed by Greg Kroah-Hartman
Browse files

staging: unisys: Prepare vbus_hdr_info to be public



In order to remove bus_info, we need to migrate vbus_hdr_info into
the public namespace of visor_device.  Because the struct is private,
we use a void * to hide the contents.

As a result, we need to allocate vbus_hdr_info and manage it.

Also work around vbus_valid, as that variable will not be used
in the public namespace.

Signed-off-by: default avatarDon Zickus <dzickus@redhat.com>
Signed-off-by: default avatarBenjamin Romer <benjamin.romer@unisys.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 0274b5ae
Loading
Loading
Loading
Loading
+30 −22
Original line number Diff line number Diff line
@@ -45,7 +45,7 @@ struct visorbus_devdata {
	struct kobject kobj;
	struct visorchannel *chan;	/* channel area for bus itself */
	bool vbus_valid;
	struct spar_vbus_headerinfo vbus_hdr_info;
	void *vbus_hdr_info;
};

#define CURRENT_FILE_PC VISOR_BUS_PC_visorbus_main_c
@@ -1276,10 +1276,13 @@ fix_vbus_dev_info(struct visor_device *visordev)
	int dev_no = visordev->chipset_dev_no;
	struct ultra_vbus_deviceinfo dev_info;
	const char *chan_type_name = NULL;
	struct spar_vbus_headerinfo *hdr_info;

	if (!visordev->device.driver)
			return;

	hdr_info = (struct spar_vbus_headerinfo *)visordev->vbus_hdr_info;

	visordrv = to_visor_driver(visordev->device.driver);
	if (!visorchipset_get_bus_info(bus_no, &bus_info))
			return;
@@ -1288,7 +1291,7 @@ fix_vbus_dev_info(struct visor_device *visordev)
	if (!devdata)
			return;

	if (!devdata->vbus_valid)
	if (!hdr_info)
			return;

	/* Within the list of device types (by GUID) that the driver
@@ -1308,16 +1311,13 @@ fix_vbus_dev_info(struct visor_device *visordev)
	bus_device_info_init(&dev_info, chan_type_name,
			     visordrv->name, visordrv->version,
			     visordrv->vertag);
	write_vbus_dev_info(devdata->chan,
			    &devdata->vbus_hdr_info, &dev_info, dev_no);
	write_vbus_dev_info(devdata->chan, hdr_info, &dev_info, dev_no);

	/* Re-write bus+chipset info, because it is possible that this
	* was previously written by our evil counterpart, virtpci.
	*/
	write_vbus_chp_info(devdata->chan, &devdata->vbus_hdr_info,
			    &chipset_driverinfo);
	write_vbus_bus_info(devdata->chan, &devdata->vbus_hdr_info,
			    &clientbus_driverinfo);
	write_vbus_chp_info(devdata->chan, hdr_info, &chipset_driverinfo);
	write_vbus_bus_info(devdata->chan, hdr_info, &clientbus_driverinfo);
}

/** Create a device instance for the visor bus itself.
@@ -1328,6 +1328,7 @@ create_bus_instance(struct visorchipset_bus_info *bus_info)
	struct visorbus_devdata *rc = NULL;
	struct visorbus_devdata *devdata = NULL;
	int id = bus_info->bus_no;
	struct spar_vbus_headerinfo *hdr_info;

	POSTCODE_LINUX_2(BUS_CREATE_ENTRY_PC, POSTCODE_SEVERITY_INFO);
	devdata = kzalloc(sizeof(*devdata), GFP_KERNEL);
@@ -1336,6 +1337,13 @@ create_bus_instance(struct visorchipset_bus_info *bus_info)
		rc = NULL;
		goto away;
	}

	hdr_info = kzalloc(sizeof(*hdr_info), GFP_KERNEL);
	if (!hdr_info) {
		rc = NULL;
		goto away_mem;
	}

	dev_set_name(&devdata->dev, "visorbus%d", id);
	devdata->dev.bus = &visorbus_type;
	devdata->dev.groups = visorbus_groups;
@@ -1344,25 +1352,18 @@ create_bus_instance(struct visorchipset_bus_info *bus_info)
		POSTCODE_LINUX_3(DEVICE_CREATE_FAILURE_PC, id,
				 POSTCODE_SEVERITY_ERR);
		rc = NULL;
		goto away;
		goto away_mem2;
	}
	devdata->devno = id;
	devdata->chan = bus_info->visorchannel;
	if (bus_info->flags.server) {
		init_vbus_channel(devdata->chan);
	} else {
		if (get_vbus_header_info(devdata->chan,
					 &devdata->
					 vbus_hdr_info) >= 0) {
			devdata->vbus_valid = true;
			write_vbus_chp_info(devdata->chan,
					    &devdata->
					    vbus_hdr_info,
					    &chipset_driverinfo
					    );
			write_vbus_bus_info(devdata->chan,
					    &devdata->
						vbus_hdr_info,
		if (get_vbus_header_info(devdata->chan, hdr_info) >= 0) {
			devdata->vbus_hdr_info = (void *)hdr_info;
			write_vbus_chp_info(devdata->chan, hdr_info,
					    &chipset_driverinfo);
			write_vbus_bus_info(devdata->chan, hdr_info,
					    &clientbus_driverinfo);
		}
	}
@@ -1372,6 +1373,12 @@ create_bus_instance(struct visorchipset_bus_info *bus_info)
			devdata = devdata;	/* for testing ONLY */
	dev_set_drvdata(&devdata->dev, devdata);
	rc = devdata;
	return rc;

away_mem2:
	kfree(hdr_info);
away_mem:
	kfree(devdata);
away:
	return rc;
}
@@ -1393,6 +1400,7 @@ remove_bus_instance(struct visorbus_devdata *devdata)
		visorchannel_destroy(devdata->chan);
		devdata->chan = NULL;
	}
	kfree(devdata->vbus_hdr_info);
	list_del(&devdata->list_all);
	device_unregister(&devdata->dev);
}