Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 1 Feb 2007 09:30:12 GMT
From:      Roman Divacky <rdivacky@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 113820 for review
Message-ID:  <200702010930.l119UCpk046331@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=113820

Change 113820 by rdivacky@rdivacky_witten on 2007/02/01 09:29:25

	IFC

Affected files ...

.. //depot/projects/linuxolator/src/sys/dev/mxge/if_mxge.c#6 integrate
.. //depot/projects/linuxolator/src/sys/dev/mxge/if_mxge_var.h#5 integrate
.. //depot/projects/linuxolator/src/sys/dev/sound/driver.c#3 integrate
.. //depot/projects/linuxolator/src/sys/dev/sound/pcm/dsp.h#3 integrate
.. //depot/projects/linuxolator/src/sys/modules/msdosfs/Makefile#3 integrate
.. //depot/projects/linuxolator/src/sys/netinet/in.h#3 integrate
.. //depot/projects/linuxolator/src/sys/nfsclient/nfs_vnops.c#7 integrate
.. //depot/projects/linuxolator/src/sys/ufs/ufs/ufs_quota.c#6 integrate
.. //depot/projects/linuxolator/src/sys/ufs/ufs/ufs_vfsops.c#2 integrate

Differences ...

==== //depot/projects/linuxolator/src/sys/dev/mxge/if_mxge.c#6 (text+ko) ====

@@ -32,7 +32,7 @@
 ***************************************************************************/
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/mxge/if_mxge.c,v 1.17 2007/01/30 08:39:44 gallatin Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/mxge/if_mxge.c,v 1.20 2007/01/31 19:53:36 gallatin Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -90,6 +90,7 @@
 static int mxge_deassert_wait = 1;
 static int mxge_flow_control = 1;
 static int mxge_verbose = 0;
+static int mxge_ticks;
 static char *mxge_fw_unaligned = "mxge_ethp_z8e";
 static char *mxge_fw_aligned = "mxge_eth_z8e";
 
@@ -648,7 +649,7 @@
 
 	buf->response_addr.low = htobe32(dma_low);
 	buf->response_addr.high = htobe32(dma_high);
-	mtx_lock(&sc->cmd_lock);
+	mtx_lock(&sc->cmd_mtx);
 	response->result = 0xffffffff;
 	mb();
 	mxge_pio_copy((volatile void *)cmd_addr, buf, sizeof (*buf));
@@ -661,20 +662,20 @@
 		if (response->result != 0xffffffff) {
 			if (response->result == 0) {
 				data->data0 = be32toh(response->data);
-				mtx_unlock(&sc->cmd_lock);
+				mtx_unlock(&sc->cmd_mtx);
 				return 0;
 			} else {
 				device_printf(sc->dev, 
 					      "mxge: command %d "
 					      "failed, result = %d\n",
 					      cmd, be32toh(response->result));
-				mtx_unlock(&sc->cmd_lock);
+				mtx_unlock(&sc->cmd_mtx);
 				return ENXIO;
 			}
 		}
 		DELAY(1000);
 	}
-	mtx_unlock(&sc->cmd_lock);
+	mtx_unlock(&sc->cmd_mtx);
 	device_printf(sc->dev, "mxge: command %d timed out"
 		      "result = %d\n",
 		      cmd, be32toh(response->result));
@@ -927,7 +928,6 @@
 {
 
 	mxge_cmd_t cmd;
-	mxge_dma_t dmabench_dma;
 	size_t bytes;
 	int status;
 
@@ -975,13 +975,10 @@
 	
 	/* run a DMA benchmark */
 	sc->read_dma = sc->write_dma = sc->read_write_dma = 0;
-	status = mxge_dma_alloc(sc, &dmabench_dma, 4096, 4096);
-	if (status)
-		goto dmabench_fail;
 
 	/* Read DMA */
-	cmd.data0 = MXGE_LOWPART_TO_U32(dmabench_dma.bus_addr);
-	cmd.data1 = MXGE_HIGHPART_TO_U32(dmabench_dma.bus_addr);
+	cmd.data0 = MXGE_LOWPART_TO_U32(sc->dmabench_dma.bus_addr);
+	cmd.data1 = MXGE_HIGHPART_TO_U32(sc->dmabench_dma.bus_addr);
 	cmd.data2 = sc->tx.boundary * 0x10000;
 
 	status = mxge_send_cmd(sc, MXGEFW_DMA_TEST, &cmd);
@@ -992,8 +989,8 @@
 			(cmd.data0 & 0xffff);
 
 	/* Write DMA */
-	cmd.data0 = MXGE_LOWPART_TO_U32(dmabench_dma.bus_addr);
-	cmd.data1 = MXGE_HIGHPART_TO_U32(dmabench_dma.bus_addr);
+	cmd.data0 = MXGE_LOWPART_TO_U32(sc->dmabench_dma.bus_addr);
+	cmd.data1 = MXGE_HIGHPART_TO_U32(sc->dmabench_dma.bus_addr);
 	cmd.data2 = sc->tx.boundary * 0x1;
 	status = mxge_send_cmd(sc, MXGEFW_DMA_TEST, &cmd);
 	if (status != 0)
@@ -1002,8 +999,8 @@
 		sc->write_dma = ((cmd.data0>>16) * sc->tx.boundary * 2) /
 			(cmd.data0 & 0xffff);
 	/* Read/Write DMA */
-	cmd.data0 = MXGE_LOWPART_TO_U32(dmabench_dma.bus_addr);
-	cmd.data1 = MXGE_HIGHPART_TO_U32(dmabench_dma.bus_addr);
+	cmd.data0 = MXGE_LOWPART_TO_U32(sc->dmabench_dma.bus_addr);
+	cmd.data1 = MXGE_HIGHPART_TO_U32(sc->dmabench_dma.bus_addr);
 	cmd.data2 = sc->tx.boundary * 0x10001;
 	status = mxge_send_cmd(sc, MXGEFW_DMA_TEST, &cmd);
 	if (status != 0)
@@ -1013,9 +1010,6 @@
 			((cmd.data0>>16) * sc->tx.boundary * 2 * 2) /
 			(cmd.data0 & 0xffff);
 
-	mxge_dma_free(&dmabench_dma);
-
-dmabench_fail:
 	/* reset mcp/driver shared state back to 0 */
 	bzero(sc->rx_done.entry, bytes);
 	sc->rx_done.idx = 0;
@@ -1028,6 +1022,8 @@
 	sc->rx_big.cnt = 0;
 	sc->rx_small.cnt = 0;
 	sc->rdma_tags_available = 15;
+	sc->fw_stats->valid = 0;
+	sc->fw_stats->send_done_count = 0;
 	status = mxge_update_mac_address(sc);
 	mxge_change_promisc(sc, 0);
 	mxge_change_pause(sc, sc->pause);
@@ -1054,11 +1050,11 @@
         if (intr_coal_delay == 0 || intr_coal_delay > 1000*1000)
                 return EINVAL;
 
-	sx_xlock(&sc->driver_lock);
+	mtx_lock(&sc->driver_mtx);
 	*sc->intr_coal_delay_ptr = htobe32(intr_coal_delay);
 	sc->intr_coal_delay = intr_coal_delay;
 	
-	sx_xunlock(&sc->driver_lock);
+	mtx_unlock(&sc->driver_mtx);
         return err;
 }
 
@@ -1078,9 +1074,9 @@
         if (enabled == sc->pause)
                 return 0;
 
-	sx_xlock(&sc->driver_lock);
+	mtx_lock(&sc->driver_mtx);
 	err = mxge_change_pause(sc, enabled);
-	sx_xunlock(&sc->driver_lock);
+	mtx_unlock(&sc->driver_mtx);
         return err;
 }
 
@@ -1698,9 +1694,9 @@
 	mxge_softc_t *sc = ifp->if_softc;
 
 
-	mtx_lock(&sc->tx_lock);
+	mtx_lock(&sc->tx_mtx);
 	mxge_start_locked(sc);
-	mtx_unlock(&sc->tx_lock);		
+	mtx_unlock(&sc->tx_mtx);		
 }
 
 /*
@@ -2032,11 +2028,11 @@
 
 	if (ifp->if_drv_flags & IFF_DRV_OACTIVE &&
 	    tx->req - tx->done < (tx->mask + 1)/4) {
-		mtx_lock(&sc->tx_lock);
+		mtx_lock(&sc->tx_mtx);
 		ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
 		sc->tx.wake++;
 		mxge_start_locked(sc);
-		mtx_unlock(&sc->tx_lock);
+		mtx_unlock(&sc->tx_mtx);
 	}
 }
 
@@ -2109,12 +2105,6 @@
 }
 
 static void
-mxge_watchdog(struct ifnet *ifp)
-{
-	printf("%s called\n", __FUNCTION__);
-}
-
-static void
 mxge_init(void *arg)
 {
 }
@@ -2145,6 +2135,7 @@
 	}
 
 	for (i = 0; i <= sc->tx.mask; i++) {
+		sc->tx.info[i].flag = 0;
 		if (sc->tx.info[i].m == NULL)
 			continue;
 		bus_dmamap_unload(sc->tx.dmat,
@@ -2168,41 +2159,39 @@
 	if (sc->rx_big.shadow != NULL)
 		free(sc->rx_big.shadow, M_DEVBUF);
 	if (sc->tx.info != NULL) {
-		for (i = 0; i <= sc->tx.mask; i++) {
-			if (sc->tx.info[i].map != NULL) 
+		if (sc->tx.dmat != NULL) {
+			for (i = 0; i <= sc->tx.mask; i++) {
 				bus_dmamap_destroy(sc->tx.dmat,
 						   sc->tx.info[i].map);
+			}
+			bus_dma_tag_destroy(sc->tx.dmat);
 		}
 		free(sc->tx.info, M_DEVBUF);
 	}
 	if (sc->rx_small.info != NULL) {
-		for (i = 0; i <= sc->rx_small.mask; i++) {
-			if (sc->rx_small.info[i].map != NULL) 
+		if (sc->rx_small.dmat != NULL) {
+			for (i = 0; i <= sc->rx_small.mask; i++) {
 				bus_dmamap_destroy(sc->rx_small.dmat,
 						   sc->rx_small.info[i].map);
+			}
+			bus_dmamap_destroy(sc->rx_small.dmat,
+					   sc->rx_small.extra_map);
+			bus_dma_tag_destroy(sc->rx_small.dmat);
 		}
 		free(sc->rx_small.info, M_DEVBUF);
 	}
 	if (sc->rx_big.info != NULL) {
-		for (i = 0; i <= sc->rx_big.mask; i++) {
-			if (sc->rx_big.info[i].map != NULL) 
+		if (sc->rx_big.dmat != NULL) {
+			for (i = 0; i <= sc->rx_big.mask; i++) {
 				bus_dmamap_destroy(sc->rx_big.dmat,
 						   sc->rx_big.info[i].map);
+			}
+			bus_dmamap_destroy(sc->rx_big.dmat,
+					   sc->rx_big.extra_map);
+			bus_dma_tag_destroy(sc->rx_big.dmat);
 		}
 		free(sc->rx_big.info, M_DEVBUF);
 	}
-	if (sc->rx_big.extra_map != NULL)
-		bus_dmamap_destroy(sc->rx_big.dmat,
-				   sc->rx_big.extra_map);
-	if (sc->rx_small.extra_map != NULL)
-		bus_dmamap_destroy(sc->rx_small.dmat,
-				   sc->rx_small.extra_map);
-	if (sc->tx.dmat != NULL) 
-		bus_dma_tag_destroy(sc->tx.dmat);
-	if (sc->rx_small.dmat != NULL) 
-		bus_dma_tag_destroy(sc->rx_small.dmat);
-	if (sc->rx_big.dmat != NULL) 
-		bus_dma_tag_destroy(sc->rx_big.dmat);
 }
 
 static int
@@ -2406,6 +2395,8 @@
 		device_printf(sc->dev, "failed to reset\n");
 		return EIO;
 	}
+	bzero(sc->rx_done.entry, 
+	      mxge_max_intr_slots * sizeof(*sc->rx_done.entry));
 
 	if (MCLBYTES >= 
 	    sc->ifp->if_mtu + ETHER_HDR_LEN + MXGEFW_PAD)
@@ -2413,18 +2404,6 @@
 	else
 		sc->big_bytes = MJUMPAGESIZE;
 
-	err = mxge_alloc_rings(sc);
-	if (err != 0) {
-		device_printf(sc->dev, "failed to allocate rings\n");
-		return err;
-	}
-
-	err = bus_setup_intr(sc->dev, sc->irq_res, 
-			     INTR_TYPE_NET | INTR_MPSAFE,
-			     mxge_intr, sc, &sc->ih);
-	if (err != 0) {
-		goto abort_with_rings;
-	}
 
 	/* get the lanai pointers to the send and receive rings */
 
@@ -2442,8 +2421,7 @@
 	if (err != 0) {
 		device_printf(sc->dev, 
 			      "failed to get ring sizes or locations\n");
-		err = EIO;
-		goto abort_with_irq;
+		return EIO;
 	}
 
 	if (sc->wc) {
@@ -2532,10 +2510,7 @@
 
 abort:
 	mxge_free_mbufs(sc);
-abort_with_irq:
-	bus_teardown_intr(sc->dev, sc->irq_res, sc->ih);
-abort_with_rings:
-	mxge_free_rings(sc);
+
 	return err;
 }
 
@@ -2554,19 +2529,161 @@
 	}
 	if (old_down_cnt == sc->down_cnt) {
 		/* wait for down irq */
-		(void)tsleep(&sc->down_cnt, PWAIT, "down mxge", hz);
+		DELAY(10 * sc->intr_coal_delay);
 	}
 	if (old_down_cnt == sc->down_cnt) {
 		device_printf(sc->dev, "never got down irq\n");
 	}
-	if (sc->ih != NULL)
-		bus_teardown_intr(sc->dev, sc->irq_res, sc->ih);
+
 	mxge_free_mbufs(sc);
-	mxge_free_rings(sc);
+
 	return 0;
 }
 
+static void
+mxge_setup_cfg_space(mxge_softc_t *sc)
+{
+	device_t dev = sc->dev;
+	int reg;
+	uint16_t cmd, lnk, pectl;
+
+	/* find the PCIe link width and set max read request to 4KB*/
+	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);
+	}
+
+	/* Enable DMA and Memory space access */
+	pci_enable_busmaster(dev);
+	cmd = pci_read_config(dev, PCIR_COMMAND, 2);
+	cmd |= PCIM_CMD_MEMEN;
+	pci_write_config(dev, PCIR_COMMAND, cmd, 2);
+}
+
+static uint32_t
+mxge_read_reboot(mxge_softc_t *sc)
+{
+	device_t dev = sc->dev;
+	uint32_t vs;
+
+	/* find the vendor specific offset */
+	if (pci_find_extcap(dev, PCIY_VENDOR, &vs) != 0) {
+		device_printf(sc->dev,
+			      "could not find vendor specific offset\n");
+		return (uint32_t)-1;
+	}
+	/* enable read32 mode */
+	pci_write_config(dev, vs + 0x10, 0x3, 1);
+	/* tell NIC which register to read */
+	pci_write_config(dev, vs + 0x18, 0xfffffff0, 4);
+	return (pci_read_config(dev, vs + 0x14, 4));
+}
+
+static void
+mxge_watchdog_reset(mxge_softc_t *sc)
+{
+	int err;
+	uint32_t reboot;
+	uint16_t cmd;
+
+	err = ENXIO;
+
+	device_printf(sc->dev, "Watchdog reset!\n");
 
+	/* 
+	 * check to see if the NIC rebooted.  If it did, then all of
+	 * PCI config space has been reset, and things like the
+	 * busmaster bit will be zero.  If this is the case, then we
+	 * must restore PCI config space before the NIC can be used
+	 * again
+	 */
+	cmd = pci_read_config(sc->dev, PCIR_COMMAND, 2);
+	if (cmd == 0xffff) {
+		/* 
+		 * maybe the watchdog caught the NIC rebooting; wait
+		 * up to 100ms for it to finish.  If it does not come
+		 * back, then give up 
+		 */
+		DELAY(1000*100);
+		cmd = pci_read_config(sc->dev, PCIR_COMMAND, 2);
+		if (cmd == 0xffff) {
+			device_printf(sc->dev, "NIC disappeared!\n");
+			goto abort;
+		}
+	}
+	if ((cmd & PCIM_CMD_BUSMASTEREN) == 0) {
+		/* print the reboot status */
+		reboot = mxge_read_reboot(sc);
+		device_printf(sc->dev, "NIC rebooted, status = 0x%x\n",
+			      reboot);
+		/* restore PCI configuration space */
+
+		/* XXXX waiting for pci_cfg_restore() to be exported */
+		goto abort; /* just abort for now */
+
+		/* and redo any changes we made to our config space */
+		mxge_setup_cfg_space(sc);
+	} else {
+		device_printf(sc->dev, "NIC did not reboot, ring state:\n");
+		device_printf(sc->dev, "tx.req=%d tx.done=%d\n",
+			      sc->tx.req, sc->tx.done);
+		device_printf(sc->dev, "pkt_done=%d fw=%d\n",
+			      sc->tx.pkt_done,
+			      be32toh(sc->fw_stats->send_done_count));
+	}
+
+	if (sc->ifp->if_drv_flags & IFF_DRV_RUNNING) {
+		mxge_close(sc);
+		err = mxge_open(sc);
+	}
+
+abort:
+	/* 
+	 * stop the watchdog if the nic is dead, to avoid spamming the
+	 * console
+	 */
+	if (err != 0) {
+		callout_stop(&sc->co_hdl);
+	}
+}
+
+static void
+mxge_watchdog(mxge_softc_t *sc)
+{
+	mxge_tx_buf_t *tx = &sc->tx;
+
+	/* see if we have outstanding transmits, which
+	   have been pending for more than mxge_ticks */
+	if (tx->req != tx->done &&
+	    tx->watchdog_req != tx->watchdog_done &&
+	    tx->done == tx->watchdog_done)
+		mxge_watchdog_reset(sc);
+
+	tx->watchdog_req = tx->req;
+	tx->watchdog_done = tx->done;
+}
+
+static void
+mxge_tick(void *arg)
+{
+	mxge_softc_t *sc = arg;
+
+
+	/* Synchronize with possible callout reset/stop. */
+	if (callout_pending(&sc->co_hdl) ||
+	    !callout_active(&sc->co_hdl)) {
+		mtx_unlock(&sc->driver_mtx);
+		return;
+	}
+
+	callout_reset(&sc->co_hdl, mxge_ticks, mxge_tick, sc);
+	mxge_watchdog(sc);
+}
+
 static int
 mxge_media_change(struct ifnet *ifp)
 {
@@ -2585,10 +2702,11 @@
 	if ((real_mtu > MXGE_MAX_ETHER_MTU) ||
 	    real_mtu < 60)
 		return EINVAL;
-	sx_xlock(&sc->driver_lock);
+	mtx_lock(&sc->driver_mtx);
 	old_mtu = ifp->if_mtu;
 	ifp->if_mtu = mtu;
 	if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
+		callout_stop(&sc->co_hdl);
 		mxge_close(sc);
 		err = mxge_open(sc);
 		if (err != 0) {
@@ -2596,8 +2714,9 @@
 			mxge_close(sc);
 			(void) mxge_open(sc);
 		}
+		callout_reset(&sc->co_hdl, mxge_ticks, mxge_tick, sc);
 	}
-	sx_xunlock(&sc->driver_lock);
+	mtx_unlock(&sc->driver_mtx);
 	return err;
 }	
 
@@ -2634,11 +2753,13 @@
 		break;
 
 	case SIOCSIFFLAGS:
-		sx_xlock(&sc->driver_lock);
+		mtx_lock(&sc->driver_mtx);
 		if (ifp->if_flags & IFF_UP) {
-			if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
+			if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
 				err = mxge_open(sc);
-			else {
+				callout_reset(&sc->co_hdl, mxge_ticks,
+					      mxge_tick, sc);
+			} else {
 				/* take care of promis can allmulti
 				   flag chages */
 				mxge_change_promisc(sc, 
@@ -2646,21 +2767,23 @@
 				mxge_set_multicast_list(sc);
 			}
 		} else {
-			if (ifp->if_drv_flags & IFF_DRV_RUNNING)
+			if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
 				mxge_close(sc);
+				callout_stop(&sc->co_hdl);
+			}
 		}
-		sx_xunlock(&sc->driver_lock);
+		mtx_unlock(&sc->driver_mtx);
 		break;
 
 	case SIOCADDMULTI:
 	case SIOCDELMULTI:
-		sx_xlock(&sc->driver_lock);
+		mtx_lock(&sc->driver_mtx);
 		mxge_set_multicast_list(sc);
-		sx_xunlock(&sc->driver_lock);
+		mtx_unlock(&sc->driver_mtx);
 		break;
 
 	case SIOCSIFCAP:
-		sx_xlock(&sc->driver_lock);
+		mtx_lock(&sc->driver_mtx);
 		mask = ifr->ifr_reqcap ^ ifp->if_capenable;
 		if (mask & IFCAP_TXCSUM) {
 			if (IFCAP_TXCSUM & ifp->if_capenable) {
@@ -2693,7 +2816,7 @@
 				err = EINVAL;
 			}
 		}
-		sx_xunlock(&sc->driver_lock);
+		mtx_unlock(&sc->driver_mtx);
 		break;
 
 	case SIOCGIFMEDIA:
@@ -2723,11 +2846,14 @@
 			  &mxge_deassert_wait);	
 	TUNABLE_INT_FETCH("hw.mxge.verbose", 
 			  &mxge_verbose);	
+	TUNABLE_INT_FETCH("hw.mxge.ticks", &mxge_ticks);
 
 	if (bootverbose)
 		mxge_verbose = 1;
 	if (mxge_intr_coal_delay < 0 || mxge_intr_coal_delay > 10*1000)
 		mxge_intr_coal_delay = 30;
+	if (mxge_ticks == 0)
+		mxge_ticks = hz;	
 	sc->pause = mxge_flow_control;
 }
 
@@ -2737,8 +2863,7 @@
 	mxge_softc_t *sc = device_get_softc(dev);
 	struct ifnet *ifp;
 	size_t bytes;
-	int count, rid, err, reg;
-	uint16_t cmd, pectl, lnk;
+	int count, rid, err;
 
 	sc->dev = dev;
 	mxge_fetch_tunables(sc);
@@ -2768,28 +2893,21 @@
 		err = ENOSPC;
 		goto abort_with_parent_dmat;
 	}
-	mtx_init(&sc->cmd_lock, NULL,
-		 MTX_NETWORK_LOCK, MTX_DEF);
-	mtx_init(&sc->tx_lock, device_get_nameunit(dev),
+	snprintf(sc->cmd_mtx_name, sizeof(sc->cmd_mtx_name), "%s:cmd",
+		 device_get_nameunit(dev));
+	mtx_init(&sc->cmd_mtx, sc->cmd_mtx_name, NULL, MTX_DEF);
+	snprintf(sc->tx_mtx_name, sizeof(sc->tx_mtx_name), "%s:tx", 
+		 device_get_nameunit(dev));
+	mtx_init(&sc->tx_mtx, sc->tx_mtx_name, NULL, MTX_DEF);
+	snprintf(sc->driver_mtx_name, sizeof(sc->driver_mtx_name),
+		 "%s:drv", device_get_nameunit(dev));
+	mtx_init(&sc->driver_mtx, sc->driver_mtx_name,
 		 MTX_NETWORK_LOCK, MTX_DEF);
-	sx_init(&sc->driver_lock, device_get_nameunit(dev));
 
-	/* find the PCIe link width and set max read request to 4KB*/
-	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);
-	}
+	callout_init_mtx(&sc->co_hdl, &sc->driver_mtx, 0);
 
-	/* Enable DMA and Memory space access */
-	pci_enable_busmaster(dev);
-	cmd = pci_read_config(dev, PCIR_COMMAND, 2);
-	cmd |= PCIM_CMD_MEMEN;
-	pci_write_config(dev, PCIR_COMMAND, cmd, 2);
-
+	mxge_setup_cfg_space(sc);
+	
 	/* Map the board into the kernel */
 	rid = PCIR_BARS;
 	sc->mem_res = bus_alloc_resource(dev, SYS_RES_MEMORY, &rid, 0,
@@ -2839,12 +2957,15 @@
 		goto abort_with_zeropad_dma;
 	sc->fw_stats = (mcp_irq_data_t *)sc->fw_stats_dma.addr;
 
+	err = mxge_dma_alloc(sc, &sc->dmabench_dma, 4096, 4096);
+	if (err != 0)
+		goto abort_with_fw_stats;
 
 	/* allocate interrupt queues */
 	bytes = mxge_max_intr_slots * sizeof (*sc->rx_done.entry);
 	err = mxge_dma_alloc(sc, &sc->rx_done.dma, bytes, 4096);
 	if (err != 0)
-		goto abort_with_fw_stats;
+		goto abort_with_dmabench;
 	sc->rx_done.entry = sc->rx_done.dma.addr;
 	bzero(sc->rx_done.entry, bytes);
 
@@ -2877,6 +2998,18 @@
 	if (err != 0)
 		goto abort_with_irq_res;
 
+	err = mxge_alloc_rings(sc);
+	if (err != 0) {
+		device_printf(sc->dev, "failed to allocate rings\n");
+		goto abort_with_irq_res;
+	}
+
+	err = bus_setup_intr(sc->dev, sc->irq_res, 
+			     INTR_TYPE_NET | INTR_MPSAFE,
+			     mxge_intr, sc, &sc->ih);
+	if (err != 0) {
+		goto abort_with_rings;
+	}
 	/* hook into the network stack */
 	if_initname(ifp, device_get_name(dev), device_get_unit(dev));
 	ifp->if_baudrate = 100000000;
@@ -2890,7 +3023,6 @@
         ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
         ifp->if_ioctl = mxge_ioctl;
         ifp->if_start = mxge_start;
-	ifp->if_watchdog = mxge_watchdog;
 	ether_ifattach(ifp, sc->mac_addr);
 	/* ether_ifattach sets mtu to 1500 */
 	ifp->if_mtu = MXGE_MAX_ETHER_MTU - ETHER_HDR_LEN;
@@ -2902,6 +3034,8 @@
 	mxge_add_sysctls(sc);
 	return 0;
 
+abort_with_rings:
+	mxge_free_rings(sc);
 abort_with_irq_res:
 	bus_release_resource(dev, SYS_RES_IRQ,
 			     sc->msi_enabled ? 1 : 0, sc->irq_res);
@@ -2910,6 +3044,8 @@
 abort_with_rx_done:
 	sc->rx_done.entry = NULL;
 	mxge_dma_free(&sc->rx_done.dma);
+abort_with_dmabench:
+	mxge_dma_free(&sc->dmabench_dma);
 abort_with_fw_stats:
 	mxge_dma_free(&sc->fw_stats_dma);
 abort_with_zeropad_dma:
@@ -2920,9 +3056,9 @@
 	bus_release_resource(dev, SYS_RES_MEMORY, PCIR_BARS, sc->mem_res);
 abort_with_lock:
 	pci_disable_busmaster(dev);
-	mtx_destroy(&sc->cmd_lock);
-	mtx_destroy(&sc->tx_lock);
-	sx_destroy(&sc->driver_lock);
+	mtx_destroy(&sc->cmd_mtx);
+	mtx_destroy(&sc->tx_mtx);
+	mtx_destroy(&sc->driver_mtx);
 	if_free(ifp);
 abort_with_parent_dmat:
 	bus_dma_tag_destroy(sc->parent_dmat);
@@ -2936,12 +3072,16 @@
 {
 	mxge_softc_t *sc = device_get_softc(dev);
 
-	sx_xlock(&sc->driver_lock);
+	mtx_lock(&sc->driver_mtx);
 	if (sc->ifp->if_drv_flags & IFF_DRV_RUNNING)
 		mxge_close(sc);
-	sx_xunlock(&sc->driver_lock);
+	callout_stop(&sc->co_hdl);
+	mtx_unlock(&sc->driver_mtx);
 	ether_ifdetach(sc->ifp);
+	ifmedia_removeall(&sc->media);
 	mxge_dummy_rdma(sc, 0);
+	bus_teardown_intr(sc->dev, sc->irq_res, sc->ih);
+	mxge_free_rings(sc);
 	bus_release_resource(dev, SYS_RES_IRQ,
 			     sc->msi_enabled ? 1 : 0, sc->irq_res);
 	if (sc->msi_enabled)
@@ -2950,13 +3090,14 @@
 	sc->rx_done.entry = NULL;
 	mxge_dma_free(&sc->rx_done.dma);
 	mxge_dma_free(&sc->fw_stats_dma);
+	mxge_dma_free(&sc->dmabench_dma);
 	mxge_dma_free(&sc->zeropad_dma);
 	mxge_dma_free(&sc->cmd_dma);
 	bus_release_resource(dev, SYS_RES_MEMORY, PCIR_BARS, sc->mem_res);
 	pci_disable_busmaster(dev);
-	mtx_destroy(&sc->cmd_lock);
-	mtx_destroy(&sc->tx_lock);
-	sx_destroy(&sc->driver_lock);
+	mtx_destroy(&sc->cmd_mtx);
+	mtx_destroy(&sc->tx_mtx);
+	mtx_destroy(&sc->driver_mtx);
 	if_free(sc->ifp);
 	bus_dma_tag_destroy(sc->parent_dmat);
 	return 0;

==== //depot/projects/linuxolator/src/sys/dev/mxge/if_mxge_var.h#5 (text+ko) ====

@@ -29,7 +29,7 @@
 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 POSSIBILITY OF SUCH DAMAGE.
 
-$FreeBSD: src/sys/dev/mxge/if_mxge_var.h,v 1.7 2007/01/30 08:39:44 gallatin Exp $
+$FreeBSD: src/sys/dev/mxge/if_mxge_var.h,v 1.9 2007/01/31 19:53:36 gallatin Exp $
 
 ***************************************************************************/
 
@@ -108,13 +108,14 @@
 	int boundary;			/* boundary transmits cannot cross*/
 	int stall;			/* #times hw queue exhausted */
 	int wake;			/* #times irq re-enabled xmit */
-
+	int watchdog_req;		/* cache of req */
+	int watchdog_done;		/* cache of done */
 } mxge_tx_buf_t;
 
 typedef struct {
 	struct ifnet* ifp;
 	int big_bytes;
-	struct mtx tx_lock;
+	struct mtx tx_mtx;
 	int csum_flag;			/* rx_csums? 		*/
 	uint8_t	mac_addr[6];		/* eeprom mac address */
 	mxge_tx_buf_t tx;	/* transmit ring 	*/
@@ -138,8 +139,8 @@
 	int intr_coal_delay;
 	volatile uint32_t *intr_coal_delay_ptr;
 	int wc;
-	struct mtx cmd_lock;
-	struct sx driver_lock;
+	struct mtx cmd_mtx;
+	struct mtx driver_mtx;
 	int wake_queue;
 	int stop_queue;
 	int down_cnt;
@@ -159,10 +160,15 @@
 	int read_write_dma;
 	int fw_multicast_support;
 	int link_width;
+	mxge_dma_t dmabench_dma;
+	struct callout co_hdl;
 	char *mac_addr_string;
 	char product_code_string[64];
 	char serial_number_string[64];
 	char scratch[256];
+	char tx_mtx_name[16];
+	char cmd_mtx_name[16];
+	char driver_mtx_name[16];
 } mxge_softc_t;
 
 #define MXGE_PCI_VENDOR_MYRICOM 	0x14c1

==== //depot/projects/linuxolator/src/sys/dev/sound/driver.c#3 (text+ko) ====

@@ -18,12 +18,12 @@
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHERIN CONTRACT, STRICT
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THEPOSSIBILITY OF
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/sound/driver.c,v 1.20 2006/10/01 14:57:34 netchild Exp $
+ * $FreeBSD: src/sys/dev/sound/driver.c,v 1.21 2007/01/31 08:53:45 joel Exp $
  */
 
 #include <dev/sound/pcm/sound.h>

==== //depot/projects/linuxolator/src/sys/dev/sound/pcm/dsp.h#3 (text+ko) ====

@@ -1,5 +1,3 @@
-#ifndef _PCMDSP_H_
-#define _PCMDSP_H_
 /*-
  * Copyright (c) 1999 Cameron Grant <cg@freebsd.org>
  * All rights reserved.
@@ -25,9 +23,12 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/sound/pcm/dsp.h,v 1.10 2006/09/23 20:45:47 netchild Exp $
+ * $FreeBSD: src/sys/dev/sound/pcm/dsp.h,v 1.11 2007/01/31 12:10:48 joel Exp $
  */
 
+#ifndef _PCMDSP_H_
+#define _PCMDSP_H_
+
 extern struct cdevsw dsp_cdevsw;
 
 int dsp_oss_audioinfo(struct cdev *, oss_audioinfo *);

==== //depot/projects/linuxolator/src/sys/modules/msdosfs/Makefile#3 (text+ko) ====

@@ -1,11 +1,11 @@
-# $FreeBSD: src/sys/modules/msdosfs/Makefile,v 1.23 2007/01/30 10:17:36 ru Exp $
+# $FreeBSD: src/sys/modules/msdosfs/Makefile,v 1.24 2007/02/01 04:21:03 avatar Exp $
 
 .PATH: ${.CURDIR}/../../fs/msdosfs
 
 KMOD=	msdosfs
 SRCS=	vnode_if.h \
-	msdosfs_conv.c msdosfs_denode.c msdosfs_fat.c msdosfs_lookup.c \
-	msdosfs_vfsops.c msdosfs_vnops.c
+	msdosfs_conv.c msdosfs_denode.c msdosfs_fat.c msdosfs_fileno.c \
+	msdosfs_lookup.c msdosfs_vfsops.c msdosfs_vnops.c
 EXPORT_SYMS=	msdosfs_iconv
 
 .include <bsd.kmod.mk>

==== //depot/projects/linuxolator/src/sys/netinet/in.h#3 (text+ko) ====

@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  *
  *	@(#)in.h	8.3 (Berkeley) 1/3/94
- * $FreeBSD: src/sys/netinet/in.h,v 1.97 2006/12/29 21:59:17 piso Exp $
+ * $FreeBSD: src/sys/netinet/in.h,v 1.98 2007/01/31 14:34:47 bms Exp $
  */
 
 #ifndef _NETINET_IN_H_
@@ -351,6 +351,16 @@
 #define	IN_EXPERIMENTAL(i)	(((u_int32_t)(i) & 0xf0000000) == 0xf0000000)
 #define	IN_BADCLASS(i)		(((u_int32_t)(i) & 0xf0000000) == 0xf0000000)
 
+#define IN_LINKLOCAL(i)		(((u_int32_t)(i) & 0xffff0000) == 0xa9fe0000)
+
+#define	IN_PRIVATE(i)	((((u_int32_t)(i) & 0xff000000) == 0x0a000000) || \
+			 (((u_int32_t)(i) & 0xfff00000) == 0xac100000) || \
+			 (((u_int32_t)(i) & 0xffff0000) == 0xc0a80000))
+
+#define	IN_LOCAL_GROUP(i)	(((u_int32_t)(i) & 0xffffff00) == 0xe0000000)
+ 
+#define	IN_ANY_LOCAL(i)		(IN_LINKLOCAL(i) || IN_LOCAL_GROUP(i))
+
 #define	INADDR_LOOPBACK		(u_int32_t)0x7f000001
 #ifndef _KERNEL
 #define	INADDR_NONE		0xffffffff		/* -1 return */

==== //depot/projects/linuxolator/src/sys/nfsclient/nfs_vnops.c#7 (text+ko) ====

@@ -33,7 +33,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/nfsclient/nfs_vnops.c,v 1.272 2007/01/23 10:01:19 kib Exp $");
+__FBSDID("$FreeBSD: src/sys/nfsclient/nfs_vnops.c,v 1.273 2007/01/31 23:10:27 mohans Exp $");
 
 /*
  * vnode op calls for Sun NFS version 2 and 3
@@ -1434,6 +1434,8 @@
 		if (vap->va_atime.tv_sec == VNOVAL)
 			vap->va_atime = vap->va_mtime;
 		error = nfs_setattrrpc(newvp, vap, cnp->cn_cred, cnp->cn_thread);
+		if (error)
+			vput(newvp);
 	}
 	if (!error) {
 		if (cnp->cn_flags & MAKEENTRY)

==== //depot/projects/linuxolator/src/sys/ufs/ufs/ufs_quota.c#6 (text+ko) ====

@@ -33,7 +33,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/ufs/ufs/ufs_quota.c,v 1.87 2007/01/20 13:54:28 delphij Exp $");
+__FBSDID("$FreeBSD: src/sys/ufs/ufs/ufs_quota.c,v 1.88 2007/02/01 01:01:56 mpp Exp $");
 
 #include "opt_ffs.h"
 
@@ -891,6 +891,11 @@
 	struct uio auio;
 	int error;
 
+	/* XXX: Disallow negative id values to prevent the
+	* creation of 100GB+ quota data files.
+	*/
+	if ((int)id < 0)
+		return (EINVAL);
 	dqvp = ump->um_quotas[type];
 	if (dqvp == NULLVP || (ump->um_qflags[type] & QTF_CLOSING)) {
 		*dqp = NODQUOT;

==== //depot/projects/linuxolator/src/sys/ufs/ufs/ufs_vfsops.c#2 (text+ko) ====

@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/ufs/ufs/ufs_vfsops.c,v 1.47 2005/12/14 00:49:52 des Exp $");
+__FBSDID("$FreeBSD: src/sys/ufs/ufs/ufs_vfsops.c,v 1.48 2007/02/01 02:13:53 mpp Exp $");
 
 #include "opt_quota.h"
 #include "opt_ufs.h"
@@ -86,10 +86,10 @@
  * Do operations associated with quotas
  */
 int
-ufs_quotactl(mp, cmds, uid, arg, td)
+ufs_quotactl(mp, cmds, id, arg, td)
 	struct mount *mp;
 	int cmds;
-	uid_t uid;
+	uid_t id;
 	void *arg;
 	struct thread *td;
 {
@@ -98,10 +98,23 @@
 #else
 	int cmd, type, error;
 
-	if (uid == -1)
-		uid = td->td_ucred->cr_ruid;
 	cmd = cmds >> SUBCMDSHIFT;
 	type = cmds & SUBCMDMASK;
+	if (id == -1) {
+		switch (type) {
+
+		case USRQUOTA:
+			id = td->td_ucred->cr_ruid;
+			break;
+
+		case GRPQUOTA:
+			id = td->td_ucred->cr_rgid;
+			break;
+
+		default:
+			return (EINVAL);
+		}
+	}
 	if ((u_int)type >= MAXQUOTAS)
 		return (EINVAL);
 
@@ -118,15 +131,15 @@
 		break;
 
 	case Q_SETQUOTA:
-		error = setquota(td, mp, uid, type, arg);
+		error = setquota(td, mp, id, type, arg);
 		break;
 
 	case Q_SETUSE:
-		error = setuse(td, mp, uid, type, arg);
+		error = setuse(td, mp, id, type, arg);
 		break;
 
 	case Q_GETQUOTA:
-		error = getquota(td, mp, uid, type, arg);
+		error = getquota(td, mp, id, type, arg);
 		break;
 
 	case Q_SYNC:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200702010930.l119UCpk046331>