int main() { #ifdef EMULATION emu_init(); #endif irq_setmask(0); irq_enable(1); uart_async_init(); banner(); brd_init(); cpustats_init(); time_init(); mem_init(); vga_init(); snd_init(); pfpu_init(); tmu_init(); renderer_init(); apipe_init(); rpipe_init(); slowout_init(); hdlcd_init(); ui_init(); shell_init(); while(1) { if(readchar_nonblock()) shell_input(readchar()); apipe_service(); rpipe_service(); #ifdef EMULATION emu_service(); #endif } return 0; }
/* * Locate an idle rpipe, create an structure for it and return it * * @wa is referenced and unlocked * @crs enum rpipe_attr, required endpoint characteristics * * The rpipe can be used only sequentially (not in parallel). * * The rpipe is moved into the "ready" state. */ static int rpipe_get_idle(struct wa_rpipe **prpipe, struct wahc *wa, u8 crs, gfp_t gfp) { int result; unsigned rpipe_idx; struct wa_rpipe *rpipe; struct device *dev = &wa->usb_iface->dev; rpipe = kzalloc(sizeof(*rpipe), gfp); if (rpipe == NULL) return -ENOMEM; rpipe_init(rpipe); /* Look for an idle pipe */ for (rpipe_idx = 0; rpipe_idx < wa->rpipes; rpipe_idx++) { rpipe_idx = rpipe_get_idx(wa, rpipe_idx); if (rpipe_idx >= wa->rpipes) /* no more pipes :( */ break; result = __rpipe_get_descr(wa, &rpipe->descr, rpipe_idx); if (result < 0) dev_err(dev, "Can't get descriptor for rpipe %u: %d\n", rpipe_idx, result); else if ((rpipe->descr.bmCharacteristics & crs) != 0) goto found; rpipe_put_idx(wa, rpipe_idx); } *prpipe = NULL; kfree(rpipe); return -ENXIO; found: set_bit(rpipe_idx, wa->rpipe_bm); rpipe->wa = wa_get(wa); *prpipe = rpipe; return 0; }