示例#1
0
文件: igb_ptp.c 项目: 0day-ci/dpdk
/**
 * igb_ptp_reset - Re-enable the adapter for PTP following a reset.
 * @adapter: Board private structure.
 *
 * This function handles the reset work required to re-enable the PTP device.
 **/
void igb_ptp_reset(struct igb_adapter *adapter)
{
	struct e1000_hw *hw = &adapter->hw;

	if (!(adapter->flags & IGB_FLAG_PTP))
		return;

	switch (adapter->hw.mac.type) {
	case e1000_82576:
		/* Dial the nominal frequency. */
		E1000_WRITE_REG(hw, E1000_TIMINCA, INCPERIOD_82576 |
						   INCVALUE_82576);
		break;
	case e1000_82580:
	case e1000_i350:
	case e1000_i354:
	case e1000_i210:
	case e1000_i211:
		/* Enable the timer functions and interrupts. */
		E1000_WRITE_REG(hw, E1000_TSAUXC, 0x0);
		E1000_WRITE_REG(hw, E1000_TSIM, E1000_TSIM_TXTS);
		E1000_WRITE_REG(hw, E1000_IMS, E1000_IMS_TS);
		break;
	default:
		/* No work to do. */
		return;
	}

	/* Re-initialize the timer. */
	if ((hw->mac.type == e1000_i210) || (hw->mac.type == e1000_i211)) {
		struct timespec ts = ktime_to_timespec(ktime_get_real());

		igb_ptp_settime_i210(&adapter->ptp_caps, &ts);
	} else {
		timecounter_init(&adapter->tc, &adapter->cc,
				 ktime_to_ns(ktime_get_real()));
	}
}
示例#2
0
void igb_ptp_init(struct igb_adapter *adapter)
{
    struct e1000_hw *hw = &adapter->hw;
    struct net_device *netdev = adapter->netdev;

    switch (hw->mac.type) {
    case e1000_82576:
        snprintf(adapter->ptp_caps.name, 16, "%pm", netdev->dev_addr);
        adapter->ptp_caps.owner = THIS_MODULE;
        adapter->ptp_caps.max_adj = 999999881;
        adapter->ptp_caps.n_ext_ts = 0;
        adapter->ptp_caps.pps = 0;
        adapter->ptp_caps.adjfreq = igb_ptp_adjfreq_82576;
        adapter->ptp_caps.adjtime = igb_ptp_adjtime_82576;
        adapter->ptp_caps.gettime = igb_ptp_gettime_82576;
        adapter->ptp_caps.settime = igb_ptp_settime_82576;
        adapter->ptp_caps.enable = igb_ptp_enable;
        adapter->cc.read = igb_ptp_read_82576;
        adapter->cc.mask = CLOCKSOURCE_MASK(64);
        adapter->cc.mult = 1;
        adapter->cc.shift = IGB_82576_TSYNC_SHIFT;
        /* Dial the nominal frequency. */
        wr32(E1000_TIMINCA, INCPERIOD_82576 | INCVALUE_82576);
        break;
    case e1000_82580:
    case e1000_i354:
    case e1000_i350:
        snprintf(adapter->ptp_caps.name, 16, "%pm", netdev->dev_addr);
        adapter->ptp_caps.owner = THIS_MODULE;
        adapter->ptp_caps.max_adj = 62499999;
        adapter->ptp_caps.n_ext_ts = 0;
        adapter->ptp_caps.pps = 0;
        adapter->ptp_caps.adjfreq = igb_ptp_adjfreq_82580;
        adapter->ptp_caps.adjtime = igb_ptp_adjtime_82576;
        adapter->ptp_caps.gettime = igb_ptp_gettime_82576;
        adapter->ptp_caps.settime = igb_ptp_settime_82576;
        adapter->ptp_caps.enable = igb_ptp_enable;
        adapter->cc.read = igb_ptp_read_82580;
        adapter->cc.mask = CLOCKSOURCE_MASK(IGB_NBITS_82580);
        adapter->cc.mult = 1;
        adapter->cc.shift = 0;
        /* Enable the timer functions by clearing bit 31. */
        wr32(E1000_TSAUXC, 0x0);
        break;
    case e1000_i210:
    case e1000_i211:
        snprintf(adapter->ptp_caps.name, 16, "%pm", netdev->dev_addr);
        adapter->ptp_caps.owner = THIS_MODULE;
        adapter->ptp_caps.max_adj = 62499999;
        adapter->ptp_caps.n_ext_ts = 0;
        adapter->ptp_caps.pps = 0;
        adapter->ptp_caps.adjfreq = igb_ptp_adjfreq_82580;
        adapter->ptp_caps.adjtime = igb_ptp_adjtime_i210;
        adapter->ptp_caps.gettime = igb_ptp_gettime_i210;
        adapter->ptp_caps.settime = igb_ptp_settime_i210;
        adapter->ptp_caps.enable = igb_ptp_enable;
        /* Enable the timer functions by clearing bit 31. */
        wr32(E1000_TSAUXC, 0x0);
        break;
    default:
        adapter->ptp_clock = NULL;
        return;
    }

    wrfl();

    spin_lock_init(&adapter->tmreg_lock);
    INIT_WORK(&adapter->ptp_tx_work, igb_ptp_tx_work);

    /* Initialize the clock and overflow work for devices that need it. */
    if ((hw->mac.type == e1000_i210) || (hw->mac.type == e1000_i211)) {
        struct timespec ts = ktime_to_timespec(ktime_get_real());

        igb_ptp_settime_i210(&adapter->ptp_caps, &ts);
    } else {
        timecounter_init(&adapter->tc, &adapter->cc,
                         ktime_to_ns(ktime_get_real()));

        INIT_DELAYED_WORK(&adapter->ptp_overflow_work,
                          igb_ptp_overflow_check);

        schedule_delayed_work(&adapter->ptp_overflow_work,
                              IGB_SYSTIM_OVERFLOW_PERIOD);
    }

    /* Initialize the time sync interrupts for devices that support it. */
    if (hw->mac.type >= e1000_82580) {
        wr32(E1000_TSIM, E1000_TSIM_TXTS);
        wr32(E1000_IMS, E1000_IMS_TS);
    }

    adapter->ptp_clock = ptp_clock_register(&adapter->ptp_caps);
    if (IS_ERR(adapter->ptp_clock)) {
        adapter->ptp_clock = NULL;
        dev_err(&adapter->pdev->dev, "ptp_clock_register failed\n");
    } else {
        dev_info(&adapter->pdev->dev, "added PHC on %s\n",
                 adapter->netdev->name);
        adapter->flags |= IGB_FLAG_PTP;
    }
}
void igb_ptp_init(struct igb_adapter *adapter)
{
	struct e1000_hw *hw = &adapter->hw;
	struct net_device *netdev = adapter->netdev;
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,15,0)
	int i;
#endif

	switch (hw->mac.type) {
	case e1000_82576:
		snprintf(adapter->ptp_caps.name, 16, "%pm", netdev->dev_addr);
		adapter->ptp_caps.owner = THIS_MODULE;
		adapter->ptp_caps.max_adj = 999999881;
		adapter->ptp_caps.n_ext_ts = 0;
		adapter->ptp_caps.pps = 0;
		adapter->ptp_caps.adjfreq = igb_ptp_adjfreq_82576;
		adapter->ptp_caps.adjtime = igb_ptp_adjtime_82576;
		adapter->ptp_caps.gettime = igb_ptp_gettime_82576;
		adapter->ptp_caps.settime = igb_ptp_settime_82576;
		adapter->ptp_caps.enable = igb_ptp_feature_enable;
		adapter->cc.read = igb_ptp_read_82576;
		adapter->cc.mask = CYCLECOUNTER_MASK(64);
		adapter->cc.mult = 1;
		adapter->cc.shift = IGB_82576_TSYNC_SHIFT;
		/* Dial the nominal frequency. */
		wr32(E1000_TIMINCA, INCPERIOD_82576 | INCVALUE_82576);
		break;
	case e1000_82580:
	case e1000_i354:
	case e1000_i350:
		snprintf(adapter->ptp_caps.name, 16, "%pm", netdev->dev_addr);
		adapter->ptp_caps.owner = THIS_MODULE;
		adapter->ptp_caps.max_adj = 62499999;
		adapter->ptp_caps.n_ext_ts = 0;
		adapter->ptp_caps.pps = 0;
		adapter->ptp_caps.adjfreq = igb_ptp_adjfreq_82580;
		adapter->ptp_caps.adjtime = igb_ptp_adjtime_82576;
		adapter->ptp_caps.gettime = igb_ptp_gettime_82576;
		adapter->ptp_caps.settime = igb_ptp_settime_82576;
		adapter->ptp_caps.enable = igb_ptp_feature_enable;
		adapter->cc.read = igb_ptp_read_82580;
		adapter->cc.mask = CYCLECOUNTER_MASK(IGB_NBITS_82580);
		adapter->cc.mult = 1;
		adapter->cc.shift = 0;
		/* Enable the timer functions by clearing bit 31. */
		wr32(E1000_TSAUXC, 0x0);
		break;
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,15,0)
	case e1000_i210:
	case e1000_i211:
		for (i = 0; i < IGB_N_SDP; i++) {
			struct ptp_pin_desc *ppd = &adapter->sdp_config[i];

			snprintf(ppd->name, sizeof(ppd->name), "SDP%d", i);
			ppd->index = i;
			ppd->func = PTP_PF_NONE;
		}
		snprintf(adapter->ptp_caps.name, 16, "%pm", netdev->dev_addr);
		adapter->ptp_caps.owner = THIS_MODULE;
		adapter->ptp_caps.max_adj = 62499999;
		adapter->ptp_caps.n_ext_ts = IGB_N_EXTTS;
		adapter->ptp_caps.n_per_out = IGB_N_PEROUT;
		adapter->ptp_caps.n_pins = IGB_N_SDP;
		adapter->ptp_caps.pps = 1;
		adapter->ptp_caps.pin_config = adapter->sdp_config;
		adapter->ptp_caps.adjfreq = igb_ptp_adjfreq_82580;
		adapter->ptp_caps.adjtime = igb_ptp_adjtime_i210;
		adapter->ptp_caps.gettime = igb_ptp_gettime_i210;
		adapter->ptp_caps.settime = igb_ptp_settime_i210;
		adapter->ptp_caps.enable = igb_ptp_feature_enable_i210;
		adapter->ptp_caps.verify = igb_ptp_verify_pin;
		/* Enable the timer functions by clearing bit 31. */
		wr32(E1000_TSAUXC, 0x0);
		break;
#endif
	default:
		adapter->ptp_clock = NULL;
		return;
	}

	wrfl();

	spin_lock_init(&adapter->tmreg_lock);
	INIT_WORK(&adapter->ptp_tx_work, igb_ptp_tx_work);

	/* Initialize the clock and overflow work for devices that need it. */
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,15,0)
	if ((hw->mac.type == e1000_i210) || (hw->mac.type == e1000_i211)) {
		struct timespec ts = ktime_to_timespec(ktime_get_real());

		igb_ptp_settime_i210(&adapter->ptp_caps, &ts);
	} else
#endif
	{
		timecounter_init(&adapter->tc, &adapter->cc,
				 ktime_to_ns(ktime_get_real()));

		INIT_DELAYED_WORK(&adapter->ptp_overflow_work,
				  igb_ptp_overflow_check);

		schedule_delayed_work(&adapter->ptp_overflow_work,
				      IGB_SYSTIM_OVERFLOW_PERIOD);
	}

	/* Initialize the time sync interrupts for devices that support it. */
	if (hw->mac.type >= e1000_82580) {
		wr32(E1000_TSIM, TSYNC_INTERRUPTS);
		wr32(E1000_IMS, E1000_IMS_TS);
	}

	adapter->tstamp_config.rx_filter = HWTSTAMP_FILTER_NONE;
	adapter->tstamp_config.tx_type = HWTSTAMP_TX_OFF;

	adapter->ptp_clock = ptp_clock_register(&adapter->ptp_caps,
						&adapter->pdev->dev);
	if (IS_ERR(adapter->ptp_clock)) {
		adapter->ptp_clock = NULL;
		dev_err(&adapter->pdev->dev, "ptp_clock_register failed\n");
	} else {
		dev_info(&adapter->pdev->dev, "added PHC on %s\n",
			 adapter->netdev->name);
		adapter->flags |= IGB_FLAG_PTP;
	}
}