Print this page
MFV: illumos-gate@5bb0bdfe588c5df0f63ff8ac292cd608a5f4492a
9950 Need support for Intel I219 v6-v9
Reviewed by: Jason King <jason.king@joyent.com>
Reviewed by: Garrett D'Amore <garrett@damore.org>
Approved by: Garrett D'Amore <garrett@damore.org>
Author: Robert Mustacchi <rm@joyent.com>
4547 e1000g common code doesn't account for LockMAC
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Richard Lowe <richlowe@richlowe.net>
Reviewed by: Garrett D'Amore <garrett@damore.org>
Reviewed by: Jason King <jason.brian.king@gmail.com>
Approved by: Garrett D'Amore <garrett@damore.org>
re #12675 rb4109 some e1000g devices don't support 15 unicast addresses

@@ -23,11 +23,11 @@
  */
 
 /*
  * Copyright 2012 DEY Storage Systems, Inc.  All rights reserved.
  * Copyright 2013 Nexenta Systems, Inc.  All rights reserved.
- * Copyright (c) 2017, Joyent, Inc.
+ * Copyright (c) 2018, Joyent, Inc.
  */
 
 /*
  * **********************************************************************
  *                                                                      *

@@ -709,10 +709,11 @@
                             "ddi_regs_map_setup for ICH flash failed");
                         goto regs_map_fail;
                 }
                 break;
         case e1000_pch_spt:
+        case e1000_pch_cnp:
                 /*
                  * On the SPT, the device flash is actually in BAR0, not a
                  * separate BAR. Therefore we end up setting the
                  * ich_flash_handle to be the same as the register handle.
                  * We mark the same to reduce the confusion in the other

@@ -778,11 +779,11 @@
         return (DDI_SUCCESS);
 
 regs_map_fail:
         if (osdep->reg_handle != NULL)
                 ddi_regs_map_free(&osdep->reg_handle);
-        if (osdep->ich_flash_handle != NULL && hw->mac.type != e1000_pch_spt)
+        if (osdep->ich_flash_handle != NULL && hw->mac.type < e1000_pch_spt)
                 ddi_regs_map_free(&osdep->ich_flash_handle);
         return (DDI_FAILURE);
 }
 
 static int

@@ -907,10 +908,11 @@
                 break;
         /* pch2 can do jumbo frames up to 9K */
         case e1000_pch2lan:
         case e1000_pch_lpt:
         case e1000_pch_spt:
+        case e1000_pch_cnp:
                 Adapter->max_mtu = MAXIMUM_MTU_9K;
                 break;
         /* types with a special limit */
         case e1000_82571:
         case e1000_82572:

@@ -1145,11 +1147,11 @@
 
         if (Adapter->attach_progress & ATTACH_PROGRESS_REGS_MAP) {
                 if (Adapter->osdep.reg_handle != NULL)
                         ddi_regs_map_free(&Adapter->osdep.reg_handle);
                 if (Adapter->osdep.ich_flash_handle != NULL &&
-                    Adapter->shared.mac.type != e1000_pch_spt)
+                    Adapter->shared.mac.type < e1000_pch_spt)
                         ddi_regs_map_free(&Adapter->osdep.ich_flash_handle);
                 if (Adapter->osdep.io_reg_handle != NULL)
                         ddi_regs_map_free(&Adapter->osdep.io_reg_handle);
         }
 

@@ -1484,10 +1486,12 @@
                 pba = E1000_PBA_26K;
         } else if (hw->mac.type == e1000_pch_lpt) {
                 pba = E1000_PBA_26K;
         } else if (hw->mac.type == e1000_pch_spt) {
                 pba = E1000_PBA_26K;
+        } else if (hw->mac.type == e1000_pch_cnp) {
+                pba = E1000_PBA_26K;
         } else {
                 /*
                  * Total FIFO is 40K
                  */
                 if (Adapter->max_frame_size > FRAME_SIZE_UPTO_8K)

@@ -1710,14 +1714,14 @@
          */
         switch (hw->phy.media_type) {
         case e1000_media_type_copper:
                 if (hw->mac.get_link_status) {
                         /*
-                         * SPT devices need a bit of extra time before we ask
-                         * them.
+                         * SPT and newer devices need a bit of extra time before
+                         * we ask them.
                          */
-                        if (hw->mac.type == e1000_pch_spt)
+                        if (hw->mac.type >= e1000_pch_spt)
                                 msec_delay(50);
                         (void) e1000_check_for_link(hw);
                         if ((E1000_READ_REG(hw, E1000_STATUS) &
                             E1000_STATUS_LU)) {
                                 link_up = B_TRUE;

@@ -2074,11 +2078,11 @@
         /*
          * The I219, eg. the pch_spt, has bugs such that we must ensure that
          * rings are flushed before we do anything else. This must be done
          * before we release DMA resources.
          */
-        if (Adapter->shared.mac.type == e1000_pch_spt)
+        if (Adapter->shared.mac.type >= e1000_pch_spt)
                 e1000g_flush_desc_rings(Adapter);
 
         if (global) {
                 e1000g_release_dma_resources(Adapter);
 

@@ -2534,12 +2538,11 @@
                  * few of the bits set in the FWSM register. If the value is
                  * zero, everything is available. If the value is 1, none of the
                  * additional registers are available. If the value is 2-7, only
                  * that number are available.
                  */
-                if (hw->mac.type == e1000_pch_lpt ||
-                    hw->mac.type == e1000_pch_spt) {
+                if (hw->mac.type >= e1000_pch_lpt) {
                         uint32_t locked, rar;
 
                         locked = E1000_READ_REG(hw, E1000_FWSM) &
                             E1000_FWSM_WLOCK_MAC_MASK;
                         locked >>= E1000_FWSM_WLOCK_MAC_SHIFT;