summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsave2010-01-20 14:13:34 +0000
committersave2010-01-20 14:13:34 +0000
commit7e6771f5a0144d25473e9e331292e8be425a05e9 (patch)
treeabadd9306a6dfd846910076a9cb0447eb4af4d08
parentd60e94fa78cd8bcef4624363dd08b09e8c1066a5 (diff)
cleo/devkit/plcdrv: Add a mutex for sk_buff list accesses
git-svn-id: svn+ssh://pessac/svn/cesar/trunk@6636 017c9cb6-072f-447c-8318-d5b54f68fe89
-rw-r--r--cleopatre/devkit/plcdrv/arm/inc/linux_drv.h1
-rw-r--r--cleopatre/devkit/plcdrv/arm/src/linux_drv.c11
2 files changed, 12 insertions, 0 deletions
diff --git a/cleopatre/devkit/plcdrv/arm/inc/linux_drv.h b/cleopatre/devkit/plcdrv/arm/inc/linux_drv.h
index e3f57151d5..84dbc7019a 100644
--- a/cleopatre/devkit/plcdrv/arm/inc/linux_drv.h
+++ b/cleopatre/devkit/plcdrv/arm/inc/linux_drv.h
@@ -57,6 +57,7 @@ struct net_priv {
uint32_t num_mbx_it_wd;
uint32_t phys_ring_base_addr;
uint32_t virt_ring_base_addr;
+ spinlock_t lock;
struct list_head list_head_skbs;
struct net_device_stats stats;
struct plc_stats plc_stats;
diff --git a/cleopatre/devkit/plcdrv/arm/src/linux_drv.c b/cleopatre/devkit/plcdrv/arm/src/linux_drv.c
index c13f6ed296..54ff355479 100644
--- a/cleopatre/devkit/plcdrv/arm/src/linux_drv.c
+++ b/cleopatre/devkit/plcdrv/arm/src/linux_drv.c
@@ -640,6 +640,7 @@ static struct sk_buff* get_skb_addr(uint32_t data_addr)
struct sk_buff *skb;
struct net_priv *priv = plcdrv_device->priv;
+ spin_lock(&priv->lock);
//Check in the list to find the sk_buff corresponding to our data_addr
for(ptr = priv->list_head_skbs.next ; ptr != &priv->list_head_skbs ; ptr = ptr->next)
{
@@ -649,9 +650,11 @@ static struct sk_buff* get_skb_addr(uint32_t data_addr)
skb = entry->skb;
kfree(entry);
list_del(ptr);
+ spin_unlock(&priv->lock);
return skb;
}
}
+ spin_unlock(&priv->lock);
return NULL;
}// get_skb_addr
@@ -667,10 +670,14 @@ static uint32_t put_skb_addr(struct sk_buff *skb)
struct skb_addr_list *entry;
struct net_priv *priv = plcdrv_device->priv;
+ spin_lock(&priv->lock);
//Create a new entry for the list of sk_buffs in used
entry = (struct skb_addr_list*)kmalloc(sizeof(struct skb_addr_list), GFP_ATOMIC);
if(entry == NULL)
+ {
+ spin_unlock(&priv->lock);
return -ENOMEM;
+ }
entry->skb = skb;
entry->pkt_addr = (uint32_t*)skb->data;
@@ -678,6 +685,7 @@ static uint32_t put_skb_addr(struct sk_buff *skb)
//Add the new entry in the list
list_add_tail(&entry->list, &priv->list_head_skbs);
+ spin_unlock(&priv->lock);
return 0;
}// put_skb_addr
@@ -1286,6 +1294,9 @@ int plcdrv_open(struct net_device *dev)
mdly(10);
#endif
+ //Prepare mutex
+ spin_lock_init(&priv->lock);
+
//Prepare init structure from lower layers
info.ring_base_addr = priv->virt_ring_base_addr;
info.phys_ring_base_addr = priv->phys_ring_base_addr;