* [PATCH] (2/8) convert sdla to new initialization
@ 2003-09-03 23:49 Stephen Hemminger
2003-09-05 6:06 ` Christoph Hellwig
0 siblings, 1 reply; 3+ messages in thread
From: Stephen Hemminger @ 2003-09-03 23:49 UTC (permalink / raw)
To: David S. Miller, mike.mclagan, Jeff Garzik; +Cc: netdev
Based on Al viro's NE10-sdla
* switched sdla to dynamic allocation
* sdla: embedded ->priv
* sdla: fixed resource leaks on failure exits
Additionally fixes.
* get rid of cli/sti
* get rid of MOD/INC
Builds and probes, but don't have the hardware.
Driver has never built on 2.6 before this.
diff -Nru a/drivers/net/Space.c b/drivers/net/Space.c
--- a/drivers/net/Space.c Wed Sep 3 15:30:12 2003
+++ b/drivers/net/Space.c Wed Sep 3 15:30:12 2003
@@ -100,6 +100,9 @@
extern int mac8390_probe(struct net_device *dev);
extern int mac89x0_probe(struct net_device *dev);
extern int mc32_probe(struct net_device *dev);
+#ifdef CONFIG_SDLA
+extern struct net_device *sdla_init(void);
+#endif
/* Detachable devices ("pocket adaptors") */
extern int de620_probe(struct net_device *);
@@ -401,19 +404,11 @@
/* Statically configured drivers -- order matters here. */
void probe_old_netdevs(void)
{
-
-}
-
#ifdef CONFIG_SDLA
-extern int sdla_init(struct net_device *);
-static struct net_device sdla0_dev = {
- .name = "sdla0",
- .next = NEXT_DEV,
- .init = sdla_init,
-};
-#undef NEXT_DEV
-#define NEXT_DEV (&sdla0_dev)
+ sdla_init();
#endif
+
+}
#if defined(CONFIG_LTPC)
extern int ltpc_probe(struct net_device *);
diff -Nru a/drivers/net/wan/sdla.c b/drivers/net/wan/sdla.c
--- a/drivers/net/wan/sdla.c Wed Sep 3 15:30:12 2003
+++ b/drivers/net/wan/sdla.c Wed Sep 3 15:30:12 2003
@@ -71,6 +71,8 @@
0xD0000, 0xD2000, 0xD4000, 0xD6000, 0xD8000, 0xDA000, 0xDC000, 0xDE000,
0xE0000, 0xE2000, 0xE4000, 0xE6000, 0xE8000, 0xEA000, 0xEC000, 0xEE000};
+static spinlock_t sdla_lock = SPIN_LOCK_UNLOCKED;
+
/*********************************************************
*
* these are the core routines that access the card itself
@@ -79,10 +81,10 @@
#define SDLA_WINDOW(dev,addr) outb((((addr) >> 13) & 0x1F), (dev)->base_addr + SDLA_REG_Z80_WINDOW)
-static void sdla_read(struct net_device *dev, int addr, void *buf, short len)
+static void __sdla_read(struct net_device *dev, int addr, void *buf, short len)
{
- unsigned long flags;
- char *temp, *base;
+ char *temp;
+ const void *base;
int offset, bytes;
temp = buf;
@@ -90,13 +92,10 @@
{
offset = addr & SDLA_ADDR_MASK;
bytes = offset + len > SDLA_WINDOW_SIZE ? SDLA_WINDOW_SIZE - offset : len;
- base = (void *) (dev->mem_start + offset);
+ base = (const void *) (dev->mem_start + offset);
- save_flags(flags);
- cli();
SDLA_WINDOW(dev, addr);
memcpy(temp, base, bytes);
- restore_flags(flags);
addr += bytes;
temp += bytes;
@@ -104,10 +103,19 @@
}
}
-static void sdla_write(struct net_device *dev, int addr, void *buf, short len)
+static void sdla_read(struct net_device *dev, int addr, void *buf, short len)
{
unsigned long flags;
- char *temp, *base;
+ spin_lock_irqsave(&sdla_lock, flags);
+ __sdla_read(dev, addr, buf, len);
+ spin_unlock_irqrestore(&sdla_lock, flags);
+}
+
+static void __sdla_write(struct net_device *dev, int addr,
+ const void *buf, short len)
+{
+ const char *temp;
+ void *base;
int offset, bytes;
temp = buf;
@@ -116,17 +124,27 @@
offset = addr & SDLA_ADDR_MASK;
bytes = offset + len > SDLA_WINDOW_SIZE ? SDLA_WINDOW_SIZE - offset : len;
base = (void *) (dev->mem_start + offset);
- save_flags(flags);
- cli();
+
SDLA_WINDOW(dev, addr);
memcpy(base, temp, bytes);
- restore_flags(flags);
+
addr += bytes;
temp += bytes;
len -= bytes;
}
}
+static void sdla_write(struct net_device *dev, int addr,
+ const void *buf, short len)
+{
+ unsigned long flags;
+
+ spin_lock_irqsave(&sdla_lock, flags);
+ __sdla_write(dev, addr, buf, len);
+ spin_unlock_irqrestore(&sdla_lock, flags);
+}
+
+
static void sdla_clear(struct net_device *dev)
{
unsigned long flags;
@@ -138,8 +156,7 @@
bytes = SDLA_WINDOW_SIZE;
base = (void *) dev->mem_start;
- save_flags(flags);
- cli();
+ spin_lock_irqsave(&sdla_lock, flags);
while(len)
{
SDLA_WINDOW(dev, addr);
@@ -148,7 +165,8 @@
addr += bytes;
len -= bytes;
}
- restore_flags(flags);
+ spin_unlock_irqrestore(&sdla_lock, flags);
+
}
static char sdla_byte(struct net_device *dev, int addr)
@@ -158,11 +176,10 @@
temp = (void *) (dev->mem_start + (addr & SDLA_ADDR_MASK));
- save_flags(flags);
- cli();
+ spin_lock_irqsave(&sdla_lock, flags);
SDLA_WINDOW(dev, addr);
byte = *temp;
- restore_flags(flags);
+ spin_unlock_irqrestore(&sdla_lock, flags);
return(byte);
}
@@ -414,7 +431,8 @@
struct frad_local *flp;
struct sdla_cmd *cmd_buf;
unsigned long pflags;
- int jiffs, ret, waiting, len;
+ unsigned long jiffs;
+ int ret, waiting, len;
long window;
flp = dev->priv;
@@ -423,8 +441,8 @@
ret = 0;
len = 0;
jiffs = jiffies + HZ; /* 1 second is plenty */
- save_flags(pflags);
- cli();
+
+ spin_lock_irqsave(&sdla_lock, pflags);
SDLA_WINDOW(dev, window);
cmd_buf->cmd = cmd;
cmd_buf->dlci = dlci;
@@ -436,7 +454,7 @@
cmd_buf->length = inlen;
cmd_buf->opp_flag = 1;
- restore_flags(pflags);
+ spin_unlock_irqrestore(&sdla_lock, pflags);
waiting = 1;
len = 0;
@@ -444,18 +462,17 @@
{
if (waiting++ % 3)
{
- save_flags(pflags);
- cli();
+ spin_lock_irqsave(&sdla_lock, pflags);
SDLA_WINDOW(dev, window);
waiting = ((volatile int)(cmd_buf->opp_flag));
- restore_flags(pflags);
+ spin_unlock_irqrestore(&sdla_lock, pflags);
}
}
if (!waiting)
{
- save_flags(pflags);
- cli();
+
+ spin_lock_irqsave(&sdla_lock, pflags);
SDLA_WINDOW(dev, window);
ret = cmd_buf->retval;
len = cmd_buf->length;
@@ -471,7 +488,7 @@
if (ret)
memcpy(&status, cmd_buf->data, len > sizeof(status) ? sizeof(status) : len);
- restore_flags(pflags);
+ spin_unlock_irqrestore(&sdla_lock, pflags);
}
else
ret = SDLA_RET_TIMEOUT;
@@ -555,7 +572,6 @@
if (i == CONFIG_DLCI_MAX)
return(-EMLINK); /* #### Alan: Comments on this ?? */
- MOD_INC_USE_COUNT;
flp->master[i] = master;
flp->dlci[i] = -*(short *)(master->dev_addr);
@@ -588,7 +604,6 @@
flp->master[i] = NULL;
flp->dlci[i] = 0;
- MOD_DEC_USE_COUNT;
if (netif_running(slave)) {
if (flp->config.station == FRAD_STATION_CPE)
@@ -688,14 +703,14 @@
ret = sdla_cmd(dev, SDLA_INFORMATION_WRITE, *(short *)(skb->dev->dev_addr), 0, NULL, skb->len, &addr, &size);
if (ret == SDLA_RET_OK)
{
- save_flags(flags);
- cli();
+
+ spin_lock_irqsave(&sdla_lock, flags);
SDLA_WINDOW(dev, addr);
pbuf = (void *)(((int) dev->mem_start) + (addr & SDLA_ADDR_MASK));
- sdla_write(dev, pbuf->buf_addr, skb->data, skb->len);
- SDLA_WINDOW(dev, addr);
+ __sdla_write(dev, pbuf->buf_addr, skb->data, skb->len);
+ SDLA_WINDOW(dev, addr);
pbuf->opp_flag = 1;
- restore_flags(flags);
+ spin_unlock_irqrestore(&sdla_lock, flags);
}
break;
}
@@ -753,8 +768,7 @@
pbufi = NULL;
pbuf = NULL;
- save_flags(flags);
- cli();
+ spin_lock_irqsave(&sdla_lock, flags);
switch (flp->type)
{
@@ -821,7 +835,7 @@
case SDLA_S502A:
case SDLA_S502E:
if (success)
- sdla_read(dev, SDLA_502_RCV_BUF + SDLA_502_DATA_OFS, skb_put(skb,len), len);
+ __sdla_read(dev, SDLA_502_RCV_BUF + SDLA_502_DATA_OFS, skb_put(skb,len), len);
SDLA_WINDOW(dev, SDLA_502_RCV_BUF);
cmd->opp_flag = 0;
@@ -834,9 +848,9 @@
split = addr + len > buf_top + 1 ? len - (buf_top - addr + 1) : 0;
len2 = len - split;
- sdla_read(dev, addr, skb_put(skb, len2), len2);
+ __sdla_read(dev, addr, skb_put(skb, len2), len2);
if (split)
- sdla_read(dev, buf_base, skb_put(skb, split), split);
+ __sdla_read(dev, buf_base, skb_put(skb, split), split);
}
/* increment the buffer we're looking at */
@@ -853,7 +867,7 @@
(*dlp->receive)(skb, master);
}
- restore_flags(flags);
+ spin_unlock_irqrestore(&sdla_lock, flags);
}
static irqreturn_t sdla_isr(int irq, void *dev_id, struct pt_regs * regs)
@@ -979,8 +993,6 @@
netif_stop_queue(dev);
- MOD_DEC_USE_COUNT;
-
return(0);
}
@@ -1082,8 +1094,6 @@
netif_start_queue(dev);
- MOD_INC_USE_COUNT;
-
return(0);
}
@@ -1614,19 +1624,30 @@
return(&flp->stats);
}
-int __init sdla_init(struct net_device *dev)
+static void setup_sdla(struct net_device *dev)
{
+ dev->flags = 0;
+ dev->type = 0xFFFF;
+ dev->hard_header_len = 0;
+ dev->addr_len = 0;
+ dev->mtu = SDLA_MAX_MTU;
+}
+
+struct net_device * __init sdla_init(void)
+{
+ struct net_device *dev;
struct frad_local *flp;
+ int err = -ENOMEM;
- /* allocate the private data structure */
- flp = kmalloc(sizeof(struct frad_local), GFP_KERNEL);
- if (!flp)
- return(-ENOMEM);
+ dev = alloc_netdev(sizeof(struct frad_local), "sdla0", setup_sdla);
+ if (!dev)
+ goto out;
- memset(flp, 0, sizeof(struct frad_local));
- dev->priv = flp;
+ SET_MODULE_OWNER(dev);
+ netdev_boot_setup_check(dev);
+
+ flp = dev->priv;
- dev->flags = 0;
dev->open = sdla_open;
dev->stop = sdla_close;
dev->do_ioctl = sdla_ioctl;
@@ -1635,12 +1656,6 @@
dev->hard_start_xmit = sdla_transmit;
dev->change_mtu = sdla_change_mtu;
- dev->type = 0xFFFF;
- dev->hard_header_len = 0;
- dev->addr_len = 0;
- dev->mtu = SDLA_MAX_MTU;
- SET_MODULE_OWNER(dev);
-
flp->activate = sdla_activate;
flp->deactivate = sdla_deactivate;
flp->assoc = sdla_assoc;
@@ -1652,7 +1667,14 @@
flp->timer.data = (unsigned long) dev;
flp->timer.function = sdla_poll;
- return(0);
+ err = register_netdev(dev);
+ if (err)
+ goto out1;
+ return dev;
+out1:
+ kfree(dev);
+out:
+ return ERR_PTR(err);
}
int __init sdla_c_setup(void)
@@ -1663,10 +1685,7 @@
}
#ifdef MODULE
-static struct net_device sdla0 = {
- .name = "sdla0",
- .init = sdla_init
-};
+static struct net_device *sdla0;
#endif /* MODULE */
static int __init init_sdla(void)
@@ -1675,7 +1694,9 @@
sdla_c_setup();
#ifdef MODULE
- result = register_netdev(&sdla0);
+ sdla0 = sdla_init();
+ if (IS_ERR(sdla0))
+ result = PTR_ERR(sdla0);
#endif
return result;
}
@@ -1683,11 +1704,10 @@
static void __exit exit_sdla(void)
{
#ifdef MODULE
- unregister_netdev(&sdla0);
- if (sdla0.priv)
- kfree(sdla0.priv);
- if (sdla0.irq)
- free_irq(sdla0.irq, &sdla0);
+ unregister_netdev(sdla0);
+ if (sdla0->irq)
+ free_irq(sdla0->irq, sdla0);
+ free_netdev(sdla0);
#endif
}
^ permalink raw reply [flat|nested] 3+ messages in thread* Re: [PATCH] (2/8) convert sdla to new initialization
2003-09-03 23:49 [PATCH] (2/8) convert sdla to new initialization Stephen Hemminger
@ 2003-09-05 6:06 ` Christoph Hellwig
2003-09-05 9:50 ` David S. Miller
0 siblings, 1 reply; 3+ messages in thread
From: Christoph Hellwig @ 2003-09-05 6:06 UTC (permalink / raw)
To: Stephen Hemminger; +Cc: David S. Miller, mike.mclagan, Jeff Garzik, netdev
On Wed, Sep 03, 2003 at 04:49:25PM -0700, Stephen Hemminger wrote:
> extern int mac8390_probe(struct net_device *dev);
> extern int mac89x0_probe(struct net_device *dev);
> extern int mc32_probe(struct net_device *dev);
> +#ifdef CONFIG_SDLA
> +extern struct net_device *sdla_init(void);
> +#endif
Please don't add ifdefs around prototypes.
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] (2/8) convert sdla to new initialization
2003-09-05 6:06 ` Christoph Hellwig
@ 2003-09-05 9:50 ` David S. Miller
0 siblings, 0 replies; 3+ messages in thread
From: David S. Miller @ 2003-09-05 9:50 UTC (permalink / raw)
To: Christoph Hellwig; +Cc: shemminger, mike.mclagan, jgarzik, netdev
On Fri, 5 Sep 2003 07:06:19 +0100
Christoph Hellwig <hch@infradead.org> wrote:
> On Wed, Sep 03, 2003 at 04:49:25PM -0700, Stephen Hemminger wrote:
> > extern int mac8390_probe(struct net_device *dev);
> > extern int mac89x0_probe(struct net_device *dev);
> > extern int mc32_probe(struct net_device *dev);
> > +#ifdef CONFIG_SDLA
> > +extern struct net_device *sdla_init(void);
> > +#endif
>
> Please don't add ifdefs around prototypes.
I fixed this all up.
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2003-09-05 9:50 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-09-03 23:49 [PATCH] (2/8) convert sdla to new initialization Stephen Hemminger
2003-09-05 6:06 ` Christoph Hellwig
2003-09-05 9:50 ` 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).