[PATCH v2] Move DWC2 driver out of staging
Dan Carpenter
dan.carpenter at oracle.com
Mon Nov 25 14:18:27 UTC 2013
I have reviewed the second half of the driver now.
drivers/staging/dwc2/hcd_ddma.c
616 static void dwc2_fill_host_dma_desc(struct dwc2_hsotg *hsotg,
617 struct dwc2_host_chan *chan,
618 struct dwc2_qtd *qtd, struct dwc2_qh *qh,
619 int n_desc)
620 {
621 struct dwc2_hcd_dma_desc *dma_desc = &qh->desc_list[n_desc];
622 int len = chan->xfer_len;
623
624 if (len > MAX_DMA_DESC_SIZE)
625 len = MAX_DMA_DESC_SIZE - chan->max_packet + 1;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
I don't understand what we are doing here. Shouldn't the condition and
the assignment match?
626
drivers/staging/dwc2/hcd_intr.c
930 if (!len) {
931 qtd->complete_split = 0;
932 qtd->isoc_split_offset = 0;
933 return 0;
934 }
935
936 frame_desc->actual_length += len;
937
938 if (chan->align_buf && len) {
^^^
This can be removed.
939 dev_vdbg(hsotg->dev, "%s(): non-aligned buffer\n", __func__);
940 dma_sync_single_for_cpu(hsotg->dev, qtd->urb->dma,
941 qtd->urb->length, DMA_FROM_DEVICE);
942 memcpy(qtd->urb->buf + frame_desc->offset +
943 qtd->isoc_split_offset, chan->qh->dw_align_buf, len);
944 dma_sync_single_for_device(hsotg->dev, qtd->urb->dma,
945 qtd->urb->length, DMA_FROM_DEVICE);
In drivers/staging/dwc2/hcd_queue.c there are a coup nasty
while(!done) loops. The whole point of a while loop is the you put the
end condition inside the condition part of the loop. Saying
"while (!done)" is crap because it looks useful but provides no actual
information about when the loop is over. If there are more than one
done condition then use break statements. In this case we are just
iterating over an array and there is a C language construct called a
"for loop" to express it.
OLD CODE:
344 static int dwc2_find_single_uframe(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh)
345 {
346 unsigned short utime = qh->usecs;
347 int done = 0;
348 int i = 0;
349 int ret = -1;
350
351 while (!done) {
352 /* At the start hsotg->frame_usecs[i] = max_uframe_usecs[i] */
353 if (utime <= hsotg->frame_usecs[i]) {
354 hsotg->frame_usecs[i] -= utime;
355 qh->frame_usecs[i] += utime;
356 ret = i;
357 done = 1;
358 } else {
359 i++;
360 if (i == 8)
361 done = 1;
362 }
363 }
364
365 return ret;
366 }
NEW CODE (written using a for loop).
344 static int dwc2_find_single_uframe(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh)
345 {
346 unsigned short utime = qh->usecs;
347 int i;
348
349 for (i = 0; i < 8; i++) {
350 /* At the start hsotg->frame_usecs[i] = max_uframe_usecs[i] */
351 if (utime <= hsotg->frame_usecs[i]) {
352 hsotg->frame_usecs[i] -= utime;
353 qh->frame_usecs[i] += utime;
354 break;
355 }
356 }
357 if (i == 8)
358 return -1;
359 return i;
360 }
The while (!done) loop in dwc2_find_multi_uframe() is confusing and I
suspect it may be buggy. You might need to use a continue statement...
regards,
dan carpenter
More information about the devel
mailing list