Skip to content

Commit

Permalink
[PATCH] UEAGLE : add iso support
Browse files Browse the repository at this point in the history
This patch adds the support for isochronous pipe.

A new module parameter is added to select iso mode.  It is set to iso by
default because bulk mode doesn't work well at high speed rate (>3 Mbps
for upload).

We use UDSL_IGNORE_EILSEQ flags because ADI firmware doesn't reply to
ISO IN when it has nothing to send [1].

[1]
from cypress datasheet :

The ISOSEND0 Bit (bit 7 in the USBPAIR Register) is used when the EZ-USB
FX chip receives an isochronous IN token while the IN FIFO is empty. If
ISOSEND0=0 (the default value), the USB core does not respond to the IN
token. If ISOSEND0=1, the USB core sends a zero-length data packet in
response to the IN token. The action to take depends on the overall
system design. The ISOSEND0 Bit applies to all of the isochronous IN
endpoints, IN-8 through IN-15.

Signed-off-by: Matthieu CASTET <castet.matthieu@free.fr>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
  • Loading branch information
matthieu castet authored and Greg Kroah-Hartman committed Feb 1, 2006
1 parent ab3c81f commit 3c9666c
Showing 1 changed file with 25 additions and 1 deletion.
26 changes: 25 additions & 1 deletion drivers/usb/atm/ueagle-atm.c
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@

#include "usbatm.h"

#define EAGLEUSBVERSION "ueagle 1.1"
#define EAGLEUSBVERSION "ueagle 1.2"


/*
Expand Down Expand Up @@ -364,11 +364,14 @@ static const char *chip_name[] = {"ADI930", "Eagle I", "Eagle II", "Eagle III"};

static int modem_index;
static unsigned int debug;
static int use_iso[NB_MODEM] = {[0 ... (NB_MODEM - 1)] = 1};
static int sync_wait[NB_MODEM];
static char *cmv_file[NB_MODEM];

module_param(debug, uint, 0644);
MODULE_PARM_DESC(debug, "module debug level (0=off,1=on,2=verbose)");
module_param_array(use_iso, bool, NULL, 0644);
MODULE_PARM_DESC(use_iso, "use isochronous usb pipe for incoming traffic");
module_param_array(sync_wait, bool, NULL, 0644);
MODULE_PARM_DESC(sync_wait, "wait the synchronisation before starting ATM");
module_param_array(cmv_file, charp, NULL, 0644);
Expand Down Expand Up @@ -936,6 +939,7 @@ static int uea_stat(struct uea_softc *sc)
* ADI930 don't support it (-EPIPE error).
*/
if (UEA_CHIP_VERSION(sc) != ADI930
&& !use_iso[sc->modem_index]
&& sc->stats.phy.dsrate != (data >> 16) * 32) {
/* Original timming from ADI(used in windows driver)
* 0x20ffff>>16 * 32 = 32 * 32 = 1Mbits
Expand Down Expand Up @@ -1659,6 +1663,25 @@ static int uea_bind(struct usbatm_data *usbatm, struct usb_interface *intf,
sc->modem_index = (modem_index < NB_MODEM) ? modem_index++ : 0;
sc->driver_info = id->driver_info;

/* ADI930 don't support iso */
if (UEA_CHIP_VERSION(id) != ADI930 && use_iso[sc->modem_index]) {
int i;

/* try set fastest alternate for inbound traffic interface */
for (i = FASTEST_ISO_INTF; i > 0; i--)
if (usb_set_interface(usb, UEA_DS_IFACE_NO, i) == 0)
break;

if (i > 0) {
uea_dbg(usb, "set alternate %d for 2 interface\n", i);
uea_info(usb, "using iso mode\n");
usbatm->flags |= UDSL_USE_ISOC | UDSL_IGNORE_EILSEQ;
} else {
uea_err(usb, "setting any alternate failed for "
"2 interface, using bulk mode\n");
}
}

ret = uea_boot(sc);
if (ret < 0) {
kfree(sc);
Expand Down Expand Up @@ -1708,6 +1731,7 @@ static struct usbatm_driver uea_usbatm_driver = {
.heavy_init = uea_heavy,
.bulk_in = UEA_BULK_DATA_PIPE,
.bulk_out = UEA_BULK_DATA_PIPE,
.isoc_in = UEA_ISO_DATA_PIPE,
};

static int uea_probe(struct usb_interface *intf, const struct usb_device_id *id)
Expand Down

0 comments on commit 3c9666c

Please sign in to comment.