diff --git a/eth_interface.c b/eth_interface.c index 178c995..33e48f0 100644 --- a/eth_interface.c +++ b/eth_interface.c @@ -25,8 +25,10 @@ static int ethintf_llrxnotify(EthIODef *io) { return 0; } -static int ethinf_lllinkchg(EthIODef *io, int ls) { - ethinf_push_notification((EthInterface *)io->tag, ETH_IIE_LINK_CHG_NOTIFY, (uint16_t)ls); +static int ethinf_lllinkchg(EthIODef *io, int ls, uint16_t speed, bool duplex) { + // TAG: speed [11:2] | duplex [1] | ls [0] + uint16_t tag = ((speed & 0x3FF) << 2) | ((duplex & 0b1) << 1) | (ls & 0b1); + ethinf_push_notification((EthInterface *)io->tag, ETH_IIE_LINK_CHG_NOTIFY, tag); return 0; } @@ -105,7 +107,10 @@ static ThreadReturnType task_ethintf(ThreadParamType param) { } break; case ETH_IIE_LINK_CHG_NOTIFY: { - bool ls = event_data; + bool ls = event_data & 0b1; + bool duplex = (event_data >> 1) & 0b1; + uint16_t speed = (event_data >> 2); + bool prev_ls = ethinf_get_link_state(intf); // get previous link state ethinf_set_link_state(intf, ls); // set new link state @@ -117,7 +122,13 @@ static ThreadReturnType task_ethintf(ThreadParamType param) { } } - MSG("ETH LINK: %s%s\n", (ls ? (ANSI_COLOR_BGREEN "UP") : (ANSI_COLOR_BRED "DOWN")), ANSI_COLOR_RESET); + // print generic message + MSG("ETH LINK: %s%s", (ls ? (ANSI_COLOR_BGREEN "UP ") : (ANSI_COLOR_BRED "DOWN\n")), ANSI_COLOR_RESET); + + // print link properties + if (ls) { + MSG("(%u Mbps, %s duplex)\n", speed, duplex ? "FULL" : "HALF"); + } } break; case ETH_IIE_TRANSMIT_NOTIFY: { intf->ioDef->llTxTrigger(intf->ioDef, intf->txQ); diff --git a/eth_interface.h b/eth_interface.h index 560f7c8..dec04d0 100644 --- a/eth_interface.h +++ b/eth_interface.h @@ -19,14 +19,14 @@ * Ethernet interface low level definition. */ typedef struct EthIODef_ { - int (*llTxTrigger)(struct EthIODef_ *io, MsgQueue *mq); ///< Function pointer to low-level transmit function trigger - int (*llTxDone)(struct EthIODef_ *io, const RawPckt *rawPckt); ///< Transmission done (interrupt) callback - int (*llLinkChg)(struct EthIODef_ *io, int linkState); ///< Link change interrupt - int (*llRxStore)(struct EthIODef_ *io, const RawPckt *rawPckt); ///< Receive done callback - int (*llError)(struct EthIODef_ *io, int error); ///< Low-level error interrupt - int (*llRxRead)(struct EthIODef_ *io); ///< Read received packets - int (*llRxNotify)(struct EthIODef_ *io); ///< Notify of received packets - void *tag; ///< Some arbitrary tagging + int (*llTxTrigger)(struct EthIODef_ *io, MsgQueue *mq); ///< Function pointer to low-level transmit function trigger + int (*llTxDone)(struct EthIODef_ *io, const RawPckt *rawPckt); ///< Transmission done (interrupt) callback + int (*llLinkChg)(struct EthIODef_ *io, int linkState, uint16_t speed, bool duplex); ///< Link change interrupt + int (*llRxStore)(struct EthIODef_ *io, const RawPckt *rawPckt); ///< Receive done callback + int (*llError)(struct EthIODef_ *io, int error); ///< Low-level error interrupt + int (*llRxRead)(struct EthIODef_ *io); ///< Read received packets + int (*llRxNotify)(struct EthIODef_ *io); ///< Notify of received packets + void *tag; ///< Some arbitrary tagging } EthIODef;