Commit bfbf3c09 authored by Matthias Kaehlcke's avatar Matthias Kaehlcke Committed by David S. Miller

[ATM]: Use mutex instead of binary semaphore in FORE Systems 200E-series driver

(akpm: remove CVS control string too)
Signed-off-by: default avatarMatthias Kaehlcke <matthias.kaehlcke@gmail.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 74da9d88
/* /*
$Id: fore200e.c,v 1.5 2000/04/14 10:10:34 davem Exp $
A FORE Systems 200E-series driver for ATM on Linux. A FORE Systems 200E-series driver for ATM on Linux.
Christophe Lizzi (lizzi@cnam.fr), October 1999-March 2003. Christophe Lizzi (lizzi@cnam.fr), October 1999-March 2003.
...@@ -1502,9 +1500,9 @@ fore200e_open(struct atm_vcc *vcc) ...@@ -1502,9 +1500,9 @@ fore200e_open(struct atm_vcc *vcc)
/* pseudo-CBR bandwidth requested? */ /* pseudo-CBR bandwidth requested? */
if ((vcc->qos.txtp.traffic_class == ATM_CBR) && (vcc->qos.txtp.max_pcr > 0)) { if ((vcc->qos.txtp.traffic_class == ATM_CBR) && (vcc->qos.txtp.max_pcr > 0)) {
down(&fore200e->rate_sf); mutex_lock(&fore200e->rate_mtx);
if (fore200e->available_cell_rate < vcc->qos.txtp.max_pcr) { if (fore200e->available_cell_rate < vcc->qos.txtp.max_pcr) {
up(&fore200e->rate_sf); mutex_unlock(&fore200e->rate_mtx);
kfree(fore200e_vcc); kfree(fore200e_vcc);
vc_map->vcc = NULL; vc_map->vcc = NULL;
...@@ -1513,7 +1511,7 @@ fore200e_open(struct atm_vcc *vcc) ...@@ -1513,7 +1511,7 @@ fore200e_open(struct atm_vcc *vcc)
/* reserve bandwidth */ /* reserve bandwidth */
fore200e->available_cell_rate -= vcc->qos.txtp.max_pcr; fore200e->available_cell_rate -= vcc->qos.txtp.max_pcr;
up(&fore200e->rate_sf); mutex_unlock(&fore200e->rate_mtx);
} }
vcc->itf = vcc->dev->number; vcc->itf = vcc->dev->number;
...@@ -1599,9 +1597,9 @@ fore200e_close(struct atm_vcc* vcc) ...@@ -1599,9 +1597,9 @@ fore200e_close(struct atm_vcc* vcc)
/* release reserved bandwidth, if any */ /* release reserved bandwidth, if any */
if ((vcc->qos.txtp.traffic_class == ATM_CBR) && (vcc->qos.txtp.max_pcr > 0)) { if ((vcc->qos.txtp.traffic_class == ATM_CBR) && (vcc->qos.txtp.max_pcr > 0)) {
down(&fore200e->rate_sf); mutex_lock(&fore200e->rate_mtx);
fore200e->available_cell_rate += vcc->qos.txtp.max_pcr; fore200e->available_cell_rate += vcc->qos.txtp.max_pcr;
up(&fore200e->rate_sf); mutex_unlock(&fore200e->rate_mtx);
clear_bit(ATM_VF_HASQOS, &vcc->flags); clear_bit(ATM_VF_HASQOS, &vcc->flags);
} }
...@@ -2064,16 +2062,16 @@ fore200e_change_qos(struct atm_vcc* vcc,struct atm_qos* qos, int flags) ...@@ -2064,16 +2062,16 @@ fore200e_change_qos(struct atm_vcc* vcc,struct atm_qos* qos, int flags)
if ((qos->txtp.traffic_class == ATM_CBR) && (qos->txtp.max_pcr > 0)) { if ((qos->txtp.traffic_class == ATM_CBR) && (qos->txtp.max_pcr > 0)) {
down(&fore200e->rate_sf); mutex_lock(&fore200e->rate_mtx);
if (fore200e->available_cell_rate + vcc->qos.txtp.max_pcr < qos->txtp.max_pcr) { if (fore200e->available_cell_rate + vcc->qos.txtp.max_pcr < qos->txtp.max_pcr) {
up(&fore200e->rate_sf); mutex_unlock(&fore200e->rate_mtx);
return -EAGAIN; return -EAGAIN;
} }
fore200e->available_cell_rate += vcc->qos.txtp.max_pcr; fore200e->available_cell_rate += vcc->qos.txtp.max_pcr;
fore200e->available_cell_rate -= qos->txtp.max_pcr; fore200e->available_cell_rate -= qos->txtp.max_pcr;
up(&fore200e->rate_sf); mutex_unlock(&fore200e->rate_mtx);
memcpy(&vcc->qos, qos, sizeof(struct atm_qos)); memcpy(&vcc->qos, qos, sizeof(struct atm_qos));
...@@ -2459,7 +2457,7 @@ fore200e_initialize(struct fore200e* fore200e) ...@@ -2459,7 +2457,7 @@ fore200e_initialize(struct fore200e* fore200e)
DPRINTK(2, "device %s being initialized\n", fore200e->name); DPRINTK(2, "device %s being initialized\n", fore200e->name);
init_MUTEX(&fore200e->rate_sf); mutex_init(&fore200e->rate_mtx);
spin_lock_init(&fore200e->q_lock); spin_lock_init(&fore200e->q_lock);
cpq = fore200e->cp_queues = fore200e->virt_base + FORE200E_CP_QUEUES_OFFSET; cpq = fore200e->cp_queues = fore200e->virt_base + FORE200E_CP_QUEUES_OFFSET;
......
...@@ -869,7 +869,7 @@ typedef struct fore200e { ...@@ -869,7 +869,7 @@ typedef struct fore200e {
struct stats* stats; /* last snapshot of the stats */ struct stats* stats; /* last snapshot of the stats */
struct semaphore rate_sf; /* protects rate reservation ops */ struct mutex rate_mtx; /* protects rate reservation ops */
spinlock_t q_lock; /* protects queue ops */ spinlock_t q_lock; /* protects queue ops */
#ifdef FORE200E_USE_TASKLET #ifdef FORE200E_USE_TASKLET
struct tasklet_struct tx_tasklet; /* performs tx interrupt work */ struct tasklet_struct tx_tasklet; /* performs tx interrupt work */
......
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