blob: 361eca6b94a65e8a713c2d6f8da0a54e14f6fc32 [file] [log] [blame]
developerfd40db22021-04-29 10:08:25 +08001Index: drivers/net/phy/mtk/mt753x/Makefile
2===================================================================
3--- a/drivers/net/phy/mtk/mt753x/Makefile
4+++ b/drivers/net/phy/mtk/mt753x/Makefile
5@@ -7,5 +7,5 @@ obj-$(CONFIG_MT753X_GSW) += mt753x.o
6 mt753x-$(CONFIG_SWCONFIG) += mt753x_swconfig.o
7
8 mt753x-y += mt753x_mdio.o mt7530.o mt7531.o \
9- mt753x_common.o mt753x_vlan.o mt753x_nl.o
10+ mt753x_common.o mt753x_vlan.o mt753x_nl.o mt753x_phy.o
11
12Index: drivers/net/phy/mtk/mt753x/mt7531.c
13===================================================================
14--- a/drivers/net/phy/mtk/mt753x/mt7531.c
15+++ b/drivers/net/phy/mtk/mt753x/mt7531.c
16@@ -658,6 +658,27 @@ static void mt7531_core_pll_setup(struct
17
18 static int mt7531_internal_phy_calibration(struct gsw_mt753x *gsw)
19 {
20+ u32 i, val;
21+ int ret;
22+
23+ dev_info(gsw->dev,">>>>>>>>>>>>>>>>>>>>>>>>>>>>> START CALIBRATION:\n");
24+
25+ /* gphy value from sw path */
26+ val = gsw->mmd_read(gsw, 0, PHY_DEV1F, PHY_DEV1F_REG_403);
27+ val |= GBE_EFUSE_SETTING;
28+ gsw->mmd_write(gsw, 0, PHY_DEV1F, PHY_DEV1F_REG_403, val);
29+
30+ for (i = 0; i < 5; i++) {
31+ dev_info(gsw->dev, "-------- gephy-calbration (port:%d) --------\n",
32+ i);
33+ ret = mt753x_phy_calibration(gsw, i);
34+
35+ /* set Auto-negotiation with giga extension. */
36+ gsw->mii_write(gsw, i, 0, 0x1340);
37+ if (ret)
38+ return ret;
39+ }
40+
41 return 0;
42 }
43
44Index: drivers/net/phy/mtk/mt753x/mt753x.h
45===================================================================
46--- a/drivers/net/phy/mtk/mt753x/mt753x.h
47+++ b/drivers/net/phy/mtk/mt753x/mt753x.h
48@@ -140,6 +140,8 @@ void mt753x_irq_enable(struct gsw_mt753x
49 int mt753x_phy_calibration(struct gsw_mt753x *gsw, u8 phyaddr);
50 int extphy_init(struct gsw_mt753x *gsw, int addr);
51
52+int mt753x_phy_calibration(struct gsw_mt753x *gsw, u8 phyaddr);
53+
54 /* MDIO Indirect Access Registers */
55 #define MII_MMD_ACC_CTL_REG 0x0d
56 #define MMD_CMD_S 14
57Index: drivers/net/phy/mtk/mt753x/mt753x_phy.c
58===================================================================
59new file mode 100644
60--- /dev/null
61+++ b/drivers/net/phy/mtk/mt753x/mt753x_phy.c
62@@ -0,0 +1,1069 @@
63+// SPDX-License-Identifier: GPL-2.0+
64+/*
65+ * Common part for MediaTek MT753x gigabit switch
66+ *
67+ * Copyright (C) 2018 MediaTek Inc. All Rights Reserved.
68+ *
69+ * Author: Weijie Gao <weijie.gao@mediatek.com>
70+ */
71+
72+#include <linux/kernel.h>
73+#include <linux/delay.h>
74+
75+#include "mt753x.h"
76+#include "mt753x_regs.h"
77+#include "mt753x_phy.h"
78+
79+u32 tc_phy_read_dev_reg(struct gsw_mt753x *gsw, u32 port_num, u32 dev_addr, u32 reg_addr)
80+{
81+ u32 phy_val;
82+ phy_val = gsw->mmd_read(gsw, port_num, dev_addr, reg_addr);
83+
84+ //printk("switch phy cl45 r %d 0x%x 0x%x = %x\n",port_num, dev_addr, reg_addr, phy_val);
85+ //switch_phy_read_cl45(port_num, dev_addr, reg_addr, &phy_val);
86+ return phy_val;
87+}
88+
89+void tc_phy_write_dev_reg(struct gsw_mt753x *gsw, u32 port_num, u32 dev_addr, u32 reg_addr, u32 write_data)
90+{
91+ u32 phy_val;
92+ gsw->mmd_write(gsw, port_num, dev_addr, reg_addr, write_data);
93+ phy_val = gsw->mmd_read(gsw, port_num, dev_addr, reg_addr);
94+ //printk("switch phy cl45 w %d 0x%x 0x%x 0x%x --> read back 0x%x\n",port_num, dev_addr, reg_addr, write_data, phy_val);
95+ //switch_phy_write_cl45(port_num, dev_addr, reg_addr, write_data);
96+}
97+
98+void switch_phy_write(struct gsw_mt753x *gsw, u32 port_num, u32 reg_addr, u32 write_data){
99+ gsw->mii_write(gsw, port_num, reg_addr, write_data);
100+}
101+
102+u32 switch_phy_read(struct gsw_mt753x *gsw, u32 port_num, u32 reg_addr){
103+ return gsw->mii_read(gsw, port_num, reg_addr);
104+}
105+
106+const u8 MT753x_ZCAL_TO_R50ohm_GE_TBL_100[64] = {
107+ 127, 127, 127, 127, 127, 127, 127, 127,
108+ 127, 127, 127, 127, 127, 123, 122, 117,
109+ 115, 112, 103, 100, 98, 87, 85, 83,
110+ 81, 72, 70, 68, 66, 64, 55, 53,
111+ 52, 50, 49, 48, 38, 36, 35, 34,
112+ 33, 32, 22, 21, 20, 19, 18, 17,
113+ 16, 7, 6, 5, 4, 3, 2, 1,
114+ 0, 0, 0, 0, 0, 0, 0, 0
115+};
116+
117+const u8 MT753x_TX_OFFSET_TBL[64] = {
118+ 0x1f, 0x1e, 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18,
119+ 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10,
120+ 0xf, 0xe, 0xd, 0xc, 0xb, 0xa, 0x9, 0x8,
121+ 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0,
122+ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
123+ 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
124+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
125+ 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f
126+};
127+
128+u8 ge_cal_flag;
129+
130+u8 all_ge_ana_cal_wait(struct gsw_mt753x *gsw, u32 delay, u32 phyaddr) // for EN7512
131+{
132+ u8 all_ana_cal_status;
133+ u32 cnt, tmp_1e_17c;
134+ //tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x017c, 0x0001); // da_calin_flag pull high
135+ tc_phy_write_dev_reg(gsw, PHY0, 0x1e, 0x17c, 0x0001);
136+ //printk("delay = %d\n", delay);
137+
138+ cnt = 10000;
139+ do {
140+ udelay(delay);
141+ cnt--;
142+ all_ana_cal_status = tc_phy_read_dev_reg(gsw, PHY0, 0x1e, 0x17b) & 0x1;
143+
144+ } while ((all_ana_cal_status == 0) && (cnt != 0));
145+
146+
147+ if(all_ana_cal_status == 1) {
148+ tc_phy_write_dev_reg(gsw, PHY0, 0x1e, 0x17c, 0);
149+ return all_ana_cal_status;
150+ } else {
151+ tmp_1e_17c = tc_phy_read_dev_reg(gsw, PHY0, 0x1e, 0x17c);
152+ if ((tmp_1e_17c & 0x1) != 1) {
153+ pr_info("FIRST MDC/MDIO write error\n");
154+ pr_info("FIRST 1e_17c = %x\n", tc_phy_read_dev_reg(gsw, PHY0, 0x1e, 0x17c));
155+
156+ }
157+ printk("re-K again\n");
158+
159+ tc_phy_write_dev_reg(gsw, PHY0, 0x1e, 0x17c, 0);
160+ tc_phy_write_dev_reg(gsw, PHY0, 0x1e, 0x17c, 0x0001);
161+ cnt = 10000;
162+ do {
163+ udelay(delay);
164+ cnt--;
165+ tmp_1e_17c = tc_phy_read_dev_reg(gsw, PHY0, 0x1e, 0x17c);
166+ if ((tmp_1e_17c & 0x1) != 1) {
167+ pr_info("SECOND MDC/MDIO write error\n");
168+ pr_info("SECOND 1e_17c = %x\n", tc_phy_read_dev_reg(gsw, PHY0, 0x1e, 0x17c));
169+ tc_phy_write_dev_reg(gsw, PHY0, 0x1e, 0x17c, 0x0001);
170+ tc_phy_write_dev_reg(gsw, PHY0, 0x1e, 0x17c, 0x0001);
171+ tc_phy_write_dev_reg(gsw, PHY0, 0x1e, 0x17c, 0x0001);
172+ }
173+ } while ((cnt != 0) && (tmp_1e_17c == 0));
174+
175+ cnt = 10000;
176+ do {
177+ udelay(delay);
178+ cnt--;
179+ all_ana_cal_status = tc_phy_read_dev_reg(gsw, PHY0, 0x1e, 0x17b) & 0x1;
180+
181+ } while ((all_ana_cal_status == 0) && (cnt != 0));
182+
183+ tc_phy_write_dev_reg(gsw, PHY0, 0x1e, 0x17c, 0);
184+ }
185+
186+ if(all_ana_cal_status == 0){
187+ pr_info("!!!!!!!!!!!! dev1Eh_reg17b ERROR\n");
188+ }
189+
190+ return all_ana_cal_status;
191+}
192+
193+
194+
195+
196+int ge_cal_rext(struct gsw_mt753x *gsw, u8 phyaddr, u32 delay)
197+{
198+ u8 rg_zcal_ctrl, all_ana_cal_status;
199+ u16 ad_cal_comp_out_init;
200+ u16 dev1e_e0_ana_cal_r5;
201+ int calibration_polarity;
202+ u8 cnt = 0;
203+ u16 dev1e_17a_tmp, dev1e_e0_tmp;
204+
205+ /* *** Iext/Rext Cal start ************ */
206+ all_ana_cal_status = ANACAL_INIT;
207+ /* analog calibration enable, Rext calibration enable */
208+ /* 1e_db[12]:rg_cal_ckinv, [8]:rg_ana_calen, [4]:rg_rext_calen, [0]:rg_zcalen_a */
209+ /* 1e_dc[0]:rg_txvos_calen */
210+ /* 1e_e1[4]:rg_cal_refsel(0:1.2V) */
211+ //tc_phy_write_dev_reg(phyaddr, 0x1e, 0x00db, 0x1110)
212+ tc_phy_write_dev_reg(gsw, PHY0, 0x1e, 0x00db, 0x1110);
213+ //tc_phy_write_dev_reg(phyaddr, 0x1e, 0x00dc, 0x0000);
214+ tc_phy_write_dev_reg(gsw, PHY0, 0x1e, 0x00dc, 0);
215+ //tc_phy_write_dev_reg(phyaddr, 0x1e, 0x00e1, 0x0000);
216+ //tc_phy_write_dev_reg(gsw, PHY0, 0x1e, 0x00e1, 0x10);
217+
218+ rg_zcal_ctrl = 0x20;/* start with 0 dB */
219+ dev1e_e0_ana_cal_r5 = tc_phy_read_dev_reg(gsw, PHY0, 0x1e, 0xe0); // get default value
220+ /* 1e_e0[5:0]:rg_zcal_ctrl */
221+ tc_phy_write_dev_reg(gsw, PHY0, 0x1e, 0xe0, rg_zcal_ctrl);
222+ all_ana_cal_status = all_ge_ana_cal_wait(gsw, delay, phyaddr);/* delay 20 usec */
223+
224+ if (all_ana_cal_status == 0) {
225+ all_ana_cal_status = ANACAL_ERROR;
226+ printk(" GE Rext AnaCal ERROR init! \r\n");
227+ return -1;
228+ }
229+ /* 1e_17a[8]:ad_cal_comp_out */
230+ ad_cal_comp_out_init = (tc_phy_read_dev_reg(gsw, PHY0, 0x1e, 0x017a) >> 8) & 0x1;
231+ if (ad_cal_comp_out_init == 1)
232+ calibration_polarity = -1;
233+ else /* ad_cal_comp_out_init == 0 */
234+ calibration_polarity = 1;
235+ cnt = 0;
236+ while (all_ana_cal_status < ANACAL_ERROR) {
237+ cnt++;
238+ rg_zcal_ctrl += calibration_polarity;
239+ tc_phy_write_dev_reg(gsw, PHY0, 0x1e, 0xe0, (rg_zcal_ctrl));
240+ all_ana_cal_status = all_ge_ana_cal_wait(gsw, delay, phyaddr); /* delay 20 usec */
241+ dev1e_17a_tmp = tc_phy_read_dev_reg(gsw, PHY0, 0x1e, 0x017a);
242+ if (all_ana_cal_status == 0) {
243+ all_ana_cal_status = ANACAL_ERROR;
244+ printk(" GE Rext AnaCal ERROR 2! \r\n");
245+ return -1;
246+ } else if (((dev1e_17a_tmp >> 8) & 0x1) != ad_cal_comp_out_init) {
247+ all_ana_cal_status = ANACAL_FINISH;
248+ //printk(" GE Rext AnaCal Done! (%d)(0x%x) \r\n", cnt, rg_zcal_ctrl);
249+ } else {
250+ dev1e_17a_tmp = tc_phy_read_dev_reg(gsw, PHY0, 0x1e, 0x017a);
251+ dev1e_e0_tmp = tc_phy_read_dev_reg(gsw, PHY0, 0x1e, 0xe0);
252+ if ((rg_zcal_ctrl == 0x3F) || (rg_zcal_ctrl == 0x00)) {
253+ all_ana_cal_status = ANACAL_SATURATION; /* need to FT(IC fail?) */
254+ printk(" GE Rext AnaCal Saturation! \r\n");
255+ rg_zcal_ctrl = 0x20; /* 0 dB */
256+ }
257+ }
258+ }
259+
260+ if (all_ana_cal_status == ANACAL_ERROR) {
261+ rg_zcal_ctrl = 0x20; /* 0 dB */
262+ tc_phy_write_dev_reg(gsw, PHY0, 0x1e, 0x00e0, (dev1e_e0_ana_cal_r5 | rg_zcal_ctrl));
263+ } else if(all_ana_cal_status == ANACAL_FINISH){
264+ //tc_phy_write_dev_reg(gsw, PHY0, 0x1e, 0x00e0, (dev1e_e0_ana_cal_r5 | rg_zcal_ctrl));
265+ tc_phy_write_dev_reg(gsw, PHY0, 0x1e, 0x00e0, ((rg_zcal_ctrl << 8) | rg_zcal_ctrl));
266+ printk("0x1e-e0 = %x\n", tc_phy_read_dev_reg(gsw, PHY0, 0x1e, 0x00e0));
267+ /* **** 1f_115[2:0] = rg_zcal_ctrl[5:3] // Mog review */
268+ tc_phy_write_dev_reg(gsw, PHY0, 0x1f, 0x0115, ((rg_zcal_ctrl & 0x3f) >> 3));
269+ printk("0x1f-115 = %x\n", tc_phy_read_dev_reg(gsw, PHY0, 0x1f, 0x115));
270+ printk(" GE Rext AnaCal Done! (%d)(0x%x) \r\n", cnt, rg_zcal_ctrl);
271+ ge_cal_flag = 1;
272+ } else {
273+ printk("GE Rxet cal something wrong2\n");
274+ }
275+ tc_phy_write_dev_reg(gsw, PHY0, 0x1e, 0x00db, 0x0000);
276+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x00db, 0x0000);
277+ tc_phy_write_dev_reg(gsw, PHY0, 0x1e, 0x00dc, 0x0000);
278+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x00dc, 0x0000);
279+
280+ return 0;
281+}
282+
283+//-----------------------------------------------------------------
284+int ge_cal_r50(struct gsw_mt753x *gsw, u8 phyaddr, u32 delay)
285+{
286+ u8 rg_zcal_ctrl, all_ana_cal_status, calibration_pair;
287+ u16 ad_cal_comp_out_init;
288+ u16 dev1e_e0_ana_cal_r5;
289+ int calibration_polarity;
290+ u8 cnt = 0;
291+ tc_phy_write_dev_reg(gsw, PHY0, 0x1e, 0x00db, 0x1100); // 1e_db[12]:rg_cal_ckinv, [8]:rg_ana_calen, [4]:rg_rext_calen, [0]:rg_zcalen_a
292+ tc_phy_write_dev_reg(gsw, PHY0, 0x1e, 0x00dc, 0x0000); // 1e_dc[0]:rg_txvos_calen
293+
294+ for(calibration_pair = ANACAL_PAIR_A; calibration_pair <= ANACAL_PAIR_D; calibration_pair ++) {
295+ rg_zcal_ctrl = 0x20; // start with 0 dB
296+ dev1e_e0_ana_cal_r5 = (tc_phy_read_dev_reg(gsw, PHY0, 0x1e, 0x00e0) & (~0x003f));
297+ tc_phy_write_dev_reg(gsw, PHY0, 0x1e, 0x00e0, (dev1e_e0_ana_cal_r5 | rg_zcal_ctrl)); // 1e_e0[5:0]:rg_zcal_ctrl
298+ if(calibration_pair == ANACAL_PAIR_A)
299+ {
300+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x00db, 0x1101); // 1e_db[12]:rg_cal_ckinv, [8]:rg_ana_calen, [4]:rg_rext_calen, [0]:rg_zcalen_a
301+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x00dc, 0x0000);
302+ //printk("R50 pair A 1e_db=%x 1e_db=%x\n", tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x00db), tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x00dc));
303+
304+ }
305+ else if(calibration_pair == ANACAL_PAIR_B)
306+ {
307+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x00db, 0x1100); // 1e_db[12]:rg_cal_ckinv, [8]:rg_ana_calen, [4]:rg_rext_calen, [0]:rg_zcalen_a
308+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x00dc, 0x1000); // 1e_dc[12]:rg_zcalen_b
309+ //printk("R50 pair B 1e_db=%x 1e_db=%x\n", tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x00db),tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x00dc));
310+
311+ }
312+ else if(calibration_pair == ANACAL_PAIR_C)
313+ {
314+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x00db, 0x1100); // 1e_db[12]:rg_cal_ckinv, [8]:rg_ana_calen, [4]:rg_rext_calen, [0]:rg_zcalen_a
315+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x00dc, 0x0100); // 1e_dc[8]:rg_zcalen_c
316+ //printk("R50 pair C 1e_db=%x 1e_db=%x\n", tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x00db), tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x00dc));
317+
318+ }
319+ else // if(calibration_pair == ANACAL_PAIR_D)
320+ {
321+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x00db, 0x1100); // 1e_db[12]:rg_cal_ckinv, [8]:rg_ana_calen, [4]:rg_rext_calen, [0]:rg_zcalen_a
322+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x00dc, 0x0010); // 1e_dc[4]:rg_zcalen_d
323+ //printk("R50 pair D 1e_db=%x 1e_db=%x\n", tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x00db), tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x00dc));
324+
325+ }
326+
327+ all_ana_cal_status = all_ge_ana_cal_wait(gsw, delay, phyaddr); // delay 20 usec
328+ if(all_ana_cal_status == 0)
329+ {
330+ all_ana_cal_status = ANACAL_ERROR;
331+ printk( "GE R50 AnaCal ERROR init! \r\n");
332+ return -1;
333+ }
334+
335+ ad_cal_comp_out_init = (tc_phy_read_dev_reg(gsw, PHY0, 0x1e, 0x017a)>>8) & 0x1; // 1e_17a[8]:ad_cal_comp_out
336+ if(ad_cal_comp_out_init == 1)
337+ calibration_polarity = -1;
338+ else
339+ calibration_polarity = 1;
340+
341+ cnt = 0;
342+ while(all_ana_cal_status < ANACAL_ERROR)
343+ {
344+ cnt ++;
345+ rg_zcal_ctrl += calibration_polarity;
346+ tc_phy_write_dev_reg(gsw, PHY0, 0x1e, 0x00e0, (dev1e_e0_ana_cal_r5 | rg_zcal_ctrl));
347+ all_ana_cal_status = all_ge_ana_cal_wait(gsw, delay, phyaddr); // delay 20 usec
348+
349+ if(all_ana_cal_status == 0)
350+ {
351+ all_ana_cal_status = ANACAL_ERROR;
352+ printk( " GE R50 AnaCal ERROR 2! \r\n");
353+ return -1;
354+ }
355+ else if(((tc_phy_read_dev_reg(gsw, PHY0, 0x1e, 0x017a)>>8)&0x1) != ad_cal_comp_out_init)
356+ {
357+ all_ana_cal_status = ANACAL_FINISH;
358+ }
359+ else {
360+ if((rg_zcal_ctrl == 0x3F)||(rg_zcal_ctrl == 0x00))
361+ {
362+ all_ana_cal_status = ANACAL_SATURATION; // need to FT
363+ printk( " GE R50 AnaCal Saturation! \r\n");
364+ }
365+ }
366+ }
367+
368+ if(all_ana_cal_status == ANACAL_ERROR) {
369+ rg_zcal_ctrl = 0x20; // 0 dB
370+ //tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x00e0, (dev1e_e0_ana_cal_r5 | rg_zcal_ctrl));
371+ }
372+ else {
373+ rg_zcal_ctrl = MT753x_ZCAL_TO_R50ohm_GE_TBL_100[rg_zcal_ctrl - 9]; // wait Mog zcal/r50 mapping table
374+ printk( " GE R50 AnaCal Done! (%d) (0x%x)(0x%x) \r\n", cnt, rg_zcal_ctrl, (rg_zcal_ctrl|0x80));
375+ }
376+
377+ if(calibration_pair == ANACAL_PAIR_A) {
378+ ad_cal_comp_out_init = tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x0174) & (~0x7f00);
379+ //ad_cal_comp_out_init = tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x0174);
380+ //printk( " GE-a 1e_174(0x%x)(0x%x), 1e_175(0x%x) \r\n", tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x0174), ad_cal_comp_out_init, tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x0175));
381+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x0174, (ad_cal_comp_out_init | (((rg_zcal_ctrl<<8)&0xff00) | 0x8000))); // 1e_174[15:8]
382+ //printk( " GE-a 1e_174(0x%x), 1e_175(0x%x) \r\n", tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x0174), tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x0175));
383+ }
384+ else if(calibration_pair == ANACAL_PAIR_B) {
385+ ad_cal_comp_out_init = tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x0174) & (~0x007f);
386+ //ad_cal_comp_out_init = tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x0174);
387+ //printk( " GE-b 1e_174(0x%x)(0x%x), 1e_175(0x%x) \r\n", tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x0174), ad_cal_comp_out_init, tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x0175));
388+
389+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x0174, (ad_cal_comp_out_init | (((rg_zcal_ctrl<<0)&0x00ff) | 0x0080))); // 1e_174[7:0]
390+ //printk( " GE-b 1e_174(0x%x), 1e_175(0x%x) \r\n", tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x0174), tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x0175));
391+ }
392+ else if(calibration_pair == ANACAL_PAIR_C) {
393+ ad_cal_comp_out_init = tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x0175) & (~0x7f00);
394+ //ad_cal_comp_out_init = tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x0175);
395+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x0175, (ad_cal_comp_out_init | (((rg_zcal_ctrl<<8)&0xff00) | 0x8000))); // 1e_175[15:8]
396+ //printk( " GE-c 1e_174(0x%x), 1e_175(0x%x) \r\n", tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x0174), tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x0175));
397+ } else {// if(calibration_pair == ANACAL_PAIR_D)
398+ ad_cal_comp_out_init = tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x0175) & (~0x007f);
399+ //ad_cal_comp_out_init = tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x0175);
400+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x0175, (ad_cal_comp_out_init | (((rg_zcal_ctrl<<0)&0x00ff) | 0x0080))); // 1e_175[7:0]
401+ //printk( " GE-d 1e_174(0x%x), 1e_175(0x%x) \r\n", tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x0174), tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x0175));
402+ }
403+ //tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x00e0, ((rg_zcal_ctrl<<8)|rg_zcal_ctrl));
404+ }
405+
406+ printk( " GE 1e_174(0x%x), 1e_175(0x%x) \r\n", tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x0174), tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x0175));
407+ tc_phy_write_dev_reg(gsw, PHY0, 0x1e, 0x00db, 0x0000);
408+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x00db, 0x0000);
409+ tc_phy_write_dev_reg(gsw, PHY0, 0x1e, 0x00dc, 0x0000);
410+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x00dc, 0x0000);
411+
412+ return 0;
413+}
414+
415+int ge_cal_tx_offset(struct gsw_mt753x *gsw, u8 phyaddr, u32 delay)
416+{
417+ u8 all_ana_cal_status, calibration_pair;
418+ u16 ad_cal_comp_out_init;
419+ int calibration_polarity, tx_offset_temp;
420+ u8 tx_offset_reg_shift, tabl_idx, i;
421+ u8 cnt = 0;
422+ u16 tx_offset_reg, reg_temp, cal_temp;
423+ //switch_phy_write(phyaddr, R0, 0x2100);//harry tmp
424+ tc_phy_write_dev_reg(gsw, PHY0, 0x1e, 0x00db, 0x0100); // 1e_db[12]:rg_cal_ckinv, [8]:rg_ana_calen, [4]:rg_rext_calen, [0]:rg_zcalen_a
425+ tc_phy_write_dev_reg(gsw, PHY0, 0x1e, 0x00dc, 0x0001); // 1e_dc[0]:rg_txvos_calen
426+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x0096, 0x8000); // 1e_96[15]:bypass_tx_offset_cal, Hw bypass, Fw cal
427+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x003e, 0xf808); // 1e_3e
428+ for(i = 0; i <= 4; i++)
429+ tc_phy_write_dev_reg(gsw, i, 0x1e, 0x00dd, 0x0000);
430+ for(calibration_pair = ANACAL_PAIR_A; calibration_pair <= ANACAL_PAIR_D; calibration_pair ++)
431+ {
432+ tabl_idx = 31;
433+ tx_offset_temp = MT753x_TX_OFFSET_TBL[tabl_idx];
434+
435+ if(calibration_pair == ANACAL_PAIR_A) {
436+ //tc_phy_write_dev_reg(phyaddr, 0x1e, 0x145, 0x5010);
437+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x00dd, 0x1000); // 1e_dd[12]:rg_txg_calen_a
438+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x017d, (0x8000|DAC_IN_0V)); // 1e_17d:dac_in0_a
439+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x0181, (0x8000|DAC_IN_0V)); // 1e_181:dac_in1_a
440+ //printk("tx offset pairA 1e_dd = %x, 1e_17d=%x, 1e_181=%x\n", tc_phy_read_dev_reg(phyaddr, 0x1e, 0x00dd), tc_phy_read_dev_reg(phyaddr, 0x1e, 0x017d), tc_phy_read_dev_reg(phyaddr, 0x1e, 0x0181));
441+ reg_temp = (tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x0172) & (~0x3f00));
442+ tx_offset_reg_shift = 8; // 1e_172[13:8]
443+ tx_offset_reg = 0x0172;
444+
445+ //tc_phy_write_dev_reg(phyaddr, 0x1e, tx_offset_reg, (reg_temp|(tx_offset_temp<<tx_offset_reg_shift)));
446+ } else if(calibration_pair == ANACAL_PAIR_B) {
447+ //tc_phy_write_dev_reg(phyaddr, 0x1e, 0x145, 0x5018);
448+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x00dd, 0x0100); // 1e_dd[8]:rg_txg_calen_b
449+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x017e, (0x8000|DAC_IN_0V)); // 1e_17e:dac_in0_b
450+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x0182, (0x8000|DAC_IN_0V)); // 1e_182:dac_in1_b
451+ //printk("tx offset pairB 1e_dd = %x, 1e_17d=%x, 1e_181=%x\n", tc_phy_read_dev_reg(phyaddr, 0x1e, 0x00dd), tc_phy_read_dev_reg(phyaddr, 0x1e, 0x017d), tc_phy_read_dev_reg(phyaddr, 0x1e, 0x0181));
452+ reg_temp = (tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x0172) & (~0x003f));
453+ tx_offset_reg_shift = 0; // 1e_172[5:0]
454+ tx_offset_reg = 0x0172;
455+ //tc_phy_write_dev_reg(phyaddr, 0x1e, tx_offset_reg, (reg_temp|(tx_offset_temp<<tx_offset_reg_shift)));
456+ } else if(calibration_pair == ANACAL_PAIR_C) {
457+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x00dd, 0x0010); // 1e_dd[4]:rg_txg_calen_c
458+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x017f, (0x8000|DAC_IN_0V)); // 1e_17f:dac_in0_c
459+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x0183, (0x8000|DAC_IN_0V)); // 1e_183:dac_in1_c
460+ reg_temp = (tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x0173) & (~0x3f00));
461+ //printk("tx offset pairC 1e_dd = %x, 1e_17d=%x, 1e_181=%x\n", tc_phy_read_dev_reg(phyaddr, 0x1e, 0x00dd), tc_phy_read_dev_reg(phyaddr, 0x1e, 0x017d), tc_phy_read_dev_reg(phyaddr, 0x1e, 0x0181));
462+ tx_offset_reg_shift = 8; // 1e_173[13:8]
463+ tx_offset_reg = 0x0173;
464+ //tc_phy_write_dev_reg(phyaddr, 0x1e, tx_offset_reg, (reg_temp|(tx_offset_temp<<tx_offset_reg_shift)));
465+ } else {// if(calibration_pair == ANACAL_PAIR_D)
466+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x00dd, 0x0001); // 1e_dd[0]:rg_txg_calen_d
467+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x0180, (0x8000|DAC_IN_0V)); // 1e_180:dac_in0_d
468+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x0184, (0x8000|DAC_IN_0V)); // 1e_184:dac_in1_d
469+ //printk("tx offset pairD 1e_dd = %x, 1e_17d=%x, 1e_181=%x\n", tc_phy_read_dev_reg(phyaddr, 0x1e, 0x00dd), tc_phy_read_dev_reg(phyaddr, 0x1e, 0x017d), tc_phy_read_dev_reg(phyaddr, 0x1e, 0x0181));
470+ reg_temp = (tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x0173) & (~0x003f));
471+ tx_offset_reg_shift = 0; // 1e_173[5:0]
472+ tx_offset_reg = 0x0173;
473+ //tc_phy_write_dev_reg(phyaddr, 0x1e, tx_offset_reg, (reg_temp|(tx_offset_temp<<tx_offset_reg_shift)));
474+ }
475+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, tx_offset_reg, (reg_temp|(tx_offset_temp<<tx_offset_reg_shift))); // 1e_172, 1e_173
476+ all_ana_cal_status = all_ge_ana_cal_wait(gsw, delay, phyaddr); // delay 20 usec
477+ if(all_ana_cal_status == 0) {
478+ all_ana_cal_status = ANACAL_ERROR;
479+ printk( " GE Tx offset AnaCal ERROR init! \r\n");
480+ return -1;
481+ }
482+
483+ ad_cal_comp_out_init = (tc_phy_read_dev_reg(gsw, PHY0, 0x1e, 0x017a)>>8) & 0x1; // 1e_17a[8]:ad_cal_comp_out
484+ if(ad_cal_comp_out_init == 1)
485+ calibration_polarity = 1;
486+ else
487+ calibration_polarity = -1;
488+
489+ cnt = 0;
490+ //printk("TX offset cnt = %d, tabl_idx= %x, offset_val = %x\n", cnt, tabl_idx, MT753x_TX_OFFSET_TBL[tabl_idx]);
491+ while(all_ana_cal_status < ANACAL_ERROR) {
492+
493+ cnt ++;
494+ tabl_idx += calibration_polarity;
495+ //tx_offset_temp += calibration_polarity;
496+ //cal_temp = tx_offset_temp;
497+ cal_temp = MT753x_TX_OFFSET_TBL[tabl_idx];
498+ //printk("TX offset cnt = %d, tabl_idx= %x, offset_val = %x\n", cnt, tabl_idx, MT753x_TX_OFFSET_TBL[tabl_idx]);
499+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, tx_offset_reg, (reg_temp|(cal_temp<<tx_offset_reg_shift)));
500+
501+ all_ana_cal_status = all_ge_ana_cal_wait(gsw, delay, phyaddr); // delay 20 usec
502+ if(all_ana_cal_status == 0) {
503+ all_ana_cal_status = ANACAL_ERROR;
504+ printk( " GE Tx offset AnaCal ERROR init 2! \r\n");
505+ return -1;
506+ } else if(((tc_phy_read_dev_reg(gsw, PHY0, 0x1e, 0x017a)>>8)&0x1) != ad_cal_comp_out_init) {
507+ all_ana_cal_status = ANACAL_FINISH;
508+ } else {
509+ if((tabl_idx == 0)||(tabl_idx == 0x3f)) {
510+ all_ana_cal_status = ANACAL_SATURATION; // need to FT
511+ printk( " GE Tx offset AnaCal Saturation! \r\n");
512+ }
513+ }
514+ }
515+
516+ if(all_ana_cal_status == ANACAL_ERROR) {
517+ tx_offset_temp = TX_AMP_OFFSET_0MV;
518+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, tx_offset_reg, (reg_temp|(tx_offset_temp<<tx_offset_reg_shift)));
519+ } else {
520+ printk( " GE Tx offset AnaCal Done! (pair-%d)(%d)(0x%x) 0x1e_%x=0x%x\n", calibration_pair, cnt, MT753x_TX_OFFSET_TBL[tabl_idx], tx_offset_reg, tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, tx_offset_reg));
521+ }
522+ }
523+
524+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x017d, 0x0000);
525+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x017e, 0x0000);
526+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x017f, 0x0000);
527+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x0180, 0x0000);
528+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x0181, 0x0000);
529+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x0182, 0x0000);
530+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x0183, 0x0000);
531+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x0184, 0x0000);
532+
533+ tc_phy_write_dev_reg(gsw, PHY0, 0x1e, 0x00db, 0x0000); // disable analog calibration circuit
534+ tc_phy_write_dev_reg(gsw, PHY0, 0x1e, 0x00dc, 0x0000); // disable Tx offset calibration circuit
535+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x00db, 0x0000); // disable analog calibration circuit
536+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x00dc, 0x0000); // disable Tx offset calibration circuit
537+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x003e, 0x0000); // disable Tx VLD force mode
538+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x00dd, 0x0000); // disable Tx offset/amplitude calibration circuit
539+
540+ return 0;
541+}
542+
543+int ge_cal_tx_amp(struct gsw_mt753x *gsw, u8 phyaddr, u32 delay)
544+{
545+ u8 all_ana_cal_status, calibration_pair, i;
546+ u16 ad_cal_comp_out_init;
547+ int calibration_polarity;
548+ u32 tx_amp_reg_shift;
549+ u16 reg_temp;
550+ u32 tx_amp_temp, tx_amp_reg, cnt=0, tx_amp_reg_100;
551+ u32 debug_tmp, reg_backup, reg_tmp;
552+ u32 orig_1e_11, orig_1f_300;
553+
554+ tc_phy_write_dev_reg(gsw, PHY0, 0x1e, 0x00db, 0x1100); // 1e_db[12]:rg_cal_ckinv, [8]:rg_ana_calen, [4]:rg_rext_calen, [0]:rg_zcalen_a
555+ tc_phy_write_dev_reg(gsw, PHY0, 0x1e, 0x00dc, 0x0001); // 1e_dc[0]:rg_txvos_calen
556+ tc_phy_write_dev_reg(gsw, PHY0, 0x1e, 0x00e1, 0x0010); // 1e_e1[4]:select 1V
557+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x003e, 0xf808); // 1e_3e:enable Tx VLD
558+
559+ orig_1e_11 = tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x11);
560+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x11, 0xff00);
561+// tc_phy_write_dev_reg(gsw, phyaddr, 0x1f, 0x27a, 0x33);
562+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0xc9, 0xffff);
563+ orig_1f_300 = tc_phy_read_dev_reg(gsw, phyaddr, 0x1f, 0x300);
564+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1f, 0x300, 0x4);
565+ for(i = 0; i <= 4; i++)
566+ tc_phy_write_dev_reg(gsw, i, 0x1e, 0x00dd, 0x0000);
567+ for(calibration_pair = ANACAL_PAIR_A; calibration_pair <= ANACAL_PAIR_D; calibration_pair ++) {
568+ tx_amp_temp = 0x20; // start with 0 dB
569+
570+ if(calibration_pair == ANACAL_PAIR_A) {
571+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x00dd, 0x1000); // 1e_dd[12]:tx_a amp calibration enable
572+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x017d, (0x8000|DAC_IN_2V)); // 1e_17d:dac_in0_a
573+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x0181, (0x8000|DAC_IN_2V)); // 1e_181:dac_in1_a
574+ reg_temp = (tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x012) & (~0xfc00));
575+ tx_amp_reg_shift = 10; // 1e_12[15:10]
576+ tx_amp_reg = 0x12;
577+ tx_amp_reg_100 = 0x16;
578+ } else if(calibration_pair == ANACAL_PAIR_B) {
579+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x00dd, 0x0100); // 1e_dd[8]:tx_b amp calibration enable
580+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x017e, (0x8000|DAC_IN_2V)); // 1e_17e:dac_in0_b
581+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x0182, (0x8000|DAC_IN_2V)); // 1e_182:dac_in1_b
582+ reg_temp = (tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x017) & (~0x3f00));
583+ tx_amp_reg_shift = 8; // 1e_17[13:8]
584+ tx_amp_reg = 0x17;
585+ tx_amp_reg_100 = 0x18;
586+ } else if(calibration_pair == ANACAL_PAIR_C) {
587+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x00dd, 0x0010); // 1e_dd[4]:tx_c amp calibration enable
588+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x017f, (0x8000|DAC_IN_2V)); // 1e_17f:dac_in0_c
589+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x0183, (0x8000|DAC_IN_2V)); // 1e_183:dac_in1_c
590+ reg_temp = (tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x019) & (~0x3f00));
591+ tx_amp_reg_shift = 8; // 1e_19[13:8]
592+ tx_amp_reg = 0x19;
593+ tx_amp_reg_100 = 0x20;
594+ } else { //if(calibration_pair == ANACAL_PAIR_D)
595+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x00dd, 0x0001); // 1e_dd[0]:tx_d amp calibration enable
596+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x0180, (0x8000|DAC_IN_2V)); // 1e_180:dac_in0_d
597+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x0184, (0x8000|DAC_IN_2V)); // 1e_184:dac_in1_d
598+ reg_temp = (tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x021) & (~0x3f00));
599+ tx_amp_reg_shift = 8; // 1e_21[13:8]
600+ tx_amp_reg = 0x21;
601+ tx_amp_reg_100 = 0x22;
602+ }
603+ tc_phy_write_dev_reg( gsw, phyaddr, 0x1e, tx_amp_reg, (tx_amp_temp|(tx_amp_temp<<tx_amp_reg_shift))); // 1e_12, 1e_17, 1e_19, 1e_21
604+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg_100, (tx_amp_temp|(tx_amp_temp<<tx_amp_reg_shift)));
605+ all_ana_cal_status = all_ge_ana_cal_wait(gsw, delay, phyaddr); // delay 20 usec
606+ if(all_ana_cal_status == 0) {
607+ all_ana_cal_status = ANACAL_ERROR;
608+ printk( " GE Tx amp AnaCal ERROR init init! \r\n");
609+ return -1;
610+ }
611+
612+ ad_cal_comp_out_init = (tc_phy_read_dev_reg(gsw, PHY0, 0x1e, 0x017a)>>8) & 0x1; // 1e_17a[8]:ad_cal_comp_out
613+ if(ad_cal_comp_out_init == 1)
614+ calibration_polarity = -1;
615+ else
616+ calibration_polarity = 1;
617+
618+ cnt =0;
619+ while(all_ana_cal_status < ANACAL_ERROR) {
620+ cnt ++;
621+ tx_amp_temp += calibration_polarity;
622+ //printk("tx_amp : %x, 1e %x = %x\n", tx_amp_temp, tx_amp_reg, (reg_temp|(tx_amp_temp<<tx_amp_reg_shift)));
623+ tc_phy_write_dev_reg( gsw, phyaddr, 0x1e, tx_amp_reg, (tx_amp_temp|(tx_amp_temp<<tx_amp_reg_shift)));
624+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg_100, (tx_amp_temp|(tx_amp_temp<<tx_amp_reg_shift)));
625+ all_ana_cal_status = all_ge_ana_cal_wait(gsw, delay, phyaddr); // delay 20 usec
626+ if(all_ana_cal_status == 0) {
627+ all_ana_cal_status = ANACAL_ERROR;
628+ printk( " GE Tx amp AnaCal ERROR 2! \r\n");
629+ return -1;
630+ } else if(((tc_phy_read_dev_reg(gsw, PHY0, 0x1e, 0x017a)>>8)&0x1) != ad_cal_comp_out_init) {
631+ //printk("TX AMP ANACAL_FINISH\n");
632+ all_ana_cal_status = ANACAL_FINISH;
633+ if (phyaddr == 0) {
634+ if (calibration_pair == ANACAL_PAIR_A)
635+ tx_amp_temp = tx_amp_temp - 2;
636+ else if(calibration_pair == ANACAL_PAIR_B)
637+ tx_amp_temp = tx_amp_temp - 1;
638+ else if(calibration_pair == ANACAL_PAIR_C)
639+ tx_amp_temp = tx_amp_temp - 2;
640+ else if(calibration_pair == ANACAL_PAIR_D)
641+ tx_amp_temp = tx_amp_temp - 1;
642+ } else if (phyaddr == 1) {
643+ if (calibration_pair == ANACAL_PAIR_A)
644+ tx_amp_temp = tx_amp_temp - 1;
645+ else if(calibration_pair == ANACAL_PAIR_B)
646+ tx_amp_temp = tx_amp_temp ;
647+ else if(calibration_pair == ANACAL_PAIR_C)
648+ tx_amp_temp = tx_amp_temp - 1;
649+ else if(calibration_pair == ANACAL_PAIR_D)
650+ tx_amp_temp = tx_amp_temp - 1;
651+ } else if (phyaddr == 2) {
652+ if (calibration_pair == ANACAL_PAIR_A)
653+ tx_amp_temp = tx_amp_temp;
654+ else if(calibration_pair == ANACAL_PAIR_B)
655+ tx_amp_temp = tx_amp_temp - 1;
656+ else if(calibration_pair == ANACAL_PAIR_C)
657+ tx_amp_temp = tx_amp_temp;
658+ else if(calibration_pair == ANACAL_PAIR_D)
659+ tx_amp_temp = tx_amp_temp - 1;
660+ } else if (phyaddr == 3) {
661+ tx_amp_temp = tx_amp_temp;
662+ } else if (phyaddr == 4) {
663+ if (calibration_pair == ANACAL_PAIR_A)
664+ tx_amp_temp = tx_amp_temp;
665+ else if(calibration_pair == ANACAL_PAIR_B)
666+ tx_amp_temp = tx_amp_temp - 1;
667+ else if(calibration_pair == ANACAL_PAIR_C)
668+ tx_amp_temp = tx_amp_temp;
669+ else if(calibration_pair == ANACAL_PAIR_D)
670+ tx_amp_temp = tx_amp_temp;
671+ }
672+ reg_temp = tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg)&(~0xff00);
673+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg_100,(tx_amp_temp|((tx_amp_temp)<<tx_amp_reg_shift)));
674+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg, (tx_amp_temp|((tx_amp_temp)<<tx_amp_reg_shift)));
675+ if (phyaddr == 0) {
676+ if ((tx_amp_reg == 0x12) || (tx_amp_reg == 0x17)) {
677+ //printk("before : PORT[%d] 1e_%x = %x\n", phyaddr, tx_amp_reg, tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg));
678+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg, ((tx_amp_temp|((tx_amp_temp)<<tx_amp_reg_shift)) + 7));
679+ //printk("after : PORT[%d] 1e_%x = %x\n", phyaddr, tx_amp_reg, tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg));
680+ }
681+ if (tx_amp_reg_100 == 0x16) {
682+ //printk("before : PORT[%d] 1e_%x = %x\n", phyaddr, tx_amp_reg_100, tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg_100));
683+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg_100,(tx_amp_temp|((tx_amp_temp+1+4)<<tx_amp_reg_shift)));
684+ //printk("after : PORT[%d] 1e_%x = %x\n", phyaddr, tx_amp_reg_100, tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg_100));
685+ }
686+ if (tx_amp_reg_100 == 0x18) {
687+ //printk("before : PORT[%d] 1e_%x = %x\n", phyaddr, tx_amp_reg_100, tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg_100));
688+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg_100,(tx_amp_temp|((tx_amp_temp+4)<<tx_amp_reg_shift)));
689+ //printk("after : PORT[%d] 1e_%x = %x\n", phyaddr, tx_amp_reg_100, tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg_100));
690+ }
691+ } else if (phyaddr == 1) {
692+ if (tx_amp_reg == 0x12) {
693+ //printk("before : PORT[%d] 1e_%x = %x\n", phyaddr, tx_amp_reg, tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg));
694+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg, ((tx_amp_temp|((tx_amp_temp)<<tx_amp_reg_shift)) + 9));
695+ //printk("after : PORT[%d] 1e_%x = %x\n", phyaddr, tx_amp_reg, tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg));
696+ }
697+ if (tx_amp_reg == 0x17){
698+ //printk("before : PORT[%d] 1e_%x = %x\n", phyaddr, tx_amp_reg, tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg));
699+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg, ((tx_amp_temp|((tx_amp_temp)<<tx_amp_reg_shift)) + 7));
700+ //printk("after : PORT[%d] 1e_%x = %x\n", phyaddr, tx_amp_reg, tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg));
701+ }
702+ if (tx_amp_reg_100 == 0x16) {
703+ //printk("before : PORT[%d] 1e_%x = %x\n", phyaddr, tx_amp_reg_100, tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg_100));
704+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg_100,(tx_amp_temp|((tx_amp_temp+4)<<tx_amp_reg_shift)));
705+ //printk("after : PORT[%d] 1e_%x = %x\n", phyaddr, tx_amp_reg_100, tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg_100));
706+ }
707+ if (tx_amp_reg_100 == 0x18) {
708+ //printk("before : PORT[%d] 1e_%x = %x\n", phyaddr, tx_amp_reg_100, tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg_100));
709+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg_100,(tx_amp_temp|((tx_amp_temp-1+4)<<tx_amp_reg_shift)));
710+ //printk("after : PORT[%d] 1e_%x = %x\n", phyaddr, tx_amp_reg_100, tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg_100));
711+ }
712+ } else if (phyaddr == 2) {
713+ if ((tx_amp_reg == 0x12) || (tx_amp_reg == 0x17)) {
714+ //printk("before : PORT[%d] 1e_%x = %x\n", phyaddr, tx_amp_reg, tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg));
715+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg, ((tx_amp_temp|((tx_amp_temp)<<tx_amp_reg_shift)) + 6));
716+ //printk("after : PORT[%d] 1e_%x = %x\n", phyaddr, tx_amp_reg, tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg));
717+ }
718+ if ((tx_amp_reg_100 == 0x16) || (tx_amp_reg_100 == 0x18)) {
719+ //printk("before : PORT[%d] 1e_%x = %x\n", phyaddr, tx_amp_reg_100, tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg_100));
720+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg_100,(tx_amp_temp|((tx_amp_temp-1+4)<<tx_amp_reg_shift)));
721+ //printk("after : PORT[%d] 1e_%x = %x\n", phyaddr, tx_amp_reg_100, tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg_100));
722+ }
723+ } else if (phyaddr == 3) {
724+ if (tx_amp_reg == 0x12) {
725+ //printk("before : PORT[%d] 1e_%x = %x\n", phyaddr, tx_amp_reg, tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg));
726+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg, ((tx_amp_temp|((tx_amp_temp)<<tx_amp_reg_shift)) + 4));
727+ //printk("after : PORT[%d] 1e_%x = %x\n", phyaddr, tx_amp_reg, tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg));
728+ }
729+ if (tx_amp_reg == 0x17) {
730+ //printk("before : PORT[%d] 1e_%x = %x\n", phyaddr, tx_amp_reg, tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg));
731+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg, ((tx_amp_temp|((tx_amp_temp)<<tx_amp_reg_shift)) + 7));
732+ //printk("after : PORT[%d] 1e_%x = %x\n", phyaddr, tx_amp_reg, tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg));
733+ }
734+ if (tx_amp_reg_100 == 0x16) {
735+ //printk("before : PORT[%d] 1e_%x = %x\n", phyaddr, tx_amp_reg_100, tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg_100));
736+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg_100,(tx_amp_temp|((tx_amp_temp-2+4)<<tx_amp_reg_shift)));
737+ //printk("after : PORT[%d] 1e_%x = %x\n", phyaddr, tx_amp_reg_100, tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg_100));
738+ }
739+ if (tx_amp_reg_100 == 0x18) {
740+ //printk("before : PORT[%d] 1e_%x = %x\n", phyaddr, tx_amp_reg_100, tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg_100));
741+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg_100,(tx_amp_temp|((tx_amp_temp-1+3)<<tx_amp_reg_shift)));
742+ //printk("after : PORT[%d] 1e_%x = %x\n", phyaddr, tx_amp_reg_100, tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg_100));
743+ }
744+ } else if (phyaddr == 4) {
745+ if ((tx_amp_reg == 0x12) || (tx_amp_reg == 0x17)) {
746+ //printk("before : PORT[%d] 1e_%x = %x\n", phyaddr, tx_amp_reg, tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg));
747+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg, ((tx_amp_temp|((tx_amp_temp)<<tx_amp_reg_shift)) + 5));
748+ //printk("after : PORT[%d] 1e_%x = %x\n", phyaddr, tx_amp_reg, tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg));
749+ }
750+ if (tx_amp_reg_100 == 0x16) {
751+ //printk("before : PORT[%d] 1e_%x = %x\n", phyaddr, tx_amp_reg_100, tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg_100));
752+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg_100,(tx_amp_temp|((tx_amp_temp-2+4)<<tx_amp_reg_shift)));
753+ //printk("after : PORT[%d] 1e_%x = %x\n", phyaddr, tx_amp_reg_100, tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg_100));
754+ }
755+ if (tx_amp_reg_100 == 0x18) {
756+ //printk("before : PORT[%d] 1e_%x = %x\n", phyaddr, tx_amp_reg_100, tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg_100));
757+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg_100,(tx_amp_temp|((tx_amp_temp-1+4)<<tx_amp_reg_shift)));
758+ //printk("after : PORT[%d] 1e_%x = %x\n", phyaddr, tx_amp_reg_100, tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg_100));
759+ }
760+ }
761+
762+ if (calibration_pair == ANACAL_PAIR_A){
763+ reg_backup = tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x12);
764+ reg_tmp = ((reg_backup & 0xfc00) >> 10);
765+ reg_tmp -= 8;
766+ reg_backup = 0x0000;
767+ reg_backup |= ((reg_tmp << 10) | (reg_tmp << 0));
768+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x12, reg_backup);
769+ reg_backup = tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x12);
770+ //printk("PORT[%d] 1e.012 = %x (OFFSET_1000M_PAIR_A)\n", phyaddr, reg_backup);
771+ reg_backup = tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x16);
772+ reg_tmp = ((reg_backup & 0x3f) >> 0);
773+ reg_tmp -= 8;
774+ reg_backup = (reg_backup & (~0x3f));
775+ reg_backup |= (reg_tmp << 0);
776+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x16, reg_backup);
777+ reg_backup = tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x16);
778+ //printk("PORT[%d] 1e.016 = %x (OFFSET_TESTMODE_1000M_PAIR_A)\n", phyaddr, reg_backup);
779+ }
780+ else if(calibration_pair == ANACAL_PAIR_B){
781+ reg_backup = tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x17);
782+ reg_tmp = ((reg_backup & 0x3f00) >> 8);
783+ reg_tmp -= 8;
784+ reg_backup = 0x0000;
785+ reg_backup |= ((reg_tmp << 8) | (reg_tmp << 0));
786+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x17, reg_backup);
787+ reg_backup = tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x17);
788+ //printk("PORT[%d] 1e.017 = %x (OFFSET_1000M_PAIR_B)\n", phyaddr, reg_backup);
789+ reg_backup = tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x18);
790+ reg_tmp = ((reg_backup & 0x3f) >> 0);
791+ reg_tmp -= 8;
792+ reg_backup = (reg_backup & (~0x3f));
793+ reg_backup |= (reg_tmp << 0);
794+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x18, reg_backup);
795+ reg_backup = tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x18);
796+ //printk("PORT[%d] 1e.018 = %x (OFFSET_TESTMODE_1000M_PAIR_B)\n", phyaddr, reg_backup);
797+ }
798+ else if(calibration_pair == ANACAL_PAIR_C){
799+ reg_backup = tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x19);
800+ reg_tmp = ((reg_backup & 0x3f00) >> 8);
801+ reg_tmp -= 8;
802+ reg_backup = (reg_backup & (~0x3f00));
803+ reg_backup |= (reg_tmp << 8);
804+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x19, reg_backup);
805+ reg_backup = tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x19);
806+ //printk("PORT[%d] 1e.019 = %x (OFFSET_1000M_PAIR_C)\n", phyaddr, reg_backup);
807+ reg_backup = tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x20);
808+ reg_tmp = ((reg_backup & 0x3f) >> 0);
809+ reg_tmp -= 8;
810+ reg_backup = (reg_backup & (~0x3f));
811+ reg_backup |= (reg_tmp << 0);
812+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x20, reg_backup);
813+ reg_backup = tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x20);
814+ //printk("PORT[%d] 1e.020 = %x (OFFSET_TESTMODE_1000M_PAIR_C)\n", phyaddr, reg_backup);
815+ }
816+ else if(calibration_pair == ANACAL_PAIR_D){
817+ reg_backup = tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x21);
818+ reg_tmp = ((reg_backup & 0x3f00) >> 8);
819+ reg_tmp -= 8;
820+ reg_backup = (reg_backup & (~0x3f00));
821+ reg_backup |= (reg_tmp << 8);
822+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x21, reg_backup);
823+ reg_backup = tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x21);
824+ //printk("PORT[%d] 1e.021 = %x (OFFSET_1000M_PAIR_D)\n", phyaddr, reg_backup);
825+ reg_backup = tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x22);
826+ reg_tmp = ((reg_backup & 0x3f) >> 0);
827+ reg_tmp -= 8;
828+ reg_backup = (reg_backup & (~0x3f));
829+ reg_backup |= (reg_tmp << 0);
830+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x22, reg_backup);
831+ reg_backup = tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x22);
832+ //printk("PORT[%d] 1e.022 = %x (OFFSET_TESTMODE_1000M_PAIR_D)\n", phyaddr, reg_backup);
833+ }
834+
835+ if (calibration_pair == ANACAL_PAIR_A){
836+ //printk("PORT (%d) TX_AMP PAIR (A) FINAL CALIBRATION RESULT\n", phyaddr);
837+ debug_tmp = tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x12);
838+ //printk("1e.012 = 0x%x\n", debug_tmp);
839+ debug_tmp = tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x16);
840+ //printk("1e.016 = 0x%x\n", debug_tmp);
841+ }
842+
843+ else if(calibration_pair == ANACAL_PAIR_B){
844+ //printk("PORT (%d) TX_AMP PAIR (A) FINAL CALIBRATION RESULT\n", phyaddr);
845+ debug_tmp = tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x17);
846+ //printk("1e.017 = 0x%x\n", debug_tmp);
847+ debug_tmp = tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x18);
848+ //printk("1e.018 = 0x%x\n", debug_tmp);
849+ }
850+ else if(calibration_pair == ANACAL_PAIR_C){
851+ //printk("PORT (%d) TX_AMP PAIR (A) FINAL CALIBRATION RESULT\n", phyaddr);
852+ debug_tmp = tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x19);
853+ //printk("1e.019 = 0x%x\n", debug_tmp);
854+ debug_tmp = tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x20);
855+ //printk("1e.020 = 0x%x\n", debug_tmp);
856+ }
857+ else if(calibration_pair == ANACAL_PAIR_D){
858+ //printk("PORT (%d) TX_AMP PAIR (A) FINAL CALIBRATION RESULT\n", phyaddr);
859+ debug_tmp = tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x21);
860+ //printk("1e.021 = 0x%x\n", debug_tmp);
861+ debug_tmp = tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x22);
862+ //printk("1e.022 = 0x%x\n", debug_tmp);
863+ }
864+
865+
866+ printk( " GE Tx amp AnaCal Done! (pair-%d)(1e_%x = 0x%x)\n", calibration_pair, tx_amp_reg, tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg));
867+
868+ } else {
869+ if((tx_amp_temp == 0x3f)||(tx_amp_temp == 0x00)) {
870+ all_ana_cal_status = ANACAL_SATURATION; // need to FT
871+ printk( " GE Tx amp AnaCal Saturation! \r\n");
872+ }
873+ }
874+ }
875+
876+ if(all_ana_cal_status == ANACAL_ERROR) {
877+ tx_amp_temp = 0x20;
878+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, tx_amp_reg, (reg_temp|(tx_amp_temp<<tx_amp_reg_shift)));
879+ }
880+ }
881+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x017d, 0x0000);
882+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x017e, 0x0000);
883+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x017f, 0x0000);
884+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x0180, 0x0000);
885+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x0181, 0x0000);
886+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x0182, 0x0000);
887+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x0183, 0x0000);
888+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x0184, 0x0000);
889+
890+ /* disable analog calibration circuit */
891+ tc_phy_write_dev_reg(gsw, PHY0, 0x1e, 0x00db, 0x0000);
892+ tc_phy_write_dev_reg(gsw, PHY0, 0x1e, 0x00dc, 0x0000); // disable Tx offset calibration circuit
893+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x00db, 0x0000); // disable analog calibration circuit
894+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x00dc, 0x0000); // disable Tx offset calibration circuit
895+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x003e, 0x0000); // disable Tx VLD force mode
896+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x00dd, 0x0000); // disable Tx offset/amplitude calibration circuit
897+
898+
899+
900+ //tc_phy_write_dev_reg(gsw, phyaddr, 0x1f, 0x273, 0x2000);
901+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0xc9, 0x0fff);
902+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x145, 0x1000);
903+
904+ /* Restore CR to default */
905+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x11, orig_1e_11);
906+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1f, 0x300, orig_1f_300);
907+
908+ return 0;
909+}
910+
911+//-----------------------------------------------------------------
912+
913+int phy_calibration(struct gsw_mt753x *gsw, u8 phyaddr)
914+{
915+ //u32 reg_tmp,reg_tmp0, reg_tmp1, i;
916+ u32 reg_tmp;
917+ u32 CALDLY = 40;
918+ u32 orig_1e_11, orig_1e_185, orig_1e_e1, orig_1f_100;
919+ int ret;
920+ /* set [12]AN disable, [8]full duplex, [13/6]1000Mbps */
921+ //tc_phy_write_dev_reg(phyaddr, 0x0, 0x0140);
922+ switch_phy_write(gsw, phyaddr, R0, 0x140);
923+
924+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x145, 0x1010);/* fix mdi */
925+ orig_1e_185 = tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, RG_185);
926+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, RG_185, 0);/* disable tx slew control */
927+ orig_1f_100 = tc_phy_read_dev_reg(gsw, phyaddr, 0x1f, 0x100);
928+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1f, 0x100, 0xc000);/* BG voltage output */
929+ //tc_phy_write_dev_reg(gsw, phyaddr, 0x1f, 0x403, 0x1099); //bypass efuse
930+
931+#if (1)
932+ // 1f_27c[12:8] cr_da_tx_i2mpb_10m Trimming TX bias setup(@10M)
933+ //tc_phy_write_dev_reg(gsw, phyaddr, 0x1f, 0x27c, 0x1f1f);
934+ //tc_phy_write_dev_reg(gsw, phyaddr, 0x1f, 0x27c, 0x3300);
935+
936+ //reg_tmp1 = tc_phy_read_dev_reg(gsw, PHY0, 0x1f, 0x27c);
937+ //dev1Fh_reg273h TXVLD DA register - Adjust voltage mode TX amplitude.
938+ //tc_phy_write_dev_reg(phyaddr, 0x1f, 0x273, 0);
939+ //tc_phy_write_dev_reg(gsw, phyaddr, 0x1f, 0x273, 0x1000);
940+ //reg_tmp1 = tc_phy_read_dev_reg(gsw, phyaddr, 0x1f, 0x273);
941+ //printk("reg_tmp1273 = %x\n", reg_tmp1);
942+ /*1e_11 TX overshoot Enable (PAIR A/B/C/D) in gbe mode*/
943+
944+ orig_1e_11 = tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x11);
945+ reg_tmp = tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x11);
946+ reg_tmp = reg_tmp | (0xf << 12);
947+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x11, reg_tmp);
948+ orig_1e_e1 = tc_phy_read_dev_reg(gsw, PHY0, 0x1e, 0x00e1);
949+ tc_phy_write_dev_reg(gsw, PHY0, 0x1e, 0x00e1, 0x10);
950+ /* calibration start ============ */
951+ printk("CALDLY = %d\n", CALDLY);
952+ if(ge_cal_flag == 0){
953+ ret = ge_cal_rext(gsw, 0, CALDLY);
954+ if (ret == -1){
955+ printk("ge_cal_rext error K port =%d\n", phyaddr);
956+ return ret;
957+ }
958+ ge_cal_flag = 1;
959+ }
960+
961+ /* *** R50 Cal start ***************************** */
962+ /*phyaddress = 0*/
963+ ret = ge_cal_r50(gsw, phyaddr, CALDLY);
964+ if (ret == -1){
965+ printk("R50 error K port =%d\n", phyaddr);
966+ return ret;
967+ }
968+ /* *** R50 Cal end *** */
969+ /* *** Tx offset Cal start *********************** */
970+ ret = ge_cal_tx_offset(gsw, phyaddr, CALDLY);
971+ if (ret == -1){
972+ printk("ge_cal_tx_offset error K port =%d\n", phyaddr);
973+ return ret;
974+ }
975+ /* *** Tx offset Cal end *** */
976+
977+ /* *** Tx Amp Cal start *** */
978+ ret = ge_cal_tx_amp(gsw, phyaddr, CALDLY);
979+ if (ret == -1){
980+ printk("ge_cal_tx_amp error K port =%d\n", phyaddr);
981+ return ret;
982+ }
983+ /* *** Tx Amp Cal end *** */
984+ /*tmp maybe changed*/
985+ //tc_phy_write_dev_reg(gsw, phyaddr, 0x1f, 0x27c, 0x1111);
986+ //tc_phy_write_dev_reg(gsw, phyaddr, 0x1f, 0x27b, 0x47);
987+ //tc_phy_write_dev_reg(gsw, phyaddr, 0x1f, 0x273, 0x2000);
988+
989+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x3a8, 0x0810);
990+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x3aa, 0x0008);
991+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x3ab, 0x0810);
992+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x3ad, 0x0008);
993+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x3ae, 0x0106);
994+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x3b0, 0x0001);
995+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x3b1, 0x0106);
996+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x3b3, 0x0001);
997+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x18c, 0x0001);
998+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x18d, 0x0001);
999+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x18e, 0x0001);
1000+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x18f, 0x0001);
1001+
1002+ /*da_tx_bias1_b_tx_standby = 5'b10 (dev1eh_reg3aah[12:8])*/
1003+ reg_tmp = tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x3aa);
1004+ reg_tmp = reg_tmp & ~(0x1f00);
1005+ reg_tmp = reg_tmp | 0x2 << 8;
1006+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x3aa, reg_tmp);
1007+
1008+ /*da_tx_bias1_a_tx_standby = 5'b10 (dev1eh_reg3a9h[4:0])*/
1009+ reg_tmp = tc_phy_read_dev_reg(gsw, phyaddr, 0x1e, 0x3a9);
1010+ reg_tmp = reg_tmp & ~(0x1f);
1011+ reg_tmp = reg_tmp | 0x2;
1012+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x3a9, reg_tmp);
1013+
1014+ /* Restore CR to default */
1015+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, RG_185, orig_1e_185);
1016+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1f, 0x100, orig_1f_100);
1017+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x11, orig_1e_11);
1018+ tc_phy_write_dev_reg(gsw, PHY0, 0x1e, 0x00e1, orig_1e_e1);
1019+#endif
1020+ return 0;
1021+}
1022+
1023+void rx_dc_offset(struct gsw_mt753x *gsw, u8 phyaddr)
1024+{
1025+ pr_info("PORT %d RX_DC_OFFSET\n", phyaddr);
1026+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x96, 0x8000);
1027+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x37, 0x3);
1028+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x107, 0x4000);
1029+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x171, 0x1e5);
1030+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x39, 0x200f);
1031+ udelay(40);
1032+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x39, 0x000f);
1033+ udelay(40);
1034+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1e, 0x171, 0x65);
1035+}
1036+
1037+void check_rx_dc_offset_pair_a(struct gsw_mt753x *gsw, u8 phyaddr)
1038+{
1039+ u32 reg_tmp;
1040+
1041+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1f, 0x15, (phyaddr << 13) | 0x114f);
1042+ reg_tmp = tc_phy_read_dev_reg(gsw, phyaddr, 0x1f, 0x1a);
1043+ reg_tmp = reg_tmp & 0xff;
1044+ pr_info("before pairA output = %x\n", reg_tmp);
1045+ udelay(40);
1046+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1f, 0x15, (phyaddr << 13) | 0x1142);
1047+ udelay(40);
1048+ reg_tmp = tc_phy_read_dev_reg(gsw, phyaddr, 0x1f, 0x1a);
1049+ reg_tmp = reg_tmp & 0xff;
1050+ pr_info("after pairA output = %x\n", reg_tmp);
1051+ if ((reg_tmp & 0x80) != 0)
1052+ reg_tmp = (~reg_tmp) + 1;
1053+ if ((reg_tmp & 0xff) >4)
1054+ pr_info("pairA RX_DC_OFFSET error");
1055+}
1056+
1057+void check_rx_dc_offset_pair_b(struct gsw_mt753x *gsw, u8 phyaddr)
1058+{
1059+ u32 reg_tmp;
1060+
1061+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1f, 0x15, (phyaddr << 13) | 0x1151);
1062+ reg_tmp = tc_phy_read_dev_reg(gsw, phyaddr, 0x1f, 0x1a);
1063+ reg_tmp = reg_tmp & 0xff;
1064+ pr_info("before pairB output = %x\n", reg_tmp);
1065+ udelay(40);
1066+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1f, 0x15, (phyaddr << 13) | 0x1143);
1067+ udelay(40);
1068+ reg_tmp = tc_phy_read_dev_reg(gsw, phyaddr, 0x1f, 0x1a);
1069+ reg_tmp = reg_tmp & 0xff;
1070+ pr_info("after pairB output = %x\n", reg_tmp);
1071+ if ((reg_tmp & 0x80) != 0)
1072+ reg_tmp = (~reg_tmp) + 1;
1073+ if ((reg_tmp & 0xff) >4)
1074+ pr_info("pairB RX_DC_OFFSET error");
1075+}
1076+
1077+void check_rx_dc_offset_pair_c(struct gsw_mt753x *gsw, u8 phyaddr)
1078+{
1079+ u32 reg_tmp;
1080+
1081+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1f, 0x15, (phyaddr << 13) | 0x1153);
1082+ reg_tmp = tc_phy_read_dev_reg(gsw, phyaddr, 0x1f, 0x1a);
1083+ reg_tmp = reg_tmp & 0xff;
1084+ pr_info("before pairC output = %x\n", reg_tmp);
1085+ udelay(40);
1086+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1f, 0x15, (phyaddr << 13) | 0x1144);
1087+ udelay(40);
1088+ reg_tmp = tc_phy_read_dev_reg(gsw, phyaddr, 0x1f, 0x1a);
1089+ reg_tmp = reg_tmp & 0xff;
1090+ pr_info("after pairC output = %x\n", reg_tmp);
1091+ if ((reg_tmp & 0x80) != 0)
1092+ reg_tmp = (~reg_tmp) + 1;
1093+ if ((reg_tmp & 0xff) >4)
1094+ pr_info("pairC RX_DC_OFFSET error");
1095+}
1096+
1097+void check_rx_dc_offset_pair_d(struct gsw_mt753x *gsw, u8 phyaddr)
1098+{
1099+ u32 reg_tmp;
1100+
1101+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1f, 0x15, (phyaddr << 13) | 0x1155);
1102+ reg_tmp = tc_phy_read_dev_reg(gsw, phyaddr, 0x1f, 0x1a);
1103+ reg_tmp = reg_tmp & 0xff;
1104+ pr_info("before pairD output = %x\n", reg_tmp);
1105+ udelay(40);
1106+ tc_phy_write_dev_reg(gsw, phyaddr, 0x1f, 0x15, (phyaddr << 13) | 0x1145);
1107+ udelay(40);
1108+ reg_tmp = tc_phy_read_dev_reg(gsw, phyaddr, 0x1f, 0x1a);
1109+ reg_tmp = reg_tmp & 0xff;
1110+ pr_info("after pairD output = %x\n", reg_tmp);
1111+ if ((reg_tmp & 0x80) != 0)
1112+ reg_tmp = (~reg_tmp) + 1;
1113+ if ((reg_tmp & 0xff) >4)
1114+ pr_info("pairD RX_DC_OFFSET error");
1115+}
1116+
1117+
1118+int mt753x_phy_calibration(struct gsw_mt753x *gsw, u8 phyaddr){
1119+
1120+ int ret;
1121+
1122+ ret = phy_calibration(gsw, phyaddr);
1123+
1124+ rx_dc_offset(gsw, phyaddr);
1125+ check_rx_dc_offset_pair_a(gsw, phyaddr);
1126+ check_rx_dc_offset_pair_b(gsw, phyaddr);
1127+ check_rx_dc_offset_pair_c(gsw, phyaddr);
1128+ check_rx_dc_offset_pair_d(gsw, phyaddr);
1129+
1130+ return ret;
1131+}
1132Index: drivers/net/phy/mtk/mt753x/mt753x_phy.h
1133===================================================================
1134new file mode 100644
1135--- /dev/null
1136+++ b/drivers/net/phy/mtk/mt753x/mt753x_phy.h
1137@@ -0,0 +1,145 @@
1138+/* SPDX-License-Identifier: GPL-2.0+ */
1139+/*
1140+ * Register definitions for MediaTek MT753x Gigabit switches
1141+ *
1142+ * Copyright (C) 2018 MediaTek Inc. All Rights Reserved.
1143+ *
1144+ * Author: Weijie Gao <weijie.gao@mediatek.com>
1145+ */
1146+
1147+#ifndef _MT753X_PHY_H_
1148+#define _MT753X_PHY_H_
1149+
1150+#include <linux/bitops.h>
1151+
1152+/*phy calibration use*/
1153+#define DEV_1E 0x1E
1154+/*global device 0x1f, always set P0*/
1155+#define DEV_1F 0x1F
1156+
1157+
1158+/************IEXT/REXT CAL***************/
1159+/* bits range: for example BITS(16,23) = 0xFF0000*/
1160+#define BITS(m, n) (~(BIT(m) - 1) & ((BIT(n) - 1) | BIT(n)))
1161+#define ANACAL_INIT 0x01
1162+#define ANACAL_ERROR 0xFD
1163+#define ANACAL_SATURATION 0xFE
1164+#define ANACAL_FINISH 0xFF
1165+#define ANACAL_PAIR_A 0
1166+#define ANACAL_PAIR_B 1
1167+#define ANACAL_PAIR_C 2
1168+#define ANACAL_PAIR_D 3
1169+#define DAC_IN_0V 0x00
1170+#define DAC_IN_2V 0xf0
1171+#define TX_AMP_OFFSET_0MV 0x20
1172+#define TX_AMP_OFFSET_VALID_BITS 6
1173+
1174+#define R0 0
1175+#define PHY0 0
1176+#define PHY1 1
1177+#define PHY2 2
1178+#define PHY3 3
1179+#define PHY4 4
1180+#define ANA_TEST_MODE BITS(8, 15)
1181+#define TST_TCLK_SEL BITs(6, 7)
1182+#define ANA_TEST_VGA_RG 0x100
1183+
1184+#define FORCE_MDI_CROSS_OVER BITS(3, 4)
1185+#define T10_TEST_CTL_RG 0x145
1186+#define RG_185 0x185
1187+#define RG_TX_SLEW BIT(0)
1188+#define ANA_CAL_0 0xdb
1189+#define RG_CAL_CKINV BIT(12)
1190+#define RG_ANA_CALEN BIT(8)
1191+#define RG_REXT_CALEN BIT(4)
1192+#define RG_ZCALEN_A BIT(0)
1193+#define ANA_CAL_1 0xdc
1194+#define RG_ZCALEN_B BIT(12)
1195+#define RG_ZCALEN_C BIT(8)
1196+#define RG_ZCALEN_D BIT(4)
1197+#define RG_TXVOS_CALEN BIT(0)
1198+#define ANA_CAL_6 0xe1
1199+#define RG_CAL_REFSEL BIT(4)
1200+#define RG_CAL_COMP_PWD BIT(0)
1201+#define ANA_CAL_5 0xe0
1202+#define RG_REXT_TRIM BITs(8, 13)
1203+#define RG_ZCAL_CTRL BITs(0, 5)
1204+#define RG_17A 0x17a
1205+#define AD_CAL_COMP_OUT BIT(8)
1206+#define RG_17B 0x17b
1207+#define AD_CAL_CLK bit(0)
1208+#define RG_17C 0x17c
1209+#define DA_CALIN_FLAG bit(0)
1210+/************R50 CAL****************************/
1211+#define RG_174 0x174
1212+#define RG_R50OHM_RSEL_TX_A_EN BIT[15]
1213+#define CR_R50OHM_RSEL_TX_A BITS[8:14]
1214+#define RG_R50OHM_RSEL_TX_B_EN BIT[7]
1215+#define CR_R50OHM_RSEL_TX_B BITS[6:0]
1216+#define RG_175 0x175
1217+#define RG_R50OHM_RSEL_TX_C_EN BITS[15]
1218+#define CR_R50OHM_RSEL_TX_C BITS[8:14]
1219+#define RG_R50OHM_RSEL_TX_D_EN BIT[7]
1220+#define CR_R50OHM_RSEL_TX_D BITS[0:6]
1221+/**********TX offset Calibration***************************/
1222+#define RG_95 0x96
1223+#define BYPASS_TX_OFFSET_CAL BIT(15)
1224+#define RG_3E 0x3e
1225+#define BYPASS_PD_TXVLD_A BIT(15)
1226+#define BYPASS_PD_TXVLD_B BIT(14)
1227+#define BYPASS_PD_TXVLD_C BIT(13)
1228+#define BYPASS_PD_TXVLD_D BIT(12)
1229+#define BYPASS_PD_TX_10M BIT(11)
1230+#define POWER_DOWN_TXVLD_A BIT(7)
1231+#define POWER_DOWN_TXVLD_B BIT(6)
1232+#define POWER_DOWN_TXVLD_C BIT(5)
1233+#define POWER_DOWN_TXVLD_D BIT(4)
1234+#define POWER_DOWN_TX_10M BIT(3)
1235+#define RG_DD 0xdd
1236+#define RG_TXG_CALEN_A BIT(12)
1237+#define RG_TXG_CALEN_B BIT(8)
1238+#define RG_TXG_CALEN_C BIT(4)
1239+#define RG_TXG_CALEN_D BIT(0)
1240+#define RG_17D 0x17D
1241+#define FORCE_DASN_DAC_IN0_A BIT(15)
1242+#define DASN_DAC_IN0_A BITS(0, 9)
1243+#define RG_17E 0x17E
1244+#define FORCE_DASN_DAC_IN0_B BIT(15)
1245+#define DASN_DAC_IN0_B BITS(0, 9)
1246+#define RG_17F 0x17F
1247+
1248+#define FORCE_DASN_DAC_IN0_C BIT(15)
1249+#define DASN_DAC_IN0_C BITS(0, 9)
1250+#define RG_180 0x180
1251+#define FORCE_DASN_DAC_IN0_D BIT(15)
1252+#define DASN_DAC_IN0_D BITS(0, 9)
1253+
1254+#define RG_181 0x181
1255+#define FORCE_DASN_DAC_IN1_A BIT(15)
1256+#define DASN_DAC_IN1_A BITS(0, 9)
1257+#define RG_182 0x182
1258+#define FORCE_DASN_DAC_IN1_B BIT(15)
1259+#define DASN_DAC_IN1_B BITS(0, 9)
1260+#define RG_183 0x183
1261+#define FORCE_DASN_DAC_IN1_C BIT15]
1262+#define DASN_DAC_IN1_C BITS(0, 9)
1263+#define RG_184 0x184
1264+#define FORCE_DASN_DAC_IN1_D BIT(15)
1265+#define DASN_DAC_IN1_D BITS(0, 9)
1266+#define RG_172 0x172
1267+#define CR_TX_AMP_OFFSET_A BITS(8, 13)
1268+#define CR_TX_AMP_OFFSET_B BITS(0, 5)
1269+#define RG_173 0x173
1270+#define CR_TX_AMP_OFFSET_C BITS(8, 13)
1271+#define CR_TX_AMP_OFFSET_D BITS(0, 5)
1272+/**********TX Amp Calibration ***************************/
1273+#define RG_12 0x12
1274+#define DA_TX_I2MPB_A_GBE BITS(10, 15)
1275+#define RG_17 0x17
1276+#define DA_TX_I2MPB_B_GBE BITS(8, 13)
1277+#define RG_19 0x19
1278+#define DA_TX_I2MPB_C_GBE BITS(8, 13)
1279+#define RG_21 0x21
1280+#define DA_TX_I2MPB_D_GBE BITS(8, 13)
1281+
1282+#endif /* _MT753X_REGS_H_ */