From 7f51898c1b170e0036e6931a17ada46e2b4fd52e Mon Sep 17 00:00:00 2001 From: Joe Hershberger Date: Tue, 31 Jul 2012 06:06:41 +0000 Subject: [PATCH 01/27] net: Make netconsole src and dest ports configurable It is desirable to use different port numbers for sending and receiving packets with netconsole in the case where you have more than one device on the local subnet with netconsole enabled for broadcast. When they use the same port for both, any output from one will look like input to the other. This is typlically not desirable. This patch allows the input and output ports to be specified separately in the environment. Signed-off-by: Joe Hershberger Cc: Mike Frysinger Acked-by: Mike Frysinger --- doc/README.NetConsole | 3 +++ drivers/net/netconsole.c | 29 ++++++++++++++++++++--------- tools/netconsole | 18 +++++++++++------- 3 files changed, 34 insertions(+), 16 deletions(-) diff --git a/doc/README.NetConsole b/doc/README.NetConsole index c8bcb90a39..070e86a6f7 100644 --- a/doc/README.NetConsole +++ b/doc/README.NetConsole @@ -11,6 +11,9 @@ port of the destination. The format is :. If is 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 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: diff --git a/drivers/net/netconsole.c b/drivers/net/netconsole.c index 14243b8a92..86f5301141 100644 --- a/drivers/net/netconsole.c +++ b/drivers/net/netconsole.c @@ -36,7 +36,8 @@ static int output_recursion; static int net_timeout; static uchar nc_ether[6]; /* server enet address */ 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 int output_packet_len; @@ -71,7 +72,7 @@ void NcStart(void) net_set_arp_handler(nc_wait_arp_handler); pkt = (uchar *)NetTxPacket + NetEthHdrSize() + IP_UDP_HDR_SIZE; 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); } } @@ -80,7 +81,7 @@ int nc_input_packet(uchar *pkt, unsigned dest, unsigned src, unsigned len) { int end, chunk; - if (dest != nc_port || !len) + if (dest != nc_in_port || !len) return 0; /* not for us */ debug_cond(DEBUG_DEV_PKT, "input: \"%*.*s\"\n", len, len, pkt); @@ -139,7 +140,7 @@ static void nc_send_packet(const char *buf, int len) memcpy(pkt, buf, len); ether = nc_ether; ip = nc_ip; - NetSendUDPPacket(ether, ip, nc_port, nc_port, len); + NetSendUDPPacket(ether, ip, nc_out_port, nc_in_port, len); if (inited) eth_halt(); @@ -148,20 +149,30 @@ static void nc_send_packet(const char *buf, int len) static int nc_start(void) { int netmask, our_ip; + char *p; - nc_port = 6666; /* default port */ + nc_out_port = 6666; /* default port */ + nc_in_port = nc_out_port; if (getenv("ncip")) { - char *p; 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); + 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 */ + 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); our_ip = getenv_IPaddr("ipaddr"); netmask = getenv_IPaddr("netmask"); diff --git a/tools/netconsole b/tools/netconsole index c8109bb095..1a0ef22244 100755 --- a/tools/netconsole +++ b/tools/netconsole @@ -2,7 +2,7 @@ usage() { ( - echo "Usage: $0 [board port]" + echo "Usage: $0 [board-port [board-in-port]]" echo "" echo "If port is not specified, '6666' will be used" [ -z "$*" ] && exit 0 @@ -24,9 +24,13 @@ while [ -n "$1" ] ; do done ip=$1 -port=${2:-6666} +board_out_port=${2:-6666} +board_in_port=${3:-${board_out_port}} -if [ -z "${ip}" ] || [ -n "$3" ] ; then +echo Board out port: ${board_out_port} +echo Board in port: ${board_in_port} + +if [ -z "${ip}" ] || [ -n "$4" ] ; then usage "Invalid number of arguments" fi @@ -41,19 +45,19 @@ stty -icanon -echo intr ^T ( if type ncb 2>/dev/null ; then # see if ncb is in $PATH - exec ncb ${port} + exec ncb ${board_out_port} elif [ -x ${0%/*}/ncb ] ; then # maybe it's in the same dir as the netconsole script - exec ${0%/*}/ncb ${port} + exec ${0%/*}/ncb ${board_out_port} else # blah, just use regular netcat - while ${nc} -u -l -p ${port} < /dev/null ; do + while ${nc} -u -l -p ${board_out_port} < /dev/null ; do : done fi ) & pid=$! -${nc} -u ${ip} ${port} +${nc} -u ${ip} ${board_in_port} kill ${pid} 2>/dev/null From 46c07bcf12a7d6478b5e2f3e4b4c961d84428c6c Mon Sep 17 00:00:00 2001 From: Michael Walle Date: Fri, 22 Jun 2012 11:24:28 +0000 Subject: [PATCH 02/27] api: net: fix length check in eth_receive() If the requested length is too small to hold the received packet, eth_receive() will return -1 and will leave the packet in the receive buffers. Instead of returning an error in this case, we return the first portion of the received packet and remove it from the receive buffers. This fixes FreeBSD's ubldr. Without this patch it will just stop receiving packets if the NIC receives more than PKTBUFSRX too large packets. Signed-off-by: Michael Walle Cc: Joe Hershberger Cc: Rafal Jaworowski Cc: Piotr Kruszynski --- net/eth.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/net/eth.c b/net/eth.c index 1a11ce1027..bb4d95be8e 100644 --- a/net/eth.c +++ b/net/eth.c @@ -500,10 +500,7 @@ int eth_receive(void *packet, int length) return -1; } - if (length < eth_rcv_bufs[eth_rcv_current].length) - return -1; - - length = eth_rcv_bufs[eth_rcv_current].length; + length = min(eth_rcv_bufs[eth_rcv_current].length, length); for (i = 0; i < length; i++) p[i] = eth_rcv_bufs[eth_rcv_current].data[i]; From 1389f98fced3651ece415a6011ccbdfac3a52286 Mon Sep 17 00:00:00 2001 From: Tetsuyuki Kobayashi Date: Mon, 25 Jun 2012 02:37:27 +0000 Subject: [PATCH 03/27] net: bugfix: NetSetTimeout assumes CONFIG_SYS_HZ=1000 NetSetTimeout sets incorrect value to timeDelta when CONFIG_SYS_HZ != 1000. Signed-off-by: Tetsuyuki Kobayashi --- net/net.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/net.c b/net/net.c index e8ff0662b8..f4404342f7 100644 --- a/net/net.c +++ b/net/net.c @@ -652,7 +652,7 @@ NetSetTimeout(ulong iv, thand_f *f) "--- NetLoop timeout handler set (%p)\n", f); timeHandler = f; timeStart = get_timer(0); - timeDelta = iv; + timeDelta = iv * CONFIG_SYS_HZ / 1000; } } From 61e129885a8fd6d36c25301e537d46e66b6c6e6a Mon Sep 17 00:00:00 2001 From: Marek Vasut Date: Sat, 21 Jul 2012 05:02:26 +0000 Subject: [PATCH 04/27] dm: net: Move IXP NPE to drivers/net/ Signed-off-by: Marek Vasut Cc: Bryan Hundven Cc: Michael Schwingen Cc: Wolfgang Denk Cc: Albert Aribaud Cc: U-Boot DM Cc: Joe Hershberger --- Makefile | 2 +- {arch/arm/cpu/ixp => drivers/net}/npe/IxEthAcc.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/IxEthAccCommon.c | 0 .../arm/cpu/ixp => drivers/net}/npe/IxEthAccControlInterface.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/IxEthAccDataPlane.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/IxEthAccMac.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/IxEthAccMii.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/IxEthDBAPI.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/IxEthDBAPISupport.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/IxEthDBCore.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/IxEthDBEvents.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/IxEthDBFeatures.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/IxEthDBFirewall.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/IxEthDBHashtable.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/IxEthDBLearning.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/IxEthDBMem.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/IxEthDBNPEAdaptor.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/IxEthDBPortUpdate.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/IxEthDBReports.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/IxEthDBSearch.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/IxEthDBSpanningTree.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/IxEthDBUtil.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/IxEthDBVlan.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/IxEthDBWiFi.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/IxEthMii.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/IxFeatureCtrl.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/IxNpeDl.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/IxNpeDlImageMgr.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/IxNpeDlNpeMgr.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/IxNpeDlNpeMgrUtils.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/IxNpeMh.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/IxNpeMhConfig.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/IxNpeMhReceive.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/IxNpeMhSend.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/IxNpeMhSolicitedCbMgr.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/IxNpeMhUnsolicitedCbMgr.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/IxOsalBufferMgt.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/IxOsalIoMem.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/IxOsalOsCacheMMU.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/IxOsalOsMsgQ.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/IxOsalOsSemaphore.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/IxOsalOsServices.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/IxOsalOsThread.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/IxQMgrAqmIf.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/IxQMgrDispatcher.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/IxQMgrInit.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/IxQMgrQAccess.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/IxQMgrQCfg.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/Makefile | 2 +- {arch/arm/cpu/ixp => drivers/net}/npe/include/IxAssert.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxAtmSch.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxAtmTypes.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxAtmdAcc.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxAtmdAccCtrl.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxAtmm.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxDmaAcc.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxEthAcc.h | 0 .../cpu/ixp => drivers/net}/npe/include/IxEthAccDataPlane_p.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxEthAccMac_p.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxEthAccMii_p.h | 0 .../cpu/ixp => drivers/net}/npe/include/IxEthAccQueueAssign_p.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxEthAcc_p.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxEthDB.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxEthDBLocks_p.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxEthDBLog_p.h | 0 .../arm/cpu/ixp => drivers/net}/npe/include/IxEthDBMessages_p.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxEthDBPortDefs.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxEthDBQoS.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxEthDB_p.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxEthMii.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxEthMii_p.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxEthNpe.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxFeatureCtrl.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxHssAcc.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxI2cDrv.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxNpeA.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxNpeDl.h | 0 .../arm/cpu/ixp => drivers/net}/npe/include/IxNpeDlImageMgr_p.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxNpeDlMacros_p.h | 0 .../net}/npe/include/IxNpeDlNpeMgrEcRegisters_p.h | 0 .../cpu/ixp => drivers/net}/npe/include/IxNpeDlNpeMgrUtils_p.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxNpeDlNpeMgr_p.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxNpeMh.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxNpeMhConfig_p.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxNpeMhMacros_p.h | 0 .../arm/cpu/ixp => drivers/net}/npe/include/IxNpeMhReceive_p.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxNpeMhSend_p.h | 0 .../ixp => drivers/net}/npe/include/IxNpeMhSolicitedCbMgr_p.h | 0 .../ixp => drivers/net}/npe/include/IxNpeMhUnsolicitedCbMgr_p.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxNpeMicrocode.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsBufLib.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsBuffMgt.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsBuffPoolMgt.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsCacheMMU.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsPrintf.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsServices.h | 0 .../ixp => drivers/net}/npe/include/IxOsServicesComponents.h | 0 .../cpu/ixp => drivers/net}/npe/include/IxOsServicesEndianess.h | 0 .../cpu/ixp => drivers/net}/npe/include/IxOsServicesMemAccess.h | 0 .../cpu/ixp => drivers/net}/npe/include/IxOsServicesMemMap.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsal.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsalAssert.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsalBackward.h | 0 .../cpu/ixp => drivers/net}/npe/include/IxOsalBackwardAssert.h | 0 .../ixp => drivers/net}/npe/include/IxOsalBackwardBufferMgt.h | 0 .../ixp => drivers/net}/npe/include/IxOsalBackwardCacheMMU.h | 0 .../cpu/ixp => drivers/net}/npe/include/IxOsalBackwardMemMap.h | 0 .../ixp => drivers/net}/npe/include/IxOsalBackwardOsServices.h | 0 .../cpu/ixp => drivers/net}/npe/include/IxOsalBackwardOssl.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsalBufferMgt.h | 0 .../ixp => drivers/net}/npe/include/IxOsalBufferMgtDefault.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsalConfig.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsalEndianess.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsalIoMem.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsalMemAccess.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsalOem.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsalOs.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsalOsAssert.h | 0 .../arm/cpu/ixp => drivers/net}/npe/include/IxOsalOsBufferMgt.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsalOsIxp400.h | 0 .../net}/npe/include/IxOsalOsIxp400CustomizedMapping.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsalOsTypes.h | 0 .../ixp => drivers/net}/npe/include/IxOsalOsUtilitySymbols.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsalTypes.h | 0 .../cpu/ixp => drivers/net}/npe/include/IxOsalUtilitySymbols.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxParityENAcc.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxPerfProfAcc.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxQMgr.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxQMgrAqmIf_p.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxQMgrDefines_p.h | 0 .../cpu/ixp => drivers/net}/npe/include/IxQMgrDispatcher_p.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxQMgrLog_p.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxQMgrQAccess_p.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxQMgrQCfg_p.h | 0 .../cpu/ixp => drivers/net}/npe/include/IxQueueAssignments.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxSspAcc.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxTimeSyncAcc.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxTimerCtrl.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxTypes.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxUART.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/IxVersionId.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/ix_error.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/ix_macros.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/ix_os_type.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/ix_ossl.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/ix_symbols.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/ix_types.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/npe.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/include/os_datatypes.h | 0 {arch/arm/cpu/ixp => drivers/net}/npe/miiphy.c | 0 {arch/arm/cpu/ixp => drivers/net}/npe/npe.c | 0 151 files changed, 2 insertions(+), 2 deletions(-) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxEthAcc.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxEthAccCommon.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxEthAccControlInterface.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxEthAccDataPlane.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxEthAccMac.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxEthAccMii.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxEthDBAPI.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxEthDBAPISupport.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxEthDBCore.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxEthDBEvents.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxEthDBFeatures.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxEthDBFirewall.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxEthDBHashtable.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxEthDBLearning.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxEthDBMem.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxEthDBNPEAdaptor.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxEthDBPortUpdate.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxEthDBReports.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxEthDBSearch.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxEthDBSpanningTree.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxEthDBUtil.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxEthDBVlan.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxEthDBWiFi.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxEthMii.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxFeatureCtrl.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxNpeDl.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxNpeDlImageMgr.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxNpeDlNpeMgr.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxNpeDlNpeMgrUtils.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxNpeMh.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxNpeMhConfig.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxNpeMhReceive.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxNpeMhSend.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxNpeMhSolicitedCbMgr.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxNpeMhUnsolicitedCbMgr.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxOsalBufferMgt.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxOsalIoMem.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxOsalOsCacheMMU.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxOsalOsMsgQ.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxOsalOsSemaphore.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxOsalOsServices.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxOsalOsThread.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxQMgrAqmIf.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxQMgrDispatcher.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxQMgrInit.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxQMgrQAccess.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/IxQMgrQCfg.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/Makefile (96%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxAssert.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxAtmSch.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxAtmTypes.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxAtmdAcc.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxAtmdAccCtrl.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxAtmm.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxDmaAcc.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxEthAcc.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxEthAccDataPlane_p.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxEthAccMac_p.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxEthAccMii_p.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxEthAccQueueAssign_p.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxEthAcc_p.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxEthDB.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxEthDBLocks_p.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxEthDBLog_p.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxEthDBMessages_p.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxEthDBPortDefs.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxEthDBQoS.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxEthDB_p.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxEthMii.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxEthMii_p.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxEthNpe.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxFeatureCtrl.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxHssAcc.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxI2cDrv.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxNpeA.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxNpeDl.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxNpeDlImageMgr_p.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxNpeDlMacros_p.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxNpeDlNpeMgrEcRegisters_p.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxNpeDlNpeMgrUtils_p.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxNpeDlNpeMgr_p.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxNpeMh.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxNpeMhConfig_p.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxNpeMhMacros_p.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxNpeMhReceive_p.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxNpeMhSend_p.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxNpeMhSolicitedCbMgr_p.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxNpeMhUnsolicitedCbMgr_p.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxNpeMicrocode.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsBufLib.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsBuffMgt.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsBuffPoolMgt.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsCacheMMU.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsPrintf.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsServices.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsServicesComponents.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsServicesEndianess.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsServicesMemAccess.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsServicesMemMap.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsal.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsalAssert.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsalBackward.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsalBackwardAssert.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsalBackwardBufferMgt.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsalBackwardCacheMMU.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsalBackwardMemMap.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsalBackwardOsServices.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsalBackwardOssl.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsalBufferMgt.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsalBufferMgtDefault.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsalConfig.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsalEndianess.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsalIoMem.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsalMemAccess.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsalOem.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsalOs.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsalOsAssert.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsalOsBufferMgt.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsalOsIxp400.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsalOsIxp400CustomizedMapping.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsalOsTypes.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsalOsUtilitySymbols.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsalTypes.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxOsalUtilitySymbols.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxParityENAcc.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxPerfProfAcc.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxQMgr.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxQMgrAqmIf_p.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxQMgrDefines_p.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxQMgrDispatcher_p.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxQMgrLog_p.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxQMgrQAccess_p.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxQMgrQCfg_p.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxQueueAssignments.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxSspAcc.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxTimeSyncAcc.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxTimerCtrl.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxTypes.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxUART.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/IxVersionId.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/ix_error.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/ix_macros.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/ix_os_type.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/ix_ossl.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/ix_symbols.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/ix_types.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/npe.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/include/os_datatypes.h (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/miiphy.c (100%) rename {arch/arm/cpu/ixp => drivers/net}/npe/npe.c (100%) diff --git a/Makefile b/Makefile index e3a27c6249..6718f8d046 100644 --- a/Makefile +++ b/Makefile @@ -238,7 +238,7 @@ ifdef SOC LIBS-y += $(CPUDIR)/$(SOC)/lib$(SOC).o endif ifeq ($(CPU),ixp) -LIBS-y += arch/arm/cpu/ixp/npe/libnpe.o +LIBS-y += drivers/net/npe/libnpe.o endif LIBS-$(CONFIG_OF_EMBED) += dts/libdts.o LIBS-y += arch/$(ARCH)/lib/lib$(ARCH).o diff --git a/arch/arm/cpu/ixp/npe/IxEthAcc.c b/drivers/net/npe/IxEthAcc.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxEthAcc.c rename to drivers/net/npe/IxEthAcc.c diff --git a/arch/arm/cpu/ixp/npe/IxEthAccCommon.c b/drivers/net/npe/IxEthAccCommon.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxEthAccCommon.c rename to drivers/net/npe/IxEthAccCommon.c diff --git a/arch/arm/cpu/ixp/npe/IxEthAccControlInterface.c b/drivers/net/npe/IxEthAccControlInterface.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxEthAccControlInterface.c rename to drivers/net/npe/IxEthAccControlInterface.c diff --git a/arch/arm/cpu/ixp/npe/IxEthAccDataPlane.c b/drivers/net/npe/IxEthAccDataPlane.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxEthAccDataPlane.c rename to drivers/net/npe/IxEthAccDataPlane.c diff --git a/arch/arm/cpu/ixp/npe/IxEthAccMac.c b/drivers/net/npe/IxEthAccMac.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxEthAccMac.c rename to drivers/net/npe/IxEthAccMac.c diff --git a/arch/arm/cpu/ixp/npe/IxEthAccMii.c b/drivers/net/npe/IxEthAccMii.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxEthAccMii.c rename to drivers/net/npe/IxEthAccMii.c diff --git a/arch/arm/cpu/ixp/npe/IxEthDBAPI.c b/drivers/net/npe/IxEthDBAPI.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxEthDBAPI.c rename to drivers/net/npe/IxEthDBAPI.c diff --git a/arch/arm/cpu/ixp/npe/IxEthDBAPISupport.c b/drivers/net/npe/IxEthDBAPISupport.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxEthDBAPISupport.c rename to drivers/net/npe/IxEthDBAPISupport.c diff --git a/arch/arm/cpu/ixp/npe/IxEthDBCore.c b/drivers/net/npe/IxEthDBCore.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxEthDBCore.c rename to drivers/net/npe/IxEthDBCore.c diff --git a/arch/arm/cpu/ixp/npe/IxEthDBEvents.c b/drivers/net/npe/IxEthDBEvents.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxEthDBEvents.c rename to drivers/net/npe/IxEthDBEvents.c diff --git a/arch/arm/cpu/ixp/npe/IxEthDBFeatures.c b/drivers/net/npe/IxEthDBFeatures.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxEthDBFeatures.c rename to drivers/net/npe/IxEthDBFeatures.c diff --git a/arch/arm/cpu/ixp/npe/IxEthDBFirewall.c b/drivers/net/npe/IxEthDBFirewall.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxEthDBFirewall.c rename to drivers/net/npe/IxEthDBFirewall.c diff --git a/arch/arm/cpu/ixp/npe/IxEthDBHashtable.c b/drivers/net/npe/IxEthDBHashtable.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxEthDBHashtable.c rename to drivers/net/npe/IxEthDBHashtable.c diff --git a/arch/arm/cpu/ixp/npe/IxEthDBLearning.c b/drivers/net/npe/IxEthDBLearning.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxEthDBLearning.c rename to drivers/net/npe/IxEthDBLearning.c diff --git a/arch/arm/cpu/ixp/npe/IxEthDBMem.c b/drivers/net/npe/IxEthDBMem.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxEthDBMem.c rename to drivers/net/npe/IxEthDBMem.c diff --git a/arch/arm/cpu/ixp/npe/IxEthDBNPEAdaptor.c b/drivers/net/npe/IxEthDBNPEAdaptor.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxEthDBNPEAdaptor.c rename to drivers/net/npe/IxEthDBNPEAdaptor.c diff --git a/arch/arm/cpu/ixp/npe/IxEthDBPortUpdate.c b/drivers/net/npe/IxEthDBPortUpdate.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxEthDBPortUpdate.c rename to drivers/net/npe/IxEthDBPortUpdate.c diff --git a/arch/arm/cpu/ixp/npe/IxEthDBReports.c b/drivers/net/npe/IxEthDBReports.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxEthDBReports.c rename to drivers/net/npe/IxEthDBReports.c diff --git a/arch/arm/cpu/ixp/npe/IxEthDBSearch.c b/drivers/net/npe/IxEthDBSearch.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxEthDBSearch.c rename to drivers/net/npe/IxEthDBSearch.c diff --git a/arch/arm/cpu/ixp/npe/IxEthDBSpanningTree.c b/drivers/net/npe/IxEthDBSpanningTree.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxEthDBSpanningTree.c rename to drivers/net/npe/IxEthDBSpanningTree.c diff --git a/arch/arm/cpu/ixp/npe/IxEthDBUtil.c b/drivers/net/npe/IxEthDBUtil.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxEthDBUtil.c rename to drivers/net/npe/IxEthDBUtil.c diff --git a/arch/arm/cpu/ixp/npe/IxEthDBVlan.c b/drivers/net/npe/IxEthDBVlan.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxEthDBVlan.c rename to drivers/net/npe/IxEthDBVlan.c diff --git a/arch/arm/cpu/ixp/npe/IxEthDBWiFi.c b/drivers/net/npe/IxEthDBWiFi.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxEthDBWiFi.c rename to drivers/net/npe/IxEthDBWiFi.c diff --git a/arch/arm/cpu/ixp/npe/IxEthMii.c b/drivers/net/npe/IxEthMii.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxEthMii.c rename to drivers/net/npe/IxEthMii.c diff --git a/arch/arm/cpu/ixp/npe/IxFeatureCtrl.c b/drivers/net/npe/IxFeatureCtrl.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxFeatureCtrl.c rename to drivers/net/npe/IxFeatureCtrl.c diff --git a/arch/arm/cpu/ixp/npe/IxNpeDl.c b/drivers/net/npe/IxNpeDl.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxNpeDl.c rename to drivers/net/npe/IxNpeDl.c diff --git a/arch/arm/cpu/ixp/npe/IxNpeDlImageMgr.c b/drivers/net/npe/IxNpeDlImageMgr.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxNpeDlImageMgr.c rename to drivers/net/npe/IxNpeDlImageMgr.c diff --git a/arch/arm/cpu/ixp/npe/IxNpeDlNpeMgr.c b/drivers/net/npe/IxNpeDlNpeMgr.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxNpeDlNpeMgr.c rename to drivers/net/npe/IxNpeDlNpeMgr.c diff --git a/arch/arm/cpu/ixp/npe/IxNpeDlNpeMgrUtils.c b/drivers/net/npe/IxNpeDlNpeMgrUtils.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxNpeDlNpeMgrUtils.c rename to drivers/net/npe/IxNpeDlNpeMgrUtils.c diff --git a/arch/arm/cpu/ixp/npe/IxNpeMh.c b/drivers/net/npe/IxNpeMh.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxNpeMh.c rename to drivers/net/npe/IxNpeMh.c diff --git a/arch/arm/cpu/ixp/npe/IxNpeMhConfig.c b/drivers/net/npe/IxNpeMhConfig.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxNpeMhConfig.c rename to drivers/net/npe/IxNpeMhConfig.c diff --git a/arch/arm/cpu/ixp/npe/IxNpeMhReceive.c b/drivers/net/npe/IxNpeMhReceive.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxNpeMhReceive.c rename to drivers/net/npe/IxNpeMhReceive.c diff --git a/arch/arm/cpu/ixp/npe/IxNpeMhSend.c b/drivers/net/npe/IxNpeMhSend.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxNpeMhSend.c rename to drivers/net/npe/IxNpeMhSend.c diff --git a/arch/arm/cpu/ixp/npe/IxNpeMhSolicitedCbMgr.c b/drivers/net/npe/IxNpeMhSolicitedCbMgr.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxNpeMhSolicitedCbMgr.c rename to drivers/net/npe/IxNpeMhSolicitedCbMgr.c diff --git a/arch/arm/cpu/ixp/npe/IxNpeMhUnsolicitedCbMgr.c b/drivers/net/npe/IxNpeMhUnsolicitedCbMgr.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxNpeMhUnsolicitedCbMgr.c rename to drivers/net/npe/IxNpeMhUnsolicitedCbMgr.c diff --git a/arch/arm/cpu/ixp/npe/IxOsalBufferMgt.c b/drivers/net/npe/IxOsalBufferMgt.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxOsalBufferMgt.c rename to drivers/net/npe/IxOsalBufferMgt.c diff --git a/arch/arm/cpu/ixp/npe/IxOsalIoMem.c b/drivers/net/npe/IxOsalIoMem.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxOsalIoMem.c rename to drivers/net/npe/IxOsalIoMem.c diff --git a/arch/arm/cpu/ixp/npe/IxOsalOsCacheMMU.c b/drivers/net/npe/IxOsalOsCacheMMU.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxOsalOsCacheMMU.c rename to drivers/net/npe/IxOsalOsCacheMMU.c diff --git a/arch/arm/cpu/ixp/npe/IxOsalOsMsgQ.c b/drivers/net/npe/IxOsalOsMsgQ.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxOsalOsMsgQ.c rename to drivers/net/npe/IxOsalOsMsgQ.c diff --git a/arch/arm/cpu/ixp/npe/IxOsalOsSemaphore.c b/drivers/net/npe/IxOsalOsSemaphore.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxOsalOsSemaphore.c rename to drivers/net/npe/IxOsalOsSemaphore.c diff --git a/arch/arm/cpu/ixp/npe/IxOsalOsServices.c b/drivers/net/npe/IxOsalOsServices.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxOsalOsServices.c rename to drivers/net/npe/IxOsalOsServices.c diff --git a/arch/arm/cpu/ixp/npe/IxOsalOsThread.c b/drivers/net/npe/IxOsalOsThread.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxOsalOsThread.c rename to drivers/net/npe/IxOsalOsThread.c diff --git a/arch/arm/cpu/ixp/npe/IxQMgrAqmIf.c b/drivers/net/npe/IxQMgrAqmIf.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxQMgrAqmIf.c rename to drivers/net/npe/IxQMgrAqmIf.c diff --git a/arch/arm/cpu/ixp/npe/IxQMgrDispatcher.c b/drivers/net/npe/IxQMgrDispatcher.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxQMgrDispatcher.c rename to drivers/net/npe/IxQMgrDispatcher.c diff --git a/arch/arm/cpu/ixp/npe/IxQMgrInit.c b/drivers/net/npe/IxQMgrInit.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxQMgrInit.c rename to drivers/net/npe/IxQMgrInit.c diff --git a/arch/arm/cpu/ixp/npe/IxQMgrQAccess.c b/drivers/net/npe/IxQMgrQAccess.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxQMgrQAccess.c rename to drivers/net/npe/IxQMgrQAccess.c diff --git a/arch/arm/cpu/ixp/npe/IxQMgrQCfg.c b/drivers/net/npe/IxQMgrQCfg.c similarity index 100% rename from arch/arm/cpu/ixp/npe/IxQMgrQCfg.c rename to drivers/net/npe/IxQMgrQCfg.c diff --git a/arch/arm/cpu/ixp/npe/Makefile b/drivers/net/npe/Makefile similarity index 96% rename from arch/arm/cpu/ixp/npe/Makefile rename to drivers/net/npe/Makefile index 14ab3c7a71..d13391bf94 100644 --- a/arch/arm/cpu/ixp/npe/Makefile +++ b/drivers/net/npe/Makefile @@ -25,7 +25,7 @@ include $(TOPDIR)/config.mk 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) CPPFLAGS += $(LOCAL_CFLAGS) # needed for depend HOSTCFLAGS += $(LOCAL_CFLAGS) diff --git a/arch/arm/cpu/ixp/npe/include/IxAssert.h b/drivers/net/npe/include/IxAssert.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxAssert.h rename to drivers/net/npe/include/IxAssert.h diff --git a/arch/arm/cpu/ixp/npe/include/IxAtmSch.h b/drivers/net/npe/include/IxAtmSch.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxAtmSch.h rename to drivers/net/npe/include/IxAtmSch.h diff --git a/arch/arm/cpu/ixp/npe/include/IxAtmTypes.h b/drivers/net/npe/include/IxAtmTypes.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxAtmTypes.h rename to drivers/net/npe/include/IxAtmTypes.h diff --git a/arch/arm/cpu/ixp/npe/include/IxAtmdAcc.h b/drivers/net/npe/include/IxAtmdAcc.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxAtmdAcc.h rename to drivers/net/npe/include/IxAtmdAcc.h diff --git a/arch/arm/cpu/ixp/npe/include/IxAtmdAccCtrl.h b/drivers/net/npe/include/IxAtmdAccCtrl.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxAtmdAccCtrl.h rename to drivers/net/npe/include/IxAtmdAccCtrl.h diff --git a/arch/arm/cpu/ixp/npe/include/IxAtmm.h b/drivers/net/npe/include/IxAtmm.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxAtmm.h rename to drivers/net/npe/include/IxAtmm.h diff --git a/arch/arm/cpu/ixp/npe/include/IxDmaAcc.h b/drivers/net/npe/include/IxDmaAcc.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxDmaAcc.h rename to drivers/net/npe/include/IxDmaAcc.h diff --git a/arch/arm/cpu/ixp/npe/include/IxEthAcc.h b/drivers/net/npe/include/IxEthAcc.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxEthAcc.h rename to drivers/net/npe/include/IxEthAcc.h diff --git a/arch/arm/cpu/ixp/npe/include/IxEthAccDataPlane_p.h b/drivers/net/npe/include/IxEthAccDataPlane_p.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxEthAccDataPlane_p.h rename to drivers/net/npe/include/IxEthAccDataPlane_p.h diff --git a/arch/arm/cpu/ixp/npe/include/IxEthAccMac_p.h b/drivers/net/npe/include/IxEthAccMac_p.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxEthAccMac_p.h rename to drivers/net/npe/include/IxEthAccMac_p.h diff --git a/arch/arm/cpu/ixp/npe/include/IxEthAccMii_p.h b/drivers/net/npe/include/IxEthAccMii_p.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxEthAccMii_p.h rename to drivers/net/npe/include/IxEthAccMii_p.h diff --git a/arch/arm/cpu/ixp/npe/include/IxEthAccQueueAssign_p.h b/drivers/net/npe/include/IxEthAccQueueAssign_p.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxEthAccQueueAssign_p.h rename to drivers/net/npe/include/IxEthAccQueueAssign_p.h diff --git a/arch/arm/cpu/ixp/npe/include/IxEthAcc_p.h b/drivers/net/npe/include/IxEthAcc_p.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxEthAcc_p.h rename to drivers/net/npe/include/IxEthAcc_p.h diff --git a/arch/arm/cpu/ixp/npe/include/IxEthDB.h b/drivers/net/npe/include/IxEthDB.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxEthDB.h rename to drivers/net/npe/include/IxEthDB.h diff --git a/arch/arm/cpu/ixp/npe/include/IxEthDBLocks_p.h b/drivers/net/npe/include/IxEthDBLocks_p.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxEthDBLocks_p.h rename to drivers/net/npe/include/IxEthDBLocks_p.h diff --git a/arch/arm/cpu/ixp/npe/include/IxEthDBLog_p.h b/drivers/net/npe/include/IxEthDBLog_p.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxEthDBLog_p.h rename to drivers/net/npe/include/IxEthDBLog_p.h diff --git a/arch/arm/cpu/ixp/npe/include/IxEthDBMessages_p.h b/drivers/net/npe/include/IxEthDBMessages_p.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxEthDBMessages_p.h rename to drivers/net/npe/include/IxEthDBMessages_p.h diff --git a/arch/arm/cpu/ixp/npe/include/IxEthDBPortDefs.h b/drivers/net/npe/include/IxEthDBPortDefs.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxEthDBPortDefs.h rename to drivers/net/npe/include/IxEthDBPortDefs.h diff --git a/arch/arm/cpu/ixp/npe/include/IxEthDBQoS.h b/drivers/net/npe/include/IxEthDBQoS.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxEthDBQoS.h rename to drivers/net/npe/include/IxEthDBQoS.h diff --git a/arch/arm/cpu/ixp/npe/include/IxEthDB_p.h b/drivers/net/npe/include/IxEthDB_p.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxEthDB_p.h rename to drivers/net/npe/include/IxEthDB_p.h diff --git a/arch/arm/cpu/ixp/npe/include/IxEthMii.h b/drivers/net/npe/include/IxEthMii.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxEthMii.h rename to drivers/net/npe/include/IxEthMii.h diff --git a/arch/arm/cpu/ixp/npe/include/IxEthMii_p.h b/drivers/net/npe/include/IxEthMii_p.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxEthMii_p.h rename to drivers/net/npe/include/IxEthMii_p.h diff --git a/arch/arm/cpu/ixp/npe/include/IxEthNpe.h b/drivers/net/npe/include/IxEthNpe.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxEthNpe.h rename to drivers/net/npe/include/IxEthNpe.h diff --git a/arch/arm/cpu/ixp/npe/include/IxFeatureCtrl.h b/drivers/net/npe/include/IxFeatureCtrl.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxFeatureCtrl.h rename to drivers/net/npe/include/IxFeatureCtrl.h diff --git a/arch/arm/cpu/ixp/npe/include/IxHssAcc.h b/drivers/net/npe/include/IxHssAcc.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxHssAcc.h rename to drivers/net/npe/include/IxHssAcc.h diff --git a/arch/arm/cpu/ixp/npe/include/IxI2cDrv.h b/drivers/net/npe/include/IxI2cDrv.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxI2cDrv.h rename to drivers/net/npe/include/IxI2cDrv.h diff --git a/arch/arm/cpu/ixp/npe/include/IxNpeA.h b/drivers/net/npe/include/IxNpeA.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxNpeA.h rename to drivers/net/npe/include/IxNpeA.h diff --git a/arch/arm/cpu/ixp/npe/include/IxNpeDl.h b/drivers/net/npe/include/IxNpeDl.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxNpeDl.h rename to drivers/net/npe/include/IxNpeDl.h diff --git a/arch/arm/cpu/ixp/npe/include/IxNpeDlImageMgr_p.h b/drivers/net/npe/include/IxNpeDlImageMgr_p.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxNpeDlImageMgr_p.h rename to drivers/net/npe/include/IxNpeDlImageMgr_p.h diff --git a/arch/arm/cpu/ixp/npe/include/IxNpeDlMacros_p.h b/drivers/net/npe/include/IxNpeDlMacros_p.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxNpeDlMacros_p.h rename to drivers/net/npe/include/IxNpeDlMacros_p.h diff --git a/arch/arm/cpu/ixp/npe/include/IxNpeDlNpeMgrEcRegisters_p.h b/drivers/net/npe/include/IxNpeDlNpeMgrEcRegisters_p.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxNpeDlNpeMgrEcRegisters_p.h rename to drivers/net/npe/include/IxNpeDlNpeMgrEcRegisters_p.h diff --git a/arch/arm/cpu/ixp/npe/include/IxNpeDlNpeMgrUtils_p.h b/drivers/net/npe/include/IxNpeDlNpeMgrUtils_p.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxNpeDlNpeMgrUtils_p.h rename to drivers/net/npe/include/IxNpeDlNpeMgrUtils_p.h diff --git a/arch/arm/cpu/ixp/npe/include/IxNpeDlNpeMgr_p.h b/drivers/net/npe/include/IxNpeDlNpeMgr_p.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxNpeDlNpeMgr_p.h rename to drivers/net/npe/include/IxNpeDlNpeMgr_p.h diff --git a/arch/arm/cpu/ixp/npe/include/IxNpeMh.h b/drivers/net/npe/include/IxNpeMh.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxNpeMh.h rename to drivers/net/npe/include/IxNpeMh.h diff --git a/arch/arm/cpu/ixp/npe/include/IxNpeMhConfig_p.h b/drivers/net/npe/include/IxNpeMhConfig_p.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxNpeMhConfig_p.h rename to drivers/net/npe/include/IxNpeMhConfig_p.h diff --git a/arch/arm/cpu/ixp/npe/include/IxNpeMhMacros_p.h b/drivers/net/npe/include/IxNpeMhMacros_p.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxNpeMhMacros_p.h rename to drivers/net/npe/include/IxNpeMhMacros_p.h diff --git a/arch/arm/cpu/ixp/npe/include/IxNpeMhReceive_p.h b/drivers/net/npe/include/IxNpeMhReceive_p.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxNpeMhReceive_p.h rename to drivers/net/npe/include/IxNpeMhReceive_p.h diff --git a/arch/arm/cpu/ixp/npe/include/IxNpeMhSend_p.h b/drivers/net/npe/include/IxNpeMhSend_p.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxNpeMhSend_p.h rename to drivers/net/npe/include/IxNpeMhSend_p.h diff --git a/arch/arm/cpu/ixp/npe/include/IxNpeMhSolicitedCbMgr_p.h b/drivers/net/npe/include/IxNpeMhSolicitedCbMgr_p.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxNpeMhSolicitedCbMgr_p.h rename to drivers/net/npe/include/IxNpeMhSolicitedCbMgr_p.h diff --git a/arch/arm/cpu/ixp/npe/include/IxNpeMhUnsolicitedCbMgr_p.h b/drivers/net/npe/include/IxNpeMhUnsolicitedCbMgr_p.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxNpeMhUnsolicitedCbMgr_p.h rename to drivers/net/npe/include/IxNpeMhUnsolicitedCbMgr_p.h diff --git a/arch/arm/cpu/ixp/npe/include/IxNpeMicrocode.h b/drivers/net/npe/include/IxNpeMicrocode.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxNpeMicrocode.h rename to drivers/net/npe/include/IxNpeMicrocode.h diff --git a/arch/arm/cpu/ixp/npe/include/IxOsBufLib.h b/drivers/net/npe/include/IxOsBufLib.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxOsBufLib.h rename to drivers/net/npe/include/IxOsBufLib.h diff --git a/arch/arm/cpu/ixp/npe/include/IxOsBuffMgt.h b/drivers/net/npe/include/IxOsBuffMgt.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxOsBuffMgt.h rename to drivers/net/npe/include/IxOsBuffMgt.h diff --git a/arch/arm/cpu/ixp/npe/include/IxOsBuffPoolMgt.h b/drivers/net/npe/include/IxOsBuffPoolMgt.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxOsBuffPoolMgt.h rename to drivers/net/npe/include/IxOsBuffPoolMgt.h diff --git a/arch/arm/cpu/ixp/npe/include/IxOsCacheMMU.h b/drivers/net/npe/include/IxOsCacheMMU.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxOsCacheMMU.h rename to drivers/net/npe/include/IxOsCacheMMU.h diff --git a/arch/arm/cpu/ixp/npe/include/IxOsPrintf.h b/drivers/net/npe/include/IxOsPrintf.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxOsPrintf.h rename to drivers/net/npe/include/IxOsPrintf.h diff --git a/arch/arm/cpu/ixp/npe/include/IxOsServices.h b/drivers/net/npe/include/IxOsServices.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxOsServices.h rename to drivers/net/npe/include/IxOsServices.h diff --git a/arch/arm/cpu/ixp/npe/include/IxOsServicesComponents.h b/drivers/net/npe/include/IxOsServicesComponents.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxOsServicesComponents.h rename to drivers/net/npe/include/IxOsServicesComponents.h diff --git a/arch/arm/cpu/ixp/npe/include/IxOsServicesEndianess.h b/drivers/net/npe/include/IxOsServicesEndianess.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxOsServicesEndianess.h rename to drivers/net/npe/include/IxOsServicesEndianess.h diff --git a/arch/arm/cpu/ixp/npe/include/IxOsServicesMemAccess.h b/drivers/net/npe/include/IxOsServicesMemAccess.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxOsServicesMemAccess.h rename to drivers/net/npe/include/IxOsServicesMemAccess.h diff --git a/arch/arm/cpu/ixp/npe/include/IxOsServicesMemMap.h b/drivers/net/npe/include/IxOsServicesMemMap.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxOsServicesMemMap.h rename to drivers/net/npe/include/IxOsServicesMemMap.h diff --git a/arch/arm/cpu/ixp/npe/include/IxOsal.h b/drivers/net/npe/include/IxOsal.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxOsal.h rename to drivers/net/npe/include/IxOsal.h diff --git a/arch/arm/cpu/ixp/npe/include/IxOsalAssert.h b/drivers/net/npe/include/IxOsalAssert.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxOsalAssert.h rename to drivers/net/npe/include/IxOsalAssert.h diff --git a/arch/arm/cpu/ixp/npe/include/IxOsalBackward.h b/drivers/net/npe/include/IxOsalBackward.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxOsalBackward.h rename to drivers/net/npe/include/IxOsalBackward.h diff --git a/arch/arm/cpu/ixp/npe/include/IxOsalBackwardAssert.h b/drivers/net/npe/include/IxOsalBackwardAssert.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxOsalBackwardAssert.h rename to drivers/net/npe/include/IxOsalBackwardAssert.h diff --git a/arch/arm/cpu/ixp/npe/include/IxOsalBackwardBufferMgt.h b/drivers/net/npe/include/IxOsalBackwardBufferMgt.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxOsalBackwardBufferMgt.h rename to drivers/net/npe/include/IxOsalBackwardBufferMgt.h diff --git a/arch/arm/cpu/ixp/npe/include/IxOsalBackwardCacheMMU.h b/drivers/net/npe/include/IxOsalBackwardCacheMMU.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxOsalBackwardCacheMMU.h rename to drivers/net/npe/include/IxOsalBackwardCacheMMU.h diff --git a/arch/arm/cpu/ixp/npe/include/IxOsalBackwardMemMap.h b/drivers/net/npe/include/IxOsalBackwardMemMap.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxOsalBackwardMemMap.h rename to drivers/net/npe/include/IxOsalBackwardMemMap.h diff --git a/arch/arm/cpu/ixp/npe/include/IxOsalBackwardOsServices.h b/drivers/net/npe/include/IxOsalBackwardOsServices.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxOsalBackwardOsServices.h rename to drivers/net/npe/include/IxOsalBackwardOsServices.h diff --git a/arch/arm/cpu/ixp/npe/include/IxOsalBackwardOssl.h b/drivers/net/npe/include/IxOsalBackwardOssl.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxOsalBackwardOssl.h rename to drivers/net/npe/include/IxOsalBackwardOssl.h diff --git a/arch/arm/cpu/ixp/npe/include/IxOsalBufferMgt.h b/drivers/net/npe/include/IxOsalBufferMgt.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxOsalBufferMgt.h rename to drivers/net/npe/include/IxOsalBufferMgt.h diff --git a/arch/arm/cpu/ixp/npe/include/IxOsalBufferMgtDefault.h b/drivers/net/npe/include/IxOsalBufferMgtDefault.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxOsalBufferMgtDefault.h rename to drivers/net/npe/include/IxOsalBufferMgtDefault.h diff --git a/arch/arm/cpu/ixp/npe/include/IxOsalConfig.h b/drivers/net/npe/include/IxOsalConfig.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxOsalConfig.h rename to drivers/net/npe/include/IxOsalConfig.h diff --git a/arch/arm/cpu/ixp/npe/include/IxOsalEndianess.h b/drivers/net/npe/include/IxOsalEndianess.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxOsalEndianess.h rename to drivers/net/npe/include/IxOsalEndianess.h diff --git a/arch/arm/cpu/ixp/npe/include/IxOsalIoMem.h b/drivers/net/npe/include/IxOsalIoMem.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxOsalIoMem.h rename to drivers/net/npe/include/IxOsalIoMem.h diff --git a/arch/arm/cpu/ixp/npe/include/IxOsalMemAccess.h b/drivers/net/npe/include/IxOsalMemAccess.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxOsalMemAccess.h rename to drivers/net/npe/include/IxOsalMemAccess.h diff --git a/arch/arm/cpu/ixp/npe/include/IxOsalOem.h b/drivers/net/npe/include/IxOsalOem.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxOsalOem.h rename to drivers/net/npe/include/IxOsalOem.h diff --git a/arch/arm/cpu/ixp/npe/include/IxOsalOs.h b/drivers/net/npe/include/IxOsalOs.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxOsalOs.h rename to drivers/net/npe/include/IxOsalOs.h diff --git a/arch/arm/cpu/ixp/npe/include/IxOsalOsAssert.h b/drivers/net/npe/include/IxOsalOsAssert.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxOsalOsAssert.h rename to drivers/net/npe/include/IxOsalOsAssert.h diff --git a/arch/arm/cpu/ixp/npe/include/IxOsalOsBufferMgt.h b/drivers/net/npe/include/IxOsalOsBufferMgt.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxOsalOsBufferMgt.h rename to drivers/net/npe/include/IxOsalOsBufferMgt.h diff --git a/arch/arm/cpu/ixp/npe/include/IxOsalOsIxp400.h b/drivers/net/npe/include/IxOsalOsIxp400.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxOsalOsIxp400.h rename to drivers/net/npe/include/IxOsalOsIxp400.h diff --git a/arch/arm/cpu/ixp/npe/include/IxOsalOsIxp400CustomizedMapping.h b/drivers/net/npe/include/IxOsalOsIxp400CustomizedMapping.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxOsalOsIxp400CustomizedMapping.h rename to drivers/net/npe/include/IxOsalOsIxp400CustomizedMapping.h diff --git a/arch/arm/cpu/ixp/npe/include/IxOsalOsTypes.h b/drivers/net/npe/include/IxOsalOsTypes.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxOsalOsTypes.h rename to drivers/net/npe/include/IxOsalOsTypes.h diff --git a/arch/arm/cpu/ixp/npe/include/IxOsalOsUtilitySymbols.h b/drivers/net/npe/include/IxOsalOsUtilitySymbols.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxOsalOsUtilitySymbols.h rename to drivers/net/npe/include/IxOsalOsUtilitySymbols.h diff --git a/arch/arm/cpu/ixp/npe/include/IxOsalTypes.h b/drivers/net/npe/include/IxOsalTypes.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxOsalTypes.h rename to drivers/net/npe/include/IxOsalTypes.h diff --git a/arch/arm/cpu/ixp/npe/include/IxOsalUtilitySymbols.h b/drivers/net/npe/include/IxOsalUtilitySymbols.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxOsalUtilitySymbols.h rename to drivers/net/npe/include/IxOsalUtilitySymbols.h diff --git a/arch/arm/cpu/ixp/npe/include/IxParityENAcc.h b/drivers/net/npe/include/IxParityENAcc.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxParityENAcc.h rename to drivers/net/npe/include/IxParityENAcc.h diff --git a/arch/arm/cpu/ixp/npe/include/IxPerfProfAcc.h b/drivers/net/npe/include/IxPerfProfAcc.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxPerfProfAcc.h rename to drivers/net/npe/include/IxPerfProfAcc.h diff --git a/arch/arm/cpu/ixp/npe/include/IxQMgr.h b/drivers/net/npe/include/IxQMgr.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxQMgr.h rename to drivers/net/npe/include/IxQMgr.h diff --git a/arch/arm/cpu/ixp/npe/include/IxQMgrAqmIf_p.h b/drivers/net/npe/include/IxQMgrAqmIf_p.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxQMgrAqmIf_p.h rename to drivers/net/npe/include/IxQMgrAqmIf_p.h diff --git a/arch/arm/cpu/ixp/npe/include/IxQMgrDefines_p.h b/drivers/net/npe/include/IxQMgrDefines_p.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxQMgrDefines_p.h rename to drivers/net/npe/include/IxQMgrDefines_p.h diff --git a/arch/arm/cpu/ixp/npe/include/IxQMgrDispatcher_p.h b/drivers/net/npe/include/IxQMgrDispatcher_p.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxQMgrDispatcher_p.h rename to drivers/net/npe/include/IxQMgrDispatcher_p.h diff --git a/arch/arm/cpu/ixp/npe/include/IxQMgrLog_p.h b/drivers/net/npe/include/IxQMgrLog_p.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxQMgrLog_p.h rename to drivers/net/npe/include/IxQMgrLog_p.h diff --git a/arch/arm/cpu/ixp/npe/include/IxQMgrQAccess_p.h b/drivers/net/npe/include/IxQMgrQAccess_p.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxQMgrQAccess_p.h rename to drivers/net/npe/include/IxQMgrQAccess_p.h diff --git a/arch/arm/cpu/ixp/npe/include/IxQMgrQCfg_p.h b/drivers/net/npe/include/IxQMgrQCfg_p.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxQMgrQCfg_p.h rename to drivers/net/npe/include/IxQMgrQCfg_p.h diff --git a/arch/arm/cpu/ixp/npe/include/IxQueueAssignments.h b/drivers/net/npe/include/IxQueueAssignments.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxQueueAssignments.h rename to drivers/net/npe/include/IxQueueAssignments.h diff --git a/arch/arm/cpu/ixp/npe/include/IxSspAcc.h b/drivers/net/npe/include/IxSspAcc.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxSspAcc.h rename to drivers/net/npe/include/IxSspAcc.h diff --git a/arch/arm/cpu/ixp/npe/include/IxTimeSyncAcc.h b/drivers/net/npe/include/IxTimeSyncAcc.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxTimeSyncAcc.h rename to drivers/net/npe/include/IxTimeSyncAcc.h diff --git a/arch/arm/cpu/ixp/npe/include/IxTimerCtrl.h b/drivers/net/npe/include/IxTimerCtrl.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxTimerCtrl.h rename to drivers/net/npe/include/IxTimerCtrl.h diff --git a/arch/arm/cpu/ixp/npe/include/IxTypes.h b/drivers/net/npe/include/IxTypes.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxTypes.h rename to drivers/net/npe/include/IxTypes.h diff --git a/arch/arm/cpu/ixp/npe/include/IxUART.h b/drivers/net/npe/include/IxUART.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxUART.h rename to drivers/net/npe/include/IxUART.h diff --git a/arch/arm/cpu/ixp/npe/include/IxVersionId.h b/drivers/net/npe/include/IxVersionId.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/IxVersionId.h rename to drivers/net/npe/include/IxVersionId.h diff --git a/arch/arm/cpu/ixp/npe/include/ix_error.h b/drivers/net/npe/include/ix_error.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/ix_error.h rename to drivers/net/npe/include/ix_error.h diff --git a/arch/arm/cpu/ixp/npe/include/ix_macros.h b/drivers/net/npe/include/ix_macros.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/ix_macros.h rename to drivers/net/npe/include/ix_macros.h diff --git a/arch/arm/cpu/ixp/npe/include/ix_os_type.h b/drivers/net/npe/include/ix_os_type.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/ix_os_type.h rename to drivers/net/npe/include/ix_os_type.h diff --git a/arch/arm/cpu/ixp/npe/include/ix_ossl.h b/drivers/net/npe/include/ix_ossl.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/ix_ossl.h rename to drivers/net/npe/include/ix_ossl.h diff --git a/arch/arm/cpu/ixp/npe/include/ix_symbols.h b/drivers/net/npe/include/ix_symbols.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/ix_symbols.h rename to drivers/net/npe/include/ix_symbols.h diff --git a/arch/arm/cpu/ixp/npe/include/ix_types.h b/drivers/net/npe/include/ix_types.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/ix_types.h rename to drivers/net/npe/include/ix_types.h diff --git a/arch/arm/cpu/ixp/npe/include/npe.h b/drivers/net/npe/include/npe.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/npe.h rename to drivers/net/npe/include/npe.h diff --git a/arch/arm/cpu/ixp/npe/include/os_datatypes.h b/drivers/net/npe/include/os_datatypes.h similarity index 100% rename from arch/arm/cpu/ixp/npe/include/os_datatypes.h rename to drivers/net/npe/include/os_datatypes.h diff --git a/arch/arm/cpu/ixp/npe/miiphy.c b/drivers/net/npe/miiphy.c similarity index 100% rename from arch/arm/cpu/ixp/npe/miiphy.c rename to drivers/net/npe/miiphy.c diff --git a/arch/arm/cpu/ixp/npe/npe.c b/drivers/net/npe/npe.c similarity index 100% rename from arch/arm/cpu/ixp/npe/npe.c rename to drivers/net/npe/npe.c From 7fd70820248b17aa8b574c2823f73d538c31958f Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Thu, 28 Jun 2012 21:37:57 +0000 Subject: [PATCH 05/27] net: emaclite: Support OF initialization Support new CONFIG_OF_CONTROL option where device probing is done based on device tree description. Signed-off-by: Michal Simek CC: Joe Hershberger --- drivers/net/xilinx_emaclite.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/drivers/net/xilinx_emaclite.c b/drivers/net/xilinx_emaclite.c index d5bd737827..d890d60453 100644 --- a/drivers/net/xilinx_emaclite.c +++ b/drivers/net/xilinx_emaclite.c @@ -28,6 +28,9 @@ #include #include #include +#include + +DECLARE_GLOBAL_DATA_PTR; #undef DEBUG @@ -375,3 +378,30 @@ int xilinx_emaclite_initialize(bd_t *bis, unsigned long base_addr, return 1; } + +#ifdef CONFIG_OF_CONTROL +int xilinx_emaclite_init(bd_t *bis) +{ + int offset = 0; + u32 ret = 0; + u32 reg; + + do { + offset = fdt_node_offset_by_compatible(gd->fdt_blob, offset, + "xlnx,xps-ethernetlite-1.00.a"); + if (offset != -1) { + reg = fdtdec_get_addr(gd->fdt_blob, offset, "reg"); + if (reg != FDT_ADDR_T_NONE) { + u32 rxpp = fdtdec_get_int(gd->fdt_blob, offset, + "xlnx,rx-ping-pong", 0); + u32 txpp = fdtdec_get_int(gd->fdt_blob, offset, + "xlnx,tx-ping-pong", 0); + ret |= xilinx_emaclite_initialize(bis, reg, + txpp, rxpp); + } + } + } while (offset != -1); + + return ret; +} +#endif From 905b3b00a177a22944ee4b9e505e9395f23e58ed Mon Sep 17 00:00:00 2001 From: Marek Vasut Date: Fri, 27 Jul 2012 09:50:07 +0000 Subject: [PATCH 06/27] dm: net: Fixup the armada100 FEC driver MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Apply the following questionable adjustment to silence GCC. armada100_fec.c: In function ‘armdfec_send’: armada100_fec.c:589:2: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] Signed-off-by: Marek Vasut Cc: Joe Hershberger Acked-by: Prafulla Wadaskar --- drivers/net/armada100_fec.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/net/armada100_fec.c b/drivers/net/armada100_fec.c index d318a36398..ed7cf20324 100644 --- a/drivers/net/armada100_fec.c +++ b/drivers/net/armada100_fec.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; void *p = (void *)dataptr; int retry = PHY_WAIT_ITERATIONS * PHY_WAIT_MICRO_SECONDS; - u32 cmd_sts; + u32 cmd_sts, temp; /* Copy buffer if it's misaligned */ 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; /* 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); /* From dcd5a593f59b58da4875e3e78d7c74501bc319c4 Mon Sep 17 00:00:00 2001 From: Nobuhiro Iwamatsu Date: Thu, 2 Aug 2012 22:08:40 +0000 Subject: [PATCH 07/27] net: sh_eth: Add support R8A7740 of rmobile (arm core) R8A7740 of rmobile has ethernet device, and this is same IP of sh-ether. This support R8A7740 of rmobile. Signed-off-by: Hideyuki Sano Signed-off-by: Nobuhiro Iwamatsu --- drivers/net/sh_eth.c | 2 +- drivers/net/sh_eth.h | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/drivers/net/sh_eth.c b/drivers/net/sh_eth.c index 09af8606db..2d9cc328b5 100644 --- a/drivers/net/sh_eth.c +++ b/drivers/net/sh_eth.c @@ -394,7 +394,7 @@ static int sh_eth_config(struct sh_eth_dev *eth, bd_t *bd) sh_eth_write(eth, TPAUSER_TPAUSE, TPAUSER); #endif -#if defined(CONFIG_CPU_SH7734) +#if defined(CONFIG_CPU_SH7734) || defined(CONFIG_R8A7740) sh_eth_write(eth, CONFIG_SH_ETHER_SH7734_MII, RMII_MII); #endif /* Configure phy */ diff --git a/drivers/net/sh_eth.h b/drivers/net/sh_eth.h index 3703c55a74..61d2df9063 100644 --- a/drivers/net/sh_eth.h +++ b/drivers/net/sh_eth.h @@ -1,8 +1,8 @@ /* * sh_eth.h - Driver for Renesas SuperH ethernet controler. * - * Copyright (C) 2008, 2011 Renesas Solutions Corp. - * Copyright (c) 2008, 2011 Nobuhiro Iwamatsu + * Copyright (C) 2008 - 2012 Renesas Solutions Corp. + * Copyright (c) 2008 - 2012 Nobuhiro Iwamatsu * Copyright (c) 2007 Carlos Munoz * * This program is free software; you can redistribute it and/or modify @@ -25,6 +25,7 @@ #define SHETHER_NAME "sh_eth" +#if defined(CONFIG_SH) /* Malloc returns addresses in the P1 area (cacheable). However we need to use area P2 (non-cacheable) */ #define ADDR_TO_P2(addr) ((((int)(addr) & ~0xe0000000) | 0xa0000000)) @@ -35,6 +36,12 @@ #else #define ADDR_TO_PHY(addr) ((int)(addr) & ~0xe0000000) #endif +#elif defined(CONFIG_ARM) +#define inl readl +#define outl writel +#define ADDR_TO_PHY(addr) ((int)(addr)) +#define ADDR_TO_P2(addr) (addr) +#endif /* defined(CONFIG_SH) */ /* Number of supported ports */ #define MAX_PORT_NUM 2 @@ -292,6 +299,9 @@ static const u16 sh_eth_offset_fast_sh4[SH_ETH_MAX_REGISTER_OFFSET] = { #elif defined(CONFIG_CPU_SH7724) #define SH_ETH_TYPE_ETHER #define BASE_IO_ADDR 0xA4600000 +#elif defined(CONFIG_R8A7740) +#define SH_ETH_TYPE_GETHER +#define BASE_IO_ADDR 0xE9A00000 #endif /* From 2c8fe5120f8da013cbd789be2f10cce880972836 Mon Sep 17 00:00:00 2001 From: Joe Hershberger Date: Tue, 31 Jul 2012 06:09:17 +0000 Subject: [PATCH 08/27] net: Make the netconsole buffer size configurable Allow a board to configure a larger buffer for netconsole, but leave the default. Signed-off-by: Joe Hershberger Cc: Mike Frysinger Acked-by: Mike Frysinger --- doc/README.NetConsole | 2 ++ drivers/net/netconsole.c | 8 ++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/doc/README.NetConsole b/doc/README.NetConsole index 070e86a6f7..af7fc6043a 100644 --- a/doc/README.NetConsole +++ b/doc/README.NetConsole @@ -6,6 +6,8 @@ serial and network input/output devices by adjusting the 'stdin' and set either of these variables to "nc". Input and output can be switched independently. +CONFIG_NETCONSOLE_BUFFER_SIZE - Override the default buffer size + We use an environment variable 'ncip' to set the IP address and the port of the destination. The format is :. If is omitted, the value of 6666 is used. If the env var doesn't exist, the diff --git a/drivers/net/netconsole.c b/drivers/net/netconsole.c index 86f5301141..8fcf31c4e9 100644 --- a/drivers/net/netconsole.c +++ b/drivers/net/netconsole.c @@ -28,7 +28,11 @@ 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_offset; /* offset to valid chars in input buffer */ static int input_recursion; @@ -214,7 +218,7 @@ static void nc_puts(const char *s) len = strlen(s); while (len) { - int send_len = min(len, 512); + int send_len = min(len, sizeof(input_buffer)); nc_send_packet(s, send_len); len -= send_len; s += send_len; From f8be7d659c45720edb91503d2a480fc198e7ee9d Mon Sep 17 00:00:00 2001 From: Joe Hershberger Date: Fri, 3 Aug 2012 10:59:08 +0000 Subject: [PATCH 09/27] net: Improve the speed of netconsole Previously u-boot would initialize the network interface for every network operation and then shut it down again. This makes sense for most operations where the network in not known to be needed soon after the operation is complete. In the case of netconsole, it will use the network for every interaction with the shell or every printf. This means that the network is being reinitialized very often. On many devices, this intialization is very slow. This patch checks for consecutive netconsole actions and leaves the ethernet hardware initialized between them. It will still behave the same old way for all other network operations and any time another network operation happens between netconsole operations. Signed-off-by: Joe Hershberger Cc: Stefano Babic Acked-by: Stefano Babic --- common/cmd_bootm.c | 17 ++++++++++++++++ drivers/net/netconsole.c | 22 +++++++++++++++++---- include/net.h | 42 +++++++++++++++++++++++++++++++++++++++- net/eth.c | 8 ++------ net/net.c | 26 +++++++++++++++++++------ 5 files changed, 98 insertions(+), 17 deletions(-) diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c index 45e726af8b..83fa5d7bd8 100644 --- a/common/cmd_bootm.c +++ b/common/cmd_bootm.c @@ -564,6 +564,13 @@ int do_bootm_subcommand(cmd_tbl_t *cmdtp, int flag, int argc, break; case BOOTM_STATE_OS_GO: disable_interrupts(); +#ifdef CONFIG_NETCONSOLE + /* + * Stop the ethernet stack if NetConsole could have + * left it up + */ + eth_halt(); +#endif arch_preboot_os(); boot_fn(BOOTM_STATE_OS_GO, argc, argv, &images); break; @@ -622,6 +629,11 @@ int do_bootm(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) */ 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) /* * 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(); +#ifdef CONFIG_NETCONSOLE + /* Stop the ethernet stack if NetConsole could have left it up */ + eth_halt(); +#endif + #if defined(CONFIG_CMD_USB) /* * turn off USB to prevent the host controller from writing to the diff --git a/drivers/net/netconsole.c b/drivers/net/netconsole.c index 8fcf31c4e9..da82aa94ca 100644 --- a/drivers/net/netconsole.c +++ b/drivers/net/netconsole.c @@ -44,6 +44,11 @@ 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 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, IPaddr_t sip, unsigned src, @@ -136,8 +141,13 @@ static void nc_send_packet(const char *buf, int len) } if (eth->state != ETH_STATE_ACTIVE) { - if (eth_init(gd->bd) < 0) - return; + if (eth_is_on_demand_init()) { + if (eth_init(gd->bd) < 0) + return; + eth_set_last_protocol(NETCONS); + } else + eth_init_state_only(gd->bd); + inited = 1; } pkt = (uchar *)NetTxPacket + NetEthHdrSize() + IP_UDP_HDR_SIZE; @@ -146,8 +156,12 @@ static void nc_send_packet(const char *buf, int len) ip = nc_ip; NetSendUDPPacket(ether, ip, nc_out_port, nc_in_port, len); - if (inited) - eth_halt(); + if (inited) { + if (eth_is_on_demand_init()) + eth_halt(); + else + eth_halt_state_only(); + } } static int nc_start(void) diff --git a/include/net.h b/include/net.h index 6d2d6cd849..e193b7b60b 100644 --- a/include/net.h +++ b/include/net.h @@ -102,7 +102,14 @@ extern int eth_register(struct eth_device* dev);/* Register network device */ extern int eth_unregister(struct eth_device *dev);/* Remove network device */ extern void eth_try_another(int first_restart); /* Change the device */ extern void eth_set_current(void); /* set nterface to ethcur var */ -extern struct eth_device *eth_get_dev(void); /* get the current device MAC */ +/* get the current device MAC */ +static inline __attribute__((always_inline)) +struct eth_device *eth_get_dev(void) +{ + extern struct eth_device *eth_current; + + return eth_current; +} extern struct eth_device *eth_get_dev_by_name(const char *devname); extern struct eth_device *eth_get_dev_by_index(int index); /* get dev @ index */ extern int eth_get_dev_index(void); /* get the device index */ @@ -151,6 +158,19 @@ extern int eth_rx(void); /* Check for received packets */ extern void eth_halt(void); /* stop SCC */ extern char *eth_get_name(void); /* get name of current device */ +/* Set active state */ +static inline __attribute__((always_inline)) int eth_init_state_only(bd_t *bis) +{ + eth_get_dev()->state = ETH_STATE_ACTIVE; + + return 0; +} +/* Set passive state */ +static inline __attribute__((always_inline)) void eth_halt_state_only(void) +{ + eth_get_dev()->state = ETH_STATE_PASSIVE; +} + /* * Set the hardware address for an ethernet interface based on 'eth%daddr' * environment variable (or just 'ethaddr' if eth_number is 0). @@ -532,6 +552,26 @@ void NcStart(void); int nc_input_packet(uchar *pkt, unsigned dest, unsigned src, unsigned len); #endif +static inline __attribute__((always_inline)) int eth_is_on_demand_init(void) +{ +#ifdef CONFIG_NETCONSOLE + extern enum proto_t net_loop_last_protocol; + + return net_loop_last_protocol != NETCONS; +#else + return 1; +#endif +} + +static inline void eth_set_last_protocol(int protocol) +{ +#ifdef CONFIG_NETCONSOLE + extern enum proto_t net_loop_last_protocol; + + net_loop_last_protocol = protocol; +#endif +} + /* * Check if autoload is enabled. If so, use either NFS or TFTP to download * the boot file. diff --git a/net/eth.c b/net/eth.c index bb4d95be8e..49458c8db9 100644 --- a/net/eth.c +++ b/net/eth.c @@ -121,12 +121,8 @@ static struct { static unsigned int eth_rcv_current, eth_rcv_last; #endif -static struct eth_device *eth_devices, *eth_current; - -struct eth_device *eth_get_dev(void) -{ - return eth_current; -} +static struct eth_device *eth_devices; +struct eth_device *eth_current; struct eth_device *eth_get_dev_by_name(const char *devname) { diff --git a/net/net.c b/net/net.c index f4404342f7..a89946ebe0 100644 --- a/net/net.c +++ b/net/net.c @@ -315,12 +315,15 @@ int NetLoop(enum proto_t protocol) bootstage_mark_name(BOOTSTAGE_ID_ETH_START, "eth_start"); net_init(); - eth_halt(); - eth_set_current(); - if (eth_init(bd) < 0) { + if (eth_is_on_demand_init() || protocol != NETCONS) { eth_halt(); - return -1; - } + eth_set_current(); + if (eth_init(bd) < 0) { + eth_halt(); + return -1; + } + } else + eth_init_state_only(bd); restart: net_set_state(NETLOOP_CONTINUE); @@ -460,6 +463,9 @@ restart: net_cleanup_loop(); eth_halt(); + /* Invalidate the last protocol */ + eth_set_last_protocol(BOOTP); + puts("\nAbort\n"); /* include a debug print as well incase the debug messages are directed to stderr */ @@ -517,13 +523,21 @@ restart: sprintf(buf, "%lX", (unsigned long)load_addr); setenv("fileaddr", buf); } - eth_halt(); + if (protocol != NETCONS) + eth_halt(); + else + eth_halt_state_only(); + + eth_set_last_protocol(protocol); + ret = NetBootFileXferSize; debug_cond(DEBUG_INT_STATE, "--- NetLoop Success!\n"); goto done; case NETLOOP_FAIL: net_cleanup_loop(); + /* Invalidate the last protocol */ + eth_set_last_protocol(BOOTP); debug_cond(DEBUG_INT_STATE, "--- NetLoop Fail!\n"); goto done; From e827fec2b24d4412eabed3cf0080a08a0a7d148c Mon Sep 17 00:00:00 2001 From: Joe Hershberger Date: Tue, 18 Sep 2012 10:01:31 +0000 Subject: [PATCH 10/27] net: Allow netconsole settings to change after nc_start Refresh the netconsole settings from the env before each packet instead of only on netconsole init. Signed-off-by: Joe Hershberger --- drivers/net/netconsole.c | 96 +++++++++++++++++++++++++++------------- 1 file changed, 65 insertions(+), 31 deletions(-) diff --git a/drivers/net/netconsole.c b/drivers/net/netconsole.c index da82aa94ca..63ce73c818 100644 --- a/drivers/net/netconsole.c +++ b/drivers/net/netconsole.c @@ -69,8 +69,69 @@ static void nc_timeout(void) 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) { + refresh_settings_from_env(); if (!output_packet_len || memcmp(nc_ether, NetEtherNullAddr, 6)) { /* going to check for input packet */ net_set_udp_handler(nc_handler); @@ -166,41 +227,14 @@ static void nc_send_packet(const char *buf, int len) static int nc_start(void) { - int netmask, our_ip; - char *p; + int retval; nc_out_port = 6666; /* default port */ nc_in_port = nc_out_port; - 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); - - 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 */ + retval = refresh_settings_from_env(); + if (retval != 0) + return retval; /* * Initialize the static IP settings and buffer pointers From 8a0eccb1056b313b45ab62e3aac400f339aa71b4 Mon Sep 17 00:00:00 2001 From: Joe Hershberger Date: Tue, 18 Sep 2012 10:01:32 +0000 Subject: [PATCH 11/27] net: Filter incoming netconsole packets by IP Check the incoming packets' source IP address... if ncip isn't set to a broadcast address, only listen to the client at ncip. Signed-off-by: Joe Hershberger --- drivers/net/netconsole.c | 8 ++++++-- include/net.h | 3 ++- net/net.c | 1 + 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/drivers/net/netconsole.c b/drivers/net/netconsole.c index 63ce73c818..dd7032af56 100644 --- a/drivers/net/netconsole.c +++ b/drivers/net/netconsole.c @@ -147,13 +147,17 @@ void NcStart(void) } } -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; - if (dest != nc_in_port || !len) + if (dest_port != nc_in_port || !len) 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); if (input_size == sizeof(input_buffer)) diff --git a/include/net.h b/include/net.h index e193b7b60b..35393366d3 100644 --- a/include/net.h +++ b/include/net.h @@ -549,7 +549,8 @@ extern void NetReceive(uchar *, int); #ifdef CONFIG_NETCONSOLE void NcStart(void); -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); #endif static inline __attribute__((always_inline)) int eth_is_on_demand_init(void) diff --git a/net/net.c b/net/net.c index a89946ebe0..809fb14c79 100644 --- a/net/net.c +++ b/net/net.c @@ -1161,6 +1161,7 @@ NetReceive(uchar *inpkt, int len) #ifdef CONFIG_NETCONSOLE nc_input_packet((uchar *)ip + IP_UDP_HDR_SIZE, + ntohl(ip->ip_src), ntohs(ip->udp_dst), ntohs(ip->udp_src), ntohs(ip->udp_len) - UDP_HDR_SIZE); From e1dbdf9109a2739862ccd3c39be0b8ee37721cb6 Mon Sep 17 00:00:00 2001 From: Lucas Stach Date: Wed, 22 Aug 2012 11:04:57 +0000 Subject: [PATCH 12/27] net: introduce transparent driver private in ueth_data Avoid clutter in ueth_data. Individual drivers should not mess with structures belonging to the core like this. Signed-off-by: Lucas Stach Reviewed-by: Marek Vasut Acked-by: Marek Vasut Acked-by: Joe Hershberger --- drivers/usb/eth/smsc95xx.c | 49 +++++++++++++++++++++++++++----------- include/usb_ether.h | 8 ++----- 2 files changed, 37 insertions(+), 20 deletions(-) diff --git a/drivers/usb/eth/smsc95xx.c b/drivers/usb/eth/smsc95xx.c index c62a8c112e..dc5ca65463 100644 --- a/drivers/usb/eth/smsc95xx.c +++ b/drivers/usb/eth/smsc95xx.c @@ -25,6 +25,7 @@ #include #include #include "usb_ether.h" +#include /* SMSC LAN95xx based USB 2.0 Ethernet Devices */ @@ -146,6 +147,12 @@ /* local vars */ static int curr_eth_dev; /* index for name of next device detected */ +/* driver private */ +struct smsc95xx_private { + size_t rx_urb_size; /* maximum USB URB size */ + u32 mac_cr; /* MAC control register value */ + int have_hwaddr; /* 1 if we have a hardware MAC address */ +}; /* * Smsc95xx infrastructure commands @@ -377,6 +384,7 @@ static int smsc95xx_init_mac_address(struct eth_device *eth, static int smsc95xx_write_hwaddr(struct eth_device *eth) { struct ueth_data *dev = (struct ueth_data *)eth->priv; + struct smsc95xx_private *priv = dev->dev_priv; u32 addr_lo = __get_unaligned_le32(ð->enetaddr[0]); u32 addr_hi = __get_unaligned_le16(ð->enetaddr[4]); int ret; @@ -392,7 +400,7 @@ static int smsc95xx_write_hwaddr(struct eth_device *eth) return ret; debug("MAC %pM\n", eth->enetaddr); - dev->have_hwaddr = 1; + priv->have_hwaddr = 1; return 0; } @@ -425,19 +433,22 @@ static int smsc95xx_set_csums(struct ueth_data *dev, static void smsc95xx_set_multicast(struct ueth_data *dev) { + struct smsc95xx_private *priv = dev->dev_priv; + /* No multicast in u-boot */ - dev->mac_cr &= ~(MAC_CR_PRMS_ | MAC_CR_MCPAS_ | MAC_CR_HPFILT_); + priv->mac_cr &= ~(MAC_CR_PRMS_ | MAC_CR_MCPAS_ | MAC_CR_HPFILT_); } /* starts the TX path */ static void smsc95xx_start_tx_path(struct ueth_data *dev) { + struct smsc95xx_private *priv = dev->dev_priv; u32 reg_val; /* Enable Tx at MAC */ - dev->mac_cr |= MAC_CR_TXEN_; + priv->mac_cr |= MAC_CR_TXEN_; - smsc95xx_write_reg(dev, MAC_CR, dev->mac_cr); + smsc95xx_write_reg(dev, MAC_CR, priv->mac_cr); /* Enable Tx at SCSRs */ reg_val = TX_CFG_ON_; @@ -447,8 +458,10 @@ static void smsc95xx_start_tx_path(struct ueth_data *dev) /* Starts the Receive path */ static void smsc95xx_start_rx_path(struct ueth_data *dev) { - dev->mac_cr |= MAC_CR_RXEN_; - smsc95xx_write_reg(dev, MAC_CR, dev->mac_cr); + struct smsc95xx_private *priv = dev->dev_priv; + + priv->mac_cr |= MAC_CR_RXEN_; + smsc95xx_write_reg(dev, MAC_CR, priv->mac_cr); } /* @@ -462,6 +475,8 @@ static int smsc95xx_init(struct eth_device *eth, bd_t *bd) u32 burst_cap; int timeout; struct ueth_data *dev = (struct ueth_data *)eth->priv; + struct smsc95xx_private *priv = + (struct smsc95xx_private *)dev->dev_priv; #define TIMEOUT_RESOLUTION 50 /* ms */ int link_detected; @@ -504,9 +519,9 @@ static int smsc95xx_init(struct eth_device *eth, bd_t *bd) debug("timeout waiting for PHY Reset\n"); return -1; } - if (!dev->have_hwaddr && smsc95xx_init_mac_address(eth, dev) == 0) - dev->have_hwaddr = 1; - if (!dev->have_hwaddr) { + if (!priv->have_hwaddr && smsc95xx_init_mac_address(eth, dev) == 0) + priv->have_hwaddr = 1; + if (!priv->have_hwaddr) { puts("Error: SMSC95xx: No MAC address set - set usbethaddr\n"); return -1; } @@ -532,16 +547,16 @@ static int smsc95xx_init(struct eth_device *eth, bd_t *bd) #ifdef TURBO_MODE if (dev->pusb_dev->speed == USB_SPEED_HIGH) { burst_cap = DEFAULT_HS_BURST_CAP_SIZE / HS_USB_PKT_SIZE; - dev->rx_urb_size = DEFAULT_HS_BURST_CAP_SIZE; + priv->rx_urb_size = DEFAULT_HS_BURST_CAP_SIZE; } else { burst_cap = DEFAULT_FS_BURST_CAP_SIZE / FS_USB_PKT_SIZE; - dev->rx_urb_size = DEFAULT_FS_BURST_CAP_SIZE; + priv->rx_urb_size = DEFAULT_FS_BURST_CAP_SIZE; } #else burst_cap = 0; - dev->rx_urb_size = MAX_SINGLE_PACKET_SIZE; + priv->rx_urb_size = MAX_SINGLE_PACKET_SIZE; #endif - debug("rx_urb_size=%ld\n", (ulong)dev->rx_urb_size); + debug("rx_urb_size=%ld\n", (ulong)priv->rx_urb_size); ret = smsc95xx_write_reg(dev, BURST_CAP, burst_cap); if (ret < 0) @@ -606,7 +621,7 @@ static int smsc95xx_init(struct eth_device *eth, bd_t *bd) if (ret < 0) return ret; - ret = smsc95xx_read_reg(dev, MAC_CR, &dev->mac_cr); + ret = smsc95xx_read_reg(dev, MAC_CR, &priv->mac_cr); if (ret < 0) return ret; @@ -857,6 +872,12 @@ int smsc95xx_eth_probe(struct usb_device *dev, unsigned int ifnum, return 0; } dev->privptr = (void *)ss; + + /* alloc driver private */ + ss->dev_priv = calloc(1, sizeof(struct smsc95xx_private)); + if (!ss->dev_priv) + return 0; + return 1; } diff --git a/include/usb_ether.h b/include/usb_ether.h index a7fb26bf7c..7c7aecb305 100644 --- a/include/usb_ether.h +++ b/include/usb_ether.h @@ -50,12 +50,8 @@ struct ueth_data { unsigned char protocol; /* .............. */ unsigned char irqinterval; /* Intervall for IRQ Pipe */ - /* private fields for each driver can go here if needed */ -#ifdef CONFIG_USB_ETHER_SMSC95XX - size_t rx_urb_size; /* maximum USB URB size */ - u32 mac_cr; /* MAC control register value */ - int have_hwaddr; /* 1 if we have a hardware MAC address */ -#endif + /* driver private */ + void *dev_priv; }; /* From 5fae53d0f1554d35f159a386cd16edf94838279d Mon Sep 17 00:00:00 2001 From: Lucas Stach Date: Wed, 22 Aug 2012 11:04:58 +0000 Subject: [PATCH 13/27] net: asix: split out basic reset function The basic device reset ensures that the device is ready to service commands and does not need to get redone before each network operation. Split out the basic reset from asix_init() and instead call it from asix_eth_get_info(), so that it only gets called once. Signed-off-by: Lucas Stach Acked-by: Joe Hershberger --- drivers/usb/eth/asix.c | 44 +++++++++++++++++++++++++----------------- 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/drivers/usb/eth/asix.c b/drivers/usb/eth/asix.c index 8fb7fc8c90..50cbbbd09a 100644 --- a/drivers/usb/eth/asix.c +++ b/drivers/usb/eth/asix.c @@ -310,55 +310,60 @@ static int mii_nway_restart(struct ueth_data *dev) return r; } -/* - * Asix callbacks - */ -static int asix_init(struct eth_device *eth, bd_t *bd) +static int asix_basic_reset(struct ueth_data *dev) { int embd_phy; - ALLOC_CACHE_ALIGN_BUFFER(unsigned char, buf, ETH_ALEN); u16 rx_ctl; - struct ueth_data *dev = (struct ueth_data *)eth->priv; - int timeout = 0; -#define TIMEOUT_RESOLUTION 50 /* ms */ - int link_detected; - - debug("** %s()\n", __func__); if (asix_write_gpio(dev, AX_GPIO_RSE | AX_GPIO_GPO_2 | AX_GPIO_GPO2EN, 5) < 0) - goto out_err; + return -1; /* 0x10 is the phy id of the embedded 10/100 ethernet phy */ embd_phy = ((asix_get_phy_addr(dev) & 0x1f) == 0x10 ? 1 : 0); if (asix_write_cmd(dev, AX_CMD_SW_PHY_SELECT, embd_phy, 0, 0, NULL) < 0) { debug("Select PHY #1 failed\n"); - goto out_err; + return -1; } if (asix_sw_reset(dev, AX_SWRESET_IPPD | AX_SWRESET_PRL) < 0) - goto out_err; + return -1; if (asix_sw_reset(dev, AX_SWRESET_CLEAR) < 0) - goto out_err; + return -1; if (embd_phy) { if (asix_sw_reset(dev, AX_SWRESET_IPRL) < 0) - goto out_err; + return -1; } else { if (asix_sw_reset(dev, AX_SWRESET_PRTE) < 0) - goto out_err; + return -1; } rx_ctl = asix_read_rx_ctl(dev); debug("RX_CTL is 0x%04x after software reset\n", rx_ctl); if (asix_write_rx_ctl(dev, 0x0000) < 0) - goto out_err; + return -1; rx_ctl = asix_read_rx_ctl(dev); debug("RX_CTL is 0x%04x setting to 0x0000\n", rx_ctl); + return 0; +} + +/* + * Asix callbacks + */ +static int asix_init(struct eth_device *eth, bd_t *bd) +{ + struct ueth_data *dev = (struct ueth_data *)eth->priv; + int timeout = 0; +#define TIMEOUT_RESOLUTION 50 /* ms */ + int link_detected; + + debug("** %s()\n", __func__); + /* Get the MAC address */ if (asix_read_cmd(dev, AX_CMD_READ_NODE_ID, 0, 0, ETH_ALEN, buf) < 0) { @@ -635,5 +640,8 @@ int asix_eth_get_info(struct usb_device *dev, struct ueth_data *ss, eth->halt = asix_halt; eth->priv = ss; + if (asix_basic_reset(ss)) + return 0; + return 1; } From 58f8fab8a444424e9f0dcb8f6218350a736b5f62 Mon Sep 17 00:00:00 2001 From: Lucas Stach Date: Wed, 22 Aug 2012 11:04:59 +0000 Subject: [PATCH 14/27] net: asix: add write_hwaddr function All ASIX chipsets aside from AX88172 are able to set the MAC address on the hardware level. Add a function to expose this ability. To differentiate between chip types we now carry flags as driver private data. Also while touching the asix_dongles array constify this. Signed-off-by: Lucas Stach Acked-by: Joe Hershberger --- drivers/usb/eth/asix.c | 63 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 52 insertions(+), 11 deletions(-) diff --git a/drivers/usb/eth/asix.c b/drivers/usb/eth/asix.c index 50cbbbd09a..bbfa2d1d84 100644 --- a/drivers/usb/eth/asix.c +++ b/drivers/usb/eth/asix.c @@ -23,6 +23,7 @@ #include #include #include "usb_ether.h" +#include /* ASIX AX8817X based USB 2.0 Ethernet Devices */ @@ -35,6 +36,7 @@ #define AX_CMD_WRITE_RX_CTL 0x10 #define AX_CMD_WRITE_IPG0 0x12 #define AX_CMD_READ_NODE_ID 0x13 +#define AX_CMD_WRITE_NODE_ID 0x14 #define AX_CMD_READ_PHY_ID 0x19 #define AX_CMD_WRITE_MEDIUM_MODE 0x1b #define AX_CMD_WRITE_GPIOS 0x1f @@ -97,9 +99,19 @@ #define AX_RX_URB_SIZE 2048 #define PHY_CONNECT_TIMEOUT 5000 +/* asix_flags defines */ +#define FLAG_NONE 0 +#define FLAG_TYPE_AX88172 (1U << 0) +#define FLAG_TYPE_AX88772 (1U << 1) + /* local vars */ static int curr_eth_dev; /* index for name of next device detected */ +/* driver private */ +struct asix_private { + int flags; +}; + /* * Asix infrastructure commands */ @@ -284,6 +296,21 @@ static int asix_write_gpio(struct ueth_data *dev, u16 value, int sleep) return ret; } +static int asix_write_hwaddr(struct eth_device *eth) +{ + struct ueth_data *dev = (struct ueth_data *)eth->priv; + int ret; + ALLOC_CACHE_ALIGN_BUFFER(unsigned char, buf, ETH_ALEN); + + memcpy(buf, eth->enetaddr, ETH_ALEN); + + ret = asix_write_cmd(dev, AX_CMD_WRITE_NODE_ID, 0, 0, ETH_ALEN, buf); + if (ret < 0) + debug("Failed to set MAC address: %02x\n", ret); + + return ret; +} + /* * mii commands */ @@ -539,19 +566,22 @@ void asix_eth_before_probe(void) struct asix_dongle { unsigned short vendor; unsigned short product; + int flags; }; -static struct asix_dongle asix_dongles[] = { - { 0x05ac, 0x1402 }, /* Apple USB Ethernet Adapter */ - { 0x07d1, 0x3c05 }, /* D-Link DUB-E100 H/W Ver B1 */ - { 0x0b95, 0x772a }, /* Cables-to-Go USB Ethernet Adapter */ - { 0x0b95, 0x7720 }, /* Trendnet TU2-ET100 V3.0R */ - { 0x0b95, 0x1720 }, /* SMC */ - { 0x0db0, 0xa877 }, /* MSI - ASIX 88772a */ - { 0x13b1, 0x0018 }, /* Linksys 200M v2.1 */ - { 0x1557, 0x7720 }, /* 0Q0 cable ethernet */ - { 0x2001, 0x3c05 }, /* DLink DUB-E100 H/W Ver B1 Alternate */ - { 0x0000, 0x0000 } /* END - Do not remove */ +static const struct asix_dongle const asix_dongles[] = { + { 0x05ac, 0x1402, FLAG_TYPE_AX88772 }, /* Apple USB Ethernet Adapter */ + { 0x07d1, 0x3c05, FLAG_TYPE_AX88772 }, /* D-Link DUB-E100 H/W Ver B1 */ + /* Cables-to-Go USB Ethernet Adapter */ + { 0x0b95, 0x772a, FLAG_TYPE_AX88772 }, + { 0x0b95, 0x7720, FLAG_TYPE_AX88772 }, /* Trendnet TU2-ET100 V3.0R */ + { 0x0b95, 0x1720, FLAG_TYPE_AX88172 }, /* SMC */ + { 0x0db0, 0xa877, FLAG_TYPE_AX88772 }, /* MSI - ASIX 88772a */ + { 0x13b1, 0x0018, FLAG_TYPE_AX88172 }, /* Linksys 200M v2.1 */ + { 0x1557, 0x7720, FLAG_TYPE_AX88772 }, /* 0Q0 cable ethernet */ + /* DLink DUB-E100 H/W Ver B1 Alternate */ + { 0x2001, 0x3c05, FLAG_TYPE_AX88772 }, + { 0x0000, 0x0000, FLAG_NONE } /* END - Do not remove */ }; /* Probe to see if a new device is actually an asix device */ @@ -588,6 +618,13 @@ int asix_eth_probe(struct usb_device *dev, unsigned int ifnum, ss->subclass = iface_desc->bInterfaceSubClass; ss->protocol = iface_desc->bInterfaceProtocol; + /* alloc driver private */ + ss->dev_priv = calloc(1, sizeof(struct asix_private)); + if (!ss->dev_priv) + return 0; + + ((struct asix_private *)ss->dev_priv)->flags = asix_dongles[i].flags; + /* * We are expecting a minimum of 3 endpoints - in, out (bulk), and * int. We will ignore any others. @@ -629,6 +666,8 @@ int asix_eth_probe(struct usb_device *dev, unsigned int ifnum, int asix_eth_get_info(struct usb_device *dev, struct ueth_data *ss, struct eth_device *eth) { + struct asix_private *priv = (struct asix_private *)ss->dev_priv; + if (!eth) { debug("%s: missing parameter.\n", __func__); return 0; @@ -638,6 +677,8 @@ int asix_eth_get_info(struct usb_device *dev, struct ueth_data *ss, eth->send = asix_send; eth->recv = asix_recv; eth->halt = asix_halt; + if (!(priv->flags & FLAG_TYPE_AX88172)) + eth->write_hwaddr = asix_write_hwaddr; eth->priv = ss; if (asix_basic_reset(ss)) From 02c8d8cc6e52b29deabab179e365281131316cf1 Mon Sep 17 00:00:00 2001 From: Lucas Stach Date: Wed, 22 Aug 2012 11:05:00 +0000 Subject: [PATCH 15/27] net: asix: add read_mac function Initial device MAC should be read while getting info about the device, so it's wrong to only read it in asix_init(). Add a dedicated function to read the initial MAC, which is also able to handle devices that have their initial MAC stored in EEPROM. Call this function inasix_eth_get_info(). Signed-off-by: Lucas Stach Reviewed-by: Marek Vasut Acked-by: Marek Vasut Acked-by: Joe Hershberger --- drivers/usb/eth/asix.c | 47 +++++++++++++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 12 deletions(-) diff --git a/drivers/usb/eth/asix.c b/drivers/usb/eth/asix.c index bbfa2d1d84..604d720ea5 100644 --- a/drivers/usb/eth/asix.c +++ b/drivers/usb/eth/asix.c @@ -32,6 +32,7 @@ #define AX_CMD_READ_MII_REG 0x07 #define AX_CMD_WRITE_MII_REG 0x08 #define AX_CMD_SET_HW_MII 0x0a +#define AX_CMD_READ_EEPROM 0x0b #define AX_CMD_READ_RX_CTL 0x0f #define AX_CMD_WRITE_RX_CTL 0x10 #define AX_CMD_WRITE_IPG0 0x12 @@ -103,6 +104,7 @@ #define FLAG_NONE 0 #define FLAG_TYPE_AX88172 (1U << 0) #define FLAG_TYPE_AX88772 (1U << 1) +#define FLAG_EEPROM_MAC (1U << 2) /* initial mac address in eeprom */ /* local vars */ static int curr_eth_dev; /* index for name of next device detected */ @@ -337,6 +339,34 @@ static int mii_nway_restart(struct ueth_data *dev) return r; } +static int asix_read_mac(struct eth_device *eth) +{ + struct ueth_data *dev = (struct ueth_data *)eth->priv; + struct asix_private *priv = (struct asix_private *)dev->dev_priv; + int i; + ALLOC_CACHE_ALIGN_BUFFER(unsigned char, buf, ETH_ALEN); + + if (priv->flags & FLAG_EEPROM_MAC) { + for (i = 0; i < (ETH_ALEN >> 1); i++) { + if (asix_read_cmd(dev, AX_CMD_READ_EEPROM, + 0x04 + i, 0, 2, buf) < 0) { + debug("Failed to read SROM address 04h.\n"); + return -1; + } + memcpy((eth->enetaddr + i * 2), buf, 2); + } + } else { + if (asix_read_cmd(dev, AX_CMD_READ_NODE_ID, 0, 0, ETH_ALEN, buf) + < 0) { + debug("Failed to read MAC address.\n"); + return -1; + } + memcpy(eth->enetaddr, buf, ETH_ALEN); + } + + return 0; +} + static int asix_basic_reset(struct ueth_data *dev) { int embd_phy; @@ -391,18 +421,6 @@ static int asix_init(struct eth_device *eth, bd_t *bd) debug("** %s()\n", __func__); - /* Get the MAC address */ - if (asix_read_cmd(dev, AX_CMD_READ_NODE_ID, - 0, 0, ETH_ALEN, buf) < 0) { - debug("Failed to read MAC address.\n"); - goto out_err; - } - memcpy(eth->enetaddr, buf, ETH_ALEN); - debug("MAC %02x:%02x:%02x:%02x:%02x:%02x\n", - eth->enetaddr[0], eth->enetaddr[1], - eth->enetaddr[2], eth->enetaddr[3], - eth->enetaddr[4], eth->enetaddr[5]); - dev->phy_id = asix_get_phy_addr(dev); if (dev->phy_id < 0) debug("Failed to read phy id\n"); @@ -684,5 +702,10 @@ int asix_eth_get_info(struct usb_device *dev, struct ueth_data *ss, if (asix_basic_reset(ss)) return 0; + /* Get the MAC address */ + if (asix_read_mac(eth)) + return 0; + debug("MAC %pM\n", eth->enetaddr); + return 1; } From 1dff9d0f54a0cec2dfda6022862bbdc38ba97d77 Mon Sep 17 00:00:00 2001 From: Lucas Stach Date: Wed, 22 Aug 2012 11:05:01 +0000 Subject: [PATCH 16/27] net: asix: add AX88772B support Add AX88772B ID together with two fixes needed to make this work. 1. The packet length check has to be adjusted, as all ASIX chips only use 11 bits to indicate the length. AX88772B uses the other bits to indicate unrelated things, which cause the check to fail. This fix is based on a fix for the Linux kernel by Marek Vasut. Linux upstream commit: bca0beb9363f8487ac902931a50eb00180a2d14a 2. AX88772B provides several bulk endpoints. Only the first IN/OUT endpoints work in the default configuration. So stop enumeration after we found them to avoid overwriting the endpoint config with a non-working one. Signed-off-by: Lucas Stach Reviewed-by: Marek Vasut Acked-by: Marek Vasut Acked-by: Joe Hershberger --- drivers/usb/eth/asix.c | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/drivers/usb/eth/asix.c b/drivers/usb/eth/asix.c index 604d720ea5..75ec8f7881 100644 --- a/drivers/usb/eth/asix.c +++ b/drivers/usb/eth/asix.c @@ -104,7 +104,8 @@ #define FLAG_NONE 0 #define FLAG_TYPE_AX88172 (1U << 0) #define FLAG_TYPE_AX88772 (1U << 1) -#define FLAG_EEPROM_MAC (1U << 2) /* initial mac address in eeprom */ +#define FLAG_TYPE_AX88772B (1U << 2) +#define FLAG_EEPROM_MAC (1U << 3) /* initial mac address in eeprom */ /* local vars */ static int curr_eth_dev; /* index for name of next device detected */ @@ -543,13 +544,13 @@ static int asix_recv(struct eth_device *eth) } memcpy(&packet_len, buf_ptr, sizeof(packet_len)); le32_to_cpus(&packet_len); - if (((packet_len >> 16) ^ 0xffff) != (packet_len & 0xffff)) { + if (((~packet_len >> 16) & 0x7ff) != (packet_len & 0x7ff)) { debug("Rx: malformed packet length: %#x (%#x:%#x)\n", - packet_len, (packet_len >> 16) ^ 0xffff, - packet_len & 0xffff); + packet_len, (~packet_len >> 16) & 0x7ff, + packet_len & 0x7ff); return -1; } - packet_len = packet_len & 0xffff; + packet_len = packet_len & 0x7ff; if (packet_len > actual_len - sizeof(packet_len)) { debug("Rx: too large packet: %d\n", packet_len); return -1; @@ -599,6 +600,8 @@ static const struct asix_dongle const asix_dongles[] = { { 0x1557, 0x7720, FLAG_TYPE_AX88772 }, /* 0Q0 cable ethernet */ /* DLink DUB-E100 H/W Ver B1 Alternate */ { 0x2001, 0x3c05, FLAG_TYPE_AX88772 }, + /* ASIX 88772B */ + { 0x0b95, 0x772b, FLAG_TYPE_AX88772B | FLAG_EEPROM_MAC }, { 0x0000, 0x0000, FLAG_NONE } /* END - Do not remove */ }; @@ -608,6 +611,7 @@ int asix_eth_probe(struct usb_device *dev, unsigned int ifnum, { struct usb_interface *iface; struct usb_interface_descriptor *iface_desc; + int ep_in_found = 0, ep_out_found = 0; int i; /* let's examine the device now */ @@ -651,13 +655,20 @@ int asix_eth_probe(struct usb_device *dev, unsigned int ifnum, /* is it an BULK endpoint? */ if ((iface->ep_desc[i].bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_BULK) { - if (iface->ep_desc[i].bEndpointAddress & USB_DIR_IN) - ss->ep_in = iface->ep_desc[i].bEndpointAddress & - USB_ENDPOINT_NUMBER_MASK; - else - ss->ep_out = - iface->ep_desc[i].bEndpointAddress & - USB_ENDPOINT_NUMBER_MASK; + u8 ep_addr = iface->ep_desc[i].bEndpointAddress; + if (ep_addr & USB_DIR_IN) { + if (!ep_in_found) { + ss->ep_in = ep_addr & + USB_ENDPOINT_NUMBER_MASK; + ep_in_found = 1; + } + } else { + if (!ep_out_found) { + ss->ep_out = ep_addr & + USB_ENDPOINT_NUMBER_MASK; + ep_out_found = 1; + } + } } /* is it an interrupt endpoint? */ From 185f7d9afc9b5c77bbedc386a43019e07e5d0c04 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Thu, 13 Sep 2012 20:23:34 +0000 Subject: [PATCH 17/27] net: Add driver for Zynq Gem IP Device driver for Zynq Gem IP. Signed-off-by: Michal Simek CC: Joe Hershberger CC: Marek Vasut Acked-by: Marek Vasut --- drivers/net/Makefile | 1 + drivers/net/zynq_gem.c | 440 +++++++++++++++++++++++++++++++++++++++++ include/netdev.h | 2 +- 3 files changed, 442 insertions(+), 1 deletion(-) create mode 100644 drivers/net/zynq_gem.c diff --git a/drivers/net/Makefile b/drivers/net/Makefile index 011cd5191c..e4abac7c8f 100644 --- a/drivers/net/Makefile +++ b/drivers/net/Makefile @@ -80,6 +80,7 @@ COBJS-$(CONFIG_XILINX_AXIEMAC) += xilinx_axi_emac.o COBJS-$(CONFIG_XILINX_EMACLITE) += xilinx_emaclite.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 +COBJS-$(CONFIG_ZYNQ_GEM) += zynq_gem.o COBJS := $(sort $(COBJS-y)) SRCS := $(COBJS:.o=.c) diff --git a/drivers/net/zynq_gem.c b/drivers/net/zynq_gem.c new file mode 100644 index 0000000000..3596065694 --- /dev/null +++ b/drivers/net/zynq_gem.c @@ -0,0 +1,440 @@ +/* + * (C) Copyright 2011 Michal Simek + * + * Michal SIMEK + * + * Based on Xilinx gmac driver: + * (C) Copyright 2011 Xilinx + * + * 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 +#include +#include +#include +#include +#include +#include +#include + +#if !defined(CONFIG_PHYLIB) +# error XILINX_GEM_ETHERNET requires PHYLIB +#endif + +/* Bit/mask specification */ +#define ZYNQ_GEM_PHYMNTNC_OP_MASK 0x40020000 /* operation mask bits */ +#define ZYNQ_GEM_PHYMNTNC_OP_R_MASK 0x20000000 /* read operation */ +#define ZYNQ_GEM_PHYMNTNC_OP_W_MASK 0x10000000 /* write operation */ +#define ZYNQ_GEM_PHYMNTNC_PHYAD_SHIFT_MASK 23 /* Shift bits for PHYAD */ +#define ZYNQ_GEM_PHYMNTNC_PHREG_SHIFT_MASK 18 /* Shift bits for PHREG */ + +#define ZYNQ_GEM_RXBUF_EOF_MASK 0x00008000 /* End of frame. */ +#define ZYNQ_GEM_RXBUF_SOF_MASK 0x00004000 /* Start of frame. */ +#define ZYNQ_GEM_RXBUF_LEN_MASK 0x00003FFF /* Mask for length field */ + +#define ZYNQ_GEM_RXBUF_WRAP_MASK 0x00000002 /* Wrap bit, last BD */ +#define ZYNQ_GEM_RXBUF_NEW_MASK 0x00000001 /* Used bit.. */ +#define ZYNQ_GEM_RXBUF_ADD_MASK 0xFFFFFFFC /* Mask for address */ + +/* Wrap bit, last descriptor */ +#define ZYNQ_GEM_TXBUF_WRAP_MASK 0x40000000 +#define ZYNQ_GEM_TXBUF_LAST_MASK 0x00008000 /* Last buffer */ + +#define ZYNQ_GEM_TXSR_HRESPNOK_MASK 0x00000100 /* Transmit hresp not OK */ +#define ZYNQ_GEM_TXSR_URUN_MASK 0x00000040 /* Transmit underrun */ +/* Transmit buffs exhausted mid frame */ +#define ZYNQ_GEM_TXSR_BUFEXH_MASK 0x00000010 + +#define ZYNQ_GEM_NWCTRL_TXEN_MASK 0x00000008 /* Enable transmit */ +#define ZYNQ_GEM_NWCTRL_RXEN_MASK 0x00000004 /* Enable receive */ +#define ZYNQ_GEM_NWCTRL_MDEN_MASK 0x00000010 /* Enable MDIO port */ +#define ZYNQ_GEM_NWCTRL_STARTTX_MASK 0x00000200 /* Start tx (tx_go) */ + +#define ZYNQ_GEM_NWCFG_SPEED 0x00000001 /* 100 Mbps operation */ +#define ZYNQ_GEM_NWCFG_FDEN 0x00000002 /* Full Duplex mode */ +#define ZYNQ_GEM_NWCFG_FSREM 0x00020000 /* FCS removal */ +#define ZYNQ_GEM_NWCFG_MDCCLKDIV 0x000080000 /* Div pclk by 32, 80MHz */ + +#define ZYNQ_GEM_NWCFG_INIT (ZYNQ_GEM_NWCFG_SPEED | \ + ZYNQ_GEM_NWCFG_FDEN | \ + ZYNQ_GEM_NWCFG_FSREM | \ + ZYNQ_GEM_NWCFG_MDCCLKDIV) + +#define ZYNQ_GEM_NWSR_MDIOIDLE_MASK 0x00000004 /* PHY management idle */ + +#define ZYNQ_GEM_DMACR_BLENGTH 0x00000004 /* INCR4 AHB bursts */ +/* Use full configured addressable space (8 Kb) */ +#define ZYNQ_GEM_DMACR_RXSIZE 0x00000300 +/* Use full configured addressable space (4 Kb) */ +#define ZYNQ_GEM_DMACR_TXSIZE 0x00000400 +/* Set with binary 00011000 to use 1536 byte(1*max length frame/buffer) */ +#define ZYNQ_GEM_DMACR_RXBUF 0x00180000 + +#define ZYNQ_GEM_DMACR_INIT (ZYNQ_GEM_DMACR_BLENGTH | \ + ZYNQ_GEM_DMACR_RXSIZE | \ + ZYNQ_GEM_DMACR_TXSIZE | \ + ZYNQ_GEM_DMACR_RXBUF) + +/* Device registers */ +struct zynq_gem_regs { + u32 nwctrl; /* Network Control reg */ + u32 nwcfg; /* Network Config reg */ + u32 nwsr; /* Network Status reg */ + u32 reserved1; + u32 dmacr; /* DMA Control reg */ + u32 txsr; /* TX Status reg */ + u32 rxqbase; /* RX Q Base address reg */ + u32 txqbase; /* TX Q Base address reg */ + u32 rxsr; /* RX Status reg */ + u32 reserved2[2]; + u32 idr; /* Interrupt Disable reg */ + u32 reserved3; + u32 phymntnc; /* Phy Maintaince reg */ + u32 reserved4[18]; + u32 hashl; /* Hash Low address reg */ + u32 hashh; /* Hash High address reg */ +#define LADDR_LOW 0 +#define LADDR_HIGH 1 + u32 laddr[4][LADDR_HIGH + 1]; /* Specific1 addr low/high reg */ + u32 match[4]; /* Type ID1 Match reg */ + u32 reserved6[18]; + u32 stat[44]; /* Octects transmitted Low reg - stat start */ +}; + +/* BD descriptors */ +struct emac_bd { + u32 addr; /* Next descriptor pointer */ + u32 status; +}; + +#define RX_BUF 3 + +/* Initialized, rxbd_current, rx_first_buf must be 0 after init */ +struct zynq_gem_priv { + struct emac_bd tx_bd; + struct emac_bd rx_bd[RX_BUF]; + char rxbuffers[RX_BUF * PKTSIZE_ALIGN]; + u32 rxbd_current; + u32 rx_first_buf; + int phyaddr; + struct phy_device *phydev; + struct mii_dev *bus; +}; + +static inline int mdio_wait(struct eth_device *dev) +{ + struct zynq_gem_regs *regs = (struct zynq_gem_regs *)dev->iobase; + u32 timeout = 200; + + /* Wait till MDIO interface is ready to accept a new transaction. */ + while (--timeout) { + if (readl(®s->nwsr) & ZYNQ_GEM_NWSR_MDIOIDLE_MASK) + break; + WATCHDOG_RESET(); + } + + if (!timeout) { + printf("%s: Timeout\n", __func__); + return 1; + } + + return 0; +} + +static u32 phy_setup_op(struct eth_device *dev, u32 phy_addr, u32 regnum, + u32 op, u16 *data) +{ + u32 mgtcr; + struct zynq_gem_regs *regs = (struct zynq_gem_regs *)dev->iobase; + + if (mdio_wait(dev)) + return 1; + + /* Construct mgtcr mask for the operation */ + mgtcr = ZYNQ_GEM_PHYMNTNC_OP_MASK | op | + (phy_addr << ZYNQ_GEM_PHYMNTNC_PHYAD_SHIFT_MASK) | + (regnum << ZYNQ_GEM_PHYMNTNC_PHREG_SHIFT_MASK) | *data; + + /* Write mgtcr and wait for completion */ + writel(mgtcr, ®s->phymntnc); + + if (mdio_wait(dev)) + return 1; + + if (op == ZYNQ_GEM_PHYMNTNC_OP_R_MASK) + *data = readl(®s->phymntnc); + + return 0; +} + +static u32 phyread(struct eth_device *dev, u32 phy_addr, u32 regnum, u16 *val) +{ + return phy_setup_op(dev, phy_addr, regnum, + ZYNQ_GEM_PHYMNTNC_OP_R_MASK, val); +} + +static u32 phywrite(struct eth_device *dev, u32 phy_addr, u32 regnum, u16 data) +{ + return phy_setup_op(dev, phy_addr, regnum, + ZYNQ_GEM_PHYMNTNC_OP_W_MASK, &data); +} + +static int zynq_gem_setup_mac(struct eth_device *dev) +{ + u32 i, macaddrlow, macaddrhigh; + struct zynq_gem_regs *regs = (struct zynq_gem_regs *)dev->iobase; + + /* Set the MAC bits [31:0] in BOT */ + macaddrlow = dev->enetaddr[0]; + macaddrlow |= dev->enetaddr[1] << 8; + macaddrlow |= dev->enetaddr[2] << 16; + macaddrlow |= dev->enetaddr[3] << 24; + + /* Set MAC bits [47:32] in TOP */ + macaddrhigh = dev->enetaddr[4]; + macaddrhigh |= dev->enetaddr[5] << 8; + + for (i = 0; i < 4; i++) { + writel(0, ®s->laddr[i][LADDR_LOW]); + writel(0, ®s->laddr[i][LADDR_HIGH]); + /* Do not use MATCHx register */ + writel(0, ®s->match[i]); + } + + writel(macaddrlow, ®s->laddr[0][LADDR_LOW]); + writel(macaddrhigh, ®s->laddr[0][LADDR_HIGH]); + + return 0; +} + +static int zynq_gem_init(struct eth_device *dev, bd_t * bis) +{ + u32 i; + struct phy_device *phydev; + const u32 stat_size = (sizeof(struct zynq_gem_regs) - + offsetof(struct zynq_gem_regs, stat)) / 4; + struct zynq_gem_regs *regs = (struct zynq_gem_regs *)dev->iobase; + struct zynq_gem_priv *priv = dev->priv; + const u32 supported = SUPPORTED_10baseT_Half | + SUPPORTED_10baseT_Full | + SUPPORTED_100baseT_Half | + SUPPORTED_100baseT_Full | + SUPPORTED_1000baseT_Half | + SUPPORTED_1000baseT_Full; + + /* Disable all interrupts */ + writel(0xFFFFFFFF, ®s->idr); + + /* Disable the receiver & transmitter */ + writel(0, ®s->nwctrl); + writel(0, ®s->txsr); + writel(0, ®s->rxsr); + writel(0, ®s->phymntnc); + + /* Clear the Hash registers for the mac address pointed by AddressPtr */ + writel(0x0, ®s->hashl); + /* Write bits [63:32] in TOP */ + writel(0x0, ®s->hashh); + + /* Clear all counters */ + for (i = 0; i <= stat_size; i++) + readl(®s->stat[i]); + + /* Setup RxBD space */ + memset(&(priv->rx_bd), 0, sizeof(priv->rx_bd)); + /* Create the RxBD ring */ + memset(&(priv->rxbuffers), 0, sizeof(priv->rxbuffers)); + + for (i = 0; i < RX_BUF; i++) { + priv->rx_bd[i].status = 0xF0000000; + priv->rx_bd[i].addr = (u32)((char *) &(priv->rxbuffers) + + (i * PKTSIZE_ALIGN)); + } + /* WRAP bit to last BD */ + priv->rx_bd[--i].addr |= ZYNQ_GEM_RXBUF_WRAP_MASK; + /* Write RxBDs to IP */ + writel((u32) &(priv->rx_bd), ®s->rxqbase); + + /* MAC Setup */ + /* Setup Network Configuration register */ + writel(ZYNQ_GEM_NWCFG_INIT, ®s->nwcfg); + + /* Setup for DMA Configuration register */ + writel(ZYNQ_GEM_DMACR_INIT, ®s->dmacr); + + /* Setup for Network Control register, MDIO, Rx and Tx enable */ + setbits_le32(®s->nwctrl, ZYNQ_GEM_NWCTRL_MDEN_MASK | + ZYNQ_GEM_NWCTRL_RXEN_MASK | ZYNQ_GEM_NWCTRL_TXEN_MASK); + + /* interface - look at tsec */ + phydev = phy_connect(priv->bus, priv->phyaddr, dev, 0); + + phydev->supported &= supported; + phydev->advertising = phydev->supported; + priv->phydev = phydev; + phy_config(phydev); + phy_startup(phydev); + + return 0; +} + +static int zynq_gem_send(struct eth_device *dev, void *ptr, int len) +{ + u32 status; + struct zynq_gem_priv *priv = dev->priv; + struct zynq_gem_regs *regs = (struct zynq_gem_regs *)dev->iobase; + const u32 mask = ZYNQ_GEM_TXSR_HRESPNOK_MASK | \ + ZYNQ_GEM_TXSR_URUN_MASK | ZYNQ_GEM_TXSR_BUFEXH_MASK; + + /* setup BD */ + writel((u32)&(priv->tx_bd), ®s->txqbase); + + /* Setup Tx BD */ + memset((void *) &(priv->tx_bd), 0, sizeof(struct emac_bd)); + + priv->tx_bd.addr = (u32)ptr; + priv->tx_bd.status = len | ZYNQ_GEM_TXBUF_LAST_MASK | + ZYNQ_GEM_TXBUF_WRAP_MASK; + + /* Start transmit */ + setbits_le32(®s->nwctrl, ZYNQ_GEM_NWCTRL_STARTTX_MASK); + + /* Read the stat register to know if the packet has been transmitted */ + status = readl(®s->txsr); + if (status & mask) + printf("Something has gone wrong here!? Status is 0x%x.\n", + status); + + /* Clear Tx status register before leaving . */ + writel(status, ®s->txsr); + return 0; +} + +/* Do not check frame_recd flag in rx_status register 0x20 - just poll BD */ +static int zynq_gem_recv(struct eth_device *dev) +{ + int frame_len; + struct zynq_gem_priv *priv = dev->priv; + struct emac_bd *current_bd = &priv->rx_bd[priv->rxbd_current]; + struct emac_bd *first_bd; + + if (!(current_bd->addr & ZYNQ_GEM_RXBUF_NEW_MASK)) + return 0; + + if (!(current_bd->status & + (ZYNQ_GEM_RXBUF_SOF_MASK | ZYNQ_GEM_RXBUF_EOF_MASK))) { + printf("GEM: SOF or EOF not set for last buffer received!\n"); + return 0; + } + + frame_len = current_bd->status & ZYNQ_GEM_RXBUF_LEN_MASK; + if (frame_len) { + NetReceive((u8 *) (current_bd->addr & + ZYNQ_GEM_RXBUF_ADD_MASK), frame_len); + + if (current_bd->status & ZYNQ_GEM_RXBUF_SOF_MASK) + priv->rx_first_buf = priv->rxbd_current; + else { + current_bd->addr &= ~ZYNQ_GEM_RXBUF_NEW_MASK; + current_bd->status = 0xF0000000; /* FIXME */ + } + + if (current_bd->status & ZYNQ_GEM_RXBUF_EOF_MASK) { + first_bd = &priv->rx_bd[priv->rx_first_buf]; + first_bd->addr &= ~ZYNQ_GEM_RXBUF_NEW_MASK; + first_bd->status = 0xF0000000; + } + + if ((++priv->rxbd_current) >= RX_BUF) + priv->rxbd_current = 0; + + return frame_len; + } + + return 0; +} + +static void zynq_gem_halt(struct eth_device *dev) +{ + struct zynq_gem_regs *regs = (struct zynq_gem_regs *)dev->iobase; + + /* Disable the receiver & transmitter */ + writel(0, ®s->nwctrl); +} + +static int zynq_gem_miiphyread(const char *devname, uchar addr, + uchar reg, ushort *val) +{ + struct eth_device *dev = eth_get_dev(); + int ret; + + ret = phyread(dev, addr, reg, val); + debug("%s 0x%x, 0x%x, 0x%x\n", __func__, addr, reg, *val); + return ret; +} + +static int zynq_gem_miiphy_write(const char *devname, uchar addr, + uchar reg, ushort val) +{ + struct eth_device *dev = eth_get_dev(); + + debug("%s 0x%x, 0x%x, 0x%x\n", __func__, addr, reg, val); + return phywrite(dev, addr, reg, val); +} + +int zynq_gem_initialize(bd_t *bis, int base_addr) +{ + struct eth_device *dev; + struct zynq_gem_priv *priv; + + dev = calloc(1, sizeof(*dev)); + if (dev == NULL) + return -1; + + dev->priv = calloc(1, sizeof(struct zynq_gem_priv)); + if (dev->priv == NULL) { + free(dev); + return -1; + } + priv = dev->priv; + +#ifdef CONFIG_PHY_ADDR + priv->phyaddr = CONFIG_PHY_ADDR; +#else + priv->phyaddr = -1; +#endif + + sprintf(dev->name, "Gem.%x", base_addr); + + dev->iobase = base_addr; + + dev->init = zynq_gem_init; + dev->halt = zynq_gem_halt; + dev->send = zynq_gem_send; + dev->recv = zynq_gem_recv; + dev->write_hwaddr = zynq_gem_setup_mac; + + eth_register(dev); + + miiphy_register(dev->name, zynq_gem_miiphyread, zynq_gem_miiphy_write); + priv->bus = miiphy_get_dev_by_name(dev->name); + + return 1; +} diff --git a/include/netdev.h b/include/netdev.h index d1aaf0cd2d..b8d303d089 100644 --- a/include/netdev.h +++ b/include/netdev.h @@ -104,7 +104,7 @@ int xilinx_emaclite_initialize(bd_t *bis, unsigned long base_addr, int txpp, int rxpp); int xilinx_ll_temac_eth_init(bd_t *bis, unsigned long base_addr, int flags, unsigned long ctrl_addr); - +int zynq_gem_initialize(bd_t *bis, int base_addr); /* * As long as the Xilinx xps_ll_temac ethernet driver has not its own interface * exported by a public hader file, we need a global definition at this point. From 460f949f897a401b40327be7a1a9cccd22762c77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Th=C3=A9baudeau?= Date: Fri, 10 Aug 2012 07:56:21 +0000 Subject: [PATCH 18/27] net: eth_write_hwaddr: Return error for invalid MACs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If dev->enetaddr was supposed to be set with dev->write_hwaddr() but the MAC address was not valid, return an error. Signed-off-by: Benoît Thébaudeau Cc: Joe Hershberger Acked-by: Mike Frysinger --- net/eth.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/net/eth.c b/net/eth.c index 49458c8db9..321d5b18fd 100644 --- a/net/eth.c +++ b/net/eth.c @@ -218,9 +218,12 @@ int eth_write_hwaddr(struct eth_device *dev, const char *base_name, } if (dev->write_hwaddr && - !eth_mac_skip(eth_number) && - is_valid_ether_addr(dev->enetaddr)) + !eth_mac_skip(eth_number)) { + if (!is_valid_ether_addr(dev->enetaddr)) + return -1; + ret = dev->write_hwaddr(dev); + } return ret; } From b737337aaf7d266f0e5228d1129ac40e300878f8 Mon Sep 17 00:00:00 2001 From: Valentin Longchamp Date: Thu, 16 Aug 2012 01:17:26 +0000 Subject: [PATCH 19/27] net/phy: support the mv88e6352 switch This patch add support for the configuration of an external switch from the 88E6xxx series from Marvell trough an MDIO link using indirect adressing. This can be used if we do not want to use an EEPROM for the configuration. This driver is not generic and was not tested on other switches than the 88e6352. This is proposed as a first implementation that is somewhat limited but works and that can be used as a basis for further developments for this switch family. Signed-off-by: Valentin Longchamp cc: Holger Brunck cc: Prafulla Wadaskar cc: Joe Hershberger --- drivers/net/phy/Makefile | 1 + drivers/net/phy/mv88e6352.c | 318 ++++++++++++++++++++++++++++++++++++ include/mv88e6352.h | 92 +++++++++++ 3 files changed, 411 insertions(+) create mode 100644 drivers/net/phy/mv88e6352.c create mode 100644 include/mv88e6352.h diff --git a/drivers/net/phy/Makefile b/drivers/net/phy/Makefile index feced39a42..5e90d7098d 100644 --- a/drivers/net/phy/Makefile +++ b/drivers/net/phy/Makefile @@ -27,6 +27,7 @@ LIB := $(obj)libphy.o COBJS-$(CONFIG_BITBANGMII) += miiphybb.o COBJS-$(CONFIG_MV88E61XX_SWITCH) += mv88e61xx.o +COBJS-$(CONFIG_MV88E6352_SWITCH) += mv88e6352.o COBJS-$(CONFIG_PHYLIB) += phy.o COBJS-$(CONFIG_PHYLIB_10G) += generic_10g.o diff --git a/drivers/net/phy/mv88e6352.c b/drivers/net/phy/mv88e6352.c new file mode 100644 index 0000000000..7269a6afe1 --- /dev/null +++ b/drivers/net/phy/mv88e6352.c @@ -0,0 +1,318 @@ +/* + * (C) Copyright 2012 + * Valentin Lontgchamp, Keymile AG, valentin.longchamp@keymile.com + * + * 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., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ + +#include +#include +#include +#include + +#define SMI_HDR ((0x8 | 0x1) << 12) +#define SMI_BUSY_MASK (0x8000) +#define SMIRD_OP (0x2 << 10) +#define SMIWR_OP (0x1 << 10) +#define SMI_MASK 0x1f +#define PORT_SHIFT 5 + +#define COMMAND_REG 0 +#define DATA_REG 1 + +/* global registers */ +#define GLOBAL 0x1b + +#define GLOBAL_STATUS 0x00 +#define PPU_STATE 0x8000 + +#define GLOBAL_CTRL 0x04 +#define SW_RESET 0x8000 +#define PPU_ENABLE 0x4000 + +static int sw_wait_rdy(const char *devname, u8 phy_addr) +{ + u16 command; + u32 timeout = 100; + int ret; + + /* wait till the SMI is not busy */ + do { + /* read command register */ + ret = miiphy_read(devname, phy_addr, COMMAND_REG, &command); + if (ret < 0) { + printf("%s: Error reading command register\n", + __func__); + return ret; + } + if (timeout-- == 0) { + printf("Err..(%s) SMI busy timeout\n", __func__); + return -EFAULT; + } + } while (command & SMI_BUSY_MASK); + + return 0; +} + +static int sw_reg_read(const char *devname, u8 phy_addr, u8 port, + u8 reg, u16 *data) +{ + int ret; + u16 command; + + ret = sw_wait_rdy(devname, phy_addr); + if (ret) + return ret; + + command = SMI_HDR | SMIRD_OP | ((port&SMI_MASK) << PORT_SHIFT) | + (reg & SMI_MASK); + debug("%s: write to command: %#x\n", __func__, command); + ret = miiphy_write(devname, phy_addr, COMMAND_REG, command); + if (ret) + return ret; + + ret = sw_wait_rdy(devname, phy_addr); + if (ret) + return ret; + + ret = miiphy_read(devname, phy_addr, DATA_REG, data); + + return ret; +} + +static int sw_reg_write(const char *devname, u8 phy_addr, u8 port, + u8 reg, u16 data) +{ + int ret; + u16 value; + + ret = sw_wait_rdy(devname, phy_addr); + if (ret) + return ret; + + debug("%s: write to data: %#x\n", __func__, data); + ret = miiphy_write(devname, phy_addr, DATA_REG, data); + if (ret) + return ret; + + value = SMI_HDR | SMIWR_OP | ((port & SMI_MASK) << PORT_SHIFT) | + (reg & SMI_MASK); + debug("%s: write to command: %#x\n", __func__, value); + ret = miiphy_write(devname, phy_addr, COMMAND_REG, value); + if (ret) + return ret; + + ret = sw_wait_rdy(devname, phy_addr); + if (ret) + return ret; + + return 0; +} + +static int ppu_enable(const char *devname, u8 phy_addr) +{ + int i, ret = 0; + u16 reg; + + ret = sw_reg_read(devname, phy_addr, GLOBAL, GLOBAL_CTRL, ®); + if (ret) { + printf("%s: Error reading global ctrl reg\n", __func__); + return ret; + } + + reg |= PPU_ENABLE; + + ret = sw_reg_write(devname, phy_addr, GLOBAL, GLOBAL_CTRL, reg); + if (ret) { + printf("%s: Error writing global ctrl reg\n", __func__); + return ret; + } + + for (i = 0; i < 1000; i++) { + sw_reg_read(devname, phy_addr, GLOBAL, GLOBAL_STATUS, + ®); + if ((reg & 0xc000) == 0xc000) + return 0; + udelay(1000); + } + + return -ETIMEDOUT; +} + +static int ppu_disable(const char *devname, u8 phy_addr) +{ + int i, ret = 0; + u16 reg; + + ret = sw_reg_read(devname, phy_addr, GLOBAL, GLOBAL_CTRL, ®); + if (ret) { + printf("%s: Error reading global ctrl reg\n", __func__); + return ret; + } + + reg &= ~PPU_ENABLE; + + ret = sw_reg_write(devname, phy_addr, GLOBAL, GLOBAL_CTRL, reg); + if (ret) { + printf("%s: Error writing global ctrl reg\n", __func__); + return ret; + } + + for (i = 0; i < 1000; i++) { + sw_reg_read(devname, phy_addr, GLOBAL, GLOBAL_STATUS, + ®); + if ((reg & 0xc000) != 0xc000) + return 0; + udelay(1000); + } + + return -ETIMEDOUT; +} + +int mv88e_sw_program(const char *devname, u8 phy_addr, + struct mv88e_sw_reg *regs, int regs_nb) +{ + int i, ret = 0; + + /* first we need to disable the PPU */ + ret = ppu_disable(devname, phy_addr); + if (ret) { + printf("%s: Error disabling PPU\n", __func__); + return ret; + } + + for (i = 0; i < regs_nb; i++) { + ret = sw_reg_write(devname, phy_addr, regs[i].port, + regs[i].reg, regs[i].value); + if (ret) { + printf("%s: Error configuring switch\n", __func__); + ppu_enable(devname, phy_addr); + return ret; + } + } + + /* re-enable the PPU */ + ret = ppu_enable(devname, phy_addr); + if (ret) { + printf("%s: Error enabling PPU\n", __func__); + return ret; + } + + return 0; +} + +int mv88e_sw_reset(const char *devname, u8 phy_addr) +{ + int i, ret = 0; + u16 reg; + + ret = sw_reg_read(devname, phy_addr, GLOBAL, GLOBAL_CTRL, ®); + if (ret) { + printf("%s: Error reading global ctrl reg\n", __func__); + return ret; + } + + reg = SW_RESET | PPU_ENABLE | 0x0400; + + ret = sw_reg_write(devname, phy_addr, GLOBAL, GLOBAL_CTRL, reg); + if (ret) { + printf("%s: Error writing global ctrl reg\n", __func__); + return ret; + } + + for (i = 0; i < 1000; i++) { + sw_reg_read(devname, phy_addr, GLOBAL, GLOBAL_STATUS, + ®); + if ((reg & 0xc800) != 0xc800) + return 0; + udelay(1000); + } + + return -ETIMEDOUT; +} + +int do_mvsw_reg_read(const char *name, int argc, char * const argv[]) +{ + u16 value = 0, phyaddr, reg, port; + int ret; + + phyaddr = simple_strtoul(argv[1], NULL, 10); + port = simple_strtoul(argv[2], NULL, 10); + reg = simple_strtoul(argv[3], NULL, 10); + + ret = sw_reg_read(name, phyaddr, port, reg, &value); + printf("%#x\n", value); + + return ret; +} + +int do_mvsw_reg_write(const char *name, int argc, char * const argv[]) +{ + u16 value = 0, phyaddr, reg, port; + int ret; + + phyaddr = simple_strtoul(argv[1], NULL, 10); + port = simple_strtoul(argv[2], NULL, 10); + reg = simple_strtoul(argv[3], NULL, 10); + value = simple_strtoul(argv[4], NULL, 16); + + ret = sw_reg_write(name, phyaddr, port, reg, value); + + return ret; +} + + +int do_mvsw_reg(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +{ + int ret; + const char *cmd, *ethname; + + if (argc < 2) + return cmd_usage(cmdtp); + + cmd = argv[1]; + --argc; + ++argv; + + if (strcmp(cmd, "read") == 0) { + if (argc < 5) + return cmd_usage(cmdtp); + ethname = argv[1]; + --argc; + ++argv; + ret = do_mvsw_reg_read(ethname, argc, argv); + } else if (strcmp(cmd, "write") == 0) { + if (argc < 6) + return cmd_usage(cmdtp); + ethname = argv[1]; + --argc; + ++argv; + ret = do_mvsw_reg_write(ethname, argc, argv); + } else + return cmd_usage(cmdtp); + + return ret; +} + +U_BOOT_CMD( + mvsw_reg, 7, 1, do_mvsw_reg, + "marvell 88e6352 switch register access", + "write ethname phyaddr port reg value\n" + "mvsw_reg read ethname phyaddr port reg\n" + ); diff --git a/include/mv88e6352.h b/include/mv88e6352.h new file mode 100644 index 0000000000..cdc4db781e --- /dev/null +++ b/include/mv88e6352.h @@ -0,0 +1,92 @@ +/* + * (C) Copyright 2012 + * Valentin Lontgchamp, Keymile AG, valentin.longchamp@keymile.com + * + * 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., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ + +#ifndef __MV886352_H +#define __MV886352_H + +#include + +/* PHY registers */ +#define PHY(itf) (itf) + +#define PHY_CTRL 0x00 +#define PHY_100_MBPS 0x2000 +#define PHY_1_GBPS 0x0040 +#define AUTONEG_EN 0x1000 +#define AUTONEG_RST 0x0200 +#define FULL_DUPLEX 0x0100 +#define PHY_PWR_DOWN 0x0800 + +#define PHY_STATUS 0x01 +#define AN1000FIX 0x0001 + +#define PHY_SPEC_CTRL 0x10 +#define SPEC_PWR_DOWN 0x0004 +#define AUTO_MDIX_EN 0x0060 + +#define PHY_1000_CTRL 0x9 + +#define NO_ADV 0x0000 +#define ADV_1000_FDPX 0x0200 +#define ADV_1000_HDPX 0x0100 + +#define PHY_PAGE 0x16 + +#define AN1000FIX_PAGE 0x00fc + +/* PORT or MAC registers */ +#define PORT(itf) (itf+0x10) + +#define PORT_STATUS 0x00 +#define NO_PHY_DETECT 0x0000 + +#define PORT_PHY 0x01 +#define RX_RGMII_TIM 0x8000 +#define TX_RGMII_TIM 0x4000 +#define FLOW_CTRL_EN 0x0080 +#define FLOW_CTRL_FOR 0x0040 +#define LINK_VAL 0x0020 +#define LINK_FOR 0x0010 +#define FULL_DPX 0x0008 +#define FULL_DPX_FOR 0x0004 +#define NO_SPEED_FOR 0x0003 +#define SPEED_1000_FOR 0x0002 +#define SPEED_100_FOR 0x0001 +#define SPEED_10_FOR 0x0000 + +#define PORT_CTRL 0x04 +#define FORWARDING 0x0003 +#define EGRS_FLD_ALL 0x000c +#define PORT_DIS 0x0000 + +struct mv88e_sw_reg { + u8 port; + u8 reg; + u16 value; +}; + +int mv88e_sw_reset(const char *devname, u8 phy_addr); +int mv88e_sw_program(const char *devname, u8 phy_addr, + struct mv88e_sw_reg *regs, int regs_nb); + +#endif From f91ba0ecbc8232691856d2d7524fd53067ca91c9 Mon Sep 17 00:00:00 2001 From: Priyanka Jain Date: Fri, 17 Aug 2012 08:28:56 +0000 Subject: [PATCH 20/27] net: Add Vitesse VSC8662 PHY support -VSC8662 is Dual Port 10/100/1000Base-T Phy, 100Base-FX/1000/Base-X Gigabit Ethernt Transceiver Phy. -Its register set and features are similar to other Vitesse Phys Signed-off-by: Priyanka Jain Signed-off-by: York Sun --- drivers/net/phy/vitesse.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/drivers/net/phy/vitesse.c b/drivers/net/phy/vitesse.c index d48d4fe73f..0a0f40dbde 100644 --- a/drivers/net/phy/vitesse.c +++ b/drivers/net/phy/vitesse.c @@ -1,6 +1,9 @@ /* * Vitesse PHY drivers * + * Copyright 2010-2012 Freescale Semiconductor, Inc. + * Author: Andy Fleming + * Add vsc8662 phy support - Priyanka Jain * 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 @@ -15,10 +18,6 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA - * - * Copyright 2010-2011 Freescale Semiconductor, Inc. - * author Andy Fleming - * */ #include @@ -206,6 +205,16 @@ static struct phy_driver VSC8641_driver = { .shutdown = &genphy_shutdown, }; +static struct phy_driver VSC8662_driver = { + .name = "Vitesse VSC8662", + .uid = 0x70660, + .mask = 0xffff0, + .features = PHY_GBIT_FEATURES, + .config = &genphy_config_aneg, + .startup = &vitesse_startup, + .shutdown = &genphy_shutdown, +}; + /* Vitesse bought Cicada, so we'll put these here */ static struct phy_driver cis8201_driver = { .name = "CIS8201", @@ -235,6 +244,7 @@ int phy_vitesse_init(void) phy_register(&VSC8244_driver); phy_register(&VSC8211_driver); phy_register(&VSC8221_driver); + phy_register(&VSC8662_driver); phy_register(&cis8201_driver); phy_register(&cis8204_driver); From e2a66e609745470b1157fe6b6663c804ee44b0b9 Mon Sep 17 00:00:00 2001 From: Marek Vasut Date: Sun, 26 Aug 2012 10:19:20 +0000 Subject: [PATCH 21/27] FEC: Do not pass unaligned buffer to network stack Do not pass unaligned RX buffer to the upper layers. The upper layer, especially in the ARP case, recycles the buffer and passes it back into the FEC, into it's TX path. With caches enabled, the FEC hangs on this from time to time. Signed-off-by: Marek Vasut Cc: Benoit Thebaudeau Cc: Eric Nelson Cc: Fabio Estevam Cc: Joe Hershberger Tested-by: Fabio Estevam --- drivers/net/fec_mxc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/net/fec_mxc.c b/drivers/net/fec_mxc.c index fbfc842aca..7b6a997cd0 100644 --- a/drivers/net/fec_mxc.c +++ b/drivers/net/fec_mxc.c @@ -31,6 +31,7 @@ #include #include #include +#include DECLARE_GLOBAL_DATA_PTR; @@ -791,7 +792,7 @@ static int fec_recv(struct eth_device *dev) uint16_t bd_status; uint32_t addr, size; 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 From efe24d2e17996f00b8803623c53cfe4baede9349 Mon Sep 17 00:00:00 2001 From: Marek Vasut Date: Sun, 26 Aug 2012 10:19:21 +0000 Subject: [PATCH 22/27] FEC: Properly align address over the buffers for cache ops Align the address that's to be invalidated/flushed properly. Signed-off-by: Marek Vasut Cc: Benoit Thebaudeau Cc: Eric Nelson Cc: Fabio Estevam Cc: Joe Hershberger --- drivers/net/fec_mxc.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/drivers/net/fec_mxc.c b/drivers/net/fec_mxc.c index 7b6a997cd0..bc44d38b42 100644 --- a/drivers/net/fec_mxc.c +++ b/drivers/net/fec_mxc.c @@ -695,7 +695,7 @@ static void fec_halt(struct eth_device *dev) static int fec_send(struct eth_device *dev, void *packet, int length) { unsigned int status; - uint32_t size; + uint32_t size, end; uint32_t addr; /* @@ -722,8 +722,9 @@ static int fec_send(struct eth_device *dev, void *packet, int length) #endif addr = (uint32_t)packet; - size = roundup(length, ARCH_DMA_MINALIGN); - flush_dcache_range(addr, addr + size); + end = roundup(addr + length, ARCH_DMA_MINALIGN); + addr &= ~(ARCH_DMA_MINALIGN - 1); + flush_dcache_range(addr, end); writew(length, &fec->tbd_base[fec->tbd_index].data_length); writel(addr, &fec->tbd_base[fec->tbd_index].data_pointer); @@ -790,7 +791,7 @@ static int fec_recv(struct eth_device *dev) int frame_length, len = 0; struct nbuf *frame; uint16_t bd_status; - uint32_t addr, size; + uint32_t addr, size, end; int i; uchar buff[FEC_MAX_PKT_SIZE] __aligned(ARCH_DMA_MINALIGN); @@ -854,8 +855,9 @@ static int fec_recv(struct eth_device *dev) * Invalidate data cache over the buffer */ addr = (uint32_t)frame; - size = roundup(frame_length, ARCH_DMA_MINALIGN); - invalidate_dcache_range(addr, addr + size); + end = roundup(addr + frame_length, ARCH_DMA_MINALIGN); + addr &= ~(ARCH_DMA_MINALIGN - 1); + invalidate_dcache_range(addr, end); /* * Fill the buffer and pass it to upper layers From bc1ce150b95bc51390add7fb8b74c535d1b5673c Mon Sep 17 00:00:00 2001 From: Marek Vasut Date: Wed, 29 Aug 2012 03:49:49 +0000 Subject: [PATCH 23/27] FEC: Remove endless loop in the FEC driver The FEC hardware sometimes errors out on data transfer and hangs in the tightloop adjusted by this patch. So add timeout into the tightloop to make such a hang recoverable. Signed-off-by: Marek Vasut Cc: Joe Hershberger Cc: Fabio Estevam Cc: Otavio Salvador Cc: Stefano Babic --- drivers/net/fec_mxc.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/drivers/net/fec_mxc.c b/drivers/net/fec_mxc.c index bc44d38b42..6f071e9414 100644 --- a/drivers/net/fec_mxc.c +++ b/drivers/net/fec_mxc.c @@ -35,6 +35,12 @@ 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 #error "CONFIG_MII has to be defined!" #endif @@ -697,6 +703,8 @@ static int fec_send(struct eth_device *dev, void *packet, int length) unsigned int status; uint32_t size, end; uint32_t addr; + int timeout = FEC_XFER_TIMEOUT; + int ret = 0; /* * This routine transmits one frame. This routine only accepts @@ -764,6 +772,10 @@ static int fec_send(struct eth_device *dev, void *packet, int length) while (readw(&fec->tbd_base[fec->tbd_index].status) & FEC_TBD_READY) { udelay(1); invalidate_dcache_range(addr, addr + size); + if (!timeout--) { + ret = -EINVAL; + break; + } } debug("fec_send: status 0x%x index %d\n", @@ -775,7 +787,7 @@ static int fec_send(struct eth_device *dev, void *packet, int length) else fec->tbd_index = 1; - return 0; + return ret; } /** From 67449098a86be18cbdb27345bebe8da57e5d8899 Mon Sep 17 00:00:00 2001 From: Marek Vasut Date: Wed, 29 Aug 2012 03:49:50 +0000 Subject: [PATCH 24/27] FEC: Rework the TX wait mechanism The mechanism waiting for transmission to finish in fec_send() now relies on the E-bit being cleared in the TX buffer descriptor. In case of data cache being on, this means invalidation of data cache above this TX buffer descriptor on each test for the E-bit being cleared. Apparently, there is another way to check if the transmission did complete. This is by checking the TDAR bit in the X_DES_ACTIVE register. Reading a register does not need any data cache invalidation, which is beneficial. Rework the sequence that wait for completion of the transmission so that the TDAR bit is tested first and afterwards check the E-bit being clear. This cuts down the number of cache invalidation calls to one. Signed-off-by: Marek Vasut Cc: Joe Hershberger Cc: Fabio Estevam Cc: Otavio Salvador Cc: Stefano Babic --- drivers/net/fec_mxc.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/drivers/net/fec_mxc.c b/drivers/net/fec_mxc.c index 6f071e9414..6ede464cc9 100644 --- a/drivers/net/fec_mxc.c +++ b/drivers/net/fec_mxc.c @@ -768,19 +768,21 @@ 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 * barrier here. */ - invalidate_dcache_range(addr, addr + size); - while (readw(&fec->tbd_base[fec->tbd_index].status) & FEC_TBD_READY) { - udelay(1); - invalidate_dcache_range(addr, addr + size); - if (!timeout--) { - ret = -EINVAL; + while (--timeout) { + if (!(readl(&fec->eth->x_des_active) & (1 << 24))) break; - } } - 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), - fec->tbd_index); + fec->tbd_index, ret); /* for next transmission use the other buffer */ if (fec->tbd_index) fec->tbd_index = 0; From c0b5a3bbb0cd40a6b23b7b07e2182a5bcdc8c31c Mon Sep 17 00:00:00 2001 From: Marek Vasut Date: Wed, 29 Aug 2012 03:49:51 +0000 Subject: [PATCH 25/27] FEC: Replace magic contants Replace the magic contant 1 << 24 with properly defined bits. Signed-off-by: Marek Vasut Cc: Joe Hershberger Cc: Fabio Estevam Cc: Otavio Salvador Cc: Stefano Babic --- drivers/net/fec_mxc.c | 6 +++--- drivers/net/fec_mxc.h | 3 +++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/drivers/net/fec_mxc.c b/drivers/net/fec_mxc.c index 6ede464cc9..3e232c7cbc 100644 --- a/drivers/net/fec_mxc.c +++ b/drivers/net/fec_mxc.c @@ -256,7 +256,7 @@ static int miiphy_wait_aneg(struct eth_device *dev) 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; } @@ -267,7 +267,7 @@ static int fec_rx_task_disable(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; } @@ -769,7 +769,7 @@ static int fec_send(struct eth_device *dev, void *packet, int length) * barrier here. */ while (--timeout) { - if (!(readl(&fec->eth->x_des_active) & (1 << 24))) + if (!(readl(&fec->eth->x_des_active) & FEC_X_DES_ACTIVE_TDAR)) break; } diff --git a/drivers/net/fec_mxc.h b/drivers/net/fec_mxc.h index 852b2e07e7..203285af9a 100644 --- a/drivers/net/fec_mxc.h +++ b/drivers/net/fec_mxc.h @@ -213,6 +213,9 @@ struct ethernet_regs { #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) /* defines for MIIGSK */ /* RMII frequency control: 0=50MHz, 1=5MHz */ From a655938a93410a468f8e2288edc20d20a272a6d4 Mon Sep 17 00:00:00 2001 From: Chander Kashyap Date: Thu, 6 Sep 2012 19:36:31 +0000 Subject: [PATCH 26/27] PXE: FDT: Add support for fdt in PXE Now DT support is becoming common for all new SoC's. Hence it is better to have option for getting specific FDT from the remote server. This patch adds support for new label i.e. 'fdt'. This will allow to retrieve 'fdt blob' from the remote server. This patch take care for the following scenarios. The usage of fdt is optional. The 'fdt blob' can be retrieved from tftp or can be available locally or can be absent. If 'fdt_addr_r' environment variable is set and 'fdt' label is defined retrieve 'fdt blob' from tftp. 'fdt_addr_r' is then passed along bootm command. If 'fdt_addr' is set and 'fdt blob' is not retrieved from the tftp pass 'fdt_addr' to bootm command. In this case 'fdt blob' will be available at 'fdt_addr'. If 'fdt_addr' is not set and 'fdt blob' is not retrieve from tftp pass NULL to boot command. In this case 'fdt blob' is not required and absent. Signed-off-by: Chander Kashyap Acked-by: Jason Hobbs --- common/cmd_pxe.c | 39 ++++++++++++++++++++++++++++++++++++--- doc/README.pxe | 14 ++++++++++++-- 2 files changed, 48 insertions(+), 5 deletions(-) diff --git a/common/cmd_pxe.c b/common/cmd_pxe.c index 6b31deab5b..ee75db9685 100644 --- a/common/cmd_pxe.c +++ b/common/cmd_pxe.c @@ -450,6 +450,7 @@ struct pxe_label { char *kernel; char *append; char *initrd; + char *fdt; int attempted; int localboot; struct list_head list; @@ -517,6 +518,9 @@ static void label_destroy(struct pxe_label *label) if (label->initrd) free(label->initrd); + if (label->fdt) + free(label->fdt); + free(label); } @@ -541,6 +545,9 @@ static void label_print(void *data) if (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"); /* - * fdt usage is optional. If there is an fdt_addr specified, we will - * pass it along to bootm, and adjust argc appropriately. + * fdt usage is optional: + * 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]) bootm_argc = 4; @@ -658,6 +684,7 @@ enum token_type { T_DEFAULT, T_PROMPT, T_INCLUDE, + T_FDT, T_INVALID }; @@ -685,6 +712,7 @@ static const struct token keywords[] = { {"append", T_APPEND}, {"initrd", T_INITRD}, {"include", T_INCLUDE}, + {"fdt", T_FDT}, {NULL, T_INVALID} }; @@ -1074,6 +1102,11 @@ static int parse_label(char **c, struct pxe_menu *cfg) err = parse_sliteral(c, &label->initrd); break; + case T_FDT: + if (!label->fdt) + err = parse_sliteral(c, &label->fdt); + break; + case T_LOCALBOOT: err = parse_integer(c, &label->localboot); break; diff --git a/doc/README.pxe b/doc/README.pxe index 2bbf53d957..f00f280fe6 100644 --- a/doc/README.pxe +++ b/doc/README.pxe @@ -93,8 +93,13 @@ pxe boot be passed to the bootm command to boot the kernel. These environment variables are required to be set. - fdt_addr - the location of a fdt blob. If this is set, it will be passed - to bootm when booting a kernel. + fdt_addr_r - location in RAM at which 'pxe boot' will store the fdt blob it + 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 =============== @@ -156,6 +161,11 @@ initrd - if this label is chosen, use tftp to retrieve the initrd the initrd_addr_r environment variable, and that address will be passed to bootm. +fdt - if this label is chosen, use tftp to retrieve the fdt blob + at . it will be stored at the address indicated in + the fdt_addr_r environment variable, and that address will + be passed to bootm. + localboot - Run the command defined by "localcmd" in the environment. is ignored and is only here to match the syntax of PXELINUX config files. From ee0f60df0b71092cd632fc6651f4157a2d252598 Mon Sep 17 00:00:00 2001 From: Brian Rzycki Date: Tue, 11 Sep 2012 09:22:53 +0000 Subject: [PATCH 27/27] net: Quietly ignore DHCP Option 28 (Broadcast Address) Some DHCP servers (notably dnsmasq) always transmit DHCP Option 28, Broadcast Address as specified in RFC 2132. Without this patch u-boot displays the warning: *** Unhandled DHCP Option in OFFER/ACK: 28 The patch suppresses the warning and ignores DHCP Option 28. There is no environment variable to set the broadcast address into and if for some reason u-boot needs the broadcast it can be calculated from ipaddr and netmask. Signed-off-by: Brian Rzycki --- net/bootp.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/net/bootp.c b/net/bootp.c index c9b8349b36..661e371063 100644 --- a/net/bootp.c +++ b/net/bootp.c @@ -728,6 +728,8 @@ static void DhcpOptionsProcess(uchar *popt, struct Bootp_t *bp) memcpy(&NetOurRootPath, popt + 2, size); NetOurRootPath[size] = 0; break; + case 28: /* Ignore Broadcast Address Option */ + break; #if defined(CONFIG_CMD_SNTP) && defined(CONFIG_BOOTP_NTPSERVER) case 42: /* NTP server IP */ NetCopyIP(&NetNtpServerIP, (popt + 2));