git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@1190 35acf78f-673a-0410-8e92-d51de3d6d3f4
parent
0055ceb084
commit
4c8314f804
13
os/io/mac.c
13
os/io/mac.c
|
@ -169,4 +169,17 @@ void macReleaseReceiveDescriptor(MACDriver *macp,
|
||||||
mac_lld_release_receive_descriptor(macp, rdp);
|
mac_lld_release_receive_descriptor(macp, rdp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Updates and returns the link status.
|
||||||
|
*
|
||||||
|
* @param[in] macp pointer to the @p MACDriver object
|
||||||
|
* @return The link status.
|
||||||
|
* @retval TRUE if the link is active.
|
||||||
|
* @retval FALSE if the link is down.
|
||||||
|
*/
|
||||||
|
bool_t macPollLinkStatus(MACDriver *macp) {
|
||||||
|
|
||||||
|
return mac_lld_poll_link_status(macp);
|
||||||
|
}
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
|
@ -73,6 +73,7 @@ extern "C" {
|
||||||
systime_t time);
|
systime_t time);
|
||||||
void macReleaseReceiveDescriptor(MACDriver *macp,
|
void macReleaseReceiveDescriptor(MACDriver *macp,
|
||||||
MACReceiveDescriptor *rdp);
|
MACReceiveDescriptor *rdp);
|
||||||
|
bool_t macPollLinkStatus(MACDriver *macp);
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -379,4 +379,43 @@ uint8_t *mac_lld_get_receive_buffer(MACReceiveDescriptor *rdp) {
|
||||||
return (uint8_t *)(rdp->w1 & W1_R_ADDRESS_MASK);
|
return (uint8_t *)(rdp->w1 & W1_R_ADDRESS_MASK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Updates and returns the link status.
|
||||||
|
*
|
||||||
|
* @param[in] macp pointer to the @p MACDriver object
|
||||||
|
* @return The link status.
|
||||||
|
* @retval TRUE if the link is active.
|
||||||
|
* @retval FALSE if the link is down.
|
||||||
|
*/
|
||||||
|
bool_t mac_lld_poll_link_status(MACDriver *macp) {
|
||||||
|
uint32_t ncfgr, bmsr, bmcr, lpa;
|
||||||
|
|
||||||
|
AT91C_BASE_EMAC->EMAC_NCR |= AT91C_EMAC_MPE;
|
||||||
|
(void)phyGet(macp, MII_BMSR);
|
||||||
|
bmsr = phyGet(macp, MII_BMSR);
|
||||||
|
if (!(bmsr & BMSR_LSTATUS)) {
|
||||||
|
AT91C_BASE_EMAC->EMAC_NCR &= ~AT91C_EMAC_MPE;
|
||||||
|
return link_up = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
ncfgr = AT91C_BASE_EMAC->EMAC_NCFGR & ~(AT91C_EMAC_SPD | AT91C_EMAC_FD);
|
||||||
|
bmcr = phyGet(macp, MII_BMCR);
|
||||||
|
if (bmcr & BMCR_ANENABLE) {
|
||||||
|
lpa = phyGet(macp, MII_LPA);
|
||||||
|
if (lpa & (LPA_100HALF | LPA_100FULL | LPA_100BASE4))
|
||||||
|
ncfgr |= AT91C_EMAC_SPD;
|
||||||
|
if (lpa & (LPA_10FULL | LPA_100FULL))
|
||||||
|
ncfgr |= AT91C_EMAC_FD;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (bmcr & BMCR_SPEED100)
|
||||||
|
ncfgr |= AT91C_EMAC_SPD;
|
||||||
|
if (bmcr & BMCR_FULLDPLX)
|
||||||
|
ncfgr |= AT91C_EMAC_FD;
|
||||||
|
}
|
||||||
|
AT91C_BASE_EMAC->EMAC_NCFGR = ncfgr;
|
||||||
|
AT91C_BASE_EMAC->EMAC_NCR &= ~AT91C_EMAC_MPE;
|
||||||
|
return link_up = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
|
@ -145,6 +145,7 @@ extern "C" {
|
||||||
void mac_lld_release_receive_descriptor(MACDriver *macp,
|
void mac_lld_release_receive_descriptor(MACDriver *macp,
|
||||||
MACReceiveDescriptor *rdp);
|
MACReceiveDescriptor *rdp);
|
||||||
uint8_t *mac_lld_get_receive_buffer(MACReceiveDescriptor *rdp);
|
uint8_t *mac_lld_get_receive_buffer(MACReceiveDescriptor *rdp);
|
||||||
|
bool_t mac_lld_poll_link_status(MACDriver *macp);
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -123,4 +123,17 @@ uint8_t *mac_lld_get_receive_buffer(MACReceiveDescriptor *rdp) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Updates and returns the link status.
|
||||||
|
*
|
||||||
|
* @param[in] macp pointer to the @p MACDriver object
|
||||||
|
* @return The link status.
|
||||||
|
* @retval TRUE if the link is active.
|
||||||
|
* @retval FALSE if the link is down.
|
||||||
|
*/
|
||||||
|
bool_t mac_lld_poll_link_status(MACDriver *macp) {
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
|
@ -86,6 +86,7 @@ extern "C" {
|
||||||
void mac_lld_release_receive_descriptor(MACDriver *macp,
|
void mac_lld_release_receive_descriptor(MACDriver *macp,
|
||||||
MACReceiveDescriptor *rdp);
|
MACReceiveDescriptor *rdp);
|
||||||
uint8_t *mac_lld_get_receive_buffer(MACReceiveDescriptor *rdp);
|
uint8_t *mac_lld_get_receive_buffer(MACReceiveDescriptor *rdp);
|
||||||
|
bool_t mac_lld_poll_link_status(MACDriver *macp);
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue