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

📄 x400p-ss7.c

📁 OpenSS7 This the fourth public release of the OpenSS7 Master Package. See README in the release for
💻 C
📖 第 1 页 / 共 5 页
字号:
						sp->slots[slot]->xp->obj.sdl.config.ifframing =						    arg->ifframing;				sp->config.ifframing = arg->ifframing;				span_reconfig = 1;			}			if (sp->config.iftxlevel != arg->iftxlevel) {				for (slot = 0; slot < 32; slot++)					if (sp->slots[slot] && sp->slots[slot]->xp)						sp->slots[slot]->xp->obj.sdl.config.iftxlevel =						    arg->iftxlevel;				sp->config.iftxlevel = arg->iftxlevel;				span_reconfig = 1;			}			if ((cd = sp->cd)) {				int src, span, slot;				for (src = 0; src < SDL_SYNCS; src++) {					if (cd->config.ifsyncsrc[src] != arg->ifsyncsrc[src]) {						for (span = 0; span < X400_SPANS; span++)							if (cd->spans[span])								for (slot = 0; slot < 32; slot++)									if (cd->spans[span]->									    slots[slot]									    && cd->spans[span]->									    slots[slot]->xp)										cd->spans[span]->										    slots[slot]->										    xp->obj.sdl.										    config.										    ifsyncsrc[src] =										    arg->										    ifsyncsrc[src];						cd->config.ifsyncsrc[src] = arg->ifsyncsrc[src];						card_reconfig = 1;					}				}			}		}		if (sp && span_reconfig && sp->config.ifflags & SDL_IF_UP) {			/* need to bring up span */			int span = sp->span;			int base = span << 8;			uint8_t ccr1 = 0, tcr1 = 0;			if (cd) {				switch (cd->config.ifgtype) {				case SDL_GTYPE_E1:				{					printd(("%s: performing reconfiguration of E1 span %d\n",						DRV_NAME, span));					/* Tell ISR to re-evaluate the sync source */					cd->eval_syncsrc = 1;					tcr1 = 0x09;	/* TCR1: TSiS mode */					switch (sp->config.ifframing) {					default:					case SDL_FRAMING_CCS:						ccr1 |= 0x08;						break;					case SDL_FRAMING_CAS:	/* does this mean DS0A? */						tcr1 |= 0x20;						break;					}					switch (sp->config.ifcoding) {					case SDL_CODING_HDB3:						ccr1 |= 0x44;						break;					default:					case SDL_CODING_AMI:						ccr1 |= 0x00;						break;					}					switch (sp->config.ifgcrc) {					case SDL_GCRC_CRC4:						ccr1 |= 0x11;						break;					default:						ccr1 |= 0x00;						break;					}					cd->xlb[base + 0x12] = tcr1;					cd->xlb[base + 0x14] = ccr1;					cd->xlb[base + 0x18] = 0x20;	/* 120 Ohm, Normal */					break;				}				case SDL_GTYPE_T1:				{					int byte, val, c;					unsigned short mask = 0;					printd(("%s: performing reconfiguration of T1 span %d\n",						DRV_NAME, span));					/* Tell ISR to re-evaluate the sync source */					cd->eval_syncsrc = 1;					/* Enable F bits pattern */					switch (sp->config.ifframing) {					default:					case SDL_FRAMING_SF:						val = 0x20;						break;					case SDL_FRAMING_ESF:						val = 0x88;						break;					}					switch (sp->config.ifcoding) {					default:					case SDL_CODING_AMI:						break;					case SDL_CODING_B8ZS:						val |= 0x44;						break;					}					cd->xlb[base + 0x38] = val;					if (sp->config.ifcoding != SDL_CODING_B8ZS)						cd->xlb[base + 0x7e] = 0x1c;	/* Set FDL register 										   to 0x1c */					cd->xlb[base + 0x7c] = sp->config.iftxlevel << 5;	/* LBO 												 */					/* establish which channels are clear channel */					for (c = 0; c < 24; c++) {						byte = c >> 3;						if (!cd->spans[span]->slots[xp_t1_chan_map[c]] ||						    !cd->spans[span]->slots[xp_t1_chan_map[c]]->xp						    || cd->spans[span]->slots[xp_t1_chan_map[c]]->						    xp->obj.sdl.config.iftype != SDL_TYPE_DS0A)							mask |= 1 << (c % 8);						if ((c % 8) == 7)							cd->xlb[base + 0x39 + byte] = mask;					}					break;				}				default:					swerr();					break;				}			}		}		if (cd && card_reconfig && cd->config.ifflags & SDL_IF_UP) {			cd->eval_syncsrc = 1;		}	}	spin_unlock_irqrestore(&xp->lock, flags);	return;}/*  *  SDL_IOCGOPTIONS:    lmi_option_t *  ----------------------------------- */STATIC intsdl_iocgoptions(queue_t *q, mblk_t *mp){	return (-EOPNOTSUPP);}/*  *  SDL_IOCSOPTIONS:    lmi_option_t *  ----------------------------------- */STATIC intsdl_iocsoptions(queue_t *q, mblk_t *mp){	return (-EOPNOTSUPP);}/*  *  SDL_IOCGCONFIG:     sdl_config_t *  ----------------------------------- */STATIC intsdl_iocgconfig(queue_t *q, mblk_t *mp){	if (mp->b_cont) {		struct xp *xp = XP_PRIV(q);		struct sp *sp;		psw_t flags = 0;		sdl_config_t *arg = (typeof(arg)) mp->b_cont->b_rptr;		bzero(arg, sizeof(*arg));		spin_lock_irqsave(&xp->lock, flags);		{			arg->ifflags = xp->obj.sdl.config.ifflags;			arg->iftype = xp->obj.sdl.config.iftype;			arg->ifrate = xp->obj.sdl.config.ifrate;			arg->ifmode = xp->obj.sdl.config.ifmode;			arg->ifblksize = xp->obj.sdl.config.ifblksize;			if ((sp = xp->sp)) {				struct cd *cd;				arg->ifgtype = sp->config.ifgtype;				arg->ifgrate = sp->config.ifgrate;				arg->ifgmode = sp->config.ifgmode;				arg->ifgcrc = sp->config.ifgcrc;				arg->ifclock = sp->config.ifclock;				arg->ifcoding = sp->config.ifcoding;				arg->ifframing = sp->config.ifframing;				arg->ifalarms = sp->config.ifalarms;				arg->ifrxlevel = sp->config.ifrxlevel;				arg->iftxlevel = sp->config.iftxlevel;				if ((cd = sp->cd)) {					int src;					for (src = 0; src < SDL_SYNCS; src++)						arg->ifsyncsrc[src] = cd->config.ifsyncsrc[src];					arg->ifsync = cd->config.ifsync;				}			}		}		spin_unlock_irqrestore(&xp->lock, flags);		return (0);	}	rare();	return (-EINVAL);}/*  *  SDL_IOCSCONFIG:     sdl_config_t *  ----------------------------------- */STATIC intsdl_iocsconfig(queue_t *q, mblk_t *mp){	if (mp->b_cont) {		int ret;		struct xp *xp = XP_PRIV(q);		sdl_config_t *arg = (typeof(arg)) mp->b_cont->b_rptr;		if ((ret = sdl_test_config(xp, arg)))			return (ret);		sdl_commit_config(xp, arg);		return (0);	}	rare();	return (-EINVAL);}/*  *  SDL_IOCTCONFIG:     sdl_config_t *  ----------------------------------- */STATIC intsdl_ioctconfig(queue_t *q, mblk_t *mp){	if (mp->b_cont) {		struct xp *xp = XP_PRIV(q);		sdl_config_t *arg = (typeof(arg)) mp->b_cont->b_rptr;		return sdl_test_config(xp, arg);	}	rare();	return (-EINVAL);}/*  *  SDL_IOCCCONFIG:     sdl_config_t *  ----------------------------------- */STATIC intsdl_ioccconfig(queue_t *q, mblk_t *mp){	if (mp->b_cont) {		struct xp *xp = XP_PRIV(q);		sdl_config_t *arg = (typeof(arg)) mp->b_cont->b_rptr;		sdl_commit_config(xp, arg);		return (0);	}	rare();	return (-EINVAL);}/*  *  SDL_IOCGSTATEM:     sdl_statem_t *  ----------------------------------- */STATIC intsdl_iocgstatem(queue_t *q, mblk_t *mp){	if (mp->b_cont) {		struct xp *xp = XP_PRIV(q);		psw_t flags = 0;		sdl_statem_t *arg = (typeof(arg)) mp->b_cont->b_rptr;		spin_lock_irqsave(&xp->lock, flags);		{			*arg = xp->obj.sdl.statem;		}		spin_unlock_irqrestore(&xp->lock, flags);		return (0);	}	rare();	return (-EINVAL);}/*  *  SDL_IOCCMRESET:     sdl_statem_t *  ----------------------------------- */STATIC intsdl_ioccmreset(queue_t *q, mblk_t *mp){	struct xp *xp = XP_PRIV(q);	void *arg = mp->b_cont ? mp->b_cont->b_rptr : NULL;	(void) xp;	(void) arg;	fixme(("FIXME: Support master reset\n"));	return (-EOPNOTSUPP);}/*  *  SDL_IOCGSTATSP:     sdl_stats_t *  ----------------------------------- */STATIC intsdl_iocgstatsp(queue_t *q, mblk_t *mp){	if (mp->b_cont) {		struct xp *xp = XP_PRIV(q);		psw_t flags = 0;		sdl_stats_t *arg = (typeof(arg)) mp->b_cont->b_rptr;		spin_lock_irqsave(&xp->lock, flags);		{			*arg = xp->obj.sdl.statsp;		}		spin_unlock_irqrestore(&xp->lock, flags);		return (0);	}	rare();	return (-EINVAL);}/*  *  SDL_IOCSSTATSP:     sdl_stats_t *  ----------------------------------- */STATIC intsdl_iocsstatsp(queue_t *q, mblk_t *mp){	if (mp->b_cont) {		struct xp *xp = XP_PRIV(q);		psw_t flags = 0;		sdl_stats_t *arg = (typeof(arg)) mp->b_cont->b_rptr;		fixme(("FIXME: check these settings\n"));		spin_lock_irqsave(&xp->lock, flags);		{			xp->obj.sdl.statsp = *arg;		}		spin_unlock_irqrestore(&xp->lock, flags);		return (0);	}	rare();	return (-EINVAL);}/*  *  SDL_IOCGSTATS:      sdl_stats_t *  ----------------------------------- */STATIC intsdl_iocgstats(queue_t *q, mblk_t *mp){	if (mp->b_cont) {		struct xp *xp = XP_PRIV(q);		psw_t flags = 0;		sdl_stats_t *arg = (typeof(arg)) mp->b_cont->b_rptr;		spin_lock_irqsave(&xp->lock, flags);		{			*arg = xp->obj.sdl.stats;		}		spin_unlock_irqrestore(&xp->lock, flags);		return (0);	}	rare();	return (-EINVAL);}/*  *  SDL_IOCCSTATS:      sdl_stats_t *  ----------------------------------- */STATIC intsdl_ioccstats(queue_t *q, mblk_t *mp){	struct xp *xp = XP_PRIV(q);	psw_t flags = 0;	(void) mp;	spin_lock_irqsave(&xp->lock, flags);	{		bzero(&xp->obj.sdl.stats, sizeof(xp->obj.sdl.stats));	}	spin_unlock_irqrestore(&xp->lock, flags);	return (0);}/*  *  SDL_IOCGNOTIFY:     sdl_notify_t *  ----------------------------------- */STATIC intsdl_iocgnotify(queue_t *q, mblk_t *mp){	if (mp->b_cont) {		struct xp *xp = XP_PRIV(q);		psw_t flags = 0;		sdl_notify_t *arg = (typeof(arg)) mp->b_cont->b_rptr;		spin_lock_irqsave(&xp->lock, flags);		{			*arg = xp->obj.sdl.notify;		}		spin_unlock_irqrestore(&xp->lock, flags);		return (0);	}	rare();	return (-EINVAL);}/*  *  SDL_IOCSNOTIFY:     sdl_notify_t *  ----------------------------------- */STATIC intsdl_iocsnotify(queue_t *q, mblk_t *mp){	if (mp->b_cont) {		struct xp *xp = XP_PRIV(q);		psw_t flags = 0;		sdl_notify_t *arg = (typeof(arg)) mp->b_cont->b_rptr;		spin_lock_irqsave(&xp->lock, flags);		{			xp->obj.sdl.notify.events |= arg->events;		}		spin_unlock_irqrestore(&xp->lock, flags);		return (0);	}	rare();	return (-EINVAL);}/*  *  SDL_IOCCNOTIFY:     sdl_notify_t *  ----------------------------------- */STATIC intsdl_ioccnotify(queue_t *q, mblk_t *mp){	if (mp->b_cont) {		struct xp *xp = XP_PRIV(q);		psw_t flags = 0;		sdl_notify_t *arg = (typeof(arg)) mp->b_cont->b_rptr;		spin_lock_irqsave(&xp->lock, flags);		{			xp->obj.sdl.notify.events &= ~arg->events;		}		spin_unlock_irqrestore(&xp->lock, flags);		return (0);	}	rare();	return (-EINVAL);}/*  *  SDL_IOCCDISCTX:      *  ----------------------------------- */STATIC intsdl_ioccdisctx(queue_t *q, mblk_t *mp){	struct xp *xp = XP_PRIV(q);	psw_t flags = 0;	(void) mp;	spin_lock_irqsave(&xp->lock, flags);	{		xp->obj.sdl.config.ifflags &= ~SDL_IF_TX_RUNNING;	}	spin_unlock_irqrestore(&xp->lock, flags);	return (0);}/*  *  SDL_IOCCONNTX:       *  ----------------------------------- */STATIC intsdl_ioccconntx(queue_t *q, mblk_t *mp){	struct xp *xp = XP_PRIV(q);	psw_t flags = 0;	(void) mp;	spin_lock_irqsave(&xp->lock, flags);	{		xp->obj.sdl.config.ifflags |= SDL_IF_TX_RUNNING;	}	spin_unlock_irqrestore(&xp->lock, flags);	return (0);}STATIC INLINE mblk_t *sdl_transmission_request(queue_t *q, struct xp *xp, struct ts *ts){	mblk_t *mp;	if ((mp = bufq_dequeue(&ts->tx.buf))) {		if (ts->tx.buf.q_count < 32 && q->q_count)			qenable(q);	} else		xp->obj.sdl.stats.tx_buffer_overflows++;	return (mp);}/* *  ========================================================================= * *  X400P Interrupt Service Routine * *  ========================================================================= *  We break this out into E1 and T1 versions for speed.  No need to check *  card type in the ISR when it is static for the board.  That is: boards do *  not change type from E1 to T1 or visa versa. */STATIC INLINE voidxp_tx_block(struct xp *xp, struct ts *ts, uchar *bp, uchar *be, const ulong type){	int chan = 0;	queue_t *q = xp->iq;	register xp_path_t *tx = &ts->tx;	for (; bp < be; bp += 128) {		do {			if (tx->nxt) {				do

⌨️ 快捷键说明

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