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