mei: extract AMTHI functions into the amthif.c file
Move AMT Host Interface functions into the new amthif.c file. All functions has now common prefix: mei_amthif_ Signed-off-by: Tomas Winkler <tomas.winkler@intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
这个提交包含在:
@@ -73,92 +73,6 @@ static void _mei_cmpl(struct mei_cl *cl, struct mei_cl_cb *cb_pos)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* _mei_cmpl_iamthif - processes completed iamthif operation.
|
||||
*
|
||||
* @dev: the device structure.
|
||||
* @cb_pos: callback block.
|
||||
*/
|
||||
static void _mei_cmpl_iamthif(struct mei_device *dev, struct mei_cl_cb *cb_pos)
|
||||
{
|
||||
if (dev->iamthif_canceled != 1) {
|
||||
dev->iamthif_state = MEI_IAMTHIF_READ_COMPLETE;
|
||||
dev->iamthif_stall_timer = 0;
|
||||
memcpy(cb_pos->response_buffer.data,
|
||||
dev->iamthif_msg_buf,
|
||||
dev->iamthif_msg_buf_index);
|
||||
list_add_tail(&cb_pos->list, &dev->amthi_read_complete_list.list);
|
||||
dev_dbg(&dev->pdev->dev, "amthi read completed\n");
|
||||
dev->iamthif_timer = jiffies;
|
||||
dev_dbg(&dev->pdev->dev, "dev->iamthif_timer = %ld\n",
|
||||
dev->iamthif_timer);
|
||||
} else {
|
||||
mei_run_next_iamthif_cmd(dev);
|
||||
}
|
||||
|
||||
dev_dbg(&dev->pdev->dev, "completing amthi call back.\n");
|
||||
wake_up_interruptible(&dev->iamthif_cl.wait);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* mei_irq_thread_read_amthi_message - bottom half read routine after ISR to
|
||||
* handle the read amthi message data processing.
|
||||
*
|
||||
* @complete_list: An instance of our list structure
|
||||
* @dev: the device structure
|
||||
* @mei_hdr: header of amthi message
|
||||
*
|
||||
* returns 0 on success, <0 on failure.
|
||||
*/
|
||||
static int mei_irq_thread_read_amthi_message(struct mei_cl_cb *complete_list,
|
||||
struct mei_device *dev,
|
||||
struct mei_msg_hdr *mei_hdr)
|
||||
{
|
||||
struct mei_cl *cl;
|
||||
struct mei_cl_cb *cb;
|
||||
unsigned char *buffer;
|
||||
|
||||
BUG_ON(mei_hdr->me_addr != dev->iamthif_cl.me_client_id);
|
||||
BUG_ON(dev->iamthif_state != MEI_IAMTHIF_READING);
|
||||
|
||||
buffer = dev->iamthif_msg_buf + dev->iamthif_msg_buf_index;
|
||||
BUG_ON(dev->iamthif_mtu < dev->iamthif_msg_buf_index + mei_hdr->length);
|
||||
|
||||
mei_read_slots(dev, buffer, mei_hdr->length);
|
||||
|
||||
dev->iamthif_msg_buf_index += mei_hdr->length;
|
||||
|
||||
if (!mei_hdr->msg_complete)
|
||||
return 0;
|
||||
|
||||
dev_dbg(&dev->pdev->dev,
|
||||
"amthi_message_buffer_index =%d\n",
|
||||
mei_hdr->length);
|
||||
|
||||
dev_dbg(&dev->pdev->dev, "completed amthi read.\n ");
|
||||
if (!dev->iamthif_current_cb)
|
||||
return -ENODEV;
|
||||
|
||||
cb = dev->iamthif_current_cb;
|
||||
dev->iamthif_current_cb = NULL;
|
||||
|
||||
cl = (struct mei_cl *)cb->file_private;
|
||||
if (!cl)
|
||||
return -ENODEV;
|
||||
|
||||
dev->iamthif_stall_timer = 0;
|
||||
cb->buf_idx = dev->iamthif_msg_buf_index;
|
||||
cb->read_time = jiffies;
|
||||
if (dev->iamthif_ioctl && cl == &dev->iamthif_cl) {
|
||||
/* found the iamthif cb */
|
||||
dev_dbg(&dev->pdev->dev, "complete the amthi read cb.\n ");
|
||||
dev_dbg(&dev->pdev->dev, "add the amthi read cb to complete.\n ");
|
||||
list_add_tail(&cb->list, &complete_list->list);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* _mei_irq_thread_state_ok - checks if mei header matches file private data
|
||||
*
|
||||
@@ -243,37 +157,6 @@ quit:
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* _mei_irq_thread_iamthif_read - prepares to read iamthif data.
|
||||
*
|
||||
* @dev: the device structure.
|
||||
* @slots: free slots.
|
||||
*
|
||||
* returns 0, OK; otherwise, error.
|
||||
*/
|
||||
static int _mei_irq_thread_iamthif_read(struct mei_device *dev, s32 *slots)
|
||||
{
|
||||
|
||||
if (((*slots) * sizeof(u32)) < (sizeof(struct mei_msg_hdr)
|
||||
+ sizeof(struct hbm_flow_control))) {
|
||||
return -EMSGSIZE;
|
||||
}
|
||||
*slots -= mei_data2slots(sizeof(struct hbm_flow_control));
|
||||
if (mei_send_flow_control(dev, &dev->iamthif_cl)) {
|
||||
dev_dbg(&dev->pdev->dev, "iamthif flow control failed\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
dev_dbg(&dev->pdev->dev, "iamthif flow control success\n");
|
||||
dev->iamthif_state = MEI_IAMTHIF_READING;
|
||||
dev->iamthif_flow_control_pending = false;
|
||||
dev->iamthif_msg_buf_index = 0;
|
||||
dev->iamthif_msg_buf_size = 0;
|
||||
dev->iamthif_stall_timer = MEI_IAMTHIF_STALL_TIMER;
|
||||
dev->mei_host_buffer_is_empty = mei_hbuf_is_empty(dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* _mei_irq_thread_close - processes close related operation.
|
||||
*
|
||||
@@ -370,7 +253,7 @@ static void mei_client_connect_response(struct mei_device *dev,
|
||||
mei_watchdog_register(dev);
|
||||
|
||||
/* next step in the state maching */
|
||||
mei_host_init_iamthif(dev);
|
||||
mei_amthif_host_init(dev);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -728,7 +611,7 @@ static void mei_irq_thread_read_bus_message(struct mei_device *dev,
|
||||
* will be received
|
||||
*/
|
||||
if (mei_wd_host_init(dev))
|
||||
mei_host_init_iamthif(dev);
|
||||
mei_amthif_host_init(dev);
|
||||
}
|
||||
|
||||
} else {
|
||||
@@ -963,87 +846,6 @@ static int _mei_irq_thread_cmpl(struct mei_device *dev, s32 *slots,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* _mei_irq_thread_cmpl_iamthif - processes completed iamthif operation.
|
||||
*
|
||||
* @dev: the device structure.
|
||||
* @slots: free slots.
|
||||
* @cb_pos: callback block.
|
||||
* @cl: private data of the file object.
|
||||
* @cmpl_list: complete list.
|
||||
*
|
||||
* returns 0, OK; otherwise, error.
|
||||
*/
|
||||
static int _mei_irq_thread_cmpl_iamthif(struct mei_device *dev, s32 *slots,
|
||||
struct mei_cl_cb *cb_pos,
|
||||
struct mei_cl *cl,
|
||||
struct mei_cl_cb *cmpl_list)
|
||||
{
|
||||
struct mei_msg_hdr *mei_hdr;
|
||||
|
||||
if ((*slots * sizeof(u32)) >= (sizeof(struct mei_msg_hdr) +
|
||||
dev->iamthif_msg_buf_size -
|
||||
dev->iamthif_msg_buf_index)) {
|
||||
mei_hdr = (struct mei_msg_hdr *) &dev->wr_msg_buf[0];
|
||||
mei_hdr->host_addr = cl->host_client_id;
|
||||
mei_hdr->me_addr = cl->me_client_id;
|
||||
mei_hdr->length = dev->iamthif_msg_buf_size -
|
||||
dev->iamthif_msg_buf_index;
|
||||
mei_hdr->msg_complete = 1;
|
||||
mei_hdr->reserved = 0;
|
||||
|
||||
*slots -= mei_data2slots(mei_hdr->length);
|
||||
|
||||
if (mei_write_message(dev, mei_hdr,
|
||||
(dev->iamthif_msg_buf +
|
||||
dev->iamthif_msg_buf_index),
|
||||
mei_hdr->length)) {
|
||||
dev->iamthif_state = MEI_IAMTHIF_IDLE;
|
||||
cl->status = -ENODEV;
|
||||
list_del(&cb_pos->list);
|
||||
return -ENODEV;
|
||||
} else {
|
||||
if (mei_flow_ctrl_reduce(dev, cl))
|
||||
return -ENODEV;
|
||||
dev->iamthif_msg_buf_index += mei_hdr->length;
|
||||
cb_pos->buf_idx = dev->iamthif_msg_buf_index;
|
||||
cl->status = 0;
|
||||
dev->iamthif_state = MEI_IAMTHIF_FLOW_CONTROL;
|
||||
dev->iamthif_flow_control_pending = true;
|
||||
/* save iamthif cb sent to amthi client */
|
||||
dev->iamthif_current_cb = cb_pos;
|
||||
list_move_tail(&cb_pos->list, &dev->write_waiting_list.list);
|
||||
|
||||
}
|
||||
} else if (*slots == dev->hbuf_depth) {
|
||||
/* buffer is still empty */
|
||||
mei_hdr = (struct mei_msg_hdr *) &dev->wr_msg_buf[0];
|
||||
mei_hdr->host_addr = cl->host_client_id;
|
||||
mei_hdr->me_addr = cl->me_client_id;
|
||||
mei_hdr->length =
|
||||
(*slots * sizeof(u32)) - sizeof(struct mei_msg_hdr);
|
||||
mei_hdr->msg_complete = 0;
|
||||
mei_hdr->reserved = 0;
|
||||
|
||||
*slots -= mei_data2slots(mei_hdr->length);
|
||||
|
||||
if (mei_write_message(dev, mei_hdr,
|
||||
(dev->iamthif_msg_buf +
|
||||
dev->iamthif_msg_buf_index),
|
||||
mei_hdr->length)) {
|
||||
cl->status = -ENODEV;
|
||||
list_del(&cb_pos->list);
|
||||
} else {
|
||||
dev->iamthif_msg_buf_index += mei_hdr->length;
|
||||
}
|
||||
return -EMSGSIZE;
|
||||
} else {
|
||||
return -EBADMSG;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* mei_irq_thread_read_handler - bottom half read routine after ISR to
|
||||
* handle the read processing.
|
||||
@@ -1117,8 +919,8 @@ static int mei_irq_thread_read_handler(struct mei_cl_cb *cmpl_list,
|
||||
dev_dbg(&dev->pdev->dev, "call mei_irq_thread_read_iamthif_message.\n");
|
||||
dev_dbg(&dev->pdev->dev, "mei_hdr->length =%d\n",
|
||||
mei_hdr->length);
|
||||
ret = mei_irq_thread_read_amthi_message(cmpl_list,
|
||||
dev, mei_hdr);
|
||||
|
||||
ret = mei_amthif_irq_read_message(cmpl_list, dev, mei_hdr);
|
||||
if (ret)
|
||||
goto end;
|
||||
|
||||
@@ -1195,7 +997,7 @@ static int mei_irq_thread_write_handler(struct mei_cl_cb *cmpl_list,
|
||||
if (cl == &dev->iamthif_cl) {
|
||||
dev_dbg(&dev->pdev->dev, "check iamthif flow control.\n");
|
||||
if (dev->iamthif_flow_control_pending) {
|
||||
ret = _mei_irq_thread_iamthif_read(dev, slots);
|
||||
ret = mei_amthif_irq_read(dev, slots);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
@@ -1300,8 +1102,8 @@ static int mei_irq_thread_write_handler(struct mei_cl_cb *cmpl_list,
|
||||
cl->host_client_id);
|
||||
continue;
|
||||
}
|
||||
ret = _mei_irq_thread_cmpl_iamthif(dev, slots, pos,
|
||||
cl, cmpl_list);
|
||||
ret = mei_amthif_irq_process_completed(dev, slots, pos,
|
||||
cl, cmpl_list);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -1372,7 +1174,7 @@ void mei_timer(struct work_struct *work)
|
||||
dev->iamthif_current_cb = NULL;
|
||||
|
||||
dev->iamthif_file_object = NULL;
|
||||
mei_run_next_iamthif_cmd(dev);
|
||||
mei_amthif_run_next_cmd(dev);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1409,7 +1211,7 @@ void mei_timer(struct work_struct *work)
|
||||
dev->iamthif_file_object->private_data = NULL;
|
||||
dev->iamthif_file_object = NULL;
|
||||
dev->iamthif_timer = 0;
|
||||
mei_run_next_iamthif_cmd(dev);
|
||||
mei_amthif_run_next_cmd(dev);
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1524,7 +1326,7 @@ end:
|
||||
_mei_cmpl(cl, cb_pos);
|
||||
cb_pos = NULL;
|
||||
} else if (cl == &dev->iamthif_cl) {
|
||||
_mei_cmpl_iamthif(dev, cb_pos);
|
||||
mei_amthif_complete(dev, cb_pos);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
在新工单中引用
屏蔽一个用户