Am Freitag, 29. Juni 2007 schrieb Alan Stern: > On Fri, 29 Jun 2007, Oliver Neukum wrote: > > > Hi, > > > > this proved harder than it looks like. I can use cdc-acm over ohci with > > this patch. So what do you think? > > It tries to do an awful lot all at once. A good place to start would > be to use separate allocation for the Iso packet structures. This > could be a simple standalone change.
Here's a patch separating the iso structures. This will allow unification of the urb priv structures and the official urb. In addition pools specific to hcds can be used. Is that what you had in mind? Regards Oliver ---- diff -urp linux-2.6.22rc6vanilla/include/linux/usb.h linux-2.6.22-rc6-iso/include/linux/usb.h --- linux-2.6.22rc6vanilla/include/linux/usb.h 2007-06-29 13:33:17.000000000 +0200 +++ linux-2.6.22-rc6-iso/include/linux/usb.h 2007-06-29 22:31:29.000000000 +0200 @@ -1152,7 +1152,7 @@ struct urb int error_count; /* (return) number of ISO errors */ void *context; /* (in) context for completion */ usb_complete_t complete; /* (in) completion routine */ - struct usb_iso_packet_descriptor iso_frame_desc[0]; + struct usb_iso_packet_descriptor *iso_frames; /* (in) ISO ONLY */ }; diff -urp linux-2.6.22rc6vanilla/sound/usb/caiaq/caiaq-audio.c linux-2.6.22-rc6-iso/sound/usb/caiaq/caiaq-audio.c --- linux-2.6.22rc6vanilla/sound/usb/caiaq/caiaq-audio.c 2007-06-29 13:33:36.000000000 +0200 +++ linux-2.6.22-rc6-iso/sound/usb/caiaq/caiaq-audio.c 2007-06-30 00:41:26.000000000 +0200 @@ -483,17 +483,17 @@ static void read_completed(struct urb *u /* read the recently received packet and send back one which has * the same layout */ for (frame = 0; frame < FRAMES_PER_URB; frame++) { - if (urb->iso_frame_desc[frame].status) + if (urb->iso_frames[frame].status) continue; - len = urb->iso_frame_desc[outframe].actual_length; - out->iso_frame_desc[outframe].length = len; - out->iso_frame_desc[outframe].actual_length = 0; - out->iso_frame_desc[outframe].offset = BYTES_PER_FRAME * frame; + len = urb->iso_frames[outframe].actual_length; + out->iso_frames[outframe].length = len; + out->iso_frames[outframe].actual_length = 0; + out->iso_frames[outframe].offset = BYTES_PER_FRAME * frame; if (len > 0) { - fill_out_urb(dev, out, &out->iso_frame_desc[outframe]); - read_in_urb(dev, urb, &urb->iso_frame_desc[frame]); + fill_out_urb(dev, out, &out->iso_frames[outframe]); + read_in_urb(dev, urb, &urb->iso_frames[frame]); send_it = 1; } @@ -508,9 +508,9 @@ static void read_completed(struct urb *u /* re-submit inbound urb */ for (frame = 0; frame < FRAMES_PER_URB; frame++) { - urb->iso_frame_desc[frame].offset = BYTES_PER_FRAME * frame; - urb->iso_frame_desc[frame].length = BYTES_PER_FRAME; - urb->iso_frame_desc[frame].actual_length = 0; + urb->iso_frames[frame].offset = BYTES_PER_FRAME * frame; + urb->iso_frames[frame].length = BYTES_PER_FRAME; + urb->iso_frames[frame].actual_length = 0; } urb->number_of_packets = FRAMES_PER_URB; @@ -565,7 +565,7 @@ static struct urb **alloc_urbs(struct sn for (frame = 0; frame < FRAMES_PER_URB; frame++) { struct usb_iso_packet_descriptor *iso = - &urbs[i]->iso_frame_desc[frame]; + &urbs[i]->iso_frames[frame]; iso->offset = BYTES_PER_FRAME * frame; iso->length = BYTES_PER_FRAME; diff -urp linux-2.6.22rc6vanilla/sound/usb/usbaudio.c linux-2.6.22-rc6-iso/sound/usb/usbaudio.c --- linux-2.6.22rc6vanilla/sound/usb/usbaudio.c 2007-06-29 13:33:36.000000000 +0200 +++ linux-2.6.22-rc6-iso/sound/usb/usbaudio.c 2007-06-30 00:39:14.000000000 +0200 @@ -257,8 +257,8 @@ static int prepare_capture_sync_urb(stru struct snd_urb_ctx *ctx = urb->context; urb->dev = ctx->subs->dev; /* we need to set this at each time */ - urb->iso_frame_desc[0].length = 3; - urb->iso_frame_desc[0].offset = 0; + urb->iso_frames[0].length = 3; + urb->iso_frames[0].offset = 0; cp[0] = subs->freqn >> 2; cp[1] = subs->freqn >> 10; cp[2] = subs->freqn >> 18; @@ -279,8 +279,8 @@ static int prepare_capture_sync_urb_hs(s struct snd_urb_ctx *ctx = urb->context; urb->dev = ctx->subs->dev; /* we need to set this at each time */ - urb->iso_frame_desc[0].length = 4; - urb->iso_frame_desc[0].offset = 0; + urb->iso_frames[0].length = 4; + urb->iso_frames[0].offset = 0; cp[0] = subs->freqn; cp[1] = subs->freqn >> 8; cp[2] = subs->freqn >> 16; @@ -319,8 +319,8 @@ static int prepare_capture_urb(struct sn offs = 0; urb->dev = ctx->subs->dev; /* we need to set this at each time */ for (i = 0; i < ctx->packets; i++) { - urb->iso_frame_desc[i].offset = offs; - urb->iso_frame_desc[i].length = subs->curpacksize; + urb->iso_frames[i].offset = offs; + urb->iso_frames[i].length = subs->curpacksize; offs += subs->curpacksize; } urb->transfer_buffer_length = offs; @@ -347,12 +347,12 @@ static int retire_capture_urb(struct snd stride = runtime->frame_bits >> 3; for (i = 0; i < urb->number_of_packets; i++) { - cp = (unsigned char *)urb->transfer_buffer + urb->iso_frame_desc[i].offset; - if (urb->iso_frame_desc[i].status) { - snd_printd(KERN_ERR "frame %d active: %d\n", i, urb->iso_frame_desc[i].status); + cp = (unsigned char *)urb->transfer_buffer + urb->iso_frames[i].offset; + if (urb->iso_frames[i].status) { + snd_printd(KERN_ERR "frame %d active: %d\n", i, urb->iso_frames[i].status); // continue; } - len = urb->iso_frame_desc[i].actual_length / stride; + len = urb->iso_frames[i].actual_length / stride; if (! len) continue; /* update the current pointer */ @@ -406,8 +406,8 @@ static int prepare_playback_sync_urb(str struct snd_urb_ctx *ctx = urb->context; urb->dev = ctx->subs->dev; /* we need to set this at each time */ - urb->iso_frame_desc[0].length = 3; - urb->iso_frame_desc[0].offset = 0; + urb->iso_frames[0].length = 3; + urb->iso_frames[0].offset = 0; return 0; } @@ -424,8 +424,8 @@ static int prepare_playback_sync_urb_hs( struct snd_urb_ctx *ctx = urb->context; urb->dev = ctx->subs->dev; /* we need to set this at each time */ - urb->iso_frame_desc[0].length = 4; - urb->iso_frame_desc[0].offset = 0; + urb->iso_frames[0].length = 4; + urb->iso_frames[0].offset = 0; return 0; } @@ -442,8 +442,8 @@ static int retire_playback_sync_urb(stru unsigned int f; unsigned long flags; - if (urb->iso_frame_desc[0].status == 0 && - urb->iso_frame_desc[0].actual_length == 3) { + if (urb->iso_frames[0].status == 0 && + urb->iso_frames[0].actual_length == 3) { f = combine_triple((u8*)urb->transfer_buffer) << 2; if (f >= subs->freqn - subs->freqn / 8 && f <= subs->freqmax) { spin_lock_irqsave(&subs->lock, flags); @@ -468,8 +468,8 @@ static int retire_playback_sync_urb_hs(s unsigned int f; unsigned long flags; - if (urb->iso_frame_desc[0].status == 0 && - urb->iso_frame_desc[0].actual_length == 4) { + if (urb->iso_frames[0].status == 0 && + urb->iso_frames[0].actual_length == 4) { f = combine_quad((u8*)urb->transfer_buffer) & 0x0fffffff; if (f >= subs->freqn - subs->freqn / 8 && f <= subs->freqmax) { spin_lock_irqsave(&subs->lock, flags); @@ -511,8 +511,8 @@ static int prepare_nodata_playback_urb(s urb->number_of_packets = subs->packs_per_ms; for (i = 0; i < subs->packs_per_ms; ++i) { counts = snd_usb_audio_next_packet_size(subs); - urb->iso_frame_desc[i].offset = offs * stride; - urb->iso_frame_desc[i].length = counts * stride; + urb->iso_frames[i].offset = offs * stride; + urb->iso_frames[i].length = counts * stride; offs += counts; } urb->transfer_buffer_length = offs * stride; @@ -549,8 +549,8 @@ static int prepare_playback_urb(struct s for (i = 0; i < ctx->packets; i++) { counts = snd_usb_audio_next_packet_size(subs); /* set up descriptor */ - urb->iso_frame_desc[i].offset = offs * stride; - urb->iso_frame_desc[i].length = counts * stride; + urb->iso_frames[i].offset = offs * stride; + urb->iso_frames[i].length = counts * stride; offs += counts; urb->number_of_packets++; subs->transfer_done += counts; @@ -563,16 +563,16 @@ static int prepare_playback_urb(struct s * supported yet */ offs -= subs->transfer_done; counts -= subs->transfer_done; - urb->iso_frame_desc[i].length = + urb->iso_frames[i].length = counts * stride; subs->transfer_done = 0; } i++; if (i < ctx->packets) { /* add a transfer delimiter */ - urb->iso_frame_desc[i].offset = + urb->iso_frames[i].offset = offs * stride; - urb->iso_frame_desc[i].length = 0; + urb->iso_frames[i].length = 0; urb->number_of_packets++; } break; diff -urp linux-2.6.22rc6vanilla/sound/usb/usx2y/usbusx2yaudio.c linux-2.6.22-rc6-iso/sound/usb/usx2y/usbusx2yaudio.c --- linux-2.6.22rc6vanilla/sound/usb/usx2y/usbusx2yaudio.c 2007-02-04 19:44:54.000000000 +0100 +++ linux-2.6.22-rc6-iso/sound/usb/usx2y/usbusx2yaudio.c 2007-06-30 00:46:30.000000000 +0200 @@ -76,14 +76,14 @@ static int usX2Y_urb_capt_retire(struct struct usX2Ydev *usX2Y = subs->usX2Y; for (i = 0; i < nr_of_packs(); i++) { - cp = (unsigned char*)urb->transfer_buffer + urb->iso_frame_desc[i].offset; - if (urb->iso_frame_desc[i].status) { /* active? hmm, skip this */ + cp = (unsigned char*)urb->transfer_buffer + urb->iso_frames[i].offset; + if (urb->iso_frames[i].status) { /* active? hmm, skip this */ snd_printk(KERN_ERR "active frame status %i. " "Most propably some hardware problem.\n", - urb->iso_frame_desc[i].status); - return urb->iso_frame_desc[i].status; + urb->iso_frames[i].status); + return urb->iso_frames[i].status; } - len = urb->iso_frame_desc[i].actual_length / usX2Y->stride; + len = urb->iso_frames[i].actual_length / usX2Y->stride; if (! len) { snd_printd("0 == len ERROR!\n"); continue; @@ -134,18 +134,18 @@ static int usX2Y_urb_play_prepare(struct count = 0; for (pack = 0; pack < nr_of_packs(); pack++) { /* calculate the size of a packet */ - counts = cap_urb->iso_frame_desc[pack].actual_length / usX2Y->stride; + counts = cap_urb->iso_frames[pack].actual_length / usX2Y->stride; count += counts; if (counts < 43 || counts > 50) { snd_printk(KERN_ERR "should not be here with counts=%i\n", counts); return -EPIPE; } /* set up descriptor */ - urb->iso_frame_desc[pack].offset = pack ? - urb->iso_frame_desc[pack - 1].offset + - urb->iso_frame_desc[pack - 1].length : + urb->iso_frames[pack].offset = pack ? + urb->iso_frames[pack - 1].offset + + urb->iso_frames[pack - 1].length : 0; - urb->iso_frame_desc[pack].length = cap_urb->iso_frame_desc[pack].actual_length; + urb->iso_frames[pack].length = cap_urb->iso_frames[pack].actual_length; } if (atomic_read(&subs->state) >= state_PRERUNNING) if (subs->hwptr + count > runtime->buffer_size) { @@ -503,8 +503,8 @@ static int usX2Y_urbs_start(struct snd_u urb->dev = usX2Y->chip.dev; urb->transfer_flags = URB_ISO_ASAP; for (pack = 0; pack < nr_of_packs(); pack++) { - urb->iso_frame_desc[pack].offset = subs->maxpacksize * pack; - urb->iso_frame_desc[pack].length = subs->maxpacksize; + urb->iso_frames[pack].offset = subs->maxpacksize * pack; + urb->iso_frames[pack].length = subs->maxpacksize; } urb->transfer_buffer_length = subs->maxpacksize * nr_of_packs(); if ((err = usb_submit_urb(urb, GFP_ATOMIC)) < 0) { diff -urp linux-2.6.22rc6vanilla/sound/usb/usx2y/usx2yhwdeppcm.c linux-2.6.22-rc6-iso/sound/usb/usx2y/usx2yhwdeppcm.c --- linux-2.6.22rc6vanilla/sound/usb/usx2y/usx2yhwdeppcm.c 2007-02-04 19:44:54.000000000 +0100 +++ linux-2.6.22-rc6-iso/sound/usb/usx2y/usx2yhwdeppcm.c 2007-06-30 00:45:32.000000000 +0200 @@ -72,11 +72,11 @@ static int usX2Y_usbpcm_urb_capt_retire( snd_printdd("cap start %i\n", head); } for (i = 0; i < nr_of_packs(); i++) { - if (urb->iso_frame_desc[i].status) { /* active? hmm, skip this */ - snd_printk(KERN_ERR "activ frame status %i. Most propably some hardware problem.\n", urb->iso_frame_desc[i].status); - return urb->iso_frame_desc[i].status; + if (urb->iso_frames[i].status) { /* active? hmm, skip this */ + snd_printk(KERN_ERR "activ frame status %i. Most propably some hardware problem.\n", urb->iso_frames[i].status); + return urb->iso_frames[i].status; } - lens += urb->iso_frame_desc[i].actual_length / usX2Y->stride; + lens += urb->iso_frames[i].actual_length / usX2Y->stride; } if ((hwptr_done += lens) >= runtime->buffer_size) hwptr_done -= runtime->buffer_size; @@ -131,11 +131,11 @@ static int usX2Y_hwdep_urb_play_prepare( return -EPIPE; } /* set up descriptor */ - urb->iso_frame_desc[pack].offset = shm->captured_iso[shm->playback_iso_head].offset; - urb->iso_frame_desc[pack].length = shm->captured_iso[shm->playback_iso_head].length; + urb->iso_frames[pack].offset = shm->captured_iso[shm->playback_iso_head].offset; + urb->iso_frames[pack].length = shm->captured_iso[shm->playback_iso_head].length; if (atomic_read(&subs->state) != state_RUNNING) - memset((char *)urb->transfer_buffer + urb->iso_frame_desc[pack].offset, 0, - urb->iso_frame_desc[pack].length); + memset((char *)urb->transfer_buffer + urb->iso_frames[pack].offset, 0, + urb->iso_frames[pack].length); if (++shm->playback_iso_head >= ARRAY_SIZE(shm->captured_iso)) shm->playback_iso_head = 0; count += counts; @@ -150,7 +150,7 @@ static inline void usX2Y_usbpcm_urb_capt { int pack; for (pack = 0; pack < nr_of_packs(); ++pack) { - struct usb_iso_packet_descriptor *desc = urb->iso_frame_desc + pack; + struct usb_iso_packet_descriptor *desc = urb->iso_frames + pack; if (NULL != subs) { struct snd_usX2Y_hwdep_pcm_shm *shm = subs->usX2Y->hwdep_pcm_shm; int head = shm->captured_iso_head + 1; @@ -444,8 +444,8 @@ static int usX2Y_usbpcm_urbs_start(struc urb->dev = usX2Y->chip.dev; urb->transfer_flags = URB_ISO_ASAP; for (pack = 0; pack < nr_of_packs(); pack++) { - urb->iso_frame_desc[pack].offset = subs->maxpacksize * (pack + u * nr_of_packs()); - urb->iso_frame_desc[pack].length = subs->maxpacksize; + urb->iso_frames[pack].offset = subs->maxpacksize * (pack + u * nr_of_packs()); + urb->iso_frames[pack].length = subs->maxpacksize; } urb->transfer_buffer_length = subs->maxpacksize * nr_of_packs(); if ((err = usb_submit_urb(urb, GFP_KERNEL)) < 0) { diff -urp linux-2.6.22rc6vanilla/drivers/media/dvb/b2c2/flexcop-usb.c linux-2.6.22-rc6-iso/drivers/media/dvb/b2c2/flexcop-usb.c --- linux-2.6.22rc6vanilla/drivers/media/dvb/b2c2/flexcop-usb.c 2007-02-04 19:44:54.000000000 +0100 +++ linux-2.6.22-rc6-iso/drivers/media/dvb/b2c2/flexcop-usb.c 2007-06-30 00:09:07.000000000 +0200 @@ -337,18 +337,18 @@ static void flexcop_usb_urb_complete(str deb_ts("urb completed, bufsize: %d actlen; %d\n",urb->transfer_buffer_length, urb->actual_length); for (i = 0; i < urb->number_of_packets; i++) { - if (urb->iso_frame_desc[i].status < 0) { - err("iso frame descriptor %d has an error: %d\n",i,urb->iso_frame_desc[i].status); + if (urb->iso_frames[i].status < 0) { + err("iso frame descriptor %d has an error: %d\n",i,urb->iso_frames[i].status); } else - if (urb->iso_frame_desc[i].actual_length > 0) { - deb_ts("passed %d bytes to the demux\n",urb->iso_frame_desc[i].actual_length); + if (urb->iso_frames[i].actual_length > 0) { + deb_ts("passed %d bytes to the demux\n",urb->iso_frames[i].actual_length); flexcop_usb_process_frame(fc_usb, - urb->transfer_buffer + urb->iso_frame_desc[i].offset, - urb->iso_frame_desc[i].actual_length); + urb->transfer_buffer + urb->iso_frames[i].offset, + urb->iso_frames[i].actual_length); } - urb->iso_frame_desc[i].status = 0; - urb->iso_frame_desc[i].actual_length = 0; + urb->iso_frames[i].status = 0; + urb->iso_frames[i].actual_length = 0; } usb_submit_urb(urb,GFP_ATOMIC); @@ -414,8 +414,8 @@ static int flexcop_usb_transfer_init(str buffer_offset += frame_size * B2C2_USB_FRAMES_PER_ISO; for (j = 0; j < B2C2_USB_FRAMES_PER_ISO; j++) { deb_ts("urb no: %d, frame: %d, frame_offset: %d\n",i,j,frame_offset); - urb->iso_frame_desc[j].offset = frame_offset; - urb->iso_frame_desc[j].length = frame_size; + urb->iso_frames[j].offset = frame_offset; + urb->iso_frames[j].length = frame_size; frame_offset += frame_size; } diff -urp linux-2.6.22rc6vanilla/drivers/media/dvb/dvb-usb/usb-urb.c linux-2.6.22-rc6-iso/drivers/media/dvb/dvb-usb/usb-urb.c --- linux-2.6.22rc6vanilla/drivers/media/dvb/dvb-usb/usb-urb.c 2007-02-04 19:44:54.000000000 +0100 +++ linux-2.6.22-rc6-iso/drivers/media/dvb/dvb-usb/usb-urb.c 2007-06-30 00:11:47.000000000 +0200 @@ -41,13 +41,13 @@ static void usb_urb_complete(struct urb case PIPE_ISOCHRONOUS: for (i = 0; i < urb->number_of_packets; i++) { - if (urb->iso_frame_desc[i].status != 0) - deb_ts("iso frame descriptor has an error: %d\n",urb->iso_frame_desc[i].status); - else if (urb->iso_frame_desc[i].actual_length > 0) - stream->complete(stream, b + urb->iso_frame_desc[i].offset, urb->iso_frame_desc[i].actual_length); + if (urb->iso_frames[i].status != 0) + deb_ts("iso frame descriptor has an error: %d\n",urb->iso_frames[i].status); + else if (urb->iso_frames[i].actual_length > 0) + stream->complete(stream, b + urb->iso_frames[i].offset, urb->iso_frames[i].actual_length); - urb->iso_frame_desc[i].status = 0; - urb->iso_frame_desc[i].actual_length = 0; + urb->iso_frames[i].status = 0; + urb->iso_frames[i].actual_length = 0; } debug_dump(b,20,deb_uxfer); break; @@ -188,8 +188,8 @@ static int usb_isoc_urb_init(struct usb_ urb->transfer_dma = stream->dma_addr[i]; for (j = 0; j < stream->props.u.isoc.framesperurb; j++) { - urb->iso_frame_desc[j].offset = frame_offset; - urb->iso_frame_desc[j].length = stream->props.u.isoc.framesize; + urb->iso_frames[j].offset = frame_offset; + urb->iso_frames[j].length = stream->props.u.isoc.framesize; frame_offset += stream->props.u.isoc.framesize; } diff -urp linux-2.6.22rc6vanilla/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c linux-2.6.22-rc6-iso/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c --- linux-2.6.22rc6vanilla/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c 2007-06-29 13:27:42.000000000 +0200 +++ linux-2.6.22-rc6-iso/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c 2007-06-30 00:27:28.000000000 +0200 @@ -765,7 +765,7 @@ static void ttusb_iso_irq(struct urb *ur lastj = jiffies; numpkt = 0; } - d = &urb->iso_frame_desc[i]; + d = &urb->iso_frames[i]; data = urb->transfer_buffer + d->offset; len = d->actual_length; d->actual_length = 0; @@ -859,8 +859,8 @@ static int ttusb_start_iso_xfer(struct t buffer_offset += ISO_FRAME_SIZE * FRAMES_PER_ISO_BUF; for (j = 0; j < FRAMES_PER_ISO_BUF; j++) { - urb->iso_frame_desc[j].offset = frame_offset; - urb->iso_frame_desc[j].length = ISO_FRAME_SIZE; + urb->iso_frames[j].offset = frame_offset; + urb->iso_frames[j].length = ISO_FRAME_SIZE; frame_offset += ISO_FRAME_SIZE; } } diff -urp linux-2.6.22rc6vanilla/drivers/media/dvb/ttusb-dec/ttusb_dec.c linux-2.6.22-rc6-iso/drivers/media/dvb/ttusb-dec/ttusb_dec.c --- linux-2.6.22rc6vanilla/drivers/media/dvb/ttusb-dec/ttusb_dec.c 2007-06-29 13:27:42.000000000 +0200 +++ linux-2.6.22-rc6-iso/drivers/media/dvb/ttusb-dec/ttusb_dec.c 2007-06-30 00:34:49.000000000 +0200 @@ -769,7 +769,7 @@ static void ttusb_dec_process_urb(struct int length; struct urb_frame *frame; - d = &urb->iso_frame_desc[i]; + d = &urb->iso_frames[i]; b = urb->transfer_buffer + d->offset; length = d->actual_length; @@ -824,8 +824,8 @@ static void ttusb_dec_setup_urbs(struct buffer_offset += ISO_FRAME_SIZE * FRAMES_PER_ISO_BUF; for (j = 0; j < FRAMES_PER_ISO_BUF; j++) { - urb->iso_frame_desc[j].offset = frame_offset; - urb->iso_frame_desc[j].length = ISO_FRAME_SIZE; + urb->iso_frames[j].offset = frame_offset; + urb->iso_frames[j].length = ISO_FRAME_SIZE; frame_offset += ISO_FRAME_SIZE; } } diff -urp linux-2.6.22rc6vanilla/drivers/usb/core/devio.c linux-2.6.22-rc6-iso/drivers/usb/core/devio.c --- linux-2.6.22rc6vanilla/drivers/usb/core/devio.c 2007-06-29 13:33:00.000000000 +0200 +++ linux-2.6.22-rc6-iso/drivers/usb/core/devio.c 2007-06-29 23:43:03.000000000 +0200 @@ -1053,8 +1053,8 @@ static int proc_do_submiturb(struct dev_ as->urb->context = as; as->urb->complete = async_completed; for (totlen = u = 0; u < uurb->number_of_packets; u++) { - as->urb->iso_frame_desc[u].offset = totlen; - as->urb->iso_frame_desc[u].length = isopkt[u].length; + as->urb->iso_frames[u].offset = totlen; + as->urb->iso_frames[u].length = isopkt[u].length; totlen += isopkt[u].length; } kfree(isopkt); @@ -1128,10 +1128,10 @@ static int processcompl(struct async *as if (usb_pipeisoc(urb->pipe)) { for (i = 0; i < urb->number_of_packets; i++) { - if (put_user(urb->iso_frame_desc[i].actual_length, + if (put_user(urb->iso_frames[i].actual_length, &userurb->iso_frame_desc[i].actual_length)) return -EFAULT; - if (put_user(urb->iso_frame_desc[i].status, + if (put_user(urb->iso_frames[i].status, &userurb->iso_frame_desc[i].status)) return -EFAULT; } @@ -1242,10 +1242,10 @@ static int processcompl_compat(struct as if (usb_pipeisoc(urb->pipe)) { for (i = 0; i < urb->number_of_packets; i++) { - if (put_user(urb->iso_frame_desc[i].actual_length, + if (put_user(urb->iso_frames[i].actual_length, &userurb->iso_frame_desc[i].actual_length)) return -EFAULT; - if (put_user(urb->iso_frame_desc[i].status, + if (put_user(urb->iso_frames[i].status, &userurb->iso_frame_desc[i].status)) return -EFAULT; } diff -urp linux-2.6.22rc6vanilla/drivers/usb/core/urb.c linux-2.6.22-rc6-iso/drivers/usb/core/urb.c --- linux-2.6.22rc6vanilla/drivers/usb/core/urb.c 2007-06-29 13:28:31.000000000 +0200 +++ linux-2.6.22-rc6-iso/drivers/usb/core/urb.c 2007-06-29 23:41:50.000000000 +0200 @@ -11,6 +11,7 @@ static void urb_destroy(struct kref *kref) { struct urb *urb = to_urb(kref); + kfree(urb->iso_frames); kfree(urb); } @@ -56,15 +57,22 @@ void usb_init_urb(struct urb *urb) struct urb *usb_alloc_urb(int iso_packets, gfp_t mem_flags) { struct urb *urb; + struct usb_iso_packet_descriptor *frames = NULL; - urb = kmalloc(sizeof(struct urb) + - iso_packets * sizeof(struct usb_iso_packet_descriptor), - mem_flags); + if (iso_packets) { + frames = kmalloc(iso_packets * sizeof(struct usb_iso_packet_descriptor), mem_flags); + if (!frames) + return NULL; + } + + urb = kmalloc(sizeof(struct urb), mem_flags); if (!urb) { err("alloc_urb: kmalloc failed"); + kfree(frames); return NULL; } - usb_init_urb(urb); + urb->iso_frames = frames; + return urb; } @@ -278,11 +286,11 @@ int usb_submit_urb(struct urb *urb, gfp_ if (urb->number_of_packets <= 0) return -EINVAL; for (n = 0; n < urb->number_of_packets; n++) { - len = urb->iso_frame_desc[n].length; + len = urb->iso_frames[n].length; if (len < 0 || len > max) return -EMSGSIZE; - urb->iso_frame_desc[n].status = -EXDEV; - urb->iso_frame_desc[n].actual_length = 0; + urb->iso_frames[n].status = -EXDEV; + urb->iso_frames[n].actual_length = 0; } } diff -urp linux-2.6.22rc6vanilla/drivers/usb/host/ehci-sched.c linux-2.6.22-rc6-iso/drivers/usb/host/ehci-sched.c --- linux-2.6.22rc6vanilla/drivers/usb/host/ehci-sched.c 2007-06-29 13:28:33.000000000 +0200 +++ linux-2.6.22-rc6-iso/drivers/usb/host/ehci-sched.c 2007-06-29 23:54:02.000000000 +0200 @@ -1098,8 +1098,8 @@ itd_sched_init ( dma_addr_t buf; u32 trans; - length = urb->iso_frame_desc [i].length; - buf = dma + urb->iso_frame_desc [i].offset; + length = urb->iso_frames[i].length; + buf = dma + urb->iso_frames[i].offset; trans = EHCI_ISOC_ACTIVE; trans |= buf & 0x0fff; @@ -1568,7 +1568,7 @@ itd_complete ( if (likely (itd->index[uframe] == -1)) continue; urb_index = itd->index[uframe]; - desc = &urb->iso_frame_desc [urb_index]; + desc = &urb->iso_frames[urb_index]; t = le32_to_cpup (&itd->hw_transaction [uframe]); itd->hw_transaction [uframe] = 0; @@ -1721,8 +1721,8 @@ sitd_sched_init ( dma_addr_t buf; u32 trans; - length = urb->iso_frame_desc [i].length & 0x03ff; - buf = dma + urb->iso_frame_desc [i].offset; + length = urb->iso_frames[i].length & 0x03ff; + buf = dma + urb->iso_frames[i].offset; trans = SITD_STS_ACTIVE; if (((i + 1) == urb->number_of_packets) @@ -1939,7 +1939,7 @@ sitd_complete ( struct usb_device *dev; urb_index = sitd->index; - desc = &urb->iso_frame_desc [urb_index]; + desc = &urb->iso_frames[urb_index]; t = le32_to_cpup (&sitd->hw_results); /* report transfer status */ diff -urp linux-2.6.22rc6vanilla/drivers/usb/host/ohci-q.c linux-2.6.22-rc6-iso/drivers/usb/host/ohci-q.c --- linux-2.6.22rc6vanilla/drivers/usb/host/ohci-q.c 2007-02-04 19:44:54.000000000 +0100 +++ linux-2.6.22-rc6-iso/drivers/usb/host/ohci-q.c 2007-06-29 23:44:53.000000000 +0200 @@ -686,8 +686,8 @@ static void td_submit_urb ( frame += cnt * urb->interval; frame &= 0xffff; td_fill (ohci, TD_CC | TD_ISO | frame, - data + urb->iso_frame_desc [cnt].offset, - urb->iso_frame_desc [cnt].length, urb, cnt); + data + urb->iso_frames[cnt].offset, + urb->iso_frames[cnt].length, urb, cnt); } periodic = ohci_to_hcd(ohci)->self.bandwidth_isoc_reqs++ == 0 && ohci_to_hcd(ohci)->self.bandwidth_int_reqs == 0; @@ -732,7 +732,7 @@ static void td_done (struct ohci_hcd *oh return; if (usb_pipeout (urb->pipe)) - dlen = urb->iso_frame_desc [td->index].length; + dlen = urb->iso_frames[td->index].length; else { /* short reads are always OK for ISO */ if (cc == TD_DATAUNDERRUN) @@ -740,8 +740,8 @@ static void td_done (struct ohci_hcd *oh dlen = tdPSW & 0x3ff; } urb->actual_length += dlen; - urb->iso_frame_desc [td->index].actual_length = dlen; - urb->iso_frame_desc [td->index].status = cc_to_error [cc]; + urb->iso_frames[td->index].actual_length = dlen; + urb->iso_frames[td->index].status = cc_to_error [cc]; if (cc != TD_CC_NOERROR) ohci_vdbg (ohci, diff -urp linux-2.6.22rc6vanilla/drivers/usb/host/uhci-q.c linux-2.6.22-rc6-iso/drivers/usb/host/uhci-q.c --- linux-2.6.22rc6vanilla/drivers/usb/host/uhci-q.c 2007-06-29 13:33:01.000000000 +0200 +++ linux-2.6.22-rc6-iso/drivers/usb/host/uhci-q.c 2007-06-29 23:56:19.000000000 +0200 @@ -1305,9 +1305,9 @@ static int uhci_submit_isochronous(struc uhci_add_td_to_urbp(td, urbp); uhci_fill_td(td, status, destination | - uhci_explen(urb->iso_frame_desc[i].length), + uhci_explen(urb->iso_frames[i].length), urb->transfer_dma + - urb->iso_frame_desc[i].offset); + urb->iso_frames[i].offset); } /* Set the interrupt-on-completion flag on the last packet. */ @@ -1321,7 +1321,7 @@ static int uhci_submit_isochronous(struc } if (list_empty(&qh->queue)) { - qh->iso_packet_desc = &urb->iso_frame_desc[0]; + qh->iso_packet_desc = urb->iso_frames; qh->iso_frame = urb->start_frame; qh->iso_status = 0; } @@ -1497,7 +1497,7 @@ __acquires(uhci->lock) struct urb *nurb = list_entry(urbp->node.next, struct urb_priv, node)->urb; - qh->iso_packet_desc = &nurb->iso_frame_desc[0]; + qh->iso_packet_desc = nurb->iso_frames; qh->iso_frame = nurb->start_frame; qh->iso_status = 0; } diff -urp linux-2.6.22rc6vanilla/drivers/usb/mon/mon_text.c linux-2.6.22-rc6-iso/drivers/usb/mon/mon_text.c --- linux-2.6.22rc6vanilla/drivers/usb/mon/mon_text.c 2007-06-29 13:33:01.000000000 +0200 +++ linux-2.6.22-rc6-iso/drivers/usb/mon/mon_text.c 2007-06-29 23:47:31.000000000 +0200 @@ -223,7 +223,7 @@ static void mon_text_event(struct mon_re if (usb_pipeisoc(urb->pipe) && urb->number_of_packets > 0) { if ((ndesc = urb->number_of_packets) > ISODESC_MAX) ndesc = ISODESC_MAX; - fp = urb->iso_frame_desc; + fp = urb->iso_frames; dp = ep->isodesc; for (i = 0; i < ndesc; i++) { dp->status = fp->status; ------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/ _______________________________________________ linux-usb-devel@lists.sourceforge.net To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel