1*23e7578cSPurna Chandra Mandal /* 2*23e7578cSPurna Chandra Mandal * (c) 2015 Purna Chandra Mandal <purna.mandal@microchip.com> 3*23e7578cSPurna Chandra Mandal * 4*23e7578cSPurna Chandra Mandal * SPDX-License-Identifier: GPL-2.0+ 5*23e7578cSPurna Chandra Mandal * 6*23e7578cSPurna Chandra Mandal */ 7*23e7578cSPurna Chandra Mandal 8*23e7578cSPurna Chandra Mandal #ifndef __MICROCHIP_PIC32_ETH_H_ 9*23e7578cSPurna Chandra Mandal #define __MICROCHIP_PIC32_ETH_H_ 10*23e7578cSPurna Chandra Mandal 11*23e7578cSPurna Chandra Mandal #include <mach/pic32.h> 12*23e7578cSPurna Chandra Mandal 13*23e7578cSPurna Chandra Mandal /* Ethernet */ 14*23e7578cSPurna Chandra Mandal struct pic32_ectl_regs { 15*23e7578cSPurna Chandra Mandal struct pic32_reg_atomic con1; /* 0x00 */ 16*23e7578cSPurna Chandra Mandal struct pic32_reg_atomic con2; /* 0x10 */ 17*23e7578cSPurna Chandra Mandal struct pic32_reg_atomic txst; /* 0x20 */ 18*23e7578cSPurna Chandra Mandal struct pic32_reg_atomic rxst; /* 0x30 */ 19*23e7578cSPurna Chandra Mandal struct pic32_reg_atomic ht0; /* 0x40 */ 20*23e7578cSPurna Chandra Mandal struct pic32_reg_atomic ht1; /* 0x50 */ 21*23e7578cSPurna Chandra Mandal struct pic32_reg_atomic pmm0; /* 0x60 */ 22*23e7578cSPurna Chandra Mandal struct pic32_reg_atomic pmm1; /* 0x70 */ 23*23e7578cSPurna Chandra Mandal struct pic32_reg_atomic pmcs; /* 0x80 */ 24*23e7578cSPurna Chandra Mandal struct pic32_reg_atomic pmo; /* 0x90 */ 25*23e7578cSPurna Chandra Mandal struct pic32_reg_atomic rxfc; /* 0xa0 */ 26*23e7578cSPurna Chandra Mandal struct pic32_reg_atomic rxwm; /* 0xb0 */ 27*23e7578cSPurna Chandra Mandal struct pic32_reg_atomic ien; /* 0xc0 */ 28*23e7578cSPurna Chandra Mandal struct pic32_reg_atomic irq; /* 0xd0 */ 29*23e7578cSPurna Chandra Mandal struct pic32_reg_atomic stat; /* 0xe0 */ 30*23e7578cSPurna Chandra Mandal }; 31*23e7578cSPurna Chandra Mandal 32*23e7578cSPurna Chandra Mandal struct pic32_mii_regs { 33*23e7578cSPurna Chandra Mandal struct pic32_reg_atomic mcfg; /* 0x280 */ 34*23e7578cSPurna Chandra Mandal struct pic32_reg_atomic mcmd; /* 0x290 */ 35*23e7578cSPurna Chandra Mandal struct pic32_reg_atomic madr; /* 0x2a0 */ 36*23e7578cSPurna Chandra Mandal struct pic32_reg_atomic mwtd; /* 0x2b0 */ 37*23e7578cSPurna Chandra Mandal struct pic32_reg_atomic mrdd; /* 0x2c0 */ 38*23e7578cSPurna Chandra Mandal struct pic32_reg_atomic mind; /* 0x2d0 */ 39*23e7578cSPurna Chandra Mandal }; 40*23e7578cSPurna Chandra Mandal 41*23e7578cSPurna Chandra Mandal struct pic32_emac_regs { 42*23e7578cSPurna Chandra Mandal struct pic32_reg_atomic cfg1; /* 0x200*/ 43*23e7578cSPurna Chandra Mandal struct pic32_reg_atomic cfg2; /* 0x210*/ 44*23e7578cSPurna Chandra Mandal struct pic32_reg_atomic ipgt; /* 0x220*/ 45*23e7578cSPurna Chandra Mandal struct pic32_reg_atomic ipgr; /* 0x230*/ 46*23e7578cSPurna Chandra Mandal struct pic32_reg_atomic clrt; /* 0x240*/ 47*23e7578cSPurna Chandra Mandal struct pic32_reg_atomic maxf; /* 0x250*/ 48*23e7578cSPurna Chandra Mandal struct pic32_reg_atomic supp; /* 0x260*/ 49*23e7578cSPurna Chandra Mandal struct pic32_reg_atomic test; /* 0x270*/ 50*23e7578cSPurna Chandra Mandal struct pic32_mii_regs mii; /* 0x280 - 0x2d0 */ 51*23e7578cSPurna Chandra Mandal struct pic32_reg_atomic res1; /* 0x2e0 */ 52*23e7578cSPurna Chandra Mandal struct pic32_reg_atomic res2; /* 0x2f0 */ 53*23e7578cSPurna Chandra Mandal struct pic32_reg_atomic sa0; /* 0x300 */ 54*23e7578cSPurna Chandra Mandal struct pic32_reg_atomic sa1; /* 0x310 */ 55*23e7578cSPurna Chandra Mandal struct pic32_reg_atomic sa2; /* 0x320 */ 56*23e7578cSPurna Chandra Mandal }; 57*23e7578cSPurna Chandra Mandal 58*23e7578cSPurna Chandra Mandal /* ETHCON1 Reg field */ 59*23e7578cSPurna Chandra Mandal #define ETHCON_BUFCDEC BIT(0) 60*23e7578cSPurna Chandra Mandal #define ETHCON_RXEN BIT(8) 61*23e7578cSPurna Chandra Mandal #define ETHCON_TXRTS BIT(9) 62*23e7578cSPurna Chandra Mandal #define ETHCON_ON BIT(15) 63*23e7578cSPurna Chandra Mandal 64*23e7578cSPurna Chandra Mandal /* ETHCON2 Reg field */ 65*23e7578cSPurna Chandra Mandal #define ETHCON_RXBUFSZ 0x7f 66*23e7578cSPurna Chandra Mandal #define ETHCON_RXBUFSZ_SHFT 0x4 67*23e7578cSPurna Chandra Mandal 68*23e7578cSPurna Chandra Mandal /* ETHSTAT Reg field */ 69*23e7578cSPurna Chandra Mandal #define ETHSTAT_BUSY BIT(7) 70*23e7578cSPurna Chandra Mandal #define ETHSTAT_BUFCNT 0x00ff0000 71*23e7578cSPurna Chandra Mandal 72*23e7578cSPurna Chandra Mandal /* ETHRXFC Register fields */ 73*23e7578cSPurna Chandra Mandal #define ETHRXFC_BCEN BIT(0) 74*23e7578cSPurna Chandra Mandal #define ETHRXFC_MCEN BIT(1) 75*23e7578cSPurna Chandra Mandal #define ETHRXFC_UCEN BIT(3) 76*23e7578cSPurna Chandra Mandal #define ETHRXFC_RUNTEN BIT(4) 77*23e7578cSPurna Chandra Mandal #define ETHRXFC_CRCOKEN BIT(5) 78*23e7578cSPurna Chandra Mandal 79*23e7578cSPurna Chandra Mandal /* EMAC1CFG1 register offset */ 80*23e7578cSPurna Chandra Mandal #define PIC32_EMAC1CFG1 0x0200 81*23e7578cSPurna Chandra Mandal 82*23e7578cSPurna Chandra Mandal /* EMAC1CFG1 register fields */ 83*23e7578cSPurna Chandra Mandal #define EMAC_RXENABLE BIT(0) 84*23e7578cSPurna Chandra Mandal #define EMAC_RXPAUSE BIT(2) 85*23e7578cSPurna Chandra Mandal #define EMAC_TXPAUSE BIT(3) 86*23e7578cSPurna Chandra Mandal #define EMAC_SOFTRESET BIT(15) 87*23e7578cSPurna Chandra Mandal 88*23e7578cSPurna Chandra Mandal /* EMAC1CFG2 register fields */ 89*23e7578cSPurna Chandra Mandal #define EMAC_FULLDUP BIT(0) 90*23e7578cSPurna Chandra Mandal #define EMAC_LENGTHCK BIT(1) 91*23e7578cSPurna Chandra Mandal #define EMAC_CRCENABLE BIT(4) 92*23e7578cSPurna Chandra Mandal #define EMAC_PADENABLE BIT(5) 93*23e7578cSPurna Chandra Mandal #define EMAC_AUTOPAD BIT(7) 94*23e7578cSPurna Chandra Mandal #define EMAC_EXCESS BIT(14) 95*23e7578cSPurna Chandra Mandal 96*23e7578cSPurna Chandra Mandal /* EMAC1IPGT register magic */ 97*23e7578cSPurna Chandra Mandal #define FULLDUP_GAP_TIME 0x15 98*23e7578cSPurna Chandra Mandal #define HALFDUP_GAP_TIME 0x12 99*23e7578cSPurna Chandra Mandal 100*23e7578cSPurna Chandra Mandal /* EMAC1SUPP register fields */ 101*23e7578cSPurna Chandra Mandal #define EMAC_RMII_SPD100 BIT(8) 102*23e7578cSPurna Chandra Mandal #define EMAC_RMII_RESET BIT(11) 103*23e7578cSPurna Chandra Mandal 104*23e7578cSPurna Chandra Mandal /* MII Management Configuration Register */ 105*23e7578cSPurna Chandra Mandal #define MIIMCFG_RSTMGMT BIT(15) 106*23e7578cSPurna Chandra Mandal #define MIIMCFG_CLKSEL_DIV40 0x0020 /* 100Mhz / 40 */ 107*23e7578cSPurna Chandra Mandal 108*23e7578cSPurna Chandra Mandal /* MII Management Command Register */ 109*23e7578cSPurna Chandra Mandal #define MIIMCMD_READ BIT(0) 110*23e7578cSPurna Chandra Mandal #define MIIMCMD_SCAN BIT(1) 111*23e7578cSPurna Chandra Mandal 112*23e7578cSPurna Chandra Mandal /* MII Management Address Register */ 113*23e7578cSPurna Chandra Mandal #define MIIMADD_REGADDR 0x1f 114*23e7578cSPurna Chandra Mandal #define MIIMADD_REGADDR_SHIFT 0 115*23e7578cSPurna Chandra Mandal #define MIIMADD_PHYADDR_SHIFT 8 116*23e7578cSPurna Chandra Mandal 117*23e7578cSPurna Chandra Mandal /* MII Management Indicator Register */ 118*23e7578cSPurna Chandra Mandal #define MIIMIND_BUSY BIT(0) 119*23e7578cSPurna Chandra Mandal #define MIIMIND_NOTVALID BIT(2) 120*23e7578cSPurna Chandra Mandal #define MIIMIND_LINKFAIL BIT(3) 121*23e7578cSPurna Chandra Mandal 122*23e7578cSPurna Chandra Mandal /* Packet Descriptor */ 123*23e7578cSPurna Chandra Mandal /* Received Packet Status */ 124*23e7578cSPurna Chandra Mandal #define _RSV1_PKT_CSUM 0xffff 125*23e7578cSPurna Chandra Mandal #define _RSV2_CRC_ERR BIT(20) 126*23e7578cSPurna Chandra Mandal #define _RSV2_LEN_ERR BIT(21) 127*23e7578cSPurna Chandra Mandal #define _RSV2_RX_OK BIT(23) 128*23e7578cSPurna Chandra Mandal #define _RSV2_RX_COUNT 0xffff 129*23e7578cSPurna Chandra Mandal 130*23e7578cSPurna Chandra Mandal #define RSV_RX_CSUM(__rsv1) ((__rsv1) & _RSV1_PKT_CSUM) 131*23e7578cSPurna Chandra Mandal #define RSV_RX_COUNT(__rsv2) ((__rsv2) & _RSV2_RX_COUNT) 132*23e7578cSPurna Chandra Mandal #define RSV_RX_OK(__rsv2) ((__rsv2) & _RSV2_RX_OK) 133*23e7578cSPurna Chandra Mandal #define RSV_CRC_ERR(__rsv2) ((__rsv2) & _RSV2_CRC_ERR) 134*23e7578cSPurna Chandra Mandal 135*23e7578cSPurna Chandra Mandal /* Ethernet Hardware Descriptor Header bits */ 136*23e7578cSPurna Chandra Mandal #define EDH_EOWN BIT(7) 137*23e7578cSPurna Chandra Mandal #define EDH_NPV BIT(8) 138*23e7578cSPurna Chandra Mandal #define EDH_STICKY BIT(9) 139*23e7578cSPurna Chandra Mandal #define _EDH_BCOUNT 0x07ff0000 140*23e7578cSPurna Chandra Mandal #define EDH_EOP BIT(30) 141*23e7578cSPurna Chandra Mandal #define EDH_SOP BIT(31) 142*23e7578cSPurna Chandra Mandal #define EDH_BCOUNT_SHIFT 16 143*23e7578cSPurna Chandra Mandal #define EDH_BCOUNT(len) ((len) << EDH_BCOUNT_SHIFT) 144*23e7578cSPurna Chandra Mandal 145*23e7578cSPurna Chandra Mandal /* Ethernet Hardware Descriptors 146*23e7578cSPurna Chandra Mandal * ref: PIC32 Family Reference Manual Table 35-7 147*23e7578cSPurna Chandra Mandal * This structure represents the layout of the DMA 148*23e7578cSPurna Chandra Mandal * memory shared between the CPU and the Ethernet 149*23e7578cSPurna Chandra Mandal * controller. 150*23e7578cSPurna Chandra Mandal */ 151*23e7578cSPurna Chandra Mandal /* TX/RX DMA descriptor */ 152*23e7578cSPurna Chandra Mandal struct eth_dma_desc { 153*23e7578cSPurna Chandra Mandal u32 hdr; /* header */ 154*23e7578cSPurna Chandra Mandal u32 data_buff; /* data buffer address */ 155*23e7578cSPurna Chandra Mandal u32 stat1; /* transmit/receive packet status */ 156*23e7578cSPurna Chandra Mandal u32 stat2; /* transmit/receive packet status */ 157*23e7578cSPurna Chandra Mandal u32 next_ed; /* next descriptor */ 158*23e7578cSPurna Chandra Mandal }; 159*23e7578cSPurna Chandra Mandal 160*23e7578cSPurna Chandra Mandal #define PIC32_MDIO_NAME "PIC32_EMAC" 161*23e7578cSPurna Chandra Mandal 162*23e7578cSPurna Chandra Mandal int pic32_mdio_init(const char *name, ulong ioaddr); 163*23e7578cSPurna Chandra Mandal 164*23e7578cSPurna Chandra Mandal #endif /* __MICROCHIP_PIC32_ETH_H_*/ 165