📄 lmc_media.c
字号:
sc->lmc_miireg16 |= LMC_MII16_DS3_SCRAM; sc->ictl.scrambler_onoff = LMC_CTL_ON; } else { sc->lmc_miireg16 &= ~LMC_MII16_DS3_SCRAM; sc->ictl.scrambler_onoff = LMC_CTL_OFF; } lmc_mii_writereg (sc, 0, 16, sc->lmc_miireg16);}/* * return hardware link status. * 0 == link is down, 1 == link is up. */static intlmc_ds3_get_link_status (lmc_softc_t * const sc){ u_int16_t link_status, link_status_11; int ret = 1; lmc_mii_writereg (sc, 0, 17, 7); link_status = lmc_mii_readreg (sc, 0, 18); /* LMC5245 (DS3) & LMC1200 (DS1) LED definitions * led0 yellow = far-end adapter is in Red alarm condition * led1 blue = received an Alarm Indication signal * (upstream failure) * led2 Green = power to adapter, Gate Array loaded & driver * attached * led3 red = Loss of Signal (LOS) or out of frame (OOF) * conditions detected on T3 receive signal */ lmc_led_on(sc, LMC_DS3_LED2); if ((link_status & LMC_FRAMER_REG0_DLOS) || (link_status & LMC_FRAMER_REG0_OOFS)){ ret = 0; if(sc->last_led_err[3] != 1){ u16 r1; lmc_mii_writereg (sc, 0, 17, 01); /* Turn on Xbit error as our cisco does */ r1 = lmc_mii_readreg (sc, 0, 18); r1 &= 0xfe; lmc_mii_writereg(sc, 0, 18, r1); printk(KERN_WARNING "%s: Red Alarm - Loss of Signal or Loss of Framing\n", sc->name); } lmc_led_on(sc, LMC_DS3_LED3); /* turn on red LED */ sc->last_led_err[3] = 1; } else { lmc_led_off(sc, LMC_DS3_LED3); /* turn on red LED */ if(sc->last_led_err[3] == 1){ u16 r1; lmc_mii_writereg (sc, 0, 17, 01); /* Turn off Xbit error */ r1 = lmc_mii_readreg (sc, 0, 18); r1 |= 0x01; lmc_mii_writereg(sc, 0, 18, r1); } sc->last_led_err[3] = 0; } lmc_mii_writereg(sc, 0, 17, 0x10); link_status_11 = lmc_mii_readreg(sc, 0, 18); if((link_status & LMC_FRAMER_REG0_AIS) || (link_status_11 & LMC_FRAMER_REG10_XBIT)) { ret = 0; if(sc->last_led_err[0] != 1){ printk(KERN_WARNING "%s: AIS Alarm or XBit Error\n", sc->name); printk(KERN_WARNING "%s: Remote end has loss of signal or framing\n", sc->name); } lmc_led_on(sc, LMC_DS3_LED0); sc->last_led_err[0] = 1; } else { lmc_led_off(sc, LMC_DS3_LED0); sc->last_led_err[0] = 0; } lmc_mii_writereg (sc, 0, 17, 9); link_status = lmc_mii_readreg (sc, 0, 18); if(link_status & LMC_FRAMER_REG9_RBLUE){ ret = 0; if(sc->last_led_err[1] != 1){ printk(KERN_WARNING "%s: Blue Alarm - Receiving all 1's\n", sc->name); } lmc_led_on(sc, LMC_DS3_LED1); sc->last_led_err[1] = 1; } else { lmc_led_off(sc, LMC_DS3_LED1); sc->last_led_err[1] = 0; } return ret;}/* * 0 == 16bit, 1 == 32bit */static voidlmc_ds3_set_crc_length (lmc_softc_t * const sc, int state){ if (state == LMC_CTL_CRC_LENGTH_32) { /* 32 bit */ sc->lmc_miireg16 |= LMC_MII16_DS3_CRC; sc->ictl.crc_length = LMC_CTL_CRC_LENGTH_32; } else { /* 16 bit */ sc->lmc_miireg16 &= ~LMC_MII16_DS3_CRC; sc->ictl.crc_length = LMC_CTL_CRC_LENGTH_16; } lmc_mii_writereg (sc, 0, 16, sc->lmc_miireg16);}static voidlmc_ds3_watchdog (lmc_softc_t * const sc){ }/* * SSI methods */static voidlmc_ssi_init (lmc_softc_t * const sc){ u_int16_t mii17; int cable; sc->ictl.cardtype = LMC_CTL_CARDTYPE_LMC1000; mii17 = lmc_mii_readreg (sc, 0, 17); cable = (mii17 & LMC_MII17_SSI_CABLE_MASK) >> LMC_MII17_SSI_CABLE_SHIFT; sc->ictl.cable_type = cable; lmc_gpio_mkoutput (sc, LMC_GEP_SSI_TXCLOCK);}static voidlmc_ssi_default (lmc_softc_t * const sc){ sc->lmc_miireg16 = LMC_MII16_LED_ALL; /* * make TXCLOCK always be an output */ lmc_gpio_mkoutput (sc, LMC_GEP_SSI_TXCLOCK); sc->lmc_media->set_link_status (sc, LMC_LINK_DOWN); sc->lmc_media->set_clock_source (sc, LMC_CTL_CLOCK_SOURCE_EXT); sc->lmc_media->set_speed (sc, NULL); sc->lmc_media->set_crc_length (sc, LMC_CTL_CRC_LENGTH_16);}/* * Given a user provided state, set ourselves up to match it. This will * always reset the card if needed. */static voidlmc_ssi_set_status (lmc_softc_t * const sc, lmc_ctl_t * ctl){ if (ctl == NULL) { sc->lmc_media->set_clock_source (sc, sc->ictl.clock_source); sc->lmc_media->set_speed (sc, &sc->ictl); lmc_set_protocol (sc, NULL); return; } /* * check for change in clock source */ if (ctl->clock_source == LMC_CTL_CLOCK_SOURCE_INT && sc->ictl.clock_source == LMC_CTL_CLOCK_SOURCE_EXT) { sc->lmc_media->set_clock_source (sc, LMC_CTL_CLOCK_SOURCE_INT); sc->lmc_timing = LMC_CTL_CLOCK_SOURCE_INT; } else if (ctl->clock_source == LMC_CTL_CLOCK_SOURCE_EXT && sc->ictl.clock_source == LMC_CTL_CLOCK_SOURCE_INT) { sc->lmc_media->set_clock_source (sc, LMC_CTL_CLOCK_SOURCE_EXT); sc->lmc_timing = LMC_CTL_CLOCK_SOURCE_EXT; } if (ctl->clock_rate != sc->ictl.clock_rate) sc->lmc_media->set_speed (sc, ctl); lmc_set_protocol (sc, ctl);}/* * 1 == internal, 0 == external */static voidlmc_ssi_set_clock (lmc_softc_t * const sc, int ie){ int old; old = ie; if (ie == LMC_CTL_CLOCK_SOURCE_EXT) { sc->lmc_gpio &= ~(LMC_GEP_SSI_TXCLOCK); LMC_CSR_WRITE (sc, csr_gp, sc->lmc_gpio); sc->ictl.clock_source = LMC_CTL_CLOCK_SOURCE_EXT; if(ie != old) printk (LMC_PRINTF_FMT ": clock external\n", LMC_PRINTF_ARGS); } else { sc->lmc_gpio |= LMC_GEP_SSI_TXCLOCK; LMC_CSR_WRITE (sc, csr_gp, sc->lmc_gpio); sc->ictl.clock_source = LMC_CTL_CLOCK_SOURCE_INT; if(ie != old) printk (LMC_PRINTF_FMT ": clock internal\n", LMC_PRINTF_ARGS); }}static voidlmc_ssi_set_speed (lmc_softc_t * const sc, lmc_ctl_t * ctl){ lmc_ctl_t *ictl = &sc->ictl; lmc_av9110_t *av; /* original settings for clock rate of: * 100 Khz (8,25,0,0,2) were incorrect * they should have been 80,125,1,3,3 * There are 17 param combinations to produce this freq. * For 1.5 Mhz use 120,100,1,1,2 (226 param. combinations) */ if (ctl == NULL) { av = &ictl->cardspec.ssi; ictl->clock_rate = 1500000; av->f = ictl->clock_rate; av->n = 120; av->m = 100; av->v = 1; av->x = 1; av->r = 2; write_av9110 (sc, av->n, av->m, av->v, av->x, av->r); return; } av = &ctl->cardspec.ssi; if (av->f == 0) return; ictl->clock_rate = av->f; /* really, this is the rate we are */ ictl->cardspec.ssi = *av; write_av9110 (sc, av->n, av->m, av->v, av->x, av->r);}/* * return hardware link status. * 0 == link is down, 1 == link is up. */static intlmc_ssi_get_link_status (lmc_softc_t * const sc){ u_int16_t link_status; u_int32_t ticks; int ret = 1; int hw_hdsk = 1; /* * missing CTS? Hmm. If we require CTS on, we may never get the * link to come up, so omit it in this test. * * Also, it seems that with a loopback cable, DCD isn't asserted, * so just check for things like this: * DSR _must_ be asserted. * One of DCD or CTS must be asserted. */ /* LMC 1000 (SSI) LED definitions * led0 Green = power to adapter, Gate Array loaded & * driver attached * led1 Green = DSR and DTR and RTS and CTS are set * led2 Green = Cable detected * led3 red = No timing is available from the * cable or the on-board frequency * generator. */ link_status = lmc_mii_readreg (sc, 0, 16); /* Is the transmit clock still available */ ticks = LMC_CSR_READ (sc, csr_gp_timer); ticks = 0x0000ffff - (ticks & 0x0000ffff); lmc_led_on (sc, LMC_MII16_LED0); /* ====== transmit clock determination ===== */ if (sc->lmc_timing == LMC_CTL_CLOCK_SOURCE_INT) { lmc_led_off(sc, LMC_MII16_LED3); } else if (ticks == 0 ) { /* no clock found ? */ ret = 0; if(sc->last_led_err[3] != 1){ sc->stats.tx_lossOfClockCnt++; printk(KERN_WARNING "%s: Lost Clock, Link Down\n", sc->name); } sc->last_led_err[3] = 1; lmc_led_on (sc, LMC_MII16_LED3); /* turn ON red LED */ } else { if(sc->last_led_err[3] == 1) printk(KERN_WARNING "%s: Clock Returned\n", sc->name); sc->last_led_err[3] = 0; lmc_led_off (sc, LMC_MII16_LED3); /* turn OFF red LED */ } if ((link_status & LMC_MII16_SSI_DSR) == 0) { /* Also HSSI CA */ ret = 0; hw_hdsk = 0; }#ifdef CONFIG_LMC_IGNORE_HARDWARE_HANDSHAKE if ((link_status & (LMC_MII16_SSI_CTS | LMC_MII16_SSI_DCD)) == 0){ ret = 0; hw_hdsk = 0; }#endif if(hw_hdsk == 0){ if(sc->last_led_err[1] != 1) printk(KERN_WARNING "%s: DSR not asserted\n", sc->name); sc->last_led_err[1] = 1; lmc_led_off(sc, LMC_MII16_LED1); } else { if(sc->last_led_err[1] != 0) printk(KERN_WARNING "%s: DSR now asserted\n", sc->name); sc->last_led_err[1] = 0; lmc_led_on(sc, LMC_MII16_LED1); } if(ret == 1) { lmc_led_on(sc, LMC_MII16_LED2); /* Over all good status? */ } return ret;}static voidlmc_ssi_set_link_status (lmc_softc_t * const sc, int state){ if (state == LMC_LINK_UP) { sc->lmc_miireg16 |= (LMC_MII16_SSI_DTR | LMC_MII16_SSI_RTS); printk (LMC_PRINTF_FMT ": asserting DTR and RTS\n", LMC_PRINTF_ARGS); } else { sc->lmc_miireg16 &= ~(LMC_MII16_SSI_DTR | LMC_MII16_SSI_RTS); printk (LMC_PRINTF_FMT ": deasserting DTR and RTS\n", LMC_PRINTF_ARGS); } lmc_mii_writereg (sc, 0, 16, sc->lmc_miireg16);}/* * 0 == 16bit, 1 == 32bit */static voidlmc_ssi_set_crc_length (lmc_softc_t * const sc, int state){ if (state == LMC_CTL_CRC_LENGTH_32) { /* 32 bit */ sc->lmc_miireg16 |= LMC_MII16_SSI_CRC; sc->ictl.crc_length = LMC_CTL_CRC_LENGTH_32; sc->lmc_crcSize = LMC_CTL_CRC_BYTESIZE_4; } else { /* 16 bit */ sc->lmc_miireg16 &= ~LMC_MII16_SSI_CRC; sc->ictl.crc_length = LMC_CTL_CRC_LENGTH_16; sc->lmc_crcSize = LMC_CTL_CRC_BYTESIZE_2; } lmc_mii_writereg (sc, 0, 16, sc->lmc_miireg16);}/* * These are bits to program the ssi frequency generator */static inline voidwrite_av9110_bit (lmc_softc_t * sc, int c){ /* * set the data bit as we need it. */ sc->lmc_gpio &= ~(LMC_GEP_CLK); if (c & 0x01) sc->lmc_gpio |= LMC_GEP_DATA; else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -