rocket.c

来自「linux 内核源代码」· C语言 代码 · 共 2,326 行 · 第 1/5 页

C
2,326
字号
 */static __init int register_PCI(int i, struct pci_dev *dev){	int num_aiops, aiop, max_num_aiops, num_chan, chan;	unsigned int aiopio[MAX_AIOPS_PER_BOARD];	char *str, *board_type;	CONTROLLER_t *ctlp;	int fast_clock = 0;	int altChanRingIndicator = 0;	int ports_per_aiop = 8;	WordIO_t ConfigIO = 0;	ByteIO_t UPCIRingInd = 0;	if (!dev || pci_enable_device(dev))		return 0;	rcktpt_io_addr[i] = pci_resource_start(dev, 0);	rcktpt_type[i] = ROCKET_TYPE_NORMAL;	rocketModel[i].loadrm2 = 0;	rocketModel[i].startingPortNumber = nextLineNumber;	/*  Depending on the model, set up some config variables */	switch (dev->device) {	case PCI_DEVICE_ID_RP4QUAD:		str = "Quadcable";		max_num_aiops = 1;		ports_per_aiop = 4;		rocketModel[i].model = MODEL_RP4QUAD;		strcpy(rocketModel[i].modelString, "RocketPort 4 port w/quad cable");		rocketModel[i].numPorts = 4;		break;	case PCI_DEVICE_ID_RP8OCTA:		str = "Octacable";		max_num_aiops = 1;		rocketModel[i].model = MODEL_RP8OCTA;		strcpy(rocketModel[i].modelString, "RocketPort 8 port w/octa cable");		rocketModel[i].numPorts = 8;		break;	case PCI_DEVICE_ID_URP8OCTA:		str = "Octacable";		max_num_aiops = 1;		rocketModel[i].model = MODEL_UPCI_RP8OCTA;		strcpy(rocketModel[i].modelString, "RocketPort UPCI 8 port w/octa cable");		rocketModel[i].numPorts = 8;		break;	case PCI_DEVICE_ID_RP8INTF:		str = "8";		max_num_aiops = 1;		rocketModel[i].model = MODEL_RP8INTF;		strcpy(rocketModel[i].modelString, "RocketPort 8 port w/external I/F");		rocketModel[i].numPorts = 8;		break;	case PCI_DEVICE_ID_URP8INTF:		str = "8";		max_num_aiops = 1;		rocketModel[i].model = MODEL_UPCI_RP8INTF;		strcpy(rocketModel[i].modelString, "RocketPort UPCI 8 port w/external I/F");		rocketModel[i].numPorts = 8;		break;	case PCI_DEVICE_ID_RP8J:		str = "8J";		max_num_aiops = 1;		rocketModel[i].model = MODEL_RP8J;		strcpy(rocketModel[i].modelString, "RocketPort 8 port w/RJ11 connectors");		rocketModel[i].numPorts = 8;		break;	case PCI_DEVICE_ID_RP4J:		str = "4J";		max_num_aiops = 1;		ports_per_aiop = 4;		rocketModel[i].model = MODEL_RP4J;		strcpy(rocketModel[i].modelString, "RocketPort 4 port w/RJ45 connectors");		rocketModel[i].numPorts = 4;		break;	case PCI_DEVICE_ID_RP8SNI:		str = "8 (DB78 Custom)";		max_num_aiops = 1;		rocketModel[i].model = MODEL_RP8SNI;		strcpy(rocketModel[i].modelString, "RocketPort 8 port w/ custom DB78");		rocketModel[i].numPorts = 8;		break;	case PCI_DEVICE_ID_RP16SNI:		str = "16 (DB78 Custom)";		max_num_aiops = 2;		rocketModel[i].model = MODEL_RP16SNI;		strcpy(rocketModel[i].modelString, "RocketPort 16 port w/ custom DB78");		rocketModel[i].numPorts = 16;		break;	case PCI_DEVICE_ID_RP16INTF:		str = "16";		max_num_aiops = 2;		rocketModel[i].model = MODEL_RP16INTF;		strcpy(rocketModel[i].modelString, "RocketPort 16 port w/external I/F");		rocketModel[i].numPorts = 16;		break;	case PCI_DEVICE_ID_URP16INTF:		str = "16";		max_num_aiops = 2;		rocketModel[i].model = MODEL_UPCI_RP16INTF;		strcpy(rocketModel[i].modelString, "RocketPort UPCI 16 port w/external I/F");		rocketModel[i].numPorts = 16;		break;	case PCI_DEVICE_ID_CRP16INTF:		str = "16";		max_num_aiops = 2;		rocketModel[i].model = MODEL_CPCI_RP16INTF;		strcpy(rocketModel[i].modelString, "RocketPort Compact PCI 16 port w/external I/F");		rocketModel[i].numPorts = 16;		break;	case PCI_DEVICE_ID_RP32INTF:		str = "32";		max_num_aiops = 4;		rocketModel[i].model = MODEL_RP32INTF;		strcpy(rocketModel[i].modelString, "RocketPort 32 port w/external I/F");		rocketModel[i].numPorts = 32;		break;	case PCI_DEVICE_ID_URP32INTF:		str = "32";		max_num_aiops = 4;		rocketModel[i].model = MODEL_UPCI_RP32INTF;		strcpy(rocketModel[i].modelString, "RocketPort UPCI 32 port w/external I/F");		rocketModel[i].numPorts = 32;		break;	case PCI_DEVICE_ID_RPP4:		str = "Plus Quadcable";		max_num_aiops = 1;		ports_per_aiop = 4;		altChanRingIndicator++;		fast_clock++;		rocketModel[i].model = MODEL_RPP4;		strcpy(rocketModel[i].modelString, "RocketPort Plus 4 port");		rocketModel[i].numPorts = 4;		break;	case PCI_DEVICE_ID_RPP8:		str = "Plus Octacable";		max_num_aiops = 2;		ports_per_aiop = 4;		altChanRingIndicator++;		fast_clock++;		rocketModel[i].model = MODEL_RPP8;		strcpy(rocketModel[i].modelString, "RocketPort Plus 8 port");		rocketModel[i].numPorts = 8;		break;	case PCI_DEVICE_ID_RP2_232:		str = "Plus 2 (RS-232)";		max_num_aiops = 1;		ports_per_aiop = 2;		altChanRingIndicator++;		fast_clock++;		rocketModel[i].model = MODEL_RP2_232;		strcpy(rocketModel[i].modelString, "RocketPort Plus 2 port RS232");		rocketModel[i].numPorts = 2;		break;	case PCI_DEVICE_ID_RP2_422:		str = "Plus 2 (RS-422)";		max_num_aiops = 1;		ports_per_aiop = 2;		altChanRingIndicator++;		fast_clock++;		rocketModel[i].model = MODEL_RP2_422;		strcpy(rocketModel[i].modelString, "RocketPort Plus 2 port RS422");		rocketModel[i].numPorts = 2;		break;	case PCI_DEVICE_ID_RP6M:		max_num_aiops = 1;		ports_per_aiop = 6;		str = "6-port";		/*  If revision is 1, the rocketmodem flash must be loaded.		 *  If it is 2 it is a "socketed" version. */		if (dev->revision == 1) {			rcktpt_type[i] = ROCKET_TYPE_MODEMII;			rocketModel[i].loadrm2 = 1;		} else {			rcktpt_type[i] = ROCKET_TYPE_MODEM;		}		rocketModel[i].model = MODEL_RP6M;		strcpy(rocketModel[i].modelString, "RocketModem 6 port");		rocketModel[i].numPorts = 6;		break;	case PCI_DEVICE_ID_RP4M:		max_num_aiops = 1;		ports_per_aiop = 4;		str = "4-port";		if (dev->revision == 1) {			rcktpt_type[i] = ROCKET_TYPE_MODEMII;			rocketModel[i].loadrm2 = 1;		} else {			rcktpt_type[i] = ROCKET_TYPE_MODEM;		}		rocketModel[i].model = MODEL_RP4M;		strcpy(rocketModel[i].modelString, "RocketModem 4 port");		rocketModel[i].numPorts = 4;		break;	default:		str = "(unknown/unsupported)";		max_num_aiops = 0;		break;	}	/*	 * Check for UPCI boards.	 */	switch (dev->device) {	case PCI_DEVICE_ID_URP32INTF:	case PCI_DEVICE_ID_URP8INTF:	case PCI_DEVICE_ID_URP16INTF:	case PCI_DEVICE_ID_CRP16INTF:	case PCI_DEVICE_ID_URP8OCTA:		rcktpt_io_addr[i] = pci_resource_start(dev, 2);		ConfigIO = pci_resource_start(dev, 1);		if (dev->device == PCI_DEVICE_ID_URP8OCTA) {			UPCIRingInd = rcktpt_io_addr[i] + _PCI_9030_RING_IND;			/*			 * Check for octa or quad cable.			 */			if (!			    (sInW(ConfigIO + _PCI_9030_GPIO_CTRL) &			     PCI_GPIO_CTRL_8PORT)) {				str = "Quadcable";				ports_per_aiop = 4;				rocketModel[i].numPorts = 4;			}		}		break;	case PCI_DEVICE_ID_UPCI_RM3_8PORT:		str = "8 ports";		max_num_aiops = 1;		rocketModel[i].model = MODEL_UPCI_RM3_8PORT;		strcpy(rocketModel[i].modelString, "RocketModem III 8 port");		rocketModel[i].numPorts = 8;		rcktpt_io_addr[i] = pci_resource_start(dev, 2);		UPCIRingInd = rcktpt_io_addr[i] + _PCI_9030_RING_IND;		ConfigIO = pci_resource_start(dev, 1);		rcktpt_type[i] = ROCKET_TYPE_MODEMIII;		break;	case PCI_DEVICE_ID_UPCI_RM3_4PORT:		str = "4 ports";		max_num_aiops = 1;		rocketModel[i].model = MODEL_UPCI_RM3_4PORT;		strcpy(rocketModel[i].modelString, "RocketModem III 4 port");		rocketModel[i].numPorts = 4;		rcktpt_io_addr[i] = pci_resource_start(dev, 2);		UPCIRingInd = rcktpt_io_addr[i] + _PCI_9030_RING_IND;		ConfigIO = pci_resource_start(dev, 1);		rcktpt_type[i] = ROCKET_TYPE_MODEMIII;		break;	default:		break;	}	switch (rcktpt_type[i]) {	case ROCKET_TYPE_MODEM:		board_type = "RocketModem";		break;	case ROCKET_TYPE_MODEMII:		board_type = "RocketModem II";		break;	case ROCKET_TYPE_MODEMIII:		board_type = "RocketModem III";		break;	default:		board_type = "RocketPort";		break;	}	if (fast_clock) {		sClockPrescale = 0x12;	/* mod 2 (divide by 3) */		rp_baud_base[i] = 921600;	} else {		/*		 * If support_low_speed is set, use the slow clock		 * prescale, which supports 50 bps		 */		if (support_low_speed) {			/* mod 9 (divide by 10) prescale */			sClockPrescale = 0x19;			rp_baud_base[i] = 230400;		} else {			/* mod 4 (devide by 5) prescale */			sClockPrescale = 0x14;			rp_baud_base[i] = 460800;		}	}	for (aiop = 0; aiop < max_num_aiops; aiop++)		aiopio[aiop] = rcktpt_io_addr[i] + (aiop * 0x40);	ctlp = sCtlNumToCtlPtr(i);	num_aiops = sPCIInitController(ctlp, i, aiopio, max_num_aiops, ConfigIO, 0, FREQ_DIS, 0, altChanRingIndicator, UPCIRingInd);	for (aiop = 0; aiop < max_num_aiops; aiop++)		ctlp->AiopNumChan[aiop] = ports_per_aiop;	printk("Comtrol PCI controller #%d ID 0x%x found in bus:slot:fn %s at address %04lx, "	     "%d AIOP(s) (%s)\n", i, dev->device, pci_name(dev),	     rcktpt_io_addr[i], num_aiops, rocketModel[i].modelString);	printk(KERN_INFO "Installing %s, creating /dev/ttyR%d - %ld\n",	       rocketModel[i].modelString,	       rocketModel[i].startingPortNumber,	       rocketModel[i].startingPortNumber +	       rocketModel[i].numPorts - 1);	if (num_aiops <= 0) {		rcktpt_io_addr[i] = 0;		return (0);	}	is_PCI[i] = 1;	/*  Reset the AIOPIC, init the serial ports */	for (aiop = 0; aiop < num_aiops; aiop++) {		sResetAiopByNum(ctlp, aiop);		num_chan = ports_per_aiop;		for (chan = 0; chan < num_chan; chan++)			init_r_port(i, aiop, chan, dev);	}	/*  Rocket modems must be reset */	if ((rcktpt_type[i] == ROCKET_TYPE_MODEM) ||	    (rcktpt_type[i] == ROCKET_TYPE_MODEMII) ||	    (rcktpt_type[i] == ROCKET_TYPE_MODEMIII)) {		num_chan = ports_per_aiop;		for (chan = 0; chan < num_chan; chan++)			sPCIModemReset(ctlp, chan, 1);		mdelay(500);		for (chan = 0; chan < num_chan; chan++)			sPCIModemReset(ctlp, chan, 0);		mdelay(500);		rmSpeakerReset(ctlp, rocketModel[i].model);	}	return (1);}/* *  Probes for PCI cards, inits them if found *  Input:   board_found = number of ISA boards already found, or the *           starting board number *  Returns: Number of PCI boards found */static int __init init_PCI(int boards_found){	struct pci_dev *dev = NULL;	int count = 0;	/*  Work through the PCI device list, pulling out ours */	while ((dev = pci_get_device(PCI_VENDOR_ID_RP, PCI_ANY_ID, dev))) {		if (register_PCI(count + boards_found, dev))			count++;	}	return (count);}#endif				/* CONFIG_PCI *//* *  Probes for ISA cards *  Input:   i = the board number to look for *  Returns: 1 if board found, 0 else */static int __init init_ISA(int i){	int num_aiops, num_chan = 0, total_num_chan = 0;	int aiop, chan;	unsigned int aiopio[MAX_AIOPS_PER_BOARD];	CONTROLLER_t *ctlp;	char *type_string;	/*  If io_addr is zero, no board configured */	if (rcktpt_io_addr[i] == 0)		return (0);	/*  Reserve the IO region */	if (!request_region(rcktpt_io_addr[i], 64, "Comtrol RocketPort")) {		printk(KERN_INFO "Unable to reserve IO region for configured ISA RocketPort at address 0x%lx, board not installed...\n", rcktpt_io_addr[i]);		rcktpt_io_addr[i] = 0;		return (0);	}	ctlp = sCtlNumToCtlPtr(i);	ctlp->boardType = rcktpt_type[i];	switch (rcktpt_type[i]) {	case ROCKET_TYPE_PC104:		type_string = "(PC104)";		break;	case ROCKET_TYPE_MODEM:		type_string = "(RocketModem)";		break;	case ROCKET_TYPE_MODEMII:		type_string = "(RocketModem II)";		break;	default:		type_string = "";		break;	}	/*	 * If support_low_speed is set, use the slow clock prescale,	 * which supports 50 bps	 */	if (support_low_speed) {		sClockPrescale = 0x19;	/* mod 9 (divide by 10) prescale */		rp_baud_base[i] = 230400;	} else {		sClockPrescale = 0x14;	/* mod 4 (devide by 5) prescale */		rp_baud_base[i] = 460800;	}	for (aiop = 0; aiop < MAX_AIOPS_PER_BOARD; aiop++)		aiopio[aiop] = rcktpt_io_addr[i] + (aiop * 0x400);	num_aiops = sInitController(ctlp, i, controller + (i * 0x400), aiopio,  MAX_AIOPS_PER_BOARD, 0, FREQ_DIS, 0);	if (ctlp->boardType == ROCKET_TYPE_PC104) {		sEnAiop(ctlp, 2);	/* only one AIOPIC, but these */		sEnAiop(ctlp, 3);	/* CSels used for other stuff */	}	/*  If something went wrong initing the AIOP's release the ISA IO memory */	if (num_aiops <= 0) {		release_region(rcktpt_io_addr[i], 64);		rcktpt_io_addr[i] = 0;		return (0);	}  	rocketModel[i].startingPortNumber = nextLineNumber;	for (aiop = 0; aiop < num_aiops; aiop++) {		sResetAiopByNum(ctlp, aiop);		sEnAiop(ctlp, aiop);		num_chan = sGetAiopNumChan(ctlp, aiop);		total_num_chan += num_chan;		for (chan = 0; chan < num_chan; chan++)			init_r_port(i, aiop, chan, NULL);	}	is_PCI[i] = 0;	if ((rcktpt_type[i] == ROCKET_TYPE_MODEM) || (rcktpt_type[i] == ROCKET_TYPE_MODEMII)) {		num_chan = sGetAiopNumChan(ctlp, 0);		total_num_chan = num_chan;		for (chan = 0; chan < num_chan; chan++)			sModemReset(ctlp, chan, 1);		mdelay(500);		for (chan = 0; chan < num_chan; chan++)			sModemReset(ctlp, chan, 0);		mdelay(500);		strcpy(rocketModel[i].modelString, "RocketModem ISA");	} else {		strcpy(rocketModel[i].modelString, "RocketPort ISA");	}	rocketModel[i].numPorts = total_num_chan;	rocketModel[i].model = MODEL_ISA;	printk(KERN_INFO "RocketPort ISA card #%d found at 0x%lx - %d AIOPs %s\n", 	       i, rcktpt_io_addr[i], num_aiops, type_string);	printk(KERN_INFO "Insta

⌨️ 快捷键说明

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