| /* |
| * Copyright (c) 2013 Qualcomm Atheros, Inc. |
| * |
| * See file CREDITS for list of people who contributed to this |
| * project. |
| * |
| * This program is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU General Public License as |
| * published by the Free Software Foundation; either version 2 of |
| * the License, or (at your option) any later version. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program; if not, write to the Free Software |
| * Foundation, Inc., 59 Temple Place, Suite 330, Boston, |
| * MA 02111-1307 USA |
| */ |
| |
| #include <common.h> |
| #include <command.h> |
| |
| #if (CONFIG_COMMANDS & CFG_CMD_ETHREG) |
| |
| /*----------------------------------------------------------------------- |
| * Definitions |
| */ |
| #ifdef CONFIG_ATHRS26E_PHY |
| extern unsigned int s26e_rd_phy(unsigned int phy_addr, unsigned int reg_addr); |
| extern void s26e_wr_phy(unsigned int phy_addr, unsigned int reg_addr, unsigned int write_data); |
| extern uint32_t athrs26e_reg_read(uint32_t reg_addr); |
| extern void athrs26e_reg_write(uint32_t reg_addr, uint32_t reg_val); |
| #endif |
| |
| #ifdef CFG_ATHRS26_PHY |
| extern unsigned int s26_rd_phy(unsigned int phy_addr, unsigned int reg_addr); |
| extern void s26_wr_phy(unsigned int phy_addr, unsigned int reg_addr, unsigned int write_data); |
| extern uint32_t athrs26_reg_read(uint32_t reg_addr); |
| extern void athrs26_reg_write(uint32_t reg_addr, uint32_t reg_val); |
| #endif |
| |
| #ifdef CFG_ATHRS27_PHY |
| extern unsigned int s27_rd_phy(unsigned int phy_addr, unsigned int reg_addr); |
| extern void s27_wr_phy(unsigned int phy_addr, unsigned int reg_addr, unsigned int write_data); |
| extern uint32_t athrs27_reg_read(uint32_t reg_addr); |
| extern void athrs27_reg_write(uint32_t reg_addr, uint32_t reg_val); |
| #endif |
| |
| #ifdef CONFIG_AR7242_S16_PHY |
| extern uint32_t athrs16_reg_read(uint32_t reg_addr); |
| extern void athrs16_reg_write(uint32_t reg_addr, uint32_t reg_val); |
| extern int ag7240_miiphy_read(char *devname, uint32_t phaddr, |
| uint8_t reg); |
| extern int ag7240_miiphy_write(char *devname, uint32_t phaddr, |
| uint8_t reg, uint16_t data); |
| #endif |
| |
| #ifdef CONFIG_ATHRS17_PHY |
| extern uint32_t athrs17_reg_read(uint32_t reg_addr); |
| extern void athrs17_reg_write(uint32_t reg_addr, uint32_t reg_val); |
| extern unsigned int s17_rd_phy(unsigned int phy_addr, unsigned int reg_addr); |
| extern void s17_wr_phy(unsigned int phy_addr, unsigned int reg_addr, unsigned int write_data); |
| #endif |
| |
| |
| #define READ_MAC 0x01 |
| #define WRITE_MAC 0x02 |
| #define READ_PHY 0x10 |
| #define WRITE_PHY 0x20 |
| |
| /* |
| * Values from last command. |
| */ |
| static int reg; |
| static int val,rd_value; |
| static int phyaddr; |
| static int portnum; |
| |
| int do_ethreg (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) |
| { |
| int rcode = 0; |
| |
| /* |
| * We use the last specified parameters, unless new ones are |
| * entered. |
| */ |
| |
| if ((flag & CMD_FLAG_REPEAT) == 0) |
| { |
| if (argc == 2) { |
| reg = simple_strtoul(argv[1], NULL, 10); |
| rcode = READ_MAC; |
| } |
| if (argc == 3) { |
| reg = simple_strtoul(argv[1], NULL, 10); |
| val = simple_strtoul(argv[2],NULL,10); |
| rcode = WRITE_MAC; |
| } |
| if (argc == 4) { |
| if(*argv[1] == 'p') { |
| portnum = simple_strtoul(argv[2], NULL, 10); |
| reg = simple_strtoul(argv[3],NULL,10); |
| rcode = READ_PHY; |
| } |
| else |
| return 1; |
| } |
| if (argc == 5) { |
| if(*argv[1] == 'p') { |
| portnum = simple_strtoul(argv[2], NULL, 10); |
| reg = simple_strtoul(argv[3],NULL,10); |
| val = simple_strtoul(argv[4],NULL,10); |
| rcode = WRITE_PHY; |
| } |
| else |
| return 1; |
| } |
| |
| if ((argc > 4) && (argc < 2)) |
| return 1; |
| } |
| #ifdef CONFIG_AR7242_S16_PHY |
| if(rcode == READ_PHY) { |
| rd_value = ag7240_miiphy_read("eth0",portnum,reg); |
| printf("Read Reg: 0x%08x = 0x%08x\n",reg,rd_value); |
| } |
| else if(rcode == READ_MAC) { |
| rd_value = athrs16_reg_read(reg); |
| printf("Read Reg: 0x%08x = 0x%08x\n",reg,rd_value); |
| } |
| else if(rcode == WRITE_PHY) { |
| rd_value = ag7240_miiphy_read("eth0",portnum,reg); |
| ag7240_miiphy_write("eth0",portnum,reg,val); |
| printf("Write Reg: 0x%08x: Oldval = 0x%08x Newval = 0x%08x\n", reg, rd_value, val); |
| } |
| else if(rcode == WRITE_MAC) { |
| rd_value = athrs16_reg_read(reg); |
| athrs16_reg_write(reg,val); |
| printf("Write Reg: 0x%08x: Oldval = 0x%08x Newval = 0x%08x\n", reg, rd_value, val); |
| } |
| else |
| return 1; |
| #endif |
| #ifdef CFG_ATHRS26_PHY |
| if(rcode == READ_PHY) { |
| rd_value = s26_rd_phy(portnum,reg); |
| printf("Read Reg: 0x%08x = 0x%08x\n",reg,rd_value); |
| } |
| else if(rcode == READ_MAC) { |
| rd_value = athrs26_reg_read(reg); |
| printf("Read Reg: 0x%08x = 0x%08x\n",reg,rd_value); |
| } |
| else if(rcode == WRITE_PHY) { |
| rd_value = s26_rd_phy(portnum,reg); |
| s26_wr_phy(portnum,reg,val); |
| printf("Write Reg: 0x%08x: Oldval = 0x%08x Newval = 0x%08x\n", reg, rd_value, val); |
| } |
| else if(rcode == WRITE_MAC) { |
| rd_value = athrs26_reg_read(reg); |
| athrs26_reg_write(reg,val); |
| printf("Write Reg: 0x%08x: Oldval = 0x%08x Newval = 0x%08x\n", reg, rd_value, val); |
| } |
| else |
| return 1; |
| #endif |
| #ifdef CFG_ATHRS27_PHY |
| if(rcode == READ_PHY) { |
| rd_value = s27_rd_phy(portnum,reg); |
| printf("Read Reg: 0x%08x = 0x%08x\n",reg,rd_value); |
| } |
| else if(rcode == READ_MAC) { |
| rd_value = athrs27_reg_read(reg); |
| printf("Read Reg: 0x%08x = 0x%08x\n",reg,rd_value); |
| } |
| else if(rcode == WRITE_PHY) { |
| rd_value = s27_rd_phy(portnum,reg); |
| s27_wr_phy(portnum,reg,val); |
| printf("Write Reg: 0x%08x: Oldval = 0x%08x Newval = 0x%08x\n", reg, rd_value, val); |
| } |
| else if(rcode == WRITE_MAC) { |
| rd_value = athrs27_reg_read(reg); |
| athrs27_reg_write(reg,val); |
| printf("Write Reg: 0x%08x: Oldval = 0x%08x Newval = 0x%08x\n", reg, rd_value, val); |
| } |
| else |
| return 1; |
| #endif |
| |
| #ifdef CONFIG_F1E_PHY |
| if(rcode == READ_PHY) { |
| rd_value = f1e_rd_phy(portnum, reg); |
| printf("Read Reg: 0x%08x = 0x%08x\n",reg,rd_value); |
| } |
| else if(rcode == WRITE_PHY) { |
| rd_value = f1e_rd_phy(portnum, reg); |
| f1e_wr_phy(portnum, reg, val); |
| printf("Write Reg: 0x%08x: Oldval = 0x%08x Newval = 0x%08x\n", reg, rd_value, val); |
| } |
| else |
| return 1; |
| #endif |
| |
| #ifdef CONFIG_ATHRS17_PHY |
| if(rcode == READ_PHY) { |
| rd_value = s17_rd_phy(portnum,reg); |
| printf("Read Reg: 0x%08x = 0x%08x\n",reg,rd_value); |
| } |
| else if(rcode == READ_MAC) { |
| rd_value = athrs17_reg_read(reg); |
| printf("Read Reg: 0x%08x = 0x%08x\n",reg,rd_value); |
| } |
| else if(rcode == WRITE_PHY) { |
| rd_value = s17_rd_phy(portnum,reg); |
| s17_wr_phy(portnum,reg,val); |
| printf("Write Reg: 0x%08x: Oldval = 0x%08x Newval = 0x%08x\n", reg, rd_value, val); |
| } |
| else if(rcode == WRITE_MAC) { |
| rd_value = athrs17_reg_read(reg); |
| athrs17_reg_write(reg,val); |
| printf("Write Reg: 0x%08x: Oldval = 0x%08x Newval = 0x%08x\n", reg, rd_value, val); |
| } |
| else |
| return 1; |
| #endif |
| |
| #ifdef CONFIG_ATHRS26E_PHY |
| if(rcode == READ_PHY) { |
| rd_value = s26e_rd_phy(portnum,reg); |
| printf("Read Reg: 0x%08x = 0x%08x\n",reg,rd_value); |
| } |
| else if(rcode == READ_MAC) { |
| rd_value = athrs26e_reg_read(reg); |
| printf("Read Reg: 0x%08x = 0x%08x\n",reg,rd_value); |
| } |
| else if(rcode == WRITE_PHY) { |
| rd_value = s26e_rd_phy(portnum,reg); |
| s26e_wr_phy(portnum,reg,val); |
| printf("Write Reg: 0x%08x: Oldval = 0x%08x Newval = 0x%08x\n", reg, rd_value, val); |
| } |
| else if(rcode == WRITE_MAC) { |
| rd_value = athrs26e_reg_read(reg); |
| athrs26e_reg_write(reg,val); |
| printf("Write Reg: 0x%08x: Oldval = 0x%08x Newval = 0x%08x\n", reg, rd_value, val); |
| } |
| else |
| return 1; |
| #endif |
| return 0; |
| } |
| |
| /***************************************************/ |
| |
| U_BOOT_CMD( |
| ethreg, 6, 1, do_ethreg, |
| "ethreg - Switch/PHY Reg rd/wr utility\n", |
| "<p> <phyaddr> <reg> <value> - Send <bit_len> bits from <dout> out the SPI\n" |
| "<p> - operates on the phy; by default is rd/wr s26 mac registers\n" |
| "<phyaddr> - Address of the phy\n" |
| "<reg> - Register offset\n" |
| "<value> - value to write\n" |
| ); |
| |
| #endif /* CONFIG_COMMANDS & CFG_CMD_ETHREG */ |