aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authormatthieu castet <castet.matthieu@free.fr>2006-01-18 01:38:19 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2006-01-31 20:23:40 -0500
commit3c9666cc18be1fc11698fc0181e124b44889cf37 (patch)
treec705c85228a0380ceee588d7b85dcbfc10d1a6c6 /drivers
parentab3c81ff639fbee4ab32af84c809d283b773084a (diff)
[PATCH] UEAGLE : add iso support
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>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/usb/atm/ueagle-atm.c26
1 files changed, 25 insertions, 1 deletions
diff --git a/drivers/usb/atm/ueagle-atm.c b/drivers/usb/atm/ueagle-atm.c
index 4362cfd801b5..ea7dfe0c8275 100644
--- a/drivers/usb/atm/ueagle-atm.c
+++ b/drivers/usb/atm/ueagle-atm.c
@@ -68,7 +68,7 @@
68 68
69#include "usbatm.h" 69#include "usbatm.h"
70 70
71#define EAGLEUSBVERSION "ueagle 1.1" 71#define EAGLEUSBVERSION "ueagle 1.2"
72 72
73 73
74/* 74/*
@@ -364,11 +364,14 @@ static const char *chip_name[] = {"ADI930", "Eagle I", "Eagle II", "Eagle III"};
364 364
365static int modem_index; 365static int modem_index;
366static unsigned int debug; 366static unsigned int debug;
367static int use_iso[NB_MODEM] = {[0 ... (NB_MODEM - 1)] = 1};
367static int sync_wait[NB_MODEM]; 368static int sync_wait[NB_MODEM];
368static char *cmv_file[NB_MODEM]; 369static char *cmv_file[NB_MODEM];
369 370
370module_param(debug, uint, 0644); 371module_param(debug, uint, 0644);
371MODULE_PARM_DESC(debug, "module debug level (0=off,1=on,2=verbose)"); 372MODULE_PARM_DESC(debug, "module debug level (0=off,1=on,2=verbose)");
373module_param_array(use_iso, bool, NULL, 0644);
374MODULE_PARM_DESC(use_iso, "use isochronous usb pipe for incoming traffic");
372module_param_array(sync_wait, bool, NULL, 0644); 375module_param_array(sync_wait, bool, NULL, 0644);
373MODULE_PARM_DESC(sync_wait, "wait the synchronisation before starting ATM"); 376MODULE_PARM_DESC(sync_wait, "wait the synchronisation before starting ATM");
374module_param_array(cmv_file, charp, NULL, 0644); 377module_param_array(cmv_file, charp, NULL, 0644);
@@ -936,6 +939,7 @@ static int uea_stat(struct uea_softc *sc)
936 * ADI930 don't support it (-EPIPE error). 939 * ADI930 don't support it (-EPIPE error).
937 */ 940 */
938 if (UEA_CHIP_VERSION(sc) != ADI930 941 if (UEA_CHIP_VERSION(sc) != ADI930
942 && !use_iso[sc->modem_index]
939 && sc->stats.phy.dsrate != (data >> 16) * 32) { 943 && sc->stats.phy.dsrate != (data >> 16) * 32) {
940 /* Original timming from ADI(used in windows driver) 944 /* Original timming from ADI(used in windows driver)
941 * 0x20ffff>>16 * 32 = 32 * 32 = 1Mbits 945 * 0x20ffff>>16 * 32 = 32 * 32 = 1Mbits
@@ -1659,6 +1663,25 @@ static int uea_bind(struct usbatm_data *usbatm, struct usb_interface *intf,
1659 sc->modem_index = (modem_index < NB_MODEM) ? modem_index++ : 0; 1663 sc->modem_index = (modem_index < NB_MODEM) ? modem_index++ : 0;
1660 sc->driver_info = id->driver_info; 1664 sc->driver_info = id->driver_info;
1661 1665
1666 /* ADI930 don't support iso */
1667 if (UEA_CHIP_VERSION(id) != ADI930 && use_iso[sc->modem_index]) {
1668 int i;
1669
1670 /* try set fastest alternate for inbound traffic interface */
1671 for (i = FASTEST_ISO_INTF; i > 0; i--)
1672 if (usb_set_interface(usb, UEA_DS_IFACE_NO, i) == 0)
1673 break;
1674
1675 if (i > 0) {
1676 uea_dbg(usb, "set alternate %d for 2 interface\n", i);
1677 uea_info(usb, "using iso mode\n");
1678 usbatm->flags |= UDSL_USE_ISOC | UDSL_IGNORE_EILSEQ;
1679 } else {
1680 uea_err(usb, "setting any alternate failed for "
1681 "2 interface, using bulk mode\n");
1682 }
1683 }
1684
1662 ret = uea_boot(sc); 1685 ret = uea_boot(sc);
1663 if (ret < 0) { 1686 if (ret < 0) {
1664 kfree(sc); 1687 kfree(sc);
@@ -1708,6 +1731,7 @@ static struct usbatm_driver uea_usbatm_driver = {
1708 .heavy_init = uea_heavy, 1731 .heavy_init = uea_heavy,
1709 .bulk_in = UEA_BULK_DATA_PIPE, 1732 .bulk_in = UEA_BULK_DATA_PIPE,
1710 .bulk_out = UEA_BULK_DATA_PIPE, 1733 .bulk_out = UEA_BULK_DATA_PIPE,
1734 .isoc_in = UEA_ISO_DATA_PIPE,
1711}; 1735};
1712 1736
1713static int uea_probe(struct usb_interface *intf, const struct usb_device_id *id) 1737static int uea_probe(struct usb_interface *intf, const struct usb_device_id *id)