mirror of
https://github.com/Stichting-MINIX-Research-Foundation/u-boot.git
synced 2025-09-10 04:26:19 -04:00
Merge branch 'master' of git://git.denx.de/u-boot-net
This commit is contained in:
commit
cec2655c3b
2
Makefile
2
Makefile
@ -238,7 +238,7 @@ ifdef SOC
|
|||||||
LIBS-y += $(CPUDIR)/$(SOC)/lib$(SOC).o
|
LIBS-y += $(CPUDIR)/$(SOC)/lib$(SOC).o
|
||||||
endif
|
endif
|
||||||
ifeq ($(CPU),ixp)
|
ifeq ($(CPU),ixp)
|
||||||
LIBS-y += arch/arm/cpu/ixp/npe/libnpe.o
|
LIBS-y += drivers/net/npe/libnpe.o
|
||||||
endif
|
endif
|
||||||
LIBS-$(CONFIG_OF_EMBED) += dts/libdts.o
|
LIBS-$(CONFIG_OF_EMBED) += dts/libdts.o
|
||||||
LIBS-y += arch/$(ARCH)/lib/lib$(ARCH).o
|
LIBS-y += arch/$(ARCH)/lib/lib$(ARCH).o
|
||||||
|
@ -564,6 +564,13 @@ int do_bootm_subcommand(cmd_tbl_t *cmdtp, int flag, int argc,
|
|||||||
break;
|
break;
|
||||||
case BOOTM_STATE_OS_GO:
|
case BOOTM_STATE_OS_GO:
|
||||||
disable_interrupts();
|
disable_interrupts();
|
||||||
|
#ifdef CONFIG_NETCONSOLE
|
||||||
|
/*
|
||||||
|
* Stop the ethernet stack if NetConsole could have
|
||||||
|
* left it up
|
||||||
|
*/
|
||||||
|
eth_halt();
|
||||||
|
#endif
|
||||||
arch_preboot_os();
|
arch_preboot_os();
|
||||||
boot_fn(BOOTM_STATE_OS_GO, argc, argv, &images);
|
boot_fn(BOOTM_STATE_OS_GO, argc, argv, &images);
|
||||||
break;
|
break;
|
||||||
@ -622,6 +629,11 @@ int do_bootm(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|||||||
*/
|
*/
|
||||||
iflag = disable_interrupts();
|
iflag = disable_interrupts();
|
||||||
|
|
||||||
|
#ifdef CONFIG_NETCONSOLE
|
||||||
|
/* Stop the ethernet stack if NetConsole could have left it up */
|
||||||
|
eth_halt();
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_CMD_USB)
|
#if defined(CONFIG_CMD_USB)
|
||||||
/*
|
/*
|
||||||
* turn off USB to prevent the host controller from writing to the
|
* turn off USB to prevent the host controller from writing to the
|
||||||
@ -1599,6 +1611,11 @@ static int do_bootz(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|||||||
*/
|
*/
|
||||||
disable_interrupts();
|
disable_interrupts();
|
||||||
|
|
||||||
|
#ifdef CONFIG_NETCONSOLE
|
||||||
|
/* Stop the ethernet stack if NetConsole could have left it up */
|
||||||
|
eth_halt();
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_CMD_USB)
|
#if defined(CONFIG_CMD_USB)
|
||||||
/*
|
/*
|
||||||
* turn off USB to prevent the host controller from writing to the
|
* turn off USB to prevent the host controller from writing to the
|
||||||
|
@ -450,6 +450,7 @@ struct pxe_label {
|
|||||||
char *kernel;
|
char *kernel;
|
||||||
char *append;
|
char *append;
|
||||||
char *initrd;
|
char *initrd;
|
||||||
|
char *fdt;
|
||||||
int attempted;
|
int attempted;
|
||||||
int localboot;
|
int localboot;
|
||||||
struct list_head list;
|
struct list_head list;
|
||||||
@ -517,6 +518,9 @@ static void label_destroy(struct pxe_label *label)
|
|||||||
if (label->initrd)
|
if (label->initrd)
|
||||||
free(label->initrd);
|
free(label->initrd);
|
||||||
|
|
||||||
|
if (label->fdt)
|
||||||
|
free(label->fdt);
|
||||||
|
|
||||||
free(label);
|
free(label);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -541,6 +545,9 @@ static void label_print(void *data)
|
|||||||
|
|
||||||
if (label->initrd)
|
if (label->initrd)
|
||||||
printf("\t\tinitrd: %s\n", label->initrd);
|
printf("\t\tinitrd: %s\n", label->initrd);
|
||||||
|
|
||||||
|
if (label->fdt)
|
||||||
|
printf("\tfdt: %s\n", label->fdt);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -628,10 +635,29 @@ static void label_boot(struct pxe_label *label)
|
|||||||
bootm_argv[1] = getenv("kernel_addr_r");
|
bootm_argv[1] = getenv("kernel_addr_r");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* fdt usage is optional. If there is an fdt_addr specified, we will
|
* fdt usage is optional:
|
||||||
* pass it along to bootm, and adjust argc appropriately.
|
* It handles the following scenarios. All scenarios are exclusive
|
||||||
|
*
|
||||||
|
* Scenario 1: If fdt_addr_r specified and "fdt" label is defined in
|
||||||
|
* pxe file, retrieve fdt blob from server. Pass fdt_addr_r to bootm,
|
||||||
|
* and adjust argc appropriately.
|
||||||
|
*
|
||||||
|
* Scenario 2: If there is an fdt_addr specified, pass it along to
|
||||||
|
* bootm, and adjust argc appropriately.
|
||||||
|
*
|
||||||
|
* Scenario 3: fdt blob is not available.
|
||||||
*/
|
*/
|
||||||
bootm_argv[3] = getenv("fdt_addr");
|
bootm_argv[3] = getenv("fdt_addr_r");
|
||||||
|
|
||||||
|
/* if fdt label is defined then get fdt from server */
|
||||||
|
if (bootm_argv[3] && label->fdt) {
|
||||||
|
if (get_relfile_envaddr(label->fdt, "fdt_addr_r") < 0) {
|
||||||
|
printf("Skipping %s for failure retrieving fdt\n",
|
||||||
|
label->name);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
bootm_argv[3] = getenv("fdt_addr");
|
||||||
|
|
||||||
if (bootm_argv[3])
|
if (bootm_argv[3])
|
||||||
bootm_argc = 4;
|
bootm_argc = 4;
|
||||||
@ -658,6 +684,7 @@ enum token_type {
|
|||||||
T_DEFAULT,
|
T_DEFAULT,
|
||||||
T_PROMPT,
|
T_PROMPT,
|
||||||
T_INCLUDE,
|
T_INCLUDE,
|
||||||
|
T_FDT,
|
||||||
T_INVALID
|
T_INVALID
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -685,6 +712,7 @@ static const struct token keywords[] = {
|
|||||||
{"append", T_APPEND},
|
{"append", T_APPEND},
|
||||||
{"initrd", T_INITRD},
|
{"initrd", T_INITRD},
|
||||||
{"include", T_INCLUDE},
|
{"include", T_INCLUDE},
|
||||||
|
{"fdt", T_FDT},
|
||||||
{NULL, T_INVALID}
|
{NULL, T_INVALID}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1074,6 +1102,11 @@ static int parse_label(char **c, struct pxe_menu *cfg)
|
|||||||
err = parse_sliteral(c, &label->initrd);
|
err = parse_sliteral(c, &label->initrd);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case T_FDT:
|
||||||
|
if (!label->fdt)
|
||||||
|
err = parse_sliteral(c, &label->fdt);
|
||||||
|
break;
|
||||||
|
|
||||||
case T_LOCALBOOT:
|
case T_LOCALBOOT:
|
||||||
err = parse_integer(c, &label->localboot);
|
err = parse_integer(c, &label->localboot);
|
||||||
break;
|
break;
|
||||||
|
@ -6,11 +6,16 @@ serial and network input/output devices by adjusting the 'stdin' and
|
|||||||
set either of these variables to "nc". Input and output can be
|
set either of these variables to "nc". Input and output can be
|
||||||
switched independently.
|
switched independently.
|
||||||
|
|
||||||
|
CONFIG_NETCONSOLE_BUFFER_SIZE - Override the default buffer size
|
||||||
|
|
||||||
We use an environment variable 'ncip' to set the IP address and the
|
We use an environment variable 'ncip' to set the IP address and the
|
||||||
port of the destination. The format is <ip_addr>:<port>. If <port> is
|
port of the destination. The format is <ip_addr>:<port>. If <port> is
|
||||||
omitted, the value of 6666 is used. If the env var doesn't exist, the
|
omitted, the value of 6666 is used. If the env var doesn't exist, the
|
||||||
broadcast address and port 6666 are used. If it is set to an IP
|
broadcast address and port 6666 are used. If it is set to an IP
|
||||||
address of 0 (or 0.0.0.0) then no messages are sent to the network.
|
address of 0 (or 0.0.0.0) then no messages are sent to the network.
|
||||||
|
The source / listening port can be configured separately by setting
|
||||||
|
the 'ncinport' environment variable and the destination port can be
|
||||||
|
configured by setting the 'ncoutport' environment variable.
|
||||||
|
|
||||||
For example, if your server IP is 192.168.1.1, you could use:
|
For example, if your server IP is 192.168.1.1, you could use:
|
||||||
|
|
||||||
|
@ -93,8 +93,13 @@ pxe boot
|
|||||||
be passed to the bootm command to boot the kernel. These environment
|
be passed to the bootm command to boot the kernel. These environment
|
||||||
variables are required to be set.
|
variables are required to be set.
|
||||||
|
|
||||||
fdt_addr - the location of a fdt blob. If this is set, it will be passed
|
fdt_addr_r - location in RAM at which 'pxe boot' will store the fdt blob it
|
||||||
to bootm when booting a kernel.
|
retrieves from tftp. The retrieval is possible if 'fdt' label is defined in
|
||||||
|
pxe file and 'fdt_addr_r' is set. If retrieval is possible, 'fdt_addr_r'
|
||||||
|
will be passed to bootm command to boot the kernel.
|
||||||
|
|
||||||
|
fdt_addr - the location of a fdt blob. 'fdt_addr' will be passed to bootm
|
||||||
|
command if it is set and 'fdt_addr_r' is not passed to bootm command.
|
||||||
|
|
||||||
pxe file format
|
pxe file format
|
||||||
===============
|
===============
|
||||||
@ -156,6 +161,11 @@ initrd <path> - if this label is chosen, use tftp to retrieve the initrd
|
|||||||
the initrd_addr_r environment variable, and that address
|
the initrd_addr_r environment variable, and that address
|
||||||
will be passed to bootm.
|
will be passed to bootm.
|
||||||
|
|
||||||
|
fdt <path> - if this label is chosen, use tftp to retrieve the fdt blob
|
||||||
|
at <path>. it will be stored at the address indicated in
|
||||||
|
the fdt_addr_r environment variable, and that address will
|
||||||
|
be passed to bootm.
|
||||||
|
|
||||||
localboot <flag> - Run the command defined by "localcmd" in the environment.
|
localboot <flag> - Run the command defined by "localcmd" in the environment.
|
||||||
<flag> is ignored and is only here to match the syntax of
|
<flag> is ignored and is only here to match the syntax of
|
||||||
PXELINUX config files.
|
PXELINUX config files.
|
||||||
|
@ -80,6 +80,7 @@ COBJS-$(CONFIG_XILINX_AXIEMAC) += xilinx_axi_emac.o
|
|||||||
COBJS-$(CONFIG_XILINX_EMACLITE) += xilinx_emaclite.o
|
COBJS-$(CONFIG_XILINX_EMACLITE) += xilinx_emaclite.o
|
||||||
COBJS-$(CONFIG_XILINX_LL_TEMAC) += xilinx_ll_temac.o xilinx_ll_temac_mdio.o \
|
COBJS-$(CONFIG_XILINX_LL_TEMAC) += xilinx_ll_temac.o xilinx_ll_temac_mdio.o \
|
||||||
xilinx_ll_temac_fifo.o xilinx_ll_temac_sdma.o
|
xilinx_ll_temac_fifo.o xilinx_ll_temac_sdma.o
|
||||||
|
COBJS-$(CONFIG_ZYNQ_GEM) += zynq_gem.o
|
||||||
|
|
||||||
COBJS := $(sort $(COBJS-y))
|
COBJS := $(sort $(COBJS-y))
|
||||||
SRCS := $(COBJS:.o=.c)
|
SRCS := $(COBJS:.o=.c)
|
||||||
|
@ -565,7 +565,7 @@ static int armdfec_send(struct eth_device *dev, void *dataptr, int datasize)
|
|||||||
struct tx_desc *p_txdesc = darmdfec->p_txdesc;
|
struct tx_desc *p_txdesc = darmdfec->p_txdesc;
|
||||||
void *p = (void *)dataptr;
|
void *p = (void *)dataptr;
|
||||||
int retry = PHY_WAIT_ITERATIONS * PHY_WAIT_MICRO_SECONDS;
|
int retry = PHY_WAIT_ITERATIONS * PHY_WAIT_MICRO_SECONDS;
|
||||||
u32 cmd_sts;
|
u32 cmd_sts, temp;
|
||||||
|
|
||||||
/* Copy buffer if it's misaligned */
|
/* Copy buffer if it's misaligned */
|
||||||
if ((u32)dataptr & 0x07) {
|
if ((u32)dataptr & 0x07) {
|
||||||
@ -586,7 +586,8 @@ static int armdfec_send(struct eth_device *dev, void *dataptr, int datasize)
|
|||||||
p_txdesc->byte_cnt = datasize;
|
p_txdesc->byte_cnt = datasize;
|
||||||
|
|
||||||
/* Apply send command using high priority TX queue */
|
/* Apply send command using high priority TX queue */
|
||||||
writel((u32)p_txdesc, ®s->txcdp[TXQ]);
|
temp = (u32)®s->txcdp[TXQ];
|
||||||
|
writel((u32)p_txdesc, temp);
|
||||||
writel(SDMA_CMD_TXDL | SDMA_CMD_TXDH | SDMA_CMD_ERD, ®s->sdma_cmd);
|
writel(SDMA_CMD_TXDL | SDMA_CMD_TXDH | SDMA_CMD_ERD, ®s->sdma_cmd);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -31,9 +31,16 @@
|
|||||||
#include <asm/arch/imx-regs.h>
|
#include <asm/arch/imx-regs.h>
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/errno.h>
|
#include <asm/errno.h>
|
||||||
|
#include <linux/compiler.h>
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Timeout the transfer after 5 mS. This is usually a bit more, since
|
||||||
|
* the code in the tightloops this timeout is used in adds some overhead.
|
||||||
|
*/
|
||||||
|
#define FEC_XFER_TIMEOUT 5000
|
||||||
|
|
||||||
#ifndef CONFIG_MII
|
#ifndef CONFIG_MII
|
||||||
#error "CONFIG_MII has to be defined!"
|
#error "CONFIG_MII has to be defined!"
|
||||||
#endif
|
#endif
|
||||||
@ -249,7 +256,7 @@ static int miiphy_wait_aneg(struct eth_device *dev)
|
|||||||
|
|
||||||
static int fec_rx_task_enable(struct fec_priv *fec)
|
static int fec_rx_task_enable(struct fec_priv *fec)
|
||||||
{
|
{
|
||||||
writel(1 << 24, &fec->eth->r_des_active);
|
writel(FEC_R_DES_ACTIVE_RDAR, &fec->eth->r_des_active);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -260,7 +267,7 @@ static int fec_rx_task_disable(struct fec_priv *fec)
|
|||||||
|
|
||||||
static int fec_tx_task_enable(struct fec_priv *fec)
|
static int fec_tx_task_enable(struct fec_priv *fec)
|
||||||
{
|
{
|
||||||
writel(1 << 24, &fec->eth->x_des_active);
|
writel(FEC_X_DES_ACTIVE_TDAR, &fec->eth->x_des_active);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -694,8 +701,10 @@ static void fec_halt(struct eth_device *dev)
|
|||||||
static int fec_send(struct eth_device *dev, void *packet, int length)
|
static int fec_send(struct eth_device *dev, void *packet, int length)
|
||||||
{
|
{
|
||||||
unsigned int status;
|
unsigned int status;
|
||||||
uint32_t size;
|
uint32_t size, end;
|
||||||
uint32_t addr;
|
uint32_t addr;
|
||||||
|
int timeout = FEC_XFER_TIMEOUT;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This routine transmits one frame. This routine only accepts
|
* This routine transmits one frame. This routine only accepts
|
||||||
@ -721,8 +730,9 @@ static int fec_send(struct eth_device *dev, void *packet, int length)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
addr = (uint32_t)packet;
|
addr = (uint32_t)packet;
|
||||||
size = roundup(length, ARCH_DMA_MINALIGN);
|
end = roundup(addr + length, ARCH_DMA_MINALIGN);
|
||||||
flush_dcache_range(addr, addr + size);
|
addr &= ~(ARCH_DMA_MINALIGN - 1);
|
||||||
|
flush_dcache_range(addr, end);
|
||||||
|
|
||||||
writew(length, &fec->tbd_base[fec->tbd_index].data_length);
|
writew(length, &fec->tbd_base[fec->tbd_index].data_length);
|
||||||
writel(addr, &fec->tbd_base[fec->tbd_index].data_pointer);
|
writel(addr, &fec->tbd_base[fec->tbd_index].data_pointer);
|
||||||
@ -758,22 +768,28 @@ static int fec_send(struct eth_device *dev, void *packet, int length)
|
|||||||
* invalidate data cache to see what's really in RAM. Also, we need
|
* invalidate data cache to see what's really in RAM. Also, we need
|
||||||
* barrier here.
|
* barrier here.
|
||||||
*/
|
*/
|
||||||
invalidate_dcache_range(addr, addr + size);
|
while (--timeout) {
|
||||||
while (readw(&fec->tbd_base[fec->tbd_index].status) & FEC_TBD_READY) {
|
if (!(readl(&fec->eth->x_des_active) & FEC_X_DES_ACTIVE_TDAR))
|
||||||
udelay(1);
|
break;
|
||||||
invalidate_dcache_range(addr, addr + size);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
debug("fec_send: status 0x%x index %d\n",
|
if (!timeout)
|
||||||
|
ret = -EINVAL;
|
||||||
|
|
||||||
|
invalidate_dcache_range(addr, addr + size);
|
||||||
|
if (readw(&fec->tbd_base[fec->tbd_index].status) & FEC_TBD_READY)
|
||||||
|
ret = -EINVAL;
|
||||||
|
|
||||||
|
debug("fec_send: status 0x%x index %d ret %i\n",
|
||||||
readw(&fec->tbd_base[fec->tbd_index].status),
|
readw(&fec->tbd_base[fec->tbd_index].status),
|
||||||
fec->tbd_index);
|
fec->tbd_index, ret);
|
||||||
/* for next transmission use the other buffer */
|
/* for next transmission use the other buffer */
|
||||||
if (fec->tbd_index)
|
if (fec->tbd_index)
|
||||||
fec->tbd_index = 0;
|
fec->tbd_index = 0;
|
||||||
else
|
else
|
||||||
fec->tbd_index = 1;
|
fec->tbd_index = 1;
|
||||||
|
|
||||||
return 0;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -789,9 +805,9 @@ static int fec_recv(struct eth_device *dev)
|
|||||||
int frame_length, len = 0;
|
int frame_length, len = 0;
|
||||||
struct nbuf *frame;
|
struct nbuf *frame;
|
||||||
uint16_t bd_status;
|
uint16_t bd_status;
|
||||||
uint32_t addr, size;
|
uint32_t addr, size, end;
|
||||||
int i;
|
int i;
|
||||||
uchar buff[FEC_MAX_PKT_SIZE];
|
uchar buff[FEC_MAX_PKT_SIZE] __aligned(ARCH_DMA_MINALIGN);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check if any critical events have happened
|
* Check if any critical events have happened
|
||||||
@ -853,8 +869,9 @@ static int fec_recv(struct eth_device *dev)
|
|||||||
* Invalidate data cache over the buffer
|
* Invalidate data cache over the buffer
|
||||||
*/
|
*/
|
||||||
addr = (uint32_t)frame;
|
addr = (uint32_t)frame;
|
||||||
size = roundup(frame_length, ARCH_DMA_MINALIGN);
|
end = roundup(addr + frame_length, ARCH_DMA_MINALIGN);
|
||||||
invalidate_dcache_range(addr, addr + size);
|
addr &= ~(ARCH_DMA_MINALIGN - 1);
|
||||||
|
invalidate_dcache_range(addr, end);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Fill the buffer and pass it to upper layers
|
* Fill the buffer and pass it to upper layers
|
||||||
|
@ -213,6 +213,9 @@ struct ethernet_regs {
|
|||||||
|
|
||||||
#define FEC_X_WMRK_STRFWD 0x00000100
|
#define FEC_X_WMRK_STRFWD 0x00000100
|
||||||
|
|
||||||
|
#define FEC_X_DES_ACTIVE_TDAR 0x01000000
|
||||||
|
#define FEC_R_DES_ACTIVE_RDAR 0x01000000
|
||||||
|
|
||||||
#if defined(CONFIG_MX25) || defined(CONFIG_MX53)
|
#if defined(CONFIG_MX25) || defined(CONFIG_MX53)
|
||||||
/* defines for MIIGSK */
|
/* defines for MIIGSK */
|
||||||
/* RMII frequency control: 0=50MHz, 1=5MHz */
|
/* RMII frequency control: 0=50MHz, 1=5MHz */
|
||||||
|
@ -28,7 +28,11 @@
|
|||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
static char input_buffer[512];
|
#ifndef CONFIG_NETCONSOLE_BUFFER_SIZE
|
||||||
|
#define CONFIG_NETCONSOLE_BUFFER_SIZE 512
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static char input_buffer[CONFIG_NETCONSOLE_BUFFER_SIZE];
|
||||||
static int input_size; /* char count in input buffer */
|
static int input_size; /* char count in input buffer */
|
||||||
static int input_offset; /* offset to valid chars in input buffer */
|
static int input_offset; /* offset to valid chars in input buffer */
|
||||||
static int input_recursion;
|
static int input_recursion;
|
||||||
@ -36,9 +40,15 @@ static int output_recursion;
|
|||||||
static int net_timeout;
|
static int net_timeout;
|
||||||
static uchar nc_ether[6]; /* server enet address */
|
static uchar nc_ether[6]; /* server enet address */
|
||||||
static IPaddr_t nc_ip; /* server ip */
|
static IPaddr_t nc_ip; /* server ip */
|
||||||
static short nc_port; /* source/target port */
|
static short nc_out_port; /* target output port */
|
||||||
|
static short nc_in_port; /* source input port */
|
||||||
static const char *output_packet; /* used by first send udp */
|
static const char *output_packet; /* used by first send udp */
|
||||||
static int output_packet_len;
|
static int output_packet_len;
|
||||||
|
/*
|
||||||
|
* Start with a default last protocol.
|
||||||
|
* We are only interested in NETCONS or not.
|
||||||
|
*/
|
||||||
|
enum proto_t net_loop_last_protocol = BOOTP;
|
||||||
|
|
||||||
static void nc_wait_arp_handler(uchar *pkt, unsigned dest,
|
static void nc_wait_arp_handler(uchar *pkt, unsigned dest,
|
||||||
IPaddr_t sip, unsigned src,
|
IPaddr_t sip, unsigned src,
|
||||||
@ -59,8 +69,69 @@ static void nc_timeout(void)
|
|||||||
net_set_state(NETLOOP_SUCCESS);
|
net_set_state(NETLOOP_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int is_broadcast(IPaddr_t ip)
|
||||||
|
{
|
||||||
|
static IPaddr_t netmask;
|
||||||
|
static IPaddr_t our_ip;
|
||||||
|
static int env_changed_id;
|
||||||
|
int env_id = get_env_id();
|
||||||
|
|
||||||
|
/* update only when the environment has changed */
|
||||||
|
if (env_changed_id != env_id) {
|
||||||
|
netmask = getenv_IPaddr("netmask");
|
||||||
|
our_ip = getenv_IPaddr("ipaddr");
|
||||||
|
|
||||||
|
env_changed_id = env_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (ip == ~0 || /* 255.255.255.255 */
|
||||||
|
((netmask & our_ip) == (netmask & ip) && /* on the same net */
|
||||||
|
(netmask | ip) == ~0)); /* broadcast to our net */
|
||||||
|
}
|
||||||
|
|
||||||
|
static int refresh_settings_from_env(void)
|
||||||
|
{
|
||||||
|
const char *p;
|
||||||
|
static int env_changed_id;
|
||||||
|
int env_id = get_env_id();
|
||||||
|
|
||||||
|
/* update only when the environment has changed */
|
||||||
|
if (env_changed_id != env_id) {
|
||||||
|
if (getenv("ncip")) {
|
||||||
|
nc_ip = getenv_IPaddr("ncip");
|
||||||
|
if (!nc_ip)
|
||||||
|
return -1; /* ncip is 0.0.0.0 */
|
||||||
|
p = strchr(getenv("ncip"), ':');
|
||||||
|
if (p != NULL) {
|
||||||
|
nc_out_port = simple_strtoul(p + 1, NULL, 10);
|
||||||
|
nc_in_port = nc_out_port;
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
nc_ip = ~0; /* ncip is not set, so broadcast */
|
||||||
|
|
||||||
|
p = getenv("ncoutport");
|
||||||
|
if (p != NULL)
|
||||||
|
nc_out_port = simple_strtoul(p, NULL, 10);
|
||||||
|
p = getenv("ncinport");
|
||||||
|
if (p != NULL)
|
||||||
|
nc_in_port = simple_strtoul(p, NULL, 10);
|
||||||
|
|
||||||
|
if (is_broadcast(nc_ip))
|
||||||
|
/* broadcast MAC address */
|
||||||
|
memset(nc_ether, 0xff, sizeof(nc_ether));
|
||||||
|
else
|
||||||
|
/* force arp request */
|
||||||
|
memset(nc_ether, 0, sizeof(nc_ether));
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called from NetLoop in net/net.c before each packet
|
||||||
|
*/
|
||||||
void NcStart(void)
|
void NcStart(void)
|
||||||
{
|
{
|
||||||
|
refresh_settings_from_env();
|
||||||
if (!output_packet_len || memcmp(nc_ether, NetEtherNullAddr, 6)) {
|
if (!output_packet_len || memcmp(nc_ether, NetEtherNullAddr, 6)) {
|
||||||
/* going to check for input packet */
|
/* going to check for input packet */
|
||||||
net_set_udp_handler(nc_handler);
|
net_set_udp_handler(nc_handler);
|
||||||
@ -71,18 +142,22 @@ void NcStart(void)
|
|||||||
net_set_arp_handler(nc_wait_arp_handler);
|
net_set_arp_handler(nc_wait_arp_handler);
|
||||||
pkt = (uchar *)NetTxPacket + NetEthHdrSize() + IP_UDP_HDR_SIZE;
|
pkt = (uchar *)NetTxPacket + NetEthHdrSize() + IP_UDP_HDR_SIZE;
|
||||||
memcpy(pkt, output_packet, output_packet_len);
|
memcpy(pkt, output_packet, output_packet_len);
|
||||||
NetSendUDPPacket(nc_ether, nc_ip, nc_port, nc_port,
|
NetSendUDPPacket(nc_ether, nc_ip, nc_out_port, nc_in_port,
|
||||||
output_packet_len);
|
output_packet_len);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int nc_input_packet(uchar *pkt, unsigned dest, unsigned src, unsigned len)
|
int nc_input_packet(uchar *pkt, IPaddr_t src_ip, unsigned dest_port,
|
||||||
|
unsigned src_port, unsigned len)
|
||||||
{
|
{
|
||||||
int end, chunk;
|
int end, chunk;
|
||||||
|
|
||||||
if (dest != nc_port || !len)
|
if (dest_port != nc_in_port || !len)
|
||||||
return 0; /* not for us */
|
return 0; /* not for us */
|
||||||
|
|
||||||
|
if (src_ip != nc_ip && !is_broadcast(nc_ip))
|
||||||
|
return 0; /* not from our client */
|
||||||
|
|
||||||
debug_cond(DEBUG_DEV_PKT, "input: \"%*.*s\"\n", len, len, pkt);
|
debug_cond(DEBUG_DEV_PKT, "input: \"%*.*s\"\n", len, len, pkt);
|
||||||
|
|
||||||
if (input_size == sizeof(input_buffer))
|
if (input_size == sizeof(input_buffer))
|
||||||
@ -131,47 +206,39 @@ static void nc_send_packet(const char *buf, int len)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (eth->state != ETH_STATE_ACTIVE) {
|
if (eth->state != ETH_STATE_ACTIVE) {
|
||||||
if (eth_init(gd->bd) < 0)
|
if (eth_is_on_demand_init()) {
|
||||||
return;
|
if (eth_init(gd->bd) < 0)
|
||||||
|
return;
|
||||||
|
eth_set_last_protocol(NETCONS);
|
||||||
|
} else
|
||||||
|
eth_init_state_only(gd->bd);
|
||||||
|
|
||||||
inited = 1;
|
inited = 1;
|
||||||
}
|
}
|
||||||
pkt = (uchar *)NetTxPacket + NetEthHdrSize() + IP_UDP_HDR_SIZE;
|
pkt = (uchar *)NetTxPacket + NetEthHdrSize() + IP_UDP_HDR_SIZE;
|
||||||
memcpy(pkt, buf, len);
|
memcpy(pkt, buf, len);
|
||||||
ether = nc_ether;
|
ether = nc_ether;
|
||||||
ip = nc_ip;
|
ip = nc_ip;
|
||||||
NetSendUDPPacket(ether, ip, nc_port, nc_port, len);
|
NetSendUDPPacket(ether, ip, nc_out_port, nc_in_port, len);
|
||||||
|
|
||||||
if (inited)
|
if (inited) {
|
||||||
eth_halt();
|
if (eth_is_on_demand_init())
|
||||||
|
eth_halt();
|
||||||
|
else
|
||||||
|
eth_halt_state_only();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int nc_start(void)
|
static int nc_start(void)
|
||||||
{
|
{
|
||||||
int netmask, our_ip;
|
int retval;
|
||||||
|
|
||||||
nc_port = 6666; /* default port */
|
nc_out_port = 6666; /* default port */
|
||||||
|
nc_in_port = nc_out_port;
|
||||||
|
|
||||||
if (getenv("ncip")) {
|
retval = refresh_settings_from_env();
|
||||||
char *p;
|
if (retval != 0)
|
||||||
|
return retval;
|
||||||
nc_ip = getenv_IPaddr("ncip");
|
|
||||||
if (!nc_ip)
|
|
||||||
return -1; /* ncip is 0.0.0.0 */
|
|
||||||
p = strchr(getenv("ncip"), ':');
|
|
||||||
if (p != NULL)
|
|
||||||
nc_port = simple_strtoul(p + 1, NULL, 10);
|
|
||||||
} else
|
|
||||||
nc_ip = ~0; /* ncip is not set */
|
|
||||||
|
|
||||||
our_ip = getenv_IPaddr("ipaddr");
|
|
||||||
netmask = getenv_IPaddr("netmask");
|
|
||||||
|
|
||||||
if (nc_ip == ~0 || /* 255.255.255.255 */
|
|
||||||
((netmask & our_ip) == (netmask & nc_ip) && /* on the same net */
|
|
||||||
(netmask | nc_ip) == ~0)) /* broadcast to our net */
|
|
||||||
memset(nc_ether, 0xff, sizeof(nc_ether));
|
|
||||||
else
|
|
||||||
memset(nc_ether, 0, sizeof(nc_ether)); /* force arp request */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialize the static IP settings and buffer pointers
|
* Initialize the static IP settings and buffer pointers
|
||||||
@ -203,7 +270,7 @@ static void nc_puts(const char *s)
|
|||||||
|
|
||||||
len = strlen(s);
|
len = strlen(s);
|
||||||
while (len) {
|
while (len) {
|
||||||
int send_len = min(len, 512);
|
int send_len = min(len, sizeof(input_buffer));
|
||||||
nc_send_packet(s, send_len);
|
nc_send_packet(s, send_len);
|
||||||
len -= send_len;
|
len -= send_len;
|
||||||
s += send_len;
|
s += send_len;
|
||||||
|
@ -25,7 +25,7 @@ include $(TOPDIR)/config.mk
|
|||||||
|
|
||||||
LIB := $(obj)libnpe.o
|
LIB := $(obj)libnpe.o
|
||||||
|
|
||||||
LOCAL_CFLAGS += -I$(TOPDIR)/arch/arm/cpu/ixp/npe/include -DCONFIG_IXP425_COMPONENT_ETHDB -D__linux
|
LOCAL_CFLAGS += -I$(TOPDIR)/drivers/net/npe/include -DCONFIG_IXP425_COMPONENT_ETHDB -D__linux
|
||||||
CFLAGS += $(LOCAL_CFLAGS)
|
CFLAGS += $(LOCAL_CFLAGS)
|
||||||
CPPFLAGS += $(LOCAL_CFLAGS) # needed for depend
|
CPPFLAGS += $(LOCAL_CFLAGS) # needed for depend
|
||||||
HOSTCFLAGS += $(LOCAL_CFLAGS)
|
HOSTCFLAGS += $(LOCAL_CFLAGS)
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user