📄 x400p-ss7.c
字号:
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 + -