Esempio n. 1
0
/**
 * igb_ptp_tx_work
 * @work: pointer to work struct
 *
 * This work function polls the TSYNCTXCTL valid bit to determine when a
 * timestamp has been taken for the current stored skb.
 **/
void igb_ptp_tx_work(struct work_struct *work)
{
    struct igb_adapter *adapter = container_of(work, struct igb_adapter,
                                  ptp_tx_work);
    struct e1000_hw *hw = &adapter->hw;
    u32 tsynctxctl;

    if (!adapter->ptp_tx_skb)
        return;

    if (time_is_before_jiffies(adapter->ptp_tx_start +
                               IGB_PTP_TX_TIMEOUT)) {
        dev_kfree_skb_any(adapter->ptp_tx_skb);
        adapter->ptp_tx_skb = NULL;
        adapter->tx_hwtstamp_timeouts++;
        dev_warn(&adapter->pdev->dev, "clearing Tx timestamp hang");
        return;
    }

    tsynctxctl = rd32(E1000_TSYNCTXCTL);
    if (tsynctxctl & E1000_TSYNCTXCTL_VALID)
        igb_ptp_tx_hwtstamp(adapter);
    else
        /* reschedule to check later */
        schedule_work(&adapter->ptp_tx_work);
}
Esempio n. 2
0
/**
 * igb_ptp_tx_work
 * @work: pointer to work struct
 *
 * This work function polls the TSYNCTXCTL valid bit to determine when a
 * timestamp has been taken for the current stored skb.
 */
void igb_ptp_tx_work(struct work_struct *work)
{
	struct igb_adapter *adapter = container_of(work, struct igb_adapter,
						   ptp_tx_work);
	struct e1000_hw *hw = &adapter->hw;
	u32 tsynctxctl;

	if (!adapter->ptp_tx_skb)
		return;

	tsynctxctl = E1000_READ_REG(hw, E1000_TSYNCTXCTL);
	if (tsynctxctl & E1000_TSYNCTXCTL_VALID)
		igb_ptp_tx_hwtstamp(adapter);
	else
		/* reschedule to check later */
		schedule_work(&adapter->ptp_tx_work);
}