static int device_tx_srv(struct vnt_private *pDevice, unsigned int uIdx) { PSTxDesc pTD; int works = 0; unsigned char byTsr0; unsigned char byTsr1; for (pTD = pDevice->apTailTD[uIdx]; pDevice->iTDUsed[uIdx] > 0; pTD = pTD->next) { if (pTD->m_td0TD0.f1Owner == OWNED_BY_NIC) break; if (works++ > 15) break; byTsr0 = pTD->m_td0TD0.byTSR0; byTsr1 = pTD->m_td0TD0.byTSR1; //Only the status of first TD in the chain is correct if (pTD->m_td1TD1.byTCR & TCR_STP) { if ((pTD->pTDInfo->byFlags & TD_FLAGS_NETIF_SKB) != 0) { vnt_int_report_rate(pDevice, pTD->pTDInfo, byTsr0, byTsr1); if (!(byTsr1 & TSR1_TERR)) { if (byTsr0 != 0) { pr_debug(" Tx[%d] OK but has error. tsr1[%02X] tsr0[%02X]\n", (int)uIdx, byTsr1, byTsr0); } } else { pr_debug(" Tx[%d] dropped & tsr1[%02X] tsr0[%02X]\n", (int)uIdx, byTsr1, byTsr0); } } if (byTsr1 & TSR1_TERR) { if ((pTD->pTDInfo->byFlags & TD_FLAGS_PRIV_SKB) != 0) { pr_debug(" Tx[%d] fail has error. tsr1[%02X] tsr0[%02X]\n", (int)uIdx, byTsr1, byTsr0); } } device_free_tx_buf(pDevice, pTD); pDevice->iTDUsed[uIdx]--; } } pDevice->apTailTD[uIdx] = pTD; return works; }
static int device_tx_srv(struct vnt_private *priv, unsigned int idx) { struct vnt_tx_desc *desc; int works = 0; unsigned char byTsr0; unsigned char byTsr1; for (desc = priv->apTailTD[idx]; priv->iTDUsed[idx] > 0; desc = desc->next) { if (desc->td0.owner == OWNED_BY_NIC) break; if (works++ > 15) break; byTsr0 = desc->td0.tsr0; byTsr1 = desc->td0.tsr1; /* Only the status of first TD in the chain is correct */ if (desc->td1.tcr & TCR_STP) { if ((desc->td_info->flags & TD_FLAGS_NETIF_SKB) != 0) { if (!(byTsr1 & TSR1_TERR)) { if (byTsr0 != 0) { pr_debug(" Tx[%d] OK but has error. tsr1[%02X] tsr0[%02X]\n", (int)idx, byTsr1, byTsr0); } } else { pr_debug(" Tx[%d] dropped & tsr1[%02X] tsr0[%02X]\n", (int)idx, byTsr1, byTsr0); } } if (byTsr1 & TSR1_TERR) { if ((desc->td_info->flags & TD_FLAGS_PRIV_SKB) != 0) { pr_debug(" Tx[%d] fail has error. tsr1[%02X] tsr0[%02X]\n", (int)idx, byTsr1, byTsr0); } } vnt_int_report_rate(priv, desc->td_info, byTsr0, byTsr1); device_free_tx_buf(priv, desc); priv->iTDUsed[idx]--; } } priv->apTailTD[idx] = desc; return works; }