On Wed, 2009-08-26 at 22:44 +0800, Andrew Morton wrote: > > It is perhaps pretty simple to make the second (GFP_ATOMIC) allocation > go away. The code is already conveniently structured to do this: > > do { > chunk = (struct fw_chunk *)(data + offset); > offset += sizeof(struct fw_chunk); > /* build DMA packet and queue up for sending */ > /* dma to chunk->address, the chunk->length bytes from > data + > * offeset*/ > /* Dma loading */ > rc = ipw_fw_dma_add_buffer(priv, shared_phys + offset, > > le32_to_cpu(chunk->address), > > le32_to_cpu(chunk->length)); > if (rc) { > IPW_DEBUG_INFO("dmaAddBuffer Failed\n"); > goto out; > } > > offset += le32_to_cpu(chunk->length); > } while (offset < len); > > what is the typical/expected value of chunk->length here? If it's > significantly less than 4096*(2^6), could we convert this function to > use a separate DMAable allocation per fw_chunk? Unfortunately, the largest chunk size for the latest 3.1 firmware is 0x20040, which also requires order 6 page allocation. I'll try to use the firmware DMA command block (64 slots) to handle the image (each for 4k, totally 256k). Thanks, -yi -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html