From: Don Zickus <[email protected]>
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 <[email protected]>
Signed-off-by: Benjamin Romer <[email protected]>
---
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(¬ifier_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
[email protected]
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel