From: Don Zickus <dzic...@redhat.com>

This is the next stage of conversion, the command responders to
struct visor_device.

Most of this is mechanical and straightforward. I will point out some
quirks that I ran into and what I did:

- bus_responder
  - bus_info_clear is no longer used as I am now expecting the core
    infrastructure to cleanup correctly, so this code simplified more
    than expected.  I am not sure the cleanup happens and perhaps a
    couple of put_devices might be needed, but in theory some release
    functions should be called to cleanup.
- dev_responder
  - same as the bus_responder but with dev_info_clear.

Both of the above quirks should be verified that things still work
correctly.

Signed-off-by: Don Zickus <dzic...@redhat.com>
Signed-off-by: Benjamin Romer <benjamin.ro...@unisys.com>
---
 drivers/staging/unisys/visorbus/visorbus_main.c    | 10 +--
 drivers/staging/unisys/visorbus/visorbus_private.h | 12 ++--
 drivers/staging/unisys/visorbus/visorchipset.c     | 84 +++++++---------------
 3 files changed, 34 insertions(+), 72 deletions(-)

diff --git a/drivers/staging/unisys/visorbus/visorbus_main.c 
b/drivers/staging/unisys/visorbus/visorbus_main.c
index a3062ea..1a46788 100644
--- a/drivers/staging/unisys/visorbus/visorbus_main.c
+++ b/drivers/staging/unisys/visorbus/visorbus_main.c
@@ -841,9 +841,7 @@ away:
        if (!dev->responded_to_device_create) {
                dev->responded_to_device_create = true;
                if (chipset_responders.device_create)
-                       (*chipset_responders.device_create)(dev->chipset_bus_no,
-                                                           dev->chipset_dev_no,
-                                                           rc);
+                       (*chipset_responders.device_create)(dev, rc);
        }
        return rc;
 }
@@ -1479,8 +1477,7 @@ pause_state_change_complete(struct visor_device *dev, int 
status)
        /* Notify the chipset driver that the pause is complete, which
        * will presumably want to send some sort of response to the
        * initiator. */
-       (*chipset_responders.device_pause) (dev->chipset_bus_no,
-                                           dev->chipset_dev_no, status);
+       (*chipset_responders.device_pause) (dev, status);
 }
 
 /* This is the callback function specified for a function driver, to
@@ -1500,8 +1497,7 @@ resume_state_change_complete(struct visor_device *dev, 
int status)
        /* Notify the chipset driver that the resume is complete,
         * which will presumably want to send some sort of response to
         * the initiator. */
-       (*chipset_responders.device_resume) (dev->chipset_bus_no,
-                                            dev->chipset_dev_no, status);
+       (*chipset_responders.device_resume) (dev, status);
 }
 
 /* Tell the subordinate function driver for a specific device to pause
diff --git a/drivers/staging/unisys/visorbus/visorbus_private.h 
b/drivers/staging/unisys/visorbus/visorbus_private.h
index 9b84a1d..5b3c0cd 100644
--- a/drivers/staging/unisys/visorbus/visorbus_private.h
+++ b/drivers/staging/unisys/visorbus/visorbus_private.h
@@ -119,12 +119,12 @@ struct visorchipset_busdev_notifiers {
  *      -1 = it failed
  */
 struct visorchipset_busdev_responders {
-       void (*bus_create)(u32 bus_no, int response);
-       void (*bus_destroy)(u32 bus_no, int response);
-       void (*device_create)(u32 bus_no, u32 dev_no, int response);
-       void (*device_destroy)(u32 bus_no, u32 dev_no, int response);
-       void (*device_pause)(u32 bus_no, u32 dev_no, int response);
-       void (*device_resume)(u32 bus_no, u32 dev_no, int response);
+       void (*bus_create)(struct visor_device *p, int response);
+       void (*bus_destroy)(struct visor_device *p, int response);
+       void (*device_create)(struct visor_device *p, int response);
+       void (*device_destroy)(struct visor_device *p, int response);
+       void (*device_pause)(struct visor_device *p, int response);
+       void (*device_resume)(struct visor_device *p, int response);
 };
 
 /** Register functions (in the bus driver) to get called by visorchipset
diff --git a/drivers/staging/unisys/visorbus/visorchipset.c 
b/drivers/staging/unisys/visorbus/visorchipset.c
index 51d708f..84b47a1 100644
--- a/drivers/staging/unisys/visorbus/visorchipset.c
+++ b/drivers/staging/unisys/visorbus/visorchipset.c
@@ -228,13 +228,13 @@ static void parahotplug_process_list(void);
  */
 static struct visorchipset_busdev_notifiers busdev_notifiers;
 
-static void bus_create_response(u32 bus_no, int response);
-static void bus_destroy_response(u32 bus_no, int response);
-static void device_create_response(u32 bus_no, u32 dev_no, int response);
-static void device_destroy_response(u32 bus_no, u32 dev_no, int response);
-static void device_resume_response(u32 bus_no, u32 dev_no, int response);
+static void bus_create_response(struct visor_device *dev, int response);
+static void bus_destroy_response(struct visor_device *dev, int response);
+static void device_create_response(struct visor_device *dev, int response);
+static void device_destroy_response(struct visor_device *dev, int response);
+static void device_resume_response(struct visor_device *dev, int response);
 
-static void visorchipset_device_pause_response(u32 bus_no, u32 dev_no,
+static void visorchipset_device_pause_response(struct visor_device *dev,
                                               int response);
 
 static struct visorchipset_busdev_responders busdev_responders = {
@@ -958,26 +958,10 @@ enum crash_obj_type {
 };
 
 static void
-bus_responder(enum controlvm_id cmd_id, u32 bus_no, int response)
+bus_responder(enum controlvm_id cmd_id, struct visor_device *p, int response)
 {
-       struct visorchipset_bus_info *p;
-       bool need_clear = false;
-
-       p = bus_find(&bus_info_list, bus_no);
-       if (!p)
-               return;
-
-       if (response < 0) {
-               if ((cmd_id == CONTROLVM_BUS_CREATE) &&
-                   (response != (-CONTROLVM_RESP_ERROR_ALREADY_DONE)))
-                       /* undo the row we just created... */
-                       busdevices_del(&dev_info_list, bus_no);
-       } else {
-               if (cmd_id == CONTROLVM_BUS_CREATE)
+       if (cmd_id == CONTROLVM_BUS_CREATE)
                        p->state.created = 1;
-               if (cmd_id == CONTROLVM_BUS_DESTROY)
-                       need_clear = true;
-       }
 
        if (p->pending_msg_hdr.id == CONTROLVM_INVALID)
                return;         /* no controlvm response needed */
@@ -985,23 +969,15 @@ bus_responder(enum controlvm_id cmd_id, u32 bus_no, int 
response)
                return;
        controlvm_respond(&p->pending_msg_hdr, response);
        p->pending_msg_hdr.id = CONTROLVM_INVALID;
-       if (need_clear) {
-               bus_info_clear(p);
-               busdevices_del(&dev_info_list, bus_no);
-       }
 }
 
 static void
 device_changestate_responder(enum controlvm_id cmd_id,
-                            u32 bus_no, u32 dev_no, int response,
+                            struct visor_device *p, int response,
                             struct spar_segment_state response_state)
 {
-       struct visorchipset_device_info *p;
        struct controlvm_message outmsg;
 
-       p = device_find(&dev_info_list, bus_no, dev_no);
-       if (!p)
-               return;
        if (p->pending_msg_hdr.id == CONTROLVM_INVALID)
                return;         /* no controlvm response needed */
        if (p->pending_msg_hdr.id != cmd_id)
@@ -1009,8 +985,8 @@ device_changestate_responder(enum controlvm_id cmd_id,
 
        controlvm_init_response(&outmsg, &p->pending_msg_hdr, response);
 
-       outmsg.cmd.device_change_state.bus_no = bus_no;
-       outmsg.cmd.device_change_state.dev_no = dev_no;
+       outmsg.cmd.device_change_state.bus_no = p->chipset_bus_no;
+       outmsg.cmd.device_change_state.dev_no = p->chipset_dev_no;
        outmsg.cmd.device_change_state.state = response_state;
 
        if (!visorchannel_signalinsert(controlvm_channel,
@@ -1021,19 +997,11 @@ device_changestate_responder(enum controlvm_id cmd_id,
 }
 
 static void
-device_responder(enum controlvm_id cmd_id, u32 bus_no, u32 dev_no, int 
response)
+device_responder(enum controlvm_id cmd_id, struct visor_device *p, int 
response)
 {
-       struct visorchipset_device_info *p;
-       bool need_clear = false;
-
-       p = device_find(&dev_info_list, bus_no, dev_no);
-       if (!p)
-               return;
        if (response >= 0) {
                if (cmd_id == CONTROLVM_DEVICE_CREATE)
                        p->state.created = 1;
-               if (cmd_id == CONTROLVM_DEVICE_DESTROY)
-                       need_clear = true;
        }
 
        if (p->pending_msg_hdr.id == CONTROLVM_INVALID)
@@ -1044,8 +1012,6 @@ device_responder(enum controlvm_id cmd_id, u32 bus_no, 
u32 dev_no, int response)
 
        controlvm_respond(&p->pending_msg_hdr, response);
        p->pending_msg_hdr.id = CONTROLVM_INVALID;
-       if (need_clear)
-               dev_info_clear(p);
 }
 
 static void
@@ -1176,7 +1142,7 @@ device_epilog(struct visor_device *dev_info, struct 
spar_segment_state state,
                 */
                ;
        else
-               device_responder(cmd, bus_no, dev_no, response);
+               device_responder(cmd, dev_info, response);
        up(&notifier_lock);
 }
 
@@ -2107,42 +2073,42 @@ cleanup:
 }
 
 static void
-bus_create_response(u32 bus_no, int response)
+bus_create_response(struct visor_device *dev, int response)
 {
-       bus_responder(CONTROLVM_BUS_CREATE, bus_no, response);
+       bus_responder(CONTROLVM_BUS_CREATE, dev, response);
 }
 
 static void
-bus_destroy_response(u32 bus_no, int response)
+bus_destroy_response(struct visor_device *dev, int response)
 {
-       bus_responder(CONTROLVM_BUS_DESTROY, bus_no, response);
+       bus_responder(CONTROLVM_BUS_DESTROY, dev, response);
 }
 
 static void
-device_create_response(u32 bus_no, u32 dev_no, int response)
+device_create_response(struct visor_device *dev, int response)
 {
-       device_responder(CONTROLVM_DEVICE_CREATE, bus_no, dev_no, response);
+       device_responder(CONTROLVM_DEVICE_CREATE, dev, response);
 }
 
 static void
-device_destroy_response(u32 bus_no, u32 dev_no, int response)
+device_destroy_response(struct visor_device *dev, int response)
 {
-       device_responder(CONTROLVM_DEVICE_DESTROY, bus_no, dev_no, response);
+       device_responder(CONTROLVM_DEVICE_DESTROY, dev, response);
 }
 
 static void
-visorchipset_device_pause_response(u32 bus_no, u32 dev_no, int response)
+visorchipset_device_pause_response(struct visor_device *dev, int response)
 {
        device_changestate_responder(CONTROLVM_DEVICE_CHANGESTATE,
-                                    bus_no, dev_no, response,
+                                    dev, response,
                                     segment_state_standby);
 }
 
 static void
-device_resume_response(u32 bus_no, u32 dev_no, int response)
+device_resume_response(struct visor_device *dev, int response)
 {
        device_changestate_responder(CONTROLVM_DEVICE_CHANGESTATE,
-                                    bus_no, dev_no, response,
+                                    dev, response,
                                     segment_state_running);
 }
 
-- 
2.1.4

_______________________________________________
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

Reply via email to