X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fisdn%2Fpcbit%2Fdrv.c;h=11c1b0b6e390c1e6f0fd919eb5f4a06706cd2c79;hb=97bf2856c6014879bd04983a3e9dfcdac1e7fe85;hp=c3f43a56b6f70abf93372cd44d6016fc8e7cfa25;hpb=5273a3df6485dc2ad6aa7ddd441b9a21970f003b;p=linux-2.6.git diff --git a/drivers/isdn/pcbit/drv.c b/drivers/isdn/pcbit/drv.c index c3f43a56b..11c1b0b6e 100644 --- a/drivers/isdn/pcbit/drv.c +++ b/drivers/isdn/pcbit/drv.c @@ -56,10 +56,10 @@ static char* pcbit_devname[MAX_PCBIT_CARDS] = { * prototypes */ -int pcbit_command(isdn_ctrl* ctl); -int pcbit_stat(u_char* buf, int len, int user, int, int); -int pcbit_xmit(int driver, int chan, int ack, struct sk_buff *skb); -int pcbit_writecmd(const u_char*, int, int, int, int); +static int pcbit_command(isdn_ctrl* ctl); +static int pcbit_stat(u_char __user * buf, int len, int, int); +static int pcbit_xmit(int driver, int chan, int ack, struct sk_buff *skb); +static int pcbit_writecmd(const u_char __user *, int, int, int); static int set_protocol_running(struct pcbit_dev * dev); @@ -68,21 +68,18 @@ static void pcbit_set_msn(struct pcbit_dev *dev, char *list); static int pcbit_check_msn(struct pcbit_dev *dev, char *msn); -extern void pcbit_deliver(void * data); - int pcbit_init_dev(int board, int mem_base, int irq) { struct pcbit_dev *dev; isdn_if *dev_if; - if ((dev=kmalloc(sizeof(struct pcbit_dev), GFP_KERNEL)) == NULL) + if ((dev=kzalloc(sizeof(struct pcbit_dev), GFP_KERNEL)) == NULL) { printk("pcbit_init: couldn't malloc pcbit_dev struct\n"); return -ENOMEM; } dev_pcbit[board] = dev; - memset(dev, 0, sizeof(struct pcbit_dev)); init_waitqueue_head(&dev->set_running_wq); spin_lock_init(&dev->lock); @@ -96,7 +93,7 @@ int pcbit_init_dev(int board, int mem_base, int irq) dev_pcbit[board] = NULL; return -EACCES; } - dev->sh_mem = (unsigned char*)ioremap(dev->ph_mem, 4096); + dev->sh_mem = ioremap(dev->ph_mem, 4096); } else { @@ -106,30 +103,28 @@ int pcbit_init_dev(int board, int mem_base, int irq) return -EACCES; } - dev->b1 = kmalloc(sizeof(struct pcbit_chan), GFP_KERNEL); + dev->b1 = kzalloc(sizeof(struct pcbit_chan), GFP_KERNEL); if (!dev->b1) { printk("pcbit_init: couldn't malloc pcbit_chan struct\n"); - iounmap((unsigned char*)dev->sh_mem); + iounmap(dev->sh_mem); release_mem_region(dev->ph_mem, 4096); kfree(dev); return -ENOMEM; } - dev->b2 = kmalloc(sizeof(struct pcbit_chan), GFP_KERNEL); + dev->b2 = kzalloc(sizeof(struct pcbit_chan), GFP_KERNEL); if (!dev->b2) { printk("pcbit_init: couldn't malloc pcbit_chan struct\n"); kfree(dev->b1); - iounmap((unsigned char*)dev->sh_mem); + iounmap(dev->sh_mem); release_mem_region(dev->ph_mem, 4096); kfree(dev); return -ENOMEM; } - memset(dev->b1, 0, sizeof(struct pcbit_chan)); - memset(dev->b2, 0, sizeof(struct pcbit_chan)); dev->b2->id = 1; - INIT_WORK(&dev->qdelivery, pcbit_deliver, dev); + INIT_WORK(&dev->qdelivery, pcbit_deliver); /* * interrupts @@ -139,7 +134,7 @@ int pcbit_init_dev(int board, int mem_base, int irq) { kfree(dev->b1); kfree(dev->b2); - iounmap((unsigned char*)dev->sh_mem); + iounmap(dev->sh_mem); release_mem_region(dev->ph_mem, 4096); kfree(dev); dev_pcbit[board] = NULL; @@ -161,7 +156,7 @@ int pcbit_init_dev(int board, int mem_base, int irq) free_irq(irq, dev); kfree(dev->b1); kfree(dev->b2); - iounmap((unsigned char*)dev->sh_mem); + iounmap(dev->sh_mem); release_mem_region(dev->ph_mem, 4096); kfree(dev); dev_pcbit[board] = NULL; @@ -193,7 +188,7 @@ int pcbit_init_dev(int board, int mem_base, int irq) free_irq(irq, dev); kfree(dev->b1); kfree(dev->b2); - iounmap((unsigned char*)dev->sh_mem); + iounmap(dev->sh_mem); release_mem_region(dev->ph_mem, 4096); kfree(dev); dev_pcbit[board] = NULL; @@ -231,14 +226,14 @@ void pcbit_terminate(int board) del_timer(&dev->b2->fsm_timer); kfree(dev->b1); kfree(dev->b2); - iounmap((unsigned char*)dev->sh_mem); + iounmap(dev->sh_mem); release_mem_region(dev->ph_mem, 4096); kfree(dev); } } #endif -int pcbit_command(isdn_ctrl* ctl) +static int pcbit_command(isdn_ctrl* ctl) { struct pcbit_dev *dev; struct pcbit_chan *chan; @@ -330,7 +325,7 @@ static void pcbit_block_timer(unsigned long data) } #endif -int pcbit_xmit(int driver, int chnum, int ack, struct sk_buff *skb) +static int pcbit_xmit(int driver, int chnum, int ack, struct sk_buff *skb) { ushort hdrlen; int refnum, len; @@ -389,12 +384,13 @@ int pcbit_xmit(int driver, int chnum, int ack, struct sk_buff *skb) return len; } -int pcbit_writecmd(const u_char* buf, int len, int user, int driver, int channel) +static int pcbit_writecmd(const u_char __user *buf, int len, int driver, int channel) { struct pcbit_dev * dev; int i, j; const u_char * loadbuf; u_char * ptr = NULL; + u_char *cbuf; int errstat; @@ -415,37 +411,28 @@ int pcbit_writecmd(const u_char* buf, int len, int user, int driver, int channel return -EINVAL; } - if (user) - { - u_char *cbuf = kmalloc(len, GFP_KERNEL); - if (!cbuf) - return -ENOMEM; + cbuf = kmalloc(len, GFP_KERNEL); + if (!cbuf) + return -ENOMEM; - if (copy_from_user(cbuf, buf, len)) { - kfree(cbuf); - return -EFAULT; - } - memcpy_toio(dev->sh_mem, cbuf, len); + if (copy_from_user(cbuf, buf, len)) { kfree(cbuf); + return -EFAULT; } - else - memcpy_toio(dev->sh_mem, buf, len); + memcpy_toio(dev->sh_mem, cbuf, len); + kfree(cbuf); return len; case L2_FWMODE: /* this is the hard part */ /* dumb board */ - if (user) { - /* get it into kernel space */ - if ((ptr = kmalloc(len, GFP_KERNEL))==NULL) - return -ENOMEM; - if (copy_from_user(ptr, buf, len)) { - kfree(ptr); - return -EFAULT; - } - loadbuf = ptr; + /* get it into kernel space */ + if ((ptr = kmalloc(len, GFP_KERNEL))==NULL) + return -ENOMEM; + if (copy_from_user(ptr, buf, len)) { + kfree(ptr); + return -EFAULT; } - else - loadbuf = buf; + loadbuf = ptr; errstat = 0; @@ -468,9 +455,7 @@ int pcbit_writecmd(const u_char* buf, int len, int user, int driver, int channel if (dev->loadptr > LOAD_ZONE_END) dev->loadptr = LOAD_ZONE_START; } - - if (user) - kfree(ptr); + kfree(ptr); return errstat ? errstat : len; default: @@ -571,10 +556,8 @@ void pcbit_l3_receive(struct pcbit_dev * dev, ulong msg, else pcbit_fsm_event(dev, chan, EV_USR_RELEASE_REQ, NULL); - if (cbdata.data.setup.CalledPN) - kfree(cbdata.data.setup.CalledPN); - if (cbdata.data.setup.CallingPN) - kfree(cbdata.data.setup.CallingPN); + kfree(cbdata.data.setup.CalledPN); + kfree(cbdata.data.setup.CallingPN); break; case MSG_CONN_CONF: @@ -723,17 +706,7 @@ static char statbuf[STATBUF_LEN]; static int stat_st = 0; static int stat_end = 0; - -static __inline void -memcpy_to_COND(int flag, char *d, const char *s, int len) { - if (flag) - copy_to_user(d, s, len); - else - memcpy(d, s, len); -} - - -int pcbit_stat(u_char* buf, int len, int user, int driver, int channel) +static int pcbit_stat(u_char __user *buf, int len, int driver, int channel) { int stat_count; stat_count = stat_end - stat_st; @@ -747,24 +720,27 @@ int pcbit_stat(u_char* buf, int len, int user, int driver, int channel) if (stat_st < stat_end) { - memcpy_to_COND(user, buf, statbuf + stat_st, len); + if (copy_to_user(buf, statbuf + stat_st, len)) + return -EFAULT; stat_st += len; } else { if (len > STATBUF_LEN - stat_st) { - memcpy_to_COND(user, buf, statbuf + stat_st, - STATBUF_LEN - stat_st); - memcpy_to_COND(user, buf, statbuf, - len - (STATBUF_LEN - stat_st)); + if (copy_to_user(buf, statbuf + stat_st, + STATBUF_LEN - stat_st)) + return -EFAULT; + if (copy_to_user(buf, statbuf, + len - (STATBUF_LEN - stat_st))) + return -EFAULT; stat_st = len - (STATBUF_LEN - stat_st); } else { - memcpy_to_COND(user, buf, statbuf + stat_st, - len); + if (copy_to_user(buf, statbuf + stat_st, len)) + return -EFAULT; stat_st += len; @@ -880,7 +856,7 @@ static int set_protocol_running(struct pcbit_dev * dev) printk(KERN_DEBUG "Bank3 = %02x\n", readb(dev->sh_mem + BANK3)); #endif - *(dev->sh_mem + BANK4) = 0x40U; + writeb(0x40, dev->sh_mem + BANK4); /* warn the upper layer */ ctl.driver = dev->id;