1865 if (work_flags & PMCS_WORK_FLAG_ADD_DMA_CHUNKS) {
1866 if (pmcs_add_more_chunks(pwp,
1867 ptob(1) * PMCS_ADDTL_CHUNK_PAGES)) {
1868 SCHEDULE_WORK(pwp, PMCS_WORK_ADD_DMA_CHUNKS);
1869 } else {
1870 SCHEDULE_WORK(pwp, PMCS_WORK_RUN_QUEUES);
1871 }
1872 }
1873 }
1874
1875 static int
1876 pmcs_add_more_chunks(pmcs_hw_t *pwp, unsigned long nsize)
1877 {
1878 pmcs_dmachunk_t *dc;
1879 unsigned long dl;
1880 pmcs_chunk_t *pchunk = NULL;
1881
1882 pwp->cip_dma_attr.dma_attr_align = sizeof (uint32_t);
1883
1884 pchunk = kmem_zalloc(sizeof (pmcs_chunk_t), KM_SLEEP);
1885 if (pchunk == NULL) {
1886 pmcs_prt(pwp, PMCS_PRT_DEBUG, NULL, NULL,
1887 "Not enough memory for DMA chunks");
1888 return (-1);
1889 }
1890
1891 if (pmcs_dma_setup(pwp, &pwp->cip_dma_attr, &pchunk->acc_handle,
1892 &pchunk->dma_handle, nsize, (caddr_t *)&pchunk->addrp,
1893 &pchunk->dma_addr) == B_FALSE) {
1894 pmcs_prt(pwp, PMCS_PRT_DEBUG, NULL, NULL,
1895 "Failed to setup DMA for chunks");
1896 kmem_free(pchunk, sizeof (pmcs_chunk_t));
1897 return (-1);
1898 }
1899
1900 if ((pmcs_check_acc_handle(pchunk->acc_handle) != DDI_SUCCESS) ||
1901 (pmcs_check_dma_handle(pchunk->dma_handle) != DDI_SUCCESS)) {
1902 ddi_fm_service_impact(pwp->dip, DDI_SERVICE_UNAFFECTED);
1903 return (-1);
1904 }
1905
1906 bzero(pchunk->addrp, nsize);
1907 dc = NULL;
1908 for (dl = 0; dl < (nsize / PMCS_SGL_CHUNKSZ); dl++) {
1909 pmcs_dmachunk_t *tmp;
|
1865 if (work_flags & PMCS_WORK_FLAG_ADD_DMA_CHUNKS) {
1866 if (pmcs_add_more_chunks(pwp,
1867 ptob(1) * PMCS_ADDTL_CHUNK_PAGES)) {
1868 SCHEDULE_WORK(pwp, PMCS_WORK_ADD_DMA_CHUNKS);
1869 } else {
1870 SCHEDULE_WORK(pwp, PMCS_WORK_RUN_QUEUES);
1871 }
1872 }
1873 }
1874
1875 static int
1876 pmcs_add_more_chunks(pmcs_hw_t *pwp, unsigned long nsize)
1877 {
1878 pmcs_dmachunk_t *dc;
1879 unsigned long dl;
1880 pmcs_chunk_t *pchunk = NULL;
1881
1882 pwp->cip_dma_attr.dma_attr_align = sizeof (uint32_t);
1883
1884 pchunk = kmem_zalloc(sizeof (pmcs_chunk_t), KM_SLEEP);
1885
1886 if (pmcs_dma_setup(pwp, &pwp->cip_dma_attr, &pchunk->acc_handle,
1887 &pchunk->dma_handle, nsize, (caddr_t *)&pchunk->addrp,
1888 &pchunk->dma_addr) == B_FALSE) {
1889 pmcs_prt(pwp, PMCS_PRT_DEBUG, NULL, NULL,
1890 "Failed to setup DMA for chunks");
1891 kmem_free(pchunk, sizeof (pmcs_chunk_t));
1892 return (-1);
1893 }
1894
1895 if ((pmcs_check_acc_handle(pchunk->acc_handle) != DDI_SUCCESS) ||
1896 (pmcs_check_dma_handle(pchunk->dma_handle) != DDI_SUCCESS)) {
1897 ddi_fm_service_impact(pwp->dip, DDI_SERVICE_UNAFFECTED);
1898 return (-1);
1899 }
1900
1901 bzero(pchunk->addrp, nsize);
1902 dc = NULL;
1903 for (dl = 0; dl < (nsize / PMCS_SGL_CHUNKSZ); dl++) {
1904 pmcs_dmachunk_t *tmp;
|