From owner-svn-src-projects@freebsd.org Wed Apr 13 16:19:53 2016 Return-Path: Delivered-To: svn-src-projects@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 2E97AB0FEED for ; Wed, 13 Apr 2016 16:19:53 +0000 (UTC) (envelope-from gjb@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id C29B91380; Wed, 13 Apr 2016 16:19:52 +0000 (UTC) (envelope-from gjb@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id u3DGJqjC004508; Wed, 13 Apr 2016 16:19:52 GMT (envelope-from gjb@FreeBSD.org) Received: (from gjb@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id u3DGJoCW004491; Wed, 13 Apr 2016 16:19:50 GMT (envelope-from gjb@FreeBSD.org) Message-Id: <201604131619.u3DGJoCW004491@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: gjb set sender to gjb@FreeBSD.org using -f From: Glen Barber Date: Wed, 13 Apr 2016 16:19:50 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r297927 - in projects/release-pkg: lib/libvgl sys/arm/broadcom/bcm2835 sys/arm64/arm64 sys/arm64/include sys/cam/scsi sys/dev/ahci sys/dev/bxe sys/dev/hyperv/netvsc sys/dev/hyperv/storv... X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 13 Apr 2016 16:19:53 -0000 Author: gjb Date: Wed Apr 13 16:19:50 2016 New Revision: 297927 URL: https://svnweb.freebsd.org/changeset/base/297927 Log: MFH Sponsored by: The FreeBSD Foundation Modified: projects/release-pkg/lib/libvgl/text.c projects/release-pkg/sys/arm/broadcom/bcm2835/bcm2835_audio.c projects/release-pkg/sys/arm64/arm64/locore.S projects/release-pkg/sys/arm64/arm64/pmap.c projects/release-pkg/sys/arm64/include/vmparam.h projects/release-pkg/sys/cam/scsi/scsi_all.c projects/release-pkg/sys/cam/scsi/scsi_all.h projects/release-pkg/sys/dev/ahci/ahci_pci.c projects/release-pkg/sys/dev/bxe/bxe.c projects/release-pkg/sys/dev/bxe/bxe.h projects/release-pkg/sys/dev/bxe/bxe_stats.c projects/release-pkg/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c projects/release-pkg/sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c projects/release-pkg/sys/dev/hyperv/vmbus/hv_connection.c projects/release-pkg/sys/dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c projects/release-pkg/sys/dev/isp/isp.c projects/release-pkg/sys/dev/isp/ispvar.h projects/release-pkg/sys/dev/urtwn/if_urtwn.c projects/release-pkg/sys/dev/urtwn/if_urtwnvar.h projects/release-pkg/usr.sbin/ypldap/ldapclient.c projects/release-pkg/usr.sbin/ypldap/ypldap.h projects/release-pkg/usr.sbin/ypldap/ypldap_dns.c Directory Properties: projects/release-pkg/ (props changed) projects/release-pkg/sys/ (props changed) projects/release-pkg/sys/dev/hyperv/ (props changed) Modified: projects/release-pkg/lib/libvgl/text.c ============================================================================== --- projects/release-pkg/lib/libvgl/text.c Wed Apr 13 15:57:13 2016 (r297926) +++ projects/release-pkg/lib/libvgl/text.c Wed Apr 13 16:19:50 2016 (r297927) @@ -33,7 +33,7 @@ __FBSDID("$FreeBSD$"); #include #include "vgl.h" -static VGLText *VGLTextFont = 0; +static VGLText *VGLTextFont; extern byte VGLFont[]; Modified: projects/release-pkg/sys/arm/broadcom/bcm2835/bcm2835_audio.c ============================================================================== --- projects/release-pkg/sys/arm/broadcom/bcm2835/bcm2835_audio.c Wed Apr 13 15:57:13 2016 (r297926) +++ projects/release-pkg/sys/arm/broadcom/bcm2835/bcm2835_audio.c Wed Apr 13 16:19:50 2016 (r297927) @@ -46,6 +46,7 @@ SND_DECLARE_FILE("$FreeBSD$"); #define VCHIQ_AUDIO_PACKET_SIZE 4000 #define VCHIQ_AUDIO_BUFFER_SIZE 128000 +#define VCHIQ_AUDIO_PREBUFFER 10 /* Number of pre-buffered audio messages */ #define VCHIQ_AUDIO_MAX_VOLUME /* volume in terms of 0.01dB */ @@ -91,6 +92,7 @@ struct bcm2835_audio_chinfo { uint32_t free_buffer; uint32_t buffered_ptr; int playback_state; + int prebuffered; }; struct bcm2835_audio_info { @@ -170,11 +172,10 @@ bcm2835_audio_callback(void *param, cons ch->complete_pos = (ch->complete_pos + count) % sndbuf_getsize(ch->buffer); ch->free_buffer += count; + chn_intr(sc->pch.channel); - if (perr || ch->free_buffer >= VCHIQ_AUDIO_PACKET_SIZE) { - chn_intr(ch->channel); + if (perr || ch->free_buffer >= VCHIQ_AUDIO_PACKET_SIZE) cv_signal(&sc->data_cv); - } } else printf("%s: unknown m.type: %d\n", __func__, m.type); } @@ -244,6 +245,7 @@ bcm2835_audio_reset_channel(struct bcm28 ch->playback_state = 0; ch->buffered_ptr = 0; ch->complete_pos = 0; + ch->prebuffered = 0; sndbuf_reset(ch->buffer); } @@ -478,21 +480,29 @@ bcm2835_audio_worker(void *data) if (sc->unloading) break; - if ((ch->playback_state == PLAYBACK_PLAYING) && - (vchiq_unbuffered_bytes(ch) >= VCHIQ_AUDIO_PACKET_SIZE) - && (ch->free_buffer >= VCHIQ_AUDIO_PACKET_SIZE)) { - bcm2835_audio_write_samples(ch); - } else { - if (ch->playback_state == PLAYBACK_STOPPING) { - bcm2835_audio_reset_channel(&sc->pch); - ch->playback_state = PLAYBACK_IDLE; - } - + if (ch->playback_state == PLAYBACK_IDLE) { cv_wait_sig(&sc->data_cv, &sc->data_lock); + continue; + } + + if (ch->playback_state == PLAYBACK_STOPPING) { + bcm2835_audio_reset_channel(&sc->pch); + ch->playback_state = PLAYBACK_IDLE; + continue; + } + + if (ch->free_buffer < vchiq_unbuffered_bytes(ch)) { + cv_timedwait_sig(&sc->data_cv, &sc->data_lock, 10); + continue; + } + + + bcm2835_audio_write_samples(ch); - if (ch->playback_state == PLAYBACK_STARTING) { - /* Give it initial kick */ - chn_intr(sc->pch.channel); + if (ch->playback_state == PLAYBACK_STARTING) { + ch->prebuffered++; + if (ch->prebuffered == VCHIQ_AUDIO_PREBUFFER) { + bcm2835_audio_start(ch); ch->playback_state = PLAYBACK_PLAYING; } } @@ -514,7 +524,7 @@ bcm2835_audio_create_worker(struct bcm28 } /* -------------------------------------------------------------------- */ -/* channel interface for ESS18xx */ +/* channel interface for VCHI audio */ static void * bcmchan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_channel *c, int dir) { @@ -612,7 +622,6 @@ bcmchan_trigger(kobj_t obj, void *data, switch (go) { case PCMTRIG_START: - bcm2835_audio_start(ch); ch->playback_state = PLAYBACK_STARTING; /* wakeup worker thread */ cv_signal(&sc->data_cv); @@ -620,7 +629,7 @@ bcmchan_trigger(kobj_t obj, void *data, case PCMTRIG_STOP: case PCMTRIG_ABORT: - ch->playback_state = 1; + ch->playback_state = PLAYBACK_STOPPING; bcm2835_audio_stop(ch); break; Modified: projects/release-pkg/sys/arm64/arm64/locore.S ============================================================================== --- projects/release-pkg/sys/arm64/arm64/locore.S Wed Apr 13 15:57:13 2016 (r297926) +++ projects/release-pkg/sys/arm64/arm64/locore.S Wed Apr 13 16:19:50 2016 (r297927) @@ -37,6 +37,7 @@ #include #define VIRT_BITS 48 +#define DMAP_TABLES ((DMAP_MAX_ADDRESS - DMAP_MIN_ADDRESS) >> L0_SHIFT) .globl kernbase .set kernbase, KERNBASE @@ -322,10 +323,12 @@ virt_map: * TODO: This is out of date. * There are at least 5 pages before that address for the page tables * The pages used are: - * - The identity (PA = VA) table (TTBR0) - * - The Kernel L1 table (TTBR1)(not yet) - * - The PA != VA L2 table to jump into (not yet) - * - The FDT L2 table (not yet) + * - The Kernel L2 table + * - The Kernel L1 table + * - The Kernel L0 table (TTBR1) + * - The identity (PA = VA) L1 table + * - The identity (PA = VA) L0 table (TTBR0) + * - The DMAP L1 tables */ create_pagetables: /* Save the Link register */ @@ -381,6 +384,12 @@ create_pagetables: mov x10, #1 bl link_l0_pagetable + /* Link the DMAP tables */ + ldr x8, =DMAP_MIN_ADDRESS + adr x9, pagetable_dmap; + mov x10, #DMAP_TABLES + bl link_l0_pagetable + /* * Build the TTBR0 maps. */ @@ -644,6 +653,10 @@ pagetable_l1_ttbr0: .space PAGE_SIZE pagetable_l0_ttbr0: .space PAGE_SIZE + + .globl pagetable_dmap +pagetable_dmap: + .space PAGE_SIZE * DMAP_TABLES pagetable_end: el2_pagetable: Modified: projects/release-pkg/sys/arm64/arm64/pmap.c ============================================================================== --- projects/release-pkg/sys/arm64/arm64/pmap.c Wed Apr 13 15:57:13 2016 (r297926) +++ projects/release-pkg/sys/arm64/arm64/pmap.c Wed Apr 13 16:19:50 2016 (r297927) @@ -222,6 +222,13 @@ static struct rwlock_padalign pvh_global vm_paddr_t dmap_phys_base; /* The start of the dmap region */ +/* This code assumes all L1 DMAP entries will be used */ +CTASSERT((DMAP_MIN_ADDRESS & ~L0_OFFSET) == DMAP_MIN_ADDRESS); +CTASSERT((DMAP_MAX_ADDRESS & ~L0_OFFSET) == DMAP_MAX_ADDRESS); + +#define DMAP_TABLES ((DMAP_MAX_ADDRESS - DMAP_MIN_ADDRESS) >> L0_SHIFT) +extern pt_entry_t pagetable_dmap[]; + /* * Data for the pv entry allocation mechanism */ @@ -543,28 +550,25 @@ pmap_early_vtophys(vm_offset_t l1pt, vm_ } static void -pmap_bootstrap_dmap(vm_offset_t l1pt, vm_paddr_t kernstart) +pmap_bootstrap_dmap(vm_offset_t kern_l1, vm_paddr_t kernstart) { vm_offset_t va; vm_paddr_t pa; - pd_entry_t *l1; u_int l1_slot; pa = dmap_phys_base = kernstart & ~L1_OFFSET; va = DMAP_MIN_ADDRESS; - l1 = (pd_entry_t *)l1pt; - l1_slot = pmap_l1_index(DMAP_MIN_ADDRESS); - for (; va < DMAP_MAX_ADDRESS; pa += L1_SIZE, va += L1_SIZE, l1_slot++) { - KASSERT(l1_slot < Ln_ENTRIES, ("Invalid L1 index")); + l1_slot = ((va - DMAP_MIN_ADDRESS) >> L1_SHIFT); - pmap_load_store(&l1[l1_slot], + pmap_load_store(&pagetable_dmap[l1_slot], (pa & ~L1_OFFSET) | ATTR_DEFAULT | ATTR_IDX(CACHED_MEMORY) | L1_BLOCK); } - cpu_dcache_wb_range((vm_offset_t)l1, PAGE_SIZE); + cpu_dcache_wb_range((vm_offset_t)pagetable_dmap, + PAGE_SIZE * DMAP_TABLES); cpu_tlb_flushID(); } Modified: projects/release-pkg/sys/arm64/include/vmparam.h ============================================================================== --- projects/release-pkg/sys/arm64/include/vmparam.h Wed Apr 13 15:57:13 2016 (r297926) +++ projects/release-pkg/sys/arm64/include/vmparam.h Wed Apr 13 16:19:50 2016 (r297927) @@ -125,16 +125,22 @@ * split into 2 regions at each end of the 64 bit address space, with an * out of range "hole" in the middle. * - * We limit the size of the two spaces to 39 bits each. + * We use the full 48 bits for each region, however the kernel may only use + * a limited range within this space. * - * Upper region: 0xffffffffffffffff - * 0xffffff8000000000 + * Upper region: 0xffffffffffffffff Top of virtual memory * - * Hole: 0xffffff7fffffffff - * 0x0000008000000000 + * 0xfffffeffffffffff End of DMAP + * 0xfffffd0000000000 Start of DMAP * - * Lower region: 0x0000007fffffffff - * 0x0000000000000000 + * 0xffff007fffffffff End of KVA + * 0xffff000000000000 Kernel base address & start of KVA + * + * Hole: 0xfffeffffffffffff + * 0x0001000000000000 + * + * Lower region: 0x0000ffffffffffff End of user address space + * 0x0000000000000000 Start of user address space * * We use the upper region for the kernel, and the lower region for userland. * @@ -152,23 +158,23 @@ #define VM_MIN_ADDRESS (0x0000000000000000UL) #define VM_MAX_ADDRESS (0xffffffffffffffffUL) -/* 32 GiB of kernel addresses */ -#define VM_MIN_KERNEL_ADDRESS (0xffffff8000000000UL) -#define VM_MAX_KERNEL_ADDRESS (0xffffff8800000000UL) - -/* Direct Map for 128 GiB of PA: 0x0 - 0x1fffffffff */ -#define DMAP_MIN_ADDRESS (0xffffffc000000000UL) -#define DMAP_MAX_ADDRESS (0xffffffdfffffffffUL) +/* 512 GiB of kernel addresses */ +#define VM_MIN_KERNEL_ADDRESS (0xffff000000000000UL) +#define VM_MAX_KERNEL_ADDRESS (0xffff008000000000UL) + +/* 2TiB for the direct map region */ +#define DMAP_MIN_ADDRESS (0xfffffd0000000000UL) +#define DMAP_MAX_ADDRESS (0xffffff0000000000UL) #define DMAP_MIN_PHYSADDR (dmap_phys_base) #define DMAP_MAX_PHYSADDR (dmap_phys_base + (DMAP_MAX_ADDRESS - DMAP_MIN_ADDRESS)) /* True if pa is in the dmap range */ #define PHYS_IN_DMAP(pa) ((pa) >= DMAP_MIN_PHYSADDR && \ - (pa) <= DMAP_MAX_PHYSADDR) + (pa) < DMAP_MAX_PHYSADDR) /* True if va is in the dmap range */ #define VIRT_IN_DMAP(va) ((va) >= DMAP_MIN_ADDRESS && \ - (va) <= DMAP_MAX_ADDRESS) + (va) < DMAP_MAX_ADDRESS) #define PHYS_TO_DMAP(pa) \ ({ \ Modified: projects/release-pkg/sys/cam/scsi/scsi_all.c ============================================================================== --- projects/release-pkg/sys/cam/scsi/scsi_all.c Wed Apr 13 15:57:13 2016 (r297926) +++ projects/release-pkg/sys/cam/scsi/scsi_all.c Wed Apr 13 16:19:50 2016 (r297927) @@ -3464,14 +3464,32 @@ scsi_error_action(struct ccb_scsiio *csi char * scsi_cdb_string(u_int8_t *cdb_ptr, char *cdb_string, size_t len) { + struct sbuf sb; + int error; + + if (len == 0) + return (""); + + sbuf_new(&sb, cdb_string, len, SBUF_FIXEDLEN); + + scsi_cdb_sbuf(cdb_ptr, &sb); + + /* ENOMEM just means that the fixed buffer is full, OK to ignore */ + error = sbuf_finish(&sb); + if (error != 0 && error != ENOMEM) + return (""); + + return(sbuf_data(&sb)); +} + +void +scsi_cdb_sbuf(u_int8_t *cdb_ptr, struct sbuf *sb) +{ u_int8_t cdb_len; int i; if (cdb_ptr == NULL) - return(""); - - /* Silence warnings */ - cdb_len = 0; + return; /* * This is taken from the SCSI-3 draft spec. @@ -3508,12 +3526,11 @@ scsi_cdb_string(u_int8_t *cdb_ptr, char cdb_len = 12; break; } - *cdb_string = '\0'; + for (i = 0; i < cdb_len; i++) - snprintf(cdb_string + strlen(cdb_string), - len - strlen(cdb_string), "%02hhx ", cdb_ptr[i]); + sbuf_printf(sb, "%02hhx ", cdb_ptr[i]); - return(cdb_string); + return; } const char * @@ -3562,7 +3579,6 @@ scsi_command_string(struct cam_device *d #endif /* _KERNEL/!_KERNEL */ { struct scsi_inquiry_data *inq_data; - char cdb_str[(SCSI_MAX_CDBLEN * 3) + 1]; #ifdef _KERNEL struct ccb_getdev *cgd; #endif /* _KERNEL */ @@ -3595,15 +3611,13 @@ scsi_command_string(struct cam_device *d #endif /* _KERNEL/!_KERNEL */ if ((csio->ccb_h.flags & CAM_CDB_POINTER) != 0) { - sbuf_printf(sb, "%s. CDB: %s", - scsi_op_desc(csio->cdb_io.cdb_ptr[0], inq_data), - scsi_cdb_string(csio->cdb_io.cdb_ptr, cdb_str, - sizeof(cdb_str))); + sbuf_printf(sb, "%s. CDB: ", + scsi_op_desc(csio->cdb_io.cdb_ptr[0], inq_data)); + scsi_cdb_sbuf(csio->cdb_io.cdb_ptr, sb); } else { - sbuf_printf(sb, "%s. CDB: %s", - scsi_op_desc(csio->cdb_io.cdb_bytes[0], inq_data), - scsi_cdb_string(csio->cdb_io.cdb_bytes, cdb_str, - sizeof(cdb_str))); + sbuf_printf(sb, "%s. CDB: ", + scsi_op_desc(csio->cdb_io.cdb_bytes[0], inq_data)); + scsi_cdb_sbuf(csio->cdb_io.cdb_bytes, sb); } #ifdef _KERNEL Modified: projects/release-pkg/sys/cam/scsi/scsi_all.h ============================================================================== --- projects/release-pkg/sys/cam/scsi/scsi_all.h Wed Apr 13 15:57:13 2016 (r297926) +++ projects/release-pkg/sys/cam/scsi/scsi_all.h Wed Apr 13 16:19:50 2016 (r297927) @@ -3646,6 +3646,7 @@ const char * scsi_op_desc(u_int16_t opco struct scsi_inquiry_data *inq_data); char * scsi_cdb_string(u_int8_t *cdb_ptr, char *cdb_string, size_t len); +void scsi_cdb_sbuf(u_int8_t *cdb_ptr, struct sbuf *sb); void scsi_print_inquiry(struct scsi_inquiry_data *inq_data); void scsi_print_inquiry_short(struct scsi_inquiry_data *inq_data); Modified: projects/release-pkg/sys/dev/ahci/ahci_pci.c ============================================================================== --- projects/release-pkg/sys/dev/ahci/ahci_pci.c Wed Apr 13 15:57:13 2016 (r297926) +++ projects/release-pkg/sys/dev/ahci/ahci_pci.c Wed Apr 13 16:19:50 2016 (r297927) @@ -423,6 +423,8 @@ ahci_pci_attach(device_t dev) pci_get_subvendor(dev) == 0x1043 && pci_get_subdevice(dev) == 0x81e4) ctlr->quirks |= AHCI_Q_SATA1_UNIT0; + resource_int_value(device_get_name(dev), device_get_unit(dev), + "quirks", &ctlr->quirks); ctlr->vendorid = pci_get_vendor(dev); ctlr->deviceid = pci_get_device(dev); ctlr->subvendorid = pci_get_subvendor(dev); Modified: projects/release-pkg/sys/dev/bxe/bxe.c ============================================================================== --- projects/release-pkg/sys/dev/bxe/bxe.c Wed Apr 13 15:57:13 2016 (r297926) +++ projects/release-pkg/sys/dev/bxe/bxe.c Wed Apr 13 16:19:50 2016 (r297927) @@ -672,6 +672,7 @@ static void bxe_handle_fp_tq(void *conte static int bxe_add_cdev(struct bxe_softc *sc); static void bxe_del_cdev(struct bxe_softc *sc); +static int bxe_grc_dump(struct bxe_softc *sc); static int bxe_alloc_buf_rings(struct bxe_softc *sc); static void bxe_free_buf_rings(struct bxe_softc *sc); @@ -3448,10 +3449,6 @@ bxe_watchdog(struct bxe_softc *sc, } BLOGE(sc, "TX watchdog timeout on fp[%02d], resetting!\n", fp->index); - if(sc->trigger_grcdump) { - /* taking grcdump */ - bxe_grc_dump(sc); - } BXE_FP_TX_UNLOCK(fp); @@ -15640,6 +15637,30 @@ bxe_sysctl_state(SYSCTL_HANDLER_ARGS) } static int +bxe_sysctl_trigger_grcdump(SYSCTL_HANDLER_ARGS) +{ + struct bxe_softc *sc; + int error, result; + + result = 0; + error = sysctl_handle_int(oidp, &result, 0, req); + + if (error || !req->newptr) { + return (error); + } + + if (result == 1) { + sc = (struct bxe_softc *)arg1; + + BLOGI(sc, "... grcdump start ...\n"); + bxe_grc_dump(sc); + BLOGI(sc, "... grcdump done ...\n"); + } + + return (error); +} + +static int bxe_sysctl_eth_stat(SYSCTL_HANDLER_ARGS) { struct bxe_softc *sc = (struct bxe_softc *)arg1; @@ -15790,16 +15811,14 @@ bxe_add_sysctls(struct bxe_softc *sc) "debug logging mode"); #endif /* #if __FreeBSD_version >= 900000 */ - sc->trigger_grcdump = 0; - SYSCTL_ADD_UINT(ctx, children, OID_AUTO, "trigger_grcdump", - CTLFLAG_RW, &sc->trigger_grcdump, 0, - "trigger grcdump should be invoked" - " before collecting grcdump"); + SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "trigger_grcdump", + CTLTYPE_UINT | CTLFLAG_RW, sc, 0, + bxe_sysctl_trigger_grcdump, "IU", + "set by driver when a grcdump is needed"); - sc->grcdump_started = 0; sc->grcdump_done = 0; SYSCTL_ADD_UINT(ctx, children, OID_AUTO, "grcdump_done", - CTLFLAG_RD, &sc->grcdump_done, 0, + CTLFLAG_RW, &sc->grcdump_done, 0, "set by driver when grcdump is done"); sc->rx_budget = bxe_rx_budget; @@ -18631,7 +18650,7 @@ bxe_get_preset_regs(struct bxe_softc *sc return 0; } -int +static int bxe_grc_dump(struct bxe_softc *sc) { int rval = 0; @@ -18639,53 +18658,12 @@ bxe_grc_dump(struct bxe_softc *sc) uint8_t *buf; uint32_t size; struct dump_header *d_hdr; - uint32_t i; - uint32_t reg_val; - uint32_t reg_addr; - uint32_t cmd_offset; - int context_size; - int allocated; - struct ecore_ilt *ilt = SC_ILT(sc); - struct bxe_fastpath *fp; - struct ilt_client_info *ilt_cli; - int grc_dump_size; - - if (sc->grcdump_done || sc->grcdump_started) + if (sc->grcdump_done) return (rval); - sc->grcdump_started = 1; - BLOGI(sc, "Started collecting grcdump\n"); - - grc_dump_size = (bxe_get_total_regs_len32(sc) * sizeof(uint32_t)) + - sizeof(struct dump_header); - - sc->grc_dump = malloc(grc_dump_size, M_DEVBUF, M_NOWAIT); - - if (sc->grc_dump == NULL) { - BLOGW(sc, "Unable to allocate memory for grcdump collection\n"); - return(ENOMEM); - } - - - - /* Disable parity attentions as long as following dump may - * cause false alarms by reading never written registers. We - * will re-enable parity attentions right after the dump. - */ - - /* Disable parity on path 0 */ - bxe_pretend_func(sc, 0); - ecore_disable_blocks_parity(sc); - /* Disable parity on path 1 */ - bxe_pretend_func(sc, 1); - ecore_disable_blocks_parity(sc); - - /* Return to current function */ - bxe_pretend_func(sc, SC_ABS_FUNC(sc)); - buf = sc->grc_dump; d_hdr = sc->grc_dump; @@ -18717,7 +18695,7 @@ bxe_grc_dump(struct bxe_softc *sc) (preset_idx == 11)) continue; - rval = bxe_get_preset_regs(sc, (uint32_t *)buf, preset_idx); + rval = bxe_get_preset_regs(sc, sc->grc_dump, preset_idx); if (rval) break; @@ -18727,78 +18705,9 @@ bxe_grc_dump(struct bxe_softc *sc) buf += size; } - bxe_pretend_func(sc, 0); - ecore_clear_blocks_parity(sc); - ecore_enable_blocks_parity(sc); - - bxe_pretend_func(sc, 1); ecore_clear_blocks_parity(sc); ecore_enable_blocks_parity(sc); - /* Return to current function */ - bxe_pretend_func(sc, SC_ABS_FUNC(sc)); - - - context_size = (sizeof(union cdu_context) * BXE_L2_CID_COUNT(sc)); - for (i = 0, allocated = 0; allocated < context_size; i++) { - - BLOGI(sc, "cdu_context i %d paddr %#jx vaddr %p size 0x%zx\n", i, - sc->context[i].vcxt_dma.paddr, sc->context[i].vcxt_dma.vaddr, - sc->context[i].size); - allocated += sc->context[i].size; - } - BLOGI(sc, "fw stats start_paddr %#jx end_paddr %#jx vaddr %p size 0x%x\n", - (uintmax_t)sc->fw_stats_req_mapping, - (uintmax_t)sc->fw_stats_data_mapping, - sc->fw_stats_req, (sc->fw_stats_req_size + sc->fw_stats_data_size)); - BLOGI(sc, "def_status_block paddr %p vaddr %p size 0x%lx\n", - (void *)sc->def_sb_dma.paddr, sc->def_sb, - sizeof(struct host_sp_status_block)); - BLOGI(sc, "event_queue paddr %#jx vaddr %p size 0x%x\n", - sc->eq_dma.paddr, sc->eq_dma.vaddr, BCM_PAGE_SIZE); - BLOGI(sc, "slow path paddr %#jx vaddr %p size 0x%lx\n", - sc->sp_dma.paddr, sc->sp_dma.vaddr, sizeof(struct bxe_slowpath)); - BLOGI(sc, "slow path queue paddr %#jx vaddr %p size 0x%x\n", - sc->spq_dma.paddr, sc->spq_dma.vaddr, BCM_PAGE_SIZE); - BLOGI(sc, "fw_buf paddr %#jx vaddr %p size 0x%x\n", - sc->gz_buf_dma.paddr, sc->gz_buf_dma.vaddr, FW_BUF_SIZE); - for (i = 0; i < sc->num_queues; i++) { - fp = &sc->fp[i]; - BLOGI(sc, "FP status block fp %d paddr %#jx vaddr %p size 0x%lx\n", i, - fp->sb_dma.paddr, fp->sb_dma.vaddr, - sizeof(union bxe_host_hc_status_block)); - BLOGI(sc, "TX BD CHAIN fp %d paddr %#jx vaddr %p size 0x%x\n", i, - fp->tx_dma.paddr, fp->tx_dma.vaddr, - (BCM_PAGE_SIZE * TX_BD_NUM_PAGES)); - BLOGI(sc, "RX BD CHAIN fp %d paddr %#jx vaddr %p size 0x%x\n", i, - fp->rx_dma.paddr, fp->rx_dma.vaddr, - (BCM_PAGE_SIZE * RX_BD_NUM_PAGES)); - BLOGI(sc, "RX RCQ CHAIN fp %d paddr %#jx vaddr %p size 0x%lx\n", i, - fp->rcq_dma.paddr, fp->rcq_dma.vaddr, - (BCM_PAGE_SIZE * RCQ_NUM_PAGES)); - BLOGI(sc, "RX SGE CHAIN fp %d paddr %#jx vaddr %p size 0x%x\n", i, - fp->rx_sge_dma.paddr, fp->rx_sge_dma.vaddr, - (BCM_PAGE_SIZE * RX_SGE_NUM_PAGES)); - } - - ilt_cli = &ilt->clients[1]; - for (i = ilt_cli->start; i <= ilt_cli->end; i++) { - BLOGI(sc, "ECORE_ILT paddr %#jx vaddr %p size 0x%x\n", - ((struct bxe_dma *)((&ilt->lines[i])->page))->paddr, - ((struct bxe_dma *)((&ilt->lines[i])->page))->vaddr, BCM_PAGE_SIZE); - } - - - cmd_offset = DMAE_REG_CMD_MEM; - for (i = 0; i < 224; i++) { - reg_addr = (cmd_offset +(i * 4)); - reg_val = REG_RD(sc, reg_addr); - BLOGI(sc, "DMAE_REG_CMD_MEM i=%d reg_addr 0x%x reg_val 0x%08x\n",i, - reg_addr, reg_val); - } - - - BLOGI(sc, "Collection of grcdump done\n"); sc->grcdump_done = 1; return(rval); } @@ -18806,10 +18715,21 @@ bxe_grc_dump(struct bxe_softc *sc) static int bxe_add_cdev(struct bxe_softc *sc) { + int grc_dump_size; + + grc_dump_size = (bxe_get_total_regs_len32(sc) * sizeof(uint32_t)) + + sizeof(struct dump_header); + + sc->grc_dump = malloc(grc_dump_size, M_DEVBUF, M_NOWAIT); + + if (sc->grc_dump == NULL) + return (-1); + sc->eeprom = malloc(BXE_EEPROM_MAX_DATA_LEN, M_DEVBUF, M_NOWAIT); if (sc->eeprom == NULL) { BLOGW(sc, "Unable to alloc for eeprom size buffer\n"); + free(sc->grc_dump, M_DEVBUF); sc->grc_dump = NULL; return (-1); } @@ -18822,8 +18742,11 @@ bxe_add_cdev(struct bxe_softc *sc) if_name(sc->ifp)); if (sc->ioctl_dev == NULL) { + + free(sc->grc_dump, M_DEVBUF); free(sc->eeprom, M_DEVBUF); sc->eeprom = NULL; + return (-1); } @@ -18838,11 +18761,13 @@ bxe_del_cdev(struct bxe_softc *sc) if (sc->ioctl_dev != NULL) destroy_dev(sc->ioctl_dev); + if (sc->grc_dump != NULL) + free(sc->grc_dump, M_DEVBUF); + if (sc->eeprom != NULL) { free(sc->eeprom, M_DEVBUF); sc->eeprom = NULL; } - sc->ioctl_dev = NULL; return; } @@ -19020,26 +18945,15 @@ bxe_eioctl(struct cdev *dev, u_long cmd, grc_dump_size = (bxe_get_total_regs_len32(sc) * sizeof(uint32_t)) + sizeof(struct dump_header); - if ((!sc->trigger_grcdump) || (dump->grcdump == NULL) || - (dump->grcdump_size < grc_dump_size)) { + + if ((sc->grc_dump == NULL) || (dump->grcdump == NULL) || + (dump->grcdump_size < grc_dump_size) || (!sc->grcdump_done)) { rval = EINVAL; break; } - - if((sc->trigger_grcdump) && (!sc->grcdump_done) && - (!sc->grcdump_started)) { - rval = bxe_grc_dump(sc); - } - - if((!rval) && (sc->grcdump_done) && (sc->grcdump_started) && - (sc->grc_dump != NULL)) { - dump->grcdump_dwords = grc_dump_size >> 2; - rval = copyout(sc->grc_dump, dump->grcdump, grc_dump_size); - free(sc->grc_dump, M_DEVBUF); - sc->grc_dump = NULL; - sc->grcdump_started = 0; - sc->grcdump_done = 0; - } + dump->grcdump_dwords = grc_dump_size >> 2; + rval = copyout(sc->grc_dump, dump->grcdump, grc_dump_size); + sc->grcdump_done = 0; break; @@ -19059,7 +18973,6 @@ bxe_eioctl(struct cdev *dev, u_long cmd, snprintf(drv_infop->bus_info, BXE_BUS_INFO_LENGTH, "%d:%d:%d", sc->pcie_bus, sc->pcie_device, sc->pcie_func); break; - case BXE_DEV_SETTING: dev_p = (bxe_dev_setting_t *)data; bxe_get_settings(sc, &dev_set); @@ -19078,20 +18991,20 @@ bxe_eioctl(struct cdev *dev, u_long cmd, reg_p = (bxe_get_regs_t *)data; grc_dump_size = reg_p->reg_buf_len; - if((!sc->grcdump_done) && (!sc->grcdump_started)) { + if (sc->grc_dump == NULL) { + rval = EINVAL; + break; + } + + if(!sc->grcdump_done) { bxe_grc_dump(sc); } - if((sc->grcdump_done) && (sc->grcdump_started) && - (sc->grc_dump != NULL)) { + if(sc->grcdump_done) { rval = copyout(sc->grc_dump, reg_p->reg_buf, grc_dump_size); - free(sc->grc_dump, M_DEVBUF); - sc->grc_dump = NULL; - sc->grcdump_started = 0; sc->grcdump_done = 0; } break; - case BXE_RDW_REG: reg_rdw_p = (bxe_reg_rdw_t *)data; if((reg_rdw_p->reg_cmd == BXE_READ_REG_CMD) && Modified: projects/release-pkg/sys/dev/bxe/bxe.h ============================================================================== --- projects/release-pkg/sys/dev/bxe/bxe.h Wed Apr 13 15:57:13 2016 (r297926) +++ projects/release-pkg/sys/dev/bxe/bxe.h Wed Apr 13 16:19:50 2016 (r297927) @@ -1786,12 +1786,8 @@ struct bxe_softc { int panic; struct cdev *ioctl_dev; - void *grc_dump; - unsigned int trigger_grcdump; - unsigned int grcdump_done; - unsigned int grcdump_started; - + int grcdump_done; void *eeprom; }; /* struct bxe_softc */ @@ -2297,7 +2293,7 @@ void bxe_dump_mem(struct bxe_softc *sc, uint8_t *mem, uint32_t len); void bxe_dump_mbuf_data(struct bxe_softc *sc, char *pTag, struct mbuf *m, uint8_t contents); -extern int bxe_grc_dump(struct bxe_softc *sc); + #if __FreeBSD_version >= 800000 #if __FreeBSD_version >= 1000000 Modified: projects/release-pkg/sys/dev/bxe/bxe_stats.c ============================================================================== --- projects/release-pkg/sys/dev/bxe/bxe_stats.c Wed Apr 13 15:57:13 2016 (r297926) +++ projects/release-pkg/sys/dev/bxe/bxe_stats.c Wed Apr 13 16:19:50 2016 (r297927) @@ -234,10 +234,6 @@ bxe_stats_comp(struct bxe_softc *sc) while (*stats_comp != DMAE_COMP_VAL) { if (!cnt) { BLOGE(sc, "Timeout waiting for stats finished\n"); - if(sc->trigger_grcdump) { - /* taking grcdump */ - bxe_grc_dump(sc); - } break; } @@ -1314,12 +1310,8 @@ bxe_stats_update(struct bxe_softc *sc) if (bxe_storm_stats_update(sc)) { if (sc->stats_pending++ == 3) { if (if_getdrvflags(sc->ifp) & IFF_DRV_RUNNING) { - if(sc->trigger_grcdump) { - /* taking grcdump */ - bxe_grc_dump(sc); - } - atomic_store_rel_long(&sc->chip_tq_flags, CHIP_TQ_REINIT); - taskqueue_enqueue(sc->chip_tq, &sc->chip_tq_task); + atomic_store_rel_long(&sc->chip_tq_flags, CHIP_TQ_REINIT); + taskqueue_enqueue(sc->chip_tq, &sc->chip_tq_task); } } return; Modified: projects/release-pkg/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c ============================================================================== --- projects/release-pkg/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c Wed Apr 13 15:57:13 2016 (r297926) +++ projects/release-pkg/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c Wed Apr 13 16:19:50 2016 (r297927) @@ -418,9 +418,6 @@ netvsc_attach(device_t dev) #endif sc = device_get_softc(dev); - if (sc == NULL) { - return (ENOMEM); - } bzero(sc, sizeof(hn_softc_t)); sc->hn_unit = unit; @@ -1169,10 +1166,6 @@ netvsc_linkstatus_callback(struct hv_dev { hn_softc_t *sc = device_get_softc(device_obj->device); - if (sc == NULL) { - return; - } - if (status == 1) { sc->hn_carrier = 1; } else { Modified: projects/release-pkg/sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c ============================================================================== --- projects/release-pkg/sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c Wed Apr 13 15:57:13 2016 (r297926) +++ projects/release-pkg/sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c Wed Apr 13 16:19:50 2016 (r297927) @@ -293,9 +293,6 @@ get_stor_device(struct hv_device *device struct storvsc_softc *sc; sc = device_get_softc(device->device); - if (sc == NULL) { - return NULL; - } if (outbound) { /* @@ -976,10 +973,6 @@ storvsc_attach(device_t dev) root_mount_token = root_mount_hold("storvsc"); sc = device_get_softc(dev); - if (sc == NULL) { - ret = ENOMEM; - goto cleanup; - } stor_type = storvsc_get_storage_type(dev); Modified: projects/release-pkg/sys/dev/hyperv/vmbus/hv_connection.c ============================================================================== --- projects/release-pkg/sys/dev/hyperv/vmbus/hv_connection.c Wed Apr 13 15:57:13 2016 (r297926) +++ projects/release-pkg/sys/dev/hyperv/vmbus/hv_connection.c Wed Apr 13 16:19:50 2016 (r297927) @@ -305,14 +305,18 @@ hv_vmbus_on_events(int cpu) KASSERT(cpu <= mp_maxid, ("VMBUS: hv_vmbus_on_events: " "cpu out of range!")); + page_addr = hv_vmbus_g_context.syn_ic_event_page[cpu]; + event = (hv_vmbus_synic_event_flags *) + page_addr + HV_VMBUS_MESSAGE_SINT; if ((hv_vmbus_protocal_version == HV_VMBUS_VERSION_WS2008) || (hv_vmbus_protocal_version == HV_VMBUS_VERSION_WIN7)) { maxdword = HV_MAX_NUM_CHANNELS_SUPPORTED >> 5; /* * receive size is 1/2 page and divide that by 4 bytes */ - recv_interrupt_page = - hv_vmbus_g_connection.recv_interrupt_page; + if (synch_test_and_clear_bit(0, &event->flags32[0])) + recv_interrupt_page = + hv_vmbus_g_connection.recv_interrupt_page; } else { /* * On Host with Win8 or above, the event page can be @@ -320,9 +324,6 @@ hv_vmbus_on_events(int cpu) * that has the pending interrupt. */ maxdword = HV_EVENT_FLAGS_DWORD_COUNT; - page_addr = hv_vmbus_g_context.syn_ic_event_page[cpu]; - event = (hv_vmbus_synic_event_flags *) - page_addr + HV_VMBUS_MESSAGE_SINT; recv_interrupt_page = event->flags32; } Modified: projects/release-pkg/sys/dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c ============================================================================== --- projects/release-pkg/sys/dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c Wed Apr 13 15:57:13 2016 (r297926) +++ projects/release-pkg/sys/dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c Wed Apr 13 16:19:50 2016 (r297927) @@ -145,7 +145,6 @@ hv_vmbus_isr(struct trapframe *frame) { int cpu; hv_vmbus_message* msg; - hv_vmbus_synic_event_flags* event; void* page_addr; cpu = PCPU_GET(cpuid); @@ -156,26 +155,7 @@ hv_vmbus_isr(struct trapframe *frame) * in Windows when running as a guest in Hyper-V */ - page_addr = hv_vmbus_g_context.syn_ic_event_page[cpu]; - event = (hv_vmbus_synic_event_flags*) - page_addr + HV_VMBUS_MESSAGE_SINT; - - if ((hv_vmbus_protocal_version == HV_VMBUS_VERSION_WS2008) || - (hv_vmbus_protocal_version == HV_VMBUS_VERSION_WIN7)) { - /* Since we are a child, we only need to check bit 0 */ - if (synch_test_and_clear_bit(0, &event->flags32[0])) { - hv_vmbus_on_events(cpu); - } - } else { - /* - * On host with Win8 or above, we can directly look at - * the event page. If bit n is set, we have an interrupt - * on the channel with id n. - * Directly schedule the event software interrupt on - * current cpu. - */ - hv_vmbus_on_events(cpu); - } + hv_vmbus_on_events(cpu); /* Check if there are actual msgs to be process */ page_addr = hv_vmbus_g_context.syn_ic_msg_page[cpu]; Modified: projects/release-pkg/sys/dev/isp/isp.c ============================================================================== --- projects/release-pkg/sys/dev/isp/isp.c Wed Apr 13 15:57:13 2016 (r297926) +++ projects/release-pkg/sys/dev/isp/isp.c Wed Apr 13 16:19:50 2016 (r297927) @@ -1822,22 +1822,24 @@ isp_fibre_init(ispsoftc_t *isp) * Prefer or force Point-To-Point instead Loop? */ switch (isp->isp_confopts & ISP_CFG_PORT_PREF) { - case ISP_CFG_NPORT: + case ISP_CFG_LPORT_ONLY: icbp->icb_xfwoptions &= ~ICBXOPT_TOPO_MASK; - icbp->icb_xfwoptions |= ICBXOPT_PTP_2_LOOP; + icbp->icb_xfwoptions |= ICBXOPT_LOOP_ONLY; break; case ISP_CFG_NPORT_ONLY: icbp->icb_xfwoptions &= ~ICBXOPT_TOPO_MASK; icbp->icb_xfwoptions |= ICBXOPT_PTP_ONLY; break; - case ISP_CFG_LPORT_ONLY: + case ISP_CFG_LPORT: icbp->icb_xfwoptions &= ~ICBXOPT_TOPO_MASK; - icbp->icb_xfwoptions |= ICBXOPT_LOOP_ONLY; + icbp->icb_xfwoptions |= ICBXOPT_LOOP_2_PTP; + break; + case ISP_CFG_NPORT: + icbp->icb_xfwoptions &= ~ICBXOPT_TOPO_MASK; + icbp->icb_xfwoptions |= ICBXOPT_PTP_2_LOOP; break; default: - /* - * Let NVRAM settings define it if they are sane - */ + /* Let NVRAM settings define it if they are sane */ switch (icbp->icb_xfwoptions & ICBXOPT_TOPO_MASK) { case ICBXOPT_PTP_2_LOOP: case ICBXOPT_PTP_ONLY: @@ -2109,19 +2111,32 @@ isp_fibre_init_2400(ispsoftc_t *isp) } switch (isp->isp_confopts & ISP_CFG_PORT_PREF) { - case ISP_CFG_NPORT_ONLY: - icbp->icb_fwoptions2 &= ~ICB2400_OPT2_TOPO_MASK; - icbp->icb_fwoptions2 |= ICB2400_OPT2_PTP_ONLY; - break; case ISP_CFG_LPORT_ONLY: icbp->icb_fwoptions2 &= ~ICB2400_OPT2_TOPO_MASK; icbp->icb_fwoptions2 |= ICB2400_OPT2_LOOP_ONLY; break; - default: + case ISP_CFG_NPORT_ONLY: + icbp->icb_fwoptions2 &= ~ICB2400_OPT2_TOPO_MASK; + icbp->icb_fwoptions2 |= ICB2400_OPT2_PTP_ONLY; + break; + case ISP_CFG_NPORT: /* ISP_CFG_PTP_2_LOOP not available in 24XX/25XX */ + case ISP_CFG_LPORT: icbp->icb_fwoptions2 &= ~ICB2400_OPT2_TOPO_MASK; icbp->icb_fwoptions2 |= ICB2400_OPT2_LOOP_2_PTP; break; + default: + /* Let NVRAM settings define it if they are sane */ + switch (icbp->icb_fwoptions2 & ICB2400_OPT2_TOPO_MASK) { + case ICB2400_OPT2_LOOP_ONLY: + case ICB2400_OPT2_PTP_ONLY: + case ICB2400_OPT2_LOOP_2_PTP: + break; + default: + icbp->icb_fwoptions2 &= ~ICB2400_OPT2_TOPO_MASK; + icbp->icb_fwoptions2 |= ICB2400_OPT2_LOOP_2_PTP; + } + break; } switch (icbp->icb_fwoptions2 & ICB2400_OPT2_TIMER_MASK) { @@ -2615,6 +2630,7 @@ isp_plogx(ispsoftc_t *isp, int chan, uin isp_put_plogx(isp, &pl, (isp_plogx_t *)reqp); if (isp->isp_dblev & ISP_LOGDEBUG1) isp_print_bytes(isp, "IOCB LOGX", QENTRY_LEN, reqp); + FCPARAM(isp, chan)->isp_login_hdl = handle; ISP_SYNC_REQUEST(isp); if (msleep(resp, &isp->isp_lock, 0, "PLOGX", 3 * ICB_LOGIN_TOV * hz) == EWOULDBLOCK) { @@ -2623,6 +2639,7 @@ isp_plogx(ispsoftc_t *isp, int chan, uin isp_destroy_handle(isp, pl.plogx_handle); return (-1); } + FCPARAM(isp, chan)->isp_login_hdl = NIL_HANDLE; if (isp->isp_dblev & ISP_LOGDEBUG1) isp_print_bytes(isp, "IOCB LOGX response", QENTRY_LEN, resp); isp_get_plogx(isp, (isp_plogx_t *)resp, &pl); @@ -5985,9 +6002,13 @@ isp_parse_async_fc(ispsoftc_t *isp, uint fcp = FCPARAM(isp, chan); if (fcp->role == ISP_ROLE_NONE) continue; - if (fcp->isp_loopstate > LOOP_LTEST_DONE) + if (fcp->isp_loopstate > LOOP_LTEST_DONE) { *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***