aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/atm/fore200e.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@woody.linux-foundation.org>2007-04-27 12:26:46 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-04-27 12:26:46 -0400
commit15c54033964a943de7b0763efd3bd0ede7326395 (patch)
tree840b292612d1b5396d5bab5bde537a9013db3ceb /drivers/atm/fore200e.c
parentad5da3cf39a5b11a198929be1f2644e17ecd767e (diff)
parent912a41a4ab935ce8c4308428ec13fc7f8b1f18f4 (diff)
Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6: (448 commits) [IPV4] nl_fib_lookup: Initialise res.r before fib_res_put(&res) [IPV6]: Fix thinko in ipv6_rthdr_rcv() changes. [IPV4]: Add multipath cached to feature-removal-schedule.txt [WIRELESS] cfg80211: Clarify locking comment. [WIRELESS] cfg80211: Fix locking in wiphy_new. [WEXT] net_device: Don't include wext bits if not required. [WEXT]: Misc code cleanups. [WEXT]: Reduce inline abuse. [WEXT]: Move EXPORT_SYMBOL statements where they belong. [WEXT]: Cleanup early ioctl call path. [WEXT]: Remove options. [WEXT]: Remove dead debug code. [WEXT]: Clean up how wext is called. [WEXT]: Move to net/wireless [AFS]: Eliminate cmpxchg() usage in vlocation code. [RXRPC]: Fix pointers passed to bitops. [RXRPC]: Remove bogus atomic_* overrides. [AFS]: Fix u64 printing in debug logging. [AFS]: Add "directory write" support. [AFS]: Implement the CB.InitCallBackState3 operation. ...
Diffstat (limited to 'drivers/atm/fore200e.c')
-rw-r--r--drivers/atm/fore200e.c20
1 files changed, 9 insertions, 11 deletions
diff --git a/drivers/atm/fore200e.c b/drivers/atm/fore200e.c
index a7c0ed3107e3..405ee5e09221 100644
--- a/drivers/atm/fore200e.c
+++ b/drivers/atm/fore200e.c
@@ -1,6 +1,4 @@
1/* 1/*
2 $Id: fore200e.c,v 1.5 2000/04/14 10:10:34 davem Exp $
3
4 A FORE Systems 200E-series driver for ATM on Linux. 2 A FORE Systems 200E-series driver for ATM on Linux.
5 Christophe Lizzi (lizzi@cnam.fr), October 1999-March 2003. 3 Christophe Lizzi (lizzi@cnam.fr), October 1999-March 2003.
6 4
@@ -1502,9 +1500,9 @@ fore200e_open(struct atm_vcc *vcc)
1502 /* pseudo-CBR bandwidth requested? */ 1500 /* pseudo-CBR bandwidth requested? */
1503 if ((vcc->qos.txtp.traffic_class == ATM_CBR) && (vcc->qos.txtp.max_pcr > 0)) { 1501 if ((vcc->qos.txtp.traffic_class == ATM_CBR) && (vcc->qos.txtp.max_pcr > 0)) {
1504 1502
1505 down(&fore200e->rate_sf); 1503 mutex_lock(&fore200e->rate_mtx);
1506 if (fore200e->available_cell_rate < vcc->qos.txtp.max_pcr) { 1504 if (fore200e->available_cell_rate < vcc->qos.txtp.max_pcr) {
1507 up(&fore200e->rate_sf); 1505 mutex_unlock(&fore200e->rate_mtx);
1508 1506
1509 kfree(fore200e_vcc); 1507 kfree(fore200e_vcc);
1510 vc_map->vcc = NULL; 1508 vc_map->vcc = NULL;
@@ -1513,7 +1511,7 @@ fore200e_open(struct atm_vcc *vcc)
1513 1511
1514 /* reserve bandwidth */ 1512 /* reserve bandwidth */
1515 fore200e->available_cell_rate -= vcc->qos.txtp.max_pcr; 1513 fore200e->available_cell_rate -= vcc->qos.txtp.max_pcr;
1516 up(&fore200e->rate_sf); 1514 mutex_unlock(&fore200e->rate_mtx);
1517 } 1515 }
1518 1516
1519 vcc->itf = vcc->dev->number; 1517 vcc->itf = vcc->dev->number;
@@ -1599,9 +1597,9 @@ fore200e_close(struct atm_vcc* vcc)
1599 /* release reserved bandwidth, if any */ 1597 /* release reserved bandwidth, if any */
1600 if ((vcc->qos.txtp.traffic_class == ATM_CBR) && (vcc->qos.txtp.max_pcr > 0)) { 1598 if ((vcc->qos.txtp.traffic_class == ATM_CBR) && (vcc->qos.txtp.max_pcr > 0)) {
1601 1599
1602 down(&fore200e->rate_sf); 1600 mutex_lock(&fore200e->rate_mtx);
1603 fore200e->available_cell_rate += vcc->qos.txtp.max_pcr; 1601 fore200e->available_cell_rate += vcc->qos.txtp.max_pcr;
1604 up(&fore200e->rate_sf); 1602 mutex_unlock(&fore200e->rate_mtx);
1605 1603
1606 clear_bit(ATM_VF_HASQOS, &vcc->flags); 1604 clear_bit(ATM_VF_HASQOS, &vcc->flags);
1607 } 1605 }
@@ -2064,16 +2062,16 @@ fore200e_change_qos(struct atm_vcc* vcc,struct atm_qos* qos, int flags)
2064 2062
2065 if ((qos->txtp.traffic_class == ATM_CBR) && (qos->txtp.max_pcr > 0)) { 2063 if ((qos->txtp.traffic_class == ATM_CBR) && (qos->txtp.max_pcr > 0)) {
2066 2064
2067 down(&fore200e->rate_sf); 2065 mutex_lock(&fore200e->rate_mtx);
2068 if (fore200e->available_cell_rate + vcc->qos.txtp.max_pcr < qos->txtp.max_pcr) { 2066 if (fore200e->available_cell_rate + vcc->qos.txtp.max_pcr < qos->txtp.max_pcr) {
2069 up(&fore200e->rate_sf); 2067 mutex_unlock(&fore200e->rate_mtx);
2070 return -EAGAIN; 2068 return -EAGAIN;
2071 } 2069 }
2072 2070
2073 fore200e->available_cell_rate += vcc->qos.txtp.max_pcr; 2071 fore200e->available_cell_rate += vcc->qos.txtp.max_pcr;
2074 fore200e->available_cell_rate -= qos->txtp.max_pcr; 2072 fore200e->available_cell_rate -= qos->txtp.max_pcr;
2075 2073
2076 up(&fore200e->rate_sf); 2074 mutex_unlock(&fore200e->rate_mtx);
2077 2075
2078 memcpy(&vcc->qos, qos, sizeof(struct atm_qos)); 2076 memcpy(&vcc->qos, qos, sizeof(struct atm_qos));
2079 2077
@@ -2459,7 +2457,7 @@ fore200e_initialize(struct fore200e* fore200e)
2459 2457
2460 DPRINTK(2, "device %s being initialized\n", fore200e->name); 2458 DPRINTK(2, "device %s being initialized\n", fore200e->name);
2461 2459
2462 init_MUTEX(&fore200e->rate_sf); 2460 mutex_init(&fore200e->rate_mtx);
2463 spin_lock_init(&fore200e->q_lock); 2461 spin_lock_init(&fore200e->q_lock);
2464 2462
2465 cpq = fore200e->cp_queues = fore200e->virt_base + FORE200E_CP_QUEUES_OFFSET; 2463 cpq = fore200e->cp_queues = fore200e->virt_base + FORE200E_CP_QUEUES_OFFSET;