Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/pci support T1 card (LMC1200) properly. PR 12331 (pa...



details:   https://anonhg.NetBSD.org/src/rev/c12c3d543b49
branches:  trunk
changeset: 508497:c12c3d543b49
user:      itojun <itojun%NetBSD.org@localhost>
date:      Thu Apr 12 07:50:54 2001 +0000

description:
support T1 card (LMC1200) properly. PR 12331 (patch from openbsd).

change DLT type to cisco HDLC, as lmc driver is hardwired to cisco HDLC
on driver attach.  XXX we may need to revisit this, as if_spppsubr may want
to alter this later.

diffstat:

 sys/dev/pci/if_lmc.c        |   84 ++++++-
 sys/dev/pci/if_lmc_common.c |    5 +-
 sys/dev/pci/if_lmc_media.c  |  537 ++++++++++++++++++++++++++++++++++++++-----
 sys/dev/pci/if_lmc_nbsd.c   |   37 +-
 sys/dev/pci/if_lmc_types.h  |    6 +-
 sys/dev/pci/if_lmcioctl.h   |  170 +++++++++----
 sys/dev/pci/if_lmcvar.h     |   43 +--
 7 files changed, 713 insertions(+), 169 deletions(-)

diffs (truncated from 1389 to 300 lines):

diff -r afe2382b5f57 -r c12c3d543b49 sys/dev/pci/if_lmc.c
--- a/sys/dev/pci/if_lmc.c      Thu Apr 12 07:48:03 2001 +0000
+++ b/sys/dev/pci/if_lmc.c      Thu Apr 12 07:50:54 2001 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if_lmc.c,v 1.7 2001/04/09 19:34:40 martin Exp $        */
+/*     $NetBSD: if_lmc.c,v 1.8 2001/04/12 07:50:54 itojun Exp $        */
 
 /*-
  * Copyright (c) 1997-1999 LAN Media Corporation (LMC)
@@ -405,6 +405,36 @@
 
        state = 0;
 
+       /*
+        * Make sure the tx jabber and rx watchdog are off,
+        * and the transmit and recieve processes are running.
+        */
+       LMC_CSR_WRITE (sc, csr_15, 0x00000011);
+       sc->lmc_cmdmode |= TULIP_CMD_TXRUN | TULIP_CMD_RXRUN;
+       LMC_CSR_WRITE (sc, csr_command, sc->lmc_cmdmode);
+
+       /* Is the transmit clock still available? */
+       ticks = LMC_CSR_READ (sc, csr_gp_timer);
+       ticks = 0x0000ffff - (ticks & 0x0000ffff);
+
+       if (ticks == 0)
+       {
+               /* no clock found ? */
+               if (sc->tx_clockState != 0)
+               {
+                       sc->tx_clockState = 0;
+                       if (sc->lmc_cardtype == LMC_CARDTYPE_SSI)
+                               lmc_led_on (sc, LMC_MII16_LED3); /* ON red */
+               }
+       else
+               if (sc->tx_clockState == 0)
+               {
+                       sc->tx_clockState = 1;
+                       if (sc->lmc_cardtype == LMC_CARDTYPE_SSI)
+                               lmc_led_off (sc, LMC_MII16_LED3); /* OFF red */
+               }
+       }
+
        link_status = sc->lmc_media->get_link_status(sc);
        ostatus = ((sc->lmc_flags & LMC_MODEMOK) == LMC_MODEMOK);
 
@@ -412,27 +442,53 @@
         * hardware level link lost, but the interface is marked as up.
         * Mark it as down.
         */
-        if (link_status == 0 && ostatus) {
+       if (link_status == LMC_LINK_DOWN && ostatus) {
                printf(LMC_PRINTF_FMT ": physical link down\n",
                       LMC_PRINTF_ARGS);
                sc->lmc_flags &= ~LMC_MODEMOK;
-               lmc_led_off(sc, LMC_MII16_LED1);
+               if (sc->lmc_cardtype == LMC_CARDTYPE_DS3 ||
+                   sc->lmc_cardtype == LMC_CARDTYPE_T1)
+                       lmc_led_on (sc, LMC_DS3_LED3 | LMC_DS3_LED2);
+                                                       /* turn on red LED */
+               else {
+                       lmc_led_off (sc, LMC_MII16_LED1);
+                       lmc_led_on (sc, LMC_MII16_LED0);
+                       if (sc->lmc_timing == LMC_CTL_CLOCK_SOURCE_EXT)
+                               lmc_led_on (sc, LMC_MII16_LED3);
+               }
+
        }
 
        /*
         * hardware link is up, but the interface is marked as down.
         * Bring it back up again.
         */
-       if (link_status != 0 && !ostatus) {
+       if (link_status != LMC_LINK_DOWN && !ostatus) {
                printf(LMC_PRINTF_FMT ": physical link up\n",
                       LMC_PRINTF_ARGS);
                if (sc->lmc_flags & LMC_IFUP)
                        lmc_ifup(sc);
                sc->lmc_flags |= LMC_MODEMOK;
-               lmc_led_on(sc, LMC_MII16_LED1); 
+               if (sc->lmc_cardtype == LMC_CARDTYPE_DS3 ||
+                   sc->lmc_cardtype == LMC_CARDTYPE_T1)
+               {
+                       sc->lmc_miireg16 |= LMC_DS3_LED3;
+                       lmc_led_off (sc, LMC_DS3_LED3);
+                                                       /* turn off red LED */
+                       lmc_led_on (sc, LMC_DS3_LED2);
+               } else {
+                       lmc_led_on (sc, LMC_MII16_LED0 | LMC_MII16_LED1
+                                   | LMC_MII16_LED2);
+                       if (sc->lmc_timing != LMC_CTL_CLOCK_SOURCE_EXT)
+                               lmc_led_off (sc, LMC_MII16_LED3);
+               }
+
                return;
        }
 
+       /* Call media specific watchdog functions */
+       sc->lmc_media->watchdog(sc);
+
        /*
         * remember the timer value
         */
@@ -455,12 +511,19 @@
        lmc_dec_reset(sc);
        lmc_reset(sc);
 
-       sc->lmc_media->set_link_status(sc, 1);
+       sc->lmc_media->set_link_status(sc, LMC_LINK_UP);
        sc->lmc_media->set_status(sc, NULL);
 
        sc->lmc_flags |= LMC_IFUP;
 
-       lmc_led_on(sc, LMC_MII16_LED1);
+       /*
+        * for DS3 & DS1 adapters light the green light, led2
+        */
+       if (sc->lmc_cardtype == LMC_CARDTYPE_DS3 ||
+           sc->lmc_cardtype == LMC_CARDTYPE_T1)
+               lmc_led_on (sc, LMC_MII16_LED2);
+       else
+               lmc_led_on (sc, LMC_MII16_LED0 | LMC_MII16_LED2);
 
        /*
         * select what interrupts we want to get
@@ -493,8 +556,8 @@
        sc->lmc_if.if_timer = 0;
        sc->lmc_flags &= ~LMC_IFUP;
 
-       sc->lmc_media->set_link_status(sc, 0);
-       lmc_led_off(sc, LMC_MII16_LED1);
+       sc->lmc_media->set_link_status(sc, LMC_LINK_DOWN);
+       lmc_led_off(sc, LMC_MII16_LED_ALL);
 
        lmc_dec_reset(sc);
        lmc_reset(sc);
@@ -1139,7 +1202,10 @@
                if (ifr->ifr_mtu > LMC_MTU) {
                        error = EINVAL;
                        goto out;
+               } else {
+                       ifp->if_mtu = ifr->ifr_mtu;
                }
+               break;
 #endif
        }
 
diff -r afe2382b5f57 -r c12c3d543b49 sys/dev/pci/if_lmc_common.c
--- a/sys/dev/pci/if_lmc_common.c       Thu Apr 12 07:48:03 2001 +0000
+++ b/sys/dev/pci/if_lmc_common.c       Thu Apr 12 07:50:54 2001 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if_lmc_common.c,v 1.4 2000/06/28 16:08:44 mrg Exp $    */
+/*     $NetBSD: if_lmc_common.c,v 1.5 2001/04/12 07:50:54 itojun Exp $ */
 
 /*-
  * Copyright (c) 1997-1999 LAN Media Corporation (LMC)
@@ -230,8 +230,7 @@
        /*
         * busy wait for the chip to reset
         */
-       while ((LMC_CSR_READ(sc, csr_gp) & LMC_GEP_DP) == 0)
-               ;
+       while ((LMC_CSR_READ(sc, csr_gp) & LMC_GEP_DP) == 0);
 
        /*
         * Call media specific init routine
diff -r afe2382b5f57 -r c12c3d543b49 sys/dev/pci/if_lmc_media.c
--- a/sys/dev/pci/if_lmc_media.c        Thu Apr 12 07:48:03 2001 +0000
+++ b/sys/dev/pci/if_lmc_media.c        Thu Apr 12 07:50:54 2001 +0000
@@ -1,10 +1,12 @@
-/*     $NetBSD: if_lmc_media.c,v 1.4 2000/06/28 16:08:45 mrg Exp $     */
+/*     $NetBSD: if_lmc_media.c,v 1.5 2001/04/12 07:50:54 itojun Exp $  */
 
 /*-
  * Copyright (c) 1997-1999 LAN Media Corporation (LMC)
  * All rights reserved.  www.lanmedia.com
  *
  * This code is written by Michael Graff <graff%vix.com@localhost> for LMC.
+ * The code is derived from permitted modifications to software created
+ * by Matt Thomas (matt%3am-software.com@localhost).
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -161,6 +163,7 @@
 static int     lmc_ds3_get_link_status(lmc_softc_t * const);
 static void    lmc_ds3_set_crc_length(lmc_softc_t * const, int);
 static void    lmc_ds3_set_scram(lmc_softc_t * const, int);
+static void    lmc_ds3_watchdog(lmc_softc_t * const);
 
 static void    lmc_hssi_init(lmc_softc_t * const);
 static void    lmc_hssi_default(lmc_softc_t * const);
@@ -169,15 +172,26 @@
 static int     lmc_hssi_get_link_status(lmc_softc_t * const);
 static void    lmc_hssi_set_link_status(lmc_softc_t * const, int);
 static void    lmc_hssi_set_crc_length(lmc_softc_t * const, int);
+static void    lmc_hssi_watchdog(lmc_softc_t * const);
+
+static void    lmc_ssi_init(lmc_softc_t * const);
+static void    lmc_ssi_default(lmc_softc_t * const);
+static void    lmc_ssi_set_status(lmc_softc_t * const, lmc_ctl_t *);
+static void    lmc_ssi_set_clock(lmc_softc_t * const, int);
+static void    lmc_ssi_set_speed(lmc_softc_t * const, lmc_ctl_t *);
+static int     lmc_ssi_get_link_status(lmc_softc_t * const);
+static void    lmc_ssi_set_link_status(lmc_softc_t * const, int);
+static void    lmc_ssi_set_crc_length(lmc_softc_t * const, int);
+static void    lmc_ssi_watchdog(lmc_softc_t * const);
 
 static void    lmc_t1_init(lmc_softc_t * const);
 static void    lmc_t1_default(lmc_softc_t * const);
 static void    lmc_t1_set_status(lmc_softc_t * const, lmc_ctl_t *);
+static int     lmc_t1_get_link_status(lmc_softc_t * const);
+static void    lmc_t1_set_circuit_type(lmc_softc_t * const, int);
+static void    lmc_t1_set_crc_length(lmc_softc_t * const, int);
 static void    lmc_t1_set_clock(lmc_softc_t * const, int);
-static void    lmc_t1_set_speed(lmc_softc_t * const, lmc_ctl_t *);
-static int     lmc_t1_get_link_status(lmc_softc_t * const);
-static void    lmc_t1_set_link_status(lmc_softc_t * const, int);
-static void    lmc_t1_set_crc_length(lmc_softc_t * const, int);
+static void    lmc_t1_watchdog(lmc_softc_t * const);
 
 static void    lmc_dummy_set_1(lmc_softc_t * const, int);
 static void    lmc_dummy_set2_1(lmc_softc_t * const, lmc_ctl_t *);
@@ -197,6 +211,8 @@
        lmc_ds3_get_link_status,        /* get link status */
        lmc_dummy_set_1,                /* set link status */
        lmc_ds3_set_crc_length,         /* set CRC length */
+       lmc_dummy_set_1,                /* set T1 or E1 circuit type */
+       lmc_ds3_watchdog
 };
 
 lmc_media_t lmc_hssi_media = {
@@ -210,6 +226,23 @@
        lmc_hssi_get_link_status,       /* get link status */
        lmc_hssi_set_link_status,       /* set link status */
        lmc_hssi_set_crc_length,        /* set CRC length */
+       lmc_dummy_set_1,                /* set T1 or E1 circuit type */
+       lmc_hssi_watchdog
+};
+
+lmc_media_t lmc_ssi_media = {
+       lmc_ssi_init,                   /* special media init stuff */
+       lmc_ssi_default,                /* reset to default state */
+       lmc_ssi_set_status,             /* reset status to state provided */
+       lmc_ssi_set_clock,              /* set clock source */
+       lmc_ssi_set_speed,              /* set line speed */
+       lmc_dummy_set_1,                /* set cable length */
+       lmc_dummy_set_1,                /* set scrambler */
+       lmc_ssi_get_link_status,        /* get link status */
+       lmc_ssi_set_link_status,        /* set link status */
+       lmc_ssi_set_crc_length,         /* set CRC length */
+       lmc_dummy_set_1,                /* set T1 or E1 circuit type */
+       lmc_ssi_watchdog
 };
 
 lmc_media_t lmc_t1_media = {
@@ -217,12 +250,14 @@
        lmc_t1_default,                 /* reset to default state */
        lmc_t1_set_status,              /* reset status to state provided */
        lmc_t1_set_clock,               /* set clock source */
-       lmc_t1_set_speed,               /* set line speed */
+       lmc_dummy_set2_1,               /* set line speed */
        lmc_dummy_set_1,                /* set cable length */
        lmc_dummy_set_1,                /* set scrambler */
        lmc_t1_get_link_status,         /* get link status */
-       lmc_t1_set_link_status,         /* set link status */
+       lmc_dummy_set_1,                /* set link status */
        lmc_t1_set_crc_length,          /* set CRC length */
+       lmc_t1_set_circuit_type,        /* set T1 or E1 circuit type */
+       lmc_t1_watchdog
 };
 
 static void
@@ -274,10 +309,13 @@
        /*
         * check for change in clock source
         */
-       if (ctl->clock_source && !sc->ictl.clock_source)
+       if (ctl->clock_source && !sc->ictl.clock_source) {
                sc->lmc_media->set_clock_source(sc, LMC_CTL_CLOCK_SOURCE_INT);
-       else if (!ctl->clock_source && sc->ictl.clock_source)
+               sc->lmc_timing = LMC_CTL_CLOCK_SOURCE_INT;
+       } else if (!ctl->clock_source && sc->ictl.clock_source) {
+               sc->lmc_timing = LMC_CTL_CLOCK_SOURCE_EXT;
                sc->lmc_media->set_clock_source(sc, LMC_CTL_CLOCK_SOURCE_EXT);
+       }
 
        lmc_set_protocol(sc, ctl);
 }
@@ -350,6 +388,23 @@
        lmc_mii_writereg(sc, 0, 16, sc->lmc_miireg16);
 }
 
+static void
+lmc_hssi_watchdog (lmc_softc_t * const sc)
+{
+       /* HSSI is blank */
+}
+
+static void



Home | Main Index | Thread Index | Old Index