PERFORCE change 125170 for review
Xin LI
delphij at FreeBSD.org
Wed Aug 15 05:16:43 PDT 2007
http://perforce.freebsd.org/chv.cgi?CH=125170
Change 125170 by delphij at 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 at 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) <<<
More information about the p4-projects
mailing list