Commit 2f5501a8 authored by David S. Miller's avatar David S. Miller
Browse files

Merge branch 'bnxt_en-ptp-fixes'



Michael Chan says:

====================
bnxt_en: PTP fixes

This series includes 2 fixes for the PTP feature.  Update to the new
firmware interface so that the driver can pass the PTP sequence number
header offset of TX packets to the firmware.  This is needed for all
PTP packet types (v1, v2, with or without VLAN) to work.  The 2nd
fix is to use a different register window to read the PHC to avoid
conflict with an older Broadcom tool.
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 1027b96e 92529df7
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -426,7 +426,10 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev)

		if (ptp && ptp->tx_tstamp_en && !skb_is_gso(skb) &&
		    atomic_dec_if_positive(&ptp->tx_avail) >= 0) {
			if (!bnxt_ptp_parse(skb, &ptp->tx_seqid)) {
			if (!bnxt_ptp_parse(skb, &ptp->tx_seqid,
					    &ptp->tx_hdr_off)) {
				if (vlan_tag_flags)
					ptp->tx_hdr_off += VLAN_HLEN;
				lflags |= cpu_to_le32(TX_BD_FLAGS_STAMP);
				skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
			} else {
+55 −21
Original line number Diff line number Diff line
@@ -368,6 +368,7 @@ struct cmd_nums {
	#define HWRM_FUNC_PTP_TS_QUERY                    0x19fUL
	#define HWRM_FUNC_PTP_EXT_CFG                     0x1a0UL
	#define HWRM_FUNC_PTP_EXT_QCFG                    0x1a1UL
	#define HWRM_FUNC_KEY_CTX_ALLOC                   0x1a2UL
	#define HWRM_SELFTEST_QLIST                       0x200UL
	#define HWRM_SELFTEST_EXEC                        0x201UL
	#define HWRM_SELFTEST_IRQ                         0x202UL
@@ -531,8 +532,8 @@ struct hwrm_err_output {
#define HWRM_VERSION_MAJOR 1
#define HWRM_VERSION_MINOR 10
#define HWRM_VERSION_UPDATE 2
#define HWRM_VERSION_RSVD 47
#define HWRM_VERSION_STR "1.10.2.47"
#define HWRM_VERSION_RSVD 52
#define HWRM_VERSION_STR "1.10.2.52"

/* hwrm_ver_get_input (size:192b/24B) */
struct hwrm_ver_get_input {
@@ -585,6 +586,7 @@ struct hwrm_ver_get_output {
	#define VER_GET_RESP_DEV_CAPS_CFG_CFA_ADV_FLOW_MGNT_SUPPORTED              0x1000UL
	#define VER_GET_RESP_DEV_CAPS_CFG_CFA_TFLIB_SUPPORTED                      0x2000UL
	#define VER_GET_RESP_DEV_CAPS_CFG_CFA_TRUFLOW_SUPPORTED                    0x4000UL
	#define VER_GET_RESP_DEV_CAPS_CFG_SECURE_BOOT_CAPABLE                      0x8000UL
	u8	roce_fw_maj_8b;
	u8	roce_fw_min_8b;
	u8	roce_fw_bld_8b;
@@ -886,7 +888,8 @@ struct hwrm_async_event_cmpl_reset_notify {
	#define ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA1_REASON_CODE_FW_EXCEPTION_FATAL        (0x2UL << 8)
	#define ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA1_REASON_CODE_FW_EXCEPTION_NON_FATAL    (0x3UL << 8)
	#define ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA1_REASON_CODE_FAST_RESET                (0x4UL << 8)
	#define ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA1_REASON_CODE_LAST                     ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA1_REASON_CODE_FAST_RESET
	#define ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA1_REASON_CODE_FW_ACTIVATION             (0x5UL << 8)
	#define ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA1_REASON_CODE_LAST                     ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA1_REASON_CODE_FW_ACTIVATION
	#define ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA1_DELAY_IN_100MS_TICKS_MASK           0xffff0000UL
	#define ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA1_DELAY_IN_100MS_TICKS_SFT            16
};
@@ -1242,7 +1245,8 @@ struct hwrm_async_event_cmpl_error_report_base {
	#define ASYNC_EVENT_CMPL_ERROR_REPORT_BASE_EVENT_DATA1_ERROR_TYPE_PAUSE_STORM              0x1UL
	#define ASYNC_EVENT_CMPL_ERROR_REPORT_BASE_EVENT_DATA1_ERROR_TYPE_INVALID_SIGNAL           0x2UL
	#define ASYNC_EVENT_CMPL_ERROR_REPORT_BASE_EVENT_DATA1_ERROR_TYPE_NVM                      0x3UL
	#define ASYNC_EVENT_CMPL_ERROR_REPORT_BASE_EVENT_DATA1_ERROR_TYPE_LAST           ASYNC_EVENT_CMPL_ERROR_REPORT_BASE_EVENT_DATA1_ERROR_TYPE_NVM
	#define ASYNC_EVENT_CMPL_ERROR_REPORT_BASE_EVENT_DATA1_ERROR_TYPE_DOORBELL_DROP_THRESHOLD  0x4UL
	#define ASYNC_EVENT_CMPL_ERROR_REPORT_BASE_EVENT_DATA1_ERROR_TYPE_LAST                    ASYNC_EVENT_CMPL_ERROR_REPORT_BASE_EVENT_DATA1_ERROR_TYPE_DOORBELL_DROP_THRESHOLD
};

/* hwrm_async_event_cmpl_error_report_pause_storm (size:128b/16B) */
@@ -1446,6 +1450,8 @@ struct hwrm_func_vf_cfg_input {
	#define FUNC_VF_CFG_REQ_ENABLES_NUM_VNICS            0x200UL
	#define FUNC_VF_CFG_REQ_ENABLES_NUM_STAT_CTXS        0x400UL
	#define FUNC_VF_CFG_REQ_ENABLES_NUM_HW_RING_GRPS     0x800UL
	#define FUNC_VF_CFG_REQ_ENABLES_NUM_TX_KEY_CTXS      0x1000UL
	#define FUNC_VF_CFG_REQ_ENABLES_NUM_RX_KEY_CTXS      0x2000UL
	__le16	mtu;
	__le16	guest_vlan;
	__le16	async_event_cr;
@@ -1469,7 +1475,8 @@ struct hwrm_func_vf_cfg_input {
	__le16	num_vnics;
	__le16	num_stat_ctxs;
	__le16	num_hw_ring_grps;
	u8	unused_0[4];
	__le16	num_tx_key_ctxs;
	__le16	num_rx_key_ctxs;
};

/* hwrm_func_vf_cfg_output (size:128b/16B) */
@@ -1493,7 +1500,7 @@ struct hwrm_func_qcaps_input {
	u8	unused_0[6];
};

/* hwrm_func_qcaps_output (size:704b/88B) */
/* hwrm_func_qcaps_output (size:768b/96B) */
struct hwrm_func_qcaps_output {
	__le16	error_code;
	__le16	req_type;
@@ -1587,7 +1594,8 @@ struct hwrm_func_qcaps_output {
	#define FUNC_QCAPS_RESP_MPC_CHNLS_CAP_TE_CFA      0x4UL
	#define FUNC_QCAPS_RESP_MPC_CHNLS_CAP_RE_CFA      0x8UL
	#define FUNC_QCAPS_RESP_MPC_CHNLS_CAP_PRIMATE     0x10UL
	u8	unused_1;
	__le16	max_key_ctxs_alloc;
	u8	unused_1[7];
	u8	valid;
};

@@ -1602,7 +1610,7 @@ struct hwrm_func_qcfg_input {
	u8	unused_0[6];
};

/* hwrm_func_qcfg_output (size:832b/104B) */
/* hwrm_func_qcfg_output (size:896b/112B) */
struct hwrm_func_qcfg_output {
	__le16	error_code;
	__le16	req_type;
@@ -1749,11 +1757,13 @@ struct hwrm_func_qcfg_output {
	#define FUNC_QCFG_RESP_PARTITION_MAX_BW_BW_VALUE_UNIT_PERCENT1_100  (0x1UL << 29)
	#define FUNC_QCFG_RESP_PARTITION_MAX_BW_BW_VALUE_UNIT_LAST         FUNC_QCFG_RESP_PARTITION_MAX_BW_BW_VALUE_UNIT_PERCENT1_100
	__le16	host_mtu;
	u8	unused_3;
	__le16	alloc_tx_key_ctxs;
	__le16	alloc_rx_key_ctxs;
	u8	unused_3[5];
	u8	valid;
};

/* hwrm_func_cfg_input (size:832b/104B) */
/* hwrm_func_cfg_input (size:896b/112B) */
struct hwrm_func_cfg_input {
	__le16	req_type;
	__le16	cmpl_ring;
@@ -1820,6 +1830,8 @@ struct hwrm_func_cfg_input {
	#define FUNC_CFG_REQ_ENABLES_PARTITION_MAX_BW         0x8000000UL
	#define FUNC_CFG_REQ_ENABLES_TPID                     0x10000000UL
	#define FUNC_CFG_REQ_ENABLES_HOST_MTU                 0x20000000UL
	#define FUNC_CFG_REQ_ENABLES_TX_KEY_CTXS              0x40000000UL
	#define FUNC_CFG_REQ_ENABLES_RX_KEY_CTXS              0x80000000UL
	__le16	admin_mtu;
	__le16	mru;
	__le16	num_rsscos_ctxs;
@@ -1929,6 +1941,9 @@ struct hwrm_func_cfg_input {
	#define FUNC_CFG_REQ_PARTITION_MAX_BW_BW_VALUE_UNIT_LAST         FUNC_CFG_REQ_PARTITION_MAX_BW_BW_VALUE_UNIT_PERCENT1_100
	__be16	tpid;
	__le16	host_mtu;
	__le16	num_tx_key_ctxs;
	__le16	num_rx_key_ctxs;
	u8	unused_0[4];
};

/* hwrm_func_cfg_output (size:128b/16B) */
@@ -2099,6 +2114,7 @@ struct hwrm_func_drv_rgtr_input {
	#define FUNC_DRV_RGTR_REQ_FLAGS_MASTER_SUPPORT                   0x40UL
	#define FUNC_DRV_RGTR_REQ_FLAGS_FAST_RESET_SUPPORT               0x80UL
	#define FUNC_DRV_RGTR_REQ_FLAGS_RSS_STRICT_HASH_TYPE_SUPPORT     0x100UL
	#define FUNC_DRV_RGTR_REQ_FLAGS_NPAR_1_2_SUPPORT                 0x200UL
	__le32	enables;
	#define FUNC_DRV_RGTR_REQ_ENABLES_OS_TYPE             0x1UL
	#define FUNC_DRV_RGTR_REQ_ENABLES_VER                 0x2UL
@@ -2268,7 +2284,7 @@ struct hwrm_func_resource_qcaps_input {
	u8	unused_0[6];
};

/* hwrm_func_resource_qcaps_output (size:448b/56B) */
/* hwrm_func_resource_qcaps_output (size:512b/64B) */
struct hwrm_func_resource_qcaps_output {
	__le16	error_code;
	__le16	req_type;
@@ -2300,11 +2316,15 @@ struct hwrm_func_resource_qcaps_output {
	__le16	max_tx_scheduler_inputs;
	__le16	flags;
	#define FUNC_RESOURCE_QCAPS_RESP_FLAGS_MIN_GUARANTEED     0x1UL
	__le16	min_tx_key_ctxs;
	__le16	max_tx_key_ctxs;
	__le16	min_rx_key_ctxs;
	__le16	max_rx_key_ctxs;
	u8	unused_0[5];
	u8	valid;
};

/* hwrm_func_vf_resource_cfg_input (size:448b/56B) */
/* hwrm_func_vf_resource_cfg_input (size:512b/64B) */
struct hwrm_func_vf_resource_cfg_input {
	__le16	req_type;
	__le16	cmpl_ring;
@@ -2331,6 +2351,10 @@ struct hwrm_func_vf_resource_cfg_input {
	__le16	max_hw_ring_grps;
	__le16	flags;
	#define FUNC_VF_RESOURCE_CFG_REQ_FLAGS_MIN_GUARANTEED     0x1UL
	__le16	min_tx_key_ctxs;
	__le16	max_tx_key_ctxs;
	__le16	min_rx_key_ctxs;
	__le16	max_rx_key_ctxs;
	u8	unused_0[2];
};

@@ -2348,7 +2372,9 @@ struct hwrm_func_vf_resource_cfg_output {
	__le16	reserved_vnics;
	__le16	reserved_stat_ctx;
	__le16	reserved_hw_ring_grps;
	u8	unused_0[7];
	__le16	reserved_tx_key_ctxs;
	__le16	reserved_rx_key_ctxs;
	u8	unused_0[3];
	u8	valid;
};

@@ -4220,7 +4246,7 @@ struct hwrm_port_lpbk_clr_stats_output {
	u8	valid;
};

/* hwrm_port_ts_query_input (size:256b/32B) */
/* hwrm_port_ts_query_input (size:320b/40B) */
struct hwrm_port_ts_query_input {
	__le16	req_type;
	__le16	cmpl_ring;
@@ -4238,8 +4264,11 @@ struct hwrm_port_ts_query_input {
	__le16	enables;
	#define PORT_TS_QUERY_REQ_ENABLES_TS_REQ_TIMEOUT     0x1UL
	#define PORT_TS_QUERY_REQ_ENABLES_PTP_SEQ_ID         0x2UL
	#define PORT_TS_QUERY_REQ_ENABLES_PTP_HDR_OFFSET     0x4UL
	__le16	ts_req_timeout;
	__le32	ptp_seq_id;
	__le16	ptp_hdr_offset;
	u8	unused_1[6];
};

/* hwrm_port_ts_query_output (size:192b/24B) */
@@ -8172,6 +8201,7 @@ struct hwrm_fw_reset_input {
	u8	host_idx;
	u8	flags;
	#define FW_RESET_REQ_FLAGS_RESET_GRACEFUL     0x1UL
	#define FW_RESET_REQ_FLAGS_FW_ACTIVATION      0x2UL
	u8	unused_0[4];
};

@@ -8952,7 +8982,7 @@ struct hwrm_nvm_get_dir_info_output {
	u8	valid;
};

/* hwrm_nvm_write_input (size:384b/48B) */
/* hwrm_nvm_write_input (size:448b/56B) */
struct hwrm_nvm_write_input {
	__le16	req_type;
	__le16	cmpl_ring;
@@ -8968,7 +8998,11 @@ struct hwrm_nvm_write_input {
	__le16	option;
	__le16	flags;
	#define NVM_WRITE_REQ_FLAGS_KEEP_ORIG_ACTIVE_IMG     0x1UL
	#define NVM_WRITE_REQ_FLAGS_BATCH_MODE               0x2UL
	#define NVM_WRITE_REQ_FLAGS_BATCH_LAST               0x4UL
	__le32	dir_item_length;
	__le32	offset;
	__le32	len;
	__le32	unused_0;
};

+3 −1
Original line number Diff line number Diff line
@@ -20,7 +20,7 @@
#include "bnxt.h"
#include "bnxt_ptp.h"

int bnxt_ptp_parse(struct sk_buff *skb, u16 *seq_id)
int bnxt_ptp_parse(struct sk_buff *skb, u16 *seq_id, u16 *hdr_off)
{
	unsigned int ptp_class;
	struct ptp_header *hdr;
@@ -34,6 +34,7 @@ int bnxt_ptp_parse(struct sk_buff *skb, u16 *seq_id)
		if (!hdr)
			return -EINVAL;

		*hdr_off = (u8 *)hdr - skb->data;
		*seq_id	 = ntohs(hdr->sequence_id);
		return 0;
	default:
@@ -91,6 +92,7 @@ static int bnxt_hwrm_port_ts_query(struct bnxt *bp, u32 flags, u64 *ts)
	    PORT_TS_QUERY_REQ_FLAGS_PATH_TX) {
		req.enables = cpu_to_le16(BNXT_PTP_QTS_TX_ENABLES);
		req.ptp_seq_id = cpu_to_le32(bp->ptp_cfg->tx_seqid);
		req.ptp_hdr_offset = cpu_to_le16(bp->ptp_cfg->tx_hdr_off);
		req.ts_req_timeout = cpu_to_le16(BNXT_PTP_QTS_TIMEOUT);
	}
	mutex_lock(&bp->hwrm_cmd_lock);
+6 −4
Original line number Diff line number Diff line
@@ -10,8 +10,8 @@
#ifndef BNXT_PTP_H
#define BNXT_PTP_H

#define BNXT_PTP_GRC_WIN	5
#define BNXT_PTP_GRC_WIN_BASE	0x5000
#define BNXT_PTP_GRC_WIN	6
#define BNXT_PTP_GRC_WIN_BASE	0x6000

#define BNXT_MAX_PHC_DRIFT	31000000
#define BNXT_LO_TIMER_MASK	0x0000ffffffffUL
@@ -19,7 +19,8 @@

#define BNXT_PTP_QTS_TIMEOUT	1000
#define BNXT_PTP_QTS_TX_ENABLES	(PORT_TS_QUERY_REQ_ENABLES_PTP_SEQ_ID |	\
				 PORT_TS_QUERY_REQ_ENABLES_TS_REQ_TIMEOUT)
				 PORT_TS_QUERY_REQ_ENABLES_TS_REQ_TIMEOUT | \
				 PORT_TS_QUERY_REQ_ENABLES_PTP_HDR_OFFSET)

struct bnxt_ptp_cfg {
	struct ptp_clock_info	ptp_info;
@@ -37,6 +38,7 @@ struct bnxt_ptp_cfg {
	#define BNXT_PHC_OVERFLOW_PERIOD	(19 * 3600 * HZ)

	u16			tx_seqid;
	u16			tx_hdr_off;
	struct bnxt		*bp;
	atomic_t		tx_avail;
#define BNXT_MAX_TX_TS	1
@@ -74,7 +76,7 @@ do { \
	((dst) = READ_ONCE(src))
#endif

int bnxt_ptp_parse(struct sk_buff *skb, u16 *seq_id);
int bnxt_ptp_parse(struct sk_buff *skb, u16 *seq_id, u16 *hdr_off);
int bnxt_hwtstamp_set(struct net_device *dev, struct ifreq *ifr);
int bnxt_hwtstamp_get(struct net_device *dev, struct ifreq *ifr);
int bnxt_get_tx_ts_p5(struct bnxt *bp, struct sk_buff *skb);