/** * nfp_net_read_link_status() - Reread link status from control BAR * @nn: NFP Network structure */ static void nfp_net_read_link_status(struct nfp_net *nn) { unsigned long flags; bool link_up; u32 sts; spin_lock_irqsave(&nn->link_status_lock, flags); sts = nn_readl(nn, NFP_NET_CFG_STS); link_up = !!(sts & NFP_NET_CFG_STS_LINK); if (nn->link_up == link_up) goto out; nn->link_up = link_up; if (nn->link_up) { netif_carrier_on(nn->netdev); netdev_info(nn->netdev, "NIC Link is Up\n"); } else { netif_carrier_off(nn->netdev); netdev_info(nn->netdev, "NIC Link is Down\n"); } out: spin_unlock_irqrestore(&nn->link_status_lock, flags); }
static void nfp_net_get_regs(struct net_device *netdev, struct ethtool_regs *regs, void *p) { struct nfp_net *nn = netdev_priv(netdev); u32 *regs_buf = p; int i; regs->version = nn_readl(nn, NFP_NET_CFG_VERSION); for (i = 0; i < NFP_NET_CFG_BAR_SZ / sizeof(u32); i++) regs_buf[i] = readl(nn->ctrl_bar + (i * sizeof(u32))); }
static int nfp_net_reconfig_wait(struct nfp_net *nn, unsigned long deadline) { bool timed_out = false; /* Poll update field, waiting for NFP to ack the config */ while (!nfp_net_reconfig_check_done(nn, timed_out)) { msleep(1); timed_out = time_is_before_eq_jiffies(deadline); } if (nn_readl(nn, NFP_NET_CFG_UPDATE) & NFP_NET_CFG_UPDATE_ERR) return -EIO; return timed_out ? -EIO : 0; }
static bool nfp_net_reconfig_check_done(struct nfp_net *nn, bool last_check) { u32 reg; reg = nn_readl(nn, NFP_NET_CFG_UPDATE); if (reg == 0) return true; if (reg & NFP_NET_CFG_UPDATE_ERR) { nn_err(nn, "Reconfig error: 0x%08x\n", reg); return true; } else if (last_check) { nn_err(nn, "Reconfig timeout: 0x%08x\n", reg); return true; } return false; }