fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / drivers / isdn / act2000 / module.c
index 6129c8e..e3e5c13 100644 (file)
@@ -40,10 +40,10 @@ MODULE_PARM_DESC(act_bus, "BusType of first card, 1=ISA, 2=MCA, 3=PCMCIA, curren
 MODULE_PARM_DESC(membase, "Base port address of first card");
 MODULE_PARM_DESC(act_irq, "IRQ of first card");
 MODULE_PARM_DESC(act_id,  "ID-String of first card");
-MODULE_PARM(act_bus,  "i");
-MODULE_PARM(act_port, "i");
-MODULE_PARM(act_irq,  "i");
-MODULE_PARM(act_id,   "s");
+module_param(act_bus,  int, 0);
+module_param(act_port, int, 0);
+module_param(act_irq, int, 0);
+module_param(act_id, charp, 0);
 
 static int act2000_addcard(int, int, int, char *);
 
@@ -192,8 +192,11 @@ act2000_set_msn(act2000_card *card, char *eazmsn)
 }
 
 static void
-act2000_transmit(struct act2000_card *card)
+act2000_transmit(struct work_struct *work)
 {
+       struct act2000_card *card =
+               container_of(work, struct act2000_card, snd_tq);
+
        switch (card->bus) {
                case ACT2000_BUS_ISA:
                        act2000_isa_send(card);
@@ -207,8 +210,11 @@ act2000_transmit(struct act2000_card *card)
 }
 
 static void
-act2000_receive(struct act2000_card *card)
+act2000_receive(struct work_struct *work)
 {
+       struct act2000_card *card =
+               container_of(work, struct act2000_card, poll_tq);
+
        switch (card->bus) {
                case ACT2000_BUS_ISA:
                        act2000_isa_receive(card);
@@ -227,7 +233,7 @@ act2000_poll(unsigned long data)
        act2000_card * card = (act2000_card *)data;
        unsigned long flags;
 
-       act2000_receive(card);
+       act2000_receive(&card->poll_tq);
        spin_lock_irqsave(&card->lock, flags);
        mod_timer(&card->ptimer, jiffies+3);
        spin_unlock_irqrestore(&card->lock, flags);
@@ -243,16 +249,18 @@ act2000_command(act2000_card * card, isdn_ctrl * c)
        char tmp[17];
        int ret;
        unsigned long flags;
+       void __user *arg;
  
         switch (c->command) {
                case ISDN_CMD_IOCTL:
                        memcpy(&a, c->parm.num, sizeof(ulong));
+                       arg = (void __user *)a;
                        switch (c->arg) {
                                case ACT2000_IOCTL_LOADBOOT:
                                        switch (card->bus) {
                                                case ACT2000_BUS_ISA:
                                                        ret = act2000_isa_download(card,
-                                                                          (act2000_ddef *)a);
+                                                                          arg);
                                                        if (!ret) {
                                                                card->flags |= ACT2000_FLAGS_LOADED;
                                                                if (!(card->flags & ACT2000_FLAGS_IVALID)) {
@@ -278,7 +286,7 @@ act2000_command(act2000_card * card, isdn_ctrl * c)
                                        actcapi_manufacturer_req_net(card);
                                        return 0;
                                case ACT2000_IOCTL_SETMSN:
-                                       if (copy_from_user(tmp, (char *)a,
+                                       if (copy_from_user(tmp, arg,
                                                           sizeof(tmp)))
                                                return -EFAULT;
                                        if ((ret = act2000_set_msn(card, tmp)))
@@ -287,7 +295,7 @@ act2000_command(act2000_card * card, isdn_ctrl * c)
                                                return(actcapi_manufacturer_req_msn(card));
                                        return 0;
                                case ACT2000_IOCTL_ADDCARD:
-                                       if (copy_from_user(&cdef, (char *)a,
+                                       if (copy_from_user(&cdef, arg,
                                                           sizeof(cdef)))
                                                return -EFAULT;
                                        if (act2000_addcard(cdef.bus, cdef.port, cdef.irq, cdef.id))
@@ -463,18 +471,15 @@ act2000_sendbuf(act2000_card *card, int channel, int ack, struct sk_buff *skb)
 
 /* Read the Status-replies from the Interface */
 static int
-act2000_readstatus(u_char * buf, int len, int user, act2000_card * card)
+act2000_readstatus(u_char __user * buf, int len, act2000_card * card)
 {
         int count;
-        u_char *p;
+        u_char __user *p;
 
         for (p = buf, count = 0; count < len; p++, count++) {
                 if (card->status_buf_read == card->status_buf_write)
                         return count;
-                if (user)
-                        put_user(*card->status_buf_read++, p);
-                else
-                        *p = *card->status_buf_read++;
+               put_user(*card->status_buf_read++, p);
                 if (card->status_buf_read > card->status_buf_end)
                         card->status_buf_read = card->status_buf;
         }
@@ -514,7 +519,7 @@ if_command(isdn_ctrl * c)
 }
 
 static int
-if_writecmd(const u_char * buf, int len, int user, int id, int channel)
+if_writecmd(const u_char __user *buf, int len, int id, int channel)
 {
         act2000_card *card = act2000_findcard(id);
 
@@ -529,14 +534,14 @@ if_writecmd(const u_char * buf, int len, int user, int id, int channel)
 }
 
 static int
-if_readstatus(u_char * buf, int len, int user, int id, int channel)
+if_readstatus(u_char __user * buf, int len, int id, int channel)
 {
         act2000_card *card = act2000_findcard(id);
        
         if (card) {
                 if (!card->flags & ACT2000_FLAGS_RUNNING)
                         return -ENODEV;
-                return (act2000_readstatus(buf, len, user, card));
+                return (act2000_readstatus(buf, len, card));
         }
         printk(KERN_ERR
                "act2000: if_readstatus called with invalid driverId!\n");
@@ -568,20 +573,19 @@ act2000_alloccard(int bus, int port, int irq, char *id)
 {
        int i;
         act2000_card *card;
-        if (!(card = (act2000_card *) kmalloc(sizeof(act2000_card), GFP_KERNEL))) {
+        if (!(card = kzalloc(sizeof(act2000_card), GFP_KERNEL))) {
                 printk(KERN_WARNING
                       "act2000: (%s) Could not allocate card-struct.\n", id);
                 return;
         }
-        memset((char *) card, 0, sizeof(act2000_card));
         spin_lock_init(&card->lock);
         spin_lock_init(&card->mnlock);
        skb_queue_head_init(&card->sndq);
        skb_queue_head_init(&card->rcvq);
        skb_queue_head_init(&card->ackq);
-       INIT_WORK(&card->snd_tq, (void *) (void *) act2000_transmit, card);
-       INIT_WORK(&card->rcv_tq, (void *) (void *) actcapi_dispatch, card);
-       INIT_WORK(&card->poll_tq, (void *) (void *) act2000_receive, card);
+       INIT_WORK(&card->snd_tq, act2000_transmit);
+       INIT_WORK(&card->rcv_tq, actcapi_dispatch);
+       INIT_WORK(&card->poll_tq, act2000_receive);
        init_timer(&card->ptimer);
        card->interface.owner = THIS_MODULE;
         card->interface.channels = ACT2000_BCH;