void fnic_handle_link(struct work_struct *work) { struct fnic *fnic = container_of(work, struct fnic, link_work); unsigned long flags; int old_link_status; u32 old_link_down_cnt; spin_lock_irqsave(&fnic->fnic_lock, flags); if (fnic->stop_rx_link_events) { spin_unlock_irqrestore(&fnic->fnic_lock, flags); return; } old_link_down_cnt = fnic->link_down_cnt; old_link_status = fnic->link_status; fnic->link_status = vnic_dev_link_status(fnic->vdev); fnic->link_down_cnt = vnic_dev_link_down_cnt(fnic->vdev); if (old_link_status == fnic->link_status) { if (!fnic->link_status) spin_unlock_irqrestore(&fnic->fnic_lock, flags); else { if (old_link_down_cnt != fnic->link_down_cnt) { fnic->lport->host_stats.link_failure_count++; spin_unlock_irqrestore(&fnic->fnic_lock, flags); FNIC_FCS_DBG(KERN_DEBUG, fnic->lport->host, "link down\n"); fcoe_ctlr_link_down(&fnic->ctlr); FNIC_FCS_DBG(KERN_DEBUG, fnic->lport->host, "link up\n"); fcoe_ctlr_link_up(&fnic->ctlr); } else spin_unlock_irqrestore(&fnic->fnic_lock, flags); } } else if (fnic->link_status) { spin_unlock_irqrestore(&fnic->fnic_lock, flags); FNIC_FCS_DBG(KERN_DEBUG, fnic->lport->host, "link up\n"); fcoe_ctlr_link_up(&fnic->ctlr); } else { fnic->lport->host_stats.link_failure_count++; spin_unlock_irqrestore(&fnic->fnic_lock, flags); FNIC_FCS_DBG(KERN_DEBUG, fnic->lport->host, "link down\n"); fcoe_ctlr_link_down(&fnic->ctlr); } }
static void enic_link_check(struct enic *enic) { int link_status = vnic_dev_link_status(enic->vdev); int carrier_ok = netif_carrier_ok(enic->netdev); if (link_status && !carrier_ok) { printk(KERN_INFO PFX "%s: Link UP\n", enic->netdev->name); netif_carrier_on(enic->netdev); } else if (!link_status && carrier_ok) { printk(KERN_INFO PFX "%s: Link DOWN\n", enic->netdev->name); netif_carrier_off(enic->netdev); } }