Author: jfv
Date: Tue Mar 30 19:09:18 2010
New Revision: 205904
URL: http://svn.freebsd.org/changeset/base/205904

Log:
  Thanks to Michael Tuexen for adding SCTP support for 82599,
  also for finding a one character bug that kept TSO from working.
  
  Sometimes with direct attach cables a failure can occur in init,
  the old method of calling detach was broken, there is no way to
  return an error to the system from init, so I have changed it to
  return failure thru the ioctl.
  
  And, have fixed the ALTQ code changes of Max Laier, sorry Max :)

Modified:
  head/sys/dev/ixgbe/ixgbe.c
  head/sys/dev/ixgbe/ixgbe.h

Modified: head/sys/dev/ixgbe/ixgbe.c
==============================================================================
--- head/sys/dev/ixgbe/ixgbe.c  Tue Mar 30 19:08:05 2010        (r205903)
+++ head/sys/dev/ixgbe/ixgbe.c  Tue Mar 30 19:09:18 2010        (r205904)
@@ -1,6 +1,6 @@
 /******************************************************************************
 
-  Copyright (c) 2001-2010, Intel Corporation 
+  Copyright (c) 2001-2009, Intel Corporation 
   All rights reserved.
   
   Redistribution and use in source and binary forms, with or without 
@@ -46,7 +46,7 @@ int             ixgbe_display_debug_stat
 /*********************************************************************
  *  Driver version
  *********************************************************************/
-char ixgbe_driver_version[] = "2.1.6";
+char ixgbe_driver_version[] = "2.1.7";
 
 /*********************************************************************
  *  PCI Device ID Table
@@ -106,8 +106,8 @@ static int  ixgbe_mq_start_locked(struct 
 static void    ixgbe_qflush(struct ifnet *);
 #endif
 static int      ixgbe_ioctl(struct ifnet *, u_long, caddr_t);
-static void     ixgbe_init(void *);
-static void     ixgbe_init_locked(struct adapter *);
+static void    ixgbe_init(void *);
+static int     ixgbe_init_locked(struct adapter *);
 static void     ixgbe_stop(void *);
 static void     ixgbe_media_status(struct ifnet *, struct ifmediareq *);
 static int      ixgbe_media_change(struct ifnet *);
@@ -142,7 +142,7 @@ static void     ixgbe_disable_intr(struc
 static void     ixgbe_update_stats_counters(struct adapter *);
 static bool    ixgbe_txeof(struct tx_ring *);
 static bool    ixgbe_rxeof(struct ix_queue *, int);
-static void    ixgbe_rx_checksum(u32, struct mbuf *);
+static void    ixgbe_rx_checksum(u32, struct mbuf *, u32);
 static void     ixgbe_set_promisc(struct adapter *);
 static void     ixgbe_disable_promisc(struct adapter *);
 static void     ixgbe_set_multi(struct adapter *);
@@ -827,9 +827,13 @@ ixgbe_mq_start_locked(struct ifnet *ifp,
        }
 
        enqueued = 0;
-       if (m == NULL)
+       if (m == NULL) {
                next = drbr_dequeue(ifp, txr->br);
-       else
+       } else if (drbr_needs_enqueue(ifp, txr->br)) {
+               if ((err = drbr_enqueue(ifp, txr->br, m)) != 0)
+                       return (err);
+               next = drbr_dequeue(ifp, txr->br);
+       } else
                next = m;
 
        /* Process the queue */
@@ -905,7 +909,7 @@ ixgbe_ioctl(struct ifnet * ifp, u_long c
                        ifp->if_mtu = ifr->ifr_mtu;
                        adapter->max_frame_size =
                                ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
-                       ixgbe_init_locked(adapter);
+                       error = ixgbe_init_locked(adapter);
                        IXGBE_CORE_UNLOCK(adapter);
                }
                break;
@@ -920,7 +924,7 @@ ixgbe_ioctl(struct ifnet * ifp, u_long c
                                        ixgbe_set_promisc(adapter);
                                 }
                        } else
-                               ixgbe_init_locked(adapter);
+                               error = ixgbe_init_locked(adapter);
                } else
                        if (ifp->if_drv_flags & IFF_DRV_RUNNING)
                                ixgbe_stop(adapter);
@@ -955,8 +959,11 @@ ixgbe_ioctl(struct ifnet * ifp, u_long c
                        ifp->if_capenable ^= IFCAP_LRO;
                if (mask & IFCAP_VLAN_HWTAGGING)
                        ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING;
-               if (ifp->if_drv_flags & IFF_DRV_RUNNING)
-                       ixgbe_init(adapter);
+               if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
+                       IXGBE_CORE_LOCK(adapter);
+                       error = ixgbe_init_locked(adapter);
+                       IXGBE_CORE_UNLOCK(adapter);
+               }
                VLAN_CAPABILITIES(ifp);
                break;
        }
@@ -982,7 +989,7 @@ ixgbe_ioctl(struct ifnet * ifp, u_long c
  **********************************************************************/
 #define IXGBE_MHADD_MFS_SHIFT 16
 
-static void
+static int
 ixgbe_init_locked(struct adapter *adapter)
 {
        struct ifnet   *ifp = adapter->ifp;
@@ -990,7 +997,6 @@ ixgbe_init_locked(struct adapter *adapte
        struct ixgbe_hw *hw = &adapter->hw;
        u32             k, txdctl, mhadd, gpie;
        u32             rxdctl, rxctrl;
-       int             err;
 
        mtx_assert(&adapter->core_mtx, MA_OWNED);
        INIT_DEBUGOUT("ixgbe_init: begin");
@@ -1012,7 +1018,7 @@ ixgbe_init_locked(struct adapter *adapte
        if (ixgbe_setup_transmit_structures(adapter)) {
                device_printf(dev,"Could not setup transmit structures\n");
                ixgbe_stop(adapter);
-               return;
+               return (ENOMEM);
        }
 
        ixgbe_init_hw(hw);
@@ -1034,7 +1040,7 @@ ixgbe_init_locked(struct adapter *adapte
        if (ixgbe_setup_receive_structures(adapter)) {
                device_printf(dev,"Could not setup receive structures\n");
                ixgbe_stop(adapter);
-               return;
+               return (ENOMEM);
        }
 
        /* Configure RX settings */
@@ -1064,8 +1070,11 @@ ixgbe_init_locked(struct adapter *adapte
        if (ifp->if_capenable & IFCAP_TSO4)
                ifp->if_hwassist |= CSUM_TSO;
        if (ifp->if_capenable & IFCAP_TXCSUM)
-               ifp->if_hwassist = (CSUM_TCP | CSUM_UDP);
-
+               ifp->if_hwassist |= (CSUM_TCP | CSUM_UDP);
+#if __FreeBSD_version >= 800000
+       if (hw->mac.type == ixgbe_mac_82599EB)
+               ifp->if_hwassist |= CSUM_SCTP;
+#endif
        /* Set MTU size */
        if (ifp->if_mtu > ETHERMTU) {
                mhadd = IXGBE_READ_REG(hw, IXGBE_MHADD);
@@ -1130,7 +1139,7 @@ ixgbe_init_locked(struct adapter *adapte
 
 #ifdef IXGBE_FDIR
        /* Init Flow director */
-       if (adapter->hw.mac.type == ixgbe_mac_82599EB)
+       if (hw->mac.type == ixgbe_mac_82599EB)
                ixgbe_init_fdir_signature_82599(&adapter->hw, fdir_pballoc);
 #endif
 
@@ -1138,13 +1147,14 @@ ixgbe_init_locked(struct adapter *adapte
        ** Check on any SFP devices that
        ** need to be kick-started
        */
-       err = hw->phy.ops.identify(hw);
-       if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) {
-                device_printf(dev,
-                   "Unsupported SFP+ module type was detected.\n");
-               ixgbe_detach(dev);
-               return;
-        }
+       if (hw->phy.type == ixgbe_phy_none) {
+               int err = hw->phy.ops.identify(hw);
+               if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) {
+                       device_printf(dev,
+                           "Unsupported SFP+ module type was detected.\n");
+                       return (EIO);
+               }
+       }
 
        /* Config/Enable Link */
        ixgbe_config_link(adapter);
@@ -1156,7 +1166,7 @@ ixgbe_init_locked(struct adapter *adapte
        ifp->if_drv_flags |= IFF_DRV_RUNNING;
        ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
 
-       return;
+       return (0);
 }
 
 static void
@@ -3003,6 +3013,12 @@ ixgbe_tx_ctx_setup(struct tx_ring *txr, 
                                type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_L4T_UDP;
                        break;
 
+#if __FreeBSD_version >= 800000
+               case IPPROTO_SCTP:
+                       if (mp->m_pkthdr.csum_flags & CSUM_SCTP)
+                               type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_L4T_SCTP;
+                       break;
+#endif
                default:
                        offload = FALSE;
                        break;
@@ -3956,16 +3972,16 @@ ixgbe_rxeof(struct ix_queue *que, int co
 
        IXGBE_RX_LOCK(rxr);
 
+       /* Sync the ring. */
+       bus_dmamap_sync(rxr->rxdma.dma_tag, rxr->rxdma.dma_map,
+           BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
+
        for (i = rxr->next_to_check; count != 0;) {
                struct mbuf     *sendmp, *mh, *mp;
                u32             rsc, ptype;
                u16             hlen, plen, hdr, vtag;
                bool            eop;
  
-               /* Sync the ring. */
-               bus_dmamap_sync(rxr->rxdma.dma_tag, rxr->rxdma.dma_map,
-                   BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
-
                cur = &rxr->rx_base[i];
                staterr = le32toh(cur->wb.upper.status_error);
 
@@ -4138,7 +4154,7 @@ ixgbe_rxeof(struct ix_queue *que, int co
                        rxr->bytes += sendmp->m_pkthdr.len;
                        rxr->rx_bytes += sendmp->m_pkthdr.len;
                        if ((ifp->if_capenable & IFCAP_RXCSUM) != 0)
-                               ixgbe_rx_checksum(staterr, sendmp);
+                               ixgbe_rx_checksum(staterr, sendmp, ptype);
 #if __FreeBSD_version >= 800000
                        sendmp->m_pkthdr.flowid = que->msix;
                        sendmp->m_flags |= M_FLOWID;
@@ -4202,10 +4218,15 @@ next_desc:
  *
  *********************************************************************/
 static void
-ixgbe_rx_checksum(u32 staterr, struct mbuf * mp)
+ixgbe_rx_checksum(u32 staterr, struct mbuf * mp, u32 ptype)
 {
-       u16 status = (u16) staterr;
-       u8  errors = (u8) (staterr >> 24);
+       u16     status = (u16) staterr;
+       u8      errors = (u8) (staterr >> 24);
+       bool    sctp = FALSE;
+
+       if ((ptype & IXGBE_RXDADV_PKTTYPE_ETQF) == 0 &&
+           (ptype & IXGBE_RXDADV_PKTTYPE_SCTP) != 0)
+               sctp = TRUE;
 
        if (status & IXGBE_RXD_STAT_IPCS) {
                if (!(errors & IXGBE_RXD_ERR_IPE)) {
@@ -4217,10 +4238,15 @@ ixgbe_rx_checksum(u32 staterr, struct mb
                        mp->m_pkthdr.csum_flags = 0;
        }
        if (status & IXGBE_RXD_STAT_L4CS) {
+               u16 type = (CSUM_DATA_VALID | CSUM_PSEUDO_HDR);
+#if __FreeBSD_version >= 800000
+               if (sctp)
+                       type = CSUM_SCTP_VALID;
+#endif
                if (!(errors & IXGBE_RXD_ERR_TCPE)) {
-                       mp->m_pkthdr.csum_flags |=
-                               (CSUM_DATA_VALID | CSUM_PSEUDO_HDR);
-                       mp->m_pkthdr.csum_data = htons(0xffff);
+                       mp->m_pkthdr.csum_flags |= type;
+                       if (!sctp)
+                               mp->m_pkthdr.csum_data = htons(0xffff);
                } 
        }
        return;

Modified: head/sys/dev/ixgbe/ixgbe.h
==============================================================================
--- head/sys/dev/ixgbe/ixgbe.h  Tue Mar 30 19:08:05 2010        (r205903)
+++ head/sys/dev/ixgbe/ixgbe.h  Tue Mar 30 19:09:18 2010        (r205904)
@@ -179,7 +179,13 @@
 #define IXGBE_RX_HDR                   128
 #define IXGBE_VFTA_SIZE                        128
 #define IXGBE_BR_SIZE                  4096
-#define CSUM_OFFLOAD                   7       /* Bits in csum flags */
+
+/* Offload bits in mbuf flag */
+#if __FreeBSD_version >= 800000
+#define CSUM_OFFLOAD           (CSUM_IP|CSUM_TCP|CSUM_UDP|CSUM_SCTP)
+#else
+#define CSUM_OFFLOAD           (CSUM_IP|CSUM_TCP|CSUM_UDP)
+#endif
 
 /* For 6.X code compatibility */
 #if !defined(ETHER_BPF_MTAP)
_______________________________________________
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