summaryrefslogtreecommitdiff
path: root/drivers/net/fec_1588.h
blob: a503527eadbb4ca3459c6437841dccf3262e241c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
/*
 * drivers/net/fec_1588.h
 *
 * Copyright (C) 2010 Freescale Semiconductor, Inc.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 */

#ifndef FEC_1588_H
#define FEC_1588_H

#include <linux/circ_buf.h>

/* FEC 1588 register bits */
#define FEC_T_CTRL_CAPTURE		0x00000800
#define FEC_T_CTRL_RESTART		0x00000200
#define FEC_T_CTRL_PERIOD_RST		0x00000030
#define FEC_T_CTRL_ENABLE		0x00000001

#define FEC_T_INC_MASK			0x0000007f
#define FEC_T_INC_OFFSET		0

#define FEC_T_INC_40MHZ			25

#define FEC_T_PERIOD_ONE_SEC		0x3B9ACA00

/* IEEE 1588 definition */
#define FEC_ECNTRL_TS_EN	0x10
#define PTP_MAJOR		232	/*the temporary major number
						 *used by PTP driver, the major
						 *number 232~239 is unassigned*/

#define DEFAULT_PTP_RX_BUF_SZ		2048
#define PTP_MSG_SYNC			0x0
#define PTP_MSG_DEL_REQ			0x1
#define PTP_MSG_P_DEL_REQ		0x2
#define PTP_MSG_P_DEL_RESP		0x3
#define PTP_MSG_DEL_RESP		0x4
#define PTP_MSG_ALL_OTHER		0x5

#define PTP_GET_TX_TIMESTAMP		0x1
#define PTP_GET_RX_TIMESTAMP		0x2
#define PTP_SET_RTC_TIME		0x3
#define PTP_SET_COMPENSATION		0x4
#define PTP_GET_CURRENT_TIME		0x5
#define PTP_FLUSH_TIMESTAMP		0x6
#define PTP_ADJ_ADDEND			0x7
#define PTP_GET_ORIG_COMP		0x8
#define PTP_GET_ADDEND			0xB
#define PTP_GET_RX_TIMESTAMP_PDELAY_REQ		0xC
#define PTP_GET_RX_TIMESTAMP_PDELAY_RESP	0xD

#define FEC_PTP_DOMAIN_DLFT		0xe0000181
#define FEC_PTP_IP_OFFS			0xE
#define FEC_PTP_UDP_OFFS		0x22
#define FEC_PTP_MSG_TYPE_OFFS		0x2A
#define FEC_PTP_SEQ_ID_OFFS		0x48
#define FEC_PTP_CTRL_OFFS		0x4A
#define FEC_PACKET_TYPE_UDP		0x11

/* PTP standard time representation structure */
struct ptp_time{
	u64 sec;	/* seconds */
	u32 nsec;	/* nanoseconds */
};

/* Structure for PTP Time Stamp */
struct fec_ptp_data_t {
	int		key;
	struct ptp_time	ts_time;
};

/* interface for PTP driver command GET_TX_TIME */
struct ptp_ts_data {
	/* PTP version */
	u8 version;
	/* PTP source port ID */
	u8 spid[10];
	/* PTP sequence ID */
	u16 seq_id;
	/* PTP message type */
	u8 message_type;
	/* PTP timestamp */
	struct ptp_time ts;
};

/* interface for PTP driver command SET_RTC_TIME/GET_CURRENT_TIME */
struct ptp_rtc_time {
	struct ptp_time rtc_time;
};

/* PTP message version */
#define PTP_1588_MSG_VER_1	1
#define PTP_1588_MSG_VER_2	2

#define BD_ENET_TX_TS		0x20000000
#define BD_ENET_TX_BDU		0x80000000

struct fec_ptp_private {
	void __iomem *hwp;

	struct	circ_buf rx_time_sync;
	struct	circ_buf rx_time_del_req;
	struct	circ_buf rx_time_pdel_req;
	struct	circ_buf rx_time_pdel_resp;
	spinlock_t ptp_lock;
	spinlock_t cnt_lock;

	u64	prtc;
	struct ptp_time	txstamp;
};

#ifdef CONFIG_FEC_1588
extern int fec_ptp_init(struct fec_ptp_private *priv, int id);
extern void fec_ptp_cleanup(struct fec_ptp_private *priv);
extern int fec_ptp_start(struct fec_ptp_private *priv);
extern void fec_ptp_stop(struct fec_ptp_private *priv);
extern int fec_ptp_do_txstamp(struct sk_buff *skb);
extern void fec_ptp_store_txstamp(struct fec_ptp_private *priv);
extern void fec_ptp_store_rxstamp(struct fec_ptp_private *priv,
				  struct sk_buff *skb,
				  struct bufdesc *bdp);
#else
static inline int fec_ptp_init(struct fec_ptp_private *priv, int id)
{
	return 1;
}
static inline void fec_ptp_cleanup(struct fec_ptp_private *priv) { }
static inline int fec_ptp_start(struct fec_ptp_private *priv)
{
	return 1;
}
static inline void fec_ptp_stop(struct fec_ptp_private *priv) {}
static inline int fec_ptp_do_txstamp(struct sk_buff *skb)
{
	return 0;
}
static inline void fec_ptp_store_txstamp(struct fec_ptp_private *priv) {}
static inline void fec_ptp_store_rxstamp(struct fec_ptp_private *priv,
					 struct sk_buff *skb,
					 struct bufdesc *bdp) {}
#endif /* 1588 */

#endif