Haralds patch für die usb-serial.c scheint endlich Besserung zu bringen bzgl. der oopses und dem Einschlafen vom ohci_hcd nach mehrerem An/Abstecken.
Zusätzlich hat Harald Welte noch einiges an den Aufrufen in der cyberjack.c geändert.
Leider wird in seinen originalen patches der lokale Schreib-Buffer wieder eingeführt, war hier an meinen Rechnern Fehler in Verbindung mit dem cjtest Programm der Reiner-Treibersuite bringt. Ich habe den Teil mal bis auf weiteres revidiert, bzw so gelassen wie er im aktuellen Kernel ist.
Ob jetzt cjtest nur falsch programmiert ist (bzgl neuerer Kernelversionen) und ob der lokale Buffer wirklich nötig ist, weiss ich noch nicht. Ohne Buffer funktioniert's aber - zumindest bei mir.
Kleine Anleitung für Kernel 2.6.7:
1. Nach /usr/src/linux-2.6.7/drivers/usb/serial/ gehen.
2.
Code: Alles auswählen
cat usb-serial.patch | patch -b
3.
Code: Alles auswählen
cat cyberjack.patch | patch -b
4. Nach /usr/src/linux-2.6.7/ gehen und
Code: Alles auswählen
make modules
5. Die neuen Module aus /usr/src/linux-2.6.7/drivers/usb/serial/ ins Modull-Verzeichnis /lib/modules/.....) kopieren.
6. Neu starten, oder die Module manuell laden.
Aktuelle patches für Kernel 2.6.7:
Patch für /usr/src/linux-2.6.7/drivers/usb/serial/cyberjack.c
Abspeichern als cyberjack.patch oder hier runterladen: cyberjack.patch
Code: Alles auswählen
--- cyberjack.c.orig 2004-06-24 12:01:54.000000000 +0200
+++ cyberjack.c 2004-06-23 14:06:03.000000000 +0200
@@ -49,7 +49,7 @@
/*
* Version Information
*/
-#define DRIVER_VERSION "v1.0"
+#define DRIVER_VERSION "v1.01"
#define DRIVER_AUTHOR "Matthias Bruestle"
#define DRIVER_DESC "REINER SCT cyberJack pinpad/e-com USB Chipcard Reader Driver"
@@ -116,6 +116,7 @@ struct cyberjack_private {
static int cyberjack_startup (struct usb_serial *serial)
{
struct cyberjack_private *priv;
+ int i;
dbg("%s", __FUNCTION__);
@@ -133,6 +134,16 @@ static int cyberjack_startup (struct usb
init_waitqueue_head(&serial->port[0]->write_wait);
+ for (i = 0; i < serial->num_ports; ++i) {
+ int result;
+ serial->port[i]->interrupt_in_urb->dev = serial->dev;
+ result = usb_submit_urb(serial->port[i]->interrupt_in_urb,
+ GFP_KERNEL);
+ if (result)
+ err(" usb_submit_urb(read int) failed");
+ dbg("%s - usb_submit_urb(int urb)", __FUNCTION__);
+ }
+
return( 0 );
}
@@ -143,6 +154,7 @@ static void cyberjack_shutdown (struct u
dbg("%s", __FUNCTION__);
for (i=0; i < serial->num_ports; ++i) {
+ usb_unlink_urb (serial->port[i]->interrupt_in_urb);
/* My special items, the standard routines free my urbs */
kfree(usb_get_serial_port_data(serial->port[i]));
usb_set_serial_port_data(serial->port[i], NULL);
@@ -173,17 +185,6 @@ static int cyberjack_open (struct usb_s
priv->wrsent = 0;
spin_unlock_irqrestore(&priv->lock, flags);
- /* shutdown any bulk reads that might be going on */
- usb_unlink_urb (port->write_urb);
- usb_unlink_urb (port->read_urb);
- usb_unlink_urb (port->interrupt_in_urb);
-
- port->interrupt_in_urb->dev = port->serial->dev;
- result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
- if (result)
- err(" usb_submit_urb(read int) failed");
- dbg("%s - usb_submit_urb(int urb)", __FUNCTION__);
-
return result;
}
@@ -195,11 +196,6 @@ static void cyberjack_close (struct usb_
/* shutdown any bulk reads that might be going on */
usb_unlink_urb (port->write_urb);
usb_unlink_urb (port->read_urb);
- usb_unlink_urb (port->interrupt_in_urb);
- dbg("%s - usb_clear_halt", __FUNCTION__ );
- usb_clear_halt(port->serial->dev, port->write_urb->pipe);
- usb_clear_halt(port->serial->dev, port->read_urb->pipe);
- usb_clear_halt(port->serial->dev, port->interrupt_in_urb->pipe);
}
}
@@ -383,6 +379,10 @@ static void cyberjack_read_bulk_callback
usb_serial_debug_data (__FILE__, __FUNCTION__, urb->actual_length, data);
tty = port->tty;
+ if (!tty) {
+ dbg("%s - ignoring since device not open\n", __FUNCTION__);
+ return;
+ }
if (urb->actual_length) {
for (i = 0; i < urb->actual_length ; ++i) {
/* if we insert more than TTY_FLIPBUF_SIZE characters, we drop them. */
Patch für /usr/src/linux-2.6.7/drivers/usb/serial/usb-serial.c
Abspeichern als usb-serial.patch oder hier runterladen: usb-serial.patch
Code: Alles auswählen
--- usb-serial.c.orig 2004-06-24 12:02:20.000000000 +0200
+++ usb-serial.c 2004-06-23 13:40:23.000000000 +0200
@@ -1393,7 +1393,7 @@ void usb_serial_deregister(struct usb_se
serial = serial_table[i];
if ((serial != NULL) && (serial->type == device)) {
usb_driver_release_interface (&usb_serial_driver, serial->interface);
- usb_serial_disconnect (serial->interface);
+// usb_serial_disconnect (serial->interface);
}
}