Date: Sat, 28 Feb 2004 11:56:55 -0800 (PST) From: Robert Watson <rwatson@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 47817 for review Message-ID: <200402281956.i1SJut2Q013340@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=47817 Change 47817 by rwatson@rwatson_tislabs on 2004/02/28 11:56:32 Integrate netperf_socket forward a little more, to loop back ip_input.c formatting changes. Affected files ... .. //depot/projects/netperf_socket/sys/dev/ata/ata-all.h#3 integrate .. //depot/projects/netperf_socket/sys/dev/ata/ata-queue.c#3 integrate .. //depot/projects/netperf_socket/sys/dev/ips/ips.c#4 integrate .. //depot/projects/netperf_socket/sys/dev/ips/ips.h#2 integrate .. //depot/projects/netperf_socket/sys/dev/ips/ips_commands.c#2 integrate .. //depot/projects/netperf_socket/sys/dev/ips/ips_disk.c#3 integrate .. //depot/projects/netperf_socket/sys/dev/ips/ips_pci.c#2 integrate .. //depot/projects/netperf_socket/sys/dev/sound/pcm/channel.c#3 integrate .. //depot/projects/netperf_socket/sys/dev/sound/pcm/channel.h#3 integrate .. //depot/projects/netperf_socket/sys/dev/sound/pcm/dsp.c#3 integrate .. //depot/projects/netperf_socket/sys/dev/sound/pcm/sound.c#3 integrate .. //depot/projects/netperf_socket/sys/dev/sound/pcm/sound.h#3 integrate .. //depot/projects/netperf_socket/sys/modules/acpi/acpi/Makefile#2 integrate .. //depot/projects/netperf_socket/sys/netinet/ip_input.c#6 integrate Differences ... ==== //depot/projects/netperf_socket/sys/dev/ata/ata-all.h#3 (text+ko) ==== @@ -25,7 +25,7 @@ * (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: src/sys/dev/ata/ata-all.h,v 1.73 2004/01/29 15:03:01 sos Exp $ + * $FreeBSD: src/sys/dev/ata/ata-all.h,v 1.74 2004/02/28 17:47:27 sos Exp $ */ /* ATA register defines */ @@ -156,6 +156,28 @@ #define ATA_OP_CONTINUES 0 #define ATA_OP_FINISHED 1 +/* ATAPI request sense structure */ +struct atapi_sense { + u_int8_t error_code :7; /* current or deferred errors */ + u_int8_t valid :1; /* follows ATAPI spec */ + u_int8_t segment; /* Segment number */ + u_int8_t sense_key :4; /* sense key */ + u_int8_t reserved2_4 :1; /* reserved */ + u_int8_t ili :1; /* incorrect length indicator */ + u_int8_t eom :1; /* end of medium */ + u_int8_t filemark :1; /* filemark */ + u_int32_t cmd_info __packed; /* cmd information */ + u_int8_t sense_length; /* additional sense len (n-7) */ + u_int32_t cmd_specific_info __packed; /* additional cmd spec info */ + u_int8_t asc; /* additional sense code */ + u_int8_t ascq; /* additional sense code qual */ + u_int8_t replaceable_unit_code; /* replaceable unit code */ + u_int8_t sk_specific :7; /* sense key specific */ + u_int8_t sksv :1; /* sense key specific info OK */ + u_int8_t sk_specific1; /* sense key specific */ + u_int8_t sk_specific2; /* sense key specific */ +}; + struct ata_request { struct ata_device *device; /* ptr to device softc */ void *driver; /* driver specific */ @@ -169,6 +191,8 @@ } ata; struct { u_int8_t ccb[16]; /* ATAPI command block */ + u_int8_t sense_key; /* ATAPI request sense key */ + struct atapi_sense sense_data; /* ATAPI request sense data */ } atapi; } u; @@ -333,28 +357,6 @@ void *running; /* currently running request */ }; -/* ATAPI request sense structure */ -struct atapi_sense { - u_int8_t error_code :7; /* current or deferred errors */ - u_int8_t valid :1; /* follows ATAPI spec */ - u_int8_t segment; /* Segment number */ - u_int8_t sense_key :4; /* sense key */ - u_int8_t reserved2_4 :1; /* reserved */ - u_int8_t ili :1; /* incorrect length indicator */ - u_int8_t eom :1; /* end of medium */ - u_int8_t filemark :1; /* filemark */ - u_int32_t cmd_info __packed; /* cmd information */ - u_int8_t sense_length; /* additional sense len (n-7) */ - u_int32_t cmd_specific_info __packed; /* additional cmd spec info */ - u_int8_t asc; /* additional sense code */ - u_int8_t ascq; /* additional sense code qual */ - u_int8_t replaceable_unit_code; /* replaceable unit code */ - u_int8_t sk_specific :7; /* sense key specific */ - u_int8_t sksv :1; /* sense key specific info OK */ - u_int8_t sk_specific1; /* sense key specific */ - u_int8_t sk_specific2; /* sense key specific */ -}; - /* disk bay/enclosure related */ #define ATA_LED_OFF 0x00 #define ATA_LED_RED 0x01 ==== //depot/projects/netperf_socket/sys/dev/ata/ata-queue.c#3 (text+ko) ==== @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/dev/ata/ata-queue.c,v 1.21 2004/02/17 19:24:11 sos Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/ata/ata-queue.c,v 1.22 2004/02/28 17:47:27 sos Exp $"); #include "opt_ata.h" #include <sys/param.h> @@ -131,15 +131,14 @@ int count, int flags, int timeout) { struct ata_request *request = ata_alloc_request(); - int packet_size, error = ENOMEM; + int error = ENOMEM; if (request) { + request->device = atadev; if ((atadev->param->config & ATA_PROTO_MASK) == ATA_PROTO_ATAPI_12) - packet_size = 12; + bcopy(ccb, request->u.atapi.ccb, 12); else - packet_size = 16; - request->device = atadev; - bcopy(ccb, request->u.atapi.ccb, packet_size); + bcopy(ccb, request->u.atapi.ccb, 16); request->data = data; request->bytecount = count; request->transfersize = min(request->bytecount, 65534); @@ -332,43 +331,70 @@ if (request->result) break; - if (request->error) { - switch ((request->error & ATA_SK_MASK)) { - case ATA_SK_RECOVERED_ERROR: - ata_prtdev(request->device, "WARNING - %s recovered error\n", - ata_cmd2str(request)); - /* FALLTHROUGH */ + /* if we have a sensekey -> request sense from device */ + if (request->error & ATA_SK_MASK && + request->u.atapi.ccb[0] != ATAPI_REQUEST_SENSE) { + static u_int8_t ccb[16] = { ATAPI_REQUEST_SENSE, 0, 0, 0, + sizeof(struct atapi_sense), + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + + bcopy(ccb, request->u.atapi.ccb, 16); + request->u.atapi.sense_key = request->error; + request->data = (caddr_t)&request->u.atapi.sense_data; + request->bytecount = sizeof(struct atapi_sense); + request->transfersize = sizeof(struct atapi_sense); + request->timeout = 5; + request->flags = + ATA_R_ATAPI | ATA_R_READ | ATA_R_IMMEDIATE | ATA_R_REQUEUE; + ata_queue_request(request); + return; + } + + switch (request->u.atapi.sense_key & ATA_SK_MASK) { + case ATA_SK_RECOVERED_ERROR: + ata_prtdev(request->device, "WARNING - %s recovered error\n", + ata_cmd2str(request)); + /* FALLTHROUGH */ + + case ATA_SK_NO_SENSE: + request->result = 0; + break; - case ATA_SK_NO_SENSE: - request->result = 0; - break; + case ATA_SK_NOT_READY: + request->result = EBUSY; + break; - case ATA_SK_NOT_READY: - request->result = EBUSY; - break; + case ATA_SK_UNIT_ATTENTION: + request->device->flags |= ATA_D_MEDIA_CHANGED; + request->result = EIO; + break; - case ATA_SK_UNIT_ATTENTION: - request->device->flags |= ATA_D_MEDIA_CHANGED; - request->result = EIO; + default: + request->result = EIO; + if (request->flags & ATA_R_QUIET) break; - default: - if (!(request->flags & ATA_R_QUIET)) - ata_prtdev(request->device, - "FAILURE - %s status=%b sensekey=%s error=%b\n", - ata_cmd2str(request), - request->status, "\20\10BUSY\7READY\6DMA" - "\5DSC\4DRQ\3CORRECTABLE\2INDEX\1ERROR", - ata_skey2str((request->error & ATA_SK_MASK)>>4), - (request->error & ATA_E_MASK), - "\20\4MEDIA_CHANGE_REQUEST\3ABORTED" - "\2NO_MEDIA\1ILLEGAL_LENGTH"); - request->result = EIO; - } - if (request->error & ATA_E_MASK) - request->result = EIO; + ata_prtdev(request->device, + "FAILURE - %s %s asc=0x%02x ascq=0x%02x ", + ata_cmd2str(request), ata_skey2str( + (request->u.atapi.sense_key & ATA_SK_MASK) >> 4), + request->u.atapi.sense_data.asc, + request->u.atapi.sense_data.ascq); + if (request->u.atapi.sense_data.sksv) + printf("sks=0x%02x 0x%02x 0x%02x ", + request->u.atapi.sense_data.sk_specific, + request->u.atapi.sense_data.sk_specific1, + request->u.atapi.sense_data.sk_specific2); + printf("status=%b error=%b\n", + request->status, "\20\10BUSY\7READY\6DMA" + "\5DSC\4DRQ\3CORRECTABLE\2INDEX\1ERROR", + (request->error & ATA_E_MASK), + "\20\4MEDIA_CHANGE_REQUEST\3ABORTED" + "\2NO_MEDIA\1ILLEGAL_LENGTH"); } - break; + + if (request->error & ATA_E_MASK) + request->result = EIO; } ATA_DEBUG_RQ(request, "completed callback/wakeup"); ==== //depot/projects/netperf_socket/sys/dev/ips/ips.c#4 (text+ko) ==== @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/dev/ips/ips.c,v 1.10 2004/02/21 21:10:43 phk Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/ips/ips.c,v 1.11 2004/02/28 19:14:41 scottl Exp $"); #include <dev/ips/ips.h> #include <sys/stat.h> @@ -102,16 +102,23 @@ 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 @@ 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 @@ 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 @@ { 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 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 @@ 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 @@ 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); ==== //depot/projects/netperf_socket/sys/dev/ips/ips.h#2 (text+ko) ==== @@ -25,7 +25,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/dev/ips/ips.h,v 1.5 2003/11/27 08:37:36 mbr Exp $ + * $FreeBSD: src/sys/dev/ips/ips.h,v 1.6 2004/02/28 19:14:41 scottl Exp $ */ @@ -39,6 +39,7 @@ #include <sys/bio.h> #include <sys/malloc.h> #include <sys/mutex.h> +#include <sys/sema.h> #include <sys/time.h> #include <machine/bus_memio.h> @@ -376,6 +377,7 @@ bus_dmamap_t command_dmamap; void * command_buffer; u_int32_t command_phys_addr;/*WARNING! must be changed if 64bit addressing ever used*/ + struct sema cmd_sema; ips_cmd_status_t status; SLIST_ENTRY(ips_command) next; bus_dma_tag_t data_dmatag; @@ -427,7 +429,9 @@ void (* ips_adapter_intr)(void *sc); void (* ips_issue_cmd)(ips_command_t *command); ips_copper_queue_t * copper_queue; - struct mtx cmd_mtx; + struct mtx queue_mtx; + struct bio_queue_head queue; + }ips_softc_t; /* function defines from ips_ioctl.c */ @@ -438,7 +442,7 @@ /* function defines from ips_commands.c */ extern int ips_flush_cache(ips_softc_t *sc); -extern void ips_start_io_request(ips_softc_t *sc, struct bio *iobuf); +extern void ips_start_io_request(ips_softc_t *sc); extern int ips_get_drive_info(ips_softc_t *sc); extern int ips_get_adapter_info(ips_softc_t *sc); extern int ips_ffdc_reset(ips_softc_t *sc); ==== //depot/projects/netperf_socket/sys/dev/ips/ips_commands.c#2 (text+ko) ==== @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/dev/ips/ips_commands.c,v 1.8 2004/01/01 10:22:10 mbr Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/ips/ips_commands.c,v 1.9 2004/02/28 19:14:41 scottl Exp $"); #include <dev/ips/ips.h> @@ -44,9 +44,7 @@ status->value = command->status.value; bus_dmamap_sync(command->sc->command_dmatag, command->command_dmamap, BUS_DMASYNC_POSTWRITE); - mtx_lock(&command->sc->cmd_mtx); - wakeup(status); - mtx_unlock(&command->sc->cmd_mtx); + sema_post(&command->cmd_sema); } /* Below are a series of functions for sending an IO request * to the adapter. The flow order is: start, send, callback, finish. @@ -163,15 +161,24 @@ return 0; } -void ips_start_io_request(ips_softc_t *sc, struct bio *iobuf) +void ips_start_io_request(ips_softc_t *sc) { - if(ips_get_free_cmd(sc, ips_send_io_request, iobuf, 0)){ - device_printf(sc->dev, "no mem for command slots!\n"); - iobuf->bio_flags |= BIO_ERROR; - iobuf->bio_error = ENOMEM; - ipsd_finish(iobuf); + struct bio *iobuf; + + mtx_lock(&sc->queue_mtx); + iobuf = bioq_first(&sc->queue); + if(!iobuf) { + mtx_unlock(&sc->queue_mtx); + return; + } + + if(ips_get_free_cmd(sc, ips_send_io_request, iobuf, IPS_NOWAIT_FLAG)){ + mtx_unlock(&sc->queue_mtx); return; } + + bioq_remove(&sc->queue, iobuf); + mtx_unlock(&sc->queue_mtx); return; } @@ -236,15 +243,13 @@ goto exit; } command->callback = ips_wakeup_callback; - mtx_lock(&sc->cmd_mtx); bus_dmamap_load(command->data_dmatag, command->data_dmamap, command->data_buffer,IPS_ADAPTER_INFO_LEN, ips_adapter_info_callback, command, BUS_DMA_NOWAIT); if ((status->value == IPS_ERROR_STATUS) || - (msleep(status, &sc->cmd_mtx, 0, "ips", 30*hz) == EWOULDBLOCK)) + (sema_timedwait(&command->cmd_sema, 30*hz) == 0)) error = ETIMEDOUT; - mtx_unlock(&sc->cmd_mtx); if (error == 0) { bus_dmamap_sync(command->data_dmatag, command->data_dmamap, @@ -343,14 +348,12 @@ goto exit; } command->callback = ips_wakeup_callback; - mtx_lock(&sc->cmd_mtx); bus_dmamap_load(command->data_dmatag, command->data_dmamap, command->data_buffer,IPS_DRIVE_INFO_LEN, ips_drive_info_callback, command, BUS_DMA_NOWAIT); if ((status->value == IPS_ERROR_STATUS) || - (msleep(status, &sc->cmd_mtx, 0, "ips", 10*hz) == EWOULDBLOCK)) + (sema_timedwait(&command->cmd_sema, 10*hz) == 0)) error = ETIMEDOUT; - mtx_unlock(&sc->cmd_mtx); if (error == 0) { bus_dmamap_sync(command->data_dmatag, command->data_dmamap, @@ -406,11 +409,9 @@ command_struct->id = command->id; bus_dmamap_sync(sc->command_dmatag, command->command_dmamap, BUS_DMASYNC_PREWRITE); - mtx_lock(&sc->cmd_mtx); sc->ips_issue_cmd(command); if (status->value != IPS_ERROR_STATUS) - msleep(status, &sc->cmd_mtx, 0, "flush2", 0); - mtx_unlock(&sc->cmd_mtx); + sema_wait(&command->cmd_sema); ips_insert_free_cmd(sc, command); return 0; } @@ -494,11 +495,9 @@ bus_dmamap_sync(sc->command_dmatag, command->command_dmamap, BUS_DMASYNC_PREWRITE); - mtx_lock(&sc->cmd_mtx); sc->ips_issue_cmd(command); if (status->value != IPS_ERROR_STATUS) - msleep(status, &sc->cmd_mtx, 0, "ffdc", 0); - mtx_unlock(&sc->cmd_mtx); + sema_wait(&command->cmd_sema); ips_insert_free_cmd(sc, command); return 0; } @@ -603,14 +602,12 @@ goto exit; } command->callback = ips_write_nvram; - mtx_lock(&sc->cmd_mtx); bus_dmamap_load(command->data_dmatag, command->data_dmamap, command->data_buffer,IPS_NVRAM_PAGE_SIZE, ips_read_nvram_callback, command, BUS_DMA_NOWAIT); if ((status->value == IPS_ERROR_STATUS) || - (msleep(status, &sc->cmd_mtx, 0, "ips", 0) == EWOULDBLOCK)) + (sema_timedwait(&command->cmd_sema, 30*hz) == 0)) error = ETIMEDOUT; - mtx_unlock(&sc->cmd_mtx); if (error == 0) { bus_dmamap_sync(command->data_dmatag, command->data_dmamap, @@ -661,11 +658,9 @@ command_struct->reserve2 = IPS_POCL; bus_dmamap_sync(sc->command_dmatag, command->command_dmamap, BUS_DMASYNC_PREWRITE); - mtx_lock(&sc->cmd_mtx); sc->ips_issue_cmd(command); if (status->value != IPS_ERROR_STATUS) - msleep(status, &sc->cmd_mtx, 0, "ipssyn", 0); - mtx_unlock(&sc->cmd_mtx); + sema_wait(&command->cmd_sema); ips_insert_free_cmd(sc, command); return 0; } @@ -684,11 +679,9 @@ command_struct->reserve2 = IPS_CSL; bus_dmamap_sync(sc->command_dmatag, command->command_dmamap, BUS_DMASYNC_PREWRITE); - mtx_lock(&sc->cmd_mtx); sc->ips_issue_cmd(command); if (status->value != IPS_ERROR_STATUS) - msleep(status, &sc->cmd_mtx, 0, "ipsetc", 0); - mtx_unlock(&sc->cmd_mtx); + sema_wait(&command->cmd_sema); ips_insert_free_cmd(sc, command); return 0; } ==== //depot/projects/netperf_socket/sys/dev/ips/ips_disk.c#3 (text+ko) ==== @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/dev/ips/ips_disk.c,v 1.5 2004/02/18 21:36:52 phk Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/ips/ips_disk.c,v 1.6 2004/02/28 19:14:41 scottl Exp $"); #include <dev/ips/ips.h> #include <dev/ips/ips_disk.h> @@ -79,6 +79,9 @@ /* ipsd_finish is called to clean up and return a completed IO request */ void ipsd_finish(struct bio *iobuf) { + ipsdisk_softc_t *dsc; + dsc = iobuf->bio_disk->d_drv1; + if (iobuf->bio_flags & BIO_ERROR) { ipsdisk_softc_t *dsc; dsc = iobuf->bio_disk->d_drv1; @@ -87,6 +90,7 @@ iobuf->bio_resid = 0; biodone(iobuf); + ips_start_io_request(dsc->sc); } @@ -97,7 +101,10 @@ dsc = iobuf->bio_disk->d_drv1; DEVICE_PRINTF(8,dsc->dev,"in strategy\n"); iobuf->bio_driver1 = (void *)(uintptr_t)dsc->sc->drives[dsc->disk_number].drivenum; - ips_start_io_request(dsc->sc, iobuf); + mtx_lock(&dsc->sc->queue_mtx); + bioq_disksort(&dsc->sc->queue, iobuf); + mtx_unlock(&dsc->sc->queue_mtx); + ips_start_io_request(dsc->sc); } static int ipsd_probe(device_t dev) @@ -161,4 +168,3 @@ disk_destroy(dsc->ipsd_disk); return 0; } - ==== //depot/projects/netperf_socket/sys/dev/ips/ips_pci.c#2 (text+ko) ==== @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/dev/ips/ips_pci.c,v 1.7 2003/09/11 23:30:28 ps Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/ips/ips_pci.c,v 1.8 2004/02/28 19:14:41 scottl Exp $"); #include <dev/ips/ips.h> @@ -135,6 +135,8 @@ } sc->ips_ich.ich_func = ips_intrhook; sc->ips_ich.ich_arg = sc; + mtx_init(&sc->queue_mtx, "IPS bioqueue lock", MTX_DEF, 0); + bioq_init(&sc->queue); if (config_intrhook_establish(&sc->ips_ich) != 0) { printf("IPS can't establish configuration hook\n"); goto error; @@ -182,7 +184,7 @@ if(ips_adapter_free(sc)) return EBUSY; ips_pci_free(sc); - mtx_destroy(&sc->cmd_mtx); + bioq_flush(&sc->queue, NULL, ENXIO); } return 0; } ==== //depot/projects/netperf_socket/sys/dev/sound/pcm/channel.c#3 (text+ko) ==== @@ -29,7 +29,7 @@ #include "feeder_if.h" -SND_DECLARE_FILE("$FreeBSD: src/sys/dev/sound/pcm/channel.c,v 1.96 2004/02/20 01:24:57 matk Exp $"); +SND_DECLARE_FILE("$FreeBSD: src/sys/dev/sound/pcm/channel.c,v 1.97 2004/02/28 19:47:02 truckman Exp $"); #define MIN_CHUNK_SIZE 256 /* for uiomove etc. */ #define DMA_ALIGN_THRESHOLD 4 @@ -69,10 +69,20 @@ static void chn_lockinit(struct pcm_channel *c, int dir) { - if (dir == PCMDIR_PLAY) - c->lock = snd_chnmtxcreate(c->name, "pcm play channel"); - else - c->lock = snd_chnmtxcreate(c->name, "pcm record channel"); + switch(dir) { + case PCMDIR_PLAY: + c->lock = snd_mtxcreate(c->name, "pcm play channel"); + break; + case PCMDIR_REC: + c->lock = snd_mtxcreate(c->name, "pcm record channel"); + break; + case PCMDIR_VIRTUAL: + c->lock = snd_mtxcreate(c->name, "pcm virtual play channel"); + break; + case 0: + c->lock = snd_mtxcreate(c->name, "pcm fake channel"); + break; + } } static void @@ -746,7 +756,7 @@ } int -chn_init(struct pcm_channel *c, void *devinfo, int dir) +chn_init(struct pcm_channel *c, void *devinfo, int dir, int direction) { struct feeder_class *fc; struct snd_dbuf *b, *bs; @@ -791,7 +801,7 @@ ret = ENODEV; CHN_UNLOCK(c); /* XXX - Unlock for CHANNEL_INIT() malloc() call */ - c->devinfo = CHANNEL_INIT(c->methods, devinfo, b, c, dir); + c->devinfo = CHANNEL_INIT(c->methods, devinfo, b, c, direction); CHN_LOCK(c); if (c->devinfo == NULL) goto out; @@ -800,7 +810,7 @@ if ((sndbuf_getsize(b) == 0) && ((c->flags & CHN_F_VIRTUAL) == 0)) goto out; - ret = chn_setdir(c, dir); + ret = chn_setdir(c, direction); if (ret) goto out; ==== //depot/projects/netperf_socket/sys/dev/sound/pcm/channel.h#3 (text+ko) ==== @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/dev/sound/pcm/channel.h,v 1.29 2004/01/28 08:02:15 truckman Exp $ + * $FreeBSD: src/sys/dev/sound/pcm/channel.h,v 1.30 2004/02/28 19:47:02 truckman Exp $ */ struct pcmchan_children { @@ -76,7 +76,7 @@ int chn_flush(struct pcm_channel *c); int chn_poll(struct pcm_channel *c, int ev, struct thread *td); -int chn_init(struct pcm_channel *c, void *devinfo, int dir); +int chn_init(struct pcm_channel *c, void *devinfo, int dir, int direction); int chn_kill(struct pcm_channel *c); int chn_setdir(struct pcm_channel *c, int dir); int chn_reset(struct pcm_channel *c, u_int32_t fmt); ==== //depot/projects/netperf_socket/sys/dev/sound/pcm/dsp.c#3 (text+ko) ==== @@ -29,7 +29,7 @@ #include <dev/sound/pcm/sound.h> -SND_DECLARE_FILE("$FreeBSD: src/sys/dev/sound/pcm/dsp.c,v 1.73 2004/02/21 21:10:47 phk Exp $"); +SND_DECLARE_FILE("$FreeBSD: src/sys/dev/sound/pcm/dsp.c,v 1.74 2004/02/28 19:42:48 truckman Exp $"); #define OLDPCM_IOCTL @@ -444,7 +444,7 @@ static int dsp_ioctl(dev_t i_dev, u_long cmd, caddr_t arg, int mode, struct thread *td) { - struct pcm_channel *wrch, *rdch; + struct pcm_channel *chn, *rdch, *wrch; struct snddev_info *d; intrmask_t s; int kill; @@ -477,22 +477,19 @@ if (kill & 2) rdch = NULL; - if (rdch != NULL) - CHN_LOCK(rdch); - if (wrch != NULL) - CHN_LOCK(wrch); - switch(cmd) { #ifdef OLDPCM_IOCTL /* * we start with the new ioctl interface. */ case AIONWRITE: /* how many bytes can write ? */ + CHN_LOCK(wrch); /* if (wrch && wrch->bufhard.dl) while (chn_wrfeed(wrch) == 0); */ *arg_i = wrch? sndbuf_getfree(wrch->bufsoft) : 0; + CHN_UNLOCK(wrch); break; case AIOSSIZE: /* set the current blocksize */ @@ -502,12 +499,16 @@ p->play_size = 0; p->rec_size = 0; if (wrch) { + CHN_LOCK(wrch); chn_setblocksize(wrch, 2, p->play_size); p->play_size = sndbuf_getblksz(wrch->bufsoft); + CHN_UNLOCK(wrch); } if (rdch) { + CHN_LOCK(rdch); chn_setblocksize(rdch, 2, p->rec_size); p->rec_size = sndbuf_getblksz(rdch->bufsoft); + CHN_UNLOCK(rdch); } } break; @@ -515,37 +516,51 @@ { struct snd_size *p = (struct snd_size *)arg; - if (wrch) + if (wrch) { + CHN_LOCK(wrch); p->play_size = sndbuf_getblksz(wrch->bufsoft); - if (rdch) + CHN_UNLOCK(wrch); + } + if (rdch) { + CHN_LOCK(rdch); p->rec_size = sndbuf_getblksz(rdch->bufsoft); + CHN_UNLOCK(rdch); + } } break; case AIOSFMT: + case AIOGFMT: { snd_chan_param *p = (snd_chan_param *)arg; if (wrch) { - chn_setformat(wrch, p->play_format); - chn_setspeed(wrch, p->play_rate); + CHN_LOCK(wrch); + if (cmd == AIOSFMT) { + chn_setformat(wrch, p->play_format); + chn_setspeed(wrch, p->play_rate); + } + p->play_rate = wrch->speed; + p->play_format = wrch->format; + CHN_UNLOCK(wrch); + } else { + p->play_rate = 0; + p->play_format = 0; } if (rdch) { - chn_setformat(rdch, p->rec_format); - chn_setspeed(rdch, p->rec_rate); + CHN_LOCK(rdch); + if (cmd == AIOSFMT) { + chn_setformat(rdch, p->rec_format); + chn_setspeed(rdch, p->rec_rate); + } + p->rec_rate = rdch->speed; + p->rec_format = rdch->format; + CHN_UNLOCK(rdch); + } else { + p->rec_rate = 0; + p->rec_format = 0; } } - /* FALLTHROUGH */ - - case AIOGFMT: - { - snd_chan_param *p = (snd_chan_param *)arg; - - p->play_rate = wrch? wrch->speed : 0; - p->rec_rate = rdch? rdch->speed : 0; - p->play_format = wrch? wrch->format : 0; - p->rec_format = rdch? rdch->format : 0; - } break; case AIOGCAP: /* get capabilities */ @@ -554,10 +569,14 @@ struct pcmchan_caps *pcaps = NULL, *rcaps = NULL; dev_t pdev; - if (rdch) + if (rdch) { + CHN_LOCK(rdch); rcaps = chn_getcaps(rdch); - if (wrch) + } + if (wrch) { + CHN_LOCK(wrch); pcaps = chn_getcaps(wrch); + } p->rate_min = max(rcaps? rcaps->minspeed : 0, pcaps? pcaps->minspeed : 0); p->rate_max = min(rcaps? rcaps->maxspeed : 1000000, @@ -573,15 +592,23 @@ p->mixers = 1; /* default: one mixer */ p->inputs = pdev->si_drv1? mix_getdevs(pdev->si_drv1) : 0; p->left = p->right = 100; + if (rdch) + CHN_UNLOCK(rdch); + if (wrch) + CHN_UNLOCK(wrch); } break; case AIOSTOP: - if (*arg_i == AIOSYNC_PLAY && wrch) + if (*arg_i == AIOSYNC_PLAY && wrch) { + CHN_LOCK(wrch); *arg_i = chn_abort(wrch); - else if (*arg_i == AIOSYNC_CAPTURE && rdch) + CHN_UNLOCK(wrch); + } else if (*arg_i == AIOSYNC_CAPTURE && rdch) { + CHN_LOCK(rdch); *arg_i = chn_abort(rdch); - else { + CHN_UNLOCK(rdch); + } else { printf("AIOSTOP: bad channel 0x%x\n", *arg_i); *arg_i = 0; } @@ -596,9 +623,15 @@ * here follow the standard ioctls (filio.h etc.) */ case FIONREAD: /* get # bytes to read */ -/* if (rdch && rdch->bufhard.dl) - while (chn_rdfeed(rdch) == 0); -*/ *arg_i = rdch? sndbuf_getready(rdch->bufsoft) : 0; + if (rdch) { + CHN_LOCK(rdch); +/* if (rdch && rdch->bufhard.dl) + while (chn_rdfeed(rdch) == 0); +*/ + *arg_i = sndbuf_getready(rdch->bufsoft); + CHN_UNLOCK(rdch); + } else + *arg_i = 0; break; case FIOASYNC: /*set/clear async i/o */ @@ -607,15 +640,21 @@ case SNDCTL_DSP_NONBLOCK: case FIONBIO: /* set/clear non-blocking i/o */ - if (rdch) - rdch->flags &= ~CHN_F_NBIO; - if (wrch) - wrch->flags &= ~CHN_F_NBIO; - if (*arg_i) { - if (rdch) + if (rdch) { + CHN_LOCK(rdch); + if (*arg_i) rdch->flags |= CHN_F_NBIO; - if (wrch) + else + rdch->flags &= ~CHN_F_NBIO; + CHN_UNLOCK(rdch); + } + if (wrch) { + CHN_LOCK(wrch); + if (*arg_i) wrch->flags |= CHN_F_NBIO; + else + wrch->flags &= ~CHN_F_NBIO; + CHN_UNLOCK(wrch); } break; @@ -625,71 +664,93 @@ #define THE_REAL_SNDCTL_DSP_GETBLKSIZE _IOWR('P', 4, int) case THE_REAL_SNDCTL_DSP_GETBLKSIZE: case SNDCTL_DSP_GETBLKSIZE: - if (wrch) - *arg_i = sndbuf_getblksz(wrch->bufsoft); - else if (rdch) - *arg_i = sndbuf_getblksz(rdch->bufsoft); - else - *arg_i = 0; + chn = wrch ? wrch : rdch; + CHN_LOCK(chn); + *arg_i = sndbuf_getblksz(chn->bufsoft); + CHN_UNLOCK(chn); break ; case SNDCTL_DSP_SETBLKSIZE: RANGE(*arg_i, 16, 65536); - if (wrch) + if (wrch) { + CHN_LOCK(wrch); chn_setblocksize(wrch, 2, *arg_i); - if (rdch) + CHN_UNLOCK(wrch); + } + if (rdch) { + CHN_LOCK(rdch); chn_setblocksize(rdch, 2, *arg_i); + CHN_UNLOCK(rdch); + } break; case SNDCTL_DSP_RESET: DEB(printf("dsp reset\n")); if (wrch) { + CHN_LOCK(wrch); chn_abort(wrch); chn_resetbuf(wrch); + CHN_UNLOCK(wrch); } if (rdch) { + CHN_LOCK(rdch); chn_abort(rdch); chn_resetbuf(rdch); + CHN_UNLOCK(rdch); } break; case SNDCTL_DSP_SYNC: DEB(printf("dsp sync\n")); /* chn_sync may sleep */ - if (wrch) + if (wrch) { + CHN_LOCK(wrch); chn_sync(wrch, sndbuf_getsize(wrch->bufsoft) - 4); + CHN_UNLOCK(wrch); + } break; case SNDCTL_DSP_SPEED: /* chn_setspeed may sleep */ tmp = 0; >>> TRUNCATED FOR MAIL (1000 lines) <<<
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200402281956.i1SJut2Q013340>