[SOLVED] Re: Problem with usb4bsd rev566
Stefan Lambrev
stefan.lambrev at moneybookers.com
Mon Jan 21 03:17:57 PST 2008
Hi Hans,
Sorry for my late reply.
I just checked build with rev 574. with latest RELENG_7_0 and
buildkernel finished successfully.
I'll let you know if there are any problems when I boot the new kernel,
or will be silent if everything is ok :)
Hans Petter Selasky wrote:
> On Thursday 17 January 2008, Stefan Lambrev wrote:
>
>> Hi Hans,
>>
>> Unfortunately with rev568 I still see:
>>
>> /usr/src/sys/dev/usb/usb_transfer.c: In function 'usbd_callback_intr_td':
>> /usr/src/sys/dev/usb/usb_transfer.c:2094: warning: 'xfer[2]' may be used
>> uninitialized in this function
>> /usr/src/sys/dev/usb/usb_transfer.c:2094: warning: 'xfer[3]' may be used
>> uninitialized in this function
>> *** Error code 1
>>
>> And the code does not compile.
>>
>
> I've given it another try:
>
> +static void
> +usbd_callback_intr_td_sub(struct usbd_xfer **xfer, uint8_t dropcount)
> +{
> + struct usbd_memory_info *info = xfer[0]->usb_root;
> +
> + mtx_unlock(info->usb_mtx);
> +
> + /*
> + * We exploit the fact that the mutex is the same for
> + * all callbacks:
> + */
> + mtx_lock(info->priv_mtx);
> +
> + /* call callback(s) */
> + switch (dropcount) {
> + case 4:
> + usbd_callback_wrapper(xfer[3], info, USBD_CONTEXT_CALLBACK);
> + case 3:
> + usbd_callback_wrapper(xfer[2], info, USBD_CONTEXT_CALLBACK);
> + case 2:
> + usbd_callback_wrapper(xfer[1], info, USBD_CONTEXT_CALLBACK);
> + case 1:
> + usbd_callback_wrapper(xfer[0], info, USBD_CONTEXT_CALLBACK);
> + default:
> + break;
> + }
> + mtx_unlock(info->priv_mtx);
> + mtx_lock(info->usb_mtx);
> + info->memory_refcount -= dropcount;
> + return;
> +}
> +
> /*------------------------------------------------------------------------*
> * usbd_callback_intr_td
> *
> @@ -2093,7 +2125,6 @@
> struct usbd_memory_info *info = arg;
> struct usbd_xfer *xfer[4];
> struct thread *td;
> - uint8_t dropcount;
>
> /* adjust priority */
> td = curthread;
> @@ -2110,60 +2141,31 @@
> repeat:
> xfer[0] = LIST_FIRST(&(info->done_head));
> if (xfer[0]) {
> - do {
> LIST_REMOVE(xfer[0], done_list);
> xfer[0]->done_list.le_prev = NULL;
> xfer[1] = LIST_FIRST(&(info->done_head));
> if (xfer[1] == NULL) {
> - dropcount = 1;
> - break;
> + usbd_callback_intr_td_sub(xfer, 1);
> + goto repeat;
> }
> LIST_REMOVE(xfer[1], done_list);
> xfer[1]->done_list.le_prev = NULL;
> xfer[2] = LIST_FIRST(&(info->done_head));
> if (xfer[2] == NULL) {
> - dropcount = 2;
> - break;
> + usbd_callback_intr_td_sub(xfer, 2);
> + goto repeat;
> }
> LIST_REMOVE(xfer[2], done_list);
> xfer[2]->done_list.le_prev = NULL;
> xfer[3] = LIST_FIRST(&(info->done_head));
> if (xfer[3] == NULL) {
> - dropcount = 3;
> - break;
> + usbd_callback_intr_td_sub(xfer, 3);
> + goto repeat;
> }
> LIST_REMOVE(xfer[3], done_list);
> xfer[3]->done_list.le_prev = NULL;
> - dropcount = 4;
> - } while (0);
> -
> - mtx_unlock(info->usb_mtx);
> -
> - /*
> - * we exploit the fact that the mutex is the same for
> - * all callbacks
> - */
> - mtx_lock(info->priv_mtx);
> -
> - /* call callback(s) */
> - switch (dropcount) {
> - case 4:
> - usbd_callback_wrapper(xfer[3], info,
> USBD_CONTEXT_CALLBACK);
> - case 3:
> - usbd_callback_wrapper(xfer[2], info,
> USBD_CONTEXT_CALLBACK);
> - case 2:
> - usbd_callback_wrapper(xfer[1], info,
> USBD_CONTEXT_CALLBACK);
> - case 1:
> - usbd_callback_wrapper(xfer[0], info,
> USBD_CONTEXT_CALLBACK);
> - default:
> - break;
> - }
> - mtx_unlock(info->priv_mtx);
> -
> - mtx_lock(info->usb_mtx);
> - info->memory_refcount -= dropcount;
> - goto repeat;
> -
> + usbd_callback_intr_td_sub(xfer, 4);
> + goto repeat;
> } else {
> if (info->memory_refcount != 0) {
> info->done_sleep = 1;
>
>
>
> Could you do an "svn update" and see if it finally compiles without errors ?
>
> --HPS
>
> --HPS
>
--
Best Wishes,
Stefan Lambrev
ICQ# 24134177
More information about the freebsd-usb
mailing list