Author: gallatin
Date: Thu Oct  1 15:51:29 2009
New Revision: 197676
URL: http://svn.freebsd.org/changeset/base/197676

Log:
  MFC: more fixes for mxge watchdog reset handling (194761 197645)
  
  194761: Fix bug where device would loose promisc setting when reset.
  197645: Restore the PCI Express control register after reset

Modified:
  stable/6/sys/   (props changed)
  stable/6/sys/conf/   (props changed)
  stable/6/sys/contrib/pf/   (props changed)
  stable/6/sys/dev/cxgb/   (props changed)
  stable/6/sys/dev/mxge/if_mxge.c
  stable/6/sys/dev/mxge/if_mxge_var.h

Modified: stable/6/sys/dev/mxge/if_mxge.c
==============================================================================
--- stable/6/sys/dev/mxge/if_mxge.c     Thu Oct  1 15:40:08 2009        
(r197675)
+++ stable/6/sys/dev/mxge/if_mxge.c     Thu Oct  1 15:51:29 2009        
(r197676)
@@ -1296,7 +1296,7 @@ mxge_reset(mxge_softc_t *sc, int interru
        }
        sc->rdma_tags_available = 15;
        status = mxge_update_mac_address(sc);
-       mxge_change_promisc(sc, 0);
+       mxge_change_promisc(sc, sc->ifp->if_flags & IFF_PROMISC);
        mxge_change_pause(sc, sc->pause);
        mxge_set_multicast_list(sc);
        return status;
@@ -3420,10 +3420,16 @@ mxge_setup_cfg_space(mxge_softc_t *sc)
        if (pci_find_extcap(dev, PCIY_EXPRESS, &reg) == 0) {
                lnk = pci_read_config(dev, reg + 0x12, 2);
                sc->link_width = (lnk >> 4) & 0x3f;
-               
-               pectl = pci_read_config(dev, reg + 0x8, 2);
-               pectl = (pectl & ~0x7000) | (5 << 12);
-               pci_write_config(dev, reg + 0x8, pectl, 2);
+
+               if (sc->pectl == 0) {
+                       pectl = pci_read_config(dev, reg + 0x8, 2);
+                       pectl = (pectl & ~0x7000) | (5 << 12);
+                       pci_write_config(dev, reg + 0x8, pectl, 2);
+                       sc->pectl = pectl;
+               } else {
+                       /* restore saved pectl after watchdog reset */
+                       pci_write_config(dev, reg + 0x8, sc->pectl, 2);
+               }
        }
 
        /* Enable DMA and Memory space access */
@@ -3534,6 +3540,9 @@ mxge_watchdog_reset(mxge_softc_t *sc)
                        /* release all TX locks */
                        for (s = 0; s < num_tx_slices; s++) {
                                ss = &sc->ss[s];
+#ifdef IFNET_BUF_RING
+                               mxge_start_locked(ss);
+#endif
                                mtx_unlock(&ss->tx.mtx);
                        }
                }
@@ -3796,7 +3805,7 @@ mxge_fetch_tunables(mxge_softc_t *sc)
                mxge_ticks = hz / 2;
        sc->pause = mxge_flow_control;
        if (mxge_rss_hash_type < MXGEFW_RSS_HASH_TYPE_IPV4 
-           || mxge_rss_hash_type > MXGEFW_RSS_HASH_TYPE_SRC_PORT) {
+           || mxge_rss_hash_type > MXGEFW_RSS_HASH_TYPE_MAX) {
                mxge_rss_hash_type = MXGEFW_RSS_HASH_TYPE_SRC_PORT;
        }
 }

Modified: stable/6/sys/dev/mxge/if_mxge_var.h
==============================================================================
--- stable/6/sys/dev/mxge/if_mxge_var.h Thu Oct  1 15:40:08 2009        
(r197675)
+++ stable/6/sys/dev/mxge/if_mxge_var.h Thu Oct  1 15:51:29 2009        
(r197676)
@@ -253,6 +253,7 @@ struct mxge_softc {
        struct sysctl_ctx_list slice_sysctl_ctx;
        char *mac_addr_string;
        uint8_t mac_addr[6];            /* eeprom mac address */
+       uint16_t pectl;                 /* save PCIe CTL state */
        char product_code_string[64];
        char serial_number_string[64];
        char cmd_mtx_name[16];
_______________________________________________
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