2002-11-01 02:11:08

by Paulo Andre'

[permalink] [raw]
Subject: [PATCH] Make 3c505.c use spinlocks instead of cli/sti

Hi,

This patch does some cleanup on the 3c505.c driver by making use of
spinlocks instead of the deprecated cli()/sti() scheme. Note that even
though it compiles fine, I don't have the specific hardware to test
this.

Patch is against 2.5.45.

-- Paulo Andre'

PS - This is my first patch ever. I'm scared. I'm shaking. Take that
into account, please.



--- drivers/net/3c505.c.orig 2002-10-31 00:33:46.000000000 +0000
+++ drivers/net/3c505.c 2002-10-31 00:55:35.000000000 +0000
@@ -274,9 +274,12 @@

static inline void set_hsf(struct net_device *dev, int hsf)
{
- cli();
+ elp_device *adapter = dev->priv;
+ unsigned long flags;
+
+ spin_lock_irqsave(&adapter->lock, flags);
outb_control((HCR_VAL(dev) & ~HSF_PCB_MASK) | hsf, dev);
- sti();
+ spin_unlock_irqrestore(&adapter->lock, flags);
}

static int start_receive(struct net_device *, pcb_struct *);
@@ -325,8 +328,7 @@
if (adapter->dmaing && time_after(jiffies, adapter->current_dma.start_time + 10)) {
unsigned long flags, f;
printk("%s: DMA %s timed out, %d bytes left\n", dev->name, adapter->current_dma.direction ? "download" : "upload", get_dma_residue(dev->dma));
- save_flags(flags);
- cli();
+ spin_lock_irqsave(&adapter->lock, flags);
adapter->dmaing = 0;
adapter->busy = 0;

@@ -337,7 +339,7 @@
if (adapter->rx_active)
adapter->rx_active--;
outb_control(adapter->hcr_val & ~(DMAE | TCEN | DIR), dev);
- restore_flags(flags);
+ spin_unlock_irqrestore(&adapter->lock, flags);
}
}

@@ -405,6 +407,7 @@
int i;
int timeout;
elp_device *adapter = dev->priv;
+ unsigned long flags;

check_3c505_dma(dev);

@@ -428,7 +431,7 @@
if (send_pcb_slow(dev->base_addr, pcb->command))
goto abort;

- cli();
+ spin_lock_irqsave(&adapter->lock, flags);

if (send_pcb_fast(dev->base_addr, pcb->length))
goto sti_abort;
@@ -442,7 +445,7 @@
outb_command(2 + pcb->length, dev->base_addr);

/* now wait for the acknowledgement */
- sti();
+ spin_unlock_irqrestore(&adapter->lock, flags);

for (timeout = jiffies + 5*HZ/100; time_before(jiffies, timeout);) {
switch (GET_ASF(dev->base_addr)) {
@@ -463,7 +466,7 @@
printk("%s: timeout waiting for PCB acknowledge (status %02x)\n", dev->name, inb_status(dev->base_addr));

sti_abort:
- sti();
+ spin_unlock_irqrestore(&adapter->lock, flags);
abort:
adapter->send_pcb_semaphore = 0;
return FALSE;
@@ -489,6 +492,7 @@
int total_length;
int stat;
int timeout;
+ unsigned long flags;

elp_device *adapter = dev->priv;

@@ -519,7 +523,7 @@
return FALSE;
}
/* read the data */
- cli();
+ spin_lock_irqsave(&adapter->lock, flags);
i = 0;
do {
j = 0;
@@ -528,7 +532,7 @@
if (i > MAX_PCB_DATA)
INVALID_PCB_MSG(i);
} while ((stat & ASF_PCB_MASK) != ASF_PCB_END && j < 20000);
- sti();
+ spin_unlock_irqrestore(&adapter->lock, flags);
if (j >= 20000) {
TIMEOUT_MSG(__LINE__);
return FALSE;


2002-11-01 08:28:23

by Greg KH

[permalink] [raw]
Subject: Re: [PATCH] Make 3c505.c use spinlocks instead of cli/sti

On Thu, Oct 31, 2002 at 02:15:58AM +0000, Paulo Andre' wrote:
> Hi,
>
> This patch does some cleanup on the 3c505.c driver by making use of
> spinlocks instead of the deprecated cli()/sti() scheme. Note that even
> though it compiles fine, I don't have the specific hardware to test
> this.
>
> Patch is against 2.5.45.

The patch looks sane at first glance. I think I have one of these cards
around at work, and if I find it I'll try this patch out tomorrow.

thanks,

greg k-h