X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=carlfw%2Fsrc%2Fdma.c;h=7ca0c9aec0222eb2799e8f1fc3e998309097cee9;hb=cdced53c2ede33a9fe9004db4d93cfc984ad4243;hp=92a8a68b082331e66a3b565de5c3608b777d38a9;hpb=985f1f6849ec65147405763e9bb6c0e55ffcb789;p=carl9170fw.git diff --git a/carlfw/src/dma.c b/carlfw/src/dma.c index 92a8a68..7ca0c9a 100644 --- a/carlfw/src/dma.c +++ b/carlfw/src/dma.c @@ -81,6 +81,7 @@ void dma_init_descriptors(void) fw.wlan.tx_retry.head = fw.wlan.tx_retry.terminator = &dma_mem.terminator[i++]; fw.wlan.rx_queue.head = fw.wlan.rx_queue.terminator = &dma_mem.terminator[i++]; fw.usb.int_desc = &dma_mem.terminator[i++]; + fw.wlan.ba_desc = &dma_mem.terminator[i++]; #ifdef CONFIG_CARL9170FW_CAB_QUEUE /* GCC bug ? */ @@ -93,10 +94,6 @@ void dma_init_descriptors(void) #endif #endif /* CONFIG_CARL9170FW_CAB_QUEUE */ -#ifdef CONFIG_CARL9170FW_HANDLE_BACK_REQ - fw.wlan.ba_desc = &dma_mem.terminator[i++]; -#endif /* CONFIG_CARL9170FW_HANDLE_BACK_REQ */ - BUILD_BUG_ON(AR9170_TERMINATOR_NUMBER != j); DBG("Blocks:%d [tx:%d, rx:%d] Terminators:%d/%d\n", @@ -140,7 +137,6 @@ void dma_init_descriptors(void) /* rsp is now available for use */ fw.usb.int_desc_available = 1; -#ifdef CONFIG_CARL9170FW_HANDLE_BACK_REQ fw.wlan.ba_desc->status = AR9170_OWN_BITS_SW; fw.wlan.ba_desc->ctrl = (AR9170_CTRL_LS_BIT | AR9170_CTRL_FS_BIT); fw.wlan.ba_desc->dataSize = fw.wlan.ba_desc->totalLen = @@ -154,7 +150,6 @@ void dma_init_descriptors(void) memset(DESC_PAYLOAD(fw.wlan.ba_desc), 0, 128); fw.wlan.ba_desc_available = 1; -#endif /* CONFIG_CARL9170FW_HANDLE_BACK_REQ */ } /* @@ -165,11 +160,13 @@ void dma_init_descriptors(void) */ void dma_reclaim(struct dma_queue *q, struct dma_desc *desc) { - struct dma_desc *tmpDesc; + struct dma_desc *tmpDesc, *last; struct dma_desc tdesc; /* 1. Set OWN bit to HW for all TDs to be added, clear ctrl and size */ tmpDesc = desc; + last = desc->lastAddr; + while (1) { tmpDesc->status = AR9170_OWN_BITS_HW; tmpDesc->ctrl = 0; @@ -178,24 +175,28 @@ void dma_reclaim(struct dma_queue *q, struct dma_desc *desc) /* TODO : Exception handle */ - if (desc->lastAddr == tmpDesc) + tmpDesc->lastAddr = tmpDesc; + + if (tmpDesc == last) break; - tmpDesc->lastAddr = desc->lastAddr; tmpDesc = tmpDesc->nextAddr; } /* 2. Next address of Last TD to be added = first TD */ - desc->lastAddr->nextAddr = desc; + tmpDesc->nextAddr = desc; + + /* Link first TD to self */ + desc->lastAddr = q->terminator; /* 3. Copy first TD to be added to TTD */ copy_dma_desc(&tdesc, desc); - /* 4. set first TD OWN bit to SW */ - desc->status = AR9170_OWN_BITS_SW; + /* 4. Initialize new terminator */ + clear_descriptor(desc); /* 5. Copy TTD to last TD */ - tdesc.status &= (~AR9170_OWN_BITS); + tdesc.status = 0; copy_dma_desc((void *)q->terminator, (void *)&tdesc); q->terminator->status |= AR9170_OWN_BITS_HW; @@ -241,14 +242,8 @@ void dma_put(struct dma_queue *q, struct dma_desc *desc) /* 3. Copy first TD to be added to TTD */ copy_dma_desc(&tdesc, desc); - /* 4. set first TD OWN bit to SW */ - desc->status = AR9170_OWN_BITS_SW; - desc->ctrl = 0; - desc->totalLen = 0; - desc->dataSize = 0; - desc->lastAddr = desc; - desc->nextAddr = desc; - desc->dataAddr = NULL; + /* 4. Initialize new terminator */ + clear_descriptor(desc); /* 5. Copy TTD to last TD */ tdesc.status &= (~AR9170_OWN_BITS);