patch-2.4.22 linux-2.4.22/drivers/atm/eni.c
Next file: linux-2.4.22/drivers/atm/fore200e.c
Previous file: linux-2.4.22/drivers/atm/atmtcp.c
Back to the patch index
Back to the overall index
- Lines: 111
- Date:
2003-08-25 04:44:41.000000000 -0700
- Orig file:
linux-2.4.21/drivers/atm/eni.c
- Orig date:
2001-12-21 09:41:53.000000000 -0800
diff -urN linux-2.4.21/drivers/atm/eni.c linux-2.4.22/drivers/atm/eni.c
@@ -1101,9 +1101,9 @@
dma_rd = eni_in(MID_DMA_RD_TX);
dma_size = 3; /* JK for descriptor and final fill, plus final size
mis-alignment fix */
-DPRINTK("iovcnt = %d\n",ATM_SKB(skb)->iovcnt);
- if (!ATM_SKB(skb)->iovcnt) dma_size += 5;
- else dma_size += 5*ATM_SKB(skb)->iovcnt;
+DPRINTK("iovcnt = %d\n",skb_shinfo(skb)->nr_frags);
+ if (!skb_shinfo(skb)->nr_frags) dma_size += 5;
+ else dma_size += 5*(skb_shinfo(skb)->nr_frags+1);
if (dma_size > TX_DMA_BUF) {
printk(KERN_CRIT DEV_LABEL "(itf %d): needs %d DMA entries "
"(got only %d)\n",vcc->dev->number,dma_size,TX_DMA_BUF);
@@ -1124,15 +1124,20 @@
MID_DMA_COUNT_SHIFT) | (tx->index << MID_DMA_CHAN_SHIFT) |
MID_DT_JK;
j++;
- if (!ATM_SKB(skb)->iovcnt)
+ if (!skb_shinfo(skb)->nr_frags)
if (aal5) put_dma(tx->index,eni_dev->dma,&j,paddr,skb->len);
else put_dma(tx->index,eni_dev->dma,&j,paddr+4,skb->len-4);
else {
DPRINTK("doing direct send\n"); /* @@@ well, this doesn't work anyway */
- for (i = 0; i < ATM_SKB(skb)->iovcnt; i++)
- put_dma(tx->index,eni_dev->dma,&j,(unsigned long)
- ((struct iovec *) skb->data)[i].iov_base,
- ((struct iovec *) skb->data)[i].iov_len);
+ for (i = -1; i < skb_shinfo(skb)->nr_frags; i++)
+ if (i == -1)
+ put_dma(tx->index,eni_dev->dma,&j,(unsigned long)
+ skb->data,
+ skb->len - skb->data_len);
+ else
+ put_dma(tx->index,eni_dev->dma,&j,(unsigned long)
+ skb_shinfo(skb)->frags[i].page + skb_shinfo(skb)->frags[i].page_offset,
+ skb_shinfo(skb)->frags[i].size);
}
if (skb->len & 3)
put_dma(tx->index,eni_dev->dma,&j,zeroes,4-(skb->len & 3));
@@ -1882,8 +1887,10 @@
static int get_ci(struct atm_vcc *vcc,short *vpi,int *vci)
{
+ unsigned long flags;
struct atm_vcc *walk;
+ spin_lock_irqsave(&vcc->dev->lock, flags);
if (*vpi == ATM_VPI_ANY) *vpi = 0;
if (*vci == ATM_VCI_ANY) {
for (*vci = ATM_NOT_RSV_VCI; *vci < NR_VCI; (*vci)++) {
@@ -1902,17 +1909,29 @@
}
break;
}
+ spin_unlock_irqrestore(&vcc->dev->lock, flags);
return *vci == NR_VCI ? -EADDRINUSE : 0;
}
- if (*vci == ATM_VCI_UNSPEC) return 0;
+ if (*vci == ATM_VCI_UNSPEC) {
+ spin_unlock_irqrestore(&vcc->dev->lock, flags);
+ return 0;
+ }
if (vcc->qos.rxtp.traffic_class != ATM_NONE &&
- ENI_DEV(vcc->dev)->rx_map[*vci])
+ ENI_DEV(vcc->dev)->rx_map[*vci]) {
+ spin_unlock_irqrestore(&vcc->dev->lock, flags);
return -EADDRINUSE;
- if (vcc->qos.txtp.traffic_class == ATM_NONE) return 0;
+ }
+ if (vcc->qos.txtp.traffic_class == ATM_NONE) {
+ spin_unlock_irqrestore(&vcc->dev->lock, flags);
+ return 0;
+ }
for (walk = vcc->dev->vccs; walk; walk = walk->next)
if (test_bit(ATM_VF_ADDR,&walk->flags) && walk->vci == *vci &&
- walk->qos.txtp.traffic_class != ATM_NONE)
+ walk->qos.txtp.traffic_class != ATM_NONE) {
+ spin_unlock_irqrestore(&vcc->dev->lock, flags);
return -EADDRINUSE;
+ }
+ spin_unlock_irqrestore(&vcc->dev->lock, flags);
return 0;
}
@@ -2120,6 +2139,7 @@
static int eni_proc_read(struct atm_dev *dev,loff_t *pos,char *page)
{
+ unsigned long flags;
static const char *signal[] = { "LOST","unknown","okay" };
struct eni_dev *eni_dev = ENI_DEV(dev);
struct atm_vcc *vcc;
@@ -2192,6 +2212,7 @@
return sprintf(page,"%10sbacklog %u packets\n","",
skb_queue_len(&tx->backlog));
}
+ spin_lock_irqsave(&dev->lock, flags);
for (vcc = dev->vccs; vcc; vcc = vcc->next) {
struct eni_vcc *eni_vcc = ENI_VCC(vcc);
int length;
@@ -2210,8 +2231,10 @@
length += sprintf(page+length,"tx[%d], txing %d bytes",
eni_vcc->tx->index,eni_vcc->txing);
page[length] = '\n';
+ spin_unlock_irqrestore(&dev->lock, flags);
return length+1;
}
+ spin_unlock_irqrestore(&dev->lock, flags);
for (i = 0; i < eni_dev->free_len; i++) {
struct eni_free *fe = eni_dev->free_list+i;
unsigned long offset;
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)