Date: Sun, 30 Dec 2012 00:47:30 +0000 (UTC) From: Marcel Moolenaar <marcel@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r244845 - projects/altix2/sys/dev/isp Message-ID: <201212300047.qBU0lUdH084593@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: marcel Date: Sun Dec 30 00:47:30 2012 New Revision: 244845 URL: http://svnweb.freebsd.org/changeset/base/244845 Log: o Convert the busdma_sync operations. o Improve busdma_mem_alloc buffer allocation. Modified: projects/altix2/sys/dev/isp/isp_freebsd.h projects/altix2/sys/dev/isp/isp_pci.c Modified: projects/altix2/sys/dev/isp/isp_freebsd.h ============================================================================== --- projects/altix2/sys/dev/isp/isp_freebsd.h Sun Dec 30 00:45:42 2012 (r244844) +++ projects/altix2/sys/dev/isp/isp_freebsd.h Sun Dec 30 00:47:30 2012 (r244845) @@ -427,22 +427,22 @@ switch (type) { \ case SYNC_SFORDEV: \ { \ struct isp_fc *fc = ISP_FC_PC(isp, chan); \ - busdma_sync(fc->tdmd, BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); \ + busdma_sync(fc->tdmd, BUSDMA_SYNC_PREREAD|BUSDMA_SYNC_PREWRITE); \ break; \ } \ case SYNC_REQUEST: \ busdma_sync(isp->isp_osinfo.cdmd, \ - BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); \ + BUSDMA_SYNC_PREREAD | BUSDMA_SYNC_PREWRITE); \ break; \ case SYNC_SFORCPU: \ { \ struct isp_fc *fc = ISP_FC_PC(isp, chan); \ - busdma_sync(fc->tdmd, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE); \ + busdma_sync(fc->tdmd, BUSDMA_SYNC_POSTREAD|BUSDMA_SYNC_POSTWRITE); \ break; \ } \ case SYNC_RESULT: \ busdma_sync(isp->isp_osinfo.cdmd, \ - BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); \ + BUSDMA_SYNC_POSTREAD | BUSDMA_SYNC_POSTWRITE); \ break; \ case SYNC_REG: \ bus_space_barrier(isp->isp_osinfo.bus_tag, \ Modified: projects/altix2/sys/dev/isp/isp_pci.c ============================================================================== --- projects/altix2/sys/dev/isp/isp_pci.c Sun Dec 30 00:45:42 2012 (r244844) +++ projects/altix2/sys/dev/isp/isp_pci.c Sun Dec 30 00:47:30 2012 (r244845) @@ -1451,6 +1451,10 @@ isp_pci_mbxdma(ispsoftc_t *isp) bus_size_t slim; /* segment size */ bus_addr_t llim; /* low limit of unavailable dma */ bus_addr_t hlim; /* high limit of unavailable dma */ + isp_ecmd_t *ecmd; + uintptr_t vaddr; + bus_addr_t busaddr; + size_t size; /* * Already been here? If so, leave... @@ -1590,15 +1594,45 @@ isp_pci_mbxdma(ispsoftc_t *isp) return (error); } - isp->isp_rquest = (void *)busdma_md_get_vaddr(isp->isp_osinfo.cdmd, 0); - isp->isp_rquest_dma = busdma_md_get_busaddr(isp->isp_osinfo.cdmd, 0); - isp->isp_result_dma = isp->isp_rquest_dma + ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(isp)); - isp->isp_result = (char *)isp->isp_rquest + ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(isp)); + busaddr = busdma_md_get_busaddr(isp->isp_osinfo.cdmd, 0); + vaddr = busdma_md_get_vaddr(isp->isp_osinfo.cdmd, 0); + size = busdma_md_get_size(isp->isp_osinfo.cdmd, 0); + isp_prt(isp, ISP_LOGDEBUG0, "request/result area @ 0x%jx/0x%jx", + (uintmax_t)busaddr, (uintmax_t)size); + + isp->isp_rquest = (void *)vaddr; + isp->isp_rquest_dma = busaddr; + size = ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(isp)); + busaddr += size; + vaddr += size; + + isp->isp_result = (void *)vaddr; + isp->isp_result_dma = busaddr; + size = ISP_QUEUE_SIZE(RESULT_QUEUE_LEN(isp)); + busaddr += size; + vaddr += size; + + if (isp->isp_type >= ISP_HA_FC_2300) { + isp->isp_osinfo.ecmd_base = (void *)vaddr; + isp->isp_osinfo.ecmd_dma = busaddr; + size = N_XCMDS * XCMD_SIZE; + busaddr += size; + vaddr += size; + + isp->isp_osinfo.ecmd_free = isp->isp_osinfo.ecmd_base; + for (ecmd = isp->isp_osinfo.ecmd_free; + ecmd < &isp->isp_osinfo.ecmd_free[N_XCMDS]; ecmd++) { + if (ecmd == &isp->isp_osinfo.ecmd_free[N_XCMDS - 1]) + ecmd->next = NULL; + else + ecmd->next = ecmd + 1; + } + } #ifdef ISP_TARGET_MODE if (IS_24XX(isp)) { - isp->isp_atioq_dma = isp->isp_result_dma + ISP_QUEUE_SIZE(RESULT_QUEUE_LEN(isp)); - isp->isp_atioq = (char *)isp->isp_result + ISP_QUEUE_SIZE(RESULT_QUEUE_LEN(isp)); + isp->isp_atioq_dma = busaddr; + isp->isp_atioq = (void *)vaddr; } #endif @@ -1615,13 +1649,13 @@ isp_pci_mbxdma(ispsoftc_t *isp) busdma_tag_destroy(fc->tdmat); goto bad; } + busaddr = busdma_md_get_busaddr(fc->tdmd, 0); + size = busdma_md_get_size(fc->tdmd, 0); + vaddr = busdma_md_get_vaddr(fc->tdmd, 0); isp_prt(isp, ISP_LOGDEBUG0, "scdma @ 0x%jx/0x%jx", - (uintmax_t)busdma_md_get_busaddr(fc->tdmd, 0), - (uintmax_t)busdma_md_get_size(fc->tdmd, 0)); - FCPARAM(isp, cmap)->isp_scdma = - busdma_md_get_busaddr(fc->tdmd, 0); - FCPARAM(isp, cmap)->isp_scratch = - (void *)busdma_md_get_vaddr(fc->tdmd, 0); + (uintmax_t)busaddr, (uintmax_t)size); + FCPARAM(isp, cmap)->isp_scdma = busaddr; + FCPARAM(isp, cmap)->isp_scratch = (void *)vaddr; if (isp->isp_type >= ISP_HA_FC_2300) { for (i = 0; i < INITIAL_NEXUS_COUNT; i++) { struct isp_nexus *n = malloc(sizeof (struct isp_nexus), M_DEVBUF, M_NOWAIT | M_ZERO); @@ -1689,7 +1723,6 @@ typedef struct { void *cmd_token; void *rq; /* original request */ int error; - bus_size_t mapsize; } mush_t; #define MUSHERR_NOQENTRIES -2 @@ -1714,9 +1747,8 @@ tdma_cb(void *arg, busdma_md_t md, int e csio = mp->cmd_token; isp = mp->isp; rq = mp->rq; - ddir = ISP_NOXFR; - nseg = busdma_md_get_nsegs(md); - if (nseg) { + if (md != NULL) { + nseg = busdma_md_get_nsegs(md); if (isp->isp_osinfo.sixtyfourbit) { if (nseg >= ISP_NSEG64_MAX) { isp_prt(isp, ISP_LOGERR, "number of segments (%d) exceed maximum we can support (%d)", nseg, ISP_NSEG64_MAX); @@ -1734,12 +1766,19 @@ tdma_cb(void *arg, busdma_md_t md, int e } } if ((csio->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) { - busdma_sync(PISP_PCMD(csio)->dmap, BUS_DMASYNC_PREWRITE); + busdma_sync(PISP_PCMD(csio)->dmap, + BUSDMA_SYNC_PREWRITE); ddir = ISP_TO_DEVICE; } else if ((csio->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_OUT) { - busdma_sync(PISP_PCMD(csio)->dmap, BUS_DMASYNC_PREREAD); + busdma_sync(PISP_PCMD(csio)->dmap, BUSDMA_SYNC_PREREAD); ddir = ISP_FROM_DEVICE; + } else { + md = NULL; + ddir = ISP_NOXFR; } + } else { + md = NULL; + ddir = ISP_NOXFR; } error = isp_send_tgt_cmd(isp, rq, md, XS_XFRLEN(csio), ddir, &csio->sense_data, csio->sense_len); @@ -1772,9 +1811,8 @@ dma_cb(void *arg, busdma_md_t md, int er csio = mp->cmd_token; isp = mp->isp; rq = mp->rq; - ddir = ISP_NOXFR; - nseg = busdma_md_get_nsegs(md); - if (nseg) { + if (md != NULL) { + nseg = busdma_md_get_nsegs(md); if (isp->isp_osinfo.sixtyfourbit) { if (nseg >= ISP_NSEG64_MAX) { isp_prt(isp, ISP_LOGERR, "number of segments (%d) exceed maximum we can support (%d)", nseg, ISP_NSEG64_MAX); @@ -1794,12 +1832,17 @@ dma_cb(void *arg, busdma_md_t md, int er } } if ((csio->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) { - busdma_sync(PISP_PCMD(csio)->dmap, BUS_DMASYNC_PREREAD); + busdma_sync(PISP_PCMD(csio)->dmap, BUSDMA_SYNC_PREREAD); ddir = ISP_FROM_DEVICE; } else if ((csio->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_OUT) { - busdma_sync(PISP_PCMD(csio)->dmap, BUS_DMASYNC_PREWRITE); + busdma_sync(PISP_PCMD(csio)->dmap, + BUSDMA_SYNC_PREWRITE); ddir = ISP_TO_DEVICE; + } else { + ddir = ISP_NOXFR; } + } else { + ddir = ISP_NOXFR; } error = isp_send_cmd(isp, rq, md, XS_XFRLEN(csio), ddir, (ispds64_t *)csio->req_map); @@ -1826,7 +1869,6 @@ isp_pci_dmasetup(ispsoftc_t *isp, struct mp->cmd_token = csio; mp->rq = ff; mp->error = 0; - mp->mapsize = 0; #ifdef ISP_TARGET_MODE if (csio->ccb_h.func_code == XPT_CONT_TARGET_IO)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201212300047.qBU0lUdH084593>