Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / u-boot / board / mpl / vcma9 / cmd_vcma9.c
1 /*
2  * (C) Copyright 2002
3  * Denis Peter, MPL AG Switzerland, d.peter@mpl.ch
4  *
5  * adapted for VCMA9
6  * David Mueller, ELSOFT AG, d.mueller@elsoft.ch
7  *
8  * SPDX-License-Identifier:     GPL-2.0+
9  */
10
11 #include <common.h>
12 #include <command.h>
13 #include <net.h>
14 #include "vcma9.h"
15 #include "../common/common_util.h"
16
17 #if defined(CONFIG_CS8900)
18 #include <../drivers/net/cs8900.h>
19
20 static uchar cs8900_chksum(ushort data)
21 {
22         return((data >> 8) & 0x00FF) + (data & 0x00FF);
23 }
24
25 #endif
26
27 DECLARE_GLOBAL_DATA_PTR;
28
29 /* ------------------------------------------------------------------------- */
30
31 int do_vcma9(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
32 {
33         struct eth_device *dev;
34         char cs8900_name[10];
35         if (strcmp(argv[1], "info") == 0)
36         {
37                 vcma9_print_info();
38                 return 0;
39         }
40 #if defined(CONFIG_CS8900)
41         if (strcmp(argv[1], "cs8900") == 0) {
42                 sprintf(cs8900_name, "%s-0", CS8900_DRIVERNAME);
43                 dev = eth_get_dev_by_name(cs8900_name);
44                 if (!dev) {
45                         printf("Couldn't find CS8900 driver");
46                         return 0;
47                 }
48                 if (strcmp(argv[2], "read") == 0) {
49                         uchar addr; ushort data;
50
51                         addr = simple_strtoul(argv[3], NULL, 16);
52                         cs8900_e2prom_read(dev, addr, &data);
53                         printf("0x%2.2X: 0x%4.4X\n", addr, data);
54                 } else if (strcmp(argv[2], "write") == 0) {
55                         uchar addr; ushort data;
56
57                         addr = simple_strtoul(argv[3], NULL, 16);
58                         data = simple_strtoul(argv[4], NULL, 16);
59                         cs8900_e2prom_write(dev, addr, data);
60                 } else if (strcmp(argv[2], "setaddr") == 0) {
61                         uchar addr, i, csum; ushort data;
62                         uchar ethaddr[6];
63
64                         /* check for valid ethaddr */
65                         if (eth_getenv_enetaddr("ethaddr", ethaddr)) {
66                                 addr = 1;
67                                 data = 0x2158;
68                                 cs8900_e2prom_write(dev, addr, data);
69                                 csum = cs8900_chksum(data);
70                                 addr++;
71                                 for (i = 0; i < 6; i+=2) {
72                                         data = ethaddr[i+1] << 8 |
73                                                ethaddr[i];
74                                         cs8900_e2prom_write(dev, addr, data);
75                                         csum += cs8900_chksum(data);
76                                         addr++;
77                                 }
78                                 /* calculate header link byte */
79                                 data = 0xA100 | (addr * 2);
80                                 cs8900_e2prom_write(dev, 0, data);
81                                 csum += cs8900_chksum(data);
82                                 /* write checksum word */
83                                 cs8900_e2prom_write(dev, addr, (0 - csum) << 8);
84                         } else {
85                                 puts("\nplease defined 'ethaddr'\n");
86                         }
87                 } else if (strcmp(argv[2], "dump") == 0) {
88                         uchar addr = 0, endaddr, csum; ushort data;
89
90                         puts("Dump of CS8900 config device: ");
91                         cs8900_e2prom_read(dev, addr, &data);
92                         if ((data & 0xE000) == 0xA000) {
93                                 endaddr = (data & 0x00FF) / 2;
94                                 csum = cs8900_chksum(data);
95                                 for (addr = 1; addr <= endaddr; addr++) {
96                                         cs8900_e2prom_read(dev, addr, &data);
97                                         printf("\n0x%2.2X: 0x%4.4X", addr, data);
98                                         csum += cs8900_chksum(data);
99                                 }
100                                 printf("\nChecksum: %s", (csum == 0) ? "ok" : "wrong");
101                         } else {
102                                 puts("no valid config found");
103                         }
104                         puts("\n");
105                 }
106
107                 return 0;
108         }
109 #endif
110
111         return (do_mplcommon(cmdtp, flag, argc, argv));
112 }
113
114 U_BOOT_CMD(
115         vcma9, 6, 1, do_vcma9,
116         "VCMA9 specific commands",
117         "flash mem [SrcAddr] - updates U-Boot with image in memory\n"
118         "vcma9 info                - displays board information"
119 );