m88e6060.c 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. /*
  2. * (C) Copyright 2004
  3. * Elmeg Communications Systems GmbH, Juergen Selent (j.selent@elmeg.de)
  4. *
  5. * Support for the Elmeg VoVPN Gateway Module
  6. * ------------------------------------------
  7. * Initialize Marvell M88E6060 Switch
  8. *
  9. * This program is free software; you can redistribute it and/or
  10. * modify it under the terms of the GNU General Public License as
  11. * published by the Free Software Foundation; either version 2 of
  12. * the License, or (at your option) any later version.
  13. *
  14. * This program is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  17. * GNU General Public License for more details.
  18. *
  19. * You should have received a copy of the GNU General Public License
  20. * along with this program; if not, write to the Free Software
  21. * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  22. * MA 02111-1307 USA
  23. */
  24. #include <common.h>
  25. #include <ioports.h>
  26. #include <mpc8260.h>
  27. #include <asm/m8260_pci.h>
  28. #include <net.h>
  29. #include <miiphy.h>
  30. #include "m88e6060.h"
  31. #if defined(CONFIG_CMD_NET)
  32. static int prtTab[M88X_PRT_CNT] = { 8, 9, 10, 11, 12, 13 };
  33. static int phyTab[M88X_PHY_CNT] = { 0, 1, 2, 3, 4 };
  34. static m88x_regCfg_t prtCfg0[] = {
  35. { 4, 0x3e7c, 0x8000 },
  36. { 4, 0x3e7c, 0x8003 },
  37. { 6, 0x0fc0, 0x001e },
  38. { -1, 0xffff, 0x0000 }
  39. };
  40. static m88x_regCfg_t prtCfg1[] = {
  41. { 4, 0x3e7c, 0x8000 },
  42. { 4, 0x3e7c, 0x8003 },
  43. { 6, 0x0fc0, 0x001d },
  44. { -1, 0xffff, 0x0000 }
  45. };
  46. static m88x_regCfg_t prtCfg2[] = {
  47. { 4, 0x3e7c, 0x8000 },
  48. { 4, 0x3e7c, 0x8003 },
  49. { 6, 0x0fc0, 0x001b },
  50. { -1, 0xffff, 0x0000 }
  51. };
  52. static m88x_regCfg_t prtCfg3[] = {
  53. { 4, 0x3e7c, 0x8000 },
  54. { 4, 0x3e7c, 0x8003 },
  55. { 6, 0x0fc0, 0x0017 },
  56. { -1, 0xffff, 0x0000 }
  57. };
  58. static m88x_regCfg_t prtCfg4[] = {
  59. { 4, 0x3e7c, 0x8000 },
  60. { 4, 0x3e7c, 0x8003 },
  61. { 6, 0x0fc0, 0x000f },
  62. { -1, 0xffff, 0x0000 }
  63. };
  64. static m88x_regCfg_t *prtCfg[M88X_PRT_CNT] = {
  65. prtCfg0,prtCfg1,prtCfg2,prtCfg3,prtCfg4,NULL
  66. };
  67. static m88x_regCfg_t phyCfgX[] = {
  68. { 4, 0xfa1f, 0x01e0 },
  69. { 0, 0x213f, 0x1200 },
  70. { 24, 0x81ff, 0x1200 },
  71. { -1, 0xffff, 0x0000 }
  72. };
  73. static m88x_regCfg_t *phyCfg[M88X_PHY_CNT] = {
  74. phyCfgX,phyCfgX,phyCfgX,phyCfgX,NULL
  75. };
  76. #if 0
  77. static void
  78. m88e6060_dump( int devAddr )
  79. {
  80. int i, j;
  81. unsigned short val[6];
  82. printf( "M88E6060 Register Dump\n" );
  83. printf( "====================================\n" );
  84. printf( "PortNo 0 1 2 3 4 5\n" );
  85. for (i=0; i<6; i++)
  86. miiphy_read( devAddr+prtTab[i],M88X_PRT_STAT,&val[i] );
  87. printf( "STAT %04hx %04hx %04hx %04hx %04hx %04hx\n",
  88. val[0],val[1],val[2],val[3],val[4],val[5] );
  89. for (i=0; i<6; i++)
  90. miiphy_read( devAddr+prtTab[i],M88X_PRT_ID,&val[i] );
  91. printf( "ID %04hx %04hx %04hx %04hx %04hx %04hx\n",
  92. val[0],val[1],val[2],val[3],val[4],val[5] );
  93. for (i=0; i<6; i++)
  94. miiphy_read( devAddr+prtTab[i],M88X_PRT_CNTL,&val[i] );
  95. printf( "CNTL %04hx %04hx %04hx %04hx %04hx %04hx\n",
  96. val[0],val[1],val[2],val[3],val[4],val[5] );
  97. for (i=0; i<6; i++)
  98. miiphy_read( devAddr+prtTab[i],M88X_PRT_VLAN,&val[i] );
  99. printf( "VLAN %04hx %04hx %04hx %04hx %04hx %04hx\n",
  100. val[0],val[1],val[2],val[3],val[4],val[5] );
  101. for (i=0; i<6; i++)
  102. miiphy_read( devAddr+prtTab[i],M88X_PRT_PAV,&val[i] );
  103. printf( "PAV %04hx %04hx %04hx %04hx %04hx %04hx\n",
  104. val[0],val[1],val[2],val[3],val[4],val[5] );
  105. for (i=0; i<6; i++)
  106. miiphy_read( devAddr+prtTab[i],M88X_PRT_RX,&val[i] );
  107. printf( "RX %04hx %04hx %04hx %04hx %04hx %04hx\n",
  108. val[0],val[1],val[2],val[3],val[4],val[5] );
  109. for (i=0; i<6; i++)
  110. miiphy_read( devAddr+prtTab[i],M88X_PRT_TX,&val[i] );
  111. printf( "TX %04hx %04hx %04hx %04hx %04hx %04hx\n",
  112. val[0],val[1],val[2],val[3],val[4],val[5] );
  113. printf( "------------------------------------\n" );
  114. printf( "PhyNo 0 1 2 3 4\n" );
  115. for (i=0; i<9; i++) {
  116. for (j=0; j<5; j++) {
  117. miiphy_read( devAddr+phyTab[j],i,&val[j] );
  118. }
  119. printf( "0x%02x %04hx %04hx %04hx %04hx %04hx\n",
  120. i,val[0],val[1],val[2],val[3],val[4] );
  121. }
  122. for (i=0x10; i<0x1d; i++) {
  123. for (j=0; j<5; j++) {
  124. miiphy_read( devAddr+phyTab[j],i,&val[j] );
  125. }
  126. printf( "0x%02x %04hx %04hx %04hx %04hx %04hx\n",
  127. i,val[0],val[1],val[2],val[3],val[4] );
  128. }
  129. }
  130. #endif
  131. int
  132. m88e6060_initialize( int devAddr )
  133. {
  134. static char *_f = "m88e6060_initialize:";
  135. m88x_regCfg_t *p;
  136. int err;
  137. int i;
  138. unsigned short val;
  139. /*** reset all phys into powerdown ************************************/
  140. for (i=0, err=0; i<M88X_PHY_CNT; i++) {
  141. err += bb_miiphy_read(NULL, devAddr+phyTab[i],M88X_PHY_CNTL,&val );
  142. /* keep SpeedLSB, Duplex */
  143. val &= 0x2100;
  144. /* set SWReset, AnegEn, PwrDwn, RestartAneg */
  145. val |= 0x9a00;
  146. err += bb_miiphy_write(NULL, devAddr+phyTab[i],M88X_PHY_CNTL,val );
  147. }
  148. if (err) {
  149. printf( "%s [ERR] reset phys\n",_f );
  150. return( -1 );
  151. }
  152. /*** disable all ports ************************************************/
  153. for (i=0, err=0; i<M88X_PRT_CNT; i++) {
  154. err += bb_miiphy_read(NULL, devAddr+prtTab[i],M88X_PRT_CNTL,&val );
  155. val &= 0xfffc;
  156. err += bb_miiphy_write(NULL, devAddr+prtTab[i],M88X_PRT_CNTL,val );
  157. }
  158. if (err) {
  159. printf( "%s [ERR] disable ports\n",_f );
  160. return( -1 );
  161. }
  162. /*** initialize switch ************************************************/
  163. /* set switch mac addr */
  164. #define ea eth_get_dev()->enetaddr
  165. val = (ea[4] << 8) | ea[5];
  166. err = bb_miiphy_write(NULL, devAddr+15,M88X_GLB_MAC45,val );
  167. val = (ea[2] << 8) | ea[3];
  168. err += bb_miiphy_write(NULL, devAddr+15,M88X_GLB_MAC23,val );
  169. val = (ea[0] << 8) | ea[1];
  170. #undef ea
  171. val &= 0xfeff; /* clear DiffAddr */
  172. err += bb_miiphy_write(NULL, devAddr+15,M88X_GLB_MAC01,val );
  173. if (err) {
  174. printf( "%s [ERR] switch mac address register\n",_f );
  175. return( -1 );
  176. }
  177. /* !DiscardExcessive, MaxFrameSize, CtrMode */
  178. err = bb_miiphy_read(NULL, devAddr+15,M88X_GLB_CNTL,&val );
  179. val &= 0xd870;
  180. val |= 0x0500;
  181. err += bb_miiphy_write(NULL, devAddr+15,M88X_GLB_CNTL,val );
  182. if (err) {
  183. printf( "%s [ERR] switch global control register\n",_f );
  184. return( -1 );
  185. }
  186. /* LernDis off, ATUSize 1024, AgeTime 5min */
  187. err = bb_miiphy_read(NULL, devAddr+15,M88X_ATU_CNTL,&val );
  188. val &= 0x000f;
  189. val |= 0x2130;
  190. err += bb_miiphy_write(NULL, devAddr+15,M88X_ATU_CNTL,val );
  191. if (err) {
  192. printf( "%s [ERR] atu control register\n",_f );
  193. return( -1 );
  194. }
  195. /*** initialize ports *************************************************/
  196. for (i=0; i<M88X_PRT_CNT; i++) {
  197. if ((p = prtCfg[i]) == NULL) {
  198. continue;
  199. }
  200. while (p->reg != -1) {
  201. err = 0;
  202. err += bb_miiphy_read(NULL, devAddr+prtTab[i],p->reg,&val );
  203. val &= p->msk;
  204. val |= p->val;
  205. err += bb_miiphy_write(NULL, devAddr+prtTab[i],p->reg,val );
  206. if (err) {
  207. printf( "%s [ERR] config port %d register %d\n",_f,i,p->reg );
  208. /* XXX what todo */
  209. }
  210. p++;
  211. }
  212. }
  213. /*** initialize phys **************************************************/
  214. for (i=0; i<M88X_PHY_CNT; i++) {
  215. if ((p = phyCfg[i]) == NULL) {
  216. continue;
  217. }
  218. while (p->reg != -1) {
  219. err = 0;
  220. err += bb_miiphy_read(NULL, devAddr+phyTab[i],p->reg,&val );
  221. val &= p->msk;
  222. val |= p->val;
  223. err += bb_miiphy_write(NULL, devAddr+phyTab[i],p->reg,val );
  224. if (err) {
  225. printf( "%s [ERR] config phy %d register %d\n",_f,i,p->reg );
  226. /* XXX what todo */
  227. }
  228. p++;
  229. }
  230. }
  231. udelay(100000);
  232. return( 0 );
  233. }
  234. #endif