staging: wilc1000: use list_head to maintain 'txq_entry_t' elements of tx queue
authorAjay Singh <ajay.kathat@microchip.com>
Mon, 4 Jun 2018 05:29:07 +0000 (10:59 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 17 Jun 2018 07:05:13 +0000 (09:05 +0200)
Use list_head data structure for the doubly linked list instead of own
implementation.
Only 'txq_head' is required, so removed the txq_tail pointer from
'wilc' structure.

Following functions are modified to provide data using list_head API's
wilc_wlan_txq_remove()
wilc_wlan_txq_remove_from_head()
wilc_wlan_txq_add_to_tail()
wilc_wlan_txq_add_to_head()
wilc_wlan_txq_get_first()
wilc_wlan_txq_get_next()

Signed-off-by: Ajay Singh <ajay.kathat@microchip.com>
Reviewed-by: Claudiu Beznea <claudiu.beznea@microchip.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/wilc1000/linux_wlan.c
drivers/staging/wilc1000/wilc_wfi_netdevice.h
drivers/staging/wilc1000/wilc_wlan.c
drivers/staging/wilc1000/wilc_wlan.h

index 02e6b1338440b7b90a6747d89293c82e7697a4ee..eac719b5ad703f730e6377dbdcf905e039842e1a 100644 (file)
@@ -1118,6 +1118,7 @@ int wilc_netdev_init(struct wilc **wilc, struct device *dev, int io_type,
        wl->io_type = io_type;
        wl->gpio = gpio;
        wl->hif_func = ops;
+       INIT_LIST_HEAD(&wl->txq_head.list);
 
        register_inetaddr_notifier(&g_dev_notifier);
 
index f2b07e8aedd777feb9b4acdd83b228b51eec10b1..e1fab734c82a5f616fcebd4e1a8c69d8cbc0ef29 100644 (file)
@@ -157,8 +157,7 @@ struct wilc {
 
        unsigned long txq_spinlock_flags;
 
-       struct txq_entry_t *txq_head;
-       struct txq_entry_t *txq_tail;
+       struct txq_entry_t txq_head;
        int txq_entries;
        int txq_exit;
 
index d4ebbf67e50beebe32a75912f7631d84ec6a8fad..857cc382b2d3f286478469a040d410c08226d57e 100644 (file)
@@ -20,25 +20,14 @@ static inline void release_bus(struct wilc *wilc, enum bus_release release)
 
 static void wilc_wlan_txq_remove(struct wilc *wilc, struct txq_entry_t *tqe)
 {
-       if (tqe == wilc->txq_head) {
-               wilc->txq_head = tqe->next;
-               if (wilc->txq_head)
-                       wilc->txq_head->prev = NULL;
-       } else if (tqe == wilc->txq_tail) {
-               wilc->txq_tail = (tqe->prev);
-               if (wilc->txq_tail)
-                       wilc->txq_tail->next = NULL;
-       } else {
-               tqe->prev->next = tqe->next;
-               tqe->next->prev = tqe->prev;
-       }
+       list_del(&tqe->list);
        wilc->txq_entries -= 1;
 }
 
 static struct txq_entry_t *
 wilc_wlan_txq_remove_from_head(struct net_device *dev)
 {
-       struct txq_entry_t *tqe;
+       struct txq_entry_t *tqe = NULL;
        unsigned long flags;
        struct wilc_vif *vif;
        struct wilc *wilc;
@@ -47,15 +36,12 @@ wilc_wlan_txq_remove_from_head(struct net_device *dev)
        wilc = vif->wilc;
 
        spin_lock_irqsave(&wilc->txq_spinlock, flags);
-       if (wilc->txq_head) {
-               tqe = wilc->txq_head;
-               wilc->txq_head = tqe->next;
-               if (wilc->txq_head)
-                       wilc->txq_head->prev = NULL;
 
+       if (!list_empty(&wilc->txq_head.list)) {
+               tqe = list_first_entry(&wilc->txq_head.list, struct txq_entry_t,
+                                      list);
+               list_del(&tqe->list);
                wilc->txq_entries -= 1;
-       } else {
-               tqe = NULL;
        }
        spin_unlock_irqrestore(&wilc->txq_spinlock, flags);
        return tqe;
@@ -73,17 +59,7 @@ static void wilc_wlan_txq_add_to_tail(struct net_device *dev,
 
        spin_lock_irqsave(&wilc->txq_spinlock, flags);
 
-       if (!wilc->txq_head) {
-               tqe->next = NULL;
-               tqe->prev = NULL;
-               wilc->txq_head = tqe;
-               wilc->txq_tail = tqe;
-       } else {
-               tqe->next = NULL;
-               tqe->prev = wilc->txq_tail;
-               wilc->txq_tail->next = tqe;
-               wilc->txq_tail = tqe;
-       }
+       list_add_tail(&tqe->list, &wilc->txq_head.list);
        wilc->txq_entries += 1;
 
        spin_unlock_irqrestore(&wilc->txq_spinlock, flags);
@@ -101,17 +77,7 @@ static int wilc_wlan_txq_add_to_head(struct wilc_vif *vif,
 
        spin_lock_irqsave(&wilc->txq_spinlock, flags);
 
-       if (!wilc->txq_head) {
-               tqe->next = NULL;
-               tqe->prev = NULL;
-               wilc->txq_head = tqe;
-               wilc->txq_tail = tqe;
-       } else {
-               tqe->next = wilc->txq_head;
-               tqe->prev = NULL;
-               wilc->txq_head->prev = tqe;
-               wilc->txq_head = tqe;
-       }
+       list_add(&tqe->list, &wilc->txq_head.list);
        wilc->txq_entries += 1;
 
        spin_unlock_irqrestore(&wilc->txq_spinlock, flags);
@@ -402,12 +368,14 @@ int wilc_wlan_txq_add_mgmt_pkt(struct net_device *dev, void *priv, u8 *buffer,
 
 static struct txq_entry_t *wilc_wlan_txq_get_first(struct wilc *wilc)
 {
-       struct txq_entry_t *tqe;
+       struct txq_entry_t *tqe = NULL;
        unsigned long flags;
 
        spin_lock_irqsave(&wilc->txq_spinlock, flags);
 
-       tqe = wilc->txq_head;
+       if (!list_empty(&wilc->txq_head.list))
+               tqe = list_first_entry(&wilc->txq_head.list, struct txq_entry_t,
+                                      list);
 
        spin_unlock_irqrestore(&wilc->txq_spinlock, flags);
 
@@ -421,7 +389,10 @@ static struct txq_entry_t *wilc_wlan_txq_get_next(struct wilc *wilc,
 
        spin_lock_irqsave(&wilc->txq_spinlock, flags);
 
-       tqe = tqe->next;
+       if (!list_is_last(&tqe->list, &wilc->txq_head.list))
+               tqe = list_next_entry(tqe, list);
+       else
+               tqe = NULL;
        spin_unlock_irqrestore(&wilc->txq_spinlock, flags);
 
        return tqe;
index a5b9c68e1b9ce0fb487c3fed0382d2015976a1be..e0ff3e8c083628f95efa7b4481ec20bd184fe003 100644 (file)
  ********************************************/
 
 struct txq_entry_t {
-       struct txq_entry_t *next;
-       struct txq_entry_t *prev;
+       struct list_head list;
        int type;
        int tcp_pending_ack_idx;
        u8 *buffer;