Index: usbatm.c =================================================================== RCS file: /home/cvs/usbatm/usbatm.c,v retrieving revision 1.47 diff -u -r1.47 usbatm.c --- usbatm.c 27 May 2005 16:17:23 -0000 1.47 +++ usbatm.c 27 Jun 2005 18:23:14 -0000 @@ -99,10 +99,12 @@ #define UDSL_MAX_RCV_URBS 16 #define UDSL_MAX_SND_URBS 16 #define UDSL_MAX_RCV_BUF_SIZE 1024 /* ATM cells */ +#define UDSL_MAX_RCV_ISO_PACKETS 16 #define UDSL_MAX_SND_BUF_SIZE 1024 /* ATM cells */ #define UDSL_DEFAULT_RCV_URBS 4 #define UDSL_DEFAULT_SND_URBS 4 #define UDSL_DEFAULT_RCV_BUF_SIZE 64 /* ATM cells */ +#define UDSL_DEFAULT_RCV_ISO_PACKETS 32 #define UDSL_DEFAULT_SND_BUF_SIZE 64 /* ATM cells */ #define ATM_CELL_HEADER (ATM_CELL_SIZE - ATM_CELL_PAYLOAD) @@ -112,6 +114,7 @@ static unsigned int num_rcv_urbs = UDSL_DEFAULT_RCV_URBS; static unsigned int num_snd_urbs = UDSL_DEFAULT_SND_URBS; static unsigned int rcv_buf_size = UDSL_DEFAULT_RCV_BUF_SIZE; +static unsigned int rcv_buf_iso_packets = UDSL_DEFAULT_RCV_ISO_PACKETS; static unsigned int snd_buf_size = UDSL_DEFAULT_SND_BUF_SIZE; module_param(num_rcv_urbs, uint, S_IRUGO); @@ -132,6 +135,12 @@ __MODULE_STRING(UDSL_MAX_RCV_BUF_SIZE) ", default: " __MODULE_STRING(UDSL_DEFAULT_RCV_BUF_SIZE) ")"); +module_param(rcv_buf_iso_packets, uint, S_IRUGO); +MODULE_PARM_DESC(rcv_buf_iso_packets, + "Number of packets in a iso frame(range: 1-" + __MODULE_STRING(UDSL_MAX_RCV_ISO_PACKETS) ", default: " + __MODULE_STRING(UDSL_DEFAULT_RCV_ISO_PACKETS) ")"); + module_param(snd_buf_size, uint, S_IRUGO); MODULE_PARM_DESC(snd_buf_size, "Size of the buffers used for transmission in ATM cells (range: 1-" @@ -952,6 +961,7 @@ int error = -ENOMEM; int i, length; int need_heavy; + unsigned int iso_size = 0; dev_dbg(dev, "%s: trying driver %s with vendor=0x%x, product=0x%x, ifnum %d\n", __func__, driver->driver_name, @@ -1017,12 +1027,22 @@ usbatm_init_channel(&instance->tx_channel); tasklet_init(&instance->rx_channel.tasklet, usbatm_rx_process, (unsigned long)instance); tasklet_init(&instance->tx_channel.tasklet, usbatm_tx_process, (unsigned long)instance); - instance->rx_channel.endpoint = usb_rcvbulkpipe(usb_dev, driver->in); - instance->tx_channel.endpoint = usb_sndbulkpipe(usb_dev, driver->out); instance->rx_channel.stride = ATM_CELL_SIZE + driver->rx_padding; instance->tx_channel.stride = ATM_CELL_SIZE + driver->tx_padding; - instance->rx_channel.buf_size = rcv_buf_size * instance->rx_channel.stride; + instance->tx_channel.endpoint = usb_sndbulkpipe(usb_dev, driver->out); instance->tx_channel.buf_size = snd_buf_size * instance->tx_channel.stride; + if (driver->use_iso) { + /* don't expect iso out endpoints */ + instance->rx_channel.endpoint = usb_rcvisocpipe(usb_dev, driver->in); + iso_size = usb_maxpacket(instance->usb_dev, instance->rx_channel.endpoint, 0); + iso_size -= iso_size % instance->rx_channel.stride; /* alignment */ + BUG_ON(!iso_size); + instance->rx_channel.buf_size = rcv_buf_iso_packets * iso_size; + } + else { + instance->rx_channel.endpoint = usb_rcvbulkpipe(usb_dev, driver->in); + instance->rx_channel.buf_size = rcv_buf_size * instance->rx_channel.stride; + } instance->rx_channel.usbatm = instance->tx_channel.usbatm = instance; skb_queue_head_init(&instance->sndqueue); @@ -1030,16 +1050,12 @@ for (i = 0; i < num_rcv_urbs + num_snd_urbs; i++) { struct urb *urb; u8 *buffer; - unsigned int iso_packets = 0, iso_size = 0; + unsigned int iso_packets = 0; struct usbatm_channel *channel = i < num_rcv_urbs ? &instance->rx_channel : &instance->tx_channel; if (usb_pipeisoc(channel->endpoint)) { - /* don't expect iso out endpoints */ - iso_size = usb_maxpacket(instance->usb_dev, channel->endpoint, 0); - iso_size -= iso_size % channel->stride; /* alignment */ - BUG_ON(!iso_size); - iso_packets = (channel->buf_size - 1) / iso_size + 1; + iso_packets = rcv_buf_iso_packets; } urb = usb_alloc_urb(iso_packets, GFP_KERNEL); @@ -1188,6 +1204,8 @@ || (num_snd_urbs > UDSL_MAX_SND_URBS) || (rcv_buf_size < 1) || (rcv_buf_size > UDSL_MAX_RCV_BUF_SIZE) + || (rcv_buf_iso_packets < 1) + || (rcv_buf_iso_packets > UDSL_MAX_RCV_ISO_PACKETS) || (snd_buf_size < 1) || (snd_buf_size > UDSL_MAX_SND_BUF_SIZE)) return -EINVAL; Index: usbatm.h =================================================================== RCS file: /home/cvs/usbatm/usbatm.h,v retrieving revision 1.19 diff -u -r1.19 usbatm.h --- usbatm.h 30 May 2005 08:48:13 -0000 1.19 +++ usbatm.h 27 Jun 2005 18:23:14 -0000 @@ -119,6 +119,7 @@ unsigned rx_padding; unsigned tx_padding; + unsigned use_iso; }; extern int usbatm_usb_probe(struct usb_interface *intf, const struct usb_device_id *id,