- line speed and duplex mode is passed with the link change notification
This commit is contained in:
parent
2e11cc00e9
commit
bb7a8e1f16
@ -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);
|
||||
|
@ -21,7 +21,7 @@
|
||||
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 (*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
|
||||
|
Loading…
x
Reference in New Issue
Block a user