staging: unisys: Prepare vbus_hdr_info to be public
authorDon Zickus <dzickus@redhat.com>
Mon, 1 Jun 2015 17:00:28 +0000 (13:00 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 2 Jun 2015 05:22:49 +0000 (14:22 +0900)
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: Don Zickus <dzickus@redhat.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/unisys/visorbus/visorbus_main.c

index fccf4df..c7db681 100644 (file)
@@ -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,26 +1352,19 @@ 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,
-                                       &clientbus_driverinfo);
+               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);
                }
        }
        bus_count++;
@@ -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);
 }