/** * e100_diag_config_loopback - setup/clear loopback before/after lpbk test * @bdp: atapter's private data struct * @set_loopback: true if the function is called to set lb * @loopback_mode: the loopback mode(MAC or PHY) * @tcb_extended: true if need to set extended tcb mode after clean loopback * @dynamic_tbd: true if needed to set dynamic tbd mode after clean loopback * */ void e100_diag_config_loopback(struct e100_private* bdp, u8 set_loopback, u8 loopback_mode, u8* tcb_extended, u8* dynamic_tbd) { /* if set_loopback == true - we want to clear tcb_extended/dynamic_tbd. * the previous values are saved in the params tcb_extended/dynamic_tbd * if set_loopback == false - we want to restore previous value. */ if (set_loopback || (*tcb_extended)) *tcb_extended = e100_config_tcb_ext_enable(bdp,*tcb_extended); if (set_loopback || (*dynamic_tbd)) *dynamic_tbd = e100_config_dynamic_tbd(bdp,*dynamic_tbd); if (set_loopback) { /* ICH PHY loopback is broken */ if (bdp->flags & IS_ICH && loopback_mode == PHY_LOOPBACK) loopback_mode = MAC_LOOPBACK; /* Configure loopback on MAC */ e100_config_loopback_mode(bdp,loopback_mode); } else { e100_config_loopback_mode(bdp,NO_LOOPBACK); } e100_config(bdp); if (loopback_mode == PHY_LOOPBACK) { if (set_loopback) /* Set PHY loopback mode */ e100_phy_set_loopback(bdp); else { /* Back to normal speed and duplex */ if (bdp->params.e100_speed_duplex == E100_AUTONEG) /* Reset PHY and do autoneg */ e100_phy_autoneg(bdp); else /* Reset PHY and force speed and duplex */ e100_force_speed_duplex(bdp); } /* Wait for PHY state change */ set_current_state(TASK_UNINTERRUPTIBLE); schedule_timeout(HZ); } else { /* For MAC loopback wait 500 msec to take effect */ set_current_state(TASK_UNINTERRUPTIBLE); schedule_timeout(HZ / 2); } }
void e100_phy_set_speed_duplex(struct e100_private *bdp, unsigned char force_restart) { if (bdp->params.e100_speed_duplex == E100_AUTONEG) { if (bdp->rev_id >= D102_REV_ID) /* Enable MDI/MDI-X auto switching */ e100_mdi_write(bdp, MII_NCONFIG, bdp->phy_addr, MDI_MDIX_AUTO_SWITCH_ENABLE); e100_auto_neg(bdp, force_restart); } else { if (bdp->rev_id >= D102_REV_ID) /* Disable MDI/MDI-X auto switching */ e100_mdi_write(bdp, MII_NCONFIG, bdp->phy_addr, MDI_MDIX_RESET_ALL_MASK); e100_force_speed_duplex(bdp); } e100_set_fc(bdp); }