? .built-in.o.cmd ? .cxacru.ko.cmd ? .cxacru.mod.o.cmd ? .cxacru.o.cmd ? .speedtch.ko.cmd ? .speedtch.mod.o.cmd ? .speedtch.o.cmd ? .tmp_versions ? .usb_atm.ko.cmd ? .usb_atm.mod.o.cmd ? .usb_atm.o.cmd ? .usbatm.ko.cmd ? .usbatm.mod.o.cmd ? .usbatm.o.cmd ? cxacru.ko ? cxacru.mod.c ? speedtch.ko ? speedtch.mod.c ? usb_atm.ko ? usb_atm.mod.c ? usbatm.ko ? usbatm.mod.c Index: usb_atm.c =================================================================== RCS file: /home/cvs/usbatm/usb_atm.c,v retrieving revision 1.12 diff -u -r1.12 usb_atm.c --- usb_atm.c 29 Dec 2004 21:18:32 -0000 1.12 +++ usb_atm.c 19 Jan 2005 18:02:49 -0000 @@ -83,6 +83,8 @@ #include "usb_atm.h" +#define dbg(arg...) {printk(arg); printk("\n");} + #ifdef VERBOSE_DEBUG static int udsl_print_packet(const unsigned char *data, int len); #define PACKETDEBUG(arg...) udsl_print_packet (arg) @@ -412,6 +414,38 @@ /************** ** receive ** **************/ +static inline void udsl_usb_fill_iso_urb (struct urb *urb, + struct usb_device *dev, + unsigned int pipe, + void *transfer_buffer, + int buffer_length, + usb_complete_t complete, + void *context) +{ + int j; + + printk("iso fill :%d\n",pipe); + //spin_lock_init(&urb->lock); + urb->dev = dev; + urb->pipe = pipe; + urb->transfer_buffer = transfer_buffer; + urb->transfer_buffer_length = buffer_length; + urb->complete = complete; + urb->context = context; + + urb->interval = 1; + urb->number_of_packets = FRAMES_PER_ISO_URB; + urb->transfer_flags = URB_ISO_ASAP; + + for (j=0; j < urb->number_of_packets; j++) { + urb->iso_frame_desc[j].offset = j*FASTEST_ISO_RATE; + urb->iso_frame_desc[j].length = FASTEST_ISO_RATE; + + urb->iso_frame_desc[j].status = 0; + urb->iso_frame_desc[j].actual_length = 0; + } + urb->status = 0; +} static void udsl_complete_receive(struct urb *urb, struct pt_regs *regs) { @@ -428,17 +462,44 @@ instance = rcv->instance; buf = rcv->buffer; - buf->filled_cells = urb->actual_length / (ATM_CELL_SIZE + instance->rcv_padding); + if (instance->iso_data_endpoint) { + int i, err; + if (urb->actual_length <= 0) {//resubmit... + for (i=0; i < urb->number_of_packets; i++) { + urb->iso_frame_desc[i].status = 0; + urb->iso_frame_desc[i].actual_length = 0; + } + urb->status = 0; + vdbg("udsl_process_receive: urb submission 0x%p", urb); + if ((err = usb_submit_urb(rcv->urb, GFP_ATOMIC)) < 0) { + dbg("udsl_process_receive: urb submission failed (%d)!", err); + } + return; + } + + for (i = 0; i < urb->number_of_packets; i++) { + buf->frames[i].status = urb->iso_frame_desc[i].status; + buf->frames[i].filled_cells = urb->iso_frame_desc[i].actual_length / (ATM_CELL_SIZE + instance->rcv_padding); + dbg("udsl_complete_receive: urb 0x%p, frame %d, status %d size %d", urb, i, buf->frames[i].status, buf->frames[i].filled_cells); + } + } + else { + buf->filled_cells = urb->actual_length / (ATM_CELL_SIZE + instance->rcv_padding); + } vdbg("udsl_complete_receive: urb 0x%p, status %d, actual_length %d, filled_cells %u, rcv 0x%p, buf 0x%p", urb, urb->status, urb->actual_length, buf->filled_cells, rcv, buf); + //XXX iso ??? UDSL_ASSERT(buf->filled_cells <= rcv_buf_size); /* may not be in_interrupt() */ spin_lock_irqsave(&instance->receive_lock, flags); list_add(&rcv->list, &instance->spare_receivers); list_add_tail(&buf->list, &instance->filled_receive_buffers); - if (likely(!urb->status)) + if (likely(!urb->status) || + /* eagle usb produce lot's of crc error...*/ + (instance->iso_data_endpoint && urb->status == -EILSEQ) + ) tasklet_schedule(&instance->receive_tasklet); spin_unlock_irqrestore(&instance->receive_lock, flags); } @@ -468,11 +529,20 @@ rcv->buffer = buf; - usb_fill_bulk_urb(rcv->urb, instance->usb_dev, - usb_rcvbulkpipe(instance->usb_dev, instance->data_endpoint), - buf->base, - rcv_buf_size * (ATM_CELL_SIZE + instance->rcv_padding), - udsl_complete_receive, rcv); + /* refill the urb because the buf could have changed...*/ + if (instance->iso_data_endpoint) + udsl_usb_fill_iso_urb(rcv->urb, instance->usb_dev, + usb_rcvisocpipe(instance->usb_dev, instance->iso_data_endpoint), + buf->base, + FRAMES_PER_ISO_URB*FASTEST_ISO_RATE, + udsl_complete_receive, rcv); + else + usb_fill_bulk_urb(rcv->urb, instance->usb_dev, + usb_rcvbulkpipe(instance->usb_dev, instance->data_endpoint), + buf->base, + rcv_buf_size * (ATM_CELL_SIZE + instance->rcv_padding), + udsl_complete_receive, rcv); + vdbg("udsl_process_receive: sending urb 0x%p, rcv 0x%p, buf 0x%p", rcv->urb, rcv, buf); @@ -498,7 +568,16 @@ spin_unlock_irq(&instance->receive_lock); vdbg("udsl_process_receive: processing buf 0x%p", buf); - udsl_extract_cells(instance, buf->base, buf->filled_cells); + if (instance->iso_data_endpoint) { + int i; + for (i=0 ; iframes[i].status == 0) { + udsl_extract_cells(instance, buf->base+i*FASTEST_ISO_RATE, buf->frames[i].filled_cells); + } + } + } + else + udsl_extract_cells(instance, buf->base, buf->filled_cells); list_add(&buf->list, &instance->spare_receive_buffers); goto made_progress; } @@ -925,6 +1004,10 @@ { char *buf; int i, length; + int nb_frames = 0; + + //XXX + instance->iso_data_endpoint = 0x88; kref_init(&instance->refcount); /* one for USB */ udsl_get_instance(instance); /* one for ATM */ @@ -955,11 +1038,13 @@ (unsigned long)instance); INIT_LIST_HEAD(&instance->filled_send_buffers); + if (instance->iso_data_endpoint) + nb_frames = FRAMES_PER_ISO_URB; /* receive init */ for (i = 0; i < num_rcv_urbs; i++) { struct udsl_receiver *rcv = &(instance->receivers[i]); - if (!(rcv->urb = usb_alloc_urb(0, GFP_KERNEL))) { + if (!(rcv->urb = usb_alloc_urb(nb_frames, GFP_KERNEL))) { dbg("udsl_usb_probe: no memory for receive urb %d!", i); goto fail; } @@ -973,8 +1058,15 @@ struct udsl_receive_buffer *buf = &(instance->receive_buffers[i]); - buf->base = kmalloc(rcv_buf_size * (ATM_CELL_SIZE + instance->rcv_padding), + if (instance->iso_data_endpoint) { + buf->base = kmalloc(FASTEST_ISO_RATE*FRAMES_PER_ISO_URB, GFP_KERNEL); + } + else { + buf->base = kmalloc(rcv_buf_size * (ATM_CELL_SIZE + instance->rcv_padding), + GFP_KERNEL); + + } if (!buf->base) { dbg("udsl_usb_probe: no memory for receive buffer %d!", i); goto fail; Index: usb_atm.h =================================================================== RCS file: /home/cvs/usbatm/usb_atm.h,v retrieving revision 1.4 diff -u -r1.4 usb_atm.h --- usb_atm.h 29 Dec 2004 21:18:32 -0000 1.4 +++ usb_atm.h 19 Jan 2005 18:02:49 -0000 @@ -63,9 +63,18 @@ /* receive */ +struct udsl_receive_iso_frame { + unsigned int filled_cells; + int status; +}; + +//XXX +#define FASTEST_ISO_RATE 1007 +#define FRAMES_PER_ISO_URB 16 struct udsl_receive_buffer { struct list_head list; unsigned char *base; + struct udsl_receive_iso_frame frames[FRAMES_PER_ISO_URB]; unsigned int filled_cells; }; @@ -129,6 +138,8 @@ struct usb_device *usb_dev; char description[64]; int data_endpoint; + int iso_data_endpoint; + int iso_frame_size; int snd_padding; int rcv_padding; const char *driver_name;