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

📄 lmc_media.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 3 页
字号:
      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 + -