Author: jfv
Date: Sat Jul  6 22:34:42 2013
New Revision: 252899
URL: http://svnweb.freebsd.org/changeset/base/252899

Log:
  MFC e1000 driver revisions: 248906,248908,249074,249339,249509
                              250108,250109,250168,250413,250414

Modified:
  stable/9/sys/dev/e1000/README
  stable/9/sys/dev/e1000/if_em.c
  stable/9/sys/dev/e1000/if_igb.c
  stable/9/sys/dev/e1000/if_igb.h
  stable/9/sys/dev/e1000/if_lem.c
Directory Properties:
  stable/9/sys/dev/e1000/   (props changed)

Modified: stable/9/sys/dev/e1000/README
==============================================================================
--- stable/9/sys/dev/e1000/README       Sat Jul  6 21:38:55 2013        
(r252898)
+++ stable/9/sys/dev/e1000/README       Sat Jul  6 22:34:42 2013        
(r252899)
@@ -389,7 +389,7 @@ For general information and support, go 
         http://support.intel.com
 
 If an issue is identified, support is through email only at:
-freebsd...@mailbox.intel.com
+free...@intel.com
 
 
 License

Modified: stable/9/sys/dev/e1000/if_em.c
==============================================================================
--- stable/9/sys/dev/e1000/if_em.c      Sat Jul  6 21:38:55 2013        
(r252898)
+++ stable/9/sys/dev/e1000/if_em.c      Sat Jul  6 22:34:42 2013        
(r252899)
@@ -94,7 +94,7 @@ int   em_display_debug_stats = 0;
 /*********************************************************************
  *  Driver version:
  *********************************************************************/
-char em_driver_version[] = "7.3.7";
+char em_driver_version[] = "7.3.8";
 
 /*********************************************************************
  *  PCI Device ID Table
@@ -2141,12 +2141,37 @@ em_set_promisc(struct adapter *adapter)
 static void
 em_disable_promisc(struct adapter *adapter)
 {
-       u32     reg_rctl;
+       struct ifnet    *ifp = adapter->ifp;
+       u32             reg_rctl;
+       int             mcnt = 0;
 
        reg_rctl = E1000_READ_REG(&adapter->hw, E1000_RCTL);
-
        reg_rctl &=  (~E1000_RCTL_UPE);
-       reg_rctl &=  (~E1000_RCTL_MPE);
+       if (ifp->if_flags & IFF_ALLMULTI)
+               mcnt = MAX_NUM_MULTICAST_ADDRESSES;
+       else {
+               struct  ifmultiaddr *ifma;
+#if __FreeBSD_version < 800000
+               IF_ADDR_LOCK(ifp);
+#else   
+               if_maddr_rlock(ifp);
+#endif
+               TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
+                       if (ifma->ifma_addr->sa_family != AF_LINK)
+                               continue;
+                       if (mcnt == MAX_NUM_MULTICAST_ADDRESSES)
+                               break;
+                       mcnt++;
+               }
+#if __FreeBSD_version < 800000
+               IF_ADDR_UNLOCK(ifp);
+#else
+               if_maddr_runlock(ifp);
+#endif
+       }
+       /* Don't disable if in MAX groups */
+       if (mcnt < MAX_NUM_MULTICAST_ADDRESSES)
+               reg_rctl &=  (~E1000_RCTL_MPE);
        reg_rctl &=  (~E1000_RCTL_SBP);
        E1000_WRITE_REG(&adapter->hw, E1000_RCTL, reg_rctl);
 }
@@ -4295,11 +4320,12 @@ em_initialize_receive_unit(struct adapte
                E1000_WRITE_REG(hw, E1000_RFCTL, E1000_RFCTL_ACK_DIS);
        }
 
-       if (ifp->if_capenable & IFCAP_RXCSUM) {
-               rxcsum = E1000_READ_REG(hw, E1000_RXCSUM);
-               rxcsum |= (E1000_RXCSUM_IPOFL | E1000_RXCSUM_TUOFL);
-               E1000_WRITE_REG(hw, E1000_RXCSUM, rxcsum);
-       }
+       rxcsum = E1000_READ_REG(hw, E1000_RXCSUM);
+       if (ifp->if_capenable & IFCAP_RXCSUM)
+               rxcsum |= E1000_RXCSUM_TUOFL;
+       else
+               rxcsum &= ~E1000_RXCSUM_TUOFL;
+       E1000_WRITE_REG(hw, E1000_RXCSUM, rxcsum);
 
        /*
        ** XXX TEMPORARY WORKAROUND: on some systems with 82573
@@ -4603,31 +4629,23 @@ em_fixup_rx(struct rx_ring *rxr)
 static void
 em_receive_checksum(struct e1000_rx_desc *rx_desc, struct mbuf *mp)
 {
+       mp->m_pkthdr.csum_flags = 0;
+
        /* Ignore Checksum bit is set */
-       if (rx_desc->status & E1000_RXD_STAT_IXSM) {
-               mp->m_pkthdr.csum_flags = 0;
+       if (rx_desc->status & E1000_RXD_STAT_IXSM)
                return;
-       }
-
-       if (rx_desc->status & E1000_RXD_STAT_IPCS) {
-               /* Did it pass? */
-               if (!(rx_desc->errors & E1000_RXD_ERR_IPE)) {
-                       /* IP Checksum Good */
-                       mp->m_pkthdr.csum_flags = CSUM_IP_CHECKED;
-                       mp->m_pkthdr.csum_flags |= CSUM_IP_VALID;
 
-               } else {
-                       mp->m_pkthdr.csum_flags = 0;
-               }
-       }
+       if (rx_desc->errors & (E1000_RXD_ERR_TCPE | E1000_RXD_ERR_IPE))
+               return;
 
-       if (rx_desc->status & E1000_RXD_STAT_TCPCS) {
-               /* Did it pass? */
-               if (!(rx_desc->errors & E1000_RXD_ERR_TCPE)) {
-                       mp->m_pkthdr.csum_flags |=
-                       (CSUM_DATA_VALID | CSUM_PSEUDO_HDR);
-                       mp->m_pkthdr.csum_data = htons(0xffff);
-               }
+       /* IP Checksum Good? */
+       if (rx_desc->status & E1000_RXD_STAT_IPCS)
+               mp->m_pkthdr.csum_flags = (CSUM_IP_CHECKED | CSUM_IP_VALID);
+
+       /* TCP or UDP checksum */
+       if (rx_desc->status & (E1000_RXD_STAT_TCPCS | E1000_RXD_STAT_UDPCS)) {
+               mp->m_pkthdr.csum_flags |= (CSUM_DATA_VALID | CSUM_PSEUDO_HDR);
+               mp->m_pkthdr.csum_data = htons(0xffff);
        }
 }
 

Modified: stable/9/sys/dev/e1000/if_igb.c
==============================================================================
--- stable/9/sys/dev/e1000/if_igb.c     Sat Jul  6 21:38:55 2013        
(r252898)
+++ stable/9/sys/dev/e1000/if_igb.c     Sat Jul  6 22:34:42 2013        
(r252899)
@@ -42,7 +42,7 @@
 
 #include <sys/param.h>
 #include <sys/systm.h>
-#if __FreeBSD_version >= 800000
+#ifndef IGB_LEGACY_TX
 #include <sys/buf_ring.h>
 #endif
 #include <sys/bus.h>
@@ -100,7 +100,7 @@ int igb_display_debug_stats = 0;
 /*********************************************************************
  *  Driver version:
  *********************************************************************/
-char igb_driver_version[] = "version - 2.3.9";
+char igb_driver_version[] = "version - 2.3.10";
 
 
 /*********************************************************************
@@ -179,7 +179,7 @@ static int  igb_detach(device_t);
 static int     igb_shutdown(device_t);
 static int     igb_suspend(device_t);
 static int     igb_resume(device_t);
-#if __FreeBSD_version >= 800000
+#ifndef IGB_LEGACY_TX
 static int     igb_mq_start(struct ifnet *, struct mbuf *);
 static int     igb_mq_start_locked(struct ifnet *, struct tx_ring *);
 static void    igb_qflush(struct ifnet *);
@@ -374,9 +374,9 @@ SYSCTL_INT(_hw_igb, OID_AUTO, header_spl
     "Enable receive mbuf header split");
 
 /*
-** This will autoconfigure based on
-** the number of CPUs and max supported MSI-X messages
-** if left at 0.
+** This will autoconfigure based on the
+** number of CPUs and max supported
+** MSIX messages if left at 0.
 */
 static int igb_num_queues = 0;
 TUNABLE_INT("hw.igb.num_queues", &igb_num_queues);
@@ -851,7 +851,7 @@ igb_resume(device_t dev)
            (ifp->if_drv_flags & IFF_DRV_RUNNING) && adapter->link_active) {
                for (int i = 0; i < adapter->num_queues; i++, txr++) {
                        IGB_TX_LOCK(txr);
-#if __FreeBSD_version >= 800000
+#ifndef IGB_LEGACY_TX
                        /* Process the stack queue only if not depleted */
                        if (((txr->queue_status & IGB_QUEUE_DEPLETED) == 0) &&
                            !drbr_empty(ifp, txr->br))
@@ -869,7 +869,7 @@ igb_resume(device_t dev)
 }
 
 
-#if __FreeBSD_version < 800000
+#ifdef IGB_LEGACY_TX
 
 /*********************************************************************
  *  Transmit entry point
@@ -947,7 +947,7 @@ igb_start(struct ifnet *ifp)
        return;
 }
 
-#else /* __FreeBSD_version >= 800000 */
+#else /* ~IGB_LEGACY_TX */
 
 /*
 ** Multiqueue Transmit Entry:
@@ -1062,7 +1062,7 @@ igb_qflush(struct ifnet *ifp)
        }
        if_qflush(ifp);
 }
-#endif /* __FreeBSD_version >= 800000 */
+#endif /* ~IGB_LEGACY_TX */
 
 /*********************************************************************
  *  Ioctl entry point
@@ -1388,7 +1388,7 @@ igb_handle_que(void *context, int pendin
 
                IGB_TX_LOCK(txr);
                igb_txeof(txr);
-#if __FreeBSD_version >= 800000
+#ifndef IGB_LEGACY_TX
                /* Process the stack queue only if not depleted */
                if (((txr->queue_status & IGB_QUEUE_DEPLETED) == 0) &&
                    !drbr_empty(ifp, txr->br))
@@ -1439,7 +1439,7 @@ igb_handle_link_locked(struct adapter *a
        if ((ifp->if_drv_flags & IFF_DRV_RUNNING) && adapter->link_active) {
                for (int i = 0; i < adapter->num_queues; i++, txr++) {
                        IGB_TX_LOCK(txr);
-#if __FreeBSD_version >= 800000
+#ifndef IGB_LEGACY_TX
                        /* Process the stack queue only if not depleted */
                        if (((txr->queue_status & IGB_QUEUE_DEPLETED) == 0) &&
                            !drbr_empty(ifp, txr->br))
@@ -1541,7 +1541,7 @@ igb_poll(struct ifnet *ifp, enum poll_cm
                do {
                        more = igb_txeof(txr);
                } while (loop-- && more);
-#if __FreeBSD_version >= 800000
+#ifndef IGB_LEGACY_TX
                if (!drbr_empty(ifp, txr->br))
                        igb_mq_start_locked(ifp, txr);
 #else
@@ -1576,7 +1576,7 @@ igb_msix_que(void *arg)
 
        IGB_TX_LOCK(txr);
        igb_txeof(txr);
-#if __FreeBSD_version >= 800000
+#ifndef IGB_LEGACY_TX
        /* Process the stack queue only if not depleted */
        if (((txr->queue_status & IGB_QUEUE_DEPLETED) == 0) &&
            !drbr_empty(ifp, txr->br))
@@ -2096,7 +2096,9 @@ static void
 igb_disable_promisc(struct adapter *adapter)
 {
        struct e1000_hw *hw = &adapter->hw;
+       struct ifnet    *ifp = adapter->ifp;
        u32             reg;
+       int             mcnt = 0;
 
        if (adapter->vf_ifp) {
                e1000_promisc_set_vf(hw, e1000_promisc_disabled);
@@ -2104,7 +2106,31 @@ igb_disable_promisc(struct adapter *adap
        }
        reg = E1000_READ_REG(hw, E1000_RCTL);
        reg &=  (~E1000_RCTL_UPE);
-       reg &=  (~E1000_RCTL_MPE);
+       if (ifp->if_flags & IFF_ALLMULTI)
+               mcnt = MAX_NUM_MULTICAST_ADDRESSES;
+       else {
+               struct  ifmultiaddr *ifma;
+#if __FreeBSD_version < 800000
+               IF_ADDR_LOCK(ifp);
+#else   
+               if_maddr_rlock(ifp);
+#endif
+               TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
+                       if (ifma->ifma_addr->sa_family != AF_LINK)
+                               continue;
+                       if (mcnt == MAX_NUM_MULTICAST_ADDRESSES)
+                               break;
+                       mcnt++;
+               }
+#if __FreeBSD_version < 800000
+               IF_ADDR_UNLOCK(ifp);
+#else
+               if_maddr_runlock(ifp);
+#endif
+       }
+       /* Don't disable if in MAX groups */
+       if (mcnt < MAX_NUM_MULTICAST_ADDRESSES)
+               reg &=  (~E1000_RCTL_MPE);
        E1000_WRITE_REG(hw, E1000_RCTL, reg);
 }
 
@@ -2448,7 +2474,6 @@ igb_allocate_legacy(struct adapter *adap
 {
        device_t                dev = adapter->dev;
        struct igb_queue        *que = adapter->queues;
-       struct tx_ring          *txr = adapter->tx_rings;
        int                     error, rid = 0;
 
        /* Turn off all interrupts */
@@ -2467,8 +2492,8 @@ igb_allocate_legacy(struct adapter *adap
                return (ENXIO);
        }
 
-#if __FreeBSD_version >= 800000
-       TASK_INIT(&txr->txq_task, 0, igb_deferred_mq_start, txr);
+#ifndef IGB_LEGACY_TX
+       TASK_INIT(&que->txr->txq_task, 0, igb_deferred_mq_start, que->txr);
 #endif
 
        /*
@@ -2551,7 +2576,7 @@ igb_allocate_msix(struct adapter *adapte
                                i,igb_last_bind_cpu);
                        igb_last_bind_cpu = CPU_NEXT(igb_last_bind_cpu);
                }
-#if __FreeBSD_version >= 800000
+#ifndef IGB_LEGACY_TX
                TASK_INIT(&que->txr->txq_task, 0, igb_deferred_mq_start,
                    que->txr);
 #endif
@@ -2777,7 +2802,7 @@ igb_free_pci_resources(struct adapter *a
 
        for (int i = 0; i < adapter->num_queues; i++, que++) {
                if (que->tq != NULL) {
-#if __FreeBSD_version >= 800000
+#ifndef IGB_LEGACY_TX
                        taskqueue_drain(que->tq, &que->txr->txq_task);
 #endif
                        taskqueue_drain(que->tq, &que->que_task);
@@ -3087,7 +3112,7 @@ igb_setup_interface(device_t dev, struct
        ifp->if_softc = adapter;
        ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
        ifp->if_ioctl = igb_ioctl;
-#if __FreeBSD_version >= 800000
+#ifndef IGB_LEGACY_TX
        ifp->if_transmit = igb_mq_start;
        ifp->if_qflush = igb_qflush;
 #else
@@ -3331,7 +3356,7 @@ igb_allocate_queues(struct adapter *adap
                        error = ENOMEM;
                        goto err_tx_desc;
                }
-#if __FreeBSD_version >= 800000
+#ifndef IGB_LEGACY_TX
                /* Allocate a buf ring */
                txr->br = buf_ring_alloc(igb_buf_ring_size, M_DEVBUF,
                    M_WAITOK, &txr->tx_mtx);
@@ -3392,7 +3417,7 @@ err_tx_desc:
                igb_dma_free(adapter, &txr->txdma);
        free(adapter->rx_rings, M_DEVBUF);
 rx_fail:
-#if __FreeBSD_version >= 800000
+#ifndef IGB_LEGACY_TX
        buf_ring_free(txr->br, M_DEVBUF);
 #endif
        free(adapter->tx_rings, M_DEVBUF);
@@ -3650,7 +3675,7 @@ igb_free_transmit_buffers(struct tx_ring
                        tx_buffer->map = NULL;
                }
        }
-#if __FreeBSD_version >= 800000
+#ifndef IGB_LEGACY_TX
        if (txr->br != NULL)
                buf_ring_free(txr->br, M_DEVBUF);
 #endif
@@ -4854,7 +4879,7 @@ igb_rxeof(struct igb_queue *que, int cou
                                rxr->fmp->m_pkthdr.ether_vtag = vtag;
                                rxr->fmp->m_flags |= M_VLANTAG;
                        }
-#if __FreeBSD_version >= 800000
+#ifndef IGB_LEGACY_TX
                        rxr->fmp->m_pkthdr.flowid = que->msix;
                        rxr->fmp->m_flags |= M_FLOWID;
 #endif

Modified: stable/9/sys/dev/e1000/if_igb.h
==============================================================================
--- stable/9/sys/dev/e1000/if_igb.h     Sat Jul  6 21:38:55 2013        
(r252898)
+++ stable/9/sys/dev/e1000/if_igb.h     Sat Jul  6 22:34:42 2013        
(r252899)
@@ -297,7 +297,7 @@ struct tx_ring {
        u32                     next_to_clean;
        volatile u16            tx_avail;
        struct igb_tx_buffer    *tx_buffers;
-#if __FreeBSD_version >= 800000
+#ifndef IGB_LEGACY_TX
        struct buf_ring         *br;
        struct task             txq_task;
 #endif

Modified: stable/9/sys/dev/e1000/if_lem.c
==============================================================================
--- stable/9/sys/dev/e1000/if_lem.c     Sat Jul  6 21:38:55 2013        
(r252898)
+++ stable/9/sys/dev/e1000/if_lem.c     Sat Jul  6 22:34:42 2013        
(r252899)
@@ -85,7 +85,7 @@
 /*********************************************************************
  *  Legacy Em Driver version:
  *********************************************************************/
-char lem_driver_version[] = "1.0.5";
+char lem_driver_version[] = "1.0.6";
 
 /*********************************************************************
  *  PCI Device ID Table
@@ -1868,12 +1868,37 @@ lem_set_promisc(struct adapter *adapter)
 static void
 lem_disable_promisc(struct adapter *adapter)
 {
-       u32     reg_rctl;
+       struct ifnet    *ifp = adapter->ifp;
+       u32             reg_rctl;
+       int             mcnt = 0;
 
        reg_rctl = E1000_READ_REG(&adapter->hw, E1000_RCTL);
-
        reg_rctl &=  (~E1000_RCTL_UPE);
-       reg_rctl &=  (~E1000_RCTL_MPE);
+       if (ifp->if_flags & IFF_ALLMULTI)
+               mcnt = MAX_NUM_MULTICAST_ADDRESSES;
+       else {
+               struct  ifmultiaddr *ifma;
+#if __FreeBSD_version < 800000
+               IF_ADDR_LOCK(ifp);
+#else   
+               if_maddr_rlock(ifp);
+#endif
+               TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
+                       if (ifma->ifma_addr->sa_family != AF_LINK)
+                               continue;
+                       if (mcnt == MAX_NUM_MULTICAST_ADDRESSES)
+                               break;
+                       mcnt++;
+               }
+#if __FreeBSD_version < 800000
+               IF_ADDR_UNLOCK(ifp);
+#else
+               if_maddr_runlock(ifp);
+#endif
+       }
+       /* Don't disable if in MAX groups */
+       if (mcnt < MAX_NUM_MULTICAST_ADDRESSES)
+               reg_rctl &=  (~E1000_RCTL_MPE);
        reg_rctl &=  (~E1000_RCTL_SBP);
        E1000_WRITE_REG(&adapter->hw, E1000_RCTL, reg_rctl);
 }
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to