Merge branch 'master' of git://git.denx.de/u-boot-net
authorWolfgang Denk <wd@denx.de>
Tue, 9 Dec 2008 00:00:24 +0000 (01:00 +0100)
committerWolfgang Denk <wd@denx.de>
Tue, 9 Dec 2008 00:00:24 +0000 (01:00 +0100)
common/cmd_net.c
drivers/net/tsec.c
include/net.h
include/tsec.h
net/net.c
net/tftp.c

index af691a474f652fa862b28b08802e5f57c2bdf0a8..c053d7b97a7c169962496a95a9b753bf2d36aeac 100644 (file)
@@ -154,8 +154,10 @@ static int
 netboot_common (proto_t proto, cmd_tbl_t *cmdtp, int argc, char *argv[])
 {
        char *s;
+       char *end;
        int   rcode = 0;
        int   size;
+       ulong addr;
 
        /* pre-set load_addr */
        if ((s = getenv("loadaddr")) != NULL) {
@@ -166,15 +168,17 @@ netboot_common (proto_t proto, cmd_tbl_t *cmdtp, int argc, char *argv[])
        case 1:
                break;
 
-       case 2: /* only one arg - accept two forms:
-                * just load address, or just boot file name.
-                * The latter form must be written "filename" here.
+       case 2: /*
+                * Only one arg - accept two forms:
+                * Just load address, or just boot file name. The latter
+                * form must be written in a format which can not be
+                * mis-interpreted as a valid number.
                 */
-               if (argv[1][0] == '"') {        /* just boot filename */
-                       copy_filename (BootFile, argv[1], sizeof(BootFile));
-               } else {                        /* load address */
-                       load_addr = simple_strtoul(argv[1], NULL, 16);
-               }
+               addr = simple_strtoul(argv[1], &end, 16);
+               if (end == (argv[1] + strlen(argv[1])))
+                       load_addr = addr;
+               else
+                       copy_filename(BootFile, argv[1], sizeof(BootFile));
                break;
 
        case 3: load_addr = simple_strtoul(argv[1], NULL, 16);
index d7da0819d10bd07f2e5913618393888de03193e2..fbc9a6dd05b4a3178b80168cf316c173f866ee85 100644 (file)
@@ -1196,6 +1196,9 @@ struct phy_info phy_info_M88E1121R = {
                           {MIIM_88E1121_PHY_LED_CTRL, miim_read,
                            &mii_88E1121_set_led},
                           {MIIM_CONTROL, MIIM_CONTROL_INIT, &mii_cr_init},
+                          /* Disable IRQs and de-assert interrupt */
+                          {MIIM_88E1121_PHY_IRQ_EN, 0, NULL},
+                          {MIIM_88E1121_PHY_IRQ_STATUS, miim_read, NULL},
                           {miim_end,}
                           },
        (struct phy_cmd[]){     /* startup */
index a5a256bcd083b82780ea52570d09b893a2af74f2..d2d394f0da80d0788e92dce97f740c9fe0679443 100644 (file)
@@ -200,6 +200,12 @@ typedef struct {
        ushort          udp_xsum;       /* Checksum                     */
 } IP_t;
 
+#define IP_OFFS                0x1fff /* ip offset *= 8 */
+#define IP_FLAGS       0xe000 /* first 3 bits */
+#define IP_FLAGS_RES   0x8000 /* reserved */
+#define IP_FLAGS_DFRAG 0x4000 /* don't fragments */
+#define IP_FLAGS_MFRAG 0x2000 /* more fragments */
+
 #define IP_HDR_SIZE_NO_UDP     (sizeof (IP_t) - 8)
 #define IP_HDR_SIZE            (sizeof (IP_t))
 
index d2951f6d33bf396d7a2850267fbb65e0ad73ebad..7b52e06ab003acd935c8062180583337afbd13b6 100644 (file)
 #define MIIM_88E1121_PHY_LED_PAGE      3
 #define MIIM_88E1121_PHY_LED_DEF       0x0030
 
+/* 88E1121 PHY IRQ Enable/Status Register */
+#define MIIM_88E1121_PHY_IRQ_EN                18
+#define MIIM_88E1121_PHY_IRQ_STATUS    19
+
 #define MIIM_88E1121_PHY_PAGE          22
 
 /* 88E1145 Extended PHY Specific Control Register */
index e9754e47b8fb6db54642673c3342fa4f28878879..e6547f9eddc860838e245483277c8d12b59ef87a 100644 (file)
--- a/net/net.c
+++ b/net/net.c
@@ -738,7 +738,7 @@ int PingSend(void)
        ip->ip_tos   = 0;
        ip->ip_len   = htons(IP_HDR_SIZE_NO_UDP + 8);
        ip->ip_id    = htons(NetIPID++);
-       ip->ip_off   = htons(0x4000);   /* No fragmentation */
+       ip->ip_off   = htons(IP_FLAGS_DFRAG);   /* Don't fragment */
        ip->ip_ttl   = 255;
        ip->ip_p     = 0x01;            /* ICMP */
        ip->ip_sum   = 0;
@@ -1402,7 +1402,8 @@ NetReceive(volatile uchar * inpkt, int len)
                if ((ip->ip_hl_v & 0xf0) != 0x40) {
                        return;
                }
-               if (ip->ip_off & htons(0x1fff)) { /* Can't deal w/ fragments */
+               /* Can't deal with fragments */
+               if (ip->ip_off & htons(IP_OFFS | IP_FLAGS_MFRAG)) {
                        return;
                }
                /* can't deal with headers > 20 bytes */
@@ -1701,7 +1702,7 @@ NetSetIP(volatile uchar * xip, IPaddr_t dest, int dport, int sport, int len)
        ip->ip_tos   = 0;
        ip->ip_len   = htons(IP_HDR_SIZE + len);
        ip->ip_id    = htons(NetIPID++);
-       ip->ip_off   = htons(0x4000);   /* No fragmentation */
+       ip->ip_off   = htons(IP_FLAGS_DFRAG);   /* Don't fragment */
        ip->ip_ttl   = 255;
        ip->ip_p     = 17;              /* UDP */
        ip->ip_sum   = 0;
index ce6ea3d9f5ae126678f7e61192ef83aa13a74bb2..3dac3d8531b0580156fc6ec938f8c4eae9257e1f 100644 (file)
@@ -499,9 +499,8 @@ TftpStart (void)
                        strncpy(tftp_filename, BootFile, MAX_LEN);
                        tftp_filename[MAX_LEN-1] = 0;
                } else {
-                       *p++ = '\0';
                        TftpServerIP = string_to_ip (BootFile);
-                       strncpy(tftp_filename, p, MAX_LEN);
+                       strncpy(tftp_filename, p + 1, MAX_LEN);
                        tftp_filename[MAX_LEN-1] = 0;
                }
        }