Skip to content

Commit

Permalink
mei: replace callback structures used as list head by list_head
Browse files Browse the repository at this point in the history
mei_dev structure used struct mei_cl_cb type variables as for holding
callbacks list heads.  Replace them by the actual struct list_head
as there is no other info that is handled. This slims down
the mei_dev structure and mostly streamline the code.

Signed-off-by: Alexander Usyskin <alexander.usyskin@intel.com>
Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Alexander Usyskin authored and Greg Kroah-Hartman committed Jan 31, 2017
1 parent 9ecdbc5 commit 962ff7b
Show file tree
Hide file tree
Showing 9 changed files with 85 additions and 98 deletions.
11 changes: 5 additions & 6 deletions drivers/misc/mei/amthif.c
Original file line number Diff line number Diff line change
Expand Up @@ -132,8 +132,7 @@ int mei_amthif_run_next_cmd(struct mei_device *dev)

dev_dbg(dev->dev, "complete amthif cmd_list cb.\n");

cb = list_first_entry_or_null(&dev->amthif_cmd_list.list,
typeof(*cb), list);
cb = list_first_entry_or_null(&dev->amthif_cmd_list, typeof(*cb), list);
if (!cb) {
dev->iamthif_state = MEI_IAMTHIF_IDLE;
cl->fp = NULL;
Expand Down Expand Up @@ -167,7 +166,7 @@ int mei_amthif_write(struct mei_cl *cl, struct mei_cl_cb *cb)

struct mei_device *dev = cl->dev;

list_add_tail(&cb->list, &dev->amthif_cmd_list.list);
list_add_tail(&cb->list, &dev->amthif_cmd_list);

/*
* The previous request is still in processing, queue this one.
Expand Down Expand Up @@ -211,7 +210,7 @@ unsigned int mei_amthif_poll(struct file *file, poll_table *wait)
* Return: 0, OK; otherwise, error.
*/
int mei_amthif_irq_write(struct mei_cl *cl, struct mei_cl_cb *cb,
struct mei_cl_cb *cmpl_list)
struct list_head *cmpl_list)
{
int ret;

Expand All @@ -237,7 +236,7 @@ int mei_amthif_irq_write(struct mei_cl *cl, struct mei_cl_cb *cb,
*/
int mei_amthif_irq_read_msg(struct mei_cl *cl,
struct mei_msg_hdr *mei_hdr,
struct mei_cl_cb *cmpl_list)
struct list_head *cmpl_list)
{
struct mei_device *dev;
int ret;
Expand Down Expand Up @@ -354,7 +353,7 @@ int mei_amthif_release(struct mei_device *dev, struct file *file)
}

/* Don't clean ctrl_rd_list here, the reads has to be completed */
mei_clear_list(file, &dev->amthif_cmd_list.list);
mei_clear_list(file, &dev->amthif_cmd_list);
mei_clear_list(file, &cl->rd_completed);

return 0;
Expand Down
52 changes: 26 additions & 26 deletions drivers/misc/mei/client.c
Original file line number Diff line number Diff line change
Expand Up @@ -379,17 +379,17 @@ static struct mei_cl_cb *mei_io_cb_init(struct mei_cl *cl,
/**
* __mei_io_list_flush - removes and frees cbs belonging to cl.
*
* @list: an instance of our list structure
* @head: an instance of our list structure
* @cl: host client, can be NULL for flushing the whole list
* @free: whether to free the cbs
*/
static void __mei_io_list_flush(struct mei_cl_cb *list,
static void __mei_io_list_flush(struct list_head *head,
struct mei_cl *cl, bool free)
{
struct mei_cl_cb *cb, *next;

/* enable removing everything if no cl is specified */
list_for_each_entry_safe(cb, next, &list->list, list) {
list_for_each_entry_safe(cb, next, head, list) {
if (!cl || mei_cl_cmp_id(cl, cb->cl)) {
list_del_init(&cb->list);
if (free)
Expand All @@ -401,23 +401,23 @@ static void __mei_io_list_flush(struct mei_cl_cb *list,
/**
* mei_io_list_flush - removes list entry belonging to cl.
*
* @list: An instance of our list structure
* @head: An instance of our list structure
* @cl: host client
*/
static inline void mei_io_list_flush(struct mei_cl_cb *list, struct mei_cl *cl)
static inline void mei_io_list_flush(struct list_head *head, struct mei_cl *cl)
{
__mei_io_list_flush(list, cl, false);
__mei_io_list_flush(head, cl, false);
}

/**
* mei_io_list_free - removes cb belonging to cl and free them
*
* @list: An instance of our list structure
* @head: An instance of our list structure
* @cl: host client
*/
static inline void mei_io_list_free(struct mei_cl_cb *list, struct mei_cl *cl)
static inline void mei_io_list_free(struct list_head *head, struct mei_cl *cl)
{
__mei_io_list_flush(list, cl, true);
__mei_io_list_flush(head, cl, true);
}

/**
Expand Down Expand Up @@ -479,7 +479,7 @@ struct mei_cl_cb *mei_cl_enqueue_ctrl_wr_cb(struct mei_cl *cl, size_t length,
if (!cb)
return NULL;

list_add_tail(&cb->list, &cl->dev->ctrl_wr_list.list);
list_add_tail(&cb->list, &cl->dev->ctrl_wr_list);
return cb;
}

Expand Down Expand Up @@ -831,7 +831,7 @@ static int mei_cl_send_disconnect(struct mei_cl *cl, struct mei_cl_cb *cb)
return ret;
}

list_move_tail(&cb->list, &dev->ctrl_rd_list.list);
list_move_tail(&cb->list, &dev->ctrl_rd_list);
cl->timer_count = MEI_CONNECT_TIMEOUT;
mei_schedule_stall_timer(dev);

Expand All @@ -849,7 +849,7 @@ static int mei_cl_send_disconnect(struct mei_cl *cl, struct mei_cl_cb *cb)
* Return: 0, OK; otherwise, error.
*/
int mei_cl_irq_disconnect(struct mei_cl *cl, struct mei_cl_cb *cb,
struct mei_cl_cb *cmpl_list)
struct list_head *cmpl_list)
{
struct mei_device *dev = cl->dev;
u32 msg_slots;
Expand All @@ -864,7 +864,7 @@ int mei_cl_irq_disconnect(struct mei_cl *cl, struct mei_cl_cb *cb,

ret = mei_cl_send_disconnect(cl, cb);
if (ret)
list_move_tail(&cb->list, &cmpl_list->list);
list_move_tail(&cb->list, cmpl_list);

return ret;
}
Expand Down Expand Up @@ -986,7 +986,7 @@ static bool mei_cl_is_other_connecting(struct mei_cl *cl)

dev = cl->dev;

list_for_each_entry(cb, &dev->ctrl_rd_list.list, list) {
list_for_each_entry(cb, &dev->ctrl_rd_list, list) {
if (cb->fop_type == MEI_FOP_CONNECT &&
mei_cl_me_id(cl) == mei_cl_me_id(cb->cl))
return true;
Expand Down Expand Up @@ -1017,7 +1017,7 @@ static int mei_cl_send_connect(struct mei_cl *cl, struct mei_cl_cb *cb)
return ret;
}

list_move_tail(&cb->list, &dev->ctrl_rd_list.list);
list_move_tail(&cb->list, &dev->ctrl_rd_list);
cl->timer_count = MEI_CONNECT_TIMEOUT;
mei_schedule_stall_timer(dev);
return 0;
Expand All @@ -1033,7 +1033,7 @@ static int mei_cl_send_connect(struct mei_cl *cl, struct mei_cl_cb *cb)
* Return: 0, OK; otherwise, error.
*/
int mei_cl_irq_connect(struct mei_cl *cl, struct mei_cl_cb *cb,
struct mei_cl_cb *cmpl_list)
struct list_head *cmpl_list)
{
struct mei_device *dev = cl->dev;
u32 msg_slots;
Expand All @@ -1051,7 +1051,7 @@ int mei_cl_irq_connect(struct mei_cl *cl, struct mei_cl_cb *cb,

rets = mei_cl_send_connect(cl, cb);
if (rets)
list_move_tail(&cb->list, &cmpl_list->list);
list_move_tail(&cb->list, cmpl_list);

return rets;
}
Expand Down Expand Up @@ -1276,7 +1276,7 @@ enum mei_cb_file_ops mei_cl_notify_req2fop(u8 req)
* Return: 0 on such and error otherwise.
*/
int mei_cl_irq_notify(struct mei_cl *cl, struct mei_cl_cb *cb,
struct mei_cl_cb *cmpl_list)
struct list_head *cmpl_list)
{
struct mei_device *dev = cl->dev;
u32 msg_slots;
Expand All @@ -1294,11 +1294,11 @@ int mei_cl_irq_notify(struct mei_cl *cl, struct mei_cl_cb *cb,
ret = mei_hbm_cl_notify_req(dev, cl, request);
if (ret) {
cl->status = ret;
list_move_tail(&cb->list, &cmpl_list->list);
list_move_tail(&cb->list, cmpl_list);
return ret;
}

list_move_tail(&cb->list, &dev->ctrl_rd_list.list);
list_move_tail(&cb->list, &dev->ctrl_rd_list);
return 0;
}

Expand Down Expand Up @@ -1353,7 +1353,7 @@ int mei_cl_notify_request(struct mei_cl *cl,
rets = -ENODEV;
goto out;
}
list_move_tail(&cb->list, &dev->ctrl_rd_list.list);
list_move_tail(&cb->list, &dev->ctrl_rd_list);
}

mutex_unlock(&dev->device_lock);
Expand Down Expand Up @@ -1533,7 +1533,7 @@ int mei_cl_read_start(struct mei_cl *cl, size_t length, const struct file *fp)
* Return: 0, OK; otherwise error.
*/
int mei_cl_irq_write(struct mei_cl *cl, struct mei_cl_cb *cb,
struct mei_cl_cb *cmpl_list)
struct list_head *cmpl_list)
{
struct mei_device *dev;
struct mei_msg_data *buf;
Expand Down Expand Up @@ -1605,13 +1605,13 @@ int mei_cl_irq_write(struct mei_cl *cl, struct mei_cl_cb *cb,
}

if (mei_hdr.msg_complete)
list_move_tail(&cb->list, &dev->write_waiting_list.list);
list_move_tail(&cb->list, &dev->write_waiting_list);

return 0;

err:
cl->status = rets;
list_move_tail(&cb->list, &cmpl_list->list);
list_move_tail(&cb->list, cmpl_list);
return rets;
}

Expand Down Expand Up @@ -1701,9 +1701,9 @@ int mei_cl_write(struct mei_cl *cl, struct mei_cl_cb *cb)

out:
if (mei_hdr.msg_complete)
list_add_tail(&cb->list, &dev->write_waiting_list.list);
list_add_tail(&cb->list, &dev->write_waiting_list);
else
list_add_tail(&cb->list, &dev->write_list.list);
list_add_tail(&cb->list, &dev->write_list);

cb = NULL;
if (blocking && cl->writing_state != MEI_WRITE_COMPLETE) {
Expand Down
20 changes: 5 additions & 15 deletions drivers/misc/mei/client.h
Original file line number Diff line number Diff line change
Expand Up @@ -84,16 +84,6 @@ static inline u8 mei_me_cl_ver(const struct mei_me_client *me_cl)
*/
void mei_io_cb_free(struct mei_cl_cb *priv_cb);

/**
* mei_io_list_init - Sets up a queue list.
*
* @list: An instance cl callback structure
*/
static inline void mei_io_list_init(struct mei_cl_cb *list)
{
INIT_LIST_HEAD(&list->list);
}

/*
* MEI Host Client Functions
*/
Expand Down Expand Up @@ -209,17 +199,17 @@ static inline u8 mei_cl_host_addr(const struct mei_cl *cl)

int mei_cl_disconnect(struct mei_cl *cl);
int mei_cl_irq_disconnect(struct mei_cl *cl, struct mei_cl_cb *cb,
struct mei_cl_cb *cmpl_list);
struct list_head *cmpl_list);
int mei_cl_connect(struct mei_cl *cl, struct mei_me_client *me_cl,
const struct file *file);
int mei_cl_irq_connect(struct mei_cl *cl, struct mei_cl_cb *cb,
struct mei_cl_cb *cmpl_list);
struct list_head *cmpl_list);
int mei_cl_read_start(struct mei_cl *cl, size_t length, const struct file *fp);
int mei_cl_irq_read_msg(struct mei_cl *cl, struct mei_msg_hdr *hdr,
struct mei_cl_cb *cmpl_list);
struct list_head *cmpl_list);
int mei_cl_write(struct mei_cl *cl, struct mei_cl_cb *cb);
int mei_cl_irq_write(struct mei_cl *cl, struct mei_cl_cb *cb,
struct mei_cl_cb *cmpl_list);
struct list_head *cmpl_list);

void mei_cl_complete(struct mei_cl *cl, struct mei_cl_cb *cb);

Expand All @@ -230,7 +220,7 @@ enum mei_cb_file_ops mei_cl_notify_req2fop(u8 request);
int mei_cl_notify_request(struct mei_cl *cl,
const struct file *file, u8 request);
int mei_cl_irq_notify(struct mei_cl *cl, struct mei_cl_cb *cb,
struct mei_cl_cb *cmpl_list);
struct list_head *cmpl_list);
int mei_cl_notify_get(struct mei_cl *cl, bool block, bool *notify_ev);
void mei_cl_notify(struct mei_cl *cl);

Expand Down
2 changes: 1 addition & 1 deletion drivers/misc/mei/hbm.c
Original file line number Diff line number Diff line change
Expand Up @@ -815,7 +815,7 @@ static void mei_hbm_cl_res(struct mei_device *dev,
struct mei_cl_cb *cb, *next;

cl = NULL;
list_for_each_entry_safe(cb, next, &dev->ctrl_rd_list.list, list) {
list_for_each_entry_safe(cb, next, &dev->ctrl_rd_list, list) {

cl = cb->cl;

Expand Down
10 changes: 5 additions & 5 deletions drivers/misc/mei/hw-me.c
Original file line number Diff line number Diff line change
Expand Up @@ -1189,7 +1189,7 @@ irqreturn_t mei_me_irq_quick_handler(int irq, void *dev_id)
irqreturn_t mei_me_irq_thread_handler(int irq, void *dev_id)
{
struct mei_device *dev = (struct mei_device *) dev_id;
struct mei_cl_cb complete_list;
struct list_head cmpl_list;
s32 slots;
u32 hcsr;
int rets = 0;
Expand All @@ -1201,7 +1201,7 @@ irqreturn_t mei_me_irq_thread_handler(int irq, void *dev_id)
hcsr = mei_hcsr_read(dev);
me_intr_clear(dev, hcsr);

mei_io_list_init(&complete_list);
INIT_LIST_HEAD(&cmpl_list);

/* check if ME wants a reset */
if (!mei_hw_is_ready(dev) && dev->dev_state != MEI_DEV_RESETTING) {
Expand All @@ -1227,7 +1227,7 @@ irqreturn_t mei_me_irq_thread_handler(int irq, void *dev_id)
slots = mei_count_full_read_slots(dev);
while (slots > 0) {
dev_dbg(dev->dev, "slots to read = %08x\n", slots);
rets = mei_irq_read_handler(dev, &complete_list, &slots);
rets = mei_irq_read_handler(dev, &cmpl_list, &slots);
/* There is a race between ME write and interrupt delivery:
* Not all data is always available immediately after the
* interrupt, so try to read again on the next interrupt.
Expand All @@ -1252,11 +1252,11 @@ irqreturn_t mei_me_irq_thread_handler(int irq, void *dev_id)
*/
if (dev->pg_event != MEI_PG_EVENT_WAIT &&
dev->pg_event != MEI_PG_EVENT_RECEIVED) {
rets = mei_irq_write_handler(dev, &complete_list);
rets = mei_irq_write_handler(dev, &cmpl_list);
dev->hbuf_is_ready = mei_hbuf_is_ready(dev);
}

mei_irq_compl_handler(dev, &complete_list);
mei_irq_compl_handler(dev, &cmpl_list);

end:
dev_dbg(dev->dev, "interrupt thread end ret = %d\n", rets);
Expand Down
10 changes: 5 additions & 5 deletions drivers/misc/mei/hw-txe.c
Original file line number Diff line number Diff line change
Expand Up @@ -1057,7 +1057,7 @@ irqreturn_t mei_txe_irq_thread_handler(int irq, void *dev_id)
{
struct mei_device *dev = (struct mei_device *) dev_id;
struct mei_txe_hw *hw = to_txe_hw(dev);
struct mei_cl_cb complete_list;
struct list_head cmpl_list;
s32 slots;
int rets = 0;

Expand All @@ -1069,7 +1069,7 @@ irqreturn_t mei_txe_irq_thread_handler(int irq, void *dev_id)

/* initialize our complete list */
mutex_lock(&dev->device_lock);
mei_io_list_init(&complete_list);
INIT_LIST_HEAD(&cmpl_list);

if (pci_dev_msi_enabled(to_pci_dev(dev->dev)))
mei_txe_check_and_ack_intrs(dev, true);
Expand Down Expand Up @@ -1126,7 +1126,7 @@ irqreturn_t mei_txe_irq_thread_handler(int irq, void *dev_id)
slots = mei_count_full_read_slots(dev);
if (test_and_clear_bit(TXE_INTR_OUT_DB_BIT, &hw->intr_cause)) {
/* Read from TXE */
rets = mei_irq_read_handler(dev, &complete_list, &slots);
rets = mei_irq_read_handler(dev, &cmpl_list, &slots);
if (rets && dev->dev_state != MEI_DEV_RESETTING) {
dev_err(dev->dev,
"mei_irq_read_handler ret = %d.\n", rets);
Expand All @@ -1144,14 +1144,14 @@ irqreturn_t mei_txe_irq_thread_handler(int irq, void *dev_id)
if (hw->aliveness && dev->hbuf_is_ready) {
/* get the real register value */
dev->hbuf_is_ready = mei_hbuf_is_ready(dev);
rets = mei_irq_write_handler(dev, &complete_list);
rets = mei_irq_write_handler(dev, &cmpl_list);
if (rets && rets != -EMSGSIZE)
dev_err(dev->dev, "mei_irq_write_handler ret = %d.\n",
rets);
dev->hbuf_is_ready = mei_hbuf_is_ready(dev);
}

mei_irq_compl_handler(dev, &complete_list);
mei_irq_compl_handler(dev, &cmpl_list);

end:
dev_dbg(dev->dev, "interrupt thread end ret = %d\n", rets);
Expand Down
Loading

0 comments on commit 962ff7b

Please sign in to comment.