Print this page
212 Atheros AR8132 / L1c Gigabit Ethernet Adapter

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/io/atge/atge_main.c
          +++ new/usr/src/uts/common/io/atge/atge_main.c
↓ open down ↓ 12 lines elided ↑ open up ↑
  13   13   * When distributing Covered Code, include this CDDL HEADER in each
  14   14   * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15   15   * If applicable, add the following below this CDDL HEADER, with the
  16   16   * fields enclosed by brackets "[]" replaced with your own identifying
  17   17   * information: Portions Copyright [yyyy] [name of copyright owner]
  18   18   *
  19   19   * CDDL HEADER END
  20   20   */
  21   21  
  22   22  /*
       23 + * Copyright (c) 2012 Gary Mills
       24 + *
  23   25   * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
  24   26   */
       27 +/*
       28 + * Copyright (c) 2009, Pyun YongHyeon <yongari@FreeBSD.org>
       29 + * All rights reserved.
       30 + *
       31 + * Redistribution and use in source and binary forms, with or without
       32 + * modification, are permitted provided that the following conditions
       33 + * are met:
       34 + * 1. Redistributions of source code must retain the above copyright
       35 + *    notice unmodified, this list of conditions, and the following
       36 + *    disclaimer.
       37 + * 2. Redistributions in binary form must reproduce the above copyright
       38 + *    notice, this list of conditions and the following disclaimer in the
       39 + *    documentation and/or other materials provided with the distribution.
       40 + *
       41 + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
       42 + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
       43 + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
       44 + * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
       45 + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
       46 + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
       47 + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
       48 + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
       49 + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
       50 + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
       51 + * SUCH DAMAGE.
       52 + */
  25   53  
  26   54  #include <sys/types.h>
  27   55  #include <sys/stream.h>
  28   56  #include <sys/strsun.h>
  29   57  #include <sys/stat.h>
  30   58  #include <sys/modctl.h>
  31   59  #include <sys/kstat.h>
  32   60  #include <sys/ethernet.h>
  33   61  #include <sys/devops.h>
  34   62  #include <sys/debug.h>
↓ open down ↓ 11 lines elided ↑ open up ↑
  46   74  #include <sys/note.h>
  47   75  #include <sys/vlan.h>
  48   76  #include <sys/strsubr.h>
  49   77  #include <sys/crc32.h>
  50   78  #include <sys/sdt.h>
  51   79  #include <sys/pci.h>
  52   80  #include <sys/pci_cap.h>
  53   81  
  54   82  #include "atge.h"
  55   83  #include "atge_cmn_reg.h"
       84 +#include "atge_l1c_reg.h"
  56   85  #include "atge_l1e_reg.h"
  57   86  #include "atge_l1_reg.h"
  58   87  
  59   88  
  60   89  /*
  61      - * Atheros/Attansic Ethernet chips are of three types - L1, L2 and L1E.
  62      - * This driver is for L1E/L1 but can be extended to support other chips.
       90 + * Atheros/Attansic Ethernet chips are of four types - L1, L2, L1E and L1C.
       91 + * This driver is for L1E/L1/L1C but can be extended to support other chips.
  63   92   * L1E comes in 1Gigabit and Fast Ethernet flavors. L1 comes in 1Gigabit
  64      - * flavors only.
       93 + * flavors only.  L1C comes in both flavours.
  65   94   *
  66   95   * Atheros/Attansic Ethernet controllers have descriptor based TX and RX
  67   96   * with an exception of L1E. L1E's RX side is not descriptor based ring.
  68   97   * The L1E's RX uses pages (not to be confused with MMU pages) for
  69   98   * receiving pkts. The header has four fields :
  70   99   *
  71  100   *        uint32_t seqno;    Sequence number of the frame.
  72  101   *        uint32_t length;   Length of the frame.
  73  102   *        uint32_t flags;    Flags
  74  103   *        uint32_t vtag;     We don't use hardware VTAG.
↓ open down ↓ 70 lines elided ↑ open up ↑
 145  174  void    atge_l1e_send_packet(atge_ring_t *);
 146  175  mblk_t  *atge_l1e_receive(atge_t *);
 147  176  uint_t  atge_l1e_interrupt(caddr_t, caddr_t);
 148  177  void    atge_l1e_gather_stats(atge_t *);
 149  178  void    atge_l1e_clear_stats(atge_t *);
 150  179  
 151  180  /*
 152  181   * L1 specific functions.
 153  182   */
 154  183  int     atge_l1_alloc_dma(atge_t *);
      184 +void    atge_l1_free_dma(atge_t *);
 155  185  void    atge_l1_init_tx_ring(atge_t *);
 156  186  void    atge_l1_init_rx_ring(atge_t *);
 157  187  void    atge_l1_init_rr_ring(atge_t *);
 158  188  void    atge_l1_init_cmb(atge_t *);
 159  189  void    atge_l1_init_smb(atge_t *);
 160  190  void    atge_l1_program_dma(atge_t *);
 161  191  void    atge_l1_stop_tx_mac(atge_t *);
 162  192  void    atge_l1_stop_rx_mac(atge_t *);
 163  193  uint_t  atge_l1_interrupt(caddr_t, caddr_t);
 164  194  void    atge_l1_send_packet(atge_ring_t *);
 165  195  
      196 +/*
      197 + * L1C specific functions.
      198 + */
      199 +int     atge_l1c_alloc_dma(atge_t *);
      200 +void    atge_l1c_free_dma(atge_t *);
      201 +void    atge_l1c_init_tx_ring(atge_t *);
      202 +void    atge_l1c_init_rx_ring(atge_t *);
      203 +void    atge_l1c_init_rr_ring(atge_t *);
      204 +void    atge_l1c_init_cmb(atge_t *);
      205 +void    atge_l1c_init_smb(atge_t *);
      206 +void    atge_l1c_program_dma(atge_t *);
      207 +void    atge_l1c_stop_tx_mac(atge_t *);
      208 +void    atge_l1c_stop_rx_mac(atge_t *);
      209 +uint_t  atge_l1c_interrupt(caddr_t, caddr_t);
      210 +void    atge_l1c_send_packet(atge_ring_t *);
      211 +void    atge_l1c_gather_stats(atge_t *);
      212 +void    atge_l1c_clear_stats(atge_t *);
 166  213  
 167  214  /*
 168  215   * Function prototyps for MII operations.
 169  216   */
 170  217  uint16_t        atge_mii_read(void *, uint8_t, uint8_t);
 171  218  void    atge_mii_write(void *, uint8_t, uint8_t, uint16_t);
      219 +uint16_t        atge_l1c_mii_read(void *, uint8_t, uint8_t);
      220 +void    atge_l1c_mii_write(void *, uint8_t, uint8_t, uint16_t);
 172  221  void    atge_l1e_mii_reset(void *);
 173  222  void    atge_l1_mii_reset(void *);
      223 +void    atge_l1c_mii_reset(void *);
 174  224  static void     atge_mii_notify(void *, link_state_t);
 175  225  void    atge_tx_reclaim(atge_t *atgep, int cons);
 176  226  
 177  227  /*
 178  228   * L1E/L2E chip.
 179  229   */
 180  230  static  mii_ops_t atge_l1e_mii_ops = {
 181  231          MII_OPS_VERSION,
 182  232          atge_mii_read,
 183  233          atge_mii_write,
↓ open down ↓ 6 lines elided ↑ open up ↑
 190  240   */
 191  241  static  mii_ops_t atge_l1_mii_ops = {
 192  242          MII_OPS_VERSION,
 193  243          atge_mii_read,
 194  244          atge_mii_write,
 195  245          atge_mii_notify,
 196  246          atge_l1_mii_reset
 197  247  };
 198  248  
 199  249  /*
      250 + * L1C chip.
      251 + */
      252 +static  mii_ops_t atge_l1c_mii_ops = {
      253 +        MII_OPS_VERSION,
      254 +        atge_l1c_mii_read,
      255 +        atge_l1c_mii_write,
      256 +        atge_mii_notify,
      257 +        NULL
      258 +};
      259 +
      260 +/*
 200  261   * Function Prototypes for MAC callbacks.
 201  262   */
 202  263  static int      atge_m_stat(void *, uint_t, uint64_t *);
 203  264  static int      atge_m_start(void *);
 204  265  static void     atge_m_stop(void *);
 205  266  static int      atge_m_getprop(void *, const char *, mac_prop_id_t, uint_t,
 206  267      void *);
 207  268  static int      atge_m_setprop(void *, const char *, mac_prop_id_t, uint_t,
 208  269      const void *);
 209  270  static void     atge_m_propinfo(void *, const char *, mac_prop_id_t,
↓ open down ↓ 55 lines elided ↑ open up ↑
 265  326          0x0000ffffffffull,      /* dma_attr_seg */
 266  327          1,                      /* dma_attr_sgllen */
 267  328          1,                      /* dma_attr_granular */
 268  329          0                       /* dma_attr_flags */
 269  330  };
 270  331  
 271  332  /*
 272  333   * Table of supported devices.
 273  334   */
 274  335  #define ATGE_VENDOR_ID  0x1969
      336 +#define ATGE_L1_STR     "Attansic L1"
      337 +#define ATGE_L1CG_STR   "Atheros AR8131 Gigabit Ethernet"
      338 +#define ATGE_L1CF_STR   "Atheros AR8132 Fast Ethernet"
 275  339  #define ATGE_L1E_STR    "Atheros AR8121/8113/8114"
      340 +#define ATGE_AR8151V1_STR       "Atheros AR8151 v1.0 Gigabit Ethernet"
      341 +#define ATGE_AR8151V2_STR       "Atheros AR8151 v2.0 Gigabit Ethernet"
      342 +#define ATGE_AR8152V1_STR       "Atheros AR8152 v1.1 Fast Ethernet"
      343 +#define ATGE_AR8152V2_STR       "Atheros AR8152 v2.0 Fast Ethernet"
 276  344  
 277  345  static atge_cards_t atge_cards[] = {
      346 +        {ATGE_VENDOR_ID, ATGE_CHIP_AR8151V2_DEV_ID, ATGE_AR8151V2_STR,
      347 +            ATGE_CHIP_L1C},
      348 +        {ATGE_VENDOR_ID, ATGE_CHIP_AR8151V1_DEV_ID, ATGE_AR8151V1_STR,
      349 +            ATGE_CHIP_L1C},
      350 +        {ATGE_VENDOR_ID, ATGE_CHIP_AR8152V2_DEV_ID, ATGE_AR8152V2_STR,
      351 +            ATGE_CHIP_L1C},
      352 +        {ATGE_VENDOR_ID, ATGE_CHIP_AR8152V1_DEV_ID, ATGE_AR8152V1_STR,
      353 +            ATGE_CHIP_L1C},
      354 +        {ATGE_VENDOR_ID, ATGE_CHIP_L1CG_DEV_ID, ATGE_L1CG_STR, ATGE_CHIP_L1C},
      355 +        {ATGE_VENDOR_ID, ATGE_CHIP_L1CF_DEV_ID, ATGE_L1CF_STR, ATGE_CHIP_L1C},
 278  356          {ATGE_VENDOR_ID, ATGE_CHIP_L1E_DEV_ID, ATGE_L1E_STR, ATGE_CHIP_L1E},
 279      -        {ATGE_VENDOR_ID, ATGE_CHIP_L1_DEV_ID, "Attansic L1", ATGE_CHIP_L1},
      357 +        {ATGE_VENDOR_ID, ATGE_CHIP_L1_DEV_ID, ATGE_L1_STR, ATGE_CHIP_L1},
 280  358  };
 281  359  
 282  360  /*
 283  361   * Global Debugging flag. Developer level debugging is done only in DEBUG mode.
 284  362   */
 285  363  int     atge_debug = 1;
 286  364  
 287  365  /*
 288  366   * Debugging and error reporting.
 289  367   */
↓ open down ↓ 3 lines elided ↑ open up ↑
 293  371          va_list ap;
 294  372          char    buf[256];
 295  373  
 296  374          va_start(ap, fmt);
 297  375          (void) vsnprintf(buf, sizeof (buf), fmt, ap);
 298  376          va_end(ap);
 299  377  
 300  378          DTRACE_PROBE1(atge__debug, char *, buf);
 301  379  }
 302  380  
      381 +static
 303  382  void
 304      -atge_error(dev_info_t *dip, char *fmt, ...)
      383 +atge_message(dev_info_t *dip, int level, char *fmt, va_list ap)
 305  384  {
 306      -        va_list ap;
 307  385          char    buf[256];
      386 +        char    *p = "!%s%d: %s";
      387 +        char    *q = "!atge: %s";
 308  388  
 309      -        va_start(ap, fmt);
 310  389          (void) vsnprintf(buf, sizeof (buf), fmt, ap);
 311      -        va_end(ap);
 312  390  
      391 +        if (level != CE_NOTE) {
      392 +                p++;
      393 +                q++;
      394 +        }
      395 +
 313  396          if (dip) {
 314      -                cmn_err(CE_WARN, "%s%d: %s",
      397 +                cmn_err(level, p,
 315  398                      ddi_driver_name(dip), ddi_get_instance(dip), buf);
 316  399          } else {
 317      -                cmn_err(CE_WARN, "atge: %s", buf);
      400 +                cmn_err(level, q, buf);
 318  401          }
 319  402  }
 320  403  
 321  404  void
      405 +atge_notice(dev_info_t *dip, char *fmt, ...)
      406 +{
      407 +        va_list ap;
      408 +
      409 +        va_start(ap, fmt);
      410 +        (void) atge_message(dip, CE_NOTE, fmt, ap);
      411 +        va_end(ap);
      412 +}
      413 +
      414 +void
      415 +atge_error(dev_info_t *dip, char *fmt, ...)
      416 +{
      417 +        va_list ap;
      418 +
      419 +        va_start(ap, fmt);
      420 +        (void) atge_message(dip, CE_WARN, fmt, ap);
      421 +        va_end(ap);
      422 +}
      423 +
      424 +void
 322  425  atge_mac_config(atge_t *atgep)
 323  426  {
 324  427          uint32_t reg;
 325  428          int speed;
 326  429          link_duplex_t ld;
 327  430  
      431 +        /* Re-enable TX/RX MACs */
 328  432          reg = INL(atgep, ATGE_MAC_CFG);
 329  433          reg &= ~(ATGE_CFG_FULL_DUPLEX | ATGE_CFG_TX_FC | ATGE_CFG_RX_FC |
 330  434              ATGE_CFG_SPEED_MASK);
 331  435  
      436 +        switch (ATGE_MODEL(atgep)) {
      437 +        case ATGE_CHIP_L1C:
      438 +                switch (ATGE_DID(atgep)) {
      439 +                case ATGE_CHIP_AR8151V2_DEV_ID:
      440 +                case ATGE_CHIP_AR8151V1_DEV_ID:
      441 +                case ATGE_CHIP_AR8152V2_DEV_ID:
      442 +                        reg |= ATGE_CFG_HASH_ALG_CRC32 | ATGE_CFG_SPEED_MODE_SW;
      443 +                        break;
      444 +                }
      445 +                break;
      446 +        }
      447 +
 332  448          speed = mii_get_speed(atgep->atge_mii);
 333  449          switch (speed) {
 334  450          case 10:
 335  451          case 100:
 336  452                  reg |= ATGE_CFG_SPEED_10_100;
 337  453                  break;
 338  454          case 1000:
 339  455                  reg |= ATGE_CFG_SPEED_1000;
 340  456                  break;
 341  457          }
 342  458  
 343  459          ld = mii_get_duplex(atgep->atge_mii);
 344  460          if (ld == LINK_DUPLEX_FULL)
 345  461                  reg |= ATGE_CFG_FULL_DUPLEX;
 346  462  
 347  463          /* Re-enable TX/RX MACs */
 348      -        if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E) {
      464 +        switch (ATGE_MODEL(atgep)) {
      465 +        case ATGE_CHIP_L1E:
 349  466                  reg |= ATGE_CFG_TX_ENB | ATGE_CFG_RX_ENB | ATGE_CFG_RX_FC;
 350      -        } else if (ATGE_MODEL(atgep) == ATGE_CHIP_L1) {
      467 +                break;
      468 +        case ATGE_CHIP_L1:
      469 +        case ATGE_CHIP_L1C:
 351  470                  reg |= ATGE_CFG_TX_ENB | ATGE_CFG_RX_ENB;
      471 +                break;
 352  472          }
 353  473  
 354  474          OUTL(atgep, ATGE_MAC_CFG, reg);
 355  475  
 356      -        if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E) {
      476 +        switch (ATGE_MODEL(atgep)) {
      477 +        case ATGE_CHIP_L1E:
 357  478                  reg = ATGE_USECS(ATGE_IM_RX_TIMER_DEFAULT) << IM_TIMER_RX_SHIFT;
 358  479                  reg |= ATGE_USECS(ATGE_IM_TX_TIMER_DEFAULT) <<
 359  480                      IM_TIMER_TX_SHIFT;
 360  481                  OUTL(atgep, ATGE_IM_TIMER, reg);
      482 +                break;
      483 +        case ATGE_CHIP_L1:
      484 +                break;
      485 +        case ATGE_CHIP_L1C:
      486 +                /* Configure interrupt moderation timer. */
      487 +                reg = ATGE_USECS(atgep->atge_int_rx_mod) << IM_TIMER_RX_SHIFT;
      488 +                reg |= ATGE_USECS(atgep->atge_int_tx_mod) << IM_TIMER_TX_SHIFT;
      489 +                OUTL(atgep, ATGE_IM_TIMER, reg);
      490 +                /*
      491 +                 * We don't want to automatic interrupt clear as task queue
      492 +                 * for the interrupt should know interrupt status.
      493 +                 */
      494 +                reg = 0;
      495 +                if (ATGE_USECS(atgep->atge_int_rx_mod) != 0)
      496 +                        reg |= MASTER_IM_RX_TIMER_ENB;
      497 +                if (ATGE_USECS(atgep->atge_int_tx_mod) != 0)
      498 +                        reg |= MASTER_IM_TX_TIMER_ENB;
      499 +                OUTL(atgep, ATGE_MASTER_CFG, reg);
      500 +                break;
 361  501          }
 362  502  
 363  503          ATGE_DB(("%s: %s() mac_cfg is : %x",
 364  504              atgep->atge_name, __func__, INL(atgep, ATGE_MAC_CFG)));
 365  505  }
 366  506  
 367  507  static void
 368  508  atge_mii_notify(void *arg, link_state_t link)
 369  509  {
 370  510          atge_t *atgep = arg;
↓ open down ↓ 145 lines elided ↑ open up ↑
 516  656                  }
 517  657                  kmem_free(atgep->atge_intr_handle, atgep->atge_intr_size);
 518  658  
 519  659                  return (DDI_FAILURE);
 520  660          }
 521  661  
 522  662          /*
 523  663           * Add interrupt handler now.
 524  664           */
 525  665          for (i = 0; i < atgep->atge_intr_cnt; i++) {
 526      -                if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E) {
      666 +                switch (ATGE_MODEL(atgep)) {
      667 +                case ATGE_CHIP_L1E:
 527  668                          err = ddi_intr_add_handler(atgep->atge_intr_handle[i],
 528  669                              atge_l1e_interrupt, atgep, (caddr_t)(uintptr_t)i);
 529      -                } else if (ATGE_MODEL(atgep) == ATGE_CHIP_L1) {
      670 +                        break;
      671 +                case ATGE_CHIP_L1:
 530  672                          err = ddi_intr_add_handler(atgep->atge_intr_handle[i],
 531  673                              atge_l1_interrupt, atgep, (caddr_t)(uintptr_t)i);
      674 +                        break;
      675 +                case ATGE_CHIP_L1C:
      676 +                        err = ddi_intr_add_handler(atgep->atge_intr_handle[i],
      677 +                            atge_l1c_interrupt, atgep, (caddr_t)(uintptr_t)i);
      678 +                        break;
 532  679                  }
 533  680  
 534  681                  if (err != DDI_SUCCESS) {
 535  682                          atge_error(atgep->atge_dip,
 536  683                              "ddi_intr_add_handler failed : %d", err);
 537  684  
 538  685                          (void) ddi_intr_free(atgep->atge_intr_handle[i]);
 539  686                          while (--i >= 0) {
 540  687                                  (void) ddi_intr_remove_handler(
 541  688                                      atgep->atge_intr_handle[i]);
↓ open down ↓ 160 lines elided ↑ open up ↑
 702  849          int i;
 703  850  
 704  851          vid = pci_config_get16(atgep->atge_conf_handle, PCI_CONF_VENID);
 705  852          did = pci_config_get16(atgep->atge_conf_handle, PCI_CONF_DEVID);
 706  853  
 707  854          atgep->atge_model = 0;
 708  855          for (i = 0; i < (sizeof (atge_cards) / sizeof (atge_cards_t)); i++) {
 709  856                  if (atge_cards[i].vendor_id == vid &&
 710  857                      atge_cards[i].device_id == did) {
 711  858                          atgep->atge_model = atge_cards[i].model;
      859 +                        atgep->atge_vid = vid;
      860 +                        atgep->atge_did = did;
 712  861                          atgep->atge_revid =
 713  862                              pci_config_get8(atgep->atge_conf_handle,
 714  863                              PCI_CONF_REVID);
      864 +                        atge_notice(atgep->atge_dip, "PCI-ID pci%x,%x,%x: %s",
      865 +                            vid, did, atgep->atge_revid,
      866 +                            atge_cards[i].cardname);
 715  867                          ATGE_DB(("%s: %s : PCI-ID pci%x,%x and model : %d",
 716  868                              atgep->atge_name, __func__, vid, did,
 717  869                              atgep->atge_model));
 718  870  
 719  871                          return (DDI_SUCCESS);
 720  872                  }
 721  873          }
 722  874  
 723  875          atge_error(atgep->atge_dip, "atge driver is attaching to unknown"
 724      -            " pci%d,%d vendor/device-id card", vid, did);
      876 +            " pci%x,%x vendor/device-id card", vid, did);
 725  877  
 726  878          /*
 727      -         * Assume it's L1 chip.
      879 +         * Assume it's L1C chip.
 728  880           */
 729      -        atgep->atge_model = ATGE_CHIP_L1;
      881 +        atgep->atge_model = ATGE_CHIP_L1C;
      882 +        atgep->atge_vid = vid;
      883 +        atgep->atge_did = did;
 730  884          atgep->atge_revid = pci_config_get8(atgep->atge_conf_handle,
 731  885              PCI_CONF_REVID);
 732  886  
 733  887          /*
 734  888           * We will leave the decision to caller.
 735  889           */
 736  890          return (DDI_FAILURE);
 737  891  }
 738  892  
 739  893  int
↓ open down ↓ 27 lines elided ↑ open up ↑
 767  921              atgep->atge_ether_addr[3],
 768  922              atgep->atge_ether_addr[4],
 769  923              atgep->atge_ether_addr[5]));
 770  924  
 771  925          bcopy(atgep->atge_ether_addr, atgep->atge_dev_addr, ETHERADDRL);
 772  926  
 773  927          return (DDI_SUCCESS);
 774  928  }
 775  929  
 776  930  /*
 777      - * Reset functionality for L1 and L1E. It's same.
      931 + * Reset functionality for L1, L1E, and L1C. It's same.
 778  932   */
 779  933  static void
 780  934  atge_device_reset(atge_t *atgep)
 781  935  {
 782      -        if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E ||
 783      -            ATGE_MODEL(atgep) == ATGE_CHIP_L1)
      936 +        switch (ATGE_MODEL(atgep)) {
      937 +        case ATGE_CHIP_L1E:
      938 +        case ATGE_CHIP_L1:
      939 +        case ATGE_CHIP_L1C:
 784  940                  atge_device_reset_l1_l1e(atgep);
      941 +                break;
      942 +        }
 785  943  }
 786  944  
 787  945  void
 788  946  atge_device_reset_l1_l1e(atge_t *atgep)
 789  947  {
 790  948          uint32_t reg;
 791  949          int t;
 792      -
 793      -        OUTL(atgep, ATGE_MASTER_CFG, MASTER_RESET);
      950 +        switch (ATGE_MODEL(atgep)) {
      951 +        case ATGE_CHIP_L1C:
      952 +                OUTL(atgep, ATGE_MASTER_CFG, MASTER_RESET | 0x40);
      953 +                break;
      954 +        default:
      955 +                OUTL(atgep, ATGE_MASTER_CFG, MASTER_RESET);
      956 +                break;
      957 +        }
 794  958          reg = INL(atgep, ATGE_MASTER_CFG);
 795  959          for (t = ATGE_RESET_TIMEOUT; t > 0; t--) {
 796  960                  drv_usecwait(10);
 797  961                  reg = INL(atgep, ATGE_MASTER_CFG);
 798  962                  if ((reg & MASTER_RESET) == 0)
 799  963                          break;
 800  964          }
 801  965  
 802  966          if (t == 0) {
 803  967                  atge_error(atgep->atge_dip, " master reset timeout reg : %x",
↓ open down ↓ 5 lines elided ↑ open up ↑
 809  973                          break;
 810  974  
 811  975                  drv_usecwait(10);
 812  976          }
 813  977  
 814  978          if (t == 0) {
 815  979                  atge_error(atgep->atge_dip, "device reset timeout reg : %x",
 816  980                      reg);
 817  981          }
 818  982  
 819      -        /*
 820      -         * Initialize PCIe module. These values came from FreeBSD and
 821      -         * we don't know the meaning of it.
 822      -         */
 823      -        OUTL(atgep, 0x12FC, 0x6500);
 824      -        reg = INL(atgep, 0x1008) | 0x8000;
 825      -        OUTL(atgep, 0x1008, reg);
      983 +        switch (ATGE_MODEL(atgep)) {
      984 +        case ATGE_CHIP_L1E:
      985 +        case ATGE_CHIP_L1:
      986 +                /*
      987 +                 * Initialize PCIe module. These values came from FreeBSD and
      988 +                 * we don't know the meaning of it.
      989 +                 */
      990 +                OUTL(atgep, ATGE_LTSSM_ID_CFG, 0x6500);
      991 +                reg = INL(atgep, 0x1008) | 0x8000;
      992 +                OUTL(atgep, 0x1008, reg);
      993 +                break;
      994 +        case ATGE_CHIP_L1C:
      995 +                break;
      996 +        }
 826  997  
 827  998          /*
 828  999           * Get chip revision.
 829 1000           */
 830 1001          atgep->atge_chip_rev = INL(atgep, ATGE_MASTER_CFG) >>
 831 1002              MASTER_CHIP_REV_SHIFT;
 832 1003  
 833 1004          ATGE_DB(("%s: %s reset successfully rev : %x", atgep->atge_name,
 834 1005              __func__, atgep->atge_chip_rev));
 835 1006  }
 836 1007  
 837 1008  /*
 838 1009   * DMA allocation for L1 and L1E is bit different since L1E uses RX pages
 839 1010   * instead of descriptor based RX model.
 840 1011   */
 841 1012  static int
 842 1013  atge_alloc_dma(atge_t *atgep)
 843 1014  {
 844 1015          int err = DDI_FAILURE;
 845 1016  
 846      -        if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E) {
     1017 +        switch (ATGE_MODEL(atgep)) {
     1018 +        case ATGE_CHIP_L1E:
 847 1019                  err = atge_l1e_alloc_dma(atgep);
 848      -        } else if (ATGE_MODEL(atgep) == ATGE_CHIP_L1) {
     1020 +                break;
     1021 +        case ATGE_CHIP_L1:
 849 1022                  err = atge_l1_alloc_dma(atgep);
     1023 +                break;
     1024 +        case ATGE_CHIP_L1C:
     1025 +                err = atge_l1c_alloc_dma(atgep);
     1026 +                break;
 850 1027          }
 851 1028  
 852 1029          return (err);
 853 1030  }
 854 1031  
 855 1032  static void
 856 1033  atge_free_dma(atge_t *atgep)
 857 1034  {
 858      -        if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E) {
     1035 +        switch (ATGE_MODEL(atgep)) {
     1036 +        case ATGE_CHIP_L1E:
 859 1037                  atge_l1e_free_dma(atgep);
     1038 +                break;
     1039 +        case ATGE_CHIP_L1:
     1040 +                atge_l1_free_dma(atgep);
     1041 +                break;
     1042 +        case ATGE_CHIP_L1C:
     1043 +                atge_l1c_free_dma(atgep);
     1044 +                break;
 860 1045          }
 861 1046  }
 862 1047  
 863 1048  /*
 864 1049   * Attach entry point in the driver.
 865 1050   */
 866 1051  static int
 867 1052  atge_attach(dev_info_t *devinfo, ddi_attach_cmd_t cmd)
 868 1053  {
 869 1054          atge_t  *atgep;
 870 1055          mac_register_t  *macreg;
 871 1056          int     instance;
 872 1057          uint16_t cap_ptr;
 873 1058          uint16_t burst;
 874 1059          int err;
 875 1060          mii_ops_t *mii_ops;
 876 1061  
 877 1062          instance =  ddi_get_instance(devinfo);
 878 1063  
 879 1064          switch (cmd) {
 880      -        default:
 881      -                return (DDI_FAILURE);
 882      -
 883 1065          case DDI_RESUME:
 884 1066                  return (atge_resume(devinfo));
 885 1067  
 886 1068          case DDI_ATTACH:
 887 1069                  ddi_set_driver_private(devinfo, NULL);
 888 1070                  break;
     1071 +        default:
     1072 +                return (DDI_FAILURE);
     1073 +
 889 1074          }
 890 1075  
 891 1076          atgep = kmem_zalloc(sizeof (atge_t), KM_SLEEP);
 892 1077          ddi_set_driver_private(devinfo, atgep);
 893 1078          atgep->atge_dip = devinfo;
 894 1079  
 895 1080          /*
 896 1081           * Setup name and instance number to be used for debugging and
 897 1082           * error reporting.
 898 1083           */
↓ open down ↓ 45 lines elided ↑ open up ↑
 944 1129          /*
 945 1130           * Used to lock down MBOX register on L1 chip since RX consumer,
 946 1131           * TX producer and RX return ring consumer are shared.
 947 1132           */
 948 1133          mutex_init(&atgep->atge_mbox_lock, NULL, MUTEX_DRIVER,
 949 1134              DDI_INTR_PRI(atgep->atge_intr_pri));
 950 1135  
 951 1136          atgep->atge_link_state = LINK_STATE_DOWN;
 952 1137          atgep->atge_mtu = ETHERMTU;
 953 1138  
 954      -        if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E) {
     1139 +        switch (ATGE_MODEL(atgep)) {
     1140 +        case ATGE_CHIP_L1E:
 955 1141                  if (atgep->atge_revid > 0xF0) {
 956 1142                          /* L2E Rev. B. AR8114 */
 957 1143                          atgep->atge_flags |= ATGE_FLAG_FASTETHER;
 958 1144                  } else {
 959 1145                          if ((INL(atgep, L1E_PHY_STATUS) &
 960 1146                              PHY_STATUS_100M) != 0) {
 961 1147                                  /* L1E AR8121 */
 962 1148                                  atgep->atge_flags |= ATGE_FLAG_JUMBO;
 963 1149                          } else {
 964 1150                                  /* L2E Rev. A. AR8113 */
 965 1151                                  atgep->atge_flags |= ATGE_FLAG_FASTETHER;
 966 1152                          }
 967 1153                  }
     1154 +                break;
     1155 +        case ATGE_CHIP_L1:
     1156 +                break;
     1157 +        case ATGE_CHIP_L1C:
     1158 +                /*
     1159 +                 * One odd thing is AR8132 uses the same PHY hardware(F1
     1160 +                 * gigabit PHY) of AR8131. So atphy(4) of AR8132 reports
     1161 +                 * the PHY supports 1000Mbps but that's not true. The PHY
     1162 +                 * used in AR8132 can't establish gigabit link even if it
     1163 +                 * shows the same PHY model/revision number of AR8131.
     1164 +                 *
     1165 +                 * It seems that AR813x/AR815x has silicon bug for SMB. In
     1166 +                 * addition, Atheros said that enabling SMB wouldn't improve
     1167 +                 * performance. However I think it's bad to access lots of
     1168 +                 * registers to extract MAC statistics.
     1169 +                 *
     1170 +                 * Don't use Tx CMB. It is known to have silicon bug.
     1171 +                 */
     1172 +                switch (ATGE_DID(atgep)) {
     1173 +                case ATGE_CHIP_AR8152V2_DEV_ID:
     1174 +                case ATGE_CHIP_AR8152V1_DEV_ID:
     1175 +                        atgep->atge_flags |= ATGE_FLAG_APS |
     1176 +                            ATGE_FLAG_FASTETHER |
     1177 +                            ATGE_FLAG_ASPM_MON | ATGE_FLAG_JUMBO |
     1178 +                            ATGE_FLAG_SMB_BUG | ATGE_FLAG_CMB_BUG;
     1179 +                        break;
     1180 +                case ATGE_CHIP_AR8151V2_DEV_ID:
     1181 +                case ATGE_CHIP_AR8151V1_DEV_ID:
     1182 +                        atgep->atge_flags |= ATGE_FLAG_APS |
     1183 +                            ATGE_FLAG_ASPM_MON | ATGE_FLAG_JUMBO |
     1184 +                            ATGE_FLAG_SMB_BUG | ATGE_FLAG_CMB_BUG;
     1185 +                        break;
     1186 +                case ATGE_CHIP_L1CF_DEV_ID:
     1187 +                        atgep->atge_flags |= ATGE_FLAG_FASTETHER;
     1188 +                        break;
     1189 +                case ATGE_CHIP_L1CG_DEV_ID:
     1190 +                        break;
     1191 +                }
     1192 +                break;
 968 1193          }
 969 1194  
 970 1195          /*
 971 1196           * Get DMA parameters from PCIe device control register.
 972 1197           */
 973 1198          err = PCI_CAP_LOCATE(atgep->atge_conf_handle, PCI_CAP_ID_PCI_E,
 974 1199              &cap_ptr);
 975 1200  
 976 1201          if (err == DDI_FAILURE) {
 977 1202                  atgep->atge_dma_rd_burst = DMA_CFG_RD_BURST_128;
↓ open down ↓ 14 lines elided ↑ open up ↑
 992 1217                   */
 993 1218                  atgep->atge_dma_wr_burst = ((burst >> 5) & 0x07) <<
 994 1219                      DMA_CFG_WR_BURST_SHIFT;
 995 1220  
 996 1221                  ATGE_DB(("%s: %s() MRR : %d, MPS : %d",
 997 1222                      atgep->atge_name, __func__,
 998 1223                      (128 << ((burst >> 12) & 0x07)),
 999 1224                      (128 << ((burst >> 5) & 0x07))));
1000 1225          }
1001 1226  
     1227 +        /* Clear data link and flow-control protocol error. */
     1228 +        switch (ATGE_MODEL(atgep)) {
     1229 +        case ATGE_CHIP_L1E:
     1230 +                break;
     1231 +        case ATGE_CHIP_L1:
     1232 +                break;
     1233 +        case ATGE_CHIP_L1C:
     1234 +                OUTL_AND(atgep, ATGE_PEX_UNC_ERR_SEV,
     1235 +                    ~(PEX_UNC_ERR_SEV_UC | PEX_UNC_ERR_SEV_FCP));
     1236 +                OUTL_AND(atgep, ATGE_LTSSM_ID_CFG, ~LTSSM_ID_WRO_ENB);
     1237 +                OUTL_OR(atgep, ATGE_PCIE_PHYMISC, PCIE_PHYMISC_FORCE_RCV_DET);
     1238 +                break;
     1239 +        }
     1240 +
1002 1241          /*
1003 1242           * Allocate DMA resources.
1004 1243           */
1005 1244          err = atge_alloc_dma(atgep);
1006 1245          if (err != DDI_SUCCESS) {
1007 1246                  atge_error(devinfo, "Failed to allocate DMA resources");
1008 1247                  goto fail4;
1009 1248          }
1010 1249  
1011 1250          /*
1012 1251           * Get station address.
1013 1252           */
1014 1253          (void) atge_get_macaddr(atgep);
1015 1254  
1016 1255          /*
1017 1256           * Setup MII.
1018 1257           */
1019      -        if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E) {
     1258 +        switch (ATGE_MODEL(atgep)) {
     1259 +        case ATGE_CHIP_L1E:
1020 1260                  mii_ops = &atge_l1e_mii_ops;
1021      -        } else if (ATGE_MODEL(atgep) == ATGE_CHIP_L1) {
     1261 +                break;
     1262 +        case ATGE_CHIP_L1:
1022 1263                  mii_ops = &atge_l1_mii_ops;
     1264 +                break;
     1265 +        case ATGE_CHIP_L1C:
     1266 +                mii_ops = &atge_l1c_mii_ops;
     1267 +                break;
1023 1268          }
1024 1269  
1025 1270          if ((atgep->atge_mii = mii_alloc(atgep, devinfo,
1026 1271              mii_ops)) == NULL) {
1027 1272                  atge_error(devinfo, "mii_alloc() failed");
1028 1273                  goto fail4;
1029 1274          }
1030 1275  
1031 1276          /*
1032 1277           * Register with MAC layer.
↓ open down ↓ 32 lines elided ↑ open up ↑
1065 1310           * At last - enable interrupts.
1066 1311           */
1067 1312          err = atge_enable_intrs(atgep);
1068 1313          if (err == DDI_FAILURE) {
1069 1314                  goto fail5;
1070 1315          }
1071 1316  
1072 1317          /*
1073 1318           * Reset the PHY before starting.
1074 1319           */
1075      -        if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E) {
     1320 +        switch (ATGE_MODEL(atgep)) {
     1321 +        case ATGE_CHIP_L1E:
1076 1322                  atge_l1e_mii_reset(atgep);
1077      -        } else if (ATGE_MODEL(atgep) == ATGE_CHIP_L1) {
     1323 +                break;
     1324 +        case ATGE_CHIP_L1:
1078 1325                  atge_l1_mii_reset(atgep);
     1326 +                break;
     1327 +        case ATGE_CHIP_L1C:
     1328 +                atge_l1c_mii_reset(atgep);
     1329 +                break;
1079 1330          }
1080 1331  
1081 1332          /*
1082 1333           * Let the PHY run.
1083 1334           */
1084 1335          mii_start(atgep->atge_mii);
1085 1336  
1086 1337          return (DDI_SUCCESS);
1087 1338  
1088 1339  fail5:
↓ open down ↓ 266 lines elided ↑ open up ↑
1355 1606          } else {
1356 1607                  atge_device_reset(atgep);
1357 1608          }
1358 1609  
1359 1610          mutex_exit(&atgep->atge_tx_lock);
1360 1611          mutex_exit(&atgep->atge_intr_lock);
1361 1612  
1362 1613          /*
1363 1614           * Reset the PHY before resuming MII.
1364 1615           */
1365      -        if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E) {
     1616 +        switch (ATGE_MODEL(atgep)) {
     1617 +        case ATGE_CHIP_L1E:
1366 1618                  atge_l1e_mii_reset(atgep);
     1619 +                break;
     1620 +        case ATGE_CHIP_L1:
     1621 +                break;
     1622 +        case ATGE_CHIP_L1C:
     1623 +                break;
1367 1624          }
1368 1625  
1369 1626          mii_resume(atgep->atge_mii);
1370 1627  
1371 1628          /* kick-off downstream */
1372 1629          mac_tx_update(atgep->atge_mh);
1373 1630  
1374 1631          return (DDI_SUCCESS);
1375 1632  }
1376 1633  
↓ open down ↓ 413 lines elided ↑ open up ↑
1790 2047  {
1791 2048          uint32_t rxf_hi, rxf_lo, rrd_hi, rrd_lo;
1792 2049          uint32_t reg;
1793 2050          uint32_t fsize;
1794 2051  
1795 2052          /*
1796 2053           * Reprogram the Station address.
1797 2054           */
1798 2055          atge_program_ether(atgep);
1799 2056  
1800      -        if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E) {
     2057 +        switch (ATGE_MODEL(atgep)) {
     2058 +        case ATGE_CHIP_L1E:
1801 2059                  atge_l1e_program_dma(atgep);
1802      -        } else if (ATGE_MODEL(atgep) == ATGE_CHIP_L1) {
     2060 +                break;
     2061 +        case ATGE_CHIP_L1:
1803 2062                  atge_l1_program_dma(atgep);
     2063 +                break;
     2064 +        case ATGE_CHIP_L1C:
     2065 +                atge_l1c_program_dma(atgep);
     2066 +                break;
1804 2067          }
1805 2068  
1806 2069          ATGE_DB(("%s: %s() dma, counters programmed ", atgep->atge_name,
1807 2070              __func__));
1808 2071  
1809      -        OUTW(atgep, ATGE_INTR_CLR_TIMER, 1*1000/2);
     2072 +        switch (ATGE_MODEL(atgep)) {
     2073 +        case ATGE_CHIP_L1E:
     2074 +        case ATGE_CHIP_L1:
     2075 +                OUTW(atgep, ATGE_INTR_CLR_TIMER, 1*1000/2);
     2076 +                break;
     2077 +        case ATGE_CHIP_L1C:
     2078 +                /*
     2079 +                 * Disable interrupt re-trigger timer. We don't want automatic
     2080 +                 * re-triggering of un-ACKed interrupts.
     2081 +                 */
     2082 +                OUTL(atgep, ATGE_INTR_RETRIG_TIMER, ATGE_USECS(0));
     2083 +                /* Configure CMB. */
     2084 +                OUTL(atgep, ATGE_CMB_TX_TIMER, ATGE_USECS(0));
     2085 +                /*
     2086 +                 * Hardware can be configured to issue SMB interrupt based
     2087 +                 * on programmed interval. Since there is a callout that is
     2088 +                 * invoked for every hz in driver we use that instead of
     2089 +                 * relying on periodic SMB interrupt.
     2090 +                 */
     2091 +                OUTL(atgep, ATGE_SMB_STAT_TIMER, ATGE_USECS(0));
     2092 +                /* Clear MAC statistics. */
     2093 +                atge_l1c_clear_stats(atgep);
     2094 +                break;
     2095 +        }
1810 2096  
1811 2097          /*
1812 2098           * Set Maximum frame size but don't let MTU be less than ETHER_MTU.
1813 2099           */
1814 2100          if (atgep->atge_mtu < ETHERMTU)
1815 2101                  atgep->atge_max_frame_size = ETHERMTU;
1816 2102          else
1817 2103                  atgep->atge_max_frame_size = atgep->atge_mtu;
1818 2104  
1819 2105          atgep->atge_max_frame_size += sizeof (struct ether_header) +
1820 2106              VLAN_TAGSZ + ETHERFCSL;
1821 2107          OUTL(atgep, ATGE_FRAME_SIZE, atgep->atge_max_frame_size);
1822 2108  
     2109 +        switch (ATGE_MODEL(atgep)) {
     2110 +        case ATGE_CHIP_L1E:
     2111 +                break;
     2112 +        case ATGE_CHIP_L1:
     2113 +                break;
     2114 +        case ATGE_CHIP_L1C:
     2115 +                /* Disable header split(?) */
     2116 +                OUTL(atgep, ATGE_HDS_CFG, 0);
     2117 +                break;
     2118 +        }
1823 2119  
1824 2120          /*
1825 2121           * Configure IPG/IFG parameters.
1826 2122           */
1827 2123          OUTL(atgep, ATGE_IPG_IFG_CFG,
1828 2124              ((IPG_IFG_IPG2_DEFAULT << IPG_IFG_IPG2_SHIFT) & IPG_IFG_IPG2_MASK) |
1829 2125              ((IPG_IFG_IPG1_DEFAULT << IPG_IFG_IPG1_SHIFT) & IPG_IFG_IPG1_MASK) |
1830 2126              ((IPG_IFG_MIFG_DEFAULT << IPG_IFG_MIFG_SHIFT) & IPG_IFG_MIFG_MASK) |
1831 2127              ((IPG_IFG_IPGT_DEFAULT << IPG_IFG_IPGT_SHIFT) & IPG_IFG_IPGT_MASK));
1832 2128  
↓ open down ↓ 6 lines elided ↑ open up ↑
1839 2135              ((HDPX_CFG_RETRY_DEFAULT << HDPX_CFG_RETRY_SHIFT) &
1840 2136              HDPX_CFG_RETRY_MASK) | HDPX_CFG_EXC_DEF_EN |
1841 2137              ((HDPX_CFG_ABEBT_DEFAULT << HDPX_CFG_ABEBT_SHIFT) &
1842 2138              HDPX_CFG_ABEBT_MASK) |
1843 2139              ((HDPX_CFG_JAMIPG_DEFAULT << HDPX_CFG_JAMIPG_SHIFT) &
1844 2140              HDPX_CFG_JAMIPG_MASK));
1845 2141  
1846 2142          /*
1847 2143           * Configure jumbo frame.
1848 2144           */
1849      -        if (ATGE_MODEL(atgep) == ATGE_CHIP_L1) {
     2145 +        switch (ATGE_MODEL(atgep)) {
     2146 +        case ATGE_CHIP_L1E:
     2147 +                if (atgep->atge_flags & ATGE_FLAG_JUMBO) {
     2148 +
     2149 +                        if (atgep->atge_mtu < ETHERMTU)
     2150 +                                reg = atgep->atge_max_frame_size;
     2151 +                        else if (atgep->atge_mtu < 6 * 1024)
     2152 +                                reg = (atgep->atge_max_frame_size * 2) / 3;
     2153 +                        else
     2154 +                                reg = atgep->atge_max_frame_size / 2;
     2155 +
     2156 +                        OUTL(atgep, L1E_TX_JUMBO_THRESH,
     2157 +                            ROUNDUP(reg, TX_JUMBO_THRESH_UNIT) >>
     2158 +                            TX_JUMBO_THRESH_UNIT_SHIFT);
     2159 +                }
     2160 +                break;
     2161 +        case ATGE_CHIP_L1:
1850 2162                  fsize = ROUNDUP(atgep->atge_max_frame_size, sizeof (uint64_t));
1851 2163                  OUTL(atgep, ATGE_RXQ_JUMBO_CFG,
1852 2164                      (((fsize / sizeof (uint64_t)) <<
1853 2165                      RXQ_JUMBO_CFG_SZ_THRESH_SHIFT) &
1854 2166                      RXQ_JUMBO_CFG_SZ_THRESH_MASK) |
1855 2167                      ((RXQ_JUMBO_CFG_LKAH_DEFAULT <<
1856 2168                      RXQ_JUMBO_CFG_LKAH_SHIFT) & RXQ_JUMBO_CFG_LKAH_MASK) |
1857 2169                      ((ATGE_USECS(8) << RXQ_JUMBO_CFG_RRD_TIMER_SHIFT) &
1858 2170                      RXQ_JUMBO_CFG_RRD_TIMER_MASK));
1859      -        } else if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E &&
1860      -            atgep->atge_flags & ATGE_FLAG_JUMBO) {
1861      -
1862      -                if (atgep->atge_mtu < ETHERMTU)
1863      -                        reg = atgep->atge_max_frame_size;
1864      -                else if (atgep->atge_mtu < 6 * 1024)
1865      -                        reg = (atgep->atge_max_frame_size * 2) / 3;
1866      -                else
1867      -                        reg = atgep->atge_max_frame_size / 2;
1868      -
1869      -                OUTL(atgep, L1E_TX_JUMBO_THRESH,
1870      -                    ROUNDUP(reg, TX_JUMBO_THRESH_UNIT) >>
1871      -                    TX_JUMBO_THRESH_UNIT_SHIFT);
     2171 +                break;
     2172 +        case ATGE_CHIP_L1C:
     2173 +                break;
1872 2174          }
1873 2175  
1874 2176          /*
1875 2177           * Configure flow-control parameters.
1876 2178           */
1877      -        if ((atgep->atge_flags & ATGE_FLAG_PCIE) != 0) {
     2179 +        switch (ATGE_MODEL(atgep)) {
     2180 +        case ATGE_CHIP_L1E:
     2181 +        case ATGE_CHIP_L1:
     2182 +                if ((atgep->atge_flags & ATGE_FLAG_PCIE) != 0) {
1878 2183                  /*
1879 2184                   * Some hardware version require this magic.
1880 2185                   */
1881      -                OUTL(atgep, 0x12FC, 0x6500);
     2186 +                OUTL(atgep, ATGE_LTSSM_ID_CFG, 0x6500);
1882 2187                  reg = INL(atgep, 0x1008);
1883 2188                  OUTL(atgep, 0x1008, reg | 0x8000);
     2189 +                }
     2190 +                break;
     2191 +        case ATGE_CHIP_L1C:
     2192 +                break;
1884 2193          }
1885 2194  
1886 2195          /*
1887 2196           * These are all magic parameters which came from FreeBSD.
1888 2197           */
1889      -        if (ATGE_MODEL(atgep) == ATGE_CHIP_L1) {
     2198 +        switch (ATGE_MODEL(atgep)) {
     2199 +        case ATGE_CHIP_L1E:
     2200 +                reg = INL(atgep, L1E_SRAM_RX_FIFO_LEN);
     2201 +                rxf_hi = (reg * 4) / 5;
     2202 +                rxf_lo = reg/ 5;
     2203 +
     2204 +                OUTL(atgep, ATGE_RXQ_FIFO_PAUSE_THRESH,
     2205 +                    ((rxf_lo << RXQ_FIFO_PAUSE_THRESH_LO_SHIFT) &
     2206 +                    RXQ_FIFO_PAUSE_THRESH_LO_MASK) |
     2207 +                    ((rxf_hi << RXQ_FIFO_PAUSE_THRESH_HI_SHIFT) &
     2208 +                    RXQ_FIFO_PAUSE_THRESH_HI_MASK));
     2209 +                break;
     2210 +        case ATGE_CHIP_L1:
1890 2211                  switch (atgep->atge_chip_rev) {
1891 2212                  case 0x8001:
1892 2213                  case 0x9001:
1893 2214                  case 0x9002:
1894 2215                  case 0x9003:
1895 2216                          rxf_hi = L1_RX_RING_CNT / 16;
1896 2217                          rxf_lo = (L1_RX_RING_CNT * 7) / 8;
1897 2218                          rrd_hi = (L1_RR_RING_CNT * 7) / 8;
1898 2219                          rrd_lo = L1_RR_RING_CNT / 16;
1899 2220                          break;
↓ open down ↓ 19 lines elided ↑ open up ↑
1919 2240                      ((rxf_lo << RXQ_FIFO_PAUSE_THRESH_LO_SHIFT) &
1920 2241                      RXQ_FIFO_PAUSE_THRESH_LO_MASK) |
1921 2242                      ((rxf_hi << RXQ_FIFO_PAUSE_THRESH_HI_SHIFT) &
1922 2243                      RXQ_FIFO_PAUSE_THRESH_HI_MASK));
1923 2244  
1924 2245                  OUTL(atgep, L1_RXQ_RRD_PAUSE_THRESH,
1925 2246                      ((rrd_lo << RXQ_RRD_PAUSE_THRESH_LO_SHIFT) &
1926 2247                      RXQ_RRD_PAUSE_THRESH_LO_MASK) |
1927 2248                      ((rrd_hi << RXQ_RRD_PAUSE_THRESH_HI_SHIFT) &
1928 2249                      RXQ_RRD_PAUSE_THRESH_HI_MASK));
1929      -        } else if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E) {
1930      -                reg = INL(atgep, L1E_SRAM_RX_FIFO_LEN);
1931      -                rxf_hi = (reg * 4) / 5;
1932      -                rxf_lo = reg/ 5;
     2250 +                break;
     2251 +        case ATGE_CHIP_L1C:
     2252 +                switch (ATGE_DID(atgep)) {
     2253 +                case ATGE_CHIP_AR8151V2_DEV_ID:
     2254 +                case ATGE_CHIP_AR8152V1_DEV_ID:
     2255 +                        OUTL(atgep, ATGE_SERDES_LOCK,
     2256 +                            INL(atgep, ATGE_SERDES_LOCK) |
     2257 +                            SERDES_MAC_CLK_SLOWDOWN |
     2258 +                            SERDES_PHY_CLK_SLOWDOWN);
     2259 +                        break;
     2260 +                case ATGE_CHIP_L1CG_DEV_ID:
     2261 +                case ATGE_CHIP_L1CF_DEV_ID:
     2262 +                        /*
     2263 +                         * Configure flow control parameters.
     2264 +                         * XON  : 80% of Rx FIFO
     2265 +                         * XOFF : 30% of Rx FIFO
     2266 +                         */
     2267 +                        reg = INL(atgep, L1C_SRAM_RX_FIFO_LEN);
     2268 +                        rxf_hi = (reg * 8) / 10;
     2269 +                        rxf_lo = (reg * 3) / 10;
1933 2270  
1934      -                OUTL(atgep, ATGE_RXQ_FIFO_PAUSE_THRESH,
1935      -                    ((rxf_lo << RXQ_FIFO_PAUSE_THRESH_LO_SHIFT) &
1936      -                    RXQ_FIFO_PAUSE_THRESH_LO_MASK) |
1937      -                    ((rxf_hi << RXQ_FIFO_PAUSE_THRESH_HI_SHIFT) &
1938      -                    RXQ_FIFO_PAUSE_THRESH_HI_MASK));
     2271 +                        OUTL(atgep, ATGE_RXQ_FIFO_PAUSE_THRESH,
     2272 +                            ((rxf_lo << RXQ_FIFO_PAUSE_THRESH_LO_SHIFT) &
     2273 +                            RXQ_FIFO_PAUSE_THRESH_LO_MASK) |
     2274 +                            ((rxf_hi << RXQ_FIFO_PAUSE_THRESH_HI_SHIFT) &
     2275 +                            RXQ_FIFO_PAUSE_THRESH_HI_MASK));
     2276 +                        break;
     2277 +                }
     2278 +                break;
1939 2279          }
1940 2280  
1941      -        /* Configure RxQ. */
1942      -        reg = 0;
1943      -        if (ATGE_MODEL(atgep) == ATGE_CHIP_L1) {
     2281 +        switch (ATGE_MODEL(atgep)) {
     2282 +        case ATGE_CHIP_L1E:
     2283 +                /* Configure RxQ. */
     2284 +                reg = RXQ_CFG_ALIGN_32 | RXQ_CFG_CUT_THROUGH_ENB |
     2285 +                    RXQ_CFG_IPV6_CSUM_VERIFY | RXQ_CFG_ENB;
     2286 +                OUTL(atgep, ATGE_RXQ_CFG, reg);
     2287 +                /*
     2288 +                 * Configure TxQ.
     2289 +                 */
     2290 +                reg = (128 <<
     2291 +                    (atgep->atge_dma_rd_burst >> DMA_CFG_RD_BURST_SHIFT)) <<
     2292 +                    TXQ_CFG_TX_FIFO_BURST_SHIFT;
     2293 +
     2294 +                reg |= (TXQ_CFG_TPD_BURST_DEFAULT << TXQ_CFG_TPD_BURST_SHIFT) &
     2295 +                    TXQ_CFG_TPD_BURST_MASK;
     2296 +
     2297 +                reg |= TXQ_CFG_ENHANCED_MODE | TXQ_CFG_ENB;
     2298 +
     2299 +                OUTL(atgep, ATGE_TXQ_CFG, reg);
     2300 +                /* Disable RSS. */
     2301 +                OUTL(atgep, L1E_RSS_IDT_TABLE0, 0);
     2302 +                OUTL(atgep, L1E_RSS_CPU, 0);
     2303 +                /*
     2304 +                 * Configure DMA parameters.
     2305 +                 */
     2306 +                /*
     2307 +                 * Don't use Tx CMB. It is known to cause RRS update failure
     2308 +                 * under certain circumstances. Typical phenomenon of the
     2309 +                 * issue would be unexpected sequence number encountered in
     2310 +                 * Rx handler. Hence we don't set DMA_CFG_TXCMB_ENB.
     2311 +                 */
     2312 +                OUTL(atgep, ATGE_DMA_CFG,
     2313 +                    DMA_CFG_OUT_ORDER | DMA_CFG_RD_REQ_PRI | DMA_CFG_RCB_64 |
     2314 +                    atgep->atge_dma_rd_burst | atgep->atge_dma_wr_burst |
     2315 +                    DMA_CFG_RXCMB_ENB |
     2316 +                    ((DMA_CFG_RD_DELAY_CNT_DEFAULT <<
     2317 +                    DMA_CFG_RD_DELAY_CNT_SHIFT) & DMA_CFG_RD_DELAY_CNT_MASK) |
     2318 +                    ((DMA_CFG_WR_DELAY_CNT_DEFAULT <<
     2319 +                    DMA_CFG_WR_DELAY_CNT_SHIFT) & DMA_CFG_WR_DELAY_CNT_MASK));
     2320 +                /*
     2321 +                 * Enable CMB/SMB timer.
     2322 +                 */
     2323 +                OUTL(atgep, L1E_SMB_STAT_TIMER, 100000);
     2324 +                atge_l1e_clear_stats(atgep);
     2325 +                break;
     2326 +        case ATGE_CHIP_L1:
     2327 +                /* Configure RxQ. */
1944 2328                  reg =
1945 2329                      ((RXQ_CFG_RD_BURST_DEFAULT << RXQ_CFG_RD_BURST_SHIFT) &
1946 2330                      RXQ_CFG_RD_BURST_MASK) |
1947 2331                      ((RXQ_CFG_RRD_BURST_THRESH_DEFAULT <<
1948 2332                      RXQ_CFG_RRD_BURST_THRESH_SHIFT) &
1949 2333                      RXQ_CFG_RRD_BURST_THRESH_MASK) |
1950 2334                      ((RXQ_CFG_RD_PREF_MIN_IPG_DEFAULT <<
1951 2335                      RXQ_CFG_RD_PREF_MIN_IPG_SHIFT) &
1952 2336                      RXQ_CFG_RD_PREF_MIN_IPG_MASK) |
1953 2337                      RXQ_CFG_CUT_THROUGH_ENB | RXQ_CFG_ENB;
1954 2338                  OUTL(atgep, ATGE_RXQ_CFG, reg);
1955      -        } else if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E) {
1956      -                reg = RXQ_CFG_ALIGN_32 | RXQ_CFG_CUT_THROUGH_ENB |
1957      -                    RXQ_CFG_IPV6_CSUM_VERIFY | RXQ_CFG_ENB;
1958      -                OUTL(atgep, ATGE_RXQ_CFG, reg);
1959      -        }
1960      -
1961      -        /*
1962      -         * Configure TxQ.
1963      -         */
1964      -        if (ATGE_MODEL(atgep) == ATGE_CHIP_L1) {
     2339 +                /*
     2340 +                 * Configure TxQ.
     2341 +                 */
1965 2342                  reg =
1966 2343                      (((TXQ_CFG_TPD_BURST_DEFAULT << TXQ_CFG_TPD_BURST_SHIFT) &
1967 2344                      TXQ_CFG_TPD_BURST_MASK) |
1968 2345                      ((TXQ_CFG_TX_FIFO_BURST_DEFAULT <<
1969 2346                      TXQ_CFG_TX_FIFO_BURST_SHIFT) &
1970 2347                      TXQ_CFG_TX_FIFO_BURST_MASK) |
1971 2348                      ((TXQ_CFG_TPD_FETCH_DEFAULT <<
1972 2349                      TXQ_CFG_TPD_FETCH_THRESH_SHIFT) &
1973 2350                      TXQ_CFG_TPD_FETCH_THRESH_MASK) |
1974 2351                      TXQ_CFG_ENB);
1975 2352                  OUTL(atgep, ATGE_TXQ_CFG, reg);
1976      -        } else if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E) {
1977      -                reg = (128 <<
1978      -                    (atgep->atge_dma_rd_burst >> DMA_CFG_RD_BURST_SHIFT)) <<
1979      -                    TXQ_CFG_TX_FIFO_BURST_SHIFT;
1980      -
1981      -                reg |= (TXQ_CFG_TPD_BURST_DEFAULT << TXQ_CFG_TPD_BURST_SHIFT) &
1982      -                    TXQ_CFG_TPD_BURST_MASK;
1983      -
1984      -                reg |= TXQ_CFG_ENHANCED_MODE | TXQ_CFG_ENB;
1985      -
1986      -                OUTL(atgep, ATGE_TXQ_CFG, reg);
1987      -        }
1988      -
1989      -        if (ATGE_MODEL(atgep) == ATGE_CHIP_L1) {
     2353 +                /* Jumbo frames */
1990 2354                  OUTL(atgep, L1_TX_JUMBO_TPD_TH_IPG,
1991 2355                      (((fsize / sizeof (uint64_t) << TX_JUMBO_TPD_TH_SHIFT)) &
1992 2356                      TX_JUMBO_TPD_TH_MASK) |
1993 2357                      ((TX_JUMBO_TPD_IPG_DEFAULT << TX_JUMBO_TPD_IPG_SHIFT) &
1994 2358                      TX_JUMBO_TPD_IPG_MASK));
1995      -        }
1996      -
1997      -        if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E) {
1998      -                /* Disable RSS. */
1999      -                OUTL(atgep, L1E_RSS_IDT_TABLE0, 0);
2000      -                OUTL(atgep, L1E_RSS_CPU, 0);
2001      -        }
2002      -
2003      -        /*
2004      -         * Configure DMA parameters.
2005      -         */
2006      -        if (ATGE_MODEL(atgep) == ATGE_CHIP_L1) {
     2359 +                /*
     2360 +                 * Configure DMA parameters.
     2361 +                 */
2007 2362                  OUTL(atgep, ATGE_DMA_CFG,
2008 2363                      DMA_CFG_ENH_ORDER | DMA_CFG_RCB_64 |
2009 2364                      atgep->atge_dma_rd_burst | DMA_CFG_RD_ENB |
2010 2365                      atgep->atge_dma_wr_burst | DMA_CFG_WR_ENB);
2011 2366  
2012 2367                  /* Configure CMB DMA write threshold. */
2013 2368                  OUTL(atgep, L1_CMB_WR_THRESH,
2014 2369                      ((CMB_WR_THRESH_RRD_DEFAULT << CMB_WR_THRESH_RRD_SHIFT) &
2015 2370                      CMB_WR_THRESH_RRD_MASK) |
2016 2371                      ((CMB_WR_THRESH_TPD_DEFAULT << CMB_WR_THRESH_TPD_SHIFT) &
2017 2372                      CMB_WR_THRESH_TPD_MASK));
2018      -        } else if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E) {
2019 2373                  /*
2020      -                 * Don't use Tx CMB. It is known to cause RRS update failure
2021      -                 * under certain circumstances. Typical phenomenon of the
2022      -                 * issue would be unexpected sequence number encountered in
2023      -                 * Rx handler. Hence we don't set DMA_CFG_TXCMB_ENB.
     2374 +                 * Enable CMB/SMB timer.
2024 2375                   */
2025      -                OUTL(atgep, ATGE_DMA_CFG,
2026      -                    DMA_CFG_OUT_ORDER | DMA_CFG_RD_REQ_PRI | DMA_CFG_RCB_64 |
2027      -                    atgep->atge_dma_rd_burst | atgep->atge_dma_wr_burst |
2028      -                    DMA_CFG_RXCMB_ENB |
2029      -                    ((DMA_CFG_RD_DELAY_CNT_DEFAULT <<
2030      -                    DMA_CFG_RD_DELAY_CNT_SHIFT) & DMA_CFG_RD_DELAY_CNT_MASK) |
2031      -                    ((DMA_CFG_WR_DELAY_CNT_DEFAULT <<
2032      -                    DMA_CFG_WR_DELAY_CNT_SHIFT) & DMA_CFG_WR_DELAY_CNT_MASK));
2033      -        }
2034      -
2035      -        /*
2036      -         * Enable CMB/SMB timer.
2037      -         */
2038      -        if (ATGE_MODEL(atgep) == ATGE_CHIP_L1) {
2039 2376                  /* Set CMB/SMB timer and enable them. */
2040 2377                  OUTL(atgep, L1_CMB_WR_TIMER,
2041 2378                      ((ATGE_USECS(2) << CMB_WR_TIMER_TX_SHIFT) &
2042 2379                      CMB_WR_TIMER_TX_MASK) |
2043 2380                      ((ATGE_USECS(2) << CMB_WR_TIMER_RX_SHIFT) &
2044 2381                      CMB_WR_TIMER_RX_MASK));
2045 2382  
2046 2383                  /* Request SMB updates for every seconds. */
2047 2384                  OUTL(atgep, L1_SMB_TIMER, ATGE_USECS(1000 * 1000));
2048 2385                  OUTL(atgep, L1_CSMB_CTRL,
2049 2386                      CSMB_CTRL_SMB_ENB | CSMB_CTRL_CMB_ENB);
2050      -        } else if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E) {
2051      -                OUTL(atgep, L1E_SMB_STAT_TIMER, 100000);
2052      -                atge_l1e_clear_stats(atgep);
2053      -        }
     2387 +                break;
     2388 +        case ATGE_CHIP_L1C:
     2389 +                /* Configure RxQ. */
     2390 +                reg =
     2391 +                    RXQ_CFG_RD_BURST_DEFAULT << L1C_RXQ_CFG_RD_BURST_SHIFT |
     2392 +                    RXQ_CFG_IPV6_CSUM_VERIFY | RXQ_CFG_ENB;
     2393 +                if ((atgep->atge_flags & ATGE_FLAG_ASPM_MON) != 0)
     2394 +                        reg |= RXQ_CFG_ASPM_THROUGHPUT_LIMIT_1M;
     2395 +                OUTL(atgep, ATGE_RXQ_CFG, reg);
     2396 +                /*
     2397 +                 * Configure TxQ.
     2398 +                 */
     2399 +                reg = (128 <<
     2400 +                    (atgep->atge_dma_rd_burst >> DMA_CFG_RD_BURST_SHIFT)) <<
     2401 +                    TXQ_CFG_TX_FIFO_BURST_SHIFT;
2054 2402  
     2403 +                switch (ATGE_DID(atgep)) {
     2404 +                case ATGE_CHIP_AR8152V2_DEV_ID:
     2405 +                case ATGE_CHIP_AR8152V1_DEV_ID:
     2406 +                        reg >>= 1;
     2407 +                        break;
     2408 +                }
2055 2409  
     2410 +                reg |= (L1C_TXQ_CFG_TPD_BURST_DEFAULT <<
     2411 +                    TXQ_CFG_TPD_BURST_SHIFT) & TXQ_CFG_TPD_BURST_MASK;
     2412 +
     2413 +                reg |= TXQ_CFG_ENHANCED_MODE | TXQ_CFG_ENB;
     2414 +
     2415 +                OUTL(atgep, L1C_TXQ_CFG, reg);
     2416 +                /* Disable RSS until I understand L1C/L2C's RSS logic. */
     2417 +                OUTL(atgep, L1C_RSS_IDT_TABLE0, 0xe4e4e4e4);
     2418 +                OUTL(atgep, L1C_RSS_CPU, 0);
     2419 +                /*
     2420 +                 * Configure DMA parameters.
     2421 +                 */
     2422 +                OUTL(atgep, ATGE_DMA_CFG,
     2423 +                    DMA_CFG_SMB_DIS |
     2424 +                    DMA_CFG_OUT_ORDER | DMA_CFG_RD_REQ_PRI | DMA_CFG_RCB_64 |
     2425 +                    DMA_CFG_RD_DELAY_CNT_DEFAULT << DMA_CFG_RD_DELAY_CNT_SHIFT |
     2426 +                    DMA_CFG_WR_DELAY_CNT_DEFAULT << DMA_CFG_WR_DELAY_CNT_SHIFT |
     2427 +
     2428 +                    atgep->atge_dma_rd_burst | DMA_CFG_RD_ENB |
     2429 +                    atgep->atge_dma_wr_burst | DMA_CFG_WR_ENB);
     2430 +                /* Configure CMB DMA write threshold not required. */
     2431 +                /* Set CMB/SMB timer and enable them not required. */
     2432 +                break;
     2433 +        }
     2434 +
2056 2435          /*
2057 2436           * Disable all WOL bits as WOL can interfere normal Rx
2058 2437           * operation.
2059 2438           */
2060 2439          OUTL(atgep, ATGE_WOL_CFG, 0);
2061 2440  
2062 2441          /*
2063 2442           * Configure Tx/Rx MACs.
2064 2443           *  - Auto-padding for short frames.
2065 2444           *  - Enable CRC generation.
2066 2445           *
2067 2446           *  Start with full-duplex/1000Mbps media. Actual reconfiguration
2068 2447           *  of MAC is followed after link establishment.
2069 2448           */
2070 2449          reg = (ATGE_CFG_TX_CRC_ENB | ATGE_CFG_TX_AUTO_PAD |
2071 2450              ATGE_CFG_FULL_DUPLEX |
2072 2451              ((ATGE_CFG_PREAMBLE_DEFAULT << ATGE_CFG_PREAMBLE_SHIFT) &
2073 2452              ATGE_CFG_PREAMBLE_MASK));
2074 2453  
     2454 +        /*
     2455 +         *  AR813x/AR815x always does checksum computation regardless
     2456 +         *  of MAC_CFG_RXCSUM_ENB bit. Also the controller is known to
     2457 +         *  have bug in protocol field in Rx return structure so
     2458 +         *  these controllers can't handle fragmented frames. Disable
     2459 +         *  Rx checksum offloading until there is a newer controller
     2460 +         *  that has sane implementation.
     2461 +         */
     2462 +        switch (ATGE_DID(atgep)) {
     2463 +        case ATGE_CHIP_AR8151V2_DEV_ID:
     2464 +        case ATGE_CHIP_AR8151V1_DEV_ID:
     2465 +        case ATGE_CHIP_AR8152V2_DEV_ID:
     2466 +                reg |= ATGE_CFG_HASH_ALG_CRC32 | ATGE_CFG_SPEED_MODE_SW;
     2467 +                break;
     2468 +        }
     2469 +
2075 2470          if ((atgep->atge_flags & ATGE_FLAG_FASTETHER) != 0) {
2076 2471                  reg |= ATGE_CFG_SPEED_10_100;
2077 2472                  ATGE_DB(("%s: %s() Fast Ethernet", atgep->atge_name, __func__));
2078 2473          } else {
2079 2474                  reg |= ATGE_CFG_SPEED_1000;
2080 2475                  ATGE_DB(("%s: %s() 1G speed", atgep->atge_name, __func__));
2081 2476          }
     2477 +        switch (ATGE_MODEL(atgep)) {
     2478 +        case ATGE_CHIP_L1C:
     2479 +                reg |= L1C_CFG_SINGLE_PAUSE_ENB;
     2480 +                break;
     2481 +        }
2082 2482  
2083 2483          OUTL(atgep, ATGE_MAC_CFG, reg);
2084 2484  
2085 2485          atgep->atge_chip_state |= ATGE_CHIP_RUNNING;
2086 2486  
2087 2487          /*
2088 2488           * Set up the receive filter.
2089 2489           */
2090 2490          atge_rxfilter(atgep);
2091 2491  
2092 2492          /*
2093 2493           * Acknowledge all pending interrupts and clear it.
2094 2494           */
2095      -        if (ATGE_MODEL(atgep) == ATGE_CHIP_L1) {
2096      -                OUTL(atgep, ATGE_INTR_STATUS, 0);
2097      -                OUTL(atgep, ATGE_INTR_MASK, atgep->atge_intrs);
2098      -        } else if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E) {
     2495 +        switch (ATGE_MODEL(atgep)) {
     2496 +        case ATGE_CHIP_L1E:
2099 2497                  OUTL(atgep, ATGE_INTR_MASK, L1E_INTRS);
2100 2498                  OUTL(atgep, ATGE_INTR_STATUS, 0xFFFFFFFF);
2101 2499                  OUTL(atgep, ATGE_INTR_STATUS, 0);
     2500 +                break;
     2501 +        case ATGE_CHIP_L1:
     2502 +        case ATGE_CHIP_L1C:
     2503 +                OUTL(atgep, ATGE_INTR_STATUS, 0);
     2504 +                OUTL(atgep, ATGE_INTR_MASK, atgep->atge_intrs);
     2505 +                break;
2102 2506          }
2103 2507  
2104 2508          atge_mac_config(atgep);
2105 2509  
2106 2510          ATGE_DB(("%s: %s() device started", atgep->atge_name, __func__));
2107 2511  }
2108 2512  
2109 2513  /*
2110 2514   * Generic functions.
2111 2515   */
↓ open down ↓ 75 lines elided ↑ open up ↑
2187 2591           * will take care of setting the correct state.
2188 2592           */
2189 2593          if (!(atgep->atge_chip_state & ATGE_CHIP_SUSPENDED)) {
2190 2594                  atgep->atge_chip_state |= ATGE_CHIP_STOPPED;
2191 2595                  atgep->atge_chip_state &= ~ATGE_CHIP_RUNNING;
2192 2596          }
2193 2597  
2194 2598          /*
2195 2599           * Collect stats for L1E. L1 chip's stats are collected by interrupt.
2196 2600           */
2197      -        if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E) {
     2601 +        switch (ATGE_MODEL(atgep)) {
     2602 +        case ATGE_CHIP_L1E:
2198 2603                  atge_l1e_gather_stats(atgep);
     2604 +                break;
     2605 +        case ATGE_CHIP_L1:
     2606 +        case ATGE_CHIP_L1C:
     2607 +                break;
2199 2608          }
2200 2609  
2201 2610          /*
2202 2611           * Disable interrupts.
2203 2612           */
2204 2613          atge_disable_intrs(atgep);
2205 2614  
2206      -        if (ATGE_MODEL(atgep) == ATGE_CHIP_L1)
     2615 +        switch (ATGE_MODEL(atgep)) {
     2616 +        case ATGE_CHIP_L1E:
     2617 +                /* Clear CTRL not required. */
     2618 +                /* Stop DMA Engine not required. */
     2619 +                /*
     2620 +                 * Disable queue processing.
     2621 +                 */
     2622 +                /* Stop TxQ */
     2623 +                reg = INL(atgep, ATGE_TXQ_CFG);
     2624 +                reg = reg & ~TXQ_CFG_ENB;
     2625 +                OUTL(atgep, ATGE_TXQ_CFG, reg);
     2626 +                /* Stop RxQ */
     2627 +                reg = INL(atgep, ATGE_RXQ_CFG);
     2628 +                reg = reg & ~RXQ_CFG_ENB;
     2629 +                OUTL(atgep, ATGE_RXQ_CFG, reg);
     2630 +                /* Stop DMA */
     2631 +                reg = INL(atgep, ATGE_DMA_CFG);
     2632 +                reg = reg & ~(DMA_CFG_TXCMB_ENB | DMA_CFG_RXCMB_ENB);
     2633 +                OUTL(atgep, ATGE_DMA_CFG, reg);
     2634 +                drv_usecwait(1000);
     2635 +                atge_l1e_stop_mac(atgep);
     2636 +                OUTL(atgep, ATGE_INTR_STATUS, 0xFFFFFFFF);
     2637 +                break;
     2638 +        case ATGE_CHIP_L1:
     2639 +                /* Clear CTRL. */
2207 2640                  OUTL(atgep, L1_CSMB_CTRL, 0);
2208      -
2209      -        /* Stop DMA Engine */
2210      -        if (ATGE_MODEL(atgep) == ATGE_CHIP_L1) {
     2641 +                /* Stop DMA Engine */
2211 2642                  atge_l1_stop_tx_mac(atgep);
2212 2643                  atge_l1_stop_rx_mac(atgep);
2213      -
2214 2644                  reg = INL(atgep, ATGE_DMA_CFG);
2215 2645                  reg &= ~(DMA_CFG_RD_ENB | DMA_CFG_WR_ENB);
2216 2646                  OUTL(atgep, ATGE_DMA_CFG, reg);
2217      -
2218      -        }
2219      -
2220      -        /*
2221      -         * Disable queue processing.
2222      -         */
2223      -        /* Stop TxQ */
2224      -        reg = INL(atgep, ATGE_TXQ_CFG);
2225      -        reg = reg & ~TXQ_CFG_ENB;
2226      -        OUTL(atgep, ATGE_TXQ_CFG, reg);
2227      -
2228      -        /* Stop RxQ */
2229      -        reg = INL(atgep, ATGE_RXQ_CFG);
2230      -        reg = reg & ~RXQ_CFG_ENB;
2231      -        OUTL(atgep, ATGE_RXQ_CFG, reg);
2232      -
2233      -        if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E) {
     2647 +                /*
     2648 +                 * Disable queue processing.
     2649 +                 */
     2650 +                /* Stop TxQ */
     2651 +                reg = INL(atgep, ATGE_TXQ_CFG);
     2652 +                reg = reg & ~TXQ_CFG_ENB;
     2653 +                OUTL(atgep, ATGE_TXQ_CFG, reg);
     2654 +                /* Stop RxQ */
     2655 +                reg = INL(atgep, ATGE_RXQ_CFG);
     2656 +                reg = reg & ~RXQ_CFG_ENB;
     2657 +                OUTL(atgep, ATGE_RXQ_CFG, reg);
     2658 +                break;
     2659 +        case ATGE_CHIP_L1C:
     2660 +                /* Clear CTRL not required. */
     2661 +                /* Stop DMA Engine */
     2662 +                atge_l1c_stop_tx_mac(atgep);
     2663 +                atge_l1c_stop_rx_mac(atgep);
2234 2664                  reg = INL(atgep, ATGE_DMA_CFG);
2235      -                reg = reg & ~(DMA_CFG_TXCMB_ENB | DMA_CFG_RXCMB_ENB);
     2665 +                reg &= ~(DMA_CFG_RD_ENB | DMA_CFG_WR_ENB);
2236 2666                  OUTL(atgep, ATGE_DMA_CFG, reg);
2237      -                drv_usecwait(1000);
2238      -                atge_l1e_stop_mac(atgep);
2239      -                OUTL(atgep, ATGE_INTR_STATUS, 0xFFFFFFFF);
     2667 +                /*
     2668 +                 * Disable queue processing.
     2669 +                 */
     2670 +                /* Stop TxQ */
     2671 +                reg = INL(atgep, L1C_TXQ_CFG);
     2672 +                reg = reg & ~TXQ_CFG_ENB;
     2673 +                OUTL(atgep, L1C_TXQ_CFG, reg);
     2674 +                /* Stop RxQ */
     2675 +                reg = INL(atgep, ATGE_RXQ_CFG);
     2676 +                reg = reg & ~RXQ_CFG_ENB;
     2677 +                OUTL(atgep, ATGE_RXQ_CFG, reg);
     2678 +                break;
2240 2679          }
2241 2680  
2242 2681          for (t = ATGE_RESET_TIMEOUT; t > 0; t--) {
2243 2682                  if ((reg = INL(atgep, ATGE_IDLE_STATUS)) == 0)
2244 2683                          break;
2245 2684                  drv_usecwait(10);
2246 2685          }
2247 2686  
2248 2687          if (t == 0) {
2249 2688                  atge_error(atgep->atge_dip, "%s() stopping TX/RX MAC timeout",
↓ open down ↓ 4 lines elided ↑ open up ↑
2254 2693  void
2255 2694  atge_disable_intrs(atge_t *atgep)
2256 2695  {
2257 2696          OUTL(atgep, ATGE_INTR_MASK, 0);
2258 2697          OUTL(atgep, ATGE_INTR_STATUS, 0xFFFFFFFF);
2259 2698  }
2260 2699  
2261 2700  void
2262 2701  atge_device_init(atge_t *atgep)
2263 2702  {
2264      -        if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E) {
     2703 +        switch (ATGE_MODEL(atgep)) {
     2704 +        case ATGE_CHIP_L1E:
2265 2705                  atgep->atge_intrs = L1E_INTRS;
2266 2706                  atgep->atge_int_mod = ATGE_IM_TIMER_DEFAULT;
2267 2707  
2268 2708                  atge_l1e_init_tx_ring(atgep);
2269 2709                  atge_l1e_init_rx_pages(atgep);
2270      -        } else if (ATGE_MODEL(atgep) == ATGE_CHIP_L1) {
     2710 +                break;
     2711 +        case ATGE_CHIP_L1:
2271 2712                  atgep->atge_intrs = L1_INTRS | INTR_GPHY | INTR_PHY_LINK_DOWN |
2272 2713                      INTR_LINK_CHG;
2273 2714                  atgep->atge_int_mod = ATGE_IM_TIMER_DEFAULT;
2274 2715  
2275 2716                  atge_l1_init_tx_ring(atgep);
2276 2717                  atge_l1_init_rx_ring(atgep);
2277 2718                  atge_l1_init_rr_ring(atgep);
2278 2719                  atge_l1_init_cmb(atgep);
2279 2720                  atge_l1_init_smb(atgep);
     2721 +                break;
     2722 +        case ATGE_CHIP_L1C:
     2723 +                atgep->atge_intrs = L1C_INTRS | L1C_INTR_GPHY |
     2724 +                    L1C_INTR_PHY_LINK_DOWN;
     2725 +                atgep->atge_int_rx_mod = 400/2;
     2726 +                atgep->atge_int_tx_mod = 2000/1;
     2727 +
     2728 +                atge_l1c_init_tx_ring(atgep);
     2729 +                atge_l1c_init_rx_ring(atgep);
     2730 +                atge_l1c_init_rr_ring(atgep);
     2731 +                atge_l1c_init_cmb(atgep);
     2732 +                atge_l1c_init_smb(atgep);
     2733 +
     2734 +                /* Enable all clocks. */
     2735 +                OUTL(atgep, ATGE_CLK_GATING_CFG, 0);
     2736 +                break;
2280 2737          }
2281 2738  }
2282 2739  
2283 2740  void
2284 2741  atge_device_restart(atge_t *atgep)
2285 2742  {
2286 2743          ASSERT(MUTEX_HELD(&atgep->atge_intr_lock));
2287 2744          ASSERT(MUTEX_HELD(&atgep->atge_tx_lock));
2288 2745  
2289 2746          /*
↓ open down ↓ 14 lines elided ↑ open up ↑
2304 2761          /*
2305 2762           * Start the chip.
2306 2763           */
2307 2764          atge_device_start(atgep);
2308 2765  
2309 2766  }
2310 2767  
2311 2768  static int
2312 2769  atge_send_a_packet(atge_t *atgep, mblk_t *mp)
2313 2770  {
2314      -        atge_tx_desc_t  *txd;
2315 2771          uchar_t *c;
2316 2772          uint32_t cflags = 0;
2317 2773          atge_ring_t *r;
2318 2774          size_t pktlen;
2319 2775          uchar_t *buf;
2320 2776          int     start;
2321 2777  
2322 2778          ASSERT(MUTEX_HELD(&atgep->atge_tx_lock));
2323 2779          ASSERT(mp != NULL);
2324 2780  
↓ open down ↓ 29 lines elided ↑ open up ↑
2354 2810          buf = (uchar_t *)r->r_buf_tbl[start]->addr;
2355 2811  
2356 2812          /*
2357 2813           * Copy the msg and free mp
2358 2814           */
2359 2815          mcopymsg(mp, buf);
2360 2816  
2361 2817          r->r_avail_desc--;
2362 2818  
2363 2819          c = (uchar_t *)r->r_desc_ring->addr;
2364      -        c += (sizeof (atge_tx_desc_t) * start);
2365      -        txd = (atge_tx_desc_t *)c;
     2820 +        switch (ATGE_MODEL(atgep)) {
     2821 +        case ATGE_CHIP_L1C:
     2822 +                {
     2823 +                l1c_tx_desc_t   *txd;
2366 2824  
2367      -        ATGE_PUT64(r->r_desc_ring, &txd->addr,
2368      -            r->r_buf_tbl[start]->cookie.dmac_laddress);
     2825 +                c += (sizeof (l1c_tx_desc_t) * start);
     2826 +                txd = (l1c_tx_desc_t *)c;
2369 2827  
2370      -        ATGE_PUT32(r->r_desc_ring, &txd->len, ATGE_TX_BYTES(pktlen));
     2828 +                ATGE_PUT64(r->r_desc_ring, &txd->addr,
     2829 +                    r->r_buf_tbl[start]->cookie.dmac_laddress);
2371 2830  
2372      -        cflags |= ATGE_TD_EOP;
2373      -        ATGE_PUT32(r->r_desc_ring, &txd->flags, cflags);
     2831 +                ATGE_PUT32(r->r_desc_ring, &txd->len, L1C_TX_BYTES(pktlen));
2374 2832  
     2833 +                cflags |= L1C_TD_EOP;
     2834 +                ATGE_PUT32(r->r_desc_ring, &txd->flags, cflags);
     2835 +                break;
     2836 +                }
     2837 +        default:
     2838 +                {
     2839 +                atge_tx_desc_t  *txd;
     2840 +
     2841 +                c += (sizeof (atge_tx_desc_t) * start);
     2842 +                txd = (atge_tx_desc_t *)c;
     2843 +
     2844 +                ATGE_PUT64(r->r_desc_ring, &txd->addr,
     2845 +                    r->r_buf_tbl[start]->cookie.dmac_laddress);
     2846 +
     2847 +                ATGE_PUT32(r->r_desc_ring, &txd->len, ATGE_TX_BYTES(pktlen));
     2848 +
     2849 +                cflags |= ATGE_TD_EOP;
     2850 +                ATGE_PUT32(r->r_desc_ring, &txd->flags, cflags);
     2851 +                break;
     2852 +                }
     2853 +        }
2375 2854          /*
2376 2855           * Sync buffer first.
2377 2856           */
2378 2857          DMA_SYNC(r->r_buf_tbl[start], 0, pktlen, DDI_DMA_SYNC_FORDEV);
2379 2858  
2380 2859          /*
2381 2860           * Increment TX producer count by one.
2382 2861           */
2383 2862          ATGE_INC_SLOT(r->r_producer, ATGE_TX_RING_CNT);
2384 2863  
2385 2864          /*
2386 2865           * Sync descriptor table.
2387 2866           */
2388 2867          DMA_SYNC(r->r_desc_ring, 0, ATGE_TX_RING_SZ, DDI_DMA_SYNC_FORDEV);
2389 2868  
2390 2869          /*
2391 2870           * Program TX descriptor to send a packet.
2392 2871           */
2393      -        if (ATGE_MODEL(atgep) == ATGE_CHIP_L1E) {
     2872 +        switch (ATGE_MODEL(atgep)) {
     2873 +        case ATGE_CHIP_L1E:
2394 2874                  atge_l1e_send_packet(r);
2395      -        } else if (ATGE_MODEL(atgep) == ATGE_CHIP_L1) {
     2875 +                break;
     2876 +        case ATGE_CHIP_L1:
2396 2877                  atge_l1_send_packet(r);
     2878 +                break;
     2879 +        case ATGE_CHIP_L1C:
     2880 +                atge_l1c_send_packet(r);
     2881 +                break;
2397 2882          }
2398 2883  
2399 2884          r->r_atge->atge_opackets++;
2400 2885          r->r_atge->atge_obytes += pktlen;
2401 2886  
2402 2887          ATGE_DB(("%s: %s() pktlen : %d, avail_desc : %d, producer  :%d, "
2403 2888              "consumer : %d", atgep->atge_name, __func__, pktlen,
2404 2889              r->r_avail_desc, r->r_producer, r->r_consumer));
2405 2890  
2406 2891          return (DDI_SUCCESS);
↓ open down ↓ 55 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX