Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 15 Aug 2007 12:16:41 GMT
From:      Xin LI <delphij@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 125170 for review
Message-ID:  <200708151216.l7FCGfS4025624@repoman.freebsd.org>

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

Change 125170 by delphij@tarsier on 2007/08/15 12:16:36

	IFC

Affected files ...

.. //depot/projects/delphij_fork/sys/conf/NOTES#9 integrate
.. //depot/projects/delphij_fork/sys/dev/ata/ata-raid.c#2 integrate
.. //depot/projects/delphij_fork/sys/dev/cxgb/cxgb_adapter.h#4 integrate
.. //depot/projects/delphij_fork/sys/dev/cxgb/cxgb_main.c#4 integrate
.. //depot/projects/delphij_fork/sys/dev/cxgb/cxgb_offload.c#3 integrate
.. //depot/projects/delphij_fork/sys/dev/cxgb/cxgb_sge.c#4 integrate
.. //depot/projects/delphij_fork/sys/dev/ichwd/ichwd.c#2 integrate
.. //depot/projects/delphij_fork/sys/dev/ichwd/ichwd.h#2 integrate
.. //depot/projects/delphij_fork/sys/dev/mfi/mfi.c#2 integrate
.. //depot/projects/delphij_fork/sys/dev/mfi/mfi_disk.c#2 integrate
.. //depot/projects/delphij_fork/sys/dev/mfi/mfi_pci.c#2 integrate
.. //depot/projects/delphij_fork/sys/dev/mfi/mfireg.h#2 integrate
.. //depot/projects/delphij_fork/sys/dev/mfi/mfivar.h#2 integrate
.. //depot/projects/delphij_fork/sys/dev/mpt/mpt.c#2 integrate
.. //depot/projects/delphij_fork/sys/dev/mpt/mpt.h#2 integrate
.. //depot/projects/delphij_fork/sys/dev/mpt/mpt_cam.c#2 integrate
.. //depot/projects/delphij_fork/sys/dev/re/if_re.c#6 integrate
.. //depot/projects/delphij_fork/sys/dev/usb/ehci.c#2 integrate
.. //depot/projects/delphij_fork/sys/kern/vfs_subr.c#2 integrate
.. //depot/projects/delphij_fork/sys/modules/netgraph/bluetooth/Makefile#3 integrate
.. //depot/projects/delphij_fork/sys/netgraph/bluetooth/drivers/h4/TODO#2 integrate
.. //depot/projects/delphij_fork/sys/netgraph/bluetooth/drivers/h4/ng_h4.c#3 integrate
.. //depot/projects/delphij_fork/sys/netgraph/bluetooth/drivers/h4/ng_h4_prse.h#2 integrate
.. //depot/projects/delphij_fork/sys/netgraph/bluetooth/drivers/h4/ng_h4_var.h#2 integrate
.. //depot/projects/delphij_fork/sys/powerpc/include/intr_machdep.h#3 integrate
.. //depot/projects/delphij_fork/sys/powerpc/include/md_var.h#2 integrate
.. //depot/projects/delphij_fork/sys/powerpc/include/openpicvar.h#2 integrate
.. //depot/projects/delphij_fork/sys/powerpc/powermac/hrowpic.c#2 integrate
.. //depot/projects/delphij_fork/sys/powerpc/powermac/hrowpicvar.h#2 integrate
.. //depot/projects/delphij_fork/sys/powerpc/powermac/openpic_macio.c#2 integrate
.. //depot/projects/delphij_fork/sys/powerpc/powerpc/autoconf.c#2 integrate
.. //depot/projects/delphij_fork/sys/powerpc/powerpc/interrupt.c#3 integrate
.. //depot/projects/delphij_fork/sys/powerpc/powerpc/intr_machdep.c#3 integrate
.. //depot/projects/delphij_fork/sys/powerpc/powerpc/nexus.c#2 integrate
.. //depot/projects/delphij_fork/sys/powerpc/powerpc/openpic.c#2 integrate
.. //depot/projects/delphij_fork/sys/powerpc/powerpc/pic_if.m#2 integrate
.. //depot/projects/delphij_fork/sys/powerpc/psim/openpic_iobus.c#2 integrate
.. //depot/projects/delphij_fork/sys/sys/ata.h#2 integrate

Differences ...

==== //depot/projects/delphij_fork/sys/conf/NOTES#9 (text+ko) ====

@@ -1,4 +1,4 @@
-# $FreeBSD: src/sys/conf/NOTES,v 1.1448 2007/08/05 16:16:15 bz Exp $
+# $FreeBSD: src/sys/conf/NOTES,v 1.1449 2007/08/13 17:19:27 emax Exp $
 #
 # NOTES -- Lines that can be cut/pasted into kernel and hints configs.
 #
@@ -627,7 +627,7 @@
 options 	NETGRAPH_ATM_ATMPIF
 options 	NETGRAPH_BLUETOOTH		# ng_bluetooth(4)
 options 	NETGRAPH_BLUETOOTH_BT3C		# ng_bt3c(4)
-# options 	NETGRAPH_BLUETOOTH_H4		# ng_h4(4) - not MPSAFE
+options 	NETGRAPH_BLUETOOTH_H4		# ng_h4(4)
 options 	NETGRAPH_BLUETOOTH_HCI		# ng_hci(4)
 options 	NETGRAPH_BLUETOOTH_L2CAP	# ng_l2cap(4)
 options 	NETGRAPH_BLUETOOTH_SOCKET	# ng_btsocket(4)

==== //depot/projects/delphij_fork/sys/dev/ata/ata-raid.c#2 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/ata/ata-raid.c,v 1.123 2007/02/21 19:07:18 sos Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/ata/ata-raid.c,v 1.124 2007/08/13 18:46:31 jhb Exp $");
 
 #include "opt_ata.h"
 #include <sys/param.h>
@@ -56,7 +56,7 @@
 /* prototypes */
 static void ata_raid_done(struct ata_request *request);
 static void ata_raid_config_changed(struct ar_softc *rdp, int writeback);
-static int ata_raid_status(struct ata_ioc_raid_config *config);
+static int ata_raid_status(struct ata_ioc_raid_status *status);
 static int ata_raid_create(struct ata_ioc_raid_config *config);
 static int ata_raid_delete(int array);
 static int ata_raid_addspare(struct ata_ioc_raid_config *config);
@@ -216,13 +216,14 @@
 static int
 ata_raid_ioctl(u_long cmd, caddr_t data)
 {
+    struct ata_ioc_raid_status *status = (struct ata_ioc_raid_status *)data;
     struct ata_ioc_raid_config *config = (struct ata_ioc_raid_config *)data;
     int *lun = (int *)data;
     int error = EOPNOTSUPP;
 
     switch (cmd) {
     case IOCATARAIDSTATUS:
-	error = ata_raid_status(config);
+	error = ata_raid_status(status);
 	break;
 			
     case IOCATARAIDCREATE:
@@ -929,25 +930,32 @@
 }
 
 static int
-ata_raid_status(struct ata_ioc_raid_config *config)
+ata_raid_status(struct ata_ioc_raid_status *status)
 {
     struct ar_softc *rdp;
     int i;
 	
-    if (!(rdp = ata_raid_arrays[config->lun]))
+    if (!(rdp = ata_raid_arrays[status->lun]))
 	return ENXIO;
 	
-    config->type = rdp->type;
-    config->total_disks = rdp->total_disks;
+    status->type = rdp->type;
+    status->total_disks = rdp->total_disks;
     for (i = 0; i < rdp->total_disks; i++ ) {
-	if ((rdp->disks[i].flags & AR_DF_PRESENT) && rdp->disks[i].dev)  
-	    config->disks[i] = device_get_unit(rdp->disks[i].dev);
-	else
-	    config->disks[i] = -1;
+	status->disks[i].state = 0;
+	if ((rdp->disks[i].flags & AR_DF_PRESENT) && rdp->disks[i].dev) {
+	    status->disks[i].lun = device_get_unit(rdp->disks[i].dev);
+	    if (rdp->disks[i].flags & AR_DF_PRESENT)
+		status->disks[i].state |= AR_DISK_PRESENT;
+	    if (rdp->disks[i].flags & AR_DF_ONLINE)
+		status->disks[i].state |= AR_DISK_ONLINE;
+	    if (rdp->disks[i].flags & AR_DF_SPARE)
+		status->disks[i].state |= AR_DISK_SPARE;
+	} else
+	    status->disks[i].lun = -1;
     }
-    config->interleave = rdp->interleave;
-    config->status = rdp->status;
-    config->progress = 100 * rdp->rebuild_lba / rdp->total_sectors;
+    status->interleave = rdp->interleave;
+    status->status = rdp->status;
+    status->progress = 100 * rdp->rebuild_lba / rdp->total_sectors;
     return 0;
 }
 

==== //depot/projects/delphij_fork/sys/dev/cxgb/cxgb_adapter.h#4 (text+ko) ====

@@ -26,7 +26,7 @@
 POSSIBILITY OF SUCH DAMAGE.
 
 
-$FreeBSD: src/sys/dev/cxgb/cxgb_adapter.h,v 1.14 2007/07/17 06:50:33 kmacy Exp $
+$FreeBSD: src/sys/dev/cxgb/cxgb_adapter.h,v 1.15 2007/08/10 23:33:34 kmacy Exp $
 
 ***************************************************************************/
 
@@ -36,7 +36,7 @@
 #define _CXGB_ADAPTER_H_
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/cxgb/cxgb_adapter.h,v 1.14 2007/07/17 06:50:33 kmacy Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/cxgb/cxgb_adapter.h,v 1.15 2007/08/10 23:33:34 kmacy Exp $");
 
 #include <sys/lock.h>
 #include <sys/mutex.h>
@@ -117,7 +117,7 @@
 #else	
 	struct mtx	lock;
 #endif	
-	int		port;
+	int		port_id;
 	uint8_t		hw_addr[ETHER_ADDR_LEN];
 	uint8_t		nqsets;
 	uint8_t         first_qset;

==== //depot/projects/delphij_fork/sys/dev/cxgb/cxgb_main.c#4 (text+ko) ====

@@ -28,7 +28,7 @@
 ***************************************************************************/
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/cxgb/cxgb_main.c,v 1.28 2007/07/17 06:50:33 kmacy Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/cxgb/cxgb_main.c,v 1.30 2007/08/10 23:47:39 kmacy Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -509,7 +509,7 @@
 		device_printf(dev, "failed to allocate controller task queue\n");
 		goto out;
 	}
-		
+
 	taskqueue_start_threads(&sc->tq, 1, PI_NET, "%s taskq",
 	    device_get_nameunit(dev));
 	TASK_INIT(&sc->ext_intr_task, 0, cxgb_ext_intr_handler, sc);
@@ -557,7 +557,7 @@
 		sc->port[i].adapter = sc;
 		sc->port[i].nqsets = port_qsets;
 		sc->port[i].first_qset = i*port_qsets;
-		sc->port[i].port = i;
+		sc->port[i].port_id = i;
 		sc->portdev[i] = child;
 		device_set_softc(child, &sc->port[i]);
 	}
@@ -653,7 +653,8 @@
 		if (isset(&sc->open_device_map,	OFFLOAD_DEVMAP_BIT))
 			offload_close(&sc->tdev);
 	}
-#endif	
+#endif
+
 	t3_free_sge_resources(sc);
 	free(sc->filters, M_DEVBUF);
 	t3_sge_free(sc);
@@ -672,8 +673,6 @@
 	return;
 }
 
-
-
 static int
 alloc_filters(struct adapter *adap)
 {
@@ -868,7 +867,7 @@
 		nqsets = sc->port[i].nqsets;
 		for (j = 0; j < nqsets; j++, k++) {
 			struct sge_qset *qs = &sc->sge.qs[k];
-			    
+
 			rid = k + 2;
 			if (cxgb_debug)
 				printf("rid=%d ", rid);
@@ -905,7 +904,7 @@
 
 	p = device_get_softc(dev);
 
-	snprintf(buf, sizeof(buf), "Port %d %s", p->port, p->port_type->desc);
+	snprintf(buf, sizeof(buf), "Port %d %s", p->port_id, p->port_type->desc);
 	device_set_desc_copy(dev, buf);
 	return (0);
 }
@@ -950,7 +949,7 @@
 	p = device_get_softc(dev);
 
 	snprintf(p->lockbuf, PORT_NAME_LEN, "cxgb port lock %d:%d",
-	    device_get_unit(device_get_parent(dev)), p->port);  	
+	    device_get_unit(device_get_parent(dev)), p->port_id);
 	PORT_LOCK_INIT(p, p->lockbuf);
 
 	/* Allocate an ifnet object and set it up */
@@ -1032,7 +1031,7 @@
 	}	
 
 
-	snprintf(p->taskqbuf, TASKQ_NAME_LEN, "cxgb_port_taskq%d", p->port);
+	snprintf(p->taskqbuf, TASKQ_NAME_LEN, "cxgb_port_taskq%d", p->port_id);
 #ifdef TASKQUEUE_CURRENT
 	/* Create a port for handling TX without starvation */
 	p->tq = taskqueue_create(p->taskqbuf, M_NOWAIT,
@@ -1049,6 +1048,7 @@
 	}	
 	taskqueue_start_threads(&p->tq, 1, PI_NET, "%s taskq",
 	    device_get_nameunit(dev));
+	
 	TASK_INIT(&p->start_task, 0, cxgb_start_proc, ifp);
 
 	t3_sge_init_port(p);
@@ -1195,7 +1195,6 @@
 	}
 }
 
-
 /*
  * Interrupt-context handler for external (PHY) interrupts.
  */
@@ -1704,7 +1703,7 @@
 		t3_intr_clear(sc);
 		t3_sge_init_adapter(sc);
 	}
-	setbit(&p->adapter->open_device_map, p->port);
+	setbit(&p->adapter->open_device_map, p->port_id);
 	ADAPTER_UNLOCK(p->adapter);
 
 	if (is_offload(sc) && !ofld_disable) {
@@ -1714,10 +1713,10 @@
 			    "Could not initialize offload capabilities\n");
 	}
 	cxgb_link_start(p);
-	t3_link_changed(sc, p->port);
+	t3_link_changed(sc, p->port_id);
 	ifp->if_baudrate = p->link_config.speed * 1000000;
 	
-	t3_port_intr_enable(sc, p->port);
+	t3_port_intr_enable(sc, p->port_id);
 
 	callout_reset(&sc->cxgb_tick_ch, sc->params.stats_update_period * hz,
 	    cxgb_tick, sc);
@@ -1748,13 +1747,13 @@
 	
 	ifp = p->ifp;
 
-	t3_port_intr_disable(p->adapter, p->port);
+	t3_port_intr_disable(p->adapter, p->port_id);
 	ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
 	p->phy.ops->power_down(&p->phy, 1);
 	t3_mac_disable(&p->mac, MAC_DIRECTION_TX | MAC_DIRECTION_RX);
 
 	ADAPTER_LOCK(p->adapter);
-	clrbit(&p->adapter->open_device_map, p->port);
+	clrbit(&p->adapter->open_device_map, p->port_id);
 
 	
 	if (p->adapter->open_device_map == 0) {
@@ -1936,7 +1935,7 @@
 				m = m0;
 				m_collapse(m, TX_MAX_SEGS, &m0);
 			} else
-				break;	
+				break;
 		}
 		m = m0;
 		if ((err = t3_encap(p, &m)) != 0)
@@ -2119,7 +2118,7 @@
 			cxgb_set_rxmode(p);
 			t3_link_start(&p->phy, mac, &p->link_config);
 			t3_mac_enable(mac, MAC_DIRECTION_RX | MAC_DIRECTION_TX);
-			t3_port_intr_enable(adapter, p->port);
+			t3_port_intr_enable(adapter, p->port_id);
 			p->mac.stats.num_resets++;
 		}
 		PORT_UNLOCK(p);
@@ -2527,7 +2526,7 @@
 	}
 	case CHELSIO_SET_QSET_NUM: {
 		struct ch_reg *edata = (struct ch_reg *)data;
-		unsigned int port_idx = pi->port;
+		unsigned int port_idx = pi->port_id;
 		
 		if (sc->flags & FULL_INIT_DONE)
 			return (EBUSY);

==== //depot/projects/delphij_fork/sys/dev/cxgb/cxgb_offload.c#3 (text+ko) ====

@@ -31,7 +31,7 @@
 
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/cxgb/cxgb_offload.c,v 1.6 2007/07/17 06:50:33 kmacy Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/cxgb/cxgb_offload.c,v 1.7 2007/08/10 23:33:34 kmacy Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -1250,7 +1250,7 @@
 	}
 
 	/* Add new L2T entry */
-	e = t3_l2t_get(tdev, new, ((struct port_info *)new->rt_ifp->if_softc)->port);
+	e = t3_l2t_get(tdev, new, ((struct port_info *)new->rt_ifp->if_softc)->port_id);
 	if (!e) {
 		log(LOG_ERR, "%s: couldn't allocate new l2t entry!\n",
 		       __FUNCTION__);

==== //depot/projects/delphij_fork/sys/dev/cxgb/cxgb_sge.c#4 (text+ko) ====

@@ -28,7 +28,7 @@
 ***************************************************************************/
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/cxgb/cxgb_sge.c,v 1.24 2007/07/17 06:50:33 kmacy Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/cxgb/cxgb_sge.c,v 1.26 2007/08/10 23:47:39 kmacy Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -1196,7 +1196,7 @@
 	 * XXX handle checksum, TSO, and VLAN here
 	 *	 
 	 */
-	cntrl = V_TXPKT_INTF(p->port);
+	cntrl = V_TXPKT_INTF(p->port_id);
 
 	/*
 	 * XXX need to add VLAN support for 6.x
@@ -2094,9 +2094,6 @@
 	TASK_INIT(&q->txq[TXQ_ETH].qreclaim_task, 0, sge_txq_reclaim_handler, &q->txq[TXQ_ETH]);
 	TASK_INIT(&q->txq[TXQ_OFLD].qreclaim_task, 0, sge_txq_reclaim_handler, &q->txq[TXQ_OFLD]);
 
-	
-
-	
 	q->fl[0].gen = q->fl[1].gen = 1;
 	q->fl[0].size = p->fl_size;
 	q->fl[1].size = p->jumbo_size;

==== //depot/projects/delphij_fork/sys/dev/ichwd/ichwd.c#2 (text+ko) ====

@@ -51,10 +51,12 @@
  * (document no. 292273-001).  The WDT is also described in the individual
  * chipset datasheets, e.g. Intel82801EB ICH5 / 82801ER ICH5R Datasheet
  * (document no. 252516-001) sections 9.10 and 9.11.
+ *
+ * ICH6/7/8 support by Takeharu KATO <takeharu1219@ybb.ne.jp>
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/ichwd/ichwd.c,v 1.9 2007/03/27 21:03:36 n_hibma Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/ichwd/ichwd.c,v 1.10 2007/08/13 18:52:37 des Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -71,20 +73,27 @@
 #include <dev/ichwd/ichwd.h>
 
 static struct ichwd_device ichwd_devices[] = {
-	{ VENDORID_INTEL, DEVICEID_82801AA, "Intel 82801AA watchdog timer" },
-	{ VENDORID_INTEL, DEVICEID_82801AB, "Intel 82801AB watchdog timer" },
-	{ VENDORID_INTEL, DEVICEID_82801BA, "Intel 82801BA watchdog timer" },
-	{ VENDORID_INTEL, DEVICEID_82801BAM, "Intel 82801BAM watchdog timer" },
-	{ VENDORID_INTEL, DEVICEID_82801CA, "Intel 82801CA watchdog timer" },
-	{ VENDORID_INTEL, DEVICEID_82801CAM, "Intel 82801CAM watchdog timer" },
-	{ VENDORID_INTEL, DEVICEID_82801DB, "Intel 82801DB watchdog timer" },
-	{ VENDORID_INTEL, DEVICEID_82801DBM, "Intel 82801DBM watchdog timer" },
-	{ VENDORID_INTEL, DEVICEID_82801E, "Intel 82801E watchdog timer" },
-	{ VENDORID_INTEL, DEVICEID_82801EBR, "Intel 82801EB/ER watchdog timer" },
-	{ VENDORID_INTEL, DEVICEID_82801FBR, "Intel 82801FB/FR watchdog timer" },
-	{ VENDORID_INTEL, DEVICEID_ICH5, "Intel ICH5 watchdog timer"},
-	{ VENDORID_INTEL, DEVICEID_6300ESB, "Intel 6300ESB watchdog timer"},
-	{ 0, 0, NULL },
+	{ DEVICEID_82801AA,  "Intel 82801AA watchdog timer",    1 },
+	{ DEVICEID_82801AB,  "Intel 82801AB watchdog timer",    1 },
+	{ DEVICEID_82801BA,  "Intel 82801BA watchdog timer",    2 },
+	{ DEVICEID_82801BAM, "Intel 82801BAM watchdog timer",   2 },
+	{ DEVICEID_82801CA,  "Intel 82801CA watchdog timer",    3 },
+	{ DEVICEID_82801CAM, "Intel 82801CAM watchdog timer",   3 },
+	{ DEVICEID_82801DB,  "Intel 82801DB watchdog timer",    4 },
+	{ DEVICEID_82801DBM, "Intel 82801DBM watchdog timer",   4 },
+	{ DEVICEID_82801E,   "Intel 82801E watchdog timer",     5 },
+	{ DEVICEID_82801EBR, "Intel 82801EB/ER watchdog timer", 5 },
+	{ DEVICEID_6300ESB,  "Intel 6300ESB watchdog timer",    5 },
+	{ DEVICEID_82801FBR, "Intel 82801FB/FR watchdog timer", 6 },
+	{ DEVICEID_ICH6M,    "Intel ICH6M watchdog timer",      6 },
+	{ DEVICEID_ICH6W,    "Intel ICH6W watchdog timer",      6 },
+	{ DEVICEID_ICH7,     "Intel ICH7 watchdog timer",       7 },
+	{ DEVICEID_ICH7M,    "Intel ICH7M watchdog timer",      7 },
+	{ DEVICEID_ICH7MDH,  "Intel ICH7MDH watchdog timer",    7 },
+	{ DEVICEID_ICH8,     "Intel ICH8 watchdog timer",       8 },
+	{ DEVICEID_ICH8DH,   "Intel ICH8DH watchdog timer",     8 },
+	{ DEVICEID_ICH8DO,   "Intel ICH8DO watchdog timer",     8 },
+	{ 0, NULL, 0 },
 };
 
 static devclass_t ichwd_devclass;
@@ -95,6 +104,10 @@
 	bus_space_read_2((sc)->tco_bst, (sc)->tco_bsh, (off))
 #define ichwd_read_tco_4(sc, off) \
 	bus_space_read_4((sc)->tco_bst, (sc)->tco_bsh, (off))
+#define ichwd_read_smi_4(sc, off) \
+	bus_space_read_4((sc)->smi_bst, (sc)->smi_bsh, (off))
+#define ichwd_read_gcs_4(sc, off) \
+	bus_space_read_4((sc)->gcs_bst, (sc)->gcs_bsh, (off))
 
 #define ichwd_write_tco_1(sc, off, val) \
 	bus_space_write_1((sc)->tco_bst, (sc)->tco_bsh, (off), (val))
@@ -102,12 +115,17 @@
 	bus_space_write_2((sc)->tco_bst, (sc)->tco_bsh, (off), (val))
 #define ichwd_write_tco_4(sc, off, val) \
 	bus_space_write_4((sc)->tco_bst, (sc)->tco_bsh, (off), (val))
-
-#define ichwd_read_smi_4(sc, off) \
-	bus_space_read_4((sc)->smi_bst, (sc)->smi_bsh, (off))
 #define ichwd_write_smi_4(sc, off, val) \
 	bus_space_write_4((sc)->smi_bst, (sc)->smi_bsh, (off), (val))
+#define ichwd_write_gcs_4(sc, off, val) \
+	bus_space_write_4((sc)->gcs_bst, (sc)->gcs_bsh, (off), (val))
 
+#define ichwd_verbose_printf(dev, ...) \
+	do {						\
+		if (bootverbose)			\
+			device_printf(dev, __VA_ARGS__);\
+	} while (0)
+
 static __inline void
 ichwd_intr_enable(struct ichwd_softc *sc)
 {
@@ -136,8 +154,7 @@
 	cnt = ichwd_read_tco_2(sc, TCO1_CNT) & TCO_CNT_PRESERVE;
 	ichwd_write_tco_2(sc, TCO1_CNT, cnt & ~TCO_TMR_HALT);
 	sc->active = 1;
-	if (bootverbose)
-		device_printf(sc->device, "timer enabled\n");
+	ichwd_verbose_printf(sc->device, "timer enabled\n");
 }
 
 static __inline void
@@ -148,25 +165,85 @@
 	cnt = ichwd_read_tco_2(sc, TCO1_CNT) & TCO_CNT_PRESERVE;
 	ichwd_write_tco_2(sc, TCO1_CNT, cnt | TCO_TMR_HALT);
 	sc->active = 0;
-	if (bootverbose)
-		device_printf(sc->device, "timer disabled\n");
+	ichwd_verbose_printf(sc->device, "timer disabled\n");
 }
 
 static __inline void
 ichwd_tmr_reload(struct ichwd_softc *sc)
 {
-	ichwd_write_tco_1(sc, TCO_RLD, 1);
-	if (bootverbose)
-		device_printf(sc->device, "timer reloaded\n");
+	if (sc->ich_version <= 5)
+		ichwd_write_tco_1(sc, TCO_RLD, 1);
+	else
+		ichwd_write_tco_2(sc, TCO_RLD, 1);
+
+	ichwd_verbose_printf(sc->device, "timer reloaded\n");
 }
 
 static __inline void
-ichwd_tmr_set(struct ichwd_softc *sc, uint8_t timeout)
+ichwd_tmr_set(struct ichwd_softc *sc, unsigned int timeout)
 {
-	ichwd_write_tco_1(sc, TCO_TMR, timeout);
+
+	/*
+	 * If the datasheets are to be believed, the minimum value
+	 * actually varies from chipset to chipset - 4 for ICH5 and 2 for
+	 * all other chipsets.  I suspect this is a bug in the ICH5
+	 * datasheet and that the minimum is uniformly 2, but I'd rather
+	 * err on the side of caution.
+	 */
+	if (timeout < 4)
+		timeout = 4;
+
+	if (sc->ich_version <= 5) {
+		uint8_t tmr_val8 = ichwd_read_tco_1(sc, TCO_TMR1);
+
+		tmr_val8 &= 0xc0;
+		if (timeout > 0xbf)
+			timeout = 0xbf;
+		tmr_val8 |= timeout;
+		ichwd_write_tco_1(sc, TCO_TMR1, tmr_val8);
+	} else {
+		uint16_t tmr_val16 = ichwd_read_tco_2(sc, TCO_TMR2);
+
+		tmr_val16 &= 0xfc00;
+		if (timeout > 0x0bff)
+			timeout = 0x0bff;
+		tmr_val16 |= timeout;
+		ichwd_write_tco_2(sc, TCO_TMR2, tmr_val16);
+	}
+
 	sc->timeout = timeout;
-	if (bootverbose)
-		device_printf(sc->device, "timeout set to %u ticks\n", timeout);
+
+	ichwd_verbose_printf(sc->device, "timeout set to %u ticks\n", timeout);
+}
+
+static __inline int
+ichwd_clear_noreboot(struct ichwd_softc *sc)
+{
+	uint32_t status;
+	int rc = 0;
+
+	/* try to clear the NO_REBOOT bit */
+	if (sc->ich_version <= 5) {
+		status = pci_read_config(sc->ich, ICH_GEN_STA, 1);
+		status &= ~ICH_GEN_STA_NO_REBOOT;
+		pci_write_config(sc->ich, ICH_GEN_STA, status, 1);
+		status = pci_read_config(sc->ich, ICH_GEN_STA, 1);
+		if (status & ICH_GEN_STA_NO_REBOOT)
+			rc = EIO;
+	} else {
+		status = ichwd_read_gcs_4(sc, 0);
+		status &= ~ICH_GCS_NO_REBOOT;
+		ichwd_write_gcs_4(sc, 0, status);
+		status = ichwd_read_gcs_4(sc, 0);
+		if (status & ICH_GCS_NO_REBOOT)
+			rc = EIO;
+	}
+
+	if (rc)
+		device_printf(sc->device,
+		    "ICH WDT present but disabled in BIOS or hardware\n");
+
+	return (rc);
 }
 
 /*
@@ -181,14 +258,12 @@
 	/* convert from power-of-two-ns to WDT ticks */
 	cmd &= WD_INTERVAL;
 	timeout = ((uint64_t)1 << cmd) / ICHWD_TICK;
-	if (cmd > 0 && cmd <= 63
-	    && timeout >= ICHWD_MIN_TIMEOUT && timeout <= ICHWD_MAX_TIMEOUT) {
+	if (cmd) {
 		if (timeout != sc->timeout) {
 			if (!sc->active)
 				ichwd_tmr_enable(sc);
 			ichwd_tmr_set(sc, timeout);
 		}
-
 		ichwd_tmr_reload(sc);
 		*error = 0;
 	} else {
@@ -197,7 +272,28 @@
 	}
 }
 
-static unsigned int pmbase = 0;
+static device_t
+ichwd_find_ich_lpc_bridge(struct ichwd_device **id_p)
+{
+	struct ichwd_device *id;
+	device_t ich = NULL;
+
+	/* look for an ICH LPC interface bridge */
+	for (id = ichwd_devices; id->desc != NULL; ++id)
+		if ((ich = pci_find_device(VENDORID_INTEL, id->device)) != NULL)
+			break;
+
+	if (ich == NULL)
+		return (NULL);
+
+	ichwd_verbose_printf(ich, "found ICH%d or equivalent chipset: %s\n",
+	    id->version, id->desc);
+
+	if (id_p)
+		*id_p = id;
+
+	return (ich);
+}
 
 /*
  * Look for an ICH LPC interface bridge.  If one is found, register an
@@ -206,49 +302,40 @@
 static void
 ichwd_identify(driver_t *driver, device_t parent)
 {
-	struct ichwd_device *id;
+	struct ichwd_device *id_p;
 	device_t ich = NULL;
 	device_t dev;
+	uint32_t rcba;
+	int rc;
 
-	/* look for an ICH LPC interface bridge */
-	for (id = ichwd_devices; id->desc != NULL; ++id)
-		if ((ich = pci_find_device(id->vendor, id->device)) != NULL)
-			break;
+	ich = ichwd_find_ich_lpc_bridge(&id_p);
 	if (ich == NULL)
 		return;
 
-	if (bootverbose)
-		printf("%s(): found ICH chipset: %s\n", __func__, id->desc);
+	/* good, add child to bus */
+	if ((dev = device_find_child(parent, driver->name, 0)) == NULL)
+		dev = BUS_ADD_CHILD(parent, 0, driver->name, 0);
 
-	/* get for ACPI base address */
-	pmbase = pci_read_config(ich, ICH_PMBASE, 2) & ICH_PMBASE_MASK;
-	if (pmbase == 0) {
-		if (bootverbose)
-			printf("%s(): ICH PMBASE register is empty\n",
-			    __func__);
+	if (dev == NULL)
 		return;
-	}
+
+	device_set_desc_copy(dev, id_p->desc);
 
-	/* try to clear the NO_REBOOT bit */
-	pci_write_config(ich, ICH_GEN_STA, 0x00, 1);
-	if (pci_read_config(ich, ICH_GEN_STA, 1) & ICH_GEN_STA_NO_REBOOT) {
-		if (bootverbose)
-			printf("%s(): ICH WDT present but disabled\n",
-			    __func__);
-		return;
+	if (id_p->version >= 6) {
+		/* get RCBA (root complex base address) */
+		rcba = pci_read_config(ich, ICH_RCBA, 4);
+		rc = bus_set_resource(ich, SYS_RES_MEMORY, 0,
+		    (rcba & 0xffffc000) + ICH_GCS_OFFSET, ICH_GCS_SIZE);
+		if (rc)
+			ichwd_verbose_printf(dev,
+			    "Can not set memory resource for RCBA\n");
 	}
-
-	/* good, add child to bus */
-	if ((dev = device_find_child(parent, driver->name, 0)) == NULL)
-		dev = BUS_ADD_CHILD(parent, 0, driver->name, 0);
-
-	if (dev != NULL)
-		device_set_desc_copy(dev, id->desc);
 }
 
 static int
 ichwd_probe(device_t dev)
 {
+
 	(void)dev;
 	return (0);
 }
@@ -257,18 +344,32 @@
 ichwd_attach(device_t dev)
 {
 	struct ichwd_softc *sc;
+	struct ichwd_device *id_p;
+	device_t ich;
+	unsigned int pmbase = 0;
 
 	sc = device_get_softc(dev);
 	sc->device = dev;
 
+	ich = ichwd_find_ich_lpc_bridge(&id_p);
+	if (ich == NULL) {
+		device_printf(sc->device, "Can not find ICH device.\n");
+		goto fail;
+	}
+	sc->ich = ich;
+	sc->ich_version = id_p->version;
+
+	/* get ACPI base address */
+	pmbase = pci_read_config(ich, ICH_PMBASE, 2) & ICH_PMBASE_MASK;
 	if (pmbase == 0) {
-		printf("Not found\n");
+		device_printf(dev, "ICH PMBASE register is empty\n");
+		goto fail;
 	}
 
 	/* allocate I/O register space */
 	sc->smi_rid = 0;
 	sc->smi_res = bus_alloc_resource(dev, SYS_RES_IOPORT, &sc->smi_rid,
-	    pmbase + SMI_BASE, ~0ul, SMI_LEN,
+	    pmbase + SMI_BASE, pmbase + SMI_BASE + SMI_LEN - 1, SMI_LEN,
 	    RF_ACTIVE | RF_SHAREABLE);
 	if (sc->smi_res == NULL) {
 		device_printf(dev, "unable to reserve SMI registers\n");
@@ -279,7 +380,7 @@
 
 	sc->tco_rid = 1;
 	sc->tco_res = bus_alloc_resource(dev, SYS_RES_IOPORT, &sc->tco_rid,
-	    pmbase + TCO_BASE, ~0ul, TCO_LEN,
+	    pmbase + TCO_BASE, pmbase + TCO_BASE + TCO_LEN - 1, TCO_LEN,
 	    RF_ACTIVE | RF_SHAREABLE);
 	if (sc->tco_res == NULL) {
 		device_printf(dev, "unable to reserve TCO registers\n");
@@ -287,8 +388,30 @@
 	}
 	sc->tco_bst = rman_get_bustag(sc->tco_res);
 	sc->tco_bsh = rman_get_bushandle(sc->tco_res);
+
+	sc->gcs_rid = 0;
+	if (sc->ich_version >= 6) {
+		sc->gcs_res = bus_alloc_resource_any(ich, SYS_RES_MEMORY,
+		    &sc->gcs_rid, RF_ACTIVE|RF_SHAREABLE);
+		if (sc->gcs_res == NULL) {
+			device_printf(dev, "unable to reserve GCS registers\n");
+			goto fail;
+		}
+		sc->gcs_bst = rman_get_bustag(sc->gcs_res);
+		sc->gcs_bsh = rman_get_bushandle(sc->gcs_res);
+	} else {
+		sc->gcs_res = 0;
+		sc->gcs_bst = 0;
+		sc->gcs_bsh = 0;
+	}
+
+	if (ichwd_clear_noreboot(sc) != 0)
+		goto fail;
+
+	device_printf(dev, "%s (ICH%d or equivalent)\n",
+	    device_get_desc(dev), sc->ich_version);
+
 	/* reset the watchdog status registers */
-
 	ichwd_sts_reset(sc);
 
 	/* make sure the WDT starts out inactive */
@@ -309,6 +432,10 @@
 	if (sc->smi_res != NULL)
 		bus_release_resource(dev, SYS_RES_IOPORT,
 		    sc->smi_rid, sc->smi_res);
+	if (sc->gcs_res != NULL)
+		bus_release_resource(ich, SYS_RES_MEMORY,
+		    sc->gcs_rid, sc->gcs_res);
+
 	return (ENXIO);
 }
 
@@ -316,6 +443,7 @@
 ichwd_detach(device_t dev)
 {
 	struct ichwd_softc *sc;
+	device_t ich = NULL;
 
 	sc = device_get_softc(dev);
 
@@ -338,6 +466,11 @@
 	bus_release_resource(dev, SYS_RES_IOPORT, sc->tco_rid, sc->tco_res);
 	bus_release_resource(dev, SYS_RES_IOPORT, sc->smi_rid, sc->smi_res);
 
+	/* deallocate memory resource */
+	ich = ichwd_find_ich_lpc_bridge(NULL);
+	if (sc->gcs_res && ich)
+		bus_release_resource(ich, SYS_RES_MEMORY, sc->gcs_rid, sc->gcs_res);
+
 	return (0);
 }
 

==== //depot/projects/delphij_fork/sys/dev/ichwd/ichwd.h#2 (text+ko) ====

@@ -25,20 +25,22 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/ichwd/ichwd.h,v 1.3 2006/02/17 18:46:18 ambrisko Exp $
+ * $FreeBSD: src/sys/dev/ichwd/ichwd.h,v 1.4 2007/08/13 18:52:37 des Exp $
  */
 
 #ifndef _ICHWD_H_
 #define _ICHWD_H_
 
 struct ichwd_device {
-	uint16_t		 vendor;
 	uint16_t		 device;
 	char			*desc;
+	unsigned int		 version;
 };
 
 struct ichwd_softc {
 	device_t		 device;
+	device_t		 ich;
+	int                      ich_version;
 
 	int			 active;
 	unsigned int		 timeout;
@@ -53,6 +55,11 @@
 	bus_space_tag_t		 tco_bst;
 	bus_space_handle_t	 tco_bsh;
 
+	int			 gcs_rid;
+	struct resource		*gcs_res;
+	bus_space_tag_t		 gcs_bst;
+	bus_space_handle_t	 gcs_bsh;
+
 	eventhandler_tag	 ev_tag;
 };
 
@@ -69,28 +76,45 @@
 #define DEVICEID_82801EBR	0x24d0
 #define DEVICEID_6300ESB	0x25a1
 #define DEVICEID_82801FBR	0x2640
-#define DEVICEID_ICH5		0x27b8
+#define DEVICEID_ICH6M		0x2641
+#define DEVICEID_ICH6W		0x2642
+#define DEVICEID_ICH7		0x27b8
+#define DEVICEID_ICH7M		0x27b9
+#define DEVICEID_ICH7MDH	0x27bd
+#define DEVICEID_ICH8		0x2810
+#define DEVICEID_ICH8DH		0x2812
+#define DEVICEID_ICH8DO		0x2814
 
-/* ICH LPC Interface Bridge Registers */
+/* ICH LPC Interface Bridge Registers (ICH5 and older) */
 #define ICH_GEN_STA		0xd4
 #define ICH_GEN_STA_NO_REBOOT	0x02
 #define ICH_PMBASE		0x40 /* ACPI base address register */
 #define ICH_PMBASE_MASK		0x7f80 /* bits 7-15 */
 
+/* ICH Chipset Configuration Registers (ICH6 and newer) */
+#define ICH_RCBA		0xf0
+#define ICH_GCS_OFFSET		0x3410
+#define ICH_GCS_SIZE		0x4
+#define ICH_GCS_NO_REBOOT	0x20
+
 /* register names and locations (relative to PMBASE) */
 #define SMI_BASE		0x30 /* base address for SMI registers */
 #define SMI_LEN			0x08
 #define SMI_EN			0x00 /* SMI Control and Enable Register */
 #define SMI_STS			0x04 /* SMI Status Register */
 #define TCO_BASE		0x60 /* base address for TCO registers */
-#define TCO_LEN			0x0a
+#define TCO_LEN			0x20
 #define TCO_RLD			0x00 /* TCO Reload and Current Value */
-#define TCO_TMR			0x01 /* TCO Timer Initial Value */
+#define TCO_TMR1		0x01 /* TCO Timer Initial Value
+					(ICH5 and older, 8 bits) */
+#define TCO_TMR2		0x12 /* TCO Timer Initial Value
+					(ICH6 and newer, 16 bits) */
 #define TCO_DAT_IN		0x02 /* TCO Data In (DO NOT USE) */
 #define TCO_DAT_OUT		0x03 /* TCO Data Out (DO NOT USE) */
 #define TCO1_STS		0x04 /* TCO Status 1 */
 #define TCO2_STS		0x06 /* TCO Status 2 */
 #define TCO1_CNT		0x08 /* TCO Control 1 */
+#define TCO2_CNT		0x08 /* TCO Control 2 */
 
 /* bit definitions for SMI_EN and SMI_STS */
 #define SMI_TCO_EN		0x2000
@@ -112,11 +136,7 @@
 #define TCO_TMR_HALT		0x0800 /* clear to enable WDT */
 #define TCO_CNT_PRESERVE	0x0200 /* preserve these bits */
 
-/* approximate length in nanoseconds of one WDT tick */
-#define ICHWD_TICK		1800000000
-
-/* minimum / maximum timeout in WDT ticks */
-#define ICHWD_MIN_TIMEOUT	2
-#define ICHWD_MAX_TIMEOUT	63
+/* approximate length in nanoseconds of one WDT tick (about 0.6 sec) */
+#define ICHWD_TICK		600000000
 
 #endif

==== //depot/projects/delphij_fork/sys/dev/mfi/mfi.c#2 (text) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/mfi/mfi.c,v 1.30 2007/06/04 16:39:22 ambrisko Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/mfi/mfi.c,v 1.32 2007/08/13 21:14:15 jhb Exp $");
 
 #include "opt_mfi.h"
 
@@ -185,6 +185,7 @@
 	int frames, unit, max_fw_sge;
 
 	mtx_init(&sc->mfi_io_lock, "MFI I/O lock", NULL, MTX_DEF);
+	sx_init(&sc->mfi_config_lock, "MFI config");
 	TAILQ_INIT(&sc->mfi_ld_tqh);
 	TAILQ_INIT(&sc->mfi_aen_pids);
 	TAILQ_INIT(&sc->mfi_cam_ccbq);
@@ -393,6 +394,15 @@
 		make_dev_alias(sc->mfi_cdev, "megaraid_sas_ioctl_node");
 	if (sc->mfi_cdev != NULL)
 		sc->mfi_cdev->si_drv1 = sc;
+	SYSCTL_ADD_INT(device_get_sysctl_ctx(sc->mfi_dev),
+	    SYSCTL_CHILDREN(device_get_sysctl_tree(sc->mfi_dev)),
+	    OID_AUTO, "delete_busy_volumes", CTLFLAG_RW,
+	    &sc->mfi_delete_busy_volumes, 0, "Allow removal of busy volumes");
+	SYSCTL_ADD_INT(device_get_sysctl_ctx(sc->mfi_dev),
+	    SYSCTL_CHILDREN(device_get_sysctl_tree(sc->mfi_dev)),
+	    OID_AUTO, "keep_deleted_volumes", CTLFLAG_RW,
+	    &sc->mfi_keep_deleted_volumes, 0,
+	    "Don't detach the mfid device for a busy volume that is deleted");
 
 	device_add_child(sc->mfi_dev, "mfip", -1);
 	bus_generic_attach(sc->mfi_dev);
@@ -750,8 +760,10 @@
 	if (sc->mfi_parent_dmat != NULL)
 		bus_dma_tag_destroy(sc->mfi_parent_dmat);
 
-	if (mtx_initialized(&sc->mfi_io_lock))
+	if (mtx_initialized(&sc->mfi_io_lock)) {
 		mtx_destroy(&sc->mfi_io_lock);
+		sx_destroy(&sc->mfi_config_lock);
+	}
 
 	return;
 }
@@ -766,9 +778,11 @@
 	config_intrhook_disestablish(&sc->mfi_ich);
 
 	mfi_enable_intr(sc);
+	sx_xlock(&sc->mfi_config_lock);
 	mtx_lock(&sc->mfi_io_lock);
 	mfi_ldprobe(sc);
 	mtx_unlock(&sc->mfi_io_lock);
+	sx_xunlock(&sc->mfi_config_lock);
 }
 
 static void
@@ -857,8 +871,10 @@
 	struct mfi_frame_header *hdr;
 	struct mfi_command *cm = NULL;
 	struct mfi_ld_list *list = NULL;
+	struct mfi_disk *ld;
 	int error, i;
 
+	sx_assert(&sc->mfi_config_lock, SA_XLOCKED);
 	mtx_assert(&sc->mfi_io_lock, MA_OWNED);
 
 	error = mfi_dcmd_command(sc, &cm, MFI_DCMD_LD_GET_LIST,
@@ -879,8 +895,14 @@
 		goto out;
 	}
 
-	for (i = 0; i < list->ld_count; i++)
+	for (i = 0; i < list->ld_count; i++) {
+		TAILQ_FOREACH(ld, &sc->mfi_ld_tqh, ld_link) {
+			if (ld->ld_id == list->ld_list[i].ld.v.target_id)
+				goto skip_add;
+		}
 		mfi_add_ld(sc, list->ld_list[i].ld.v.target_id);
+	skip_add:;
+	}
 out:

>>> TRUNCATED FOR MAIL (1000 lines) <<<



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