1*83d290c5STom Rini /* SPDX-License-Identifier: GPL-2.0+ */ 223e7578cSPurna Chandra Mandal /* 323e7578cSPurna Chandra Mandal * (c) 2015 Purna Chandra Mandal <purna.mandal@microchip.com> 423e7578cSPurna Chandra Mandal * 523e7578cSPurna Chandra Mandal */ 623e7578cSPurna Chandra Mandal 723e7578cSPurna Chandra Mandal #ifndef __MICROCHIP_PIC32_ETH_H_ 823e7578cSPurna Chandra Mandal #define __MICROCHIP_PIC32_ETH_H_ 923e7578cSPurna Chandra Mandal 1023e7578cSPurna Chandra Mandal #include <mach/pic32.h> 1123e7578cSPurna Chandra Mandal 1223e7578cSPurna Chandra Mandal /* Ethernet */ 1323e7578cSPurna Chandra Mandal struct pic32_ectl_regs { 1423e7578cSPurna Chandra Mandal struct pic32_reg_atomic con1; /* 0x00 */ 1523e7578cSPurna Chandra Mandal struct pic32_reg_atomic con2; /* 0x10 */ 1623e7578cSPurna Chandra Mandal struct pic32_reg_atomic txst; /* 0x20 */ 1723e7578cSPurna Chandra Mandal struct pic32_reg_atomic rxst; /* 0x30 */ 1823e7578cSPurna Chandra Mandal struct pic32_reg_atomic ht0; /* 0x40 */ 1923e7578cSPurna Chandra Mandal struct pic32_reg_atomic ht1; /* 0x50 */ 2023e7578cSPurna Chandra Mandal struct pic32_reg_atomic pmm0; /* 0x60 */ 2123e7578cSPurna Chandra Mandal struct pic32_reg_atomic pmm1; /* 0x70 */ 2223e7578cSPurna Chandra Mandal struct pic32_reg_atomic pmcs; /* 0x80 */ 2323e7578cSPurna Chandra Mandal struct pic32_reg_atomic pmo; /* 0x90 */ 2423e7578cSPurna Chandra Mandal struct pic32_reg_atomic rxfc; /* 0xa0 */ 2523e7578cSPurna Chandra Mandal struct pic32_reg_atomic rxwm; /* 0xb0 */ 2623e7578cSPurna Chandra Mandal struct pic32_reg_atomic ien; /* 0xc0 */ 2723e7578cSPurna Chandra Mandal struct pic32_reg_atomic irq; /* 0xd0 */ 2823e7578cSPurna Chandra Mandal struct pic32_reg_atomic stat; /* 0xe0 */ 2923e7578cSPurna Chandra Mandal }; 3023e7578cSPurna Chandra Mandal 3123e7578cSPurna Chandra Mandal struct pic32_mii_regs { 3223e7578cSPurna Chandra Mandal struct pic32_reg_atomic mcfg; /* 0x280 */ 3323e7578cSPurna Chandra Mandal struct pic32_reg_atomic mcmd; /* 0x290 */ 3423e7578cSPurna Chandra Mandal struct pic32_reg_atomic madr; /* 0x2a0 */ 3523e7578cSPurna Chandra Mandal struct pic32_reg_atomic mwtd; /* 0x2b0 */ 3623e7578cSPurna Chandra Mandal struct pic32_reg_atomic mrdd; /* 0x2c0 */ 3723e7578cSPurna Chandra Mandal struct pic32_reg_atomic mind; /* 0x2d0 */ 3823e7578cSPurna Chandra Mandal }; 3923e7578cSPurna Chandra Mandal 4023e7578cSPurna Chandra Mandal struct pic32_emac_regs { 4123e7578cSPurna Chandra Mandal struct pic32_reg_atomic cfg1; /* 0x200*/ 4223e7578cSPurna Chandra Mandal struct pic32_reg_atomic cfg2; /* 0x210*/ 4323e7578cSPurna Chandra Mandal struct pic32_reg_atomic ipgt; /* 0x220*/ 4423e7578cSPurna Chandra Mandal struct pic32_reg_atomic ipgr; /* 0x230*/ 4523e7578cSPurna Chandra Mandal struct pic32_reg_atomic clrt; /* 0x240*/ 4623e7578cSPurna Chandra Mandal struct pic32_reg_atomic maxf; /* 0x250*/ 4723e7578cSPurna Chandra Mandal struct pic32_reg_atomic supp; /* 0x260*/ 4823e7578cSPurna Chandra Mandal struct pic32_reg_atomic test; /* 0x270*/ 4923e7578cSPurna Chandra Mandal struct pic32_mii_regs mii; /* 0x280 - 0x2d0 */ 5023e7578cSPurna Chandra Mandal struct pic32_reg_atomic res1; /* 0x2e0 */ 5123e7578cSPurna Chandra Mandal struct pic32_reg_atomic res2; /* 0x2f0 */ 5223e7578cSPurna Chandra Mandal struct pic32_reg_atomic sa0; /* 0x300 */ 5323e7578cSPurna Chandra Mandal struct pic32_reg_atomic sa1; /* 0x310 */ 5423e7578cSPurna Chandra Mandal struct pic32_reg_atomic sa2; /* 0x320 */ 5523e7578cSPurna Chandra Mandal }; 5623e7578cSPurna Chandra Mandal 5723e7578cSPurna Chandra Mandal /* ETHCON1 Reg field */ 5823e7578cSPurna Chandra Mandal #define ETHCON_BUFCDEC BIT(0) 5923e7578cSPurna Chandra Mandal #define ETHCON_RXEN BIT(8) 6023e7578cSPurna Chandra Mandal #define ETHCON_TXRTS BIT(9) 6123e7578cSPurna Chandra Mandal #define ETHCON_ON BIT(15) 6223e7578cSPurna Chandra Mandal 6323e7578cSPurna Chandra Mandal /* ETHCON2 Reg field */ 6423e7578cSPurna Chandra Mandal #define ETHCON_RXBUFSZ 0x7f 6523e7578cSPurna Chandra Mandal #define ETHCON_RXBUFSZ_SHFT 0x4 6623e7578cSPurna Chandra Mandal 6723e7578cSPurna Chandra Mandal /* ETHSTAT Reg field */ 6823e7578cSPurna Chandra Mandal #define ETHSTAT_BUSY BIT(7) 6923e7578cSPurna Chandra Mandal #define ETHSTAT_BUFCNT 0x00ff0000 7023e7578cSPurna Chandra Mandal 7123e7578cSPurna Chandra Mandal /* ETHRXFC Register fields */ 7223e7578cSPurna Chandra Mandal #define ETHRXFC_BCEN BIT(0) 7323e7578cSPurna Chandra Mandal #define ETHRXFC_MCEN BIT(1) 7423e7578cSPurna Chandra Mandal #define ETHRXFC_UCEN BIT(3) 7523e7578cSPurna Chandra Mandal #define ETHRXFC_RUNTEN BIT(4) 7623e7578cSPurna Chandra Mandal #define ETHRXFC_CRCOKEN BIT(5) 7723e7578cSPurna Chandra Mandal 7823e7578cSPurna Chandra Mandal /* EMAC1CFG1 register offset */ 7923e7578cSPurna Chandra Mandal #define PIC32_EMAC1CFG1 0x0200 8023e7578cSPurna Chandra Mandal 8123e7578cSPurna Chandra Mandal /* EMAC1CFG1 register fields */ 8223e7578cSPurna Chandra Mandal #define EMAC_RXENABLE BIT(0) 8323e7578cSPurna Chandra Mandal #define EMAC_RXPAUSE BIT(2) 8423e7578cSPurna Chandra Mandal #define EMAC_TXPAUSE BIT(3) 8523e7578cSPurna Chandra Mandal #define EMAC_SOFTRESET BIT(15) 8623e7578cSPurna Chandra Mandal 8723e7578cSPurna Chandra Mandal /* EMAC1CFG2 register fields */ 8823e7578cSPurna Chandra Mandal #define EMAC_FULLDUP BIT(0) 8923e7578cSPurna Chandra Mandal #define EMAC_LENGTHCK BIT(1) 9023e7578cSPurna Chandra Mandal #define EMAC_CRCENABLE BIT(4) 9123e7578cSPurna Chandra Mandal #define EMAC_PADENABLE BIT(5) 9223e7578cSPurna Chandra Mandal #define EMAC_AUTOPAD BIT(7) 9323e7578cSPurna Chandra Mandal #define EMAC_EXCESS BIT(14) 9423e7578cSPurna Chandra Mandal 9523e7578cSPurna Chandra Mandal /* EMAC1IPGT register magic */ 9623e7578cSPurna Chandra Mandal #define FULLDUP_GAP_TIME 0x15 9723e7578cSPurna Chandra Mandal #define HALFDUP_GAP_TIME 0x12 9823e7578cSPurna Chandra Mandal 9923e7578cSPurna Chandra Mandal /* EMAC1SUPP register fields */ 10023e7578cSPurna Chandra Mandal #define EMAC_RMII_SPD100 BIT(8) 10123e7578cSPurna Chandra Mandal #define EMAC_RMII_RESET BIT(11) 10223e7578cSPurna Chandra Mandal 10323e7578cSPurna Chandra Mandal /* MII Management Configuration Register */ 10423e7578cSPurna Chandra Mandal #define MIIMCFG_RSTMGMT BIT(15) 10523e7578cSPurna Chandra Mandal #define MIIMCFG_CLKSEL_DIV40 0x0020 /* 100Mhz / 40 */ 10623e7578cSPurna Chandra Mandal 10723e7578cSPurna Chandra Mandal /* MII Management Command Register */ 10823e7578cSPurna Chandra Mandal #define MIIMCMD_READ BIT(0) 10923e7578cSPurna Chandra Mandal #define MIIMCMD_SCAN BIT(1) 11023e7578cSPurna Chandra Mandal 11123e7578cSPurna Chandra Mandal /* MII Management Address Register */ 11223e7578cSPurna Chandra Mandal #define MIIMADD_REGADDR 0x1f 11323e7578cSPurna Chandra Mandal #define MIIMADD_REGADDR_SHIFT 0 11423e7578cSPurna Chandra Mandal #define MIIMADD_PHYADDR_SHIFT 8 11523e7578cSPurna Chandra Mandal 11623e7578cSPurna Chandra Mandal /* MII Management Indicator Register */ 11723e7578cSPurna Chandra Mandal #define MIIMIND_BUSY BIT(0) 11823e7578cSPurna Chandra Mandal #define MIIMIND_NOTVALID BIT(2) 11923e7578cSPurna Chandra Mandal #define MIIMIND_LINKFAIL BIT(3) 12023e7578cSPurna Chandra Mandal 12123e7578cSPurna Chandra Mandal /* Packet Descriptor */ 12223e7578cSPurna Chandra Mandal /* Received Packet Status */ 12323e7578cSPurna Chandra Mandal #define _RSV1_PKT_CSUM 0xffff 12423e7578cSPurna Chandra Mandal #define _RSV2_CRC_ERR BIT(20) 12523e7578cSPurna Chandra Mandal #define _RSV2_LEN_ERR BIT(21) 12623e7578cSPurna Chandra Mandal #define _RSV2_RX_OK BIT(23) 12723e7578cSPurna Chandra Mandal #define _RSV2_RX_COUNT 0xffff 12823e7578cSPurna Chandra Mandal 12923e7578cSPurna Chandra Mandal #define RSV_RX_CSUM(__rsv1) ((__rsv1) & _RSV1_PKT_CSUM) 13023e7578cSPurna Chandra Mandal #define RSV_RX_COUNT(__rsv2) ((__rsv2) & _RSV2_RX_COUNT) 13123e7578cSPurna Chandra Mandal #define RSV_RX_OK(__rsv2) ((__rsv2) & _RSV2_RX_OK) 13223e7578cSPurna Chandra Mandal #define RSV_CRC_ERR(__rsv2) ((__rsv2) & _RSV2_CRC_ERR) 13323e7578cSPurna Chandra Mandal 13423e7578cSPurna Chandra Mandal /* Ethernet Hardware Descriptor Header bits */ 13523e7578cSPurna Chandra Mandal #define EDH_EOWN BIT(7) 13623e7578cSPurna Chandra Mandal #define EDH_NPV BIT(8) 13723e7578cSPurna Chandra Mandal #define EDH_STICKY BIT(9) 13823e7578cSPurna Chandra Mandal #define _EDH_BCOUNT 0x07ff0000 13923e7578cSPurna Chandra Mandal #define EDH_EOP BIT(30) 14023e7578cSPurna Chandra Mandal #define EDH_SOP BIT(31) 14123e7578cSPurna Chandra Mandal #define EDH_BCOUNT_SHIFT 16 14223e7578cSPurna Chandra Mandal #define EDH_BCOUNT(len) ((len) << EDH_BCOUNT_SHIFT) 14323e7578cSPurna Chandra Mandal 14423e7578cSPurna Chandra Mandal /* Ethernet Hardware Descriptors 14523e7578cSPurna Chandra Mandal * ref: PIC32 Family Reference Manual Table 35-7 14623e7578cSPurna Chandra Mandal * This structure represents the layout of the DMA 14723e7578cSPurna Chandra Mandal * memory shared between the CPU and the Ethernet 14823e7578cSPurna Chandra Mandal * controller. 14923e7578cSPurna Chandra Mandal */ 15023e7578cSPurna Chandra Mandal /* TX/RX DMA descriptor */ 15123e7578cSPurna Chandra Mandal struct eth_dma_desc { 15223e7578cSPurna Chandra Mandal u32 hdr; /* header */ 15323e7578cSPurna Chandra Mandal u32 data_buff; /* data buffer address */ 15423e7578cSPurna Chandra Mandal u32 stat1; /* transmit/receive packet status */ 15523e7578cSPurna Chandra Mandal u32 stat2; /* transmit/receive packet status */ 15623e7578cSPurna Chandra Mandal u32 next_ed; /* next descriptor */ 15723e7578cSPurna Chandra Mandal }; 15823e7578cSPurna Chandra Mandal 15923e7578cSPurna Chandra Mandal #define PIC32_MDIO_NAME "PIC32_EMAC" 16023e7578cSPurna Chandra Mandal 16123e7578cSPurna Chandra Mandal int pic32_mdio_init(const char *name, ulong ioaddr); 16223e7578cSPurna Chandra Mandal 16323e7578cSPurna Chandra Mandal #endif /* __MICROCHIP_PIC32_ETH_H_*/ 164