static void __exit ptp_ixp_exit(void) { free_irq(MASTER_IRQ, &ixp_clock); free_irq(SLAVE_IRQ, &ixp_clock); ixp46x_phc_index = -1; ptp_clock_unregister(ixp_clock.ptp_clock); }
/** * igb_ptp_stop - Disable PTP device and stop the overflow check. * @adapter: Board private structure. * * This function stops the PTP support and cancels the delayed work. **/ void igb_ptp_stop(struct igb_adapter *adapter) { switch (adapter->hw.mac.type) { case e1000_82576: case e1000_82580: case e1000_i354: case e1000_i350: cancel_delayed_work_sync(&adapter->ptp_overflow_work); break; case e1000_i210: case e1000_i211: /* No delayed work to cancel. */ break; default: return; } cancel_work_sync(&adapter->ptp_tx_work); if (adapter->ptp_tx_skb) { dev_kfree_skb_any(adapter->ptp_tx_skb); adapter->ptp_tx_skb = NULL; } if (adapter->ptp_clock) { ptp_clock_unregister(adapter->ptp_clock); dev_info(&adapter->pdev->dev, "removed PHC on %s\n", adapter->netdev->name); adapter->flags &= ~IGB_FLAG_PTP; } }
/** * mlx4_en_remove_timestamp - disable PTP device * @mdev: board private structure * * Stop the PTP support. **/ void mlx4_en_remove_timestamp(struct mlx4_en_dev *mdev) { if (mdev->ptp_clock) { ptp_clock_unregister(mdev->ptp_clock); mdev->ptp_clock = NULL; mlx4_info(mdev, "removed PHC\n"); } }
/** * stmmac_ptp_unregister * @priv: driver private structure * Description: this function will remove/unregister the ptp clock driver * from the kernel. */ void stmmac_ptp_unregister(struct stmmac_priv *priv) { if (priv->ptp_clock) { ptp_clock_unregister(priv->ptp_clock); pr_debug("Removed PTP HW clock successfully on %s\n", priv->dev->name); } }
/** * mlx4_en_remove_timestamp - disable PTP device * @mdev: board private structure * * Stop the PTP support. **/ void mlx4_en_remove_timestamp(struct mlx4_en_dev *mdev) { panic("Disabled"); #if 0 // AKAROS_PORT if (mdev->ptp_clock) { ptp_clock_unregister(mdev->ptp_clock); mdev->ptp_clock = NULL; mlx4_info(mdev, "removed PHC\n"); } #endif }
/** * igb_ptp_stop - Disable PTP device and stop the overflow check. * @adapter: Board private structure. * * This function stops the PTP support and cancels the delayed work. **/ void igb_ptp_stop(struct igb_adapter *adapter) { igb_ptp_suspend(adapter); if (adapter->ptp_clock) { ptp_clock_unregister(adapter->ptp_clock); dev_info(&adapter->pdev->dev, "removed PHC on %s\n", adapter->netdev->name); adapter->ptp_flags &= ~IGB_PTP_ENABLED; } }
void DWC_ETH_QOS_ptp_remove(struct DWC_ETH_QOS_prv_data *pdata) { DBGPR_PTP("-->DWC_ETH_QOS_ptp_remove\n"); if (pdata->ptp_clock) { ptp_clock_unregister(pdata->ptp_clock); NMSGPR_ALERT( "Removed PTP HW clock successfully\n"); } DBGPR_PTP("<--DWC_ETH_QOS_ptp_remove\n"); }
/** * ixgbe_ptp_stop - destroy the ptp_clock device * @adapter: pointer to adapter struct * * Completely destroy the ptp_clock device, and disable all PTP related * features. Intended to be run when the device is being closed. */ void ixgbe_ptp_stop(struct ixgbe_adapter *adapter) { /* first, suspend ptp activity */ ixgbe_ptp_suspend(adapter); /* now destroy the ptp clock device */ if (adapter->ptp_clock) { ptp_clock_unregister(adapter->ptp_clock); adapter->ptp_clock = NULL; e_dev_info("removed PHC on %s\n", adapter->netdev->name); } }
/** * e1000e_ptp_remove - disable PTP device and stop the overflow check * @adapter: board private structure * * Stop the PTP support, and cancel the delayed work. **/ void e1000e_ptp_remove(struct e1000_adapter *adapter) { if (!(adapter->flags & FLAG_HAS_HW_TIMESTAMP)) return; cancel_delayed_work_sync(&adapter->systim_overflow_work); if (adapter->ptp_clock) { ptp_clock_unregister(adapter->ptp_clock); adapter->ptp_clock = NULL; e_info("removed PHC\n"); } }
/** * ixgbe_ptp_stop - disable ptp device and stop the overflow check * @adapter: pointer to adapter struct * * this function stops the ptp support, and cancels the delayed work. */ void ixgbe_ptp_stop(struct ixgbe_adapter *adapter) { ixgbe_ptp_disable_sdp(&adapter->hw); /* stop the overflow check task */ adapter->flags2 &= ~IXGBE_FLAG2_OVERFLOW_CHECK_ENABLED; if (adapter->ptp_clock) { ptp_clock_unregister(adapter->ptp_clock); adapter->ptp_clock = NULL; e_dev_info("removed PHC on %s\n", adapter->netdev->name); } }
void mlx5e_timestamp_cleanup(struct mlx5e_priv *priv) { struct mlx5e_tstamp *tstamp = &priv->tstamp; if (!MLX5_CAP_GEN(priv->mdev, device_frequency_khz)) return; if (priv->tstamp.ptp) { ptp_clock_unregister(priv->tstamp.ptp); priv->tstamp.ptp = NULL; } cancel_delayed_work_sync(&tstamp->overflow_work); }
/** * i40e_ptp_stop - Disable the driver/hardware support and unregister the PHC * @pf: Board private structure * * This function handles the cleanup work required from the initialization by * clearing out the important information and unregistering the PHC. **/ void i40e_ptp_stop(struct i40e_pf *pf) { pf->flags &= ~I40E_FLAG_PTP; pf->ptp_tx = false; pf->ptp_rx = false; if (pf->ptp_tx_skb) { dev_kfree_skb_any(pf->ptp_tx_skb); pf->ptp_tx_skb = NULL; } if (pf->ptp_clock) { ptp_clock_unregister(pf->ptp_clock); pf->ptp_clock = NULL; dev_info(&pf->pdev->dev, "%s: removed PHC on %s\n", __func__, pf->vsi[pf->lan_vsi]->netdev->name); } }
/** * i40e_ptp_stop - Disable the driver/hardware support and unregister the PHC * @pf: Board private structure * * This function handles the cleanup work required from the initialization by * clearing out the important information and unregistering the PHC. **/ void i40e_ptp_stop(struct i40e_pf *pf) { pf->flags &= ~I40E_FLAG_PTP; pf->ptp_tx = false; pf->ptp_rx = false; if (pf->ptp_tx_skb) { struct sk_buff *skb = pf->ptp_tx_skb; pf->ptp_tx_skb = NULL; clear_bit_unlock(__I40E_PTP_TX_IN_PROGRESS, pf->state); dev_kfree_skb_any(skb); } if (pf->ptp_clock) { ptp_clock_unregister(pf->ptp_clock); pf->ptp_clock = NULL; dev_info(&pf->pdev->dev, "%s: removed PHC on %s\n", __func__, pf->vsi[pf->lan_vsi]->netdev->name); } }
static int __init ptp_ixp_init(void) { if (!cpu_is_ixp46x()) return -ENODEV; ixp_clock.regs = (struct ixp46x_ts_regs __iomem *) IXP4XX_TIMESYNC_BASE_VIRT; ixp_clock.caps = ptp_ixp_caps; ixp_clock.ptp_clock = ptp_clock_register(&ixp_clock.caps, NULL); if (IS_ERR(ixp_clock.ptp_clock)) return PTR_ERR(ixp_clock.ptp_clock); ixp46x_phc_index = ptp_clock_index(ixp_clock.ptp_clock); __raw_writel(DEFAULT_ADDEND, &ixp_clock.regs->addend); __raw_writel(1, &ixp_clock.regs->trgt_lo); __raw_writel(0, &ixp_clock.regs->trgt_hi); __raw_writel(TTIPEND, &ixp_clock.regs->event); if (MASTER_IRQ != setup_interrupt(MASTER_GPIO)) { pr_err("failed to setup gpio %d as irq\n", MASTER_GPIO); goto no_master; } if (SLAVE_IRQ != setup_interrupt(SLAVE_GPIO)) { pr_err("failed to setup gpio %d as irq\n", SLAVE_GPIO); goto no_slave; } return 0; no_slave: free_irq(MASTER_IRQ, &ixp_clock); no_master: ptp_clock_unregister(ixp_clock.ptp_clock); return -ENODEV; }
static void __devexit pch_remove(struct pci_dev *pdev) { struct pch_dev *chip = pci_get_drvdata(pdev); ptp_clock_unregister(chip->ptp_clock); /* free the interrupt */ if (pdev->irq != 0) free_irq(pdev->irq, chip); /* unmap the virtual IO memory space */ if (chip->regs != 0) { iounmap(chip->regs); chip->regs = 0; } /* release the reserved IO memory space */ if (chip->mem_base != 0) { release_mem_region(chip->mem_base, chip->mem_size); chip->mem_base = 0; } pci_disable_device(pdev); kfree(chip); dev_info(&pdev->dev, "complete\n"); }
static void bfin_phc_release(struct bfin_mac_local *lp) { ptp_clock_unregister(lp->clock); }
static s32 __devinit pch_probe(struct pci_dev *pdev, const struct pci_device_id *id) { s32 ret; unsigned long flags; struct pch_dev *chip; chip = kzalloc(sizeof(struct pch_dev), GFP_KERNEL); if (chip == NULL) return -ENOMEM; /* enable the 1588 pci device */ ret = pci_enable_device(pdev); if (ret != 0) { dev_err(&pdev->dev, "could not enable the pci device\n"); goto err_pci_en; } chip->mem_base = pci_resource_start(pdev, IO_MEM_BAR); if (!chip->mem_base) { dev_err(&pdev->dev, "could not locate IO memory address\n"); ret = -ENODEV; goto err_pci_start; } /* retrieve the available length of the IO memory space */ chip->mem_size = pci_resource_len(pdev, IO_MEM_BAR); /* allocate the memory for the device registers */ if (!request_mem_region(chip->mem_base, chip->mem_size, "1588_regs")) { dev_err(&pdev->dev, "could not allocate register memory space\n"); ret = -EBUSY; goto err_req_mem_region; } /* get the virtual address to the 1588 registers */ chip->regs = ioremap(chip->mem_base, chip->mem_size); if (!chip->regs) { dev_err(&pdev->dev, "Could not get virtual address\n"); ret = -ENOMEM; goto err_ioremap; } chip->caps = ptp_pch_caps; chip->ptp_clock = ptp_clock_register(&chip->caps); if (IS_ERR(chip->ptp_clock)) return PTR_ERR(chip->ptp_clock); spin_lock_init(&chip->register_lock); ret = request_irq(pdev->irq, &isr, IRQF_SHARED, KBUILD_MODNAME, chip); if (ret != 0) { dev_err(&pdev->dev, "failed to get irq %d\n", pdev->irq); goto err_req_irq; } /* indicate success */ chip->irq = pdev->irq; chip->pdev = pdev; pci_set_drvdata(pdev, chip); spin_lock_irqsave(&chip->register_lock, flags); /* reset the ieee1588 h/w */ pch_reset(chip); iowrite32(DEFAULT_ADDEND, &chip->regs->addend); iowrite32(1, &chip->regs->trgt_lo); iowrite32(0, &chip->regs->trgt_hi); iowrite32(PCH_TSE_TTIPEND, &chip->regs->event); /* Version: IEEE1588 v1 and IEEE1588-2008, Mode: All Evwnt, Locked */ iowrite32(0x80020000, &chip->regs->ch_control); pch_eth_enable_set(chip); if (strcmp(pch_param.station, "00:00:00:00:00:00") != 0) { if (pch_set_station_address(pch_param.station, pdev) != 0) { dev_err(&pdev->dev, "Invalid station address parameter\n" "Module loaded but station address not set correctly\n" ); } } spin_unlock_irqrestore(&chip->register_lock, flags); return 0; err_req_irq: ptp_clock_unregister(chip->ptp_clock); iounmap(chip->regs); chip->regs = 0; err_ioremap: release_mem_region(chip->mem_base, chip->mem_size); err_req_mem_region: chip->mem_base = 0; err_pci_start: pci_disable_device(pdev); err_pci_en: kfree(chip); dev_err(&pdev->dev, "probe failed(ret=0x%x)\n", ret); return ret; }
void xgbe_ptp_unregister(struct xgbe_prv_data *pdata) { if (pdata->ptp_clock) ptp_clock_unregister(pdata->ptp_clock); }