git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@3974 35acf78f-673a-0410-8e92-d51de3d6d3f4

This commit is contained in:
gdisirio 2012-02-25 09:17:24 +00:00
parent ffaedac6e6
commit 37cabaed5e
1 changed files with 54 additions and 9 deletions

View File

@ -432,7 +432,7 @@ size_t mac_lld_write_transmit_descriptor(MACTransmitDescriptor *tdp,
size_t size) { size_t size) {
chDbgAssert(!(tdp->physdesc->tdes0 & STM32_TDES0_OWN), chDbgAssert(!(tdp->physdesc->tdes0 & STM32_TDES0_OWN),
"mac_lld_release_receive_descriptor(), #1", "mac_lld_write_transmit_descriptor(), #1",
"attempt to write descriptor already owned by DMA"); "attempt to write descriptor already owned by DMA");
if (size > tdp->size - tdp->offset) if (size > tdp->size - tdp->offset)
@ -467,7 +467,7 @@ void mac_lld_release_transmit_descriptor(MACTransmitDescriptor *tdp) {
STM32_TDES0_TCH | STM32_TDES0_OWN; STM32_TDES0_TCH | STM32_TDES0_OWN;
/* If the DMA engine is stalled then a restart request is issued.*/ /* If the DMA engine is stalled then a restart request is issued.*/
if ((ETH->DMASR & 0x700000) == 0x600000) { if ((ETH->DMASR & ETH_DMASR_TPS) == ETH_DMASR_TPS_Suspended) {
ETH->DMASR = ETH_DMASR_TBUS; ETH->DMASR = ETH_DMASR_TBUS;
ETH->DMATPDR = ETH_DMASR_TBUS; /* Any value is OK.*/ ETH->DMATPDR = ETH_DMASR_TBUS; /* Any value is OK.*/
} }
@ -488,10 +488,33 @@ void mac_lld_release_transmit_descriptor(MACTransmitDescriptor *tdp) {
*/ */
msg_t max_lld_get_receive_descriptor(MACDriver *macp, msg_t max_lld_get_receive_descriptor(MACDriver *macp,
MACReceiveDescriptor *rdp) { MACReceiveDescriptor *rdp) {
stm32_eth_rx_descriptor_t *rdes;
(void)macp; chSysLock();
(void)rdp;
/* Get Current RX descriptor.*/
rdes = macp->rxptr;
/* Iterates through received frames until a valid one is found, invalid
frames are discarded.*/
while (!(rdes->rdes0 & STM32_RDES0_OWN)) {
if (!(rdes->rdes0 & (STM32_RDES0_AFM | STM32_RDES0_ES)) &&
(rdes->rdes0 & STM32_RDES0_FS) && (rdes->rdes0 & STM32_RDES0_LS)) {
/* Found a valid one.*/
rdp->offset = 0;
rdp->size = ((rdes->rdes0 & STM32_RDES0_FL_MASK) >> 16) - 4;
rdp->physdesc = rdes;
macp->rxptr = (stm32_eth_rx_descriptor_t *)rdes->rdes3;
chSysUnlock();
return RDY_OK;
}
/* Invalid frame found, purging.*/
rdes->rdes0 = STM32_RDES0_OWN;
macp->rxptr = (stm32_eth_rx_descriptor_t *)rdes->rdes3;
}
chSysUnlock();
return RDY_TIMEOUT; return RDY_TIMEOUT;
} }
@ -512,11 +535,18 @@ size_t mac_lld_read_receive_descriptor(MACReceiveDescriptor *rdp,
uint8_t *buf, uint8_t *buf,
size_t size) { size_t size) {
(void)rdp; chDbgAssert(!(tdp->physdesc->rdes0 & STM32_RDES0_OWN),
(void)buf; "mac_lld_read_receive_descriptor(), #1",
(void)size; "attempt to read descriptor already owned by DMA");
return 0; if (size > rdp->size - rdp->offset)
size = rdp->size - rdp->offset;
if (size > 0) {
memcpy(buf, (uint8_t *)(rdp->physdesc->rdes2) + rdp->offset, size);
rdp->offset += size;
}
return size;
} }
/** /**
@ -530,7 +560,22 @@ size_t mac_lld_read_receive_descriptor(MACReceiveDescriptor *rdp,
*/ */
void mac_lld_release_receive_descriptor(MACReceiveDescriptor *rdp) { void mac_lld_release_receive_descriptor(MACReceiveDescriptor *rdp) {
(void)rdp; chDbgAssert(!(rdp->physdesc->rdes0 & STM32_RDES0_OWN),
"mac_lld_release_receive_descriptor(), #1",
"attempt to release descriptor already owned by DMA");
chSysLock();
/* Give buffer back to the Ethernet DMA.*/
rdp->physdesc->rdes0 = STM32_RDES0_OWN;
/* If the DMA engine is stalled then a restart request is issued.*/
if ((ETH->DMASR & ETH_DMASR_RPS) == ETH_DMASR_RPS_Suspended) {
ETH->DMASR = ETH_DMASR_RBUS;
ETH->DMARPDR = ETH_DMASR_RBUS; /* Any value is OK.*/
}
chSysUnlock();
} }
/** /**