diff options
Diffstat (limited to 'drivers/isdn/gigaset')
-rw-r--r-- | drivers/isdn/gigaset/asyncdata.c | 13 | ||||
-rw-r--r-- | drivers/isdn/gigaset/bas-gigaset.c | 41 | ||||
-rw-r--r-- | drivers/isdn/gigaset/common.c | 36 | ||||
-rw-r--r-- | drivers/isdn/gigaset/ev-layer.c | 289 | ||||
-rw-r--r-- | drivers/isdn/gigaset/gigaset.h | 470 | ||||
-rw-r--r-- | drivers/isdn/gigaset/i4l.c | 40 | ||||
-rw-r--r-- | drivers/isdn/gigaset/interface.c | 18 | ||||
-rw-r--r-- | drivers/isdn/gigaset/isocdata.c | 16 | ||||
-rw-r--r-- | drivers/isdn/gigaset/proc.c | 12 | ||||
-rw-r--r-- | drivers/isdn/gigaset/usb-gigaset.c | 129 |
10 files changed, 523 insertions, 541 deletions
diff --git a/drivers/isdn/gigaset/asyncdata.c b/drivers/isdn/gigaset/asyncdata.c index 171f8b703d61..778d864ab612 100644 --- a/drivers/isdn/gigaset/asyncdata.c +++ b/drivers/isdn/gigaset/asyncdata.c | |||
@@ -11,10 +11,6 @@ | |||
11 | * published by the Free Software Foundation; either version 2 of | 11 | * published by the Free Software Foundation; either version 2 of |
12 | * the License, or (at your option) any later version. | 12 | * the License, or (at your option) any later version. |
13 | * ===================================================================== | 13 | * ===================================================================== |
14 | * ToDo: ... | ||
15 | * ===================================================================== | ||
16 | * Version: $Id: asyncdata.c,v 1.2.2.7 2005/11/13 23:05:18 hjlipp Exp $ | ||
17 | * ===================================================================== | ||
18 | */ | 14 | */ |
19 | 15 | ||
20 | #include "gigaset.h" | 16 | #include "gigaset.h" |
@@ -58,7 +54,8 @@ static inline int cmd_loop(unsigned char c, unsigned char *src, int numbytes, | |||
58 | dbg(DEBUG_TRANSCMD, "%s: End of Command (%d Bytes)", | 54 | dbg(DEBUG_TRANSCMD, "%s: End of Command (%d Bytes)", |
59 | __func__, cbytes); | 55 | __func__, cbytes); |
60 | cs->cbytes = cbytes; | 56 | cs->cbytes = cbytes; |
61 | gigaset_handle_modem_response(cs); /* can change cs->dle */ | 57 | gigaset_handle_modem_response(cs); /* can change |
58 | cs->dle */ | ||
62 | cbytes = 0; | 59 | cbytes = 0; |
63 | 60 | ||
64 | if (cs->dle && | 61 | if (cs->dle && |
@@ -100,7 +97,8 @@ static inline int lock_loop(unsigned char *src, int numbytes, | |||
100 | { | 97 | { |
101 | struct cardstate *cs = inbuf->cs; | 98 | struct cardstate *cs = inbuf->cs; |
102 | 99 | ||
103 | gigaset_dbg_buffer(DEBUG_LOCKCMD, "received response", numbytes, src, 0); | 100 | gigaset_dbg_buffer(DEBUG_LOCKCMD, "received response", |
101 | numbytes, src, 0); | ||
104 | gigaset_if_receive(cs, src, numbytes); | 102 | gigaset_if_receive(cs, src, numbytes); |
105 | 103 | ||
106 | return numbytes; | 104 | return numbytes; |
@@ -392,8 +390,7 @@ void gigaset_m10x_input(struct inbuf_t *inbuf) | |||
392 | 390 | ||
393 | if (!(inbuf->inputstate & INS_DLE_char)) { | 391 | if (!(inbuf->inputstate & INS_DLE_char)) { |
394 | 392 | ||
395 | /* FIXME Einfach je nach Modus Funktionszeiger in cs setzen [hier+hdlc_loop]? */ | 393 | /* FIXME use function pointers? */ |
396 | /* FIXME Spart folgendes "if" und ermoeglicht andere Protokolle */ | ||
397 | if (inbuf->inputstate & INS_command) | 394 | if (inbuf->inputstate & INS_command) |
398 | procbytes = cmd_loop(c, src, numbytes, inbuf); | 395 | procbytes = cmd_loop(c, src, numbytes, inbuf); |
399 | else if (inbuf->bcs->proto2 == ISDN_PROTO_L2_HDLC) | 396 | else if (inbuf->bcs->proto2 == ISDN_PROTO_L2_HDLC) |
diff --git a/drivers/isdn/gigaset/bas-gigaset.c b/drivers/isdn/gigaset/bas-gigaset.c index 31f0f07832bc..fb2c13ae7cfd 100644 --- a/drivers/isdn/gigaset/bas-gigaset.c +++ b/drivers/isdn/gigaset/bas-gigaset.c | |||
@@ -13,10 +13,6 @@ | |||
13 | * published by the Free Software Foundation; either version 2 of | 13 | * published by the Free Software Foundation; either version 2 of |
14 | * the License, or (at your option) any later version. | 14 | * the License, or (at your option) any later version. |
15 | * ===================================================================== | 15 | * ===================================================================== |
16 | * ToDo: ... | ||
17 | * ===================================================================== | ||
18 | * Version: $Id: bas-gigaset.c,v 1.52.4.19 2006/02/04 18:28:16 hjlipp Exp $ | ||
19 | * ===================================================================== | ||
20 | */ | 16 | */ |
21 | 17 | ||
22 | #include "gigaset.h" | 18 | #include "gigaset.h" |
@@ -70,9 +66,6 @@ static struct usb_device_id gigaset_table [] = { | |||
70 | 66 | ||
71 | MODULE_DEVICE_TABLE(usb, gigaset_table); | 67 | MODULE_DEVICE_TABLE(usb, gigaset_table); |
72 | 68 | ||
73 | /* Get a minor range for your devices from the usb maintainer */ | ||
74 | #define USB_SKEL_MINOR_BASE 200 | ||
75 | |||
76 | /*======================= local function prototypes =============================*/ | 69 | /*======================= local function prototypes =============================*/ |
77 | 70 | ||
78 | /* This function is called if a new device is connected to the USB port. It | 71 | /* This function is called if a new device is connected to the USB port. It |
@@ -240,7 +233,8 @@ static inline void dump_urb(enum debuglevel level, const char *tag, | |||
240 | (unsigned long) urb->context, | 233 | (unsigned long) urb->context, |
241 | (unsigned long) urb->complete); | 234 | (unsigned long) urb->complete); |
242 | for (i = 0; i < urb->number_of_packets; i++) { | 235 | for (i = 0; i < urb->number_of_packets; i++) { |
243 | struct usb_iso_packet_descriptor *pifd = &urb->iso_frame_desc[i]; | 236 | struct usb_iso_packet_descriptor *pifd |
237 | = &urb->iso_frame_desc[i]; | ||
244 | dbg(level, | 238 | dbg(level, |
245 | " {offset=%u, length=%u, actual_length=%u, " | 239 | " {offset=%u, length=%u, actual_length=%u, " |
246 | "status=%u}", | 240 | "status=%u}", |
@@ -777,10 +771,11 @@ static void read_iso_callback(struct urb *urb, struct pt_regs *regs) | |||
777 | urb->iso_frame_desc[i].actual_length = 0; | 771 | urb->iso_frame_desc[i].actual_length = 0; |
778 | } | 772 | } |
779 | if (likely(atomic_read(&ubc->running))) { | 773 | if (likely(atomic_read(&ubc->running))) { |
780 | urb->dev = bcs->cs->hw.bas->udev; /* clobbered by USB subsystem */ | 774 | urb->dev = bcs->cs->hw.bas->udev; /* clobbered by USB subsystem */ |
781 | urb->transfer_flags = URB_ISO_ASAP; | 775 | urb->transfer_flags = URB_ISO_ASAP; |
782 | urb->number_of_packets = BAS_NUMFRAMES; | 776 | urb->number_of_packets = BAS_NUMFRAMES; |
783 | dbg(DEBUG_ISO, "%s: isoc read overrun/resubmit", __func__); | 777 | dbg(DEBUG_ISO, "%s: isoc read overrun/resubmit", |
778 | __func__); | ||
784 | rc = usb_submit_urb(urb, SLAB_ATOMIC); | 779 | rc = usb_submit_urb(urb, SLAB_ATOMIC); |
785 | if (unlikely(rc != 0)) { | 780 | if (unlikely(rc != 0)) { |
786 | err("could not resubmit isochronous read URB: %s", | 781 | err("could not resubmit isochronous read URB: %s", |
@@ -989,7 +984,7 @@ static int submit_iso_write_urb(struct isow_urbctx_t *ucx) | |||
989 | ubc = ucx->bcs->hw.bas; | 984 | ubc = ucx->bcs->hw.bas; |
990 | IFNULLRETVAL(ubc, -EFAULT); | 985 | IFNULLRETVAL(ubc, -EFAULT); |
991 | 986 | ||
992 | urb->dev = ucx->bcs->cs->hw.bas->udev; /* clobbered by USB subsystem */ | 987 | urb->dev = ucx->bcs->cs->hw.bas->udev; /* clobbered by USB subsystem */ |
993 | urb->transfer_flags = URB_ISO_ASAP; | 988 | urb->transfer_flags = URB_ISO_ASAP; |
994 | urb->transfer_buffer = ubc->isooutbuf->data; | 989 | urb->transfer_buffer = ubc->isooutbuf->data; |
995 | urb->transfer_buffer_length = sizeof(ubc->isooutbuf->data); | 990 | urb->transfer_buffer_length = sizeof(ubc->isooutbuf->data); |
@@ -1011,7 +1006,8 @@ static int submit_iso_write_urb(struct isow_urbctx_t *ucx) | |||
1011 | //dbg(DEBUG_ISO, "%s: frame %d length=%d", __func__, nframe, ifd->length); | 1006 | //dbg(DEBUG_ISO, "%s: frame %d length=%d", __func__, nframe, ifd->length); |
1012 | 1007 | ||
1013 | /* retrieve block of data to send */ | 1008 | /* retrieve block of data to send */ |
1014 | ifd->offset = gigaset_isowbuf_getbytes(ubc->isooutbuf, ifd->length); | 1009 | ifd->offset = gigaset_isowbuf_getbytes(ubc->isooutbuf, |
1010 | ifd->length); | ||
1015 | if (ifd->offset < 0) { | 1011 | if (ifd->offset < 0) { |
1016 | if (ifd->offset == -EBUSY) { | 1012 | if (ifd->offset == -EBUSY) { |
1017 | dbg(DEBUG_ISO, "%s: buffer busy at frame %d", | 1013 | dbg(DEBUG_ISO, "%s: buffer busy at frame %d", |
@@ -1123,7 +1119,8 @@ static void write_iso_tasklet(unsigned long data) | |||
1123 | break; | 1119 | break; |
1124 | case -EXDEV: /* inspect individual frames */ | 1120 | case -EXDEV: /* inspect individual frames */ |
1125 | /* assumptions (for lack of documentation): | 1121 | /* assumptions (for lack of documentation): |
1126 | * - actual_length bytes of the frame in error are successfully sent | 1122 | * - actual_length bytes of the frame in error are |
1123 | * successfully sent | ||
1127 | * - all following frames are not sent at all | 1124 | * - all following frames are not sent at all |
1128 | */ | 1125 | */ |
1129 | dbg(DEBUG_ISO, "%s: URB partially completed", __func__); | 1126 | dbg(DEBUG_ISO, "%s: URB partially completed", __func__); |
@@ -1260,7 +1257,8 @@ static void read_iso_tasklet(unsigned long data) | |||
1260 | switch (urb->status) { | 1257 | switch (urb->status) { |
1261 | case 0: /* normal completion */ | 1258 | case 0: /* normal completion */ |
1262 | break; | 1259 | break; |
1263 | case -EXDEV: /* inspect individual frames (we do that anyway) */ | 1260 | case -EXDEV: /* inspect individual frames |
1261 | (we do that anyway) */ | ||
1264 | dbg(DEBUG_ISO, "%s: URB partially completed", __func__); | 1262 | dbg(DEBUG_ISO, "%s: URB partially completed", __func__); |
1265 | break; | 1263 | break; |
1266 | case -ENOENT: | 1264 | case -ENOENT: |
@@ -1284,8 +1282,8 @@ static void read_iso_tasklet(unsigned long data) | |||
1284 | totleft = urb->actual_length; | 1282 | totleft = urb->actual_length; |
1285 | for (frame = 0; totleft > 0 && frame < BAS_NUMFRAMES; frame++) { | 1283 | for (frame = 0; totleft > 0 && frame < BAS_NUMFRAMES; frame++) { |
1286 | if (unlikely(urb->iso_frame_desc[frame].status)) { | 1284 | if (unlikely(urb->iso_frame_desc[frame].status)) { |
1287 | warn("isochronous read: frame %d: %s", | 1285 | warn("isochronous read: frame %d: %s", frame, |
1288 | frame, get_usb_statmsg(urb->iso_frame_desc[frame].status)); | 1286 | get_usb_statmsg(urb->iso_frame_desc[frame].status)); |
1289 | break; | 1287 | break; |
1290 | } | 1288 | } |
1291 | numbytes = urb->iso_frame_desc[frame].actual_length; | 1289 | numbytes = urb->iso_frame_desc[frame].actual_length; |
@@ -1318,7 +1316,7 @@ static void read_iso_tasklet(unsigned long data) | |||
1318 | urb->iso_frame_desc[frame].status = 0; | 1316 | urb->iso_frame_desc[frame].status = 0; |
1319 | urb->iso_frame_desc[frame].actual_length = 0; | 1317 | urb->iso_frame_desc[frame].actual_length = 0; |
1320 | } | 1318 | } |
1321 | urb->dev = bcs->cs->hw.bas->udev; /* clobbered by USB subsystem */ | 1319 | urb->dev = bcs->cs->hw.bas->udev; /* clobbered by USB subsystem */ |
1322 | urb->transfer_flags = URB_ISO_ASAP; | 1320 | urb->transfer_flags = URB_ISO_ASAP; |
1323 | urb->number_of_packets = BAS_NUMFRAMES; | 1321 | urb->number_of_packets = BAS_NUMFRAMES; |
1324 | if ((rc = usb_submit_urb(urb, SLAB_ATOMIC)) != 0) { | 1322 | if ((rc = usb_submit_urb(urb, SLAB_ATOMIC)) != 0) { |
@@ -1792,7 +1790,8 @@ static int start_cbsend(struct cardstate *cs) | |||
1792 | * cs controller state structure | 1790 | * cs controller state structure |
1793 | * buf command string to send | 1791 | * buf command string to send |
1794 | * len number of bytes to send (max. IF_WRITEBUF) | 1792 | * len number of bytes to send (max. IF_WRITEBUF) |
1795 | * wake_tasklet tasklet to run when transmission is completed (NULL if none) | 1793 | * wake_tasklet tasklet to run when transmission is completed |
1794 | * (NULL if none) | ||
1796 | * return value: | 1795 | * return value: |
1797 | * number of bytes queued on success | 1796 | * number of bytes queued on success |
1798 | * error code < 0 on error | 1797 | * error code < 0 on error |
@@ -1849,7 +1848,8 @@ static int gigaset_write_cmd(struct cardstate *cs, | |||
1849 | 1848 | ||
1850 | /* gigaset_write_room | 1849 | /* gigaset_write_room |
1851 | * tty_driver.write_room interface routine | 1850 | * tty_driver.write_room interface routine |
1852 | * return number of characters the driver will accept to be written via gigaset_write_cmd | 1851 | * return number of characters the driver will accept to be written via |
1852 | * gigaset_write_cmd | ||
1853 | * parameter: | 1853 | * parameter: |
1854 | * controller state structure | 1854 | * controller state structure |
1855 | * return value: | 1855 | * return value: |
@@ -2299,7 +2299,8 @@ static int __init bas_gigaset_init(void) | |||
2299 | goto error; | 2299 | goto error; |
2300 | 2300 | ||
2301 | /* allocate memory for our device state and intialize it */ | 2301 | /* allocate memory for our device state and intialize it */ |
2302 | cardstate = gigaset_initcs(driver, 2, 0, 0, cidmode, GIGASET_MODULENAME); | 2302 | cardstate = gigaset_initcs(driver, 2, 0, 0, cidmode, |
2303 | GIGASET_MODULENAME); | ||
2303 | if (!cardstate) | 2304 | if (!cardstate) |
2304 | goto error; | 2305 | goto error; |
2305 | 2306 | ||
diff --git a/drivers/isdn/gigaset/common.c b/drivers/isdn/gigaset/common.c index 64371995c1a9..1163d316f58c 100644 --- a/drivers/isdn/gigaset/common.c +++ b/drivers/isdn/gigaset/common.c | |||
@@ -11,10 +11,6 @@ | |||
11 | * published by the Free Software Foundation; either version 2 of | 11 | * published by the Free Software Foundation; either version 2 of |
12 | * the License, or (at your option) any later version. | 12 | * the License, or (at your option) any later version. |
13 | * ===================================================================== | 13 | * ===================================================================== |
14 | * ToDo: ... | ||
15 | * ===================================================================== | ||
16 | * Version: $Id: common.c,v 1.104.4.22 2006/02/04 18:28:16 hjlipp Exp $ | ||
17 | * ===================================================================== | ||
18 | */ | 14 | */ |
19 | 15 | ||
20 | #include "gigaset.h" | 16 | #include "gigaset.h" |
@@ -101,7 +97,8 @@ void gigaset_dbg_buffer(enum debuglevel level, const unsigned char *msg, | |||
101 | } else { | 97 | } else { |
102 | numin = len < sizeof inbuf ? len : sizeof inbuf; | 98 | numin = len < sizeof inbuf ? len : sizeof inbuf; |
103 | in = inbuf; | 99 | in = inbuf; |
104 | if (copy_from_user(inbuf, (const unsigned char __user *) buf, numin)) { | 100 | if (copy_from_user(inbuf, (const unsigned char __user *) buf, |
101 | numin)) { | ||
105 | strncpy(inbuf, "<FAULT>", sizeof inbuf); | 102 | strncpy(inbuf, "<FAULT>", sizeof inbuf); |
106 | numin = sizeof "<FAULT>" - 1; | 103 | numin = sizeof "<FAULT>" - 1; |
107 | } | 104 | } |
@@ -425,7 +422,8 @@ void gigaset_freecs(struct cardstate *cs) | |||
425 | 422 | ||
426 | spin_lock_irqsave(&cs->lock, flags); | 423 | spin_lock_irqsave(&cs->lock, flags); |
427 | atomic_set(&cs->running, 0); | 424 | atomic_set(&cs->running, 0); |
428 | spin_unlock_irqrestore(&cs->lock, flags); /* event handler and timer are not rescheduled below */ | 425 | spin_unlock_irqrestore(&cs->lock, flags); /* event handler and timer are |
426 | not rescheduled below */ | ||
429 | 427 | ||
430 | tasklet_kill(&cs->event_tasklet); | 428 | tasklet_kill(&cs->event_tasklet); |
431 | del_timer_sync(&cs->timer); | 429 | del_timer_sync(&cs->timer); |
@@ -563,7 +561,6 @@ static struct bc_state *gigaset_initbcs(struct bc_state *bcs, | |||
563 | if (cs->ops->initbcshw(bcs)) | 561 | if (cs->ops->initbcshw(bcs)) |
564 | return bcs; | 562 | return bcs; |
565 | 563 | ||
566 | //error: | ||
567 | dbg(DEBUG_INIT, " failed"); | 564 | dbg(DEBUG_INIT, " failed"); |
568 | 565 | ||
569 | dbg(DEBUG_INIT, " freeing bcs[%d]->skb", channel); | 566 | dbg(DEBUG_INIT, " freeing bcs[%d]->skb", channel); |
@@ -580,7 +577,8 @@ static struct bc_state *gigaset_initbcs(struct bc_state *bcs, | |||
580 | * parameters: | 577 | * parameters: |
581 | * drv hardware driver the device belongs to | 578 | * drv hardware driver the device belongs to |
582 | * channels number of B channels supported by device | 579 | * channels number of B channels supported by device |
583 | * onechannel !=0: B channel data and AT commands share one communication channel | 580 | * onechannel !=0: B channel data and AT commands share one |
581 | * communication channel | ||
584 | * ==0: B channels have separate communication channels | 582 | * ==0: B channels have separate communication channels |
585 | * ignoreframes number of frames to ignore after setting up B channel | 583 | * ignoreframes number of frames to ignore after setting up B channel |
586 | * cidmode !=0: start in CallID mode | 584 | * cidmode !=0: start in CallID mode |
@@ -619,7 +617,8 @@ struct cardstate *gigaset_initcs(struct gigaset_driver *drv, int channels, | |||
619 | atomic_set(&cs->ev_tail, 0); | 617 | atomic_set(&cs->ev_tail, 0); |
620 | atomic_set(&cs->ev_head, 0); | 618 | atomic_set(&cs->ev_head, 0); |
621 | init_MUTEX_LOCKED(&cs->sem); | 619 | init_MUTEX_LOCKED(&cs->sem); |
622 | tasklet_init(&cs->event_tasklet, &gigaset_handle_event, (unsigned long) cs); | 620 | tasklet_init(&cs->event_tasklet, &gigaset_handle_event, |
621 | (unsigned long) cs); | ||
623 | atomic_set(&cs->commands_pending, 0); | 622 | atomic_set(&cs->commands_pending, 0); |
624 | cs->cur_at_seq = 0; | 623 | cs->cur_at_seq = 0; |
625 | cs->gotfwver = -1; | 624 | cs->gotfwver = -1; |
@@ -669,14 +668,6 @@ struct cardstate *gigaset_initcs(struct gigaset_driver *drv, int channels, | |||
669 | cs->curlen = 0; | 668 | cs->curlen = 0; |
670 | cs->cmdbytes = 0; | 669 | cs->cmdbytes = 0; |
671 | 670 | ||
672 | /* | ||
673 | * Tell the ISDN4Linux subsystem (the LL) that | ||
674 | * a driver for a USB-Device is available ! | ||
675 | * If this is done, "isdnctrl" is able to bind a device for this driver even | ||
676 | * if no physical usb-device is currently connected. | ||
677 | * But this device will just be accessable if a physical USB device is connected | ||
678 | * (via "gigaset_probe") . | ||
679 | */ | ||
680 | dbg(DEBUG_INIT, "setting up iif"); | 671 | dbg(DEBUG_INIT, "setting up iif"); |
681 | if (!gigaset_register_to_LL(cs, modulename)) { | 672 | if (!gigaset_register_to_LL(cs, modulename)) { |
682 | err("register_isdn=>error"); | 673 | err("register_isdn=>error"); |
@@ -713,7 +704,8 @@ error: if (cs) | |||
713 | } | 704 | } |
714 | EXPORT_SYMBOL_GPL(gigaset_initcs); | 705 | EXPORT_SYMBOL_GPL(gigaset_initcs); |
715 | 706 | ||
716 | /* ReInitialize the b-channel structure */ /* e.g. called on hangup, disconnect */ | 707 | /* ReInitialize the b-channel structure */ |
708 | /* e.g. called on hangup, disconnect */ | ||
717 | void gigaset_bcs_reinit(struct bc_state *bcs) | 709 | void gigaset_bcs_reinit(struct bc_state *bcs) |
718 | { | 710 | { |
719 | struct sk_buff *skb; | 711 | struct sk_buff *skb; |
@@ -723,7 +715,7 @@ void gigaset_bcs_reinit(struct bc_state *bcs) | |||
723 | while ((skb = skb_dequeue(&bcs->squeue)) != NULL) | 715 | while ((skb = skb_dequeue(&bcs->squeue)) != NULL) |
724 | dev_kfree_skb(skb); | 716 | dev_kfree_skb(skb); |
725 | 717 | ||
726 | spin_lock_irqsave(&cs->lock, flags); //FIXME | 718 | spin_lock_irqsave(&cs->lock, flags); |
727 | clear_at_state(&bcs->at_state); | 719 | clear_at_state(&bcs->at_state); |
728 | bcs->at_state.ConState = 0; | 720 | bcs->at_state.ConState = 0; |
729 | bcs->at_state.timer_active = 0; | 721 | bcs->at_state.timer_active = 0; |
@@ -805,7 +797,6 @@ int gigaset_start(struct cardstate *cs) | |||
805 | { | 797 | { |
806 | if (down_interruptible(&cs->sem)) | 798 | if (down_interruptible(&cs->sem)) |
807 | return 0; | 799 | return 0; |
808 | //info("USB device for Gigaset 307x now attached to Dev %d", ucs->minor); | ||
809 | 800 | ||
810 | atomic_set(&cs->connected, 1); | 801 | atomic_set(&cs->connected, 1); |
811 | 802 | ||
@@ -954,7 +945,8 @@ void gigaset_debugdrivers(void) | |||
954 | dbg(DEBUG_DRIVER, " flags 0x%02x", drv->flags[i]); | 945 | dbg(DEBUG_DRIVER, " flags 0x%02x", drv->flags[i]); |
955 | cs = drv->cs + i; | 946 | cs = drv->cs + i; |
956 | dbg(DEBUG_DRIVER, " cardstate %p", cs); | 947 | dbg(DEBUG_DRIVER, " cardstate %p", cs); |
957 | dbg(DEBUG_DRIVER, " minor_index %u", cs->minor_index); | 948 | dbg(DEBUG_DRIVER, " minor_index %u", |
949 | cs->minor_index); | ||
958 | dbg(DEBUG_DRIVER, " driver %p", cs->driver); | 950 | dbg(DEBUG_DRIVER, " driver %p", cs->driver); |
959 | dbg(DEBUG_DRIVER, " i4l id %d", cs->myid); | 951 | dbg(DEBUG_DRIVER, " i4l id %d", cs->myid); |
960 | } | 952 | } |
@@ -1016,7 +1008,7 @@ EXPORT_SYMBOL_GPL(gigaset_freedriver); | |||
1016 | * parameters: | 1008 | * parameters: |
1017 | * minor First minor number | 1009 | * minor First minor number |
1018 | * minors Number of minors this driver can handle | 1010 | * minors Number of minors this driver can handle |
1019 | * procname Name of the driver (e.g. for /proc/tty/drivers, path in /proc/driver) | 1011 | * procname Name of the driver |
1020 | * devname Name of the device files (prefix without minor number) | 1012 | * devname Name of the device files (prefix without minor number) |
1021 | * devfsname Devfs name of the device files without %d | 1013 | * devfsname Devfs name of the device files without %d |
1022 | * return value: | 1014 | * return value: |
diff --git a/drivers/isdn/gigaset/ev-layer.c b/drivers/isdn/gigaset/ev-layer.c index fdcb80bb21c7..6c1000491231 100644 --- a/drivers/isdn/gigaset/ev-layer.c +++ b/drivers/isdn/gigaset/ev-layer.c | |||
@@ -11,82 +11,78 @@ | |||
11 | * published by the Free Software Foundation; either version 2 of | 11 | * published by the Free Software Foundation; either version 2 of |
12 | * the License, or (at your option) any later version. | 12 | * the License, or (at your option) any later version. |
13 | * ===================================================================== | 13 | * ===================================================================== |
14 | * ToDo: ... | ||
15 | * ===================================================================== | ||
16 | * Version: $Id: ev-layer.c,v 1.4.2.18 2006/02/04 18:28:16 hjlipp Exp $ | ||
17 | * ===================================================================== | ||
18 | */ | 14 | */ |
19 | 15 | ||
20 | #include "gigaset.h" | 16 | #include "gigaset.h" |
21 | 17 | ||
22 | /* ========================================================== */ | 18 | /* ========================================================== */ |
23 | /* bit masks for pending commands */ | 19 | /* bit masks for pending commands */ |
24 | #define PC_INIT 0x004 | 20 | #define PC_DIAL 0x001 |
25 | #define PC_DLE0 0x008 | 21 | #define PC_HUP 0x002 |
26 | #define PC_DLE1 0x010 | 22 | #define PC_INIT 0x004 |
27 | #define PC_CID 0x080 | 23 | #define PC_DLE0 0x008 |
28 | #define PC_NOCID 0x100 | 24 | #define PC_DLE1 0x010 |
29 | #define PC_HUP 0x002 | 25 | #define PC_SHUTDOWN 0x020 |
30 | #define PC_DIAL 0x001 | 26 | #define PC_ACCEPT 0x040 |
31 | #define PC_ACCEPT 0x040 | 27 | #define PC_CID 0x080 |
32 | #define PC_SHUTDOWN 0x020 | 28 | #define PC_NOCID 0x100 |
33 | #define PC_CIDMODE 0x200 | 29 | #define PC_CIDMODE 0x200 |
34 | #define PC_UMMODE 0x400 | 30 | #define PC_UMMODE 0x400 |
35 | 31 | ||
36 | /* types of modem responses */ | 32 | /* types of modem responses */ |
37 | #define RT_NOTHING 0 | 33 | #define RT_NOTHING 0 |
38 | #define RT_ZSAU 1 | 34 | #define RT_ZSAU 1 |
39 | #define RT_RING 2 | 35 | #define RT_RING 2 |
40 | #define RT_NUMBER 3 | 36 | #define RT_NUMBER 3 |
41 | #define RT_STRING 4 | 37 | #define RT_STRING 4 |
42 | #define RT_HEX 5 | 38 | #define RT_HEX 5 |
43 | #define RT_ZCAU 6 | 39 | #define RT_ZCAU 6 |
44 | 40 | ||
45 | /* Possible ASCII responses */ | 41 | /* Possible ASCII responses */ |
46 | #define RSP_OK 0 | 42 | #define RSP_OK 0 |
47 | //#define RSP_BUSY 1 | 43 | //#define RSP_BUSY 1 |
48 | //#define RSP_CONNECT 2 | 44 | //#define RSP_CONNECT 2 |
49 | #define RSP_ZGCI 3 | 45 | #define RSP_ZGCI 3 |
50 | #define RSP_RING 4 | 46 | #define RSP_RING 4 |
51 | #define RSP_ZAOC 5 | 47 | #define RSP_ZAOC 5 |
52 | #define RSP_ZCSTR 6 | 48 | #define RSP_ZCSTR 6 |
53 | #define RSP_ZCFGT 7 | 49 | #define RSP_ZCFGT 7 |
54 | #define RSP_ZCFG 8 | 50 | #define RSP_ZCFG 8 |
55 | #define RSP_ZCCR 9 | 51 | #define RSP_ZCCR 9 |
56 | #define RSP_EMPTY 10 | 52 | #define RSP_EMPTY 10 |
57 | #define RSP_ZLOG 11 | 53 | #define RSP_ZLOG 11 |
58 | #define RSP_ZCAU 12 | 54 | #define RSP_ZCAU 12 |
59 | #define RSP_ZMWI 13 | 55 | #define RSP_ZMWI 13 |
60 | #define RSP_ZABINFO 14 | 56 | #define RSP_ZABINFO 14 |
61 | #define RSP_ZSMLSTCHG 15 | 57 | #define RSP_ZSMLSTCHG 15 |
62 | #define RSP_VAR 100 | 58 | #define RSP_VAR 100 |
63 | #define RSP_ZSAU (RSP_VAR + VAR_ZSAU) | 59 | #define RSP_ZSAU (RSP_VAR + VAR_ZSAU) |
64 | #define RSP_ZDLE (RSP_VAR + VAR_ZDLE) | 60 | #define RSP_ZDLE (RSP_VAR + VAR_ZDLE) |
65 | #define RSP_ZVLS (RSP_VAR + VAR_ZVLS) | 61 | #define RSP_ZVLS (RSP_VAR + VAR_ZVLS) |
66 | #define RSP_ZCTP (RSP_VAR + VAR_ZCTP) | 62 | #define RSP_ZCTP (RSP_VAR + VAR_ZCTP) |
67 | #define RSP_STR (RSP_VAR + VAR_NUM) | 63 | #define RSP_STR (RSP_VAR + VAR_NUM) |
68 | #define RSP_NMBR (RSP_STR + STR_NMBR) | 64 | #define RSP_NMBR (RSP_STR + STR_NMBR) |
69 | #define RSP_ZCPN (RSP_STR + STR_ZCPN) | 65 | #define RSP_ZCPN (RSP_STR + STR_ZCPN) |
70 | #define RSP_ZCON (RSP_STR + STR_ZCON) | 66 | #define RSP_ZCON (RSP_STR + STR_ZCON) |
71 | #define RSP_ZBC (RSP_STR + STR_ZBC) | 67 | #define RSP_ZBC (RSP_STR + STR_ZBC) |
72 | #define RSP_ZHLC (RSP_STR + STR_ZHLC) | 68 | #define RSP_ZHLC (RSP_STR + STR_ZHLC) |
73 | #define RSP_ERROR -1 /* ERROR */ | 69 | #define RSP_ERROR -1 /* ERROR */ |
74 | #define RSP_WRONG_CID -2 /* unknown cid in cmd */ | 70 | #define RSP_WRONG_CID -2 /* unknown cid in cmd */ |
75 | //#define RSP_EMPTY -3 | 71 | //#define RSP_EMPTY -3 |
76 | #define RSP_UNKNOWN -4 /* unknown response */ | 72 | #define RSP_UNKNOWN -4 /* unknown response */ |
77 | #define RSP_FAIL -5 /* internal error */ | 73 | #define RSP_FAIL -5 /* internal error */ |
78 | #define RSP_INVAL -6 /* invalid response */ | 74 | #define RSP_INVAL -6 /* invalid response */ |
79 | 75 | ||
80 | #define RSP_NONE -19 | 76 | #define RSP_NONE -19 |
81 | #define RSP_STRING -20 | 77 | #define RSP_STRING -20 |
82 | #define RSP_NULL -21 | 78 | #define RSP_NULL -21 |
83 | //#define RSP_RETRYFAIL -22 | 79 | //#define RSP_RETRYFAIL -22 |
84 | //#define RSP_RETRY -23 | 80 | //#define RSP_RETRY -23 |
85 | //#define RSP_SKIP -24 | 81 | //#define RSP_SKIP -24 |
86 | #define RSP_INIT -27 | 82 | #define RSP_INIT -27 |
87 | #define RSP_ANY -26 | 83 | #define RSP_ANY -26 |
88 | #define RSP_LAST -28 | 84 | #define RSP_LAST -28 |
89 | #define RSP_NODEV -9 | 85 | #define RSP_NODEV -9 |
90 | 86 | ||
91 | /* actions for process_response */ | 87 | /* actions for process_response */ |
92 | #define ACT_NOTHING 0 | 88 | #define ACT_NOTHING 0 |
@@ -112,7 +108,7 @@ | |||
112 | #define ACT_DISCONNECT 20 | 108 | #define ACT_DISCONNECT 20 |
113 | #define ACT_CONNECT 21 | 109 | #define ACT_CONNECT 21 |
114 | #define ACT_REMOTEREJECT 22 | 110 | #define ACT_REMOTEREJECT 22 |
115 | #define ACT_CONNTIMEOUT 23 | 111 | #define ACT_CONNTIMEOUT 23 |
116 | #define ACT_REMOTEHUP 24 | 112 | #define ACT_REMOTEHUP 24 |
117 | #define ACT_ABORTHUP 25 | 113 | #define ACT_ABORTHUP 25 |
118 | #define ACT_ICALL 26 | 114 | #define ACT_ICALL 26 |
@@ -127,40 +123,40 @@ | |||
127 | #define ACT_ERROR 35 | 123 | #define ACT_ERROR 35 |
128 | #define ACT_ABORTCID 36 | 124 | #define ACT_ABORTCID 36 |
129 | #define ACT_ZCAU 37 | 125 | #define ACT_ZCAU 37 |
130 | #define ACT_NOTIFY_BC_DOWN 38 | 126 | #define ACT_NOTIFY_BC_DOWN 38 |
131 | #define ACT_NOTIFY_BC_UP 39 | 127 | #define ACT_NOTIFY_BC_UP 39 |
132 | #define ACT_DIAL 40 | 128 | #define ACT_DIAL 40 |
133 | #define ACT_ACCEPT 41 | 129 | #define ACT_ACCEPT 41 |
134 | #define ACT_PROTO_L2 42 | 130 | #define ACT_PROTO_L2 42 |
135 | #define ACT_HUP 43 | 131 | #define ACT_HUP 43 |
136 | #define ACT_IF_LOCK 44 | 132 | #define ACT_IF_LOCK 44 |
137 | #define ACT_START 45 | 133 | #define ACT_START 45 |
138 | #define ACT_STOP 46 | 134 | #define ACT_STOP 46 |
139 | #define ACT_FAKEDLE0 47 | 135 | #define ACT_FAKEDLE0 47 |
140 | #define ACT_FAKEHUP 48 | 136 | #define ACT_FAKEHUP 48 |
141 | #define ACT_FAKESDOWN 49 | 137 | #define ACT_FAKESDOWN 49 |
142 | #define ACT_SHUTDOWN 50 | 138 | #define ACT_SHUTDOWN 50 |
143 | #define ACT_PROC_CIDMODE 51 | 139 | #define ACT_PROC_CIDMODE 51 |
144 | #define ACT_UMODESET 52 | 140 | #define ACT_UMODESET 52 |
145 | #define ACT_FAILUMODE 53 | 141 | #define ACT_FAILUMODE 53 |
146 | #define ACT_CMODESET 54 | 142 | #define ACT_CMODESET 54 |
147 | #define ACT_FAILCMODE 55 | 143 | #define ACT_FAILCMODE 55 |
148 | #define ACT_IF_VER 56 | 144 | #define ACT_IF_VER 56 |
149 | #define ACT_CMD 100 | 145 | #define ACT_CMD 100 |
150 | 146 | ||
151 | /* at command sequences */ | 147 | /* at command sequences */ |
152 | #define SEQ_NONE 0 | 148 | #define SEQ_NONE 0 |
153 | #define SEQ_INIT 100 | 149 | #define SEQ_INIT 100 |
154 | #define SEQ_DLE0 200 | 150 | #define SEQ_DLE0 200 |
155 | #define SEQ_DLE1 250 | 151 | #define SEQ_DLE1 250 |
156 | #define SEQ_CID 300 | 152 | #define SEQ_CID 300 |
157 | #define SEQ_NOCID 350 | 153 | #define SEQ_NOCID 350 |
158 | #define SEQ_HUP 400 | 154 | #define SEQ_HUP 400 |
159 | #define SEQ_DIAL 600 | 155 | #define SEQ_DIAL 600 |
160 | #define SEQ_ACCEPT 720 | 156 | #define SEQ_ACCEPT 720 |
161 | #define SEQ_SHUTDOWN 500 | 157 | #define SEQ_SHUTDOWN 500 |
162 | #define SEQ_CIDMODE 10 | 158 | #define SEQ_CIDMODE 10 |
163 | #define SEQ_UMMODE 11 | 159 | #define SEQ_UMMODE 11 |
164 | 160 | ||
165 | 161 | ||
166 | // 100: init, 200: dle0, 250:dle1, 300: get cid (dial), 350: "hup" (no cid), 400: hup, 500: reset, 600: dial, 700: ring | 162 | // 100: init, 200: dle0, 250:dle1, 300: get cid (dial), 350: "hup" (no cid), 400: hup, 500: reset, 600: dial, 700: ring |
@@ -393,7 +389,7 @@ struct reply_t gigaset_tab_cid_m10x[] = /* for M10x */ | |||
393 | 389 | ||
394 | 390 | ||
395 | #if 0 | 391 | #if 0 |
396 | static struct reply_t tab_nocid[]= /* no dle mode */ //FIXME aenderungen uebernehmen | 392 | static struct reply_t tab_nocid[]= /* no dle mode */ //FIXME |
397 | { | 393 | { |
398 | /* resp_code, min_ConState, max_ConState, parameter, new_ConState, timeout, action, command */ | 394 | /* resp_code, min_ConState, max_ConState, parameter, new_ConState, timeout, action, command */ |
399 | 395 | ||
@@ -401,7 +397,7 @@ static struct reply_t tab_nocid[]= /* no dle mode */ //FIXME aenderungen ueberne | |||
401 | {RSP_LAST,0,0,0,0,0,0} | 397 | {RSP_LAST,0,0,0,0,0,0} |
402 | }; | 398 | }; |
403 | 399 | ||
404 | static struct reply_t tab_cid[] = /* no dle mode */ //FIXME aenderungen uebernehmen | 400 | static struct reply_t tab_cid[] = /* no dle mode */ //FIXME |
405 | { | 401 | { |
406 | /* resp_code, min_ConState, max_ConState, parameter, new_ConState, timeout, action, command */ | 402 | /* resp_code, min_ConState, max_ConState, parameter, new_ConState, timeout, action, command */ |
407 | 403 | ||
@@ -412,30 +408,30 @@ static struct reply_t tab_cid[] = /* no dle mode */ //FIXME aenderungen ueberneh | |||
412 | 408 | ||
413 | static struct resp_type_t resp_type[]= | 409 | static struct resp_type_t resp_type[]= |
414 | { | 410 | { |
415 | /*{"", RSP_EMPTY, RT_NOTHING},*/ | 411 | /*{"", RSP_EMPTY, RT_NOTHING},*/ |
416 | {"OK", RSP_OK, RT_NOTHING}, | 412 | {"OK", RSP_OK, RT_NOTHING}, |
417 | {"ERROR", RSP_ERROR, RT_NOTHING}, | 413 | {"ERROR", RSP_ERROR, RT_NOTHING}, |
418 | {"ZSAU", RSP_ZSAU, RT_ZSAU}, | 414 | {"ZSAU", RSP_ZSAU, RT_ZSAU}, |
419 | {"ZCAU", RSP_ZCAU, RT_ZCAU}, | 415 | {"ZCAU", RSP_ZCAU, RT_ZCAU}, |
420 | {"RING", RSP_RING, RT_RING}, | 416 | {"RING", RSP_RING, RT_RING}, |
421 | {"ZGCI", RSP_ZGCI, RT_NUMBER}, | 417 | {"ZGCI", RSP_ZGCI, RT_NUMBER}, |
422 | {"ZVLS", RSP_ZVLS, RT_NUMBER}, | 418 | {"ZVLS", RSP_ZVLS, RT_NUMBER}, |
423 | {"ZCTP", RSP_ZCTP, RT_NUMBER}, | 419 | {"ZCTP", RSP_ZCTP, RT_NUMBER}, |
424 | {"ZDLE", RSP_ZDLE, RT_NUMBER}, | 420 | {"ZDLE", RSP_ZDLE, RT_NUMBER}, |
425 | {"ZCFGT", RSP_ZCFGT, RT_NUMBER}, | 421 | {"ZCFGT", RSP_ZCFGT, RT_NUMBER}, |
426 | {"ZCCR", RSP_ZCCR, RT_NUMBER}, | 422 | {"ZCCR", RSP_ZCCR, RT_NUMBER}, |
427 | {"ZMWI", RSP_ZMWI, RT_NUMBER}, | 423 | {"ZMWI", RSP_ZMWI, RT_NUMBER}, |
428 | {"ZHLC", RSP_ZHLC, RT_STRING}, | 424 | {"ZHLC", RSP_ZHLC, RT_STRING}, |
429 | {"ZBC", RSP_ZBC, RT_STRING}, | 425 | {"ZBC", RSP_ZBC, RT_STRING}, |
430 | {"NMBR", RSP_NMBR, RT_STRING}, | 426 | {"NMBR", RSP_NMBR, RT_STRING}, |
431 | {"ZCPN", RSP_ZCPN, RT_STRING}, | 427 | {"ZCPN", RSP_ZCPN, RT_STRING}, |
432 | {"ZCON", RSP_ZCON, RT_STRING}, | 428 | {"ZCON", RSP_ZCON, RT_STRING}, |
433 | {"ZAOC", RSP_ZAOC, RT_STRING}, | 429 | {"ZAOC", RSP_ZAOC, RT_STRING}, |
434 | {"ZCSTR", RSP_ZCSTR, RT_STRING}, | 430 | {"ZCSTR", RSP_ZCSTR, RT_STRING}, |
435 | {"ZCFG", RSP_ZCFG, RT_HEX}, | 431 | {"ZCFG", RSP_ZCFG, RT_HEX}, |
436 | {"ZLOG", RSP_ZLOG, RT_NOTHING}, | 432 | {"ZLOG", RSP_ZLOG, RT_NOTHING}, |
437 | {"ZABINFO", RSP_ZABINFO, RT_NOTHING}, | 433 | {"ZABINFO", RSP_ZABINFO, RT_NOTHING}, |
438 | {"ZSMLSTCHG", RSP_ZSMLSTCHG, RT_NOTHING}, | 434 | {"ZSMLSTCHG", RSP_ZSMLSTCHG, RT_NOTHING}, |
439 | {NULL,0,0} | 435 | {NULL,0,0} |
440 | }; | 436 | }; |
441 | 437 | ||
@@ -837,7 +833,8 @@ static void schedule_init(struct cardstate *cs, int state) | |||
837 | dbg(DEBUG_CMD, "Scheduling PC_INIT"); | 833 | dbg(DEBUG_CMD, "Scheduling PC_INIT"); |
838 | } | 834 | } |
839 | 835 | ||
840 | /* Add "AT" to a command, add the cid, dle encode it, send the result to the hardware. */ | 836 | /* Add "AT" to a command, add the cid, dle encode it, send the result to the |
837 | hardware. */ | ||
841 | static void send_command(struct cardstate *cs, const char *cmd, int cid, | 838 | static void send_command(struct cardstate *cs, const char *cmd, int cid, |
842 | int dle, gfp_t kmallocflags) | 839 | int dle, gfp_t kmallocflags) |
843 | { | 840 | { |
@@ -966,19 +963,13 @@ static void start_dial(struct at_state_t *at_state, void *data, int seq_index) | |||
966 | 963 | ||
967 | at_state->pending_commands |= PC_CID; | 964 | at_state->pending_commands |= PC_CID; |
968 | dbg(DEBUG_CMD, "Scheduling PC_CID"); | 965 | dbg(DEBUG_CMD, "Scheduling PC_CID"); |
969 | //#ifdef GIG_MAYINITONDIAL | 966 | atomic_set(&cs->commands_pending, 1); |
970 | // if (atomic_read(&cs->MState) == MS_UNKNOWN) { | ||
971 | // cs->at_state.pending_commands |= PC_INIT; | ||
972 | // dbg(DEBUG_CMD, "Scheduling PC_INIT"); | ||
973 | // } | ||
974 | //#endif | ||
975 | atomic_set(&cs->commands_pending, 1); //FIXME | ||
976 | return; | 967 | return; |
977 | 968 | ||
978 | error: | 969 | error: |
979 | at_state->pending_commands |= PC_NOCID; | 970 | at_state->pending_commands |= PC_NOCID; |
980 | dbg(DEBUG_CMD, "Scheduling PC_NOCID"); | 971 | dbg(DEBUG_CMD, "Scheduling PC_NOCID"); |
981 | atomic_set(&cs->commands_pending, 1); //FIXME | 972 | atomic_set(&cs->commands_pending, 1); |
982 | return; | 973 | return; |
983 | } | 974 | } |
984 | 975 | ||
@@ -992,12 +983,12 @@ static void start_accept(struct at_state_t *at_state) | |||
992 | if (retval == 0) { | 983 | if (retval == 0) { |
993 | at_state->pending_commands |= PC_ACCEPT; | 984 | at_state->pending_commands |= PC_ACCEPT; |
994 | dbg(DEBUG_CMD, "Scheduling PC_ACCEPT"); | 985 | dbg(DEBUG_CMD, "Scheduling PC_ACCEPT"); |
995 | atomic_set(&cs->commands_pending, 1); //FIXME | 986 | atomic_set(&cs->commands_pending, 1); |
996 | } else { | 987 | } else { |
997 | //FIXME | 988 | //FIXME |
998 | at_state->pending_commands |= PC_HUP; | 989 | at_state->pending_commands |= PC_HUP; |
999 | dbg(DEBUG_CMD, "Scheduling PC_HUP"); | 990 | dbg(DEBUG_CMD, "Scheduling PC_HUP"); |
1000 | atomic_set(&cs->commands_pending, 1); //FIXME | 991 | atomic_set(&cs->commands_pending, 1); |
1001 | } | 992 | } |
1002 | } | 993 | } |
1003 | 994 | ||
@@ -1037,9 +1028,8 @@ static void do_shutdown(struct cardstate *cs) | |||
1037 | if (atomic_read(&cs->mstate) == MS_READY) { | 1028 | if (atomic_read(&cs->mstate) == MS_READY) { |
1038 | atomic_set(&cs->mstate, MS_SHUTDOWN); | 1029 | atomic_set(&cs->mstate, MS_SHUTDOWN); |
1039 | cs->at_state.pending_commands |= PC_SHUTDOWN; | 1030 | cs->at_state.pending_commands |= PC_SHUTDOWN; |
1040 | atomic_set(&cs->commands_pending, 1); //FIXME | 1031 | atomic_set(&cs->commands_pending, 1); |
1041 | dbg(DEBUG_CMD, "Scheduling PC_SHUTDOWN"); //FIXME | 1032 | dbg(DEBUG_CMD, "Scheduling PC_SHUTDOWN"); |
1042 | //gigaset_schedule_event(cs); //FIXME | ||
1043 | } else | 1033 | } else |
1044 | finish_shutdown(cs); | 1034 | finish_shutdown(cs); |
1045 | } | 1035 | } |
@@ -1160,7 +1150,6 @@ static int do_lock(struct cardstate *cs) | |||
1160 | mode = atomic_read(&cs->mode); | 1150 | mode = atomic_read(&cs->mode); |
1161 | atomic_set(&cs->mstate, MS_LOCKED); | 1151 | atomic_set(&cs->mstate, MS_LOCKED); |
1162 | atomic_set(&cs->mode, M_UNKNOWN); | 1152 | atomic_set(&cs->mode, M_UNKNOWN); |
1163 | //FIXME reset card state / at states / bcs states | ||
1164 | 1153 | ||
1165 | return mode; | 1154 | return mode; |
1166 | } | 1155 | } |
@@ -1173,7 +1162,6 @@ static int do_unlock(struct cardstate *cs) | |||
1173 | atomic_set(&cs->mstate, MS_UNINITIALIZED); | 1162 | atomic_set(&cs->mstate, MS_UNINITIALIZED); |
1174 | atomic_set(&cs->mode, M_UNKNOWN); | 1163 | atomic_set(&cs->mode, M_UNKNOWN); |
1175 | gigaset_free_channels(cs); | 1164 | gigaset_free_channels(cs); |
1176 | //FIXME reset card state / at states / bcs states | ||
1177 | if (atomic_read(&cs->connected)) | 1165 | if (atomic_read(&cs->connected)) |
1178 | schedule_init(cs, MS_INIT); | 1166 | schedule_init(cs, MS_INIT); |
1179 | 1167 | ||
@@ -1203,7 +1191,6 @@ static void do_action(int action, struct cardstate *cs, | |||
1203 | at_state->waiting = 1; | 1191 | at_state->waiting = 1; |
1204 | break; | 1192 | break; |
1205 | case ACT_INIT: | 1193 | case ACT_INIT: |
1206 | //FIXME setup everything | ||
1207 | cs->at_state.pending_commands &= ~PC_INIT; | 1194 | cs->at_state.pending_commands &= ~PC_INIT; |
1208 | cs->cur_at_seq = SEQ_NONE; | 1195 | cs->cur_at_seq = SEQ_NONE; |
1209 | atomic_set(&cs->mode, M_UNIMODEM); | 1196 | atomic_set(&cs->mode, M_UNIMODEM); |
@@ -1213,7 +1200,7 @@ static void do_action(int action, struct cardstate *cs, | |||
1213 | break; | 1200 | break; |
1214 | } | 1201 | } |
1215 | cs->at_state.pending_commands |= PC_CIDMODE; | 1202 | cs->at_state.pending_commands |= PC_CIDMODE; |
1216 | atomic_set(&cs->commands_pending, 1); //FIXME | 1203 | atomic_set(&cs->commands_pending, 1); |
1217 | dbg(DEBUG_CMD, "Scheduling PC_CIDMODE"); | 1204 | dbg(DEBUG_CMD, "Scheduling PC_CIDMODE"); |
1218 | break; | 1205 | break; |
1219 | case ACT_FAILINIT: | 1206 | case ACT_FAILINIT: |
@@ -1428,7 +1415,8 @@ static void do_action(int action, struct cardstate *cs, | |||
1428 | at_state->pending_commands |= PC_HUP; | 1415 | at_state->pending_commands |= PC_HUP; |
1429 | atomic_set(&cs->commands_pending, 1); | 1416 | atomic_set(&cs->commands_pending, 1); |
1430 | break; | 1417 | break; |
1431 | case ACT_GETSTRING: /* warning: RING, ZDLE, ... are not handled properly any more */ | 1418 | case ACT_GETSTRING: /* warning: RING, ZDLE, ... |
1419 | are not handled properly any more */ | ||
1432 | at_state->getstring = 1; | 1420 | at_state->getstring = 1; |
1433 | break; | 1421 | break; |
1434 | case ACT_SETVER: | 1422 | case ACT_SETVER: |
@@ -1522,7 +1510,7 @@ static void do_action(int action, struct cardstate *cs, | |||
1522 | break; | 1510 | break; |
1523 | case ACT_HUP: | 1511 | case ACT_HUP: |
1524 | at_state->pending_commands |= PC_HUP; | 1512 | at_state->pending_commands |= PC_HUP; |
1525 | atomic_set(&cs->commands_pending, 1); //FIXME | 1513 | atomic_set(&cs->commands_pending, 1); |
1526 | dbg(DEBUG_CMD, "Scheduling PC_HUP"); | 1514 | dbg(DEBUG_CMD, "Scheduling PC_HUP"); |
1527 | break; | 1515 | break; |
1528 | 1516 | ||
@@ -1649,7 +1637,8 @@ static void process_event(struct cardstate *cs, struct event_t *ev) | |||
1649 | dbg(DEBUG_ANY, "stopped waiting"); | 1637 | dbg(DEBUG_ANY, "stopped waiting"); |
1650 | } | 1638 | } |
1651 | 1639 | ||
1652 | /* if the response belongs to a variable in at_state->int_var[VAR_XXXX] or at_state->str_var[STR_XXXX], set it */ | 1640 | /* if the response belongs to a variable in at_state->int_var[VAR_XXXX] |
1641 | or at_state->str_var[STR_XXXX], set it */ | ||
1653 | if (ev->type >= RSP_VAR && ev->type < RSP_VAR + VAR_NUM) { | 1642 | if (ev->type >= RSP_VAR && ev->type < RSP_VAR + VAR_NUM) { |
1654 | index = ev->type - RSP_VAR; | 1643 | index = ev->type - RSP_VAR; |
1655 | at_state->int_var[index] = ev->parameter; | 1644 | at_state->int_var[index] = ev->parameter; |
@@ -1657,13 +1646,15 @@ static void process_event(struct cardstate *cs, struct event_t *ev) | |||
1657 | index = ev->type - RSP_STR; | 1646 | index = ev->type - RSP_STR; |
1658 | kfree(at_state->str_var[index]); | 1647 | kfree(at_state->str_var[index]); |
1659 | at_state->str_var[index] = ev->ptr; | 1648 | at_state->str_var[index] = ev->ptr; |
1660 | ev->ptr = NULL; /* prevent process_events() from deallocating ptr */ | 1649 | ev->ptr = NULL; /* prevent process_events() from |
1650 | deallocating ptr */ | ||
1661 | } | 1651 | } |
1662 | 1652 | ||
1663 | if (ev->type == EV_TIMEOUT || ev->type == RSP_STRING) | 1653 | if (ev->type == EV_TIMEOUT || ev->type == RSP_STRING) |
1664 | at_state->getstring = 0; | 1654 | at_state->getstring = 0; |
1665 | 1655 | ||
1666 | /* Search row in dial array which matches modem response and current constate */ | 1656 | /* Search row in dial array which matches modem response and current |
1657 | constate */ | ||
1667 | for (;; rep++) { | 1658 | for (;; rep++) { |
1668 | rcode = rep->resp_code; | 1659 | rcode = rep->resp_code; |
1669 | /* dbg (DEBUG_ANY, "rcode %d", rcode); */ | 1660 | /* dbg (DEBUG_ANY, "rcode %d", rcode); */ |
@@ -1865,11 +1856,7 @@ static void process_command_flags(struct cardstate *cs) | |||
1865 | if (cs->at_state.pending_commands & PC_CIDMODE) { | 1856 | if (cs->at_state.pending_commands & PC_CIDMODE) { |
1866 | cs->at_state.pending_commands &= ~PC_CIDMODE; | 1857 | cs->at_state.pending_commands &= ~PC_CIDMODE; |
1867 | if (atomic_read(&cs->mode) == M_UNIMODEM) { | 1858 | if (atomic_read(&cs->mode) == M_UNIMODEM) { |
1868 | #if 0 | ||
1869 | cs->retry_count = 2; | ||
1870 | #else | ||
1871 | cs->retry_count = 1; | 1859 | cs->retry_count = 1; |
1872 | #endif | ||
1873 | schedule_sequence(cs, &cs->at_state, SEQ_CIDMODE); | 1860 | schedule_sequence(cs, &cs->at_state, SEQ_CIDMODE); |
1874 | return; | 1861 | return; |
1875 | } | 1862 | } |
diff --git a/drivers/isdn/gigaset/gigaset.h b/drivers/isdn/gigaset/gigaset.h index 729edcdb6dac..d34f0023ac74 100644 --- a/drivers/isdn/gigaset/gigaset.h +++ b/drivers/isdn/gigaset/gigaset.h | |||
@@ -1,11 +1,16 @@ | |||
1 | /* Siemens Gigaset 307x driver | 1 | /* |
2 | * Siemens Gigaset 307x driver | ||
2 | * Common header file for all connection variants | 3 | * Common header file for all connection variants |
3 | * | 4 | * |
4 | * Written by Stefan Eilers <Eilers.Stefan@epost.de> | 5 | * Written by Stefan Eilers <Eilers.Stefan@epost.de> |
5 | * and Hansjoerg Lipp <hjlipp@web.de> | 6 | * and Hansjoerg Lipp <hjlipp@web.de> |
6 | * | 7 | * |
7 | * Version: $Id: gigaset.h,v 1.97.4.26 2006/02/04 18:28:16 hjlipp Exp $ | 8 | * ===================================================================== |
8 | * =========================================================================== | 9 | * This program is free software; you can redistribute it and/or |
10 | * modify it under the terms of the GNU General Public License as | ||
11 | * published by the Free Software Foundation; either version 2 of | ||
12 | * the License, or (at your option) any later version. | ||
13 | * ===================================================================== | ||
9 | */ | 14 | */ |
10 | 15 | ||
11 | #ifndef GIGASET_H | 16 | #ifndef GIGASET_H |
@@ -15,7 +20,6 @@ | |||
15 | #include <linux/kernel.h> | 20 | #include <linux/kernel.h> |
16 | #include <linux/compiler.h> | 21 | #include <linux/compiler.h> |
17 | #include <linux/types.h> | 22 | #include <linux/types.h> |
18 | #include <asm/atomic.h> | ||
19 | #include <linux/spinlock.h> | 23 | #include <linux/spinlock.h> |
20 | #include <linux/isdnif.h> | 24 | #include <linux/isdnif.h> |
21 | #include <linux/usb.h> | 25 | #include <linux/usb.h> |
@@ -27,21 +31,22 @@ | |||
27 | #include <linux/tty.h> | 31 | #include <linux/tty.h> |
28 | #include <linux/tty_driver.h> | 32 | #include <linux/tty_driver.h> |
29 | #include <linux/list.h> | 33 | #include <linux/list.h> |
34 | #include <asm/atomic.h> | ||
30 | 35 | ||
31 | #define GIG_VERSION {0,5,0,0} | 36 | #define GIG_VERSION {0,5,0,0} |
32 | #define GIG_COMPAT {0,4,0,0} | 37 | #define GIG_COMPAT {0,4,0,0} |
33 | 38 | ||
34 | #define MAX_REC_PARAMS 10 /* Max. number of params in response string */ | 39 | #define MAX_REC_PARAMS 10 /* Max. number of params in response string */ |
35 | #define MAX_RESP_SIZE 512 /* Max. size of a response string */ | 40 | #define MAX_RESP_SIZE 512 /* Max. size of a response string */ |
36 | #define HW_HDR_LEN 2 /* Header size used to store ack info */ | 41 | #define HW_HDR_LEN 2 /* Header size used to store ack info */ |
37 | 42 | ||
38 | #define MAX_EVENTS 64 /* size of event queue */ | 43 | #define MAX_EVENTS 64 /* size of event queue */ |
39 | 44 | ||
40 | #define RBUFSIZE 8192 | 45 | #define RBUFSIZE 8192 |
41 | #define SBUFSIZE 4096 /* sk_buff payload size */ | 46 | #define SBUFSIZE 4096 /* sk_buff payload size */ |
42 | 47 | ||
43 | #define MAX_BUF_SIZE (SBUFSIZE - 2) /* Max. size of a data packet from LL */ | 48 | #define TRANSBUFSIZE 768 /* bytes per skb for transparent receive */ |
44 | #define TRANSBUFSIZE 768 /* bytes per skb for transparent receive */ | 49 | #define MAX_BUF_SIZE (SBUFSIZE - 2) /* Max. size of a data packet from LL */ |
45 | 50 | ||
46 | /* compile time options */ | 51 | /* compile time options */ |
47 | #define GIG_MAJOR 0 | 52 | #define GIG_MAJOR 0 |
@@ -67,68 +72,108 @@ | |||
67 | 72 | ||
68 | #define MAXACT 3 | 73 | #define MAXACT 3 |
69 | 74 | ||
70 | #define IFNULL(a) if (unlikely(!(a))) | 75 | #define IFNULL(a) \ |
71 | #define IFNULLRET(a) if (unlikely(!(a))) {err("%s==NULL at %s:%d!", #a, __FILE__, __LINE__); return; } | 76 | if (unlikely(!(a))) |
72 | #define IFNULLRETVAL(a,b) if (unlikely(!(a))) {err("%s==NULL at %s:%d!", #a, __FILE__, __LINE__); return (b); } | 77 | |
73 | #define IFNULLCONT(a) if (unlikely(!(a))) {err("%s==NULL at %s:%d!", #a, __FILE__, __LINE__); continue; } | 78 | #define IFNULLRET(a) \ |
74 | #define IFNULLGOTO(a,b) if (unlikely(!(a))) {err("%s==NULL at %s:%d!", #a, __FILE__, __LINE__); goto b; } | 79 | if (unlikely(!(a))) { \ |
80 | err("%s==NULL at %s:%d!", #a, __FILE__, __LINE__); \ | ||
81 | return; \ | ||
82 | } | ||
83 | |||
84 | #define IFNULLRETVAL(a,b) \ | ||
85 | if (unlikely(!(a))) { \ | ||
86 | err("%s==NULL at %s:%d!", #a, __FILE__, __LINE__); \ | ||
87 | return (b); \ | ||
88 | } | ||
89 | |||
90 | #define IFNULLCONT(a) \ | ||
91 | if (unlikely(!(a))) { \ | ||
92 | err("%s==NULL at %s:%d!", #a, __FILE__, __LINE__); \ | ||
93 | continue; \ | ||
94 | } | ||
95 | |||
96 | #define IFNULLGOTO(a,b) \ | ||
97 | if (unlikely(!(a))) { \ | ||
98 | err("%s==NULL at %s:%d!", #a, __FILE__, __LINE__); \ | ||
99 | goto b; \ | ||
100 | } | ||
75 | 101 | ||
76 | extern int gigaset_debuglevel; /* "needs" cast to (enum debuglevel) */ | 102 | extern int gigaset_debuglevel; /* "needs" cast to (enum debuglevel) */ |
77 | 103 | ||
78 | /* any combination of these can be given with the 'debug=' parameter to insmod, e.g. | 104 | /* any combination of these can be given with the 'debug=' parameter to insmod, |
79 | * 'insmod usb_gigaset.o debug=0x2c' will set DEBUG_OPEN, DEBUG_CMD and DEBUG_INTR. */ | 105 | * e.g. 'insmod usb_gigaset.o debug=0x2c' will set DEBUG_OPEN, DEBUG_CMD and |
106 | * DEBUG_INTR. | ||
107 | */ | ||
80 | enum debuglevel { /* up to 24 bits (atomic_t) */ | 108 | enum debuglevel { /* up to 24 bits (atomic_t) */ |
81 | DEBUG_REG = 0x0002, /* serial port I/O register operations */ | 109 | DEBUG_REG = 0x0002,/* serial port I/O register operations */ |
82 | DEBUG_OPEN = 0x0004, /* open/close serial port */ | 110 | DEBUG_OPEN = 0x0004, /* open/close serial port */ |
83 | DEBUG_INTR = 0x0008, /* interrupt processing */ | 111 | DEBUG_INTR = 0x0008, /* interrupt processing */ |
84 | DEBUG_INTR_DUMP = 0x0010, /* Activating hexdump debug output on interrupt | 112 | DEBUG_INTR_DUMP = 0x0010, /* Activating hexdump debug output on |
85 | requests, not available as run-time option */ | 113 | interrupt requests, not available as |
114 | run-time option */ | ||
86 | DEBUG_CMD = 0x00020, /* sent/received LL commands */ | 115 | DEBUG_CMD = 0x00020, /* sent/received LL commands */ |
87 | DEBUG_STREAM = 0x00040, /* application data stream I/O events */ | 116 | DEBUG_STREAM = 0x00040, /* application data stream I/O events */ |
88 | DEBUG_STREAM_DUMP = 0x00080, /* application data stream content */ | 117 | DEBUG_STREAM_DUMP = 0x00080, /* application data stream content */ |
89 | DEBUG_LLDATA = 0x00100, /* sent/received LL data */ | 118 | DEBUG_LLDATA = 0x00100, /* sent/received LL data */ |
90 | DEBUG_INTR_0 = 0x00200, /* serial port output interrupt processing */ | 119 | DEBUG_INTR_0 = 0x00200, /* serial port interrupt processing */ |
91 | DEBUG_DRIVER = 0x00400, /* driver structure */ | 120 | DEBUG_DRIVER = 0x00400, /* driver structure */ |
92 | DEBUG_HDLC = 0x00800, /* M10x HDLC processing */ | 121 | DEBUG_HDLC = 0x00800, /* M10x HDLC processing */ |
93 | DEBUG_WRITE = 0x01000, /* M105 data write */ | 122 | DEBUG_WRITE = 0x01000, /* M105 data write */ |
94 | DEBUG_TRANSCMD = 0x02000, /*AT-COMMANDS+RESPONSES*/ | 123 | DEBUG_TRANSCMD = 0x02000, /* AT-COMMANDS+RESPONSES */ |
95 | DEBUG_MCMD = 0x04000, /*COMMANDS THAT ARE SENT VERY OFTEN*/ | 124 | DEBUG_MCMD = 0x04000, /* COMMANDS THAT ARE SENT VERY OFTEN */ |
96 | DEBUG_INIT = 0x08000, /* (de)allocation+initialization of data structures */ | 125 | DEBUG_INIT = 0x08000, /* (de)allocation+initialization of data |
126 | structures */ | ||
97 | DEBUG_LOCK = 0x10000, /* semaphore operations */ | 127 | DEBUG_LOCK = 0x10000, /* semaphore operations */ |
98 | DEBUG_OUTPUT = 0x20000, /* output to device */ | 128 | DEBUG_OUTPUT = 0x20000, /* output to device */ |
99 | DEBUG_ISO = 0x40000, /* isochronous transfers */ | 129 | DEBUG_ISO = 0x40000, /* isochronous transfers */ |
100 | DEBUG_IF = 0x80000, /* character device operations */ | 130 | DEBUG_IF = 0x80000, /* character device operations */ |
101 | DEBUG_USBREQ = 0x100000, /* USB communication (except payload data) */ | 131 | DEBUG_USBREQ = 0x100000, /* USB communication (except payload |
102 | DEBUG_LOCKCMD = 0x200000, /* AT commands and responses when MS_LOCKED */ | 132 | data) */ |
133 | DEBUG_LOCKCMD = 0x200000, /* AT commands and responses when | ||
134 | MS_LOCKED */ | ||
103 | 135 | ||
104 | DEBUG_ANY = 0x3fffff, /* print message if any of the others is activated */ | 136 | DEBUG_ANY = 0x3fffff, /* print message if any of the others is |
137 | activated */ | ||
105 | }; | 138 | }; |
106 | 139 | ||
107 | #ifdef CONFIG_GIGASET_DEBUG | 140 | #ifdef CONFIG_GIGASET_DEBUG |
108 | #define DEBUG_DEFAULT (DEBUG_INIT | DEBUG_TRANSCMD | DEBUG_CMD | DEBUG_USBREQ) | 141 | #define DEBUG_DEFAULT (DEBUG_INIT | DEBUG_TRANSCMD | DEBUG_CMD | DEBUG_USBREQ) |
109 | //#define DEBUG_DEFAULT (DEBUG_LOCK | DEBUG_INIT | DEBUG_TRANSCMD | DEBUG_CMD | DEBUF_IF | DEBUG_DRIVER | DEBUG_OUTPUT | DEBUG_INTR) | ||
110 | #else | 142 | #else |
111 | #define DEBUG_DEFAULT 0 | 143 | #define DEBUG_DEFAULT 0 |
112 | #endif | 144 | #endif |
113 | 145 | ||
114 | /* redefine syslog macros to prepend module name instead of entire source path */ | 146 | /* redefine syslog macros to prepend module name instead of entire |
115 | /* The space before the comma in ", ##" is needed by gcc 2.95 */ | 147 | * source path */ |
116 | #undef info | 148 | #undef info |
117 | #define info(format, arg...) printk(KERN_INFO "%s: " format "\n", THIS_MODULE ? THIS_MODULE->name : "gigaset_hw" , ## arg) | 149 | #define info(format, arg...) \ |
150 | printk(KERN_INFO "%s: " format "\n", \ | ||
151 | THIS_MODULE ? THIS_MODULE->name : "gigaset_hw" , ## arg) | ||
118 | 152 | ||
119 | #undef notice | 153 | #undef notice |
120 | #define notice(format, arg...) printk(KERN_NOTICE "%s: " format "\n", THIS_MODULE ? THIS_MODULE->name : "gigaset_hw" , ## arg) | 154 | #define notice(format, arg...) \ |
155 | printk(KERN_NOTICE "%s: " format "\n", \ | ||
156 | THIS_MODULE ? THIS_MODULE->name : "gigaset_hw" , ## arg) | ||
121 | 157 | ||
122 | #undef warn | 158 | #undef warn |
123 | #define warn(format, arg...) printk(KERN_WARNING "%s: " format "\n", THIS_MODULE ? THIS_MODULE->name : "gigaset_hw" , ## arg) | 159 | #define warn(format, arg...) \ |
160 | printk(KERN_WARNING "%s: " format "\n", \ | ||
161 | THIS_MODULE ? THIS_MODULE->name : "gigaset_hw" , ## arg) | ||
124 | 162 | ||
125 | #undef err | 163 | #undef err |
126 | #define err(format, arg...) printk(KERN_ERR "%s: " format "\n", THIS_MODULE ? THIS_MODULE->name : "gigaset_hw" , ## arg) | 164 | #define err(format, arg...) \ |
165 | printk(KERN_ERR "%s: " format "\n", \ | ||
166 | THIS_MODULE ? THIS_MODULE->name : "gigaset_hw" , ## arg) | ||
127 | 167 | ||
128 | #undef dbg | 168 | #undef dbg |
129 | #ifdef CONFIG_GIGASET_DEBUG | 169 | #ifdef CONFIG_GIGASET_DEBUG |
130 | #define dbg(level, format, arg...) do { if (unlikely(((enum debuglevel)gigaset_debuglevel) & (level))) \ | 170 | #define dbg(level, format, arg...) \ |
131 | printk(KERN_DEBUG "%s: " format "\n", THIS_MODULE ? THIS_MODULE->name : "gigaset_hw" , ## arg); } while (0) | 171 | do { \ |
172 | if (unlikely(((enum debuglevel)gigaset_debuglevel) & (level))) \ | ||
173 | printk(KERN_DEBUG "%s: " format "\n", \ | ||
174 | THIS_MODULE ? THIS_MODULE->name : "gigaset_hw" \ | ||
175 | , ## arg); \ | ||
176 | } while (0) | ||
132 | #else | 177 | #else |
133 | #define dbg(level, format, arg...) do {} while (0) | 178 | #define dbg(level, format, arg...) do {} while (0) |
134 | #endif | 179 | #endif |
@@ -148,13 +193,14 @@ void gigaset_dbg_buffer(enum debuglevel level, const unsigned char *msg, | |||
148 | #define ZSAU_UNKNOWN -1 | 193 | #define ZSAU_UNKNOWN -1 |
149 | 194 | ||
150 | /* USB control transfer requests */ | 195 | /* USB control transfer requests */ |
151 | #define OUT_VENDOR_REQ (USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_ENDPOINT) | 196 | #define OUT_VENDOR_REQ (USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_ENDPOINT) |
152 | #define IN_VENDOR_REQ (USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_ENDPOINT) | 197 | #define IN_VENDOR_REQ (USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_ENDPOINT) |
153 | 198 | ||
154 | /* int-in-events 3070 */ | 199 | /* int-in-events 3070 */ |
155 | #define HD_B1_FLOW_CONTROL 0x80 | 200 | #define HD_B1_FLOW_CONTROL 0x80 |
156 | #define HD_B2_FLOW_CONTROL 0x81 | 201 | #define HD_B2_FLOW_CONTROL 0x81 |
157 | #define HD_RECEIVEATDATA_ACK (0x35) // 3070 // att: HD_RECEIVE>>AT<<DATA_ACK | 202 | #define HD_RECEIVEATDATA_ACK (0x35) // 3070 |
203 | // att: HD_RECEIVE>>AT<<DATA_ACK | ||
158 | #define HD_READY_SEND_ATDATA (0x36) // 3070 | 204 | #define HD_READY_SEND_ATDATA (0x36) // 3070 |
159 | #define HD_OPEN_ATCHANNEL_ACK (0x37) // 3070 | 205 | #define HD_OPEN_ATCHANNEL_ACK (0x37) // 3070 |
160 | #define HD_CLOSE_ATCHANNEL_ACK (0x38) // 3070 | 206 | #define HD_CLOSE_ATCHANNEL_ACK (0x38) // 3070 |
@@ -181,17 +227,18 @@ void gigaset_dbg_buffer(enum debuglevel level, const unsigned char *msg, | |||
181 | #define HD_CLOSE_ATCHANNEL (0x29) // 3070 | 227 | #define HD_CLOSE_ATCHANNEL (0x29) // 3070 |
182 | 228 | ||
183 | /* USB frames for isochronous transfer */ | 229 | /* USB frames for isochronous transfer */ |
184 | #define BAS_FRAMETIME 1 /* number of milliseconds between frames */ | 230 | #define BAS_FRAMETIME 1 /* number of milliseconds between frames */ |
185 | #define BAS_NUMFRAMES 8 /* number of frames per URB */ | 231 | #define BAS_NUMFRAMES 8 /* number of frames per URB */ |
186 | #define BAS_MAXFRAME 16 /* allocated bytes per frame */ | 232 | #define BAS_MAXFRAME 16 /* allocated bytes per frame */ |
187 | #define BAS_NORMFRAME 8 /* send size without flow control */ | 233 | #define BAS_NORMFRAME 8 /* send size without flow control */ |
188 | #define BAS_HIGHFRAME 10 /* " " with positive flow control */ | 234 | #define BAS_HIGHFRAME 10 /* " " with positive flow control */ |
189 | #define BAS_LOWFRAME 5 /* " " with negative flow control */ | 235 | #define BAS_LOWFRAME 5 /* " " with negative flow control */ |
190 | #define BAS_CORRFRAMES 4 /* flow control multiplicator */ | 236 | #define BAS_CORRFRAMES 4 /* flow control multiplicator */ |
191 | 237 | ||
192 | #define BAS_INBUFSIZE (BAS_MAXFRAME * BAS_NUMFRAMES) /* size of isochronous input buffer per URB */ | 238 | #define BAS_INBUFSIZE (BAS_MAXFRAME * BAS_NUMFRAMES) |
193 | #define BAS_OUTBUFSIZE 4096 /* size of common isochronous output buffer */ | 239 | /* size of isoc in buf per URB */ |
194 | #define BAS_OUTBUFPAD BAS_MAXFRAME /* size of pad area for isochronous output buffer */ | 240 | #define BAS_OUTBUFSIZE 4096 /* size of common isoc out buffer */ |
241 | #define BAS_OUTBUFPAD BAS_MAXFRAME /* size of pad area for isoc out buf */ | ||
195 | 242 | ||
196 | #define BAS_INURBS 3 | 243 | #define BAS_INURBS 3 |
197 | #define BAS_OUTURBS 3 | 244 | #define BAS_OUTURBS 3 |
@@ -207,40 +254,40 @@ void gigaset_dbg_buffer(enum debuglevel level, const unsigned char *msg, | |||
207 | #define AT_NUM 7 | 254 | #define AT_NUM 7 |
208 | 255 | ||
209 | /* variables in struct at_state_t */ | 256 | /* variables in struct at_state_t */ |
210 | #define VAR_ZSAU 0 | 257 | #define VAR_ZSAU 0 |
211 | #define VAR_ZDLE 1 | 258 | #define VAR_ZDLE 1 |
212 | #define VAR_ZVLS 2 | 259 | #define VAR_ZVLS 2 |
213 | #define VAR_ZCTP 3 | 260 | #define VAR_ZCTP 3 |
214 | #define VAR_NUM 4 | 261 | #define VAR_NUM 4 |
215 | 262 | ||
216 | #define STR_NMBR 0 | 263 | #define STR_NMBR 0 |
217 | #define STR_ZCPN 1 | 264 | #define STR_ZCPN 1 |
218 | #define STR_ZCON 2 | 265 | #define STR_ZCON 2 |
219 | #define STR_ZBC 3 | 266 | #define STR_ZBC 3 |
220 | #define STR_ZHLC 4 | 267 | #define STR_ZHLC 4 |
221 | #define STR_NUM 5 | 268 | #define STR_NUM 5 |
222 | 269 | ||
223 | #define EV_TIMEOUT -105 | 270 | #define EV_TIMEOUT -105 |
224 | #define EV_IF_VER -106 | 271 | #define EV_IF_VER -106 |
225 | #define EV_PROC_CIDMODE -107 | 272 | #define EV_PROC_CIDMODE -107 |
226 | #define EV_SHUTDOWN -108 | 273 | #define EV_SHUTDOWN -108 |
227 | #define EV_START -110 | 274 | #define EV_START -110 |
228 | #define EV_STOP -111 | 275 | #define EV_STOP -111 |
229 | #define EV_IF_LOCK -112 | 276 | #define EV_IF_LOCK -112 |
230 | #define EV_PROTO_L2 -113 | 277 | #define EV_PROTO_L2 -113 |
231 | #define EV_ACCEPT -114 | 278 | #define EV_ACCEPT -114 |
232 | #define EV_DIAL -115 | 279 | #define EV_DIAL -115 |
233 | #define EV_HUP -116 | 280 | #define EV_HUP -116 |
234 | #define EV_BC_OPEN -117 | 281 | #define EV_BC_OPEN -117 |
235 | #define EV_BC_CLOSED -118 | 282 | #define EV_BC_CLOSED -118 |
236 | 283 | ||
237 | /* input state */ | 284 | /* input state */ |
238 | #define INS_command 0x0001 | 285 | #define INS_command 0x0001 |
239 | #define INS_DLE_char 0x0002 | 286 | #define INS_DLE_char 0x0002 |
240 | #define INS_byte_stuff 0x0004 | 287 | #define INS_byte_stuff 0x0004 |
241 | #define INS_have_data 0x0008 | 288 | #define INS_have_data 0x0008 |
242 | #define INS_skip_frame 0x0010 | 289 | #define INS_skip_frame 0x0010 |
243 | #define INS_DLE_command 0x0020 | 290 | #define INS_DLE_command 0x0020 |
244 | #define INS_flag_hunt 0x0040 | 291 | #define INS_flag_hunt 0x0040 |
245 | 292 | ||
246 | /* channel state */ | 293 | /* channel state */ |
@@ -248,27 +295,27 @@ void gigaset_dbg_buffer(enum debuglevel level, const unsigned char *msg, | |||
248 | #define CHS_B_UP 0x02 | 295 | #define CHS_B_UP 0x02 |
249 | #define CHS_NOTIFY_LL 0x04 | 296 | #define CHS_NOTIFY_LL 0x04 |
250 | 297 | ||
251 | #define ICALL_REJECT 0 | 298 | #define ICALL_REJECT 0 |
252 | #define ICALL_ACCEPT 1 | 299 | #define ICALL_ACCEPT 1 |
253 | #define ICALL_IGNORE 2 | 300 | #define ICALL_IGNORE 2 |
254 | 301 | ||
255 | /* device state */ | 302 | /* device state */ |
256 | #define MS_UNINITIALIZED 0 | 303 | #define MS_UNINITIALIZED 0 |
257 | #define MS_INIT 1 | 304 | #define MS_INIT 1 |
258 | #define MS_LOCKED 2 | 305 | #define MS_LOCKED 2 |
259 | #define MS_SHUTDOWN 3 | 306 | #define MS_SHUTDOWN 3 |
260 | #define MS_RECOVER 4 | 307 | #define MS_RECOVER 4 |
261 | #define MS_READY 5 | 308 | #define MS_READY 5 |
262 | 309 | ||
263 | /* mode */ | 310 | /* mode */ |
264 | #define M_UNKNOWN 0 | 311 | #define M_UNKNOWN 0 |
265 | #define M_CONFIG 1 | 312 | #define M_CONFIG 1 |
266 | #define M_UNIMODEM 2 | 313 | #define M_UNIMODEM 2 |
267 | #define M_CID 3 | 314 | #define M_CID 3 |
268 | 315 | ||
269 | /* start mode */ | 316 | /* start mode */ |
270 | #define SM_LOCKED 0 | 317 | #define SM_LOCKED 0 |
271 | #define SM_ISDN 1 /* default */ | 318 | #define SM_ISDN 1 /* default */ |
272 | 319 | ||
273 | struct gigaset_ops; | 320 | struct gigaset_ops; |
274 | struct gigaset_driver; | 321 | struct gigaset_driver; |
@@ -283,27 +330,26 @@ struct ser_bc_state; | |||
283 | struct bas_bc_state; | 330 | struct bas_bc_state; |
284 | 331 | ||
285 | struct reply_t { | 332 | struct reply_t { |
286 | int resp_code; /* RSP_XXXX */ | 333 | int resp_code; /* RSP_XXXX */ |
287 | int min_ConState; /* <0 => ignore */ | 334 | int min_ConState; /* <0 => ignore */ |
288 | int max_ConState; /* <0 => ignore */ | 335 | int max_ConState; /* <0 => ignore */ |
289 | int parameter; /* e.g. ZSAU_XXXX <0: ignore*/ | 336 | int parameter; /* e.g. ZSAU_XXXX <0: ignore*/ |
290 | int new_ConState; /* <0 => ignore */ | 337 | int new_ConState; /* <0 => ignore */ |
291 | int timeout; /* >0 => *HZ; <=0 => TOUT_XXXX*/ | 338 | int timeout; /* >0 => *HZ; <=0 => TOUT_XXXX*/ |
292 | int action[MAXACT]; /* ACT_XXXX */ | 339 | int action[MAXACT]; /* ACT_XXXX */ |
293 | char *command; /* NULL==none */ | 340 | char *command; /* NULL==none */ |
294 | }; | 341 | }; |
295 | 342 | ||
296 | extern struct reply_t gigaset_tab_cid_m10x[]; | 343 | extern struct reply_t gigaset_tab_cid_m10x[]; |
297 | extern struct reply_t gigaset_tab_nocid_m10x[]; | 344 | extern struct reply_t gigaset_tab_nocid_m10x[]; |
298 | 345 | ||
299 | struct inbuf_t { | 346 | struct inbuf_t { |
300 | unsigned char *rcvbuf; /* usb-gigaset receive buffer */ | 347 | unsigned char *rcvbuf; /* usb-gigaset receive buffer */ |
301 | struct bc_state *bcs; | 348 | struct bc_state *bcs; |
302 | struct cardstate *cs; | 349 | struct cardstate *cs; |
303 | int inputstate; | 350 | int inputstate; |
304 | 351 | atomic_t head, tail; | |
305 | atomic_t head, tail; | 352 | unsigned char data[RBUFSIZE]; |
306 | unsigned char data[RBUFSIZE]; | ||
307 | }; | 353 | }; |
308 | 354 | ||
309 | /* isochronous write buffer structure | 355 | /* isochronous write buffer structure |
@@ -319,16 +365,19 @@ struct inbuf_t { | |||
319 | * if writesem <= 0, data[write..read-1] is currently being written to | 365 | * if writesem <= 0, data[write..read-1] is currently being written to |
320 | * - idle contains the byte value to repeat when the end of valid data is | 366 | * - idle contains the byte value to repeat when the end of valid data is |
321 | * reached; if nextread==write (buffer contains no data to send), either the | 367 | * reached; if nextread==write (buffer contains no data to send), either the |
322 | * BAS_OUTBUFPAD bytes immediately before data[write] (if write>=BAS_OUTBUFPAD) | 368 | * BAS_OUTBUFPAD bytes immediately before data[write] (if |
323 | * or those of the pad area (if write<BAS_OUTBUFPAD) are also filled with that | 369 | * write>=BAS_OUTBUFPAD) or those of the pad area (if write<BAS_OUTBUFPAD) |
324 | * value | 370 | * are also filled with that value |
325 | * - optionally, the following statistics on the buffer's usage can be collected: | 371 | * - optionally, the following statistics on the buffer's usage can be |
326 | * maxfill: maximum number of bytes occupied | 372 | * collected: |
327 | * idlefills: number of times a frame of idle bytes is prepared | 373 | * maxfill: maximum number of bytes occupied |
328 | * emptygets: number of times the buffer was empty when a data frame was requested | 374 | * idlefills: number of times a frame of idle bytes is prepared |
375 | * emptygets: number of times the buffer was empty when a data frame was | ||
376 | * requested | ||
329 | * backtoback: number of times two data packets were entered into the buffer | 377 | * backtoback: number of times two data packets were entered into the buffer |
330 | * without intervening idle flags | 378 | * without intervening idle flags |
331 | * nakedback: set if no idle flags have been inserted since the last data packet | 379 | * nakedback: set if no idle flags have been inserted since the last data |
380 | * packet | ||
332 | */ | 381 | */ |
333 | struct isowbuf_t { | 382 | struct isowbuf_t { |
334 | atomic_t read; | 383 | atomic_t read; |
@@ -358,34 +407,28 @@ struct isow_urbctx_t { | |||
358 | * it is currently assigned a B channel | 407 | * it is currently assigned a B channel |
359 | */ | 408 | */ |
360 | struct at_state_t { | 409 | struct at_state_t { |
361 | struct list_head list; | 410 | struct list_head list; |
362 | int waiting; | 411 | int waiting; |
363 | int getstring; | 412 | int getstring; |
364 | atomic_t timer_index; | 413 | atomic_t timer_index; |
365 | unsigned long timer_expires; | 414 | unsigned long timer_expires; |
366 | int timer_active; | 415 | int timer_active; |
367 | unsigned int ConState; /* State of connection */ | 416 | unsigned int ConState; /* State of connection */ |
368 | struct reply_t *replystruct; | 417 | struct reply_t *replystruct; |
369 | int cid; | 418 | int cid; |
370 | int int_var[VAR_NUM]; /* see VAR_XXXX */ | 419 | int int_var[VAR_NUM]; /* see VAR_XXXX */ |
371 | char *str_var[STR_NUM]; /* see STR_XXXX */ | 420 | char *str_var[STR_NUM]; /* see STR_XXXX */ |
372 | unsigned pending_commands; /* see PC_XXXX */ | 421 | unsigned pending_commands; /* see PC_XXXX */ |
373 | atomic_t seq_index; | 422 | atomic_t seq_index; |
374 | 423 | ||
375 | struct cardstate *cs; | 424 | struct cardstate *cs; |
376 | struct bc_state *bcs; | 425 | struct bc_state *bcs; |
377 | }; | 426 | }; |
378 | 427 | ||
379 | struct resp_type_t { | 428 | struct resp_type_t { |
380 | unsigned char *response; | 429 | unsigned char *response; |
381 | int resp_code; /* RSP_XXXX */ | 430 | int resp_code; /* RSP_XXXX */ |
382 | int type; /* RT_XXXX */ | 431 | int type; /* RT_XXXX */ |
383 | }; | ||
384 | |||
385 | struct prot_skb { | ||
386 | atomic_t empty; | ||
387 | struct semaphore *sem; | ||
388 | struct sk_buff *skb; | ||
389 | }; | 432 | }; |
390 | 433 | ||
391 | struct event_t { | 434 | struct event_t { |
@@ -398,29 +441,29 @@ struct event_t { | |||
398 | 441 | ||
399 | /* This buffer holds all information about the used B-Channel */ | 442 | /* This buffer holds all information about the used B-Channel */ |
400 | struct bc_state { | 443 | struct bc_state { |
401 | struct sk_buff *tx_skb; /* Current transfer buffer to modem */ | 444 | struct sk_buff *tx_skb; /* Current transfer buffer to modem */ |
402 | struct sk_buff_head squeue; /* B-Channel send Queue */ | 445 | struct sk_buff_head squeue; /* B-Channel send Queue */ |
403 | 446 | ||
404 | /* Variables for debugging .. */ | 447 | /* Variables for debugging .. */ |
405 | int corrupted; /* Counter for corrupted packages */ | 448 | int corrupted; /* Counter for corrupted packages */ |
406 | int trans_down; /* Counter of packages (downstream) */ | 449 | int trans_down; /* Counter of packages (downstream) */ |
407 | int trans_up; /* Counter of packages (upstream) */ | 450 | int trans_up; /* Counter of packages (upstream) */ |
408 | 451 | ||
409 | struct at_state_t at_state; | 452 | struct at_state_t at_state; |
410 | unsigned long rcvbytes; | 453 | unsigned long rcvbytes; |
411 | 454 | ||
412 | __u16 fcs; | 455 | __u16 fcs; |
413 | struct sk_buff *skb; | 456 | struct sk_buff *skb; |
414 | int inputstate; /* see INS_XXXX */ | 457 | int inputstate; /* see INS_XXXX */ |
415 | 458 | ||
416 | int channel; | 459 | int channel; |
417 | 460 | ||
418 | struct cardstate *cs; | 461 | struct cardstate *cs; |
419 | 462 | ||
420 | unsigned chstate; /* bitmap (CHS_*) */ | 463 | unsigned chstate; /* bitmap (CHS_*) */ |
421 | int ignore; | 464 | int ignore; |
422 | unsigned proto2; /* Layer 2 protocol (ISDN_PROTO_L2_*) */ | 465 | unsigned proto2; /* Layer 2 protocol (ISDN_PROTO_L2_*) */ |
423 | char *commands[AT_NUM]; /* see AT_XXXX */ | 466 | char *commands[AT_NUM]; /* see AT_XXXX */ |
424 | 467 | ||
425 | #ifdef CONFIG_GIGASET_DEBUG | 468 | #ifdef CONFIG_GIGASET_DEBUG |
426 | int emptycount; | 469 | int emptycount; |
@@ -430,9 +473,9 @@ struct bc_state { | |||
430 | 473 | ||
431 | /* hardware drivers */ | 474 | /* hardware drivers */ |
432 | union { | 475 | union { |
433 | struct ser_bc_state *ser; /* private data of serial hardware driver */ | 476 | struct ser_bc_state *ser; /* serial hardware driver */ |
434 | struct usb_bc_state *usb; /* private data of usb hardware driver */ | 477 | struct usb_bc_state *usb; /* usb hardware driver (m105) */ |
435 | struct bas_bc_state *bas; | 478 | struct bas_bc_state *bas; /* usb hardware driver (base) */ |
436 | } hw; | 479 | } hw; |
437 | }; | 480 | }; |
438 | 481 | ||
@@ -443,22 +486,23 @@ struct cardstate { | |||
443 | const struct gigaset_ops *ops; | 486 | const struct gigaset_ops *ops; |
444 | 487 | ||
445 | /* Stuff to handle communication */ | 488 | /* Stuff to handle communication */ |
446 | //wait_queue_head_t initwait; | ||
447 | wait_queue_head_t waitqueue; | 489 | wait_queue_head_t waitqueue; |
448 | int waiting; | 490 | int waiting; |
449 | atomic_t mode; /* see M_XXXX */ | 491 | atomic_t mode; /* see M_XXXX */ |
450 | atomic_t mstate; /* Modem state: see MS_XXXX */ | 492 | atomic_t mstate; /* Modem state: see MS_XXXX */ |
451 | /* only changed by the event layer */ | 493 | /* only changed by the event layer */ |
452 | int cmd_result; | 494 | int cmd_result; |
453 | 495 | ||
454 | int channels; | 496 | int channels; |
455 | struct bc_state *bcs; /* Array of struct bc_state */ | 497 | struct bc_state *bcs; /* Array of struct bc_state */ |
456 | 498 | ||
457 | int onechannel; /* data and commands transmitted in one stream (M10x) */ | 499 | int onechannel; /* data and commands transmitted in one |
500 | stream (M10x) */ | ||
458 | 501 | ||
459 | spinlock_t lock; | 502 | spinlock_t lock; |
460 | struct at_state_t at_state; /* at_state_t for cid == 0 */ | 503 | struct at_state_t at_state; /* at_state_t for cid == 0 */ |
461 | struct list_head temp_at_states; /* list of temporary "struct at_state_t"s without B channel */ | 504 | struct list_head temp_at_states;/* list of temporary "struct |
505 | at_state_t"s without B channel */ | ||
462 | 506 | ||
463 | struct inbuf_t *inbuf; | 507 | struct inbuf_t *inbuf; |
464 | 508 | ||
@@ -474,36 +518,47 @@ struct cardstate { | |||
474 | unsigned fwver[4]; | 518 | unsigned fwver[4]; |
475 | int gotfwver; | 519 | int gotfwver; |
476 | 520 | ||
477 | atomic_t running; /* !=0 if events are handled */ | 521 | atomic_t running; /* !=0 if events are handled */ |
478 | atomic_t connected; /* !=0 if hardware is connected */ | 522 | atomic_t connected; /* !=0 if hardware is connected */ |
479 | 523 | ||
480 | atomic_t cidmode; | 524 | atomic_t cidmode; |
481 | 525 | ||
482 | int myid; /* id for communication with LL */ | 526 | int myid; /* id for communication with LL */ |
483 | isdn_if iif; | 527 | isdn_if iif; |
484 | 528 | ||
485 | struct reply_t *tabnocid; | 529 | struct reply_t *tabnocid; |
486 | struct reply_t *tabcid; | 530 | struct reply_t *tabcid; |
487 | int cs_init; | 531 | int cs_init; |
488 | int ignoreframes; /* frames to ignore after setting up the B channel */ | 532 | int ignoreframes; /* frames to ignore after setting up the |
489 | struct semaphore sem; /* locks this structure: */ | 533 | B channel */ |
490 | /* connected is not changed, */ | 534 | struct semaphore sem; /* locks this structure: */ |
491 | /* hardware_up is not changed, */ | 535 | /* connected is not changed, */ |
492 | /* MState is not changed to or from MS_LOCKED */ | 536 | /* hardware_up is not changed, */ |
537 | /* MState is not changed to or from | ||
538 | MS_LOCKED */ | ||
493 | 539 | ||
494 | struct timer_list timer; | 540 | struct timer_list timer; |
495 | int retry_count; | 541 | int retry_count; |
496 | int dle; /* !=0 if modem commands/responses are dle encoded */ | 542 | int dle; /* !=0 if modem commands/responses are |
497 | int cur_at_seq; /* sequence of AT commands being processed */ | 543 | dle encoded */ |
498 | int curchannel; /* channel, those commands are meant for */ | 544 | int cur_at_seq; /* sequence of AT commands being |
499 | atomic_t commands_pending; /* flag(s) in xxx.commands_pending have been set */ | 545 | processed */ |
500 | struct tasklet_struct event_tasklet; /* tasklet for serializing AT commands. Scheduled | 546 | int curchannel; /* channel, those commands are meant |
501 | * -> for modem reponses (and incomming data for M10x) | 547 | for */ |
502 | * -> on timeout | 548 | atomic_t commands_pending; /* flag(s) in xxx.commands_pending have |
503 | * -> after setting bits in xxx.at_state.pending_command | 549 | been set */ |
504 | * (e.g. command from LL) */ | 550 | struct tasklet_struct event_tasklet; |
505 | struct tasklet_struct write_tasklet; /* tasklet for serial output | 551 | /* tasklet for serializing AT commands. |
506 | * (not used in base driver) */ | 552 | * Scheduled |
553 | * -> for modem reponses (and | ||
554 | * incomming data for M10x) | ||
555 | * -> on timeout | ||
556 | * -> after setting bits in | ||
557 | * xxx.at_state.pending_command | ||
558 | * (e.g. command from LL) */ | ||
559 | struct tasklet_struct write_tasklet; | ||
560 | /* tasklet for serial output | ||
561 | * (not used in base driver) */ | ||
507 | 562 | ||
508 | /* event queue */ | 563 | /* event queue */ |
509 | struct event_t events[MAX_EVENTS]; | 564 | struct event_t events[MAX_EVENTS]; |
@@ -516,16 +571,15 @@ struct cardstate { | |||
516 | 571 | ||
517 | /* hardware drivers */ | 572 | /* hardware drivers */ |
518 | union { | 573 | union { |
519 | struct usb_cardstate *usb; /* private data of USB hardware driver */ | 574 | struct usb_cardstate *usb; /* USB hardware driver (m105) */ |
520 | struct ser_cardstate *ser; /* private data of serial hardware driver */ | 575 | struct ser_cardstate *ser; /* serial hardware driver */ |
521 | struct bas_cardstate *bas; /* private data of base hardware driver */ | 576 | struct bas_cardstate *bas; /* USB hardware driver (base) */ |
522 | } hw; | 577 | } hw; |
523 | }; | 578 | }; |
524 | 579 | ||
525 | struct gigaset_driver { | 580 | struct gigaset_driver { |
526 | struct list_head list; | 581 | struct list_head list; |
527 | spinlock_t lock; /* locks minor tables and blocked */ | 582 | spinlock_t lock; /* locks minor tables and blocked */ |
528 | //struct semaphore sem; /* locks this structure */ | ||
529 | struct tty_driver *tty; | 583 | struct tty_driver *tty; |
530 | unsigned have_tty; | 584 | unsigned have_tty; |
531 | unsigned minor; | 585 | unsigned minor; |
@@ -553,7 +607,8 @@ struct bas_bc_state { | |||
553 | struct isow_urbctx_t isoouturbs[BAS_OUTURBS]; | 607 | struct isow_urbctx_t isoouturbs[BAS_OUTURBS]; |
554 | struct isow_urbctx_t *isooutdone, *isooutfree, *isooutovfl; | 608 | struct isow_urbctx_t *isooutdone, *isooutfree, *isooutovfl; |
555 | struct isowbuf_t *isooutbuf; | 609 | struct isowbuf_t *isooutbuf; |
556 | unsigned numsub; /* submitted URB counter (for diagnostic messages only) */ | 610 | unsigned numsub; /* submitted URB counter (for |
611 | diagnostic messages only) */ | ||
557 | struct tasklet_struct sent_tasklet; | 612 | struct tasklet_struct sent_tasklet; |
558 | 613 | ||
559 | /* isochronous input state */ | 614 | /* isochronous input state */ |
@@ -563,24 +618,31 @@ struct bas_bc_state { | |||
563 | struct urb *isoindone; /* completed isoc read URB */ | 618 | struct urb *isoindone; /* completed isoc read URB */ |
564 | int loststatus; /* status of dropped URB */ | 619 | int loststatus; /* status of dropped URB */ |
565 | unsigned isoinlost; /* number of bytes lost */ | 620 | unsigned isoinlost; /* number of bytes lost */ |
566 | /* state of bit unstuffing algorithm (in addition to BC_state.inputstate) */ | 621 | /* state of bit unstuffing algorithm (in addition to |
567 | unsigned seqlen; /* number of '1' bits not yet unstuffed */ | 622 | BC_state.inputstate) */ |
568 | unsigned inbyte, inbits; /* collected bits for next byte */ | 623 | unsigned seqlen; /* number of '1' bits not yet |
624 | unstuffed */ | ||
625 | unsigned inbyte, inbits; /* collected bits for next byte | ||
626 | */ | ||
569 | /* statistics */ | 627 | /* statistics */ |
570 | unsigned goodbytes; /* bytes correctly received */ | 628 | unsigned goodbytes; /* bytes correctly received */ |
571 | unsigned alignerrs; /* frames with incomplete byte at end */ | 629 | unsigned alignerrs; /* frames with incomplete byte |
630 | at end */ | ||
572 | unsigned fcserrs; /* FCS errors */ | 631 | unsigned fcserrs; /* FCS errors */ |
573 | unsigned frameerrs; /* framing errors */ | 632 | unsigned frameerrs; /* framing errors */ |
574 | unsigned giants; /* long frames */ | 633 | unsigned giants; /* long frames */ |
575 | unsigned runts; /* short frames */ | 634 | unsigned runts; /* short frames */ |
576 | unsigned aborts; /* HDLC aborts */ | 635 | unsigned aborts; /* HDLC aborts */ |
577 | unsigned shared0s; /* '0' bits shared between flags */ | 636 | unsigned shared0s; /* '0' bits shared between flags |
578 | unsigned stolen0s; /* '0' stuff bits also serving as leading flag bits */ | 637 | */ |
638 | unsigned stolen0s; /* '0' stuff bits also serving | ||
639 | as leading flag bits */ | ||
579 | struct tasklet_struct rcvd_tasklet; | 640 | struct tasklet_struct rcvd_tasklet; |
580 | }; | 641 | }; |
581 | 642 | ||
582 | struct gigaset_ops { | 643 | struct gigaset_ops { |
583 | /* Called from ev-layer.c/interface.c for sending AT commands to the device */ | 644 | /* Called from ev-layer.c/interface.c for sending AT commands to the |
645 | device */ | ||
584 | int (*write_cmd)(struct cardstate *cs, | 646 | int (*write_cmd)(struct cardstate *cs, |
585 | const unsigned char *buf, int len, | 647 | const unsigned char *buf, int len, |
586 | struct tasklet_struct *wake_tasklet); | 648 | struct tasklet_struct *wake_tasklet); |
@@ -604,7 +666,8 @@ struct gigaset_ops { | |||
604 | /* Called by gigaset_freecs() for freeing bcs->hw.xxx */ | 666 | /* Called by gigaset_freecs() for freeing bcs->hw.xxx */ |
605 | int (*freebcshw)(struct bc_state *bcs); | 667 | int (*freebcshw)(struct bc_state *bcs); |
606 | 668 | ||
607 | /* Called by gigaset_stop() or gigaset_bchannel_down() for resetting bcs->hw.xxx */ | 669 | /* Called by gigaset_stop() or gigaset_bchannel_down() for resetting |
670 | bcs->hw.xxx */ | ||
608 | void (*reinitbcshw)(struct bc_state *bcs); | 671 | void (*reinitbcshw)(struct bc_state *bcs); |
609 | 672 | ||
610 | /* Called by gigaset_initcs() for setting up cs->hw.xxx */ | 673 | /* Called by gigaset_initcs() for setting up cs->hw.xxx */ |
@@ -613,13 +676,10 @@ struct gigaset_ops { | |||
613 | /* Called by gigaset_freecs() for freeing cs->hw.xxx */ | 676 | /* Called by gigaset_freecs() for freeing cs->hw.xxx */ |
614 | void (*freecshw)(struct cardstate *cs); | 677 | void (*freecshw)(struct cardstate *cs); |
615 | 678 | ||
616 | ///* Called by gigaset_stop() for killing URBs, shutting down the device, ... | 679 | /* Called from common.c/interface.c for additional serial port |
617 | // hardwareup: ==0: don't try to shut down the device, hardware is really not accessible | 680 | control */ |
618 | // !=0: hardware still up */ | 681 | int (*set_modem_ctrl)(struct cardstate *cs, unsigned old_state, |
619 | //void (*stophw)(struct cardstate *cs, int hardwareup); | 682 | unsigned new_state); |
620 | |||
621 | /* Called from common.c/interface.c for additional serial port control */ | ||
622 | int (*set_modem_ctrl)(struct cardstate *cs, unsigned old_state, unsigned new_state); | ||
623 | int (*baud_rate)(struct cardstate *cs, unsigned cflag); | 683 | int (*baud_rate)(struct cardstate *cs, unsigned cflag); |
624 | int (*set_line_ctrl)(struct cardstate *cs, unsigned cflag); | 684 | int (*set_line_ctrl)(struct cardstate *cs, unsigned cflag); |
625 | 685 | ||
@@ -667,7 +727,8 @@ void gigaset_isoc_input(struct inbuf_t *inbuf); | |||
667 | 727 | ||
668 | /* Called from bas-gigaset.c to process a block of data | 728 | /* Called from bas-gigaset.c to process a block of data |
669 | * received through the isochronous channel */ | 729 | * received through the isochronous channel */ |
670 | void gigaset_isoc_receive(unsigned char *src, unsigned count, struct bc_state *bcs); | 730 | void gigaset_isoc_receive(unsigned char *src, unsigned count, |
731 | struct bc_state *bcs); | ||
671 | 732 | ||
672 | /* Called from bas-gigaset.c to put a block of data | 733 | /* Called from bas-gigaset.c to put a block of data |
673 | * into the isochronous output buffer */ | 734 | * into the isochronous output buffer */ |
@@ -763,7 +824,8 @@ struct cardstate *gigaset_getunassignedcs(struct gigaset_driver *drv); | |||
763 | void gigaset_unassign(struct cardstate *cs); | 824 | void gigaset_unassign(struct cardstate *cs); |
764 | void gigaset_blockdriver(struct gigaset_driver *drv); | 825 | void gigaset_blockdriver(struct gigaset_driver *drv); |
765 | 826 | ||
766 | /* Allocate and initialize card state. Calls hardware dependent gigaset_init[b]cs(). */ | 827 | /* Allocate and initialize card state. Calls hardware dependent |
828 | gigaset_init[b]cs(). */ | ||
767 | struct cardstate *gigaset_initcs(struct gigaset_driver *drv, int channels, | 829 | struct cardstate *gigaset_initcs(struct gigaset_driver *drv, int channels, |
768 | int onechannel, int ignoreframes, | 830 | int onechannel, int ignoreframes, |
769 | int cidmode, const char *modulename); | 831 | int cidmode, const char *modulename); |
diff --git a/drivers/isdn/gigaset/i4l.c b/drivers/isdn/gigaset/i4l.c index 731a675f21b0..e30275d4e148 100644 --- a/drivers/isdn/gigaset/i4l.c +++ b/drivers/isdn/gigaset/i4l.c | |||
@@ -11,10 +11,6 @@ | |||
11 | * published by the Free Software Foundation; either version 2 of | 11 | * published by the Free Software Foundation; either version 2 of |
12 | * the License, or (at your option) any later version. | 12 | * the License, or (at your option) any later version. |
13 | * ===================================================================== | 13 | * ===================================================================== |
14 | * ToDo: ... | ||
15 | * ===================================================================== | ||
16 | * Version: $Id: i4l.c,v 1.3.2.9 2006/02/04 18:28:16 hjlipp Exp $ | ||
17 | * ===================================================================== | ||
18 | */ | 14 | */ |
19 | 15 | ||
20 | #include "gigaset.h" | 16 | #include "gigaset.h" |
@@ -29,7 +25,8 @@ | |||
29 | * parameters: | 25 | * parameters: |
30 | * driverID driver ID as assigned by LL | 26 | * driverID driver ID as assigned by LL |
31 | * channel channel number | 27 | * channel channel number |
32 | * ack if != 0 LL wants to be notified on completion via statcallb(ISDN_STAT_BSENT) | 28 | * ack if != 0 LL wants to be notified on completion via |
29 | * statcallb(ISDN_STAT_BSENT) | ||
33 | * skb skb containing data to send | 30 | * skb skb containing data to send |
34 | * return value: | 31 | * return value: |
35 | * number of accepted bytes | 32 | * number of accepted bytes |
@@ -123,9 +120,6 @@ static int command_from_LL(isdn_ctrl *cntrl) | |||
123 | //dbg(DEBUG_ANY, "Gigaset_HW: Receiving command"); | 120 | //dbg(DEBUG_ANY, "Gigaset_HW: Receiving command"); |
124 | gigaset_debugdrivers(); | 121 | gigaset_debugdrivers(); |
125 | 122 | ||
126 | /* Terminate this call if no device is present. Bt if the command is "ISDN_CMD_LOCK" or | ||
127 | * "ISDN_CMD_UNLOCK" then execute it due to the fact that they are device independent ! | ||
128 | */ | ||
129 | //FIXME "remove test for &connected" | 123 | //FIXME "remove test for &connected" |
130 | if ((!cs || !atomic_read(&cs->connected))) { | 124 | if ((!cs || !atomic_read(&cs->connected))) { |
131 | warn("LL tried to access unknown device with nr. %d", | 125 | warn("LL tried to access unknown device with nr. %d", |
@@ -222,15 +216,15 @@ static int command_from_LL(isdn_ctrl *cntrl) | |||
222 | gigaset_schedule_event(cs); | 216 | gigaset_schedule_event(cs); |
223 | 217 | ||
224 | break; | 218 | break; |
225 | case ISDN_CMD_CLREAZ: /* Do not signal incoming signals */ //FIXME | 219 | case ISDN_CMD_CLREAZ: /* Do not signal incoming signals */ //FIXME |
226 | dbg(DEBUG_ANY, "ISDN_CMD_CLREAZ"); | 220 | dbg(DEBUG_ANY, "ISDN_CMD_CLREAZ"); |
227 | break; | 221 | break; |
228 | case ISDN_CMD_SETEAZ: /* Signal incoming calls for given MSN */ //FIXME | 222 | case ISDN_CMD_SETEAZ: /* Signal incoming calls for given MSN */ //FIXME |
229 | dbg(DEBUG_ANY, | 223 | dbg(DEBUG_ANY, |
230 | "ISDN_CMD_SETEAZ (id:%d, channel: %ld, number: %s)", | 224 | "ISDN_CMD_SETEAZ (id:%d, channel: %ld, number: %s)", |
231 | cntrl->driver, cntrl->arg, cntrl->parm.num); | 225 | cntrl->driver, cntrl->arg, cntrl->parm.num); |
232 | break; | 226 | break; |
233 | case ISDN_CMD_SETL2: /* Set L2 to given protocol */ | 227 | case ISDN_CMD_SETL2: /* Set L2 to given protocol */ |
234 | dbg(DEBUG_ANY, "ISDN_CMD_SETL2 (Channel: %ld, Proto: %lx)", | 228 | dbg(DEBUG_ANY, "ISDN_CMD_SETL2 (Channel: %ld, Proto: %lx)", |
235 | cntrl->arg & 0xff, (cntrl->arg >> 8)); | 229 | cntrl->arg & 0xff, (cntrl->arg >> 8)); |
236 | 230 | ||
@@ -250,7 +244,7 @@ static int command_from_LL(isdn_ctrl *cntrl) | |||
250 | dbg(DEBUG_CMD, "scheduling PROTO_L2"); | 244 | dbg(DEBUG_CMD, "scheduling PROTO_L2"); |
251 | gigaset_schedule_event(cs); | 245 | gigaset_schedule_event(cs); |
252 | break; | 246 | break; |
253 | case ISDN_CMD_SETL3: /* Set L3 to given protocol */ | 247 | case ISDN_CMD_SETL3: /* Set L3 to given protocol */ |
254 | dbg(DEBUG_ANY, "ISDN_CMD_SETL3 (Channel: %ld, Proto: %lx)", | 248 | dbg(DEBUG_ANY, "ISDN_CMD_SETL3 (Channel: %ld, Proto: %lx)", |
255 | cntrl->arg & 0xff, (cntrl->arg >> 8)); | 249 | cntrl->arg & 0xff, (cntrl->arg >> 8)); |
256 | 250 | ||
@@ -396,10 +390,14 @@ int gigaset_isdn_setup_dial(struct at_state_t *at_state, void *data) | |||
396 | } | 390 | } |
397 | 391 | ||
398 | if (bcs->commands[AT_MSN]) | 392 | if (bcs->commands[AT_MSN]) |
399 | snprintf(bcs->commands[AT_MSN], length[AT_MSN], "^SMSN=%s\r", sp->eazmsn); | 393 | snprintf(bcs->commands[AT_MSN], length[AT_MSN], |
400 | snprintf(bcs->commands[AT_BC ], length[AT_BC ], "^SBC=%s\r", bc); | 394 | "^SMSN=%s\r", sp->eazmsn); |
401 | snprintf(bcs->commands[AT_PROTO], length[AT_PROTO], "^SBPR=%u\r", proto); | 395 | snprintf(bcs->commands[AT_BC ], length[AT_BC ], |
402 | snprintf(bcs->commands[AT_ISO ], length[AT_ISO ], "^SISO=%u\r", (unsigned)bcs->channel + 1); | 396 | "^SBC=%s\r", bc); |
397 | snprintf(bcs->commands[AT_PROTO], length[AT_PROTO], | ||
398 | "^SBPR=%u\r", proto); | ||
399 | snprintf(bcs->commands[AT_ISO ], length[AT_ISO ], | ||
400 | "^SISO=%u\r", (unsigned)bcs->channel + 1); | ||
403 | 401 | ||
404 | return 0; | 402 | return 0; |
405 | } | 403 | } |
@@ -441,8 +439,10 @@ int gigaset_isdn_setup_accept(struct at_state_t *at_state) | |||
441 | } | 439 | } |
442 | } | 440 | } |
443 | 441 | ||
444 | snprintf(bcs->commands[AT_PROTO], length[AT_PROTO], "^SBPR=%u\r", proto); | 442 | snprintf(bcs->commands[AT_PROTO], length[AT_PROTO], |
445 | snprintf(bcs->commands[AT_ISO ], length[AT_ISO ], "^SISO=%u\r", (unsigned) bcs->channel + 1); | 443 | "^SBPR=%u\r", proto); |
444 | snprintf(bcs->commands[AT_ISO ], length[AT_ISO ], | ||
445 | "^SISO=%u\r", (unsigned) bcs->channel + 1); | ||
446 | 446 | ||
447 | return 0; | 447 | return 0; |
448 | } | 448 | } |
@@ -542,9 +542,9 @@ int gigaset_register_to_LL(struct cardstate *cs, const char *isdnid) | |||
542 | return -ENOMEM; //FIXME EINVAL/...?? | 542 | return -ENOMEM; //FIXME EINVAL/...?? |
543 | 543 | ||
544 | iif->owner = THIS_MODULE; | 544 | iif->owner = THIS_MODULE; |
545 | iif->channels = cs->channels; /* I am supporting just one channel *//* I was supporting...*/ | 545 | iif->channels = cs->channels; |
546 | iif->maxbufsize = MAX_BUF_SIZE; | 546 | iif->maxbufsize = MAX_BUF_SIZE; |
547 | iif->features = ISDN_FEATURE_L2_TRANS | /* Our device is very advanced, therefore */ | 547 | iif->features = ISDN_FEATURE_L2_TRANS | |
548 | ISDN_FEATURE_L2_HDLC | | 548 | ISDN_FEATURE_L2_HDLC | |
549 | #ifdef GIG_X75 | 549 | #ifdef GIG_X75 |
550 | ISDN_FEATURE_L2_X75I | | 550 | ISDN_FEATURE_L2_X75I | |
diff --git a/drivers/isdn/gigaset/interface.c b/drivers/isdn/gigaset/interface.c index 3a81d9c65141..c225de9620b1 100644 --- a/drivers/isdn/gigaset/interface.c +++ b/drivers/isdn/gigaset/interface.c | |||
@@ -9,8 +9,6 @@ | |||
9 | * published by the Free Software Foundation; either version 2 of | 9 | * published by the Free Software Foundation; either version 2 of |
10 | * the License, or (at your option) any later version. | 10 | * the License, or (at your option) any later version. |
11 | * ===================================================================== | 11 | * ===================================================================== |
12 | * Version: $Id: interface.c,v 1.14.4.15 2006/02/04 18:28:16 hjlipp Exp $ | ||
13 | * ===================================================================== | ||
14 | */ | 12 | */ |
15 | 13 | ||
16 | #include "gigaset.h" | 14 | #include "gigaset.h" |
@@ -173,7 +171,6 @@ static int if_open(struct tty_struct *tty, struct file *filp) | |||
173 | cs->tty = tty; | 171 | cs->tty = tty; |
174 | spin_unlock_irqrestore(&cs->lock, flags); | 172 | spin_unlock_irqrestore(&cs->lock, flags); |
175 | tty->low_latency = 1; //FIXME test | 173 | tty->low_latency = 1; //FIXME test |
176 | //FIXME | ||
177 | } | 174 | } |
178 | 175 | ||
179 | up(&cs->sem); | 176 | up(&cs->sem); |
@@ -202,7 +199,6 @@ static void if_close(struct tty_struct *tty, struct file *filp) | |||
202 | spin_lock_irqsave(&cs->lock, flags); | 199 | spin_lock_irqsave(&cs->lock, flags); |
203 | cs->tty = NULL; | 200 | cs->tty = NULL; |
204 | spin_unlock_irqrestore(&cs->lock, flags); | 201 | spin_unlock_irqrestore(&cs->lock, flags); |
205 | //FIXME | ||
206 | } | 202 | } |
207 | } | 203 | } |
208 | 204 | ||
@@ -253,24 +249,26 @@ static int if_ioctl(struct tty_struct *tty, struct file *file, | |||
253 | gigaset_dbg_buffer(DEBUG_IF, "GIGASET_BRKCHARS", | 249 | gigaset_dbg_buffer(DEBUG_IF, "GIGASET_BRKCHARS", |
254 | 6, (const unsigned char *) arg, 1); | 250 | 6, (const unsigned char *) arg, 1); |
255 | if (!atomic_read(&cs->connected)) { | 251 | if (!atomic_read(&cs->connected)) { |
256 | dbg(DEBUG_ANY, "can't communicate with unplugged device"); | 252 | dbg(DEBUG_ANY, |
253 | "can't communicate with unplugged device"); | ||
257 | retval = -ENODEV; | 254 | retval = -ENODEV; |
258 | break; | 255 | break; |
259 | } | 256 | } |
260 | retval = copy_from_user(&buf, | 257 | retval = copy_from_user(&buf, |
261 | (const unsigned char __user *) arg, 6) | 258 | (const unsigned char __user *) arg, 6) |
262 | ? -EFAULT : 0; | 259 | ? -EFAULT : 0; |
263 | if (retval >= 0) | 260 | if (retval >= 0) |
264 | retval = cs->ops->brkchars(cs, buf); | 261 | retval = cs->ops->brkchars(cs, buf); |
265 | break; | 262 | break; |
266 | case GIGASET_VERSION: | 263 | case GIGASET_VERSION: |
267 | retval = copy_from_user(version, (unsigned __user *) arg, | 264 | retval = copy_from_user(version, |
265 | (unsigned __user *) arg, | ||
268 | sizeof version) ? -EFAULT : 0; | 266 | sizeof version) ? -EFAULT : 0; |
269 | if (retval >= 0) | 267 | if (retval >= 0) |
270 | retval = if_version(cs, version); | 268 | retval = if_version(cs, version); |
271 | if (retval >= 0) | 269 | if (retval >= 0) |
272 | retval = copy_to_user((unsigned __user *) arg, version, | 270 | retval = copy_to_user((unsigned __user *) arg, |
273 | sizeof version) | 271 | version, sizeof version) |
274 | ? -EFAULT : 0; | 272 | ? -EFAULT : 0; |
275 | break; | 273 | break; |
276 | default: | 274 | default: |
@@ -575,7 +573,7 @@ static void if_set_termios(struct tty_struct *tty, struct termios *old) | |||
575 | new_state &= ~(TIOCM_DTR | TIOCM_RTS); | 573 | new_state &= ~(TIOCM_DTR | TIOCM_RTS); |
576 | if (new_state != control_state) { | 574 | if (new_state != control_state) { |
577 | dbg(DEBUG_IF, "%u: new_state %x", cs->minor_index, new_state); | 575 | dbg(DEBUG_IF, "%u: new_state %x", cs->minor_index, new_state); |
578 | gigaset_set_modem_ctrl(cs, control_state, new_state); // FIXME: mct_u232.c sets the old state here. is this a bug? | 576 | gigaset_set_modem_ctrl(cs, control_state, new_state); |
579 | control_state = new_state; | 577 | control_state = new_state; |
580 | } | 578 | } |
581 | #endif | 579 | #endif |
diff --git a/drivers/isdn/gigaset/isocdata.c b/drivers/isdn/gigaset/isocdata.c index 5744eb91b315..e2d93e935530 100644 --- a/drivers/isdn/gigaset/isocdata.c +++ b/drivers/isdn/gigaset/isocdata.c | |||
@@ -10,10 +10,6 @@ | |||
10 | * published by the Free Software Foundation; either version 2 of | 10 | * published by the Free Software Foundation; either version 2 of |
11 | * the License, or (at your option) any later version. | 11 | * the License, or (at your option) any later version. |
12 | * ===================================================================== | 12 | * ===================================================================== |
13 | * ToDo: ... | ||
14 | * ===================================================================== | ||
15 | * Version: $Id: isocdata.c,v 1.2.2.5 2005/11/13 23:05:19 hjlipp Exp $ | ||
16 | * ===================================================================== | ||
17 | */ | 13 | */ |
18 | 14 | ||
19 | #include "gigaset.h" | 15 | #include "gigaset.h" |
@@ -196,7 +192,8 @@ int gigaset_isowbuf_getbytes(struct isowbuf_t *iwb, int size) | |||
196 | return -EBUSY; | 192 | return -EBUSY; |
197 | /* write position could have changed */ | 193 | /* write position could have changed */ |
198 | if (limit >= (write = atomic_read(&iwb->write))) { | 194 | if (limit >= (write = atomic_read(&iwb->write))) { |
199 | pbyte = iwb->data[write]; /* save partial byte */ | 195 | pbyte = iwb->data[write]; /* save |
196 | partial byte */ | ||
200 | limit = write + BAS_OUTBUFPAD; | 197 | limit = write + BAS_OUTBUFPAD; |
201 | dbg(DEBUG_STREAM, | 198 | dbg(DEBUG_STREAM, |
202 | "%s: filling %d->%d with %02x", | 199 | "%s: filling %d->%d with %02x", |
@@ -213,7 +210,8 @@ int gigaset_isowbuf_getbytes(struct isowbuf_t *iwb, int size) | |||
213 | } | 210 | } |
214 | dbg(DEBUG_STREAM, "%s: restoring %02x at %d", | 211 | dbg(DEBUG_STREAM, "%s: restoring %02x at %d", |
215 | __func__, pbyte, limit); | 212 | __func__, pbyte, limit); |
216 | iwb->data[limit] = pbyte; /* restore partial byte */ | 213 | iwb->data[limit] = pbyte; /* restore |
214 | partial byte */ | ||
217 | atomic_set(&iwb->write, limit); | 215 | atomic_set(&iwb->write, limit); |
218 | } | 216 | } |
219 | isowbuf_donewrite(iwb); | 217 | isowbuf_donewrite(iwb); |
@@ -508,11 +506,13 @@ int gigaset_isoc_buildframe(struct bc_state *bcs, unsigned char *in, int len) | |||
508 | switch (bcs->proto2) { | 506 | switch (bcs->proto2) { |
509 | case ISDN_PROTO_L2_HDLC: | 507 | case ISDN_PROTO_L2_HDLC: |
510 | result = hdlc_buildframe(bcs->hw.bas->isooutbuf, in, len); | 508 | result = hdlc_buildframe(bcs->hw.bas->isooutbuf, in, len); |
511 | dbg(DEBUG_ISO, "%s: %d bytes HDLC -> %d", __func__, len, result); | 509 | dbg(DEBUG_ISO, "%s: %d bytes HDLC -> %d", |
510 | __func__, len, result); | ||
512 | break; | 511 | break; |
513 | default: /* assume transparent */ | 512 | default: /* assume transparent */ |
514 | result = trans_buildframe(bcs->hw.bas->isooutbuf, in, len); | 513 | result = trans_buildframe(bcs->hw.bas->isooutbuf, in, len); |
515 | dbg(DEBUG_ISO, "%s: %d bytes trans -> %d", __func__, len, result); | 514 | dbg(DEBUG_ISO, "%s: %d bytes trans -> %d", |
515 | __func__, len, result); | ||
516 | } | 516 | } |
517 | return result; | 517 | return result; |
518 | } | 518 | } |
diff --git a/drivers/isdn/gigaset/proc.c b/drivers/isdn/gigaset/proc.c index c6915fa2be6c..c30ea80d517a 100644 --- a/drivers/isdn/gigaset/proc.c +++ b/drivers/isdn/gigaset/proc.c | |||
@@ -11,23 +11,21 @@ | |||
11 | * published by the Free Software Foundation; either version 2 of | 11 | * published by the Free Software Foundation; either version 2 of |
12 | * the License, or (at your option) any later version. | 12 | * the License, or (at your option) any later version. |
13 | * ===================================================================== | 13 | * ===================================================================== |
14 | * ToDo: ... | ||
15 | * ===================================================================== | ||
16 | * Version: $Id: proc.c,v 1.5.2.13 2006/02/04 18:28:16 hjlipp Exp $ | ||
17 | * ===================================================================== | ||
18 | */ | 14 | */ |
19 | 15 | ||
20 | #include "gigaset.h" | 16 | #include "gigaset.h" |
21 | #include <linux/ctype.h> | 17 | #include <linux/ctype.h> |
22 | 18 | ||
23 | static ssize_t show_cidmode(struct device *dev, struct device_attribute *attr, char *buf) | 19 | static ssize_t show_cidmode(struct device *dev, struct device_attribute *attr, |
20 | char *buf) | ||
24 | { | 21 | { |
25 | struct usb_interface *intf = to_usb_interface(dev); | 22 | struct usb_interface *intf = to_usb_interface(dev); |
26 | struct cardstate *cs = usb_get_intfdata(intf); | 23 | struct cardstate *cs = usb_get_intfdata(intf); |
27 | return sprintf(buf, "%d\n", atomic_read(&cs->cidmode)); // FIXME use scnprintf for 13607 bit architectures (if PAGE_SIZE==4096) | 24 | return sprintf(buf, "%d\n", atomic_read(&cs->cidmode)); |
28 | } | 25 | } |
29 | 26 | ||
30 | static ssize_t set_cidmode(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) | 27 | static ssize_t set_cidmode(struct device *dev, struct device_attribute *attr, |
28 | const char *buf, size_t count) | ||
31 | { | 29 | { |
32 | struct usb_interface *intf = to_usb_interface(dev); | 30 | struct usb_interface *intf = to_usb_interface(dev); |
33 | struct cardstate *cs = usb_get_intfdata(intf); | 31 | struct cardstate *cs = usb_get_intfdata(intf); |
diff --git a/drivers/isdn/gigaset/usb-gigaset.c b/drivers/isdn/gigaset/usb-gigaset.c index 323fc7349dec..0f5aa46cf8f3 100644 --- a/drivers/isdn/gigaset/usb-gigaset.c +++ b/drivers/isdn/gigaset/usb-gigaset.c | |||
@@ -13,10 +13,6 @@ | |||
13 | * published by the Free Software Foundation; either version 2 of | 13 | * published by the Free Software Foundation; either version 2 of |
14 | * the License, or (at your option) any later version. | 14 | * the License, or (at your option) any later version. |
15 | * ===================================================================== | 15 | * ===================================================================== |
16 | * ToDo: ... | ||
17 | * ===================================================================== | ||
18 | * Version: $Id: usb-gigaset.c,v 1.85.4.18 2006/02/04 18:28:16 hjlipp Exp $ | ||
19 | * ===================================================================== | ||
20 | */ | 16 | */ |
21 | 17 | ||
22 | #include "gigaset.h" | 18 | #include "gigaset.h" |
@@ -62,10 +58,6 @@ static struct usb_device_id gigaset_table [] = { | |||
62 | 58 | ||
63 | MODULE_DEVICE_TABLE(usb, gigaset_table); | 59 | MODULE_DEVICE_TABLE(usb, gigaset_table); |
64 | 60 | ||
65 | /* Get a minor range for your devices from the usb maintainer */ | ||
66 | #define USB_SKEL_MINOR_BASE 200 | ||
67 | |||
68 | |||
69 | /* | 61 | /* |
70 | * Control requests (empty fields: 00) | 62 | * Control requests (empty fields: 00) |
71 | * | 63 | * |
@@ -122,29 +114,29 @@ static struct cardstate *cardstate = NULL; | |||
122 | 114 | ||
123 | /* usb specific object needed to register this driver with the usb subsystem */ | 115 | /* usb specific object needed to register this driver with the usb subsystem */ |
124 | static struct usb_driver gigaset_usb_driver = { | 116 | static struct usb_driver gigaset_usb_driver = { |
125 | .name = GIGASET_MODULENAME, | 117 | .name = GIGASET_MODULENAME, |
126 | .probe = gigaset_probe, | 118 | .probe = gigaset_probe, |
127 | .disconnect = gigaset_disconnect, | 119 | .disconnect = gigaset_disconnect, |
128 | .id_table = gigaset_table, | 120 | .id_table = gigaset_table, |
129 | }; | 121 | }; |
130 | 122 | ||
131 | struct usb_cardstate { | 123 | struct usb_cardstate { |
132 | struct usb_device *udev; /* save off the usb device pointer */ | 124 | struct usb_device *udev; /* usb device pointer */ |
133 | struct usb_interface *interface; /* the interface for this device */ | 125 | struct usb_interface *interface; /* interface for this device */ |
134 | atomic_t busy; /* bulk output in progress */ | 126 | atomic_t busy; /* bulk output in progress */ |
135 | 127 | ||
136 | /* Output buffer for commands (M105: and data)*/ | 128 | /* Output buffer */ |
137 | unsigned char *bulk_out_buffer; /* the buffer to send data */ | 129 | unsigned char *bulk_out_buffer; /* send buffer */ |
138 | int bulk_out_size; /* the size of the send buffer */ | 130 | int bulk_out_size; /* send buffer size */ |
139 | __u8 bulk_out_endpointAddr; /* the address of the bulk out endpoint */ | 131 | __u8 bulk_out_endpointAddr; /* bulk out endpoint */ |
140 | struct urb *bulk_out_urb; /* the urb used to transmit data */ | 132 | struct urb *bulk_out_urb; /* bulk out urb */ |
141 | 133 | ||
142 | /* Input buffer for command responses (M105: and data)*/ | 134 | /* Input buffer */ |
143 | int rcvbuf_size; /* the size of the receive buffer */ | 135 | int rcvbuf_size; /* rcv buffer */ |
144 | struct urb *read_urb; /* the urb used to receive data */ | 136 | struct urb *read_urb; /* rcv buffer size */ |
145 | __u8 int_in_endpointAddr; /* the address of the bulk in endpoint */ | 137 | __u8 int_in_endpointAddr; /* int in endpoint */ |
146 | 138 | ||
147 | char bchars[6]; /* req. 0x19 */ | 139 | char bchars[6]; /* request 0x19 */ |
148 | }; | 140 | }; |
149 | 141 | ||
150 | struct usb_bc_state {}; | 142 | struct usb_bc_state {}; |
@@ -166,10 +158,11 @@ static int gigaset_set_modem_ctrl(struct cardstate *cs, unsigned old_state, | |||
166 | val = tiocm_to_gigaset(new_state); | 158 | val = tiocm_to_gigaset(new_state); |
167 | 159 | ||
168 | dbg(DEBUG_USBREQ, "set flags 0x%02x with mask 0x%02x", val, mask); | 160 | dbg(DEBUG_USBREQ, "set flags 0x%02x with mask 0x%02x", val, mask); |
161 | // don't use this in an interrupt/BH | ||
169 | r = usb_control_msg(cs->hw.usb->udev, | 162 | r = usb_control_msg(cs->hw.usb->udev, |
170 | usb_sndctrlpipe(cs->hw.usb->udev, 0), 7, 0x41, | 163 | usb_sndctrlpipe(cs->hw.usb->udev, 0), 7, 0x41, |
171 | (val & 0xff) | ((mask & 0xff) << 8), 0, | 164 | (val & 0xff) | ((mask & 0xff) << 8), 0, |
172 | NULL, 0, 2000 /*timeout??*/); // don't use this in an interrupt/BH | 165 | NULL, 0, 2000 /* timeout? */); |
173 | if (r < 0) | 166 | if (r < 0) |
174 | return r; | 167 | return r; |
175 | //.. | 168 | //.. |
@@ -309,15 +302,12 @@ static int gigaset_close_bchannel(struct bc_state *bcs) | |||
309 | return 0; | 302 | return 0; |
310 | } | 303 | } |
311 | 304 | ||
312 | //void send_ack_to_LL(void *data); | ||
313 | static int write_modem(struct cardstate *cs); | 305 | static int write_modem(struct cardstate *cs); |
314 | static int send_cb(struct cardstate *cs, struct cmdbuf_t *cb); | 306 | static int send_cb(struct cardstate *cs, struct cmdbuf_t *cb); |
315 | 307 | ||
316 | 308 | ||
317 | /* Handling of send queue. If there is already a skb opened, put data to | 309 | /* Write tasklet handler: Continue sending current skb, or send command, or |
318 | * the transfer buffer by calling "write_modem". Otherwise take a new skb out of the queue. | 310 | * start sending an skb from the send queue. |
319 | * This function will be called by the ISR via "transmit_chars" (USB: B-Channel Bulk callback handler | ||
320 | * via immediate task queue) or by writebuf_from_LL if the LL wants to transmit data. | ||
321 | */ | 311 | */ |
322 | static void gigaset_modem_fill(unsigned long data) | 312 | static void gigaset_modem_fill(unsigned long data) |
323 | { | 313 | { |
@@ -345,7 +335,8 @@ static void gigaset_modem_fill(unsigned long data) | |||
345 | if (send_cb(cs, cb) < 0) { | 335 | if (send_cb(cs, cb) < 0) { |
346 | dbg(DEBUG_OUTPUT, | 336 | dbg(DEBUG_OUTPUT, |
347 | "modem_fill: send_cb failed"); | 337 | "modem_fill: send_cb failed"); |
348 | again = 1; /* no callback will be called! */ | 338 | again = 1; /* no callback will be |
339 | called! */ | ||
349 | } | 340 | } |
350 | } else { /* skbs to send? */ | 341 | } else { /* skbs to send? */ |
351 | bcs->tx_skb = skb_dequeue(&bcs->squeue); | 342 | bcs->tx_skb = skb_dequeue(&bcs->squeue); |
@@ -371,8 +362,7 @@ static void gigaset_modem_fill(unsigned long data) | |||
371 | /** | 362 | /** |
372 | * gigaset_read_int_callback | 363 | * gigaset_read_int_callback |
373 | * | 364 | * |
374 | * It is called if the data was received from the device. This is almost similiar to | 365 | * It is called if the data was received from the device. |
375 | * the interrupt service routine in the serial device. | ||
376 | */ | 366 | */ |
377 | static void gigaset_read_int_callback(struct urb *urb, struct pt_regs *regs) | 367 | static void gigaset_read_int_callback(struct urb *urb, struct pt_regs *regs) |
378 | { | 368 | { |
@@ -381,13 +371,11 @@ static void gigaset_read_int_callback(struct urb *urb, struct pt_regs *regs) | |||
381 | struct cardstate *cs; | 371 | struct cardstate *cs; |
382 | unsigned numbytes; | 372 | unsigned numbytes; |
383 | unsigned char *src; | 373 | unsigned char *src; |
384 | //unsigned long flags; | ||
385 | struct inbuf_t *inbuf; | 374 | struct inbuf_t *inbuf; |
386 | 375 | ||
387 | IFNULLRET(urb); | 376 | IFNULLRET(urb); |
388 | inbuf = (struct inbuf_t *) urb->context; | 377 | inbuf = (struct inbuf_t *) urb->context; |
389 | IFNULLRET(inbuf); | 378 | IFNULLRET(inbuf); |
390 | //spin_lock_irqsave(&inbuf->lock, flags); | ||
391 | cs = inbuf->cs; | 379 | cs = inbuf->cs; |
392 | IFNULLGOTO(cs, exit); | 380 | IFNULLGOTO(cs, exit); |
393 | IFNULLGOTO(cardstate, exit); | 381 | IFNULLGOTO(cardstate, exit); |
@@ -422,7 +410,6 @@ static void gigaset_read_int_callback(struct urb *urb, struct pt_regs *regs) | |||
422 | resubmit = 1; | 410 | resubmit = 1; |
423 | } | 411 | } |
424 | exit: | 412 | exit: |
425 | //spin_unlock_irqrestore(&inbuf->lock, flags); | ||
426 | if (resubmit) { | 413 | if (resubmit) { |
427 | r = usb_submit_urb(urb, SLAB_ATOMIC); | 414 | r = usb_submit_urb(urb, SLAB_ATOMIC); |
428 | if (r) | 415 | if (r) |
@@ -431,11 +418,7 @@ exit: | |||
431 | } | 418 | } |
432 | 419 | ||
433 | 420 | ||
434 | /* This callback routine is called when data was transmitted to a B-Channel. | 421 | /* This callback routine is called when data was transmitted to the device. */ |
435 | * Therefore it has to check if there is still data to transmit. This | ||
436 | * happens by calling modem_fill via task queue. | ||
437 | * | ||
438 | */ | ||
439 | static void gigaset_write_bulk_callback(struct urb *urb, struct pt_regs *regs) | 422 | static void gigaset_write_bulk_callback(struct urb *urb, struct pt_regs *regs) |
440 | { | 423 | { |
441 | struct cardstate *cs = (struct cardstate *) urb->context; | 424 | struct cardstate *cs = (struct cardstate *) urb->context; |
@@ -448,8 +431,9 @@ static void gigaset_write_bulk_callback(struct urb *urb, struct pt_regs *regs) | |||
448 | } | 431 | } |
449 | #endif | 432 | #endif |
450 | if (urb->status) | 433 | if (urb->status) |
451 | err("bulk transfer failed (status %d)", -urb->status); /* That's all we can do. Communication problems | 434 | err("bulk transfer failed (status %d)", -urb->status); |
452 | are handeled by timeouts or network protocols */ | 435 | /* That's all we can do. Communication problems |
436 | are handeled by timeouts or network protocols */ | ||
453 | 437 | ||
454 | atomic_set(&cs->hw.usb->busy, 0); | 438 | atomic_set(&cs->hw.usb->busy, 0); |
455 | tasklet_schedule(&cs->write_tasklet); | 439 | tasklet_schedule(&cs->write_tasklet); |
@@ -503,16 +487,16 @@ static int send_cb(struct cardstate *cs, struct cmdbuf_t *cb) | |||
503 | atomic_set(&ucs->busy, 0); | 487 | atomic_set(&ucs->busy, 0); |
504 | err("could not submit urb (error %d).", | 488 | err("could not submit urb (error %d).", |
505 | -status); | 489 | -status); |
506 | cb->len = 0; /* skip urb => remove cb+wakeup in next loop cycle */ | 490 | cb->len = 0; /* skip urb => remove cb+wakeup |
491 | in next loop cycle */ | ||
507 | } | 492 | } |
508 | } | 493 | } |
509 | } while (cb && status); /* bei Fehler naechster Befehl //FIXME: ist das OK? */ | 494 | } while (cb && status); /* next command on error */ |
510 | 495 | ||
511 | return status; | 496 | return status; |
512 | } | 497 | } |
513 | 498 | ||
514 | /* Write string into transbuf and send it to modem. | 499 | /* Send command to device. */ |
515 | */ | ||
516 | static int gigaset_write_cmd(struct cardstate *cs, const unsigned char *buf, | 500 | static int gigaset_write_cmd(struct cardstate *cs, const unsigned char *buf, |
517 | int len, struct tasklet_struct *wake_tasklet) | 501 | int len, struct tasklet_struct *wake_tasklet) |
518 | { | 502 | { |
@@ -604,7 +588,6 @@ static int gigaset_initbcshw(struct bc_state *bcs) | |||
604 | if (!bcs->hw.usb) | 588 | if (!bcs->hw.usb) |
605 | return 0; | 589 | return 0; |
606 | 590 | ||
607 | //bcs->hw.usb->trans_flg = READY_TO_TRNSMIT; /* B-Channel ready to transmit */ | ||
608 | return 1; | 591 | return 1; |
609 | } | 592 | } |
610 | 593 | ||
@@ -614,7 +597,6 @@ static void gigaset_reinitbcshw(struct bc_state *bcs) | |||
614 | 597 | ||
615 | static void gigaset_freecshw(struct cardstate *cs) | 598 | static void gigaset_freecshw(struct cardstate *cs) |
616 | { | 599 | { |
617 | //FIXME | ||
618 | tasklet_kill(&cs->write_tasklet); | 600 | tasklet_kill(&cs->write_tasklet); |
619 | kfree(cs->hw.usb); | 601 | kfree(cs->hw.usb); |
620 | } | 602 | } |
@@ -644,19 +626,13 @@ static int gigaset_initcshw(struct cardstate *cs) | |||
644 | return 1; | 626 | return 1; |
645 | } | 627 | } |
646 | 628 | ||
647 | /* Writes the data of the current open skb into the modem. | 629 | /* Send data from current skb to the device. */ |
648 | * We have to protect against multiple calls until the | ||
649 | * callback handler () is called , due to the fact that we | ||
650 | * are just allowed to send data once to an endpoint. Therefore | ||
651 | * we using "trans_flg" to synchonize ... | ||
652 | */ | ||
653 | static int write_modem(struct cardstate *cs) | 630 | static int write_modem(struct cardstate *cs) |
654 | { | 631 | { |
655 | int ret; | 632 | int ret; |
656 | int count; | 633 | int count; |
657 | struct bc_state *bcs = &cs->bcs[0]; /* only one channel */ | 634 | struct bc_state *bcs = &cs->bcs[0]; /* only one channel */ |
658 | struct usb_cardstate *ucs = cs->hw.usb; | 635 | struct usb_cardstate *ucs = cs->hw.usb; |
659 | //unsigned long flags; | ||
660 | 636 | ||
661 | IFNULLRETVAL(bcs->tx_skb, -EINVAL); | 637 | IFNULLRETVAL(bcs->tx_skb, -EINVAL); |
662 | 638 | ||
@@ -720,12 +696,9 @@ static int gigaset_probe(struct usb_interface *interface, | |||
720 | struct usb_host_interface *hostif; | 696 | struct usb_host_interface *hostif; |
721 | struct cardstate *cs = NULL; | 697 | struct cardstate *cs = NULL; |
722 | struct usb_cardstate *ucs = NULL; | 698 | struct usb_cardstate *ucs = NULL; |
723 | //struct usb_interface_descriptor *iface_desc; | ||
724 | struct usb_endpoint_descriptor *endpoint; | 699 | struct usb_endpoint_descriptor *endpoint; |
725 | //isdn_ctrl command; | ||
726 | int buffer_size; | 700 | int buffer_size; |
727 | int alt; | 701 | int alt; |
728 | //unsigned long flags; | ||
729 | 702 | ||
730 | info("%s: Check if device matches .. (Vendor: 0x%x, Product: 0x%x)", | 703 | info("%s: Check if device matches .. (Vendor: 0x%x, Product: 0x%x)", |
731 | __func__, le16_to_cpu(udev->descriptor.idVendor), | 704 | __func__, le16_to_cpu(udev->descriptor.idVendor), |
@@ -766,29 +739,6 @@ static int gigaset_probe(struct usb_interface *interface, | |||
766 | } | 739 | } |
767 | ucs = cs->hw.usb; | 740 | ucs = cs->hw.usb; |
768 | 741 | ||
769 | #if 0 | ||
770 | if (usb_set_configuration(udev, udev->config[0].desc.bConfigurationValue) < 0) { | ||
771 | warn("set_configuration failed"); | ||
772 | goto error; | ||
773 | } | ||
774 | |||
775 | |||
776 | if (usb_set_interface(udev, ifnum/*==0*/, alt/*==0*/) < 0) { | ||
777 | warn("usb_set_interface failed, device %d interface %d altsetting %d", | ||
778 | udev->devnum, ifnum, alt); | ||
779 | goto error; | ||
780 | } | ||
781 | #endif | ||
782 | |||
783 | /* set up the endpoint information */ | ||
784 | /* check out the endpoints */ | ||
785 | /* We will get 2 endpoints: One for sending commands to the device (bulk out) and one to | ||
786 | * poll messages from the device(int in). | ||
787 | * Therefore we will have an almost similiar situation as with our serial port handler. | ||
788 | * If an connection will be established, we will have to create data in/out pipes | ||
789 | * dynamically... | ||
790 | */ | ||
791 | |||
792 | endpoint = &hostif->endpoint[0].desc; | 742 | endpoint = &hostif->endpoint[0].desc; |
793 | 743 | ||
794 | buffer_size = le16_to_cpu(endpoint->wMaxPacketSize); | 744 | buffer_size = le16_to_cpu(endpoint->wMaxPacketSize); |
@@ -896,18 +846,15 @@ static void gigaset_disconnect(struct usb_interface *interface) | |||
896 | 846 | ||
897 | tasklet_kill(&cs->write_tasklet); | 847 | tasklet_kill(&cs->write_tasklet); |
898 | 848 | ||
899 | usb_kill_urb(ucs->bulk_out_urb); /* FIXME: nur, wenn noetig */ | 849 | usb_kill_urb(ucs->bulk_out_urb); /* FIXME: only if active? */ |
900 | //usb_kill_urb(ucs->urb_cmd_out); /* FIXME: nur, wenn noetig */ | ||
901 | 850 | ||
902 | kfree(ucs->bulk_out_buffer); | 851 | kfree(ucs->bulk_out_buffer); |
903 | if (ucs->bulk_out_urb != NULL) | 852 | if (ucs->bulk_out_urb != NULL) |
904 | usb_free_urb(ucs->bulk_out_urb); | 853 | usb_free_urb(ucs->bulk_out_urb); |
905 | //if(ucs->urb_cmd_out != NULL) | ||
906 | // usb_free_urb(ucs->urb_cmd_out); | ||
907 | kfree(cs->inbuf[0].rcvbuf); | 854 | kfree(cs->inbuf[0].rcvbuf); |
908 | if (ucs->read_urb != NULL) | 855 | if (ucs->read_urb != NULL) |
909 | usb_free_urb(ucs->read_urb); | 856 | usb_free_urb(ucs->read_urb); |
910 | ucs->read_urb = ucs->bulk_out_urb/*=ucs->urb_cmd_out*/=NULL; | 857 | ucs->read_urb = ucs->bulk_out_urb = NULL; |
911 | cs->inbuf[0].rcvbuf = ucs->bulk_out_buffer = NULL; | 858 | cs->inbuf[0].rcvbuf = ucs->bulk_out_buffer = NULL; |
912 | 859 | ||
913 | gigaset_unassign(cs); | 860 | gigaset_unassign(cs); |