Commit 0288c7c9 authored by Tomas Winkler's avatar Tomas Winkler Committed by Greg Kroah-Hartman

staging: mei: io_list functions revamp

1. remove list used for loop. There were only 2 loops used in non
   time critical places so we can safely unroll them
2. normalize functions names operating on io_list to mei_io_list_<op>
3. rename mei_fe_same_id to mei_cl_cmp_id  used for comparing list
   elements containing struct mei_cl
4. group together  io_list functions in the header file
Signed-off-by: default avatarTomas Winkler <tomas.winkler@intel.com>
Signed-off-by: default avatarOren Weil <oren.jer.weil@intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent cf9673da
...@@ -29,12 +29,12 @@ const uuid_le mei_amthi_guid = UUID_LE(0x12f80028, 0xb4b7, 0x4b2d, 0xac, ...@@ -29,12 +29,12 @@ const uuid_le mei_amthi_guid = UUID_LE(0x12f80028, 0xb4b7, 0x4b2d, 0xac,
0x81, 0x4c); 0x81, 0x4c);
/** /**
* mei_initialize_list - Sets up a queue list. * mei_io_list_init - Sets up a queue list.
* *
* @list: An instance of our list structure * @list: An instance io list structure
* @dev: the device structure * @dev: the device structure
*/ */
void mei_initialize_list(struct mei_io_list *list, struct mei_device *dev) void mei_io_list_init(struct mei_io_list *list)
{ {
/* initialize our queue list */ /* initialize our queue list */
INIT_LIST_HEAD(&list->mei_cb.cb_list); INIT_LIST_HEAD(&list->mei_cb.cb_list);
...@@ -42,40 +42,16 @@ void mei_initialize_list(struct mei_io_list *list, struct mei_device *dev) ...@@ -42,40 +42,16 @@ void mei_initialize_list(struct mei_io_list *list, struct mei_device *dev)
} }
/** /**
* mei_flush_queues - flushes queue lists belonging to cl. * mei_io_list_flush - removes list entry belonging to cl.
*
* @dev: the device structure
* @cl: private data of the file object
*/
void mei_flush_queues(struct mei_device *dev, struct mei_cl *cl)
{
int i;
if (!dev || !cl)
return;
for (i = 0; i < MEI_IO_LISTS_NUMBER; i++) {
dev_dbg(&dev->pdev->dev, "remove list entry belonging to cl\n");
mei_flush_list(dev->io_list_array[i], cl);
}
}
/**
* mei_flush_list - removes list entry belonging to cl.
* *
* @list: An instance of our list structure * @list: An instance of our list structure
* @cl: private data of the file object * @cl: private data of the file object
*/ */
void mei_flush_list(struct mei_io_list *list, struct mei_cl *cl) void mei_io_list_flush(struct mei_io_list *list, struct mei_cl *cl)
{ {
struct mei_cl *cl_tmp;
struct mei_cl_cb *cb_pos = NULL; struct mei_cl_cb *cb_pos = NULL;
struct mei_cl_cb *cb_next = NULL; struct mei_cl_cb *cb_next = NULL;
if (!list || !cl)
return;
if (list->status != 0) if (list->status != 0)
return; return;
...@@ -85,14 +61,36 @@ void mei_flush_list(struct mei_io_list *list, struct mei_cl *cl) ...@@ -85,14 +61,36 @@ void mei_flush_list(struct mei_io_list *list, struct mei_cl *cl)
list_for_each_entry_safe(cb_pos, cb_next, list_for_each_entry_safe(cb_pos, cb_next,
&list->mei_cb.cb_list, cb_list) { &list->mei_cb.cb_list, cb_list) {
if (cb_pos) { if (cb_pos) {
cl_tmp = (struct mei_cl *) struct mei_cl *cl_tmp;
cb_pos->file_private; cl_tmp = (struct mei_cl *)cb_pos->file_private;
if (cl_tmp && if (mei_cl_cmp_id(cl, cl_tmp))
mei_fe_same_id(cl, cl_tmp))
list_del(&cb_pos->cb_list); list_del(&cb_pos->cb_list);
} }
} }
} }
/**
* mei_cl_flush_queues - flushes queue lists belonging to cl.
*
* @dev: the device structure
* @cl: private data of the file object
*/
int mei_cl_flush_queues(struct mei_cl *cl)
{
if (!cl || !cl->dev)
return -EINVAL;
dev_dbg(&cl->dev->pdev->dev, "remove list entry belonging to cl\n");
mei_io_list_flush(&cl->dev->read_list, cl);
mei_io_list_flush(&cl->dev->write_list, cl);
mei_io_list_flush(&cl->dev->write_waiting_list, cl);
mei_io_list_flush(&cl->dev->ctrl_wr_list, cl);
mei_io_list_flush(&cl->dev->ctrl_rd_list, cl);
mei_io_list_flush(&cl->dev->amthi_cmd_list, cl);
mei_io_list_flush(&cl->dev->amthi_read_complete_list, cl);
return 0;
}
/** /**
* mei_reset_iamthif_params - initializes mei device iamthif * mei_reset_iamthif_params - initializes mei device iamthif
...@@ -120,7 +118,6 @@ static void mei_reset_iamthif_params(struct mei_device *dev) ...@@ -120,7 +118,6 @@ static void mei_reset_iamthif_params(struct mei_device *dev)
*/ */
struct mei_device *mei_device_init(struct pci_dev *pdev) struct mei_device *mei_device_init(struct pci_dev *pdev)
{ {
int i;
struct mei_device *dev; struct mei_device *dev;
dev = kzalloc(sizeof(struct mei_device), GFP_KERNEL); dev = kzalloc(sizeof(struct mei_device), GFP_KERNEL);
...@@ -128,13 +125,6 @@ struct mei_device *mei_device_init(struct pci_dev *pdev) ...@@ -128,13 +125,6 @@ struct mei_device *mei_device_init(struct pci_dev *pdev)
return NULL; return NULL;
/* setup our list array */ /* setup our list array */
dev->io_list_array[0] = &dev->read_list;
dev->io_list_array[1] = &dev->write_list;
dev->io_list_array[2] = &dev->write_waiting_list;
dev->io_list_array[3] = &dev->ctrl_wr_list;
dev->io_list_array[4] = &dev->ctrl_rd_list;
dev->io_list_array[5] = &dev->amthi_cmd_list;
dev->io_list_array[6] = &dev->amthi_read_complete_list;
INIT_LIST_HEAD(&dev->file_list); INIT_LIST_HEAD(&dev->file_list);
INIT_LIST_HEAD(&dev->wd_cl.link); INIT_LIST_HEAD(&dev->wd_cl.link);
INIT_LIST_HEAD(&dev->iamthif_cl.link); INIT_LIST_HEAD(&dev->iamthif_cl.link);
...@@ -143,8 +133,15 @@ struct mei_device *mei_device_init(struct pci_dev *pdev) ...@@ -143,8 +133,15 @@ struct mei_device *mei_device_init(struct pci_dev *pdev)
init_waitqueue_head(&dev->wait_stop_wd); init_waitqueue_head(&dev->wait_stop_wd);
dev->mei_state = MEI_INITIALIZING; dev->mei_state = MEI_INITIALIZING;
dev->iamthif_state = MEI_IAMTHIF_IDLE; dev->iamthif_state = MEI_IAMTHIF_IDLE;
for (i = 0; i < MEI_IO_LISTS_NUMBER; i++)
mei_initialize_list(dev->io_list_array[i], dev);
mei_io_list_init(&dev->read_list);
mei_io_list_init(&dev->write_list);
mei_io_list_init(&dev->write_waiting_list);
mei_io_list_init(&dev->ctrl_wr_list);
mei_io_list_init(&dev->ctrl_rd_list);
mei_io_list_init(&dev->amthi_cmd_list);
mei_io_list_init(&dev->amthi_read_complete_list);
dev->pdev = pdev; dev->pdev = pdev;
return dev; return dev;
} }
...@@ -737,8 +734,8 @@ int mei_disconnect_host_client(struct mei_device *dev, struct mei_cl *cl) ...@@ -737,8 +734,8 @@ int mei_disconnect_host_client(struct mei_device *dev, struct mei_cl *cl)
dev_dbg(&dev->pdev->dev, "failed to disconnect from FW client.\n"); dev_dbg(&dev->pdev->dev, "failed to disconnect from FW client.\n");
} }
mei_flush_list(&dev->ctrl_rd_list, cl); mei_io_list_flush(&dev->ctrl_rd_list, cl);
mei_flush_list(&dev->ctrl_wr_list, cl); mei_io_list_flush(&dev->ctrl_wr_list, cl);
free: free:
mei_free_cb_private(cb); mei_free_cb_private(cb);
return rets; return rets;
......
...@@ -1538,7 +1538,7 @@ irqreturn_t mei_interrupt_thread_handler(int irq, void *dev_id) ...@@ -1538,7 +1538,7 @@ irqreturn_t mei_interrupt_thread_handler(int irq, void *dev_id)
dev_dbg(&dev->pdev->dev, "function called after ISR to handle the interrupt processing.\n"); dev_dbg(&dev->pdev->dev, "function called after ISR to handle the interrupt processing.\n");
/* initialize our complete list */ /* initialize our complete list */
mutex_lock(&dev->device_lock); mutex_lock(&dev->device_lock);
mei_initialize_list(&complete_list, dev); mei_io_list_init(&complete_list);
dev->host_hw_state = mei_hcsr_read(dev); dev->host_hw_state = mei_hcsr_read(dev);
dev->me_hw_state = mei_mecsr_read(dev); dev->me_hw_state = mei_mecsr_read(dev);
......
...@@ -121,7 +121,7 @@ int mei_ioctl_connect_client(struct file *file, ...@@ -121,7 +121,7 @@ int mei_ioctl_connect_client(struct file *file,
clear_bit(cl->host_client_id, dev->host_clients_map); clear_bit(cl->host_client_id, dev->host_clients_map);
list_for_each_entry_safe(cl_pos, cl_next, list_for_each_entry_safe(cl_pos, cl_next,
&dev->file_list, link) { &dev->file_list, link) {
if (mei_fe_same_id(cl, cl_pos)) { if (mei_cl_cmp_id(cl, cl_pos)) {
dev_dbg(&dev->pdev->dev, dev_dbg(&dev->pdev->dev,
"remove file private data node host" "remove file private data node host"
" client = %d, ME client = %d.\n", " client = %d, ME client = %d.\n",
...@@ -204,8 +204,8 @@ int mei_ioctl_connect_client(struct file *file, ...@@ -204,8 +204,8 @@ int mei_ioctl_connect_client(struct file *file,
} }
rets = -EFAULT; rets = -EFAULT;
mei_flush_list(&dev->ctrl_rd_list, cl); mei_io_list_flush(&dev->ctrl_rd_list, cl);
mei_flush_list(&dev->ctrl_wr_list, cl); mei_io_list_flush(&dev->ctrl_wr_list, cl);
goto end; goto end;
} }
rets = 0; rets = 0;
......
...@@ -362,7 +362,6 @@ static struct mei_cl_cb *find_read_list_entry( ...@@ -362,7 +362,6 @@ static struct mei_cl_cb *find_read_list_entry(
{ {
struct mei_cl_cb *cb_pos = NULL; struct mei_cl_cb *cb_pos = NULL;
struct mei_cl_cb *cb_next = NULL; struct mei_cl_cb *cb_next = NULL;
struct mei_cl *cl_list_temp;
if (!dev->read_list.status && if (!dev->read_list.status &&
!list_empty(&dev->read_list.mei_cb.cb_list)) { !list_empty(&dev->read_list.mei_cb.cb_list)) {
...@@ -370,14 +369,11 @@ static struct mei_cl_cb *find_read_list_entry( ...@@ -370,14 +369,11 @@ static struct mei_cl_cb *find_read_list_entry(
dev_dbg(&dev->pdev->dev, "remove read_list CB\n"); dev_dbg(&dev->pdev->dev, "remove read_list CB\n");
list_for_each_entry_safe(cb_pos, cb_next, list_for_each_entry_safe(cb_pos, cb_next,
&dev->read_list.mei_cb.cb_list, cb_list) { &dev->read_list.mei_cb.cb_list, cb_list) {
struct mei_cl *cl_temp;
cl_temp = (struct mei_cl *)cb_pos->file_private;
cl_list_temp = (struct mei_cl *) if (mei_cl_cmp_id(cl, cl_temp))
cb_pos->file_private;
if (cl_list_temp &&
mei_fe_same_id(cl, cl_list_temp))
return cb_pos; return cb_pos;
} }
} }
return NULL; return NULL;
...@@ -478,7 +474,7 @@ static int mei_release(struct inode *inode, struct file *file) ...@@ -478,7 +474,7 @@ static int mei_release(struct inode *inode, struct file *file)
cl->me_client_id); cl->me_client_id);
rets = mei_disconnect_host_client(dev, cl); rets = mei_disconnect_host_client(dev, cl);
} }
mei_flush_queues(dev, cl); mei_cl_flush_queues(cl);
dev_dbg(&dev->pdev->dev, "remove client host client = %d, ME client = %d\n", dev_dbg(&dev->pdev->dev, "remove client host client = %d, ME client = %d\n",
cl->host_client_id, cl->host_client_id,
cl->me_client_id); cl->me_client_id);
......
...@@ -61,11 +61,6 @@ extern const u8 mei_wd_state_independence_msg[3][4]; ...@@ -61,11 +61,6 @@ extern const u8 mei_wd_state_independence_msg[3][4];
*/ */
#define MEI_MAX_OPEN_HANDLE_COUNT 253 #define MEI_MAX_OPEN_HANDLE_COUNT 253
/*
* Number of queue lists used by this driver
*/
#define MEI_IO_LISTS_NUMBER 7
/* /*
* Number of Maximum MEI Clients * Number of Maximum MEI Clients
*/ */
...@@ -178,7 +173,6 @@ struct mei_device { ...@@ -178,7 +173,6 @@ struct mei_device {
* lists of queues * lists of queues
*/ */
/* array of pointers to aio lists */ /* array of pointers to aio lists */
struct mei_io_list *io_list_array[MEI_IO_LISTS_NUMBER];
struct mei_io_list read_list; /* driver read queue */ struct mei_io_list read_list; /* driver read queue */
struct mei_io_list write_list; /* driver write queue */ struct mei_io_list write_list; /* driver write queue */
struct mei_io_list write_waiting_list; /* write waiting queue */ struct mei_io_list write_waiting_list; /* write waiting queue */
...@@ -276,9 +270,6 @@ int mei_hw_init(struct mei_device *dev); ...@@ -276,9 +270,6 @@ int mei_hw_init(struct mei_device *dev);
int mei_task_initialize_clients(void *data); int mei_task_initialize_clients(void *data);
int mei_initialize_clients(struct mei_device *dev); int mei_initialize_clients(struct mei_device *dev);
int mei_disconnect_host_client(struct mei_device *dev, struct mei_cl *cl); int mei_disconnect_host_client(struct mei_device *dev, struct mei_cl *cl);
void mei_initialize_list(struct mei_io_list *list, struct mei_device *dev);
void mei_flush_list(struct mei_io_list *list, struct mei_cl *cl);
void mei_flush_queues(struct mei_device *dev, struct mei_cl *cl);
void mei_remove_client_from_file_list(struct mei_device *dev, u8 host_client_id); void mei_remove_client_from_file_list(struct mei_device *dev, u8 host_client_id);
void mei_host_init_iamthif(struct mei_device *dev); void mei_host_init_iamthif(struct mei_device *dev);
void mei_allocate_me_clients_storage(struct mei_device *dev); void mei_allocate_me_clients_storage(struct mei_device *dev);
...@@ -288,12 +279,35 @@ u8 mei_find_me_client_update_filext(struct mei_device *dev, ...@@ -288,12 +279,35 @@ u8 mei_find_me_client_update_filext(struct mei_device *dev,
struct mei_cl *priv, struct mei_cl *priv,
const uuid_le *cguid, u8 client_id); const uuid_le *cguid, u8 client_id);
/*
* MEI IO List Functions
*/
void mei_io_list_init(struct mei_io_list *list);
void mei_io_list_flush(struct mei_io_list *list, struct mei_cl *cl);
/* /*
* MEI ME Client Functions * MEI ME Client Functions
*/ */
struct mei_cl *mei_cl_allocate(struct mei_device *dev); struct mei_cl *mei_cl_allocate(struct mei_device *dev);
void mei_cl_init(struct mei_cl *priv, struct mei_device *dev); void mei_cl_init(struct mei_cl *cl, struct mei_device *dev);
int mei_cl_flush_queues(struct mei_cl *cl);
/**
* mei_cl_cmp_id - tells if file private data have same id
*
* @fe1: private data of 1. file object
* @fe2: private data of 2. file object
*
* returns true - if ids are the same and not NULL
*/
static inline bool mei_cl_cmp_id(const struct mei_cl *cl1,
const struct mei_cl *cl2)
{
return cl1 && cl2 &&
(cl1->host_client_id == cl2->host_client_id) &&
(cl1->me_client_id == cl2->me_client_id);
}
/* /*
...@@ -408,19 +422,4 @@ void mei_csr_clear_his(struct mei_device *dev); ...@@ -408,19 +422,4 @@ void mei_csr_clear_his(struct mei_device *dev);
void mei_enable_interrupts(struct mei_device *dev); void mei_enable_interrupts(struct mei_device *dev);
void mei_disable_interrupts(struct mei_device *dev); void mei_disable_interrupts(struct mei_device *dev);
/**
* mei_fe_same_id - tells if file private data have same id
*
* @fe1: private data of 1. file object
* @fe2: private data of 2. file object
*
* returns !=0 - if ids are the same, 0 - if differ.
*/
static inline int mei_fe_same_id(const struct mei_cl *fe1,
const struct mei_cl *fe2)
{
return ((fe1->host_client_id == fe2->host_client_id) &&
(fe1->me_client_id == fe2->me_client_id));
}
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment