int emu10k1_mpuin_open(struct emu10k1_card *card, struct midi_openinfo *openinfo) { struct emu10k1_mpuin *card_mpuin = card->mpuin; DPF(2, "emu10k1_mpuin_open\n"); if (!(card_mpuin->status & FLAGS_AVAILABLE)) return -1; /* Copy open info and mark channel as in use */ card_mpuin->openinfo = *openinfo; card_mpuin->status &= ~FLAGS_AVAILABLE; /* clear */ card_mpuin->status |= FLAGS_READY; /* set */ card_mpuin->status &= ~FLAGS_MIDM_STARTED; /* clear */ card_mpuin->firstmidiq = NULL; card_mpuin->lastmidiq = NULL; card_mpuin->qhead = 0; card_mpuin->qtail = 0; sblive_miStateInit(card_mpuin); emu10k1_mpu_reset(card); emu10k1_mpu_acquire(card); return 0; }
VOID CloseCAMDPort( struct Hook* hook, struct EMU10kxBase* EMU10kxBase, struct CloseMessage* msg ) { struct DriverBase* AHIsubBase = (struct DriverBase*) EMU10kxBase; struct EMU10kxData* dd = EMU10kxBase->driverdatas[ msg->PortNum ]; emu10k1_irq_disable( &dd->card, INTE_MIDIRXENABLE ); emu10k1_irq_disable( &dd->card, INTE_MIDITXENABLE ); emu10k1_mpu_reset( &dd->card ); ObtainSemaphore( &EMU10kxBase->semaphore ); dd->camd_transmitfunc = NULL; dd->camd_receivefunc = NULL; ReleaseSemaphore( &EMU10kxBase->semaphore ); }
ULONG OpenCAMDPort( struct Hook* hook, struct EMU10kxBase* EMU10kxBase, struct OpenMessage* msg ) { struct DriverBase* AHIsubBase = (struct DriverBase*) EMU10kxBase; struct EMU10kxData* dd; BOOL in_use; // KPrintF( "OpenCAMDPort(%ld,%ld)\n", msg->PortNum, msg->V40Mode ); if( msg->PortNum >= EMU10kxBase->cards_found || EMU10kxBase->driverdatas[ msg->PortNum ] == NULL ) { Req( "No valid EMU10kxData for CAMD port %ld.", msg->PortNum ); return FALSE; } dd = EMU10kxBase->driverdatas[ msg->PortNum ]; ObtainSemaphore( &EMU10kxBase->semaphore ); in_use = ( dd->camd_transmitfunc != NULL || dd->camd_receivefunc != NULL ); if( !in_use ) { dd->camd_v40 = msg->V40Mode; dd->camd_transmitfunc = msg->TransmitFunc; dd->camd_receivefunc = msg->ReceiveFunc; } ReleaseSemaphore( &EMU10kxBase->semaphore ); if( in_use ) { return FALSE; } emu10k1_irq_disable( &dd->card, INTE_MIDIRXENABLE ); emu10k1_irq_disable( &dd->card, INTE_MIDITXENABLE ); emu10k1_mpu_reset( &dd->card ); emu10k1_irq_enable( &dd->card, INTE_MIDIRXENABLE ); return TRUE; }
static int __devinit midi_init(struct emu10k1_card *card) { if ((card->mpuout = kmalloc(sizeof(struct emu10k1_mpuout), GFP_KERNEL)) == NULL) { printk(KERN_WARNING "emu10k1: Unable to allocate emu10k1_mpuout: out of memory\n"); return CTSTATUS_ERROR; } memset(card->mpuout, 0, sizeof(struct emu10k1_mpuout)); card->mpuout->intr = 1; card->mpuout->status = FLAGS_AVAILABLE; card->mpuout->state = CARDMIDIOUT_STATE_DEFAULT; tasklet_init(&card->mpuout->tasklet, emu10k1_mpuout_bh, (unsigned long) card); spin_lock_init(&card->mpuout->lock); if ((card->mpuin = kmalloc(sizeof(struct emu10k1_mpuin), GFP_KERNEL)) == NULL) { kfree(card->mpuout); printk(KERN_WARNING "emu10k1: Unable to allocate emu10k1_mpuin: out of memory\n"); return CTSTATUS_ERROR; } memset(card->mpuin, 0, sizeof(struct emu10k1_mpuin)); card->mpuin->status = FLAGS_AVAILABLE; tasklet_init(&card->mpuin->tasklet, emu10k1_mpuin_bh, (unsigned long) card->mpuin); spin_lock_init(&card->mpuin->lock); /* Reset the MPU port */ if (emu10k1_mpu_reset(card) != CTSTATUS_SUCCESS) { ERROR(); return CTSTATUS_ERROR; } return CTSTATUS_SUCCESS; }