コード例 #1
0
ファイル: deviceio.c プロジェクト: chenyifu/utkernel-pi
/*
 * Device management cleanup function
 */
EXPORT void knl_devmgr_cleanup( void )
{
	OpnCB	*opncb;

	/* Do nothing if it is not used even once */
	if ( knl_resource_control_block.openq.next == NULL ) {
		return;
	}

	LockDM();

	/* Free suspend disable request */
	knl_DisSusCnt -= knl_resource_control_block.dissus;
	knl_resource_control_block.dissus = 0;

	/* Close all open devices */
	while ( !isQueEmpty(&(knl_resource_control_block.openq)) ) {
		opncb = RESQ_OPNCB(knl_resource_control_block.openq.next);

		/* Indicate that it is during close processing */
		opncb->resid = 0;

		UnlockDM();

		/* Device close processing */
		knl_close_device(opncb, 0);

		LockDM();
	}
	UnlockDM();

	return;
}
コード例 #2
0
ファイル: deviceio.c プロジェクト: accordo/tkernel_source
/*
 * Device management break function
 */
EXPORT void devmgr_break( ID tskid )
{
	ResCB	*rescb;
	OpnCB	*opncb;
	ReqCB	*reqcb;
	QUEUE	*q, *r;
	DEVREQ	*devreq = NULL;
	INT	nreq;

	/* Get resource management block */
	rescb = GetResCB(DEVICE_SVC, tskid);
	if ( rescb == NULL ) {
		return;
	}

	LockDM();

	/* Search the request if 'tskid' task is executing and request abort */
	nreq = 0;
	for ( q = rescb->openq.next; q != &rescb->openq; q = q->next ) {
		opncb = RESQ_OPNCB(q);

		if ( opncb->nwaireq > 0 ) {
			/* Multiple requests wait */
			reqcb = DEVREQ_REQCB(opncb->waireqlst);
			if ( reqcb->tskid == tskid ) {
				devreq = opncb->waireqlst;
				nreq   = opncb->nwaireq;
			}
		} else {
			/* Start request or single request wait */
			for ( r = opncb->requestq.next;
					r != &opncb->requestq; r = r->next ) {
				reqcb = (ReqCB*)r;
				if ( reqcb->tskid == tskid ) {
					devreq = &reqcb->req;
					devreq->c.abort = TRUE;
					nreq = 1;
					break;
				}
			}
		}
		if ( nreq > 0 ) {
			LockDAbort();
			break;
		}
	}
	UnlockDM();
	if ( nreq > 0 ) {
		/* Abort request: Device driver call */
		call_abortfn(opncb->devcb, tskid, devreq, nreq);
		UnlockDAbort();
	}
}
コード例 #3
0
ファイル: deviceio.c プロジェクト: accordo/tkernel_source
/*
 * Device management cleanup function
 */
EXPORT void devmgr_cleanup( ID resid, INT info )
{
	ResCB	*rescb;
	OpnCB	*opncb;
	ER	ercd;

	ercd = tk_get_res(resid, DEVICE_SVC, (void**)&rescb);
	if ( ercd < E_OK ) {
		goto err_ret;
	}

	/* Do nothing if it is not used even once */
	if ( rescb->openq.next == NULL ) {
		return;
	}

	LockDM();

	/* Free suspend disable request */
	DisSusCnt -= rescb->dissus;
	rescb->dissus = 0;

	/* Close all open devices */
	while ( !isQueEmpty(&rescb->openq) ) {
		opncb = RESQ_OPNCB(rescb->openq.next);

		/* Indicate that it is during close processing */
		opncb->resid = -1;

		/* Device close processing */
		UnlockDM();
		close_device(opncb, 0);
		LockDM();
	}
	UnlockDM();

	return;

err_ret:
	DEBUG_PRINT(("devmgr_cleanup ercd = %d\n", ercd));
	return;
}