PERFORCE change 99769 for review
John Baldwin
jhb at FreeBSD.org
Wed Jun 21 18:29:08 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=99769
Change 99769 by jhb at jhb_mutex on 2006/06/21 18:28:32
IFC @99768.
Affected files ...
.. //depot/projects/smpng/sys/amd64/linux32/linux32_dummy.c#3 integrate
.. //depot/projects/smpng/sys/arm/at91/kb920x_machdep.c#6 integrate
.. //depot/projects/smpng/sys/arm/sa11x0/uart_cpu_sa1110.c#4 integrate
.. //depot/projects/smpng/sys/dev/mfi/mfi.c#8 integrate
.. //depot/projects/smpng/sys/dev/mfi/mfi_disk.c#4 integrate
.. //depot/projects/smpng/sys/dev/mfi/mfi_pci.c#3 integrate
.. //depot/projects/smpng/sys/dev/mfi/mfireg.h#3 integrate
.. //depot/projects/smpng/sys/dev/mfi/mfivar.h#3 integrate
.. //depot/projects/smpng/sys/kern/kern_linker.c#74 integrate
.. //depot/projects/smpng/sys/kern/subr_bus.c#60 integrate
.. //depot/projects/smpng/sys/net/if.c#83 integrate
.. //depot/projects/smpng/sys/net/if_vlan.c#48 integrate
.. //depot/projects/smpng/sys/vm/vm_mmap.c#59 integrate
Differences ...
==== //depot/projects/smpng/sys/amd64/linux32/linux32_dummy.c#3 (text+ko) ====
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/linux32/linux32_dummy.c,v 1.2 2006/05/10 18:17:28 netchild Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/linux32/linux32_dummy.c,v 1.3 2006/06/21 08:45:40 netchild Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -67,6 +67,62 @@
DUMMY(fadvise64);
DUMMY(ptrace);
DUMMY(settimeofday);
+DUMMY(lookup_dcookie);
+DUMMY(epoll_create);
+DUMMY(epoll_ctl);
+DUMMY(epoll_wait);
+DUMMY(remap_file_pages);
+DUMMY(set_tid_address);
+DUMMY(timer_create);
+DUMMY(timer_settime);
+DUMMY(timer_gettime);
+DUMMY(timer_getoverrun);
+DUMMY(timer_delete);
+DUMMY(clock_settime);
+DUMMY(clock_gettime);
+DUMMY(clock_getres);
+DUMMY(clock_nanosleep);
+DUMMY(statfs64);
+DUMMY(fstatfs64);
+DUMMY(tgkill);
+DUMMY(utimes);
+DUMMY(fadvise64_64);
+DUMMY(mbind);
+DUMMY(get_mempolicy);
+DUMMY(set_mempolicy);
+DUMMY(mq_open);
+DUMMY(mq_unlink);
+DUMMY(mq_timedsend);
+DUMMY(mq_timedreceive);
+DUMMY(mq_notify);
+DUMMY(mq_getsetattr);
+DUMMY(kexec_load);
+DUMMY(waitid);
+DUMMY(add_key);
+DUMMY(request_key);
+DUMMY(keyctl);
+DUMMY(ioprio_set);
+DUMMY(ioprio_get);
+DUMMY(inotify_init);
+DUMMY(inotify_add_watch);
+DUMMY(inotify_rm_watch);
+DUMMY(migrate_pages);
+DUMMY(openat);
+DUMMY(mkdirat);
+DUMMY(mknodat);
+DUMMY(fchownat);
+DUMMY(futimesat);
+DUMMY(fstatat64);
+DUMMY(unlinkat);
+DUMMY(renameat);
+DUMMY(linkat);
+DUMMY(symlinkat);
+DUMMY(readlinkat);
+DUMMY(fchmodat);
+DUMMY(faccessat);
+DUMMY(pselect6);
+DUMMY(ppoll);
+DUMMY(unshare);
#define DUMMY_XATTR(s) \
int \
==== //depot/projects/smpng/sys/arm/at91/kb920x_machdep.c#6 (text) ====
@@ -47,7 +47,7 @@
#include "opt_ddb.h"
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/arm/at91/kb920x_machdep.c,v 1.7 2006/06/20 20:13:40 imp Exp $");
+__FBSDID("$FreeBSD: src/sys/arm/at91/kb920x_machdep.c,v 1.8 2006/06/20 23:40:04 imp Exp $");
#define _ARM32_BUS_DMA_PRIVATE
#include <sys/param.h>
@@ -182,10 +182,9 @@
extern vm_offset_t ksym_start, ksym_end;
#endif
-static int
+static long
board_init(void)
{
- uint32_t memsize;
uint32_t *SDRAMC = (uint32_t *)(AT91RM92_BASE + AT91RM92_SDRAMC_BASE);
uint32_t cr, mr;
int banks, rows, cols, bw; /* log2 size */
@@ -196,8 +195,7 @@
banks = (cr & AT91RM92_SDRAMC_CR_NB_4) ? 2 : 1;
rows = ((cr & AT91RM92_SDRAMC_CR_NR_MASK) >> 2) + 11;
cols = (cr & AT91RM92_SDRAMC_CR_NC_MASK) + 8;
- memsize = 1 << (cols + rows + banks + bw);
- return (memsize);
+ return (1 << (cols + rows + banks + bw));
}
void *
@@ -360,6 +358,8 @@
cpu_domains(DOMAIN_CLIENT << (PMAP_DOMAIN_KERNEL*2));
cninit();
memsize = board_init();
+ physmem = memsize / PAGE_SIZE;
+
/*
* Pages were allocated during the secondary bootstrap for the
* stacks for different CPU modes.
@@ -428,7 +428,7 @@
phys_avail[3] = 0;
/* Do basic tuning, hz etc */
init_param1();
- init_param2(memsize / PAGE_SIZE);
+ init_param2(physmem);
avail_end = KERNPHYSADDR + memsize - 1;
kdb_init();
return ((void *)(kernelstack.pv_va + USPACE_SVC_STACK_TOP -
==== //depot/projects/smpng/sys/arm/sa11x0/uart_cpu_sa1110.c#4 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/arm/sa11x0/uart_cpu_sa1110.c,v 1.5 2006/06/07 11:28:17 cognet Exp $");
+__FBSDID("$FreeBSD: src/sys/arm/sa11x0/uart_cpu_sa1110.c,v 1.6 2006/06/21 10:56:59 cognet Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -44,6 +44,8 @@
extern struct uart_ops uart_sa1110_ops;
+vm_offset_t sa1110_uart_vaddr;
+
int
uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2)
{
==== //depot/projects/smpng/sys/dev/mfi/mfi.c#8 (text) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/mfi/mfi.c,v 1.9 2006/06/20 21:06:05 ps Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/mfi/mfi.c,v 1.12 2006/06/20 23:08:35 ps Exp $");
#include "opt_mfi.h"
@@ -56,6 +56,7 @@
static void mfi_release_command(struct mfi_command *cm);
static int mfi_comms_init(struct mfi_softc *);
static int mfi_polled_command(struct mfi_softc *, struct mfi_command *);
+static int mfi_wait_command(struct mfi_softc *, struct mfi_command *);
static int mfi_get_controller_info(struct mfi_softc *);
static int mfi_get_log_state(struct mfi_softc *,
struct mfi_evt_log_state **);
@@ -68,16 +69,12 @@
static void mfi_startup(void *arg);
static void mfi_intr(void *arg);
static void mfi_enable_intr(struct mfi_softc *sc);
-static void mfi_ldprobe_inq(struct mfi_softc *sc);
-static void mfi_ldprobe_inq_complete(struct mfi_command *);
-static int mfi_ldprobe_capacity(struct mfi_softc *sc, int id);
-static void mfi_ldprobe_capacity_complete(struct mfi_command *);
-static int mfi_ldprobe_tur(struct mfi_softc *sc, int id);
-static void mfi_ldprobe_tur_complete(struct mfi_command *);
+static void mfi_ldprobe(struct mfi_softc *sc);
static int mfi_aen_register(struct mfi_softc *sc, int seq, int locale);
static void mfi_aen_complete(struct mfi_command *);
static int mfi_aen_setup(struct mfi_softc *, uint32_t);
-static int mfi_add_ld(struct mfi_softc *sc, int id, uint64_t, uint32_t);
+static int mfi_add_ld(struct mfi_softc *sc, int);
+static void mfi_add_ld_complete(struct mfi_command *);
static struct mfi_command * mfi_bio_command(struct mfi_softc *);
static void mfi_bio_complete(struct mfi_command *);
static int mfi_mapcmd(struct mfi_softc *, struct mfi_command *);
@@ -580,7 +577,7 @@
static int
mfi_get_log_state(struct mfi_softc *sc, struct mfi_evt_log_state **log_state)
{
- struct mfi_command *cm;
+ struct mfi_command *cm = NULL;
int error;
mtx_lock(&sc->mfi_io_lock);
@@ -588,7 +585,7 @@
(void **)log_state, sizeof(**log_state));
if (error)
goto out;
- cm->cm_len = sizeof(struct mfi_evt_log_state);
+ cm->cm_flags = MFI_CMD_DATAIN | MFI_CMD_POLLED;
if ((error = mfi_mapcmd(sc, cm)) != 0) {
device_printf(sc->mfi_dev, "Log state buffer map failed\n");
@@ -605,7 +602,8 @@
bus_dmamap_unload(sc->mfi_buffer_dmat, cm->cm_dmamap);
out:
- mfi_release_command(cm);
+ if (cm)
+ mfi_release_command(cm);
mtx_unlock(&sc->mfi_io_lock);
return (error);
@@ -679,6 +677,18 @@
return (0);
}
+static int
+mfi_wait_command(struct mfi_softc *sc, struct mfi_command *cm)
+{
+
+ mtx_assert(&sc->mfi_io_lock, MA_OWNED);
+ cm->cm_complete = NULL;
+
+ mfi_enqueue_ready(cm);
+ mfi_startio(sc);
+ return (msleep(cm, &sc->mfi_io_lock, PRIBIO, "mfiwait", 0));
+}
+
void
mfi_free(struct mfi_softc *sc)
{
@@ -747,7 +757,7 @@
config_intrhook_disestablish(&sc->mfi_ich);
mfi_enable_intr(sc);
- mfi_ldprobe_inq(sc);
+ mfi_ldprobe(sc);
}
static void
@@ -813,6 +823,7 @@
device_printf(sc->mfi_dev, "Failed to shutdown controller\n");
}
+ mfi_release_command(cm);
return (error);
}
@@ -824,136 +835,41 @@
}
static void
-mfi_ldprobe_inq(struct mfi_softc *sc)
+mfi_ldprobe(struct mfi_softc *sc)
{
- struct mfi_command *cm;
- struct mfi_pass_frame *pass;
- char *inq;
- int i;
+ struct mfi_frame_header *hdr;
+ struct mfi_command *cm = NULL;
+ struct mfi_ld_list *list = NULL;
+ int error, i;
- /* Probe all possible targets with a SCSI INQ command */
mtx_lock(&sc->mfi_io_lock);
- sc->mfi_probe_count = 0;
- for (i = 0; i < MFI_MAX_CHANNEL_DEVS; i++) {
- inq = malloc(MFI_INQ_LENGTH, M_MFIBUF, M_NOWAIT|M_ZERO);
- if (inq == NULL)
- break;
- cm = mfi_dequeue_free(sc);
- if (cm == NULL) {
- free(inq, M_MFIBUF);
- msleep(mfi_startup, &sc->mfi_io_lock, 0, "mfistart",
- 5 * hz);
- i--;
- continue;
- }
- pass = &cm->cm_frame->pass;
- pass->header.cmd = MFI_CMD_LD_SCSI_IO;
- pass->header.target_id = i;
- pass->header.lun_id = 0;
- pass->header.cdb_len = 6;
- pass->header.timeout = 0;
- pass->header.data_len = MFI_INQ_LENGTH;
- bzero(pass->cdb, 16);
- pass->cdb[0] = INQUIRY;
- pass->cdb[4] = MFI_INQ_LENGTH;
- pass->header.sense_len = MFI_SENSE_LEN;
- pass->sense_addr_lo = cm->cm_sense_busaddr;
- pass->sense_addr_hi = 0;
- cm->cm_complete = mfi_ldprobe_inq_complete;
- cm->cm_private = inq;
- cm->cm_sg = &pass->sgl;
- cm->cm_total_frame_size = MFI_PASS_FRAME_SIZE;
- cm->cm_flags |= MFI_CMD_DATAIN;
- cm->cm_data = inq;
- cm->cm_len = MFI_INQ_LENGTH;
- sc->mfi_probe_count++;
- mfi_enqueue_ready(cm);
- mfi_startio(sc);
+ error = mfi_dcmd_command(sc, &cm, MFI_DCMD_LD_GET_LIST,
+ (void **)&list, sizeof(*list));
+ if (error)
+ goto out;
+
+ cm->cm_flags = MFI_CMD_DATAIN;
+ if (mfi_wait_command(sc, cm) != 0) {
+ device_printf(sc->mfi_dev, "Failed to get device listing\n");
+ goto out;
}
- /* Sleep while the arrays are attaching */
- msleep(mfi_startup, &sc->mfi_io_lock, 0, "mfistart", 60 * hz);
- mtx_unlock(&sc->mfi_io_lock);
-
- return;
-}
-
-static void
-mfi_ldprobe_inq_complete(struct mfi_command *cm)
-{
- struct mfi_frame_header *hdr;
- struct mfi_softc *sc;
- struct scsi_inquiry_data *inq;
-
- sc = cm->cm_sc;
- inq = cm->cm_private;
hdr = &cm->cm_frame->header;
-
- if ((hdr->cmd_status != MFI_STAT_OK) || (hdr->scsi_status != 0x00) ||
- (SID_TYPE(inq) != T_DIRECT)) {
- free(inq, M_MFIBUF);
- mfi_release_command(cm);
- if (--sc->mfi_probe_count <= 0)
- wakeup(mfi_startup);
- return;
+ if (hdr->cmd_status != MFI_STAT_OK) {
+ device_printf(sc->mfi_dev, "MFI_DCMD_LD_GET_LIST failed %x\n",
+ hdr->cmd_status);
+ goto out;
}
- free(inq, M_MFIBUF);
- mfi_release_command(cm);
- mfi_ldprobe_tur(sc, hdr->target_id);
-}
-
-static int
-mfi_ldprobe_tur(struct mfi_softc *sc, int id)
-{
- struct mfi_command *cm;
- struct mfi_pass_frame *pass;
-
- cm = mfi_dequeue_free(sc);
- if (cm == NULL)
- return (EBUSY);
- pass = &cm->cm_frame->pass;
- pass->header.cmd = MFI_CMD_LD_SCSI_IO;
- pass->header.target_id = id;
- pass->header.lun_id = 0;
- pass->header.cdb_len = 6;
- pass->header.timeout = 0;
- pass->header.data_len = 0;
- bzero(pass->cdb, 16);
- pass->cdb[0] = TEST_UNIT_READY;
- pass->header.sense_len = MFI_SENSE_LEN;
- pass->sense_addr_lo = cm->cm_sense_busaddr;
- pass->sense_addr_hi = 0;
- cm->cm_complete = mfi_ldprobe_tur_complete;
- cm->cm_total_frame_size = MFI_PASS_FRAME_SIZE;
- cm->cm_flags = 0;
- mfi_enqueue_ready(cm);
- mfi_startio(sc);
-
- return (0);
-}
-
-static void
-mfi_ldprobe_tur_complete(struct mfi_command *cm)
-{
- struct mfi_frame_header *hdr;
- struct mfi_softc *sc;
-
- sc = cm->cm_sc;
- hdr = &cm->cm_frame->header;
-
- if ((hdr->cmd_status != MFI_STAT_OK) || (hdr->scsi_status != 0x00)) {
- device_printf(sc->mfi_dev, "Logical disk %d is not ready, "
- "cmd_status= %d scsi_status= %d\n", hdr->target_id,
- hdr->cmd_status, hdr->scsi_status);
- mfi_print_sense(sc, cm->cm_sense);
+ for (i = 0; i < list->ld_count; i++)
+ mfi_add_ld(sc, list->ld_list[i].ld.target_id);
+out:
+ if (list)
+ free(list, M_MFIBUF);
+ if (cm)
mfi_release_command(cm);
- if (--sc->mfi_probe_count <= 0)
- wakeup(mfi_startup);
- return;
- }
- mfi_release_command(cm);
- mfi_ldprobe_capacity(sc, hdr->target_id);
+ mtx_unlock(&sc->mfi_io_lock);
+ return;
}
#ifdef NOTYET
@@ -1361,40 +1277,29 @@
#endif
static int
-mfi_ldprobe_capacity(struct mfi_softc *sc, int id)
+mfi_add_ld(struct mfi_softc *sc, int id)
{
struct mfi_command *cm;
- struct mfi_pass_frame *pass;
- struct scsi_read_capacity_data_long *cap;
+ struct mfi_dcmd_frame *dcmd = NULL;
+ struct mfi_ld_info *ld_info = NULL;
+ int error;
+
+ mtx_assert(&sc->mfi_io_lock, MA_OWNED);
- cap = malloc(sizeof(*cap), M_MFIBUF, M_NOWAIT|M_ZERO);
- if (cap == NULL)
- return (ENOMEM);
- cm = mfi_dequeue_free(sc);
- if (cm == NULL) {
- free(cap, M_MFIBUF);
- return (EBUSY);
+ error = mfi_dcmd_command(sc, &cm, MFI_DCMD_LD_GET_INFO,
+ (void **)&ld_info, sizeof(*ld_info));
+ if (error) {
+ device_printf(sc->mfi_dev,
+ "Failed to allocate for MFI_DCMD_LD_GET_INFO %d\n", error);
+ if (ld_info)
+ free(ld_info, M_MFIBUF);
+ return (error);
}
- pass = &cm->cm_frame->pass;
- pass->header.cmd = MFI_CMD_LD_SCSI_IO;
- pass->header.target_id = id;
- pass->header.lun_id = 0;
- pass->header.cdb_len = 6;
- pass->header.timeout = 0;
- pass->header.data_len = sizeof(*cap);
- bzero(pass->cdb, 16);
- pass->cdb[0] = 0x9e; /* READ CAPACITY 16 */
- pass->cdb[13] = sizeof(*cap);
- pass->header.sense_len = MFI_SENSE_LEN;
- pass->sense_addr_lo = cm->cm_sense_busaddr;
- pass->sense_addr_hi = 0;
- cm->cm_complete = mfi_ldprobe_capacity_complete;
- cm->cm_private = cap;
- cm->cm_sg = &pass->sgl;
- cm->cm_total_frame_size = MFI_PASS_FRAME_SIZE;
- cm->cm_flags |= MFI_CMD_DATAIN;
- cm->cm_data = cap;
- cm->cm_len = sizeof(*cap);
+ cm->cm_flags = MFI_CMD_DATAIN;
+ cm->cm_complete = mfi_add_ld_complete;
+ dcmd = &cm->cm_frame->dcmd;
+ dcmd->mbox[0] = id;
+
mfi_enqueue_ready(cm);
mfi_startio(sc);
@@ -1402,70 +1307,42 @@
}
static void
-mfi_ldprobe_capacity_complete(struct mfi_command *cm)
+mfi_add_ld_complete(struct mfi_command *cm)
{
struct mfi_frame_header *hdr;
+ struct mfi_ld_info *ld_info;
struct mfi_softc *sc;
- struct scsi_read_capacity_data_long *cap;
- uint64_t sectors;
- uint32_t secsize;
- int target;
+ struct mfi_ld *ld;
+ device_t child;
sc = cm->cm_sc;
- cap = cm->cm_private;
hdr = &cm->cm_frame->header;
+ ld_info = cm->cm_private;
- if ((hdr->cmd_status != MFI_STAT_OK) || (hdr->scsi_status != 0x00)) {
- device_printf(sc->mfi_dev, "Failed to read capacity for "
- "logical disk\n");
- device_printf(sc->mfi_dev, "cmd_status= %d scsi_status= %d\n",
- hdr->cmd_status, hdr->scsi_status);
- free(cap, M_MFIBUF);
+ if (hdr->cmd_status != MFI_STAT_OK) {
+ free(ld_info, M_MFIBUF);
mfi_release_command(cm);
- if (--sc->mfi_probe_count <= 0)
- wakeup(mfi_startup);
return;
}
- target = hdr->target_id;
- sectors = scsi_8btou64(cap->addr);
- secsize = scsi_4btoul(cap->length);
- free(cap, M_MFIBUF);
mfi_release_command(cm);
- mfi_add_ld(sc, target, sectors, secsize);
- if (--sc->mfi_probe_count <= 0)
- wakeup(mfi_startup);
-
- return;
-}
-
-static int
-mfi_add_ld(struct mfi_softc *sc, int id, uint64_t sectors, uint32_t secsize)
-{
- struct mfi_ld *ld;
- device_t child;
-
- if ((secsize == 0) || (sectors == 0)) {
- device_printf(sc->mfi_dev, "Invalid capacity parameters for "
- "logical disk %d\n", id);
- return (EINVAL);
- }
ld = malloc(sizeof(struct mfi_ld), M_MFIBUF, M_NOWAIT|M_ZERO);
if (ld == NULL) {
device_printf(sc->mfi_dev, "Cannot allocate ld\n");
- return (ENOMEM);
+ free(ld_info, M_MFIBUF);
+ return;
}
if ((child = device_add_child(sc->mfi_dev, "mfid", -1)) == NULL) {
device_printf(sc->mfi_dev, "Failed to add logical disk\n");
free(ld, M_MFIBUF);
- return (EINVAL);
+ free(ld_info, M_MFIBUF);
+ return;
}
- ld->ld_id = id;
+ ld->ld_id = ld_info->ld_config.properties.ld.target_id;
ld->ld_disk = child;
- ld->ld_secsize = secsize;
- ld->ld_sectors = sectors;
+ ld->ld_info = ld_info;
device_set_ivars(child, ld);
device_set_desc(child, "MFI Logical Disk");
@@ -1474,8 +1351,6 @@
bus_generic_attach(sc->mfi_dev);
mtx_unlock(&Giant);
mtx_lock(&sc->mfi_io_lock);
-
- return (0);
}
static struct mfi_command *
@@ -1705,6 +1580,8 @@
if (cm->cm_complete != NULL)
cm->cm_complete(cm);
+ else
+ wakeup(cm);
sc->mfi_flags &= ~MFI_FLAGS_QFRZN;
mfi_startio(sc);
==== //depot/projects/smpng/sys/dev/mfi/mfi_disk.c#4 (text) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/mfi/mfi_disk.c,v 1.3 2006/05/18 23:30:47 ambrisko Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/mfi/mfi_disk.c,v 1.4 2006/06/20 22:41:44 ps Exp $");
#include "opt_mfi.h"
@@ -113,14 +113,8 @@
sc->ld_ld = device_get_ivars(dev);
sc->ld_controller = device_get_softc(device_get_parent(dev));
- sectors = sc->ld_ld->ld_sectors;
- secsize = sc->ld_ld->ld_secsize;
- if (secsize != MFI_SECTOR_LEN) {
- device_printf(sc->ld_dev, "Reported sector length %d is not "
- "512, aborting\n", secsize);
- free(sc->ld_ld, M_MFIBUF);
- return (EINVAL);
- }
+ sectors = ld->ld_info->size;
+ secsize = MFI_SECTOR_LEN;
TAILQ_INSERT_TAIL(&sc->ld_controller->mfi_ld_tqh, ld, ld_link);
device_printf(dev, "%juMB (%ju sectors) RAID\n",
@@ -235,7 +229,7 @@
if (len > 0) {
if ((error = mfi_dump_blocks(parent_sc, sc->ld_id, offset /
- sc->ld_ld->ld_secsize, virt, len)) != 0)
+ MFI_SECTOR_LEN, virt, len)) != 0)
return (error);
} else {
/* mfi_sync_cache(parent_sc, sc->ld_id); */
==== //depot/projects/smpng/sys/dev/mfi/mfi_pci.c#3 (text) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/mfi/mfi_pci.c,v 1.2 2006/05/18 23:30:47 ambrisko Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/mfi/mfi_pci.c,v 1.3 2006/06/20 22:41:44 ps Exp $");
/* PCI/PCI-X/PCIe bus interface for the LSI MegaSAS controllers */
@@ -207,6 +207,7 @@
if (error)
return (error);
TAILQ_REMOVE(&sc->mfi_ld_tqh, ld, ld_link);
+ free(ld->ld_info, M_MFIBUF);
free(ld, M_MFIBUF);
}
==== //depot/projects/smpng/sys/dev/mfi/mfireg.h#3 (text) ====
@@ -28,7 +28,7 @@
#define _MFIREG_H
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/mfi/mfireg.h,v 1.2 2006/05/18 23:30:47 ambrisko Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/mfi/mfireg.h,v 1.3 2006/06/20 22:41:44 ps Exp $");
/*
* MegaRAID SAS MFI firmware definitions
@@ -106,7 +106,10 @@
MFI_DCMD_CTRL_EVENT_GETINFO = 0x01040100,
MFI_DCMD_CTRL_EVENT_GET = 0x01040300,
MFI_DCMD_CTRL_EVENT_WAIT = 0x01040500,
+ MFI_DCMD_LD_GET_LIST = 0x03010000,
+ MFI_DCMD_LD_GET_INFO = 0x03020000,
MFI_DCMD_LD_GET_PROP = 0x03030000,
+ MFI_DCMD_LD_SET_PROP = 0x03040000,
MFI_DCMD_CLUSTER = 0x08000000,
MFI_DCMD_CLUSTER_RESET_ALL = 0x08010100,
MFI_DCMD_CLUSTER_RESET_LD = 0x08010200
@@ -727,4 +730,97 @@
char description[128];
} __packed;
+struct mfi_ldref {
+ uint8_t target_id;
+ uint8_t reserved;
+ uint16_t seq;
+} __packed;
+
+struct mfi_ld_list {
+ uint32_t ld_count;
+ uint32_t reserved1;
+ struct {
+ struct mfi_ldref ld;
+ uint8_t state;
+ uint8_t reserved2[3];
+ uint64_t size;
+ } ld_list[MFI_MAX_LD];
+} __packed;
+
+enum mfi_ld_access {
+ MFI_LD_ACCESS_RW = 0,
+ MFI_LD_ACCSSS_RO = 2,
+ MFI_LD_ACCESS_BLOCKED = 3,
+};
+#define MFI_LD_ACCESS_MASK 3
+
+enum mfi_ld_state {
+ MFI_LD_STATE_OFFLINE = 0,
+ MFI_LD_STATE_PARTIALLY_DEGRADED = 1,
+ MFI_LD_STATE_DEGRADED = 2,
+ MFI_LD_STATE_OPTIMAL = 3
+};
+
+struct mfi_ld_props {
+ struct mfi_ldref ld;
+ char name[16];
+ uint8_t default_cache_policy;
+ uint8_t access_policy;
+ uint8_t disk_cache_policy;
+ uint8_t current_cache_policy;
+ uint8_t no_bgi;
+ uint8_t reserved[7];
+} __packed;
+
+struct mfi_ld_params {
+ uint8_t primary_raid_level;
+ uint8_t raid_level_qualifier;
+ uint8_t secondary_raid_level;
+ uint8_t stripe_size;
+ uint8_t num_drives;
+ uint8_t span_depth;
+ uint8_t state;
+ uint8_t init_state;
+ uint8_t is_consistent;
+ uint8_t reserved[23];
+} __packed;
+
+struct mfi_ld_progress {
+ uint32_t active;
+#define MFI_LD_PROGRESS_CC (1<<0)
+#define MFI_LD_PROGRESS_BGI (1<<1)
+#define MFI_LD_PROGRESS_FGI (1<<2)
+#define MFI_LD_PORGRESS_RECON (1<<3)
+ struct mfi_progress cc;
+ struct mfi_progress bgi;
+ struct mfi_progress fgi;
+ struct mfi_progress recon;
+ struct mfi_progress reserved[4];
+} __packed;
+
+struct mfi_span {
+ uint64_t start_block;
+ uint64_t num_blocks;
+ uint16_t array_ref;
+ uint8_t reserved[6];
+} __packed;
+
+#define MFI_MAX_SPAN_DEPTH 8
+struct mfi_ld_config {
+ struct mfi_ld_props properties;
+ struct mfi_ld_params params;
+ struct mfi_span span[MFI_MAX_SPAN_DEPTH];
+} __packed;
+
+struct mfi_ld_info {
+ struct mfi_ld_config ld_config;
+ uint64_t size;
+ struct mfi_ld_progress progress;
+ uint16_t cluster_owner;
+ uint8_t reconstruct_active;
+ uint8_t reserved1[1];
+ uint8_t vpd_page83[64];
+ uint8_t reserved2[16];
+} __packed;
+
#endif /* _MFIREG_H */
==== //depot/projects/smpng/sys/dev/mfi/mfivar.h#3 (text) ====
@@ -28,7 +28,7 @@
#define _MFIVAR_H
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/mfi/mfivar.h,v 1.2 2006/05/18 23:30:47 ambrisko Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/mfi/mfivar.h,v 1.3 2006/06/20 22:41:44 ps Exp $");
/*
* SCSI structures and definitions are used from here, but no linking
@@ -75,8 +75,7 @@
struct mfi_ld {
TAILQ_ENTRY(mfi_ld) ld_link;
device_t ld_disk;
- uint64_t ld_sectors;
- uint32_t ld_secsize;
+ struct mfi_ld_info *ld_info;
int ld_id;
};
@@ -133,7 +132,6 @@
struct intr_config_hook mfi_ich;
eventhandler_tag eh;
- int mfi_probe_count;
/*
* Allocation for the command array. Used as an indexable array to
==== //depot/projects/smpng/sys/kern/kern_linker.c#74 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/kern_linker.c,v 1.134 2006/06/20 21:31:38 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/kern_linker.c,v 1.136 2006/06/21 17:48:03 jhb Exp $");
#include "opt_ddb.h"
#include "opt_hwpmc_hooks.h"
==== //depot/projects/smpng/sys/kern/subr_bus.c#60 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/subr_bus.c,v 1.191 2006/04/20 01:44:16 jmg Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/subr_bus.c,v 1.193 2006/06/21 17:48:59 jhb Exp $");
#include "opt_bus.h"
==== //depot/projects/smpng/sys/net/if.c#83 (text+ko) ====
@@ -27,7 +27,7 @@
* SUCH DAMAGE.
*
* @(#)if.c 8.5 (Berkeley) 1/9/95
- * $FreeBSD: src/sys/net/if.c,v 1.258 2006/06/19 22:20:44 mlaier Exp $
+ * $FreeBSD: src/sys/net/if.c,v 1.259 2006/06/21 06:02:35 glebius Exp $
*/
#include "opt_compat.h"
@@ -432,9 +432,6 @@
TASK_INIT(&ifp->if_linktask, 0, do_link_state_change, ifp);
IF_AFDATA_LOCK_INIT(ifp);
ifp->if_afdata_initialized = 0;
- IFNET_WLOCK();
- TAILQ_INSERT_TAIL(&ifnet, ifp, if_link);
- IFNET_WUNLOCK();
/*
* XXX -
* The old code would work if the interface passed a pre-existing
@@ -509,6 +506,10 @@
ifp->if_snd.altq_tbr = NULL;
ifp->if_snd.altq_ifp = ifp;
+ IFNET_WLOCK();
+ TAILQ_INSERT_TAIL(&ifnet, ifp, if_link);
+ IFNET_WUNLOCK();
+
if (domain_init_status >= 2)
if_attachdomain1(ifp);
@@ -625,7 +626,18 @@
int i;
struct domain *dp;
struct ifnet *iter;
- int found;
+ int found = 0;
+
+ IFNET_WLOCK();
+ TAILQ_FOREACH(iter, &ifnet, if_link)
+ if (iter == ifp) {
+ TAILQ_REMOVE(&ifnet, ifp, if_link);
+ found = 1;
+ break;
+ }
+ IFNET_WUNLOCK();
+ if (!found)
+ return;
/*
* Remove/wait for pending events.
@@ -707,16 +719,6 @@
KNOTE_UNLOCKED(&ifp->if_klist, NOTE_EXIT);
knlist_clear(&ifp->if_klist, 0);
knlist_destroy(&ifp->if_klist);
- IFNET_WLOCK();
- found = 0;
- TAILQ_FOREACH(iter, &ifnet, if_link)
- if (iter == ifp) {
- found = 1;
- break;
- }
- if (found)
- TAILQ_REMOVE(&ifnet, ifp, if_link);
- IFNET_WUNLOCK();
mtx_destroy(&ifp->if_snd.ifq_mtx);
IF_AFDATA_DESTROY(ifp);
splx(s);
==== //depot/projects/smpng/sys/net/if_vlan.c#48 (text+ko) ====
@@ -26,7 +26,7 @@
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/sys/net/if_vlan.c,v 1.101 2006/03/09 14:42:51 ru Exp $
+ * $FreeBSD: src/sys/net/if_vlan.c,v 1.103 2006/06/21 13:48:34 yar Exp $
*/
/*
@@ -81,7 +81,8 @@
struct ifnet *parent; /* parent interface of this trunk */
struct rwlock rw;
#ifdef VLAN_ARRAY
- struct ifvlan *vlans[EVL_VLID_MASK+1]; /* static table */
+#define VLAN_ARRAY_SIZE (EVL_VLID_MASK + 1)
+ struct ifvlan *vlans[VLAN_ARRAY_SIZE]; /* static table */
#else
struct ifvlanhead *hash; /* dynamic hash-list table */
uint16_t hmask;
@@ -135,6 +136,8 @@
static MALLOC_DEFINE(M_VLAN, VLANNAME, "802.1Q Virtual LAN Interface");
+static eventhandler_tag ifdetach_tag;
+
/*
* We have a global mutex, that is used to serialize configuration
* changes and isn't used in normal packet delivery.
@@ -182,6 +185,7 @@
static int vlan_setflags(struct ifnet *ifp, int status);
static int vlan_setmulti(struct ifnet *ifp);
static int vlan_unconfig(struct ifnet *ifp);
+static int vlan_unconfig_locked(struct ifnet *ifp);
static int vlan_config(struct ifvlan *ifv, struct ifnet *p, uint16_t tag);
static void vlan_link_state(struct ifnet *ifp, int link);
static void vlan_capabilities(struct ifvlan *ifv);
@@ -193,6 +197,8 @@
static int vlan_clone_create(struct if_clone *, char *, size_t);
static int vlan_clone_destroy(struct if_clone *, struct ifnet *);
+static void vlan_ifdetach(void *arg, struct ifnet *ifp);
+
static struct if_clone vlan_cloner = IFC_CLONE_INITIALIZER(VLANNAME, NULL,
IF_MAXUNIT, NULL, vlan_clone_match, vlan_clone_create, vlan_clone_destroy);
@@ -452,6 +458,54 @@
}
/*
+ * A handler for network interface departure events.
+ * Track departure of trunks here so that we don't access invalid
+ * pointers or whatever if a trunk is ripped from under us, e.g.,
+ * by ejecting its hot-plug card.
+ */
+static void
+vlan_ifdetach(void *arg __unused, struct ifnet *ifp)
+{
+ struct ifvlan *ifv;
+ int i;
+
+ /*
+ * Check if it's a trunk interface first of all
+ * to avoid needless locking.
+ */
+ if (ifp->if_vlantrunk == NULL)
+ return;
+
+ VLAN_LOCK();
+ /*
+ * OK, it's a trunk. Loop over and detach all vlan's on it.
+ * Check trunk pointer after each vlan_unconfig() as it will
+ * free it and set to NULL after the last vlan was detached.
+ */
+#ifdef VLAN_ARRAY
+ for (i = 0; i < VLAN_ARRAY_SIZE; i++)
+ if ((ifv = ifp->if_vlantrunk->vlans[i])) {
+ vlan_unconfig_locked(ifv->ifv_ifp);
+ if (ifp->if_vlantrunk == NULL)
+ break;
+ }
+#else /* VLAN_ARRAY */
+restart:
+ for (i = 0; i < (1 << ifp->if_vlantrunk->hwidth); i++)
+ if ((ifv = LIST_FIRST(&ifp->if_vlantrunk->hash[i]))) {
+ vlan_unconfig_locked(ifv->ifv_ifp);
+ if (ifp->if_vlantrunk)
+ goto restart; /* trunk->hwidth can change */
+ else
+ break;
+ }
+#endif /* VLAN_ARRAY */
+ /* Trunk should have been destroyed in vlan_unconfig(). */
+ KASSERT(ifp->if_vlantrunk == NULL, ("%s: purge failed", __func__));
+ VLAN_UNLOCK();
+}
+
>>> TRUNCATED FOR MAIL (1000 lines) <<<
More information about the p4-projects
mailing list