* Re: [Linux-ATM-General] Re: [atmdrvr zatm] Remove obsolete EXACT_TS support
[not found] <20030730225741.GA57991@gaz.sfgoth.com>
@ 2003-07-31 14:23 ` chas williams
2003-08-03 1:33 ` David S. Miller
0 siblings, 1 reply; 2+ messages in thread
From: chas williams @ 2003-07-31 14:23 UTC (permalink / raw)
To: Mitchell Blank Jr; +Cc: davem, netdev
please apply to 2.6. zatm will now compile on smp. it might
actually work if someone had some hardware to test it.
[atm]: [zatm] convert cli() to spinlock
# This is a BitKeeper generated patch for the following project:
# Project Name: Linux kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher.
# This patch includes the following deltas:
# ChangeSet 1.1597 -> 1.1598
# drivers/atm/zatm.c 1.13 -> 1.14
# drivers/atm/uPD98402.c 1.4 -> 1.5
# drivers/atm/zatm.h 1.2 -> 1.3
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 03/07/31 chas@relax.cmf.nrl.navy.mil 1.1598
# [zatm] convert cli() to spinlock
# --------------------------------------------
#
diff -Nru a/drivers/atm/uPD98402.c b/drivers/atm/uPD98402.c
--- a/drivers/atm/uPD98402.c Thu Jul 31 10:25:25 2003
+++ b/drivers/atm/uPD98402.c Thu Jul 31 10:25:25 2003
@@ -27,6 +27,7 @@
struct k_sonet_stats sonet_stats;/* link diagnostics */
unsigned char framing; /* SONET/SDH framing */
int loop_mode; /* loopback mode */
+ spinlock_t lock;
};
@@ -71,14 +72,13 @@
default:
return -EINVAL;
}
- save_flags(flags);
- cli();
+ spin_lock_irqsave(&PRIV(dev)->lock, flags);
PUT(set[0],C11T);
PUT(set[1],C12T);
PUT(set[2],C13T);
PUT((GET(MDR) & ~uPD98402_MDR_SS_MASK) | (set[3] <<
uPD98402_MDR_SS_SHIFT),MDR);
- restore_flags(flags);
+ spin_unlock_irqrestore(&PRIV(dev)->lock, flags);
return 0;
}
@@ -88,12 +88,11 @@
unsigned long flags;
unsigned char s[3];
- save_flags(flags);
- cli();
+ spin_lock_irqsave(&PRIV(dev)->lock, flags);
s[0] = GET(C11R);
s[1] = GET(C12R);
s[2] = GET(C13R);
- restore_flags(flags);
+ spin_unlock_irqrestore(&PRIV(dev)->lock, flags);
return (put_user(s[0], arg) || put_user(s[1], arg+1) ||
put_user(s[2], arg+2) || put_user(0xff, arg+3) ||
put_user(0xff, arg+4) || put_user(0xff, arg+5)) ? -EFAULT : 0;
@@ -214,6 +213,7 @@
DPRINTK("phy_start\n");
if (!(PRIV(dev) = kmalloc(sizeof(struct uPD98402_priv),GFP_KERNEL)))
return -ENOMEM;
+ spin_lock_init(&PRIV(dev)->lock);
memset(&PRIV(dev)->sonet_stats,0,sizeof(struct k_sonet_stats));
(void) GET(PCR); /* clear performance events */
PUT(uPD98402_PFM_FJ,PCMR); /* ignore frequency adj */
diff -Nru a/drivers/atm/zatm.c b/drivers/atm/zatm.c
--- a/drivers/atm/zatm.c Thu Jul 31 10:25:25 2003
+++ b/drivers/atm/zatm.c Thu Jul 31 10:25:25 2003
@@ -195,11 +195,10 @@
sizeof(struct rx_buffer_head);
}
size += align;
- save_flags(flags);
- cli();
+ spin_lock_irqsave(&zatm_dev->lock, flags);
free = zpeekl(zatm_dev,zatm_dev->pool_base+2*pool) &
uPD98401_RXFP_REMAIN;
- restore_flags(flags);
+ spin_unlock_irqrestore(&zatm_dev->lock, flags);
if (free >= zatm_dev->pool_info[pool].low_water) return;
EVENT("starting ... POOL: 0x%x, 0x%x\n",
zpeekl(zatm_dev,zatm_dev->pool_base+2*pool),
@@ -228,22 +227,22 @@
head->skb = skb;
EVENT("enq skb 0x%08lx/0x%08lx\n",(unsigned long) skb,
(unsigned long) head);
- cli();
+ spin_lock_irqsave(&zatm_dev->lock, flags);
if (zatm_dev->last_free[pool])
((struct rx_buffer_head *) (zatm_dev->last_free[pool]->
data))[-1].link = virt_to_bus(head);
zatm_dev->last_free[pool] = skb;
skb_queue_tail(&zatm_dev->pool[pool],skb);
- restore_flags(flags);
+ spin_unlock_irqrestore(&zatm_dev->lock, flags);
free++;
}
if (first) {
- cli();
+ spin_lock_irqsave(&zatm_dev->lock, flags);
zwait;
zout(virt_to_bus(first),CER);
zout(uPD98401_ADD_BAT | (pool << uPD98401_POOL_SHIFT) | count,
CMR);
- restore_flags(flags);
+ spin_unlock_irqrestore(&zatm_dev->lock, flags);
EVENT ("POOL: 0x%x, 0x%x\n",
zpeekl(zatm_dev,zatm_dev->pool_base+2*pool),
zpeekl(zatm_dev,zatm_dev->pool_base+2*pool+1));
@@ -286,8 +285,7 @@
size = pool-ZATM_AAL5_POOL_BASE;
if (size < 0) size = 0; /* 64B... */
else if (size > 10) size = 10; /* ... 64kB */
- save_flags(flags);
- cli();
+ spin_lock_irqsave(&zatm_dev->lock, flags);
zpokel(zatm_dev,((zatm_dev->pool_info[pool].low_water/4) <<
uPD98401_RXFP_ALERT_SHIFT) |
(1 << uPD98401_RXFP_BTSZ_SHIFT) |
@@ -295,7 +293,7 @@
zatm_dev->pool_base+pool*2);
zpokel(zatm_dev,(unsigned long) dummy,zatm_dev->pool_base+
pool*2+1);
- restore_flags(flags);
+ spin_unlock_irqrestore(&zatm_dev->lock, flags);
zatm_dev->last_free[pool] = NULL;
refill_pool(dev,pool);
}
@@ -315,29 +313,29 @@
{
struct zatm_pool_info *pool;
unsigned long offset,flags;
+ struct zatm_dev *zatm_dev = ZATM_DEV(vcc->dev);
DPRINTK("start 0x%08lx dest 0x%08lx len %d\n",start,dest,len);
if (len < PAGE_SIZE) return;
- pool = &ZATM_DEV(vcc->dev)->pool_info[ZATM_VCC(vcc)->pool];
+ pool = &zatm_dev->pool_info[ZATM_VCC(vcc)->pool];
offset = (dest-start) & (PAGE_SIZE-1);
- save_flags(flags);
- cli();
+ spin_lock_irqsave(&zatm_dev->lock, flags);
if (!offset || pool->offset == offset) {
pool->next_cnt = 0;
- restore_flags(flags);
+ spin_unlock_irqrestore(&zatm_dev->lock, flags);
return;
}
if (offset != pool->next_off) {
pool->next_off = offset;
pool->next_cnt = 0;
- restore_flags(flags);
+ spin_unlock_irqrestore(&zatm_dev->lock, flags);
return;
}
if (++pool->next_cnt >= pool->next_thres) {
pool->offset = pool->next_off;
pool->next_cnt = 0;
}
- restore_flags(flags);
+ spin_unlock_irqrestore(&zatm_dev->lock, flags);
}
/*----------------------------------- RX ------------------------------------*/
@@ -535,20 +533,19 @@
zatm_vcc->pool = ZATM_AAL0_POOL;
}
if (zatm_vcc->pool < 0) return -EMSGSIZE;
- save_flags(flags);
- cli();
+ spin_lock_irqsave(&zatm_dev->lock, flags);
zwait;
zout(uPD98401_OPEN_CHAN,CMR);
zwait;
DPRINTK("0x%x 0x%x\n",zin(CMR),zin(CER));
chan = (zin(CMR) & uPD98401_CHAN_ADDR) >> uPD98401_CHAN_ADDR_SHIFT;
- restore_flags(flags);
+ spin_unlock_irqrestore(&zatm_dev->lock, flags);
DPRINTK("chan is %d\n",chan);
if (!chan) return -EAGAIN;
use_pool(vcc->dev,zatm_vcc->pool);
DPRINTK("pool %d\n",zatm_vcc->pool);
/* set up VC descriptor */
- cli();
+ spin_lock_irqsave(&zatm_dev->lock, flags);
zpokel(zatm_dev,zatm_vcc->pool << uPD98401_RXVC_POOL_SHIFT,
chan*VC_SIZE/4);
zpokel(zatm_dev,uPD98401_RXVC_OD | (vcc->qos.aal == ATM_AAL5 ?
@@ -556,7 +553,7 @@
zpokel(zatm_dev,0,chan*VC_SIZE/4+2);
zatm_vcc->rx_chan = chan;
zatm_dev->rx_map[chan] = vcc;
- restore_flags(flags);
+ spin_unlock_irqrestore(&zatm_dev->lock, flags);
return 0;
}
@@ -572,14 +569,13 @@
zatm_dev = ZATM_DEV(vcc->dev);
zatm_vcc = ZATM_VCC(vcc);
if (!zatm_vcc->rx_chan) return 0;
- save_flags(flags);
- cli();
+ spin_lock_irqsave(&zatm_dev->lock, flags);
/* should also handle VPI @@@ */
pos = vcc->vci >> 1;
shift = (1-(vcc->vci & 1)) << 4;
zpokel(zatm_dev,(zpeekl(zatm_dev,pos) & ~(0xffff << shift)) |
((zatm_vcc->rx_chan | uPD98401_RXLT_ENBL) << shift),pos);
- restore_flags(flags);
+ spin_unlock_irqrestore(&zatm_dev->lock, flags);
return 0;
}
@@ -596,9 +592,8 @@
if (!zatm_vcc->rx_chan) return;
DPRINTK("close_rx\n");
/* disable receiver */
- save_flags(flags);
if (vcc->vpi != ATM_VPI_UNSPEC && vcc->vci != ATM_VCI_UNSPEC) {
- cli();
+ spin_lock_irqsave(&zatm_dev->lock, flags);
pos = vcc->vci >> 1;
shift = (1-(vcc->vci & 1)) << 4;
zpokel(zatm_dev,zpeekl(zatm_dev,pos) & ~(0xffff << shift),pos);
@@ -606,9 +601,9 @@
zout(uPD98401_NOP,CMR);
zwait;
zout(uPD98401_NOP,CMR);
- restore_flags(flags);
+ spin_unlock_irqrestore(&zatm_dev->lock, flags);
}
- cli();
+ spin_lock_irqsave(&zatm_dev->lock, flags);
zwait;
zout(uPD98401_DEACT_CHAN | uPD98401_CHAN_RT | (zatm_vcc->rx_chan <<
uPD98401_CHAN_ADDR_SHIFT),CMR);
@@ -620,7 +615,7 @@
if (!(zin(CMR) & uPD98401_CHAN_ADDR))
printk(KERN_CRIT DEV_LABEL "(itf %d): can't close RX channel "
"%d\n",vcc->dev->number,zatm_vcc->rx_chan);
- restore_flags(flags);
+ spin_unlock_irqrestore(&zatm_dev->lock, flags);
zatm_dev->rx_map[zatm_vcc->rx_chan] = NULL;
zatm_vcc->rx_chan = 0;
unuse_pool(vcc->dev,zatm_vcc->pool);
@@ -673,11 +668,10 @@
zatm_dev = ZATM_DEV(vcc->dev);
zatm_vcc = ZATM_VCC(vcc);
EVENT("iovcnt=%d\n",skb_shinfo(skb)->nr_frags,0);
- save_flags(flags);
- cli();
+ spin_lock_irqsave(&zatm_dev->lock, flags);
if (!skb_shinfo(skb)->nr_frags) {
if (zatm_vcc->txing == RING_ENTRIES-1) {
- restore_flags(flags);
+ spin_unlock_irqrestore(&zatm_dev->lock, flags);
return RING_BUSY;
}
zatm_vcc->txing++;
@@ -732,7 +726,7 @@
zwait;
zout(uPD98401_TX_READY | (zatm_vcc->tx_chan <<
uPD98401_CHAN_ADDR_SHIFT),CMR);
- restore_flags(flags);
+ spin_unlock_irqrestore(&zatm_dev->lock, flags);
EVENT("done\n",0,0);
return 0;
}
@@ -866,15 +860,14 @@
if (zatm_dev->tx_bw < *pcr) return -EAGAIN;
zatm_dev->tx_bw -= *pcr;
}
- save_flags(flags);
- cli();
+ spin_lock_irqsave(&zatm_dev->lock, flags);
DPRINTK("i = %d, m = %d, PCR = %d\n",i,m,*pcr);
zpokel(zatm_dev,(i << uPD98401_IM_I_SHIFT) | m,uPD98401_IM(shaper));
zpokel(zatm_dev,c << uPD98401_PC_C_SHIFT,uPD98401_PC(shaper));
zpokel(zatm_dev,0,uPD98401_X(shaper));
zpokel(zatm_dev,0,uPD98401_Y(shaper));
zpokel(zatm_dev,uPD98401_PS_E,uPD98401_PS(shaper));
- restore_flags(flags);
+ spin_unlock_irqrestore(&zatm_dev->lock, flags);
return shaper;
}
@@ -889,11 +882,10 @@
if (--zatm_dev->ubr_ref_cnt) return;
zatm_dev->ubr = -1;
}
- save_flags(flags);
- cli();
+ spin_lock_irqsave(&zatm_dev->lock, flags);
zpokel(zatm_dev,zpeekl(zatm_dev,uPD98401_PS(shaper)) & ~uPD98401_PS_E,
uPD98401_PS(shaper));
- restore_flags(flags);
+ spin_unlock_irqrestore(&zatm_dev->lock, flags);
zatm_dev->free_shapers |= 1 << shaper;
}
@@ -912,8 +904,6 @@
chan = zatm_vcc->tx_chan;
if (!chan) return;
DPRINTK("close_tx\n");
- save_flags(flags);
- cli();
while (skb_peek(&zatm_vcc->backlog)) {
if (once) {
printk("waiting for backlog to drain ...\n");
@@ -932,6 +922,7 @@
DPRINTK("waiting for TX queue to drain ... %p\n",skb);
sleep_on(&zatm_vcc->tx_wait);
}
+ spin_lock_irqsave(&zatm_dev->lock, flags);
#if 0
zwait;
zout(uPD98401_DEACT_CHAN | (chan << uPD98401_CHAN_ADDR_SHIFT),CMR);
@@ -942,7 +933,7 @@
if (!(zin(CMR) & uPD98401_CHAN_ADDR))
printk(KERN_CRIT DEV_LABEL "(itf %d): can't close TX channel "
"%d\n",vcc->dev->number,chan);
- restore_flags(flags);
+ spin_unlock_irqrestore(&zatm_dev->lock, flags);
zatm_vcc->tx_chan = 0;
zatm_dev->tx_map[chan] = NULL;
if (zatm_vcc->shaper != zatm_dev->ubr) {
@@ -967,14 +958,13 @@
zatm_vcc = ZATM_VCC(vcc);
zatm_vcc->tx_chan = 0;
if (vcc->qos.txtp.traffic_class == ATM_NONE) return 0;
- save_flags(flags);
- cli();
+ spin_lock_irqsave(&zatm_dev->lock, flags);
zwait;
zout(uPD98401_OPEN_CHAN,CMR);
zwait;
DPRINTK("0x%x 0x%x\n",zin(CMR),zin(CER));
chan = (zin(CMR) & uPD98401_CHAN_ADDR) >> uPD98401_CHAN_ADDR_SHIFT;
- restore_flags(flags);
+ spin_unlock_irqrestore(&zatm_dev->lock, flags);
DPRINTK("chan is %d\n",chan);
if (!chan) return -EAGAIN;
unlimited = vcc->qos.txtp.traffic_class == ATM_UBR &&
@@ -1022,15 +1012,14 @@
zatm_dev = ZATM_DEV(vcc->dev);
zatm_vcc = ZATM_VCC(vcc);
if (!zatm_vcc->tx_chan) return 0;
- save_flags(flags);
/* set up VC descriptor */
- cli();
+ spin_lock_irqsave(&zatm_dev->lock, flags);
zpokel(zatm_dev,0,zatm_vcc->tx_chan*VC_SIZE/4);
zpokel(zatm_dev,uPD98401_TXVC_L | (zatm_vcc->shaper <<
uPD98401_TXVC_SHP_SHIFT) | (vcc->vpi << uPD98401_TXVC_VPI_SHIFT) |
vcc->vci,zatm_vcc->tx_chan*VC_SIZE/4+1);
zpokel(zatm_dev,0,zatm_vcc->tx_chan*VC_SIZE/4+2);
- restore_flags(flags);
+ spin_unlock_irqrestore(&zatm_dev->lock, flags);
zatm_dev->tx_map[zatm_vcc->tx_chan] = vcc;
return 0;
}
@@ -1236,6 +1225,7 @@
DPRINTK(">zatm_init\n");
zatm_dev = ZATM_DEV(dev);
+ spin_lock_init(&zatm_dev->lock);
pci_dev = zatm_dev->pci_dev;
zatm_dev->base = pci_resource_start(pci_dev, 0);
zatm_dev->irq = pci_dev->irq;
@@ -1285,14 +1275,13 @@
do {
unsigned long flags;
- save_flags(flags);
- cli();
+ spin_lock_irqsave(&zatm_dev->lock, flags);
t0 = zpeekl(zatm_dev,uPD98401_TSR);
udelay(10);
t1 = zpeekl(zatm_dev,uPD98401_TSR);
udelay(1010);
t2 = zpeekl(zatm_dev,uPD98401_TSR);
- restore_flags(flags);
+ spin_unlock_irqrestore(&zatm_dev->lock, flags);
}
while (t0 > t1 || t1 > t2); /* loop if wrapping ... */
zatm_dev->khz = t2-2*t1+t0;
@@ -1492,14 +1481,13 @@
return -EFAULT;
if (pool < 0 || pool > ZATM_LAST_POOL)
return -EINVAL;
- save_flags(flags);
- cli();
+ spin_lock_irqsave(&zatm_dev->lock, flags);
info = zatm_dev->pool_info[pool];
if (cmd == ZATM_GETPOOLZ) {
zatm_dev->pool_info[pool].rqa_count = 0;
zatm_dev->pool_info[pool].rqu_count = 0;
}
- restore_flags(flags);
+ spin_unlock_irqrestore(&zatm_dev->lock, flags);
return copy_to_user(
&((struct zatm_pool_req *) arg)->info,
&info,sizeof(info)) ? -EFAULT : 0;
@@ -1530,15 +1518,14 @@
if (info.low_water >= info.high_water ||
info.low_water < 0)
return -EINVAL;
- save_flags(flags);
- cli();
+ spin_lock_irqsave(&zatm_dev->lock, flags);
zatm_dev->pool_info[pool].low_water =
info.low_water;
zatm_dev->pool_info[pool].high_water =
info.high_water;
zatm_dev->pool_info[pool].next_thres =
info.next_thres;
- restore_flags(flags);
+ spin_unlock_irqrestore(&zatm_dev->lock, flags);
return 0;
}
default:
diff -Nru a/drivers/atm/zatm.h b/drivers/atm/zatm.h
--- a/drivers/atm/zatm.h Thu Jul 31 10:25:25 2003
+++ b/drivers/atm/zatm.h Thu Jul 31 10:25:25 2003
@@ -85,6 +85,7 @@
unsigned char irq; /* IRQ */
unsigned int base; /* IO base address */
struct pci_dev *pci_dev; /* PCI stuff */
+ spinlock_t lock;
};
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [Linux-ATM-General] Re: [atmdrvr zatm] Remove obsolete EXACT_TS support
2003-07-31 14:23 ` [Linux-ATM-General] Re: [atmdrvr zatm] Remove obsolete EXACT_TS support chas williams
@ 2003-08-03 1:33 ` David S. Miller
0 siblings, 0 replies; 2+ messages in thread
From: David S. Miller @ 2003-08-03 1:33 UTC (permalink / raw)
To: chas3; +Cc: chas, mitch, netdev
On Thu, 31 Jul 2003 10:23:58 -0400
chas williams <chas@cmf.nrl.navy.mil> wrote:
> please apply to 2.6. zatm will now compile on smp. it might
> actually work if someone had some hardware to test it.
Applied.
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2003-08-03 1:33 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20030730225741.GA57991@gaz.sfgoth.com>
2003-07-31 14:23 ` [Linux-ATM-General] Re: [atmdrvr zatm] Remove obsolete EXACT_TS support chas williams
2003-08-03 1:33 ` David S. Miller
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).