diff options
| author | Scott Long <scottl@FreeBSD.org> | 2004-02-28 19:14:41 +0000 |
|---|---|---|
| committer | Scott Long <scottl@FreeBSD.org> | 2004-02-28 19:14:41 +0000 |
| commit | b234a120c867ff3291e66666644af78f7a894095 (patch) | |
| tree | 9838032cf77c78cc90c2abba229573c0ab89c327 /sys/dev/ips/ips.c | |
| parent | 46a51869c20086348059fae18ac57492f2d061bf (diff) | |
Notes
Diffstat (limited to 'sys/dev/ips/ips.c')
| -rw-r--r-- | sys/dev/ips/ips.c | 42 |
1 files changed, 25 insertions, 17 deletions
diff --git a/sys/dev/ips/ips.c b/sys/dev/ips/ips.c index d735f83be97f3..20f5c310d995b 100644 --- a/sys/dev/ips/ips.c +++ b/sys/dev/ips/ips.c @@ -102,16 +102,23 @@ static void ips_cmd_dmaload(void *cmdptr, bus_dma_segment_t *segments,int segnum static __inline__ int ips_cmdqueue_free(ips_softc_t *sc) { int i, error = -1; - intrmask_t mask = splbio(); + ips_command_t *command; + intrmask_t mask; + + mask = splbio(); if(!sc->used_commands){ for(i = 0; i < sc->max_cmds; i++){ - if(!(sc->commandarray[i].command_phys_addr)) + + command = &sc->commandarray[i]; + sema_destroy(&command->cmd_sema); + + if(command->command_phys_addr == 0) continue; bus_dmamap_unload(sc->command_dmatag, - sc->commandarray[i].command_dmamap); + command->command_dmamap); bus_dmamem_free(sc->command_dmatag, - sc->commandarray[i].command_buffer, - sc->commandarray[i].command_dmamap); + command->command_buffer, + command->command_dmamap); } error = 0; sc->state |= IPS_OFFLINE; @@ -129,13 +136,10 @@ static __inline__ int ips_cmdqueue_init(ips_softc_t *sc) SLIST_INIT(&sc->free_cmd_list); STAILQ_INIT(&sc->cmd_wait_list); for(i = 0; i < sc->max_cmds; i++){ - sc->commandarray[i].id = i; - sc->commandarray[i].sc = sc; - SLIST_INSERT_HEAD(&sc->free_cmd_list, &sc->commandarray[i], - next); - } - for(i = 0; i < sc->max_cmds; i++){ command = &sc->commandarray[i]; + command->id = i; + command->sc = sc; + if(bus_dmamem_alloc(sc->command_dmatag,&command->command_buffer, BUS_DMA_NOWAIT, &command->command_dmamap)) goto error; @@ -147,12 +151,15 @@ static __inline__ int ips_cmdqueue_init(ips_softc_t *sc) command->command_buffer, command->command_dmamap); goto error; } + + sema_init(&command->cmd_sema, 0, "IPS Command Semaphore"); + SLIST_INSERT_HEAD(&sc->free_cmd_list, command, next); } sc->state &= ~IPS_OFFLINE; return 0; error: - ips_cmdqueue_free(sc); - return ENOMEM; + ips_cmdqueue_free(sc); + return ENOMEM; } static int ips_add_waiting_command(ips_softc_t *sc, int (*callback)(ips_command_t *), void *data, unsigned long flags) @@ -254,6 +261,10 @@ void ips_insert_free_cmd(ips_softc_t *sc, ips_command_t *command) { intrmask_t mask; mask = splbio(); + + if (sema_value(&command->cmd_sema) != 0) + panic("ips: command returned non-zero semaphore"); + SLIST_INSERT_HEAD(&sc->free_cmd_list, command, next); (sc->used_commands)--; splx(mask); @@ -375,6 +386,7 @@ int ips_adapter_init(ips_softc_t *sc) { int i; DEVICE_PRINTF(1,sc->dev, "initializing\n"); + if (bus_dma_tag_create( /* parent */ sc->adapter_dmatag, /* alignemnt */ 1, /* boundary */ 0, @@ -420,8 +432,6 @@ int ips_adapter_init(ips_softc_t *sc) if(sc->ips_adapter_reinit(sc, 0)) goto error; - mtx_init(&sc->cmd_mtx, "ips command mutex", NULL, MTX_DEF); - /* initialize ffdc values */ microtime(&sc->ffdc_resettime); sc->ffdc_resetcount = 1; @@ -534,8 +544,6 @@ int ips_adapter_free(ips_softc_t *sc) mask = splbio(); untimeout(ips_timeout, sc, sc->timer); splx(mask); - if (mtx_initialized(&sc->cmd_mtx)) - mtx_destroy(&sc->cmd_mtx); if(sc->sg_dmatag) bus_dma_tag_destroy(sc->sg_dmatag); |
