diff options
author | Claudio Jeker <claudio@cvs.openbsd.org> | 2006-01-26 16:51:01 +0000 |
---|---|---|
committer | Claudio Jeker <claudio@cvs.openbsd.org> | 2006-01-26 16:51:01 +0000 |
commit | 12b9837c0875f1a6ca8192700391fffc5b24b987 (patch) | |
tree | 5638dea77539d545cc5d4bdab0b6835ce0799fda | |
parent | 5bcec7ab3c66fbe81da871243c238de3b180dc52 (diff) |
Make T1 work on the dual port version. Time slot map is different than on
the single port T1 version. Most notably T1 uses now timeslots 1-24 and not
0-23 no matter what type of card.
-rw-r--r-- | sys/dev/pci/if_art.c | 53 |
1 files changed, 43 insertions, 10 deletions
diff --git a/sys/dev/pci/if_art.c b/sys/dev/pci/if_art.c index 7e3b9ecaa1f..6f2484c29f5 100644 --- a/sys/dev/pci/if_art.c +++ b/sys/dev/pci/if_art.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_art.c,v 1.12 2006/01/25 14:45:28 claudio Exp $ */ +/* $OpenBSD: if_art.c,v 1.13 2006/01/26 16:51:00 claudio Exp $ */ /* * Copyright (c) 2004,2005 Internet Business Solutions AG, Zurich, Switzerland @@ -37,7 +37,7 @@ #include <dev/pci/if_art.h> #define ART_E1_MASK 0xffffffff -#define ART_T1_MASK 0x00ffffff +#define ART_T1_MASK 0x01fffffe int art_match(struct device *, void *, void *); void art_softc_attach(struct device *, struct device *, void *); @@ -208,11 +208,25 @@ art_ioctl(struct ifnet *ifp, u_long command, caddr_t data) rv = EINVAL; break; } + if (ac->art_type == ART_SBI_SINGLE && + (IFM_SUBTYPE(ac->art_media) == IFM_TDM_T1 || + IFM_SUBTYPE(ac->art_media) == IFM_TDM_T1_AMI)) + /* + * need to adjust timeslot mask for T1 on single port + * cards. There timeslot 0-23 are usable not 1-24 + */ + tsmap >>= 1; + cc->cc_tslots = tsmap; rv = musycc_init_channel(cc, ac->art_slot); break; case SIOCGIFTIMESLOT: - rv = copyout(&cc->cc_tslots, ifr->ifr_data, sizeof(tsmap)); + tsmap = cc->cc_tslots; + if (ac->art_type == ART_SBI_SINGLE && + (IFM_SUBTYPE(ac->art_media) == IFM_TDM_T1 || + IFM_SUBTYPE(ac->art_media) == IFM_TDM_T1_AMI)) + tsmap <<= 1; + rv = copyout(&tsmap, ifr->ifr_data, sizeof(tsmap)); break; case SIOCSIFFLAGS: /* @@ -261,20 +275,39 @@ art_ifm_change(struct ifnet *ifp) return (rv); /* SUBTYPE (framing mode T1/E1) + MODE (clocking master/slave) */ - if (IFM_SUBTYPE(ifm->ifm_media) != - IFM_SUBTYPE(ac->art_media) || + if (IFM_SUBTYPE(ifm->ifm_media) != IFM_SUBTYPE(ac->art_media) || IFM_MODE(ifm->ifm_media) != IFM_MODE(ac->art_media)) { ACCOOM_PRINTF(0, ("%s: art_ifm_change type %d mode %x\n", ifp->if_xname, IFM_SUBTYPE(ifm->ifm_media), IFM_MODE(ifm->ifm_media))); + bt8370_set_frame_mode(ac, ac->art_type, IFM_SUBTYPE(ifm->ifm_media), IFM_MODE(ifm->ifm_media)); - } - if (IFM_SUBTYPE(ifm->ifm_media) != IFM_SUBTYPE(ac->art_media)) { - /* adjust timeslot map on media change */ - cc->cc_tslots = art_mask_tsmap(IFM_SUBTYPE(ifm->ifm_media), - cc->cc_tslots); + if (IFM_SUBTYPE(ifm->ifm_media) != IFM_SUBTYPE(ac->art_media)) { + /* adjust timeslot map on media change */ + cc->cc_tslots = art_mask_tsmap( + IFM_SUBTYPE(ifm->ifm_media), cc->cc_tslots); + + if (ac->art_type == ART_SBI_SINGLE && + (IFM_SUBTYPE(ifm->ifm_media) == IFM_TDM_T1 || + IFM_SUBTYPE(ifm->ifm_media) == IFM_TDM_T1_AMI) && + (IFM_SUBTYPE(ac->art_media) != IFM_TDM_T1 && + IFM_SUBTYPE(ac->art_media) != IFM_TDM_T1_AMI)) + /* + * need to adjust timeslot mask for T1 on + * single port cards. There timeslot 0-23 are + * usable not 1-24 + */ + cc->cc_tslots >>= 1; + else if (ac->art_type == ART_SBI_SINGLE && + (IFM_SUBTYPE(ifm->ifm_media) != IFM_TDM_T1 && + IFM_SUBTYPE(ifm->ifm_media) != IFM_TDM_T1_AMI) && + (IFM_SUBTYPE(ac->art_media) == IFM_TDM_T1 || + IFM_SUBTYPE(ac->art_media) == IFM_TDM_T1_AMI)) + /* undo the last adjustment */ + cc->cc_tslots <<= 1; + } /* re-init the card */ if ((rv = musycc_init_channel(cc, ac->art_slot))) |