Commit 147e9d3a authored by Takashi Sakamoto's avatar Takashi Sakamoto
Browse files

firewire: cdev: code refactoring to operate event of response

This commit is a preparation to handle time stamp of asynchronous
transaction for user space application.

Link: https://lore.kernel.org/r/20230529113406.986289-8-o-takashi@sakamocchi.jp


Signed-off-by: default avatarTakashi Sakamoto <o-takashi@sakamocchi.jp>
parent 39ce342c
Loading
Loading
Loading
Loading
+15 −12
Original line number Diff line number Diff line
@@ -170,7 +170,9 @@ struct outbound_transaction_event {
	struct event event;
	struct client *client;
	struct outbound_transaction_resource r;
	struct fw_cdev_event_response response;
	union {
		struct fw_cdev_event_response without_tstamp;
	} rsp;
};

struct inbound_transaction_event {
@@ -540,7 +542,7 @@ static void complete_transaction(struct fw_card *card, int rcode,
				 void *payload, size_t length, void *data)
{
	struct outbound_transaction_event *e = data;
	struct fw_cdev_event_response *rsp = &e->response;
	struct fw_cdev_event_response *rsp = &e->rsp.without_tstamp;
	struct client *client = e->client;
	unsigned long flags;

@@ -581,6 +583,8 @@ static int init_request(struct client *client,
			int destination_id, int speed)
{
	struct outbound_transaction_event *e;
	struct fw_cdev_event_response *rsp;
	void *payload;
	int ret;

	if (request->tcode != TCODE_STREAM_DATA &&
@@ -594,14 +598,14 @@ static int init_request(struct client *client,
	e = kmalloc(sizeof(*e) + request->length, GFP_KERNEL);
	if (e == NULL)
		return -ENOMEM;

	e->client = client;
	e->response.length = request->length;
	e->response.closure = request->closure;

	if (request->data &&
	    copy_from_user(e->response.data,
			   u64_to_uptr(request->data), request->length)) {
	rsp = &e->rsp.without_tstamp;
	rsp->length = request->length;
	rsp->closure = request->closure;
	payload = rsp->data;

	if (request->data && copy_from_user(payload, u64_to_uptr(request->data), request->length)) {
		ret = -EFAULT;
		goto failed;
	}
@@ -611,10 +615,9 @@ static int init_request(struct client *client,
	if (ret < 0)
		goto failed;

	fw_send_request(client->device->card, &e->r.transaction,
			request->tcode, destination_id, request->generation,
			speed, request->offset, e->response.data,
			request->length, complete_transaction, e);
	fw_send_request(client->device->card, &e->r.transaction, request->tcode, destination_id,
			request->generation, speed, request->offset, payload, request->length,
			complete_transaction, e);
	return 0;

 failed: