aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/ips/ips.c
diff options
context:
space:
mode:
authorScott Long <scottl@FreeBSD.org>2004-02-28 19:14:41 +0000
committerScott Long <scottl@FreeBSD.org>2004-02-28 19:14:41 +0000
commitb234a120c867ff3291e66666644af78f7a894095 (patch)
tree9838032cf77c78cc90c2abba229573c0ab89c327 /sys/dev/ips/ips.c
parent46a51869c20086348059fae18ac57492f2d061bf (diff)
Notes
Diffstat (limited to 'sys/dev/ips/ips.c')
-rw-r--r--sys/dev/ips/ips.c42
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);