static void hifCleanupDevice(HIF_DEVICE *device) { int count; CriticalSectionDelete(&device->lock); for (count = 0; count < BUS_REQUEST_MAX_NUM_TOTAL; count++) { if (device->busrequestblob[count].request != NULL){ SDDeviceFreeRequest(device->handle,device->busrequestblob[count].request); device->busrequestblob[count].request = NULL; } } KernelFree(device); }
void CleanupHIFScatterResources(HIF_DEVICE *device) { HIF_SCATTER_REQ *pReq; while (1) { pReq = AllocScatterReq(device); if (NULL == pReq) { break; } if (GET_SDREQUEST_SR(pReq) != NULL) { /* free bus request */ SDDeviceFreeRequest(device->handle, GET_SDREQUEST_SR(pReq)); SET_SDREQUEST_SR(pReq, NULL); } CleanupScatterResource(device,pReq); A_FREE(pReq); } }
A_STATUS SetupHIFScatterSupport(HIF_DEVICE *device, HIF_DEVICE_SCATTER_SUPPORT_INFO *pInfo) { A_STATUS status = A_ERROR; int maxTransferSizePerScatter = MAX_SCATTER_REQ_TRANSFER_SIZE; int size, i; HIF_SCATTER_REQ *pReq; SDREQUEST *sdrequest; do { DetermineScatterMethod(device); if (device->ScatterMethod == HIF_SCATTER_NONE) { /* no scatter support */ break; } AR_DEBUG_PRINTF(ATH_DEBUG_INIT,("HIF : Cache Line Size: %d bytes \n",A_GET_CACHE_LINE_BYTES())); size = sizeof(HIF_SCATTER_REQ) + (MAX_SCATTER_ENTRIES_PER_REQ - 1) * (sizeof(HIF_SCATTER_ITEM)); for (i = 0; i < MAX_SCATTER_REQUESTS; i++) { pReq = A_MALLOC(size); if (NULL == pReq) { break; } A_MEMZERO(pReq, size); /* save the device instance */ SET_DEVICE_INFO_SR(pReq, device); /* allocate a bus request for this scatter request */ sdrequest = SDDeviceAllocRequest(device->handle); if (NULL == sdrequest) { A_FREE(pReq); break; } /* store bus request into private area */ SET_SDREQUEST_SR(pReq,sdrequest); status = SetupScatterResource(device,pReq); if (A_FAILED(status)) { SDDeviceFreeRequest(device->handle, sdrequest); A_FREE(pReq); break; } /* add it to the free pool */ FreeScatterReq(device, pReq); } if (i != MAX_SCATTER_REQUESTS) { status = A_NO_MEMORY; break; } /* set function pointers */ pInfo->pAllocateReqFunc = AllocScatterReq; pInfo->pFreeReqFunc = FreeScatterReq; pInfo->pReadWriteScatterFunc = HifReadWriteScatter; pInfo->MaxScatterEntries = MAX_SCATTER_ENTRIES_PER_REQ; pInfo->MaxTransferSizePerScatterReq = maxTransferSizePerScatter; status = A_OK; } while (FALSE); if (A_FAILED(status)) { CleanupHIFScatterResources(device); } return status; }