dp83640.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110
  1. /*
  2. * Driver for the National Semiconductor DP83640 PHYTER
  3. *
  4. * Copyright (C) 2010 OMICRON electronics GmbH
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation; either version 2 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program; if not, write to the Free Software
  18. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19. */
  20. #include <linux/ethtool.h>
  21. #include <linux/kernel.h>
  22. #include <linux/list.h>
  23. #include <linux/mii.h>
  24. #include <linux/module.h>
  25. #include <linux/net_tstamp.h>
  26. #include <linux/netdevice.h>
  27. #include <linux/phy.h>
  28. #include <linux/ptp_classify.h>
  29. #include <linux/ptp_clock_kernel.h>
  30. #include "dp83640_reg.h"
  31. #define DP83640_PHY_ID 0x20005ce1
  32. #define PAGESEL 0x13
  33. #define LAYER4 0x02
  34. #define LAYER2 0x01
  35. #define MAX_RXTS 4
  36. #define MAX_TXTS 4
  37. #define N_EXT_TS 1
  38. #define PSF_PTPVER 2
  39. #define PSF_EVNT 0x4000
  40. #define PSF_RX 0x2000
  41. #define PSF_TX 0x1000
  42. #define EXT_EVENT 1
  43. #define EXT_GPIO 1
  44. #define CAL_EVENT 2
  45. #define CAL_GPIO 9
  46. #define CAL_TRIGGER 2
  47. /* phyter seems to miss the mark by 16 ns */
  48. #define ADJTIME_FIX 16
  49. #if defined(__BIG_ENDIAN)
  50. #define ENDIAN_FLAG 0
  51. #elif defined(__LITTLE_ENDIAN)
  52. #define ENDIAN_FLAG PSF_ENDIAN
  53. #endif
  54. #define SKB_PTP_TYPE(__skb) (*(unsigned int *)((__skb)->cb))
  55. struct phy_rxts {
  56. u16 ns_lo; /* ns[15:0] */
  57. u16 ns_hi; /* overflow[1:0], ns[29:16] */
  58. u16 sec_lo; /* sec[15:0] */
  59. u16 sec_hi; /* sec[31:16] */
  60. u16 seqid; /* sequenceId[15:0] */
  61. u16 msgtype; /* messageType[3:0], hash[11:0] */
  62. };
  63. struct phy_txts {
  64. u16 ns_lo; /* ns[15:0] */
  65. u16 ns_hi; /* overflow[1:0], ns[29:16] */
  66. u16 sec_lo; /* sec[15:0] */
  67. u16 sec_hi; /* sec[31:16] */
  68. };
  69. struct rxts {
  70. struct list_head list;
  71. unsigned long tmo;
  72. u64 ns;
  73. u16 seqid;
  74. u8 msgtype;
  75. u16 hash;
  76. };
  77. struct dp83640_clock;
  78. struct dp83640_private {
  79. struct list_head list;
  80. struct dp83640_clock *clock;
  81. struct phy_device *phydev;
  82. struct work_struct ts_work;
  83. int hwts_tx_en;
  84. int hwts_rx_en;
  85. int layer;
  86. int version;
  87. /* remember state of cfg0 during calibration */
  88. int cfg0;
  89. /* remember the last event time stamp */
  90. struct phy_txts edata;
  91. /* list of rx timestamps */
  92. struct list_head rxts;
  93. struct list_head rxpool;
  94. struct rxts rx_pool_data[MAX_RXTS];
  95. /* protects above three fields from concurrent access */
  96. spinlock_t rx_lock;
  97. /* queues of incoming and outgoing packets */
  98. struct sk_buff_head rx_queue;
  99. struct sk_buff_head tx_queue;
  100. };
  101. struct dp83640_clock {
  102. /* keeps the instance in the 'phyter_clocks' list */
  103. struct list_head list;
  104. /* we create one clock instance per MII bus */
  105. struct mii_bus *bus;
  106. /* protects extended registers from concurrent access */
  107. struct mutex extreg_lock;
  108. /* remembers which page was last selected */
  109. int page;
  110. /* our advertised capabilities */
  111. struct ptp_clock_info caps;
  112. /* protects the three fields below from concurrent access */
  113. struct mutex clock_lock;
  114. /* the one phyter from which we shall read */
  115. struct dp83640_private *chosen;
  116. /* list of the other attached phyters, not chosen */
  117. struct list_head phylist;
  118. /* reference to our PTP hardware clock */
  119. struct ptp_clock *ptp_clock;
  120. };
  121. /* globals */
  122. static int chosen_phy = -1;
  123. static ushort cal_gpio = 4;
  124. module_param(chosen_phy, int, 0444);
  125. module_param(cal_gpio, ushort, 0444);
  126. MODULE_PARM_DESC(chosen_phy, \
  127. "The address of the PHY to use for the ancillary clock features");
  128. MODULE_PARM_DESC(cal_gpio, \
  129. "Which GPIO line to use for synchronizing multiple PHYs");
  130. /* a list of clocks and a mutex to protect it */
  131. static LIST_HEAD(phyter_clocks);
  132. static DEFINE_MUTEX(phyter_clocks_lock);
  133. static void rx_timestamp_work(struct work_struct *work);
  134. /* extended register access functions */
  135. #define BROADCAST_ADDR 31
  136. static inline int broadcast_write(struct mii_bus *bus, u32 regnum, u16 val)
  137. {
  138. return mdiobus_write(bus, BROADCAST_ADDR, regnum, val);
  139. }
  140. /* Caller must hold extreg_lock. */
  141. static int ext_read(struct phy_device *phydev, int page, u32 regnum)
  142. {
  143. struct dp83640_private *dp83640 = phydev->priv;
  144. int val;
  145. if (dp83640->clock->page != page) {
  146. broadcast_write(phydev->bus, PAGESEL, page);
  147. dp83640->clock->page = page;
  148. }
  149. val = phy_read(phydev, regnum);
  150. return val;
  151. }
  152. /* Caller must hold extreg_lock. */
  153. static void ext_write(int broadcast, struct phy_device *phydev,
  154. int page, u32 regnum, u16 val)
  155. {
  156. struct dp83640_private *dp83640 = phydev->priv;
  157. if (dp83640->clock->page != page) {
  158. broadcast_write(phydev->bus, PAGESEL, page);
  159. dp83640->clock->page = page;
  160. }
  161. if (broadcast)
  162. broadcast_write(phydev->bus, regnum, val);
  163. else
  164. phy_write(phydev, regnum, val);
  165. }
  166. /* Caller must hold extreg_lock. */
  167. static int tdr_write(int bc, struct phy_device *dev,
  168. const struct timespec *ts, u16 cmd)
  169. {
  170. ext_write(bc, dev, PAGE4, PTP_TDR, ts->tv_nsec & 0xffff);/* ns[15:0] */
  171. ext_write(bc, dev, PAGE4, PTP_TDR, ts->tv_nsec >> 16); /* ns[31:16] */
  172. ext_write(bc, dev, PAGE4, PTP_TDR, ts->tv_sec & 0xffff); /* sec[15:0] */
  173. ext_write(bc, dev, PAGE4, PTP_TDR, ts->tv_sec >> 16); /* sec[31:16]*/
  174. ext_write(bc, dev, PAGE4, PTP_CTL, cmd);
  175. return 0;
  176. }
  177. /* convert phy timestamps into driver timestamps */
  178. static void phy2rxts(struct phy_rxts *p, struct rxts *rxts)
  179. {
  180. u32 sec;
  181. sec = p->sec_lo;
  182. sec |= p->sec_hi << 16;
  183. rxts->ns = p->ns_lo;
  184. rxts->ns |= (p->ns_hi & 0x3fff) << 16;
  185. rxts->ns += ((u64)sec) * 1000000000ULL;
  186. rxts->seqid = p->seqid;
  187. rxts->msgtype = (p->msgtype >> 12) & 0xf;
  188. rxts->hash = p->msgtype & 0x0fff;
  189. rxts->tmo = jiffies + HZ;
  190. }
  191. static u64 phy2txts(struct phy_txts *p)
  192. {
  193. u64 ns;
  194. u32 sec;
  195. sec = p->sec_lo;
  196. sec |= p->sec_hi << 16;
  197. ns = p->ns_lo;
  198. ns |= (p->ns_hi & 0x3fff) << 16;
  199. ns += ((u64)sec) * 1000000000ULL;
  200. return ns;
  201. }
  202. /* ptp clock methods */
  203. static int ptp_dp83640_adjfreq(struct ptp_clock_info *ptp, s32 ppb)
  204. {
  205. struct dp83640_clock *clock =
  206. container_of(ptp, struct dp83640_clock, caps);
  207. struct phy_device *phydev = clock->chosen->phydev;
  208. u64 rate;
  209. int neg_adj = 0;
  210. u16 hi, lo;
  211. if (ppb < 0) {
  212. neg_adj = 1;
  213. ppb = -ppb;
  214. }
  215. rate = ppb;
  216. rate <<= 26;
  217. rate = div_u64(rate, 1953125);
  218. hi = (rate >> 16) & PTP_RATE_HI_MASK;
  219. if (neg_adj)
  220. hi |= PTP_RATE_DIR;
  221. lo = rate & 0xffff;
  222. mutex_lock(&clock->extreg_lock);
  223. ext_write(1, phydev, PAGE4, PTP_RATEH, hi);
  224. ext_write(1, phydev, PAGE4, PTP_RATEL, lo);
  225. mutex_unlock(&clock->extreg_lock);
  226. return 0;
  227. }
  228. static int ptp_dp83640_adjtime(struct ptp_clock_info *ptp, s64 delta)
  229. {
  230. struct dp83640_clock *clock =
  231. container_of(ptp, struct dp83640_clock, caps);
  232. struct phy_device *phydev = clock->chosen->phydev;
  233. struct timespec ts;
  234. int err;
  235. delta += ADJTIME_FIX;
  236. ts = ns_to_timespec(delta);
  237. mutex_lock(&clock->extreg_lock);
  238. err = tdr_write(1, phydev, &ts, PTP_STEP_CLK);
  239. mutex_unlock(&clock->extreg_lock);
  240. return err;
  241. }
  242. static int ptp_dp83640_gettime(struct ptp_clock_info *ptp, struct timespec *ts)
  243. {
  244. struct dp83640_clock *clock =
  245. container_of(ptp, struct dp83640_clock, caps);
  246. struct phy_device *phydev = clock->chosen->phydev;
  247. unsigned int val[4];
  248. mutex_lock(&clock->extreg_lock);
  249. ext_write(0, phydev, PAGE4, PTP_CTL, PTP_RD_CLK);
  250. val[0] = ext_read(phydev, PAGE4, PTP_TDR); /* ns[15:0] */
  251. val[1] = ext_read(phydev, PAGE4, PTP_TDR); /* ns[31:16] */
  252. val[2] = ext_read(phydev, PAGE4, PTP_TDR); /* sec[15:0] */
  253. val[3] = ext_read(phydev, PAGE4, PTP_TDR); /* sec[31:16] */
  254. mutex_unlock(&clock->extreg_lock);
  255. ts->tv_nsec = val[0] | (val[1] << 16);
  256. ts->tv_sec = val[2] | (val[3] << 16);
  257. return 0;
  258. }
  259. static int ptp_dp83640_settime(struct ptp_clock_info *ptp,
  260. const struct timespec *ts)
  261. {
  262. struct dp83640_clock *clock =
  263. container_of(ptp, struct dp83640_clock, caps);
  264. struct phy_device *phydev = clock->chosen->phydev;
  265. int err;
  266. mutex_lock(&clock->extreg_lock);
  267. err = tdr_write(1, phydev, ts, PTP_LOAD_CLK);
  268. mutex_unlock(&clock->extreg_lock);
  269. return err;
  270. }
  271. static int ptp_dp83640_enable(struct ptp_clock_info *ptp,
  272. struct ptp_clock_request *rq, int on)
  273. {
  274. struct dp83640_clock *clock =
  275. container_of(ptp, struct dp83640_clock, caps);
  276. struct phy_device *phydev = clock->chosen->phydev;
  277. u16 evnt;
  278. switch (rq->type) {
  279. case PTP_CLK_REQ_EXTTS:
  280. if (rq->extts.index != 0)
  281. return -EINVAL;
  282. evnt = EVNT_WR | (EXT_EVENT & EVNT_SEL_MASK) << EVNT_SEL_SHIFT;
  283. if (on) {
  284. evnt |= (EXT_GPIO & EVNT_GPIO_MASK) << EVNT_GPIO_SHIFT;
  285. evnt |= EVNT_RISE;
  286. }
  287. ext_write(0, phydev, PAGE5, PTP_EVNT, evnt);
  288. return 0;
  289. default:
  290. break;
  291. }
  292. return -EOPNOTSUPP;
  293. }
  294. static u8 status_frame_dst[6] = { 0x01, 0x1B, 0x19, 0x00, 0x00, 0x00 };
  295. static u8 status_frame_src[6] = { 0x08, 0x00, 0x17, 0x0B, 0x6B, 0x0F };
  296. static void enable_status_frames(struct phy_device *phydev, bool on)
  297. {
  298. u16 cfg0 = 0, ver;
  299. if (on)
  300. cfg0 = PSF_EVNT_EN | PSF_RXTS_EN | PSF_TXTS_EN | ENDIAN_FLAG;
  301. ver = (PSF_PTPVER & VERSIONPTP_MASK) << VERSIONPTP_SHIFT;
  302. ext_write(0, phydev, PAGE5, PSF_CFG0, cfg0);
  303. ext_write(0, phydev, PAGE6, PSF_CFG1, ver);
  304. if (!phydev->attached_dev) {
  305. pr_warning("dp83640: expected to find an attached netdevice\n");
  306. return;
  307. }
  308. if (on) {
  309. if (dev_mc_add(phydev->attached_dev, status_frame_dst))
  310. pr_warning("dp83640: failed to add mc address\n");
  311. } else {
  312. if (dev_mc_del(phydev->attached_dev, status_frame_dst))
  313. pr_warning("dp83640: failed to delete mc address\n");
  314. }
  315. }
  316. static bool is_status_frame(struct sk_buff *skb, int type)
  317. {
  318. struct ethhdr *h = eth_hdr(skb);
  319. if (PTP_CLASS_V2_L2 == type &&
  320. !memcmp(h->h_source, status_frame_src, sizeof(status_frame_src)))
  321. return true;
  322. else
  323. return false;
  324. }
  325. static int expired(struct rxts *rxts)
  326. {
  327. return time_after(jiffies, rxts->tmo);
  328. }
  329. /* Caller must hold rx_lock. */
  330. static void prune_rx_ts(struct dp83640_private *dp83640)
  331. {
  332. struct list_head *this, *next;
  333. struct rxts *rxts;
  334. list_for_each_safe(this, next, &dp83640->rxts) {
  335. rxts = list_entry(this, struct rxts, list);
  336. if (expired(rxts)) {
  337. list_del_init(&rxts->list);
  338. list_add(&rxts->list, &dp83640->rxpool);
  339. }
  340. }
  341. }
  342. /* synchronize the phyters so they act as one clock */
  343. static void enable_broadcast(struct phy_device *phydev, int init_page, int on)
  344. {
  345. int val;
  346. phy_write(phydev, PAGESEL, 0);
  347. val = phy_read(phydev, PHYCR2);
  348. if (on)
  349. val |= BC_WRITE;
  350. else
  351. val &= ~BC_WRITE;
  352. phy_write(phydev, PHYCR2, val);
  353. phy_write(phydev, PAGESEL, init_page);
  354. }
  355. static void recalibrate(struct dp83640_clock *clock)
  356. {
  357. s64 now, diff;
  358. struct phy_txts event_ts;
  359. struct timespec ts;
  360. struct list_head *this;
  361. struct dp83640_private *tmp;
  362. struct phy_device *master = clock->chosen->phydev;
  363. u16 cfg0, evnt, ptp_trig, trigger, val;
  364. trigger = CAL_TRIGGER;
  365. mutex_lock(&clock->extreg_lock);
  366. /*
  367. * enable broadcast, disable status frames, enable ptp clock
  368. */
  369. list_for_each(this, &clock->phylist) {
  370. tmp = list_entry(this, struct dp83640_private, list);
  371. enable_broadcast(tmp->phydev, clock->page, 1);
  372. tmp->cfg0 = ext_read(tmp->phydev, PAGE5, PSF_CFG0);
  373. ext_write(0, tmp->phydev, PAGE5, PSF_CFG0, 0);
  374. ext_write(0, tmp->phydev, PAGE4, PTP_CTL, PTP_ENABLE);
  375. }
  376. enable_broadcast(master, clock->page, 1);
  377. cfg0 = ext_read(master, PAGE5, PSF_CFG0);
  378. ext_write(0, master, PAGE5, PSF_CFG0, 0);
  379. ext_write(0, master, PAGE4, PTP_CTL, PTP_ENABLE);
  380. /*
  381. * enable an event timestamp
  382. */
  383. evnt = EVNT_WR | EVNT_RISE | EVNT_SINGLE;
  384. evnt |= (CAL_EVENT & EVNT_SEL_MASK) << EVNT_SEL_SHIFT;
  385. evnt |= (cal_gpio & EVNT_GPIO_MASK) << EVNT_GPIO_SHIFT;
  386. list_for_each(this, &clock->phylist) {
  387. tmp = list_entry(this, struct dp83640_private, list);
  388. ext_write(0, tmp->phydev, PAGE5, PTP_EVNT, evnt);
  389. }
  390. ext_write(0, master, PAGE5, PTP_EVNT, evnt);
  391. /*
  392. * configure a trigger
  393. */
  394. ptp_trig = TRIG_WR | TRIG_IF_LATE | TRIG_PULSE;
  395. ptp_trig |= (trigger & TRIG_CSEL_MASK) << TRIG_CSEL_SHIFT;
  396. ptp_trig |= (cal_gpio & TRIG_GPIO_MASK) << TRIG_GPIO_SHIFT;
  397. ext_write(0, master, PAGE5, PTP_TRIG, ptp_trig);
  398. /* load trigger */
  399. val = (trigger & TRIG_SEL_MASK) << TRIG_SEL_SHIFT;
  400. val |= TRIG_LOAD;
  401. ext_write(0, master, PAGE4, PTP_CTL, val);
  402. /* enable trigger */
  403. val &= ~TRIG_LOAD;
  404. val |= TRIG_EN;
  405. ext_write(0, master, PAGE4, PTP_CTL, val);
  406. /* disable trigger */
  407. val = (trigger & TRIG_SEL_MASK) << TRIG_SEL_SHIFT;
  408. val |= TRIG_DIS;
  409. ext_write(0, master, PAGE4, PTP_CTL, val);
  410. /*
  411. * read out and correct offsets
  412. */
  413. val = ext_read(master, PAGE4, PTP_STS);
  414. pr_info("master PTP_STS 0x%04hx", val);
  415. val = ext_read(master, PAGE4, PTP_ESTS);
  416. pr_info("master PTP_ESTS 0x%04hx", val);
  417. event_ts.ns_lo = ext_read(master, PAGE4, PTP_EDATA);
  418. event_ts.ns_hi = ext_read(master, PAGE4, PTP_EDATA);
  419. event_ts.sec_lo = ext_read(master, PAGE4, PTP_EDATA);
  420. event_ts.sec_hi = ext_read(master, PAGE4, PTP_EDATA);
  421. now = phy2txts(&event_ts);
  422. list_for_each(this, &clock->phylist) {
  423. tmp = list_entry(this, struct dp83640_private, list);
  424. val = ext_read(tmp->phydev, PAGE4, PTP_STS);
  425. pr_info("slave PTP_STS 0x%04hx", val);
  426. val = ext_read(tmp->phydev, PAGE4, PTP_ESTS);
  427. pr_info("slave PTP_ESTS 0x%04hx", val);
  428. event_ts.ns_lo = ext_read(tmp->phydev, PAGE4, PTP_EDATA);
  429. event_ts.ns_hi = ext_read(tmp->phydev, PAGE4, PTP_EDATA);
  430. event_ts.sec_lo = ext_read(tmp->phydev, PAGE4, PTP_EDATA);
  431. event_ts.sec_hi = ext_read(tmp->phydev, PAGE4, PTP_EDATA);
  432. diff = now - (s64) phy2txts(&event_ts);
  433. pr_info("slave offset %lld nanoseconds\n", diff);
  434. diff += ADJTIME_FIX;
  435. ts = ns_to_timespec(diff);
  436. tdr_write(0, tmp->phydev, &ts, PTP_STEP_CLK);
  437. }
  438. /*
  439. * restore status frames
  440. */
  441. list_for_each(this, &clock->phylist) {
  442. tmp = list_entry(this, struct dp83640_private, list);
  443. ext_write(0, tmp->phydev, PAGE5, PSF_CFG0, tmp->cfg0);
  444. }
  445. ext_write(0, master, PAGE5, PSF_CFG0, cfg0);
  446. mutex_unlock(&clock->extreg_lock);
  447. }
  448. /* time stamping methods */
  449. static int decode_evnt(struct dp83640_private *dp83640,
  450. void *data, u16 ests)
  451. {
  452. struct phy_txts *phy_txts;
  453. struct ptp_clock_event event;
  454. int words = (ests >> EVNT_TS_LEN_SHIFT) & EVNT_TS_LEN_MASK;
  455. u16 ext_status = 0;
  456. if (ests & MULT_EVNT) {
  457. ext_status = *(u16 *) data;
  458. data += sizeof(ext_status);
  459. }
  460. phy_txts = data;
  461. switch (words) { /* fall through in every case */
  462. case 3:
  463. dp83640->edata.sec_hi = phy_txts->sec_hi;
  464. case 2:
  465. dp83640->edata.sec_lo = phy_txts->sec_lo;
  466. case 1:
  467. dp83640->edata.ns_hi = phy_txts->ns_hi;
  468. case 0:
  469. dp83640->edata.ns_lo = phy_txts->ns_lo;
  470. }
  471. event.type = PTP_CLOCK_EXTTS;
  472. event.index = 0;
  473. event.timestamp = phy2txts(&dp83640->edata);
  474. ptp_clock_event(dp83640->clock->ptp_clock, &event);
  475. words = ext_status ? words + 2 : words + 1;
  476. return words * sizeof(u16);
  477. }
  478. static void decode_rxts(struct dp83640_private *dp83640,
  479. struct phy_rxts *phy_rxts)
  480. {
  481. struct rxts *rxts;
  482. unsigned long flags;
  483. spin_lock_irqsave(&dp83640->rx_lock, flags);
  484. prune_rx_ts(dp83640);
  485. if (list_empty(&dp83640->rxpool)) {
  486. pr_warning("dp83640: rx timestamp pool is empty\n");
  487. goto out;
  488. }
  489. rxts = list_first_entry(&dp83640->rxpool, struct rxts, list);
  490. list_del_init(&rxts->list);
  491. phy2rxts(phy_rxts, rxts);
  492. list_add_tail(&rxts->list, &dp83640->rxts);
  493. out:
  494. spin_unlock_irqrestore(&dp83640->rx_lock, flags);
  495. }
  496. static void decode_txts(struct dp83640_private *dp83640,
  497. struct phy_txts *phy_txts)
  498. {
  499. struct skb_shared_hwtstamps shhwtstamps;
  500. struct sk_buff *skb;
  501. u64 ns;
  502. /* We must already have the skb that triggered this. */
  503. skb = skb_dequeue(&dp83640->tx_queue);
  504. if (!skb) {
  505. pr_warning("dp83640: have timestamp but tx_queue empty\n");
  506. return;
  507. }
  508. ns = phy2txts(phy_txts);
  509. memset(&shhwtstamps, 0, sizeof(shhwtstamps));
  510. shhwtstamps.hwtstamp = ns_to_ktime(ns);
  511. skb_complete_tx_timestamp(skb, &shhwtstamps);
  512. }
  513. static void decode_status_frame(struct dp83640_private *dp83640,
  514. struct sk_buff *skb)
  515. {
  516. struct phy_rxts *phy_rxts;
  517. struct phy_txts *phy_txts;
  518. u8 *ptr;
  519. int len, size;
  520. u16 ests, type;
  521. ptr = skb->data + 2;
  522. for (len = skb_headlen(skb) - 2; len > sizeof(type); len -= size) {
  523. type = *(u16 *)ptr;
  524. ests = type & 0x0fff;
  525. type = type & 0xf000;
  526. len -= sizeof(type);
  527. ptr += sizeof(type);
  528. if (PSF_RX == type && len >= sizeof(*phy_rxts)) {
  529. phy_rxts = (struct phy_rxts *) ptr;
  530. decode_rxts(dp83640, phy_rxts);
  531. size = sizeof(*phy_rxts);
  532. } else if (PSF_TX == type && len >= sizeof(*phy_txts)) {
  533. phy_txts = (struct phy_txts *) ptr;
  534. decode_txts(dp83640, phy_txts);
  535. size = sizeof(*phy_txts);
  536. } else if (PSF_EVNT == type && len >= sizeof(*phy_txts)) {
  537. size = decode_evnt(dp83640, ptr, ests);
  538. } else {
  539. size = 0;
  540. break;
  541. }
  542. ptr += size;
  543. }
  544. }
  545. static int match(struct sk_buff *skb, unsigned int type, struct rxts *rxts)
  546. {
  547. u16 *seqid;
  548. unsigned int offset;
  549. u8 *msgtype, *data = skb_mac_header(skb);
  550. /* check sequenceID, messageType, 12 bit hash of offset 20-29 */
  551. switch (type) {
  552. case PTP_CLASS_V1_IPV4:
  553. case PTP_CLASS_V2_IPV4:
  554. offset = ETH_HLEN + IPV4_HLEN(data) + UDP_HLEN;
  555. break;
  556. case PTP_CLASS_V1_IPV6:
  557. case PTP_CLASS_V2_IPV6:
  558. offset = OFF_PTP6;
  559. break;
  560. case PTP_CLASS_V2_L2:
  561. offset = ETH_HLEN;
  562. break;
  563. case PTP_CLASS_V2_VLAN:
  564. offset = ETH_HLEN + VLAN_HLEN;
  565. break;
  566. default:
  567. return 0;
  568. }
  569. if (skb->len + ETH_HLEN < offset + OFF_PTP_SEQUENCE_ID + sizeof(*seqid))
  570. return 0;
  571. if (unlikely(type & PTP_CLASS_V1))
  572. msgtype = data + offset + OFF_PTP_CONTROL;
  573. else
  574. msgtype = data + offset;
  575. seqid = (u16 *)(data + offset + OFF_PTP_SEQUENCE_ID);
  576. return (rxts->msgtype == (*msgtype & 0xf) &&
  577. rxts->seqid == ntohs(*seqid));
  578. }
  579. static void dp83640_free_clocks(void)
  580. {
  581. struct dp83640_clock *clock;
  582. struct list_head *this, *next;
  583. mutex_lock(&phyter_clocks_lock);
  584. list_for_each_safe(this, next, &phyter_clocks) {
  585. clock = list_entry(this, struct dp83640_clock, list);
  586. if (!list_empty(&clock->phylist)) {
  587. pr_warning("phy list non-empty while unloading");
  588. BUG();
  589. }
  590. list_del(&clock->list);
  591. mutex_destroy(&clock->extreg_lock);
  592. mutex_destroy(&clock->clock_lock);
  593. put_device(&clock->bus->dev);
  594. kfree(clock);
  595. }
  596. mutex_unlock(&phyter_clocks_lock);
  597. }
  598. static void dp83640_clock_init(struct dp83640_clock *clock, struct mii_bus *bus)
  599. {
  600. INIT_LIST_HEAD(&clock->list);
  601. clock->bus = bus;
  602. mutex_init(&clock->extreg_lock);
  603. mutex_init(&clock->clock_lock);
  604. INIT_LIST_HEAD(&clock->phylist);
  605. clock->caps.owner = THIS_MODULE;
  606. sprintf(clock->caps.name, "dp83640 timer");
  607. clock->caps.max_adj = 1953124;
  608. clock->caps.n_alarm = 0;
  609. clock->caps.n_ext_ts = N_EXT_TS;
  610. clock->caps.n_per_out = 0;
  611. clock->caps.pps = 0;
  612. clock->caps.adjfreq = ptp_dp83640_adjfreq;
  613. clock->caps.adjtime = ptp_dp83640_adjtime;
  614. clock->caps.gettime = ptp_dp83640_gettime;
  615. clock->caps.settime = ptp_dp83640_settime;
  616. clock->caps.enable = ptp_dp83640_enable;
  617. /*
  618. * Get a reference to this bus instance.
  619. */
  620. get_device(&bus->dev);
  621. }
  622. static int choose_this_phy(struct dp83640_clock *clock,
  623. struct phy_device *phydev)
  624. {
  625. if (chosen_phy == -1 && !clock->chosen)
  626. return 1;
  627. if (chosen_phy == phydev->addr)
  628. return 1;
  629. return 0;
  630. }
  631. static struct dp83640_clock *dp83640_clock_get(struct dp83640_clock *clock)
  632. {
  633. if (clock)
  634. mutex_lock(&clock->clock_lock);
  635. return clock;
  636. }
  637. /*
  638. * Look up and lock a clock by bus instance.
  639. * If there is no clock for this bus, then create it first.
  640. */
  641. static struct dp83640_clock *dp83640_clock_get_bus(struct mii_bus *bus)
  642. {
  643. struct dp83640_clock *clock = NULL, *tmp;
  644. struct list_head *this;
  645. mutex_lock(&phyter_clocks_lock);
  646. list_for_each(this, &phyter_clocks) {
  647. tmp = list_entry(this, struct dp83640_clock, list);
  648. if (tmp->bus == bus) {
  649. clock = tmp;
  650. break;
  651. }
  652. }
  653. if (clock)
  654. goto out;
  655. clock = kzalloc(sizeof(struct dp83640_clock), GFP_KERNEL);
  656. if (!clock)
  657. goto out;
  658. dp83640_clock_init(clock, bus);
  659. list_add_tail(&phyter_clocks, &clock->list);
  660. out:
  661. mutex_unlock(&phyter_clocks_lock);
  662. return dp83640_clock_get(clock);
  663. }
  664. static void dp83640_clock_put(struct dp83640_clock *clock)
  665. {
  666. mutex_unlock(&clock->clock_lock);
  667. }
  668. static int dp83640_probe(struct phy_device *phydev)
  669. {
  670. struct dp83640_clock *clock;
  671. struct dp83640_private *dp83640;
  672. int err = -ENOMEM, i;
  673. if (phydev->addr == BROADCAST_ADDR)
  674. return 0;
  675. clock = dp83640_clock_get_bus(phydev->bus);
  676. if (!clock)
  677. goto no_clock;
  678. dp83640 = kzalloc(sizeof(struct dp83640_private), GFP_KERNEL);
  679. if (!dp83640)
  680. goto no_memory;
  681. dp83640->phydev = phydev;
  682. INIT_WORK(&dp83640->ts_work, rx_timestamp_work);
  683. INIT_LIST_HEAD(&dp83640->rxts);
  684. INIT_LIST_HEAD(&dp83640->rxpool);
  685. for (i = 0; i < MAX_RXTS; i++)
  686. list_add(&dp83640->rx_pool_data[i].list, &dp83640->rxpool);
  687. phydev->priv = dp83640;
  688. spin_lock_init(&dp83640->rx_lock);
  689. skb_queue_head_init(&dp83640->rx_queue);
  690. skb_queue_head_init(&dp83640->tx_queue);
  691. dp83640->clock = clock;
  692. if (choose_this_phy(clock, phydev)) {
  693. clock->chosen = dp83640;
  694. clock->ptp_clock = ptp_clock_register(&clock->caps);
  695. if (IS_ERR(clock->ptp_clock)) {
  696. err = PTR_ERR(clock->ptp_clock);
  697. goto no_register;
  698. }
  699. } else
  700. list_add_tail(&dp83640->list, &clock->phylist);
  701. if (clock->chosen && !list_empty(&clock->phylist))
  702. recalibrate(clock);
  703. else
  704. enable_broadcast(dp83640->phydev, clock->page, 1);
  705. dp83640_clock_put(clock);
  706. return 0;
  707. no_register:
  708. clock->chosen = NULL;
  709. kfree(dp83640);
  710. no_memory:
  711. dp83640_clock_put(clock);
  712. no_clock:
  713. return err;
  714. }
  715. static void dp83640_remove(struct phy_device *phydev)
  716. {
  717. struct dp83640_clock *clock;
  718. struct list_head *this, *next;
  719. struct dp83640_private *tmp, *dp83640 = phydev->priv;
  720. if (phydev->addr == BROADCAST_ADDR)
  721. return;
  722. enable_status_frames(phydev, false);
  723. cancel_work_sync(&dp83640->ts_work);
  724. clock = dp83640_clock_get(dp83640->clock);
  725. if (dp83640 == clock->chosen) {
  726. ptp_clock_unregister(clock->ptp_clock);
  727. clock->chosen = NULL;
  728. } else {
  729. list_for_each_safe(this, next, &clock->phylist) {
  730. tmp = list_entry(this, struct dp83640_private, list);
  731. if (tmp == dp83640) {
  732. list_del_init(&tmp->list);
  733. break;
  734. }
  735. }
  736. }
  737. dp83640_clock_put(clock);
  738. kfree(dp83640);
  739. }
  740. static int dp83640_hwtstamp(struct phy_device *phydev, struct ifreq *ifr)
  741. {
  742. struct dp83640_private *dp83640 = phydev->priv;
  743. struct hwtstamp_config cfg;
  744. u16 txcfg0, rxcfg0;
  745. if (copy_from_user(&cfg, ifr->ifr_data, sizeof(cfg)))
  746. return -EFAULT;
  747. if (cfg.flags) /* reserved for future extensions */
  748. return -EINVAL;
  749. switch (cfg.tx_type) {
  750. case HWTSTAMP_TX_OFF:
  751. dp83640->hwts_tx_en = 0;
  752. break;
  753. case HWTSTAMP_TX_ON:
  754. dp83640->hwts_tx_en = 1;
  755. break;
  756. default:
  757. return -ERANGE;
  758. }
  759. switch (cfg.rx_filter) {
  760. case HWTSTAMP_FILTER_NONE:
  761. dp83640->hwts_rx_en = 0;
  762. dp83640->layer = 0;
  763. dp83640->version = 0;
  764. break;
  765. case HWTSTAMP_FILTER_PTP_V1_L4_EVENT:
  766. case HWTSTAMP_FILTER_PTP_V1_L4_SYNC:
  767. case HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ:
  768. dp83640->hwts_rx_en = 1;
  769. dp83640->layer = LAYER4;
  770. dp83640->version = 1;
  771. break;
  772. case HWTSTAMP_FILTER_PTP_V2_L4_EVENT:
  773. case HWTSTAMP_FILTER_PTP_V2_L4_SYNC:
  774. case HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ:
  775. dp83640->hwts_rx_en = 1;
  776. dp83640->layer = LAYER4;
  777. dp83640->version = 2;
  778. break;
  779. case HWTSTAMP_FILTER_PTP_V2_L2_EVENT:
  780. case HWTSTAMP_FILTER_PTP_V2_L2_SYNC:
  781. case HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ:
  782. dp83640->hwts_rx_en = 1;
  783. dp83640->layer = LAYER2;
  784. dp83640->version = 2;
  785. break;
  786. case HWTSTAMP_FILTER_PTP_V2_EVENT:
  787. case HWTSTAMP_FILTER_PTP_V2_SYNC:
  788. case HWTSTAMP_FILTER_PTP_V2_DELAY_REQ:
  789. dp83640->hwts_rx_en = 1;
  790. dp83640->layer = LAYER4|LAYER2;
  791. dp83640->version = 2;
  792. break;
  793. default:
  794. return -ERANGE;
  795. }
  796. txcfg0 = (dp83640->version & TX_PTP_VER_MASK) << TX_PTP_VER_SHIFT;
  797. rxcfg0 = (dp83640->version & TX_PTP_VER_MASK) << TX_PTP_VER_SHIFT;
  798. if (dp83640->layer & LAYER2) {
  799. txcfg0 |= TX_L2_EN;
  800. rxcfg0 |= RX_L2_EN;
  801. }
  802. if (dp83640->layer & LAYER4) {
  803. txcfg0 |= TX_IPV6_EN | TX_IPV4_EN;
  804. rxcfg0 |= RX_IPV6_EN | RX_IPV4_EN;
  805. }
  806. if (dp83640->hwts_tx_en)
  807. txcfg0 |= TX_TS_EN;
  808. if (dp83640->hwts_rx_en)
  809. rxcfg0 |= RX_TS_EN;
  810. mutex_lock(&dp83640->clock->extreg_lock);
  811. if (dp83640->hwts_tx_en || dp83640->hwts_rx_en) {
  812. enable_status_frames(phydev, true);
  813. ext_write(0, phydev, PAGE4, PTP_CTL, PTP_ENABLE);
  814. }
  815. ext_write(0, phydev, PAGE5, PTP_TXCFG0, txcfg0);
  816. ext_write(0, phydev, PAGE5, PTP_RXCFG0, rxcfg0);
  817. mutex_unlock(&dp83640->clock->extreg_lock);
  818. return copy_to_user(ifr->ifr_data, &cfg, sizeof(cfg)) ? -EFAULT : 0;
  819. }
  820. static void rx_timestamp_work(struct work_struct *work)
  821. {
  822. struct dp83640_private *dp83640 =
  823. container_of(work, struct dp83640_private, ts_work);
  824. struct list_head *this, *next;
  825. struct rxts *rxts;
  826. struct skb_shared_hwtstamps *shhwtstamps;
  827. struct sk_buff *skb;
  828. unsigned int type;
  829. unsigned long flags;
  830. /* Deliver each deferred packet, with or without a time stamp. */
  831. while ((skb = skb_dequeue(&dp83640->rx_queue)) != NULL) {
  832. type = SKB_PTP_TYPE(skb);
  833. spin_lock_irqsave(&dp83640->rx_lock, flags);
  834. list_for_each_safe(this, next, &dp83640->rxts) {
  835. rxts = list_entry(this, struct rxts, list);
  836. if (match(skb, type, rxts)) {
  837. shhwtstamps = skb_hwtstamps(skb);
  838. memset(shhwtstamps, 0, sizeof(*shhwtstamps));
  839. shhwtstamps->hwtstamp = ns_to_ktime(rxts->ns);
  840. list_del_init(&rxts->list);
  841. list_add(&rxts->list, &dp83640->rxpool);
  842. break;
  843. }
  844. }
  845. spin_unlock_irqrestore(&dp83640->rx_lock, flags);
  846. netif_rx(skb);
  847. }
  848. /* Clear out expired time stamps. */
  849. spin_lock_irqsave(&dp83640->rx_lock, flags);
  850. prune_rx_ts(dp83640);
  851. spin_unlock_irqrestore(&dp83640->rx_lock, flags);
  852. }
  853. static bool dp83640_rxtstamp(struct phy_device *phydev,
  854. struct sk_buff *skb, int type)
  855. {
  856. struct dp83640_private *dp83640 = phydev->priv;
  857. if (!dp83640->hwts_rx_en)
  858. return false;
  859. if (is_status_frame(skb, type)) {
  860. decode_status_frame(dp83640, skb);
  861. kfree_skb(skb);
  862. return true;
  863. }
  864. SKB_PTP_TYPE(skb) = type;
  865. skb_queue_tail(&dp83640->rx_queue, skb);
  866. schedule_work(&dp83640->ts_work);
  867. return true;
  868. }
  869. static void dp83640_txtstamp(struct phy_device *phydev,
  870. struct sk_buff *skb, int type)
  871. {
  872. struct dp83640_private *dp83640 = phydev->priv;
  873. if (!dp83640->hwts_tx_en) {
  874. kfree_skb(skb);
  875. return;
  876. }
  877. skb_queue_tail(&dp83640->tx_queue, skb);
  878. schedule_work(&dp83640->ts_work);
  879. }
  880. static struct phy_driver dp83640_driver = {
  881. .phy_id = DP83640_PHY_ID,
  882. .phy_id_mask = 0xfffffff0,
  883. .name = "NatSemi DP83640",
  884. .features = PHY_BASIC_FEATURES,
  885. .flags = 0,
  886. .probe = dp83640_probe,
  887. .remove = dp83640_remove,
  888. .config_aneg = genphy_config_aneg,
  889. .read_status = genphy_read_status,
  890. .hwtstamp = dp83640_hwtstamp,
  891. .rxtstamp = dp83640_rxtstamp,
  892. .txtstamp = dp83640_txtstamp,
  893. .driver = {.owner = THIS_MODULE,}
  894. };
  895. static int __init dp83640_init(void)
  896. {
  897. return phy_driver_register(&dp83640_driver);
  898. }
  899. static void __exit dp83640_exit(void)
  900. {
  901. dp83640_free_clocks();
  902. phy_driver_unregister(&dp83640_driver);
  903. }
  904. MODULE_DESCRIPTION("National Semiconductor DP83640 PHY driver");
  905. MODULE_AUTHOR("Richard Cochran <richard.cochran@omicron.at>");
  906. MODULE_LICENSE("GPL");
  907. module_init(dp83640_init);
  908. module_exit(dp83640_exit);
  909. static struct mdio_device_id __maybe_unused dp83640_tbl[] = {
  910. { DP83640_PHY_ID, 0xfffffff0 },
  911. { }
  912. };
  913. MODULE_DEVICE_TABLE(mdio, dp83640_tbl);