Merge ^/head r277956 through r277974.
This commit is contained in:
commit
6a0fc39710
@ -87,8 +87,8 @@ static int ttyfd = -1;
|
|||||||
|
|
||||||
/* mode flags for dowait */
|
/* mode flags for dowait */
|
||||||
#define DOWAIT_BLOCK 0x1 /* wait until a child exits */
|
#define DOWAIT_BLOCK 0x1 /* wait until a child exits */
|
||||||
#define DOWAIT_SIG 0x2 /* if DOWAIT_BLOCK, abort on SIGINT/SIGQUIT */
|
#define DOWAIT_SIG 0x2 /* if DOWAIT_BLOCK, abort on signal */
|
||||||
#define DOWAIT_SIG_ANY 0x4 /* if DOWAIT_SIG, abort on any signal */
|
#define DOWAIT_SIG_TRAP 0x4 /* if DOWAIT_SIG, abort on trapped signal only */
|
||||||
|
|
||||||
#if JOBS
|
#if JOBS
|
||||||
static void restartjob(struct job *);
|
static void restartjob(struct job *);
|
||||||
@ -1028,7 +1028,7 @@ waitforjob(struct job *jp, int *origstatus)
|
|||||||
TRACE(("waitforjob(%%%td) called\n", jp - jobtab + 1));
|
TRACE(("waitforjob(%%%td) called\n", jp - jobtab + 1));
|
||||||
while (jp->state == 0)
|
while (jp->state == 0)
|
||||||
if (dowait(DOWAIT_BLOCK | (Tflag ? DOWAIT_SIG |
|
if (dowait(DOWAIT_BLOCK | (Tflag ? DOWAIT_SIG |
|
||||||
DOWAIT_SIG_ANY : 0), jp) == -1)
|
DOWAIT_SIG_TRAP : 0), jp) == -1)
|
||||||
dotrap();
|
dotrap();
|
||||||
#if JOBS
|
#if JOBS
|
||||||
if (jp->jobctl) {
|
if (jp->jobctl) {
|
||||||
@ -1120,7 +1120,7 @@ dowait(int mode, struct job *job)
|
|||||||
TRACE(("wait returns %d, status=%d\n", (int)pid, status));
|
TRACE(("wait returns %d, status=%d\n", (int)pid, status));
|
||||||
if (pid == 0 && (mode & DOWAIT_SIG) != 0) {
|
if (pid == 0 && (mode & DOWAIT_SIG) != 0) {
|
||||||
pid = -1;
|
pid = -1;
|
||||||
if (((mode & DOWAIT_SIG_ANY) != 0 ?
|
if (((mode & DOWAIT_SIG_TRAP) != 0 ?
|
||||||
pendingsig : pendingsig_waitcmd) != 0) {
|
pendingsig : pendingsig_waitcmd) != 0) {
|
||||||
errno = EINTR;
|
errno = EINTR;
|
||||||
break;
|
break;
|
||||||
|
@ -74,7 +74,7 @@ __FBSDID("$FreeBSD$");
|
|||||||
|
|
||||||
static char sigmode[NSIG]; /* current value of signal */
|
static char sigmode[NSIG]; /* current value of signal */
|
||||||
volatile sig_atomic_t pendingsig; /* indicates some signal received */
|
volatile sig_atomic_t pendingsig; /* indicates some signal received */
|
||||||
volatile sig_atomic_t pendingsig_waitcmd; /* indicates SIGINT/SIGQUIT received */
|
volatile sig_atomic_t pendingsig_waitcmd; /* indicates wait builtin should be interrupted */
|
||||||
static int in_dotrap; /* do we execute in a trap handler? */
|
static int in_dotrap; /* do we execute in a trap handler? */
|
||||||
static char *volatile trap[NSIG]; /* trap handler commands */
|
static char *volatile trap[NSIG]; /* trap handler commands */
|
||||||
static volatile sig_atomic_t gotsig[NSIG];
|
static volatile sig_atomic_t gotsig[NSIG];
|
||||||
@ -400,6 +400,7 @@ onsig(int signo)
|
|||||||
(signo != SIGCHLD || !ignore_sigchld)) {
|
(signo != SIGCHLD || !ignore_sigchld)) {
|
||||||
gotsig[signo] = 1;
|
gotsig[signo] = 1;
|
||||||
pendingsig = signo;
|
pendingsig = signo;
|
||||||
|
pendingsig_waitcmd = signo;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -153,9 +153,12 @@ proc_iter_objs(struct proc_handle *p, proc_map_f *func, void *cd)
|
|||||||
prmap_t map;
|
prmap_t map;
|
||||||
char path[MAXPATHLEN];
|
char path[MAXPATHLEN];
|
||||||
char last[MAXPATHLEN];
|
char last[MAXPATHLEN];
|
||||||
|
int error;
|
||||||
|
|
||||||
if (p->nobjs == 0)
|
if (p->nobjs == 0)
|
||||||
return (-1);
|
return (-1);
|
||||||
|
|
||||||
|
error = 0;
|
||||||
memset(last, 0, sizeof(last));
|
memset(last, 0, sizeof(last));
|
||||||
for (i = 0; i < p->nobjs; i++) {
|
for (i = 0; i < p->nobjs; i++) {
|
||||||
rdl = &p->rdobjs[i];
|
rdl = &p->rdobjs[i];
|
||||||
@ -169,11 +172,11 @@ proc_iter_objs(struct proc_handle *p, proc_map_f *func, void *cd)
|
|||||||
*/
|
*/
|
||||||
if (strcmp(path, last) == 0)
|
if (strcmp(path, last) == 0)
|
||||||
continue;
|
continue;
|
||||||
(*func)(cd, &map, path);
|
if ((error = (*func)(cd, &map, path)) != 0)
|
||||||
|
break;
|
||||||
strlcpy(last, path, sizeof(last));
|
strlcpy(last, path, sizeof(last));
|
||||||
}
|
}
|
||||||
|
return (error);
|
||||||
return (0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
prmap_t *
|
prmap_t *
|
||||||
@ -599,7 +602,8 @@ proc_iter_symbyaddr(struct proc_handle *p, const char *object, int which,
|
|||||||
s = elf_strptr(e, stridx, sym.st_name);
|
s = elf_strptr(e, stridx, sym.st_name);
|
||||||
if (ehdr.e_type != ET_EXEC)
|
if (ehdr.e_type != ET_EXEC)
|
||||||
sym.st_value += map->pr_vaddr;
|
sym.st_value += map->pr_vaddr;
|
||||||
(*func)(cd, &sym, s);
|
if ((error = (*func)(cd, &sym, s)) != 0)
|
||||||
|
goto err2;
|
||||||
}
|
}
|
||||||
error = 0;
|
error = 0;
|
||||||
err2:
|
err2:
|
||||||
|
@ -427,7 +427,7 @@ a10_gpio_attach(device_t dev)
|
|||||||
RF_ACTIVE);
|
RF_ACTIVE);
|
||||||
if (!sc->sc_mem_res) {
|
if (!sc->sc_mem_res) {
|
||||||
device_printf(dev, "cannot allocate memory window\n");
|
device_printf(dev, "cannot allocate memory window\n");
|
||||||
return (ENXIO);
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
sc->sc_bst = rman_get_bustag(sc->sc_mem_res);
|
sc->sc_bst = rman_get_bustag(sc->sc_mem_res);
|
||||||
@ -437,9 +437,8 @@ a10_gpio_attach(device_t dev)
|
|||||||
sc->sc_irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
|
sc->sc_irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
|
||||||
RF_ACTIVE);
|
RF_ACTIVE);
|
||||||
if (!sc->sc_irq_res) {
|
if (!sc->sc_irq_res) {
|
||||||
bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->sc_mem_res);
|
|
||||||
device_printf(dev, "cannot allocate interrupt\n");
|
device_printf(dev, "cannot allocate interrupt\n");
|
||||||
return (ENXIO);
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Find our node. */
|
/* Find our node. */
|
||||||
@ -472,6 +471,8 @@ a10_gpio_attach(device_t dev)
|
|||||||
bus_release_resource(dev, SYS_RES_IRQ, 0, sc->sc_irq_res);
|
bus_release_resource(dev, SYS_RES_IRQ, 0, sc->sc_irq_res);
|
||||||
if (sc->sc_mem_res)
|
if (sc->sc_mem_res)
|
||||||
bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->sc_mem_res);
|
bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->sc_mem_res);
|
||||||
|
mtx_destroy(&sc->sc_mtx);
|
||||||
|
|
||||||
return (ENXIO);
|
return (ENXIO);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -163,6 +163,7 @@ socfpga_gpio_attach(device_t dev)
|
|||||||
|
|
||||||
if (bus_alloc_resources(dev, socfpga_gpio_spec, sc->res)) {
|
if (bus_alloc_resources(dev, socfpga_gpio_spec, sc->res)) {
|
||||||
device_printf(dev, "could not allocate resources\n");
|
device_printf(dev, "could not allocate resources\n");
|
||||||
|
mtx_destroy(&sc->sc_mtx);
|
||||||
return (ENXIO);
|
return (ENXIO);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -389,6 +389,8 @@ imx51_gpio_attach(device_t dev)
|
|||||||
|
|
||||||
if (bus_alloc_resources(dev, imx_gpio_spec, sc->sc_res)) {
|
if (bus_alloc_resources(dev, imx_gpio_spec, sc->sc_res)) {
|
||||||
device_printf(dev, "could not allocate resources\n");
|
device_printf(dev, "could not allocate resources\n");
|
||||||
|
bus_release_resources(dev, imx_gpio_spec, sc->sc_res);
|
||||||
|
mtx_destroy(&sc->sc_mtx);
|
||||||
return (ENXIO);
|
return (ENXIO);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -411,6 +413,7 @@ imx51_gpio_attach(device_t dev)
|
|||||||
imx51_gpio_intr, NULL, sc, &sc->gpio_ih[irq]))) {
|
imx51_gpio_intr, NULL, sc, &sc->gpio_ih[irq]))) {
|
||||||
device_printf(dev,
|
device_printf(dev,
|
||||||
"WARNING: unable to register interrupt handler\n");
|
"WARNING: unable to register interrupt handler\n");
|
||||||
|
imx51_gpio_detach(dev);
|
||||||
return (ENXIO);
|
return (ENXIO);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -434,6 +437,7 @@ imx51_gpio_attach(device_t dev)
|
|||||||
static int
|
static int
|
||||||
imx51_gpio_detach(device_t dev)
|
imx51_gpio_detach(device_t dev)
|
||||||
{
|
{
|
||||||
|
int irq;
|
||||||
struct imx51_gpio_softc *sc;
|
struct imx51_gpio_softc *sc;
|
||||||
|
|
||||||
sc = device_get_softc(dev);
|
sc = device_get_softc(dev);
|
||||||
@ -441,13 +445,12 @@ imx51_gpio_detach(device_t dev)
|
|||||||
KASSERT(mtx_initialized(&sc->sc_mtx), ("gpio mutex not initialized"));
|
KASSERT(mtx_initialized(&sc->sc_mtx), ("gpio mutex not initialized"));
|
||||||
|
|
||||||
bus_generic_detach(dev);
|
bus_generic_detach(dev);
|
||||||
|
for (irq = 1; irq <= sc->sc_l_irq; irq ++) {
|
||||||
if (sc->sc_res[3])
|
if (sc->gpio_ih[irq])
|
||||||
bus_release_resources(dev, imx_gpio0irq_spec, &sc->sc_res[3]);
|
bus_teardown_intr(dev, sc->sc_res[irq], sc->gpio_ih[irq]);
|
||||||
|
}
|
||||||
if (sc->sc_res[0])
|
bus_release_resources(dev, imx_gpio0irq_spec, &sc->sc_res[3]);
|
||||||
bus_release_resources(dev, imx_gpio_spec, sc->sc_res);
|
bus_release_resources(dev, imx_gpio_spec, sc->sc_res);
|
||||||
|
|
||||||
mtx_destroy(&sc->sc_mtx);
|
mtx_destroy(&sc->sc_mtx);
|
||||||
|
|
||||||
return(0);
|
return(0);
|
||||||
|
@ -125,6 +125,7 @@ vf_gpio_attach(device_t dev)
|
|||||||
|
|
||||||
if (bus_alloc_resources(dev, vf_gpio_spec, sc->res)) {
|
if (bus_alloc_resources(dev, vf_gpio_spec, sc->res)) {
|
||||||
device_printf(dev, "could not allocate resources\n");
|
device_printf(dev, "could not allocate resources\n");
|
||||||
|
mtx_destroy(&sc->sc_mtx);
|
||||||
return (ENXIO);
|
return (ENXIO);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -399,13 +399,14 @@ rk30_gpio_attach(device_t dev)
|
|||||||
if (rk30_gpio_sc)
|
if (rk30_gpio_sc)
|
||||||
return (ENXIO);
|
return (ENXIO);
|
||||||
sc->sc_dev = dev;
|
sc->sc_dev = dev;
|
||||||
|
mtx_init(&sc->sc_mtx, "rk30 gpio", "gpio", MTX_DEF);
|
||||||
|
|
||||||
rid = 0;
|
rid = 0;
|
||||||
sc->sc_mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
|
sc->sc_mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
|
||||||
RF_ACTIVE);
|
RF_ACTIVE);
|
||||||
if (!sc->sc_mem_res) {
|
if (!sc->sc_mem_res) {
|
||||||
device_printf(dev, "cannot allocate memory window\n");
|
device_printf(dev, "cannot allocate memory window\n");
|
||||||
return (ENXIO);
|
goto fail;
|
||||||
}
|
}
|
||||||
sc->sc_bst = rman_get_bustag(sc->sc_mem_res);
|
sc->sc_bst = rman_get_bustag(sc->sc_mem_res);
|
||||||
sc->sc_bsh = rman_get_bushandle(sc->sc_mem_res);
|
sc->sc_bsh = rman_get_bushandle(sc->sc_mem_res);
|
||||||
@ -421,17 +422,15 @@ rk30_gpio_attach(device_t dev)
|
|||||||
if (sc->sc_bank == -1) {
|
if (sc->sc_bank == -1) {
|
||||||
device_printf(dev,
|
device_printf(dev,
|
||||||
"unsupported device unit (only GPIO0..3 are supported)\n");
|
"unsupported device unit (only GPIO0..3 are supported)\n");
|
||||||
bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->sc_mem_res);
|
goto fail;
|
||||||
return (ENXIO);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
rid = 0;
|
rid = 0;
|
||||||
sc->sc_irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
|
sc->sc_irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
|
||||||
RF_ACTIVE);
|
RF_ACTIVE);
|
||||||
if (!sc->sc_irq_res) {
|
if (!sc->sc_irq_res) {
|
||||||
bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->sc_mem_res);
|
|
||||||
device_printf(dev, "cannot allocate interrupt\n");
|
device_printf(dev, "cannot allocate interrupt\n");
|
||||||
return (ENXIO);
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Find our node. */
|
/* Find our node. */
|
||||||
@ -441,8 +440,6 @@ rk30_gpio_attach(device_t dev)
|
|||||||
/* Node is not a GPIO controller. */
|
/* Node is not a GPIO controller. */
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
mtx_init(&sc->sc_mtx, "rk30 gpio", "gpio", MTX_DEF);
|
|
||||||
|
|
||||||
/* Initialize the software controlled pins. */
|
/* Initialize the software controlled pins. */
|
||||||
for (i = 0; i < RK30_GPIO_PINS; i++) {
|
for (i = 0; i < RK30_GPIO_PINS; i++) {
|
||||||
snprintf(sc->sc_gpio_pins[i].gp_name, GPIOMAXNAME,
|
snprintf(sc->sc_gpio_pins[i].gp_name, GPIOMAXNAME,
|
||||||
@ -467,6 +464,8 @@ rk30_gpio_attach(device_t dev)
|
|||||||
bus_release_resource(dev, SYS_RES_IRQ, 0, sc->sc_irq_res);
|
bus_release_resource(dev, SYS_RES_IRQ, 0, sc->sc_irq_res);
|
||||||
if (sc->sc_mem_res)
|
if (sc->sc_mem_res)
|
||||||
bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->sc_mem_res);
|
bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->sc_mem_res);
|
||||||
|
mtx_destroy(&sc->sc_mtx);
|
||||||
|
|
||||||
return (ENXIO);
|
return (ENXIO);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -509,12 +509,12 @@ pad_attach(device_t dev)
|
|||||||
sc->nports = 5;
|
sc->nports = 5;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return (-1);
|
goto fail;
|
||||||
};
|
};
|
||||||
|
|
||||||
if (bus_alloc_resources(dev, sc->pad_spec, sc->res)) {
|
if (bus_alloc_resources(dev, sc->pad_spec, sc->res)) {
|
||||||
device_printf(dev, "could not allocate resources\n");
|
device_printf(dev, "could not allocate resources\n");
|
||||||
return (ENXIO);
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Memory interface */
|
/* Memory interface */
|
||||||
@ -534,9 +534,9 @@ pad_attach(device_t dev)
|
|||||||
NULL, sc, &sc->gpio_ih[i]))) {
|
NULL, sc, &sc->gpio_ih[i]))) {
|
||||||
device_printf(dev,
|
device_printf(dev,
|
||||||
"ERROR: Unable to register interrupt handler\n");
|
"ERROR: Unable to register interrupt handler\n");
|
||||||
return (ENXIO);
|
goto fail;
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
for (i = 0; i < sc->gpio_npins; i++) {
|
for (i = 0; i < sc->gpio_npins; i++) {
|
||||||
sc->gpio_pins[i].gp_pin = i;
|
sc->gpio_pins[i].gp_pin = i;
|
||||||
@ -563,6 +563,17 @@ pad_attach(device_t dev)
|
|||||||
device_add_child(dev, "gpiobus", -1);
|
device_add_child(dev, "gpiobus", -1);
|
||||||
|
|
||||||
return (bus_generic_attach(dev));
|
return (bus_generic_attach(dev));
|
||||||
|
|
||||||
|
fail:
|
||||||
|
for (i = 0; i < sc->nports; i++) {
|
||||||
|
if (sc->gpio_ih[i])
|
||||||
|
bus_teardown_intr(dev, sc->res[sc->nports + i],
|
||||||
|
sc->gpio_ih[i]);
|
||||||
|
}
|
||||||
|
bus_release_resources(dev, sc->pad_spec, sc->res);
|
||||||
|
mtx_destroy(&sc->sc_mtx);
|
||||||
|
|
||||||
|
return (ENXIO);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -113,6 +113,7 @@ __FBSDID("$FreeBSD$");
|
|||||||
#define TI_GPIO_MASK(p) (1U << ((p) % PINS_PER_BANK))
|
#define TI_GPIO_MASK(p) (1U << ((p) % PINS_PER_BANK))
|
||||||
|
|
||||||
static struct ti_gpio_softc *ti_gpio_sc = NULL;
|
static struct ti_gpio_softc *ti_gpio_sc = NULL;
|
||||||
|
static int ti_gpio_detach(device_t);
|
||||||
|
|
||||||
static u_int
|
static u_int
|
||||||
ti_max_gpio_banks(void)
|
ti_max_gpio_banks(void)
|
||||||
@ -763,21 +764,21 @@ ti_gpio_attach(device_t dev)
|
|||||||
*/
|
*/
|
||||||
if (bus_alloc_resources(dev, ti_gpio_mem_spec, sc->sc_mem_res) != 0) {
|
if (bus_alloc_resources(dev, ti_gpio_mem_spec, sc->sc_mem_res) != 0) {
|
||||||
device_printf(dev, "Error: could not allocate mem resources\n");
|
device_printf(dev, "Error: could not allocate mem resources\n");
|
||||||
|
ti_gpio_detach(dev);
|
||||||
return (ENXIO);
|
return (ENXIO);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Request the IRQ resources */
|
/* Request the IRQ resources */
|
||||||
if (bus_alloc_resources(dev, ti_gpio_irq_spec, sc->sc_irq_res) != 0) {
|
if (bus_alloc_resources(dev, ti_gpio_irq_spec, sc->sc_irq_res) != 0) {
|
||||||
bus_release_resources(dev, ti_gpio_mem_spec, sc->sc_mem_res);
|
|
||||||
device_printf(dev, "Error: could not allocate irq resources\n");
|
device_printf(dev, "Error: could not allocate irq resources\n");
|
||||||
|
ti_gpio_detach(dev);
|
||||||
return (ENXIO);
|
return (ENXIO);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Setup the IRQ resources */
|
/* Setup the IRQ resources */
|
||||||
if (ti_gpio_attach_intr(dev) != 0) {
|
if (ti_gpio_attach_intr(dev) != 0) {
|
||||||
ti_gpio_detach_intr(dev);
|
device_printf(dev, "Error: could not setup irq handlers\n");
|
||||||
bus_release_resources(dev, ti_gpio_irq_spec, sc->sc_irq_res);
|
ti_gpio_detach(dev);
|
||||||
bus_release_resources(dev, ti_gpio_mem_spec, sc->sc_mem_res);
|
|
||||||
return (ENXIO);
|
return (ENXIO);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -809,11 +810,7 @@ ti_gpio_attach(device_t dev)
|
|||||||
/* Initialize the GPIO module. */
|
/* Initialize the GPIO module. */
|
||||||
err = ti_gpio_bank_init(dev, i);
|
err = ti_gpio_bank_init(dev, i);
|
||||||
if (err != 0) {
|
if (err != 0) {
|
||||||
ti_gpio_detach_intr(dev);
|
ti_gpio_detach(dev);
|
||||||
bus_release_resources(dev, ti_gpio_irq_spec,
|
|
||||||
sc->sc_irq_res);
|
|
||||||
bus_release_resources(dev, ti_gpio_mem_spec,
|
|
||||||
sc->sc_mem_res);
|
|
||||||
return (err);
|
return (err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -852,18 +849,17 @@ ti_gpio_detach(device_t dev)
|
|||||||
if (sc->sc_mem_res[i] != NULL)
|
if (sc->sc_mem_res[i] != NULL)
|
||||||
ti_gpio_intr_clr(sc, i, 0xffffffff);
|
ti_gpio_intr_clr(sc, i, 0xffffffff);
|
||||||
}
|
}
|
||||||
|
|
||||||
bus_generic_detach(dev);
|
bus_generic_detach(dev);
|
||||||
|
if (sc->sc_events)
|
||||||
free(sc->sc_events, M_DEVBUF);
|
free(sc->sc_events, M_DEVBUF);
|
||||||
free(sc->sc_irq_polarity, M_DEVBUF);
|
if (sc->sc_irq_polarity)
|
||||||
free(sc->sc_irq_trigger, M_DEVBUF);
|
free(sc->sc_irq_polarity, M_DEVBUF);
|
||||||
|
if (sc->sc_irq_trigger)
|
||||||
|
free(sc->sc_irq_trigger, M_DEVBUF);
|
||||||
/* Release the memory and IRQ resources. */
|
/* Release the memory and IRQ resources. */
|
||||||
ti_gpio_detach_intr(dev);
|
ti_gpio_detach_intr(dev);
|
||||||
bus_release_resources(dev, ti_gpio_irq_spec, sc->sc_irq_res);
|
bus_release_resources(dev, ti_gpio_irq_spec, sc->sc_irq_res);
|
||||||
bus_release_resources(dev, ti_gpio_mem_spec, sc->sc_mem_res);
|
bus_release_resources(dev, ti_gpio_mem_spec, sc->sc_mem_res);
|
||||||
|
|
||||||
TI_GPIO_LOCK_DESTROY(sc);
|
TI_GPIO_LOCK_DESTROY(sc);
|
||||||
|
|
||||||
return (0);
|
return (0);
|
||||||
|
@ -258,6 +258,7 @@ ti_pruss_mmap(struct cdev *cdev, vm_ooffset_t offset, vm_paddr_t *paddr,
|
|||||||
if (offset > rman_get_size(sc->sc_mem_res))
|
if (offset > rman_get_size(sc->sc_mem_res))
|
||||||
return (-1);
|
return (-1);
|
||||||
*paddr = rman_get_start(sc->sc_mem_res) + offset;
|
*paddr = rman_get_start(sc->sc_mem_res) + offset;
|
||||||
|
*memattr = VM_MEMATTR_UNCACHEABLE;
|
||||||
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
@ -175,7 +175,33 @@ __elfN(loadfile_raw)(char *filename, u_int64_t dest,
|
|||||||
* Check to see what sort of module we are.
|
* Check to see what sort of module we are.
|
||||||
*/
|
*/
|
||||||
kfp = file_findfile(NULL, __elfN(kerneltype));
|
kfp = file_findfile(NULL, __elfN(kerneltype));
|
||||||
if (ehdr->e_type == ET_DYN) {
|
#ifdef __powerpc__
|
||||||
|
/*
|
||||||
|
* Kernels can be ET_DYN, so just assume the first loaded object is the
|
||||||
|
* kernel. This assumption will be checked later.
|
||||||
|
*/
|
||||||
|
if (kfp == NULL)
|
||||||
|
ef.kernel = 1;
|
||||||
|
#endif
|
||||||
|
if (ef.kernel || ehdr->e_type == ET_EXEC) {
|
||||||
|
/* Looks like a kernel */
|
||||||
|
if (kfp != NULL) {
|
||||||
|
printf("elf" __XSTRING(__ELF_WORD_SIZE) "_loadfile: kernel already loaded\n");
|
||||||
|
err = EPERM;
|
||||||
|
goto oerr;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* Calculate destination address based on kernel entrypoint
|
||||||
|
*/
|
||||||
|
dest = (ehdr->e_entry & ~PAGE_MASK);
|
||||||
|
if (dest == 0) {
|
||||||
|
printf("elf" __XSTRING(__ELF_WORD_SIZE) "_loadfile: not a kernel (maybe static binary?)\n");
|
||||||
|
err = EPERM;
|
||||||
|
goto oerr;
|
||||||
|
}
|
||||||
|
ef.kernel = 1;
|
||||||
|
|
||||||
|
} else if (ehdr->e_type == ET_DYN) {
|
||||||
/* Looks like a kld module */
|
/* Looks like a kld module */
|
||||||
if (multiboot != 0) {
|
if (multiboot != 0) {
|
||||||
printf("elf" __XSTRING(__ELF_WORD_SIZE) "_loadfile: can't load module as multiboot\n");
|
printf("elf" __XSTRING(__ELF_WORD_SIZE) "_loadfile: can't load module as multiboot\n");
|
||||||
@ -195,24 +221,6 @@ __elfN(loadfile_raw)(char *filename, u_int64_t dest,
|
|||||||
/* Looks OK, got ahead */
|
/* Looks OK, got ahead */
|
||||||
ef.kernel = 0;
|
ef.kernel = 0;
|
||||||
|
|
||||||
} else if (ehdr->e_type == ET_EXEC) {
|
|
||||||
/* Looks like a kernel */
|
|
||||||
if (kfp != NULL) {
|
|
||||||
printf("elf" __XSTRING(__ELF_WORD_SIZE) "_loadfile: kernel already loaded\n");
|
|
||||||
err = EPERM;
|
|
||||||
goto oerr;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* Calculate destination address based on kernel entrypoint
|
|
||||||
*/
|
|
||||||
dest = (ehdr->e_entry & ~PAGE_MASK);
|
|
||||||
if (dest == 0) {
|
|
||||||
printf("elf" __XSTRING(__ELF_WORD_SIZE) "_loadfile: not a kernel (maybe static binary?)\n");
|
|
||||||
err = EPERM;
|
|
||||||
goto oerr;
|
|
||||||
}
|
|
||||||
ef.kernel = 1;
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
err = EFTYPE;
|
err = EFTYPE;
|
||||||
goto oerr;
|
goto oerr;
|
||||||
|
@ -323,6 +323,29 @@ smbios_parse_table(const caddr_t addr)
|
|||||||
return (cp + 2);
|
return (cp + 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static caddr_t
|
||||||
|
smbios_find_struct(int type)
|
||||||
|
{
|
||||||
|
caddr_t dmi;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (smbios.addr == NULL)
|
||||||
|
return (NULL);
|
||||||
|
|
||||||
|
for (dmi = smbios.addr, i = 0;
|
||||||
|
dmi < smbios.addr + smbios.length && i < smbios.count; i++) {
|
||||||
|
if (SMBIOS_GET8(dmi, 0) == type)
|
||||||
|
return dmi;
|
||||||
|
/* Find structure terminator. */
|
||||||
|
dmi = SMBIOS_GETSTR(dmi);
|
||||||
|
while (SMBIOS_GET16(dmi, 0) != 0)
|
||||||
|
dmi++;
|
||||||
|
dmi += 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (NULL);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
smbios_probe(void)
|
smbios_probe(void)
|
||||||
{
|
{
|
||||||
@ -368,29 +391,6 @@ smbios_probe(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static caddr_t
|
|
||||||
smbios_find_struct(int type)
|
|
||||||
{
|
|
||||||
caddr_t dmi;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (smbios.addr == NULL)
|
|
||||||
return (NULL);
|
|
||||||
|
|
||||||
for (dmi = smbios.addr, i = 0;
|
|
||||||
dmi < smbios.addr + smbios.length && i < smbios.count; i++) {
|
|
||||||
if (SMBIOS_GET8(dmi, 0) == type)
|
|
||||||
return dmi;
|
|
||||||
/* Find structure terminator. */
|
|
||||||
dmi = SMBIOS_GETSTR(dmi);
|
|
||||||
while (SMBIOS_GET16(dmi, 0) != 0)
|
|
||||||
dmi++;
|
|
||||||
dmi += 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
smbios_detect(void)
|
smbios_detect(void)
|
||||||
{
|
{
|
||||||
|
@ -68,6 +68,7 @@ __FBSDID("$FreeBSD$");
|
|||||||
#include <cam/ctl/ctl_private.h>
|
#include <cam/ctl/ctl_private.h>
|
||||||
|
|
||||||
#include <dev/iscsi/icl.h>
|
#include <dev/iscsi/icl.h>
|
||||||
|
#include <dev/iscsi/icl_wrappers.h>
|
||||||
#include <dev/iscsi/iscsi_proto.h>
|
#include <dev/iscsi/iscsi_proto.h>
|
||||||
#include <cam/ctl/ctl_frontend_iscsi.h>
|
#include <cam/ctl/ctl_frontend_iscsi.h>
|
||||||
|
|
||||||
@ -1241,7 +1242,7 @@ cfiscsi_session_new(struct cfiscsi_softc *softc)
|
|||||||
cv_init(&cs->cs_login_cv, "cfiscsi_login");
|
cv_init(&cs->cs_login_cv, "cfiscsi_login");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
cs->cs_conn = icl_conn_new("cfiscsi", &cs->cs_lock);
|
cs->cs_conn = icl_new_conn(NULL, "cfiscsi", &cs->cs_lock);
|
||||||
cs->cs_conn->ic_receive = cfiscsi_receive_callback;
|
cs->cs_conn->ic_receive = cfiscsi_receive_callback;
|
||||||
cs->cs_conn->ic_error = cfiscsi_error_callback;
|
cs->cs_conn->ic_error = cfiscsi_error_callback;
|
||||||
cs->cs_conn->ic_prv0 = cs;
|
cs->cs_conn->ic_prv0 = cs;
|
||||||
@ -2013,6 +2014,7 @@ cfiscsi_ioctl_port_create(struct ctl_req *req)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
port = &ct->ct_port;
|
port = &ct->ct_port;
|
||||||
|
// WAT
|
||||||
if (ct->ct_state == CFISCSI_TARGET_STATE_DYING)
|
if (ct->ct_state == CFISCSI_TARGET_STATE_DYING)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
|
@ -1521,6 +1521,7 @@ ipw_monitor.fw optional ipwmonitorfw | ipwfw \
|
|||||||
clean "ipw_monitor.fw"
|
clean "ipw_monitor.fw"
|
||||||
dev/iscsi/icl.c optional iscsi | ctl
|
dev/iscsi/icl.c optional iscsi | ctl
|
||||||
dev/iscsi/icl_proxy.c optional iscsi | ctl
|
dev/iscsi/icl_proxy.c optional iscsi | ctl
|
||||||
|
dev/iscsi/icl_soft.c optional iscsi | ctl
|
||||||
dev/iscsi/iscsi.c optional iscsi scbus
|
dev/iscsi/iscsi.c optional iscsi scbus
|
||||||
dev/iscsi_initiator/iscsi.c optional iscsi_initiator scbus
|
dev/iscsi_initiator/iscsi.c optional iscsi_initiator scbus
|
||||||
dev/iscsi_initiator/iscsi_subr.c optional iscsi_initiator scbus
|
dev/iscsi_initiator/iscsi_subr.c optional iscsi_initiator scbus
|
||||||
|
@ -6995,7 +6995,7 @@ static void ivb_pch_pwm_override(struct drm_device *dev)
|
|||||||
*/
|
*/
|
||||||
I915_WRITE(BLC_PWM_CPU_CTL2, PWM_ENABLE);
|
I915_WRITE(BLC_PWM_CPU_CTL2, PWM_ENABLE);
|
||||||
I915_WRITE(BLC_PWM_CPU_CTL, 0);
|
I915_WRITE(BLC_PWM_CPU_CTL, 0);
|
||||||
I915_WRITE(BLC_PWM_PCH_CTL1, PWM_ENABLE | (1<<30));
|
I915_WRITE(BLC_PWM_PCH_CTL1, PWM_ENABLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void intel_modeset_init_hw(struct drm_device *dev)
|
void intel_modeset_init_hw(struct drm_device *dev)
|
||||||
|
1437
sys/dev/iscsi/icl.c
1437
sys/dev/iscsi/icl.c
File diff suppressed because it is too large
Load Diff
@ -37,7 +37,32 @@
|
|||||||
* and receive iSCSI PDUs.
|
* and receive iSCSI PDUs.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/kobj.h>
|
||||||
|
#include <sys/condvar.h>
|
||||||
|
#include <sys/sysctl.h>
|
||||||
|
|
||||||
|
SYSCTL_DECL(_kern_icl);
|
||||||
|
|
||||||
|
extern int icl_debug;
|
||||||
|
|
||||||
|
#define ICL_DEBUG(X, ...) \
|
||||||
|
do { \
|
||||||
|
if (icl_debug > 1) \
|
||||||
|
printf("%s: " X "\n", __func__, ## __VA_ARGS__);\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define ICL_WARN(X, ...) \
|
||||||
|
do { \
|
||||||
|
if (icl_debug > 0) { \
|
||||||
|
printf("WARNING: %s: " X "\n", \
|
||||||
|
__func__, ## __VA_ARGS__); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
struct icl_conn;
|
struct icl_conn;
|
||||||
|
struct ccb_scsiio;
|
||||||
|
union ctl_io;
|
||||||
|
|
||||||
struct icl_pdu {
|
struct icl_pdu {
|
||||||
STAILQ_ENTRY(icl_pdu) ip_next;
|
STAILQ_ENTRY(icl_pdu) ip_next;
|
||||||
@ -57,13 +82,6 @@ struct icl_pdu {
|
|||||||
uint32_t ip_prv2;
|
uint32_t ip_prv2;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct icl_pdu *icl_pdu_new(struct icl_conn *ic, int flags);
|
|
||||||
size_t icl_pdu_data_segment_length(const struct icl_pdu *ip);
|
|
||||||
int icl_pdu_append_data(struct icl_pdu *ip, const void *addr, size_t len, int flags);
|
|
||||||
void icl_pdu_get_data(struct icl_pdu *ip, size_t off, void *addr, size_t len);
|
|
||||||
void icl_pdu_queue(struct icl_pdu *ip);
|
|
||||||
void icl_pdu_free(struct icl_pdu *ip);
|
|
||||||
|
|
||||||
#define ICL_CONN_STATE_INVALID 0
|
#define ICL_CONN_STATE_INVALID 0
|
||||||
#define ICL_CONN_STATE_BHS 1
|
#define ICL_CONN_STATE_BHS 1
|
||||||
#define ICL_CONN_STATE_AHS 2
|
#define ICL_CONN_STATE_AHS 2
|
||||||
@ -74,6 +92,7 @@ void icl_pdu_free(struct icl_pdu *ip);
|
|||||||
#define ICL_MAX_DATA_SEGMENT_LENGTH (128 * 1024)
|
#define ICL_MAX_DATA_SEGMENT_LENGTH (128 * 1024)
|
||||||
|
|
||||||
struct icl_conn {
|
struct icl_conn {
|
||||||
|
KOBJ_FIELDS;
|
||||||
struct mtx *ic_lock;
|
struct mtx *ic_lock;
|
||||||
struct socket *ic_socket;
|
struct socket *ic_socket;
|
||||||
#ifdef DIAGNOSTIC
|
#ifdef DIAGNOSTIC
|
||||||
@ -104,11 +123,14 @@ struct icl_conn {
|
|||||||
void *ic_prv0;
|
void *ic_prv0;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct icl_conn *icl_conn_new(const char *name, struct mtx *lock);
|
struct icl_conn *icl_new_conn(const char *offload, const char *name,
|
||||||
void icl_conn_free(struct icl_conn *ic);
|
struct mtx *lock);
|
||||||
int icl_conn_handoff(struct icl_conn *ic, int fd);
|
int icl_limits(const char *offload, size_t *limitp);
|
||||||
void icl_conn_close(struct icl_conn *ic);
|
|
||||||
bool icl_conn_connected(struct icl_conn *ic);
|
int icl_register(const char *offload, int priority,
|
||||||
|
int (*limits)(size_t *),
|
||||||
|
struct icl_conn *(*new_conn)(const char *, struct mtx *));
|
||||||
|
int icl_unregister(const char *offload);
|
||||||
|
|
||||||
#ifdef ICL_KERNEL_PROXY
|
#ifdef ICL_KERNEL_PROXY
|
||||||
|
|
||||||
|
87
sys/dev/iscsi/icl_conn_if.m
Normal file
87
sys/dev/iscsi/icl_conn_if.m
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
#-
|
||||||
|
# Copyright (c) 2014 The FreeBSD Foundation
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# This software was developed by Edward Tomasz Napierala under sponsorship
|
||||||
|
# from the FreeBSD Foundation.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions
|
||||||
|
# are met:
|
||||||
|
# 1. Redistributions of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
# 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
|
# documentation and/or other materials provided with the distribution.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||||
|
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
# SUCH DAMAGE.
|
||||||
|
#
|
||||||
|
# $FreeBSD$
|
||||||
|
#
|
||||||
|
|
||||||
|
#include <dev/iscsi/icl.h>
|
||||||
|
|
||||||
|
INTERFACE icl_conn;
|
||||||
|
|
||||||
|
METHOD size_t pdu_data_segment_length {
|
||||||
|
struct icl_conn *_ic;
|
||||||
|
const struct icl_pdu *_ip;
|
||||||
|
};
|
||||||
|
|
||||||
|
METHOD int pdu_append_data {
|
||||||
|
struct icl_conn *_ic;
|
||||||
|
struct icl_pdu *_ip;
|
||||||
|
const void *_addr;
|
||||||
|
size_t _len;
|
||||||
|
int _flags;
|
||||||
|
};
|
||||||
|
|
||||||
|
METHOD void pdu_get_data {
|
||||||
|
struct icl_conn *_ic;
|
||||||
|
struct icl_pdu *_ip;
|
||||||
|
size_t _off;
|
||||||
|
void *_addr;
|
||||||
|
size_t _len;
|
||||||
|
};
|
||||||
|
|
||||||
|
METHOD void pdu_queue {
|
||||||
|
struct icl_conn *_ic;
|
||||||
|
struct icl_pdu *_ip;
|
||||||
|
};
|
||||||
|
|
||||||
|
METHOD void pdu_free {
|
||||||
|
struct icl_conn *_ic;
|
||||||
|
struct icl_pdu *_ip;
|
||||||
|
};
|
||||||
|
|
||||||
|
METHOD struct icl_pdu * new_pdu {
|
||||||
|
struct icl_conn *_ic;
|
||||||
|
int _flags;
|
||||||
|
};
|
||||||
|
|
||||||
|
METHOD void free {
|
||||||
|
struct icl_conn *_ic;
|
||||||
|
};
|
||||||
|
|
||||||
|
METHOD int handoff {
|
||||||
|
struct icl_conn *_ic;
|
||||||
|
int _fd;
|
||||||
|
};
|
||||||
|
|
||||||
|
METHOD void close {
|
||||||
|
struct icl_conn *_ic;
|
||||||
|
};
|
||||||
|
|
||||||
|
METHOD bool connected {
|
||||||
|
struct icl_conn *_ic;
|
||||||
|
};
|
1537
sys/dev/iscsi/icl_soft.c
Normal file
1537
sys/dev/iscsi/icl_soft.c
Normal file
File diff suppressed because it is too large
Load Diff
116
sys/dev/iscsi/icl_wrappers.h
Normal file
116
sys/dev/iscsi/icl_wrappers.h
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
/*-
|
||||||
|
* Copyright (c) 2014 The FreeBSD Foundation
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This software was developed by Edward Tomasz Napierala under sponsorship
|
||||||
|
* from the FreeBSD Foundation.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* $FreeBSD$
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is used to provide the initiator and target with a prettier
|
||||||
|
* interface. It must not be included by ICL modules, such as icl_soft.c.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef ICL_WRAPPERS_H
|
||||||
|
#define ICL_WRAPPERS_H
|
||||||
|
|
||||||
|
#include <sys/kobj.h>
|
||||||
|
#include <sys/condvar.h>
|
||||||
|
|
||||||
|
#include <dev/iscsi/icl.h>
|
||||||
|
#include <icl_conn_if.h>
|
||||||
|
|
||||||
|
static inline struct icl_pdu *
|
||||||
|
icl_pdu_new(struct icl_conn *ic, int flags)
|
||||||
|
{
|
||||||
|
|
||||||
|
return (ICL_CONN_NEW_PDU(ic, flags));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline size_t
|
||||||
|
icl_pdu_data_segment_length(const struct icl_pdu *ip)
|
||||||
|
{
|
||||||
|
|
||||||
|
return (ICL_CONN_PDU_DATA_SEGMENT_LENGTH(ip->ip_conn, ip));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
icl_pdu_append_data(struct icl_pdu *ip, const void *addr, size_t len, int flags)
|
||||||
|
{
|
||||||
|
|
||||||
|
return (ICL_CONN_PDU_APPEND_DATA(ip->ip_conn, ip, addr, len, flags));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
icl_pdu_get_data(struct icl_pdu *ip, size_t off, void *addr, size_t len)
|
||||||
|
{
|
||||||
|
|
||||||
|
ICL_CONN_PDU_GET_DATA(ip->ip_conn, ip, off, addr, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
icl_pdu_queue(struct icl_pdu *ip)
|
||||||
|
{
|
||||||
|
|
||||||
|
ICL_CONN_PDU_QUEUE(ip->ip_conn, ip);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
icl_pdu_free(struct icl_pdu *ip)
|
||||||
|
{
|
||||||
|
|
||||||
|
ICL_CONN_PDU_FREE(ip->ip_conn, ip);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
icl_conn_free(struct icl_conn *ic)
|
||||||
|
{
|
||||||
|
|
||||||
|
ICL_CONN_FREE(ic);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
icl_conn_handoff(struct icl_conn *ic, int fd)
|
||||||
|
{
|
||||||
|
|
||||||
|
return (ICL_CONN_HANDOFF(ic, fd));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
icl_conn_close(struct icl_conn *ic)
|
||||||
|
{
|
||||||
|
|
||||||
|
ICL_CONN_CLOSE(ic);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool
|
||||||
|
icl_conn_connected(struct icl_conn *ic)
|
||||||
|
{
|
||||||
|
|
||||||
|
return (ICL_CONN_CONNECTED(ic));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* !ICL_WRAPPERS_H */
|
@ -60,6 +60,7 @@ __FBSDID("$FreeBSD$");
|
|||||||
#include <cam/scsi/scsi_message.h>
|
#include <cam/scsi/scsi_message.h>
|
||||||
|
|
||||||
#include <dev/iscsi/icl.h>
|
#include <dev/iscsi/icl.h>
|
||||||
|
#include <dev/iscsi/icl_wrappers.h>
|
||||||
#include <dev/iscsi/iscsi_ioctl.h>
|
#include <dev/iscsi/iscsi_ioctl.h>
|
||||||
#include <dev/iscsi/iscsi_proto.h>
|
#include <dev/iscsi/iscsi_proto.h>
|
||||||
#include <dev/iscsi/iscsi.h>
|
#include <dev/iscsi/iscsi.h>
|
||||||
@ -1730,7 +1731,7 @@ iscsi_ioctl_session_add(struct iscsi_softc *sc, struct iscsi_session_add *isa)
|
|||||||
return (EBUSY);
|
return (EBUSY);
|
||||||
}
|
}
|
||||||
|
|
||||||
is->is_conn = icl_conn_new("iscsi", &is->is_lock);
|
is->is_conn = icl_new_conn(NULL, "iscsi", &is->is_lock);
|
||||||
is->is_conn->ic_receive = iscsi_receive_callback;
|
is->is_conn->ic_receive = iscsi_receive_callback;
|
||||||
is->is_conn->ic_error = iscsi_error_callback;
|
is->is_conn->ic_error = iscsi_error_callback;
|
||||||
is->is_conn->ic_prv0 = is;
|
is->is_conn->ic_prv0 = is;
|
||||||
|
@ -734,7 +734,7 @@ uhid_attach(device_t dev)
|
|||||||
if (uaa->info.idProduct == USB_PRODUCT_WACOM_GRAPHIRE) {
|
if (uaa->info.idProduct == USB_PRODUCT_WACOM_GRAPHIRE) {
|
||||||
|
|
||||||
sc->sc_repdesc_size = sizeof(uhid_graphire_report_descr);
|
sc->sc_repdesc_size = sizeof(uhid_graphire_report_descr);
|
||||||
sc->sc_repdesc_ptr = (void *)&uhid_graphire_report_descr;
|
sc->sc_repdesc_ptr = __DECONST(void *, &uhid_graphire_report_descr);
|
||||||
sc->sc_flags |= UHID_FLAG_STATIC_DESC;
|
sc->sc_flags |= UHID_FLAG_STATIC_DESC;
|
||||||
|
|
||||||
} else if (uaa->info.idProduct == USB_PRODUCT_WACOM_GRAPHIRE3_4X5) {
|
} else if (uaa->info.idProduct == USB_PRODUCT_WACOM_GRAPHIRE3_4X5) {
|
||||||
@ -755,7 +755,7 @@ uhid_attach(device_t dev)
|
|||||||
usbd_errstr(error));
|
usbd_errstr(error));
|
||||||
}
|
}
|
||||||
sc->sc_repdesc_size = sizeof(uhid_graphire3_4x5_report_descr);
|
sc->sc_repdesc_size = sizeof(uhid_graphire3_4x5_report_descr);
|
||||||
sc->sc_repdesc_ptr = (void *)&uhid_graphire3_4x5_report_descr;
|
sc->sc_repdesc_ptr = __DECONST(void *, &uhid_graphire3_4x5_report_descr);
|
||||||
sc->sc_flags |= UHID_FLAG_STATIC_DESC;
|
sc->sc_flags |= UHID_FLAG_STATIC_DESC;
|
||||||
}
|
}
|
||||||
} else if ((uaa->info.bInterfaceClass == UICLASS_VENDOR) &&
|
} else if ((uaa->info.bInterfaceClass == UICLASS_VENDOR) &&
|
||||||
@ -775,7 +775,7 @@ uhid_attach(device_t dev)
|
|||||||
}
|
}
|
||||||
/* the Xbox 360 gamepad has no report descriptor */
|
/* the Xbox 360 gamepad has no report descriptor */
|
||||||
sc->sc_repdesc_size = sizeof(uhid_xb360gp_report_descr);
|
sc->sc_repdesc_size = sizeof(uhid_xb360gp_report_descr);
|
||||||
sc->sc_repdesc_ptr = (void *)&uhid_xb360gp_report_descr;
|
sc->sc_repdesc_ptr = __DECONST(void *, &uhid_xb360gp_report_descr);
|
||||||
sc->sc_flags |= UHID_FLAG_STATIC_DESC;
|
sc->sc_flags |= UHID_FLAG_STATIC_DESC;
|
||||||
}
|
}
|
||||||
if (sc->sc_repdesc_ptr == NULL) {
|
if (sc->sc_repdesc_ptr == NULL) {
|
||||||
|
@ -1434,7 +1434,8 @@ tmpfs_check_mtime(struct vnode *vp)
|
|||||||
if ((obj->flags & OBJ_TMPFS_DIRTY) != 0) {
|
if ((obj->flags & OBJ_TMPFS_DIRTY) != 0) {
|
||||||
obj->flags &= ~OBJ_TMPFS_DIRTY;
|
obj->flags &= ~OBJ_TMPFS_DIRTY;
|
||||||
node = VP_TO_TMPFS_NODE(vp);
|
node = VP_TO_TMPFS_NODE(vp);
|
||||||
node->tn_status |= TMPFS_NODE_MODIFIED;
|
node->tn_status |= TMPFS_NODE_MODIFIED |
|
||||||
|
TMPFS_NODE_CHANGED;
|
||||||
}
|
}
|
||||||
VM_OBJECT_WUNLOCK(obj);
|
VM_OBJECT_WUNLOCK(obj);
|
||||||
}
|
}
|
||||||
|
@ -453,7 +453,6 @@ tmpfs_write(struct vop_write_args *v)
|
|||||||
struct tmpfs_node *node;
|
struct tmpfs_node *node;
|
||||||
off_t oldsize;
|
off_t oldsize;
|
||||||
int error, ioflag;
|
int error, ioflag;
|
||||||
boolean_t extended;
|
|
||||||
|
|
||||||
vp = v->a_vp;
|
vp = v->a_vp;
|
||||||
uio = v->a_uio;
|
uio = v->a_uio;
|
||||||
@ -473,8 +472,7 @@ tmpfs_write(struct vop_write_args *v)
|
|||||||
return (EFBIG);
|
return (EFBIG);
|
||||||
if (vn_rlimit_fsize(vp, uio, uio->uio_td))
|
if (vn_rlimit_fsize(vp, uio, uio->uio_td))
|
||||||
return (EFBIG);
|
return (EFBIG);
|
||||||
extended = uio->uio_offset + uio->uio_resid > node->tn_size;
|
if (uio->uio_offset + uio->uio_resid > node->tn_size) {
|
||||||
if (extended) {
|
|
||||||
error = tmpfs_reg_resize(vp, uio->uio_offset + uio->uio_resid,
|
error = tmpfs_reg_resize(vp, uio->uio_offset + uio->uio_resid,
|
||||||
FALSE);
|
FALSE);
|
||||||
if (error != 0)
|
if (error != 0)
|
||||||
@ -483,7 +481,7 @@ tmpfs_write(struct vop_write_args *v)
|
|||||||
|
|
||||||
error = uiomove_object(node->tn_reg.tn_aobj, node->tn_size, uio);
|
error = uiomove_object(node->tn_reg.tn_aobj, node->tn_size, uio);
|
||||||
node->tn_status |= TMPFS_NODE_ACCESSED | TMPFS_NODE_MODIFIED |
|
node->tn_status |= TMPFS_NODE_ACCESSED | TMPFS_NODE_MODIFIED |
|
||||||
(extended ? TMPFS_NODE_CHANGED : 0);
|
TMPFS_NODE_CHANGED;
|
||||||
if (node->tn_mode & (S_ISUID | S_ISGID)) {
|
if (node->tn_mode & (S_ISUID | S_ISGID)) {
|
||||||
if (priv_check_cred(v->a_cred, PRIV_VFS_RETAINSUGID, 0))
|
if (priv_check_cred(v->a_cred, PRIV_VFS_RETAINSUGID, 0))
|
||||||
node->tn_mode &= ~(S_ISUID | S_ISGID);
|
node->tn_mode &= ~(S_ISUID | S_ISGID);
|
||||||
|
@ -1302,6 +1302,47 @@ umtx_pi_adjust_thread(struct umtx_pi *pi, struct thread *td)
|
|||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct umtx_pi *
|
||||||
|
umtx_pi_next(struct umtx_pi *pi)
|
||||||
|
{
|
||||||
|
struct umtx_q *uq_owner;
|
||||||
|
|
||||||
|
if (pi->pi_owner == NULL)
|
||||||
|
return (NULL);
|
||||||
|
uq_owner = pi->pi_owner->td_umtxq;
|
||||||
|
if (uq_owner == NULL)
|
||||||
|
return (NULL);
|
||||||
|
return (uq_owner->uq_pi_blocked);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Floyd's Cycle-Finding Algorithm.
|
||||||
|
*/
|
||||||
|
static bool
|
||||||
|
umtx_pi_check_loop(struct umtx_pi *pi)
|
||||||
|
{
|
||||||
|
struct umtx_pi *pi1; /* fast iterator */
|
||||||
|
|
||||||
|
mtx_assert(&umtx_lock, MA_OWNED);
|
||||||
|
if (pi == NULL)
|
||||||
|
return (false);
|
||||||
|
pi1 = pi;
|
||||||
|
for (;;) {
|
||||||
|
pi = umtx_pi_next(pi);
|
||||||
|
if (pi == NULL)
|
||||||
|
break;
|
||||||
|
pi1 = umtx_pi_next(pi1);
|
||||||
|
if (pi1 == NULL)
|
||||||
|
break;
|
||||||
|
pi1 = umtx_pi_next(pi1);
|
||||||
|
if (pi1 == NULL)
|
||||||
|
break;
|
||||||
|
if (pi == pi1)
|
||||||
|
return (true);
|
||||||
|
}
|
||||||
|
return (false);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Propagate priority when a thread is blocked on POSIX
|
* Propagate priority when a thread is blocked on POSIX
|
||||||
* PI mutex.
|
* PI mutex.
|
||||||
@ -1319,6 +1360,8 @@ umtx_propagate_priority(struct thread *td)
|
|||||||
pi = uq->uq_pi_blocked;
|
pi = uq->uq_pi_blocked;
|
||||||
if (pi == NULL)
|
if (pi == NULL)
|
||||||
return;
|
return;
|
||||||
|
if (umtx_pi_check_loop(pi))
|
||||||
|
return;
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
td = pi->pi_owner;
|
td = pi->pi_owner;
|
||||||
@ -1362,6 +1405,8 @@ umtx_repropagate_priority(struct umtx_pi *pi)
|
|||||||
|
|
||||||
mtx_assert(&umtx_lock, MA_OWNED);
|
mtx_assert(&umtx_lock, MA_OWNED);
|
||||||
|
|
||||||
|
if (umtx_pi_check_loop(pi))
|
||||||
|
return;
|
||||||
while (pi != NULL && pi->pi_owner != NULL) {
|
while (pi != NULL && pi->pi_owner != NULL) {
|
||||||
pri = PRI_MAX;
|
pri = PRI_MAX;
|
||||||
uq_owner = pi->pi_owner->td_umtxq;
|
uq_owner = pi->pi_owner->td_umtxq;
|
||||||
@ -1694,6 +1739,11 @@ do_lock_pi(struct thread *td, struct umutex *m, uint32_t flags,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((owner & ~UMUTEX_CONTESTED) == id) {
|
||||||
|
error = EDEADLK;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (try != 0) {
|
if (try != 0) {
|
||||||
error = EBUSY;
|
error = EBUSY;
|
||||||
break;
|
break;
|
||||||
|
@ -341,7 +341,6 @@ static int
|
|||||||
ar71xx_gpio_attach(device_t dev)
|
ar71xx_gpio_attach(device_t dev)
|
||||||
{
|
{
|
||||||
struct ar71xx_gpio_softc *sc = device_get_softc(dev);
|
struct ar71xx_gpio_softc *sc = device_get_softc(dev);
|
||||||
int error = 0;
|
|
||||||
int i, j, maxpin;
|
int i, j, maxpin;
|
||||||
int mask, pinon;
|
int mask, pinon;
|
||||||
uint32_t oe;
|
uint32_t oe;
|
||||||
@ -358,14 +357,14 @@ ar71xx_gpio_attach(device_t dev)
|
|||||||
|
|
||||||
if (sc->gpio_mem_res == NULL) {
|
if (sc->gpio_mem_res == NULL) {
|
||||||
device_printf(dev, "couldn't map memory\n");
|
device_printf(dev, "couldn't map memory\n");
|
||||||
error = ENXIO;
|
|
||||||
ar71xx_gpio_detach(dev);
|
ar71xx_gpio_detach(dev);
|
||||||
return(error);
|
return (ENXIO);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((sc->gpio_irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ,
|
if ((sc->gpio_irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ,
|
||||||
&sc->gpio_irq_rid, RF_SHAREABLE | RF_ACTIVE)) == NULL) {
|
&sc->gpio_irq_rid, RF_SHAREABLE | RF_ACTIVE)) == NULL) {
|
||||||
device_printf(dev, "unable to allocate IRQ resource\n");
|
device_printf(dev, "unable to allocate IRQ resource\n");
|
||||||
|
ar71xx_gpio_detach(dev);
|
||||||
return (ENXIO);
|
return (ENXIO);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -373,6 +372,7 @@ ar71xx_gpio_attach(device_t dev)
|
|||||||
ar71xx_gpio_filter, ar71xx_gpio_intr, sc, &sc->gpio_ih))) {
|
ar71xx_gpio_filter, ar71xx_gpio_intr, sc, &sc->gpio_ih))) {
|
||||||
device_printf(dev,
|
device_printf(dev,
|
||||||
"WARNING: unable to register interrupt handler\n");
|
"WARNING: unable to register interrupt handler\n");
|
||||||
|
ar71xx_gpio_detach(dev);
|
||||||
return (ENXIO);
|
return (ENXIO);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -447,12 +447,16 @@ ar71xx_gpio_detach(device_t dev)
|
|||||||
KASSERT(mtx_initialized(&sc->gpio_mtx), ("gpio mutex not initialized"));
|
KASSERT(mtx_initialized(&sc->gpio_mtx), ("gpio mutex not initialized"));
|
||||||
|
|
||||||
bus_generic_detach(dev);
|
bus_generic_detach(dev);
|
||||||
|
if (sc->gpio_ih)
|
||||||
|
bus_teardown_intr(dev, sc->gpio_irq_res, sc->gpio_ih);
|
||||||
|
if (sc->gpio_irq_res)
|
||||||
|
bus_release_resource(dev, SYS_RES_IRQ, sc->gpio_irq_rid,
|
||||||
|
sc->gpio_irq_res);
|
||||||
if (sc->gpio_mem_res)
|
if (sc->gpio_mem_res)
|
||||||
bus_release_resource(dev, SYS_RES_MEMORY, sc->gpio_mem_rid,
|
bus_release_resource(dev, SYS_RES_MEMORY, sc->gpio_mem_rid,
|
||||||
sc->gpio_mem_res);
|
sc->gpio_mem_res);
|
||||||
|
if (sc->gpio_pins)
|
||||||
free(sc->gpio_pins, M_DEVBUF);
|
free(sc->gpio_pins, M_DEVBUF);
|
||||||
mtx_destroy(&sc->gpio_mtx);
|
mtx_destroy(&sc->gpio_mtx);
|
||||||
|
|
||||||
return(0);
|
return(0);
|
||||||
|
@ -57,12 +57,12 @@
|
|||||||
|
|
||||||
struct ar71xx_gpio_softc {
|
struct ar71xx_gpio_softc {
|
||||||
device_t dev;
|
device_t dev;
|
||||||
struct mtx gpio_mtx;
|
struct mtx gpio_mtx;
|
||||||
struct resource *gpio_mem_res;
|
struct resource *gpio_mem_res;
|
||||||
int gpio_mem_rid;
|
int gpio_mem_rid;
|
||||||
struct resource *gpio_irq_res;
|
struct resource *gpio_irq_res;
|
||||||
int gpio_irq_rid;
|
int gpio_irq_rid;
|
||||||
void *gpio_ih;
|
void *gpio_ih;
|
||||||
int gpio_npins;
|
int gpio_npins;
|
||||||
struct gpio_pin *gpio_pins;
|
struct gpio_pin *gpio_pins;
|
||||||
};
|
};
|
||||||
|
@ -383,6 +383,7 @@ octeon_gpio_attach(device_t dev)
|
|||||||
OCTEON_IRQ_GPIO0 + i, OCTEON_IRQ_GPIO0 + i, 1,
|
OCTEON_IRQ_GPIO0 + i, OCTEON_IRQ_GPIO0 + i, 1,
|
||||||
RF_SHAREABLE | RF_ACTIVE)) == NULL) {
|
RF_SHAREABLE | RF_ACTIVE)) == NULL) {
|
||||||
device_printf(dev, "unable to allocate IRQ resource\n");
|
device_printf(dev, "unable to allocate IRQ resource\n");
|
||||||
|
octeon_gpio_detach(dev);
|
||||||
return (ENXIO);
|
return (ENXIO);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -392,6 +393,7 @@ octeon_gpio_attach(device_t dev)
|
|||||||
&(sc->gpio_intr_cookies[i]), &sc->gpio_ih[i]))) {
|
&(sc->gpio_intr_cookies[i]), &sc->gpio_ih[i]))) {
|
||||||
device_printf(dev,
|
device_printf(dev,
|
||||||
"WARNING: unable to register interrupt handler\n");
|
"WARNING: unable to register interrupt handler\n");
|
||||||
|
octeon_gpio_detach(dev);
|
||||||
return (ENXIO);
|
return (ENXIO);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -448,11 +450,14 @@ octeon_gpio_detach(device_t dev)
|
|||||||
KASSERT(mtx_initialized(&sc->gpio_mtx), ("gpio mutex not initialized"));
|
KASSERT(mtx_initialized(&sc->gpio_mtx), ("gpio mutex not initialized"));
|
||||||
|
|
||||||
for ( i = 0; i < OCTEON_GPIO_IRQS; i++) {
|
for ( i = 0; i < OCTEON_GPIO_IRQS; i++) {
|
||||||
bus_release_resource(dev, SYS_RES_IRQ,
|
if (sc->gpio_ih[i])
|
||||||
sc->gpio_irq_rid[i], sc->gpio_irq_res[i]);
|
bus_teardown_intr(dev, sc->gpio_irq_res[i],
|
||||||
|
sc->gpio_ih[i]);
|
||||||
|
if (sc->gpio_irq_res[i])
|
||||||
|
bus_release_resource(dev, SYS_RES_IRQ,
|
||||||
|
sc->gpio_irq_rid[i], sc->gpio_irq_res[i]);
|
||||||
}
|
}
|
||||||
bus_generic_detach(dev);
|
bus_generic_detach(dev);
|
||||||
|
|
||||||
mtx_destroy(&sc->gpio_mtx);
|
mtx_destroy(&sc->gpio_mtx);
|
||||||
|
|
||||||
return(0);
|
return(0);
|
||||||
|
@ -43,11 +43,11 @@
|
|||||||
|
|
||||||
struct octeon_gpio_softc {
|
struct octeon_gpio_softc {
|
||||||
device_t dev;
|
device_t dev;
|
||||||
struct mtx gpio_mtx;
|
struct mtx gpio_mtx;
|
||||||
struct resource *gpio_irq_res[OCTEON_GPIO_IRQS];
|
struct resource *gpio_irq_res[OCTEON_GPIO_IRQS];
|
||||||
int gpio_irq_rid[OCTEON_GPIO_IRQS];
|
int gpio_irq_rid[OCTEON_GPIO_IRQS];
|
||||||
void *gpio_ih[OCTEON_GPIO_IRQS];
|
void *gpio_ih[OCTEON_GPIO_IRQS];
|
||||||
void *gpio_intr_cookies[OCTEON_GPIO_IRQS];
|
void *gpio_intr_cookies[OCTEON_GPIO_IRQS];
|
||||||
int gpio_npins;
|
int gpio_npins;
|
||||||
struct gpio_pin gpio_pins[OCTEON_GPIO_PINS];
|
struct gpio_pin gpio_pins[OCTEON_GPIO_PINS];
|
||||||
};
|
};
|
||||||
|
@ -430,7 +430,7 @@ static int
|
|||||||
rt305x_gpio_attach(device_t dev)
|
rt305x_gpio_attach(device_t dev)
|
||||||
{
|
{
|
||||||
struct rt305x_gpio_softc *sc = device_get_softc(dev);
|
struct rt305x_gpio_softc *sc = device_get_softc(dev);
|
||||||
int error = 0, i;
|
int i;
|
||||||
uint64_t avlpins = 0;
|
uint64_t avlpins = 0;
|
||||||
sc->reset_gpio = DAP1350_RESET_GPIO;
|
sc->reset_gpio = DAP1350_RESET_GPIO;
|
||||||
|
|
||||||
@ -446,14 +446,14 @@ rt305x_gpio_attach(device_t dev)
|
|||||||
|
|
||||||
if (sc->gpio_mem_res == NULL) {
|
if (sc->gpio_mem_res == NULL) {
|
||||||
device_printf(dev, "couldn't map memory\n");
|
device_printf(dev, "couldn't map memory\n");
|
||||||
error = ENXIO;
|
|
||||||
rt305x_gpio_detach(dev);
|
rt305x_gpio_detach(dev);
|
||||||
return(error);
|
return (ENXIO);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((sc->gpio_irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ,
|
if ((sc->gpio_irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ,
|
||||||
&sc->gpio_irq_rid, RF_SHAREABLE | RF_ACTIVE)) == NULL) {
|
&sc->gpio_irq_rid, RF_SHAREABLE | RF_ACTIVE)) == NULL) {
|
||||||
device_printf(dev, "unable to allocate IRQ resource\n");
|
device_printf(dev, "unable to allocate IRQ resource\n");
|
||||||
|
rt305x_gpio_detach(dev);
|
||||||
return (ENXIO);
|
return (ENXIO);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -462,6 +462,7 @@ rt305x_gpio_attach(device_t dev)
|
|||||||
rt305x_gpio_intr, NULL, sc, &sc->gpio_ih))) {
|
rt305x_gpio_intr, NULL, sc, &sc->gpio_ih))) {
|
||||||
device_printf(dev,
|
device_printf(dev,
|
||||||
"WARNING: unable to register interrupt handler\n");
|
"WARNING: unable to register interrupt handler\n");
|
||||||
|
rt305x_gpio_detach(dev);
|
||||||
return (ENXIO);
|
return (ENXIO);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -515,11 +516,14 @@ rt305x_gpio_detach(device_t dev)
|
|||||||
KASSERT(mtx_initialized(&sc->gpio_mtx), ("gpio mutex not initialized"));
|
KASSERT(mtx_initialized(&sc->gpio_mtx), ("gpio mutex not initialized"));
|
||||||
|
|
||||||
bus_generic_detach(dev);
|
bus_generic_detach(dev);
|
||||||
|
if (sc->gpio_ih)
|
||||||
|
bus_teardown_intr(dev, sc->gpio_irq_res, sc->gpio_ih);
|
||||||
|
if (sc->gpio_irq_res)
|
||||||
|
bus_release_resource(dev, SYS_RES_IRQ, sc->gpio_irq_rid,
|
||||||
|
sc->gpio_irq_res);
|
||||||
if (sc->gpio_mem_res)
|
if (sc->gpio_mem_res)
|
||||||
bus_release_resource(dev, SYS_RES_MEMORY, sc->gpio_mem_rid,
|
bus_release_resource(dev, SYS_RES_MEMORY, sc->gpio_mem_rid,
|
||||||
sc->gpio_mem_res);
|
sc->gpio_mem_res);
|
||||||
|
|
||||||
mtx_destroy(&sc->gpio_mtx);
|
mtx_destroy(&sc->gpio_mtx);
|
||||||
|
|
||||||
return(0);
|
return(0);
|
||||||
|
@ -30,12 +30,12 @@
|
|||||||
|
|
||||||
struct rt305x_gpio_softc {
|
struct rt305x_gpio_softc {
|
||||||
device_t dev;
|
device_t dev;
|
||||||
struct mtx gpio_mtx;
|
struct mtx gpio_mtx;
|
||||||
struct resource *gpio_mem_res;
|
struct resource *gpio_mem_res;
|
||||||
int gpio_mem_rid;
|
int gpio_mem_rid;
|
||||||
struct resource *gpio_irq_res;
|
struct resource *gpio_irq_res;
|
||||||
int gpio_irq_rid;
|
int gpio_irq_rid;
|
||||||
void *gpio_ih;
|
void *gpio_ih;
|
||||||
int gpio_npins;
|
int gpio_npins;
|
||||||
struct gpio_pin gpio_pins[NGPIO];
|
struct gpio_pin gpio_pins[NGPIO];
|
||||||
int reset_gpio;
|
int reset_gpio;
|
||||||
|
@ -22,8 +22,11 @@ SRCS+= scsi_ctl.c
|
|||||||
SRCS+= bus_if.h
|
SRCS+= bus_if.h
|
||||||
SRCS+= device_if.h
|
SRCS+= device_if.h
|
||||||
SRCS+= vnode_if.h
|
SRCS+= vnode_if.h
|
||||||
|
SRCS+= icl_conn_if.h
|
||||||
SRCS+= opt_cam.h
|
SRCS+= opt_cam.h
|
||||||
|
|
||||||
#CFLAGS+=-DICL_KERNEL_PROXY
|
#CFLAGS+=-DICL_KERNEL_PROXY
|
||||||
|
|
||||||
|
MFILES= kern/bus_if.m kern/device_if.m dev/iscsi/icl_conn_if.m
|
||||||
|
|
||||||
.include <bsd.kmod.mk>
|
.include <bsd.kmod.mk>
|
||||||
|
@ -6,10 +6,15 @@ KMOD= iscsi
|
|||||||
SRCS= iscsi.c
|
SRCS= iscsi.c
|
||||||
SRCS+= icl.c
|
SRCS+= icl.c
|
||||||
SRCS+= icl_proxy.c
|
SRCS+= icl_proxy.c
|
||||||
|
SRCS+= icl_soft.c
|
||||||
SRCS+= opt_cam.h
|
SRCS+= opt_cam.h
|
||||||
SRCS+= bus_if.h
|
SRCS+= bus_if.h
|
||||||
SRCS+= device_if.h
|
SRCS+= device_if.h
|
||||||
|
SRCS+= icl_conn_if.c
|
||||||
|
SRCS+= icl_conn_if.h
|
||||||
|
|
||||||
#CFLAGS+=-DICL_KERNEL_PROXY
|
#CFLAGS+=-DICL_KERNEL_PROXY
|
||||||
|
|
||||||
|
MFILES= kern/bus_if.m kern/device_if.m dev/iscsi/icl_conn_if.m
|
||||||
|
|
||||||
.include <bsd.kmod.mk>
|
.include <bsd.kmod.mk>
|
||||||
|
@ -752,6 +752,8 @@ extern pid_t pid_max;
|
|||||||
|
|
||||||
|
|
||||||
#define STOPEVENT(p, e, v) do { \
|
#define STOPEVENT(p, e, v) do { \
|
||||||
|
WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, NULL, \
|
||||||
|
"checking stopevent %d", (e)); \
|
||||||
if ((p)->p_stops & (e)) { \
|
if ((p)->p_stops & (e)) { \
|
||||||
PROC_LOCK(p); \
|
PROC_LOCK(p); \
|
||||||
stopevent((p), (e), (v)); \
|
stopevent((p), (e), (v)); \
|
||||||
|
Loading…
Reference in New Issue
Block a user