static int qlcnic_set_port_config(struct qlcnic_adapter *adapter, struct ethtool_cmd *ecmd) { u32 ret = 0, config = 0; /* read which mode */ if (ecmd->duplex) config |= 0x1; if (ecmd->autoneg) config |= 0x2; switch (ethtool_cmd_speed(ecmd)) { case SPEED_10: config |= (0 << 8); break; case SPEED_100: config |= (1 << 8); break; case SPEED_1000: config |= (10 << 8); break; default: return -EIO; } ret = qlcnic_fw_cmd_set_port(adapter, config); if (ret == QLCNIC_RCODE_NOT_SUPPORTED) return -EOPNOTSUPP; else if (ret) return -EIO; return ret; }
static int qlcnic_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd) { u32 config = 0; u32 ret = 0; struct qlcnic_adapter *adapter = netdev_priv(dev); if (adapter->ahw->port_type != QLCNIC_GBE) return -EOPNOTSUPP; /* read which mode */ if (ecmd->duplex) config |= 0x1; if (ecmd->autoneg) config |= 0x2; switch (ethtool_cmd_speed(ecmd)) { case SPEED_10: config |= (0 << 8); break; case SPEED_100: config |= (1 << 8); break; case SPEED_1000: config |= (10 << 8); break; default: return -EIO; } ret = qlcnic_fw_cmd_set_port(adapter, config); if (ret == QLCNIC_RCODE_NOT_SUPPORTED) return -EOPNOTSUPP; else if (ret) return -EIO; adapter->link_speed = ethtool_cmd_speed(ecmd); adapter->link_duplex = ecmd->duplex; adapter->link_autoneg = ecmd->autoneg; if (!netif_running(dev)) return 0; dev->netdev_ops->ndo_stop(dev); return dev->netdev_ops->ndo_open(dev); }