staging: mei: io_list functions revamp
authorTomas Winkler <tomas.winkler@intel.com>
Mon, 6 Jun 2011 07:44:34 +0000 (10:44 +0300)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 28 Jun 2011 20:21:33 +0000 (13:21 -0700)
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: Tomas Winkler <tomas.winkler@intel.com>
Signed-off-by: Oren Weil <oren.jer.weil@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/staging/mei/init.c
drivers/staging/mei/interrupt.c
drivers/staging/mei/iorw.c
drivers/staging/mei/main.c
drivers/staging/mei/mei_dev.h

index b67f3b8f834d741f93147e759c9080dd25a9cdbd..eb70e70a274398db561ff64883925184dc046494 100644 (file)
@@ -29,12 +29,12 @@ const uuid_le mei_amthi_guid  = UUID_LE(0x12f80028, 0xb4b7, 0x4b2d, 0xac,
                                                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
  */
-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 */
        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)
 }
 
 /**
- * mei_flush_queues - flushes queue lists 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.
+ * mei_io_list_flush - removes list entry belonging to cl.
  *
  * @list:  An instance of our list structure
  * @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_next = NULL;
 
-       if (!list || !cl)
-               return;
-
        if (list->status != 0)
                return;
 
@@ -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->mei_cb.cb_list, cb_list) {
                if (cb_pos) {
-                       cl_tmp = (struct mei_cl *)
-                               cb_pos->file_private;
-                       if (cl_tmp &&
-                           mei_fe_same_id(cl, cl_tmp))
+                       struct mei_cl *cl_tmp;
+                       cl_tmp = (struct mei_cl *)cb_pos->file_private;
+                       if (mei_cl_cmp_id(cl, cl_tmp))
                                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
@@ -120,7 +118,6 @@ static void mei_reset_iamthif_params(struct mei_device *dev)
  */
 struct mei_device *mei_device_init(struct pci_dev *pdev)
 {
-       int i;
        struct mei_device *dev;
 
        dev = kzalloc(sizeof(struct mei_device), GFP_KERNEL);
@@ -128,13 +125,6 @@ struct mei_device *mei_device_init(struct pci_dev *pdev)
                return NULL;
 
        /* 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->wd_cl.link);
        INIT_LIST_HEAD(&dev->iamthif_cl.link);
@@ -143,8 +133,15 @@ struct mei_device *mei_device_init(struct pci_dev *pdev)
        init_waitqueue_head(&dev->wait_stop_wd);
        dev->mei_state = MEI_INITIALIZING;
        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;
        return dev;
 }
@@ -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");
        }
 
-       mei_flush_list(&dev->ctrl_rd_list, cl);
-       mei_flush_list(&dev->ctrl_wr_list, cl);
+       mei_io_list_flush(&dev->ctrl_rd_list, cl);
+       mei_io_list_flush(&dev->ctrl_wr_list, cl);
 free:
        mei_free_cb_private(cb);
        return rets;
index b4ad947bcc524fb7cc4461ffe404fc692b8702da..2ff30ee90588f66b62484a483d46164445383210 100644 (file)
@@ -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");
        /* initialize our complete list */
        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->me_hw_state = mei_mecsr_read(dev);
 
index d5f1457f8cfe0675e4b3433091a60bcbe24ef462..8a61d126651586440b2094fa61060f5df8683047 100644 (file)
@@ -121,7 +121,7 @@ int mei_ioctl_connect_client(struct file *file,
                clear_bit(cl->host_client_id, dev->host_clients_map);
                list_for_each_entry_safe(cl_pos, cl_next,
                                         &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,
                                        "remove file private data node host"
                                    " client = %d, ME client = %d.\n",
@@ -204,8 +204,8 @@ int mei_ioctl_connect_client(struct file *file,
                }
                rets = -EFAULT;
 
-               mei_flush_list(&dev->ctrl_rd_list, cl);
-               mei_flush_list(&dev->ctrl_wr_list, cl);
+               mei_io_list_flush(&dev->ctrl_rd_list, cl);
+               mei_io_list_flush(&dev->ctrl_wr_list, cl);
                goto end;
        }
        rets = 0;
index 917a757d605dcf30c084fad812c92513864df972..24a7dc96937aa1518104d9c611aed4888dc8f018 100644 (file)
@@ -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_next = NULL;
-       struct mei_cl *cl_list_temp;
 
        if (!dev->read_list.status &&
            !list_empty(&dev->read_list.mei_cb.cb_list)) {
@@ -370,14 +369,11 @@ static struct mei_cl_cb *find_read_list_entry(
                dev_dbg(&dev->pdev->dev, "remove read_list CB\n");
                list_for_each_entry_safe(cb_pos, cb_next,
                                &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 *)
-                               cb_pos->file_private;
-
-                       if (cl_list_temp &&
-                           mei_fe_same_id(cl, cl_list_temp))
+                       if (mei_cl_cmp_id(cl, cl_temp))
                                return cb_pos;
-
                }
        }
        return NULL;
@@ -478,7 +474,7 @@ static int mei_release(struct inode *inode, struct file *file)
                            cl->me_client_id);
                        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",
                    cl->host_client_id,
                    cl->me_client_id);
index 904b1bfc33c1c3e2740348b2e09e7ce3160e56b3..d7bc10c612be3f4fbef9e3cd6b5bfc8a5f5070b9 100644 (file)
@@ -61,11 +61,6 @@ extern const u8 mei_wd_state_independence_msg[3][4];
  */
 #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
  */
@@ -178,7 +173,6 @@ struct mei_device {
         * lists of queues
         */
         /* 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 write_list;          /* driver write queue */
        struct mei_io_list write_waiting_list;  /* write waiting queue */
@@ -276,9 +270,6 @@ int mei_hw_init(struct mei_device *dev);
 int mei_task_initialize_clients(void *data);
 int mei_initialize_clients(struct mei_device *dev);
 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_host_init_iamthif(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,
                                struct mei_cl *priv,
                                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
  */
 
 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);
 void mei_enable_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