/* * cxgb4_ptp.c:Chelsio PTP support for T5/T6 * * Copyright (c) 2003-2017 Chelsio Communications, Inc. All rights reserved. * * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU * General Public License (GPL) Version 2, available from the file * COPYING in the main directory of this source tree, or the * OpenIB.org BSD license below: * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * - Redistributions of source code must retain the above * copyright notice, this list of conditions and the following * disclaimer. * * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials * provided with the distribution. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * * Written by: Atul Gupta ([email protected]) */ #include <linux/module.h> #include <linux/net_tstamp.h> #include <linux/skbuff.h> #include <linux/netdevice.h> #include <linux/pps_kernel.h> #include <linux/ptp_clock_kernel.h> #include <linux/ptp_classify.h> #include <linux/udp.h> #include "cxgb4.h" #include "t4_hw.h" #include "t4_regs.h" #include "t4_msg.h" #include "t4fw_api.h" #include "cxgb4_ptp.h" /** * cxgb4_ptp_is_ptp_tx - determine whether TX packet is PTP or not * @skb: skb of outgoing ptp request * */ bool cxgb4_ptp_is_ptp_tx(struct sk_buff *skb) { … } bool is_ptp_enabled(struct sk_buff *skb, struct net_device *dev) { … } /** * cxgb4_ptp_is_ptp_rx - determine whether RX packet is PTP or not * @skb: skb of incoming ptp request * */ bool cxgb4_ptp_is_ptp_rx(struct sk_buff *skb) { … } /** * cxgb4_ptp_read_hwstamp - read timestamp for TX event PTP message * @adapter: board private structure * @pi: port private structure * */ void cxgb4_ptp_read_hwstamp(struct adapter *adapter, struct port_info *pi) { … } /** * cxgb4_ptprx_timestamping - Enable Timestamp for RX PTP event message * @pi: port private structure * @port: pot number * @mode: RX mode * */ int cxgb4_ptprx_timestamping(struct port_info *pi, u8 port, u16 mode) { … } int cxgb4_ptp_txtype(struct adapter *adapter, u8 port) { … } int cxgb4_ptp_redirect_rx_packet(struct adapter *adapter, struct port_info *pi) { … } /** * cxgb4_ptp_adjfine - Adjust frequency of PHC cycle counter * @ptp: ptp clock structure * @scaled_ppm: Desired frequency in scaled parts per billion * * Adjust the frequency of the PHC cycle counter by the indicated amount from * the base frequency. * * Scaled parts per million is ppm with a 16-bit binary fractional field. */ static int cxgb4_ptp_adjfine(struct ptp_clock_info *ptp, long scaled_ppm) { … } /** * cxgb4_ptp_fineadjtime - Shift the time of the hardware clock * @adapter: board private structure * @delta: Desired change in nanoseconds * * Adjust the timer by resetting the timecounter structure. */ static int cxgb4_ptp_fineadjtime(struct adapter *adapter, s64 delta) { … } /** * cxgb4_ptp_adjtime - Shift the time of the hardware clock * @ptp: ptp clock structure * @delta: Desired change in nanoseconds * * Adjust the timer by resetting the timecounter structure. */ static int cxgb4_ptp_adjtime(struct ptp_clock_info *ptp, s64 delta) { … } /** * cxgb4_ptp_gettime - Reads the current time from the hardware clock * @ptp: ptp clock structure * @ts: timespec structure to hold the current time value * * Read the timecounter and return the correct value in ns after converting * it into a struct timespec. */ static int cxgb4_ptp_gettime(struct ptp_clock_info *ptp, struct timespec64 *ts) { … } /** * cxgb4_ptp_settime - Set the current time on the hardware clock * @ptp: ptp clock structure * @ts: timespec containing the new time for the cycle counter * * Reset value to new base value instead of the kernel * wall timer value. */ static int cxgb4_ptp_settime(struct ptp_clock_info *ptp, const struct timespec64 *ts) { … } static void cxgb4_init_ptp_timer(struct adapter *adapter) { … } /** * cxgb4_ptp_enable - enable or disable an ancillary feature * @ptp: ptp clock structure * @request: Desired resource to enable or disable * @on: Caller passes one to enable or zero to disable * * Enable (or disable) ancillary features of the PHC subsystem. * Currently, no ancillary features are supported. */ static int cxgb4_ptp_enable(struct ptp_clock_info __always_unused *ptp, struct ptp_clock_request __always_unused *request, int __always_unused on) { … } static const struct ptp_clock_info cxgb4_ptp_clock_info = …; /** * cxgb4_ptp_init - initialize PTP for devices which support it * @adapter: board private structure * * This function performs the required steps for enabling PTP support. */ void cxgb4_ptp_init(struct adapter *adapter) { … } /** * cxgb4_ptp_stop - disable PTP device and stop the overflow check * @adapter: board private structure * * Stop the PTP support. */ void cxgb4_ptp_stop(struct adapter *adapter) { … }