mei: use mei_io_cb_ warppers also for control flows
move the mei_io_cb_ wrappers to to iorw.c for global use and use them also for handling control flows Signed-off-by: Tomas Winkler <tomas.winkler@intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
		
							parent
							
								
									601a1efa63
								
							
						
					
					
						commit
						664df38b3c
					
				| @ -668,12 +668,10 @@ int mei_disconnect_host_client(struct mei_device *dev, struct mei_cl *cl) | ||||
| 	if (cl->state != MEI_FILE_DISCONNECTING) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	cb = kzalloc(sizeof(struct mei_cl_cb), GFP_KERNEL); | ||||
| 	cb = mei_io_cb_init(cl, NULL); | ||||
| 	if (!cb) | ||||
| 		return -ENOMEM; | ||||
| 
 | ||||
| 	mei_io_list_init(cb); | ||||
| 	cb->file_private = cl; | ||||
| 	cb->major_file_operations = MEI_CLOSE; | ||||
| 	if (dev->mei_host_buffer_is_empty) { | ||||
| 		dev->mei_host_buffer_is_empty = false; | ||||
|  | ||||
| @ -52,6 +52,80 @@ void mei_io_cb_free(struct mei_cl_cb *cb) | ||||
| 	kfree(cb->response_buffer.data); | ||||
| 	kfree(cb); | ||||
| } | ||||
| /**
 | ||||
|  * mei_io_cb_init - allocate and initialize io callback | ||||
|  * | ||||
|  * @cl - mei client | ||||
|  * @file: pointer to file structure | ||||
|  * | ||||
|  * returns mei_cl_cb pointer or NULL; | ||||
|  */ | ||||
| struct mei_cl_cb *mei_io_cb_init(struct mei_cl *cl, struct file *fp) | ||||
| { | ||||
| 	struct mei_cl_cb *cb; | ||||
| 
 | ||||
| 	cb = kzalloc(sizeof(struct mei_cl_cb), GFP_KERNEL); | ||||
| 	if (!cb) | ||||
| 		return NULL; | ||||
| 
 | ||||
| 	mei_io_list_init(cb); | ||||
| 
 | ||||
| 	cb->file_object = fp; | ||||
| 	cb->file_private = cl; | ||||
| 	cb->buf_idx = 0; | ||||
| 	return cb; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|  * mei_io_cb_alloc_req_buf - allocate request buffer | ||||
|  * | ||||
|  * @cb -  io callback structure | ||||
|  * @size: size of the buffer | ||||
|  * | ||||
|  * returns 0 on success | ||||
|  *         -EINVAL if cb is NULL | ||||
|  *         -ENOMEM if allocation failed | ||||
|  */ | ||||
| int mei_io_cb_alloc_req_buf(struct mei_cl_cb *cb, size_t length) | ||||
| { | ||||
| 	if (!cb) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	if (length == 0) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	cb->request_buffer.data = kmalloc(length, GFP_KERNEL); | ||||
| 	if (!cb->request_buffer.data) | ||||
| 		return -ENOMEM; | ||||
| 	cb->request_buffer.size = length; | ||||
| 	return 0; | ||||
| } | ||||
| /**
 | ||||
|  * mei_io_cb_alloc_req_buf - allocate respose buffer | ||||
|  * | ||||
|  * @cb -  io callback structure | ||||
|  * @size: size of the buffer | ||||
|  * | ||||
|  * returns 0 on success | ||||
|  *         -EINVAL if cb is NULL | ||||
|  *         -ENOMEM if allocation failed | ||||
|  */ | ||||
| int mei_io_cb_alloc_resp_buf(struct mei_cl_cb *cb, size_t length) | ||||
| { | ||||
| 	if (!cb) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	if (length == 0) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	cb->response_buffer.data = kmalloc(length, GFP_KERNEL); | ||||
| 	if (!cb->response_buffer.data) | ||||
| 		return -ENOMEM; | ||||
| 	cb->response_buffer.size = length; | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|  * mei_me_cl_by_id return index to me_clients for client_id | ||||
| @ -112,14 +186,12 @@ int mei_ioctl_connect_client(struct file *file, | ||||
| 
 | ||||
| 	dev_dbg(&dev->pdev->dev, "mei_ioctl_connect_client() Entry\n"); | ||||
| 
 | ||||
| 
 | ||||
| 	/* buffered ioctl cb */ | ||||
| 	cb = kzalloc(sizeof(struct mei_cl_cb), GFP_KERNEL); | ||||
| 	cb = mei_io_cb_init(cl, file); | ||||
| 	if (!cb) { | ||||
| 		rets = -ENOMEM; | ||||
| 		goto end; | ||||
| 	} | ||||
| 	mei_io_list_init(cb); | ||||
| 
 | ||||
| 	cb->major_file_operations = MEI_IOCTL; | ||||
| 
 | ||||
| @ -207,14 +279,12 @@ int mei_ioctl_connect_client(struct file *file, | ||||
| 		} else { | ||||
| 			dev_dbg(&dev->pdev->dev, "Sending connect message - succeeded\n"); | ||||
| 			cl->timer_count = MEI_CONNECT_TIMEOUT; | ||||
| 			cb->file_private = cl; | ||||
| 			list_add_tail(&cb->list, &dev->ctrl_rd_list.list); | ||||
| 		} | ||||
| 
 | ||||
| 
 | ||||
| 	} else { | ||||
| 		dev_dbg(&dev->pdev->dev, "Queuing the connect request due to device busy\n"); | ||||
| 		cb->file_private = cl; | ||||
| 		dev_dbg(&dev->pdev->dev, "add connect cb to control write list.\n"); | ||||
| 		list_add_tail(&cb->list, &dev->ctrl_wr_list.list); | ||||
| 	} | ||||
| @ -407,7 +477,7 @@ out: | ||||
| int mei_start_read(struct mei_device *dev, struct mei_cl *cl) | ||||
| { | ||||
| 	struct mei_cl_cb *cb; | ||||
| 	int rets = 0; | ||||
| 	int rets; | ||||
| 	int i; | ||||
| 
 | ||||
| 	if (cl->state != MEI_FILE_CONNECTED) | ||||
| @ -416,49 +486,40 @@ int mei_start_read(struct mei_device *dev, struct mei_cl *cl) | ||||
| 	if (dev->dev_state != MEI_DEV_ENABLED) | ||||
| 		return -ENODEV; | ||||
| 
 | ||||
| 	dev_dbg(&dev->pdev->dev, "check if read is pending.\n"); | ||||
| 	if (cl->read_pending || cl->read_cb) { | ||||
| 		dev_dbg(&dev->pdev->dev, "read is pending.\n"); | ||||
| 		return -EBUSY; | ||||
| 	} | ||||
| 	i = mei_me_cl_by_id(dev, cl->me_client_id); | ||||
| 	if (i < 0) { | ||||
| 		dev_err(&dev->pdev->dev, "no such me client %d\n", | ||||
| 			cl->me_client_id); | ||||
| 		return  -ENODEV; | ||||
| 	} | ||||
| 
 | ||||
| 	cb = kzalloc(sizeof(struct mei_cl_cb), GFP_KERNEL); | ||||
| 	cb = mei_io_cb_init(cl, NULL); | ||||
| 	if (!cb) | ||||
| 		return -ENOMEM; | ||||
| 
 | ||||
| 	dev_dbg(&dev->pdev->dev, "allocation call back successful. host client = %d, ME client = %d\n", | ||||
| 		cl->host_client_id, cl->me_client_id); | ||||
| 	i = mei_me_cl_by_id(dev, cl->me_client_id); | ||||
| 	if (i < 0) { | ||||
| 		rets = -ENODEV; | ||||
| 		goto unlock; | ||||
| 	} | ||||
| 	rets = mei_io_cb_alloc_resp_buf(cb, | ||||
| 			dev->me_clients[i].props.max_msg_length); | ||||
| 	if (rets) | ||||
| 		goto err; | ||||
| 
 | ||||
| 	cb->response_buffer.size = dev->me_clients[i].props.max_msg_length; | ||||
| 	cb->response_buffer.data = | ||||
| 			kmalloc(cb->response_buffer.size, GFP_KERNEL); | ||||
| 	if (!cb->response_buffer.data) { | ||||
| 		rets = -ENOMEM; | ||||
| 		goto unlock; | ||||
| 	} | ||||
| 	dev_dbg(&dev->pdev->dev, "allocation call back data success.\n"); | ||||
| 	cb->major_file_operations = MEI_READ; | ||||
| 	/* make sure buffer index is zero before we start */ | ||||
| 	cb->buf_idx = 0; | ||||
| 	cb->file_private = (void *) cl; | ||||
| 	cl->read_cb = cb; | ||||
| 	if (dev->mei_host_buffer_is_empty) { | ||||
| 		dev->mei_host_buffer_is_empty = false; | ||||
| 		if (mei_send_flow_control(dev, cl)) { | ||||
| 			rets = -ENODEV; | ||||
| 			goto unlock; | ||||
| 			goto err; | ||||
| 		} | ||||
| 		list_add_tail(&cb->list, &dev->read_list.list); | ||||
| 	} else { | ||||
| 		list_add_tail(&cb->list, &dev->ctrl_wr_list.list); | ||||
| 	} | ||||
| 	return rets; | ||||
| unlock: | ||||
| err: | ||||
| 	mei_io_cb_free(cb); | ||||
| 	return rets; | ||||
| } | ||||
|  | ||||
| @ -513,84 +513,6 @@ out: | ||||
| 	mutex_unlock(&dev->device_lock); | ||||
| 	return rets; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * mei_io_cb_init - allocate and initialize io callback | ||||
|  * | ||||
|  * @cl - mei client | ||||
|  * @file: pointer to file structure | ||||
|  * | ||||
|  * returns mei_cl_cb pointer or NULL; | ||||
|  */ | ||||
| static struct mei_cl_cb *mei_io_cb_init(struct mei_cl *cl, struct file *fp) | ||||
| { | ||||
| 	struct mei_cl_cb *cb; | ||||
| 	struct mei_device *dev; | ||||
| 
 | ||||
| 	dev = cl->dev; | ||||
| 
 | ||||
| 	cb = kzalloc(sizeof(struct mei_cl_cb), GFP_KERNEL); | ||||
| 	if (!cb) | ||||
| 		return NULL; | ||||
| 
 | ||||
| 	mei_io_list_init(cb); | ||||
| 
 | ||||
| 	cb->file_object = fp; | ||||
| 	cb->file_private = cl; | ||||
| 	cb->buf_idx = 0; | ||||
| 	return cb; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|  * mei_io_cb_alloc_req_buf - allocate request buffer | ||||
|  * | ||||
|  * @cb -  io callback structure | ||||
|  * @size: size of the buffer | ||||
|  * | ||||
|  * returns 0 on success | ||||
|  *         -EINVAL if cb is NULL | ||||
|  *         -ENOMEM if allocation failed | ||||
|  */ | ||||
| static int mei_io_cb_alloc_req_buf(struct mei_cl_cb *cb, size_t length) | ||||
| { | ||||
| 	if (!cb) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	if (length == 0) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	cb->request_buffer.data = kmalloc(length, GFP_KERNEL); | ||||
| 	if (!cb->request_buffer.data) | ||||
| 		return -ENOMEM; | ||||
| 	cb->request_buffer.size = length; | ||||
| 	return 0; | ||||
| } | ||||
| /**
 | ||||
|  * mei_io_cb_alloc_req_buf - allocate respose buffer | ||||
|  * | ||||
|  * @cb -  io callback structure | ||||
|  * @size: size of the buffer | ||||
|  * | ||||
|  * returns 0 on success | ||||
|  *         -EINVAL if cb is NULL | ||||
|  *         -ENOMEM if allocation failed | ||||
|  */ | ||||
| static int mei_io_cb_alloc_resp_buf(struct mei_cl_cb *cb, size_t length) | ||||
| { | ||||
| 	if (!cb) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	if (length == 0) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	cb->response_buffer.data = kmalloc(length, GFP_KERNEL); | ||||
| 	if (!cb->response_buffer.data) | ||||
| 		return -ENOMEM; | ||||
| 	cb->response_buffer.size = length; | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * mei_write - the write function. | ||||
|  * | ||||
|  | ||||
| @ -293,7 +293,11 @@ int mei_me_cl_by_id(struct mei_device *dev, u8 client_id); | ||||
| /*
 | ||||
|  * MEI IO Functions | ||||
|  */ | ||||
| struct mei_cl_cb *mei_io_cb_init(struct mei_cl *cl, struct file *fp); | ||||
| void mei_io_cb_free(struct mei_cl_cb *priv_cb); | ||||
| int mei_io_cb_alloc_req_buf(struct mei_cl_cb *cb, size_t length); | ||||
| int mei_io_cb_alloc_resp_buf(struct mei_cl_cb *cb, size_t length); | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|  * mei_io_list_init - Sets up a queue list. | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user