svn commit: r212279 - in user/nwhitehorn/ps3: amd64/include
boot/i386/boot2 boot/i386/efi boot/i386/libi386
boot/i386/loader boot/i386/zfsloader boot/ofw/libofw
boot/pc98/boot2 cam/ata cam/scsi cdd...
Nathan Whitehorn
nwhitehorn at FreeBSD.org
Mon Sep 6 23:11:56 UTC 2010
Author: nwhitehorn
Date: Mon Sep 6 23:11:56 2010
New Revision: 212279
URL: http://svn.freebsd.org/changeset/base/212279
Log:
IFC @ r212278
Modified:
user/nwhitehorn/ps3/amd64/include/cpufunc.h
user/nwhitehorn/ps3/boot/i386/boot2/Makefile
user/nwhitehorn/ps3/boot/i386/efi/Makefile
user/nwhitehorn/ps3/boot/i386/libi386/pxe.c
user/nwhitehorn/ps3/boot/i386/loader/Makefile
user/nwhitehorn/ps3/boot/i386/zfsloader/Makefile
user/nwhitehorn/ps3/boot/ofw/libofw/ofw_copy.c
user/nwhitehorn/ps3/boot/pc98/boot2/Makefile
user/nwhitehorn/ps3/boot/pc98/boot2/boot2.c
user/nwhitehorn/ps3/cam/ata/ata_da.c
user/nwhitehorn/ps3/cam/scsi/scsi_da.c
user/nwhitehorn/ps3/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c
user/nwhitehorn/ps3/cddl/dev/dtrace/dtrace_load.c
user/nwhitehorn/ps3/dev/acpi_support/acpi_hp.c
user/nwhitehorn/ps3/dev/acpica/acpi.c
user/nwhitehorn/ps3/dev/acpica/acpi_hpet.c
user/nwhitehorn/ps3/dev/ata/ata-all.h
user/nwhitehorn/ps3/dev/ata/ata-lowlevel.c
user/nwhitehorn/ps3/dev/ata/chipsets/ata-ahci.c
user/nwhitehorn/ps3/dev/ata/chipsets/ata-siliconimage.c
user/nwhitehorn/ps3/dev/bge/if_bge.c
user/nwhitehorn/ps3/dev/bge/if_bgereg.h
user/nwhitehorn/ps3/dev/fb/vesa.c
user/nwhitehorn/ps3/dev/hwpmc/hwpmc_core.c
user/nwhitehorn/ps3/dev/if_ndis/if_ndis_usb.c
user/nwhitehorn/ps3/dev/iscsi/initiator/iscsi.c
user/nwhitehorn/ps3/dev/iscsi/initiator/iscsivar.h
user/nwhitehorn/ps3/dev/powermac_nvram/powermac_nvram.c
user/nwhitehorn/ps3/dev/powermac_nvram/powermac_nvramvar.h
user/nwhitehorn/ps3/dev/sis/if_sis.c
user/nwhitehorn/ps3/dev/sis/if_sisreg.h
user/nwhitehorn/ps3/dev/twa/tw_osl_freebsd.c
user/nwhitehorn/ps3/dev/usb/controller/ehci.c
user/nwhitehorn/ps3/dev/usb/controller/ohci.c
user/nwhitehorn/ps3/dev/usb/controller/uhci.c
user/nwhitehorn/ps3/dev/usb/input/atp.c
user/nwhitehorn/ps3/dev/usb/input/uep.c
user/nwhitehorn/ps3/dev/usb/input/uhid.c
user/nwhitehorn/ps3/dev/usb/input/ukbd.c
user/nwhitehorn/ps3/dev/usb/input/ums.c
user/nwhitehorn/ps3/dev/usb/misc/udbp.c
user/nwhitehorn/ps3/dev/usb/misc/ufm.c
user/nwhitehorn/ps3/dev/usb/net/if_aue.c
user/nwhitehorn/ps3/dev/usb/net/if_axe.c
user/nwhitehorn/ps3/dev/usb/net/if_axereg.h
user/nwhitehorn/ps3/dev/usb/net/if_cdce.c
user/nwhitehorn/ps3/dev/usb/net/if_cue.c
user/nwhitehorn/ps3/dev/usb/net/if_kue.c
user/nwhitehorn/ps3/dev/usb/net/if_rue.c
user/nwhitehorn/ps3/dev/usb/net/if_udav.c
user/nwhitehorn/ps3/dev/usb/net/uhso.c
user/nwhitehorn/ps3/dev/usb/serial/u3g.c
user/nwhitehorn/ps3/dev/usb/serial/uark.c
user/nwhitehorn/ps3/dev/usb/serial/ubsa.c
user/nwhitehorn/ps3/dev/usb/serial/ubser.c
user/nwhitehorn/ps3/dev/usb/serial/uchcom.c
user/nwhitehorn/ps3/dev/usb/serial/ucycom.c
user/nwhitehorn/ps3/dev/usb/serial/ufoma.c
user/nwhitehorn/ps3/dev/usb/serial/uftdi.c
user/nwhitehorn/ps3/dev/usb/serial/ugensa.c
user/nwhitehorn/ps3/dev/usb/serial/uipaq.c
user/nwhitehorn/ps3/dev/usb/serial/ulpt.c
user/nwhitehorn/ps3/dev/usb/serial/umct.c
user/nwhitehorn/ps3/dev/usb/serial/umoscom.c
user/nwhitehorn/ps3/dev/usb/serial/uvisor.c
user/nwhitehorn/ps3/dev/usb/storage/umass.c
user/nwhitehorn/ps3/dev/usb/storage/urio.c
user/nwhitehorn/ps3/dev/usb/usb_compat_linux.c
user/nwhitehorn/ps3/dev/usb/usb_controller.h
user/nwhitehorn/ps3/dev/usb/usb_device.c
user/nwhitehorn/ps3/dev/usb/usb_generic.c
user/nwhitehorn/ps3/dev/usb/usb_hub.c
user/nwhitehorn/ps3/dev/usb/usb_transfer.c
user/nwhitehorn/ps3/dev/usb/usb_transfer.h
user/nwhitehorn/ps3/dev/usb/usbdi.h
user/nwhitehorn/ps3/dev/usb/usbdi_util.h
user/nwhitehorn/ps3/dev/usb/wlan/if_rum.c
user/nwhitehorn/ps3/dev/usb/wlan/if_run.c
user/nwhitehorn/ps3/dev/usb/wlan/if_uath.c
user/nwhitehorn/ps3/dev/usb/wlan/if_upgt.c
user/nwhitehorn/ps3/dev/usb/wlan/if_ural.c
user/nwhitehorn/ps3/dev/usb/wlan/if_urtw.c
user/nwhitehorn/ps3/dev/usb/wlan/if_zyd.c
user/nwhitehorn/ps3/fs/ext2fs/ext2_alloc.c
user/nwhitehorn/ps3/fs/nfsclient/nfs_clbio.c
user/nwhitehorn/ps3/fs/nfsclient/nfs_clvnops.c
user/nwhitehorn/ps3/fs/unionfs/union_vfsops.c
user/nwhitehorn/ps3/geom/geom_io.c
user/nwhitehorn/ps3/geom/sched/subr_disk.c
user/nwhitehorn/ps3/i386/include/cpufunc.h
user/nwhitehorn/ps3/kern/kern_et.c
user/nwhitehorn/ps3/kern/kern_malloc.c
user/nwhitehorn/ps3/kern/kern_rmlock.c
user/nwhitehorn/ps3/kern/kern_sig.c
user/nwhitehorn/ps3/kern/sched_ule.c
user/nwhitehorn/ps3/kern/subr_bus.c
user/nwhitehorn/ps3/kern/subr_disk.c
user/nwhitehorn/ps3/kern/subr_sbuf.c
user/nwhitehorn/ps3/kern/uipc_syscalls.c
user/nwhitehorn/ps3/kern/vfs_subr.c
user/nwhitehorn/ps3/mips/rmi/intr_machdep.c
user/nwhitehorn/ps3/mips/rmi/iodi.c
user/nwhitehorn/ps3/mips/rmi/pic.h
user/nwhitehorn/ps3/mips/rmi/xlr_machdep.c
user/nwhitehorn/ps3/mips/rmi/xlr_pci.c
user/nwhitehorn/ps3/net/if_epair.c
user/nwhitehorn/ps3/net/if_lagg.c
user/nwhitehorn/ps3/netinet/in.c
user/nwhitehorn/ps3/netinet/ip_carp.c
user/nwhitehorn/ps3/netinet/ip_input.c
user/nwhitehorn/ps3/netinet/ip_var.h
user/nwhitehorn/ps3/netinet/ipfw/ip_fw_nat.c
user/nwhitehorn/ps3/netinet/sctp_input.c
user/nwhitehorn/ps3/netinet/sctp_output.c
user/nwhitehorn/ps3/netinet/sctp_pcb.c
user/nwhitehorn/ps3/netinet/sctp_timer.c
user/nwhitehorn/ps3/netinet/sctp_uio.h
user/nwhitehorn/ps3/netinet/sctputil.c
user/nwhitehorn/ps3/netinet6/ip6_input.c
user/nwhitehorn/ps3/netinet6/ip6_var.h
user/nwhitehorn/ps3/nfsclient/nfs_diskless.c
user/nwhitehorn/ps3/powerpc/aim/mmu_oea.c
user/nwhitehorn/ps3/powerpc/aim/nexus.c
user/nwhitehorn/ps3/powerpc/conf/GENERIC64
user/nwhitehorn/ps3/powerpc/include/param.h
user/nwhitehorn/ps3/powerpc/powerpc/mp_machdep.c
user/nwhitehorn/ps3/sparc64/conf/GENERIC
user/nwhitehorn/ps3/sys/_rmlock.h
user/nwhitehorn/ps3/sys/bio.h
user/nwhitehorn/ps3/sys/bus.h
user/nwhitehorn/ps3/sys/copyright.h
user/nwhitehorn/ps3/sys/rmlock.h
user/nwhitehorn/ps3/vm/memguard.c
user/nwhitehorn/ps3/vm/memguard.h
user/nwhitehorn/ps3/vm/vm_page.c
Directory Properties:
user/nwhitehorn/ps3/ (props changed)
user/nwhitehorn/ps3/amd64/include/xen/ (props changed)
user/nwhitehorn/ps3/boot/powerpc/ps3/ (props changed)
user/nwhitehorn/ps3/cddl/contrib/opensolaris/ (props changed)
user/nwhitehorn/ps3/contrib/dev/acpica/ (props changed)
user/nwhitehorn/ps3/contrib/pf/ (props changed)
user/nwhitehorn/ps3/contrib/x86emu/ (props changed)
user/nwhitehorn/ps3/dev/xen/xenpci/ (props changed)
user/nwhitehorn/ps3/powerpc/ps3/ (props changed)
Modified: user/nwhitehorn/ps3/amd64/include/cpufunc.h
==============================================================================
--- user/nwhitehorn/ps3/amd64/include/cpufunc.h Mon Sep 6 23:07:58 2010 (r212278)
+++ user/nwhitehorn/ps3/amd64/include/cpufunc.h Mon Sep 6 23:11:56 2010 (r212279)
@@ -421,40 +421,40 @@ invlpg(u_long addr)
__asm __volatile("invlpg %0" : : "m" (*(char *)addr) : "memory");
}
-static __inline u_int
+static __inline u_short
rfs(void)
{
- u_int sel;
- __asm __volatile("mov %%fs,%0" : "=rm" (sel));
+ u_short sel;
+ __asm __volatile("movw %%fs,%0" : "=rm" (sel));
return (sel);
}
-static __inline u_int
+static __inline u_short
rgs(void)
{
- u_int sel;
- __asm __volatile("mov %%gs,%0" : "=rm" (sel));
+ u_short sel;
+ __asm __volatile("movw %%gs,%0" : "=rm" (sel));
return (sel);
}
-static __inline u_int
+static __inline u_short
rss(void)
{
- u_int sel;
- __asm __volatile("mov %%ss,%0" : "=rm" (sel));
+ u_short sel;
+ __asm __volatile("movw %%ss,%0" : "=rm" (sel));
return (sel);
}
static __inline void
-load_ds(u_int sel)
+load_ds(u_short sel)
{
- __asm __volatile("mov %0,%%ds" : : "rm" (sel));
+ __asm __volatile("movw %0,%%ds" : : "rm" (sel));
}
static __inline void
-load_es(u_int sel)
+load_es(u_short sel)
{
- __asm __volatile("mov %0,%%es" : : "rm" (sel));
+ __asm __volatile("movw %0,%%es" : : "rm" (sel));
}
static __inline void
@@ -476,10 +476,10 @@ cpu_mwait(int extensions, int hints)
#define MSR_FSBASE 0xc0000100
#endif
static __inline void
-load_fs(u_int sel)
+load_fs(u_short sel)
{
/* Preserve the fsbase value across the selector load */
- __asm __volatile("rdmsr; mov %0,%%fs; wrmsr"
+ __asm __volatile("rdmsr; movw %0,%%fs; wrmsr"
: : "rm" (sel), "c" (MSR_FSBASE) : "eax", "edx");
}
@@ -487,28 +487,28 @@ load_fs(u_int sel)
#define MSR_GSBASE 0xc0000101
#endif
static __inline void
-load_gs(u_int sel)
+load_gs(u_short sel)
{
/*
* Preserve the gsbase value across the selector load.
* Note that we have to disable interrupts because the gsbase
* being trashed happens to be the kernel gsbase at the time.
*/
- __asm __volatile("pushfq; cli; rdmsr; mov %0,%%gs; wrmsr; popfq"
+ __asm __volatile("pushfq; cli; rdmsr; movw %0,%%gs; wrmsr; popfq"
: : "rm" (sel), "c" (MSR_GSBASE) : "eax", "edx");
}
#else
/* Usable by userland */
static __inline void
-load_fs(u_int sel)
+load_fs(u_short sel)
{
- __asm __volatile("mov %0,%%fs" : : "rm" (sel));
+ __asm __volatile("movw %0,%%fs" : : "rm" (sel));
}
static __inline void
-load_gs(u_int sel)
+load_gs(u_short sel)
{
- __asm __volatile("mov %0,%%gs" : : "rm" (sel));
+ __asm __volatile("movw %0,%%gs" : : "rm" (sel));
}
#endif
@@ -692,8 +692,8 @@ void load_dr4(u_int64_t dr4);
void load_dr5(u_int64_t dr5);
void load_dr6(u_int64_t dr6);
void load_dr7(u_int64_t dr7);
-void load_fs(u_int sel);
-void load_gs(u_int sel);
+void load_fs(u_short sel);
+void load_gs(u_short sel);
void ltr(u_short sel);
void outb(u_int port, u_char data);
void outl(u_int port, u_int data);
Modified: user/nwhitehorn/ps3/boot/i386/boot2/Makefile
==============================================================================
--- user/nwhitehorn/ps3/boot/i386/boot2/Makefile Mon Sep 6 23:07:58 2010 (r212278)
+++ user/nwhitehorn/ps3/boot/i386/boot2/Makefile Mon Sep 6 23:11:56 2010 (r212279)
@@ -3,7 +3,9 @@
.include <bsd.own.mk>
# XXX: clang can compile the boot code just fine, but boot2 gets too big
-CC:=${CC:C/^cc|^clang/gcc/}
+.if ${CC:T:Mclang} == "clang"
+CC=gcc
+.endif
FILES= boot boot1 boot2
Modified: user/nwhitehorn/ps3/boot/i386/efi/Makefile
==============================================================================
--- user/nwhitehorn/ps3/boot/i386/efi/Makefile Mon Sep 6 23:07:58 2010 (r212278)
+++ user/nwhitehorn/ps3/boot/i386/efi/Makefile Mon Sep 6 23:11:56 2010 (r212279)
@@ -42,7 +42,7 @@ ${PROG}: ${LDSCRIPT}
CLEANFILES= vers.c loader.efi
-NEWVERSWHAT= "EFI loader" ${MACHINE_ARCH}
+NEWVERSWHAT= "EFI loader" x86
vers.c: ${.CURDIR}/../../common/newvers.sh ${.CURDIR}/version
sh ${.CURDIR}/../../common/newvers.sh ${.CURDIR}/version ${NEWVERSWHAT}
Modified: user/nwhitehorn/ps3/boot/i386/libi386/pxe.c
==============================================================================
--- user/nwhitehorn/ps3/boot/i386/libi386/pxe.c Mon Sep 6 23:07:58 2010 (r212278)
+++ user/nwhitehorn/ps3/boot/i386/libi386/pxe.c Mon Sep 6 23:11:56 2010 (r212279)
@@ -409,6 +409,7 @@ pxe_perror(int err)
* Reach inside the libstand NFS code and dig out an NFS handle
* for the root filesystem.
*/
+#ifdef OLD_NFSV2
struct nfs_iodesc {
struct iodesc *iodesc;
off_t off;
@@ -456,6 +457,64 @@ pxe_setnfshandle(char *rootpath)
sprintf(cp, "X");
setenv("boot.nfsroot.nfshandle", buf, 1);
}
+#else /* !OLD_NFSV2 */
+
+#define NFS_V3MAXFHSIZE 64
+
+struct nfs_iodesc {
+ struct iodesc *iodesc;
+ off_t off;
+ uint32_t fhsize;
+ u_char fh[NFS_V3MAXFHSIZE];
+ /* structure truncated */
+};
+extern struct nfs_iodesc nfs_root_node;
+extern int rpc_port;
+
+static void
+pxe_rpcmountcall()
+{
+ struct iodesc *d;
+ int error;
+
+ if (!(d = socktodesc(pxe_sock)))
+ return;
+ d->myport = htons(--rpc_port);
+ d->destip = rootip;
+ if ((error = nfs_getrootfh(d, rootpath, &nfs_root_node.fhsize,
+ nfs_root_node.fh)) != 0) {
+ printf("NFS MOUNT RPC error: %d\n", error);
+ nfs_root_node.fhsize = 0;
+ }
+ nfs_root_node.iodesc = d;
+}
+
+static void
+pxe_setnfshandle(char *rootpath)
+{
+ int i;
+ u_char *fh;
+ char buf[2 * NFS_V3MAXFHSIZE + 3], *cp;
+
+ /*
+ * If NFS files were never opened, we need to do mount call
+ * ourselves. Use nfs_root_node.iodesc as flag indicating
+ * previous NFS usage.
+ */
+ if (nfs_root_node.iodesc == NULL)
+ pxe_rpcmountcall();
+
+ fh = &nfs_root_node.fh[0];
+ buf[0] = 'X';
+ cp = &buf[1];
+ for (i = 0; i < nfs_root_node.fhsize; i++, cp += 2)
+ sprintf(cp, "%02x", fh[i]);
+ sprintf(cp, "X");
+ setenv("boot.nfsroot.nfshandle", buf, 1);
+ sprintf(buf, "%d", nfs_root_node.fhsize);
+ setenv("boot.nfsroot.nfshandlelen", buf, 1);
+}
+#endif /* OLD_NFSV2 */
void
pxenv_call(int func)
Modified: user/nwhitehorn/ps3/boot/i386/loader/Makefile
==============================================================================
--- user/nwhitehorn/ps3/boot/i386/loader/Makefile Mon Sep 6 23:07:58 2010 (r212278)
+++ user/nwhitehorn/ps3/boot/i386/loader/Makefile Mon Sep 6 23:11:56 2010 (r212279)
@@ -6,7 +6,7 @@ MK_SSP= no
LOADER?= loader
PROG= ${LOADER}.sym
INTERNALPROG=
-NEWVERSWHAT?= "bootstrap loader" i386
+NEWVERSWHAT?= "bootstrap loader" x86
# architecture-specific loader code
SRCS= main.c conf.c vers.c
Modified: user/nwhitehorn/ps3/boot/i386/zfsloader/Makefile
==============================================================================
--- user/nwhitehorn/ps3/boot/i386/zfsloader/Makefile Mon Sep 6 23:07:58 2010 (r212278)
+++ user/nwhitehorn/ps3/boot/i386/zfsloader/Makefile Mon Sep 6 23:11:56 2010 (r212279)
@@ -3,7 +3,7 @@
.PATH: ${.CURDIR}/../loader
LOADER= zfsloader
-NEWVERSWHAT= "ZFS enabled bootstrap loader" i386
+NEWVERSWHAT= "ZFS enabled bootstrap loader" x86
LOADER_ZFS_SUPPORT=yes
LOADER_ONLY= yes
NO_MAN= yes
Modified: user/nwhitehorn/ps3/boot/ofw/libofw/ofw_copy.c
==============================================================================
--- user/nwhitehorn/ps3/boot/ofw/libofw/ofw_copy.c Mon Sep 6 23:07:58 2010 (r212278)
+++ user/nwhitehorn/ps3/boot/ofw/libofw/ofw_copy.c Mon Sep 6 23:11:56 2010 (r212279)
@@ -68,7 +68,7 @@ ofw_mapmem(vm_offset_t dest, const size_
/*
* Trim area covered by existing mapping, if any
*/
- if (dest < (last_dest + last_len)) {
+ if (dest < (last_dest + last_len) && dest >= last_dest) {
nlen -= (last_dest + last_len) - dest;
dest = last_dest + last_len;
}
Modified: user/nwhitehorn/ps3/boot/pc98/boot2/Makefile
==============================================================================
--- user/nwhitehorn/ps3/boot/pc98/boot2/Makefile Mon Sep 6 23:07:58 2010 (r212278)
+++ user/nwhitehorn/ps3/boot/pc98/boot2/Makefile Mon Sep 6 23:11:56 2010 (r212279)
@@ -1,5 +1,12 @@
# $FreeBSD$
+.include <bsd.own.mk>
+
+# XXX: clang can compile the boot code just fine, but boot2 gets too big
+.if ${CC:T:Mclang} == "clang"
+CC=gcc
+.endif
+
FILES= boot boot1 boot2
NM?= nm
Modified: user/nwhitehorn/ps3/boot/pc98/boot2/boot2.c
==============================================================================
--- user/nwhitehorn/ps3/boot/pc98/boot2/boot2.c Mon Sep 6 23:07:58 2010 (r212278)
+++ user/nwhitehorn/ps3/boot/pc98/boot2/boot2.c Mon Sep 6 23:11:56 2010 (r212279)
@@ -187,9 +187,8 @@ xfsread(ino_t inode, void *buf, size_t n
static inline uint32_t
memsize(void)
{
- u_char *p = (u_char *)PTOV(0);
-
- return *(p + 0x401) * 128 * 1024 + *(u_int16_t *)(p + 0x594) * 1024 * 1024;
+ return (*(u_char *)PTOV(0x401) * 128 * 1024 +
+ *(uint16_t *)PTOV(0x594) * 1024 * 1024);
}
static inline void
Modified: user/nwhitehorn/ps3/cam/ata/ata_da.c
==============================================================================
--- user/nwhitehorn/ps3/cam/ata/ata_da.c Mon Sep 6 23:07:58 2010 (r212278)
+++ user/nwhitehorn/ps3/cam/ata/ata_da.c Mon Sep 6 23:11:56 2010 (r212279)
@@ -874,7 +874,8 @@ adastart(struct cam_periph *periph, unio
}
bioq_remove(&softc->bio_queue, bp);
- if ((softc->flags & ADA_FLAG_NEED_OTAG) != 0) {
+ if ((bp->bio_flags & BIO_ORDERED) != 0
+ || (softc->flags & ADA_FLAG_NEED_OTAG) != 0) {
softc->flags &= ~ADA_FLAG_NEED_OTAG;
softc->ordered_tag_count++;
tag_code = 0;
Modified: user/nwhitehorn/ps3/cam/scsi/scsi_da.c
==============================================================================
--- user/nwhitehorn/ps3/cam/scsi/scsi_da.c Mon Sep 6 23:07:58 2010 (r212278)
+++ user/nwhitehorn/ps3/cam/scsi/scsi_da.c Mon Sep 6 23:11:56 2010 (r212279)
@@ -1354,7 +1354,8 @@ dastart(struct cam_periph *periph, union
bioq_remove(&softc->bio_queue, bp);
- if ((softc->flags & DA_FLAG_NEED_OTAG) != 0) {
+ if ((bp->bio_flags & BIO_ORDERED) != 0
+ || (softc->flags & DA_FLAG_NEED_OTAG) != 0) {
softc->flags &= ~DA_FLAG_NEED_OTAG;
softc->ordered_tag_count++;
tag_code = MSG_ORDERED_Q_TAG;
@@ -1368,7 +1369,8 @@ dastart(struct cam_periph *periph, union
/*retries*/da_retry_count,
/*cbfcnp*/dadone,
/*tag_action*/tag_code,
- /*read_op*/bp->bio_cmd == BIO_READ,
+ /*read_op*/bp->bio_cmd
+ == BIO_READ,
/*byte2*/0,
softc->minimum_cmd_size,
/*lba*/bp->bio_pblkno,
@@ -1377,17 +1379,24 @@ dastart(struct cam_periph *periph, union
/*data_ptr*/ bp->bio_data,
/*dxfer_len*/ bp->bio_bcount,
/*sense_len*/SSD_FULL_SIZE,
- /*timeout*/da_default_timeout*1000);
+ da_default_timeout * 1000);
break;
case BIO_FLUSH:
+ /*
+ * BIO_FLUSH doesn't currently communicate
+ * range data, so we synchronize the cache
+ * over the whole disk. We also force
+ * ordered tag semantics the flush applies
+ * to all previously queued I/O.
+ */
scsi_synchronize_cache(&start_ccb->csio,
/*retries*/1,
/*cbfcnp*/dadone,
- MSG_SIMPLE_Q_TAG,
- /*begin_lba*/0,/* Cover the whole disk */
+ MSG_ORDERED_Q_TAG,
+ /*begin_lba*/0,
/*lb_count*/0,
SSD_FULL_SIZE,
- /*timeout*/da_default_timeout*1000);
+ da_default_timeout*1000);
break;
}
start_ccb->ccb_h.ccb_state = DA_CCB_BUFFER_IO;
Modified: user/nwhitehorn/ps3/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c
==============================================================================
--- user/nwhitehorn/ps3/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c Mon Sep 6 23:07:58 2010 (r212278)
+++ user/nwhitehorn/ps3/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c Mon Sep 6 23:11:56 2010 (r212279)
@@ -598,6 +598,7 @@ sendreq:
break;
case ZIO_TYPE_IOCTL:
bp->bio_cmd = BIO_FLUSH;
+ bp->bio_flags |= BIO_ORDERED;
bp->bio_data = NULL;
bp->bio_offset = cp->provider->mediasize;
bp->bio_length = 0;
Modified: user/nwhitehorn/ps3/cddl/dev/dtrace/dtrace_load.c
==============================================================================
--- user/nwhitehorn/ps3/cddl/dev/dtrace/dtrace_load.c Mon Sep 6 23:07:58 2010 (r212278)
+++ user/nwhitehorn/ps3/cddl/dev/dtrace/dtrace_load.c Mon Sep 6 23:11:56 2010 (r212279)
@@ -163,7 +163,7 @@ dtrace_load(void *dummy)
#else
dtrace_dev = make_dev(&dtrace_cdevsw, 0, UID_ROOT, GID_WHEEL, 0600,
"dtrace/dtrace");
- helper_dev = make_dev(&helper_cdevsw, 0, UID_ROOT, GID_WHEEL, 0600,
+ helper_dev = make_dev(&helper_cdevsw, 0, UID_ROOT, GID_WHEEL, 0660,
"dtrace/helper");
#endif
Modified: user/nwhitehorn/ps3/dev/acpi_support/acpi_hp.c
==============================================================================
--- user/nwhitehorn/ps3/dev/acpi_support/acpi_hp.c Mon Sep 6 23:07:58 2010 (r212278)
+++ user/nwhitehorn/ps3/dev/acpi_support/acpi_hp.c Mon Sep 6 23:11:56 2010 (r212279)
@@ -49,6 +49,7 @@ __FBSDID("$FreeBSD$");
#include <sys/uio.h>
#include <sys/proc.h>
#include <sys/kernel.h>
+#include <sys/limits.h>
#include <sys/bus.h>
#include <sys/sbuf.h>
#include <sys/module.h>
@@ -116,7 +117,6 @@ struct acpi_hp_inst_seq_pair {
struct acpi_hp_softc {
device_t dev;
- ACPI_HANDLE handle;
device_t wmi_dev;
int has_notify; /* notification GUID found */
int has_cmi; /* CMI GUID found */
@@ -289,6 +289,7 @@ static struct {
ACPI_SERIAL_DECL(hp, "HP ACPI-WMI Mapping");
+static void acpi_hp_identify(driver_t *driver, device_t parent);
static int acpi_hp_probe(device_t dev);
static int acpi_hp_attach(device_t dev);
static int acpi_hp_detach(device_t dev);
@@ -320,6 +321,7 @@ static struct cdevsw hpcmi_cdevsw = {
};
static device_method_t acpi_hp_methods[] = {
+ DEVMETHOD(device_identify, acpi_hp_identify),
DEVMETHOD(device_probe, acpi_hp_probe),
DEVMETHOD(device_attach, acpi_hp_attach),
DEVMETHOD(device_detach, acpi_hp_detach),
@@ -405,7 +407,7 @@ acpi_hp_evaluate_auto_on_off(struct acpi
"WLAN on air changed to %i "
"(new_wlan_status is %i)\n",
sc->was_wlan_on_air, new_wlan_status);
- acpi_UserNotify("HP", sc->handle,
+ acpi_UserNotify("HP", ACPI_ROOT_OBJECT,
0xc0+sc->was_wlan_on_air);
}
}
@@ -420,7 +422,7 @@ acpi_hp_evaluate_auto_on_off(struct acpi
" to %i (new_bluetooth_status is %i)\n",
sc->was_bluetooth_on_air,
new_bluetooth_status);
- acpi_UserNotify("HP", sc->handle,
+ acpi_UserNotify("HP", ACPI_ROOT_OBJECT,
0xd0+sc->was_bluetooth_on_air);
}
}
@@ -433,16 +435,43 @@ acpi_hp_evaluate_auto_on_off(struct acpi
"WWAN on air changed to %i"
" (new_wwan_status is %i)\n",
sc->was_wwan_on_air, new_wwan_status);
- acpi_UserNotify("HP", sc->handle,
+ acpi_UserNotify("HP", ACPI_ROOT_OBJECT,
0xe0+sc->was_wwan_on_air);
}
}
}
+static void
+acpi_hp_identify(driver_t *driver, device_t parent)
+{
+
+ /* Don't do anything if driver is disabled. */
+ if (acpi_disabled("hp"))
+ return;
+
+ /* Add only a single device instance. */
+ if (device_find_child(parent, "acpi_hp", -1) != NULL)
+ return;
+
+ /* Make sure acpi_wmi driver is present. */
+ if (devclass_find("acpi_wmi") == NULL)
+ return;
+
+ /*
+ * Add our device with late order, so that it is hopefully
+ * probed after acpi_wmi.
+ * XXX User proper constant instead of UINT_MAX for order.
+ */
+ if (BUS_ADD_CHILD(parent, UINT_MAX, "acpi_hp", -1) == NULL)
+ device_printf(parent, "add acpi_hp child failed\n");
+}
+
static int
acpi_hp_probe(device_t dev)
{
- if (acpi_disabled("hp") || device_get_unit(dev) != 0)
+
+ /* Skip auto-enumerated devices from ACPI namespace. */
+ if (acpi_get_handle(dev) != NULL)
return (ENXIO);
device_set_desc(dev, "HP ACPI-WMI Mapping");
@@ -460,7 +489,6 @@ acpi_hp_attach(device_t dev)
sc = device_get_softc(dev);
sc->dev = dev;
- sc->handle = acpi_get_handle(dev);
sc->has_notify = 0;
sc->has_cmi = 0;
sc->bluetooth_enable_if_radio_on = 0;
@@ -477,7 +505,7 @@ acpi_hp_attach(device_t dev)
sc->verbose = 0;
memset(sc->cmi_order, 0, sizeof(sc->cmi_order));
- if (!(wmi_devclass = devclass_find ("acpi_wmi"))) {
+ if (!(wmi_devclass = devclass_find("acpi_wmi"))) {
device_printf(dev, "Couldn't find acpi_wmi devclass\n");
return (EINVAL);
}
Modified: user/nwhitehorn/ps3/dev/acpica/acpi.c
==============================================================================
--- user/nwhitehorn/ps3/dev/acpica/acpi.c Mon Sep 6 23:07:58 2010 (r212278)
+++ user/nwhitehorn/ps3/dev/acpica/acpi.c Mon Sep 6 23:11:56 2010 (r212279)
@@ -1690,10 +1690,10 @@ acpi_probe_order(ACPI_HANDLE handle, int
ACPI_OBJECT_TYPE type;
/*
- * 1. I/O port and memory system resource holders
- * 2. Embedded controllers (to handle early accesses)
- * 3. PCI Link Devices
- * 100000. CPUs
+ * 1. CPUs
+ * 2. I/O port and memory system resource holders
+ * 3. Embedded controllers (to handle early accesses)
+ * 4. PCI Link Devices
*/
AcpiGetType(handle, &type);
if (type == ACPI_TYPE_PROCESSOR)
@@ -1753,8 +1753,7 @@ acpi_probe_child(ACPI_HANDLE handle, UIN
* placeholder so that the probe/attach passes will run
* breadth-first. Orders less than ACPI_DEV_BASE_ORDER
* are reserved for special objects (i.e., system
- * resources). CPU devices have a very high order to
- * ensure they are probed after other devices.
+ * resources).
*/
ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "scanning '%s'\n", handle_str));
order = level * 10 + 100;
Modified: user/nwhitehorn/ps3/dev/acpica/acpi_hpet.c
==============================================================================
--- user/nwhitehorn/ps3/dev/acpica/acpi_hpet.c Mon Sep 6 23:07:58 2010 (r212278)
+++ user/nwhitehorn/ps3/dev/acpica/acpi_hpet.c Mon Sep 6 23:11:56 2010 (r212279)
@@ -74,6 +74,7 @@ struct hpet_softc {
int irq;
int useirq;
int legacy_route;
+ uint32_t allowed_irqs;
struct resource *mem_res;
struct resource *intr_res;
void *intr_handle;
@@ -146,7 +147,7 @@ hpet_start(struct eventtimer *et,
struct hpet_timer *mt = (struct hpet_timer *)et->et_priv;
struct hpet_timer *t;
struct hpet_softc *sc = mt->sc;
- uint32_t fdiv;
+ uint32_t fdiv, cmp;
t = (mt->pcpu_master < 0) ? mt : &sc->t[mt->pcpu_slaves[curcpu]];
if (period != NULL) {
@@ -164,23 +165,31 @@ hpet_start(struct eventtimer *et,
fdiv += sc->freq * first->sec;
} else
fdiv = t->div;
+ if (t->irq < 0)
+ bus_write_4(sc->mem_res, HPET_ISR, 1 << t->num);
+ t->caps |= HPET_TCNF_INT_ENB;
t->last = bus_read_4(sc->mem_res, HPET_MAIN_COUNTER);
+restart:
+ cmp = t->last + fdiv;
if (t->mode == 1 && (t->caps & HPET_TCAP_PER_INT)) {
t->caps |= HPET_TCNF_TYPE;
bus_write_4(sc->mem_res, HPET_TIMER_CAP_CNF(t->num),
t->caps | HPET_TCNF_VAL_SET);
- bus_write_4(sc->mem_res, HPET_TIMER_COMPARATOR(t->num),
- t->last + fdiv);
- bus_read_4(sc->mem_res, HPET_TIMER_COMPARATOR(t->num));
- bus_write_4(sc->mem_res, HPET_TIMER_COMPARATOR(t->num),
- t->div);
+ bus_write_4(sc->mem_res, HPET_TIMER_COMPARATOR(t->num), cmp);
+ bus_write_4(sc->mem_res, HPET_TIMER_COMPARATOR(t->num), t->div);
} else {
- bus_write_4(sc->mem_res, HPET_TIMER_COMPARATOR(t->num),
- t->last + fdiv);
+ t->caps &= ~HPET_TCNF_TYPE;
+ bus_write_4(sc->mem_res, HPET_TIMER_CAP_CNF(t->num), t->caps);
+ bus_write_4(sc->mem_res, HPET_TIMER_COMPARATOR(t->num), cmp);
+ }
+ if (fdiv < 5000) {
+ bus_read_4(sc->mem_res, HPET_TIMER_COMPARATOR(t->num));
+ t->last = bus_read_4(sc->mem_res, HPET_MAIN_COUNTER);
+ if ((int32_t)(t->last - cmp) < 0) {
+ fdiv *= 2;
+ goto restart;
+ }
}
- t->caps |= HPET_TCNF_INT_ENB;
- bus_write_4(sc->mem_res, HPET_ISR, 1 << t->num);
- bus_write_4(sc->mem_res, HPET_TIMER_CAP_CNF(t->num), t->caps);
return (0);
}
@@ -321,7 +330,7 @@ hpet_attach(device_t dev)
int i, j, num_msi, num_timers, num_percpu_et, num_percpu_t, cur_cpu;
int pcpu_master;
static int maxhpetet = 0;
- uint32_t val, val2, cvectors;
+ uint32_t val, val2, cvectors, dvectors;
uint16_t vendor, rev;
ACPI_FUNCTION_TRACE((char *)(uintptr_t) __func__);
@@ -438,10 +447,9 @@ hpet_attach(device_t dev)
sc->t[1].vectors = 0;
}
- num_msi = 0;
- sc->useirq = 0;
- /* Find common legacy IRQ vectors for all timers. */
- cvectors = 0xffff0000;
+ /* Check what IRQs we want use. */
+ /* By default allow any PCI IRQs. */
+ sc->allowed_irqs = 0xffff0000;
/*
* HPETs in AMD chipsets before SB800 have problems with IRQs >= 16
* Lower are also not always working for different reasons.
@@ -450,7 +458,25 @@ hpet_attach(device_t dev)
* interrupt loss. Avoid legacy IRQs for AMD.
*/
if (vendor == HPET_VENDID_AMD)
- cvectors = 0x00000000;
+ sc->allowed_irqs = 0x00000000;
+ /*
+ * Neither QEMU nor VirtualBox report supported IRQs correctly.
+ * The only way to use HPET there is to specify IRQs manually
+ * and/or use legacy_route. Legacy_route mode work on both.
+ */
+ if (vm_guest)
+ sc->allowed_irqs = 0x00000000;
+ /* Let user override. */
+ resource_int_value(device_get_name(dev), device_get_unit(dev),
+ "allowed_irqs", &sc->allowed_irqs);
+
+ num_msi = 0;
+ sc->useirq = 0;
+ /* Find IRQ vectors for all timers. */
+ cvectors = sc->allowed_irqs & 0xffff0000;
+ dvectors = sc->allowed_irqs & 0x0000ffff;
+ if (sc->legacy_route)
+ dvectors &= 0x0000fefe;
for (i = 0; i < num_timers; i++) {
t = &sc->t[i];
if (sc->legacy_route && i < 2)
@@ -465,6 +491,10 @@ hpet_attach(device_t dev)
}
}
#endif
+ else if (dvectors & t->vectors) {
+ t->irq = ffs(dvectors & t->vectors) - 1;
+ dvectors &= ~(1 << t->irq);
+ }
if (t->irq >= 0) {
if (!(t->intr_res =
bus_alloc_resource(dev, SYS_RES_IRQ, &t->intr_rid,
@@ -495,7 +525,7 @@ hpet_attach(device_t dev)
if (sc->legacy_route)
hpet_enable(sc);
/* Group timers for per-CPU operation. */
- num_percpu_et = min(num_msi / mp_ncpus, 2);
+ num_percpu_et = min(num_msi / mp_ncpus, 1);
num_percpu_t = num_percpu_et * mp_ncpus;
pcpu_master = 0;
cur_cpu = CPU_FIRST();
@@ -510,7 +540,8 @@ hpet_attach(device_t dev)
bus_bind_intr(dev, t->intr_res, cur_cpu);
cur_cpu = CPU_NEXT(cur_cpu);
num_percpu_t--;
- }
+ } else if (t->irq >= 0)
+ bus_bind_intr(dev, t->intr_res, CPU_FIRST());
}
bus_write_4(sc->mem_res, HPET_ISR, 0xffffffff);
sc->irq = -1;
@@ -545,7 +576,7 @@ hpet_attach(device_t dev)
/* Legacy route doesn't need more configuration. */
} else
#ifdef DEV_APIC
- if (t->irq >= 0) {
+ if ((t->caps & HPET_TCAP_FSB_INT_DEL) && t->irq >= 0) {
uint64_t addr;
uint32_t data;
@@ -561,7 +592,9 @@ hpet_attach(device_t dev)
t->irq = -2;
} else
#endif
- if (sc->irq >= 0 && (t->vectors & (1 << sc->irq)))
+ if (t->irq >= 0)
+ t->caps |= (t->irq << 9);
+ else if (sc->irq >= 0 && (t->vectors & (1 << sc->irq)))
t->caps |= (sc->irq << 9) | HPET_TCNF_INT_TYPE;
bus_write_4(sc->mem_res, HPET_TIMER_CAP_CNF(i), t->caps);
/* Skip event timers without set up IRQ. */
@@ -585,7 +618,7 @@ hpet_attach(device_t dev)
t->et.et_quality -= 10;
t->et.et_frequency = sc->freq;
t->et.et_min_period.sec = 0;
- t->et.et_min_period.frac = 0x00004000LLU << 32;
+ t->et.et_min_period.frac = 0x00008000LLU << 32;
t->et.et_max_period.sec = 0xfffffffeLLU / sc->freq;
t->et.et_max_period.frac =
((0xfffffffeLLU << 32) / sc->freq) << 32;
Modified: user/nwhitehorn/ps3/dev/ata/ata-all.h
==============================================================================
--- user/nwhitehorn/ps3/dev/ata/ata-all.h Mon Sep 6 23:07:58 2010 (r212278)
+++ user/nwhitehorn/ps3/dev/ata/ata-all.h Mon Sep 6 23:11:56 2010 (r212279)
@@ -565,6 +565,7 @@ struct ata_channel {
#define ATA_NO_ATAPI_DMA 0x40
#define ATA_SATA 0x80
#define ATA_DMA_BEFORE_CMD 0x100
+#define ATA_KNOWN_PRESENCE 0x200
int pm_level; /* power management level */
int devices; /* what is present */
Modified: user/nwhitehorn/ps3/dev/ata/ata-lowlevel.c
==============================================================================
--- user/nwhitehorn/ps3/dev/ata/ata-lowlevel.c Mon Sep 6 23:07:58 2010 (r212278)
+++ user/nwhitehorn/ps3/dev/ata/ata-lowlevel.c Mon Sep 6 23:11:56 2010 (r212279)
@@ -474,7 +474,8 @@ ata_generic_reset(device_t dev)
ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_D_LBA | ATA_DEV(ATA_MASTER));
DELAY(10);
ostat0 = ATA_IDX_INB(ch, ATA_STATUS);
- if ((ostat0 & 0xf8) != 0xf8 && ostat0 != 0xa5) {
+ if (((ostat0 & 0xf8) != 0xf8 || (ch->flags & ATA_KNOWN_PRESENCE)) &&
+ ostat0 != 0xa5) {
stat0 = ATA_S_BUSY;
mask |= 0x01;
}
@@ -484,7 +485,8 @@ ata_generic_reset(device_t dev)
ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_D_LBA | ATA_DEV(ATA_SLAVE));
DELAY(10);
ostat1 = ATA_IDX_INB(ch, ATA_STATUS);
- if ((ostat1 & 0xf8) != 0xf8 && ostat1 != 0xa5) {
+ if (((ostat1 & 0xf8) != 0xf8 || (ch->flags & ATA_KNOWN_PRESENCE)) &&
+ ostat1 != 0xa5) {
stat1 = ATA_S_BUSY;
mask |= 0x02;
}
@@ -570,22 +572,16 @@ ata_generic_reset(device_t dev)
}
}
- if (mask == 0x00) /* nothing to wait for */
- break;
- if (mask == 0x01) /* wait for master only */
- if (!(stat0 & ATA_S_BUSY) || (stat0 == 0xff && timeout > 10))
- break;
- if (mask == 0x02) /* wait for slave only */
- if (!(stat1 & ATA_S_BUSY) || (stat1 == 0xff && timeout > 10))
- break;
- if (mask == 0x03) { /* wait for both master & slave */
- if (!(stat0 & ATA_S_BUSY) && !(stat1 & ATA_S_BUSY))
- break;
- if ((stat0 == 0xff) && (timeout > 20))
- mask &= ~0x01;
- if ((stat1 == 0xff) && (timeout > 20))
- mask &= ~0x02;
+ if ((ch->flags & ATA_KNOWN_PRESENCE) == 0 &&
+ timeout > ((mask == 0x03) ? 20 : 10)) {
+ if ((mask & 0x01) && stat0 == 0xff)
+ mask &= ~0x01;
+ if ((mask & 0x02) && stat1 == 0xff)
+ mask &= ~0x02;
}
+ if (((mask & 0x01) == 0 || !(stat0 & ATA_S_BUSY)) &&
+ ((mask & 0x02) == 0 || !(stat1 & ATA_S_BUSY)))
+ break;
ata_udelay(100000);
}
Modified: user/nwhitehorn/ps3/dev/ata/chipsets/ata-ahci.c
==============================================================================
--- user/nwhitehorn/ps3/dev/ata/chipsets/ata-ahci.c Mon Sep 6 23:07:58 2010 (r212278)
+++ user/nwhitehorn/ps3/dev/ata/chipsets/ata-ahci.c Mon Sep 6 23:11:56 2010 (r212279)
@@ -815,7 +815,7 @@ ata_ahci_hardreset(device_t dev, int por
if (!ata_sata_phy_reset(dev, port, 0))
return (ENOENT);
/* Wait for clearing busy status. */
- if (ata_ahci_wait_ready(dev, 10000)) {
+ if (ata_ahci_wait_ready(dev, 15000)) {
device_printf(dev, "hardware reset timeout\n");
return (EBUSY);
}
Modified: user/nwhitehorn/ps3/dev/ata/chipsets/ata-siliconimage.c
==============================================================================
--- user/nwhitehorn/ps3/dev/ata/chipsets/ata-siliconimage.c Mon Sep 6 23:07:58 2010 (r212278)
+++ user/nwhitehorn/ps3/dev/ata/chipsets/ata-siliconimage.c Mon Sep 6 23:11:56 2010 (r212279)
@@ -316,6 +316,7 @@ ata_sii_ch_attach(device_t dev)
ch->r_io[ATA_SCONTROL].offset = 0x100 + (unit01 << 7) + (unit10 << 8);
ch->flags |= ATA_NO_SLAVE;
ch->flags |= ATA_SATA;
+ ch->flags |= ATA_KNOWN_PRESENCE;
/* enable PHY state change interrupt */
ATA_OUTL(ctlr->r_res2, 0x148 + (unit01 << 7) + (unit10 << 8),(1 << 16));
@@ -364,7 +365,15 @@ ata_sii_status(device_t dev)
static void
ata_sii_reset(device_t dev)
{
+ struct ata_pci_controller *ctlr = device_get_softc(device_get_parent(dev));
struct ata_channel *ch = device_get_softc(dev);
+ int offset = ((ch->unit & 1) << 7) + ((ch->unit & 2) << 8);
+ uint32_t val;
+
+ /* Apply R_ERR on DMA activate FIS errata workaround. */
+ val = ATA_INL(ctlr->r_res2, 0x14c + offset);
+ if ((val & 0x3) == 0x1)
+ ATA_OUTL(ctlr->r_res2, 0x14c + offset, val & ~0x3);
if (ata_sata_phy_reset(dev, -1, 1))
ata_generic_reset(dev);
Modified: user/nwhitehorn/ps3/dev/bge/if_bge.c
==============================================================================
--- user/nwhitehorn/ps3/dev/bge/if_bge.c Mon Sep 6 23:07:58 2010 (r212278)
+++ user/nwhitehorn/ps3/dev/bge/if_bge.c Mon Sep 6 23:11:56 2010 (r212279)
@@ -355,8 +355,10 @@ static int bge_suspend(device_t);
static int bge_resume(device_t);
static void bge_release_resources(struct bge_softc *);
static void bge_dma_map_addr(void *, bus_dma_segment_t *, int, int);
-static int bge_dma_alloc(device_t);
+static int bge_dma_alloc(struct bge_softc *);
static void bge_dma_free(struct bge_softc *);
+static int bge_dma_ring_alloc(struct bge_softc *, bus_size_t, bus_size_t,
+ bus_dma_tag_t *, uint8_t **, bus_dmamap_t *, bus_addr_t *, const char *);
static int bge_get_eaddr_fw(struct bge_softc *sc, uint8_t ether_addr[]);
static int bge_get_eaddr_mem(struct bge_softc *, uint8_t[]);
@@ -614,13 +616,9 @@ bge_dma_map_addr(void *arg, bus_dma_segm
if (error)
return;
- ctx = arg;
-
- if (nseg > ctx->bge_maxsegs) {
- ctx->bge_maxsegs = 0;
- return;
- }
+ KASSERT(nseg == 1, ("%s: %d segments returned!", __func__, nseg));
+ ctx = arg;
ctx->bge_busaddr = segs->ds_addr;
}
@@ -2122,27 +2120,84 @@ bge_dma_free(struct bge_softc *sc)
if (sc->bge_cdata.bge_stats_tag)
bus_dma_tag_destroy(sc->bge_cdata.bge_stats_tag);
+ if (sc->bge_cdata.bge_buffer_tag)
+ bus_dma_tag_destroy(sc->bge_cdata.bge_buffer_tag);
+
/* Destroy the parent tag. */
if (sc->bge_cdata.bge_parent_tag)
bus_dma_tag_destroy(sc->bge_cdata.bge_parent_tag);
}
static int
-bge_dma_alloc(device_t dev)
+bge_dma_ring_alloc(struct bge_softc *sc, bus_size_t alignment,
+ bus_size_t maxsize, bus_dma_tag_t *tag, uint8_t **ring, bus_dmamap_t *map,
+ bus_addr_t *paddr, const char *msg)
{
struct bge_dmamap_arg ctx;
- struct bge_softc *sc;
bus_addr_t lowaddr;
- bus_size_t sbsz, txsegsz, txmaxsegsz;
- int i, error;
+ bus_size_t ring_end;
+ int error;
- sc = device_get_softc(dev);
+ lowaddr = BUS_SPACE_MAXADDR;
+again:
+ error = bus_dma_tag_create(sc->bge_cdata.bge_parent_tag,
+ alignment, 0, lowaddr, BUS_SPACE_MAXADDR, NULL,
+ NULL, maxsize, 1, maxsize, 0, NULL, NULL, tag);
+ if (error != 0) {
+ device_printf(sc->bge_dev,
+ "could not create %s dma tag\n", msg);
+ return (ENOMEM);
+ }
+ /* Allocate DMA'able memory for ring. */
+ error = bus_dmamem_alloc(*tag, (void **)ring,
+ BUS_DMA_NOWAIT | BUS_DMA_ZERO | BUS_DMA_COHERENT, map);
+ if (error != 0) {
+ device_printf(sc->bge_dev,
+ "could not allocate DMA'able memory for %s\n", msg);
+ return (ENOMEM);
+ }
+ /* Load the address of the ring. */
+ ctx.bge_busaddr = 0;
+ error = bus_dmamap_load(*tag, *map, *ring, maxsize, bge_dma_map_addr,
+ &ctx, BUS_DMA_NOWAIT);
+ if (error != 0) {
+ device_printf(sc->bge_dev,
+ "could not load DMA'able memory for %s\n", msg);
+ return (ENOMEM);
+ }
+ *paddr = ctx.bge_busaddr;
+ ring_end = *paddr + maxsize;
+ if ((sc->bge_flags & BGE_FLAG_4G_BNDRY_BUG) != 0 &&
+ BGE_ADDR_HI(*paddr) != BGE_ADDR_HI(ring_end)) {
+ /*
+ * 4GB boundary crossed. Limit maximum allowable DMA
+ * address space to 32bit and try again.
+ */
+ bus_dmamap_unload(*tag, *map);
+ bus_dmamem_free(*tag, *ring, *map);
+ bus_dma_tag_destroy(*tag);
+ if (bootverbose)
+ device_printf(sc->bge_dev, "4GB boundary crossed, "
+ "limit DMA address space to 32bit for %s\n", msg);
+ *ring = NULL;
+ *tag = NULL;
+ *map = NULL;
+ lowaddr = BUS_SPACE_MAXADDR_32BIT;
+ goto again;
+ }
+ return (0);
+}
+
+static int
+bge_dma_alloc(struct bge_softc *sc)
+{
+ bus_addr_t lowaddr;
+ bus_size_t boundary, sbsz, txsegsz, txmaxsegsz;
+ int i, error;
lowaddr = BUS_SPACE_MAXADDR;
if ((sc->bge_flags & BGE_FLAG_40BIT_BUG) != 0)
lowaddr = BGE_DMA_MAXADDR;
- if ((sc->bge_flags & BGE_FLAG_4G_BNDRY_BUG) != 0)
- lowaddr = BUS_SPACE_MAXADDR_32BIT;
/*
* Allocate the parent bus DMA tag appropriate for PCI.
*/
@@ -2150,16 +2205,84 @@ bge_dma_alloc(device_t dev)
1, 0, lowaddr, BUS_SPACE_MAXADDR, NULL,
NULL, BUS_SPACE_MAXSIZE_32BIT, 0, BUS_SPACE_MAXSIZE_32BIT,
0, NULL, NULL, &sc->bge_cdata.bge_parent_tag);
-
if (error != 0) {
device_printf(sc->bge_dev,
"could not allocate parent dma tag\n");
return (ENOMEM);
}
+ /* Create tag for standard RX ring. */
+ error = bge_dma_ring_alloc(sc, PAGE_SIZE, BGE_STD_RX_RING_SZ,
+ &sc->bge_cdata.bge_rx_std_ring_tag,
+ (uint8_t **)&sc->bge_ldata.bge_rx_std_ring,
+ &sc->bge_cdata.bge_rx_std_ring_map,
+ &sc->bge_ldata.bge_rx_std_ring_paddr, "RX ring");
+ if (error)
+ return (error);
+
+ /* Create tag for RX return ring. */
+ error = bge_dma_ring_alloc(sc, PAGE_SIZE, BGE_RX_RTN_RING_SZ(sc),
+ &sc->bge_cdata.bge_rx_return_ring_tag,
+ (uint8_t **)&sc->bge_ldata.bge_rx_return_ring,
+ &sc->bge_cdata.bge_rx_return_ring_map,
+ &sc->bge_ldata.bge_rx_return_ring_paddr, "RX return ring");
+ if (error)
+ return (error);
+
+ /* Create tag for TX ring. */
+ error = bge_dma_ring_alloc(sc, PAGE_SIZE, BGE_TX_RING_SZ,
+ &sc->bge_cdata.bge_tx_ring_tag,
+ (uint8_t **)&sc->bge_ldata.bge_tx_ring,
+ &sc->bge_cdata.bge_tx_ring_map,
+ &sc->bge_ldata.bge_tx_ring_paddr, "TX ring");
+ if (error)
+ return (error);
+
/*
- * Create tag for Tx mbufs.
+ * Create tag for status block.
+ * Because we only use single Tx/Rx/Rx return ring, use
+ * minimum status block size except BCM5700 AX/BX which
+ * seems to want to see full status block size regardless
+ * of configured number of ring.
*/
+ if (sc->bge_asicrev == BGE_ASICREV_BCM5700 &&
+ sc->bge_chipid != BGE_CHIPID_BCM5700_C0)
+ sbsz = BGE_STATUS_BLK_SZ;
+ else
+ sbsz = 32;
+ error = bge_dma_ring_alloc(sc, PAGE_SIZE, sbsz,
+ &sc->bge_cdata.bge_status_tag,
+ (uint8_t **)&sc->bge_ldata.bge_status_block,
+ &sc->bge_cdata.bge_status_map,
+ &sc->bge_ldata.bge_status_block_paddr, "status block");
+ if (error)
+ return (error);
+
+ /* Create tag for jumbo RX ring. */
+ if (BGE_IS_JUMBO_CAPABLE(sc)) {
+ error = bge_dma_ring_alloc(sc, PAGE_SIZE, BGE_JUMBO_RX_RING_SZ,
+ &sc->bge_cdata.bge_rx_jumbo_ring_tag,
+ (uint8_t **)&sc->bge_ldata.bge_rx_jumbo_ring,
+ &sc->bge_cdata.bge_rx_jumbo_ring_map,
+ &sc->bge_ldata.bge_rx_jumbo_ring_paddr, "jumbo RX ring");
+ if (error)
+ return (error);
+ }
+
+ /* Create parent tag for buffers. */
+ boundary = 0;
+ if ((sc->bge_flags & BGE_FLAG_4G_BNDRY_BUG) != 0)
+ boundary = BGE_DMA_BNDRY;
+ error = bus_dma_tag_create(bus_get_dma_tag(sc->bge_dev),
+ 1, boundary, lowaddr, BUS_SPACE_MAXADDR, NULL,
+ NULL, BUS_SPACE_MAXSIZE_32BIT, 0, BUS_SPACE_MAXSIZE_32BIT,
+ 0, NULL, NULL, &sc->bge_cdata.bge_buffer_tag);
+ if (error != 0) {
+ device_printf(sc->bge_dev,
+ "could not allocate buffer dma tag\n");
+ return (ENOMEM);
+ }
+ /* Create tag for Tx mbufs. */
if (sc->bge_flags & BGE_FLAG_TSO) {
txsegsz = BGE_TSOSEG_SZ;
txmaxsegsz = 65535 + sizeof(struct ether_vlan_header);
@@ -2167,7 +2290,7 @@ bge_dma_alloc(device_t dev)
txsegsz = MCLBYTES;
txmaxsegsz = MCLBYTES * BGE_NSEG_NEW;
}
- error = bus_dma_tag_create(sc->bge_cdata.bge_parent_tag, 1,
+ error = bus_dma_tag_create(sc->bge_cdata.bge_buffer_tag, 1,
0, BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, NULL, NULL,
txmaxsegsz, BGE_NSEG_NEW, txsegsz, 0, NULL, NULL,
&sc->bge_cdata.bge_tx_mtag);
@@ -2177,10 +2300,8 @@ bge_dma_alloc(device_t dev)
return (ENOMEM);
}
- /*
- * Create tag for Rx mbufs.
- */
- error = bus_dma_tag_create(sc->bge_cdata.bge_parent_tag, 1, 0,
+ /* Create tag for Rx mbufs. */
*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
More information about the svn-src-user
mailing list