diff --git a/headers/private/net/ether_driver.h b/headers/private/net/ether_driver.h index f05f0ffb49..b5110da1e5 100644 --- a/headers/private/net/ether_driver.h +++ b/headers/private/net/ether_driver.h @@ -30,7 +30,8 @@ enum { ETHER_GETFRAMESIZE, /* get frame size */ ETHER_ADDTIMESTAMP, /* (try to) add timestamps to packets (BONE ext) */ ETHER_HASIOVECS, /* does the driver implement readv/writev ? (BONE ext) (bool *) */ - ETHER_GETIFTYPE /* get the IFT_ type of the interface (int *) */ + ETHER_GETIFTYPE, /* get the IFT_ type of the interface (int *) */ + ETHER_GETLINKSTATE /* get line speed, quality, duplex mode, etc. */ }; @@ -52,6 +53,16 @@ typedef struct ether_init_params { unsigned long mem; } ether_init_params_t; +/* + * info returned from ETHER_GETLINKSTATE + */ + +typedef struct ether_link_state { + float link_speed; /* In Mbits per second */ + float link_quality; /* Set to zero if not connected */ + char duplex_mode; /* Set to 1 for full duplex, 0 for half */ +} ether_link_state_t; + #ifdef __cplusplus } #endif diff --git a/src/add-ons/kernel/drivers/network/bcm440x/b44um.c b/src/add-ons/kernel/drivers/network/bcm440x/b44um.c index 41a604e914..1d2ebf1813 100644 --- a/src/add-ons/kernel/drivers/network/bcm440x/b44um.c +++ b/src/add-ons/kernel/drivers/network/bcm440x/b44um.c @@ -188,6 +188,12 @@ status_t b44_ioctl(void *cookie,uint32 op,void *data,size_t len) { b44_LM_SetReceiveMask(&pUmDevice->lm_dev, pUmDevice->lm_dev.ReceiveMask & ~LM_PROMISCUOUS_MODE); return B_OK; + case ETHER_GETLINKSTATE: { + ether_link_state_t *state_buffer = (ether_link_state_t *)(data); + state_buffer->link_speed = (pUmDevice->lm_dev.LineSpeed == LM_LINE_SPEED_10MBPS) ? 10 : 100; + state_buffer->link_quality = (pUmDevice->lm_dev.LinkStatus == LM_STATUS_LINK_DOWN) ? 0.0 : 1.0; + state_buffer->duplex_mode = (pUmDevice->lm_dev.DuplexMode == LM_DUPLEX_MODE_FULL); + } return B_OK; } return B_ERROR; } diff --git a/src/add-ons/kernel/drivers/network/bcm570x/b57um.c b/src/add-ons/kernel/drivers/network/bcm570x/b57um.c index 9304d285f6..59bfb96506 100644 --- a/src/add-ons/kernel/drivers/network/bcm570x/b57um.c +++ b/src/add-ons/kernel/drivers/network/bcm570x/b57um.c @@ -438,6 +438,12 @@ status_t b57_ioctl(void *cookie,uint32 op,void *data,size_t len) { LM_SetReceiveMask(&pUmDevice->lm_dev, pUmDevice->lm_dev.ReceiveMask & ~LM_PROMISCUOUS_MODE); return B_OK; + case ETHER_GETLINKSTATE: { + ether_link_state_t *state_buffer = (ether_link_state_t *)(data); + state_buffer->link_speed = pUmDevice->lm_dev.LineSpeed; + state_buffer->link_quality = (pUmDevice->lm_dev.LinkStatus == LM_STATUS_LINK_DOWN) ? 0.0 : 1.0; + state_buffer->duplex_mode = (pUmDevice->lm_dev.DuplexMode == LM_DUPLEX_MODE_FULL); + } return B_OK; } return B_ERROR; }