Common subdirectories: /usr/local/www/data/trm/save and /sys/dev/trm/save diff -Nup /usr/local/www/data/trm/trm.c /sys/dev/trm/trm.c --- /usr/local/www/data/trm/trm.c Tue Jan 14 19:19:51 2003 +++ /sys/dev/trm/trm.c Tue Jan 14 19:17:25 2003 @@ -399,8 +399,26 @@ trm_SRBwaiting(PDCB pDCB, PSRB pSRB) } } +static u_int32_t +trm_get_sense_bufaddr(PACB pACB, PSRB pSRB) +{ + int offset; + + offset = pSRB->TagNumber; + return (pACB->sense_busaddr + + (offset * sizeof(struct scsi_sense_data))); +} + +static struct scsi_sense_data * +trm_get_sense_buf(PACB pACB, PSRB pSRB) +{ + int offset; + + offset = pSRB->TagNumber; + return (&pACB->sense_buffers[offset]); +} static void -trm_ExecuteSRB(void *arg, bus_dma_segment_t *dm_segs, int nseg, int vp) +trm_ExecuteSRB(void *arg, bus_dma_segment_t *dm_segs, int nseg, int error) { int flags; PACB pACB; @@ -422,8 +440,7 @@ trm_ExecuteSRB(void *arg, bus_dma_segmen end_seg = dm_segs + nseg; psg = pSRB->pSRBSGL; while (dm_segs < end_seg) { - psg->address = vp?(u_long)vtophys(dm_segs->ds_addr) - :(u_long)dm_segs->ds_addr; + psg->address = dm_segs->ds_addr; psg->length = (u_long)dm_segs->ds_len; totalxferlen += dm_segs->ds_len; psg++; @@ -2521,6 +2538,9 @@ trm_SRBdone(PACB pACB, PDCB pDCB, PSRB p pSRB->pSRBSGL->address = pSRB->SgSenseTemp.address; pSRB->pSRBSGL->length = pSRB->SgSenseTemp.length; pcsio->scsi_status = SCSI_STATUS_CHECK_COND; + bzero(&pcsio->sense_data, pcsio->sense_len); + bcopy(trm_get_sense_buf(pACB, pSRB), &pcsio->sense_data, + pcsio->sense_len); pcsio->ccb_h.status = CAM_SCSI_STATUS_ERROR | CAM_AUTOSNS_VALID; goto ckc_e; @@ -2830,8 +2850,8 @@ trm_RequestSense(PACB pACB, PDCB pDCB, P pSRB->SRBTotalXferLength = sizeof(pcsio->sense_data); pSRB->SgSenseTemp.address = pSRB->pSRBSGL->address; pSRB->SgSenseTemp.length = pSRB->pSRBSGL->length; - pSRB->pSRBSGL->address = (u_long) vtophys(&pcsio->sense_data); - pSRB->pSRBSGL->length = (u_long) pcsio->sense_len; + pSRB->pSRBSGL->address = trm_get_sense_bufaddr(pACB, pSRB); + pSRB->pSRBSGL->length = (u_long) sizeof(struct scsi_sense_data); pSRB->SRBSGCount = 1; pSRB->SRBSGIndex = 0; @@ -3363,6 +3383,15 @@ trm_mapSRB(void *arg, bus_dma_segment_t pACB = (PACB)arg; pACB->srb_physbase = segs->ds_addr; } + +static void +trm_dmamap_cb(void *arg, bus_dma_segment_t *segs, int nseg, int error) +{ + bus_addr_t *baddr; + baddr = (bus_addr_t *)arg; + *baddr = segs->ds_addr; +} + static PACB trm_init(u_int16_t unit, device_t dev) { @@ -3434,7 +3463,30 @@ trm_init(u_int16_t unit, device_t dev) bus_dmamap_load(pACB->srb_dmat, pACB->srb_dmamap, pACB->pFreeSRB, TRM_MAX_SRB_CNT * sizeof(TRM_SRB), trm_mapSRB, pACB, /* flags */0); - + /* Create, allocate, and map DMA buffers for autosense data */ + if (bus_dma_tag_create(/*parent_dmat*/NULL, /*alignment*/1, + /*boundary*/0, + /*lowaddr*/BUS_SPACE_MAXADDR_32BIT, + /*highaddr*/BUS_SPACE_MAXADDR, + /*filter*/NULL, /*filterarg*/NULL, + sizeof(struct scsi_sense_data) * TRM_MAX_SRB_CNT, + /*nsegments*/1, + /*maxsegsz*/TRM_MAXTRANSFER_SIZE, + /*flags*/0, &pACB->sense_dmat) != 0) { + if (bootverbose) + device_printf(dev, "cannot create sense buffer dmat\n"); + goto bad; + } + + if (bus_dmamem_alloc(pACB->sense_dmat, (void **)&pACB->sense_buffers, + BUS_DMA_NOWAIT, &pACB->sense_dmamap) != 0) + goto bad; + + bus_dmamap_load(pACB->sense_dmat, pACB->sense_dmamap, + pACB->sense_buffers, + sizeof(struct scsi_sense_data) * TRM_MAX_SRB_CNT, + trm_dmamap_cb, &pACB->sense_busaddr, /*flags*/0); + trm_check_eeprom(&trm_eepromBuf[unit],pACB); trm_initACB(pACB, adaptType, unit); for (i = 0; i < (pACB->max_id + 1); i++) { @@ -3460,6 +3512,14 @@ bad: if (pACB->iores) bus_release_resource(dev, SYS_RES_IOPORT, PCIR_MAPS, pACB->iores); + if (pACB->sense_dmamap) { + bus_dmamap_unload(pACB->sense_dmat, pACB->sense_dmamap); + bus_dmamem_free(pACB->sense_dmat, pACB->sense_buffers, + pACB->sense_dmamap); + bus_dmamap_destroy(pACB->sense_dmat, pACB->sense_dmamap); + } + if (pACB->sense_dmat) + bus_dma_tag_destroy(pACB->sense_dmat); if (pACB->srb_dmamap) { bus_dmamap_unload(pACB->srb_dmat, pACB->srb_dmamap); bus_dmamem_free(pACB->srb_dmat, pACB->pFreeSRB, @@ -3576,6 +3636,14 @@ bad: } if (pACB->srb_dmat) bus_dma_tag_destroy(pACB->srb_dmat); + if (pACB->sense_dmamap) { + bus_dmamap_unload(pACB->sense_dmat, pACB->sense_dmamap); + bus_dmamem_free(pACB->sense_dmat, pACB->sense_buffers, + pACB->sense_dmamap); + bus_dmamap_destroy(pACB->sense_dmat, pACB->sense_dmamap); + } + if (pACB->sense_dmat) + bus_dma_tag_destroy(pACB->sense_dmat); if (pACB->buffer_dmat) bus_dma_tag_destroy(pACB->buffer_dmat); if (pACB->ih) @@ -3621,8 +3689,13 @@ trm_detach(device_t dev) bus_dmamem_free(pACB->srb_dmat, pACB->pFreeSRB, pACB->srb_dmamap); bus_dmamap_destroy(pACB->srb_dmat, pACB->srb_dmamap); - bus_dma_tag_destroy(pACB->srb_dmat); - bus_dma_tag_destroy(pACB->buffer_dmat); + bus_dma_tag_destroy(pACB->srb_dmat); + bus_dmamap_unload(pACB->sense_dmat, pACB->sense_dmamap); + bus_dmamem_free(pACB->sense_dmat, pACB->sense_buffers, + pACB->sense_dmamap); + bus_dmamap_destroy(pACB->sense_dmat, pACB->sense_dmamap); + bus_dma_tag_destroy(pACB->sense_dmat); + bus_dma_tag_destroy(pACB->buffer_dmat); bus_teardown_intr(dev, pACB->irq, pACB->ih); bus_release_resource(dev, SYS_RES_IRQ, 0, pACB->irq); xpt_async(AC_LOST_DEVICE, pACB->ppath, NULL); diff -Nup /usr/local/www/data/trm/trm.h /sys/dev/trm/trm.h --- /usr/local/www/data/trm/trm.h Fri Jan 3 16:35:43 2003 +++ /sys/dev/trm/trm.h Fri Jan 3 19:18:34 2003 @@ -234,7 +234,11 @@ struct _ACB bus_dma_tag_t parent_dmat; bus_dma_tag_t buffer_dmat; /* dmat for buffer I/O */ bus_dma_tag_t srb_dmat; + bus_dma_tag_t sense_dmat; /* dmat for sense buffer */ + bus_dmamap_t sense_dmamap; bus_dmamap_t srb_dmamap; + bus_addr_t sense_busaddr; + struct scsi_sense_data *sense_buffers; struct resource *iores, *irq; void *ih; /*