예제 #1
0
static
void	req_queue(ADAPTER * a, byte e_no)
{
	card_t	*card;
	int		ipl;

	card = a->io;

	ipl = UxCardLock(card->hw);

	card->e_tbl[e_no].next = 0;

	if (card->e_head)
	{
		card->e_tbl[card->e_tail].next = e_no;
		card->e_tail = e_no;
	}
	else
	{
		card->e_head = e_no;
		card->e_tail = e_no;
	}

	UxCardUnlock(card->hw, ipl);

	return;
}
예제 #2
0
static
byte	get_assign(ADAPTER *a, word ref)
{
	card_t	*card;
	byte	e_no;
	int		ipl;

	card = a->io;

	ipl = UxCardLock(card->hw);

	e_no = (byte)card->assign;
	while (e_no)
	{
		if (card->e_tbl[e_no].assign_ref == ref)
		{
			break;
		}
		e_no = card->e_tbl[e_no].next;
	}

	UxCardUnlock(card->hw, ipl);

	return e_no;
}
예제 #3
0
static
void	free_entity(ADAPTER *a, byte e_no) 
{
	card_t	*card;
	int		ipl;

	card = a->io;

	ipl = UxCardLock(card->hw);

	card->e_tbl[e_no].e = NULL;
	card->e_count--;

	UxCardUnlock(card->hw, ipl);

	return;
}
예제 #4
0
long UxInterlockedDecrement(ux_diva_card_t *card, long *dst)
{
	register volatile long *p;
	register long ret;
	int ipl;

	p =dst;
	
	ipl = UxCardLock(card);

	*p -= 1;
	ret = *p;

	UxCardUnlock(card,ipl);

	return(ret);

}
예제 #5
0
static
void	assign_queue(ADAPTER * a, byte e_no, word ref)
{
	card_t	*card;
	int		ipl;

	card = a->io;

	ipl = UxCardLock(card->hw);

	card->e_tbl[e_no].assign_ref = ref;
	card->e_tbl[e_no].next = card->assign;
	card->assign = e_no;

	UxCardUnlock(card->hw, ipl);

	return;
}
예제 #6
0
static
void	next_req(ADAPTER * a)
{
	card_t	*card;
	int		ipl;


	card = a->io;

	ipl = UxCardLock(card->hw);

	card->e_head = card->e_tbl[card->e_head].next;
	if (!card->e_head)
	{
		card->e_tail = 0;
	}

	UxCardUnlock(card->hw, ipl);

	return;
}
예제 #7
0
/*
 * IDI request function for active cards
 */
static
void	request(card_t *card, ENTITY *e)
{
	word	*special_req;
	int		i;
	int		ipl;


	if (card->log_types & DIVAS_LOG_IDI)
	{
		DivasLogIdi(card, e, TRUE);
	}

	if (!e->Req)
	{
		special_req = (word *) e;

		switch (*special_req)
		{
		case REQ_REMOVE:
			return;

		case REQ_NAME:
			for (i=0; i < DIM(card->cfg.name); i++)
			{
				((struct get_name_s *) e)->name[i] = card->cfg.name[i];
			}
			return;

		case REQ_SERIAL:
		case REQ_XLOG:
			DPRINTF(("IDI: attempted REQ_SERIAL or REQ_XLOG"));
			return;

		default:
			return;
		}
	}

	ipl = UxCardLock(card->hw);

   	if (!(e->Id & 0x1f))
	{
		DPRINTF(("IDI: ASSIGN req"));

		for (i = 1; i < card->e_max; i++)
		{
			if (!card->e_tbl[i].e)
			{
				break;
			}
		}

		if (i == card->e_max)
		{
			DPRINTF(("IDI: request all ids in use (IDI req ignored)"));
			UxCardUnlock(card->hw, ipl);
			e->Rc = OUT_OF_RESOURCES;
			return;
		}

		card->e_tbl[i].e = e;
		card->e_count++;

		e->No = (byte) i;
		e->More = 0;
		e->RCurrent = 0xff;
	}
	else
	{
		i = e->No;
	}
    
    if (e->More & XBUSY)
	{
		DPRINTF(("IDI: request - entity is busy"));
		UxCardUnlock(card->hw, ipl);
		return;
	}

	e->More |= XBUSY;
	e->More &= ~ XMOREF;
	e->XCurrent = 0;
	e->XOffset = 0;

	card->e_tbl[i].next = 0;

	if(card->e_head)
	{
		card->e_tbl[card->e_tail].next = i;
		card->e_tail = i;
	}
	else
	{
		card->e_head = i;
		card->e_tail = i;
	}

	UxCardUnlock(card->hw, ipl);

	DivasScheduleRequestDpc();

	return;
}