Commit 7441dd12 authored by Martin Bachem's avatar Martin Bachem Committed by Linus Torvalds

hisax: hfc_usb: update to current CVS version

- killed paranoid NULL Pointer check
- human readable LED states
- support for "Eicon DIVA USB 4.0" (0x071d/0x1005)
Signed-off-by: default avatarMartin Bachem <info@colognechip.com>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 325a8071
/* /*
* hfc_usb.c * hfc_usb.c
* *
* $Id: hfc_usb.c,v 2.3.2.20 2007/08/20 14:07:54 mbachem Exp $ * $Id: hfc_usb.c,v 2.3.2.24 2007/10/14 08:40:29 mbachem Exp $
* *
* modular HiSax ISDN driver for Colognechip HFC-S USB chip * modular HiSax ISDN driver for Colognechip HFC-S USB chip
* *
...@@ -45,7 +45,7 @@ ...@@ -45,7 +45,7 @@
#include "hfc_usb.h" #include "hfc_usb.h"
static const char *hfcusb_revision = static const char *hfcusb_revision =
"$Revision: 2.3.2.20 $ $Date: 2007/08/20 14:07:54 $ "; "$Revision: 2.3.2.24 $ $Date: 2007/10/14 08:40:29 $ ";
/* Hisax debug support /* Hisax debug support
* debug flags defined in hfc_usb.h as HFCUSB_DBG_[*] * debug flags defined in hfc_usb.h as HFCUSB_DBG_[*]
...@@ -126,6 +126,12 @@ static struct usb_device_id hfcusb_idtab[] = { ...@@ -126,6 +126,12 @@ static struct usb_device_id hfcusb_idtab[] = {
{LED_SCHEME1, {0x80, -64, -32, -16}, {LED_SCHEME1, {0x80, -64, -32, -16},
"Twister ISDN TA"}), "Twister ISDN TA"}),
}, },
{
USB_DEVICE(0x071d, 0x1005),
.driver_info = (unsigned long) &((hfcsusb_vdata)
{LED_SCHEME1, {0x02, 0, 0x01, 0x04},
"Eicon DIVA USB 4.0"}),
},
{ } { }
}; };
...@@ -187,7 +193,7 @@ typedef struct hfcusb_data { ...@@ -187,7 +193,7 @@ typedef struct hfcusb_data {
struct usb_ctrlrequest ctrl_write; /* buffer for control write request */ struct usb_ctrlrequest ctrl_write; /* buffer for control write request */
struct usb_ctrlrequest ctrl_read; /* same for read request */ struct usb_ctrlrequest ctrl_read; /* same for read request */
__u8 old_led_state, led_state, led_new_data, led_b_active; __u8 old_led_state, led_state;
volatile __u8 threshold_mask; /* threshold actually reported */ volatile __u8 threshold_mask; /* threshold actually reported */
volatile __u8 bch_enables; /* or mask for sctrl_r and sctrl register values */ volatile __u8 bch_enables; /* or mask for sctrl_r and sctrl register values */
...@@ -263,7 +269,7 @@ ctrl_complete(struct urb *urb) ...@@ -263,7 +269,7 @@ ctrl_complete(struct urb *urb)
ctrl_start_transfer(hfc); /* start next transfer */ ctrl_start_transfer(hfc); /* start next transfer */
} }
} /* ctrl_complete */ }
/* write led data to auxport & invert if necessary */ /* write led data to auxport & invert if necessary */
static void static void
...@@ -276,18 +282,18 @@ write_led(hfcusb_data * hfc, __u8 led_state) ...@@ -276,18 +282,18 @@ write_led(hfcusb_data * hfc, __u8 led_state)
} }
static void static void
set_led_bit(hfcusb_data * hfc, signed short led_bits, int unset) set_led_bit(hfcusb_data * hfc, signed short led_bits, int on)
{ {
if (unset) { if (on) {
if (led_bits < 0) if (led_bits < 0)
hfc->led_state |= abs(led_bits); hfc->led_state &= ~abs(led_bits);
else else
hfc->led_state &= ~led_bits; hfc->led_state |= led_bits;
} else { } else {
if (led_bits < 0) if (led_bits < 0)
hfc->led_state &= ~abs(led_bits); hfc->led_state |= abs(led_bits);
else else
hfc->led_state |= led_bits; hfc->led_state &= ~led_bits;
} }
} }
...@@ -304,34 +310,34 @@ handle_led(hfcusb_data * hfc, int event) ...@@ -304,34 +310,34 @@ handle_led(hfcusb_data * hfc, int event)
switch (event) { switch (event) {
case LED_POWER_ON: case LED_POWER_ON:
set_led_bit(hfc, driver_info->led_bits[0], 0); set_led_bit(hfc, driver_info->led_bits[0], 1);
set_led_bit(hfc, driver_info->led_bits[1], 1); set_led_bit(hfc, driver_info->led_bits[1], 0);
set_led_bit(hfc, driver_info->led_bits[2], 1); set_led_bit(hfc, driver_info->led_bits[2], 0);
set_led_bit(hfc, driver_info->led_bits[3], 1); set_led_bit(hfc, driver_info->led_bits[3], 0);
break; break;
case LED_POWER_OFF: case LED_POWER_OFF:
set_led_bit(hfc, driver_info->led_bits[0], 1); set_led_bit(hfc, driver_info->led_bits[0], 0);
set_led_bit(hfc, driver_info->led_bits[1], 1); set_led_bit(hfc, driver_info->led_bits[1], 0);
set_led_bit(hfc, driver_info->led_bits[2], 1); set_led_bit(hfc, driver_info->led_bits[2], 0);
set_led_bit(hfc, driver_info->led_bits[3], 1); set_led_bit(hfc, driver_info->led_bits[3], 0);
break; break;
case LED_S0_ON: case LED_S0_ON:
set_led_bit(hfc, driver_info->led_bits[1], 0); set_led_bit(hfc, driver_info->led_bits[1], 1);
break; break;
case LED_S0_OFF: case LED_S0_OFF:
set_led_bit(hfc, driver_info->led_bits[1], 1); set_led_bit(hfc, driver_info->led_bits[1], 0);
break; break;
case LED_B1_ON: case LED_B1_ON:
set_led_bit(hfc, driver_info->led_bits[2], 0); set_led_bit(hfc, driver_info->led_bits[2], 1);
break; break;
case LED_B1_OFF: case LED_B1_OFF:
set_led_bit(hfc, driver_info->led_bits[2], 1); set_led_bit(hfc, driver_info->led_bits[2], 0);
break; break;
case LED_B2_ON: case LED_B2_ON:
set_led_bit(hfc, driver_info->led_bits[3], 0); set_led_bit(hfc, driver_info->led_bits[3], 1);
break; break;
case LED_B2_OFF: case LED_B2_OFF:
set_led_bit(hfc, driver_info->led_bits[3], 1); set_led_bit(hfc, driver_info->led_bits[3], 0);
break; break;
} }
write_led(hfc, hfc->led_state); write_led(hfc, hfc->led_state);
...@@ -1159,7 +1165,6 @@ hfc_usb_init(hfcusb_data * hfc) ...@@ -1159,7 +1165,6 @@ hfc_usb_init(hfcusb_data * hfc)
hfc->l1_activated = 0; hfc->l1_activated = 0;
hfc->disc_flag = 0; hfc->disc_flag = 0;
hfc->led_state = 0; hfc->led_state = 0;
hfc->led_new_data = 0;
hfc->old_led_state = 0; hfc->old_led_state = 0;
/* init the t3 timer */ /* init the t3 timer */
...@@ -1514,20 +1519,18 @@ hfc_usb_probe(struct usb_interface *intf, const struct usb_device_id *id) ...@@ -1514,20 +1519,18 @@ hfc_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
/* callback for unplugged USB device */ /* callback for unplugged USB device */
static void static void
hfc_usb_disconnect(struct usb_interface hfc_usb_disconnect(struct usb_interface *intf)
*intf)
{ {
hfcusb_data *context = usb_get_intfdata(intf); hfcusb_data *context = usb_get_intfdata(intf);
int i; int i;
handle_led(context, LED_POWER_OFF); handle_led(context, LED_POWER_OFF);
schedule_timeout((10 * HZ) / 1000); schedule_timeout(HZ / 100);
printk(KERN_INFO "HFC-S USB: device disconnect\n"); printk(KERN_INFO "HFC-S USB: device disconnect\n");
context->disc_flag = 1; context->disc_flag = 1;
usb_set_intfdata(intf, NULL); usb_set_intfdata(intf, NULL);
if (!context)
return;
if (timer_pending(&context->t3_timer)) if (timer_pending(&context->t3_timer))
del_timer(&context->t3_timer); del_timer(&context->t3_timer);
if (timer_pending(&context->t4_timer)) if (timer_pending(&context->t4_timer))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment