⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 common.c

📁 内核linux2.4.20,可跟rtlinux3.2打补丁 组成实时linux系统,编译内核
💻 C
📖 第 1 页 / 共 2 页
字号:
		UxCardUnlock(card->hw,ipl);		return;	}		if(card->card_isr)	{		(*(card->card_isr))(card);	}	else	{		ipl = UxCardLock(card->hw);			if ((card->test_int)(a))		{			(card->reset_int)(card);		}				UxCardUnlock(card->hw,ipl);			}}int DivasCardNew(dia_card_t *card_info){	card_t *card;	static boolean_t first_call = TRUE;	boolean_t NeedISRandReset = FALSE;	DPRINTF(("divas: new card "));	if (first_call)	{		first_call = FALSE;		init_idi_tab();	}	DivasConfigGet(card_info);		if (DivasCardNext == DIM(DivasCards))	{		KDPRINTF((KERN_WARNING "Divas: no space available for new card"));		return -1;	}	card = &DivasCards[DivasCardNext];	card->state = DIA_UNKNOWN;	card->cfg = *card_info;	card->a.io = card;	if (UxCardHandleGet(&card->hw, card_info))	{		KDPRINTF((KERN_WARNING "Divas: cannot get OS specific handle for card"));		return -1;	}	if (card_info->card_type == DIA_CARD_TYPE_DIVA_SERVER_B)	{		DivasBriPatch(card);		card_info->io_base = card->cfg.io_base;	}	switch (card_info->card_type)	{		case DIA_CARD_TYPE_DIVA_SERVER:			if (DivasPriInit(card, card_info))			{				return -1;			}			NeedISRandReset = TRUE;			break;		case DIA_CARD_TYPE_DIVA_SERVER_B:			if (DivasBriInit(card, card_info))			{				return -1;			}			NeedISRandReset = TRUE;			break; 		case DIA_CARD_TYPE_DIVA_SERVER_Q:			if (Divas4BriInit(card, card_info))			{				return -1;			}			if (card_info->name[6] == '0')			{				NeedISRandReset = TRUE;			}			else // Need to set paramater for ISR anyway			{				card->hw->user_isr_arg = card;				card->hw->user_isr = card_isr;			}			break;   		default:			KDPRINTF((KERN_WARNING "Divas: unsupported card type (%d)", card_info->card_type));			return -1;	}	if (NeedISRandReset)	{		if (UxIsrInstall(card->hw, card_isr, card))		{			KDPRINTF((KERN_WARNING "Divas: Install ISR failed (IRQ %d)", card->cfg.irq));			UxCardHandleFree(card->hw);			return -1;		}		if (card_info->card_type != DIA_CARD_TYPE_DIVA_SERVER_Q)		{			if ((*card->card_reset)(card))			{				KDPRINTF((KERN_WARNING "Divas: Adapter reset failed"));				return -1;			}			card->state = DIA_RESET;		}		NeedISRandReset = FALSE;	}	DivasCardNext++;	return 0;}void	*get_card(int card_id){	int i;	for (i=0; i < DivasCardNext; i++)	{		if (DivasCards[i].cfg.card_id == card_id)		{			return(&DivasCards[i]);		}	}	DPRINTF(("divas: get_card() : no such card id (%d)", card_id));	return NULL;}int DivasCardConfig(dia_config_t *config){	card_t *card;	int status;	DPRINTF(("divas: configuring card"));	card = get_card(config->card_id);	if (!card)	{		return -1;	}	config = DivasConfig(card, config);	status = (*card->card_config)(card, config);	if (!status)	{		card->state = DIA_CONFIGURED;	}	return status;}int DivasCardLoad(dia_load_t *load){	card_t *card;	int	status;	card = get_card(load->card_id);	if (!card)	{		return -1;	}	if (card->state == DIA_RUNNING)	{		(*card->card_reset)(card);	}	status = (*card->card_load)(card, load);	if (!status)	{		card->state = DIA_LOADED;	}	return status;}static int idi_register(card_t *card, byte channels){    DESCRIPTOR d[32];    int length, num_entities;	DPRINTF(("divas: registering card with IDI"));	num_entities = (channels > 2) ? MAX_PENTITIES : MAX_ENTITIES;	card->e_tbl = UxAlloc(sizeof(E_INFO) * num_entities);	if (!card->e_tbl)	{		KDPRINTF((KERN_WARNING "Divas: IDI register failed - no memory available"));		return -1;	}	memset(card->e_tbl, 0, sizeof(E_INFO) * num_entities);	card->e_max = num_entities;    DIVA_DIDD_Read(d, sizeof(d));        for(length=0; length < DIM(d); length++)          if (d[length].type == 0) break;	if (length >= DIM(d))	{		KDPRINTF((KERN_WARNING "Divas: IDI register failed - table full"));		return -1;	}	switch (card->cfg.card_type)	{		case DIA_CARD_TYPE_DIVA_SERVER:		d[length].type = IDI_ADAPTER_PR;		/* d[length].serial = card->serial_no; */		break;		case DIA_CARD_TYPE_DIVA_SERVER_B:		d[length].type = IDI_ADAPTER_MAESTRA;		/* d[length].serial = card->serial_no; */		break;		// 4BRI is treated as 4 BRI adapters		case DIA_CARD_TYPE_DIVA_SERVER_Q:		d[length].type = IDI_ADAPTER_MAESTRA;		/* d[length].serial = card->cfg.serial; */	}	d[length].features = 0;	d[length].features |= DI_FAX3|DI_MODEM|DI_POST|DI_V110|DI_V120;	if ( card->hw->features & PROTCAP_MANIF )	{		d[length].features |= DI_MANAGE ;	}	if ( card->hw->features & PROTCAP_V_42 )	{		d[length].features |= DI_V_42 ;	}	if ( card->hw->features & PROTCAP_EXTD_FAX )	{		d[length].features |= DI_EXTD_FAX ;	}	d[length].channels = channels;	d[length].request = DivasIdiRequest[card - DivasCards];	length++;	DIVA_DIDD_Write(d, sizeof(d));    return 0;}int DivasCardStart(int card_id){	card_t *card;	byte channels;	int status;	DPRINTF(("divas: starting card"));	card = get_card(card_id);	if (!card)	{		return -1;	}	status = (*card->card_start)(card, &channels);	if (status)	{		return status;	}	/* 4BRI == 4 x BRI so call idi_register 4 times each with 2 channels */	if (card->cfg.card_type == DIA_CARD_TYPE_DIVA_SERVER_Q)	{		int i;		card_t *FourBRISlave;		for (i=3; i >= 0; i--)		{			FourBRISlave = get_card(card_id - i); /* 0, 1, 2, 3 */			if (FourBRISlave)			{				idi_register(FourBRISlave, 2);				FourBRISlave->state = DIA_RUNNING;			}		}		card->serial_no = card->cfg.serial;		DPRINTF(("divas: card id %d (4BRI), serial no. 0x%x ready with %d channels", 				card_id - 3, card->serial_no, (int) channels));	}	else	{		status = idi_register(card, channels);		if (!status)		{			card->state = DIA_RUNNING;			DPRINTF(("divas: card id %d, serial no. 0x%x ready with %d channels", 						card_id, card->serial_no, (int) channels));		}	}	return status;}int DivasGetMem(mem_block_t *mem_block){	card_t *card;	word	card_id = mem_block->card_id;	card = get_card(card_id);	if (!card)	{		return 0;	}	return (*card->card_mem_get)(card, mem_block);}/* * Deleyed Procedure Call for handling interrupts from card */void	DivaDoCardDpc(card_t *card){	ADAPTER	*a;	a = &card->a;	if(UxInterlockedIncrement(card->hw, &card->dpc_reentered) > 1)	{		return;	}	do{		if((*(card->test_int))(a))		{			(*(card->dpc))(a);			(*(card->clear_int))(a);		}			(*(card->out))(a);	}while(UxInterlockedDecrement(card->hw, &card->dpc_reentered));			}void	DivasDoDpc(void *pData){	card_t	*card = DivasCards;	int 	i = DivasCardNext;		while(i--)	{            if (card->state == DIA_RUNNING)		DivaDoCardDpc(card);            card++;	}}void	DivasDoRequestDpc(void *pData){	DivasDoDpc(pData);}/* * DivasGetNum * Returns the number of active adapters */int DivasGetNum(void){	return(DivasCardNext);}/* * DivasGetList * Returns a list of active adapters */int DivasGetList(dia_card_list_t *card_list){	int i;	memset(card_list, 0, sizeof(dia_card_list_t));	for(i = 0; i < DivasCardNext; i++)	{		card_list->card_type = DivasCards[i].cfg.card_type;		card_list->card_slot = DivasCards[i].cfg.slot;		card_list->state     = DivasCards[i].state;		card_list++;	}	return 0;}/* * control logging for specified card */void	DivasLog(dia_log_t *log){	card_t *card;	card = get_card(log->card_id);	if (!card)	{		return;	}	card->log_types = log->log_types;	return;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -