sync with OpenBSD -current
This commit is contained in:
parent
9dfe537fef
commit
b467550def
72 changed files with 5497 additions and 3934 deletions
|
@ -1,4 +1,4 @@
|
|||
/* $OpenBSD: conf.c,v 1.47 2023/10/26 14:13:37 jsg Exp $ */
|
||||
/* $OpenBSD: conf.c,v 1.48 2024/06/14 19:49:17 kettenis Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1996 Michael Shalayeff
|
||||
|
@ -47,7 +47,7 @@
|
|||
#include "efipxe.h"
|
||||
#include "softraid_arm64.h"
|
||||
|
||||
const char version[] = "1.18";
|
||||
const char version[] = "1.19";
|
||||
int debug = 0;
|
||||
|
||||
struct fs_ops file_system[] = {
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $OpenBSD: efiboot.c,v 1.50 2024/02/23 21:52:12 kettenis Exp $ */
|
||||
/* $OpenBSD: efiboot.c,v 1.51 2024/06/14 19:49:17 kettenis Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2015 YASUOKA Masahiko <yasuoka@yasuoka.net>
|
||||
|
@ -41,6 +41,7 @@
|
|||
|
||||
#include "efidev.h"
|
||||
#include "efiboot.h"
|
||||
#include "efidt.h"
|
||||
#include "fdt.h"
|
||||
|
||||
EFI_SYSTEM_TABLE *ST;
|
||||
|
@ -67,6 +68,7 @@ static EFI_GUID gop_guid = EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID;
|
|||
static EFI_GUID fdt_guid = FDT_TABLE_GUID;
|
||||
static EFI_GUID smbios_guid = SMBIOS_TABLE_GUID;
|
||||
static EFI_GUID smbios3_guid = SMBIOS3_TABLE_GUID;
|
||||
static EFI_GUID dt_fixup_guid = EFI_DT_FIXUP_PROTOCOL_GUID;
|
||||
|
||||
#define efi_guidcmp(_a, _b) memcmp((_a), (_b), sizeof(EFI_GUID))
|
||||
|
||||
|
@ -1134,12 +1136,18 @@ efi_fdt(void)
|
|||
return fdt_override ? fdt_override : fdt_sys;
|
||||
}
|
||||
|
||||
#define EXTRA_DT_SPACE (32 * 1024)
|
||||
|
||||
int
|
||||
fdt_load_override(char *file)
|
||||
{
|
||||
EFI_DT_FIXUP_PROTOCOL *dt_fixup;
|
||||
EFI_PHYSICAL_ADDRESS addr;
|
||||
char path[MAXPATHLEN];
|
||||
EFI_STATUS status;
|
||||
struct stat sb;
|
||||
size_t dt_size;
|
||||
UINTN sz;
|
||||
int fd;
|
||||
|
||||
if (file == NULL && fdt_override) {
|
||||
|
@ -1157,7 +1165,8 @@ fdt_load_override(char *file)
|
|||
printf("cannot open %s\n", path);
|
||||
return 0;
|
||||
}
|
||||
if (efi_memprobe_find(EFI_SIZE_TO_PAGES(sb.st_size),
|
||||
dt_size = sb.st_size + EXTRA_DT_SPACE;
|
||||
if (efi_memprobe_find(EFI_SIZE_TO_PAGES(dt_size),
|
||||
PAGE_SIZE, EfiLoaderData, &addr) != EFI_SUCCESS) {
|
||||
printf("cannot allocate memory for %s\n", path);
|
||||
return 0;
|
||||
|
@ -1167,9 +1176,18 @@ fdt_load_override(char *file)
|
|||
return 0;
|
||||
}
|
||||
|
||||
status = BS->LocateProtocol(&dt_fixup_guid, NULL, (void **)&dt_fixup);
|
||||
if (status == EFI_SUCCESS) {
|
||||
sz = dt_size;
|
||||
status = dt_fixup->Fixup(dt_fixup, (void *)addr, &sz,
|
||||
EFI_DT_APPLY_FIXUPS | EFI_DT_RESERVE_MEMORY);
|
||||
if (status != EFI_SUCCESS)
|
||||
panic("DT fixup failed: 0x%lx", status);
|
||||
}
|
||||
|
||||
if (!fdt_init((void *)addr)) {
|
||||
printf("invalid device tree\n");
|
||||
BS->FreePages(addr, EFI_SIZE_TO_PAGES(sb.st_size));
|
||||
BS->FreePages(addr, EFI_SIZE_TO_PAGES(dt_size));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1180,7 +1198,7 @@ fdt_load_override(char *file)
|
|||
}
|
||||
|
||||
fdt_override = (void *)addr;
|
||||
fdt_override_size = sb.st_size;
|
||||
fdt_override_size = dt_size;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
44
sys/arch/arm64/stand/efiboot/efidt.h
Normal file
44
sys/arch/arm64/stand/efiboot/efidt.h
Normal file
|
@ -0,0 +1,44 @@
|
|||
/* $OpenBSD: efidt.h,v 1.1 2024/06/14 19:49:17 kettenis Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2024 Mark Kettenis <kettenis@openbsd.org>
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
|
||||
#include <efi.h>
|
||||
#include <efiapi.h>
|
||||
|
||||
#define EFI_DT_FIXUP_PROTOCOL_GUID \
|
||||
{ 0xe617d64c, 0xfe08, 0x46da, \
|
||||
{ 0xf4, 0xdc, 0xbb, 0xd5, 0x87, 0x0c, 0x73, 0x00 } }
|
||||
|
||||
INTERFACE_DECL(_EFI_DT_FIXUP_PROTOCOL);
|
||||
|
||||
typedef EFI_STATUS
|
||||
(EFIAPI *EFI_DT_FIXUP) (
|
||||
IN struct _EFI_DT_FIXUP_PROTOCOL *This,
|
||||
IN VOID *Fdt,
|
||||
IN OUT UINTN *BufferSize,
|
||||
IN UINT32 Flags
|
||||
);
|
||||
|
||||
#define EFI_DT_APPLY_FIXUPS 0x00000001
|
||||
#define EFI_DT_RESERVE_MEMORY 0x00000002
|
||||
|
||||
typedef struct _EFI_DT_FIXUP_PROTOCOL {
|
||||
UINT64 Revision;
|
||||
EFI_DT_FIXUP Fixup;
|
||||
} EFI_DT_FIXUP_PROTOCOL;
|
|
@ -1,4 +1,4 @@
|
|||
/* $OpenBSD: ufshci.c,v 1.35 2024/06/09 03:21:54 jsg Exp $ */
|
||||
/* $OpenBSD: ufshci.c,v 1.37 2024/06/14 20:52:07 mglocker Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2022 Marcus Glocker <mglocker@openbsd.org>
|
||||
|
@ -68,7 +68,7 @@ void ufshci_dmamem_free(struct ufshci_softc *,
|
|||
struct ufshci_dmamem *);
|
||||
int ufshci_alloc(struct ufshci_softc *);
|
||||
int ufshci_init(struct ufshci_softc *);
|
||||
int ufshci_disable(struct ufshci_softc *);
|
||||
void ufshci_disable(struct ufshci_softc *);
|
||||
int ufshci_doorbell_read(struct ufshci_softc *);
|
||||
void ufshci_doorbell_write(struct ufshci_softc *, int);
|
||||
int ufshci_doorbell_poll(struct ufshci_softc *, int,
|
||||
|
@ -88,7 +88,7 @@ int ufshci_utr_cmd_io(struct ufshci_softc *,
|
|||
int ufshci_utr_cmd_sync(struct ufshci_softc *,
|
||||
struct ufshci_ccb *, struct scsi_xfer *,
|
||||
uint32_t, uint16_t);
|
||||
int ufshci_xfer_complete(struct ufshci_softc *);
|
||||
void ufshci_xfer_complete(struct ufshci_softc *);
|
||||
|
||||
/* SCSI */
|
||||
int ufshci_ccb_alloc(struct ufshci_softc *, int);
|
||||
|
@ -131,7 +131,7 @@ ufshci_intr(void *arg)
|
|||
DPRINTF(3, "%s: status=0x%08x\n", __func__, status);
|
||||
|
||||
if (status == 0)
|
||||
return 0;
|
||||
return handled;
|
||||
|
||||
if (status & UFSHCI_REG_IS_UCCS) {
|
||||
DPRINTF(3, "%s: UCCS interrupt\n", __func__);
|
||||
|
@ -149,11 +149,13 @@ ufshci_intr(void *arg)
|
|||
hcs = UFSHCI_READ_4(sc, UFSHCI_REG_HCS);
|
||||
printf("%s: Auto-Hibernate enter error UPMCRS=0x%x\n",
|
||||
__func__, UFSHCI_REG_HCS_UPMCRS(hcs));
|
||||
handled = 1;
|
||||
}
|
||||
if (status & UFSHCI_REG_IS_UHXS) {
|
||||
hcs = UFSHCI_READ_4(sc, UFSHCI_REG_HCS);
|
||||
printf("%s: Auto-Hibernate exit error UPMCRS=0x%x\n",
|
||||
__func__, UFSHCI_REG_HCS_UPMCRS(hcs));
|
||||
handled = 1;
|
||||
}
|
||||
|
||||
if (handled == 0) {
|
||||
|
@ -164,7 +166,7 @@ ufshci_intr(void *arg)
|
|||
/* ACK interrupt */
|
||||
UFSHCI_WRITE_4(sc, UFSHCI_REG_IS, status);
|
||||
|
||||
return 1;
|
||||
return handled;
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -177,7 +179,8 @@ ufshci_attach(struct ufshci_softc *sc)
|
|||
SIMPLEQ_INIT(&sc->sc_ccb_list);
|
||||
scsi_iopool_init(&sc->sc_iopool, sc, ufshci_ccb_get, ufshci_ccb_put);
|
||||
|
||||
ufshci_reset(sc);
|
||||
if (ufshci_reset(sc))
|
||||
return 1;
|
||||
|
||||
sc->sc_ver = UFSHCI_READ_4(sc, UFSHCI_REG_VER);
|
||||
printf(", UFSHCI %d.%d%d\n",
|
||||
|
@ -240,8 +243,10 @@ ufshci_attach(struct ufshci_softc *sc)
|
|||
sc->sc_flags |= UFSHCI_FLAGS_AGGR_INTR; /* Enable intr. aggregation */
|
||||
#endif
|
||||
/* Allocate the DMA buffers and initialize the controller. */
|
||||
ufshci_alloc(sc);
|
||||
ufshci_init(sc);
|
||||
if (ufshci_alloc(sc))
|
||||
return 1;
|
||||
if (ufshci_init(sc))
|
||||
return 1;
|
||||
|
||||
if (ufshci_ccb_alloc(sc, sc->sc_nutrs) != 0) {
|
||||
printf("%s: %s: Can't allocate CCBs\n",
|
||||
|
@ -294,7 +299,7 @@ ufshci_reset(struct ufshci_softc *sc)
|
|||
if (i == retry) {
|
||||
printf("%s: Enabling Host Controller failed!\n",
|
||||
sc->sc_dev.dv_xname);
|
||||
return -1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
DPRINTF(2, "\n%s: Host Controller enabled (i=%d)\n", __func__, i);
|
||||
|
@ -318,7 +323,7 @@ ufshci_is_poll(struct ufshci_softc *sc, uint32_t type)
|
|||
}
|
||||
if (i == retry) {
|
||||
printf("%s: %s: timeout\n", sc->sc_dev.dv_xname, __func__);
|
||||
return -1;
|
||||
return 1;
|
||||
}
|
||||
DPRINTF(3, "%s: completed after %d retries\n", __func__, i);
|
||||
|
||||
|
@ -394,7 +399,7 @@ ufshci_alloc(struct ufshci_softc *sc)
|
|||
if (sc->sc_dmamem_utmrd == NULL) {
|
||||
printf("%s: Can't allocate DMA memory for UTMRD\n",
|
||||
sc->sc_dev.dv_xname);
|
||||
return -1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* 7.1.1 Host Controller Initialization: 15) */
|
||||
|
@ -403,7 +408,7 @@ ufshci_alloc(struct ufshci_softc *sc)
|
|||
if (sc->sc_dmamem_utrd == NULL) {
|
||||
printf("%s: Can't allocate DMA memory for UTRD\n",
|
||||
sc->sc_dev.dv_xname);
|
||||
return -1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Allocate UCDs. */
|
||||
|
@ -412,7 +417,7 @@ ufshci_alloc(struct ufshci_softc *sc)
|
|||
if (sc->sc_dmamem_ucd == NULL) {
|
||||
printf("%s: Can't allocate DMA memory for UCD\n",
|
||||
sc->sc_dev.dv_xname);
|
||||
return -1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -442,8 +447,8 @@ ufshci_init(struct ufshci_softc *sc)
|
|||
/* 7.1.1 Host Controller Initialization: 6) */
|
||||
UFSHCI_WRITE_4(sc, UFSHCI_REG_UICCMD,
|
||||
UFSHCI_REG_UICCMD_CMDOP_DME_LINKSTARTUP);
|
||||
if (ufshci_is_poll(sc, UFSHCI_REG_IS_UCCS) != 0)
|
||||
return -1;
|
||||
if (ufshci_is_poll(sc, UFSHCI_REG_IS_UCCS))
|
||||
return 1;
|
||||
|
||||
/*
|
||||
* 7.1.1 Host Controller Initialization: 7), 8), 9)
|
||||
|
@ -503,7 +508,7 @@ ufshci_init(struct ufshci_softc *sc)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
void
|
||||
ufshci_disable(struct ufshci_softc *sc)
|
||||
{
|
||||
/* Stop run queues. */
|
||||
|
@ -512,8 +517,6 @@ ufshci_disable(struct ufshci_softc *sc)
|
|||
|
||||
/* Disable interrupts. */
|
||||
UFSHCI_WRITE_4(sc, UFSHCI_REG_IE, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -553,7 +556,7 @@ ufshci_doorbell_poll(struct ufshci_softc *sc, int slot, uint32_t timeout_ms)
|
|||
}
|
||||
if (timeout_us == 0) {
|
||||
printf("%s: %s: timeout\n", sc->sc_dev.dv_xname, __func__);
|
||||
return -1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -636,7 +639,7 @@ ufshci_utr_cmd_nop(struct ufshci_softc *sc, struct ufshci_ccb *ccb,
|
|||
if (UFSHCI_READ_4(sc, UFSHCI_REG_UTRLRSR) != 1) {
|
||||
printf("%s: %s: UTRLRSR not set\n",
|
||||
sc->sc_dev.dv_xname, __func__);
|
||||
return -1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
bus_dmamap_sync(sc->sc_dmat, UFSHCI_DMA_MAP(sc->sc_dmamem_utrd),
|
||||
|
@ -746,7 +749,7 @@ ufshci_utr_cmd_lun(struct ufshci_softc *sc, struct ufshci_ccb *ccb,
|
|||
if (UFSHCI_READ_4(sc, UFSHCI_REG_UTRLRSR) != 1) {
|
||||
printf("%s: %s: UTRLRSR not set\n",
|
||||
sc->sc_dev.dv_xname, __func__);
|
||||
return -1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
bus_dmamap_sync(sc->sc_dmat, UFSHCI_DMA_MAP(sc->sc_dmamem_utrd),
|
||||
|
@ -854,7 +857,7 @@ ufshci_utr_cmd_inquiry(struct ufshci_softc *sc, struct ufshci_ccb *ccb,
|
|||
if (UFSHCI_READ_4(sc, UFSHCI_REG_UTRLRSR) != 1) {
|
||||
printf("%s: %s: UTRLRSR not set\n",
|
||||
sc->sc_dev.dv_xname, __func__);
|
||||
return -1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
bus_dmamap_sync(sc->sc_dmat, UFSHCI_DMA_MAP(sc->sc_dmamem_utrd),
|
||||
|
@ -866,7 +869,7 @@ ufshci_utr_cmd_inquiry(struct ufshci_softc *sc, struct ufshci_ccb *ccb,
|
|||
ccb->ccb_status = CCB_STATUS_INPROGRESS;
|
||||
ufshci_doorbell_write(sc, slot);
|
||||
|
||||
return slot;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -966,7 +969,7 @@ ufshci_utr_cmd_capacity16(struct ufshci_softc *sc, struct ufshci_ccb *ccb,
|
|||
if (UFSHCI_READ_4(sc, UFSHCI_REG_UTRLRSR) != 1) {
|
||||
printf("%s: %s: UTRLRSR not set\n",
|
||||
sc->sc_dev.dv_xname, __func__);
|
||||
return -1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
bus_dmamap_sync(sc->sc_dmat, UFSHCI_DMA_MAP(sc->sc_dmamem_utrd),
|
||||
|
@ -978,7 +981,7 @@ ufshci_utr_cmd_capacity16(struct ufshci_softc *sc, struct ufshci_ccb *ccb,
|
|||
ccb->ccb_status = CCB_STATUS_INPROGRESS;
|
||||
ufshci_doorbell_write(sc, slot);
|
||||
|
||||
return slot;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -1077,7 +1080,7 @@ ufshci_utr_cmd_capacity(struct ufshci_softc *sc, struct ufshci_ccb *ccb,
|
|||
if (UFSHCI_READ_4(sc, UFSHCI_REG_UTRLRSR) != 1) {
|
||||
printf("%s: %s: UTRLRSR not set\n",
|
||||
sc->sc_dev.dv_xname, __func__);
|
||||
return -1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
bus_dmamap_sync(sc->sc_dmat, UFSHCI_DMA_MAP(sc->sc_dmamem_utrd),
|
||||
|
@ -1089,7 +1092,7 @@ ufshci_utr_cmd_capacity(struct ufshci_softc *sc, struct ufshci_ccb *ccb,
|
|||
ccb->ccb_status = CCB_STATUS_INPROGRESS;
|
||||
ufshci_doorbell_write(sc, slot);
|
||||
|
||||
return slot;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -1200,7 +1203,7 @@ ufshci_utr_cmd_io(struct ufshci_softc *sc, struct ufshci_ccb *ccb,
|
|||
if (UFSHCI_READ_4(sc, UFSHCI_REG_UTRLRSR) != 1) {
|
||||
printf("%s: %s: UTRLRSR not set\n",
|
||||
sc->sc_dev.dv_xname, __func__);
|
||||
return -1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
bus_dmamap_sync(sc->sc_dmat, UFSHCI_DMA_MAP(sc->sc_dmamem_utrd),
|
||||
|
@ -1212,7 +1215,7 @@ ufshci_utr_cmd_io(struct ufshci_softc *sc, struct ufshci_ccb *ccb,
|
|||
ccb->ccb_status = CCB_STATUS_INPROGRESS;
|
||||
ufshci_doorbell_write(sc, slot);
|
||||
|
||||
return slot;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -1302,7 +1305,7 @@ ufshci_utr_cmd_sync(struct ufshci_softc *sc, struct ufshci_ccb *ccb,
|
|||
if (UFSHCI_READ_4(sc, UFSHCI_REG_UTRLRSR) != 1) {
|
||||
printf("%s: %s: UTRLRSR not set\n",
|
||||
sc->sc_dev.dv_xname, __func__);
|
||||
return -1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
bus_dmamap_sync(sc->sc_dmat, UFSHCI_DMA_MAP(sc->sc_dmamem_utrd),
|
||||
|
@ -1314,10 +1317,10 @@ ufshci_utr_cmd_sync(struct ufshci_softc *sc, struct ufshci_ccb *ccb,
|
|||
ccb->ccb_status = CCB_STATUS_INPROGRESS;
|
||||
ufshci_doorbell_write(sc, slot);
|
||||
|
||||
return slot;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
void
|
||||
ufshci_xfer_complete(struct ufshci_softc *sc)
|
||||
{
|
||||
struct ufshci_ccb *ccb;
|
||||
|
@ -1374,8 +1377,6 @@ ufshci_xfer_complete(struct ufshci_softc *sc)
|
|||
if (ccb->ccb_status == CCB_STATUS_READY2FREE)
|
||||
ccb->ccb_done(sc, ccb);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -1589,7 +1590,7 @@ ufshci_scsi_inquiry(struct scsi_xfer *xs)
|
|||
|
||||
error = bus_dmamap_load(sc->sc_dmat, dmap, xs->data, xs->datalen, NULL,
|
||||
ISSET(xs->flags, SCSI_NOSLEEP) ? BUS_DMA_NOWAIT : BUS_DMA_WAITOK);
|
||||
if (error != 0) {
|
||||
if (error) {
|
||||
printf("%s: bus_dmamap_load error=%d\n", __func__, error);
|
||||
goto error1;
|
||||
}
|
||||
|
@ -1602,7 +1603,7 @@ ufshci_scsi_inquiry(struct scsi_xfer *xs)
|
|||
|
||||
/* Response length should be UPIU_SCSI_RSP_INQUIRY_SIZE. */
|
||||
error = ufshci_utr_cmd_inquiry(sc, ccb, xs);
|
||||
if (error == -1)
|
||||
if (error)
|
||||
goto error2;
|
||||
|
||||
if (ISSET(xs->flags, SCSI_POLL)) {
|
||||
|
@ -1644,7 +1645,7 @@ ufshci_scsi_capacity16(struct scsi_xfer *xs)
|
|||
|
||||
error = bus_dmamap_load(sc->sc_dmat, dmap, xs->data, xs->datalen, NULL,
|
||||
ISSET(xs->flags, SCSI_NOSLEEP) ? BUS_DMA_NOWAIT : BUS_DMA_WAITOK);
|
||||
if (error != 0) {
|
||||
if (error) {
|
||||
printf("%s: bus_dmamap_load error=%d\n", __func__, error);
|
||||
goto error1;
|
||||
}
|
||||
|
@ -1657,7 +1658,7 @@ ufshci_scsi_capacity16(struct scsi_xfer *xs)
|
|||
|
||||
/* Response length should be UPIU_SCSI_RSP_CAPACITY16_SIZE. */
|
||||
error = ufshci_utr_cmd_capacity16(sc, ccb, xs);
|
||||
if (error == -1)
|
||||
if (error)
|
||||
goto error2;
|
||||
|
||||
if (ISSET(xs->flags, SCSI_POLL)) {
|
||||
|
@ -1699,7 +1700,7 @@ ufshci_scsi_capacity(struct scsi_xfer *xs)
|
|||
|
||||
error = bus_dmamap_load(sc->sc_dmat, dmap, xs->data, xs->datalen, NULL,
|
||||
ISSET(xs->flags, SCSI_NOSLEEP) ? BUS_DMA_NOWAIT : BUS_DMA_WAITOK);
|
||||
if (error != 0) {
|
||||
if (error) {
|
||||
printf("%s: bus_dmamap_load error=%d\n", __func__, error);
|
||||
goto error1;
|
||||
}
|
||||
|
@ -1712,7 +1713,7 @@ ufshci_scsi_capacity(struct scsi_xfer *xs)
|
|||
|
||||
/* Response length should be UPIU_SCSI_RSP_CAPACITY_SIZE */
|
||||
error = ufshci_utr_cmd_capacity(sc, ccb, xs);
|
||||
if (error == -1)
|
||||
if (error)
|
||||
goto error2;
|
||||
|
||||
if (ISSET(xs->flags, SCSI_POLL)) {
|
||||
|
@ -1757,7 +1758,7 @@ ufshci_scsi_sync(struct scsi_xfer *xs)
|
|||
|
||||
error = ufshci_utr_cmd_sync(sc, ccb, xs, (uint32_t)lba,
|
||||
(uint16_t)blocks);
|
||||
if (error == -1)
|
||||
if (error)
|
||||
goto error;
|
||||
|
||||
if (ISSET(xs->flags, SCSI_POLL)) {
|
||||
|
@ -1797,7 +1798,7 @@ ufshci_scsi_io(struct scsi_xfer *xs, int dir)
|
|||
|
||||
error = bus_dmamap_load(sc->sc_dmat, dmap, xs->data, xs->datalen, NULL,
|
||||
ISSET(xs->flags, SCSI_NOSLEEP) ? BUS_DMA_NOWAIT : BUS_DMA_WAITOK);
|
||||
if (error != 0) {
|
||||
if (error) {
|
||||
printf("%s: bus_dmamap_load error=%d\n", __func__, error);
|
||||
goto error1;
|
||||
}
|
||||
|
@ -1813,7 +1814,7 @@ ufshci_scsi_io(struct scsi_xfer *xs, int dir)
|
|||
error = ufshci_utr_cmd_io(sc, ccb, xs, SCSI_DATA_IN);
|
||||
else
|
||||
error = ufshci_utr_cmd_io(sc, ccb, xs, SCSI_DATA_OUT);
|
||||
if (error == -1)
|
||||
if (error)
|
||||
goto error2;
|
||||
|
||||
if (ISSET(xs->flags, SCSI_POLL)) {
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $OpenBSD: ofw_regulator.c,v 1.19 2023/04/15 03:19:43 dlg Exp $ */
|
||||
/* $OpenBSD: ofw_regulator.c,v 1.20 2024/06/14 20:00:32 kettenis Exp $ */
|
||||
/*
|
||||
* Copyright (c) 2016 Mark Kettenis
|
||||
*
|
||||
|
@ -56,6 +56,11 @@ regulator_register(struct regulator_device *rd)
|
|||
rd->rd_ramp_delay =
|
||||
OF_getpropint(rd->rd_node, "regulator-ramp-delay", 0);
|
||||
|
||||
rd->rd_coupled =
|
||||
OF_getpropint(rd->rd_node, "regulator-coupled-with", 0);
|
||||
rd->rd_max_spread =
|
||||
OF_getpropint(rd->rd_node, "regulator-coupled-max-spread", 0);
|
||||
|
||||
if (rd->rd_get_voltage && rd->rd_set_voltage) {
|
||||
uint32_t voltage = rd->rd_get_voltage(rd->rd_cookie);
|
||||
if (voltage < rd->rd_volt_min)
|
||||
|
@ -249,6 +254,10 @@ regulator_set_voltage(uint32_t phandle, uint32_t voltage)
|
|||
if (rd && (voltage < rd->rd_volt_min || voltage > rd->rd_volt_max))
|
||||
return EINVAL;
|
||||
|
||||
/* XXX Coupled regulators are unsupported for now. */
|
||||
if (rd && rd->rd_coupled)
|
||||
return ENOTSUP;
|
||||
|
||||
if (rd && rd->rd_set_voltage) {
|
||||
regulator_do_notify(rd->rd_phandle, voltage);
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $OpenBSD: ofw_regulator.h,v 1.8 2023/04/01 08:37:23 kettenis Exp $ */
|
||||
/* $OpenBSD: ofw_regulator.h,v 1.9 2024/06/14 20:00:32 kettenis Exp $ */
|
||||
/*
|
||||
* Copyright (c) 2016 Mark Kettenis
|
||||
*
|
||||
|
@ -31,6 +31,9 @@ struct regulator_device {
|
|||
uint32_t rd_amp_min, rd_amp_max;
|
||||
uint32_t rd_ramp_delay;
|
||||
|
||||
uint32_t rd_coupled;
|
||||
uint32_t rd_max_spread;
|
||||
|
||||
LIST_ENTRY(regulator_device) rd_list;
|
||||
uint32_t rd_phandle;
|
||||
};
|
||||
|
|
|
@ -812,6 +812,10 @@ probe_gmdid_display(struct drm_i915_private *i915, u16 *ver, u16 *rel, u16 *step
|
|||
void __iomem *addr;
|
||||
u32 val;
|
||||
int i;
|
||||
int mmio_bar, mmio_size, mmio_type;
|
||||
bus_space_tag_t bst;
|
||||
bus_space_handle_t bsh;
|
||||
bus_size_t memsize;
|
||||
|
||||
/* The caller expects to ver, rel and step to be initialized
|
||||
* here, and there's no good way to check when there was a
|
||||
|
@ -822,9 +826,7 @@ probe_gmdid_display(struct drm_i915_private *i915, u16 *ver, u16 *rel, u16 *step
|
|||
*rel = 0;
|
||||
*step = 0;
|
||||
|
||||
STUB();
|
||||
return &no_display;
|
||||
#ifdef notyet
|
||||
#ifdef __linux__
|
||||
addr = pci_iomap_range(pdev, 0, i915_mmio_reg_offset(GMD_ID_DISPLAY), sizeof(u32));
|
||||
if (!addr) {
|
||||
drm_err(&i915->drm, "Cannot map MMIO BAR to read display GMD_ID\n");
|
||||
|
@ -833,6 +835,19 @@ probe_gmdid_display(struct drm_i915_private *i915, u16 *ver, u16 *rel, u16 *step
|
|||
|
||||
val = ioread32(addr);
|
||||
pci_iounmap(pdev, addr);
|
||||
#else
|
||||
mmio_bar = 0x10;
|
||||
mmio_type = pci_mapreg_type(i915->pc, i915->tag, mmio_bar);
|
||||
if (pci_mapreg_map(i915->pa, mmio_bar, mmio_type, 0,
|
||||
&bst, &bsh, NULL, &memsize, 0)) {
|
||||
drm_err(&i915->drm, "Cannot map MMIO BAR to read display GMD_ID\n");
|
||||
return &no_display;
|
||||
}
|
||||
|
||||
val = bus_space_read_4(bst, bsh, i915_mmio_reg_offset(GMD_ID_DISPLAY));
|
||||
|
||||
bus_space_unmap(bst, bsh, memsize);
|
||||
#endif
|
||||
|
||||
if (val == 0) {
|
||||
drm_dbg_kms(&i915->drm, "Device doesn't have display\n");
|
||||
|
@ -851,7 +866,6 @@ probe_gmdid_display(struct drm_i915_private *i915, u16 *ver, u16 *rel, u16 *step
|
|||
drm_err(&i915->drm, "Unrecognized display IP version %d.%02d; disabling display.\n",
|
||||
*ver, *rel);
|
||||
return &no_display;
|
||||
#endif
|
||||
}
|
||||
|
||||
const struct intel_display_device_info *
|
||||
|
|
|
@ -388,6 +388,27 @@ static void icl_get_stolen_reserved(struct drm_i915_private *i915,
|
|||
|
||||
drm_dbg(&i915->drm, "GEN6_STOLEN_RESERVED = 0x%016llx\n", reg_val);
|
||||
|
||||
/* Wa_14019821291 */
|
||||
if (MEDIA_VER_FULL(i915) == IP_VER(13, 0)) {
|
||||
/*
|
||||
* This workaround is primarily implemented by the BIOS. We
|
||||
* just need to figure out whether the BIOS has applied the
|
||||
* workaround (meaning the programmed address falls within
|
||||
* the DSM) and, if so, reserve that part of the DSM to
|
||||
* prevent accidental reuse. The DSM location should be just
|
||||
* below the WOPCM.
|
||||
*/
|
||||
u64 gscpsmi_base = intel_uncore_read64_2x32(uncore,
|
||||
MTL_GSCPSMI_BASEADDR_LSB,
|
||||
MTL_GSCPSMI_BASEADDR_MSB);
|
||||
if (gscpsmi_base >= i915->dsm.stolen.start &&
|
||||
gscpsmi_base < i915->dsm.stolen.end) {
|
||||
*base = gscpsmi_base;
|
||||
*size = i915->dsm.stolen.end - gscpsmi_base;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
switch (reg_val & GEN8_STOLEN_RESERVED_SIZE_MASK) {
|
||||
case GEN8_STOLEN_RESERVED_1M:
|
||||
*size = 1024 * 1024;
|
||||
|
|
|
@ -470,6 +470,9 @@
|
|||
#define XEHP_PSS_MODE2 MCR_REG(0x703c)
|
||||
#define SCOREBOARD_STALL_FLUSH_CONTROL REG_BIT(5)
|
||||
|
||||
#define XEHP_PSS_CHICKEN MCR_REG(0x7044)
|
||||
#define FD_END_COLLECT REG_BIT(5)
|
||||
|
||||
#define GEN7_SC_INSTDONE _MMIO(0x7100)
|
||||
#define GEN12_SC_INSTDONE_EXTRA _MMIO(0x7104)
|
||||
#define GEN12_SC_INSTDONE_EXTRA2 _MMIO(0x7108)
|
||||
|
@ -538,6 +541,9 @@
|
|||
#define XEHP_SQCM MCR_REG(0x8724)
|
||||
#define EN_32B_ACCESS REG_BIT(30)
|
||||
|
||||
#define MTL_GSCPSMI_BASEADDR_LSB _MMIO(0x880c)
|
||||
#define MTL_GSCPSMI_BASEADDR_MSB _MMIO(0x8810)
|
||||
|
||||
#define HSW_IDICR _MMIO(0x9008)
|
||||
#define IDIHASHMSK(x) (((x) & 0x3f) << 16)
|
||||
|
||||
|
@ -1209,6 +1215,7 @@
|
|||
#define GEN12_DISABLE_EARLY_READ REG_BIT(14)
|
||||
#define GEN12_ENABLE_LARGE_GRF_MODE REG_BIT(12)
|
||||
#define GEN12_PUSH_CONST_DEREF_HOLD_DIS REG_BIT(8)
|
||||
#define XELPG_DISABLE_TDL_SVHS_GATING REG_BIT(1)
|
||||
#define GEN12_DISABLE_DOP_GATING REG_BIT(0)
|
||||
|
||||
#define RT_CTRL MCR_REG(0xe530)
|
||||
|
@ -1221,6 +1228,8 @@
|
|||
|
||||
#define XEHP_HDC_CHICKEN0 MCR_REG(0xe5f0)
|
||||
#define LSC_L1_FLUSH_CTL_3D_DATAPORT_FLUSH_EVENTS_MASK REG_GENMASK(13, 11)
|
||||
#define DIS_ATOMIC_CHAINING_TYPED_WRITES REG_BIT(3)
|
||||
|
||||
#define ICL_HDC_MODE MCR_REG(0xe5f4)
|
||||
|
||||
#define EU_PERF_CNTL2 PERF_REG(0xe658)
|
||||
|
|
|
@ -781,6 +781,9 @@ static void dg2_ctx_workarounds_init(struct intel_engine_cs *engine,
|
|||
|
||||
/* Wa_18019271663:dg2 */
|
||||
wa_masked_en(wal, CACHE_MODE_1, MSAA_OPTIMIZATION_REDUC_DISABLE);
|
||||
|
||||
/* Wa_14019877138:dg2 */
|
||||
wa_mcr_masked_en(wal, XEHP_PSS_CHICKEN, FD_END_COLLECT);
|
||||
}
|
||||
|
||||
static void xelpg_ctx_gt_tuning_init(struct intel_engine_cs *engine,
|
||||
|
@ -826,6 +829,9 @@ static void xelpg_ctx_workarounds_init(struct intel_engine_cs *engine,
|
|||
|
||||
/* Wa_18019271663 */
|
||||
wa_masked_en(wal, CACHE_MODE_1, MSAA_OPTIMIZATION_REDUC_DISABLE);
|
||||
|
||||
/* Wa_14019877138 */
|
||||
wa_mcr_masked_en(wal, XEHP_PSS_CHICKEN, FD_END_COLLECT);
|
||||
}
|
||||
|
||||
static void fakewa_disable_nestedbb_mode(struct intel_engine_cs *engine,
|
||||
|
@ -2338,6 +2344,14 @@ rcs_engine_wa_init(struct intel_engine_cs *engine, struct i915_wa_list *wal)
|
|||
LSC_L1_FLUSH_CTL_3D_DATAPORT_FLUSH_EVENTS_MASK);
|
||||
}
|
||||
|
||||
if (IS_GFX_GT_IP_RANGE(gt, IP_VER(12, 70), IP_VER(12, 71)) ||
|
||||
IS_DG2(i915)) {
|
||||
/* Wa_14015150844 */
|
||||
wa_mcr_add(wal, XEHP_HDC_CHICKEN0, 0,
|
||||
_MASKED_BIT_ENABLE(DIS_ATOMIC_CHAINING_TYPED_WRITES),
|
||||
0, true);
|
||||
}
|
||||
|
||||
if (IS_DG2_G11(i915) || IS_DG2_G10(i915)) {
|
||||
/* Wa_22014600077:dg2 */
|
||||
wa_mcr_add(wal, GEN10_CACHE_MODE_SS, 0,
|
||||
|
@ -2887,10 +2901,14 @@ general_render_compute_wa_init(struct intel_engine_cs *engine, struct i915_wa_li
|
|||
|
||||
if (IS_GFX_GT_IP_STEP(gt, IP_VER(12, 70), STEP_B0, STEP_FOREVER) ||
|
||||
IS_GFX_GT_IP_STEP(gt, IP_VER(12, 71), STEP_B0, STEP_FOREVER) ||
|
||||
IS_GFX_GT_IP_RANGE(gt, IP_VER(12, 74), IP_VER(12, 74)))
|
||||
IS_GFX_GT_IP_RANGE(gt, IP_VER(12, 74), IP_VER(12, 74))) {
|
||||
/* Wa_14017856879 */
|
||||
wa_mcr_masked_en(wal, GEN9_ROW_CHICKEN3, MTL_DISABLE_FIX_FOR_EOT_FLUSH);
|
||||
|
||||
/* Wa_14020495402 */
|
||||
wa_mcr_masked_en(wal, GEN8_ROW_CHICKEN2, XELPG_DISABLE_TDL_SVHS_GATING);
|
||||
}
|
||||
|
||||
if (IS_GFX_GT_IP_STEP(gt, IP_VER(12, 70), STEP_A0, STEP_B0) ||
|
||||
IS_GFX_GT_IP_STEP(gt, IP_VER(12, 71), STEP_A0, STEP_B0))
|
||||
/*
|
||||
|
|
|
@ -2258,6 +2258,7 @@ inteldrm_attach(struct device *parent, struct device *self, void *aux)
|
|||
int mmio_bar, mmio_size, mmio_type;
|
||||
int ret;
|
||||
|
||||
dev_priv->pa = pa;
|
||||
dev_priv->pc = pa->pa_pc;
|
||||
dev_priv->tag = pa->pa_tag;
|
||||
dev_priv->iot = pa->pa_iot;
|
||||
|
|
|
@ -239,6 +239,7 @@ struct inteldrm_softc {
|
|||
struct i915_dsm dsm;
|
||||
|
||||
#ifdef __OpenBSD__
|
||||
struct pci_attach_args *pa;
|
||||
pci_chipset_tag_t pc;
|
||||
pcitag_t tag;
|
||||
struct extent *memex;
|
||||
|
|
|
@ -290,20 +290,25 @@ static void intel_device_info_subplatform_init(struct drm_i915_private *i915)
|
|||
|
||||
static void ip_ver_read(struct drm_i915_private *i915, u32 offset, struct intel_ip_version *ip)
|
||||
{
|
||||
STUB();
|
||||
#ifdef notyet
|
||||
#ifdef __linux__
|
||||
struct pci_dev *pdev = to_pci_dev(i915->drm.dev);
|
||||
void __iomem *addr;
|
||||
#endif
|
||||
u32 val;
|
||||
u8 expected_ver = ip->ver;
|
||||
u8 expected_rel = ip->rel;
|
||||
|
||||
#ifdef __linux__
|
||||
addr = pci_iomap_range(pdev, 0, offset, sizeof(u32));
|
||||
if (drm_WARN_ON(&i915->drm, !addr))
|
||||
return;
|
||||
|
||||
val = ioread32(addr);
|
||||
pci_iounmap(pdev, addr);
|
||||
#else
|
||||
val = bus_space_read_4(i915->vga_regs->bst, i915->vga_regs->bsh,
|
||||
offset);
|
||||
#endif
|
||||
|
||||
ip->ver = REG_FIELD_GET(GMD_ID_ARCH_MASK, val);
|
||||
ip->rel = REG_FIELD_GET(GMD_ID_RELEASE_MASK, val);
|
||||
|
@ -314,7 +319,6 @@ static void ip_ver_read(struct drm_i915_private *i915, u32 offset, struct intel_
|
|||
drm_dbg(&i915->drm,
|
||||
"Hardware reports GMD IP version %u.%u (REG[0x%x] = 0x%08x) but minimum expected is %u.%u\n",
|
||||
ip->ver, ip->rel, offset, val, expected_ver, expected_rel);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $OpenBSD: rnd.c,v 1.227 2024/06/04 08:26:11 claudio Exp $ */
|
||||
/* $OpenBSD: rnd.c,v 1.228 2024/06/14 10:17:05 claudio Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2011,2020 Theo de Raadt.
|
||||
|
@ -172,8 +172,8 @@ const struct filterops randomwrite_filtops = {
|
|||
/*
|
||||
* This function mixes entropy and timing into the entropy input ring.
|
||||
*/
|
||||
void
|
||||
enqueue_randomness(u_int val)
|
||||
static void
|
||||
add_event_data(u_int val)
|
||||
{
|
||||
struct rand_event *rep;
|
||||
int e;
|
||||
|
@ -182,6 +182,12 @@ enqueue_randomness(u_int val)
|
|||
rep = &rnd_event_space[e];
|
||||
rep->re_time += cpu_rnd_messybits();
|
||||
rep->re_val += val;
|
||||
}
|
||||
|
||||
void
|
||||
enqueue_randomness(u_int val)
|
||||
{
|
||||
add_event_data(val);
|
||||
|
||||
if (rnd_cold) {
|
||||
dequeue_randomness(NULL);
|
||||
|
@ -248,9 +254,6 @@ dequeue_randomness(void *v)
|
|||
u_int32_t buf[2];
|
||||
u_int startp, startc, i;
|
||||
|
||||
if (!rnd_cold)
|
||||
timeout_del(&rnd_timeout);
|
||||
|
||||
/* Some very new damage */
|
||||
startp = rnd_event_prod - QEVCONSUME;
|
||||
for (i = 0; i < QEVCONSUME; i++) {
|
||||
|
@ -304,10 +307,8 @@ extract_entropy(u_int8_t *buf)
|
|||
|
||||
/*
|
||||
* Modify pool so next hash will produce different results.
|
||||
* During boot-time enqueue/dequeue stage, avoid recursion.
|
||||
*/
|
||||
if (!rnd_cold)
|
||||
enqueue_randomness(extract_pool[0]);
|
||||
*/
|
||||
add_event_data(extract_pool[0]);
|
||||
dequeue_randomness(NULL);
|
||||
|
||||
/* Wipe data from memory */
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $OpenBSD: uipc_socket.c,v 1.335 2024/05/17 19:11:14 mvs Exp $ */
|
||||
/* $OpenBSD: uipc_socket.c,v 1.336 2024/06/14 08:32:22 mvs Exp $ */
|
||||
/* $NetBSD: uipc_socket.c,v 1.21 1996/02/04 02:17:52 christos Exp $ */
|
||||
|
||||
/*
|
||||
|
@ -166,6 +166,7 @@ soalloc(const struct protosw *prp, int wait)
|
|||
}
|
||||
break;
|
||||
case AF_KEY:
|
||||
case AF_ROUTE:
|
||||
case AF_UNIX:
|
||||
so->so_snd.sb_flags |= SB_MTXLOCK;
|
||||
so->so_rcv.sb_flags |= SB_MTXLOCK;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $OpenBSD: rtsock.c,v 1.373 2023/12/03 10:51:17 mvs Exp $ */
|
||||
/* $OpenBSD: rtsock.c,v 1.374 2024/06/14 08:32:22 mvs Exp $ */
|
||||
/* $NetBSD: rtsock.c,v 1.18 1996/03/29 00:32:10 cgd Exp $ */
|
||||
|
||||
/*
|
||||
|
@ -313,10 +313,12 @@ route_rcvd(struct socket *so)
|
|||
* If we are in a FLUSH state, check if the buffer is
|
||||
* empty so that we can clear the flag.
|
||||
*/
|
||||
|
||||
mtx_enter(&so->so_rcv.sb_mtx);
|
||||
if (((rop->rop_flags & ROUTECB_FLAG_FLUSH) != 0) &&
|
||||
((sbspace(rop->rop_socket, &rop->rop_socket->so_rcv) ==
|
||||
rop->rop_socket->so_rcv.sb_hiwat)))
|
||||
((sbspace(so, &so->so_rcv) == so->so_rcv.sb_hiwat)))
|
||||
rop->rop_flags &= ~ROUTECB_FLAG_FLUSH;
|
||||
mtx_leave(&so->so_rcv.sb_mtx);
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -478,8 +480,14 @@ rtm_senddesync(struct socket *so)
|
|||
*/
|
||||
desync_mbuf = rtm_msg1(RTM_DESYNC, NULL);
|
||||
if (desync_mbuf != NULL) {
|
||||
if (sbappendaddr(so, &so->so_rcv, &route_src,
|
||||
desync_mbuf, NULL) != 0) {
|
||||
int ret;
|
||||
|
||||
mtx_enter(&so->so_rcv.sb_mtx);
|
||||
ret = sbappendaddr(so, &so->so_rcv, &route_src,
|
||||
desync_mbuf, NULL);
|
||||
mtx_leave(&so->so_rcv.sb_mtx);
|
||||
|
||||
if (ret != 0) {
|
||||
rop->rop_flags &= ~ROUTECB_FLAG_DESYNC;
|
||||
sorwakeup(rop->rop_socket);
|
||||
return;
|
||||
|
@ -586,6 +594,7 @@ rtm_sendup(struct socket *so, struct mbuf *m0)
|
|||
{
|
||||
struct rtpcb *rop = sotortpcb(so);
|
||||
struct mbuf *m;
|
||||
int send_desync = 0;
|
||||
|
||||
soassertlocked(so);
|
||||
|
||||
|
@ -593,8 +602,13 @@ rtm_sendup(struct socket *so, struct mbuf *m0)
|
|||
if (m == NULL)
|
||||
return (ENOMEM);
|
||||
|
||||
mtx_enter(&so->so_rcv.sb_mtx);
|
||||
if (sbspace(so, &so->so_rcv) < (2 * MSIZE) ||
|
||||
sbappendaddr(so, &so->so_rcv, &route_src, m, NULL) == 0) {
|
||||
sbappendaddr(so, &so->so_rcv, &route_src, m, NULL) == 0)
|
||||
send_desync = 1;
|
||||
mtx_leave(&so->so_rcv.sb_mtx);
|
||||
|
||||
if (send_desync) {
|
||||
/* Flag socket as desync'ed and flush required */
|
||||
rop->rop_flags |= ROUTECB_FLAG_DESYNC | ROUTECB_FLAG_FLUSH;
|
||||
rtm_senddesync(so);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue